@burdenoff/microfe-bigconsole 2026.805.3 → 2026.812.2

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 (247) hide show
  1. package/dist/bigconsole/components/DrilldownDashboardRenderer.js +118 -106
  2. package/dist/bigconsole/components/DrilldownDashboardRenderer.js.map +1 -1
  3. package/dist/bigconsole/components/DrilldownModal.js +54 -50
  4. package/dist/bigconsole/components/DrilldownModal.js.map +1 -1
  5. package/dist/bigconsole/components/builder/BuilderCanvas.js +2 -2
  6. package/dist/bigconsole/components/builder/BuilderCanvas.js.map +1 -1
  7. package/dist/bigconsole/components/builder/BuilderTopbar.js +3 -3
  8. package/dist/bigconsole/components/builder/BuilderTopbar.js.map +1 -1
  9. package/dist/bigconsole/components/builder/inspector/AdvancedSection.js +24 -25
  10. package/dist/bigconsole/components/builder/inspector/AdvancedSection.js.map +1 -1
  11. package/dist/bigconsole/components/builder/inspector/AppearanceSection.js +40 -29
  12. package/dist/bigconsole/components/builder/inspector/AppearanceSection.js.map +1 -1
  13. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +135 -97
  14. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -1
  15. package/dist/bigconsole/components/builder/inspector/GeneralSection.js +58 -44
  16. package/dist/bigconsole/components/builder/inspector/GeneralSection.js.map +1 -1
  17. package/dist/bigconsole/components/common/Section.js +70 -0
  18. package/dist/bigconsole/components/common/Section.js.map +1 -0
  19. package/dist/bigconsole/components/common/index.js +2 -0
  20. package/dist/bigconsole/components/common/sectionStyles.js +42 -0
  21. package/dist/bigconsole/components/common/sectionStyles.js.map +1 -0
  22. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +209 -193
  23. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
  24. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +213 -231
  25. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  26. package/dist/bigconsole/components/dashboard/DashboardGrid.js +12 -18
  27. package/dist/bigconsole/components/dashboard/DashboardGrid.js.map +1 -1
  28. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +109 -102
  29. package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
  30. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +81 -70
  31. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
  32. package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js +125 -159
  33. package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js.map +1 -1
  34. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +25 -23
  35. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js.map +1 -1
  36. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +3 -3
  37. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
  38. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +5 -3
  39. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js.map +1 -1
  40. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +170 -284
  41. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
  42. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +147 -151
  43. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  44. package/dist/bigconsole/components/dashboard/LiveBoardBanner.js +45 -53
  45. package/dist/bigconsole/components/dashboard/LiveBoardBanner.js.map +1 -1
  46. package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js +157 -148
  47. package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js.map +1 -1
  48. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +17 -8
  49. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js.map +1 -1
  50. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js +101 -95
  51. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js.map +1 -1
  52. package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js +20 -18
  53. package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js.map +1 -1
  54. package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js +26 -58
  55. package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js.map +1 -1
  56. package/dist/bigconsole/components/dashboard/WidgetPalette.js +307 -231
  57. package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
  58. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +29 -29
  59. package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
  60. package/dist/bigconsole/components/datasink/DataSinkCard.js +78 -79
  61. package/dist/bigconsole/components/datasink/DataSinkCard.js.map +1 -1
  62. package/dist/bigconsole/components/datasink/DataSinkDataViewer.js +33 -34
  63. package/dist/bigconsole/components/datasink/DataSinkDataViewer.js.map +1 -1
  64. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +79 -56
  65. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
  66. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +75 -65
  67. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js.map +1 -1
  68. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js +1 -1
  69. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js.map +1 -1
  70. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js +20 -19
  71. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js.map +1 -1
  72. package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js +127 -171
  73. package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js.map +1 -1
  74. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +263 -243
  75. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
  76. package/dist/bigconsole/components/datasink/LinkedParsersPanel.js +65 -66
  77. package/dist/bigconsole/components/datasink/LinkedParsersPanel.js.map +1 -1
  78. package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js +121 -127
  79. package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js.map +1 -1
  80. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +33 -26
  81. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js.map +1 -1
  82. package/dist/bigconsole/components/datasink/SetupStateBadge.js +3 -3
  83. package/dist/bigconsole/components/datasink/SetupStateBadge.js.map +1 -1
  84. package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js +95 -95
  85. package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js.map +1 -1
  86. package/dist/bigconsole/components/parser/DataSinkSelector.js +154 -123
  87. package/dist/bigconsole/components/parser/DataSinkSelector.js.map +1 -1
  88. package/dist/bigconsole/components/parser/ExpressionEditor.js +3 -3
  89. package/dist/bigconsole/components/parser/ExpressionEditor.js.map +1 -1
  90. package/dist/bigconsole/components/parser/ImportParserDialog.js +235 -275
  91. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  92. package/dist/bigconsole/components/parser/ParserCard.js +133 -114
  93. package/dist/bigconsole/components/parser/ParserCard.js.map +1 -1
  94. package/dist/bigconsole/components/parser/ParserSelector.js +191 -174
  95. package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
  96. package/dist/bigconsole/components/parser/ParserStatusBadge.js +2 -2
  97. package/dist/bigconsole/components/parser/ParserStatusBadge.js.map +1 -1
  98. package/dist/bigconsole/components/parser/ParserTypeBadge.js +4 -4
  99. package/dist/bigconsole/components/parser/ParserTypeBadge.js.map +1 -1
  100. package/dist/bigconsole/components/pipeline/PipelineCard.js +134 -89
  101. package/dist/bigconsole/components/pipeline/PipelineCard.js.map +1 -1
  102. package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js +77 -64
  103. package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js.map +1 -1
  104. package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js +7 -10
  105. package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js.map +1 -1
  106. package/dist/bigconsole/components/preview/AiPreviewContent.js +31 -32
  107. package/dist/bigconsole/components/preview/AiPreviewContent.js.map +1 -1
  108. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +152 -106
  109. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js.map +1 -1
  110. package/dist/bigconsole/components/preview/AiPreviewPanel.js +193 -152
  111. package/dist/bigconsole/components/preview/AiPreviewPanel.js.map +1 -1
  112. package/dist/bigconsole/components/preview/previewShared.js +41 -23
  113. package/dist/bigconsole/components/preview/previewShared.js.map +1 -1
  114. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +342 -308
  115. package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
  116. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +262 -238
  117. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  118. package/dist/bigconsole/components/widgets/PropertiesPanel.js +783 -867
  119. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  120. package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js +7 -5
  121. package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js.map +1 -1
  122. package/dist/bigconsole/components/widgets/WidgetHeader.js +7 -8
  123. package/dist/bigconsole/components/widgets/WidgetHeader.js.map +1 -1
  124. package/dist/bigconsole/components/widgets/WidgetRegistry.js +4 -4
  125. package/dist/bigconsole/components/widgets/WidgetRegistry.js.map +1 -1
  126. package/dist/bigconsole/components/widgets/WidgetWrapper.js +8 -7
  127. package/dist/bigconsole/components/widgets/WidgetWrapper.js.map +1 -1
  128. package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js +1 -1
  129. package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js.map +1 -1
  130. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +2 -2
  131. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
  132. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +11 -5
  133. package/dist/bigconsole/components/widgets/chart/ChartConfig.js.map +1 -1
  134. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +19 -15
  135. package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
  136. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +154 -102
  137. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js.map +1 -1
  138. package/dist/bigconsole/components/widgets/gauge/CircularGauge.js +36 -32
  139. package/dist/bigconsole/components/widgets/gauge/CircularGauge.js.map +1 -1
  140. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +85 -60
  141. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js.map +1 -1
  142. package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js +64 -35
  143. package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js.map +1 -1
  144. package/dist/bigconsole/components/widgets/gauge/LinearGauge.js +46 -45
  145. package/dist/bigconsole/components/widgets/gauge/LinearGauge.js.map +1 -1
  146. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +35 -24
  147. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js.map +1 -1
  148. package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js +2 -2
  149. package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js.map +1 -1
  150. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +4 -4
  151. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
  152. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js +153 -90
  153. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js.map +1 -1
  154. package/dist/bigconsole/components/widgets/list/ListConfig.js +8 -2
  155. package/dist/bigconsole/components/widgets/list/ListConfig.js.map +1 -1
  156. package/dist/bigconsole/components/widgets/list/ListItem.js +1 -1
  157. package/dist/bigconsole/components/widgets/list/ListItem.js.map +1 -1
  158. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js +1 -1
  159. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js.map +1 -1
  160. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +14 -4
  161. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js.map +1 -1
  162. package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js +112 -89
  163. package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js.map +1 -1
  164. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +21 -13
  165. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js.map +1 -1
  166. package/dist/bigconsole/components/widgets/metric-card/index.js +4 -4
  167. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +3 -3
  168. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
  169. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +34 -25
  170. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
  171. package/dist/bigconsole/components/widgets/progress/ProgressWidget.js +129 -114
  172. package/dist/bigconsole/components/widgets/progress/ProgressWidget.js.map +1 -1
  173. package/dist/bigconsole/components/widgets/retention/RetentionWidget.js +3 -3
  174. package/dist/bigconsole/components/widgets/retention/RetentionWidget.js.map +1 -1
  175. package/dist/bigconsole/components/widgets/states/EmptyState.js +6 -4
  176. package/dist/bigconsole/components/widgets/states/EmptyState.js.map +1 -1
  177. package/dist/bigconsole/components/widgets/states/ErrorState.js +7 -5
  178. package/dist/bigconsole/components/widgets/states/ErrorState.js.map +1 -1
  179. package/dist/bigconsole/components/widgets/states/LoadingState.js +5 -4
  180. package/dist/bigconsole/components/widgets/states/LoadingState.js.map +1 -1
  181. package/dist/bigconsole/components/widgets/table/TableConfig.js +10 -4
  182. package/dist/bigconsole/components/widgets/table/TableConfig.js.map +1 -1
  183. package/dist/bigconsole/components/widgets/table/TableHeader.js +1 -1
  184. package/dist/bigconsole/components/widgets/table/TableHeader.js.map +1 -1
  185. package/dist/bigconsole/components/widgets/table/TableWidget.js +1 -1
  186. package/dist/bigconsole/components/widgets/table/TableWidget.js.map +1 -1
  187. package/dist/bigconsole/components/widgets/text-widget/TextWidget.js +1 -1
  188. package/dist/bigconsole/components/widgets/text-widget/TextWidget.js.map +1 -1
  189. package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js +3 -3
  190. package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js.map +1 -1
  191. package/dist/bigconsole/components/widgets/utils/conditionalFormat.js +2 -2
  192. package/dist/bigconsole/components/widgets/utils/conditionalFormat.js.map +1 -1
  193. package/dist/bigconsole/components/widgets/utils/targetProgress.js +13 -0
  194. package/dist/bigconsole/components/widgets/utils/targetProgress.js.map +1 -0
  195. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +112 -85
  196. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js.map +1 -1
  197. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js +28 -20
  198. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js.map +1 -1
  199. package/dist/bigconsole/components/workflow/WorkflowCard.js +92 -77
  200. package/dist/bigconsole/components/workflow/WorkflowCard.js.map +1 -1
  201. package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js +70 -51
  202. package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js.map +1 -1
  203. package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js +16 -17
  204. package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js.map +1 -1
  205. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +6 -4
  206. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js.map +1 -1
  207. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +360 -338
  208. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
  209. package/dist/bigconsole/hooks/useModalFocusTrap.js +53 -0
  210. package/dist/bigconsole/hooks/useModalFocusTrap.js.map +1 -0
  211. package/dist/bigconsole/pages/DashboardBuilderPage.js +209 -203
  212. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  213. package/dist/bigconsole/pages/DashboardViewPage.js +126 -120
  214. package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
  215. package/dist/bigconsole/pages/DashboardsPage.js +838 -800
  216. package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
  217. package/dist/bigconsole/pages/DataParsersPage.js +263 -315
  218. package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
  219. package/dist/bigconsole/pages/DataSinkBuilderPage.js +301 -341
  220. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  221. package/dist/bigconsole/pages/DataSinkViewPage.js +346 -339
  222. package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
  223. package/dist/bigconsole/pages/DataSinksPage.js +356 -458
  224. package/dist/bigconsole/pages/DataSinksPage.js.map +1 -1
  225. package/dist/bigconsole/pages/DataSourcesPage.js +7 -2
  226. package/dist/bigconsole/pages/DataSourcesPage.js.map +1 -1
  227. package/dist/bigconsole/pages/HomePage.js +186 -193
  228. package/dist/bigconsole/pages/HomePage.js.map +1 -1
  229. package/dist/bigconsole/pages/InsightsPage.js +887 -740
  230. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  231. package/dist/bigconsole/pages/ParserBuilderPage.js +679 -637
  232. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  233. package/dist/bigconsole/pages/ParserViewPage.js +368 -342
  234. package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
  235. package/dist/bigconsole/pages/PipelineBuilderPage.js +537 -444
  236. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  237. package/dist/bigconsole/pages/PipelineViewPage.js +412 -377
  238. package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
  239. package/dist/bigconsole/pages/PipelinesPage.js +248 -298
  240. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  241. package/dist/bigconsole/pages/WidgetDemoPage.js +251 -153
  242. package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
  243. package/dist/bigconsole/pages/WorkflowViewPage.js +381 -371
  244. package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
  245. package/dist/bigconsole/pages/WorkflowsPage.js +171 -286
  246. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  247. package/package.json +1 -1
