fix(workspace): menu contextuel après navigation partielle + sync sidebar/header au rename
This commit is contained in:
@@ -986,6 +986,7 @@ async def local_workspace_page(request: Request, folder: int = None):
|
||||
"workspace_id": ws_id or 0,
|
||||
"nav_workspace_id": ws_id or 0,
|
||||
"breadcrumb": breadcrumb,
|
||||
"breadcrumbs": breadcrumb,
|
||||
}
|
||||
template = env.get_template("local_workspace.html")
|
||||
return HTMLResponse(
|
||||
|
||||
@@ -27,9 +27,15 @@
|
||||
if (window.__fdCtxMenuRegistered) return;
|
||||
window.__fdCtxMenuRegistered = true;
|
||||
|
||||
document.addEventListener('alpine:init', function () {
|
||||
if (window.Alpine && window.Alpine.__fdCtxStore) return;
|
||||
if (window.Alpine) window.Alpine.__fdCtxStore = true;
|
||||
// Sur un chargement complet de page, ce script inline s'exécute AVANT
|
||||
// alpine.min.js (defer) → Alpine n'existe pas encore : on attend 'alpine:init'.
|
||||
// Sur une navigation partielle (fdNavigate → htmx), Alpine est déjà démarré et
|
||||
// 'alpine:init' ne sera plus jamais émis → on enregistre le store tout de suite,
|
||||
// sinon le menu contextuel reste mort jusqu'au prochain chargement complet.
|
||||
function registerFdCtx() {
|
||||
if (!window.Alpine) return;
|
||||
if (window.Alpine.__fdCtxStore) return;
|
||||
window.Alpine.__fdCtxStore = true;
|
||||
|
||||
Alpine.store('fdCtx', {
|
||||
open: false, x: 0, y: 0, node: null, page: null,
|
||||
@@ -166,7 +172,13 @@
|
||||
this.close();
|
||||
},
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if (window.Alpine) {
|
||||
registerFdCtx();
|
||||
} else {
|
||||
document.addEventListener('alpine:init', registerFdCtx);
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
|
||||
|
||||
@@ -816,6 +816,26 @@
|
||||
return m ? m[1] : '';
|
||||
},
|
||||
|
||||
/** Reflète le rename d'une page/dossier dans toute l'UI : sidebar gauche
|
||||
(Récents, Privé, Favoris + arbre du workspace), breadcrumb du header
|
||||
(event flowdeck:page-renamed) et frame parente (postMessage). */
|
||||
syncPageTitle: function(pid, title) {
|
||||
var t = (title || '').trim() || 'Untitled';
|
||||
document.querySelectorAll('.sidebar-item[data-page-id="page/' + pid + '"]').forEach(function(item) {
|
||||
var n = item.querySelector('.page-name');
|
||||
if (n) n.textContent = t;
|
||||
});
|
||||
document.querySelectorAll('.sidebar-item.ws-tree-item[data-id="' + pid + '"]').forEach(function(item) {
|
||||
item.setAttribute('data-name', t);
|
||||
var n = item.querySelector('.page-name');
|
||||
if (n) n.textContent = t;
|
||||
});
|
||||
window.dispatchEvent(new CustomEvent('flowdeck:page-renamed', { detail: { id: pid, title: t } }));
|
||||
if (window.parent && window.parent !== window) {
|
||||
try { window.parent.postMessage({ type: 'fd-page-renamed', id: pid, title: t }, window.location.origin); } catch (e) {}
|
||||
}
|
||||
},
|
||||
|
||||
/** Refresh CSRF token from the server. Returns a promise resolving to the new token. */
|
||||
refreshCsrfToken: async function() {
|
||||
try {
|
||||
@@ -1182,6 +1202,7 @@
|
||||
body: JSON.stringify({ name: newName.trim() })
|
||||
}).then(function(r) {
|
||||
if (r.ok) {
|
||||
if (window.FlowDeck && window.FlowDeck.syncPageTitle) window.FlowDeck.syncPageTitle(id, newName.trim());
|
||||
self.refreshSidebarTree();
|
||||
document.dispatchEvent(new CustomEvent('flowdeck:workspace-changed'));
|
||||
if (window._wsData && window._wsData._reloadAfterAction) {
|
||||
|
||||
@@ -1519,6 +1519,20 @@ window._wsInitData = (function() {
|
||||
if (r.ok) {
|
||||
node.name = n; node.db_name = n;
|
||||
this._saveExpandedState();
|
||||
if (window.appState && window.appState.refreshSidebarTree) window.appState.refreshSidebarTree();
|
||||
if (window.FlowDeck && window.FlowDeck.syncPageTitle) window.FlowDeck.syncPageTitle(node.id, n);
|
||||
var self = this;
|
||||
if (this.folderStack && this.folderStack.length) {
|
||||
this.folderStack.forEach(function(f) { if (String(f.id) === String(node.id)) f.name = n; });
|
||||
}
|
||||
if (this.breadcrumb && this.breadcrumb.length) {
|
||||
this.breadcrumb.forEach(function(b) { if (String(b.id) === String(node.id)) b.name = n; });
|
||||
}
|
||||
if (this.previewItem && String(this.previewItem.id) === String(node.id)) {
|
||||
this.previewItem.name = n;
|
||||
var pt = document.getElementById('ws-preview-title');
|
||||
if (pt) pt.textContent = n;
|
||||
}
|
||||
}
|
||||
},
|
||||
cancelRename() { this.renamingId = null; },
|
||||
|
||||
Reference in New Issue
Block a user