fix: side peek des bases repasse en vanilla JS + largeur 1100px standard (v7.49.0)
FlowDeck CI / test (push) Failing after 3h13m58s
FlowDeck CI / lint (push) Successful in 2m12s
FlowDeck CI / docker (push) Skipped

- Panneau peek: les bindings Alpine (x-data absent du conteneur) rendaient
  loovverture et le redimensionnement inoperants -> cblage direct sur le document.
- Helper unique window.fdWirePeekResize (app.js): pointer capture, 300px-90vw,
  clic=fermer, largeur persiste fd_peek_width partagee entre les 4 peeks.
- database-table-container margin:0 (tableau colle a gauche, marge Library).
- .lib-container remonte dans app.css (trash etait pleine largeur), .db-index 1100px.
- ObsiGate verifie sans code: creation .xlsx OK (openpyxl, #186).
This commit is contained in:
2026-10-05 22:47:36 -04:00
parent 894004a1f5
commit 1d1cdbd618
63 changed files with 9473 additions and 393 deletions
+32 -36
View File
@@ -965,13 +965,33 @@ _renderIcon(item) {
newPage() { this.addNewPage(); },
// ── Side peek ──
async openPeek(item) {
// L'iframe est pilotée en JS : le build CSP d'Alpine n'évalue pas le
// binding `:src` (l'iframe restait vide et aucun document n'apparaissait).
// `about:blank` ferme explicitement le document précédent avant de charger
// le nouveau : sans cela, même URL = pas de rechargement et l'ancien
// document restait affiché.
openPeek(item) {
this.peekItem = item;
this.peekFavorited = item.favorited || false;
var frame = document.getElementById('lib-peek-iframe');
var loading = document.getElementById('lib-peek-loading');
if (!frame) return;
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;
},
closePeek() {
this.peekItem = null;
var frame = document.getElementById('lib-peek-iframe');
// On décharge l'éditeur : il resterait en mémoire (et son autosave
// tournerait) alors qu'il n'est plus visible.
if (frame) { frame.onload = null; frame.src = 'about:blank'; }
var loading = document.getElementById('lib-peek-loading');
if (loading) { loading.style.display = ''; loading.textContent = 'Chargement…'; }
},
async toggleFavoritePeek() {
@@ -1040,40 +1060,16 @@ _renderIcon(item) {
}
};
}
// Init peek resize handle
// Init peek resize handle — helper partagé fdWirePeekResize (app.js, defer :
// câblage différé jusqu'à sa disponibilité, ou immédiat si on est déjà prêt).
(function() {
var panel = document.querySelector('.peek-overlay');
var handle = document.getElementById('lib-peek-resize-handle');
if (!panel || !handle) return;
var startX, startWidth, dragging = false;
handle.addEventListener('pointerdown', function(e) {
e.preventDefault();
handle.setPointerCapture(e.pointerId);
startX = e.clientX;
startWidth = panel.offsetWidth;
dragging = true;
document.body.style.userSelect = 'none';
});
handle.addEventListener('pointermove', function(e) {
if (!dragging) return;
var deltaX = startX - e.clientX;
var newWidth = Math.max(300, Math.min(window.innerWidth * 0.9, startWidth + deltaX));
panel.style.width = newWidth + 'px';
});
handle.addEventListener('pointerup', function(e) {
if (!dragging) return;
document.body.style.userSelect = '';
var moved = Math.abs(e.clientX - startX);
if (moved < 3) {
var el = document.querySelector('.peek-overlay');
if (el && el.__x) { el.__x.$data.peekItem = null; }
}
dragging = false;
try { localStorage.setItem('fd_peek_width', panel.style.width); } catch { /* volontaire */ }
handle.releasePointerCapture(e.pointerId);
});
try {
var saved = localStorage.getItem('fd_peek_width');
if (saved) panel.style.width = saved;
} catch { /* volontaire */ }
function wire() {
var panel = document.querySelector('.peek-overlay');
if (!panel || !window.fdWirePeekResize) return;
window.fdWirePeekResize(panel, panel.querySelector('#lib-peek-resize-handle'), function() {
if (panel.__x) panel.__x.$data.peekItem = null;
});
}
if (window.fdWirePeekResize || document.readyState !== 'loading') wire();
else document.addEventListener('DOMContentLoaded', wire);
})();