@dragonworks/ngx-dashboard 20.1.2 → 20.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -45
- package/fesm2022/dragonworks-ngx-dashboard.mjs +1 -1
- package/fesm2022/dragonworks-ngx-dashboard.mjs.map +1 -1
- package/index.d.ts +34 -368
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dragonworks-ngx-dashboard.mjs","sources":["../../../projects/ngx-dashboard/src/lib/models/cell-id.ts","../../../projects/ngx-dashboard/src/lib/models/widget-id.ts","../../../projects/ngx-dashboard/src/lib/models/dashboard-data.utils.ts","../../../projects/ngx-dashboard/src/lib/models/reserved-space.ts","../../../projects/ngx-dashboard/src/lib/models/widget-factory.ts","../../../projects/ngx-dashboard/src/lib/internal-widgets/unknown-widget/unknown-widget.component.ts","../../../projects/ngx-dashboard/src/lib/services/dashboard.service.ts","../../../projects/ngx-dashboard/src/lib/store/features/utils/grid-query-internal.utils.ts","../../../projects/ngx-dashboard/src/lib/store/features/utils/collision.utils.ts","../../../projects/ngx-dashboard/src/lib/store/features/grid-config.feature.ts","../../../projects/ngx-dashboard/src/lib/store/features/widget-management.feature.ts","../../../projects/ngx-dashboard/src/lib/store/features/drag-drop.feature.ts","../../../projects/ngx-dashboard/src/lib/store/features/utils/resize.utils.ts","../../../projects/ngx-dashboard/src/lib/store/features/resize.feature.ts","../../../projects/ngx-dashboard/src/lib/store/dashboard-store.ts","../../../projects/ngx-dashboard/src/lib/providers/cell-settings-dialog/cell-settings-dialog.provider.ts","../../../projects/ngx-dashboard/src/lib/providers/cell-settings-dialog/cell-settings-dialog.component.ts","../../../projects/ngx-dashboard/src/lib/providers/cell-settings-dialog/default-cell-settings-dialog.provider.ts","../../../projects/ngx-dashboard/src/lib/providers/cell-settings-dialog/cell-settings-dialog.tokens.ts","../../../projects/ngx-dashboard/src/lib/cell/cell-context-menu.service.ts","../../../projects/ngx-dashboard/src/lib/cell/cell.component.ts","../../../projects/ngx-dashboard/src/lib/cell/cell.component.html","../../../projects/ngx-dashboard/src/lib/dashboard-viewer/dashboard-viewer.component.ts","../../../projects/ngx-dashboard/src/lib/dashboard-viewer/dashboard-viewer.component.html","../../../projects/ngx-dashboard/src/lib/cell/cell-context-menu.component.ts","../../../projects/ngx-dashboard/src/lib/drop-zone/drop-zone.component.ts","../../../projects/ngx-dashboard/src/lib/drop-zone/drop-zone.component.html","../../../projects/ngx-dashboard/src/lib/dashboard-editor/dashboard-editor.component.ts","../../../projects/ngx-dashboard/src/lib/dashboard-editor/dashboard-editor.component.html","../../../projects/ngx-dashboard/src/lib/services/dashboard-bridge.service.ts","../../../projects/ngx-dashboard/src/lib/services/dashboard-viewport.service.ts","../../../projects/ngx-dashboard/src/lib/dashboard/dashboard.component.ts","../../../projects/ngx-dashboard/src/lib/dashboard/dashboard.component.html","../../../projects/ngx-dashboard/src/lib/widget-list/widget-list.component.ts","../../../projects/ngx-dashboard/src/lib/widget-list/widget-list.component.html","../../../projects/ngx-dashboard/src/public-api.ts","../../../projects/ngx-dashboard/src/dragonworks-ngx-dashboard.ts"],"sourcesContent":["/**\n * Branded type for cell identifiers to ensure type safety when working with grid coordinates.\n * This prevents accidentally mixing up row/column numbers with cell IDs.\n */\nexport type CellId = number & { __brand: 'CellId' };\n\n/**\n * Maximum number of columns supported by the grid.\n * This determines the encoding scheme for cell coordinates.\n */\nconst MAX_COLUMNS = 1024;\n\n/**\n * Utility functions for working with CellId branded type.\n */\nexport const CellIdUtils = {\n /**\n * Creates a CellId from row and column coordinates.\n * @param row - The row number (1-based)\n * @param col - The column number (1-based)\n * @returns A branded CellId that encodes both coordinates\n * @throws Error if row or col is less than 1, or if col exceeds MAX_COLUMNS\n */\n create(row: number, col: number): CellId {\n if (row < 1 || col < 1) {\n throw new Error(\n `Invalid cell coordinates: row=${row}, col=${col}. Both must be >= 1`,\n );\n }\n if (col >= MAX_COLUMNS) {\n throw new Error(`Column ${col} exceeds maximum of ${MAX_COLUMNS - 1}`);\n }\n return (row * MAX_COLUMNS + col) as CellId;\n },\n\n /**\n * Decodes a CellId back into row and column coordinates.\n * @param cellId - The CellId to decode\n * @returns A tuple of [row, col] coordinates (1-based)\n */\n decode(cellId: CellId): [number, number] {\n const id = cellId as number;\n const row = Math.floor(id / MAX_COLUMNS);\n const col = id % MAX_COLUMNS;\n return [row, col];\n },\n\n /**\n * Gets the row coordinate from a CellId.\n * @param cellId - The CellId to extract row from\n * @returns The row number (1-based)\n */\n getRow(cellId: CellId): number {\n return Math.floor((cellId as number) / MAX_COLUMNS);\n },\n\n /**\n * Gets the column coordinate from a CellId.\n * @param cellId - The CellId to extract column from\n * @returns The column number (1-based)\n */\n getCol(cellId: CellId): number {\n return (cellId as number) % MAX_COLUMNS;\n },\n\n /**\n * Creates a string representation of a CellId for debugging/display purposes.\n * @param cellId - The CellId to convert to string\n * @returns A string in the format \"row-col\"\n */\n toString(cellId: CellId): string {\n const [row, col] = this.decode(cellId);\n return `${row}-${col}`;\n },\n\n /**\n * Checks if two CellIds are equal.\n * @param a - First CellId\n * @param b - Second CellId\n * @returns True if the CellIds represent the same cell\n */\n equals(a: CellId, b: CellId): boolean {\n return a === b;\n },\n};\n","/**\r\n * Branded type for widget identifiers to ensure type safety when working with widget instances.\r\n * This prevents accidentally mixing up widget IDs with other string values.\r\n */\r\nexport type WidgetId = string & { __brand: 'WidgetId' };\r\n\r\n/**\r\n * Utility functions for working with WidgetId branded type.\r\n * WidgetIds are UUIDs that uniquely identify widget instances throughout their lifecycle,\r\n * independent of their position on the dashboard grid.\r\n */\r\nexport const WidgetIdUtils = {\r\n /**\r\n * Generates a new unique WidgetId.\r\n * Uses crypto.randomUUID() when available, falls back to timestamp-based ID for older browsers.\r\n * @returns A new unique WidgetId\r\n */\r\n generate(): WidgetId {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID() as WidgetId;\r\n }\r\n // Fallback for older browsers\r\n return `widget-${Date.now()}-${Math.random().toString(36).substr(2, 9)}` as WidgetId;\r\n },\r\n\r\n /**\r\n * Validates if a string is a valid WidgetId format.\r\n * @param id - The string to validate\r\n * @returns True if the string is a valid WidgetId format\r\n */\r\n validate(id: string): id is WidgetId {\r\n // UUID v4 format or fallback format\r\n return (\r\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(id) ||\r\n /^widget-\\d+-[a-z0-9]{9}$/i.test(id)\r\n );\r\n },\r\n\r\n /**\r\n * Converts a WidgetId to a string for use as map keys or serialization.\r\n * @param id - The WidgetId to convert\r\n * @returns The string representation of the WidgetId\r\n */\r\n toString(id: WidgetId): string {\r\n return id;\r\n },\r\n\r\n /**\r\n * Creates a WidgetId from a string, validating the format.\r\n * @param str - The string to convert to WidgetId\r\n * @returns A WidgetId\r\n * @throws Error if the string is not a valid WidgetId format\r\n */\r\n fromString(str: string): WidgetId {\r\n if (!this.validate(str)) {\r\n throw new Error(`Invalid WidgetId format: ${str}`);\r\n }\r\n return str as WidgetId;\r\n },\r\n\r\n /**\r\n * Checks if two WidgetIds are equal.\r\n * @param a - First WidgetId\r\n * @param b - Second WidgetId\r\n * @returns True if the WidgetIds are the same\r\n */\r\n equals(a: WidgetId, b: WidgetId): boolean {\r\n return a === b;\r\n },\r\n};","import { DashboardDataDto } from './dashboard-data.dto';\r\n\r\n/**\r\n * Creates an empty dashboard configuration with the specified dimensions.\r\n * This is a convenience function for creating a basic dashboard without any cells.\r\n *\r\n * @param dashboardId - Unique identifier for the dashboard (managed by client)\r\n * @param rows - Number of rows in the dashboard grid\r\n * @param columns - Number of columns in the dashboard grid\r\n * @param gutterSize - CSS size for the gutter between cells (default: '0.5em')\r\n * @returns A DashboardDataDto configured with the specified dimensions and no cells\r\n *\r\n * @example\r\n * // Create an 8x16 dashboard with default gutter\r\n * const dashboard = createEmptyDashboard('my-dashboard-1', 8, 16);\r\n *\r\n * @example\r\n * // Create a 5x10 dashboard with custom gutter\r\n * const dashboard = createEmptyDashboard('my-dashboard-2', 5, 10, '0.5rem');\r\n */\r\nexport function createEmptyDashboard(\r\n dashboardId: string,\r\n rows: number,\r\n columns: number,\r\n gutterSize = '0.5em'\r\n): DashboardDataDto {\r\n return {\r\n version: '1.0.0',\r\n dashboardId,\r\n rows,\r\n columns,\r\n gutterSize,\r\n cells: [],\r\n };\r\n}\r\n\r\n/**\r\n * Creates a default dashboard configuration with standard dimensions.\r\n * This provides a reasonable starting point for most use cases.\r\n *\r\n * @param dashboardId - Unique identifier for the dashboard (managed by client)\r\n * @returns A DashboardDataDto with 8 rows, 16 columns, and 0.5em gutter\r\n *\r\n * @example\r\n * const dashboard = createDefaultDashboard('my-dashboard-id');\r\n */\r\nexport function createDefaultDashboard(dashboardId: string): DashboardDataDto {\r\n return createEmptyDashboard(dashboardId, 8, 16, '0.5em');\r\n}\r\n","/**\r\n * Defines space that should be reserved around the dashboard component\r\n * when calculating viewport constraints.\r\n */\r\nexport interface ReservedSpace {\r\n /** Space reserved at the top (e.g., toolbar height) */\r\n top: number;\r\n /** Space reserved on the right (e.g., padding, widget list) */\r\n right: number;\r\n /** Space reserved at the bottom (e.g., padding) */\r\n bottom: number;\r\n /** Space reserved on the left (e.g., padding) */\r\n left: number;\r\n}\r\n\r\n/**\r\n * Default reserved space when none is specified\r\n */\r\nexport const DEFAULT_RESERVED_SPACE: ReservedSpace = {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0\r\n};","// widget-factory.ts\r\nimport { ComponentRef, ViewContainerRef } from '@angular/core';\r\nimport {\r\n Widget,\r\n WidgetComponentClass,\r\n} from './widget';\r\n\r\nexport interface WidgetFactory<\r\n T extends Widget = Widget\r\n> {\r\n widgetTypeid: string; // application wide unique ID\r\n name: string;\r\n description: string;\r\n svgIcon: string; // SVG markup as string\r\n createInstance(container: ViewContainerRef, state?: unknown): ComponentRef<T>;\r\n}\r\n\r\nexport function createFactoryFromComponent<T extends Widget>(\r\n component: WidgetComponentClass<T>\r\n): WidgetFactory {\r\n return {\r\n ...component.metadata,\r\n\r\n createInstance(\r\n container: ViewContainerRef,\r\n state?: unknown\r\n ): ComponentRef<T> {\r\n const ref = container.createComponent(component);\r\n ref.instance.dashboardSetState?.(state);\r\n return ref;\r\n },\r\n };\r\n}\r\n","import {\n Component,\n ChangeDetectionStrategy,\n signal,\n computed,\n} from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Widget, WidgetMetadata } from '../../models';\n\nexport interface UnknownWidgetState {\n originalWidgetTypeid: string;\n}\n\n@Component({\n selector: 'lib-unknown-widget',\n imports: [MatIconModule, MatTooltipModule],\n template: `\n <div class=\"unknown-widget-container\" [matTooltip]=\"tooltipText()\">\n <mat-icon class=\"unknown-widget-icon\">error_outline</mat-icon>\n </div>\n `,\n styles: [\n `\n .unknown-widget-container {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background-color: var(--mat-sys-error);\n border-radius: 8px;\n container-type: size;\n }\n\n .unknown-widget-icon {\n color: var(--mat-sys-on-error);\n font-size: clamp(12px, 75cqmin, 68px);\n width: clamp(12px, 75cqmin, 68px);\n height: clamp(12px, 75cqmin, 68px);\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UnknownWidgetComponent implements Widget {\n static metadata: WidgetMetadata = {\n widgetTypeid: '__internal/unknown-widget',\n name: 'Unknown Widget',\n description: 'Fallback widget for unknown widget types',\n svgIcon:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"currentColor\"><path d=\"M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm-40-160h80v-240h-80v240Zm40 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Z\"/></svg>',\n };\n\n readonly state = signal<UnknownWidgetState>({\n originalWidgetTypeid: 'unknown',\n });\n\n readonly tooltipText = computed(() => `${this.state().originalWidgetTypeid}`);\n\n dashboardSetState(state?: unknown): void {\n if (state && typeof state === 'object' && 'originalWidgetTypeid' in state) {\n this.state.set(state as UnknownWidgetState);\n }\n }\n\n dashboardGetState(): UnknownWidgetState {\n return this.state();\n }\n\n // No edit dialog for error widgets - method intentionally not implemented\n}\n","// dashboard.service.ts\r\nimport { Injectable, signal } from '@angular/core';\r\nimport {\r\n createFactoryFromComponent,\r\n WidgetComponentClass,\r\n WidgetFactory,\r\n} from '../models';\r\nimport { UnknownWidgetComponent } from '../internal-widgets/unknown-widget/unknown-widget.component';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DashboardService {\r\n readonly #widgetTypes = signal<WidgetComponentClass[]>([]);\r\n readonly #widgetFactoryMap = new Map<string, WidgetFactory>();\r\n readonly #unknownWidgetFactory = createFactoryFromComponent(UnknownWidgetComponent);\r\n readonly widgetTypes = this.#widgetTypes.asReadonly(); // make the widget list available as a readonly signal\r\n\r\n registerWidgetType(widget: WidgetComponentClass) {\r\n if (\r\n this.#widgetTypes().some(\r\n (w) => w.metadata.widgetTypeid === widget.metadata.widgetTypeid\r\n )\r\n ) {\r\n throw new Error(\r\n `Widget type '${widget.metadata.widgetTypeid}' is already registered`\r\n );\r\n }\r\n\r\n this.#widgetFactoryMap.set(\r\n widget.metadata.widgetTypeid,\r\n createFactoryFromComponent(widget)\r\n );\r\n\r\n this.#widgetTypes.set([...this.#widgetTypes(), widget]);\r\n }\r\n\r\n getFactory(widgetTypeid: string): WidgetFactory {\r\n const factory = this.#widgetFactoryMap.get(widgetTypeid);\r\n\r\n if (factory) {\r\n return factory;\r\n }\r\n\r\n // Return fallback factory for unknown widget types\r\n console.warn(\r\n `Unknown widget type: ${widgetTypeid}, using fallback error widget`\r\n );\r\n \r\n // Create a custom factory that preserves the original widget type ID in state\r\n return {\r\n ...this.#unknownWidgetFactory,\r\n createInstance: (container, state) => {\r\n const ref = this.#unknownWidgetFactory.createInstance(container, {\r\n originalWidgetTypeid: widgetTypeid,\r\n ...(state && typeof state === 'object' ? state as Record<string, unknown> : {}),\r\n });\r\n return ref;\r\n },\r\n };\r\n }\r\n}\r\n","import { CellData, WidgetId } from '../../../models';\n\n// Internal utility functions used by collision detection, resize logic, and tests\nexport const GridQueryInternalUtils = {\n isCellOccupied(cells: CellData[], row: number, col: number, excludeWidgetId?: WidgetId): boolean {\n return cells.some((cell) => {\n // Skip checking against the widget being dragged (use widgetId for stable identity)\n if (excludeWidgetId && cell.widgetId === excludeWidgetId)\n return false;\n\n const endRow = cell.row + cell.rowSpan - 1;\n const endCol = cell.col + cell.colSpan - 1;\n\n return (\n cell.row <= row && row <= endRow && cell.col <= col && col <= endCol\n );\n });\n },\n\n isOutOfBounds(\n targetRow: number,\n targetCol: number,\n spanRow: number,\n spanCol: number,\n maxRows: number,\n maxColumns: number,\n ): boolean {\n const rowLimit = targetRow + spanRow - 1;\n const colLimit = targetCol + spanCol - 1;\n\n return rowLimit > maxRows || colLimit > maxColumns;\n },\n\n getCellAt(cells: CellData[], row: number, col: number): CellData | null {\n return cells.find((cell) => cell.row === row && cell.col === col) ?? null;\n },\n};","import { CellId, CellIdUtils, CellData, DragData } from '../../../models';\nimport { GridQueryInternalUtils } from './grid-query-internal.utils';\n\nexport interface CollisionInfo {\n hasCollisions: boolean;\n invalidCells: CellId[];\n outOfBounds: boolean;\n footprint: { row: number; col: number }[];\n}\n\nexport function calculateCollisionInfo(\n dragData: DragData | null,\n hovered: { row: number; col: number } | null,\n cells: CellData[],\n rows: number,\n columns: number,\n): CollisionInfo {\n if (!dragData || !hovered) {\n return {\n hasCollisions: false,\n invalidCells: [],\n outOfBounds: false,\n footprint: [],\n };\n }\n\n const isCell = dragData.kind === 'cell';\n const rowSpan = isCell ? dragData.content.rowSpan : 1;\n const colSpan = isCell ? dragData.content.colSpan : 1;\n\n // Check bounds\n const outOfBounds = GridQueryInternalUtils.isOutOfBounds(\n hovered.row,\n hovered.col,\n rowSpan,\n colSpan,\n rows,\n columns\n );\n\n // Generate footprint\n const footprint: { row: number; col: number }[] = [];\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n footprint.push({ row: hovered.row + r, col: hovered.col + c });\n }\n }\n\n const excludeWidgetId = isCell ? dragData.content.widgetId : undefined;\n\n // Check for actual collisions with other widgets (not self)\n const hasCollisions = footprint.some((pos) =>\n GridQueryInternalUtils.isCellOccupied(cells, pos.row, pos.col, excludeWidgetId)\n );\n\n // Generate invalid cell IDs\n const invalidCells: CellId[] = [];\n if (hasCollisions || outOfBounds) {\n for (const pos of footprint) {\n invalidCells.push(CellIdUtils.create(pos.row, pos.col));\n }\n }\n\n return {\n hasCollisions,\n invalidCells,\n outOfBounds,\n footprint,\n };\n}\n\nexport function calculateHighlightedZones(\n dragData: DragData | null,\n hovered: { row: number; col: number } | null,\n): { row: number; col: number }[] {\n if (!dragData || !hovered) return [];\n\n const zones: { row: number; col: number }[] = [];\n const rowSpan = dragData.kind === 'cell' ? dragData.content.rowSpan : 1;\n const colSpan = dragData.kind === 'cell' ? dragData.content.colSpan : 1;\n\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n zones.push({ row: hovered.row + r, col: hovered.col + c });\n }\n }\n\n return zones;\n}","import { signalStoreFeature, withMethods, withState, patchState } from '@ngrx/signals';\n\nexport interface GridConfigState {\n rows: number;\n columns: number;\n gutterSize: string;\n isEditMode: boolean;\n gridCellDimensions: { width: number; height: number };\n}\n\nconst initialGridConfigState: GridConfigState = {\n rows: 8,\n columns: 16,\n gutterSize: '0.5em',\n isEditMode: false,\n gridCellDimensions: { width: 0, height: 0 },\n};\n\nexport const withGridConfig = () =>\n signalStoreFeature(\n withState<GridConfigState>(initialGridConfigState),\n withMethods((store) => ({\n setGridConfig(config: {\n rows?: number;\n columns?: number;\n gutterSize?: string;\n }) {\n patchState(store, config);\n },\n\n setGridCellDimensions(width: number, height: number) {\n patchState(store, { gridCellDimensions: { width, height } });\n },\n\n toggleEditMode() {\n patchState(store, { isEditMode: !store.isEditMode() });\n },\n\n setEditMode(isEditMode: boolean) {\n patchState(store, { isEditMode });\n },\n }))\n );","import {\n signalStoreFeature,\n withMethods,\n withState,\n withComputed,\n patchState,\n} from '@ngrx/signals';\nimport { computed } from '@angular/core';\nimport {\n CellIdUtils,\n CellData,\n WidgetFactory,\n WidgetId,\n WidgetIdUtils,\n} from '../../models';\n\nexport interface WidgetManagementState {\n widgetsById: Record<string, CellData>;\n}\n\nconst initialWidgetManagementState: WidgetManagementState = {\n widgetsById: {},\n};\n\nexport const withWidgetManagement = () =>\n signalStoreFeature(\n withState<WidgetManagementState>(initialWidgetManagementState),\n\n // Computed cells array - lazy evaluation, automatic memoization\n withComputed((store) => ({\n cells: computed(() => Object.values(store.widgetsById())),\n })),\n\n withMethods((store) => ({\n addWidget(cell: CellData) {\n const widgetKey = WidgetIdUtils.toString(cell.widgetId);\n patchState(store, {\n widgetsById: { ...store.widgetsById(), [widgetKey]: cell },\n });\n },\n\n removeWidget(widgetId: WidgetId) {\n const widgetKey = WidgetIdUtils.toString(widgetId);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [widgetKey]: _, ...remaining } = store.widgetsById();\n patchState(store, { widgetsById: remaining });\n },\n\n updateWidgetPosition(widgetId: WidgetId, row: number, col: number) {\n const widgetKey = WidgetIdUtils.toString(widgetId);\n const existingWidget = store.widgetsById()[widgetKey];\n\n if (existingWidget) {\n // Update position and recalculate cellId based on new position\n const newCellId = CellIdUtils.create(row, col);\n patchState(store, {\n widgetsById: {\n ...store.widgetsById(),\n [widgetKey]: { ...existingWidget, row, col, cellId: newCellId },\n },\n });\n }\n },\n\n createWidget(\n row: number,\n col: number,\n widgetFactory: WidgetFactory,\n widgetState?: string\n ) {\n const widgetId = WidgetIdUtils.generate(); // Generate unique widget ID\n const cellId = CellIdUtils.create(row, col); // Calculate position-based cell ID\n const cell: CellData = {\n widgetId,\n cellId,\n row,\n col,\n rowSpan: 1,\n colSpan: 1,\n widgetFactory,\n widgetState,\n };\n\n const widgetKey = WidgetIdUtils.toString(widgetId);\n patchState(store, {\n widgetsById: { ...store.widgetsById(), [widgetKey]: cell },\n });\n },\n\n updateCellSettings(widgetId: WidgetId, flat: boolean) {\n const widgetKey = WidgetIdUtils.toString(widgetId);\n const existingWidget = store.widgetsById()[widgetKey];\n\n if (existingWidget) {\n patchState(store, {\n widgetsById: {\n ...store.widgetsById(),\n [widgetKey]: { ...existingWidget, flat },\n },\n });\n }\n },\n\n updateWidgetSpan(widgetId: WidgetId, rowSpan: number, colSpan: number) {\n const widgetKey = WidgetIdUtils.toString(widgetId);\n const existingWidget = store.widgetsById()[widgetKey];\n\n if (existingWidget) {\n patchState(store, {\n widgetsById: {\n ...store.widgetsById(),\n [widgetKey]: { ...existingWidget, rowSpan, colSpan },\n },\n });\n }\n },\n\n updateWidgetState(widgetId: WidgetId, widgetState: unknown) {\n const widgetKey = WidgetIdUtils.toString(widgetId);\n const existingWidget = store.widgetsById()[widgetKey];\n\n if (existingWidget) {\n patchState(store, {\n widgetsById: {\n ...store.widgetsById(),\n [widgetKey]: { ...existingWidget, widgetState },\n },\n });\n }\n },\n\n updateAllWidgetStates(cellStates: Map<string, unknown>) {\n const updatedWidgetsById = { ...store.widgetsById() };\n\n // Convert cell ID keys to widget IDs and update states\n for (const [cellIdString, newState] of cellStates) {\n // Find the widget with the matching cell ID\n const widget = Object.values(updatedWidgetsById).find(w => \n CellIdUtils.toString(w.cellId) === cellIdString\n );\n \n if (widget) {\n const widgetIdString = WidgetIdUtils.toString(widget.widgetId);\n updatedWidgetsById[widgetIdString] = {\n ...updatedWidgetsById[widgetIdString],\n widgetState: newState,\n };\n }\n }\n\n patchState(store, { widgetsById: updatedWidgetsById });\n },\n\n clearDashboard() {\n patchState(store, { widgetsById: {} });\n },\n }))\n );\n","import {\n signalStoreFeature,\n withMethods,\n withState,\n withComputed,\n patchState,\n} from '@ngrx/signals';\nimport { computed } from '@angular/core';\nimport {\n CellId,\n CellIdUtils,\n CellData,\n DragData,\n WidgetFactory,\n WidgetId,\n} from '../../models';\nimport {\n calculateCollisionInfo,\n calculateHighlightedZones,\n} from './utils/collision.utils';\nimport { DashboardService } from '../../services/dashboard.service';\n\nexport interface DragDropState {\n dragData: DragData | null;\n hoveredDropZone: { row: number; col: number } | null;\n}\n\nconst initialDragDropState: DragDropState = {\n dragData: null,\n hoveredDropZone: null,\n};\n\nexport const withDragDrop = () =>\n signalStoreFeature(\n withState<DragDropState>(initialDragDropState),\n withComputed((store) => ({\n // Highlighted zones during drag\n highlightedZones: computed(() =>\n calculateHighlightedZones(store.dragData(), store.hoveredDropZone()),\n ),\n })),\n withComputed((store) => ({\n // Map for quick highlight lookup - reuse highlightedZones computation\n highlightMap: computed(() => {\n const zones = store.highlightedZones();\n const map = new Set<CellId>();\n\n for (const z of zones) {\n map.add(CellIdUtils.create(z.row, z.col));\n }\n\n return map;\n }),\n })),\n withMethods((store) => ({\n startDrag(dragData: DragData) {\n patchState(store, { dragData });\n },\n\n endDrag() {\n patchState(store, {\n dragData: null,\n hoveredDropZone: null,\n });\n },\n\n setHoveredDropZone(zone: { row: number; col: number } | null) {\n patchState(store, { hoveredDropZone: zone });\n },\n })),\n\n // Second withMethods block for drop handling that can access endDrag\n withMethods((store) => ({\n // Drop handling logic with dependency injection\n _handleDrop(\n dragData: DragData,\n targetPosition: { row: number; col: number },\n dependencies: {\n cells: CellData[];\n rows: number;\n columns: number;\n dashboardService: DashboardService;\n createWidget: (\n row: number,\n col: number,\n factory: WidgetFactory,\n widgetState?: string,\n ) => void;\n updateWidgetPosition: (\n widgetId: WidgetId,\n row: number,\n col: number,\n ) => void;\n },\n ): boolean {\n // 1. Validate placement using existing collision detection\n const collisionInfo = calculateCollisionInfo(\n dragData,\n targetPosition,\n dependencies.cells,\n dependencies.rows,\n dependencies.columns,\n );\n\n // 2. End drag state first\n store.endDrag();\n\n // 3. Early return if invalid placement\n if (collisionInfo.hasCollisions || collisionInfo.outOfBounds) {\n return false;\n }\n\n // 4. Handle widget creation from palette\n if (dragData.kind === 'widget') {\n const factory = dependencies.dashboardService.getFactory(\n dragData.content.widgetTypeid,\n );\n dependencies.createWidget(\n targetPosition.row,\n targetPosition.col,\n factory,\n undefined,\n );\n return true;\n }\n\n // 5. Handle cell movement\n if (dragData.kind === 'cell') {\n dependencies.updateWidgetPosition(\n dragData.content.widgetId, // Use widgetId instead of cellId\n targetPosition.row,\n targetPosition.col,\n );\n return true;\n }\n\n return false;\n },\n })),\n );\n","import { CellId, CellIdUtils, CellData } from '../../../models';\n\nexport function getMaxColSpan(\n cellId: CellId,\n row: number,\n col: number,\n cells: CellData[],\n columns: number,\n): number {\n const currentCell = cells.find((c) => CellIdUtils.equals(c.cellId, cellId));\n if (!currentCell) return 1;\n\n // Start from current position and check each column until we hit a boundary or collision\n let maxSpan = 1;\n\n for (let testCol = col + 1; testCol <= columns; testCol++) {\n // Check if this column is free for all rows the widget spans\n let columnIsFree = true;\n\n for (let testRow = row; testRow < row + currentCell.rowSpan; testRow++) {\n const occupied = cells.some((cell) => {\n if (CellIdUtils.equals(cell.cellId, cellId)) return false;\n\n const wStartCol = cell.col;\n const wEndCol = cell.col + cell.colSpan - 1;\n const wStartRow = cell.row;\n const wEndRow = cell.row + cell.rowSpan - 1;\n\n return (\n testCol >= wStartCol &&\n testCol <= wEndCol &&\n testRow >= wStartRow &&\n testRow <= wEndRow\n );\n });\n\n if (occupied) {\n columnIsFree = false;\n break;\n }\n }\n\n if (!columnIsFree) {\n break; // Hit a collision, stop here\n }\n\n maxSpan = testCol - col + 1; // Update max span to include this column\n }\n\n return maxSpan;\n}\n\nexport function getMaxRowSpan(\n cellId: CellId,\n row: number,\n col: number,\n cells: CellData[],\n rows: number,\n): number {\n const currentCell = cells.find((c) => CellIdUtils.equals(c.cellId, cellId));\n if (!currentCell) return 1;\n\n // Start from current position and check each row until we hit a boundary or collision\n let maxSpan = 1;\n\n for (let testRow = row + 1; testRow <= rows; testRow++) {\n // Check if this row is free for all columns the widget spans\n let rowIsFree = true;\n\n for (let testCol = col; testCol < col + currentCell.colSpan; testCol++) {\n const occupied = cells.some((cell) => {\n if (CellIdUtils.equals(cell.cellId, cellId)) return false;\n\n const wStartRow = cell.row;\n const wEndRow = cell.row + cell.rowSpan - 1;\n const wStartCol = cell.col;\n const wEndCol = cell.col + cell.colSpan - 1;\n\n return (\n testRow >= wStartRow &&\n testRow <= wEndRow &&\n testCol >= wStartCol &&\n testCol <= wEndCol\n );\n });\n\n if (occupied) {\n rowIsFree = false;\n break;\n }\n }\n\n if (!rowIsFree) {\n break; // Hit a collision, stop here\n }\n\n maxSpan = testRow - row + 1; // Update max span to include this row\n }\n\n return maxSpan;\n}\n\nexport interface ResizeData {\n cellId: CellId;\n originalRowSpan: number;\n originalColSpan: number;\n previewRowSpan: number;\n previewColSpan: number;\n}\n\nexport function calculateResizePreview(\n resizeData: ResizeData,\n direction: 'horizontal' | 'vertical',\n delta: number,\n cells: CellData[],\n rows: number,\n columns: number,\n): { rowSpan: number; colSpan: number } | null {\n const cell = cells.find((c) =>\n CellIdUtils.equals(c.cellId, resizeData.cellId),\n );\n if (!cell) return null;\n\n if (direction === 'horizontal') {\n // Calculate the desired span based on the delta\n const desiredColSpan = Math.max(1, resizeData.originalColSpan + delta);\n\n // Get the maximum allowed span\n const maxColSpan = getMaxColSpan(\n cell.cellId,\n cell.row,\n cell.col,\n cells,\n columns,\n );\n\n // Clamp to the maximum\n const newColSpan = Math.min(desiredColSpan, maxColSpan);\n\n return {\n rowSpan: resizeData.previewRowSpan,\n colSpan: newColSpan,\n };\n } else {\n // Calculate the desired span based on the delta\n const desiredRowSpan = Math.max(1, resizeData.originalRowSpan + delta);\n\n // Get the maximum allowed span\n const maxRowSpan = getMaxRowSpan(\n cell.cellId,\n cell.row,\n cell.col,\n cells,\n rows,\n );\n\n // Clamp to the maximum\n const newRowSpan = Math.min(desiredRowSpan, maxRowSpan);\n\n return {\n rowSpan: newRowSpan,\n colSpan: resizeData.previewColSpan,\n };\n }\n}","import {\n signalStoreFeature,\n withMethods,\n withState,\n patchState,\n} from '@ngrx/signals';\nimport { CellId, CellIdUtils, CellData } from '../../models';\nimport { calculateResizePreview, type ResizeData } from './utils/resize.utils';\n\nexport interface ResizeState {\n resizeData: ResizeData | null;\n}\n\nconst initialResizeState: ResizeState = {\n resizeData: null,\n};\n\n// Utility functions for resize preview computations\nexport const ResizePreviewUtils = {\n computePreviewCells(\n resizeData: ResizeData | null,\n cells: CellData[],\n ): { row: number; col: number }[] {\n if (!resizeData) return [];\n\n const cell = cells.find((cell) =>\n CellIdUtils.equals(cell.cellId, resizeData.cellId),\n );\n if (!cell) return [];\n\n const previewCells: { row: number; col: number }[] = [];\n for (let r = 0; r < resizeData.previewRowSpan; r++) {\n for (let c = 0; c < resizeData.previewColSpan; c++) {\n previewCells.push({\n row: cell.row + r,\n col: cell.col + c,\n });\n }\n }\n\n return previewCells;\n },\n\n computePreviewMap(previewCells: { row: number; col: number }[]): Set<CellId> {\n const map = new Set<CellId>();\n for (const cell of previewCells) {\n map.add(CellIdUtils.create(cell.row, cell.col));\n }\n return map;\n },\n};\n\nexport const withResize = () =>\n signalStoreFeature(\n withState<ResizeState>(initialResizeState),\n withMethods((store) => ({\n // Resize methods that need cross-feature dependencies\n _startResize(\n cellId: CellId,\n dependencies: {\n cells: CellData[];\n },\n ) {\n const cell = dependencies.cells.find((c) =>\n CellIdUtils.equals(c.cellId, cellId),\n );\n if (!cell) return;\n\n patchState(store, {\n resizeData: {\n cellId,\n originalRowSpan: cell.rowSpan,\n originalColSpan: cell.colSpan,\n previewRowSpan: cell.rowSpan,\n previewColSpan: cell.colSpan,\n },\n });\n },\n\n _updateResizePreview(\n direction: 'horizontal' | 'vertical',\n delta: number,\n dependencies: {\n cells: CellData[];\n rows: number;\n columns: number;\n },\n ) {\n const resizeData = store.resizeData();\n if (!resizeData) return;\n\n const newSpans = calculateResizePreview(\n resizeData,\n direction,\n delta,\n dependencies.cells,\n dependencies.rows,\n dependencies.columns,\n );\n\n if (newSpans) {\n patchState(store, {\n resizeData: {\n ...resizeData,\n previewRowSpan: newSpans.rowSpan,\n previewColSpan: newSpans.colSpan,\n },\n });\n }\n },\n\n _endResize(\n apply: boolean,\n dependencies: {\n updateWidgetSpan: (\n id: CellId,\n rowSpan: number,\n colSpan: number,\n ) => void;\n },\n ) {\n const resizeData = store.resizeData();\n if (!resizeData) return;\n\n if (\n apply &&\n (resizeData.previewRowSpan !== resizeData.originalRowSpan ||\n resizeData.previewColSpan !== resizeData.originalColSpan)\n ) {\n dependencies.updateWidgetSpan(\n resizeData.cellId,\n resizeData.previewRowSpan,\n resizeData.previewColSpan,\n );\n }\n\n patchState(store, { resizeData: null });\n },\n })),\n );\n","import {\r\n signalStore,\r\n withProps,\r\n withState,\r\n withComputed,\r\n withMethods,\r\n patchState,\r\n} from '@ngrx/signals';\r\nimport { DashboardService } from '../services/dashboard.service';\r\nimport { inject, computed } from '@angular/core';\r\nimport { calculateCollisionInfo } from './features/utils/collision.utils';\r\nimport {\r\n CellId,\r\n CellIdUtils,\r\n CellData,\r\n DragData,\r\n DashboardDataDto,\r\n WidgetIdUtils,\r\n} from '../models';\r\nimport { withGridConfig } from './features/grid-config.feature';\r\nimport { withWidgetManagement } from './features/widget-management.feature';\r\nimport { withDragDrop } from './features/drag-drop.feature';\r\nimport { withResize, ResizePreviewUtils } from './features/resize.feature';\r\n\r\ninterface DashboardState {\r\n dashboardId: string;\r\n}\r\n\r\nconst initialState: DashboardState = {\r\n dashboardId: '',\r\n};\r\n\r\nexport const DashboardStore = signalStore(\r\n withState(initialState),\r\n withProps(() => ({\r\n dashboardService: inject(DashboardService),\r\n })),\r\n withGridConfig(),\r\n withWidgetManagement(),\r\n withResize(),\r\n withDragDrop(),\r\n\r\n // Cross-feature computed properties (need access to multiple features)\r\n withComputed((store) => ({\r\n // Invalid zones (collision detection)\r\n invalidHighlightMap: computed(() => {\r\n const collisionInfo = calculateCollisionInfo(\r\n store.dragData(),\r\n store.hoveredDropZone(),\r\n store.cells(),\r\n store.rows(),\r\n store.columns()\r\n );\r\n\r\n return new Set(collisionInfo.invalidCells);\r\n }),\r\n\r\n // Check if placement would be valid (for drop validation)\r\n isValidPlacement: computed(() => {\r\n const collisionInfo = calculateCollisionInfo(\r\n store.dragData(),\r\n store.hoveredDropZone(),\r\n store.cells(),\r\n store.rows(),\r\n store.columns()\r\n );\r\n\r\n return !collisionInfo.hasCollisions && !collisionInfo.outOfBounds;\r\n }),\r\n })),\r\n\r\n // Cross-feature methods (need access to multiple features)\r\n withMethods((store) => ({\r\n // DROP HANDLING (delegate to drag-drop feature with dependency injection)\r\n handleDrop(\r\n dragData: DragData,\r\n targetPosition: { row: number; col: number }\r\n ): boolean {\r\n return store._handleDrop(dragData, targetPosition, {\r\n cells: store.cells(),\r\n rows: store.rows(),\r\n columns: store.columns(),\r\n dashboardService: store.dashboardService,\r\n createWidget: store.createWidget,\r\n updateWidgetPosition: store.updateWidgetPosition,\r\n });\r\n },\r\n\r\n // RESIZE METHODS (delegate to resize feature with dependency injection)\r\n startResize(cellId: CellId) {\r\n store._startResize(cellId, {\r\n cells: store.cells(),\r\n });\r\n },\r\n\r\n updateResizePreview(direction: 'horizontal' | 'vertical', delta: number) {\r\n store._updateResizePreview(direction, delta, {\r\n cells: store.cells(),\r\n rows: store.rows(),\r\n columns: store.columns(),\r\n });\r\n },\r\n\r\n endResize(apply: boolean) {\r\n store._endResize(apply, {\r\n updateWidgetSpan: (cellId: CellId, rowSpan: number, colSpan: number) => {\r\n // Adapter: find widget by cellId and update using widgetId\r\n const widget = store.cells().find(c => CellIdUtils.equals(c.cellId, cellId));\r\n if (widget) {\r\n store.updateWidgetSpan(widget.widgetId, rowSpan, colSpan);\r\n }\r\n }\r\n });\r\n },\r\n\r\n // EXPORT/IMPORT METHODS (need access to multiple features)\r\n exportDashboard(\r\n getCurrentWidgetStates?: () => Map<string, unknown>\r\n ): DashboardDataDto {\r\n // Get live widget states if callback provided, otherwise use stored states\r\n const liveWidgetStates =\r\n getCurrentWidgetStates?.() || new Map<string, unknown>();\r\n\r\n return {\r\n version: '1.0.0',\r\n dashboardId: store.dashboardId(),\r\n rows: store.rows(),\r\n columns: store.columns(),\r\n gutterSize: store.gutterSize(),\r\n cells: store.cells()\r\n .filter((cell) => cell.widgetFactory.widgetTypeid !== '__internal/unknown-widget')\r\n .map((cell) => {\r\n const cellIdString = CellIdUtils.toString(cell.cellId);\r\n const currentState = liveWidgetStates.get(cellIdString);\r\n\r\n return {\r\n row: cell.row,\r\n col: cell.col,\r\n rowSpan: cell.rowSpan,\r\n colSpan: cell.colSpan,\r\n flat: cell.flat,\r\n widgetTypeid: cell.widgetFactory.widgetTypeid,\r\n widgetState:\r\n currentState !== undefined ? currentState : cell.widgetState,\r\n };\r\n }),\r\n };\r\n },\r\n\r\n loadDashboard(data: DashboardDataDto): void {\r\n // Import full dashboard data with grid configuration\r\n const widgetsById: Record<string, CellData> = {};\r\n \r\n data.cells.forEach((cellData) => {\r\n const factory = store.dashboardService.getFactory(\r\n cellData.widgetTypeid\r\n );\r\n\r\n const widgetId = WidgetIdUtils.generate();\r\n const cell: CellData = {\r\n widgetId,\r\n cellId: CellIdUtils.create(cellData.row, cellData.col),\r\n row: cellData.row,\r\n col: cellData.col,\r\n rowSpan: cellData.rowSpan,\r\n colSpan: cellData.colSpan,\r\n flat: cellData.flat,\r\n widgetFactory: factory,\r\n widgetState: cellData.widgetState,\r\n };\r\n \r\n widgetsById[WidgetIdUtils.toString(widgetId)] = cell;\r\n });\r\n\r\n patchState(store, {\r\n dashboardId: data.dashboardId,\r\n rows: data.rows,\r\n columns: data.columns,\r\n gutterSize: data.gutterSize,\r\n widgetsById,\r\n });\r\n },\r\n\r\n // INITIALIZATION METHODS\r\n initializeFromDto(dashboardData: DashboardDataDto): void {\r\n // Inline the loadDashboard logic since it's defined later in the same methods block\r\n const widgetsById: Record<string, CellData> = {};\r\n \r\n dashboardData.cells.forEach((cellData) => {\r\n const factory = store.dashboardService.getFactory(\r\n cellData.widgetTypeid\r\n );\r\n\r\n const widgetId = WidgetIdUtils.generate();\r\n const cell: CellData = {\r\n widgetId,\r\n cellId: CellIdUtils.create(cellData.row, cellData.col),\r\n row: cellData.row,\r\n col: cellData.col,\r\n rowSpan: cellData.rowSpan,\r\n colSpan: cellData.colSpan,\r\n flat: cellData.flat,\r\n widgetFactory: factory,\r\n widgetState: cellData.widgetState,\r\n };\r\n \r\n widgetsById[WidgetIdUtils.toString(widgetId)] = cell;\r\n });\r\n\r\n patchState(store, {\r\n dashboardId: dashboardData.dashboardId,\r\n rows: dashboardData.rows,\r\n columns: dashboardData.columns,\r\n gutterSize: dashboardData.gutterSize,\r\n widgetsById,\r\n });\r\n },\r\n })),\r\n\r\n // Cross-feature computed properties that depend on resize + widget data (using utility functions)\r\n withComputed((store) => ({\r\n // Compute preview cells during resize using utility function\r\n resizePreviewCells: computed(() => {\r\n return ResizePreviewUtils.computePreviewCells(\r\n store.resizeData(),\r\n store.cells()\r\n );\r\n }),\r\n })),\r\n\r\n // Second computed block that depends on the first\r\n withComputed((store) => ({\r\n // Map for resize preview highlighting using utility function\r\n resizePreviewMap: computed(() => {\r\n return ResizePreviewUtils.computePreviewMap(store.resizePreviewCells());\r\n }),\r\n }))\r\n);\r\n","import { CellDisplayData } from '../../models/cell-dialog';\r\n\r\n/**\r\n * Abstract provider for cell settings dialogs.\r\n * Implement this to provide custom dialog solutions.\r\n */\r\nexport abstract class CellSettingsDialogProvider {\r\n /**\r\n * Open a settings dialog for the given cell.\r\n * Returns a promise that resolves to the new settings, or undefined if cancelled.\r\n */\r\n abstract openCellSettings(\r\n data: CellDisplayData\r\n ): Promise<CellDisplayData | undefined>;\r\n}","import { Component, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport {\r\n MAT_DIALOG_DATA,\r\n MatDialogRef,\r\n MatDialogModule,\r\n} from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { CellDisplayData } from '../../models/cell-dialog';\r\n\r\n@Component({\r\n selector: 'lib-cell-settings-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatRadioModule,\r\n ],\r\n template: `\r\n <h2 mat-dialog-title>Cell Display Settings</h2>\r\n <mat-dialog-content>\r\n <p class=\"cell-info\">Cell ID: <strong>{{ data.id }}</strong></p>\r\n \r\n <div class=\"radio-group\">\r\n <mat-radio-group [(ngModel)]=\"selectedMode\" name=\"displayMode\">\r\n <mat-radio-button value=\"normal\">\r\n <div class=\"radio-option\">\r\n <div class=\"option-title\">Normal</div>\r\n <div class=\"option-description\">Standard cell display with full content visibility</div>\r\n </div>\r\n </mat-radio-button>\r\n \r\n <mat-radio-button value=\"flat\">\r\n <div class=\"radio-option\">\r\n <div class=\"option-title\">Flat</div>\r\n <div class=\"option-description\">Simplified display with reduced visual emphasis</div>\r\n </div>\r\n </mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button (click)=\"onCancel()\">Cancel</button>\r\n <button \r\n mat-flat-button \r\n (click)=\"save()\"\r\n [disabled]=\"selectedMode === currentMode\">\r\n Apply\r\n </button>\r\n </mat-dialog-actions>\r\n `,\r\n styles: [\r\n `\r\n mat-dialog-content {\r\n display: block;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n padding-top: 0.5rem;\r\n }\r\n\r\n .cell-info {\r\n margin: 0 0 1.5rem 0;\r\n padding-bottom: 1rem;\r\n }\r\n\r\n .radio-group {\r\n width: 100%;\r\n }\r\n\r\n mat-radio-group {\r\n display: block;\r\n }\r\n\r\n mat-radio-button {\r\n width: 100%;\r\n display: block;\r\n margin-bottom: 1rem;\r\n }\r\n\r\n mat-radio-button:last-child {\r\n margin-bottom: 0;\r\n }\r\n\r\n .radio-option {\r\n margin-left: 0.75rem;\r\n padding: 0.25rem 0;\r\n }\r\n\r\n .option-title {\r\n display: block;\r\n margin-bottom: 0.25rem;\r\n }\r\n\r\n .option-description {\r\n display: block;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class CellSettingsDialogComponent {\r\n selectedMode: 'normal' | 'flat';\r\n currentMode: 'normal' | 'flat';\r\n\r\n data = inject(MAT_DIALOG_DATA) as CellDisplayData;\r\n private dialogRef = inject(MatDialogRef<CellSettingsDialogComponent>);\r\n\r\n constructor() {\r\n this.currentMode = this.data.flat ? 'flat' : 'normal';\r\n this.selectedMode = this.currentMode;\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n save(): void {\r\n const newData: CellDisplayData = {\r\n ...this.data,\r\n flat: this.selectedMode === 'flat'\r\n };\r\n this.dialogRef.close(newData);\r\n }\r\n}","import { Injectable, inject } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { CellDisplayData } from '../../models/cell-dialog';\r\nimport { CellSettingsDialogProvider } from './cell-settings-dialog.provider';\r\nimport { CellSettingsDialogComponent } from './cell-settings-dialog.component';\r\n\r\n/**\r\n * Default cell dialog provider that uses Material Design dialogs.\r\n * Provides a modern, accessible dialog experience for cell settings.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DefaultCellSettingsDialogProvider extends CellSettingsDialogProvider {\r\n private dialog = inject(MatDialog);\r\n\r\n async openCellSettings(\r\n data: CellDisplayData\r\n ): Promise<CellDisplayData | undefined> {\r\n const dialogRef = this.dialog.open(CellSettingsDialogComponent, {\r\n data,\r\n width: '400px',\r\n maxWidth: '90vw',\r\n disableClose: false,\r\n autoFocus: false,\r\n });\r\n\r\n const result = await firstValueFrom(dialogRef.afterClosed());\r\n return result;\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { CellSettingsDialogProvider } from './cell-settings-dialog.provider';\r\nimport { DefaultCellSettingsDialogProvider } from './default-cell-settings-dialog.provider';\r\n\r\n/**\r\n * Injection token for the cell dialog provider.\r\n * Use this to provide your custom dialog implementation.\r\n *\r\n * @example\r\n * ```typescript\r\n * providers: [\r\n * { provide: CELL_SETTINGS_DIALOG_PROVIDER, useClass: MyCellSettingsDialogProvider }\r\n * ]\r\n * ```\r\n */\r\nexport const CELL_SETTINGS_DIALOG_PROVIDER =\r\n new InjectionToken<CellSettingsDialogProvider>('CellSettingsDialogProvider', {\r\n providedIn: 'root',\r\n factory: () => new DefaultCellSettingsDialogProvider(),\r\n });","import { Injectable, signal } from '@angular/core';\n\nexport type CellContextMenuItem =\n | {\n label: string;\n icon?: string; // Material icon name (e.g., 'edit', 'settings', 'delete')\n action: () => void;\n disabled?: boolean;\n divider?: false;\n }\n | {\n divider: true;\n label?: never;\n icon?: never;\n action?: never;\n disabled?: never;\n };\n\n@Injectable()\nexport class CellContextMenuService {\n #activeMenu = signal<{\n x: number;\n y: number;\n items: CellContextMenuItem[];\n } | null>(null);\n\n activeMenu = this.#activeMenu.asReadonly();\n\n show(x: number, y: number, items: CellContextMenuItem[]) {\n this.#activeMenu.set({ x, y, items });\n }\n\n hide() {\n this.#activeMenu.set(null);\n }\n}\n","// cell.component.ts\r\nimport {\r\n Component,\r\n ComponentRef,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n ViewContainerRef,\r\n output,\r\n ElementRef,\r\n viewChild,\r\n Renderer2,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\n// RxJS removed: Using native DOM events with Renderer2 for performance\r\n// - Context menu uses template event binding (element-specific)\r\n// - Resize uses conditional document listeners (only when actively resizing)\r\n// - Eliminates N*mousemove performance issue with @HostListener approach\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n CellId,\r\n CellIdUtils,\r\n WidgetId,\r\n DragData,\r\n WidgetFactory,\r\n Widget,\r\n} from '../models';\r\nimport { DashboardStore } from '../store/dashboard-store';\r\nimport { CellDisplayData } from '../models';\r\nimport { CELL_SETTINGS_DIALOG_PROVIDER } from '../providers/cell-settings-dialog';\r\nimport { CellContextMenuService, CellContextMenuItem } from './cell-context-menu.service';\r\n\r\n@Component({\r\n selector: 'lib-cell',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './cell.component.html',\r\n styleUrl: './cell.component.scss',\r\n host: {\r\n '[style.grid-row]': 'gridRowStyle()',\r\n '[style.grid-column]': 'gridColumnStyle()',\r\n '[class.is-dragging]': 'isDragging()',\r\n '[class.drag-active]': 'isDragActive()',\r\n '[class.flat]': 'flat() === true',\r\n },\r\n})\r\nexport class CellComponent {\r\n widgetId = input.required<WidgetId>(); // Unique widget instance identifier\r\n cellId = input.required<CellId>(); // Current grid position\r\n widgetFactory = input<WidgetFactory | undefined>(undefined);\r\n widgetState = input<unknown | undefined>(undefined);\r\n isEditMode = input<boolean>(false);\r\n flat = input<boolean | undefined>(undefined);\r\n\r\n row = model.required<number>();\r\n column = model.required<number>();\r\n rowSpan = input<number>(1);\r\n colSpan = input<number>(1);\r\n draggable = input<boolean>(false);\r\n\r\n dragStart = output<DragData>();\r\n dragEnd = output<void>();\r\n\r\n edit = output<WidgetId>();\r\n delete = output<WidgetId>();\r\n settings = output<{ id: WidgetId; flat: boolean }>();\r\n resizeStart = output<{ cellId: CellId; direction: 'horizontal' | 'vertical' }>();\r\n resizeMove = output<{\r\n cellId: CellId;\r\n direction: 'horizontal' | 'vertical';\r\n delta: number;\r\n }>();\r\n resizeEnd = output<{ cellId: CellId; apply: boolean }>();\r\n\r\n private container = viewChild.required<ElementRef, ViewContainerRef>(\r\n 'container',\r\n { read: ViewContainerRef }\r\n );\r\n\r\n readonly #store = inject(DashboardStore);\r\n readonly #dialogProvider = inject(CELL_SETTINGS_DIALOG_PROVIDER);\r\n readonly #destroyRef = inject(DestroyRef);\r\n readonly #renderer = inject(Renderer2);\r\n readonly #contextMenuService = inject(CellContextMenuService, {\r\n optional: true,\r\n });\r\n\r\n #widgetRef?: ComponentRef<Widget>;\r\n \r\n // Document event listeners cleanup function\r\n // Performance: Only created when actively resizing, not for every cell\r\n #documentListeners?: () => void;\r\n\r\n isDragging = signal(false);\r\n\r\n readonly gridRowStyle = computed(\r\n () => `${this.row()} / span ${this.rowSpan()}`\r\n );\r\n readonly gridColumnStyle = computed(\r\n () => `${this.column()} / span ${this.colSpan()}`\r\n );\r\n\r\n isResizing = computed(() => {\r\n const resizeData = this.#store.resizeData();\r\n return resizeData\r\n ? CellIdUtils.equals(resizeData.cellId, this.cellId())\r\n : false;\r\n });\r\n\r\n isDragActive = computed(() => !!this.#store.dragData());\r\n\r\n resizeData = this.#store.resizeData;\r\n gridCellDimensions = this.#store.gridCellDimensions;\r\n private resizeDirection = signal<'horizontal' | 'vertical' | null>(null);\r\n private resizeStartPos = signal({ x: 0, y: 0 });\r\n\r\n constructor() {\r\n // widget creation - triggers when factory or state changes\r\n effect(() => {\r\n const factory = this.widgetFactory();\r\n const state = this.widgetState();\r\n const container = this.container();\r\n\r\n if (factory && container) {\r\n // Clean up previous widget\r\n this.#widgetRef?.destroy();\r\n\r\n // Create new widget\r\n container.clear();\r\n try {\r\n this.#widgetRef = factory.createInstance(container, state);\r\n } catch (error) {\r\n console.error('Failed to create widget:', error);\r\n this.#widgetRef = undefined;\r\n }\r\n }\r\n });\r\n\r\n // Auto cleanup on destroy\r\n this.#destroyRef.onDestroy(() => {\r\n this.#widgetRef?.destroy();\r\n this.#widgetRef = undefined;\r\n // Clean up any active document listeners\r\n this.#cleanupDocumentListeners();\r\n });\r\n }\r\n\r\n /**\r\n * Setup document-level event listeners for resize operations\r\n * Performance: Only creates listeners when actively resizing (not for every cell)\r\n * Angular-idiomatic: Uses Renderer2 for dynamic listener management\r\n */\r\n private setupDocumentListeners(): void {\r\n // Clean up any existing listeners first\r\n this.#cleanupDocumentListeners();\r\n\r\n // Create document listeners with proper cleanup functions\r\n const unlistenMove = this.#renderer.listen(\r\n 'document',\r\n 'mousemove',\r\n this.handleResizeMove.bind(this)\r\n );\r\n const unlistenUp = this.#renderer.listen(\r\n 'document',\r\n 'mouseup',\r\n this.handleResizeEnd.bind(this)\r\n );\r\n\r\n // Store cleanup function for later use\r\n this.#documentListeners = () => {\r\n unlistenMove();\r\n unlistenUp();\r\n };\r\n }\r\n\r\n /**\r\n * Clean up document-level event listeners\r\n * Called on resize end and component destruction\r\n */\r\n #cleanupDocumentListeners(): void {\r\n if (this.#documentListeners) {\r\n this.#documentListeners();\r\n this.#documentListeners = undefined;\r\n }\r\n }\r\n\r\n setPosition(row: number, column: number): void {\r\n this.row.set(row);\r\n this.column.set(column);\r\n }\r\n\r\n onDragStart(event: DragEvent): void {\r\n if (!event.dataTransfer) return;\r\n event.dataTransfer.effectAllowed = 'move';\r\n\r\n const cell = {\r\n cellId: this.cellId(),\r\n widgetId: this.widgetId(),\r\n row: this.row(),\r\n col: this.column(),\r\n rowSpan: this.rowSpan(),\r\n colSpan: this.colSpan(),\r\n };\r\n\r\n const content: DragData = { kind: 'cell', content: cell };\r\n this.dragStart.emit(content);\r\n this.isDragging.set(true);\r\n }\r\n\r\n onDragEnd(/*_: DragEvent*/): void {\r\n this.isDragging.set(false);\r\n this.dragEnd.emit();\r\n }\r\n\r\n /**\r\n * Handle context menu events (called from template)\r\n * Performance: Element-specific event binding, not document-level\r\n * Angular-idiomatic: Template event binding instead of fromEvent\r\n */\r\n onContextMenu(event: MouseEvent): void {\r\n if (!this.isEditMode() || !this.#contextMenuService) return;\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const items: CellContextMenuItem[] = [\r\n {\r\n label: 'Edit Widget',\r\n icon: 'edit',\r\n action: () => this.onEdit(),\r\n disabled: !this.canEdit(),\r\n },\r\n {\r\n label: 'Settings',\r\n icon: 'settings',\r\n action: () => this.onSettings(),\r\n },\r\n { divider: true },\r\n {\r\n label: 'Delete',\r\n icon: 'delete',\r\n action: () => this.onDelete(),\r\n },\r\n ];\r\n\r\n // Position menu at exact mouse coordinates\r\n this.#contextMenuService.show(event.clientX, event.clientY, items);\r\n }\r\n\r\n canEdit(): boolean {\r\n if (this.#widgetRef?.instance?.dashboardEditState) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n onEdit(): void {\r\n this.edit.emit(this.widgetId());\r\n\r\n // Call the widget's edit dialog method if it exists\r\n if (this.#widgetRef?.instance?.dashboardEditState) {\r\n this.#widgetRef.instance.dashboardEditState();\r\n }\r\n }\r\n\r\n onDelete(): void {\r\n this.delete.emit(this.widgetId());\r\n }\r\n\r\n async onSettings(): Promise<void> {\r\n const currentSettings: CellDisplayData = {\r\n id: CellIdUtils.toString(this.cellId()), // Use cellId for display position\r\n flat: this.flat(),\r\n };\r\n\r\n try {\r\n const result = await this.#dialogProvider.openCellSettings(\r\n currentSettings\r\n );\r\n\r\n if (result) {\r\n this.settings.emit({\r\n id: this.widgetId(),\r\n flat: result.flat ?? false,\r\n });\r\n }\r\n } catch (error) {\r\n console.error('Error opening cell settings dialog:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Start resize operation and setup document listeners\r\n * Performance: Only THIS cell creates document listeners when actively resizing\r\n * RxJS-free: Uses Renderer2 for dynamic listener management\r\n */\r\n onResizeStart(event: MouseEvent, direction: 'horizontal' | 'vertical'): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n this.resizeDirection.set(direction);\r\n this.resizeStartPos.set({ x: event.clientX, y: event.clientY });\r\n this.resizeStart.emit({ cellId: this.cellId(), direction });\r\n\r\n // Setup document listeners only when actively resizing\r\n this.setupDocumentListeners();\r\n\r\n const cursorClass =\r\n direction === 'horizontal' ? 'cursor-col-resize' : 'cursor-row-resize';\r\n this.#renderer.addClass(document.body, cursorClass);\r\n }\r\n\r\n /**\r\n * Handle resize move events (called from document listener)\r\n * Performance: Only called for the actively resizing cell\r\n * Bound method: Maintains component context without arrow functions\r\n */\r\n private handleResizeMove(event: MouseEvent): void {\r\n const direction = this.resizeDirection();\r\n if (!direction) return;\r\n\r\n const startPos = this.resizeStartPos();\r\n const cellSize = this.gridCellDimensions();\r\n\r\n if (direction === 'horizontal') {\r\n const deltaX = event.clientX - startPos.x;\r\n const deltaSpan = Math.round(deltaX / cellSize.width);\r\n this.resizeMove.emit({ cellId: this.cellId(), direction, delta: deltaSpan });\r\n } else {\r\n const deltaY = event.clientY - startPos.y;\r\n const deltaSpan = Math.round(deltaY / cellSize.height);\r\n this.resizeMove.emit({ cellId: this.cellId(), direction, delta: deltaSpan });\r\n }\r\n }\r\n\r\n /**\r\n * Handle resize end events (called from document listener)\r\n * Performance: Cleans up document listeners immediately after resize\r\n * State cleanup: Resets resize direction to stop further event processing\r\n */\r\n private handleResizeEnd(): void {\r\n this.#renderer.removeClass(document.body, 'cursor-col-resize');\r\n this.#renderer.removeClass(document.body, 'cursor-row-resize');\r\n\r\n // Clean up document listeners immediately\r\n this.#cleanupDocumentListeners();\r\n\r\n this.resizeEnd.emit({ cellId: this.cellId(), apply: true });\r\n this.resizeDirection.set(null);\r\n }\r\n\r\n /**\r\n * Get the current widget state by calling dashboardGetState() on the widget instance.\r\n * Used during dashboard export to get live widget state instead of stale stored state.\r\n */\r\n getCurrentWidgetState(): unknown | undefined {\r\n if (!this.#widgetRef?.instance) {\r\n return undefined;\r\n }\r\n\r\n // Call dashboardGetState() if the widget implements it\r\n if (typeof this.#widgetRef.instance.dashboardGetState === 'function') {\r\n return this.#widgetRef.instance.dashboardGetState();\r\n }\r\n\r\n // Fall back to stored state if widget doesn't implement dashboardGetState\r\n return this.widgetState();\r\n }\r\n}\r\n","<!-- cell.component.html -->\r\n<div\r\n class=\"cell\"\r\n [class.is-resizing]=\"isResizing()\"\r\n [class.flat]=\"flat() === true\"\r\n [draggable]=\"draggable()\"\r\n (dragstart)=\"onDragStart($event)\"\r\n (dragend)=\"onDragEnd()\"\r\n (contextmenu)=\"onContextMenu($event)\"\r\n>\r\n <div class=\"content-area\">\r\n <ng-template #container></ng-template>\r\n </div>\r\n @if (isEditMode() && !isDragging()) {\r\n <!-- Right resize handle -->\r\n <div\r\n class=\"resize-handle resize-handle--right\"\r\n (mousedown)=\"onResizeStart($event, 'horizontal')\"\r\n >\r\n <div class=\"resize-handle-line\"></div>\r\n </div>\r\n <!-- Bottom resize handle -->\r\n <div\r\n class=\"resize-handle resize-handle--bottom\"\r\n (mousedown)=\"onResizeStart($event, 'vertical')\"\r\n >\r\n <div class=\"resize-handle-line\"></div>\r\n </div>\r\n }\r\n</div>\r\n\r\n@if (isResizing()) {\r\n<div class=\"resize-preview\">\r\n {{ resizeData()?.previewColSpan ?? colSpan() }} ×\r\n {{ resizeData()?.previewRowSpan ?? rowSpan() }}\r\n</div>\r\n}\r\n","import { Component, computed, effect, inject, input, viewChildren, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CellComponent } from '../cell/cell.component';\r\nimport { DashboardStore } from '../store/dashboard-store';\r\nimport { CellIdUtils } from '../models';\r\n\r\n@Component({\r\n selector: 'ngx-dashboard-viewer',\r\n standalone: true,\r\n imports: [CellComponent, CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './dashboard-viewer.component.html',\r\n styleUrl: './dashboard-viewer.component.scss',\r\n host: {\r\n '[style.--rows]': 'rows()',\r\n '[style.--columns]': 'columns()',\r\n '[style.--gutter-size]': 'gutterSize()',\r\n '[style.--gutters]': 'gutters()',\r\n },\r\n})\r\nexport class DashboardViewerComponent {\r\n #store = inject(DashboardStore);\r\n cellComponents = viewChildren(CellComponent);\r\n\r\n rows = input.required<number>();\r\n columns = input.required<number>();\r\n gutterSize = input<string>('1em');\r\n gutters = computed(() => this.columns() + 1);\r\n\r\n // store signals - read-only\r\n cells = this.#store.cells;\r\n\r\n constructor() {\r\n // Sync grid configuration with store when inputs change\r\n effect(() => {\r\n this.#store.setGridConfig({\r\n rows: this.rows(),\r\n columns: this.columns(),\r\n gutterSize: this.gutterSize(),\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get current widget states from all cell components.\r\n * Used during dashboard export to get live widget states.\r\n */\r\n getCurrentWidgetStates(): Map<string, unknown> {\r\n const stateMap = new Map<string, unknown>();\r\n \r\n const cells = this.cellComponents();\r\n for (const cell of cells) {\r\n const cellId = cell.cellId();\r\n const currentState = cell.getCurrentWidgetState();\r\n if (currentState !== undefined) {\r\n stateMap.set(CellIdUtils.toString(cellId), currentState);\r\n }\r\n }\r\n \r\n return stateMap;\r\n }\r\n\r\n /**\r\n * Export dashboard with live widget states from current component instances.\r\n * This ensures the most up-to-date widget states are captured.\r\n */\r\n exportDashboard() {\r\n return this.#store.exportDashboard(() => this.getCurrentWidgetStates());\r\n }\r\n}\r\n","<!-- Dashboard viewer - read-only grid -->\r\n<div class=\"grid top-grid\">\r\n @for (cell of cells(); track cell.widgetId) {\r\n <lib-cell\r\n class=\"grid-cell\"\r\n [widgetId]=\"cell.widgetId\"\r\n [cellId]=\"cell.cellId\"\r\n [isEditMode]=\"false\"\r\n [draggable]=\"false\"\r\n [row]=\"cell.row\"\r\n [column]=\"cell.col\"\r\n [rowSpan]=\"cell.rowSpan\"\r\n [colSpan]=\"cell.colSpan\"\r\n [flat]=\"cell.flat\"\r\n [widgetFactory]=\"cell.widgetFactory\"\r\n [widgetState]=\"cell.widgetState\"\r\n >\r\n </lib-cell>\r\n }\r\n</div>\r\n","import { Component, viewChild, inject, ChangeDetectionStrategy, effect, computed } from '@angular/core';\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatButtonModule } from '@angular/material/button';\nimport {\n CellContextMenuService,\n CellContextMenuItem,\n} from './cell-context-menu.service';\n\n@Component({\n selector: 'lib-cell-context-menu',\n standalone: true,\n imports: [MatMenuModule, MatIconModule, MatDividerModule, MatButtonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <!-- Hidden trigger for menu positioned at exact mouse coordinates\n \n IMPORTANT: Angular Material applies its own positioning logic to menus,\n which by default offsets the menu from the trigger element to avoid overlap.\n To achieve precise positioning at mouse coordinates, we use these workarounds:\n \n 1. The trigger container is 1x1px (not 0x0) because Material needs a physical\n element to calculate position against. Zero-sized elements cause unpredictable\n positioning.\n \n 2. We use opacity:0 instead of visibility:hidden to keep the element in the\n layout flow while making it invisible.\n \n 3. The button itself is styled to 1x1px with no padding to serve as a precise\n anchor point for the menu.\n \n 4. The mat-menu uses [overlapTrigger]=\"true\" to allow the menu to appear\n directly at the trigger position rather than offset from it.\n \n This approach ensures the menu appears at the exact mouse coordinates passed\n from the cell component's right-click handler.\n -->\n <div \n style=\"position: fixed; width: 1px; height: 1px; opacity: 0; pointer-events: none;\"\n [style]=\"menuPosition()\">\n <button\n mat-button\n #menuTrigger=\"matMenuTrigger\"\n [matMenuTriggerFor]=\"contextMenu\"\n style=\"width: 1px; height: 1px; padding: 0; min-width: 0; line-height: 0;\">\n </button>\n </div>\n\n <!-- Context menu -->\n <mat-menu #contextMenu=\"matMenu\" [overlapTrigger]=\"true\">\n @for (item of menuItems(); track $index) {\n @if (item.divider) {\n <mat-divider></mat-divider>\n } @else {\n <button \n mat-menu-item \n (click)=\"executeAction(item)\" \n [disabled]=\"item.disabled\">\n @if (item.icon) {\n <mat-icon>{{ item.icon }}</mat-icon>\n }\n <span>{{ item.label }}</span>\n </button>\n }\n }\n </mat-menu>\n `,\n styles: [`\n :host {\n display: contents;\n }\n `]\n})\nexport class CellContextMenuComponent {\n menuTrigger = viewChild.required('menuTrigger', { read: MatMenuTrigger });\n \n menuService = inject(CellContextMenuService);\n \n menuPosition = computed(() => {\n const menu = this.menuService.activeMenu();\n return menu ? { left: `${menu.x}px`, top: `${menu.y}px` } : { left: '0px', top: '0px' };\n });\n \n menuItems = computed(() => {\n const menu = this.menuService.activeMenu();\n return menu?.items || [];\n });\n \n constructor() {\n effect(() => {\n const menu = this.menuService.activeMenu();\n if (menu) {\n // Use queueMicrotask to ensure the view is fully initialized\n // This fixes the issue where the menu disappears on first right-click\n queueMicrotask(() => {\n const trigger = this.menuTrigger();\n if (trigger) {\n // Close any existing menu first\n if (trigger.menuOpen) {\n trigger.closeMenu();\n }\n // Open menu - position is handled by signal\n trigger.openMenu();\n }\n });\n } else {\n const trigger = this.menuTrigger();\n if (trigger) {\n trigger.closeMenu();\n }\n }\n });\n \n // Hide service menu when Material menu closes\n effect(() => {\n const trigger = this.menuTrigger();\n if (trigger) {\n trigger.menuClosed.subscribe(() => {\n if (this.menuService.activeMenu()) {\n this.menuService.hide();\n }\n });\n }\n });\n }\n \n executeAction(item: CellContextMenuItem) {\n if (!item.divider && item.action) {\n item.action();\n this.menuService.hide();\n }\n }\n}","// drop-zone.component.ts\r\nimport {\r\n Component,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n computed,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DashboardStore } from '../store/dashboard-store';\r\nimport { DragData } from '../models';\r\n\r\n@Component({\r\n selector: 'lib-drop-zone',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './drop-zone.component.html',\r\n styleUrl: './drop-zone.component.scss',\r\n})\r\nexport class DropZoneComponent {\r\n // Required inputs\r\n row = input.required<number>();\r\n col = input.required<number>();\r\n index = input.required<number>();\r\n\r\n // Optional inputs with defaults\r\n highlight = input(false);\r\n highlightInvalid = input(false);\r\n highlightResize = input(false);\r\n editMode = input(false);\r\n\r\n // Outputs\r\n dragEnter = output<{ row: number; col: number }>();\r\n dragExit = output<void>();\r\n dragOver = output<{ row: number; col: number }>();\r\n dragDrop = output<{\r\n data: DragData;\r\n target: { row: number; col: number };\r\n }>();\r\n\r\n // Computed properties\r\n dropZoneId = computed(() => `drop-zone-${this.row()}-${this.col()}`);\r\n\r\n dropData = computed(() => ({\r\n row: this.row(),\r\n col: this.col(),\r\n }));\r\n\r\n // Abstract drag state from store\r\n dragData = computed(() => this.#store.dragData());\r\n \r\n // Computed drop effect based on drag data and validity\r\n dropEffect = computed(() => {\r\n const data = this.dragData();\r\n if (!data || this.highlightInvalid()) {\r\n return 'none';\r\n }\r\n return data.kind === 'cell' ? 'move' : 'copy';\r\n });\r\n\r\n readonly #store = inject(DashboardStore);\r\n readonly #elementRef = inject(ElementRef);\r\n\r\n get nativeElement(): HTMLElement {\r\n return this.#elementRef.nativeElement;\r\n }\r\n\r\n onDragEnter(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.dragEnter.emit({ row: this.row(), col: this.col() });\r\n }\r\n\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (event.dataTransfer && this.dragData()) {\r\n event.dataTransfer.dropEffect = this.dropEffect();\r\n }\r\n\r\n this.dragOver.emit({ row: this.row(), col: this.col() });\r\n }\r\n\r\n onDragLeave(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // Only emit if actually leaving the element (not entering a child)\r\n if (this.#isLeavingElement(event)) {\r\n this.dragExit.emit();\r\n }\r\n }\r\n\r\n #isLeavingElement(event: DragEvent): boolean {\r\n const rect = this.#elementRef.nativeElement.getBoundingClientRect();\r\n return (\r\n event.clientX <= rect.left ||\r\n event.clientX >= rect.right ||\r\n event.clientY <= rect.top ||\r\n event.clientY >= rect.bottom\r\n );\r\n }\r\n\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (!event.dataTransfer) return;\r\n\r\n const data = this.dragData();\r\n if (data) {\r\n this.dragDrop.emit({\r\n data,\r\n target: { row: this.row(), col: this.col() },\r\n });\r\n }\r\n }\r\n}\r\n","<!-- drop-zone.component.html -->\r\n<div\r\n class=\"drop-zone\"\r\n [class.drop-zone--highlight]=\"highlight() && !highlightInvalid()\"\r\n [class.drop-zone--invalid]=\"highlightInvalid()\"\r\n [class.drop-zone--resize]=\"highlightResize()\"\r\n [style.grid-row]=\"row()\"\r\n [style.grid-column]=\"col()\"\r\n (dragenter)=\"onDragEnter($event)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n>\r\n @if (editMode()) {\r\n <div class=\"edit-mode-cell-number\">\r\n {{ index() }}<br />\r\n {{ row() }},{{ col() }}\r\n </div>\r\n }\r\n</div>\r\n","// dashboard-editor.component.ts\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n viewChild,\n viewChildren,\n afterNextRender,\n} from '@angular/core';\nimport { CellComponent } from '../cell/cell.component';\nimport { CellContextMenuComponent } from '../cell/cell-context-menu.component';\nimport { CellContextMenuService } from '../cell/cell-context-menu.service';\nimport { DropZoneComponent } from '../drop-zone/drop-zone.component';\nimport { CellId, CellIdUtils, WidgetId, DragData, CellData } from '../models';\nimport { DashboardStore } from '../store/dashboard-store';\n\n@Component({\n selector: 'ngx-dashboard-editor',\n standalone: true,\n imports: [\n CellComponent,\n CommonModule,\n DropZoneComponent,\n CellContextMenuComponent,\n ],\n providers: [\n CellContextMenuService,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dashboard-editor.component.html',\n styleUrl: './dashboard-editor.component.scss',\n host: {\n '[style.--rows]': 'rows()',\n '[style.--columns]': 'columns()',\n '[style.--gutter-size]': 'gutterSize()',\n '[style.--gutters]': 'gutters()',\n '[class.is-edit-mode]': 'true', // Always in edit mode\n },\n})\nexport class DashboardEditorComponent {\n bottomGridRef = viewChild.required<ElementRef<HTMLDivElement>>('bottomGrid');\n dropZones = viewChildren(DropZoneComponent);\n cellComponents = viewChildren(CellComponent);\n\n #store = inject(DashboardStore);\n #destroyRef = inject(DestroyRef);\n #resizeObserver?: ResizeObserver;\n\n rows = input.required<number>();\n columns = input.required<number>();\n gutterSize = input<string>('1em');\n gutters = computed(() => this.columns() + 1);\n\n // store signals\n cells = this.#store.cells;\n highlightedZones = this.#store.highlightedZones;\n highlightMap = this.#store.highlightMap;\n invalidHighlightMap = this.#store.invalidHighlightMap;\n hoveredDropZone = this.#store.hoveredDropZone;\n resizePreviewMap = this.#store.resizePreviewMap;\n\n // Generate all possible cell positions for the grid\n dropzonePositions = computed(() => {\n const positions = [];\n for (let row = 1; row <= this.rows(); row++) {\n for (let col = 1; col <= this.columns(); col++) {\n positions.push({\n row,\n col,\n id: `dropzone-${row}-${col}`,\n index: (row - 1) * this.columns() + col,\n });\n }\n }\n return positions;\n });\n\n // Helper method for template\n createCellId(row: number, col: number): CellId {\n return CellIdUtils.create(row, col);\n }\n\n constructor() {\n // Sync grid configuration with store when inputs change\n effect(() => {\n this.#store.setGridConfig({\n rows: this.rows(),\n columns: this.columns(),\n gutterSize: this.gutterSize(),\n });\n });\n\n // Observe grid size after rendering\n afterNextRender(() => {\n this.#observeGridSize();\n });\n\n // Always set edit mode to true\n effect(() => {\n this.#store.setEditMode(true);\n });\n }\n\n #observeGridSize(): void {\n const gridEl = this.bottomGridRef()?.nativeElement;\n if (!gridEl || this.#resizeObserver) return;\n\n this.#resizeObserver = new ResizeObserver(() => {\n const dropZonesList = this.dropZones();\n const firstDropZone = dropZonesList[0];\n if (!firstDropZone) return;\n const el: HTMLElement = firstDropZone.nativeElement;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n\n const width = rect.width;\n const height = rect.height;\n\n this.#store.setGridCellDimensions(width, height);\n });\n\n this.#resizeObserver.observe(gridEl);\n\n // Register cleanup with DestroyRef for automatic memory management\n this.#destroyRef.onDestroy(() => {\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = undefined;\n });\n }\n\n // Pure delegation methods - no business logic in component\n addWidget = (cellData: CellData) => this.#store.addWidget(cellData);\n\n updateCellPosition = (id: WidgetId, row: number, column: number) =>\n this.#store.updateWidgetPosition(id, row, column);\n\n updateCellSpan = (id: WidgetId, colSpan: number, rowSpan: number) =>\n this.#store.updateWidgetSpan(id, rowSpan, colSpan);\n\n updateCellSettings = (id: WidgetId, flat: boolean) =>\n this.#store.updateCellSettings(id, flat);\n\n // Pure delegation - drag and drop event handlers\n onDragOver = (event: { row: number; col: number }) =>\n this.#store.setHoveredDropZone(event);\n\n onDragEnter = (event: { row: number; col: number }) => this.onDragOver(event);\n\n onDragExit = () => this.#store.setHoveredDropZone(null);\n\n dragEnd = () => this.#store.endDrag();\n\n // Pure delegation - cell event handlers\n onCellDelete = (id: WidgetId) => this.#store.removeWidget(id);\n\n onCellSettings = (event: { id: WidgetId; flat: boolean }) =>\n this.updateCellSettings(event.id, event.flat);\n\n onCellResize = (event: { id: WidgetId; rowSpan: number; colSpan: number }) =>\n this.updateCellSpan(event.id, event.colSpan, event.rowSpan);\n\n // Handle drag events from cell component\n onCellDragStart = (dragData: DragData) => this.#store.startDrag(dragData);\n\n // Handle resize events from cell component\n onCellResizeStart = (event: {\n cellId: CellId;\n direction: 'horizontal' | 'vertical';\n }) => this.#store.startResize(event.cellId);\n\n onCellResizeMove = (event: {\n cellId: CellId;\n direction: 'horizontal' | 'vertical';\n delta: number;\n }) => this.#store.updateResizePreview(event.direction, event.delta);\n\n onCellResizeEnd = (event: { cellId: CellId; apply: boolean }) =>\n this.#store.endResize(event.apply);\n\n // Handle drop events by delegating to store's business logic\n onDragDrop(event: { data: DragData; target: { row: number; col: number } }) {\n this.#store.handleDrop(event.data, event.target);\n // Note: Store handles all validation and error handling internally\n }\n\n /**\n * Get current widget states from all cell components.\n * Used during dashboard export to get live widget states.\n */\n getCurrentWidgetStates(): Map<string, unknown> {\n const stateMap = new Map<string, unknown>();\n \n const cells = this.cellComponents();\n for (const cell of cells) {\n const cellId = cell.cellId();\n const currentState = cell.getCurrentWidgetState();\n if (currentState !== undefined) {\n stateMap.set(CellIdUtils.toString(cellId), currentState);\n }\n }\n \n return stateMap;\n }\n\n /**\n * Export dashboard with live widget states from current component instances.\n * This ensures the most up-to-date widget states are captured.\n */\n exportDashboard() {\n return this.#store.exportDashboard(() => this.getCurrentWidgetStates());\n }\n}\n","<!-- dashboard-editor.component.html -->\n<div class=\"grid-container\">\n <!-- Bottom grid with drop zones -->\n <div class=\"grid\" id=\"bottom-grid\" #bottomGrid>\n @for (position of dropzonePositions(); track position.id) {\n <lib-drop-zone\n class=\"drop-zone\"\n [row]=\"position.row\"\n [col]=\"position.col\"\n [index]=\"position.index\"\n [highlight]=\"highlightMap().has(createCellId(position.row, position.col))\"\n [highlightInvalid]=\"\n invalidHighlightMap().has(createCellId(position.row, position.col))\n \"\n [highlightResize]=\"\n resizePreviewMap().has(createCellId(position.row, position.col))\n \"\n [editMode]=\"true\"\n (dragEnter)=\"onDragEnter($event)\"\n (dragExit)=\"onDragExit()\"\n (dragOver)=\"onDragOver($event)\"\n (dragDrop)=\"onDragDrop($event)\"\n ></lib-drop-zone>\n }\n </div>\n\n <!-- Top grid with interactive cells -->\n <div class=\"grid\" id=\"top-grid\">\n @for (cell of cells(); track cell.widgetId) {\n <lib-cell\n class=\"grid-cell\"\n [widgetId]=\"cell.widgetId\"\n [cellId]=\"cell.cellId\"\n [isEditMode]=\"true\"\n [draggable]=\"true\"\n [row]=\"cell.row\"\n [column]=\"cell.col\"\n [rowSpan]=\"cell.rowSpan\"\n [colSpan]=\"cell.colSpan\"\n [flat]=\"cell.flat\"\n [widgetFactory]=\"cell.widgetFactory\"\n [widgetState]=\"cell.widgetState\"\n (dragStart)=\"onCellDragStart($event)\"\n (dragEnd)=\"dragEnd()\"\n (delete)=\"onCellDelete($event)\"\n (settings)=\"onCellSettings($event)\"\n (resizeStart)=\"onCellResizeStart($event)\"\n (resizeMove)=\"onCellResizeMove($event)\"\n (resizeEnd)=\"onCellResizeEnd($event)\"\n >\n </lib-cell>\n }\n </div>\n</div>\n\n<!-- Context menu -->\n<lib-cell-context-menu></lib-cell-context-menu>\n","// dashboard-bridge.service.ts\r\nimport { Injectable, computed, signal } from '@angular/core';\r\nimport { DashboardStore } from '../store/dashboard-store';\r\nimport { DragData } from '../models';\r\n\r\ninterface DashboardInstance {\r\n store: InstanceType<typeof DashboardStore>;\r\n dimensions: () => { width: number; height: number };\r\n}\r\n\r\n/**\r\n * Internal bridge service that coordinates between component-scoped DashboardStore instances\r\n * and standalone components like WidgetListComponent.\r\n * \r\n * This service is NOT part of the public API and should remain internal to the library.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class DashboardBridgeService {\r\n // Map of registered dashboard instances with their reactive dimensions\r\n private readonly dashboards = signal(new Map<string, DashboardInstance>());\r\n \r\n /**\r\n * Register a dashboard store instance using its dashboard ID\r\n */\r\n registerDashboard(store: InstanceType<typeof DashboardStore>): void {\r\n const dashboardId = store.dashboardId();\r\n \r\n // If dashboard ID is not set yet, we'll register later when it's available\r\n if (!dashboardId) {\r\n return;\r\n }\r\n \r\n this.dashboards.update(dashboards => {\r\n const newMap = new Map(dashboards);\r\n newMap.set(dashboardId, {\r\n store,\r\n dimensions: store.gridCellDimensions\r\n });\r\n return newMap;\r\n });\r\n }\r\n \r\n /**\r\n * Unregister a dashboard store instance\r\n */\r\n unregisterDashboard(store: InstanceType<typeof DashboardStore>): void {\r\n const dashboardId = store.dashboardId();\r\n if (!dashboardId) {\r\n return;\r\n }\r\n \r\n this.dashboards.update(dashboards => {\r\n const newMap = new Map(dashboards);\r\n newMap.delete(dashboardId);\r\n return newMap;\r\n });\r\n }\r\n \r\n /**\r\n * Get cell dimensions for a specific dashboard instance\r\n */\r\n getDashboardDimensions(dashboardId: string): { width: number; height: number } {\r\n const dashboard = this.dashboards().get(dashboardId);\r\n return dashboard?.dimensions() || { width: 100, height: 100 };\r\n }\r\n \r\n /**\r\n * Get all available dashboard dimensions (for widget lists to choose from)\r\n * Returns the first available dashboard's dimensions as fallback\r\n */\r\n readonly availableDimensions = computed(() => {\r\n const dashboardEntries = Array.from(this.dashboards().values());\r\n if (dashboardEntries.length === 0) {\r\n return { width: 100, height: 100 }; // fallback\r\n }\r\n \r\n // Return dimensions from first available dashboard with fallback for undefined\r\n return dashboardEntries[0].dimensions() || { width: 100, height: 100 };\r\n });\r\n \r\n /**\r\n * Start drag operation on the first available dashboard\r\n * (Widget lists need some dashboard to coordinate with during drag)\r\n */\r\n startDrag(dragData: DragData): void {\r\n const dashboardEntries = Array.from(this.dashboards().values());\r\n if (dashboardEntries.length > 0) {\r\n dashboardEntries[0].store.startDrag(dragData);\r\n }\r\n }\r\n \r\n /**\r\n * End drag operation on all dashboards\r\n * (Safer to notify all in case drag state got distributed)\r\n */\r\n endDrag(): void {\r\n for (const dashboard of this.dashboards().values()) {\r\n dashboard.store.endDrag();\r\n }\r\n }\r\n \r\n /**\r\n * Get all registered dashboard IDs\r\n */\r\n readonly registeredDashboards = computed(() => Array.from(this.dashboards().keys()));\r\n \r\n /**\r\n * Get the number of registered dashboards\r\n */\r\n readonly dashboardCount = computed(() => this.dashboards().size);\r\n \r\n /**\r\n * Check if any dashboards are registered\r\n */\r\n readonly hasDashboards = computed(() => this.dashboards().size > 0);\r\n \r\n /**\r\n * Update registration for a dashboard store when its ID becomes available\r\n */\r\n updateDashboardRegistration(store: InstanceType<typeof DashboardStore>): void {\r\n this.registerDashboard(store);\r\n }\r\n\r\n /**\r\n * Get grid configuration for a specific dashboard\r\n */\r\n getDashboardGridConfig(dashboardId: string): { rows: number; columns: number; gutterSize: string } | null {\r\n const dashboard = this.dashboards().get(dashboardId);\r\n if (!dashboard) {\r\n return null;\r\n }\r\n \r\n const store = dashboard.store;\r\n return {\r\n rows: store.rows(),\r\n columns: store.columns(),\r\n gutterSize: store.gutterSize()\r\n };\r\n }\r\n\r\n /**\r\n * Get the store instance for a specific dashboard ID\r\n */\r\n getDashboardStore(dashboardId: string): InstanceType<typeof DashboardStore> | null {\r\n const dashboard = this.dashboards().get(dashboardId);\r\n return dashboard?.store || null;\r\n }\r\n\r\n /**\r\n * Get all registered dashboards (for viewport service integration)\r\n */\r\n getAllDashboards(): Map<string, DashboardInstance> {\r\n return this.dashboards();\r\n }\r\n}","import { Injectable, computed, signal, inject, DestroyRef, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { DashboardStore } from '../store/dashboard-store';\r\nimport { ReservedSpace, DEFAULT_RESERVED_SPACE } from '../models/reserved-space';\r\n\r\nexport interface ViewportSize {\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface DashboardConstraints {\r\n maxWidth: number;\r\n maxHeight: number;\r\n constrainedBy: 'width' | 'height' | 'none';\r\n}\r\n\r\n/**\r\n * Internal component-scoped service that provides viewport-aware constraints for a single dashboard.\r\n * Each dashboard component gets its own instance of this service.\r\n * \r\n * This service is NOT part of the public API and should remain internal to the library.\r\n */\r\n@Injectable()\r\nexport class DashboardViewportService {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly store = inject(DashboardStore);\r\n \r\n private readonly viewportSize = signal<ViewportSize>({ width: 0, height: 0 });\r\n private readonly reservedSpace = signal<ReservedSpace>(DEFAULT_RESERVED_SPACE);\r\n private resizeObserver: ResizeObserver | null = null;\r\n\r\n constructor() {\r\n if (isPlatformBrowser(this.platformId)) {\r\n this.initializeViewportTracking();\r\n }\r\n }\r\n\r\n /**\r\n * Initialize viewport size tracking using ResizeObserver on the window\r\n */\r\n private initializeViewportTracking(): void {\r\n // Use ResizeObserver on document.documentElement for accurate viewport tracking\r\n this.resizeObserver = new ResizeObserver((entries) => {\r\n if (entries.length > 0) {\r\n const entry = entries[0];\r\n const { inlineSize, blockSize } = entry.contentBoxSize[0];\r\n this.viewportSize.set({\r\n width: inlineSize,\r\n height: blockSize\r\n });\r\n }\r\n });\r\n\r\n this.resizeObserver.observe(document.documentElement);\r\n\r\n // Initial size\r\n this.viewportSize.set({\r\n width: window.innerWidth,\r\n height: window.innerHeight\r\n });\r\n\r\n // Cleanup on destroy\r\n this.destroyRef.onDestroy(() => {\r\n this.resizeObserver?.disconnect();\r\n });\r\n }\r\n\r\n /**\r\n * Set reserved space that should be excluded from dashboard calculations\r\n * (e.g., toolbar height, widget list width, padding)\r\n */\r\n setReservedSpace(space: ReservedSpace): void {\r\n this.reservedSpace.set(space);\r\n }\r\n\r\n /**\r\n * Get current viewport size\r\n */\r\n readonly currentViewportSize = this.viewportSize.asReadonly();\r\n\r\n /**\r\n * Get current reserved space\r\n */\r\n readonly currentReservedSpace = this.reservedSpace.asReadonly();\r\n\r\n /**\r\n * Calculate available space for dashboard after accounting for reserved areas\r\n */\r\n readonly availableSpace = computed((): ViewportSize => {\r\n const viewport = this.viewportSize();\r\n const reserved = this.reservedSpace();\r\n \r\n return {\r\n width: Math.max(0, viewport.width - reserved.left - reserved.right),\r\n height: Math.max(0, viewport.height - reserved.top - reserved.bottom)\r\n };\r\n });\r\n\r\n /**\r\n * Calculate dashboard constraints for this dashboard instance\r\n */\r\n readonly constraints = computed((): DashboardConstraints => {\r\n const availableSize = this.availableSpace();\r\n \r\n // Get grid configuration from our component's store\r\n const rows = this.store.rows();\r\n const columns = this.store.columns();\r\n \r\n if (rows === 0 || columns === 0) {\r\n return {\r\n maxWidth: availableSize.width,\r\n maxHeight: availableSize.height,\r\n constrainedBy: 'none'\r\n };\r\n }\r\n\r\n // Calculate aspect ratio\r\n const aspectRatio = columns / rows;\r\n \r\n // Calculate maximum size that fits within available space\r\n const maxWidthFromHeight = availableSize.height * aspectRatio;\r\n const maxHeightFromWidth = availableSize.width / aspectRatio;\r\n \r\n let maxWidth: number;\r\n let maxHeight: number;\r\n let constrainedBy: 'width' | 'height';\r\n \r\n if (maxWidthFromHeight <= availableSize.width) {\r\n // Height is the limiting factor\r\n maxWidth = maxWidthFromHeight;\r\n maxHeight = availableSize.height;\r\n constrainedBy = 'height';\r\n } else {\r\n // Width is the limiting factor\r\n maxWidth = availableSize.width;\r\n maxHeight = maxHeightFromWidth;\r\n constrainedBy = 'width';\r\n }\r\n\r\n return {\r\n maxWidth: Math.max(0, maxWidth),\r\n maxHeight: Math.max(0, maxHeight),\r\n constrainedBy\r\n };\r\n });\r\n\r\n}","// dashboard.component.ts\r\n//\r\n// A performant, modular, and fully reactive Angular dashboard container that orchestrates between\r\n// editing and viewing modes — with clean component separation and no external dependencies.\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n inject,\r\n input,\r\n viewChild,\r\n DestroyRef,\r\n OnChanges,\r\n SimpleChanges,\r\n untracked,\r\n} from '@angular/core';\r\nimport { DashboardViewerComponent } from '../dashboard-viewer/dashboard-viewer.component';\r\nimport { DashboardEditorComponent } from '../dashboard-editor/dashboard-editor.component';\r\nimport { DashboardStore } from '../store/dashboard-store';\r\nimport { DashboardDataDto } from '../models/dashboard-data.dto';\r\nimport { DashboardBridgeService } from '../services/dashboard-bridge.service';\r\nimport { DashboardViewportService } from '../services/dashboard-viewport.service';\r\nimport { ReservedSpace } from '../models/reserved-space';\r\n\r\n@Component({\r\n selector: 'ngx-dashboard',\r\n standalone: true,\r\n imports: [CommonModule, DashboardViewerComponent, DashboardEditorComponent],\r\n providers: [DashboardStore, DashboardViewportService],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './dashboard.component.html',\r\n styleUrl: './dashboard.component.scss',\r\n host: {\r\n '[style.--rows]': 'store.rows()',\r\n '[style.--columns]': 'store.columns()',\r\n '[style.--gutter-size]': 'store.gutterSize()',\r\n '[style.--gutters]': 'store.columns() + 1',\r\n '[class.is-edit-mode]': 'editMode()',\r\n '[style.max-width.px]': 'viewport.constraints().maxWidth',\r\n '[style.max-height.px]': 'viewport.constraints().maxHeight',\r\n },\r\n})\r\nexport class DashboardComponent implements OnChanges {\r\n #store = inject(DashboardStore);\r\n #bridge = inject(DashboardBridgeService);\r\n #viewport = inject(DashboardViewportService);\r\n #destroyRef = inject(DestroyRef);\r\n\r\n // Public accessors for template\r\n protected readonly store = this.#store;\r\n protected readonly viewport = this.#viewport;\r\n\r\n // Component inputs\r\n dashboardData = input.required<DashboardDataDto>();\r\n editMode = input<boolean>(false);\r\n reservedSpace = input<ReservedSpace>();\r\n\r\n // Store signals - shared by both child components\r\n cells = this.#store.cells;\r\n\r\n // ViewChild references for export/import functionality\r\n private dashboardEditor = viewChild(DashboardEditorComponent);\r\n private dashboardViewer = viewChild(DashboardViewerComponent);\r\n\r\n // Track if we're in the middle of preserving states\r\n #isPreservingStates = false;\r\n // Track if component has been initialized\r\n #isInitialized = false;\r\n\r\n constructor() {\r\n // Cleanup registration when component is destroyed\r\n this.#destroyRef.onDestroy(() => {\r\n this.#bridge.unregisterDashboard(this.#store);\r\n });\r\n\r\n // Initialize from dashboardData\r\n effect(() => {\r\n const data = this.dashboardData();\r\n if (data) {\r\n this.#store.initializeFromDto(data);\r\n // Register with bridge service after dashboard ID is set\r\n this.#bridge.updateDashboardRegistration(this.#store);\r\n this.#isInitialized = true;\r\n }\r\n });\r\n\r\n // Sync edit mode with store (without triggering state preservation)\r\n effect(() => {\r\n const editMode = this.editMode();\r\n untracked(() => {\r\n this.#store.setEditMode(editMode);\r\n });\r\n });\r\n\r\n // Sync reserved space input with viewport service\r\n effect(() => {\r\n const reserved = this.reservedSpace();\r\n if (reserved) {\r\n this.#viewport.setReservedSpace(reserved);\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n // Handle edit mode changes after initialization\r\n if (\r\n changes['editMode'] &&\r\n !changes['editMode'].firstChange &&\r\n this.#isInitialized\r\n ) {\r\n const previousValue = changes['editMode'].previousValue;\r\n const currentValue = changes['editMode'].currentValue;\r\n\r\n if (previousValue !== currentValue) {\r\n // Preserve widget states before the mode switch\r\n this.#preserveWidgetStatesBeforeModeSwitch(previousValue);\r\n }\r\n }\r\n }\r\n\r\n // Public export/import methods\r\n exportDashboard(): DashboardDataDto {\r\n // Delegate to the active child component\r\n if (this.editMode()) {\r\n const editor = this.dashboardEditor();\r\n return editor ? editor.exportDashboard() : this.#store.exportDashboard();\r\n } else {\r\n const viewer = this.dashboardViewer();\r\n return viewer ? viewer.exportDashboard() : this.#store.exportDashboard();\r\n }\r\n }\r\n\r\n loadDashboard(data: DashboardDataDto): void {\r\n this.#store.loadDashboard(data);\r\n }\r\n\r\n getCurrentDashboardData(): DashboardDataDto {\r\n return this.exportDashboard();\r\n }\r\n\r\n clearDashboard(): void {\r\n this.#store.clearDashboard();\r\n }\r\n\r\n /**\r\n * Preserve widget states before switching modes by collecting live states\r\n * from the currently active component and updating the store.\r\n */\r\n #preserveWidgetStatesBeforeModeSwitch(previousEditMode: boolean): void {\r\n // Prevent re-entrant calls\r\n if (this.#isPreservingStates) {\r\n return;\r\n }\r\n\r\n this.#isPreservingStates = true;\r\n\r\n try {\r\n let currentWidgetStates: Map<string, unknown> | null = null;\r\n\r\n if (previousEditMode) {\r\n // Previously in edit mode, collect states from editor\r\n const editor = this.dashboardEditor();\r\n if (editor) {\r\n currentWidgetStates = editor.getCurrentWidgetStates();\r\n }\r\n } else {\r\n // Previously in view mode, collect states from viewer\r\n const viewer = this.dashboardViewer();\r\n if (viewer) {\r\n currentWidgetStates = viewer.getCurrentWidgetStates();\r\n }\r\n }\r\n\r\n // Update the store with the live widget states using untracked to avoid triggering effects\r\n if (currentWidgetStates && currentWidgetStates.size > 0) {\r\n untracked(() => {\r\n this.#store.updateAllWidgetStates(currentWidgetStates);\r\n });\r\n }\r\n } finally {\r\n this.#isPreservingStates = false;\r\n }\r\n }\r\n}\r\n","<!-- dashboard.component.html -->\r\n<div class=\"grid-container\">\r\n @if (editMode()) {\r\n <!-- Full editor with drag & drop capabilities -->\r\n <ngx-dashboard-editor\r\n [rows]=\"store.rows()\"\r\n [columns]=\"store.columns()\"\r\n [gutterSize]=\"store.gutterSize()\"\r\n ></ngx-dashboard-editor>\r\n } @else {\r\n <!-- Read-only viewer -->\r\n <ngx-dashboard-viewer\r\n [rows]=\"store.rows()\"\r\n [columns]=\"store.columns()\"\r\n [gutterSize]=\"store.gutterSize()\"\r\n ></ngx-dashboard-viewer>\r\n }\r\n</div>\r\n","// widget-list.component.ts\r\nimport {\r\n Component,\r\n computed,\r\n inject,\r\n Renderer2,\r\n signal,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { DragData, WidgetMetadata } from '../models';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { DashboardService } from '../services/dashboard.service';\r\nimport { DashboardBridgeService } from '../services/dashboard-bridge.service';\r\n\r\ninterface WidgetDisplayItem extends WidgetMetadata {\r\n safeSvgIcon?: SafeHtml;\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-dashboard-widget-list',\r\n standalone: true,\r\n imports: [],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './widget-list.component.html',\r\n styleUrl: './widget-list.component.scss',\r\n})\r\nexport class WidgetListComponent {\r\n readonly #service = inject(DashboardService);\r\n readonly #sanitizer = inject(DomSanitizer);\r\n readonly #renderer = inject(Renderer2);\r\n readonly #bridge = inject(DashboardBridgeService);\r\n\r\n activeWidget = signal<string | null>(null);\r\n\r\n // Get grid cell dimensions from bridge service (uses first available dashboard)\r\n gridCellDimensions = this.#bridge.availableDimensions;\r\n\r\n widgets = computed(() =>\r\n this.#service.widgetTypes().map((w) => ({\r\n ...w.metadata,\r\n safeSvgIcon: this.#sanitizer.bypassSecurityTrustHtml(w.metadata.svgIcon),\r\n }))\r\n );\r\n\r\n onDragStart(event: DragEvent, widget: WidgetDisplayItem) {\r\n if (!event.dataTransfer) return;\r\n event.dataTransfer.effectAllowed = 'copy';\r\n\r\n const dragData: DragData = {\r\n kind: 'widget',\r\n content: widget,\r\n };\r\n\r\n this.activeWidget.set(widget.widgetTypeid);\r\n this.#bridge.startDrag(dragData);\r\n\r\n // Create custom drag ghost for better UX\r\n const ghost = this.#createDragGhost(widget.svgIcon);\r\n document.body.appendChild(ghost);\r\n\r\n // Force reflow to ensure element is rendered\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const _reflow = ghost.offsetHeight;\r\n\r\n event.dataTransfer.setDragImage(ghost, 10, 10);\r\n\r\n // Delay removal to ensure browser has time to snapshot the drag image\r\n setTimeout(() => ghost.remove());\r\n }\r\n\r\n onDragEnd(): void {\r\n this.activeWidget.set(null);\r\n this.#bridge.endDrag();\r\n }\r\n\r\n #createDragGhost(svgIcon: string | undefined): HTMLElement {\r\n const dimensions = this.gridCellDimensions();\r\n\r\n const el = this.#renderer.createElement('div');\r\n this.#renderer.addClass(el, 'drag-ghost');\r\n\r\n // Set dimensions using CSS custom properties for dynamic sizing\r\n this.#renderer.setStyle(el, 'width', `${dimensions.width}px`);\r\n this.#renderer.setStyle(el, 'height', `${dimensions.height}px`);\r\n\r\n if (svgIcon) {\r\n const iconWrapper = this.#renderer.createElement('div');\r\n this.#renderer.addClass(iconWrapper, 'icon');\r\n\r\n iconWrapper.innerHTML = svgIcon;\r\n const svg = iconWrapper.querySelector('svg');\r\n\r\n if (svg) {\r\n // Size the SVG to 80% of the cell dimensions\r\n svg.setAttribute('width', `${dimensions.width * 0.8}`);\r\n svg.setAttribute('height', `${dimensions.height * 0.8}`);\r\n // Remove hardcoded fill and opacity - let CSS handle styling\r\n svg.removeAttribute('fill');\r\n }\r\n\r\n el.appendChild(iconWrapper);\r\n }\r\n\r\n return el;\r\n }\r\n}\r\n","<!-- widget-list.component.html -->\r\n<div class=\"widget-list\" role=\"list\" aria-label=\"Available widgets\">\r\n @for (widget of widgets(); track widget.widgetTypeid) {\r\n <div\r\n class=\"widget-list-item\"\r\n [class.active]=\"activeWidget() === widget.widgetTypeid\"\r\n draggable=\"true\"\r\n (dragstart)=\"onDragStart($event, widget)\"\r\n (dragend)=\"onDragEnd()\"\r\n role=\"listitem\"\r\n [attr.aria-grabbed]=\"activeWidget() === widget.widgetTypeid\"\r\n [attr.aria-label]=\"widget.name + ' widget: ' + widget.description\"\r\n tabindex=\"0\"\r\n >\r\n <div class=\"icon\" [innerHTML]=\"widget.safeSvgIcon\" aria-hidden=\"true\"></div>\r\n <div class=\"content\">\r\n <strong>{{ widget.name }}</strong>\r\n <small>{{ widget.description }}</small>\r\n </div>\r\n </div>\r\n }\r\n</div>","/*\r\n * Public API Surface of ngx-dashboard\r\n */\r\n\r\n// Main dashboard components\r\nexport * from './lib/dashboard/dashboard.component';\r\nexport * from './lib/dashboard-editor/dashboard-editor.component';\r\nexport * from './lib/dashboard-viewer/dashboard-viewer.component';\r\nexport * from './lib/widget-list/widget-list.component';\r\n\r\n// Public Services\r\nexport * from './lib/services/dashboard.service';\r\n\r\n// Store is now internal - removed from public API\r\n\r\n// Public Models and interfaces\r\n// TODO: not everything should be exported\r\nexport * from './lib/models';\r\n\r\n// Providers\r\nexport * from './lib/providers';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dragonworks-ngx-dashboard.mjs","sources":["../../../projects/ngx-dashboard/src/lib/models/cell-id.ts","../../../projects/ngx-dashboard/src/lib/models/widget-id.ts","../../../projects/ngx-dashboard/src/lib/models/dashboard-data.utils.ts","../../../projects/ngx-dashboard/src/lib/models/reserved-space.ts","../../../projects/ngx-dashboard/src/lib/models/widget-factory.ts","../../../projects/ngx-dashboard/src/lib/internal-widgets/unknown-widget/unknown-widget.component.ts","../../../projects/ngx-dashboard/src/lib/services/dashboard.service.ts","../../../projects/ngx-dashboard/src/lib/store/features/utils/grid-query-internal.utils.ts","../../../projects/ngx-dashboard/src/lib/store/features/utils/collision.utils.ts","../../../projects/ngx-dashboard/src/lib/store/features/grid-config.feature.ts","../../../projects/ngx-dashboard/src/lib/store/features/widget-management.feature.ts","../../../projects/ngx-dashboard/src/lib/store/features/drag-drop.feature.ts","../../../projects/ngx-dashboard/src/lib/store/features/utils/resize.utils.ts","../../../projects/ngx-dashboard/src/lib/store/features/resize.feature.ts","../../../projects/ngx-dashboard/src/lib/store/dashboard-store.ts","../../../projects/ngx-dashboard/src/lib/providers/cell-settings-dialog/cell-settings-dialog.provider.ts","../../../projects/ngx-dashboard/src/lib/providers/cell-settings-dialog/cell-settings-dialog.component.ts","../../../projects/ngx-dashboard/src/lib/providers/cell-settings-dialog/default-cell-settings-dialog.provider.ts","../../../projects/ngx-dashboard/src/lib/providers/cell-settings-dialog/cell-settings-dialog.tokens.ts","../../../projects/ngx-dashboard/src/lib/cell/cell-context-menu.service.ts","../../../projects/ngx-dashboard/src/lib/cell/cell.component.ts","../../../projects/ngx-dashboard/src/lib/cell/cell.component.html","../../../projects/ngx-dashboard/src/lib/dashboard-viewer/dashboard-viewer.component.ts","../../../projects/ngx-dashboard/src/lib/dashboard-viewer/dashboard-viewer.component.html","../../../projects/ngx-dashboard/src/lib/cell/cell-context-menu.component.ts","../../../projects/ngx-dashboard/src/lib/drop-zone/drop-zone.component.ts","../../../projects/ngx-dashboard/src/lib/drop-zone/drop-zone.component.html","../../../projects/ngx-dashboard/src/lib/dashboard-editor/dashboard-editor.component.ts","../../../projects/ngx-dashboard/src/lib/dashboard-editor/dashboard-editor.component.html","../../../projects/ngx-dashboard/src/lib/services/dashboard-bridge.service.ts","../../../projects/ngx-dashboard/src/lib/services/dashboard-viewport.service.ts","../../../projects/ngx-dashboard/src/lib/dashboard/dashboard.component.ts","../../../projects/ngx-dashboard/src/lib/dashboard/dashboard.component.html","../../../projects/ngx-dashboard/src/lib/widget-list/widget-list.component.ts","../../../projects/ngx-dashboard/src/lib/widget-list/widget-list.component.html","../../../projects/ngx-dashboard/src/public-api.ts","../../../projects/ngx-dashboard/src/dragonworks-ngx-dashboard.ts"],"sourcesContent":["/**\n * Branded type for cell identifiers to ensure type safety when working with grid coordinates.\n * This prevents accidentally mixing up row/column numbers with cell IDs.\n */\nexport type CellId = number & { __brand: 'CellId' };\n\n/**\n * Maximum number of columns supported by the grid.\n * This determines the encoding scheme for cell coordinates.\n */\nconst MAX_COLUMNS = 1024;\n\n/**\n * Utility functions for working with CellId branded type.\n */\nexport const CellIdUtils = {\n /**\n * Creates a CellId from row and column coordinates.\n * @param row - The row number (1-based)\n * @param col - The column number (1-based)\n * @returns A branded CellId that encodes both coordinates\n * @throws Error if row or col is less than 1, or if col exceeds MAX_COLUMNS\n */\n create(row: number, col: number): CellId {\n if (row < 1 || col < 1) {\n throw new Error(\n `Invalid cell coordinates: row=${row}, col=${col}. Both must be >= 1`,\n );\n }\n if (col >= MAX_COLUMNS) {\n throw new Error(`Column ${col} exceeds maximum of ${MAX_COLUMNS - 1}`);\n }\n return (row * MAX_COLUMNS + col) as CellId;\n },\n\n /**\n * Decodes a CellId back into row and column coordinates.\n * @param cellId - The CellId to decode\n * @returns A tuple of [row, col] coordinates (1-based)\n */\n decode(cellId: CellId): [number, number] {\n const id = cellId as number;\n const row = Math.floor(id / MAX_COLUMNS);\n const col = id % MAX_COLUMNS;\n return [row, col];\n },\n\n /**\n * Gets the row coordinate from a CellId.\n * @param cellId - The CellId to extract row from\n * @returns The row number (1-based)\n */\n getRow(cellId: CellId): number {\n return Math.floor((cellId as number) / MAX_COLUMNS);\n },\n\n /**\n * Gets the column coordinate from a CellId.\n * @param cellId - The CellId to extract column from\n * @returns The column number (1-based)\n */\n getCol(cellId: CellId): number {\n return (cellId as number) % MAX_COLUMNS;\n },\n\n /**\n * Creates a string representation of a CellId for debugging/display purposes.\n * @param cellId - The CellId to convert to string\n * @returns A string in the format \"row-col\"\n */\n toString(cellId: CellId): string {\n const [row, col] = this.decode(cellId);\n return `${row}-${col}`;\n },\n\n /**\n * Checks if two CellIds are equal.\n * @param a - First CellId\n * @param b - Second CellId\n * @returns True if the CellIds represent the same cell\n */\n equals(a: CellId, b: CellId): boolean {\n return a === b;\n },\n};\n","/**\r\n * Branded type for widget identifiers to ensure type safety when working with widget instances.\r\n * This prevents accidentally mixing up widget IDs with other string values.\r\n */\r\nexport type WidgetId = string & { __brand: 'WidgetId' };\r\n\r\n/**\r\n * Utility functions for working with WidgetId branded type.\r\n * WidgetIds are UUIDs that uniquely identify widget instances throughout their lifecycle,\r\n * independent of their position on the dashboard grid.\r\n */\r\nexport const WidgetIdUtils = {\r\n /**\r\n * Generates a new unique WidgetId.\r\n * Uses crypto.randomUUID() when available, falls back to timestamp-based ID for older browsers.\r\n * @returns A new unique WidgetId\r\n */\r\n generate(): WidgetId {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID() as WidgetId;\r\n }\r\n // Fallback for older browsers\r\n return `widget-${Date.now()}-${Math.random().toString(36).substr(2, 9)}` as WidgetId;\r\n },\r\n\r\n /**\r\n * Validates if a string is a valid WidgetId format.\r\n * @param id - The string to validate\r\n * @returns True if the string is a valid WidgetId format\r\n */\r\n validate(id: string): id is WidgetId {\r\n // UUID v4 format or fallback format\r\n return (\r\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(id) ||\r\n /^widget-\\d+-[a-z0-9]{9}$/i.test(id)\r\n );\r\n },\r\n\r\n /**\r\n * Converts a WidgetId to a string for use as map keys or serialization.\r\n * @param id - The WidgetId to convert\r\n * @returns The string representation of the WidgetId\r\n */\r\n toString(id: WidgetId): string {\r\n return id;\r\n },\r\n\r\n /**\r\n * Creates a WidgetId from a string, validating the format.\r\n * @param str - The string to convert to WidgetId\r\n * @returns A WidgetId\r\n * @throws Error if the string is not a valid WidgetId format\r\n */\r\n fromString(str: string): WidgetId {\r\n if (!this.validate(str)) {\r\n throw new Error(`Invalid WidgetId format: ${str}`);\r\n }\r\n return str as WidgetId;\r\n },\r\n\r\n /**\r\n * Checks if two WidgetIds are equal.\r\n * @param a - First WidgetId\r\n * @param b - Second WidgetId\r\n * @returns True if the WidgetIds are the same\r\n */\r\n equals(a: WidgetId, b: WidgetId): boolean {\r\n return a === b;\r\n },\r\n};","import { DashboardDataDto } from './dashboard-data.dto';\r\n\r\n/**\r\n * Creates an empty dashboard configuration with the specified dimensions.\r\n * This is a convenience function for creating a basic dashboard without any cells.\r\n *\r\n * @param dashboardId - Unique identifier for the dashboard (managed by client)\r\n * @param rows - Number of rows in the dashboard grid\r\n * @param columns - Number of columns in the dashboard grid\r\n * @param gutterSize - CSS size for the gutter between cells (default: '0.5em')\r\n * @returns A DashboardDataDto configured with the specified dimensions and no cells\r\n *\r\n * @example\r\n * // Create an 8x16 dashboard with default gutter\r\n * const dashboard = createEmptyDashboard('my-dashboard-1', 8, 16);\r\n *\r\n * @example\r\n * // Create a 5x10 dashboard with custom gutter\r\n * const dashboard = createEmptyDashboard('my-dashboard-2', 5, 10, '0.5rem');\r\n */\r\nexport function createEmptyDashboard(\r\n dashboardId: string,\r\n rows: number,\r\n columns: number,\r\n gutterSize = '0.5em'\r\n): DashboardDataDto {\r\n return {\r\n version: '1.0.0',\r\n dashboardId,\r\n rows,\r\n columns,\r\n gutterSize,\r\n cells: [],\r\n };\r\n}\r\n\r\n/**\r\n * Creates a default dashboard configuration with standard dimensions.\r\n * This provides a reasonable starting point for most use cases.\r\n *\r\n * @param dashboardId - Unique identifier for the dashboard (managed by client)\r\n * @returns A DashboardDataDto with 8 rows, 16 columns, and 0.5em gutter\r\n *\r\n * @example\r\n * const dashboard = createDefaultDashboard('my-dashboard-id');\r\n */\r\nexport function createDefaultDashboard(dashboardId: string): DashboardDataDto {\r\n return createEmptyDashboard(dashboardId, 8, 16, '0.5em');\r\n}\r\n","/**\r\n * Defines space that should be reserved around the dashboard component\r\n * when calculating viewport constraints.\r\n */\r\nexport interface ReservedSpace {\r\n /** Space reserved at the top (e.g., toolbar height) */\r\n top: number;\r\n /** Space reserved on the right (e.g., padding, widget list) */\r\n right: number;\r\n /** Space reserved at the bottom (e.g., padding) */\r\n bottom: number;\r\n /** Space reserved on the left (e.g., padding) */\r\n left: number;\r\n}\r\n\r\n/**\r\n * Default reserved space when none is specified\r\n */\r\nexport const DEFAULT_RESERVED_SPACE: ReservedSpace = {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0\r\n};","// widget-factory.ts\r\nimport { ComponentRef, ViewContainerRef } from '@angular/core';\r\nimport {\r\n Widget,\r\n WidgetComponentClass,\r\n} from './widget';\r\n\r\nexport interface WidgetFactory<\r\n T extends Widget = Widget\r\n> {\r\n widgetTypeid: string; // application wide unique ID\r\n name: string;\r\n description: string;\r\n svgIcon: string; // SVG markup as string\r\n createInstance(container: ViewContainerRef, state?: unknown): ComponentRef<T>;\r\n}\r\n\r\nexport function createFactoryFromComponent<T extends Widget>(\r\n component: WidgetComponentClass<T>\r\n): WidgetFactory {\r\n return {\r\n ...component.metadata,\r\n\r\n createInstance(\r\n container: ViewContainerRef,\r\n state?: unknown\r\n ): ComponentRef<T> {\r\n const ref = container.createComponent(component);\r\n ref.instance.dashboardSetState?.(state);\r\n return ref;\r\n },\r\n };\r\n}\r\n","import {\n Component,\n ChangeDetectionStrategy,\n signal,\n computed,\n} from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Widget, WidgetMetadata } from '../../models';\n\nexport interface UnknownWidgetState {\n originalWidgetTypeid: string;\n}\n\n@Component({\n selector: 'lib-unknown-widget',\n imports: [MatIconModule, MatTooltipModule],\n template: `\n <div class=\"unknown-widget-container\" [matTooltip]=\"tooltipText()\">\n <mat-icon class=\"unknown-widget-icon\">error_outline</mat-icon>\n </div>\n `,\n styles: [\n `\n .unknown-widget-container {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background-color: var(--mat-sys-error);\n border-radius: 8px;\n container-type: size;\n }\n\n .unknown-widget-icon {\n color: var(--mat-sys-on-error);\n font-size: clamp(12px, 75cqmin, 68px);\n width: clamp(12px, 75cqmin, 68px);\n height: clamp(12px, 75cqmin, 68px);\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UnknownWidgetComponent implements Widget {\n static metadata: WidgetMetadata = {\n widgetTypeid: '__internal/unknown-widget',\n name: 'Unknown Widget',\n description: 'Fallback widget for unknown widget types',\n svgIcon:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"currentColor\"><path d=\"M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm-40-160h80v-240h-80v240Zm40 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Z\"/></svg>',\n };\n\n readonly state = signal<UnknownWidgetState>({\n originalWidgetTypeid: 'unknown',\n });\n\n readonly tooltipText = computed(() => `${this.state().originalWidgetTypeid}`);\n\n dashboardSetState(state?: unknown): void {\n if (state && typeof state === 'object' && 'originalWidgetTypeid' in state) {\n this.state.set(state as UnknownWidgetState);\n }\n }\n\n dashboardGetState(): UnknownWidgetState {\n return this.state();\n }\n\n // No edit dialog for error widgets - method intentionally not implemented\n}\n","// dashboard.service.ts\r\nimport { Injectable, signal } from '@angular/core';\r\nimport {\r\n createFactoryFromComponent,\r\n WidgetComponentClass,\r\n WidgetFactory,\r\n} from '../models';\r\nimport { UnknownWidgetComponent } from '../internal-widgets/unknown-widget/unknown-widget.component';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DashboardService {\r\n readonly #widgetTypes = signal<WidgetComponentClass[]>([]);\r\n readonly #widgetFactoryMap = new Map<string, WidgetFactory>();\r\n readonly #unknownWidgetFactory = createFactoryFromComponent(UnknownWidgetComponent);\r\n readonly widgetTypes = this.#widgetTypes.asReadonly(); // make the widget list available as a readonly signal\r\n\r\n registerWidgetType(widget: WidgetComponentClass) {\r\n if (\r\n this.#widgetTypes().some(\r\n (w) => w.metadata.widgetTypeid === widget.metadata.widgetTypeid\r\n )\r\n ) {\r\n throw new Error(\r\n `Widget type '${widget.metadata.widgetTypeid}' is already registered`\r\n );\r\n }\r\n\r\n this.#widgetFactoryMap.set(\r\n widget.metadata.widgetTypeid,\r\n createFactoryFromComponent(widget)\r\n );\r\n\r\n this.#widgetTypes.set([...this.#widgetTypes(), widget]);\r\n }\r\n\r\n getFactory(widgetTypeid: string): WidgetFactory {\r\n const factory = this.#widgetFactoryMap.get(widgetTypeid);\r\n\r\n if (factory) {\r\n return factory;\r\n }\r\n\r\n // Return fallback factory for unknown widget types\r\n console.warn(\r\n `Unknown widget type: ${widgetTypeid}, using fallback error widget`\r\n );\r\n \r\n // Create a custom factory that preserves the original widget type ID in state\r\n return {\r\n ...this.#unknownWidgetFactory,\r\n createInstance: (container, state) => {\r\n const ref = this.#unknownWidgetFactory.createInstance(container, {\r\n originalWidgetTypeid: widgetTypeid,\r\n ...(state && typeof state === 'object' ? state as Record<string, unknown> : {}),\r\n });\r\n return ref;\r\n },\r\n };\r\n }\r\n}\r\n","import { CellData, WidgetId } from '../../../models';\n\n// Internal utility functions used by collision detection, resize logic, and tests\nexport const GridQueryInternalUtils = {\n isCellOccupied(cells: CellData[], row: number, col: number, excludeWidgetId?: WidgetId): boolean {\n return cells.some((cell) => {\n // Skip checking against the widget being dragged (use widgetId for stable identity)\n if (excludeWidgetId && cell.widgetId === excludeWidgetId)\n return false;\n\n const endRow = cell.row + cell.rowSpan - 1;\n const endCol = cell.col + cell.colSpan - 1;\n\n return (\n cell.row <= row && row <= endRow && cell.col <= col && col <= endCol\n );\n });\n },\n\n isOutOfBounds(\n targetRow: number,\n targetCol: number,\n spanRow: number,\n spanCol: number,\n maxRows: number,\n maxColumns: number,\n ): boolean {\n const rowLimit = targetRow + spanRow - 1;\n const colLimit = targetCol + spanCol - 1;\n\n return rowLimit > maxRows || colLimit > maxColumns;\n },\n\n getCellAt(cells: CellData[], row: number, col: number): CellData | null {\n return cells.find((cell) => cell.row === row && cell.col === col) ?? null;\n },\n};","import { CellId, CellIdUtils, CellData, DragData } from '../../../models';\nimport { GridQueryInternalUtils } from './grid-query-internal.utils';\n\nexport interface CollisionInfo {\n hasCollisions: boolean;\n invalidCells: CellId[];\n outOfBounds: boolean;\n footprint: { row: number; col: number }[];\n}\n\nexport function calculateCollisionInfo(\n dragData: DragData | null,\n hovered: { row: number; col: number } | null,\n cells: CellData[],\n rows: number,\n columns: number,\n): CollisionInfo {\n if (!dragData || !hovered) {\n return {\n hasCollisions: false,\n invalidCells: [],\n outOfBounds: false,\n footprint: [],\n };\n }\n\n const isCell = dragData.kind === 'cell';\n const rowSpan = isCell ? dragData.content.rowSpan : 1;\n const colSpan = isCell ? dragData.content.colSpan : 1;\n\n // Check bounds\n const outOfBounds = GridQueryInternalUtils.isOutOfBounds(\n hovered.row,\n hovered.col,\n rowSpan,\n colSpan,\n rows,\n columns\n );\n\n // Generate footprint\n const footprint: { row: number; col: number }[] = [];\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n footprint.push({ row: hovered.row + r, col: hovered.col + c });\n }\n }\n\n const excludeWidgetId = isCell ? dragData.content.widgetId : undefined;\n\n // Check for actual collisions with other widgets (not self)\n const hasCollisions = footprint.some((pos) =>\n GridQueryInternalUtils.isCellOccupied(cells, pos.row, pos.col, excludeWidgetId)\n );\n\n // Generate invalid cell IDs\n const invalidCells: CellId[] = [];\n if (hasCollisions || outOfBounds) {\n for (const pos of footprint) {\n invalidCells.push(CellIdUtils.create(pos.row, pos.col));\n }\n }\n\n return {\n hasCollisions,\n invalidCells,\n outOfBounds,\n footprint,\n };\n}\n\nexport function calculateHighlightedZones(\n dragData: DragData | null,\n hovered: { row: number; col: number } | null,\n): { row: number; col: number }[] {\n if (!dragData || !hovered) return [];\n\n const zones: { row: number; col: number }[] = [];\n const rowSpan = dragData.kind === 'cell' ? dragData.content.rowSpan : 1;\n const colSpan = dragData.kind === 'cell' ? dragData.content.colSpan : 1;\n\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n zones.push({ row: hovered.row + r, col: hovered.col + c });\n }\n }\n\n return zones;\n}","import { signalStoreFeature, withMethods, withState, patchState } from '@ngrx/signals';\n\nexport interface GridConfigState {\n rows: number;\n columns: number;\n gutterSize: string;\n isEditMode: boolean;\n gridCellDimensions: { width: number; height: number };\n}\n\nconst initialGridConfigState: GridConfigState = {\n rows: 8,\n columns: 16,\n gutterSize: '0.5em',\n isEditMode: false,\n gridCellDimensions: { width: 0, height: 0 },\n};\n\nexport const withGridConfig = () =>\n signalStoreFeature(\n withState<GridConfigState>(initialGridConfigState),\n withMethods((store) => ({\n setGridConfig(config: {\n rows?: number;\n columns?: number;\n gutterSize?: string;\n }) {\n patchState(store, config);\n },\n\n setGridCellDimensions(width: number, height: number) {\n patchState(store, { gridCellDimensions: { width, height } });\n },\n\n toggleEditMode() {\n patchState(store, { isEditMode: !store.isEditMode() });\n },\n\n setEditMode(isEditMode: boolean) {\n patchState(store, { isEditMode });\n },\n }))\n );","import {\n signalStoreFeature,\n withMethods,\n withState,\n withComputed,\n patchState,\n} from '@ngrx/signals';\nimport { computed } from '@angular/core';\nimport {\n CellIdUtils,\n CellData,\n WidgetFactory,\n WidgetId,\n WidgetIdUtils,\n} from '../../models';\n\nexport interface WidgetManagementState {\n widgetsById: Record<string, CellData>;\n}\n\nconst initialWidgetManagementState: WidgetManagementState = {\n widgetsById: {},\n};\n\nexport const withWidgetManagement = () =>\n signalStoreFeature(\n withState<WidgetManagementState>(initialWidgetManagementState),\n\n // Computed cells array - lazy evaluation, automatic memoization\n withComputed((store) => ({\n cells: computed(() => Object.values(store.widgetsById())),\n })),\n\n withMethods((store) => ({\n addWidget(cell: CellData) {\n const widgetKey = WidgetIdUtils.toString(cell.widgetId);\n patchState(store, {\n widgetsById: { ...store.widgetsById(), [widgetKey]: cell },\n });\n },\n\n removeWidget(widgetId: WidgetId) {\n const widgetKey = WidgetIdUtils.toString(widgetId);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [widgetKey]: _, ...remaining } = store.widgetsById();\n patchState(store, { widgetsById: remaining });\n },\n\n updateWidgetPosition(widgetId: WidgetId, row: number, col: number) {\n const widgetKey = WidgetIdUtils.toString(widgetId);\n const existingWidget = store.widgetsById()[widgetKey];\n\n if (existingWidget) {\n // Update position and recalculate cellId based on new position\n const newCellId = CellIdUtils.create(row, col);\n patchState(store, {\n widgetsById: {\n ...store.widgetsById(),\n [widgetKey]: { ...existingWidget, row, col, cellId: newCellId },\n },\n });\n }\n },\n\n createWidget(\n row: number,\n col: number,\n widgetFactory: WidgetFactory,\n widgetState?: string\n ) {\n const widgetId = WidgetIdUtils.generate(); // Generate unique widget ID\n const cellId = CellIdUtils.create(row, col); // Calculate position-based cell ID\n const cell: CellData = {\n widgetId,\n cellId,\n row,\n col,\n rowSpan: 1,\n colSpan: 1,\n widgetFactory,\n widgetState,\n };\n\n const widgetKey = WidgetIdUtils.toString(widgetId);\n patchState(store, {\n widgetsById: { ...store.widgetsById(), [widgetKey]: cell },\n });\n },\n\n updateCellSettings(widgetId: WidgetId, flat: boolean) {\n const widgetKey = WidgetIdUtils.toString(widgetId);\n const existingWidget = store.widgetsById()[widgetKey];\n\n if (existingWidget) {\n patchState(store, {\n widgetsById: {\n ...store.widgetsById(),\n [widgetKey]: { ...existingWidget, flat },\n },\n });\n }\n },\n\n updateWidgetSpan(widgetId: WidgetId, rowSpan: number, colSpan: number) {\n const widgetKey = WidgetIdUtils.toString(widgetId);\n const existingWidget = store.widgetsById()[widgetKey];\n\n if (existingWidget) {\n patchState(store, {\n widgetsById: {\n ...store.widgetsById(),\n [widgetKey]: { ...existingWidget, rowSpan, colSpan },\n },\n });\n }\n },\n\n updateWidgetState(widgetId: WidgetId, widgetState: unknown) {\n const widgetKey = WidgetIdUtils.toString(widgetId);\n const existingWidget = store.widgetsById()[widgetKey];\n\n if (existingWidget) {\n patchState(store, {\n widgetsById: {\n ...store.widgetsById(),\n [widgetKey]: { ...existingWidget, widgetState },\n },\n });\n }\n },\n\n updateAllWidgetStates(cellStates: Map<string, unknown>) {\n const updatedWidgetsById = { ...store.widgetsById() };\n\n // Convert cell ID keys to widget IDs and update states\n for (const [cellIdString, newState] of cellStates) {\n // Find the widget with the matching cell ID\n const widget = Object.values(updatedWidgetsById).find(w => \n CellIdUtils.toString(w.cellId) === cellIdString\n );\n \n if (widget) {\n const widgetIdString = WidgetIdUtils.toString(widget.widgetId);\n updatedWidgetsById[widgetIdString] = {\n ...updatedWidgetsById[widgetIdString],\n widgetState: newState,\n };\n }\n }\n\n patchState(store, { widgetsById: updatedWidgetsById });\n },\n\n clearDashboard() {\n patchState(store, { widgetsById: {} });\n },\n }))\n );\n","import {\n signalStoreFeature,\n withMethods,\n withState,\n withComputed,\n patchState,\n} from '@ngrx/signals';\nimport { computed } from '@angular/core';\nimport {\n CellId,\n CellIdUtils,\n CellData,\n DragData,\n WidgetFactory,\n WidgetId,\n} from '../../models';\nimport {\n calculateCollisionInfo,\n calculateHighlightedZones,\n} from './utils/collision.utils';\nimport { DashboardService } from '../../services/dashboard.service';\n\nexport interface DragDropState {\n dragData: DragData | null;\n hoveredDropZone: { row: number; col: number } | null;\n}\n\nconst initialDragDropState: DragDropState = {\n dragData: null,\n hoveredDropZone: null,\n};\n\nexport const withDragDrop = () =>\n signalStoreFeature(\n withState<DragDropState>(initialDragDropState),\n withComputed((store) => ({\n // Highlighted zones during drag\n highlightedZones: computed(() =>\n calculateHighlightedZones(store.dragData(), store.hoveredDropZone()),\n ),\n })),\n withComputed((store) => ({\n // Map for quick highlight lookup - reuse highlightedZones computation\n highlightMap: computed(() => {\n const zones = store.highlightedZones();\n const map = new Set<CellId>();\n\n for (const z of zones) {\n map.add(CellIdUtils.create(z.row, z.col));\n }\n\n return map;\n }),\n })),\n withMethods((store) => ({\n startDrag(dragData: DragData) {\n patchState(store, { dragData });\n },\n\n endDrag() {\n patchState(store, {\n dragData: null,\n hoveredDropZone: null,\n });\n },\n\n setHoveredDropZone(zone: { row: number; col: number } | null) {\n patchState(store, { hoveredDropZone: zone });\n },\n })),\n\n // Second withMethods block for drop handling that can access endDrag\n withMethods((store) => ({\n // Drop handling logic with dependency injection\n _handleDrop(\n dragData: DragData,\n targetPosition: { row: number; col: number },\n dependencies: {\n cells: CellData[];\n rows: number;\n columns: number;\n dashboardService: DashboardService;\n createWidget: (\n row: number,\n col: number,\n factory: WidgetFactory,\n widgetState?: string,\n ) => void;\n updateWidgetPosition: (\n widgetId: WidgetId,\n row: number,\n col: number,\n ) => void;\n },\n ): boolean {\n // 1. Validate placement using existing collision detection\n const collisionInfo = calculateCollisionInfo(\n dragData,\n targetPosition,\n dependencies.cells,\n dependencies.rows,\n dependencies.columns,\n );\n\n // 2. End drag state first\n store.endDrag();\n\n // 3. Early return if invalid placement\n if (collisionInfo.hasCollisions || collisionInfo.outOfBounds) {\n return false;\n }\n\n // 4. Handle widget creation from palette\n if (dragData.kind === 'widget') {\n const factory = dependencies.dashboardService.getFactory(\n dragData.content.widgetTypeid,\n );\n dependencies.createWidget(\n targetPosition.row,\n targetPosition.col,\n factory,\n undefined,\n );\n return true;\n }\n\n // 5. Handle cell movement\n if (dragData.kind === 'cell') {\n dependencies.updateWidgetPosition(\n dragData.content.widgetId, // Use widgetId instead of cellId\n targetPosition.row,\n targetPosition.col,\n );\n return true;\n }\n\n return false;\n },\n })),\n );\n","import { CellId, CellIdUtils, CellData } from '../../../models';\n\nexport function getMaxColSpan(\n cellId: CellId,\n row: number,\n col: number,\n cells: CellData[],\n columns: number,\n): number {\n const currentCell = cells.find((c) => CellIdUtils.equals(c.cellId, cellId));\n if (!currentCell) return 1;\n\n // Start from current position and check each column until we hit a boundary or collision\n let maxSpan = 1;\n\n for (let testCol = col + 1; testCol <= columns; testCol++) {\n // Check if this column is free for all rows the widget spans\n let columnIsFree = true;\n\n for (let testRow = row; testRow < row + currentCell.rowSpan; testRow++) {\n const occupied = cells.some((cell) => {\n if (CellIdUtils.equals(cell.cellId, cellId)) return false;\n\n const wStartCol = cell.col;\n const wEndCol = cell.col + cell.colSpan - 1;\n const wStartRow = cell.row;\n const wEndRow = cell.row + cell.rowSpan - 1;\n\n return (\n testCol >= wStartCol &&\n testCol <= wEndCol &&\n testRow >= wStartRow &&\n testRow <= wEndRow\n );\n });\n\n if (occupied) {\n columnIsFree = false;\n break;\n }\n }\n\n if (!columnIsFree) {\n break; // Hit a collision, stop here\n }\n\n maxSpan = testCol - col + 1; // Update max span to include this column\n }\n\n return maxSpan;\n}\n\nexport function getMaxRowSpan(\n cellId: CellId,\n row: number,\n col: number,\n cells: CellData[],\n rows: number,\n): number {\n const currentCell = cells.find((c) => CellIdUtils.equals(c.cellId, cellId));\n if (!currentCell) return 1;\n\n // Start from current position and check each row until we hit a boundary or collision\n let maxSpan = 1;\n\n for (let testRow = row + 1; testRow <= rows; testRow++) {\n // Check if this row is free for all columns the widget spans\n let rowIsFree = true;\n\n for (let testCol = col; testCol < col + currentCell.colSpan; testCol++) {\n const occupied = cells.some((cell) => {\n if (CellIdUtils.equals(cell.cellId, cellId)) return false;\n\n const wStartRow = cell.row;\n const wEndRow = cell.row + cell.rowSpan - 1;\n const wStartCol = cell.col;\n const wEndCol = cell.col + cell.colSpan - 1;\n\n return (\n testRow >= wStartRow &&\n testRow <= wEndRow &&\n testCol >= wStartCol &&\n testCol <= wEndCol\n );\n });\n\n if (occupied) {\n rowIsFree = false;\n break;\n }\n }\n\n if (!rowIsFree) {\n break; // Hit a collision, stop here\n }\n\n maxSpan = testRow - row + 1; // Update max span to include this row\n }\n\n return maxSpan;\n}\n\nexport interface ResizeData {\n cellId: CellId;\n originalRowSpan: number;\n originalColSpan: number;\n previewRowSpan: number;\n previewColSpan: number;\n}\n\nexport function calculateResizePreview(\n resizeData: ResizeData,\n direction: 'horizontal' | 'vertical',\n delta: number,\n cells: CellData[],\n rows: number,\n columns: number,\n): { rowSpan: number; colSpan: number } | null {\n const cell = cells.find((c) =>\n CellIdUtils.equals(c.cellId, resizeData.cellId),\n );\n if (!cell) return null;\n\n if (direction === 'horizontal') {\n // Calculate the desired span based on the delta\n const desiredColSpan = Math.max(1, resizeData.originalColSpan + delta);\n\n // Get the maximum allowed span\n const maxColSpan = getMaxColSpan(\n cell.cellId,\n cell.row,\n cell.col,\n cells,\n columns,\n );\n\n // Clamp to the maximum\n const newColSpan = Math.min(desiredColSpan, maxColSpan);\n\n return {\n rowSpan: resizeData.previewRowSpan,\n colSpan: newColSpan,\n };\n } else {\n // Calculate the desired span based on the delta\n const desiredRowSpan = Math.max(1, resizeData.originalRowSpan + delta);\n\n // Get the maximum allowed span\n const maxRowSpan = getMaxRowSpan(\n cell.cellId,\n cell.row,\n cell.col,\n cells,\n rows,\n );\n\n // Clamp to the maximum\n const newRowSpan = Math.min(desiredRowSpan, maxRowSpan);\n\n return {\n rowSpan: newRowSpan,\n colSpan: resizeData.previewColSpan,\n };\n }\n}","import {\n signalStoreFeature,\n withMethods,\n withState,\n patchState,\n} from '@ngrx/signals';\nimport { CellId, CellIdUtils, CellData } from '../../models';\nimport { calculateResizePreview, type ResizeData } from './utils/resize.utils';\n\nexport interface ResizeState {\n resizeData: ResizeData | null;\n}\n\nconst initialResizeState: ResizeState = {\n resizeData: null,\n};\n\n// Utility functions for resize preview computations\nexport const ResizePreviewUtils = {\n computePreviewCells(\n resizeData: ResizeData | null,\n cells: CellData[],\n ): { row: number; col: number }[] {\n if (!resizeData) return [];\n\n const cell = cells.find((cell) =>\n CellIdUtils.equals(cell.cellId, resizeData.cellId),\n );\n if (!cell) return [];\n\n const previewCells: { row: number; col: number }[] = [];\n for (let r = 0; r < resizeData.previewRowSpan; r++) {\n for (let c = 0; c < resizeData.previewColSpan; c++) {\n previewCells.push({\n row: cell.row + r,\n col: cell.col + c,\n });\n }\n }\n\n return previewCells;\n },\n\n computePreviewMap(previewCells: { row: number; col: number }[]): Set<CellId> {\n const map = new Set<CellId>();\n for (const cell of previewCells) {\n map.add(CellIdUtils.create(cell.row, cell.col));\n }\n return map;\n },\n};\n\nexport const withResize = () =>\n signalStoreFeature(\n withState<ResizeState>(initialResizeState),\n withMethods((store) => ({\n // Resize methods that need cross-feature dependencies\n _startResize(\n cellId: CellId,\n dependencies: {\n cells: CellData[];\n },\n ) {\n const cell = dependencies.cells.find((c) =>\n CellIdUtils.equals(c.cellId, cellId),\n );\n if (!cell) return;\n\n patchState(store, {\n resizeData: {\n cellId,\n originalRowSpan: cell.rowSpan,\n originalColSpan: cell.colSpan,\n previewRowSpan: cell.rowSpan,\n previewColSpan: cell.colSpan,\n },\n });\n },\n\n _updateResizePreview(\n direction: 'horizontal' | 'vertical',\n delta: number,\n dependencies: {\n cells: CellData[];\n rows: number;\n columns: number;\n },\n ) {\n const resizeData = store.resizeData();\n if (!resizeData) return;\n\n const newSpans = calculateResizePreview(\n resizeData,\n direction,\n delta,\n dependencies.cells,\n dependencies.rows,\n dependencies.columns,\n );\n\n if (newSpans) {\n patchState(store, {\n resizeData: {\n ...resizeData,\n previewRowSpan: newSpans.rowSpan,\n previewColSpan: newSpans.colSpan,\n },\n });\n }\n },\n\n _endResize(\n apply: boolean,\n dependencies: {\n updateWidgetSpan: (\n id: CellId,\n rowSpan: number,\n colSpan: number,\n ) => void;\n },\n ) {\n const resizeData = store.resizeData();\n if (!resizeData) return;\n\n if (\n apply &&\n (resizeData.previewRowSpan !== resizeData.originalRowSpan ||\n resizeData.previewColSpan !== resizeData.originalColSpan)\n ) {\n dependencies.updateWidgetSpan(\n resizeData.cellId,\n resizeData.previewRowSpan,\n resizeData.previewColSpan,\n );\n }\n\n patchState(store, { resizeData: null });\n },\n })),\n );\n","import {\r\n signalStore,\r\n withProps,\r\n withState,\r\n withComputed,\r\n withMethods,\r\n patchState,\r\n} from '@ngrx/signals';\r\nimport { DashboardService } from '../services/dashboard.service';\r\nimport { inject, computed } from '@angular/core';\r\nimport { calculateCollisionInfo } from './features/utils/collision.utils';\r\nimport {\r\n CellId,\r\n CellIdUtils,\r\n CellData,\r\n DragData,\r\n DashboardDataDto,\r\n WidgetIdUtils,\r\n} from '../models';\r\nimport { withGridConfig } from './features/grid-config.feature';\r\nimport { withWidgetManagement } from './features/widget-management.feature';\r\nimport { withDragDrop } from './features/drag-drop.feature';\r\nimport { withResize, ResizePreviewUtils } from './features/resize.feature';\r\n\r\ninterface DashboardState {\r\n dashboardId: string;\r\n}\r\n\r\nconst initialState: DashboardState = {\r\n dashboardId: '',\r\n};\r\n\r\nexport const DashboardStore = signalStore(\r\n withState(initialState),\r\n withProps(() => ({\r\n dashboardService: inject(DashboardService),\r\n })),\r\n withGridConfig(),\r\n withWidgetManagement(),\r\n withResize(),\r\n withDragDrop(),\r\n\r\n // Cross-feature computed properties (need access to multiple features)\r\n withComputed((store) => ({\r\n // Invalid zones (collision detection)\r\n invalidHighlightMap: computed(() => {\r\n const collisionInfo = calculateCollisionInfo(\r\n store.dragData(),\r\n store.hoveredDropZone(),\r\n store.cells(),\r\n store.rows(),\r\n store.columns()\r\n );\r\n\r\n return new Set(collisionInfo.invalidCells);\r\n }),\r\n\r\n // Check if placement would be valid (for drop validation)\r\n isValidPlacement: computed(() => {\r\n const collisionInfo = calculateCollisionInfo(\r\n store.dragData(),\r\n store.hoveredDropZone(),\r\n store.cells(),\r\n store.rows(),\r\n store.columns()\r\n );\r\n\r\n return !collisionInfo.hasCollisions && !collisionInfo.outOfBounds;\r\n }),\r\n })),\r\n\r\n // Cross-feature methods (need access to multiple features)\r\n withMethods((store) => ({\r\n // DROP HANDLING (delegate to drag-drop feature with dependency injection)\r\n handleDrop(\r\n dragData: DragData,\r\n targetPosition: { row: number; col: number }\r\n ): boolean {\r\n return store._handleDrop(dragData, targetPosition, {\r\n cells: store.cells(),\r\n rows: store.rows(),\r\n columns: store.columns(),\r\n dashboardService: store.dashboardService,\r\n createWidget: store.createWidget,\r\n updateWidgetPosition: store.updateWidgetPosition,\r\n });\r\n },\r\n\r\n // RESIZE METHODS (delegate to resize feature with dependency injection)\r\n startResize(cellId: CellId) {\r\n store._startResize(cellId, {\r\n cells: store.cells(),\r\n });\r\n },\r\n\r\n updateResizePreview(direction: 'horizontal' | 'vertical', delta: number) {\r\n store._updateResizePreview(direction, delta, {\r\n cells: store.cells(),\r\n rows: store.rows(),\r\n columns: store.columns(),\r\n });\r\n },\r\n\r\n endResize(apply: boolean) {\r\n store._endResize(apply, {\r\n updateWidgetSpan: (cellId: CellId, rowSpan: number, colSpan: number) => {\r\n // Adapter: find widget by cellId and update using widgetId\r\n const widget = store.cells().find(c => CellIdUtils.equals(c.cellId, cellId));\r\n if (widget) {\r\n store.updateWidgetSpan(widget.widgetId, rowSpan, colSpan);\r\n }\r\n }\r\n });\r\n },\r\n\r\n // EXPORT/IMPORT METHODS (need access to multiple features)\r\n exportDashboard(\r\n getCurrentWidgetStates?: () => Map<string, unknown>\r\n ): DashboardDataDto {\r\n // Get live widget states if callback provided, otherwise use stored states\r\n const liveWidgetStates =\r\n getCurrentWidgetStates?.() || new Map<string, unknown>();\r\n\r\n return {\r\n version: '1.0.0',\r\n dashboardId: store.dashboardId(),\r\n rows: store.rows(),\r\n columns: store.columns(),\r\n gutterSize: store.gutterSize(),\r\n cells: store.cells()\r\n .filter((cell) => cell.widgetFactory.widgetTypeid !== '__internal/unknown-widget')\r\n .map((cell) => {\r\n const cellIdString = CellIdUtils.toString(cell.cellId);\r\n const currentState = liveWidgetStates.get(cellIdString);\r\n\r\n return {\r\n row: cell.row,\r\n col: cell.col,\r\n rowSpan: cell.rowSpan,\r\n colSpan: cell.colSpan,\r\n flat: cell.flat,\r\n widgetTypeid: cell.widgetFactory.widgetTypeid,\r\n widgetState:\r\n currentState !== undefined ? currentState : cell.widgetState,\r\n };\r\n }),\r\n };\r\n },\r\n\r\n loadDashboard(data: DashboardDataDto): void {\r\n // Import full dashboard data with grid configuration\r\n const widgetsById: Record<string, CellData> = {};\r\n \r\n data.cells.forEach((cellData) => {\r\n const factory = store.dashboardService.getFactory(\r\n cellData.widgetTypeid\r\n );\r\n\r\n const widgetId = WidgetIdUtils.generate();\r\n const cell: CellData = {\r\n widgetId,\r\n cellId: CellIdUtils.create(cellData.row, cellData.col),\r\n row: cellData.row,\r\n col: cellData.col,\r\n rowSpan: cellData.rowSpan,\r\n colSpan: cellData.colSpan,\r\n flat: cellData.flat,\r\n widgetFactory: factory,\r\n widgetState: cellData.widgetState,\r\n };\r\n \r\n widgetsById[WidgetIdUtils.toString(widgetId)] = cell;\r\n });\r\n\r\n patchState(store, {\r\n dashboardId: data.dashboardId,\r\n rows: data.rows,\r\n columns: data.columns,\r\n gutterSize: data.gutterSize,\r\n widgetsById,\r\n });\r\n },\r\n\r\n // INITIALIZATION METHODS\r\n initializeFromDto(dashboardData: DashboardDataDto): void {\r\n // Inline the loadDashboard logic since it's defined later in the same methods block\r\n const widgetsById: Record<string, CellData> = {};\r\n \r\n dashboardData.cells.forEach((cellData) => {\r\n const factory = store.dashboardService.getFactory(\r\n cellData.widgetTypeid\r\n );\r\n\r\n const widgetId = WidgetIdUtils.generate();\r\n const cell: CellData = {\r\n widgetId,\r\n cellId: CellIdUtils.create(cellData.row, cellData.col),\r\n row: cellData.row,\r\n col: cellData.col,\r\n rowSpan: cellData.rowSpan,\r\n colSpan: cellData.colSpan,\r\n flat: cellData.flat,\r\n widgetFactory: factory,\r\n widgetState: cellData.widgetState,\r\n };\r\n \r\n widgetsById[WidgetIdUtils.toString(widgetId)] = cell;\r\n });\r\n\r\n patchState(store, {\r\n dashboardId: dashboardData.dashboardId,\r\n rows: dashboardData.rows,\r\n columns: dashboardData.columns,\r\n gutterSize: dashboardData.gutterSize,\r\n widgetsById,\r\n });\r\n },\r\n })),\r\n\r\n // Cross-feature computed properties that depend on resize + widget data (using utility functions)\r\n withComputed((store) => ({\r\n // Compute preview cells during resize using utility function\r\n resizePreviewCells: computed(() => {\r\n return ResizePreviewUtils.computePreviewCells(\r\n store.resizeData(),\r\n store.cells()\r\n );\r\n }),\r\n })),\r\n\r\n // Second computed block that depends on the first\r\n withComputed((store) => ({\r\n // Map for resize preview highlighting using utility function\r\n resizePreviewMap: computed(() => {\r\n return ResizePreviewUtils.computePreviewMap(store.resizePreviewCells());\r\n }),\r\n }))\r\n);\r\n","import { CellDisplayData } from '../../models/cell-dialog';\r\n\r\n/**\r\n * Abstract provider for cell settings dialogs.\r\n * Implement this to provide custom dialog solutions.\r\n */\r\nexport abstract class CellSettingsDialogProvider {\r\n /**\r\n * Open a settings dialog for the given cell.\r\n * Returns a promise that resolves to the new settings, or undefined if cancelled.\r\n */\r\n abstract openCellSettings(\r\n data: CellDisplayData\r\n ): Promise<CellDisplayData | undefined>;\r\n}","import { Component, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport {\r\n MAT_DIALOG_DATA,\r\n MatDialogRef,\r\n MatDialogModule,\r\n} from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { CellDisplayData } from '../../models/cell-dialog';\r\n\r\n@Component({\r\n selector: 'lib-cell-settings-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatRadioModule,\r\n ],\r\n template: `\r\n <h2 mat-dialog-title>Cell Display Settings</h2>\r\n <mat-dialog-content>\r\n <p class=\"cell-info\">Cell ID: <strong>{{ data.id }}</strong></p>\r\n \r\n <div class=\"radio-group\">\r\n <mat-radio-group [(ngModel)]=\"selectedMode\" name=\"displayMode\">\r\n <mat-radio-button value=\"normal\">\r\n <div class=\"radio-option\">\r\n <div class=\"option-title\">Normal</div>\r\n <div class=\"option-description\">Standard cell display with full content visibility</div>\r\n </div>\r\n </mat-radio-button>\r\n \r\n <mat-radio-button value=\"flat\">\r\n <div class=\"radio-option\">\r\n <div class=\"option-title\">Flat</div>\r\n <div class=\"option-description\">Simplified display with reduced visual emphasis</div>\r\n </div>\r\n </mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button (click)=\"onCancel()\">Cancel</button>\r\n <button \r\n mat-flat-button \r\n (click)=\"save()\"\r\n [disabled]=\"selectedMode === currentMode\">\r\n Apply\r\n </button>\r\n </mat-dialog-actions>\r\n `,\r\n styles: [\r\n `\r\n mat-dialog-content {\r\n display: block;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n padding-top: 0.5rem;\r\n }\r\n\r\n .cell-info {\r\n margin: 0 0 1.5rem 0;\r\n padding-bottom: 1rem;\r\n }\r\n\r\n .radio-group {\r\n width: 100%;\r\n }\r\n\r\n mat-radio-group {\r\n display: block;\r\n }\r\n\r\n mat-radio-button {\r\n width: 100%;\r\n display: block;\r\n margin-bottom: 1rem;\r\n }\r\n\r\n mat-radio-button:last-child {\r\n margin-bottom: 0;\r\n }\r\n\r\n .radio-option {\r\n margin-left: 0.75rem;\r\n padding: 0.25rem 0;\r\n }\r\n\r\n .option-title {\r\n display: block;\r\n margin-bottom: 0.25rem;\r\n }\r\n\r\n .option-description {\r\n display: block;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class CellSettingsDialogComponent {\r\n selectedMode: 'normal' | 'flat';\r\n currentMode: 'normal' | 'flat';\r\n\r\n data = inject(MAT_DIALOG_DATA) as CellDisplayData;\r\n private dialogRef = inject(MatDialogRef<CellSettingsDialogComponent>);\r\n\r\n constructor() {\r\n this.currentMode = this.data.flat ? 'flat' : 'normal';\r\n this.selectedMode = this.currentMode;\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n save(): void {\r\n const newData: CellDisplayData = {\r\n ...this.data,\r\n flat: this.selectedMode === 'flat'\r\n };\r\n this.dialogRef.close(newData);\r\n }\r\n}","import { Injectable, inject } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { CellDisplayData } from '../../models/cell-dialog';\r\nimport { CellSettingsDialogProvider } from './cell-settings-dialog.provider';\r\nimport { CellSettingsDialogComponent } from './cell-settings-dialog.component';\r\n\r\n/**\r\n * Default cell dialog provider that uses Material Design dialogs.\r\n * Provides a modern, accessible dialog experience for cell settings.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DefaultCellSettingsDialogProvider extends CellSettingsDialogProvider {\r\n private dialog = inject(MatDialog);\r\n\r\n async openCellSettings(\r\n data: CellDisplayData\r\n ): Promise<CellDisplayData | undefined> {\r\n const dialogRef = this.dialog.open(CellSettingsDialogComponent, {\r\n data,\r\n width: '400px',\r\n maxWidth: '90vw',\r\n disableClose: false,\r\n autoFocus: false,\r\n });\r\n\r\n const result = await firstValueFrom(dialogRef.afterClosed());\r\n return result;\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { CellSettingsDialogProvider } from './cell-settings-dialog.provider';\r\nimport { DefaultCellSettingsDialogProvider } from './default-cell-settings-dialog.provider';\r\n\r\n/**\r\n * Injection token for the cell dialog provider.\r\n * Use this to provide your custom dialog implementation.\r\n *\r\n * @example\r\n * ```typescript\r\n * providers: [\r\n * { provide: CELL_SETTINGS_DIALOG_PROVIDER, useClass: MyCellSettingsDialogProvider }\r\n * ]\r\n * ```\r\n */\r\nexport const CELL_SETTINGS_DIALOG_PROVIDER =\r\n new InjectionToken<CellSettingsDialogProvider>('CellSettingsDialogProvider', {\r\n providedIn: 'root',\r\n factory: () => new DefaultCellSettingsDialogProvider(),\r\n });","import { Injectable, signal } from '@angular/core';\n\nexport type CellContextMenuItem =\n | {\n label: string;\n icon?: string; // Material icon name (e.g., 'edit', 'settings', 'delete')\n action: () => void;\n disabled?: boolean;\n divider?: false;\n }\n | {\n divider: true;\n label?: never;\n icon?: never;\n action?: never;\n disabled?: never;\n };\n\n@Injectable()\nexport class CellContextMenuService {\n #activeMenu = signal<{\n x: number;\n y: number;\n items: CellContextMenuItem[];\n } | null>(null);\n\n activeMenu = this.#activeMenu.asReadonly();\n\n show(x: number, y: number, items: CellContextMenuItem[]) {\n this.#activeMenu.set({ x, y, items });\n }\n\n hide() {\n this.#activeMenu.set(null);\n }\n}\n","// cell.component.ts\r\nimport {\r\n Component,\r\n ComponentRef,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n ViewContainerRef,\r\n output,\r\n ElementRef,\r\n viewChild,\r\n Renderer2,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\n// RxJS removed: Using native DOM events with Renderer2 for performance\r\n// - Context menu uses template event binding (element-specific)\r\n// - Resize uses conditional document listeners (only when actively resizing)\r\n// - Eliminates N*mousemove performance issue with @HostListener approach\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n CellId,\r\n CellIdUtils,\r\n WidgetId,\r\n DragData,\r\n WidgetFactory,\r\n Widget,\r\n} from '../models';\r\nimport { DashboardStore } from '../store/dashboard-store';\r\nimport { CellDisplayData } from '../models';\r\nimport { CELL_SETTINGS_DIALOG_PROVIDER } from '../providers/cell-settings-dialog';\r\nimport { CellContextMenuService, CellContextMenuItem } from './cell-context-menu.service';\r\n\r\n@Component({\r\n selector: 'lib-cell',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './cell.component.html',\r\n styleUrl: './cell.component.scss',\r\n host: {\r\n '[style.grid-row]': 'gridRowStyle()',\r\n '[style.grid-column]': 'gridColumnStyle()',\r\n '[class.is-dragging]': 'isDragging()',\r\n '[class.drag-active]': 'isDragActive()',\r\n '[class.flat]': 'flat() === true',\r\n },\r\n})\r\nexport class CellComponent {\r\n widgetId = input.required<WidgetId>(); // Unique widget instance identifier\r\n cellId = input.required<CellId>(); // Current grid position\r\n widgetFactory = input<WidgetFactory | undefined>(undefined);\r\n widgetState = input<unknown | undefined>(undefined);\r\n isEditMode = input<boolean>(false);\r\n flat = input<boolean | undefined>(undefined);\r\n\r\n row = model.required<number>();\r\n column = model.required<number>();\r\n rowSpan = input<number>(1);\r\n colSpan = input<number>(1);\r\n draggable = input<boolean>(false);\r\n\r\n dragStart = output<DragData>();\r\n dragEnd = output<void>();\r\n\r\n edit = output<WidgetId>();\r\n delete = output<WidgetId>();\r\n settings = output<{ id: WidgetId; flat: boolean }>();\r\n resizeStart = output<{ cellId: CellId; direction: 'horizontal' | 'vertical' }>();\r\n resizeMove = output<{\r\n cellId: CellId;\r\n direction: 'horizontal' | 'vertical';\r\n delta: number;\r\n }>();\r\n resizeEnd = output<{ cellId: CellId; apply: boolean }>();\r\n\r\n private container = viewChild.required<ElementRef, ViewContainerRef>(\r\n 'container',\r\n { read: ViewContainerRef }\r\n );\r\n\r\n readonly #store = inject(DashboardStore);\r\n readonly #dialogProvider = inject(CELL_SETTINGS_DIALOG_PROVIDER);\r\n readonly #destroyRef = inject(DestroyRef);\r\n readonly #renderer = inject(Renderer2);\r\n readonly #contextMenuService = inject(CellContextMenuService, {\r\n optional: true,\r\n });\r\n\r\n #widgetRef?: ComponentRef<Widget>;\r\n \r\n // Document event listeners cleanup function\r\n // Performance: Only created when actively resizing, not for every cell\r\n #documentListeners?: () => void;\r\n\r\n isDragging = signal(false);\r\n\r\n readonly gridRowStyle = computed(\r\n () => `${this.row()} / span ${this.rowSpan()}`\r\n );\r\n readonly gridColumnStyle = computed(\r\n () => `${this.column()} / span ${this.colSpan()}`\r\n );\r\n\r\n isResizing = computed(() => {\r\n const resizeData = this.#store.resizeData();\r\n return resizeData\r\n ? CellIdUtils.equals(resizeData.cellId, this.cellId())\r\n : false;\r\n });\r\n\r\n isDragActive = computed(() => !!this.#store.dragData());\r\n\r\n resizeData = this.#store.resizeData;\r\n gridCellDimensions = this.#store.gridCellDimensions;\r\n private resizeDirection = signal<'horizontal' | 'vertical' | null>(null);\r\n private resizeStartPos = signal({ x: 0, y: 0 });\r\n\r\n constructor() {\r\n // widget creation - triggers when factory or state changes\r\n effect(() => {\r\n const factory = this.widgetFactory();\r\n const state = this.widgetState();\r\n const container = this.container();\r\n\r\n if (factory && container) {\r\n // Clean up previous widget\r\n this.#widgetRef?.destroy();\r\n\r\n // Create new widget\r\n container.clear();\r\n try {\r\n this.#widgetRef = factory.createInstance(container, state);\r\n } catch (error) {\r\n console.error('Failed to create widget:', error);\r\n this.#widgetRef = undefined;\r\n }\r\n }\r\n });\r\n\r\n // Auto cleanup on destroy\r\n this.#destroyRef.onDestroy(() => {\r\n this.#widgetRef?.destroy();\r\n this.#widgetRef = undefined;\r\n // Clean up any active document listeners\r\n this.#cleanupDocumentListeners();\r\n });\r\n }\r\n\r\n /**\r\n * Setup document-level event listeners for resize operations\r\n * Performance: Only creates listeners when actively resizing (not for every cell)\r\n * Angular-idiomatic: Uses Renderer2 for dynamic listener management\r\n */\r\n private setupDocumentListeners(): void {\r\n // Clean up any existing listeners first\r\n this.#cleanupDocumentListeners();\r\n\r\n // Create document listeners with proper cleanup functions\r\n const unlistenMove = this.#renderer.listen(\r\n 'document',\r\n 'mousemove',\r\n this.handleResizeMove.bind(this)\r\n );\r\n const unlistenUp = this.#renderer.listen(\r\n 'document',\r\n 'mouseup',\r\n this.handleResizeEnd.bind(this)\r\n );\r\n\r\n // Store cleanup function for later use\r\n this.#documentListeners = () => {\r\n unlistenMove();\r\n unlistenUp();\r\n };\r\n }\r\n\r\n /**\r\n * Clean up document-level event listeners\r\n * Called on resize end and component destruction\r\n */\r\n #cleanupDocumentListeners(): void {\r\n if (this.#documentListeners) {\r\n this.#documentListeners();\r\n this.#documentListeners = undefined;\r\n }\r\n }\r\n\r\n setPosition(row: number, column: number): void {\r\n this.row.set(row);\r\n this.column.set(column);\r\n }\r\n\r\n onDragStart(event: DragEvent): void {\r\n if (!event.dataTransfer) return;\r\n event.dataTransfer.effectAllowed = 'move';\r\n\r\n const cell = {\r\n cellId: this.cellId(),\r\n widgetId: this.widgetId(),\r\n row: this.row(),\r\n col: this.column(),\r\n rowSpan: this.rowSpan(),\r\n colSpan: this.colSpan(),\r\n };\r\n\r\n const content: DragData = { kind: 'cell', content: cell };\r\n this.dragStart.emit(content);\r\n this.isDragging.set(true);\r\n }\r\n\r\n onDragEnd(/*_: DragEvent*/): void {\r\n this.isDragging.set(false);\r\n this.dragEnd.emit();\r\n }\r\n\r\n /**\r\n * Handle context menu events (called from template)\r\n * Performance: Element-specific event binding, not document-level\r\n * Angular-idiomatic: Template event binding instead of fromEvent\r\n */\r\n onContextMenu(event: MouseEvent): void {\r\n if (!this.isEditMode() || !this.#contextMenuService) return;\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const items: CellContextMenuItem[] = [\r\n {\r\n label: 'Edit Widget',\r\n icon: 'edit',\r\n action: () => this.onEdit(),\r\n disabled: !this.canEdit(),\r\n },\r\n {\r\n label: 'Settings',\r\n icon: 'settings',\r\n action: () => this.onSettings(),\r\n },\r\n { divider: true },\r\n {\r\n label: 'Delete',\r\n icon: 'delete',\r\n action: () => this.onDelete(),\r\n },\r\n ];\r\n\r\n // Position menu at exact mouse coordinates\r\n this.#contextMenuService.show(event.clientX, event.clientY, items);\r\n }\r\n\r\n canEdit(): boolean {\r\n if (this.#widgetRef?.instance?.dashboardEditState) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n onEdit(): void {\r\n this.edit.emit(this.widgetId());\r\n\r\n // Call the widget's edit dialog method if it exists\r\n if (this.#widgetRef?.instance?.dashboardEditState) {\r\n this.#widgetRef.instance.dashboardEditState();\r\n }\r\n }\r\n\r\n onDelete(): void {\r\n this.delete.emit(this.widgetId());\r\n }\r\n\r\n async onSettings(): Promise<void> {\r\n const currentSettings: CellDisplayData = {\r\n id: CellIdUtils.toString(this.cellId()), // Use cellId for display position\r\n flat: this.flat(),\r\n };\r\n\r\n try {\r\n const result = await this.#dialogProvider.openCellSettings(\r\n currentSettings\r\n );\r\n\r\n if (result) {\r\n this.settings.emit({\r\n id: this.widgetId(),\r\n flat: result.flat ?? false,\r\n });\r\n }\r\n } catch (error) {\r\n console.error('Error opening cell settings dialog:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Start resize operation and setup document listeners\r\n * Performance: Only THIS cell creates document listeners when actively resizing\r\n * RxJS-free: Uses Renderer2 for dynamic listener management\r\n */\r\n onResizeStart(event: MouseEvent, direction: 'horizontal' | 'vertical'): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n this.resizeDirection.set(direction);\r\n this.resizeStartPos.set({ x: event.clientX, y: event.clientY });\r\n this.resizeStart.emit({ cellId: this.cellId(), direction });\r\n\r\n // Setup document listeners only when actively resizing\r\n this.setupDocumentListeners();\r\n\r\n const cursorClass =\r\n direction === 'horizontal' ? 'cursor-col-resize' : 'cursor-row-resize';\r\n this.#renderer.addClass(document.body, cursorClass);\r\n }\r\n\r\n /**\r\n * Handle resize move events (called from document listener)\r\n * Performance: Only called for the actively resizing cell\r\n * Bound method: Maintains component context without arrow functions\r\n */\r\n private handleResizeMove(event: MouseEvent): void {\r\n const direction = this.resizeDirection();\r\n if (!direction) return;\r\n\r\n const startPos = this.resizeStartPos();\r\n const cellSize = this.gridCellDimensions();\r\n\r\n if (direction === 'horizontal') {\r\n const deltaX = event.clientX - startPos.x;\r\n const deltaSpan = Math.round(deltaX / cellSize.width);\r\n this.resizeMove.emit({ cellId: this.cellId(), direction, delta: deltaSpan });\r\n } else {\r\n const deltaY = event.clientY - startPos.y;\r\n const deltaSpan = Math.round(deltaY / cellSize.height);\r\n this.resizeMove.emit({ cellId: this.cellId(), direction, delta: deltaSpan });\r\n }\r\n }\r\n\r\n /**\r\n * Handle resize end events (called from document listener)\r\n * Performance: Cleans up document listeners immediately after resize\r\n * State cleanup: Resets resize direction to stop further event processing\r\n */\r\n private handleResizeEnd(): void {\r\n this.#renderer.removeClass(document.body, 'cursor-col-resize');\r\n this.#renderer.removeClass(document.body, 'cursor-row-resize');\r\n\r\n // Clean up document listeners immediately\r\n this.#cleanupDocumentListeners();\r\n\r\n this.resizeEnd.emit({ cellId: this.cellId(), apply: true });\r\n this.resizeDirection.set(null);\r\n }\r\n\r\n /**\r\n * Get the current widget state by calling dashboardGetState() on the widget instance.\r\n * Used during dashboard export to get live widget state instead of stale stored state.\r\n */\r\n getCurrentWidgetState(): unknown | undefined {\r\n if (!this.#widgetRef?.instance) {\r\n return undefined;\r\n }\r\n\r\n // Call dashboardGetState() if the widget implements it\r\n if (typeof this.#widgetRef.instance.dashboardGetState === 'function') {\r\n return this.#widgetRef.instance.dashboardGetState();\r\n }\r\n\r\n // Fall back to stored state if widget doesn't implement dashboardGetState\r\n return this.widgetState();\r\n }\r\n}\r\n","<!-- cell.component.html -->\r\n<div\r\n class=\"cell\"\r\n [class.is-resizing]=\"isResizing()\"\r\n [class.flat]=\"flat() === true\"\r\n [draggable]=\"draggable()\"\r\n (dragstart)=\"onDragStart($event)\"\r\n (dragend)=\"onDragEnd()\"\r\n (contextmenu)=\"onContextMenu($event)\"\r\n>\r\n <div class=\"content-area\">\r\n <ng-template #container></ng-template>\r\n </div>\r\n @if (isEditMode() && !isDragging()) {\r\n <!-- Right resize handle -->\r\n <div\r\n class=\"resize-handle resize-handle--right\"\r\n (mousedown)=\"onResizeStart($event, 'horizontal')\"\r\n >\r\n <div class=\"resize-handle-line\"></div>\r\n </div>\r\n <!-- Bottom resize handle -->\r\n <div\r\n class=\"resize-handle resize-handle--bottom\"\r\n (mousedown)=\"onResizeStart($event, 'vertical')\"\r\n >\r\n <div class=\"resize-handle-line\"></div>\r\n </div>\r\n }\r\n</div>\r\n\r\n@if (isResizing()) {\r\n<div class=\"resize-preview\">\r\n {{ resizeData()?.previewColSpan ?? colSpan() }} ×\r\n {{ resizeData()?.previewRowSpan ?? rowSpan() }}\r\n</div>\r\n}\r\n","import { Component, computed, effect, inject, input, viewChildren, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CellComponent } from '../cell/cell.component';\r\nimport { DashboardStore } from '../store/dashboard-store';\r\nimport { CellIdUtils } from '../models';\r\n\r\n@Component({\r\n selector: 'ngx-dashboard-viewer',\r\n standalone: true,\r\n imports: [CellComponent, CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './dashboard-viewer.component.html',\r\n styleUrl: './dashboard-viewer.component.scss',\r\n host: {\r\n '[style.--rows]': 'rows()',\r\n '[style.--columns]': 'columns()',\r\n '[style.--gutter-size]': 'gutterSize()',\r\n '[style.--gutters]': 'gutters()',\r\n },\r\n})\r\nexport class DashboardViewerComponent {\r\n #store = inject(DashboardStore);\r\n cellComponents = viewChildren(CellComponent);\r\n\r\n rows = input.required<number>();\r\n columns = input.required<number>();\r\n gutterSize = input<string>('1em');\r\n gutters = computed(() => this.columns() + 1);\r\n\r\n // store signals - read-only\r\n cells = this.#store.cells;\r\n\r\n constructor() {\r\n // Sync grid configuration with store when inputs change\r\n effect(() => {\r\n this.#store.setGridConfig({\r\n rows: this.rows(),\r\n columns: this.columns(),\r\n gutterSize: this.gutterSize(),\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get current widget states from all cell components.\r\n * Used during dashboard export to get live widget states.\r\n */\r\n getCurrentWidgetStates(): Map<string, unknown> {\r\n const stateMap = new Map<string, unknown>();\r\n \r\n const cells = this.cellComponents();\r\n for (const cell of cells) {\r\n const cellId = cell.cellId();\r\n const currentState = cell.getCurrentWidgetState();\r\n if (currentState !== undefined) {\r\n stateMap.set(CellIdUtils.toString(cellId), currentState);\r\n }\r\n }\r\n \r\n return stateMap;\r\n }\r\n\r\n /**\r\n * Export dashboard with live widget states from current component instances.\r\n * This ensures the most up-to-date widget states are captured.\r\n */\r\n exportDashboard() {\r\n return this.#store.exportDashboard(() => this.getCurrentWidgetStates());\r\n }\r\n}\r\n","<!-- Dashboard viewer - read-only grid -->\r\n<div class=\"grid top-grid\">\r\n @for (cell of cells(); track cell.widgetId) {\r\n <lib-cell\r\n class=\"grid-cell\"\r\n [widgetId]=\"cell.widgetId\"\r\n [cellId]=\"cell.cellId\"\r\n [isEditMode]=\"false\"\r\n [draggable]=\"false\"\r\n [row]=\"cell.row\"\r\n [column]=\"cell.col\"\r\n [rowSpan]=\"cell.rowSpan\"\r\n [colSpan]=\"cell.colSpan\"\r\n [flat]=\"cell.flat\"\r\n [widgetFactory]=\"cell.widgetFactory\"\r\n [widgetState]=\"cell.widgetState\"\r\n >\r\n </lib-cell>\r\n }\r\n</div>\r\n","import { Component, viewChild, inject, ChangeDetectionStrategy, effect, computed } from '@angular/core';\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatButtonModule } from '@angular/material/button';\nimport {\n CellContextMenuService,\n CellContextMenuItem,\n} from './cell-context-menu.service';\n\n@Component({\n selector: 'lib-cell-context-menu',\n standalone: true,\n imports: [MatMenuModule, MatIconModule, MatDividerModule, MatButtonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <!-- Hidden trigger for menu positioned at exact mouse coordinates\n \n IMPORTANT: Angular Material applies its own positioning logic to menus,\n which by default offsets the menu from the trigger element to avoid overlap.\n To achieve precise positioning at mouse coordinates, we use these workarounds:\n \n 1. The trigger container is 1x1px (not 0x0) because Material needs a physical\n element to calculate position against. Zero-sized elements cause unpredictable\n positioning.\n \n 2. We use opacity:0 instead of visibility:hidden to keep the element in the\n layout flow while making it invisible.\n \n 3. The button itself is styled to 1x1px with no padding to serve as a precise\n anchor point for the menu.\n \n 4. The mat-menu uses [overlapTrigger]=\"true\" to allow the menu to appear\n directly at the trigger position rather than offset from it.\n \n This approach ensures the menu appears at the exact mouse coordinates passed\n from the cell component's right-click handler.\n -->\n <div \n style=\"position: fixed; width: 1px; height: 1px; opacity: 0; pointer-events: none;\"\n [style]=\"menuPosition()\">\n <button\n mat-button\n #menuTrigger=\"matMenuTrigger\"\n [matMenuTriggerFor]=\"contextMenu\"\n style=\"width: 1px; height: 1px; padding: 0; min-width: 0; line-height: 0;\">\n </button>\n </div>\n\n <!-- Context menu -->\n <mat-menu #contextMenu=\"matMenu\" [overlapTrigger]=\"true\">\n @for (item of menuItems(); track $index) {\n @if (item.divider) {\n <mat-divider></mat-divider>\n } @else {\n <button \n mat-menu-item \n (click)=\"executeAction(item)\" \n [disabled]=\"item.disabled\">\n @if (item.icon) {\n <mat-icon>{{ item.icon }}</mat-icon>\n }\n <span>{{ item.label }}</span>\n </button>\n }\n }\n </mat-menu>\n `,\n styles: [`\n :host {\n display: contents;\n }\n `]\n})\nexport class CellContextMenuComponent {\n menuTrigger = viewChild.required('menuTrigger', { read: MatMenuTrigger });\n \n menuService = inject(CellContextMenuService);\n \n menuPosition = computed(() => {\n const menu = this.menuService.activeMenu();\n return menu ? { left: `${menu.x}px`, top: `${menu.y}px` } : { left: '0px', top: '0px' };\n });\n \n menuItems = computed(() => {\n const menu = this.menuService.activeMenu();\n return menu?.items || [];\n });\n \n constructor() {\n effect(() => {\n const menu = this.menuService.activeMenu();\n if (menu) {\n // Use queueMicrotask to ensure the view is fully initialized\n // This fixes the issue where the menu disappears on first right-click\n queueMicrotask(() => {\n const trigger = this.menuTrigger();\n if (trigger) {\n // Close any existing menu first\n if (trigger.menuOpen) {\n trigger.closeMenu();\n }\n // Open menu - position is handled by signal\n trigger.openMenu();\n }\n });\n } else {\n const trigger = this.menuTrigger();\n if (trigger) {\n trigger.closeMenu();\n }\n }\n });\n \n // Hide service menu when Material menu closes\n effect(() => {\n const trigger = this.menuTrigger();\n if (trigger) {\n trigger.menuClosed.subscribe(() => {\n if (this.menuService.activeMenu()) {\n this.menuService.hide();\n }\n });\n }\n });\n }\n \n executeAction(item: CellContextMenuItem) {\n if (!item.divider && item.action) {\n item.action();\n this.menuService.hide();\n }\n }\n}","// drop-zone.component.ts\r\nimport {\r\n Component,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n computed,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DashboardStore } from '../store/dashboard-store';\r\nimport { DragData } from '../models';\r\n\r\n@Component({\r\n selector: 'lib-drop-zone',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './drop-zone.component.html',\r\n styleUrl: './drop-zone.component.scss',\r\n})\r\nexport class DropZoneComponent {\r\n // Required inputs\r\n row = input.required<number>();\r\n col = input.required<number>();\r\n index = input.required<number>();\r\n\r\n // Optional inputs with defaults\r\n highlight = input(false);\r\n highlightInvalid = input(false);\r\n highlightResize = input(false);\r\n editMode = input(false);\r\n\r\n // Outputs\r\n dragEnter = output<{ row: number; col: number }>();\r\n dragExit = output<void>();\r\n dragOver = output<{ row: number; col: number }>();\r\n dragDrop = output<{\r\n data: DragData;\r\n target: { row: number; col: number };\r\n }>();\r\n\r\n // Computed properties\r\n dropZoneId = computed(() => `drop-zone-${this.row()}-${this.col()}`);\r\n\r\n dropData = computed(() => ({\r\n row: this.row(),\r\n col: this.col(),\r\n }));\r\n\r\n // Abstract drag state from store\r\n dragData = computed(() => this.#store.dragData());\r\n \r\n // Computed drop effect based on drag data and validity\r\n dropEffect = computed(() => {\r\n const data = this.dragData();\r\n if (!data || this.highlightInvalid()) {\r\n return 'none';\r\n }\r\n return data.kind === 'cell' ? 'move' : 'copy';\r\n });\r\n\r\n readonly #store = inject(DashboardStore);\r\n readonly #elementRef = inject(ElementRef);\r\n\r\n get nativeElement(): HTMLElement {\r\n return this.#elementRef.nativeElement;\r\n }\r\n\r\n onDragEnter(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.dragEnter.emit({ row: this.row(), col: this.col() });\r\n }\r\n\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (event.dataTransfer && this.dragData()) {\r\n event.dataTransfer.dropEffect = this.dropEffect();\r\n }\r\n\r\n this.dragOver.emit({ row: this.row(), col: this.col() });\r\n }\r\n\r\n onDragLeave(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // Only emit if actually leaving the element (not entering a child)\r\n if (this.#isLeavingElement(event)) {\r\n this.dragExit.emit();\r\n }\r\n }\r\n\r\n #isLeavingElement(event: DragEvent): boolean {\r\n const rect = this.#elementRef.nativeElement.getBoundingClientRect();\r\n return (\r\n event.clientX <= rect.left ||\r\n event.clientX >= rect.right ||\r\n event.clientY <= rect.top ||\r\n event.clientY >= rect.bottom\r\n );\r\n }\r\n\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (!event.dataTransfer) return;\r\n\r\n const data = this.dragData();\r\n if (data) {\r\n this.dragDrop.emit({\r\n data,\r\n target: { row: this.row(), col: this.col() },\r\n });\r\n }\r\n }\r\n}\r\n","<!-- drop-zone.component.html -->\r\n<div\r\n class=\"drop-zone\"\r\n [class.drop-zone--highlight]=\"highlight() && !highlightInvalid()\"\r\n [class.drop-zone--invalid]=\"highlightInvalid()\"\r\n [class.drop-zone--resize]=\"highlightResize()\"\r\n [style.grid-row]=\"row()\"\r\n [style.grid-column]=\"col()\"\r\n (dragenter)=\"onDragEnter($event)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n>\r\n @if (editMode()) {\r\n <div class=\"edit-mode-cell-number\">\r\n {{ index() }}<br />\r\n {{ row() }},{{ col() }}\r\n </div>\r\n }\r\n</div>\r\n","// dashboard-editor.component.ts\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n viewChild,\n viewChildren,\n afterNextRender,\n} from '@angular/core';\nimport { CellComponent } from '../cell/cell.component';\nimport { CellContextMenuComponent } from '../cell/cell-context-menu.component';\nimport { CellContextMenuService } from '../cell/cell-context-menu.service';\nimport { DropZoneComponent } from '../drop-zone/drop-zone.component';\nimport { CellId, CellIdUtils, WidgetId, DragData, CellData } from '../models';\nimport { DashboardStore } from '../store/dashboard-store';\n\n@Component({\n selector: 'ngx-dashboard-editor',\n standalone: true,\n imports: [\n CellComponent,\n CommonModule,\n DropZoneComponent,\n CellContextMenuComponent,\n ],\n providers: [\n CellContextMenuService,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dashboard-editor.component.html',\n styleUrl: './dashboard-editor.component.scss',\n host: {\n '[style.--rows]': 'rows()',\n '[style.--columns]': 'columns()',\n '[style.--gutter-size]': 'gutterSize()',\n '[style.--gutters]': 'gutters()',\n '[class.is-edit-mode]': 'true', // Always in edit mode\n },\n})\nexport class DashboardEditorComponent {\n bottomGridRef = viewChild.required<ElementRef<HTMLDivElement>>('bottomGrid');\n dropZones = viewChildren(DropZoneComponent);\n cellComponents = viewChildren(CellComponent);\n\n #store = inject(DashboardStore);\n #destroyRef = inject(DestroyRef);\n #resizeObserver?: ResizeObserver;\n\n rows = input.required<number>();\n columns = input.required<number>();\n gutterSize = input<string>('1em');\n gutters = computed(() => this.columns() + 1);\n\n // store signals\n cells = this.#store.cells;\n highlightedZones = this.#store.highlightedZones;\n highlightMap = this.#store.highlightMap;\n invalidHighlightMap = this.#store.invalidHighlightMap;\n hoveredDropZone = this.#store.hoveredDropZone;\n resizePreviewMap = this.#store.resizePreviewMap;\n\n // Generate all possible cell positions for the grid\n dropzonePositions = computed(() => {\n const positions = [];\n for (let row = 1; row <= this.rows(); row++) {\n for (let col = 1; col <= this.columns(); col++) {\n positions.push({\n row,\n col,\n id: `dropzone-${row}-${col}`,\n index: (row - 1) * this.columns() + col,\n });\n }\n }\n return positions;\n });\n\n // Helper method for template\n createCellId(row: number, col: number): CellId {\n return CellIdUtils.create(row, col);\n }\n\n constructor() {\n // Sync grid configuration with store when inputs change\n effect(() => {\n this.#store.setGridConfig({\n rows: this.rows(),\n columns: this.columns(),\n gutterSize: this.gutterSize(),\n });\n });\n\n // Observe grid size after rendering\n afterNextRender(() => {\n this.#observeGridSize();\n });\n\n // Always set edit mode to true\n effect(() => {\n this.#store.setEditMode(true);\n });\n }\n\n #observeGridSize(): void {\n const gridEl = this.bottomGridRef()?.nativeElement;\n if (!gridEl || this.#resizeObserver) return;\n\n this.#resizeObserver = new ResizeObserver(() => {\n const dropZonesList = this.dropZones();\n const firstDropZone = dropZonesList[0];\n if (!firstDropZone) return;\n const el: HTMLElement = firstDropZone.nativeElement;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n\n const width = rect.width;\n const height = rect.height;\n\n this.#store.setGridCellDimensions(width, height);\n });\n\n this.#resizeObserver.observe(gridEl);\n\n // Register cleanup with DestroyRef for automatic memory management\n this.#destroyRef.onDestroy(() => {\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = undefined;\n });\n }\n\n // Pure delegation methods - no business logic in component\n addWidget = (cellData: CellData) => this.#store.addWidget(cellData);\n\n updateCellPosition = (id: WidgetId, row: number, column: number) =>\n this.#store.updateWidgetPosition(id, row, column);\n\n updateCellSpan = (id: WidgetId, colSpan: number, rowSpan: number) =>\n this.#store.updateWidgetSpan(id, rowSpan, colSpan);\n\n updateCellSettings = (id: WidgetId, flat: boolean) =>\n this.#store.updateCellSettings(id, flat);\n\n // Pure delegation - drag and drop event handlers\n onDragOver = (event: { row: number; col: number }) =>\n this.#store.setHoveredDropZone(event);\n\n onDragEnter = (event: { row: number; col: number }) => this.onDragOver(event);\n\n onDragExit = () => this.#store.setHoveredDropZone(null);\n\n dragEnd = () => this.#store.endDrag();\n\n // Pure delegation - cell event handlers\n onCellDelete = (id: WidgetId) => this.#store.removeWidget(id);\n\n onCellSettings = (event: { id: WidgetId; flat: boolean }) =>\n this.updateCellSettings(event.id, event.flat);\n\n onCellResize = (event: { id: WidgetId; rowSpan: number; colSpan: number }) =>\n this.updateCellSpan(event.id, event.colSpan, event.rowSpan);\n\n // Handle drag events from cell component\n onCellDragStart = (dragData: DragData) => this.#store.startDrag(dragData);\n\n // Handle resize events from cell component\n onCellResizeStart = (event: {\n cellId: CellId;\n direction: 'horizontal' | 'vertical';\n }) => this.#store.startResize(event.cellId);\n\n onCellResizeMove = (event: {\n cellId: CellId;\n direction: 'horizontal' | 'vertical';\n delta: number;\n }) => this.#store.updateResizePreview(event.direction, event.delta);\n\n onCellResizeEnd = (event: { cellId: CellId; apply: boolean }) =>\n this.#store.endResize(event.apply);\n\n // Handle drop events by delegating to store's business logic\n onDragDrop(event: { data: DragData; target: { row: number; col: number } }) {\n this.#store.handleDrop(event.data, event.target);\n // Note: Store handles all validation and error handling internally\n }\n\n /**\n * Get current widget states from all cell components.\n * Used during dashboard export to get live widget states.\n */\n getCurrentWidgetStates(): Map<string, unknown> {\n const stateMap = new Map<string, unknown>();\n \n const cells = this.cellComponents();\n for (const cell of cells) {\n const cellId = cell.cellId();\n const currentState = cell.getCurrentWidgetState();\n if (currentState !== undefined) {\n stateMap.set(CellIdUtils.toString(cellId), currentState);\n }\n }\n \n return stateMap;\n }\n\n /**\n * Export dashboard with live widget states from current component instances.\n * This ensures the most up-to-date widget states are captured.\n */\n exportDashboard() {\n return this.#store.exportDashboard(() => this.getCurrentWidgetStates());\n }\n}\n","<!-- dashboard-editor.component.html -->\n<div class=\"grid-container\">\n <!-- Bottom grid with drop zones -->\n <div class=\"grid\" id=\"bottom-grid\" #bottomGrid>\n @for (position of dropzonePositions(); track position.id) {\n <lib-drop-zone\n class=\"drop-zone\"\n [row]=\"position.row\"\n [col]=\"position.col\"\n [index]=\"position.index\"\n [highlight]=\"highlightMap().has(createCellId(position.row, position.col))\"\n [highlightInvalid]=\"\n invalidHighlightMap().has(createCellId(position.row, position.col))\n \"\n [highlightResize]=\"\n resizePreviewMap().has(createCellId(position.row, position.col))\n \"\n [editMode]=\"true\"\n (dragEnter)=\"onDragEnter($event)\"\n (dragExit)=\"onDragExit()\"\n (dragOver)=\"onDragOver($event)\"\n (dragDrop)=\"onDragDrop($event)\"\n ></lib-drop-zone>\n }\n </div>\n\n <!-- Top grid with interactive cells -->\n <div class=\"grid\" id=\"top-grid\">\n @for (cell of cells(); track cell.widgetId) {\n <lib-cell\n class=\"grid-cell\"\n [widgetId]=\"cell.widgetId\"\n [cellId]=\"cell.cellId\"\n [isEditMode]=\"true\"\n [draggable]=\"true\"\n [row]=\"cell.row\"\n [column]=\"cell.col\"\n [rowSpan]=\"cell.rowSpan\"\n [colSpan]=\"cell.colSpan\"\n [flat]=\"cell.flat\"\n [widgetFactory]=\"cell.widgetFactory\"\n [widgetState]=\"cell.widgetState\"\n (dragStart)=\"onCellDragStart($event)\"\n (dragEnd)=\"dragEnd()\"\n (delete)=\"onCellDelete($event)\"\n (settings)=\"onCellSettings($event)\"\n (resizeStart)=\"onCellResizeStart($event)\"\n (resizeMove)=\"onCellResizeMove($event)\"\n (resizeEnd)=\"onCellResizeEnd($event)\"\n >\n </lib-cell>\n }\n </div>\n</div>\n\n<!-- Context menu -->\n<lib-cell-context-menu></lib-cell-context-menu>\n","// dashboard-bridge.service.ts\r\nimport { Injectable, computed, signal } from '@angular/core';\r\nimport { DashboardStore } from '../store/dashboard-store';\r\nimport { DragData } from '../models';\r\n\r\ninterface DashboardInstance {\r\n store: InstanceType<typeof DashboardStore>;\r\n dimensions: () => { width: number; height: number };\r\n}\r\n\r\n/**\r\n * Internal bridge service that coordinates between component-scoped DashboardStore instances\r\n * and standalone components like WidgetListComponent.\r\n * \r\n * This service is NOT part of the public API and should remain internal to the library.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class DashboardBridgeService {\r\n // Map of registered dashboard instances with their reactive dimensions\r\n private readonly dashboards = signal(new Map<string, DashboardInstance>());\r\n \r\n /**\r\n * Register a dashboard store instance using its dashboard ID\r\n */\r\n registerDashboard(store: InstanceType<typeof DashboardStore>): void {\r\n const dashboardId = store.dashboardId();\r\n \r\n // If dashboard ID is not set yet, we'll register later when it's available\r\n if (!dashboardId) {\r\n return;\r\n }\r\n \r\n this.dashboards.update(dashboards => {\r\n const newMap = new Map(dashboards);\r\n newMap.set(dashboardId, {\r\n store,\r\n dimensions: store.gridCellDimensions\r\n });\r\n return newMap;\r\n });\r\n }\r\n \r\n /**\r\n * Unregister a dashboard store instance\r\n */\r\n unregisterDashboard(store: InstanceType<typeof DashboardStore>): void {\r\n const dashboardId = store.dashboardId();\r\n if (!dashboardId) {\r\n return;\r\n }\r\n \r\n this.dashboards.update(dashboards => {\r\n const newMap = new Map(dashboards);\r\n newMap.delete(dashboardId);\r\n return newMap;\r\n });\r\n }\r\n \r\n /**\r\n * Get cell dimensions for a specific dashboard instance\r\n */\r\n getDashboardDimensions(dashboardId: string): { width: number; height: number } {\r\n const dashboard = this.dashboards().get(dashboardId);\r\n return dashboard?.dimensions() || { width: 100, height: 100 };\r\n }\r\n \r\n /**\r\n * Get all available dashboard dimensions (for widget lists to choose from)\r\n * Returns the first available dashboard's dimensions as fallback\r\n */\r\n readonly availableDimensions = computed(() => {\r\n const dashboardEntries = Array.from(this.dashboards().values());\r\n if (dashboardEntries.length === 0) {\r\n return { width: 100, height: 100 }; // fallback\r\n }\r\n \r\n // Return dimensions from first available dashboard with fallback for undefined\r\n return dashboardEntries[0].dimensions() || { width: 100, height: 100 };\r\n });\r\n \r\n /**\r\n * Start drag operation on the first available dashboard\r\n * (Widget lists need some dashboard to coordinate with during drag)\r\n */\r\n startDrag(dragData: DragData): void {\r\n const dashboardEntries = Array.from(this.dashboards().values());\r\n if (dashboardEntries.length > 0) {\r\n dashboardEntries[0].store.startDrag(dragData);\r\n }\r\n }\r\n \r\n /**\r\n * End drag operation on all dashboards\r\n * (Safer to notify all in case drag state got distributed)\r\n */\r\n endDrag(): void {\r\n for (const dashboard of this.dashboards().values()) {\r\n dashboard.store.endDrag();\r\n }\r\n }\r\n \r\n /**\r\n * Get all registered dashboard IDs\r\n */\r\n readonly registeredDashboards = computed(() => Array.from(this.dashboards().keys()));\r\n \r\n /**\r\n * Get the number of registered dashboards\r\n */\r\n readonly dashboardCount = computed(() => this.dashboards().size);\r\n \r\n /**\r\n * Check if any dashboards are registered\r\n */\r\n readonly hasDashboards = computed(() => this.dashboards().size > 0);\r\n \r\n /**\r\n * Update registration for a dashboard store when its ID becomes available\r\n */\r\n updateDashboardRegistration(store: InstanceType<typeof DashboardStore>): void {\r\n this.registerDashboard(store);\r\n }\r\n\r\n /**\r\n * Get grid configuration for a specific dashboard\r\n */\r\n getDashboardGridConfig(dashboardId: string): { rows: number; columns: number; gutterSize: string } | null {\r\n const dashboard = this.dashboards().get(dashboardId);\r\n if (!dashboard) {\r\n return null;\r\n }\r\n \r\n const store = dashboard.store;\r\n return {\r\n rows: store.rows(),\r\n columns: store.columns(),\r\n gutterSize: store.gutterSize()\r\n };\r\n }\r\n\r\n /**\r\n * Get the store instance for a specific dashboard ID\r\n */\r\n getDashboardStore(dashboardId: string): InstanceType<typeof DashboardStore> | null {\r\n const dashboard = this.dashboards().get(dashboardId);\r\n return dashboard?.store || null;\r\n }\r\n\r\n /**\r\n * Get all registered dashboards (for viewport service integration)\r\n */\r\n getAllDashboards(): Map<string, DashboardInstance> {\r\n return this.dashboards();\r\n }\r\n}","import { Injectable, computed, signal, inject, DestroyRef, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { DashboardStore } from '../store/dashboard-store';\r\nimport { ReservedSpace, DEFAULT_RESERVED_SPACE } from '../models/reserved-space';\r\n\r\nexport interface ViewportSize {\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface DashboardConstraints {\r\n maxWidth: number;\r\n maxHeight: number;\r\n constrainedBy: 'width' | 'height' | 'none';\r\n}\r\n\r\n/**\r\n * Internal component-scoped service that provides viewport-aware constraints for a single dashboard.\r\n * Each dashboard component gets its own instance of this service.\r\n * \r\n * This service is NOT part of the public API and should remain internal to the library.\r\n */\r\n@Injectable()\r\nexport class DashboardViewportService {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly store = inject(DashboardStore);\r\n \r\n private readonly viewportSize = signal<ViewportSize>({ width: 0, height: 0 });\r\n private readonly reservedSpace = signal<ReservedSpace>(DEFAULT_RESERVED_SPACE);\r\n private resizeObserver: ResizeObserver | null = null;\r\n\r\n constructor() {\r\n if (isPlatformBrowser(this.platformId)) {\r\n this.initializeViewportTracking();\r\n }\r\n }\r\n\r\n /**\r\n * Initialize viewport size tracking using ResizeObserver on the window\r\n */\r\n private initializeViewportTracking(): void {\r\n // Use ResizeObserver on document.documentElement for accurate viewport tracking\r\n this.resizeObserver = new ResizeObserver((entries) => {\r\n if (entries.length > 0) {\r\n const entry = entries[0];\r\n const { inlineSize, blockSize } = entry.contentBoxSize[0];\r\n this.viewportSize.set({\r\n width: inlineSize,\r\n height: blockSize\r\n });\r\n }\r\n });\r\n\r\n this.resizeObserver.observe(document.documentElement);\r\n\r\n // Initial size\r\n this.viewportSize.set({\r\n width: window.innerWidth,\r\n height: window.innerHeight\r\n });\r\n\r\n // Cleanup on destroy\r\n this.destroyRef.onDestroy(() => {\r\n this.resizeObserver?.disconnect();\r\n });\r\n }\r\n\r\n /**\r\n * Set reserved space that should be excluded from dashboard calculations\r\n * (e.g., toolbar height, widget list width, padding)\r\n */\r\n setReservedSpace(space: ReservedSpace): void {\r\n this.reservedSpace.set(space);\r\n }\r\n\r\n /**\r\n * Get current viewport size\r\n */\r\n readonly currentViewportSize = this.viewportSize.asReadonly();\r\n\r\n /**\r\n * Get current reserved space\r\n */\r\n readonly currentReservedSpace = this.reservedSpace.asReadonly();\r\n\r\n /**\r\n * Calculate available space for dashboard after accounting for reserved areas\r\n */\r\n readonly availableSpace = computed((): ViewportSize => {\r\n const viewport = this.viewportSize();\r\n const reserved = this.reservedSpace();\r\n \r\n return {\r\n width: Math.max(0, viewport.width - reserved.left - reserved.right),\r\n height: Math.max(0, viewport.height - reserved.top - reserved.bottom)\r\n };\r\n });\r\n\r\n /**\r\n * Calculate dashboard constraints for this dashboard instance\r\n */\r\n readonly constraints = computed((): DashboardConstraints => {\r\n const availableSize = this.availableSpace();\r\n \r\n // Get grid configuration from our component's store\r\n const rows = this.store.rows();\r\n const columns = this.store.columns();\r\n \r\n if (rows === 0 || columns === 0) {\r\n return {\r\n maxWidth: availableSize.width,\r\n maxHeight: availableSize.height,\r\n constrainedBy: 'none'\r\n };\r\n }\r\n\r\n // Calculate aspect ratio\r\n const aspectRatio = columns / rows;\r\n \r\n // Calculate maximum size that fits within available space\r\n const maxWidthFromHeight = availableSize.height * aspectRatio;\r\n const maxHeightFromWidth = availableSize.width / aspectRatio;\r\n \r\n let maxWidth: number;\r\n let maxHeight: number;\r\n let constrainedBy: 'width' | 'height';\r\n \r\n if (maxWidthFromHeight <= availableSize.width) {\r\n // Height is the limiting factor\r\n maxWidth = maxWidthFromHeight;\r\n maxHeight = availableSize.height;\r\n constrainedBy = 'height';\r\n } else {\r\n // Width is the limiting factor\r\n maxWidth = availableSize.width;\r\n maxHeight = maxHeightFromWidth;\r\n constrainedBy = 'width';\r\n }\r\n\r\n return {\r\n maxWidth: Math.max(0, maxWidth),\r\n maxHeight: Math.max(0, maxHeight),\r\n constrainedBy\r\n };\r\n });\r\n\r\n}","// dashboard.component.ts\r\n//\r\n// A performant, modular, and fully reactive Angular dashboard container that orchestrates between\r\n// editing and viewing modes — with clean component separation and no external dependencies.\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n inject,\r\n input,\r\n viewChild,\r\n DestroyRef,\r\n OnChanges,\r\n SimpleChanges,\r\n untracked,\r\n} from '@angular/core';\r\nimport { DashboardViewerComponent } from '../dashboard-viewer/dashboard-viewer.component';\r\nimport { DashboardEditorComponent } from '../dashboard-editor/dashboard-editor.component';\r\nimport { DashboardStore } from '../store/dashboard-store';\r\nimport { DashboardDataDto } from '../models/dashboard-data.dto';\r\nimport { DashboardBridgeService } from '../services/dashboard-bridge.service';\r\nimport { DashboardViewportService } from '../services/dashboard-viewport.service';\r\nimport { ReservedSpace } from '../models/reserved-space';\r\n\r\n@Component({\r\n selector: 'ngx-dashboard',\r\n standalone: true,\r\n imports: [CommonModule, DashboardViewerComponent, DashboardEditorComponent],\r\n providers: [DashboardStore, DashboardViewportService],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './dashboard.component.html',\r\n styleUrl: './dashboard.component.scss',\r\n host: {\r\n '[style.--rows]': 'store.rows()',\r\n '[style.--columns]': 'store.columns()',\r\n '[style.--gutter-size]': 'store.gutterSize()',\r\n '[style.--gutters]': 'store.columns() + 1',\r\n '[class.is-edit-mode]': 'editMode()',\r\n '[style.max-width.px]': 'viewport.constraints().maxWidth',\r\n '[style.max-height.px]': 'viewport.constraints().maxHeight',\r\n },\r\n})\r\nexport class DashboardComponent implements OnChanges {\r\n #store = inject(DashboardStore);\r\n #bridge = inject(DashboardBridgeService);\r\n #viewport = inject(DashboardViewportService);\r\n #destroyRef = inject(DestroyRef);\r\n\r\n // Public accessors for template\r\n protected readonly store = this.#store;\r\n protected readonly viewport = this.#viewport;\r\n\r\n // Component inputs\r\n dashboardData = input.required<DashboardDataDto>();\r\n editMode = input<boolean>(false);\r\n reservedSpace = input<ReservedSpace>();\r\n\r\n // Store signals - shared by both child components\r\n cells = this.#store.cells;\r\n\r\n // ViewChild references for export/import functionality\r\n private dashboardEditor = viewChild(DashboardEditorComponent);\r\n private dashboardViewer = viewChild(DashboardViewerComponent);\r\n\r\n // Track if we're in the middle of preserving states\r\n #isPreservingStates = false;\r\n // Track if component has been initialized\r\n #isInitialized = false;\r\n\r\n constructor() {\r\n // Cleanup registration when component is destroyed\r\n this.#destroyRef.onDestroy(() => {\r\n this.#bridge.unregisterDashboard(this.#store);\r\n });\r\n\r\n // Initialize from dashboardData\r\n effect(() => {\r\n const data = this.dashboardData();\r\n if (data) {\r\n this.#store.initializeFromDto(data);\r\n // Register with bridge service after dashboard ID is set\r\n this.#bridge.updateDashboardRegistration(this.#store);\r\n this.#isInitialized = true;\r\n }\r\n });\r\n\r\n // Sync edit mode with store (without triggering state preservation)\r\n effect(() => {\r\n const editMode = this.editMode();\r\n untracked(() => {\r\n this.#store.setEditMode(editMode);\r\n });\r\n });\r\n\r\n // Sync reserved space input with viewport service\r\n effect(() => {\r\n const reserved = this.reservedSpace();\r\n if (reserved) {\r\n this.#viewport.setReservedSpace(reserved);\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n // Handle edit mode changes after initialization\r\n if (\r\n changes['editMode'] &&\r\n !changes['editMode'].firstChange &&\r\n this.#isInitialized\r\n ) {\r\n const previousValue = changes['editMode'].previousValue;\r\n const currentValue = changes['editMode'].currentValue;\r\n\r\n if (previousValue !== currentValue) {\r\n // Preserve widget states before the mode switch\r\n this.#preserveWidgetStatesBeforeModeSwitch(previousValue);\r\n }\r\n }\r\n }\r\n\r\n // Public export/import methods\r\n exportDashboard(): DashboardDataDto {\r\n // Delegate to the active child component\r\n if (this.editMode()) {\r\n const editor = this.dashboardEditor();\r\n return editor ? editor.exportDashboard() : this.#store.exportDashboard();\r\n } else {\r\n const viewer = this.dashboardViewer();\r\n return viewer ? viewer.exportDashboard() : this.#store.exportDashboard();\r\n }\r\n }\r\n\r\n loadDashboard(data: DashboardDataDto): void {\r\n this.#store.loadDashboard(data);\r\n }\r\n\r\n getCurrentDashboardData(): DashboardDataDto {\r\n return this.exportDashboard();\r\n }\r\n\r\n clearDashboard(): void {\r\n this.#store.clearDashboard();\r\n }\r\n\r\n /**\r\n * Preserve widget states before switching modes by collecting live states\r\n * from the currently active component and updating the store.\r\n */\r\n #preserveWidgetStatesBeforeModeSwitch(previousEditMode: boolean): void {\r\n // Prevent re-entrant calls\r\n if (this.#isPreservingStates) {\r\n return;\r\n }\r\n\r\n this.#isPreservingStates = true;\r\n\r\n try {\r\n let currentWidgetStates: Map<string, unknown> | null = null;\r\n\r\n if (previousEditMode) {\r\n // Previously in edit mode, collect states from editor\r\n const editor = this.dashboardEditor();\r\n if (editor) {\r\n currentWidgetStates = editor.getCurrentWidgetStates();\r\n }\r\n } else {\r\n // Previously in view mode, collect states from viewer\r\n const viewer = this.dashboardViewer();\r\n if (viewer) {\r\n currentWidgetStates = viewer.getCurrentWidgetStates();\r\n }\r\n }\r\n\r\n // Update the store with the live widget states using untracked to avoid triggering effects\r\n if (currentWidgetStates && currentWidgetStates.size > 0) {\r\n untracked(() => {\r\n this.#store.updateAllWidgetStates(currentWidgetStates);\r\n });\r\n }\r\n } finally {\r\n this.#isPreservingStates = false;\r\n }\r\n }\r\n}\r\n","<!-- dashboard.component.html -->\r\n<div class=\"grid-container\">\r\n @if (editMode()) {\r\n <!-- Full editor with drag & drop capabilities -->\r\n <ngx-dashboard-editor\r\n [rows]=\"store.rows()\"\r\n [columns]=\"store.columns()\"\r\n [gutterSize]=\"store.gutterSize()\"\r\n ></ngx-dashboard-editor>\r\n } @else {\r\n <!-- Read-only viewer -->\r\n <ngx-dashboard-viewer\r\n [rows]=\"store.rows()\"\r\n [columns]=\"store.columns()\"\r\n [gutterSize]=\"store.gutterSize()\"\r\n ></ngx-dashboard-viewer>\r\n }\r\n</div>\r\n","// widget-list.component.ts\r\nimport {\r\n Component,\r\n computed,\r\n inject,\r\n Renderer2,\r\n signal,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { DragData, WidgetMetadata } from '../models';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { DashboardService } from '../services/dashboard.service';\r\nimport { DashboardBridgeService } from '../services/dashboard-bridge.service';\r\n\r\ninterface WidgetDisplayItem extends WidgetMetadata {\r\n safeSvgIcon?: SafeHtml;\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-dashboard-widget-list',\r\n standalone: true,\r\n imports: [],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './widget-list.component.html',\r\n styleUrl: './widget-list.component.scss',\r\n})\r\nexport class WidgetListComponent {\r\n readonly #service = inject(DashboardService);\r\n readonly #sanitizer = inject(DomSanitizer);\r\n readonly #renderer = inject(Renderer2);\r\n readonly #bridge = inject(DashboardBridgeService);\r\n\r\n activeWidget = signal<string | null>(null);\r\n\r\n // Get grid cell dimensions from bridge service (uses first available dashboard)\r\n gridCellDimensions = this.#bridge.availableDimensions;\r\n\r\n widgets = computed(() =>\r\n this.#service.widgetTypes().map((w) => ({\r\n ...w.metadata,\r\n safeSvgIcon: this.#sanitizer.bypassSecurityTrustHtml(w.metadata.svgIcon),\r\n }))\r\n );\r\n\r\n onDragStart(event: DragEvent, widget: WidgetDisplayItem) {\r\n if (!event.dataTransfer) return;\r\n event.dataTransfer.effectAllowed = 'copy';\r\n\r\n const dragData: DragData = {\r\n kind: 'widget',\r\n content: widget,\r\n };\r\n\r\n this.activeWidget.set(widget.widgetTypeid);\r\n this.#bridge.startDrag(dragData);\r\n\r\n // Create custom drag ghost for better UX\r\n const ghost = this.#createDragGhost(widget.svgIcon);\r\n document.body.appendChild(ghost);\r\n\r\n // Force reflow to ensure element is rendered\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const _reflow = ghost.offsetHeight;\r\n\r\n event.dataTransfer.setDragImage(ghost, 10, 10);\r\n\r\n // Delay removal to ensure browser has time to snapshot the drag image\r\n setTimeout(() => ghost.remove());\r\n }\r\n\r\n onDragEnd(): void {\r\n this.activeWidget.set(null);\r\n this.#bridge.endDrag();\r\n }\r\n\r\n #createDragGhost(svgIcon: string | undefined): HTMLElement {\r\n const dimensions = this.gridCellDimensions();\r\n\r\n const el = this.#renderer.createElement('div');\r\n this.#renderer.addClass(el, 'drag-ghost');\r\n\r\n // Set dimensions using CSS custom properties for dynamic sizing\r\n this.#renderer.setStyle(el, 'width', `${dimensions.width}px`);\r\n this.#renderer.setStyle(el, 'height', `${dimensions.height}px`);\r\n\r\n if (svgIcon) {\r\n const iconWrapper = this.#renderer.createElement('div');\r\n this.#renderer.addClass(iconWrapper, 'icon');\r\n\r\n iconWrapper.innerHTML = svgIcon;\r\n const svg = iconWrapper.querySelector('svg');\r\n\r\n if (svg) {\r\n // Size the SVG to 80% of the cell dimensions\r\n svg.setAttribute('width', `${dimensions.width * 0.8}`);\r\n svg.setAttribute('height', `${dimensions.height * 0.8}`);\r\n // Remove hardcoded fill and opacity - let CSS handle styling\r\n svg.removeAttribute('fill');\r\n }\r\n\r\n el.appendChild(iconWrapper);\r\n }\r\n\r\n return el;\r\n }\r\n}\r\n","<!-- widget-list.component.html -->\r\n<div class=\"widget-list\" role=\"list\" aria-label=\"Available widgets\">\r\n @for (widget of widgets(); track widget.widgetTypeid) {\r\n <div\r\n class=\"widget-list-item\"\r\n [class.active]=\"activeWidget() === widget.widgetTypeid\"\r\n draggable=\"true\"\r\n (dragstart)=\"onDragStart($event, widget)\"\r\n (dragend)=\"onDragEnd()\"\r\n role=\"listitem\"\r\n [attr.aria-grabbed]=\"activeWidget() === widget.widgetTypeid\"\r\n [attr.aria-label]=\"widget.name + ' widget: ' + widget.description\"\r\n tabindex=\"0\"\r\n >\r\n <div class=\"icon\" [innerHTML]=\"widget.safeSvgIcon\" aria-hidden=\"true\"></div>\r\n <div class=\"content\">\r\n <strong>{{ widget.name }}</strong>\r\n <small>{{ widget.description }}</small>\r\n </div>\r\n </div>\r\n }\r\n</div>","/*\r\n * Public API Surface of ngx-dashboard\r\n */\r\n\r\n// Main dashboard components\r\nexport { DashboardComponent } from './lib/dashboard/dashboard.component';\r\nexport { WidgetListComponent } from './lib/widget-list/widget-list.component';\r\n\r\n// Public Services\r\nexport { DashboardService } from './lib/services/dashboard.service';\r\n\r\n// Core Widget Types\r\nexport type { Widget, WidgetMetadata } from './lib/models/widget';\r\n\r\n// Data Transfer Types\r\nexport type {\r\n DashboardDataDto,\r\n CellDataDto,\r\n} from './lib/models/dashboard-data.dto';\r\nexport type { ReservedSpace } from './lib/models/reserved-space';\r\n\r\n// Utility Functions\r\nexport {\r\n createEmptyDashboard,\r\n createDefaultDashboard,\r\n} from './lib/models/dashboard-data.utils';\r\n\r\n// Provider exports for advanced customization\r\nexport { CELL_SETTINGS_DIALOG_PROVIDER } from './lib/providers/cell-settings-dialog/cell-settings-dialog.tokens';\r\nexport { DefaultCellSettingsDialogProvider } from './lib/providers/cell-settings-dialog/default-cell-settings-dialog.provider';\r\nexport { CellSettingsDialogProvider } from './lib/providers/cell-settings-dialog/cell-settings-dialog.provider';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i4"],"mappings":"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"}
|