feat(sync): Sync now dans le menu Tools

Synchroniser est une ACTION, pas un reglage. Elle n'existait qu'au fond
du panneau des reglages, a cote de l'URL et du jeton : on l'y configure
une fois, on la declenche tous les jours.

Sans URL, sans "Enable sync" ou sans mot de passe de sync, l'appui ouvre
les reglages ET DESCEND jusqu'a la section - un bouton qui ne peut
qu'echouer ne vaut pas mieux que pas de bouton, et repondre "Sync not
configured" laisse chercher ou reparer. Le panneau n'a pas d'onglets,
c'est une colonne longue : le battement dit lequel des blocs on est venu
chercher.

L'etat est lu SANS les secrets - hasEncPwd dit que le mot de passe existe
sans le lire, ce que loadSyncConfig documente : les tirer les planterait
dans le renderer pour la vie du processus.

L'entree disparait sans le pont, comme la section : le frontend PHP n'a
pas de sortie reseau.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-08-28 23:59:52 +01:00
parent fba05f1ce5
commit 23dc0a78ac
3 changed files with 53 additions and 0 deletions
+40
View File
@@ -6623,6 +6623,26 @@ function setTheme(t) {
Bridge.syncTitleBarTheme(t);
}
/// Amene la section Sync sous les yeux, dans un panneau qui defile long.
///
/// Le panneau des reglages n'a pas d'onglets : c'est une seule colonne, et la
/// section Sync est vers le bas. L'ouvrir sans y descendre reviendrait a dire
/// "c'est quelque part la-dedans". Le liseré s'efface tout seul - il montre ou
/// regarder, il ne decore pas.
function revealSyncSettings() {
const el = $('#syncField');
if (!el) return;
// Un tour d'horloge : le panneau vient d'etre montre, ses hauteurs ne sont
// pas encore calculees et scrollIntoView n'aurait nulle part ou aller.
setTimeout(() => {
el.scrollIntoView({ block: 'start', behavior: 'smooth' });
el.classList.add('is-flash');
setTimeout(() => el.classList.remove('is-flash'), 2500);
const box = $('#settingSyncEnabled');
if (box && !box.checked) box.focus();
}, 0);
}
function openSettings() {
$('#settingTheme').value = state.theme;
$('#settingSort').value = state.sortBy + ':' + state.sortDir;
@@ -6717,6 +6737,10 @@ function openSettings() {
const syncField = document.getElementById('syncField');
if (syncField) {
syncField.style.display = Bridge.active ? '' : 'none';
// Meme regle pour l'entree des outils : proposer une action que cette
// version ne sait pas rendre vaut moins que de ne rien proposer.
const syncNav = document.getElementById('sidebarSyncBtn');
if (syncNav) syncNav.style.display = Bridge.active ? '' : 'none';
if (Bridge.active) loadSyncConfig().then(refreshSyncUI);
}
@@ -7752,6 +7776,22 @@ async function init() {
$('#idleStayBtn').addEventListener('click', resetAutoLock);
// Settings slide-over
// SYNCHRONISER DEPUIS LES OUTILS, ou reglez-la d'abord.
//
// Un bouton qui ne peut qu'echouer ne vaut pas mieux que pas de bouton :
// sans URL ni mot de passe de sync, l'appui ouvre les reglages a l'endroit
// ou l'on repare cela, plutot que de repondre "Sync not configured" et de
// laisser chercher ou.
$('#sidebarSyncBtn').addEventListener('click', async () => {
// Sans les secrets : on ne veut savoir que si c'est configure, pas s'en
// servir - les tirer les planterait dans le renderer pour la vie du
// processus, ce que loadSyncConfig documente. hasEncPwd suffit a dire
// que le mot de passe existe, sans le lire.
const cfg = await loadSyncConfig(false);
if (cfg && cfg.enabled && cfg.url && cfg.hasEncPwd) return runSyncNow();
openSettings();
revealSyncSettings();
});
$('#settingsBtn').addEventListener('click', openSettings);
$('#settingsClose').addEventListener('click', closeSettings);