feat: per-widget action menu (refresh, maximize, duplicate, remove) (#27) #37
Reference in New Issue
Block a user
Delete Branch "ai/issue-27-widget-action-menu"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #27
Was drin ist
GridStackItembekommt als dritten Geschwister-Knoten neben Griff und Close-Button ein Overflow-Menü (GridStackItem.Action:REFRESH,MAXIMIZE,DUPLICATE,REMOVE).DRAG_HANDLE_CLASS-Selektors, genau wie der Close-Button.MenuBarstatt eines handgebauten Popups: der Trigger ist ein echter Button, Öffnen/Navigieren/Auswählen kommt vom Web-Component.dialect-maximized; diegs-*-Attribute und der gridstack-Node bleiben unangetastet, das Zurücksetzen ist damit per Definition die alte Position. Nach dem Umschalten wird einresizegefeuert, damit die ApexCharts im Widget neu layouten.setActions(...)/setActionEnabled(...)): Default sindMAXIMIZE+REMOVE(kann das Item selbst), Registry-Widgets schalten zusätzlichREFRESH+DUPLICATEfrei, KPI-Kacheln nurREFRESH— eine zweite Kopie derselben Kennzahl wäre dieselbe Zahl doppelt.WidgetRegistryhängt den Feed des Widgets perComponentUtilan die Chart-Komponente,WidgetRegistry.refresh(component)löst genau diesen aus. Widgets ohne Refresher (statische Karte) werden still übergangen.gridstack.hint.Tests
./mvnw test— 55 Tests grün.DashboardViewTest: Menü-Angebot pro Widget-Typ, Remove, Maximize-Toggle inkl. unveränderter Grid-Position, Duplicate, Refresh.WidgetActionMenuPlaywrightTest(neu, e2e): Ziehen am Menü-Button bewegt das Widget nicht, Menü öffnet mit allen Einträgen, Maximieren/Wiederherstellen landet exakt im selben Slot.Anmerkungen
CLAUDE.md; das Issue war im Scope aber eindeutig beschrieben ("Scope: Medium"), daher umgesetzt statt geblockt.src/main/bundles/dev.bundle(generiertes Build-Artefakt, war schon vor der Bearbeitung dirty) ist bewusst nicht Teil des Commits.