Make createPage() and createFolder() context-aware
- createPage() now detects active workspace context (library, local-workspace page, sidebar) - In a local/Gitea workspace: creates workspace item via /api/local-workspace/items with prompt - No workspace: creates general Notion page via /board/api/pages (no prompt) - Added hidden #fd-local-ws-id in local_workspace.html to expose workspace_id - _confirmCreateFolder() passes workspace_id for Gitea workspaces - Added _getContext() helper that checks multiple context sources in priority order - Added _toast() helper for cross-component notifications
This commit is contained in:
+87
-10
@@ -497,9 +497,84 @@
|
|||||||
return m ? m[1] : '';
|
return m ? m[1] : '';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** Create a new Notion-style page (same as sidebar bottom-right button). */
|
/** Detect the active workspace context from multiple sources.
|
||||||
|
* Returns { wsId: number, isGitea: boolean, workspaceKey: string } */
|
||||||
|
_getContext: function() {
|
||||||
|
// 1) Library page context (most specific)
|
||||||
|
if (window._libData && window._libData.workspaceId) {
|
||||||
|
return {
|
||||||
|
wsId: window._libData.workspaceId,
|
||||||
|
isGitea: !!window._libData.isGiteaActive,
|
||||||
|
workspaceKey: (window.appState && window.appState.workspaceKey) || ''
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// 2) local-workspace page (hidden element)
|
||||||
|
var wsEl = document.getElementById('fd-local-ws-id');
|
||||||
|
if (wsEl) {
|
||||||
|
var wid = parseInt(wsEl.textContent) || 0;
|
||||||
|
if (wid > 0) {
|
||||||
|
return {
|
||||||
|
wsId: wid,
|
||||||
|
isGitea: false,
|
||||||
|
workspaceKey: (window.appState && window.appState.workspaceKey) || ''
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 3) Sidebar Gitea workspace (localWsId is set)
|
||||||
|
if (window.appState && window.appState.localWsId) {
|
||||||
|
return {
|
||||||
|
wsId: window.appState.localWsId,
|
||||||
|
isGitea: true,
|
||||||
|
workspaceKey: window.appState.workspaceKey || ''
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// 4) Sidebar has workspaceKey but no localWsId (possibly a named local ws?)
|
||||||
|
var wk = (window.appState && window.appState.workspaceKey) || '';
|
||||||
|
if (wk && wk.includes('/')) {
|
||||||
|
return { wsId: 0, isGitea: true, workspaceKey: wk };
|
||||||
|
}
|
||||||
|
// 5) No workspace context
|
||||||
|
return { wsId: 0, isGitea: false, workspaceKey: wk };
|
||||||
|
},
|
||||||
|
|
||||||
|
/** Return a toast function that works across pages. */
|
||||||
|
_toast: function(msg, type) {
|
||||||
|
if (window.appState && window.appState.toast) window.appState.toast(msg, type);
|
||||||
|
else console.log('[FlowDeck]', type, msg);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new page/file in the correct workspace context.
|
||||||
|
* - Local workspace active → workspace item (prompts for name)
|
||||||
|
* - Gitea workspace active → workspace item with workspace_id (prompts for name)
|
||||||
|
* - No workspace → general Notion page (no prompt, title "New page")
|
||||||
|
*/
|
||||||
createPage: function() {
|
createPage: function() {
|
||||||
var project = (window.appState && window.appState.workspaceKey) || '';
|
var ctx = this._getContext();
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
// ── Workspace context → create workspace item ──
|
||||||
|
if (ctx.wsId > 0) {
|
||||||
|
var name = prompt('File name:');
|
||||||
|
if (!name || !name.trim()) return;
|
||||||
|
var body = { name: name.trim(), type: 'page' };
|
||||||
|
if (ctx.isGitea) body.workspace_id = ctx.wsId;
|
||||||
|
|
||||||
|
fetch('/api/local-workspace/items', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': this.getCsrfToken() },
|
||||||
|
body: JSON.stringify(body)
|
||||||
|
})
|
||||||
|
.then(function(r) { if (!r.ok) throw new Error('Failed'); return r.json(); })
|
||||||
|
.then(function(data) {
|
||||||
|
window.location.href = '/pages/' + data.id;
|
||||||
|
})
|
||||||
|
.catch(function(err) { self._toast('Failed: ' + err.message, 'error'); });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── No workspace → general Notion page ──
|
||||||
|
var project = ctx.workspaceKey;
|
||||||
var url = '/board/api/pages?section=Private&project=' + encodeURIComponent(project);
|
var url = '/board/api/pages?section=Private&project=' + encodeURIComponent(project);
|
||||||
fetch(url, {
|
fetch(url, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
@@ -507,10 +582,7 @@
|
|||||||
})
|
})
|
||||||
.then(function(r) { if (!r.ok) throw new Error('CSRF or API error'); return r.json(); })
|
.then(function(r) { if (!r.ok) throw new Error('CSRF or API error'); return r.json(); })
|
||||||
.then(function(data) { window.location.href = '/pages/' + data.id; })
|
.then(function(data) { window.location.href = '/pages/' + data.id; })
|
||||||
.catch(function(err) {
|
.catch(function(err) { self._toast('Failed to create page: ' + err.message, 'error'); });
|
||||||
if (window.appState && window.appState.toast) window.appState.toast('Failed to create page: ' + err.message, 'error');
|
|
||||||
else alert('Failed to create page: ' + err.message);
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/** Show the global New Folder modal. */
|
/** Show the global New Folder modal. */
|
||||||
@@ -529,11 +601,16 @@
|
|||||||
if (!name) return;
|
if (!name) return;
|
||||||
var modal = document.getElementById('fd-global-folder-modal');
|
var modal = document.getElementById('fd-global-folder-modal');
|
||||||
if (modal) modal.style.display = 'none';
|
if (modal) modal.style.display = 'none';
|
||||||
|
|
||||||
|
var ctx = this._getContext();
|
||||||
|
var body = { name: name, type: 'folder' };
|
||||||
|
if (ctx.wsId > 0 && ctx.isGitea) body.workspace_id = ctx.wsId;
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
fetch('/api/local-workspace/items', {
|
fetch('/api/local-workspace/items', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': this.getCsrfToken() },
|
headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': this.getCsrfToken() },
|
||||||
body: JSON.stringify({ name: name, type: 'folder' })
|
body: JSON.stringify(body)
|
||||||
})
|
})
|
||||||
.then(function(r) { if (!r.ok) throw new Error('Failed'); return r.json(); })
|
.then(function(r) { if (!r.ok) throw new Error('Failed'); return r.json(); })
|
||||||
.then(function() {
|
.then(function() {
|
||||||
@@ -543,11 +620,11 @@
|
|||||||
document.dispatchEvent(new CustomEvent('flowdeck:workspace-changed'));
|
document.dispatchEvent(new CustomEvent('flowdeck:workspace-changed'));
|
||||||
if (window._wsData && window._wsData._reloadAfterAction) window._wsData._reloadAfterAction();
|
if (window._wsData && window._wsData._reloadAfterAction) window._wsData._reloadAfterAction();
|
||||||
// Show toast
|
// Show toast
|
||||||
if (window.appState && window.appState.toast) window.appState.toast('Folder created', 'success');
|
self._toast('Folder created', 'success');
|
||||||
})
|
})
|
||||||
.catch(function(err) {
|
.catch(function(err) {
|
||||||
if (window.appState && window.appState.toast) window.appState.toast('Failed: ' + err.message, 'error');
|
self._toast('Failed: ' + err.message, 'error');
|
||||||
else alert('Failed to create folder: ' + err.message);
|
alert('Failed to create folder: ' + err.message);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
<span id="fd-local-ws-id" hidden>{{ workspace_id }}</span>
|
||||||
<div x-data="_wsInitData"
|
<div x-data="_wsInitData"
|
||||||
@dragover.prevent="onDragOver($event)"
|
@dragover.prevent="onDragOver($event)"
|
||||||
@dragleave="onDragLeave($event)"
|
@dragleave="onDragLeave($event)"
|
||||||
|
|||||||
Reference in New Issue
Block a user