feat(android): an entry can be deleted from the phone

Both, or nothing: the row leaves the snapshot AND a tombstone takes its
place. Removing the row alone does not delete - the desktop still holds its
own copy, and the next pull would bring it back as an entry we never had.
The time matters too: the desktop's arbitration keeps an entry edited AFTER
the deletion rather than killing it a second time.

No trash on the phone, deliberately. The desktop's is a `deleted` flag that
does not travel in sync, so a deletion stopping there would propagate
nowhere. Hence a button at the very bottom, in two taps, that disarms itself
after four seconds - a button left armed gets touched by accident much
later, and this is the one action with no way back.

The confirmation is in the page because the engine cannot offer one: a
JavaScript prompt needs a WebChromeClient FMX does not provide.

Not exercised on the device: it would have destroyed a real entry.
This commit is contained in:
r-zakarya
2026-08-21 16:21:45 +01:00
parent 7a0ae6398b
commit 5107ebf7b2
4 changed files with 140 additions and 1 deletions
+13 -1
View File
@@ -670,7 +670,19 @@ téléphone qu'on voudra ensuite ouvrir sur le poste demandera un import.
Une ligne vide s'affiche désormais **si elle est éditable** : un identifiant
absent qu'on ne pourrait pas ajouter serait une impasse. Vider est permis,
sauf sur un mot de passe où ce serait presque toujours une fausse manoeuvre.
**Reste : supprimer**, qui exige les tombstones.
**Supprimer** — fait le 2026-08-21. `DeleteEntry` retire la ligne **et** pose
la pierre tombale `{uuid, deleted_at}` : les deux, sinon rien. Retirer la
ligne seule ne supprime pas — le poste tient toujours la sienne, et le
prochain tirage la ramènerait comme une entrée qu'on n'a jamais eue. Et
l'heure compte : l'arbitrage du poste garde une entrée modifiée *après* la
suppression plutôt que de la tuer une seconde fois.
**Sans retour depuis le téléphone**, et c'est délibéré : la corbeille du
poste est un drapeau `deleted` qui ne voyage pas dans la synchronisation, donc
une suppression qui s'y arrêterait ne se propagerait nulle part. D'où le
bouton en bas d'écran, en deux temps, qui se désarme seul au bout de quatre
secondes — un bouton armé indéfiniment se fait toucher par mégarde bien plus
tard.
4. **Réconcilier avec la synchronisation** : un coffre né seul auquel on
ajoute un dépôt. C'est là que la fusion revient, et elle a été évitée
jusqu'ici pour de bonnes raisons.