@vc-shell/framework 2.1.0-pr253.0b14b2c → 2.1.0-pr255.4dc5c0d

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.
Files changed (160) hide show
  1. package/dist/ai-agent/index.js +11 -10
  2. package/dist/ai-agent/index.js.map +1 -1
  3. package/dist/charts/index.d.ts +2 -0
  4. package/dist/charts/index.d.ts.map +1 -0
  5. package/dist/charts/index.js +9 -0
  6. package/dist/charts/index.js.map +1 -0
  7. package/dist/chunks/DashboardDonutChart.vue_vue_type_script_setup_true_lang-hTcM33bM.js +446 -0
  8. package/dist/chunks/DashboardDonutChart.vue_vue_type_script_setup_true_lang-hTcM33bM.js.map +1 -0
  9. package/dist/chunks/VcAiAgentPanel.vue_vue_type_script_setup_true_lang-Cx8_DCu_.js +1124 -0
  10. package/dist/chunks/VcAiAgentPanel.vue_vue_type_script_setup_true_lang-Cx8_DCu_.js.map +1 -0
  11. package/dist/chunks/{VcAiAgentPanel.vue_vue_type_style_index_0_lang-D077_c8I.js → VcAiAgentPanel.vue_vue_type_style_index_0_lang-D2KmNhhl.js} +834 -1907
  12. package/dist/chunks/VcAiAgentPanel.vue_vue_type_style_index_0_lang-D2KmNhhl.js.map +1 -0
  13. package/dist/chunks/VcTableAdapter.vue_vue_type_script_setup_true_lang-BL653h9q.js +18282 -0
  14. package/dist/chunks/VcTableAdapter.vue_vue_type_script_setup_true_lang-BL653h9q.js.map +1 -0
  15. package/dist/chunks/VcTableAdapter.vue_vue_type_style_index_0_lang-CtkZR5a1.js +4227 -0
  16. package/dist/chunks/VcTableAdapter.vue_vue_type_style_index_0_lang-CtkZR5a1.js.map +1 -0
  17. package/dist/chunks/dashboard-feed-row.vue_vue_type_script_setup_true_lang-Cs-yidUE.js +641 -0
  18. package/dist/chunks/dashboard-feed-row.vue_vue_type_script_setup_true_lang-Cs-yidUE.js.map +1 -0
  19. package/dist/chunks/{index-DELXU1qy.js → index-CvSe3hjU.js} +11 -10
  20. package/dist/chunks/{index-DELXU1qy.js.map → index-CvSe3hjU.js.map} +1 -1
  21. package/dist/chunks/vendor-js-beautify-D-6mWVv0.js +1784 -0
  22. package/dist/chunks/vendor-js-beautify-D-6mWVv0.js.map +1 -0
  23. package/dist/chunks/{vendor-vueuse-core-CEdpDfzx.js → vendor-vueuse-core-BYWoPpF_.js} +5 -5
  24. package/dist/chunks/{vendor-vueuse-core-CEdpDfzx.js.map → vendor-vueuse-core-BYWoPpF_.js.map} +1 -1
  25. package/dist/core/blade-navigation/bladeConfigRegistry.d.ts +0 -11
  26. package/dist/core/blade-navigation/bladeConfigRegistry.d.ts.map +1 -1
  27. package/dist/core/blade-navigation/descriptorFactory.d.ts +2 -0
  28. package/dist/core/blade-navigation/descriptorFactory.d.ts.map +1 -0
  29. package/dist/core/blade-navigation/singletons.d.ts +0 -2
  30. package/dist/core/blade-navigation/singletons.d.ts.map +1 -1
  31. package/dist/core/blade-navigation/types/index.d.ts +12 -6
  32. package/dist/core/blade-navigation/types/index.d.ts.map +1 -1
  33. package/dist/core/blade-navigation/useBladeMessaging.d.ts +1 -17
  34. package/dist/core/blade-navigation/useBladeMessaging.d.ts.map +1 -1
  35. package/dist/core/blade-navigation/useBladeStack.d.ts +1 -18
  36. package/dist/core/blade-navigation/useBladeStack.d.ts.map +1 -1
  37. package/dist/core/composables/createServiceRegistry.d.ts +42 -0
  38. package/dist/core/composables/createServiceRegistry.d.ts.map +1 -0
  39. package/dist/core/composables/useBladeNavigationAdapter/index.d.ts +0 -5
  40. package/dist/core/composables/useBladeNavigationAdapter/index.d.ts.map +1 -1
  41. package/dist/core/composables/useDashboard/index.d.ts.map +1 -1
  42. package/dist/core/composables/useEnvironmentName/index.d.ts +0 -5
  43. package/dist/core/composables/useEnvironmentName/index.d.ts.map +1 -1
  44. package/dist/core/composables/useMenuService/index.d.ts.map +1 -1
  45. package/dist/core/composables/usePopup/index.d.ts.map +1 -1
  46. package/dist/core/composables/usePopup/preset-registry.d.ts +0 -2
  47. package/dist/core/composables/usePopup/preset-registry.d.ts.map +1 -1
  48. package/dist/core/composables/usePopup/singleton.d.ts +0 -2
  49. package/dist/core/composables/usePopup/singleton.d.ts.map +1 -1
  50. package/dist/core/composables/useSettings/index.d.ts.map +1 -1
  51. package/dist/core/composables/useSettingsMenu/index.d.ts.map +1 -1
  52. package/dist/core/composables/useSlowNetworkDetection/index.d.ts +0 -2
  53. package/dist/core/composables/useSlowNetworkDetection/index.d.ts.map +1 -1
  54. package/dist/core/composables/useTheme/index.d.ts.map +1 -1
  55. package/dist/core/composables/useToolbar/index.d.ts.map +1 -1
  56. package/dist/core/composables/useUser/index.d.ts +0 -2
  57. package/dist/core/composables/useUser/index.d.ts.map +1 -1
  58. package/dist/core/interceptors/index.d.ts.map +1 -1
  59. package/dist/core/notifications/notification.d.ts.map +1 -1
  60. package/dist/core/plugins/ai-agent/constants.d.ts.map +1 -1
  61. package/dist/core/plugins/ai-agent/services/message-transport.d.ts.map +1 -1
  62. package/dist/core/plugins/ai-agent/types.d.ts +12 -1
  63. package/dist/core/plugins/ai-agent/types.d.ts.map +1 -1
  64. package/dist/core/plugins/permissions/index.d.ts.map +1 -1
  65. package/dist/core/plugins/validation/rules.d.ts.map +1 -1
  66. package/dist/core/services/_internal/createGenericItemRegistry.d.ts +35 -0
  67. package/dist/core/services/_internal/createGenericItemRegistry.d.ts.map +1 -0
  68. package/dist/core/services/_internal/index.d.ts +1 -0
  69. package/dist/core/services/_internal/index.d.ts.map +1 -1
  70. package/dist/core/services/app-bar-menu-service.d.ts.map +1 -1
  71. package/dist/core/services/app-bar-mobile-buttons-service.d.ts +2 -0
  72. package/dist/core/services/app-bar-mobile-buttons-service.d.ts.map +1 -1
  73. package/dist/core/services/settings-menu-service.d.ts.map +1 -1
  74. package/dist/core/utilities/backendRegistry.d.ts +38 -0
  75. package/dist/core/utilities/backendRegistry.d.ts.map +1 -0
  76. package/dist/core/utilities/index.d.ts +1 -0
  77. package/dist/core/utilities/index.d.ts.map +1 -1
  78. package/dist/dashboard/index.d.ts +3 -0
  79. package/dist/dashboard/index.d.ts.map +1 -0
  80. package/dist/dashboard/index.js +16 -0
  81. package/dist/dashboard/index.js.map +1 -0
  82. package/dist/framework.js +2149 -3060
  83. package/dist/framework.js.map +1 -1
  84. package/dist/index.css +2 -2
  85. package/dist/index.d.ts +1 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/locales/de.js +91 -3
  88. package/dist/locales/en.js +91 -3
  89. package/dist/locales/en.json +91 -3
  90. package/dist/locales/types.d.ts +88 -0
  91. package/dist/shell/_internal/blade-navigation/components/vc-blade-slot/vc-blade-slot.vue.d.ts.map +1 -1
  92. package/dist/shell/_internal/notifications/components/notification-container/computeToastOffsets.d.ts +33 -0
  93. package/dist/shell/_internal/notifications/components/notification-container/computeToastOffsets.d.ts.map +1 -0
  94. package/dist/shell/_internal/notifications/components/notification-container/index.d.ts.map +1 -1
  95. package/dist/shell/_internal/notifications/components/notification-container/useToastStack.d.ts +17 -0
  96. package/dist/shell/_internal/notifications/components/notification-container/useToastStack.d.ts.map +1 -0
  97. package/dist/shell/auth/LoginPage/components/login/Login.vue.d.ts.map +1 -1
  98. package/dist/shell/auth/utils.d.ts +6 -2
  99. package/dist/shell/auth/utils.d.ts.map +1 -1
  100. package/dist/tailwind.config.d.ts.map +1 -1
  101. package/dist/tsconfig.tsbuildinfo +1 -1
  102. package/dist/ui/components/atoms/vc-container/vc-container.vue.d.ts.map +1 -1
  103. package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts +8 -0
  104. package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts.map +1 -1
  105. package/dist/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue.d.ts.map +1 -1
  106. package/dist/ui/components/molecules/vc-checkbox/vc-checkbox.vue.d.ts +2 -0
  107. package/dist/ui/components/molecules/vc-checkbox/vc-checkbox.vue.d.ts.map +1 -1
  108. package/dist/ui/components/molecules/vc-color-input/vc-color-input.vue.d.ts.map +1 -1
  109. package/dist/ui/components/molecules/vc-dropdown/vc-dropdown.vue.d.ts +3 -0
  110. package/dist/ui/components/molecules/vc-dropdown/vc-dropdown.vue.d.ts.map +1 -1
  111. package/dist/ui/components/molecules/vc-dropdown-panel/vc-dropdown-panel.vue.d.ts.map +1 -1
  112. package/dist/ui/components/molecules/vc-editor/_internal/vc-editor-custom-button.vue.d.ts.map +1 -1
  113. package/dist/ui/components/molecules/vc-editor/_internal/vc-editor-font-selector.vue.d.ts.map +1 -1
  114. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts.map +1 -1
  115. package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts.map +1 -1
  116. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.vue.d.ts.map +1 -1
  117. package/dist/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.vue.d.ts.map +1 -1
  118. package/dist/ui/components/molecules/vc-radio-button/vc-radio-button.vue.d.ts +2 -0
  119. package/dist/ui/components/molecules/vc-radio-button/vc-radio-button.vue.d.ts.map +1 -1
  120. package/dist/ui/components/molecules/vc-switch/vc-switch.vue.d.ts +2 -0
  121. package/dist/ui/components/molecules/vc-switch/vc-switch.vue.d.ts.map +1 -1
  122. package/dist/ui/components/molecules/vc-toast/vc-toast.vue.d.ts.map +1 -1
  123. package/dist/ui/components/organisms/vc-app/_internal/app-bar/components/AppBarMobileActions.vue.d.ts.map +1 -1
  124. package/dist/ui/components/organisms/vc-app/_internal/layouts/DesktopLayout.vue.d.ts.map +1 -1
  125. package/dist/ui/components/organisms/vc-app/_internal/sidebar/SidebarHeader.vue.d.ts.map +1 -1
  126. package/dist/ui/components/organisms/vc-blade/_internal/BladeStatusBanners.vue.d.ts.map +1 -1
  127. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts.map +1 -1
  128. package/dist/ui/components/organisms/vc-data-table/VcDataTable.vue.d.ts.map +1 -1
  129. package/dist/ui/components/organisms/vc-data-table/components/ColumnFilter.vue.d.ts.map +1 -1
  130. package/dist/ui/components/organisms/vc-data-table/components/DataTableBody.vue.d.ts.map +1 -1
  131. package/dist/ui/components/organisms/vc-data-table/components/DataTableCellRenderer.vue.d.ts.map +1 -1
  132. package/dist/ui/components/organisms/vc-data-table/components/DataTableHeader.vue.d.ts.map +1 -1
  133. package/dist/ui/components/organisms/vc-data-table/components/DataTableRow.vue.d.ts.map +1 -1
  134. package/dist/ui/components/organisms/vc-data-table/components/TableAddRowButton.vue.d.ts.map +1 -1
  135. package/dist/ui/components/organisms/vc-data-table/components/TableCheckbox.vue.d.ts +5 -1
  136. package/dist/ui/components/organisms/vc-data-table/components/TableCheckbox.vue.d.ts.map +1 -1
  137. package/dist/ui/components/organisms/vc-data-table/components/TableGroupRow.vue.d.ts.map +1 -1
  138. package/dist/ui/components/organisms/vc-data-table/components/TableRow.vue.d.ts.map +1 -1
  139. package/dist/ui/components/organisms/vc-data-table/components/TableRowActions.vue.d.ts.map +1 -1
  140. package/dist/ui/components/organisms/vc-data-table/composables/createTableSelectionFacade.d.ts +50 -0
  141. package/dist/ui/components/organisms/vc-data-table/composables/createTableSelectionFacade.d.ts.map +1 -0
  142. package/dist/ui/components/organisms/vc-data-table/composables/index.d.ts +2 -0
  143. package/dist/ui/components/organisms/vc-data-table/composables/index.d.ts.map +1 -1
  144. package/dist/ui/components/organisms/vc-data-table/composables/useDataTableOrchestrator.d.ts +0 -248
  145. package/dist/ui/components/organisms/vc-data-table/composables/useDataTableOrchestrator.d.ts.map +1 -1
  146. package/dist/ui/components/organisms/vc-data-table/composables/useDataTableState.d.ts.map +1 -1
  147. package/dist/ui/components/organisms/vc-data-table/composables/useTableColumnsResize.d.ts +3 -0
  148. package/dist/ui/components/organisms/vc-data-table/composables/useTableColumnsResize.d.ts.map +1 -1
  149. package/dist/ui/components/organisms/vc-data-table/vc-data-table.stories.helpers.d.ts +32 -0
  150. package/dist/ui/components/organisms/vc-data-table/vc-data-table.stories.helpers.d.ts.map +1 -0
  151. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-filmstrip/vc-gallery-filmstrip.vue.d.ts.map +1 -1
  152. package/dist/ui/index.js +142 -141
  153. package/dist/ui/index.js.map +1 -1
  154. package/package.json +19 -7
  155. package/tailwind.config.ts +0 -6
  156. package/dist/chunks/VcAiAgentPanel.vue_vue_type_style_index_0_lang-D077_c8I.js.map +0 -1
  157. package/dist/chunks/VcTableAdapter.vue_vue_type_style_index_0_lang-BnbquDGw.js +0 -22319
  158. package/dist/chunks/VcTableAdapter.vue_vue_type_style_index_0_lang-BnbquDGw.js.map +0 -1
  159. package/dist/chunks/vendor-prettier-2Sf6a5jB.js +0 -5309
  160. package/dist/chunks/vendor-prettier-2Sf6a5jB.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-feed-row.vue_vue_type_script_setup_true_lang-Cs-yidUE.js","sources":["../../shell/dashboard/draggable-dashboard/composables/useGridstackAdapter.ts","../../shell/dashboard/draggable-dashboard/composables/useGridstack.ts","../../shell/dashboard/draggable-dashboard/DashboardWidgetSkeleton.vue","../../shell/dashboard/draggable-dashboard/GridstackDashboard.vue","../../shell/dashboard/draggable-dashboard/DraggableDashboard.vue","../../shell/dashboard/draggable-dashboard/index.ts","../../shell/dashboard/dashboard-widget-card/dashboard-widget-card.vue","../../shell/dashboard/dashboard-widget-card/dashboard-stat-item.vue","../../shell/dashboard/dashboard-widget-card/dashboard-feed-list.vue","../../shell/dashboard/dashboard-widget-card/dashboard-feed-row.vue"],"sourcesContent":["/**\r\n * Gridstack Type Adapter\r\n *\r\n * Converts between our IDashboardWidget types and Gridstack's GridStackWidget types.\r\n * Handles localStorage format migration for backwards compatibility.\r\n */\r\n\r\nimport type { GridStackWidget, GridStackNode } from \"gridstack\";\r\nimport type {\r\n IDashboardWidget,\r\n DashboardWidgetPosition,\r\n DashboardWidgetSize,\r\n} from \"@shell/dashboard/draggable-dashboard/types\";\r\n\r\n/**\r\n * LocalStorage key for layout persistence\r\n */\r\nexport const LAYOUT_STORAGE_KEY = \"vc-dashboard-layout\";\r\n\r\n/**\r\n * Old localStorage format (Map serialized as object)\r\n */\r\ninterface LegacyLayoutFormat {\r\n [widgetId: string]: DashboardWidgetPosition;\r\n}\r\n\r\n/**\r\n * Converts our widget type to Gridstack widget format\r\n */\r\nexport function toGridstackWidget(widget: IDashboardWidget, position?: DashboardWidgetPosition): GridStackWidget {\r\n const pos = position ?? widget.position;\r\n return {\r\n id: widget.id,\r\n x: pos?.x ?? 0,\r\n y: pos?.y ?? 0,\r\n w: widget.size.width,\r\n h: widget.size.height,\r\n minW: 2,\r\n minH: 2,\r\n };\r\n}\r\n\r\n/**\r\n * Extracts position from Gridstack node\r\n */\r\nexport function fromGridstackNode(node: GridStackNode): {\r\n id: string;\r\n position: DashboardWidgetPosition;\r\n size: DashboardWidgetSize;\r\n} {\r\n return {\r\n id: node.id ?? \"\",\r\n position: {\r\n x: node.x ?? 0,\r\n y: node.y ?? 0,\r\n },\r\n size: {\r\n width: node.w ?? 1,\r\n height: node.h ?? 1,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Converts Gridstack nodes array to our layout Map format\r\n */\r\nexport function gridstackNodesToLayoutMap(nodes: GridStackNode[]): Map<string, DashboardWidgetPosition> {\r\n const layout = new Map<string, DashboardWidgetPosition>();\r\n\r\n for (const node of nodes) {\r\n if (node.id) {\r\n layout.set(node.id, {\r\n x: node.x ?? 0,\r\n y: node.y ?? 0,\r\n });\r\n }\r\n }\r\n\r\n return layout;\r\n}\r\n\r\n/**\r\n * Loads layout from localStorage with legacy format support\r\n */\r\nexport function loadLayoutFromStorage(): Map<string, DashboardWidgetPosition> | null {\r\n try {\r\n const stored = localStorage.getItem(LAYOUT_STORAGE_KEY);\r\n if (!stored) return null;\r\n\r\n const parsed = JSON.parse(stored);\r\n\r\n // Check if it's the new Gridstack array format\r\n if (Array.isArray(parsed)) {\r\n return gridstackNodesToLayoutMap(parsed as GridStackNode[]);\r\n }\r\n\r\n // Legacy format: object with widget IDs as keys\r\n if (typeof parsed === \"object\" && parsed !== null) {\r\n const layout = new Map<string, DashboardWidgetPosition>();\r\n for (const [id, pos] of Object.entries(parsed as LegacyLayoutFormat)) {\r\n if (pos && typeof pos.x === \"number\" && typeof pos.y === \"number\") {\r\n layout.set(id, { x: pos.x, y: pos.y });\r\n }\r\n }\r\n return layout;\r\n }\r\n\r\n return null;\r\n } catch (error) {\r\n console.warn(\"[GridstackAdapter] Failed to load layout from storage:\", error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Saves layout to localStorage in Gridstack format\r\n */\r\nexport function saveLayoutToStorage(widgets: IDashboardWidget[], layout: Map<string, DashboardWidgetPosition>): void {\r\n try {\r\n const gridstackFormat: GridStackWidget[] = widgets.map((widget) => {\r\n const pos = layout.get(widget.id);\r\n return {\r\n id: widget.id,\r\n x: pos?.x ?? widget.position?.x ?? 0,\r\n y: pos?.y ?? widget.position?.y ?? 0,\r\n w: widget.size.width,\r\n h: widget.size.height,\r\n };\r\n });\r\n\r\n localStorage.setItem(LAYOUT_STORAGE_KEY, JSON.stringify(gridstackFormat));\r\n } catch (error) {\r\n console.warn(\"[GridstackAdapter] Failed to save layout to storage:\", error);\r\n }\r\n}\r\n\r\n/**\r\n * Clears layout from localStorage\r\n */\r\nexport function clearLayoutStorage(): void {\r\n try {\r\n localStorage.removeItem(LAYOUT_STORAGE_KEY);\r\n } catch (error) {\r\n console.warn(\"[GridstackAdapter] Failed to clear layout storage:\", error);\r\n }\r\n}\r\n\r\n/**\r\n * Auto-arrange widgets in a grid layout\r\n * Places widgets side by side when possible, wrapping to next row\r\n */\r\nfunction autoArrangeWidgets(widgets: IDashboardWidget[], columns: number = 12): Map<string, DashboardWidgetPosition> {\r\n const layout = new Map<string, DashboardWidgetPosition>();\r\n\r\n // Track occupied cells in each row\r\n const rowOccupancy: Map<number, number[]> = new Map();\r\n\r\n const isPositionFree = (x: number, y: number, width: number, height: number): boolean => {\r\n for (let row = y; row < y + height; row++) {\r\n const occupied = rowOccupancy.get(row) || [];\r\n for (let col = x; col < x + width; col++) {\r\n if (occupied.includes(col)) return false;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n const occupyPosition = (x: number, y: number, width: number, height: number): void => {\r\n for (let row = y; row < y + height; row++) {\r\n const occupied = rowOccupancy.get(row) || [];\r\n for (let col = x; col < x + width; col++) {\r\n occupied.push(col);\r\n }\r\n rowOccupancy.set(row, occupied);\r\n }\r\n };\r\n\r\n const findFreePosition = (width: number, height: number): DashboardWidgetPosition => {\r\n let y = 0;\r\n while (true) {\r\n for (let x = 0; x <= columns - width; x++) {\r\n if (isPositionFree(x, y, width, height)) {\r\n return { x, y };\r\n }\r\n }\r\n y++;\r\n // Safety limit\r\n if (y > 100) break;\r\n }\r\n return { x: 0, y };\r\n };\r\n\r\n for (const widget of widgets) {\r\n const position = findFreePosition(widget.size.width, widget.size.height);\r\n layout.set(widget.id, position);\r\n occupyPosition(position.x, position.y, widget.size.width, widget.size.height);\r\n }\r\n\r\n return layout;\r\n}\r\n\r\n/**\r\n * Merges saved layout with widget defaults\r\n * Handles cases where widgets have been added/removed\r\n * Auto-arranges widgets that don't have positions\r\n */\r\nexport function mergeLayoutWithWidgets(\r\n widgets: IDashboardWidget[],\r\n savedLayout: Map<string, DashboardWidgetPosition> | null,\r\n): Map<string, DashboardWidgetPosition> {\r\n // If we have a saved layout with positions, use it\r\n if (savedLayout && savedLayout.size > 0) {\r\n const layout = new Map<string, DashboardWidgetPosition>();\r\n\r\n for (const widget of widgets) {\r\n const savedPos = savedLayout.get(widget.id);\r\n const builtInPos = widget.position;\r\n const position = savedPos ?? builtInPos ?? { x: 0, y: 0 };\r\n layout.set(widget.id, position);\r\n }\r\n\r\n return layout;\r\n }\r\n\r\n // Check if all widgets have built-in positions\r\n const allHavePositions = widgets.every((w) => w.position !== undefined);\r\n\r\n if (allHavePositions) {\r\n const layout = new Map<string, DashboardWidgetPosition>();\r\n for (const widget of widgets) {\r\n layout.set(widget.id, widget.position!);\r\n }\r\n return layout;\r\n }\r\n\r\n // Auto-arrange widgets\r\n return autoArrangeWidgets(widgets);\r\n}\r\n","/**\r\n * Gridstack Integration Composable\r\n *\r\n * Provides Vue 3 integration with Gridstack.js library.\r\n * Handles initialization, event binding, and cleanup.\r\n */\r\n\r\nimport { ref, shallowRef, onUnmounted, watch, nextTick, type Ref, type ShallowRef } from \"vue\";\r\nimport { GridStack, type GridStackOptions, type GridStackNode } from \"gridstack\";\r\nimport type { IDashboardWidget, DashboardWidgetPosition } from \"@shell/dashboard/draggable-dashboard/types\";\r\nimport {\r\n toGridstackWidget,\r\n fromGridstackNode,\r\n loadLayoutFromStorage,\r\n saveLayoutToStorage,\r\n mergeLayoutWithWidgets,\r\n} from \"@shell/dashboard/draggable-dashboard/composables/useGridstackAdapter\";\r\n\r\n/**\r\n * Default Gridstack configuration\r\n */\r\nconst DEFAULT_OPTIONS: GridStackOptions = {\r\n column: 12,\r\n cellHeight: 80,\r\n margin: \"10px\",\r\n float: false,\r\n animate: true,\r\n // Disable responsive column changes - always use 12 columns\r\n columnOpts: {\r\n breakpoints: [{ w: 0, c: 12 }], // Always 12 columns regardless of width\r\n },\r\n draggable: {\r\n handle: \".grid-stack-item-content\",\r\n },\r\n resizable: {\r\n handles: \"se\", // Only bottom-right corner\r\n },\r\n};\r\n\r\n/**\r\n * Options for useGridstack composable\r\n */\r\nexport interface UseGridstackOptions {\r\n /** Gridstack configuration options */\r\n gridOptions?: Partial<GridStackOptions>;\r\n /** Enable widget resizing */\r\n resizable?: boolean;\r\n /** Auto-save layout to localStorage */\r\n autoSave?: boolean;\r\n /** Callback when layout changes */\r\n onLayoutChange?: (layout: Map<string, DashboardWidgetPosition>) => void;\r\n}\r\n\r\n/**\r\n * Return type for useGridstack composable\r\n */\r\nexport interface UseGridstackReturn {\r\n /** Reference to GridStack instance */\r\n grid: ShallowRef<GridStack | null>;\r\n /** Current layout map */\r\n layout: Ref<Map<string, DashboardWidgetPosition>>;\r\n /** Whether grid is initialized */\r\n isInitialized: Ref<boolean>;\r\n /** Initialize grid on element */\r\n initGrid: (element: HTMLElement) => void;\r\n /** Destroy grid instance */\r\n destroyGrid: () => void;\r\n /** Add a widget to the grid */\r\n addWidget: (widget: IDashboardWidget) => void;\r\n /** Remove a widget from the grid */\r\n removeWidget: (widgetId: string) => void;\r\n /** Update widget position */\r\n updateWidgetPosition: (widgetId: string, position: DashboardWidgetPosition) => void;\r\n /** Save current layout */\r\n saveLayout: () => void;\r\n /** Load layout from storage */\r\n loadLayout: () => void;\r\n /** Reset to built-in positions */\r\n resetToDefaults: () => void;\r\n /** Batch update mode (disable animations) */\r\n batchUpdate: (fn: () => void) => void;\r\n}\r\n\r\n/**\r\n * Vue 3 composable for Gridstack integration\r\n */\r\nexport function useGridstack(widgets: Ref<IDashboardWidget[]>, options: UseGridstackOptions = {}): UseGridstackReturn {\r\n const { gridOptions = {}, resizable = false, autoSave = true, onLayoutChange } = options;\r\n\r\n // State\r\n const grid = shallowRef<GridStack | null>(null);\r\n const layout = ref<Map<string, DashboardWidgetPosition>>(new Map());\r\n const isInitialized = ref(false);\r\n const isUpdating = ref(false);\r\n\r\n /**\r\n * Merge options with defaults\r\n */\r\n const mergedOptions: GridStackOptions = {\r\n ...DEFAULT_OPTIONS,\r\n ...gridOptions,\r\n disableResize: !resizable,\r\n };\r\n\r\n /**\r\n * Initialize the grid on a DOM element\r\n */\r\n const initGrid = (element: HTMLElement): void => {\r\n if (grid.value) {\r\n console.warn(\"[useGridstack] Grid already initialized\");\r\n return;\r\n }\r\n\r\n // Load saved layout\r\n const savedLayout = loadLayoutFromStorage();\r\n layout.value = mergeLayoutWithWidgets(widgets.value, savedLayout);\r\n\r\n // Initialize Gridstack\r\n grid.value = GridStack.init(mergedOptions, element);\r\n\r\n // Bind event handlers\r\n grid.value.on(\"change\", handleChange);\r\n grid.value.on(\"added\", handleAdded);\r\n grid.value.on(\"removed\", handleRemoved);\r\n\r\n // Explicitly load widgets with their positions to ensure proper layout\r\n // This is needed because Vue renders DOM after Gridstack.init() processes children\r\n const widgetData = widgets.value.map((widget) => {\r\n const position = layout.value.get(widget.id);\r\n return toGridstackWidget(widget, position);\r\n });\r\n\r\n // Use load() to apply positions - this updates existing items\r\n grid.value.load(widgetData);\r\n\r\n isInitialized.value = true;\r\n };\r\n\r\n /**\r\n * Handle grid change events (drag/resize)\r\n */\r\n const handleChange = (_event: Event, nodes: GridStackNode[]): void => {\r\n if (isUpdating.value) return;\r\n\r\n for (const node of nodes) {\r\n const { id, position } = fromGridstackNode(node);\r\n if (id) {\r\n layout.value.set(id, position);\r\n }\r\n }\r\n\r\n // Trigger reactivity\r\n layout.value = new Map(layout.value);\r\n\r\n // Notify callback\r\n onLayoutChange?.(layout.value);\r\n\r\n // Auto-save\r\n if (autoSave) {\r\n saveLayout();\r\n }\r\n };\r\n\r\n /**\r\n * Handle widget added event\r\n */\r\n const handleAdded = (_event: Event, nodes: GridStackNode[]): void => {\r\n for (const node of nodes) {\r\n const { id, position } = fromGridstackNode(node);\r\n if (id && !layout.value.has(id)) {\r\n layout.value.set(id, position);\r\n }\r\n }\r\n layout.value = new Map(layout.value);\r\n };\r\n\r\n /**\r\n * Handle widget removed event\r\n */\r\n const handleRemoved = (_event: Event, nodes: GridStackNode[]): void => {\r\n for (const node of nodes) {\r\n if (node.id) {\r\n layout.value.delete(node.id);\r\n }\r\n }\r\n layout.value = new Map(layout.value);\r\n };\r\n\r\n /**\r\n * Destroy the grid instance\r\n */\r\n const destroyGrid = (): void => {\r\n if (grid.value) {\r\n grid.value.off(\"change\");\r\n grid.value.off(\"added\");\r\n grid.value.off(\"removed\");\r\n grid.value.destroy(false); // false = don't remove DOM elements\r\n grid.value = null;\r\n isInitialized.value = false;\r\n }\r\n };\r\n\r\n /**\r\n * Add a widget to the grid\r\n */\r\n const addWidget = (widget: IDashboardWidget): void => {\r\n if (!grid.value) return;\r\n\r\n const position = layout.value.get(widget.id) ?? widget.position;\r\n const gsWidget = toGridstackWidget(widget, position);\r\n\r\n // Find the DOM element for this widget\r\n const element = document.querySelector(`[gs-id=\"${widget.id}\"]`);\r\n if (element) {\r\n grid.value.makeWidget(element as HTMLElement, gsWidget);\r\n }\r\n };\r\n\r\n /**\r\n * Remove a widget from the grid\r\n */\r\n const removeWidget = (widgetId: string): void => {\r\n if (!grid.value) return;\r\n\r\n const element = document.querySelector(`[gs-id=\"${widgetId}\"]`);\r\n if (element) {\r\n grid.value.removeWidget(element as HTMLElement, false);\r\n }\r\n layout.value.delete(widgetId);\r\n };\r\n\r\n /**\r\n * Update widget position programmatically\r\n */\r\n const updateWidgetPosition = (widgetId: string, position: DashboardWidgetPosition): void => {\r\n if (!grid.value) return;\r\n\r\n const element = document.querySelector(`[gs-id=\"${widgetId}\"]`);\r\n if (element) {\r\n isUpdating.value = true;\r\n grid.value.update(element as HTMLElement, { x: position.x, y: position.y });\r\n layout.value.set(widgetId, position);\r\n layout.value = new Map(layout.value);\r\n isUpdating.value = false;\r\n }\r\n };\r\n\r\n /**\r\n * Save current layout to localStorage\r\n */\r\n const saveLayout = (): void => {\r\n saveLayoutToStorage(widgets.value, layout.value);\r\n };\r\n\r\n /**\r\n * Load layout from localStorage\r\n */\r\n const loadLayout = (): void => {\r\n const savedLayout = loadLayoutFromStorage();\r\n if (savedLayout) {\r\n layout.value = mergeLayoutWithWidgets(widgets.value, savedLayout);\r\n applyLayoutToGrid();\r\n }\r\n };\r\n\r\n /**\r\n * Reset to built-in widget positions\r\n */\r\n const resetToDefaults = (): void => {\r\n layout.value = new Map();\r\n for (const widget of widgets.value) {\r\n if (widget.position) {\r\n layout.value.set(widget.id, { ...widget.position });\r\n }\r\n }\r\n applyLayoutToGrid();\r\n saveLayout();\r\n };\r\n\r\n /**\r\n * Apply current layout to grid\r\n */\r\n const applyLayoutToGrid = (): void => {\r\n if (!grid.value) return;\r\n\r\n isUpdating.value = true;\r\n grid.value.batchUpdate();\r\n\r\n for (const widget of widgets.value) {\r\n const position = layout.value.get(widget.id);\r\n if (position) {\r\n const element = document.querySelector(`[gs-id=\"${widget.id}\"]`);\r\n if (element) {\r\n grid.value.update(element as HTMLElement, {\r\n x: position.x,\r\n y: position.y,\r\n });\r\n }\r\n }\r\n }\r\n\r\n grid.value.batchUpdate(false);\r\n isUpdating.value = false;\r\n };\r\n\r\n /**\r\n * Execute function in batch update mode\r\n */\r\n const batchUpdate = (fn: () => void): void => {\r\n if (!grid.value) {\r\n fn();\r\n return;\r\n }\r\n\r\n isUpdating.value = true;\r\n grid.value.batchUpdate();\r\n fn();\r\n grid.value.batchUpdate(false);\r\n isUpdating.value = false;\r\n };\r\n\r\n // Watch for widget changes\r\n watch(\r\n widgets,\r\n async (newWidgets, oldWidgets) => {\r\n if (!grid.value || !isInitialized.value) return;\r\n\r\n await nextTick();\r\n\r\n // Find added widgets\r\n const addedWidgets = newWidgets.filter((w) => !oldWidgets?.some((ow) => ow.id === w.id));\r\n\r\n // Find removed widgets\r\n const removedWidgetIds =\r\n oldWidgets?.filter((w) => !newWidgets.some((nw) => nw.id === w.id)).map((w) => w.id) ?? [];\r\n\r\n // Remove old widgets\r\n for (const id of removedWidgetIds) {\r\n removeWidget(id);\r\n }\r\n\r\n // Add new widgets\r\n for (const widget of addedWidgets) {\r\n addWidget(widget);\r\n }\r\n },\r\n { deep: false },\r\n );\r\n\r\n // Cleanup on unmount\r\n onUnmounted(() => {\r\n destroyGrid();\r\n });\r\n\r\n return {\r\n grid,\r\n layout,\r\n isInitialized,\r\n initGrid,\r\n destroyGrid,\r\n addWidget,\r\n removeWidget,\r\n updateWidgetPosition,\r\n saveLayout,\r\n loadLayout,\r\n resetToDefaults,\r\n batchUpdate,\r\n };\r\n}\r\n","<template>\n <div\n class=\"dashboard-widget-skeleton\"\n aria-hidden=\"true\"\n >\n <div class=\"dashboard-widget-skeleton__header\">\n <div class=\"dashboard-widget-skeleton__icon\" />\n <div class=\"dashboard-widget-skeleton__title\" />\n </div>\n <div class=\"dashboard-widget-skeleton__stats\">\n <div class=\"dashboard-widget-skeleton__stat\" />\n <div class=\"dashboard-widget-skeleton__stat\" />\n <div class=\"dashboard-widget-skeleton__stat\" />\n </div>\n <div class=\"dashboard-widget-skeleton__body\">\n <div class=\"dashboard-widget-skeleton__line dashboard-widget-skeleton__line--w80\" />\n <div class=\"dashboard-widget-skeleton__line dashboard-widget-skeleton__line--w60\" />\n <div class=\"dashboard-widget-skeleton__line dashboard-widget-skeleton__line--w90\" />\n <div class=\"dashboard-widget-skeleton__line dashboard-widget-skeleton__line--w70\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\"></script>\n\n<style lang=\"scss\">\n:root {\n --dashboard-widget-skeleton-bg: var(--dashboard-widget-card-background, var(--additional-50));\n --dashboard-widget-skeleton-border-color: var(--dashboard-widget-card-border-color, var(--neutrals-200));\n --dashboard-widget-skeleton-radius: var(--dashboard-widget-card-border-radius, 8px);\n --dashboard-widget-skeleton-shadow: var(\n --dashboard-widget-card-shadow,\n 0 1px 3px rgba(0, 0, 0, 0.08) 0 1px 2px rgba(0, 0, 0, 0.06)\n );\n --dashboard-widget-skeleton-shimmer-from: var(--neutrals-100);\n --dashboard-widget-skeleton-shimmer-to: var(--neutrals-200);\n}\n\n@keyframes dashboard-widget-skeleton-shimmer {\n 0% {\n background-position: -400px 0;\n }\n 100% {\n background-position: 400px 0;\n }\n}\n\n.dashboard-widget-skeleton {\n @apply tw-overflow-hidden tw-h-full tw-flex tw-flex-col;\n background: var(--dashboard-widget-skeleton-bg);\n border: 1px solid var(--dashboard-widget-skeleton-border-color);\n border-radius: var(--dashboard-widget-skeleton-radius);\n box-shadow: var(--dashboard-widget-skeleton-shadow);\n\n %shimmer {\n background: linear-gradient(\n 90deg,\n var(--dashboard-widget-skeleton-shimmer-from) 0%,\n var(--dashboard-widget-skeleton-shimmer-to) 50%,\n var(--dashboard-widget-skeleton-shimmer-from) 100%\n );\n background-size: 800px 100%;\n animation: dashboard-widget-skeleton-shimmer 1.4s ease-in-out infinite;\n border-radius: 4px;\n }\n\n &__header {\n @apply tw-px-5 tw-py-4 tw-flex tw-items-center tw-gap-3;\n }\n\n &__icon {\n @apply tw-w-9 tw-h-9 tw-rounded-lg tw-flex-shrink-0;\n @extend %shimmer;\n }\n\n &__title {\n @apply tw-h-5 tw-flex-1 tw-max-w-[180px];\n @extend %shimmer;\n }\n\n &__stats {\n @apply tw-px-5 tw-py-3 tw-flex tw-items-center tw-gap-6;\n border-top: 1px solid var(--dashboard-widget-skeleton-border-color);\n border-bottom: 1px solid var(--dashboard-widget-skeleton-border-color);\n }\n\n &__stat {\n @apply tw-h-6 tw-flex-1;\n @extend %shimmer;\n }\n\n &__body {\n @apply tw-flex-1 tw-min-h-0 tw-px-5 tw-py-4 tw-flex tw-flex-col tw-gap-3;\n }\n\n &__line {\n @apply tw-h-3;\n @extend %shimmer;\n\n &--w60 {\n @apply tw-w-3/5;\n }\n &--w70 {\n @apply tw-w-7/12;\n }\n &--w80 {\n @apply tw-w-4/5;\n }\n &--w90 {\n @apply tw-w-11/12;\n }\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dashboard-widget-skeleton {\n %shimmer {\n animation: none;\n }\n }\n}\n</style>\n","<template>\n <VcContainer\n no-padding\n class=\"vc-gridstack-dashboard\"\n >\n <div\n v-if=\"!modulesReady\"\n class=\"vc-gridstack-dashboard__skeleton-grid\"\n role=\"status\"\n aria-busy=\"true\"\n :aria-label=\"ariaLabel\"\n >\n <DashboardWidgetSkeleton\n v-for=\"(item, index) in skeletonItems\"\n :key=\"`skeleton-${index}`\"\n class=\"vc-gridstack-dashboard__skeleton-item\"\n :style=\"skeletonItemStyle(item)\"\n />\n </div>\n <div\n v-else\n ref=\"gridRef\"\n class=\"grid-stack vc-gridstack-dashboard__grid\"\n role=\"list\"\n :aria-label=\"ariaLabel\"\n >\n <div\n v-for=\"(widget, index) in widgets\"\n :key=\"widget.id\"\n class=\"grid-stack-item\"\n :gs-id=\"widget.id\"\n :gs-x=\"getPosition(widget.id)?.x ?? widget.position?.x ?? 0\"\n :gs-y=\"getPosition(widget.id)?.y ?? widget.position?.y ?? 0\"\n :gs-w=\"widget.size.width\"\n :gs-h=\"widget.size.height\"\n :gs-min-w=\"2\"\n :gs-min-h=\"2\"\n role=\"listitem\"\n :aria-label=\"getWidgetAriaLabel(widget, index)\"\n >\n <div class=\"grid-stack-item-content\">\n <!-- Drag handle (optional) -->\n <div\n v-if=\"showDragHandles\"\n class=\"vc-gridstack-dashboard__drag-handle\"\n aria-hidden=\"true\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n >\n <circle\n cx=\"5\"\n cy=\"3\"\n r=\"1.5\"\n />\n <circle\n cx=\"11\"\n cy=\"3\"\n r=\"1.5\"\n />\n <circle\n cx=\"5\"\n cy=\"8\"\n r=\"1.5\"\n />\n <circle\n cx=\"11\"\n cy=\"8\"\n r=\"1.5\"\n />\n <circle\n cx=\"5\"\n cy=\"13\"\n r=\"1.5\"\n />\n <circle\n cx=\"11\"\n cy=\"13\"\n r=\"1.5\"\n />\n </svg>\n </div>\n\n <!-- Widget content -->\n <component\n :is=\"widget.component\"\n v-bind=\"widget.props || {}\"\n class=\"vc-gridstack-dashboard__widget-content\"\n />\n </div>\n </div>\n </div>\n\n <!-- Screen reader announcements -->\n <div\n class=\"vc-gridstack-dashboard__live-region\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ liveAnnouncement }}\n </div>\n </VcContainer>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * GridstackDashboard Component\n *\n * A flexible dashboard powered by Gridstack.js that allows widgets to be\n * dragged and arranged in a grid layout.\n *\n * Features:\n * - Drag and drop interface for arranging widgets\n * - Optional widget resizing\n * - Automatic layout persistence in localStorage\n * - Support for built-in widget positions\n * - Accessibility support\n */\nimport { ref, computed, onMounted, nextTick, inject, watch } from \"vue\";\nimport type { IDashboardWidget, DashboardWidgetPosition } from \"@shell/dashboard/draggable-dashboard/types\";\nimport { useDashboard } from \"@core/composables/useDashboard\";\nimport { useGridstack } from \"@shell/dashboard/draggable-dashboard/composables/useGridstack\";\nimport VcContainer from \"@ui/components/atoms/vc-container/vc-container.vue\";\nimport DashboardWidgetSkeleton from \"@shell/dashboard/draggable-dashboard/DashboardWidgetSkeleton.vue\";\nimport { ModulesReadyKey } from \"@framework/injection-keys\";\nimport { LAYOUT_STORAGE_KEY } from \"@shell/dashboard/draggable-dashboard/composables/useGridstackAdapter\";\nimport \"gridstack/dist/gridstack.min.css\";\n\ninterface SkeletonItem {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n// Default placeholders shown when there's no persisted layout yet (first visit).\n// 6×6 matches the typical real widget size in vc-shell apps.\nconst DEFAULT_SKELETONS: SkeletonItem[] = [\n { x: 0, y: 0, w: 6, h: 6 },\n { x: 6, y: 0, w: 6, h: 6 },\n { x: 0, y: 6, w: 6, h: 6 },\n { x: 6, y: 6, w: 6, h: 6 },\n];\n\nfunction readPersistedSkeletons(): SkeletonItem[] | null {\n if (typeof window === \"undefined\") return null;\n try {\n const raw = window.localStorage.getItem(LAYOUT_STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return null;\n const items = parsed\n .filter(\n (n: unknown): n is SkeletonItem =>\n !!n &&\n typeof n === \"object\" &&\n typeof (n as SkeletonItem).w === \"number\" &&\n typeof (n as SkeletonItem).h === \"number\" &&\n typeof (n as SkeletonItem).x === \"number\" &&\n typeof (n as SkeletonItem).y === \"number\",\n )\n .map((n) => ({ x: n.x, y: n.y, w: n.w, h: n.h }));\n return items.length > 0 ? items : null;\n } catch {\n return null;\n }\n}\n\n// Props\ninterface Props {\n /** Show drag handle icons on widgets */\n showDragHandles?: boolean;\n /** Enable widget resizing */\n resizable?: boolean;\n /** Aria label for the dashboard container */\n ariaLabel?: string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showDragHandles: false,\n resizable: false,\n ariaLabel: \"Dashboard widgets. Drag widgets to rearrange.\",\n});\n\n// Refs\nconst gridRef = ref<HTMLElement | null>(null);\nconst liveAnnouncement = ref(\"\");\n\n// Gate dashboard rendering until remote modules finish installing.\n// Without this, widgets preregistered during loadRemote() can mount before\n// their owning module's `defineAppModule.install` runs `mergeLocaleMessage`,\n// causing missing translations. Fallback `ref(true)` keeps tests/stories and\n// hosts without MF working unchanged.\nconst modulesReady = inject(ModulesReadyKey, ref(true));\n\n// Skeleton placeholders shown until modules finish loading. Pulled from the last\n// persisted layout (so returning users see card sizes matching their real dashboard);\n// fallback to a generic 4-card grid on first visit.\nconst skeletonItems = computed<SkeletonItem[]>(() => {\n if (modulesReady.value) return [];\n return readPersistedSkeletons() ?? DEFAULT_SKELETONS;\n});\n\nconst skeletonItemStyle = (item: SkeletonItem): Record<string, string> => ({\n gridColumn: `${item.x + 1} / span ${item.w}`,\n gridRow: `${item.y + 1} / span ${item.h}`,\n});\n\n// Dashboard service\nconst dashboard = useDashboard();\nconst widgets = computed(() => dashboard.getWidgets() as IDashboardWidget[]);\n\n// Gridstack integration\nconst { layout, isInitialized, initGrid, saveLayout, resetToDefaults } = useGridstack(widgets, {\n resizable: props.resizable,\n autoSave: true,\n gridOptions: {\n draggable: {\n handle: props.showDragHandles ? \".vc-gridstack-dashboard__drag-handle\" : \".grid-stack-item-content\",\n },\n },\n onLayoutChange: (newLayout) => {\n // Sync with dashboard service\n for (const [widgetId, position] of newLayout) {\n dashboard.updateWidgetPosition(widgetId, position);\n }\n announceToScreenReader(\"Widget positions updated\");\n },\n});\n\n// Helper to get widget position\nconst getPosition = (widgetId: string): DashboardWidgetPosition | undefined => {\n return layout.value.get(widgetId);\n};\n\n// Accessibility helpers\nconst getWidgetAriaLabel = (widget: IDashboardWidget, index: number): string => {\n const name = widget.name || widget.id;\n return `${name}, widget ${index + 1} of ${widgets.value.length}. Drag to reorder.`;\n};\n\nconst announceToScreenReader = (message: string): void => {\n liveAnnouncement.value = message;\n setTimeout(() => {\n liveAnnouncement.value = \"\";\n }, 1000);\n};\n\nconst tryInitGrid = async (): Promise<void> => {\n await nextTick();\n if (gridRef.value && !isInitialized.value) {\n initGrid(gridRef.value);\n }\n};\n\nonMounted(tryInitGrid);\n\n// When modules finish loading, the v-if mounts gridRef — initialize gridstack then.\nwatch(modulesReady, (ready) => {\n if (ready) tryInitGrid();\n});\n\n// Public methods\nconst rearrangeWidgets = (): void => {\n resetToDefaults();\n};\n\nconst recalculateLayout = (): void => {\n // Gridstack handles this automatically\n};\n\nconst useBuiltInPositions = (): boolean => {\n resetToDefaults();\n return true;\n};\n\n// Expose public methods\ndefineExpose({\n rearrangeWidgets,\n recalculateLayout,\n saveLayout,\n useBuiltInPositions,\n});\n</script>\n\n<style lang=\"scss\">\n@import \"gridstack/dist/gridstack.min.css\";\n\n:root {\n --gridstack-dashboard-background: var(--additional-50);\n --gridstack-widget-background: var(--additional-50);\n --gridstack-widget-border-radius: 8px;\n --gridstack-widget-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n --gridstack-widget-shadow-dragging: 0 8px 24px rgba(0, 0, 0, 0.15);\n --gridstack-placeholder-background: rgba(59, 130, 246, 0.1);\n --gridstack-placeholder-border: rgba(59, 130, 246, 0.5);\n --gridstack-drag-handle-color: var(--neutrals-400);\n --gridstack-drag-handle-color-hover: var(--neutrals-600);\n}\n\n.vc-gridstack-dashboard {\n background-color: var(--gridstack-dashboard-background);\n min-height: 100%;\n\n &__grid {\n padding: 24px 18px;\n min-height: calc(80px * 8 + 24px * 2); // 8 rows minimum\n }\n\n // Skeleton grid mirrors gridstack's 12-column geometry. Row height and gap are\n // tuned so a 6×6 placeholder visually matches a real 6×6 widget rendered by\n // gridstack (which collapses margins differently than a plain CSS grid).\n &__skeleton-grid {\n display: grid;\n grid-template-columns: repeat(12, 1fr);\n grid-auto-rows: 55px;\n gap: 20px;\n padding: 24px 18px;\n min-height: calc(55px * 8 + 24px * 2);\n }\n\n &__skeleton-item {\n min-width: 0;\n min-height: 0;\n }\n\n // Widget item styling\n .grid-stack-item {\n &-content {\n background: var(--gridstack-widget-background);\n border-radius: var(--gridstack-widget-border-radius);\n box-shadow: var(--gridstack-widget-shadow);\n overflow: hidden;\n // Note: Don't set height: 100% - Gridstack uses position: absolute with inset for margins\n transition: box-shadow 0.2s ease;\n }\n\n // Dragging state\n &.ui-draggable-dragging {\n .grid-stack-item-content {\n box-shadow: var(--gridstack-widget-shadow-dragging);\n }\n }\n\n // Resizing state\n &.ui-resizable-resizing {\n .grid-stack-item-content {\n box-shadow: var(--gridstack-widget-shadow-dragging);\n }\n }\n }\n\n // Placeholder styling\n .grid-stack-placeholder {\n > .placeholder-content {\n background: var(--gridstack-placeholder-background);\n border: 2px dashed var(--gridstack-placeholder-border);\n border-radius: var(--gridstack-widget-border-radius);\n }\n }\n\n // Drag handle\n &__drag-handle {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: var(--z-local-sticky);\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--gridstack-drag-handle-color);\n cursor: grab;\n border-radius: 4px;\n transition:\n color 0.15s ease,\n background-color 0.15s ease;\n\n &:hover {\n color: var(--gridstack-drag-handle-color-hover);\n background-color: rgba(0, 0, 0, 0.05);\n }\n\n &:active {\n cursor: grabbing;\n }\n }\n\n // Widget content\n &__widget-content {\n width: 100%;\n height: 100%;\n }\n\n // Screen reader only\n &__live-region {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n}\n\n// Respect reduced motion preference\n@media (prefers-reduced-motion: reduce) {\n .vc-gridstack-dashboard {\n .grid-stack-item {\n transition: none !important;\n\n &-content {\n transition: none !important;\n }\n }\n }\n\n .grid-stack {\n &.grid-stack-animate {\n .grid-stack-item {\n transition: none !important;\n }\n }\n }\n}\n</style>\n","<template>\n <GridstackDashboard\n ref=\"dashboardRef\"\n :show-drag-handles=\"showDragHandles\"\n :resizable=\"resizable\"\n :aria-label=\"ariaLabel\"\n />\n</template>\n\n<script setup lang=\"ts\">\n/**\n * DraggableDashboard Component\n *\n * A flexible dashboard powered by Gridstack.js that allows widgets to be\n * dragged and arranged in a grid layout.\n *\n * Features:\n * - Drag and drop interface for arranging widgets\n * - Automatic layout persistence in localStorage\n * - Support for built-in widget positions\n * - Accessibility support (a11y)\n * - Optional widget resizing\n */\nimport { ref } from \"vue\";\nimport GridstackDashboard from \"@shell/dashboard/draggable-dashboard/GridstackDashboard.vue\";\n\n// Props\ninterface Props {\n /** Show drag handle icons on widgets */\n showDragHandles?: boolean;\n /** Enable widget resizing */\n resizable?: boolean;\n /** Aria label for the dashboard container */\n ariaLabel?: string;\n}\n\nwithDefaults(defineProps<Props>(), {\n showDragHandles: false,\n resizable: false,\n ariaLabel: \"Dashboard widgets. Drag widgets to rearrange.\",\n});\n\n// State\nconst dashboardRef = ref<InstanceType<typeof GridstackDashboard> | null>(null);\n\n// Public methods (delegated to GridstackDashboard)\nconst rearrangeWidgets = (): void => {\n dashboardRef.value?.rearrangeWidgets?.();\n};\n\nconst recalculateLayout = (): void => {\n dashboardRef.value?.recalculateLayout?.();\n};\n\nconst saveLayout = (): void => {\n dashboardRef.value?.saveLayout?.();\n};\n\nconst useBuiltInPositions = (): boolean => {\n return dashboardRef.value?.useBuiltInPositions?.() ?? false;\n};\n\n// Expose public methods\ndefineExpose({\n rearrangeWidgets,\n recalculateLayout,\n saveLayout,\n useBuiltInPositions,\n});\n</script>\n","// Main component\nexport { default as DraggableDashboard } from \"@shell/dashboard/draggable-dashboard/DraggableDashboard.vue\";\n\n// Types\nexport type {\n IDashboardWidget,\n DashboardWidgetPosition,\n DashboardWidgetSize,\n DashboardDragEvent,\n DashboardGridConfig,\n} from \"@shell/dashboard/draggable-dashboard/types\";\n\n// Gridstack composables (for advanced usage)\nexport { useGridstack } from \"@shell/dashboard/draggable-dashboard/composables/useGridstack\";\nexport type {\n UseGridstackOptions,\n UseGridstackReturn,\n} from \"@shell/dashboard/draggable-dashboard/composables/useGridstack\";\n\n// Import and re-export to avoid Storybook docgen issues with direct re-exports\nimport {\n toGridstackWidget as _toGridstackWidget,\n fromGridstackNode as _fromGridstackNode,\n loadLayoutFromStorage as _loadLayoutFromStorage,\n saveLayoutToStorage as _saveLayoutToStorage,\n mergeLayoutWithWidgets as _mergeLayoutWithWidgets,\n clearLayoutStorage as _clearLayoutStorage,\n LAYOUT_STORAGE_KEY as _LAYOUT_STORAGE_KEY,\n} from \"@shell/dashboard/draggable-dashboard/composables/useGridstackAdapter\";\n\nexport const toGridstackWidget = _toGridstackWidget;\nexport const fromGridstackNode = _fromGridstackNode;\nexport const loadLayoutFromStorage = _loadLayoutFromStorage;\nexport const saveLayoutToStorage = _saveLayoutToStorage;\nexport const mergeLayoutWithWidgets = _mergeLayoutWithWidgets;\nexport const clearLayoutStorage = _clearLayoutStorage;\nexport const LAYOUT_STORAGE_KEY = _LAYOUT_STORAGE_KEY;\n","<template>\n <div class=\"dashboard-widget-card\">\n <div class=\"dashboard-widget-card__header\">\n <slot name=\"header\">\n <div class=\"dashboard-widget-card__header-content\">\n <div\n v-if=\"icon\"\n class=\"dashboard-widget-card__icon-wrapper\"\n >\n <VcIcon\n class=\"dashboard-widget-card__icon\"\n :icon=\"icon\"\n size=\"l\"\n />\n </div>\n <div class=\"dashboard-widget-card__title\">{{ props.header }}</div>\n </div>\n </slot>\n <div\n v-if=\"$slots.actions\"\n class=\"dashboard-widget-card__actions\"\n >\n <slot name=\"actions\"></slot>\n </div>\n </div>\n\n <div\n v-if=\"$slots.stats\"\n class=\"dashboard-widget-card__stats\"\n >\n <slot name=\"stats\"></slot>\n </div>\n\n <div\n v-loading=\"loading\"\n class=\"dashboard-widget-card__body\"\n >\n <slot name=\"content\"></slot>\n </div>\n\n <div\n v-if=\"$slots.footer\"\n class=\"dashboard-widget-card__footer\"\n >\n <slot name=\"footer\"></slot>\n </div>\n </div>\n</template>\n\n<!-- eslint-disable @typescript-eslint/no-explicit-any -->\n<script setup lang=\"ts\">\nexport interface Props {\n header?: string;\n icon?: string;\n loading?: boolean;\n}\n\nimport { VcIcon } from \"@ui/components\";\nimport { vLoading } from \"@core/directives\";\n\nconst props = defineProps<Props>();\n\ndefineSlots<{\n header?: (props: any) => any;\n actions?: (props: any) => any;\n stats?: (props: any) => any;\n content?: (props: any) => any;\n footer?: (props: any) => any;\n}>();\n</script>\n\n<style lang=\"scss\">\n:root {\n // Legacy variables (preserved for backward compat)\n --dashboard-widget-card-header-color: var(--additional-50);\n --dashboard-widget-card-header-text-color: var(--neutrals-950);\n --dashboard-widget-card-icon-color: var(--primary-600);\n --dashboard-widget-card-header-border-color: var(--neutrals-200);\n\n // New variables\n --dashboard-widget-card-background: var(--additional-50);\n --dashboard-widget-card-border-color: var(--neutrals-200);\n --dashboard-widget-card-border-radius: 8px;\n --dashboard-widget-card-shadow: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.06);\n --dashboard-widget-card-shadow-hover: 0 4px 12px rgba(0, 0, 0, 0.1);\n --dashboard-widget-card-icon-bg: var(--primary-50);\n --dashboard-widget-card-stats-bg: var(--neutrals-50);\n --dashboard-widget-card-footer-color: var(--primary-700);\n}\n\n.dashboard-widget-card {\n @apply tw-overflow-hidden tw-h-full tw-flex tw-flex-col;\n background: var(--dashboard-widget-card-background);\n border: 1px solid var(--dashboard-widget-card-border-color);\n border-radius: var(--dashboard-widget-card-border-radius);\n box-shadow: var(--dashboard-widget-card-shadow);\n transition: box-shadow 0.2s ease;\n\n &:hover {\n box-shadow: var(--dashboard-widget-card-shadow-hover);\n }\n\n &__header {\n @apply tw-px-5 tw-py-4 tw-flex tw-justify-between tw-items-center tw-gap-3;\n }\n\n &__header-content {\n @apply tw-flex tw-items-center tw-gap-3 tw-min-w-0;\n }\n\n &__icon-wrapper {\n @apply tw-flex tw-items-center tw-justify-center tw-w-9 tw-h-9 tw-rounded-lg tw-flex-shrink-0;\n background: var(--dashboard-widget-card-icon-bg);\n }\n\n &__icon {\n @apply tw-text-[var(--dashboard-widget-card-icon-color)];\n }\n\n &__title {\n @apply tw-text-lg tw-font-semibold tw-truncate;\n color: var(--dashboard-widget-card-header-text-color);\n }\n\n &__actions {\n @apply tw-flex tw-items-center tw-gap-2 tw-flex-shrink-0;\n }\n\n &__stats {\n @apply tw-px-5 tw-py-3 tw-flex tw-items-center tw-gap-6;\n background: var(--dashboard-widget-card-stats-bg);\n border-top: 1px solid var(--dashboard-widget-card-border-color);\n border-bottom: 1px solid var(--dashboard-widget-card-border-color);\n }\n\n &__body {\n @apply tw-flex-1 tw-min-h-0;\n }\n\n &__footer {\n @apply tw-px-5 tw-py-3 tw-text-center;\n border-top: 1px solid var(--dashboard-widget-card-border-color);\n\n a,\n button {\n @apply tw-text-sm tw-font-medium tw-no-underline;\n color: var(--dashboard-widget-card-footer-color);\n transition: opacity 0.15s ease;\n\n &:hover {\n @apply tw-underline;\n opacity: 0.85;\n }\n }\n }\n}\n\n// Shared activity-feed row style for dashboard card content\n.dashboard-feed-row {\n @apply tw-flex tw-items-center tw-justify-between tw-px-5 tw-py-2.5 tw-cursor-pointer tw-transition-colors;\n\n &:hover {\n background: var(--dashboard-widget-card-icon-bg, var(--primary-50));\n }\n}\n</style>\n","<template>\n <div class=\"dashboard-stat-item\">\n <div\n class=\"dashboard-stat-item__value\"\n :class=\"variant ? `dashboard-stat-item__value--${variant}` : ''\"\n >\n {{ value }}\n </div>\n <div class=\"dashboard-stat-item__label\">{{ label }}</div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nexport interface DashboardStatItemProps {\n /** The metric value to display */\n value: string | number;\n /** Descriptive label below the value */\n label: string;\n /** Color variant for the value */\n variant?: \"default\" | \"success\" | \"warning\" | \"danger\";\n}\n\ndefineProps<DashboardStatItemProps>();\n</script>\n\n<style lang=\"scss\">\n:root {\n --dashboard-stat-item-value-color: var(--neutrals-950);\n --dashboard-stat-item-label-color: var(--neutrals-500);\n}\n\n.dashboard-stat-item {\n @apply tw-flex tw-flex-col tw-items-center tw-min-w-0;\n\n &__value {\n @apply tw-text-lg tw-font-semibold tw-leading-tight tw-text-[var(--dashboard-stat-item-value-color)] tw-truncate tw-max-w-full;\n\n &--success {\n @apply tw-text-[var(--success-600)];\n }\n\n &--warning {\n @apply tw-text-[var(--warning-600)];\n }\n\n &--danger {\n @apply tw-text-[var(--danger-600)];\n }\n }\n\n &__label {\n @apply tw-text-xs tw-text-[var(--dashboard-stat-item-label-color)] tw-mt-0.5 tw-truncate tw-max-w-full;\n }\n}\n</style>\n","<!-- eslint-disable @typescript-eslint/no-explicit-any -->\n<template>\n <div class=\"tw-divide-y tw-divide-[var(--neutrals-200)]\">\n <slot />\n </div>\n</template>\n\n<script setup lang=\"ts\">\ndefineSlots<{\n default: (props: any) => any;\n}>();\n</script>\n","<!-- eslint-disable @typescript-eslint/no-explicit-any -->\n<template>\n <div\n class=\"dashboard-feed-row\"\n @click=\"$emit('click')\"\n >\n <div class=\"tw-flex tw-items-center tw-gap-2.5 tw-min-w-0\">\n <slot />\n </div>\n <div\n v-if=\"$slots.trailing\"\n class=\"tw-flex tw-items-center tw-gap-3 tw-flex-shrink-0 tw-ml-3\"\n >\n <slot name=\"trailing\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\ndefineEmits<{\n click: [];\n}>();\n\ndefineSlots<{\n default: (props: any) => any;\n trailing: (props: any) => any;\n}>();\n</script>\n"],"names":["LAYOUT_STORAGE_KEY","toGridstackWidget","widget","position","pos","fromGridstackNode","node","gridstackNodesToLayoutMap","nodes","layout","loadLayoutFromStorage","stored","parsed","id","error","saveLayoutToStorage","widgets","gridstackFormat","clearLayoutStorage","autoArrangeWidgets","columns","rowOccupancy","isPositionFree","x","y","width","height","row","occupied","col","occupyPosition","findFreePosition","mergeLayoutWithWidgets","savedLayout","savedPos","builtInPos","w","DEFAULT_OPTIONS","useGridstack","options","gridOptions","resizable","autoSave","onLayoutChange","grid","shallowRef","ref","isInitialized","isUpdating","mergedOptions","initGrid","element","GridStack","handleChange","handleAdded","handleRemoved","widgetData","_event","saveLayout","destroyGrid","addWidget","gsWidget","removeWidget","widgetId","updateWidgetPosition","loadLayout","applyLayoutToGrid","resetToDefaults","batchUpdate","fn","watch","newWidgets","oldWidgets","nextTick","addedWidgets","ow","removedWidgetIds","nw","onUnmounted","_openBlock","_createElementBlock","_hoisted_1","_cache","DEFAULT_SKELETONS","readPersistedSkeletons","raw","items","n","props","__props","gridRef","liveAnnouncement","modulesReady","inject","ModulesReadyKey","skeletonItems","computed","skeletonItemStyle","item","dashboard","useDashboard","newLayout","announceToScreenReader","getPosition","getWidgetAriaLabel","index","message","tryInitGrid","onMounted","ready","__expose","_createBlock","VcContainer","_unref","_Fragment","_renderList","_createElementVNode","_hoisted_4","_hoisted_5","_resolveDynamicComponent","_mergeProps","DashboardWidgetSkeleton","_normalizeStyle","_hoisted_6","_toDisplayString","dashboardRef","GridstackDashboard","_toGridstackWidget","_fromGridstackNode","_loadLayoutFromStorage","_saveLayoutToStorage","_mergeLayoutWithWidgets","_clearLayoutStorage","_LAYOUT_STORAGE_KEY","_hoisted_2","_renderSlot","_ctx","_hoisted_3","_createVNode","VcIcon","$slots","_hoisted_7","_withDirectives","_hoisted_8","_hoisted_9","_normalizeClass","$emit"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
- import { inject as c, computed as b, watch as _, onUnmounted as m } from "vue";
2
- import { b as v, B as y, d as p, D as C, A as x } from "./VcAiAgentPanel.vue_vue_type_style_index_0_lang-D077_c8I.js";
1
+ import { inject as c, computed as b, watch as m, onUnmounted as _ } from "vue";
2
+ import { A as v, B as y, c as p } from "./VcAiAgentPanel.vue_vue_type_style_index_0_lang-D2KmNhhl.js";
3
+ import { D as C, A as x } from "./VcAiAgentPanel.vue_vue_type_script_setup_true_lang-Cx8_DCu_.js";
3
4
  const s = p("use-ai-agent-context");
4
5
  function D(e) {
5
6
  return Array.isArray(e.value);
@@ -7,21 +8,21 @@ function D(e) {
7
8
  function T(e) {
8
9
  return Array.isArray(e) ? e : e != null ? [e] : [];
9
10
  }
10
- function G(e) {
11
+ function I(e) {
11
12
  const { dataRef: a, suggestions: r } = e, o = c(v), t = c(y, null), n = b(() => t?.value?.id);
12
13
  if (!o) {
13
14
  s.debug("AiAgentService not available, context binding disabled");
14
15
  return;
15
16
  }
16
- const l = D(a) ? "list" : "details", f = _(a, () => {
17
- const d = T(a.value), u = l === "details" ? d.map((i) => ({ ...i })) : d.map((i) => ({ id: i.id, objectType: i.objectType, name: i.name }));
18
- o._setContextData(u, l, r, n.value), s.debug(`Context updated: ${u.length} items, type: ${l}, blade: ${n.value}`);
17
+ const l = D(a) ? "list" : "details", f = m(a, () => {
18
+ const u = T(a.value), d = l === "details" ? u.map((i) => ({ ...i })) : u.map((i) => ({ id: i.id, objectType: i.objectType, name: i.name }));
19
+ o._setContextData(d, l, r, n.value), s.debug(`Context updated: ${d.length} items, type: ${l}, blade: ${n.value}`);
19
20
  }, { deep: !0, immediate: !0 });
20
- m(() => {
21
+ _(() => {
21
22
  f(), o._setContextData([], "list", void 0, n.value), s.debug(`Context cleared on unmount for blade: ${n.value}`);
22
23
  });
23
24
  }
24
- const g = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1 }, A = p("ai-agent-plugin"), I = {
25
+ const g = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1 }, A = p("ai-agent-plugin"), L = {
25
26
  install(e, a = {}) {
26
27
  const { config: r = {}, addGlobalToolbarButton: o = !0 } = a;
27
28
  let t = r.url || "";
@@ -40,6 +41,6 @@ const g = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1 }, A =
40
41
  }
41
42
  };
42
43
  export {
43
- I as a,
44
- G as u
44
+ L as a,
45
+ I as u
45
46
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index-DELXU1qy.js","sources":["../../core/plugins/ai-agent/composables/useAiAgentContext.ts","../../core/plugins/ai-agent/index.ts"],"sourcesContent":["import { inject, computed, watch, onUnmounted, type Ref } from \"vue\";\nimport { AiAgentServiceKey } from \"@framework/injection-keys\";\nimport { BladeDescriptorKey } from \"@core/blade-navigation/types\";\nimport type { IAiAgentServiceInternal } from \"@core/plugins/ai-agent/services/ai-agent-service\";\nimport type { UseAiAgentContextOptions, AiAgentContextType } from \"@core/plugins/ai-agent/types\";\nimport { createLogger } from \"@core/utilities\";\n\nconst logger = createLogger(\"use-ai-agent-context\");\n\n/**\n * Checks if the ref value is an array\n */\nfunction isArrayRef<T>(dataRef: Ref<T> | Ref<T[]>): dataRef is Ref<T[]> {\n return Array.isArray(dataRef.value);\n}\n\n/**\n * Normalizes any ref value to an array for sending to the AI agent\n */\nfunction normalizeToArray<T>(value: T | T[]): T[] {\n if (Array.isArray(value)) {\n return value;\n }\n return value != null ? [value] : [];\n}\n\n/**\n * Composable for binding blade data to AI agent context.\n *\n * Sends data updates to the AI agent when dataRef changes and normalizes\n * single objects to arrays for the agent protocol.\n *\n * @example List blade (array of selected items)\n * ```typescript\n * const { selectedItems } = useTableSelection<Offer>();\n *\n * useAiAgentContext({ dataRef: selectedItems });\n * ```\n *\n * @example Details blade (single object - automatically wrapped in array)\n * ```typescript\n * const offer = ref<Offer>({});\n *\n * useAiAgentContext({ dataRef: offer });\n * ```\n *\n * @example With custom suggestions\n * ```typescript\n * useAiAgentContext({\n * dataRef: offer,\n * suggestions: [\n * {\n * id: \"translate\",\n * title: \"Translate description\",\n * icon: \"translation\",\n * iconColor: \"#FF4A4A\",\n * prompt: \"Translate the offer description to English\"\n * },\n * ],\n * });\n * ```\n */\nexport function useAiAgentContext<\n T extends {\n id?: string | undefined;\n objectType?: string | undefined;\n name?: string | undefined;\n },\n>(options: UseAiAgentContextOptions<T>): void {\n const { dataRef, suggestions } = options;\n\n // Try to get the service (may not be available if plugin not installed)\n const service = inject(AiAgentServiceKey) as IAiAgentServiceInternal | undefined;\n\n // Get current blade descriptor to identify which blade this context belongs to\n const bladeDescriptor = inject(BladeDescriptorKey, null);\n const bladeId = computed(() => bladeDescriptor?.value?.id);\n\n // If service is not available, nothing to bind\n if (!service) {\n logger.debug(\"AiAgentService not available, context binding disabled\");\n return;\n }\n\n // Determine context type based on dataRef type\n // Array ref = list blade (multiple selected items)\n // Single object ref = details blade (single item being edited)\n const detectedContextType: AiAgentContextType = isArrayRef(dataRef) ? \"list\" : \"details\";\n\n // Set context data in service (items, contextType, and suggestions)\n // Always sends an array to the service, normalizing single objects\n // Context is bound to specific blade ID\n const updateContextData = () => {\n const raw = normalizeToArray(dataRef.value);\n const items =\n detectedContextType === \"details\"\n ? raw.map((item) => ({ ...item }))\n : raw.map((item) => ({ id: item.id, objectType: item.objectType, name: item.name }));\n service._setContextData(items, detectedContextType, suggestions, bladeId.value);\n logger.debug(`Context updated: ${items.length} items, type: ${detectedContextType}, blade: ${bladeId.value}`);\n };\n\n // Watch dataRef for changes and update context\n const stopWatch = watch(dataRef, updateContextData, { deep: true, immediate: true });\n\n // Cleanup on unmount\n onUnmounted(() => {\n stopWatch();\n // Clear context for this specific blade when component unmounts\n service._setContextData([], \"list\", undefined, bladeId.value);\n logger.debug(`Context cleared on unmount for blade: ${bladeId.value}`);\n });\n}\n","import type { App } from \"vue\";\r\nimport type { IAiAgentConfig } from \"@core/plugins/ai-agent/types\";\r\nimport { DEFAULT_AI_AGENT_CONFIG, AI_AGENT_URL_ENV_KEY } from \"@core/plugins/ai-agent/constants\";\r\nimport { createLogger } from \"@core/utilities\";\r\n\r\nconst logger = createLogger(\"ai-agent-plugin\");\r\n\r\n/**\r\n * Options for the AI Agent Plugin\r\n */\r\nexport interface AiAgentPluginOptions {\r\n /**\r\n * AI Agent configuration.\r\n * URL can also be set via APP_AI_AGENT_URL environment variable.\r\n */\r\n config?: Partial<IAiAgentConfig>;\r\n\r\n /**\r\n * Whether to add the AI button to all blade toolbars automatically.\r\n * Default: true\r\n */\r\n addGlobalToolbarButton?: boolean;\r\n}\r\n\r\n/**\r\n * Vue plugin for AI Agent integration.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { createApp } from \"vue\";\r\n * import { aiAgentPlugin } from \"@vc-shell/framework\";\r\n *\r\n * const app = createApp(App);\r\n *\r\n * // Install with options\r\n * app.use(aiAgentPlugin, {\r\n * config: {\r\n * title: \"AI Assistant\",\r\n * width: 400,\r\n * },\r\n * addGlobalToolbarButton: true,\r\n * });\r\n * ```\r\n */\r\nexport const aiAgentPlugin = {\r\n install(app: App, options: AiAgentPluginOptions = {}) {\r\n const { config = {}, addGlobalToolbarButton = true } = options;\r\n\r\n // Get URL from environment variable if not provided\r\n let url = config.url || \"\";\r\n if (!url && typeof import.meta !== \"undefined\" && import.meta.env) {\r\n url = import.meta.env[AI_AGENT_URL_ENV_KEY] || \"\";\r\n }\r\n\r\n // Skip installation if no URL configured\r\n if (!url) {\r\n logger.info(\r\n \"AI Agent plugin skipped: no URL configured. Set APP_AI_AGENT_URL env variable or pass config.url option.\",\r\n );\r\n return;\r\n }\r\n\r\n // Merge config with defaults\r\n const finalConfig: IAiAgentConfig = {\r\n ...DEFAULT_AI_AGENT_CONFIG,\r\n ...config,\r\n url,\r\n };\r\n\r\n // Store config in app global properties for access during service creation\r\n app.config.globalProperties.$aiAgentConfig = finalConfig;\r\n app.provide(\"aiAgentConfig\", finalConfig);\r\n app.provide(\"aiAgentAddGlobalToolbarButton\", addGlobalToolbarButton);\r\n\r\n logger.info(`AI Agent plugin installed. URL: ${url}, addGlobalToolbarButton: ${addGlobalToolbarButton}`);\r\n },\r\n};\r\n\r\n// Re-export all types\r\nexport * from \"@core/plugins/ai-agent/types\";\r\nexport * from \"@core/plugins/ai-agent/constants\";\r\n\r\n// Re-export composables\r\nexport {\r\n useAiAgent,\r\n provideAiAgentService,\r\n createAiAgentToolbarButton,\r\n} from \"@core/plugins/ai-agent/composables/useAiAgent\";\r\nexport type { UseAiAgentReturn, ProvideAiAgentServiceOptions } from \"@core/plugins/ai-agent/composables/useAiAgent\";\r\n\r\nexport { useAiAgentContext } from \"@core/plugins/ai-agent/composables/useAiAgentContext\";\r\n\r\n// Re-export components\r\nexport { VcAiAgentPanel } from \"@core/plugins/ai-agent/components\";\r\n\r\n// Re-export service types\r\nexport type {\r\n IAiAgentServiceInternal,\r\n CreateAiAgentServiceOptions,\r\n} from \"@core/plugins/ai-agent/services/ai-agent-service\";\r\n"],"names":["logger","createLogger","isArrayRef","dataRef","normalizeToArray","value","useAiAgentContext","options","suggestions","service","inject","AiAgentServiceKey","bladeDescriptor","BladeDescriptorKey","bladeId","computed","detectedContextType","stopWatch","watch","raw","items","item","onUnmounted","aiAgentPlugin","app","config","addGlobalToolbarButton","url","__vite_import_meta_env__","AI_AGENT_URL_ENV_KEY","finalConfig","DEFAULT_AI_AGENT_CONFIG"],"mappings":";;AAOA,MAAMA,IAASC,EAAa,sBAAsB;AAKlD,SAASC,EAAcC,GAAiD;AACtE,SAAO,MAAM,QAAQA,EAAQ,KAAK;AACpC;AAKA,SAASC,EAAoBC,GAAqB;AAChD,SAAI,MAAM,QAAQA,CAAK,IACdA,IAEFA,KAAS,OAAO,CAACA,CAAK,IAAI,CAAA;AACnC;AAsCO,SAASC,EAMdC,GAA4C;AAC5C,QAAM,EAAE,SAAAJ,GAAS,aAAAK,EAAA,IAAgBD,GAG3BE,IAAUC,EAAOC,CAAiB,GAGlCC,IAAkBF,EAAOG,GAAoB,IAAI,GACjDC,IAAUC,EAAS,MAAMH,GAAiB,OAAO,EAAE;AAGzD,MAAI,CAACH,GAAS;AACZT,IAAAA,EAAO,MAAM,wDAAwD;AACrE;AAAA,EACF;AAKA,QAAMgB,IAA0Cd,EAAWC,CAAO,IAAI,SAAS,WAgBzEc,IAAYC,EAAMf,GAXE,MAAM;AAC9B,UAAMgB,IAAMf,EAAiBD,EAAQ,KAAK,GACpCiB,IACJJ,MAAwB,YACpBG,EAAI,IAAI,CAACE,OAAU,EAAE,GAAGA,IAAO,IAC/BF,EAAI,IAAI,CAACE,OAAU,EAAE,IAAIA,EAAK,IAAI,YAAYA,EAAK,YAAY,MAAMA,EAAK,KAAA,EAAO;AACvF,IAAAZ,EAAQ,gBAAgBW,GAAOJ,GAAqBR,GAAaM,EAAQ,KAAK,GAC9Ed,EAAO,MAAM,oBAAoBoB,EAAM,MAAM,iBAAiBJ,CAAmB,YAAYF,EAAQ,KAAK,EAAE;AAAA,EAC9G,GAGoD,EAAE,MAAM,IAAM,WAAW,IAAM;AAGnF,EAAAQ,EAAY,MAAM;AAChB,IAAAL,EAAA,GAEAR,EAAQ,gBAAgB,CAAA,GAAI,QAAQ,QAAWK,EAAQ,KAAK,GAC5Dd,EAAO,MAAM,yCAAyCc,EAAQ,KAAK,EAAE;AAAA,EACvE,CAAC;AACH;6EC3GMd,IAASC,EAAa,iBAAiB,GAuChCsB,IAAgB;AAAA,EAC3B,QAAQC,GAAUjB,IAAgC,IAAI;AACpD,UAAM,EAAE,QAAAkB,IAAS,CAAA,GAAI,wBAAAC,IAAyB,OAASnB;AAGvD,QAAIoB,IAAMF,EAAO,OAAO;AAMxB,QALI,CAACE,KAAO,OAAO,cAAgB,OAAeC,MAChDD,IAAMC,EAAgBC,CAAoB,KAAK,KAI7C,CAACF,GAAK;AACR,MAAA3B,EAAO;AAAA,QACL;AAAA,MAAA;AAEF;AAAA,IACF;AAGA,UAAM8B,IAA8B;AAAA,MAClC,GAAGC;AAAA,MACH,GAAGN;AAAA,MACH,KAAAE;AAAA,IAAA;AAIF,IAAAH,EAAI,OAAO,iBAAiB,iBAAiBM,GAC7CN,EAAI,QAAQ,iBAAiBM,CAAW,GACxCN,EAAI,QAAQ,iCAAiCE,CAAsB,GAEnE1B,EAAO,KAAK,mCAAmC2B,CAAG,6BAA6BD,CAAsB,EAAE;AAAA,EACzG;AACF;"}
1
+ {"version":3,"file":"index-CvSe3hjU.js","sources":["../../core/plugins/ai-agent/composables/useAiAgentContext.ts","../../core/plugins/ai-agent/index.ts"],"sourcesContent":["import { inject, computed, watch, onUnmounted, type Ref } from \"vue\";\nimport { AiAgentServiceKey } from \"@framework/injection-keys\";\nimport { BladeDescriptorKey } from \"@core/blade-navigation/types\";\nimport type { IAiAgentServiceInternal } from \"@core/plugins/ai-agent/services/ai-agent-service\";\nimport type { UseAiAgentContextOptions, AiAgentContextType } from \"@core/plugins/ai-agent/types\";\nimport { createLogger } from \"@core/utilities\";\n\nconst logger = createLogger(\"use-ai-agent-context\");\n\n/**\n * Checks if the ref value is an array\n */\nfunction isArrayRef<T>(dataRef: Ref<T> | Ref<T[]>): dataRef is Ref<T[]> {\n return Array.isArray(dataRef.value);\n}\n\n/**\n * Normalizes any ref value to an array for sending to the AI agent\n */\nfunction normalizeToArray<T>(value: T | T[]): T[] {\n if (Array.isArray(value)) {\n return value;\n }\n return value != null ? [value] : [];\n}\n\n/**\n * Composable for binding blade data to AI agent context.\n *\n * Sends data updates to the AI agent when dataRef changes and normalizes\n * single objects to arrays for the agent protocol.\n *\n * @example List blade (array of selected items)\n * ```typescript\n * const { selectedItems } = useTableSelection<Offer>();\n *\n * useAiAgentContext({ dataRef: selectedItems });\n * ```\n *\n * @example Details blade (single object - automatically wrapped in array)\n * ```typescript\n * const offer = ref<Offer>({});\n *\n * useAiAgentContext({ dataRef: offer });\n * ```\n *\n * @example With custom suggestions\n * ```typescript\n * useAiAgentContext({\n * dataRef: offer,\n * suggestions: [\n * {\n * id: \"translate\",\n * title: \"Translate description\",\n * icon: \"translation\",\n * iconColor: \"#FF4A4A\",\n * prompt: \"Translate the offer description to English\"\n * },\n * ],\n * });\n * ```\n */\nexport function useAiAgentContext<\n T extends {\n id?: string | undefined;\n objectType?: string | undefined;\n name?: string | undefined;\n },\n>(options: UseAiAgentContextOptions<T>): void {\n const { dataRef, suggestions } = options;\n\n // Try to get the service (may not be available if plugin not installed)\n const service = inject(AiAgentServiceKey) as IAiAgentServiceInternal | undefined;\n\n // Get current blade descriptor to identify which blade this context belongs to\n const bladeDescriptor = inject(BladeDescriptorKey, null);\n const bladeId = computed(() => bladeDescriptor?.value?.id);\n\n // If service is not available, nothing to bind\n if (!service) {\n logger.debug(\"AiAgentService not available, context binding disabled\");\n return;\n }\n\n // Determine context type based on dataRef type\n // Array ref = list blade (multiple selected items)\n // Single object ref = details blade (single item being edited)\n const detectedContextType: AiAgentContextType = isArrayRef(dataRef) ? \"list\" : \"details\";\n\n // Set context data in service (items, contextType, and suggestions)\n // Always sends an array to the service, normalizing single objects\n // Context is bound to specific blade ID\n const updateContextData = () => {\n const raw = normalizeToArray(dataRef.value);\n const items =\n detectedContextType === \"details\"\n ? raw.map((item) => ({ ...item }))\n : raw.map((item) => ({ id: item.id, objectType: item.objectType, name: item.name }));\n service._setContextData(items, detectedContextType, suggestions, bladeId.value);\n logger.debug(`Context updated: ${items.length} items, type: ${detectedContextType}, blade: ${bladeId.value}`);\n };\n\n // Watch dataRef for changes and update context\n const stopWatch = watch(dataRef, updateContextData, { deep: true, immediate: true });\n\n // Cleanup on unmount\n onUnmounted(() => {\n stopWatch();\n // Clear context for this specific blade when component unmounts\n service._setContextData([], \"list\", undefined, bladeId.value);\n logger.debug(`Context cleared on unmount for blade: ${bladeId.value}`);\n });\n}\n","import type { App } from \"vue\";\r\nimport type { IAiAgentConfig } from \"@core/plugins/ai-agent/types\";\r\nimport { DEFAULT_AI_AGENT_CONFIG, AI_AGENT_URL_ENV_KEY } from \"@core/plugins/ai-agent/constants\";\r\nimport { createLogger } from \"@core/utilities\";\r\n\r\nconst logger = createLogger(\"ai-agent-plugin\");\r\n\r\n/**\r\n * Options for the AI Agent Plugin\r\n */\r\nexport interface AiAgentPluginOptions {\r\n /**\r\n * AI Agent configuration.\r\n * URL can also be set via APP_AI_AGENT_URL environment variable.\r\n */\r\n config?: Partial<IAiAgentConfig>;\r\n\r\n /**\r\n * Whether to add the AI button to all blade toolbars automatically.\r\n * Default: true\r\n */\r\n addGlobalToolbarButton?: boolean;\r\n}\r\n\r\n/**\r\n * Vue plugin for AI Agent integration.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { createApp } from \"vue\";\r\n * import { aiAgentPlugin } from \"@vc-shell/framework\";\r\n *\r\n * const app = createApp(App);\r\n *\r\n * // Install with options\r\n * app.use(aiAgentPlugin, {\r\n * config: {\r\n * title: \"AI Assistant\",\r\n * width: 400,\r\n * },\r\n * addGlobalToolbarButton: true,\r\n * });\r\n * ```\r\n */\r\nexport const aiAgentPlugin = {\r\n install(app: App, options: AiAgentPluginOptions = {}) {\r\n const { config = {}, addGlobalToolbarButton = true } = options;\r\n\r\n // Get URL from environment variable if not provided\r\n let url = config.url || \"\";\r\n if (!url && typeof import.meta !== \"undefined\" && import.meta.env) {\r\n url = import.meta.env[AI_AGENT_URL_ENV_KEY] || \"\";\r\n }\r\n\r\n // Skip installation if no URL configured\r\n if (!url) {\r\n logger.info(\r\n \"AI Agent plugin skipped: no URL configured. Set APP_AI_AGENT_URL env variable or pass config.url option.\",\r\n );\r\n return;\r\n }\r\n\r\n // Merge config with defaults\r\n const finalConfig: IAiAgentConfig = {\r\n ...DEFAULT_AI_AGENT_CONFIG,\r\n ...config,\r\n url,\r\n };\r\n\r\n // Store config in app global properties for access during service creation\r\n app.config.globalProperties.$aiAgentConfig = finalConfig;\r\n app.provide(\"aiAgentConfig\", finalConfig);\r\n app.provide(\"aiAgentAddGlobalToolbarButton\", addGlobalToolbarButton);\r\n\r\n logger.info(`AI Agent plugin installed. URL: ${url}, addGlobalToolbarButton: ${addGlobalToolbarButton}`);\r\n },\r\n};\r\n\r\n// Re-export all types\r\nexport * from \"@core/plugins/ai-agent/types\";\r\nexport * from \"@core/plugins/ai-agent/constants\";\r\n\r\n// Re-export composables\r\nexport {\r\n useAiAgent,\r\n provideAiAgentService,\r\n createAiAgentToolbarButton,\r\n} from \"@core/plugins/ai-agent/composables/useAiAgent\";\r\nexport type { UseAiAgentReturn, ProvideAiAgentServiceOptions } from \"@core/plugins/ai-agent/composables/useAiAgent\";\r\n\r\nexport { useAiAgentContext } from \"@core/plugins/ai-agent/composables/useAiAgentContext\";\r\n\r\n// Re-export components\r\nexport { VcAiAgentPanel } from \"@core/plugins/ai-agent/components\";\r\n\r\n// Re-export service types\r\nexport type {\r\n IAiAgentServiceInternal,\r\n CreateAiAgentServiceOptions,\r\n} from \"@core/plugins/ai-agent/services/ai-agent-service\";\r\n"],"names":["logger","createLogger","isArrayRef","dataRef","normalizeToArray","value","useAiAgentContext","options","suggestions","service","inject","AiAgentServiceKey","bladeDescriptor","BladeDescriptorKey","bladeId","computed","detectedContextType","stopWatch","watch","raw","items","item","onUnmounted","aiAgentPlugin","app","config","addGlobalToolbarButton","url","__vite_import_meta_env__","AI_AGENT_URL_ENV_KEY","finalConfig","DEFAULT_AI_AGENT_CONFIG"],"mappings":";;;AAOA,MAAMA,IAASC,EAAa,sBAAsB;AAKlD,SAASC,EAAcC,GAAiD;AACtE,SAAO,MAAM,QAAQA,EAAQ,KAAK;AACpC;AAKA,SAASC,EAAoBC,GAAqB;AAChD,SAAI,MAAM,QAAQA,CAAK,IACdA,IAEFA,KAAS,OAAO,CAACA,CAAK,IAAI,CAAA;AACnC;AAsCO,SAASC,EAMdC,GAA4C;AAC5C,QAAM,EAAE,SAAAJ,GAAS,aAAAK,EAAA,IAAgBD,GAG3BE,IAAUC,EAAOC,CAAiB,GAGlCC,IAAkBF,EAAOG,GAAoB,IAAI,GACjDC,IAAUC,EAAS,MAAMH,GAAiB,OAAO,EAAE;AAGzD,MAAI,CAACH,GAAS;AACZT,IAAAA,EAAO,MAAM,wDAAwD;AACrE;AAAA,EACF;AAKA,QAAMgB,IAA0Cd,EAAWC,CAAO,IAAI,SAAS,WAgBzEc,IAAYC,EAAMf,GAXE,MAAM;AAC9B,UAAMgB,IAAMf,EAAiBD,EAAQ,KAAK,GACpCiB,IACJJ,MAAwB,YACpBG,EAAI,IAAI,CAACE,OAAU,EAAE,GAAGA,IAAO,IAC/BF,EAAI,IAAI,CAACE,OAAU,EAAE,IAAIA,EAAK,IAAI,YAAYA,EAAK,YAAY,MAAMA,EAAK,KAAA,EAAO;AACvF,IAAAZ,EAAQ,gBAAgBW,GAAOJ,GAAqBR,GAAaM,EAAQ,KAAK,GAC9Ed,EAAO,MAAM,oBAAoBoB,EAAM,MAAM,iBAAiBJ,CAAmB,YAAYF,EAAQ,KAAK,EAAE;AAAA,EAC9G,GAGoD,EAAE,MAAM,IAAM,WAAW,IAAM;AAGnF,EAAAQ,EAAY,MAAM;AAChB,IAAAL,EAAA,GAEAR,EAAQ,gBAAgB,CAAA,GAAI,QAAQ,QAAWK,EAAQ,KAAK,GAC5Dd,EAAO,MAAM,yCAAyCc,EAAQ,KAAK,EAAE;AAAA,EACvE,CAAC;AACH;6EC3GMd,IAASC,EAAa,iBAAiB,GAuChCsB,IAAgB;AAAA,EAC3B,QAAQC,GAAUjB,IAAgC,IAAI;AACpD,UAAM,EAAE,QAAAkB,IAAS,CAAA,GAAI,wBAAAC,IAAyB,OAASnB;AAGvD,QAAIoB,IAAMF,EAAO,OAAO;AAMxB,QALI,CAACE,KAAO,OAAO,cAAgB,OAAeC,MAChDD,IAAMC,EAAgBC,CAAoB,KAAK,KAI7C,CAACF,GAAK;AACR,MAAA3B,EAAO;AAAA,QACL;AAAA,MAAA;AAEF;AAAA,IACF;AAGA,UAAM8B,IAA8B;AAAA,MAClC,GAAGC;AAAA,MACH,GAAGN;AAAA,MACH,KAAAE;AAAA,IAAA;AAIF,IAAAH,EAAI,OAAO,iBAAiB,iBAAiBM,GAC7CN,EAAI,QAAQ,iBAAiBM,CAAW,GACxCN,EAAI,QAAQ,iCAAiCE,CAAsB,GAEnE1B,EAAO,KAAK,mCAAmC2B,CAAG,6BAA6BD,CAAsB,EAAE;AAAA,EACzG;AACF;"}