feat(notes): commandes masquees avec l'oeil des notes

Partage d'ecran : premier mot et 3 derniers caracteres visibles
(ssh ••••.11), dans le panneau et la recherche rapide. Filtre, copie et
remplissage gardent le vrai texte. Aide de la recherche rapide adaptee aux
commandes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-10-10 18:35:37 +01:00
parent bbd4e2ef06
commit 6ca1e4b2cf
5 changed files with 37 additions and 3 deletions
+18 -1
View File
@@ -4050,6 +4050,20 @@ function parseCommandNote(text) {
return out;
}
// AFFICHAGE MASQUE d'une commande (partage d'ecran), sur l'oeil "mask notes" :
// le premier mot reste, puis le milieu masque, puis les 3 derniers caracteres.
// "ssh admin@10.0.0.11" -> "ssh ••••••••••••.11". Une fin trop courte pour
// en garder 3 sans tout montrer est masquee en entier. Affichage seulement :
// filtre, copie et remplissage travaillent sur le vrai texte.
function maskCommand(cmd) {
const s = String(cmd || '');
const sp = s.indexOf(' ');
const head = sp < 0 ? '' : s.slice(0, sp + 1);
const rest = sp < 0 ? s : s.slice(sp + 1);
if (rest.length <= 6) return head + '•'.repeat(rest.length);
return head + '•'.repeat(rest.length - 3) + rest.slice(-3);
}
// HISTORIQUE DES ENTREES OUVERTES, comme celui d'un navigateur. Fonctions
// pures sur {ids, pos} : testables sans DOM (tests/history.test.js).
const ENTRY_HISTORY_MAX = 50;
@@ -4671,7 +4685,8 @@ function soCommandsField() {
if (c.group) list.appendChild(el('div', { class: 'so-cmds-group' }, c.group));
}
const row = el('div', { class: 'so-cmds-row' });
row.appendChild(el('code', { class: 'so-cmds-cmd' }, c.cmd));
row.appendChild(el('code', { class: 'so-cmds-cmd' },
state.maskNotes ? maskCommand(c.cmd) : c.cmd));
const b = el('button', { class: 'icon-btn icon-btn-sm', type: 'button', title: 'Copy command' });
b.appendChild(icon('i-copy'));
b.addEventListener('click', async ev => {
@@ -4721,6 +4736,8 @@ function soNoteBodyField(value) {
state.maskNotes = !state.maskNotes;
localStorage.setItem('maskNotes', state.maskNotes ? '1' : '0');
ta.classList.toggle('is-masked', state.maskNotes);
// La liste des commandes suit l'oeil (elle ecoute 'input').
ta.dispatchEvent(new Event('input'));
saveServerSettings();
});
wrap.appendChild(ta);