fix: side peek = document seul en edition + bouton Open calendrier/Kanban (v7.50.0)
- Les 4 peeks (library.js, local_workspace.js, my_tasks.js, database_table.js)
chargent /pages/{id}?embed=1 : le panneau ne montre plus que le document en
mode edition, sans sidebar ni barre (regression v7.49.0). Le cadre du
panneau (close/full/resize partages fdWirePeekResize) est inchange.
- Calendrier My Tasks : le handler testait e.target.dataset.openRow mais les
boutons .mt-cal-open ne contiennent que leur <svg> -> clic sur l'icone =
e.target = <svg>, rien ne partait. cause racine corrigee par
t.closest('[data-open-row]') : un seul chemin tableau/calendrier/Kanban.
- Kanban My Tasks : meme bouton Open ajoute sur les tuiles (openButton(t),
overlay absolu revele au survol de la carte .mt-card).
- Menu contextuel global « Open in side peek » : etait un toast d'erreur ;
route maintenant vers le peek de la page courante (_libData.openPeekById /
_wsData.openSidePeek), repli nouvel onglet ailleurs.
- /pages/{id}?embed=1 sur une page de base (content_format=collection)
rendait un editeur de blocs vide : le template collection est garde en
embed (body.embed-mode retire sidebar+barre, le tableau reste). Bouton
pleine page des peeks de bases : navigue via dataset.page (URL propre)
au lieu du src ?embed=1.
- Tests : garde de coherence inversee (?embed=1 exige sur les 4 fichiers),
+3 nouveaux (closest, tuiles Kanban, collection embed). Fix d'un test
pre-existant casse (assertion panel.style.display, reecriture vanilla JS
v7.49.0). Suite 1264 passed / 0 failed (-n auto) + ruff 0.
- Bump VERSION/main.py 7.50.0, CHANGELOG, WORKLOAD, OpenAPI regenere.
This commit is contained in:
@@ -207,6 +207,14 @@
|
||||
}
|
||||
.mt-card:active { cursor: grabbing; opacity: .7; }
|
||||
.mt-card-title { font-weight: 500; }
|
||||
/* Bouton « Open » en overlay au survol de la tuile (la carte est une
|
||||
colonne flex : une place en flux déformerait la tuile). */
|
||||
.mt-card { position: relative; }
|
||||
.mt-card .mt-open-btn {
|
||||
position: absolute; top: 6px; right: 6px; margin-left: 0;
|
||||
}
|
||||
.mt-card:hover .mt-hover-only,
|
||||
.mt-card:focus-within .mt-hover-only { opacity: 1; }
|
||||
.mt-card-due,
|
||||
.mt-card-src { font-size: 11px; color: var(--text-dim, #999); }
|
||||
.mt-card-src { opacity: .8; }
|
||||
|
||||
@@ -1311,7 +1311,9 @@ const DB_CONFIG=(()=>{try{const el=document.getElementById('db-config');const v=
|
||||
if (!peekEl.classList.contains('open')) return;
|
||||
if (peekTitle) peekTitle.textContent = '';
|
||||
if (peekLoading) peekLoading.style.display = 'none';
|
||||
if (iframe) iframe.src = '/pages/'+pid;
|
||||
// `?embed=1` : uniquement le document edite, pas l'habillage
|
||||
// (sidebar + barre) — la pleine page reste via le bouton « full ».
|
||||
if (iframe) { iframe.dataset.page = pid; iframe.src = '/pages/'+pid+'?embed=1'; }
|
||||
})
|
||||
.catch(function(){
|
||||
// L'échec est rendu DANS le panneau (srcdoc) : sous le build
|
||||
@@ -1327,8 +1329,10 @@ const DB_CONFIG=(()=>{try{const el=document.getElementById('db-config');const v=
|
||||
if (pc) pc.addEventListener('click', closeDbPeek);
|
||||
var pf = document.getElementById('db-side-peek-full');
|
||||
if (pf) pf.addEventListener('click', function() {
|
||||
if (peekFrame && peekFrame.src && peekFrame.src !== 'about:blank') {
|
||||
window.location.href = peekFrame.src;
|
||||
// `dataset.page` et non `iframe.src` : le src porte `?embed=1`,
|
||||
// la pleine page doit garder sa sidebar et sa barre.
|
||||
if (peekFrame && peekFrame.dataset.page) {
|
||||
window.location.href = '/pages/' + peekFrame.dataset.page;
|
||||
}
|
||||
});
|
||||
document.addEventListener('keydown', function(e) {
|
||||
|
||||
@@ -979,9 +979,9 @@ _renderIcon(item) {
|
||||
if (loading) loading.style.display = '';
|
||||
frame.onload = function () { if (loading) loading.style.display = 'none'; };
|
||||
frame.src = 'about:blank';
|
||||
// `/pages/{id}` sans `?embed=1` : le peek affiche le MÊME éditeur que la
|
||||
// page pleine (sidebar, barre, actions compris), pas une variante.
|
||||
frame.src = '/pages/' + item.id;
|
||||
// `?embed=1` : le peek affiche SEULEMENT le document en mode édition
|
||||
// (ni sidebar ni barre de navigation) — le cadre du panneau suffit.
|
||||
frame.src = '/pages/' + item.id + '?embed=1';
|
||||
},
|
||||
|
||||
closePeek() {
|
||||
|
||||
@@ -395,12 +395,12 @@ const _wsInitData = (function() { // lexical : NON propriété globalThis →
|
||||
window.showToast('Failed to copy', 'error');
|
||||
});
|
||||
};
|
||||
// Load the full-screen editor in the iframe (no `?embed=1`: the peek
|
||||
// shows the same editor as the page itself). `about:blank` first, so
|
||||
// opening another document really reloads the frame instead of keeping
|
||||
// the previous one when the URL happens to be identical.
|
||||
// Load ONLY the editable document in the iframe (`?embed=1`: no
|
||||
// sidebar, no navbar). `about:blank` first, so opening another
|
||||
// document really reloads the frame instead of keeping the previous
|
||||
// one when the URL happens to be identical.
|
||||
var iframe = document.getElementById('ws-preview-iframe');
|
||||
if (iframe) { iframe.src = 'about:blank'; iframe.src = '/pages/' + node.id; }
|
||||
if (iframe) { iframe.src = 'about:blank'; iframe.src = '/pages/' + node.id + '?embed=1'; }
|
||||
// Show panel
|
||||
panel.style.display = 'flex';
|
||||
requestAnimationFrame(function() {
|
||||
|
||||
+12
-6
@@ -152,9 +152,10 @@ function flowDeckMyTasks() {
|
||||
f.style.display = '';
|
||||
// `about:blank` d'abord : ouvrir une autre tâche doit REcharger
|
||||
// l'éditeur, sinon l'URL identique laisse le document précédent
|
||||
// affiché. `/pages/{id}` sans `?embed=1` = l'éditeur plein écran.
|
||||
// affiché. `?embed=1` = le document en édition seule, sans
|
||||
// sidebar ni barre de navigation (le cadre du panneau suffit).
|
||||
f.src = 'about:blank';
|
||||
f.src = '/pages/' + pid;
|
||||
f.src = '/pages/' + pid + '?embed=1';
|
||||
}).catch(function (e) {
|
||||
if (loading) {
|
||||
loading.textContent = 'Impossible d’ouvrir le contenu : ' + e.message;
|
||||
@@ -389,6 +390,7 @@ function flowDeckMyTasks() {
|
||||
h += '<div class="mt-card" draggable="true" data-id="' + t.id + '">' +
|
||||
'<span class="mt-icon">' + esc(rowIcon(t.icon)) + '</span>' +
|
||||
'<span class="mt-card-title">' + esc(t.title) + '</span>' +
|
||||
openButton(t) +
|
||||
(t.due ? '<span class="mt-card-due mt-due-' + esc(t.due_state) + '">📅 ' +
|
||||
esc(t.due) + '</span>' : '') +
|
||||
'<span class="mt-card-src">' + esc(t.collection_icon) + ' ' +
|
||||
@@ -878,17 +880,21 @@ function flowDeckMyTasks() {
|
||||
var t = e.target;
|
||||
|
||||
if (t.id === 'mt-new-btn') { openNewModal(); return; }
|
||||
if (t.dataset && t.dataset.openRow) {
|
||||
var opener = t.closest ? t.closest('[data-open-row]') : null;
|
||||
if (opener) {
|
||||
// `closest` : dans le calendrier le bouton ne contient que son
|
||||
// SVG — un clic sur l'icone donnait `e.target` = <svg> sans
|
||||
// dataset, et le bouton ne faisait rien.
|
||||
e.preventDefault();
|
||||
// Le titre vient de l'attribut : il est disponible aussi bien dans
|
||||
// le tableau que dans le calendrier ou la vue Jour.
|
||||
var label = t.dataset.openTitle;
|
||||
var label = opener.dataset.openTitle;
|
||||
if (!label) {
|
||||
var row = t.closest('.mt-row');
|
||||
var row = opener.closest('.mt-row');
|
||||
var cell = row && row.querySelector('.mt-title-text');
|
||||
label = cell ? cell.textContent : '';
|
||||
}
|
||||
openRowContent(Number(t.dataset.openRow), label);
|
||||
openRowContent(Number(opener.dataset.openRow), label);
|
||||
return;
|
||||
}
|
||||
if (t.dataset && t.dataset.fixSource) {
|
||||
|
||||
Reference in New Issue
Block a user