feat(dees-dashboardgrid): enhance widget placement validation and logging for drag-and-drop interactions

This commit is contained in:
2025-09-18 10:39:11 +00:00
parent 9b39196195
commit 792e77f824
3 changed files with 187 additions and 15 deletions

View File

@@ -413,20 +413,42 @@ export class DeesDashboardgrid extends DeesElement {
const layoutSource = this.widgets;
this.previewWidgets = null;
// Always validate the final position, don't rely on lastPlacement from drag
const target = this.placeholderPosition ?? dragState.start;
const placement =
dragState.lastPlacement ??
resolveWidgetPlacement(
layoutSource,
dragState.widgetId,
{ x: target.x, y: target.y },
this.columns,
dragState.previousPosition,
);
const placement = resolveWidgetPlacement(
layoutSource,
dragState.widgetId,
{ x: target.x, y: target.y },
this.columns,
dragState.previousPosition,
);
if (placement) {
this.commitPlacement(placement, dragState.widgetId, 'widget-move');
// Verify that the placement doesn't result in overlapping widgets
const finalWidget = placement.widgets.find(w => w.id === dragState.widgetId);
if (finalWidget) {
const hasOverlap = placement.widgets.some(w => {
if (w.id === dragState.widgetId) return false;
return (
finalWidget.x < w.x + w.w &&
finalWidget.x + finalWidget.w > w.x &&
finalWidget.y < w.y + w.h &&
finalWidget.y + finalWidget.h > w.y
);
});
if (!hasOverlap) {
this.commitPlacement(placement, dragState.widgetId, 'widget-move');
} else {
// Return to start position if overlap detected
this.widgets = this.widgets.map(widget =>
widget.id === dragState.widgetId ? { ...widget, x: dragState.start.x, y: dragState.start.y } : widget,
);
}
}
} else {
// Return to start position if no valid placement
this.widgets = this.widgets.map(widget =>
widget.id === dragState.widgetId ? { ...widget, x: dragState.start.x, y: dragState.start.y } : widget,
);