From bc82e33bf27b138d7f9ec84b5be05c9dbe8156f2 Mon Sep 17 00:00:00 2001 From: Kendrick Bollens Date: Thu, 7 May 2026 10:50:36 +0200 Subject: [PATCH] Smart-Sync, Scope-Fix, Auto-Refresh, defaults.local.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Background-Sync: SHA-Check alle 5s, voller Pull nur bei Änderung - Sync-Hashes werden nach Pull im Storage geschrieben → grüne Dots - UI refreshed automatisch bei Background-Sync (storage.onChanged) - Scope-Badge-Bug gefixt (folderToScope normalisiert den Vergleich) - defaults.local.json: optionale vorkonfigurierte Verbindungsdaten - README: Doku für defaults.local.json und XPI-Build mit/ohne Defaults --- .gitignore | 2 +- README.md | 23 +++++++- lib/gitea-sync.js | 69 ++++++++++++++++++----- templates-reply-hotel.xpi | Bin 428879 -> 430038 bytes templates_options/templates_options.html | 1 - templates_options/templates_options.js | 61 ++++++++++++-------- 6 files changed, 118 insertions(+), 38 deletions(-) diff --git a/.gitignore b/.gitignore index 683b324..5e2c2d7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -defaults.local.js +defaults.local.json diff --git a/README.md b/README.md index e079821..17620d5 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ Mapping von Abteilungs-E-Mail-Adressen zu Ordnernamen. Wird vom Plugin gelesen, | `lib/gitea-sync.js` | Gitea-API-Client + Sync-Manager | | `lib/mdi/` | Material Design Icons (Subset) | | `templates_options/` | Einstellungsseite (Vorlagen, Signaturen, Verbindung) | +| `defaults.local.json` | Optionale vorkonfigurierte Verbindungsdaten (gitignored) | ## Installation @@ -71,12 +72,32 @@ Mapping von Abteilungs-E-Mail-Adressen zu Ordnernamen. Wird vom Plugin gelesen, ### XPI bauen ```bash +# Ohne vorkonfigurierte Verbindungsdaten: 7z a templates-reply-hotel.xpi manifest.json background.js popup.html popup.js lib/ templates_options/ icons/ + +# Mit vorkonfigurierten Verbindungsdaten (für Deployment): +7z a templates-reply-hotel.xpi manifest.json background.js popup.html popup.js lib/ templates_options/ icons/ defaults.local.json ``` +### Vorkonfigurierte Verbindungsdaten (`defaults.local.json`) + +Wenn eine `defaults.local.json` im Plugin-Root existiert und in die XPI eingebaut wird, werden die Verbindungsdaten beim ersten Start automatisch gesetzt. Der User muss dann nur noch "Verbindung speichern" klicken. + +```json +{ + "baseUrl": "https://git.example.com", + "owner": "organisation", + "repo": "email-vorlagen", + "branch": "main", + "token": "dein-api-token" +} +``` + +Die Datei ist in `.gitignore` — Tokens landen nicht im Repository. + ## Einrichtung -1. **Verbindung konfigurieren**: Einstellungen-Tab (⚙) → Server-URL, Repository, Token eingeben → Verbindung speichern +1. **Verbindung konfigurieren**: Einstellungen-Tab (⚙) → Server-URL, Repository, Token eingeben → Verbindung speichern (entfällt bei vorkonfigurierter XPI) 2. **Abteilung wählen** (oder automatisch erkannt via `abteilungen.json`) 3. **Vorlagen erstellen**: Vorlagen-Tab → Neue Vorlage → Sichtbarkeit wählen → Speichern 4. **Signaturen einrichten**: Signaturen-Tab → Identität wählen → Kopfbereich bearbeiten → Speichern diff --git a/lib/gitea-sync.js b/lib/gitea-sync.js index daa7064..53c5288 100644 --- a/lib/gitea-sync.js +++ b/lib/gitea-sync.js @@ -3,7 +3,8 @@ const SYNC_CONFIG_KEY = 'gitea_config'; const SYNC_STATE_KEY = 'sync_state'; const TEMPLATE_STORAGE_KEY = 'message_templates'; -const SYNC_INTERVAL_MS = 15 * 60 * 1000; // 15 minutes +const SHA_CHECK_INTERVAL_MS = 5 * 1000; // 5 seconds — lightweight SHA check +const FULL_SYNC_COOLDOWN_MS = 10 * 1000; // min 10s between full pulls const SHARED_FOLDER = '_gemeinsam'; const USER_FOLDER = '_benutzer'; const CONFIG_FOLDER = '_config'; @@ -762,24 +763,66 @@ browser.runtime.onMessage.addListener(async (msg, sender) => { // ── Auto-sync on startup (pull only) ── -async function autoSync() { +let lastKnownShas = null; +let lastFullSync = 0; +let syncInProgress = false; +const HASH_STORAGE_KEY_BG = 'sync_hashes'; + +function simpleHashBg(str) { + let h = 0; + for (let i = 0; i < str.length; i++) { + h = ((h << 5) - h + str.charCodeAt(i)) | 0; + } + return h; +} + +async function updateSyncHashes() { + const templates = await syncManager.getLocalTemplates(); + const result = await browser.storage.local.get(HASH_STORAGE_KEY_BG); + const data = result[HASH_STORAGE_KEY_BG] || {}; + data.tpl = {}; + for (const t of templates) { + data.tpl[t.id] = simpleHashBg(t.content || ''); + } + await browser.storage.local.set({ [HASH_STORAGE_KEY_BG]: data }); +} + +async function smartSync() { + if (syncInProgress) return; try { const initialized = await syncManager.init(); if (!initialized) return; - if (syncManager.department) { - console.log('[Sync] Auto-pull Vorlagen gestartet...'); - const result = await syncManager.pullTemplates(); - console.log('[Sync] Auto-pull Vorlagen abgeschlossen:', result); - } + // Lightweight SHA check + const shaResult = await syncManager.checkRemoteShas(); + if (!shaResult?.success) return; - console.log('[Sync] Auto-pull Signaturen gestartet...'); - const sigResult = await syncManager.pullSignatures(); - console.log('[Sync] Auto-pull Signaturen abgeschlossen:', sigResult); + const currentShas = JSON.stringify(shaResult.remoteShas); + + // First run or SHAs changed → full pull + if (lastKnownShas === null || currentShas !== lastKnownShas) { + const now = Date.now(); + if (now - lastFullSync < FULL_SYNC_COOLDOWN_MS) return; + + syncInProgress = true; + lastFullSync = now; + console.log('[Sync] Änderung erkannt, lade Vorlagen...'); + + const result = await syncManager.pullTemplates(); + console.log('[Sync] Vorlagen geladen:', result); + await updateSyncHashes(); + + const sigResult = await syncManager.pullSignatures(); + console.log('[Sync] Signaturen geladen:', sigResult); + + lastKnownShas = JSON.stringify((await syncManager.checkRemoteShas()).remoteShas || {}); + syncInProgress = false; + } } catch (err) { - console.error('[Sync] Auto-pull fehlgeschlagen:', err); + console.error('[Sync] Check fehlgeschlagen:', err); + syncInProgress = false; } } -autoSync(); -setInterval(autoSync, SYNC_INTERVAL_MS); +smartSync(); +setInterval(smartSync, SHA_CHECK_INTERVAL_MS); diff --git a/templates-reply-hotel.xpi b/templates-reply-hotel.xpi index 25021d66dd299aca409ef3e67320759461692d56..67c21da28fbe0c2ccd0f5cba9af0b09a13fdd050 100644 GIT binary patch delta 26643 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 delta 25484 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 OyS!i_Ao@f9N&gGLugMJn diff --git a/templates_options/templates_options.html b/templates_options/templates_options.html index 7404451..ad92766 100644 --- a/templates_options/templates_options.html +++ b/templates_options/templates_options.html @@ -1062,7 +1062,6 @@ - diff --git a/templates_options/templates_options.js b/templates_options/templates_options.js index 568ae26..6c4399e 100644 --- a/templates_options/templates_options.js +++ b/templates_options/templates_options.js @@ -786,6 +786,12 @@ async function handlePushSingle(e) { // ── Inline Scope Change ── +function folderToScope(folder) { + if (folder === '_gemeinsam') return 'shared'; + if (folder?.startsWith('_benutzer/')) return 'private'; + return 'department'; +} + async function handleScopeChange(e) { const id = e.target.dataset.id; const newScope = e.target.value; @@ -793,36 +799,26 @@ async function handleScopeChange(e) { const template = templates.find(t => t.id === id); if (!template) return; + const oldScope = folderToScope(template.folder); + if (oldScope === newScope) return; + const authorEmail = await getAuthorEmail(); - const oldFolder = template.folder; - let newFolder; - if (newScope === 'shared') newFolder = '_gemeinsam'; - else if (newScope === 'private') newFolder = `_benutzer/${authorEmail}`; - else newFolder = undefined; - - if (oldFolder === newFolder) return; - if (newScope === 'private' && !authorEmail) { showToast('Bitte E-Mail in den Einstellungen eintragen.', 'error'); - // Reset - e.target.value = oldFolder === '_gemeinsam' ? 'shared' - : oldFolder?.startsWith('_benutzer/') ? 'private' : 'department'; + e.target.value = oldScope; return; } // Warn on downgrade - const isDowngrade = (oldFolder === '_gemeinsam' && newFolder !== '_gemeinsam') || - (!oldFolder?.startsWith('_benutzer/') && newFolder?.startsWith('_benutzer/')); - - if (isDowngrade && template.remotePath) { + const scopeRank = { shared: 2, department: 1, private: 0 }; + if (scopeRank[newScope] < scopeRank[oldScope] && template.remotePath) { const confirmed = await showConfirmDialog( 'Sichtbarkeit verringern?', 'Die Vorlage wird am bisherigen Ort gelöscht. Andere Nutzer verlieren ggf. den Zugriff.', 'Trotzdem ändern' ); if (!confirmed) { - e.target.value = oldFolder === '_gemeinsam' ? 'shared' - : oldFolder?.startsWith('_benutzer/') ? 'private' : 'department'; + e.target.value = oldScope; return; } } @@ -838,13 +834,18 @@ async function handleScopeChange(e) { template.remotePath = undefined; } - template.folder = newFolder; + // Set new folder + if (newScope === 'shared') template.folder = '_gemeinsam'; + else if (newScope === 'private') template.folder = `_benutzer/${authorEmail}`; + else template.folder = undefined; + await saveTemplates(templates); // Auto-push to new location try { await browser.runtime.sendMessage({ action: 'pushTemplates' }); templates = await getTemplates(); + storeTplHashes(templates); } catch (_) {} renderTemplates(templates); @@ -1388,10 +1389,15 @@ async function loadSyncConfig() { const result = await browser.storage.local.get(SYNC_CONFIG_KEY); let config = result[SYNC_CONFIG_KEY]; - // First launch: apply defaults from defaults.local.js if available - if (!config && typeof DEFAULT_SYNC_CONFIG !== 'undefined') { - config = { ...DEFAULT_SYNC_CONFIG }; - await browser.storage.local.set({ [SYNC_CONFIG_KEY]: config }); + // First launch: load defaults from defaults.local.json if available + if (!config) { + try { + const res = await fetch(browser.runtime.getURL('defaults.local.json')); + if (res.ok) { + config = await res.json(); + await browser.storage.local.set({ [SYNC_CONFIG_KEY]: config }); + } + } catch (_) {} } if (config) { @@ -1670,4 +1676,15 @@ window.addEventListener('load', async () => { checkForServerUpdates(); setInterval(checkForServerUpdates, 30000); + + // Auto-refresh UI when background sync updates hashes (fires after templates + hashes are both written) + browser.storage.onChanged.addListener(async (changes, area) => { + if (area !== 'local') return; + if (changes[HASH_STORAGE_KEY]) { + await loadSyncHashes(); + const templates = await getTemplates(); + renderTemplates(templates); + updateTplSyncIndicator(); + } + }); });