fix: drag-drop utilise text/plain uniquement + logs console
CI / lint (push) Failing after 9s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 16s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
CI / lint (push) Failing after 9s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 16s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
- dragstart: setData 'text/plain' (universel, pas de custom MIME)
- drop container + tab: getData('text/plain')
- console.log dans le drop handler pour diagnostic
- Suppression application/obsigate-tab (non fiable cross-browser)
This commit is contained in:
+43
-33
@@ -371,8 +371,8 @@ function createPaneTabManager(paneId) {
|
||||
const payload = JSON.stringify({
|
||||
paneId: this.paneId, tabId: tab.id, index: idx
|
||||
});
|
||||
e.dataTransfer.setData('application/obsigate-tab', payload);
|
||||
e.dataTransfer.setData('text/plain', payload); // fallback for browser compat
|
||||
// text/plain is universally supported across all browsers for drag-drop
|
||||
e.dataTransfer.setData('text/plain', payload);
|
||||
e.dataTransfer.effectAllowed = 'move';
|
||||
el.classList.add('dragging');
|
||||
});
|
||||
@@ -395,9 +395,9 @@ function createPaneTabManager(paneId) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation(); // Prevent container handler from double-firing
|
||||
document.querySelectorAll('.tab-drop-indicator').forEach(d => d.remove());
|
||||
const raw = e.dataTransfer.getData('text/plain');
|
||||
if (!raw) return;
|
||||
try {
|
||||
const raw = e.dataTransfer.getData('application/obsigate-tab');
|
||||
if (!raw) return;
|
||||
const dragData = JSON.parse(raw);
|
||||
// Same pane — reorder
|
||||
if (dragData.paneId === this.paneId) {
|
||||
@@ -796,39 +796,49 @@ const PaneManager = {
|
||||
const tabBar = container.querySelector('.tab-bar');
|
||||
if (tabBar) tabBar.classList.remove('drop-target');
|
||||
|
||||
// Try both data formats
|
||||
let raw = e.dataTransfer.getData('application/obsigate-tab');
|
||||
if (!raw) raw = e.dataTransfer.getData('text/plain');
|
||||
// Get drag data (text/plain is universally supported)
|
||||
const raw = e.dataTransfer.getData('text/plain');
|
||||
console.log('[PaneManager] drop fired, raw data:', raw ? raw.substring(0, 80) : 'null');
|
||||
|
||||
if (!raw) return;
|
||||
let dragData;
|
||||
try { dragData = JSON.parse(raw); } catch (e2) { console.log('[PaneManager] JSON parse error:', e2); return; }
|
||||
if (dragData.paneId == null || dragData.tabId == null) { console.log('[PaneManager] missing paneId/tabId'); return; }
|
||||
|
||||
try {
|
||||
const dragData = JSON.parse(raw);
|
||||
if (dragData.paneId == null || dragData.tabId == null) return;
|
||||
// Recalculate edge zone from drop coordinates
|
||||
const rect = container.getBoundingClientRect();
|
||||
const relX = e.clientX - rect.left;
|
||||
const relY = e.clientY - rect.top;
|
||||
const isSingle = !this.isSplit();
|
||||
|
||||
// Recalculate edge zone from drop coordinates
|
||||
const rect = container.getBoundingClientRect();
|
||||
const relX = e.clientX - rect.left;
|
||||
const relY = e.clientY - rect.top;
|
||||
const isSingle = !this.isSplit();
|
||||
console.log('[PaneManager] drop at', relX.toFixed(0), relY.toFixed(0),
|
||||
'rect', rect.width.toFixed(0), 'x', rect.height.toFixed(0),
|
||||
'isSingle', isSingle, 'paneId', paneId, 'srcPane', dragData.paneId);
|
||||
|
||||
if (isSingle && relX > rect.width * 0.72) {
|
||||
this.splitRight();
|
||||
setTimeout(() => {
|
||||
const newPaneId = this.panes.length - 1;
|
||||
this.transferTab(dragData.paneId, dragData.tabId, newPaneId);
|
||||
}, 200);
|
||||
} else if (isSingle && relY > rect.height * 0.72) {
|
||||
this.splitDown();
|
||||
setTimeout(() => {
|
||||
const newPaneId = this.panes.length - 1;
|
||||
this.transferTab(dragData.paneId, dragData.tabId, newPaneId);
|
||||
}, 200);
|
||||
} else if (dragData.paneId !== paneId) {
|
||||
// Cross-pane transfer (already in split mode, different panes)
|
||||
this.transferTab(dragData.paneId, dragData.tabId, paneId);
|
||||
}
|
||||
// else: same pane, not edge — tab handler deals with reorder
|
||||
} catch (e2) { console.debug('PaneManager drop error:', e2); }
|
||||
if (isSingle && relX > rect.width * 0.72) {
|
||||
console.log('[PaneManager] → splitRight');
|
||||
this.splitRight();
|
||||
// Transfer after DOM settles
|
||||
const transfer = () => {
|
||||
const newPaneId = this.panes.length - 1;
|
||||
console.log('[PaneManager] transferring tab', dragData.tabId, 'to pane', newPaneId);
|
||||
this.transferTab(dragData.paneId, dragData.tabId, newPaneId);
|
||||
};
|
||||
setTimeout(transfer, 200);
|
||||
} else if (isSingle && relY > rect.height * 0.72) {
|
||||
console.log('[PaneManager] → splitDown');
|
||||
this.splitDown();
|
||||
const transfer = () => {
|
||||
const newPaneId = this.panes.length - 1;
|
||||
this.transferTab(dragData.paneId, dragData.tabId, newPaneId);
|
||||
};
|
||||
setTimeout(transfer, 200);
|
||||
} else if (dragData.paneId !== paneId) {
|
||||
console.log('[PaneManager] → cross-pane transfer', dragData.paneId, '→', paneId);
|
||||
this.transferTab(dragData.paneId, dragData.tabId, paneId);
|
||||
} else {
|
||||
console.log('[PaneManager] → same pane, no edge — letting tab handler deal');
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user