@@ -1,17 +1,19 @@
1
- import { GetDashboardDocument as e, ListWidgetsByDashboardDocument as t } from "../../generated/wspace-operations.js";
2
- import { mapFromFederationWidgetType as n } from "../utils/widgetTypeMapping.js";
3
- import r from "./widgets/WidgetWrapper.js";
4
- import { memo as i, useEffect as a, useState as o } from "react";
5
- import { useApolloClient as s } from "@apollo/client/react";
6
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
1
+ import { Section as e, SectionStack as t } from "./common/Section.js";
2
+ import "./common/index.js";
3
+ import { GetDashboardDocument as n, ListWidgetsByDashboardDocument as r } from "../../generated/wspace-operations.js";
4
+ import { mapFromFederationWidgetType as i } from "../utils/widgetTypeMapping.js";
5
+ import a from "./widgets/WidgetWrapper.js";
6
+ import { memo as o, useEffect as s, useState as c } from "react";
7
+ import { useApolloClient as l } from "@apollo/client/react";
8
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
7
9
  //#region src/bigconsole/components/DrilldownDashboardRenderer.tsx
8
- function u(e, t) {
9
- let r = t * 4, i = {
10
+ function f(e, t) {
11
+ let n = t * 4, r = {
10
12
  x: 0,
11
- y: r,
13
+ y: n,
12
14
  width: 12,
13
15
  height: 4
14
- }, a = e.config || {}, o = a._internalWidgetType || n(e.type || "KPI");
16
+ }, a = e.config || {}, o = a._internalWidgetType || i(e.type || "KPI");
15
17
  return {
16
18
  id: e.id ?? "",
17
19
  pageId: e.pageId || "",
@@ -25,9 +27,9 @@ function u(e, t) {
25
27
  parserId: e.parserId || null,
26
28
  parserRules: e.parserRules || null,
27
29
  config: a,
28
- position: i,
30
+ position: r,
29
31
  positionX: 0,
30
- positionY: r,
32
+ positionY: n,
31
33
  positionWidth: 12,
32
34
  positionHeight: 4,
33
35
  positionResponsive: e.positionResponsive,
@@ -45,147 +47,157 @@ function u(e, t) {
45
47
  updatedAt: e.updatedAt || (/* @__PURE__ */ new Date()).toISOString()
46
48
  };
47
49
  }
48
- var d = i(function({ dashboardId: n, params: r }) {
49
- let i = s(), [d, p] = o(!0), [m, h] = o(null), [g, _] = o(null), [v, y] = o([]);
50
- return a(() => {
51
- if (!n) {
52
- p(!1);
50
+ var p = o(function({ dashboardId: i, params: a }) {
51
+ let o = l(), [p, h] = c(!0), [g, _] = c(null), [v, y] = c(null), [b, x] = c([]);
52
+ if (s(() => {
53
+ if (!i) {
54
+ h(!1);
53
55
  return;
54
56
  }
55
- async function r() {
56
- p(!0), h(null);
57
+ async function e() {
58
+ h(!0), _(null);
57
59
  try {
58
- let r = (await i.query({
59
- query: e,
60
- variables: { id: n },
60
+ let e = (await o.query({
61
+ query: n,
62
+ variables: { id: i },
61
63
  fetchPolicy: "network-only"
62
64
  })).data?.getDashboard;
63
- if (!r) {
64
- h("Dashboard not found"), p(!1);
65
+ if (!e) {
66
+ _("Dashboard not found"), h(!1);
65
67
  return;
66
68
  }
67
- let a = r.pages?.edges?.map((e) => ({
69
+ let t = e.pages?.edges?.map((e) => ({
68
70
  id: e.node.id,
69
71
  name: e.node.name || "Page 1"
70
72
  })) || [];
71
- _({
72
- id: r.id,
73
- name: r.name,
74
- description: r.description,
75
- pages: a
76
- }), y(((await i.query({
77
- query: t,
78
- variables: { dashboardId: n },
73
+ y({
74
+ id: e.id,
75
+ name: e.name,
76
+ description: e.description,
77
+ pages: t
78
+ }), x(((await o.query({
79
+ query: r,
80
+ variables: { dashboardId: i },
79
81
  fetchPolicy: "network-only"
80
- })).data?.listWidgetsByDashboard || []).map((e, t) => u(e, t)));
82
+ })).data?.listWidgetsByDashboard || []).map((e, t) => f(e, t)));
81
83
  } catch (e) {
82
- h(e instanceof Error ? e.message : "Failed to load dashboard");
84
+ _(e instanceof Error ? e.message : "Failed to load dashboard");
83
85
  } finally {
84
- p(!1);
86
+ h(!1);
85
87
  }
86
88
  }
87
- r();
88
- }, [n, i]), d ? /* @__PURE__ */ c("div", {
89
+ e();
90
+ }, [i, o]), p) return /* @__PURE__ */ u("div", {
89
91
  className: "flex items-center justify-center h-full",
90
- children: /* @__PURE__ */ l("div", {
92
+ children: /* @__PURE__ */ d("div", {
91
93
  className: "flex flex-col items-center gap-3",
92
- children: [/* @__PURE__ */ c("div", { className: "w-8 h-8 border-2 border-action-primary-bg border-t-transparent rounded-full animate-spin" }), /* @__PURE__ */ c("p", {
94
+ children: [/* @__PURE__ */ u("div", { className: "w-8 h-8 border-2 border-action-primary-bg border-t-transparent rounded-full animate-spin" }), /* @__PURE__ */ u("p", {
93
95
  className: "text-sm text-text-secondary",
94
96
  children: "Loading dashboard..."
95
97
  })]
96
98
  })
97
- }) : m ? /* @__PURE__ */ c("div", {
98
- className: "flex items-center justify-center h-full",
99
- children: /* @__PURE__ */ l("div", {
100
- className: "flex flex-col items-center gap-3 text-center max-w-md",
101
- children: [/* @__PURE__ */ c("svg", {
102
- className: "w-12 h-12 text-status-error-text",
99
+ });
100
+ if (g) return /* @__PURE__ */ u("div", {
101
+ className: "flex h-full items-center justify-center",
102
+ role: "alert",
103
+ children: /* @__PURE__ */ u(e, {
104
+ headingLevel: 3,
105
+ tone: "danger",
106
+ className: "w-full max-w-md",
107
+ "data-testid": "drilldown-error",
108
+ title: "Could not load this dashboard",
109
+ description: g,
110
+ icon: /* @__PURE__ */ u("svg", {
111
+ className: "h-icon-md w-icon-md",
103
112
  fill: "none",
104
113
  stroke: "currentColor",
105
114
  viewBox: "0 0 24 24",
106
- children: /* @__PURE__ */ c("path", {
115
+ children: /* @__PURE__ */ u("path", {
107
116
  strokeLinecap: "round",
108
117
  strokeLinejoin: "round",
109
118
  strokeWidth: 1.5,
110
119
  d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
111
120
  })
112
- }), /* @__PURE__ */ c("p", {
113
- className: "text-sm text-text-secondary",
114
- children: m
115
- })]
121
+ })
116
122
  })
117
- }) : !g || v.length === 0 ? /* @__PURE__ */ c("div", {
123
+ });
124
+ if (!v || b.length === 0) return /* @__PURE__ */ u("div", {
118
125
  className: "flex items-center justify-center h-full",
119
- children: /* @__PURE__ */ l("div", {
126
+ children: /* @__PURE__ */ d("div", {
120
127
  className: "flex flex-col items-center gap-3 text-center",
121
- children: [/* @__PURE__ */ c("svg", {
122
- className: "w-12 h-12 text-text-tertiary",
128
+ children: [/* @__PURE__ */ u("svg", {
129
+ className: "w-12 h-12 text-text-muted",
123
130
  fill: "none",
124
131
  stroke: "currentColor",
125
132
  viewBox: "0 0 24 24",
126
- children: /* @__PURE__ */ c("path", {
133
+ children: /* @__PURE__ */ u("path", {
127
134
  strokeLinecap: "round",
128
135
  strokeLinejoin: "round",
129
136
  strokeWidth: 1.5,
130
137
  d: "M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z"
131
138
  })
132
- }), /* @__PURE__ */ c("p", {
139
+ }), /* @__PURE__ */ u("p", {
133
140
  className: "text-sm text-text-secondary",
134
- children: g ? "This dashboard has no widgets" : "Dashboard not found"
141
+ children: v ? "This dashboard has no widgets" : "Dashboard not found"
135
142
  })]
136
143
  })
137
- }) : /* @__PURE__ */ l("div", {
144
+ });
145
+ let S = Object.entries(a).filter(([e]) => !e.startsWith("__"));
146
+ return /* @__PURE__ */ d(t, {
138
147
  className: "w-full",
139
- children: [/* @__PURE__ */ l("div", {
140
- className: "pb-3 mb-4 border-b border-border-default",
141
- children: [
142
- /* @__PURE__ */ c("h3", {
143
- className: "text-lg font-semibold text-text-primary",
144
- children: g.name
145
- }),
146
- g.description && /* @__PURE__ */ c("p", {
147
- className: "text-sm text-text-secondary mt-1",
148
- children: g.description
149
- }),
150
- Object.keys(r).filter((e) => !e.startsWith("__")).length > 0 && /* @__PURE__ */ c("div", {
151
- className: "flex flex-wrap gap-2 mt-2",
152
- children: Object.entries(r).filter(([e]) => !e.startsWith("__")).map(([e, t]) => /* @__PURE__ */ l("span", {
153
- className: "inline-flex items-center px-2 py-1 rounded bg-action-primary-bg/10 text-xs",
154
- children: [/* @__PURE__ */ l("span", {
155
- className: "font-medium text-text-primary",
156
- children: [e, ":"]
157
- }), /* @__PURE__ */ c("span", {
158
- className: "ml-1 text-action-primary-text",
159
- children: typeof t == "object" && t ? JSON.stringify(t) : String(t)
160
- })]
161
- }, e))
148
+ children: [
149
+ /* @__PURE__ */ u(e, {
150
+ emphasis: "bare",
151
+ padding: "none",
152
+ headingLevel: 3,
153
+ title: v.name,
154
+ description: v.description,
155
+ "data-testid": "drilldown-dashboard-header"
156
+ }),
157
+ S.length > 0 && /* @__PURE__ */ u(e, {
158
+ emphasis: "muted",
159
+ padding: "compact",
160
+ headingLevel: 3,
161
+ title: "Filtered by",
162
+ "data-testid": "drilldown-params",
163
+ bodyClassName: "flex flex-wrap gap-control-gap",
164
+ children: S.map(([e, t]) => /* @__PURE__ */ d("span", {
165
+ className: "inline-flex items-center rounded-pill bg-bg-surface px-2 py-1 text-xs text-text-secondary",
166
+ children: [/* @__PURE__ */ d("span", {
167
+ className: "font-medium text-text-primary",
168
+ children: [e, ":"]
169
+ }), /* @__PURE__ */ u("span", {
170
+ className: "ml-1",
171
+ children: typeof t == "object" && t ? JSON.stringify(t) : String(t)
172
+ })]
173
+ }, e))
174
+ }),
175
+ /* @__PURE__ */ u("div", {
176
+ className: "flex flex-col gap-form-gap",
177
+ children: b.map((e) => {
178
+ let t = e.config?._internalWidgetType, n = e.type;
179
+ return /* @__PURE__ */ u("div", {
180
+ className: "min-w-0 overflow-hidden rounded-card border border-[var(--color-border-subtle)] bg-bg-surface",
181
+ style: n === "LINE_CHART" || n === "chart" || t === "chart" || t === "funnel_chart" ? { height: "clamp(220px, 45vh, 350px)" } : n === "TABLE" || n === "table" || t === "table" || t === "list" || t === "pivot_table" ? {
182
+ minHeight: "min(250px, 40vh)",
183
+ maxHeight: "min(500px, 65vh)"
184
+ } : {
185
+ minHeight: "min(120px, 25vh)",
186
+ maxHeight: "min(300px, 50vh)"
187
+ },
188
+ children: /* @__PURE__ */ u(m, {
189
+ widget: e,
190
+ filterValues: a
191
+ })
192
+ }, e.id);
162
193
  })
163
- ]
164
- }), /* @__PURE__ */ c("div", {
165
- className: "space-y-4",
166
- children: v.map((e) => {
167
- let t = e.config?._internalWidgetType, n = e.type;
168
- return /* @__PURE__ */ c("div", {
169
- className: "border border-border-default rounded-lg bg-bg-surface overflow-hidden",
170
- style: n === "LINE_CHART" || n === "chart" || t === "chart" || t === "funnel_chart" ? { height: "350px" } : n === "TABLE" || n === "table" || t === "table" || t === "list" || t === "pivot_table" ? {
171
- minHeight: "250px",
172
- maxHeight: "500px"
173
- } : {
174
- minHeight: "120px",
175
- maxHeight: "300px"
176
- },
177
- children: /* @__PURE__ */ c(f, {
178
- widget: e,
179
- filterValues: r
180
- })
181
- }, e.id);
182
194
  })
183
- })]
195
+ ]
184
196
  });
185
- }), f = i(function({ widget: e, filterValues: t }) {
186
- return /* @__PURE__ */ c("div", {
197
+ }), m = o(function({ widget: e, filterValues: t }) {
198
+ return /* @__PURE__ */ u("div", {
187
199
  className: "h-full [&_[data-widget-id]]:border-transparent [&_[data-widget-id]:hover]:border-transparent",
188
- children: /* @__PURE__ */ c(r, {
200
+ children: /* @__PURE__ */ u(a, {
189
201
  widget: e,
190
202
  isLoading: !1,
191
203
  error: null,
@@ -194,6 +206,6 @@ var d = i(function({ dashboardId: n, params: r }) {
194
206
  });
195
207
  });
196
208
  //#endregion
197
- export { d as default };
209
+ export { p as default };
198
210
 
199
211
  //# sourceMappingURL=DrilldownDashboardRenderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DrilldownDashboardRenderer.js","names":[],"sources":["../../../src/bigconsole/components/DrilldownDashboardRenderer.tsx"],"sourcesContent":["/**\n * DrilldownDashboardRenderer Component\n *\n * Renders a dashboard inside the DrilldownModal.\n * Fetches dashboard data and displays widgets with passed parameters.\n */\n\nimport { type FC, memo, useEffect, useState } from 'react';\nimport { useApolloClient } from '@apollo/client/react';\nimport type { Widget } from '../types';\nimport { WidgetWrapper } from './widgets/WidgetWrapper';\nimport { ListWidgetsByDashboardDocument, GetDashboardDocument } from '../../generated/wspace-operations';\nimport { mapFromFederationWidgetType } from '../utils/widgetTypeMapping';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DrilldownDashboardRendererProps {\n /** Target dashboard ID to render */\n dashboardId: string;\n /** Parameters passed from drilldown (can be used for filtering) */\n params: Record<string, unknown>;\n}\n\ninterface DashboardData {\n id: string;\n name: string;\n description?: string;\n pages: Array<{\n id: string;\n name: string;\n }>;\n}\n\n// ============================================================================\n// Helper: Normalize widget from GraphQL\n// ============================================================================\n\nfunction normalizeWidget(raw: Record<string, unknown>, index: number): Widget {\n // For drilldown modal, stack widgets vertically with compact sizing\n const posX = 0;\n const posY = index * 4; // Stack vertically, 4 row units per widget\n const posW = 12; // Full width\n const posH = 4; // Better height for widget content\n\n const position = { x: posX, y: posY, width: posW, height: posH };\n\n // Get the config object\n const config = (raw.config as Record<string, unknown>) || {};\n\n // Map widget type correctly: check _internalWidgetType first, then map from federation type\n // This is critical — federation types like 'KPI' must be mapped to internal types like 'metric_card'\n const internalType = config._internalWidgetType as string | undefined;\n const widgetType = internalType || mapFromFederationWidgetType((raw.type as string) || 'KPI');\n\n return {\n id: (raw.id as string) ?? '',\n pageId: (raw.pageId as string) || '',\n dashboardId: raw.dashboardId as string | undefined,\n type: widgetType,\n title: (raw.title as string) || 'Untitled Widget',\n renderer: raw.renderer || 'BIGCONSOLE',\n template: raw.template || null,\n dataSinkId: raw.dataSinkId || null,\n datasetId: raw.datasetId || null,\n parserId: raw.parserId || null,\n parserRules: raw.parserRules || null,\n config: config,\n position: position,\n positionX: posX,\n positionY: posY,\n positionWidth: posW,\n positionHeight: posH,\n positionResponsive: raw.positionResponsive as Widget['positionResponsive'],\n rowOrder: (raw.rowOrder as number | null) ?? null,\n refreshInterval: raw.refreshInterval,\n lastRefreshedAt: raw.lastRefreshedAt,\n cacheTTL: (raw.cacheTTL as number | null) ?? null,\n drilldown: raw.drilldown as Widget['drilldown'],\n actions: (raw.actions as Widget['actions']) || [],\n translations: (raw.translations as Widget['translations']) || [],\n metadata: raw.metadata as Record<string, unknown> | undefined,\n context: raw.context,\n // Include widget data from backend (critical for showing real data in modal)\n data: raw.data || null,\n createdAt: (raw.createdAt as string) || new Date().toISOString(),\n updatedAt: (raw.updatedAt as string) || new Date().toISOString(),\n } as Widget;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const DrilldownDashboardRenderer: FC<DrilldownDashboardRendererProps> = memo(\n function DrilldownDashboardRenderer({ dashboardId, params }) {\n const apolloClient = useApolloClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [dashboard, setDashboard] = useState<DashboardData | null>(null);\n const [widgets, setWidgets] = useState<Widget[]>([]);\n\n // Fetch dashboard and widgets — only when dashboardId is provided\n useEffect(() => {\n if (!dashboardId) {\n setLoading(false);\n return;\n }\n\n async function fetchData() {\n setLoading(true);\n setError(null);\n\n try {\n // Fetch dashboard info\n interface DashboardQueryResult {\n getDashboard: {\n id: string;\n name: string;\n description?: string;\n pages?: {\n edges?: Array<{ node: { id: string; name?: string } }>;\n };\n } | null;\n }\n\n const dashboardResult = await apolloClient.query<DashboardQueryResult>({\n query: GetDashboardDocument,\n variables: { id: dashboardId },\n fetchPolicy: 'network-only',\n });\n\n const dashboardData = dashboardResult.data?.getDashboard;\n if (!dashboardData) {\n setError('Dashboard not found');\n setLoading(false);\n return;\n }\n\n // Normalize dashboard\n const pages =\n dashboardData.pages?.edges?.map((edge) => ({\n id: edge.node.id,\n name: edge.node.name || 'Page 1',\n })) || [];\n\n setDashboard({\n id: dashboardData.id,\n name: dashboardData.name,\n description: dashboardData.description,\n pages,\n });\n\n // Fetch widgets for the dashboard\n const widgetsResult = await apolloClient.query<{ listWidgetsByDashboard: Record<string, unknown>[] }>({\n query: ListWidgetsByDashboardDocument,\n variables: { dashboardId },\n fetchPolicy: 'network-only',\n });\n\n const widgetsList = widgetsResult.data?.listWidgetsByDashboard || [];\n setWidgets(widgetsList.map((w, i) => normalizeWidget(w, i)));\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load dashboard');\n } finally {\n setLoading(false);\n }\n }\n\n fetchData();\n }, [dashboardId, apolloClient]);\n\n // Loading state\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"flex flex-col items-center gap-3\">\n <div className=\"w-8 h-8 border-2 border-action-primary-bg border-t-transparent rounded-full animate-spin\" />\n <p className=\"text-sm text-text-secondary\">Loading dashboard...</p>\n </div>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"flex flex-col items-center gap-3 text-center max-w-md\">\n <svg className=\"w-12 h-12 text-status-error-text\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n <p className=\"text-sm text-text-secondary\">{error}</p>\n </div>\n </div>\n );\n }\n\n // Empty state\n if (!dashboard || widgets.length === 0) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <svg className=\"w-12 h-12 text-text-tertiary\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z\"\n />\n </svg>\n <p className=\"text-sm text-text-secondary\">\n {dashboard ? 'This dashboard has no widgets' : 'Dashboard not found'}\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"w-full\">\n {/* Dashboard Header */}\n <div className=\"pb-3 mb-4 border-b border-border-default\">\n <h3 className=\"text-lg font-semibold text-text-primary\">{dashboard.name}</h3>\n {dashboard.description && <p className=\"text-sm text-text-secondary mt-1\">{dashboard.description}</p>}\n {/* Show params if present (filter out internal __drilldown metadata) */}\n {Object.keys(params).filter((k) => !k.startsWith('__')).length > 0 && (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {Object.entries(params)\n .filter(([key]) => !key.startsWith('__'))\n .map(([key, value]) => (\n <span\n key={key}\n className=\"inline-flex items-center px-2 py-1 rounded bg-action-primary-bg/10 text-xs\"\n >\n <span className=\"font-medium text-text-primary\">{key}:</span>\n <span className=\"ml-1 text-action-primary-text\">\n {typeof value === 'object' && value !== null ? JSON.stringify(value) : String(value)}\n </span>\n </span>\n ))}\n </div>\n )}\n </div>\n\n {/* Widgets List - simple vertical layout for modal */}\n <div className=\"space-y-4\">\n {widgets.map((widget) => {\n // Chart widgets (LINE_CHART / chart) need explicit pixel height because\n // Recharts ResponsiveContainer height=\"100%\" requires a parent with\n // a definite height — minHeight alone doesn't work.\n const internalType = (widget.config as Record<string, unknown>)?._internalWidgetType as string | undefined;\n const widgetType = widget.type as string;\n const isChartWidget =\n widgetType === 'LINE_CHART' ||\n widgetType === 'chart' ||\n internalType === 'chart' ||\n internalType === 'funnel_chart';\n const isTableWidget =\n widgetType === 'TABLE' ||\n widgetType === 'table' ||\n internalType === 'table' ||\n internalType === 'list' ||\n internalType === 'pivot_table';\n\n // Charts need explicit height; tables need more space; KPIs auto-size\n const heightStyle = isChartWidget\n ? { height: '350px' }\n : isTableWidget\n ? { minHeight: '250px', maxHeight: '500px' }\n : { minHeight: '120px', maxHeight: '300px' };\n\n return (\n <div\n key={widget.id}\n className=\"border border-border-default rounded-lg bg-bg-surface overflow-hidden\"\n style={heightStyle}\n >\n <WidgetInModal widget={widget} filterValues={params} />\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n);\n\n// ============================================================================\n// Widget In Modal Component\n// ============================================================================\n\ninterface WidgetInModalProps {\n widget: Widget;\n filterValues?: Record<string, unknown>;\n}\n\nconst WidgetInModal: FC<WidgetInModalProps> = memo(function WidgetInModal({ widget, filterValues }) {\n return (\n <div className=\"h-full [&_[data-widget-id]]:border-transparent [&_[data-widget-id]:hover]:border-transparent\">\n <WidgetWrapper widget={widget} isLoading={false} error={null} filterValues={filterValues} />\n </div>\n );\n});\n\nexport default DrilldownDashboardRenderer;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DrilldownDashboardRenderer.js","names":[],"sources":["../../../src/bigconsole/components/DrilldownDashboardRenderer.tsx"],"sourcesContent":["/**\n * DrilldownDashboardRenderer Component\n *\n * Renders a dashboard inside the DrilldownModal.\n * Fetches dashboard data and displays widgets with passed parameters.\n */\n\nimport { type FC, memo, useEffect, useState } from 'react';\nimport { useApolloClient } from '@apollo/client/react';\nimport type { Widget } from '../types';\nimport { WidgetWrapper } from './widgets/WidgetWrapper';\nimport { Section, SectionStack } from './common';\nimport { ListWidgetsByDashboardDocument, GetDashboardDocument } from '../../generated/wspace-operations';\nimport { mapFromFederationWidgetType } from '../utils/widgetTypeMapping';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DrilldownDashboardRendererProps {\n /** Target dashboard ID to render */\n dashboardId: string;\n /** Parameters passed from drilldown (can be used for filtering) */\n params: Record<string, unknown>;\n}\n\ninterface DashboardData {\n id: string;\n name: string;\n description?: string;\n pages: Array<{\n id: string;\n name: string;\n }>;\n}\n\n// ============================================================================\n// Helper: Normalize widget from GraphQL\n// ============================================================================\n\nfunction normalizeWidget(raw: Record<string, unknown>, index: number): Widget {\n // For drilldown modal, stack widgets vertically with compact sizing\n const posX = 0;\n const posY = index * 4; // Stack vertically, 4 row units per widget\n const posW = 12; // Full width\n const posH = 4; // Better height for widget content\n\n const position = { x: posX, y: posY, width: posW, height: posH };\n\n // Get the config object\n const config = (raw.config as Record<string, unknown>) || {};\n\n // Map widget type correctly: check _internalWidgetType first, then map from federation type\n // This is critical — federation types like 'KPI' must be mapped to internal types like 'metric_card'\n const internalType = config._internalWidgetType as string | undefined;\n const widgetType = internalType || mapFromFederationWidgetType((raw.type as string) || 'KPI');\n\n return {\n id: (raw.id as string) ?? '',\n pageId: (raw.pageId as string) || '',\n dashboardId: raw.dashboardId as string | undefined,\n type: widgetType,\n title: (raw.title as string) || 'Untitled Widget',\n renderer: raw.renderer || 'BIGCONSOLE',\n template: raw.template || null,\n dataSinkId: raw.dataSinkId || null,\n datasetId: raw.datasetId || null,\n parserId: raw.parserId || null,\n parserRules: raw.parserRules || null,\n config: config,\n position: position,\n positionX: posX,\n positionY: posY,\n positionWidth: posW,\n positionHeight: posH,\n positionResponsive: raw.positionResponsive as Widget['positionResponsive'],\n rowOrder: (raw.rowOrder as number | null) ?? null,\n refreshInterval: raw.refreshInterval,\n lastRefreshedAt: raw.lastRefreshedAt,\n cacheTTL: (raw.cacheTTL as number | null) ?? null,\n drilldown: raw.drilldown as Widget['drilldown'],\n actions: (raw.actions as Widget['actions']) || [],\n translations: (raw.translations as Widget['translations']) || [],\n metadata: raw.metadata as Record<string, unknown> | undefined,\n context: raw.context,\n // Include widget data from backend (critical for showing real data in modal)\n data: raw.data || null,\n createdAt: (raw.createdAt as string) || new Date().toISOString(),\n updatedAt: (raw.updatedAt as string) || new Date().toISOString(),\n } as Widget;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const DrilldownDashboardRenderer: FC<DrilldownDashboardRendererProps> = memo(\n function DrilldownDashboardRenderer({ dashboardId, params }) {\n const apolloClient = useApolloClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [dashboard, setDashboard] = useState<DashboardData | null>(null);\n const [widgets, setWidgets] = useState<Widget[]>([]);\n\n // Fetch dashboard and widgets — only when dashboardId is provided\n useEffect(() => {\n if (!dashboardId) {\n setLoading(false);\n return;\n }\n\n async function fetchData() {\n setLoading(true);\n setError(null);\n\n try {\n // Fetch dashboard info\n interface DashboardQueryResult {\n getDashboard: {\n id: string;\n name: string;\n description?: string;\n pages?: {\n edges?: Array<{ node: { id: string; name?: string } }>;\n };\n } | null;\n }\n\n const dashboardResult = await apolloClient.query<DashboardQueryResult>({\n query: GetDashboardDocument,\n variables: { id: dashboardId },\n fetchPolicy: 'network-only',\n });\n\n const dashboardData = dashboardResult.data?.getDashboard;\n if (!dashboardData) {\n setError('Dashboard not found');\n setLoading(false);\n return;\n }\n\n // Normalize dashboard\n const pages =\n dashboardData.pages?.edges?.map((edge) => ({\n id: edge.node.id,\n name: edge.node.name || 'Page 1',\n })) || [];\n\n setDashboard({\n id: dashboardData.id,\n name: dashboardData.name,\n description: dashboardData.description,\n pages,\n });\n\n // Fetch widgets for the dashboard\n const widgetsResult = await apolloClient.query<{ listWidgetsByDashboard: Record<string, unknown>[] }>({\n query: ListWidgetsByDashboardDocument,\n variables: { dashboardId },\n fetchPolicy: 'network-only',\n });\n\n const widgetsList = widgetsResult.data?.listWidgetsByDashboard || [];\n setWidgets(widgetsList.map((w, i) => normalizeWidget(w, i)));\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load dashboard');\n } finally {\n setLoading(false);\n }\n }\n\n fetchData();\n }, [dashboardId, apolloClient]);\n\n // Loading state\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"flex flex-col items-center gap-3\">\n <div className=\"w-8 h-8 border-2 border-action-primary-bg border-t-transparent rounded-full animate-spin\" />\n <p className=\"text-sm text-text-secondary\">Loading dashboard...</p>\n </div>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center\" role=\"alert\">\n <Section\n headingLevel={3}\n tone=\"danger\"\n className=\"w-full max-w-md\"\n data-testid=\"drilldown-error\"\n title=\"Could not load this dashboard\"\n description={error}\n icon={\n <svg className=\"h-icon-md w-icon-md\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n }\n />\n </div>\n );\n }\n\n // Empty state\n if (!dashboard || widgets.length === 0) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <svg className=\"w-12 h-12 text-text-muted\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z\"\n />\n </svg>\n <p className=\"text-sm text-text-secondary\">\n {dashboard ? 'This dashboard has no widgets' : 'Dashboard not found'}\n </p>\n </div>\n </div>\n );\n }\n\n const visibleParams = Object.entries(params).filter(([key]) => !key.startsWith('__'));\n\n return (\n <SectionStack className=\"w-full\">\n {/* Which board you drilled into — identity, not content. */}\n <Section\n emphasis=\"bare\"\n padding=\"none\"\n headingLevel={3}\n title={dashboard.name}\n description={dashboard.description}\n data-testid=\"drilldown-dashboard-header\"\n />\n\n {/* The filter context you arrived with: supporting detail, recessed. */}\n {visibleParams.length > 0 && (\n <Section\n emphasis=\"muted\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Filtered by\"\n data-testid=\"drilldown-params\"\n bodyClassName=\"flex flex-wrap gap-control-gap\"\n >\n {visibleParams.map(([key, value]) => (\n <span\n key={key}\n className=\"inline-flex items-center rounded-pill bg-bg-surface px-2 py-1 text-xs text-text-secondary\"\n >\n <span className=\"font-medium text-text-primary\">{key}:</span>\n <span className=\"ml-1\">\n {typeof value === 'object' && value !== null ? JSON.stringify(value) : String(value)}\n </span>\n </span>\n ))}\n </Section>\n )}\n\n {/* Widgets List - simple vertical layout for modal */}\n <div className=\"flex flex-col gap-form-gap\">\n {widgets.map((widget) => {\n // Chart widgets (LINE_CHART / chart) need explicit pixel height because\n // Recharts ResponsiveContainer height=\"100%\" requires a parent with\n // a definite height — minHeight alone doesn't work.\n const internalType = (widget.config as Record<string, unknown>)?._internalWidgetType as string | undefined;\n const widgetType = widget.type as string;\n const isChartWidget =\n widgetType === 'LINE_CHART' ||\n widgetType === 'chart' ||\n internalType === 'chart' ||\n internalType === 'funnel_chart';\n const isTableWidget =\n widgetType === 'TABLE' ||\n widgetType === 'table' ||\n internalType === 'table' ||\n internalType === 'list' ||\n internalType === 'pivot_table';\n\n // Charts need an explicit height (Recharts' ResponsiveContainer needs a\n // definite parent). Clamping against the viewport keeps a 350px chart\n // plus a 500px table from filling a phone screen twice over.\n const heightStyle = isChartWidget\n ? { height: 'clamp(220px, 45vh, 350px)' }\n : isTableWidget\n ? { minHeight: 'min(250px, 40vh)', maxHeight: 'min(500px, 65vh)' }\n : { minHeight: 'min(120px, 25vh)', maxHeight: 'min(300px, 50vh)' };\n\n return (\n <div\n key={widget.id}\n className=\"min-w-0 overflow-hidden rounded-card border border-[var(--color-border-subtle)] bg-bg-surface\"\n style={heightStyle}\n >\n <WidgetInModal widget={widget} filterValues={params} />\n </div>\n );\n })}\n </div>\n </SectionStack>\n );\n }\n);\n\n// ============================================================================\n// Widget In Modal Component\n// ============================================================================\n\ninterface WidgetInModalProps {\n widget: Widget;\n filterValues?: Record<string, unknown>;\n}\n\nconst WidgetInModal: FC<WidgetInModalProps> = memo(function WidgetInModal({ widget, filterValues }) {\n return (\n <div className=\"h-full [&_[data-widget-id]]:border-transparent [&_[data-widget-id]:hover]:border-transparent\">\n <WidgetWrapper widget={widget} isLoading={false} error={null} filterValues={filterValues} />\n </div>\n );\n});\n\nexport default DrilldownDashboardRenderer;\n"],"mappings":"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"}
@@ -1,49 +1,52 @@
1
1
  import e from "../store/drilldownStore.js";
2
- import { memo as t, useCallback as n, useEffect as r } from "react";
3
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
2
+ import { SECTION_FOCUS_RING as t } from "./common/sectionStyles.js";
3
+ import "./common/index.js";
4
+ import { memo as n, useCallback as r, useEffect as i } from "react";
5
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
4
6
  //#region src/bigconsole/components/DrilldownModal.tsx
5
- var o = t(function({ renderDashboard: t, onClose: o }) {
6
- let c = e((e) => e.isOpen), l = e((e) => e.dashboardId), u = e((e) => e.params), d = e((e) => e.history), f = e((e) => e.closeModal), p = e((e) => e.popDrilldown), m = n(() => {
7
- f(), o?.();
8
- }, [f, o]), h = n(() => {
9
- p();
10
- }, [p]), g = n((e) => {
11
- e.target === e.currentTarget && m();
12
- }, [m]);
13
- return r(() => {
7
+ var s = n(function({ renderDashboard: n, onClose: s }) {
8
+ let l = e((e) => e.isOpen), u = e((e) => e.dashboardId), d = e((e) => e.params), f = e((e) => e.history), p = e((e) => e.closeModal), m = e((e) => e.popDrilldown), h = r(() => {
9
+ p(), s?.();
10
+ }, [p, s]), g = r(() => {
11
+ m();
12
+ }, [m]), _ = r((e) => {
13
+ e.target === e.currentTarget && h();
14
+ }, [h]);
15
+ return i(() => {
14
16
  let e = (e) => {
15
- e.key === "Escape" && c && m();
17
+ e.key === "Escape" && l && h();
16
18
  };
17
19
  return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
18
- }, [c, m]), r(() => (c ? document.body.style.overflow = "hidden" : document.body.style.overflow = "", () => {
20
+ }, [l, h]), i(() => (l ? document.body.style.overflow = "hidden" : document.body.style.overflow = "", () => {
19
21
  document.body.style.overflow = "";
20
- }), [c]), !c || !l ? null : /* @__PURE__ */ a("div", {
22
+ }), [l]), !l || !u ? null : /* @__PURE__ */ o("div", {
21
23
  className: "fixed inset-0 z-50 flex items-center justify-center p-4",
22
24
  role: "dialog",
23
25
  "aria-modal": "true",
24
26
  "aria-labelledby": "drilldown-modal-title",
25
- onClick: g,
26
- children: [/* @__PURE__ */ i("div", { className: "absolute inset-0 bg-black/60 backdrop-blur-sm" }), /* @__PURE__ */ a("div", {
27
- className: "relative z-10 w-full max-w-5xl bg-bg-surface rounded-xl shadow-2xl flex flex-col",
27
+ onClick: _,
28
+ children: [/* @__PURE__ */ a("div", { className: "absolute inset-0 bg-[var(--color-overlay-scrim)] backdrop-blur-sm" }), /* @__PURE__ */ o("div", {
29
+ className: "relative z-10 flex w-full max-w-5xl flex-col overflow-hidden rounded-card bg-bg-surface shadow-[var(--shadow-elevation-3)]",
28
30
  style: { maxHeight: "calc(100vh - 2rem)" },
29
31
  onClick: (e) => e.stopPropagation(),
30
32
  children: [
31
- /* @__PURE__ */ a("div", {
32
- className: "flex-shrink-0 flex items-center justify-between px-4 py-3 border-b border-border-default bg-bg-sunken/50 rounded-t-xl",
33
- children: [/* @__PURE__ */ a("div", {
34
- className: "flex items-center gap-3",
33
+ /* @__PURE__ */ o("div", {
34
+ className: "flex flex-shrink-0 flex-wrap items-center justify-between gap-control-gap border-b border-[var(--color-border-subtle)] px-4 py-3",
35
+ children: [/* @__PURE__ */ o("div", {
36
+ className: "flex min-w-0 items-center gap-3",
35
37
  children: [
36
- d.length > 0 && /* @__PURE__ */ i("button", {
38
+ f.length > 0 && /* @__PURE__ */ a("button", {
37
39
  type: "button",
38
- onClick: h,
39
- className: "p-1.5 rounded-md hover:bg-bg-sunken transition-colors",
40
+ onClick: g,
41
+ className: "flex h-control-md w-[var(--size-controlHeight-md)] shrink-0 items-center justify-center rounded-button motion-safe:transition-colors hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-bg-surface",
40
42
  title: "Go back",
41
- children: /* @__PURE__ */ i("svg", {
43
+ "aria-label": "Go back",
44
+ children: /* @__PURE__ */ a("svg", {
42
45
  className: "w-5 h-5 text-text-secondary",
43
46
  fill: "none",
44
47
  stroke: "currentColor",
45
48
  viewBox: "0 0 24 24",
46
- children: /* @__PURE__ */ i("path", {
49
+ children: /* @__PURE__ */ a("path", {
47
50
  strokeLinecap: "round",
48
51
  strokeLinejoin: "round",
49
52
  strokeWidth: 2,
@@ -51,33 +54,34 @@ var o = t(function({ renderDashboard: t, onClose: o }) {
51
54
  })
52
55
  })
53
56
  }),
54
- /* @__PURE__ */ i("h2", {
57
+ /* @__PURE__ */ a("h2", {
55
58
  id: "drilldown-modal-title",
56
- className: "text-sm font-medium text-text-primary",
59
+ className: "truncate text-sm font-semibold text-text-primary",
57
60
  children: "Drilldown View"
58
61
  }),
59
- d.length > 0 && /* @__PURE__ */ a("span", {
60
- className: "text-xs text-text-tertiary",
62
+ f.length > 0 && /* @__PURE__ */ o("span", {
63
+ className: "text-xs text-text-muted",
61
64
  children: [
62
65
  "(",
63
- d.length + 1,
66
+ f.length + 1,
64
67
  " level",
65
- d.length > 0 ? "s" : "",
68
+ f.length > 0 ? "s" : "",
66
69
  " deep)"
67
70
  ]
68
71
  })
69
72
  ]
70
- }), /* @__PURE__ */ i("button", {
73
+ }), /* @__PURE__ */ a("button", {
71
74
  type: "button",
72
- onClick: m,
73
- className: "p-2 rounded-md hover:bg-bg-sunken transition-colors",
75
+ onClick: h,
76
+ className: `flex h-control-md w-[var(--size-controlHeight-md)] shrink-0 items-center justify-center rounded-button motion-safe:transition-colors hover:bg-bg-sunken ${t}`,
74
77
  title: "Close (Esc)",
75
- children: /* @__PURE__ */ i("svg", {
78
+ "aria-label": "Close drilldown",
79
+ children: /* @__PURE__ */ a("svg", {
76
80
  className: "w-5 h-5 text-text-secondary",
77
81
  fill: "none",
78
82
  stroke: "currentColor",
79
83
  viewBox: "0 0 24 24",
80
- children: /* @__PURE__ */ i("path", {
84
+ children: /* @__PURE__ */ a("path", {
81
85
  strokeLinecap: "round",
82
86
  strokeLinejoin: "round",
83
87
  strokeWidth: 2,
@@ -86,32 +90,32 @@ var o = t(function({ renderDashboard: t, onClose: o }) {
86
90
  })
87
91
  })]
88
92
  }),
89
- /* @__PURE__ */ i("div", {
90
- className: "flex-1 overflow-y-auto min-h-0 p-4",
91
- children: t ? t(l, u) : /* @__PURE__ */ i(s, {})
93
+ /* @__PURE__ */ a("div", {
94
+ className: "min-h-0 flex-1 overflow-y-auto bg-bg-sunken p-4",
95
+ children: n ? n(u, d) : /* @__PURE__ */ a(c, {})
92
96
  }),
93
- /* @__PURE__ */ i("div", {
94
- className: "flex-shrink-0 px-4 py-2 border-t border-border-default bg-bg-sunken/30 rounded-b-xl",
95
- children: /* @__PURE__ */ a("div", {
96
- className: "flex items-center justify-between text-xs text-text-tertiary",
97
- children: [/* @__PURE__ */ a("span", { children: [
97
+ /* @__PURE__ */ a("div", {
98
+ className: "flex-shrink-0 border-t border-[var(--color-border-subtle)] px-4 py-2",
99
+ children: /* @__PURE__ */ o("div", {
100
+ className: "flex flex-wrap items-center justify-between gap-x-4 gap-y-1 text-xs text-text-muted",
101
+ children: [/* @__PURE__ */ o("span", { children: [
98
102
  "Parameters:",
99
103
  " ",
100
- Object.keys(u).filter((e) => !e.startsWith("__")).length > 0 ? Object.keys(u).filter((e) => !e.startsWith("__")).join(", ") : "None"
101
- ] }), /* @__PURE__ */ i("span", { children: "Press Esc to close" })]
104
+ Object.keys(d).filter((e) => !e.startsWith("__")).length > 0 ? Object.keys(d).filter((e) => !e.startsWith("__")).join(", ") : "None"
105
+ ] }), /* @__PURE__ */ a("span", { children: "Press Esc to close" })]
102
106
  })
103
107
  })
104
108
  ]
105
109
  })]
106
110
  });
107
111
  });
108
- function s() {
109
- return /* @__PURE__ */ i("div", {
112
+ function c() {
113
+ return /* @__PURE__ */ a("div", {
110
114
  className: "flex items-center justify-center h-full text-sm text-text-secondary",
111
115
  children: "Unable to load drilldown content. Please try again."
112
116
  });
113
117
  }
114
118
  //#endregion
115
- export { o as default };
119
+ export { s as default };
116
120
 
117
121
  //# sourceMappingURL=DrilldownModal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DrilldownModal.js","names":[],"sources":["../../../src/bigconsole/components/DrilldownModal.tsx"],"sourcesContent":["/**\n * DrilldownModal Component\n *\n * Modal overlay for displaying drilldown dashboards.\n * Supports nested drilldowns with back navigation.\n */\n\nimport { type FC, useEffect, useCallback, memo } from 'react';\nimport { useDrilldownStore } from '../store/drilldownStore';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DrilldownModalProps {\n /** Custom content renderer for the dashboard */\n renderDashboard?: (dashboardId: string, params: Record<string, unknown>) => React.ReactNode;\n /** Called when modal closes */\n onClose?: () => void;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const DrilldownModal: FC<DrilldownModalProps> = memo(function DrilldownModal({ renderDashboard, onClose }) {\n const isOpen = useDrilldownStore((state) => state.isOpen);\n const dashboardId = useDrilldownStore((state) => state.dashboardId);\n const params = useDrilldownStore((state) => state.params);\n const history = useDrilldownStore((state) => state.history);\n const closeModal = useDrilldownStore((state) => state.closeModal);\n const popDrilldown = useDrilldownStore((state) => state.popDrilldown);\n\n // Define handlers before effects that use them\n const handleClose = useCallback(() => {\n closeModal();\n onClose?.();\n }, [closeModal, onClose]);\n\n const handleBack = useCallback(() => {\n popDrilldown();\n }, [popDrilldown]);\n\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n handleClose();\n }\n },\n [handleClose]\n );\n\n // Handle escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n handleClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, handleClose]);\n\n // Prevent body scroll when modal is open\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [isOpen]);\n\n if (!isOpen || !dashboardId) {\n return null;\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"drilldown-modal-title\"\n onClick={handleBackdropClick}\n >\n {/* Backdrop */}\n <div className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\" />\n\n {/* Modal Content - contained within viewport */}\n <div\n className=\"relative z-10 w-full max-w-5xl bg-bg-surface rounded-xl shadow-2xl flex flex-col\"\n style={{ maxHeight: 'calc(100vh - 2rem)' }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"flex-shrink-0 flex items-center justify-between px-4 py-3 border-b border-border-default bg-bg-sunken/50 rounded-t-xl\">\n <div className=\"flex items-center gap-3\">\n {/* Back button */}\n {history.length > 0 && (\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"p-1.5 rounded-md hover:bg-bg-sunken transition-colors\"\n title=\"Go back\"\n >\n <svg className=\"w-5 h-5 text-text-secondary\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n )}\n\n {/* Title */}\n <h2 id=\"drilldown-modal-title\" className=\"text-sm font-medium text-text-primary\">\n Drilldown View\n </h2>\n\n {/* Breadcrumb indicator */}\n {history.length > 0 && (\n <span className=\"text-xs text-text-tertiary\">\n ({history.length + 1} level{history.length > 0 ? 's' : ''} deep)\n </span>\n )}\n </div>\n\n {/* Close button */}\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"p-2 rounded-md hover:bg-bg-sunken transition-colors\"\n title=\"Close (Esc)\"\n >\n <svg className=\"w-5 h-5 text-text-secondary\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Dashboard Content - scrollable */}\n <div className=\"flex-1 overflow-y-auto min-h-0 p-4\">\n {renderDashboard ? renderDashboard(dashboardId, params) : <DrilldownFallback />}\n </div>\n\n {/* Footer */}\n <div className=\"flex-shrink-0 px-4 py-2 border-t border-border-default bg-bg-sunken/30 rounded-b-xl\">\n <div className=\"flex items-center justify-between text-xs text-text-tertiary\">\n <span>\n Parameters:{' '}\n {Object.keys(params).filter((k) => !k.startsWith('__')).length > 0\n ? Object.keys(params)\n .filter((k) => !k.startsWith('__'))\n .join(', ')\n : 'None'}\n </span>\n <span>Press Esc to close</span>\n </div>\n </div>\n </div>\n </div>\n );\n});\n\n// Fallback when no renderDashboard prop is provided (should not happen in normal usage\n// since BigConsoleRoot always passes DrilldownDashboardRenderer).\nfunction DrilldownFallback() {\n return (\n <div className=\"flex items-center justify-center h-full text-sm text-text-secondary\">\n Unable to load drilldown content. Please try again.\n </div>\n );\n}\n\nexport default DrilldownModal;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DrilldownModal.js","names":[],"sources":["../../../src/bigconsole/components/DrilldownModal.tsx"],"sourcesContent":["/**\n * DrilldownModal Component\n *\n * Modal overlay for displaying drilldown dashboards.\n * Supports nested drilldowns with back navigation.\n */\n\nimport { type FC, useEffect, useCallback, memo } from 'react';\nimport { useDrilldownStore } from '../store/drilldownStore';\nimport { SECTION_FOCUS_RING } from './common';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DrilldownModalProps {\n /** Custom content renderer for the dashboard */\n renderDashboard?: (dashboardId: string, params: Record<string, unknown>) => React.ReactNode;\n /** Called when modal closes */\n onClose?: () => void;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const DrilldownModal: FC<DrilldownModalProps> = memo(function DrilldownModal({ renderDashboard, onClose }) {\n const isOpen = useDrilldownStore((state) => state.isOpen);\n const dashboardId = useDrilldownStore((state) => state.dashboardId);\n const params = useDrilldownStore((state) => state.params);\n const history = useDrilldownStore((state) => state.history);\n const closeModal = useDrilldownStore((state) => state.closeModal);\n const popDrilldown = useDrilldownStore((state) => state.popDrilldown);\n\n // Define handlers before effects that use them\n const handleClose = useCallback(() => {\n closeModal();\n onClose?.();\n }, [closeModal, onClose]);\n\n const handleBack = useCallback(() => {\n popDrilldown();\n }, [popDrilldown]);\n\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n handleClose();\n }\n },\n [handleClose]\n );\n\n // Handle escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n handleClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, handleClose]);\n\n // Prevent body scroll when modal is open\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [isOpen]);\n\n if (!isOpen || !dashboardId) {\n return null;\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"drilldown-modal-title\"\n onClick={handleBackdropClick}\n >\n {/* Backdrop */}\n <div className=\"absolute inset-0 bg-[var(--color-overlay-scrim)] backdrop-blur-sm\" />\n\n {/* Modal Content - contained within viewport */}\n <div\n className=\"relative z-10 flex w-full max-w-5xl flex-col overflow-hidden rounded-card bg-bg-surface shadow-[var(--shadow-elevation-3)]\"\n style={{ maxHeight: 'calc(100vh - 2rem)' }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header — bare chrome: identity + close, no surface of its own */}\n <div className=\"flex flex-shrink-0 flex-wrap items-center justify-between gap-control-gap border-b border-[var(--color-border-subtle)] px-4 py-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n {/* Back button */}\n {history.length > 0 && (\n <button\n type=\"button\"\n onClick={handleBack}\n className={`flex h-control-md w-[var(--size-controlHeight-md)] shrink-0 items-center justify-center rounded-button motion-safe:transition-colors hover:bg-bg-sunken ${SECTION_FOCUS_RING}`}\n title=\"Go back\"\n aria-label=\"Go back\"\n >\n <svg className=\"w-5 h-5 text-text-secondary\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n )}\n\n {/* Title */}\n <h2 id=\"drilldown-modal-title\" className=\"truncate text-sm font-semibold text-text-primary\">\n Drilldown View\n </h2>\n\n {/* Breadcrumb indicator */}\n {history.length > 0 && (\n <span className=\"text-xs text-text-muted\">\n ({history.length + 1} level{history.length > 0 ? 's' : ''} deep)\n </span>\n )}\n </div>\n\n {/* Close button */}\n <button\n type=\"button\"\n onClick={handleClose}\n className={`flex h-control-md w-[var(--size-controlHeight-md)] shrink-0 items-center justify-center rounded-button motion-safe:transition-colors hover:bg-bg-sunken ${SECTION_FOCUS_RING}`}\n title=\"Close (Esc)\"\n aria-label=\"Close drilldown\"\n >\n <svg className=\"w-5 h-5 text-text-secondary\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Dashboard Content the point of the overlay, so it gets the surface\n weight and the chrome around it stays flat. */}\n <div className=\"min-h-0 flex-1 overflow-y-auto bg-bg-sunken p-4\">\n {renderDashboard ? renderDashboard(dashboardId, params) : <DrilldownFallback />}\n </div>\n\n {/* Footer — supporting detail only */}\n <div className=\"flex-shrink-0 border-t border-[var(--color-border-subtle)] px-4 py-2\">\n <div className=\"flex flex-wrap items-center justify-between gap-x-4 gap-y-1 text-xs text-text-muted\">\n <span>\n Parameters:{' '}\n {Object.keys(params).filter((k) => !k.startsWith('__')).length > 0\n ? Object.keys(params)\n .filter((k) => !k.startsWith('__'))\n .join(', ')\n : 'None'}\n </span>\n <span>Press Esc to close</span>\n </div>\n </div>\n </div>\n </div>\n );\n});\n\n// Fallback when no renderDashboard prop is provided (should not happen in normal usage\n// since BigConsoleRoot always passes DrilldownDashboardRenderer).\nfunction DrilldownFallback() {\n return (\n <div className=\"flex items-center justify-center h-full text-sm text-text-secondary\">\n Unable to load drilldown content. Please try again.\n </div>\n );\n}\n\nexport default DrilldownModal;\n"],"mappings":"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"}
@@ -3,12 +3,12 @@ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
3
  //#region src/bigconsole/components/builder/BuilderCanvas.tsx
4
4
  var r = e(function({ palette: e, canvas: r, inspector: i }) {
5
5
  return /* @__PURE__ */ n("div", {
6
- className: "flex min-h-0 min-w-0 flex-1 overflow-hidden",
6
+ className: "flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden md:flex-row",
7
7
  "data-testid": "dashboard-editor-panes",
8
8
  children: [
9
9
  e,
10
10
  /* @__PURE__ */ t("main", {
11
- className: "relative min-w-0 flex-1 overflow-hidden",
11
+ className: "relative min-h-0 min-w-0 flex-1 overflow-hidden",
12
12
  children: r
13
13
  }),
14
14
  i