feat(nav): partial HTMX navigation — swap main content without full reload
Intercept internal links and load only .main-wrapper via htmx.ajax, keeping the sidebar/header shell in place. Adds history pushState/popstate handling, sidebar active-state resync and document title update. Moves page script blocks inside #main-content so they run on swap, and makes editor/board scripts idempotent. Routes navigateTo/breadcrumb/library/local-workspace through window.fdNavigate and fixes the duplicated navigateTo definition.
This commit is contained in:
@@ -867,7 +867,7 @@ window._wsInitData = (function() {
|
||||
document.getElementById('ws-preview-icon').innerHTML = this._fileIcon(node.name, node.is_folder, node.content_format, node.page_icon);
|
||||
document.getElementById('ws-preview-title').textContent = node.name;
|
||||
var openBtn = document.getElementById('ws-preview-open-btn');
|
||||
openBtn.onclick = function() { window.location = '/pages/' + node.id; };
|
||||
openBtn.onclick = function() { if (window.fdNavigate) window.fdNavigate('/pages/' + node.id); else window.location = '/pages/' + node.id; };
|
||||
var favBtn = document.getElementById('ws-preview-fav-btn');
|
||||
favBtn.onclick = function() { window.showToast('Favorite toggled', 'success'); };
|
||||
var copyBtn = document.getElementById('ws-preview-copy-btn');
|
||||
@@ -1248,7 +1248,7 @@ window._wsInitData = (function() {
|
||||
} else {
|
||||
// Click to rename, double-click to open
|
||||
html += '<span class="name file" onclick="event.stopPropagation();window._wsData.startRenderChildRename('+escId+',\''+escName+'\')"'
|
||||
+ ' ondblclick="window.location=\'/pages/'+escId+'\'"'
|
||||
+ ' ondblclick="window.fdNavigate?window.fdNavigate(\'/pages/'+escId+'\'):window.location=\'/pages/'+escId+'\'"'
|
||||
+ ' title="Click to rename, double-click to open"'
|
||||
+ ' onmouseenter="var d=window._wsData;if(d)d.showPreview(event,{id:'+escId+',name:\''+escName+'\',is_folder:false,content_format:\''+(c.content_format||'')+'\'})"'
|
||||
+ ' onmouseleave="var d=window._wsData;if(d)d.hidePreview()">'
|
||||
@@ -1640,11 +1640,12 @@ window._wsInitData = (function() {
|
||||
navigateToPath() {
|
||||
var path = (this.$el.querySelector('.path-input') || {}).value || '';
|
||||
var parts = path.replace(/^\/workspace\/?/, '').split('/').filter(Boolean);
|
||||
if (parts.length === 0) { window.location = '/local-workspace'; return; }
|
||||
if (parts.length === 0) { if (window.fdNavigate) window.fdNavigate('/local-workspace'); else window.location = '/local-workspace'; return; }
|
||||
// Walk tree to find matching folder
|
||||
var targetId = this._findFolderByPath(this.tree, parts, 0);
|
||||
if (targetId) {
|
||||
window.location = '/local-workspace?folder=' + targetId;
|
||||
if (window.fdNavigate) window.fdNavigate('/local-workspace?folder=' + targetId);
|
||||
else window.location = '/local-workspace?folder=' + targetId;
|
||||
} else {
|
||||
window.showToast('Path not found: ' + parts.join('/'), 'error');
|
||||
}
|
||||
@@ -1963,7 +1964,7 @@ window._wsInitData = (function() {
|
||||
return false;
|
||||
},
|
||||
|
||||
openPage(id) { window.location = '/pages/'+id; },
|
||||
openPage(id) { if (window.fdNavigate) window.fdNavigate('/pages/' + id); else window.location = '/pages/' + id; },
|
||||
openSidePeek(id) {
|
||||
var node = this._findNodeById(this.tree, id) || this._findNodeById(this.displayTree, id);
|
||||
if (node) this.selectForPreview(node);
|
||||
|
||||
Reference in New Issue
Block a user