fix(web-clipper): bouton rond transparent draggable + toggle affichage + refresh auto sidebar + fix bloc bookmark (v6.2.1)
FlowDeck CI / lint (push) Successful in 1m14s
FlowDeck CI / test (push) Failing after 8m44s
FlowDeck CI / docker (push) Skipped

- bouton flottant rond (44px), semi-transparent blur, hover plus fonce, deplacable souris (pos persistee storage)
- option afficher/cacher dans popup extension (showButton)
- clipper: notification instantanee des onglets FlowDeck via tabs.sendMessage + polling 15s + BroadcastChannel + visibilitychange
- fix bookmark template literal '+title+' -> \/\/\/\/\ (_page_editor_scripts.html)
- sync static/extension + zip
This commit is contained in:
2026-09-20 11:02:49 -04:00
parent 7f998faf7b
commit ea19d1d050
14 changed files with 520 additions and 38 deletions
+41
View File
@@ -1100,6 +1100,47 @@
this.loadAgents();
this.initSidebarWidth();
document.addEventListener('fd-toggle-sidebar', () => this.toggleSidebar());
this.startClipAutoRefresh();
},
// ── Auto-refresh sidebar after a web clip (no manual reload) ──
_clipRefreshTimer: null,
_clipRefreshInterval: null,
startClipAutoRefresh() {
const self = this;
// Instant refresh when extension notifies (content script forwards event)
window.addEventListener('flowdeck:clip-created', () => {
clearTimeout(self._clipRefreshTimer);
self._clipRefreshTimer = setTimeout(() => self.refreshSidebarTree(), 400);
});
document.addEventListener('flowdeck:workspace-changed', () => {
clearTimeout(self._clipRefreshTimer);
self._clipRefreshTimer = setTimeout(() => self.refreshSidebarTree(), 400);
});
// Also refresh when tab becomes visible (user returns to FlowDeck after clipping)
document.addEventListener('visibilitychange', () => {
if (!document.hidden) self.refreshSidebarTree();
});
window.addEventListener('focus', () => self.refreshSidebarTree());
// Polling fallback every 15s while tab is visible (covers extension clip without message)
try {
self._clipRefreshInterval = setInterval(() => {
if (!document.hidden) self.refreshSidebarTree();
}, 15000);
} catch (_e) {}
// BroadcastChannel cross-tab sync (all FlowDeck tabs refresh together)
try {
if (window.BroadcastChannel) {
const bc = new BroadcastChannel('flowdeck');
bc.onmessage = (ev) => {
if (ev.data && ev.data.type === 'clip-created') self.refreshSidebarTree();
};
window._fdBC = bc;
// Bridge DOM event → BroadcastChannel for extension-triggered clips
window.addEventListener('flowdeck:clip-created', () => {
try { bc.postMessage({ type: 'clip-created', at: Date.now() }); } catch (_e) {}
});
}
} catch (_e) {}
},
agentList: [],
loadAgents() {