From f84cbf794a039ba83daf51ab2f7ed82c97c04ac1 Mon Sep 17 00:00:00 2001 From: Lucas 'Paperboy' Rose-Winters Date: Sat, 25 Oct 2025 19:50:17 +1100 Subject: [PATCH] feat(dashboard): add lock button to prevent accidental widget movement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add lock/unlock button to dashboard header (always visible) - Lock state prevents dragging in both normal and edit modes - Lock state prevents resizing in edit mode - Icon changes: lock-open (unlocked) ↔ lock (locked) - Hide resize handles and prevent grab cursor when locked - Lock state persists across edit mode toggles - Integrate lock checks in DragDropHandler and ResizeHandler - Pass editManager reference to drag/resize handlers for lock state access --- src/systems/dashboard/dashboardIntegration.js | 11 +++ src/systems/dashboard/dashboardManager.js | 32 ++++--- src/systems/dashboard/dashboardTemplate.html | 5 + src/systems/dashboard/dragDrop.js | 17 +++- src/systems/dashboard/editModeManager.js | 93 +++++++++---------- src/systems/dashboard/resizeHandler.js | 9 ++ style.css | 11 +++ 7 files changed, 112 insertions(+), 66 deletions(-) diff --git a/src/systems/dashboard/dashboardIntegration.js b/src/systems/dashboard/dashboardIntegration.js index ace8a0a..4d592be 100644 --- a/src/systems/dashboard/dashboardIntegration.js +++ b/src/systems/dashboard/dashboardIntegration.js @@ -238,6 +238,17 @@ function setupDashboardEventListeners(dependencies) { }); } + // Lock/unlock widgets button + const lockWidgetsBtn = document.querySelector('#rpg-dashboard-lock-widgets'); + if (lockWidgetsBtn) { + lockWidgetsBtn.addEventListener('click', () => { + if (dashboardManager && dashboardManager.editManager) { + console.log('[RPG Companion] Lock button clicked'); + dashboardManager.editManager.toggleLock(); + } + }); + } + // Add widget button const addWidgetBtn = document.querySelector('#rpg-dashboard-add-widget'); if (addWidgetBtn) { diff --git a/src/systems/dashboard/dashboardManager.js b/src/systems/dashboard/dashboardManager.js index e3c8842..a915a36 100644 --- a/src/systems/dashboard/dashboardManager.js +++ b/src/systems/dashboard/dashboardManager.js @@ -156,21 +156,7 @@ export class DashboardManager { } }); - // Initialize Drag & Drop - this.dragHandler = new DragDropHandler(this.gridEngine, { - showGrid: true, - enableSnap: true - }); - - // Initialize Resize Handler - this.resizeHandler = new ResizeHandler(this.gridEngine, { - minWidth: 1, - minHeight: 2, - maxWidth: 4, // Max 4 columns (will be clamped to actual column count) - maxHeight: 10 - }); - - // Initialize Edit Mode Manager + // Initialize Edit Mode Manager first (needed by drag/resize handlers) this.editManager = new EditModeManager({ container: this.container, onSave: () => this.handleEditSave(), @@ -180,6 +166,22 @@ export class DashboardManager { onWidgetSettings: (widgetId) => this.openWidgetSettings(widgetId) }); + // Initialize Drag & Drop (with editManager reference) + this.dragHandler = new DragDropHandler(this.gridEngine, { + showGrid: true, + enableSnap: true, + editManager: this.editManager + }); + + // Initialize Resize Handler (with editManager reference) + this.resizeHandler = new ResizeHandler(this.gridEngine, { + minWidth: 1, + minHeight: 2, + maxWidth: 4, // Max 4 columns (will be clamped to actual column count) + maxHeight: 10, + editManager: this.editManager + }); + // Initialize Layout Persistence this.persistence = new LayoutPersistence({ debounceMs: this.config.debounceMs, diff --git a/src/systems/dashboard/dashboardTemplate.html b/src/systems/dashboard/dashboardTemplate.html index 08ea754..d8648cf 100644 --- a/src/systems/dashboard/dashboardTemplate.html +++ b/src/systems/dashboard/dashboardTemplate.html @@ -18,6 +18,11 @@ + + +