diff --git a/android-client/web/app.html b/android-client/web/app.html
index 44466ab..92e2730 100644
--- a/android-client/web/app.html
+++ b/android-client/web/app.html
@@ -533,10 +533,28 @@ document.getElementById('fields').addEventListener('click', function (ev) {
var edit = t.getAttribute('data-edit');
if (edit !== null) { openEditor(edit); return; }
+ if (t.getAttribute('data-editshow') !== null) {
+ // Masque par defaut, revelable a la demande : on tape un mot de passe
+ // qu'on ne peut relire nulle part ailleurs, mais il n'a pas a rester
+ // expose a l'ecran pendant qu'on cherche le bouton.
+ var iv = document.getElementById('editval');
+ var hid = iv.type === 'password';
+ iv.type = hid ? 'text' : 'password';
+ t.textContent = hid ? 'Hide' : 'Show';
+ return;
+ }
if (t.getAttribute('data-editcancel') !== null) { renderDetail(lastDetail); return; }
if (t.getAttribute('data-editsave') !== null) {
var input = document.getElementById('editval');
if (!input || !input.value) return; // vide : on n'ecrase pas par megarde
+ // DIRE QUE CA TRAVAILLE. L'enregistrement tire, dechiffre, rechiffre et
+ // publie : plusieurs secondes pendant lesquelles rien ne bougeait, et le
+ // bouton semblait n'avoir pas pris l'appui.
+ t.textContent = 'Saving...';
+ t.disabled = true;
+ var cancel = document.querySelector('[data-editcancel]');
+ if (cancel) cancel.disabled = true;
+ input.disabled = true;
send('setpwd?v=' + encodeURIComponent(input.value));
return;
}
@@ -554,9 +572,10 @@ function openEditor(k) {
if (!row) return;
var line = row.parentNode;
line.innerHTML =
- ''
+ + ''
+ ''
+ '';
var input = document.getElementById('editval');
diff --git a/mainApk.pas b/mainApk.pas
index 911cf71..1885f10 100644
--- a/mainApk.pas
+++ b/mainApk.pas
@@ -192,6 +192,7 @@ type
{$ENDIF}
procedure OpenEntry(AVaultIndex: Integer);
procedure SaveEntryPassword(const ANewValue: string);
+ procedure ReopenEntryByUuid(const AUuid: string);
procedure OnClipTimer(Sender: TObject);
procedure OnDeadline(Sender: TObject);
procedure OnHardwareBack(Sender: TObject; var Key: Word;
@@ -522,6 +523,25 @@ begin
end;
end;
+/// Redessine le detail d'une entree retrouvee par son uuid.
+///
+/// PAR UUID ET NON PAR INDICE : le coffre vient d'etre remplace par celui du
+/// serveur, et rien ne garantit que la meme entree occupe le meme rang - un
+/// tri se fait sur le nom affiche, qu'une autre machine a pu changer.
+procedure TForm8.ReopenEntryByUuid(const AUuid: string);
+var
+ I: Integer;
+begin
+ for I := 0 to FVault.Count - 1 do
+ if FVault.Entry(I).Uuid = AUuid then
+ begin
+ OpenEntry(I);
+ Exit;
+ end;
+ // Disparue du distant entre-temps : la liste est deja a jour, on y reste.
+ WebCall('PM.back()');
+end;
+
/// Change le mot de passe de l'entree ouverte, et publie.
///
/// TIRER, MODIFIER, RECHIFFRER, PUBLIER - dans cet ordre, et sur l'instantane
@@ -632,6 +652,13 @@ begin
end
else
WebCall('PM.toast(' + JsArg('Not saved - ' + LErr) + ')');
+ // LE DETAIL DOIT REVENIR, dans les deux cas. AdoptVault reconstruit
+ // la LISTE ; la ligne en cours d'edition restait telle quelle, donc
+ // le champ de saisie demeurait a l'ecran et rien ne disait si
+ // l'enregistrement avait abouti. On la redessine depuis le coffre :
+ // apres un succes elle porte la nouvelle valeur, apres un echec
+ // l'ancienne - ce qui se lit sans commentaire.
+ ReopenEntryByUuid(LUuid);
end);
finally
LClient.Free;