feat(android): say that work is happening, on every screen
The home screen's buttons already dimmed during an operation, but from the list nothing moved: deleting or duplicating takes a second or two - the container's round trip - and the screen stayed identical, as if the tap had not registered. A veil with a turning arc now covers any screen, and it also prevents the second tap, which would not wait any better. Its safety net is the existing 25 s deadline: even if an operation never hands back, the veil lifts. The plan records where deleted entries actually are: every publish is a Gitea commit, so the snapshot from before the deletion is still in the repository's history, readable in its web interface and recoverable by import. Not a screen, but a real net - and one that catches what a trash would not: an unlucky edit, a bad import.
This commit is contained in:
@@ -785,6 +785,14 @@ téléphone qu'on voudra ensuite ouvrir sur le poste demandera un import.
|
|||||||
filet est la sauvegarde du poste.** Il n'y a rien à afficher comme corbeille
|
filet est la sauvegarde du poste.** Il n'y a rien à afficher comme corbeille
|
||||||
ici : le téléphone n'en reçoit jamais le contenu.
|
ici : le téléphone n'en reçoit jamais le contenu.
|
||||||
|
|
||||||
|
**La corbeille, c'est l'historique du dépôt.** Chaque publication est un
|
||||||
|
commit Gitea — l'API des contenus en crée un à chaque écriture, avec le
|
||||||
|
message que le téléphone envoie (`entries deleted from phone`…). L'instantané
|
||||||
|
d'avant la suppression est donc toujours là, consultable dans l'interface web
|
||||||
|
du dépôt et récupérable par un import. Ce n'est pas un écran, mais c'est un
|
||||||
|
vrai filet — et il rattrape aussi ce qu'une corbeille ne rattraperait pas :
|
||||||
|
une modification malheureuse, un import raté.
|
||||||
|
|
||||||
L'action vit dans le **menu de l'entrée** (les trois points, en tête de
|
L'action vit dans le **menu de l'entrée** (les trois points, en tête de
|
||||||
détail), et non plus en bouton pleine largeur au bas de chaque écran : rouge
|
détail), et non plus en bouton pleine largeur au bas de chaque écran : rouge
|
||||||
et présent en permanence pour un geste qu'on fait trois fois par an. Deux
|
et présent en permanence pour un geste qu'on fait trois fois par an. Deux
|
||||||
|
|||||||
@@ -283,6 +283,19 @@
|
|||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
.toast.on { opacity: 1; }
|
.toast.on { opacity: 1; }
|
||||||
|
/* DIRE QUE CA TRAVAILLE, sur n'importe quel ecran. Les boutons de l'accueil
|
||||||
|
palissaient deja pendant une operation, mais depuis la liste rien ne
|
||||||
|
bougeait : supprimer ou dupliquer prend une a deux secondes - le trajet du
|
||||||
|
conteneur - et l'ecran restait identique, comme si l'appui n'avait pas
|
||||||
|
pris. Le voile empeche aussi le second appui, qui n'attendrait pas mieux. */
|
||||||
|
.busy { position: fixed; inset: 0; z-index: 90; display: none;
|
||||||
|
align-items: center; justify-content: center;
|
||||||
|
background: rgba(0, 0, 0, .38); }
|
||||||
|
body.busy .busy { display: flex; }
|
||||||
|
.busy > div { background: var(--bg-top); border-radius: var(--radius);
|
||||||
|
padding: 20px 26px; display: flex; align-items: center;
|
||||||
|
gap: 12px; font-size: 15px; }
|
||||||
|
.busy svg { width: 22px; height: 22px; animation: spin .9s linear infinite; }
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="screen" id="unlock">
|
<div class="screen" id="unlock">
|
||||||
@@ -431,6 +444,7 @@
|
|||||||
<div class="menu" id="menu" hidden></div>
|
<div class="menu" id="menu" hidden></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="busy" id="busy"><div></div></div>
|
||||||
<div class="toast" id="toast"></div>
|
<div class="toast" id="toast"></div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -1368,6 +1382,14 @@ var PM = {
|
|||||||
clearTimeout(t._h);
|
clearTimeout(t._h);
|
||||||
t._h = setTimeout(function () { t.classList.remove('on'); }, 2600);
|
t._h = setTimeout(function () { t.classList.remove('on'); }, 2600);
|
||||||
},
|
},
|
||||||
|
/// Delphi l'appelle des qu'il part travailler et des qu'il revient. Le
|
||||||
|
/// filet est son minuteur de 25 s : meme si une operation ne rend jamais la
|
||||||
|
/// main, le voile se leve.
|
||||||
|
setBusy: function (on) {
|
||||||
|
if (on) document.getElementById('busy').firstChild.innerHTML =
|
||||||
|
ico('loader', 'Working') + '<span>Please wait...</span>';
|
||||||
|
document.body.classList.toggle('busy', !!on);
|
||||||
|
},
|
||||||
back: function () { if (view === 'detail') goList(); },
|
back: function () { if (view === 'detail') goList(); },
|
||||||
/// La touche retour annule la selection avant de verrouiller le coffre.
|
/// La touche retour annule la selection avant de verrouiller le coffre.
|
||||||
/// Sans cela, un geste d'annulation fermait le coffre - le contraire de ce
|
/// Sans cela, un geste d'annulation fermait le coffre - le contraire de ce
|
||||||
|
|||||||
@@ -2295,6 +2295,9 @@ begin
|
|||||||
FBusy := ABusy;
|
FBusy := ABusy;
|
||||||
FDeadline.Enabled := False; // reposee a zero, pas prolongee
|
FDeadline.Enabled := False; // reposee a zero, pas prolongee
|
||||||
FDeadline.Enabled := ABusy;
|
FDeadline.Enabled := ABusy;
|
||||||
|
// Les boutons de l'accueil palissaient deja, mais depuis la liste rien ne
|
||||||
|
// disait qu'on travaillait : le voile vaut pour tous les ecrans.
|
||||||
|
WebCall('PM.setBusy(' + LowerCase(BoolToStr(ABusy, True)) + ')');
|
||||||
LCanOpen := HasVault and not FVaultUnreadable;
|
LCanOpen := HasVault and not FVaultUnreadable;
|
||||||
// L'intitule suit l'etat du cache et non un mot fixe : sans coffre local,
|
// L'intitule suit l'etat du cache et non un mot fixe : sans coffre local,
|
||||||
// l'action n'est pas une synchronisation mais un premier telechargement, et
|
// l'action n'est pas une synchronisation mais un premier telechargement, et
|
||||||
|
|||||||
Reference in New Issue
Block a user