@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,13 +1,16 @@
1
1
  import { useBuildPath as e } from "../../contexts/NavigationContext.js";
2
2
  import "../../contexts/index.js";
3
- import t from "../../hooks/useDataSinkOperations.js";
4
- import n from "../datasink/DataSinkStatusBadge.js";
5
- import { Fragment as r, memo as i, useCallback as a, useMemo as o, useState as s } from "react";
6
- import { Plus as c } from "lucide-react";
7
- import { useI18n as l } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
3
+ import { SECTION_FOCUS_RING as t } from "../common/sectionStyles.js";
4
+ import "../common/index.js";
5
+ import n from "../../hooks/useDataSinkOperations.js";
6
+ import r from "../datasink/DataSinkStatusBadge.js";
7
+ import { Fragment as i, memo as a, useCallback as o, useMemo as s, useState as c } from "react";
8
+ import { Plus as l } from "lucide-react";
9
+ import { useI18n as u } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
10
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
9
11
  //#region src/bigconsole/components/parser/DataSinkSelector.tsx
10
- function f(e, t) {
12
+ var p = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y border-[var(--color-border-default)]", m = "text-xs font-semibold uppercase tracking-wide text-text-secondary";
13
+ function h(e, t) {
11
14
  if (!e) return t("bigconsole.parsers.dataSinkSelector.relativeTime.never", "Never");
12
15
  let n = new Date(e), r = Date.now() - n.getTime(), i = Math.floor(r / 6e4);
13
16
  if (i < 1) return t("bigconsole.parsers.dataSinkSelector.relativeTime.justNow", "Just now");
@@ -17,174 +20,202 @@ function f(e, t) {
17
20
  let o = Math.floor(a / 24);
18
21
  return o < 7 ? t("bigconsole.parsers.dataSinkSelector.relativeTime.daysAgo", "{{days}}d ago", { days: o }) : n.toLocaleDateString();
19
22
  }
20
- var p = ({ className: e }) => /* @__PURE__ */ u("svg", {
23
+ var g = ({ className: e }) => /* @__PURE__ */ d("svg", {
21
24
  className: e,
22
25
  fill: "none",
23
26
  stroke: "currentColor",
24
27
  viewBox: "0 0 24 24",
25
- children: /* @__PURE__ */ u("path", {
28
+ children: /* @__PURE__ */ d("path", {
26
29
  strokeLinecap: "round",
27
30
  strokeLinejoin: "round",
28
31
  strokeWidth: 2,
29
32
  d: "M19 9l-7 7-7-7"
30
33
  })
31
- }), m = i(function({ value: i, onChange: m, filterStatus: h, placeholder: g, disabled: _ = !1, error: v = !1, errorMessage: y }) {
32
- let { t: b } = l(), [x, S] = s(!1), [C, w] = s(""), T = g ?? b("bigconsole.parsers.dataSinkSelector.placeholder", "Select a data source..."), E = e(), { dataSinks: D, loading: O, fetchDataSinks: k } = t({ skipFetch: !1 }), A = o(() => D.filter((e) => {
33
- if (h && e.status !== h) return !1;
34
- if (C) {
35
- let t = C.toLowerCase();
34
+ }), _ = a(function({ value: a, onChange: _, filterStatus: v, placeholder: y, disabled: b = !1, error: x = !1, errorMessage: S }) {
35
+ let { t: C } = u(), [w, T] = c(!1), [E, D] = c(""), O = y ?? C("bigconsole.parsers.dataSinkSelector.placeholder", "Select a data source..."), k = e(), { dataSinks: A, loading: j, fetchDataSinks: M } = n({ skipFetch: !1 }), N = s(() => A.filter((e) => {
36
+ if (v && e.status !== v) return !1;
37
+ if (E) {
38
+ let t = E.toLowerCase();
36
39
  return (e.name || e.key).toLowerCase().includes(t) || e.key.toLowerCase().includes(t) || e.description?.toLowerCase().includes(t);
37
40
  }
38
41
  return !0;
39
42
  }), [
40
- D,
41
- h,
42
- C
43
- ]), j = o(() => D.find((e) => e.key === i), [D, i]), M = a((e) => {
44
- m(e), S(!1), w("");
45
- }, [m]), N = a(() => {
46
- if (_) return;
47
- let e = !x;
48
- e && k(), S(e);
43
+ A,
44
+ v,
45
+ E
46
+ ]), P = s(() => A.find((e) => e.key === a), [A, a]), F = o((e) => {
47
+ _(e), T(!1), D("");
48
+ }, [_]), I = o(() => {
49
+ if (b) return;
50
+ let e = !w;
51
+ e && M(), T(e);
49
52
  }, [
50
- _,
51
- x,
52
- k
53
- ]), P = a(() => {
54
- S(!1);
55
- }, []), F = a(() => {
56
- S(!1), window.open(E("/datasinks/new"), "_blank", "noopener,noreferrer");
57
- }, [E]);
58
- return /* @__PURE__ */ d("div", {
53
+ b,
54
+ w,
55
+ M
56
+ ]), L = o(() => {
57
+ T(!1);
58
+ }, []), R = o(() => {
59
+ T(!1), window.open(k("/datasinks/new"), "_blank", "noopener,noreferrer");
60
+ }, [k]);
61
+ return /* @__PURE__ */ f("div", {
59
62
  className: "relative",
60
63
  children: [
61
- /* @__PURE__ */ d("button", {
64
+ /* @__PURE__ */ f("button", {
62
65
  type: "button",
63
- onClick: N,
64
- disabled: _,
66
+ onClick: I,
67
+ disabled: b,
68
+ "aria-haspopup": "listbox",
69
+ "aria-expanded": w,
65
70
  className: `
66
- w-full
71
+ w-full min-w-0 min-h-control-md
67
72
  px-3 py-2
68
73
  bg-bg-surface
69
74
  border rounded-md
70
75
  text-left
71
76
  flex items-center justify-between gap-2
72
- transition-colors
73
- ${_ ? "opacity-50 cursor-not-allowed" : "hover:border-action-primary-bg cursor-pointer"}
74
- ${v ? "border-status-error-border" : "border-border-default"}
75
- ${x ? "border-action-primary-bg ring-2 ring-action-primary-bg/20" : ""}
77
+ motion-safe:transition-colors
78
+ ${t}
79
+ ${b ? "opacity-50 cursor-not-allowed" : "hover:border-action-primary-bg cursor-pointer"}
80
+ ${x ? "border-status-error-border" : "border-[var(--color-border-default)]"}
81
+ ${w ? "border-action-primary-bg ring-2 ring-action-primary-bg/20" : ""}
76
82
  `,
77
- children: [/* @__PURE__ */ u("div", {
83
+ children: [/* @__PURE__ */ d("div", {
78
84
  className: "flex-1 min-w-0",
79
- children: j ? /* @__PURE__ */ d("div", {
80
- className: "flex items-center gap-2",
81
- children: [/* @__PURE__ */ u(n, {
82
- status: j.status,
85
+ children: P ? /* @__PURE__ */ f("div", {
86
+ className: "flex min-w-0 items-center gap-2",
87
+ children: [/* @__PURE__ */ d(r, {
88
+ status: P.status,
83
89
  size: "sm",
84
90
  showIcon: !1
85
- }), /* @__PURE__ */ u("span", {
91
+ }), /* @__PURE__ */ d("span", {
86
92
  className: "text-sm text-text-primary truncate",
87
- children: j.name || j.key
93
+ children: P.name || P.key
88
94
  })]
89
- }) : /* @__PURE__ */ u("span", {
90
- className: "text-sm text-text-tertiary",
91
- children: T
95
+ }) : /* @__PURE__ */ d("span", {
96
+ className: "text-sm text-text-muted",
97
+ children: O
92
98
  })
93
- }), /* @__PURE__ */ u(p, { className: `w-4 h-4 text-text-secondary transition-transform ${x ? "transform rotate-180" : ""}` })]
99
+ }), /* @__PURE__ */ d(g, {
100
+ "aria-hidden": "true",
101
+ className: `w-4 h-4 shrink-0 text-text-secondary motion-safe:transition-transform ${w ? "transform rotate-180" : ""}`
102
+ })]
94
103
  }),
95
- v && y && /* @__PURE__ */ u("p", {
104
+ x && S && /* @__PURE__ */ d("p", {
96
105
  className: "mt-1 text-xs text-status-error-text",
97
- children: y
106
+ children: S
98
107
  }),
99
- x && /* @__PURE__ */ d(r, { children: [/* @__PURE__ */ u("div", {
108
+ w && /* @__PURE__ */ f(i, { children: [/* @__PURE__ */ d("div", {
100
109
  className: "fixed inset-0 z-10",
101
- onClick: P
102
- }), /* @__PURE__ */ d("div", {
103
- className: "absolute left-0 right-0 top-full mt-1 z-20 bg-bg-surface border border-border-default rounded-md shadow-lg max-h-80 flex flex-col overflow-hidden",
110
+ onClick: L
111
+ }), /* @__PURE__ */ f("div", {
112
+ className: "absolute left-0 right-0 top-full mt-1 z-20 bg-bg-surface border border-[var(--color-border-default)] rounded-md shadow-lg max-h-80 flex flex-col overflow-hidden",
104
113
  children: [
105
- /* @__PURE__ */ u("div", {
106
- className: "p-2 border-b border-border-default",
107
- children: /* @__PURE__ */ u("input", {
114
+ /* @__PURE__ */ d("div", {
115
+ className: "p-2 border-b border-[var(--color-border-default)]",
116
+ children: /* @__PURE__ */ d("input", {
108
117
  type: "text",
109
- placeholder: b("bigconsole.parsers.dataSinkSelector.searchPlaceholder", "Search data sources..."),
110
- value: C,
111
- onChange: (e) => w(e.target.value),
112
- className: "\n w-full px-3 py-2\n bg-bg-sunken\n border border-border-default\n rounded-md\n text-sm text-text-primary\n placeholder-text-tertiary\n focus:outline-none\n focus:border-action-primary-bg\n focus:ring-2\n focus:ring-action-primary-bg/20\n "
118
+ "aria-label": C("bigconsole.parsers.dataSinkSelector.searchPlaceholder", "Search data sources..."),
119
+ placeholder: C("bigconsole.parsers.dataSinkSelector.searchPlaceholder", "Search data sources..."),
120
+ value: E,
121
+ onChange: (e) => D(e.target.value),
122
+ className: "\n w-full min-w-0 min-h-control-md px-3 py-2\n bg-bg-sunken\n border border-[var(--color-border-default)]\n rounded-md\n text-sm text-text-primary\n placeholder:text-text-muted\n focus:outline-none\n focus:border-action-primary-bg\n focus:ring-2\n focus:ring-action-primary-bg/20\n "
113
123
  })
114
124
  }),
115
- /* @__PURE__ */ u("div", {
125
+ /* @__PURE__ */ d("div", {
116
126
  className: "overflow-y-auto flex-1",
117
- children: O ? /* @__PURE__ */ u("div", {
127
+ children: j ? /* @__PURE__ */ d("div", {
118
128
  className: "p-4 text-center text-sm text-text-secondary",
119
- children: b("bigconsole.parsers.dataSinkSelector.loading", "Loading data sources...")
120
- }) : A.length === 0 ? /* @__PURE__ */ u("div", {
129
+ children: C("bigconsole.parsers.dataSinkSelector.loading", "Loading data sources...")
130
+ }) : N.length === 0 ? /* @__PURE__ */ d("div", {
121
131
  className: "p-4 text-center text-sm text-text-secondary",
122
- children: C ? b("bigconsole.parsers.dataSinkSelector.emptySearch", "No matching data sources found") : b("bigconsole.parsers.dataSinkSelector.empty", "No data sources available")
123
- }) : /* @__PURE__ */ d(r, { children: [/* @__PURE__ */ u("button", {
124
- type: "button",
125
- onClick: () => M(null),
126
- className: `
127
- w-full px-3 py-2
132
+ children: E ? C("bigconsole.parsers.dataSinkSelector.emptySearch", "No matching data sources found") : C("bigconsole.parsers.dataSinkSelector.empty", "No data sources available")
133
+ }) : /* @__PURE__ */ f(i, { children: [
134
+ /* @__PURE__ */ d("button", {
135
+ type: "button",
136
+ onClick: () => F(null),
137
+ className: `
138
+ w-full min-h-control-md px-3 py-2
128
139
  text-left text-sm
129
140
  hover:bg-bg-sunken
130
- transition-colors
131
- ${i === null ? "bg-action-primary-bg/10 text-action-primary-bg" : "text-text-secondary"}
141
+ motion-safe:transition-colors
142
+ focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-bg-surface
143
+ ${a === null ? "bg-action-primary-bg/10 text-action-primary-bg" : "text-text-secondary"}
132
144
  `,
133
- children: /* @__PURE__ */ u("span", {
134
- className: "italic",
135
- children: b("bigconsole.parsers.dataSinkSelector.none", "None")
136
- })
137
- }), A.map((e) => /* @__PURE__ */ u("button", {
138
- type: "button",
139
- onClick: () => M(e.key),
140
- className: `
141
- w-full px-3 py-2.5
145
+ children: /* @__PURE__ */ d("span", {
146
+ className: "italic",
147
+ children: C("bigconsole.parsers.dataSinkSelector.none", "None")
148
+ })
149
+ }),
150
+ /* @__PURE__ */ d("div", {
151
+ className: p,
152
+ children: /* @__PURE__ */ d("span", {
153
+ className: m,
154
+ children: "Data Sources"
155
+ })
156
+ }),
157
+ N.map((e) => /* @__PURE__ */ d("button", {
158
+ type: "button",
159
+ onClick: () => F(e.key),
160
+ className: `
161
+ w-full min-h-control-md px-3 py-2.5
142
162
  text-left
143
163
  hover:bg-bg-sunken
144
- transition-colors
145
- border-b border-border-default last:border-b-0
146
- ${i === e.key ? "bg-action-primary-bg/10" : ""}
164
+ motion-safe:transition-colors
165
+ border-b border-[var(--color-border-default)] last:border-b-0
166
+ focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-bg-surface
167
+ ${a === e.key ? "bg-action-primary-bg/10" : ""}
147
168
  `,
148
- children: /* @__PURE__ */ u("div", {
149
- className: "flex items-start justify-between gap-2",
150
169
  children: /* @__PURE__ */ d("div", {
151
- className: "flex-1 min-w-0",
152
- children: [
153
- /* @__PURE__ */ d("div", {
154
- className: "flex items-center gap-2 mb-1",
155
- children: [/* @__PURE__ */ u(n, {
156
- status: e.status,
157
- size: "sm",
158
- showIcon: !1
159
- }), /* @__PURE__ */ u("span", {
160
- className: "text-sm font-medium text-text-primary truncate",
161
- children: e.name || e.key
162
- })]
163
- }),
164
- e.description && /* @__PURE__ */ u("p", {
165
- className: "text-xs text-text-secondary line-clamp-1 mb-1",
166
- children: e.description
167
- }),
168
- /* @__PURE__ */ d("div", {
169
- className: "flex items-center gap-2 text-xs text-text-tertiary",
170
- children: [
171
- /* @__PURE__ */ u("span", { children: b("bigconsole.parsers.dataSinkSelector.keyLabel", "key: {{key}}", { key: e.key }) }),
172
- /* @__PURE__ */ u("span", { children: "•" }),
173
- /* @__PURE__ */ u("span", { children: b("bigconsole.parsers.dataSinkSelector.refreshedLabel", "Refreshed: {{time}}", { time: f(e.lastRefreshedAt, b) }) })
174
- ]
175
- })
176
- ]
170
+ className: "flex items-start justify-between gap-2",
171
+ children: /* @__PURE__ */ f("div", {
172
+ className: "flex-1 min-w-0",
173
+ children: [
174
+ /* @__PURE__ */ f("div", {
175
+ className: "flex min-w-0 items-center gap-2 mb-1",
176
+ children: [/* @__PURE__ */ d(r, {
177
+ status: e.status,
178
+ size: "sm",
179
+ showIcon: !1
180
+ }), /* @__PURE__ */ d("span", {
181
+ className: "text-sm font-medium text-text-primary truncate",
182
+ children: e.name || e.key
183
+ })]
184
+ }),
185
+ e.description && /* @__PURE__ */ d("p", {
186
+ className: "text-xs text-text-secondary line-clamp-1 mb-1",
187
+ children: e.description
188
+ }),
189
+ /* @__PURE__ */ f("div", {
190
+ className: "flex min-w-0 flex-wrap items-center gap-x-2 text-xs text-text-muted",
191
+ children: [
192
+ /* @__PURE__ */ d("span", {
193
+ className: "min-w-0 truncate font-mono",
194
+ children: C("bigconsole.parsers.dataSinkSelector.keyLabel", "key: {{key}}", { key: e.key })
195
+ }),
196
+ /* @__PURE__ */ d("span", {
197
+ "aria-hidden": "true",
198
+ children: "•"
199
+ }),
200
+ /* @__PURE__ */ d("span", {
201
+ className: "truncate",
202
+ children: C("bigconsole.parsers.dataSinkSelector.refreshedLabel", "Refreshed: {{time}}", { time: h(e.lastRefreshedAt, C) })
203
+ })
204
+ ]
205
+ })
206
+ ]
207
+ })
177
208
  })
178
- })
179
- }, e.id))] })
209
+ }, e.id))
210
+ ] })
180
211
  }),
181
- /* @__PURE__ */ u("div", {
212
+ /* @__PURE__ */ d("div", {
182
213
  className: "p-2 border-t border-border-default",
183
- children: /* @__PURE__ */ d("button", {
214
+ children: /* @__PURE__ */ f("button", {
184
215
  type: "button",
185
- onClick: F,
216
+ onClick: R,
186
217
  className: "\n w-full flex items-center gap-2\n px-3 py-2\n text-sm font-medium text-action-primary-bg\n rounded-md\n hover:bg-action-primary-bg/10\n transition-colors\n ",
187
- children: [/* @__PURE__ */ u(c, { className: "w-4 h-4" }), b("bigconsole.parsers.dataSinkSelector.createNew", "Create new data source")]
218
+ children: [/* @__PURE__ */ d(l, { className: "w-4 h-4" }), C("bigconsole.parsers.dataSinkSelector.createNew", "Create new data source")]
188
219
  })
189
220
  })
190
221
  ]
@@ -193,6 +224,6 @@ var p = ({ className: e }) => /* @__PURE__ */ u("svg", {
193
224
  });
194
225
  });
195
226
  //#endregion
196
- export { m as default };
227
+ export { _ as default };
197
228
 
198
229
  //# sourceMappingURL=DataSinkSelector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataSinkSelector.js","names":[],"sources":["../../../../src/bigconsole/components/parser/DataSinkSelector.tsx"],"sourcesContent":["/**\n * DataSink Selector\n *\n * Dropdown component for selecting a DataSink as a parser's input source.\n */\n\nimport { memo, useState, useMemo, useCallback, Fragment } from 'react';\nimport { Plus } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useDataSinkOperations } from '../../hooks/useDataSinkOperations';\nimport { useBuildPath } from '../../contexts';\nimport { DataSinkStatusBadge } from '../datasink/DataSinkStatusBadge';\nimport type { DataSinkStatus } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkSelectorProps {\n /** Currently selected DataSink key */\n value: string | null;\n /** Callback when selection changes */\n onChange: (key: string | null) => void;\n /** Filter by status */\n filterStatus?: DataSinkStatus;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the selector is disabled */\n disabled?: boolean;\n /** Whether to show error state */\n error?: boolean;\n /** Error message to display */\n errorMessage?: string;\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\ntype TranslateFn = (\n key: string,\n fallbackOrParams?: string | Record<string, string | number>,\n params?: Record<string, string | number>\n) => string;\n\n/**\n * Format relative time from date string\n */\nfunction formatRelativeTime(dateString: string | null | undefined, t: TranslateFn): string {\n if (!dateString) return t('bigconsole.parsers.dataSinkSelector.relativeTime.never', 'Never');\n\n const date = new Date(dateString);\n const diff = Date.now() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n\n if (minutes < 1) return t('bigconsole.parsers.dataSinkSelector.relativeTime.justNow', 'Just now');\n if (minutes < 60)\n return t('bigconsole.parsers.dataSinkSelector.relativeTime.minutesAgo', '{{minutes}}m ago', { minutes });\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return t('bigconsole.parsers.dataSinkSelector.relativeTime.hoursAgo', '{{hours}}h ago', { hours });\n\n const days = Math.floor(hours / 24);\n if (days < 7) return t('bigconsole.parsers.dataSinkSelector.relativeTime.daysAgo', '{{days}}d ago', { days });\n\n return date.toLocaleDateString();\n}\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n);\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkSelector = memo(function DataSinkSelector({\n value,\n onChange,\n filterStatus,\n placeholder,\n disabled = false,\n error = false,\n errorMessage,\n}: DataSinkSelectorProps) {\n const { t } = useI18n();\n const [isOpen, setIsOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n\n const resolvedPlaceholder =\n placeholder ?? t('bigconsole.parsers.dataSinkSelector.placeholder', 'Select a data source...');\n\n const buildPath = useBuildPath();\n\n const { dataSinks, loading, fetchDataSinks } = useDataSinkOperations({ skipFetch: false });\n\n // Filter data sinks\n const filteredDataSinks = useMemo(\n () =>\n dataSinks.filter((ds) => {\n // Filter by status if specified\n if (filterStatus && ds.status !== filterStatus) return false;\n\n // Filter by search query\n if (searchQuery) {\n const query = searchQuery.toLowerCase();\n return (\n (ds.name || ds.key).toLowerCase().includes(query) ||\n ds.key.toLowerCase().includes(query) ||\n ds.description?.toLowerCase().includes(query)\n );\n }\n\n return true;\n }),\n [dataSinks, filterStatus, searchQuery]\n );\n\n // Find selected DataSink\n const selectedDataSink = useMemo(() => dataSinks.find((ds) => ds.key === value), [dataSinks, value]);\n\n // Handle selection\n const handleSelect = useCallback(\n (key: string | null) => {\n onChange(key);\n setIsOpen(false);\n setSearchQuery('');\n },\n [onChange]\n );\n\n // Toggle dropdown\n const handleToggle = useCallback(() => {\n if (disabled) return;\n const next = !isOpen;\n // Refetch on open so a DataSink created via the \"Create new\" tab\n // shows up here without needing a full page reload.\n if (next) void fetchDataSinks();\n setIsOpen(next);\n }, [disabled, isOpen, fetchDataSinks]);\n\n // Close dropdown\n const handleClose = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n // Open the create-DataSink page in a new tab so the current editing\n // context (e.g. an unsaved widget in the dashboard builder) is preserved.\n const handleCreateNew = useCallback(() => {\n setIsOpen(false);\n window.open(buildPath('/datasinks/new'), '_blank', 'noopener,noreferrer');\n }, [buildPath]);\n\n return (\n <div className=\"relative\">\n {/* Trigger button */}\n <button\n type=\"button\"\n onClick={handleToggle}\n disabled={disabled}\n className={`\n w-full\n px-3 py-2\n bg-bg-surface\n border rounded-md\n text-left\n flex items-center justify-between gap-2\n transition-colors\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:border-action-primary-bg cursor-pointer'}\n ${error ? 'border-status-error-border' : 'border-border-default'}\n ${isOpen ? 'border-action-primary-bg ring-2 ring-action-primary-bg/20' : ''}\n `}\n >\n <div className=\"flex-1 min-w-0\">\n {selectedDataSink ? (\n <div className=\"flex items-center gap-2\">\n <DataSinkStatusBadge status={selectedDataSink.status} size=\"sm\" showIcon={false} />\n <span className=\"text-sm text-text-primary truncate\">\n {selectedDataSink.name || selectedDataSink.key}\n </span>\n </div>\n ) : (\n <span className=\"text-sm text-text-tertiary\">{resolvedPlaceholder}</span>\n )}\n </div>\n\n <ChevronDownIcon\n className={`w-4 h-4 text-text-secondary transition-transform ${isOpen ? 'transform rotate-180' : ''}`}\n />\n </button>\n\n {/* Error message */}\n {error && errorMessage && <p className=\"mt-1 text-xs text-status-error-text\">{errorMessage}</p>}\n\n {/* Dropdown */}\n {isOpen && (\n <Fragment>\n {/* Backdrop */}\n <div className=\"fixed inset-0 z-10\" onClick={handleClose} />\n\n {/* Dropdown content */}\n <div className=\"absolute left-0 right-0 top-full mt-1 z-20 bg-bg-surface border border-border-default rounded-md shadow-lg max-h-80 flex flex-col overflow-hidden\">\n {/* Search input */}\n <div className=\"p-2 border-b border-border-default\">\n <input\n type=\"text\"\n placeholder={t('bigconsole.parsers.dataSinkSelector.searchPlaceholder', 'Search data sources...')}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={`\n w-full px-3 py-2\n bg-bg-sunken\n border border-border-default\n rounded-md\n text-sm text-text-primary\n placeholder-text-tertiary\n focus:outline-none\n focus:border-action-primary-bg\n focus:ring-2\n focus:ring-action-primary-bg/20\n `}\n />\n </div>\n\n {/* Options list */}\n <div className=\"overflow-y-auto flex-1\">\n {loading ? (\n <div className=\"p-4 text-center text-sm text-text-secondary\">\n {t('bigconsole.parsers.dataSinkSelector.loading', 'Loading data sources...')}\n </div>\n ) : filteredDataSinks.length === 0 ? (\n <div className=\"p-4 text-center text-sm text-text-secondary\">\n {searchQuery\n ? t('bigconsole.parsers.dataSinkSelector.emptySearch', 'No matching data sources found')\n : t('bigconsole.parsers.dataSinkSelector.empty', 'No data sources available')}\n </div>\n ) : (\n <Fragment>\n {/* None option */}\n <button\n type=\"button\"\n onClick={() => handleSelect(null)}\n className={`\n w-full px-3 py-2\n text-left text-sm\n hover:bg-bg-sunken\n transition-colors\n ${value === null ? 'bg-action-primary-bg/10 text-action-primary-bg' : 'text-text-secondary'}\n `}\n >\n <span className=\"italic\">{t('bigconsole.parsers.dataSinkSelector.none', 'None')}</span>\n </button>\n\n {/* DataSink options */}\n {filteredDataSinks.map((ds) => (\n <button\n key={ds.id}\n type=\"button\"\n onClick={() => handleSelect(ds.key)}\n className={`\n w-full px-3 py-2.5\n text-left\n hover:bg-bg-sunken\n transition-colors\n border-b border-border-default last:border-b-0\n ${value === ds.key ? 'bg-action-primary-bg/10' : ''}\n `}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n {/* Name and status */}\n <div className=\"flex items-center gap-2 mb-1\">\n <DataSinkStatusBadge status={ds.status} size=\"sm\" showIcon={false} />\n <span className=\"text-sm font-medium text-text-primary truncate\">{ds.name || ds.key}</span>\n </div>\n\n {/* Description */}\n {ds.description && (\n <p className=\"text-xs text-text-secondary line-clamp-1 mb-1\">{ds.description}</p>\n )}\n\n {/* Metadata */}\n <div className=\"flex items-center gap-2 text-xs text-text-tertiary\">\n <span>\n {t('bigconsole.parsers.dataSinkSelector.keyLabel', 'key: {{key}}', { key: ds.key })}\n </span>\n <span>•</span>\n <span>\n {t('bigconsole.parsers.dataSinkSelector.refreshedLabel', 'Refreshed: {{time}}', {\n time: formatRelativeTime(ds.lastRefreshedAt, t),\n })}\n </span>\n </div>\n </div>\n </div>\n </button>\n ))}\n </Fragment>\n )}\n </div>\n\n {/* Create new — persistent footer action (opens in a new tab) */}\n <div className=\"p-2 border-t border-border-default\">\n <button\n type=\"button\"\n onClick={handleCreateNew}\n className=\"\n w-full flex items-center gap-2\n px-3 py-2\n text-sm font-medium text-action-primary-bg\n rounded-md\n hover:bg-action-primary-bg/10\n transition-colors\n \"\n >\n <Plus className=\"w-4 h-4\" />\n {t('bigconsole.parsers.dataSinkSelector.createNew', 'Create new data source')}\n </button>\n </div>\n </div>\n </Fragment>\n )}\n </div>\n );\n});\n\nexport default DataSinkSelector;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataSinkSelector.js","names":[],"sources":["../../../../src/bigconsole/components/parser/DataSinkSelector.tsx"],"sourcesContent":["/**\n * DataSink Selector\n *\n * Dropdown component for selecting a DataSink as a parser's input source.\n */\n\nimport { memo, useState, useMemo, useCallback, Fragment } from 'react';\nimport { Plus } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useDataSinkOperations } from '../../hooks/useDataSinkOperations';\nimport { useBuildPath } from '../../contexts';\nimport { DataSinkStatusBadge } from '../datasink/DataSinkStatusBadge';\nimport { SECTION_FOCUS_RING } from '../common';\nimport type { DataSinkStatus } from '../../types';\n\n/**\n * Group header inside the dropdown — kept identical to ParserSelector's so the\n * two pickers that sit next to each other in the widget inspector read as one\n * system instead of two.\n */\nconst GROUP_HEADER = 'sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y border-[var(--color-border-default)]';\nconst GROUP_HEADER_LABEL = 'text-xs font-semibold uppercase tracking-wide text-text-secondary';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkSelectorProps {\n /** Currently selected DataSink key */\n value: string | null;\n /** Callback when selection changes */\n onChange: (key: string | null) => void;\n /** Filter by status */\n filterStatus?: DataSinkStatus;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the selector is disabled */\n disabled?: boolean;\n /** Whether to show error state */\n error?: boolean;\n /** Error message to display */\n errorMessage?: string;\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\ntype TranslateFn = (\n key: string,\n fallbackOrParams?: string | Record<string, string | number>,\n params?: Record<string, string | number>\n) => string;\n\n/**\n * Format relative time from date string\n */\nfunction formatRelativeTime(dateString: string | null | undefined, t: TranslateFn): string {\n if (!dateString) return t('bigconsole.parsers.dataSinkSelector.relativeTime.never', 'Never');\n\n const date = new Date(dateString);\n const diff = Date.now() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n\n if (minutes < 1) return t('bigconsole.parsers.dataSinkSelector.relativeTime.justNow', 'Just now');\n if (minutes < 60)\n return t('bigconsole.parsers.dataSinkSelector.relativeTime.minutesAgo', '{{minutes}}m ago', { minutes });\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return t('bigconsole.parsers.dataSinkSelector.relativeTime.hoursAgo', '{{hours}}h ago', { hours });\n\n const days = Math.floor(hours / 24);\n if (days < 7) return t('bigconsole.parsers.dataSinkSelector.relativeTime.daysAgo', '{{days}}d ago', { days });\n\n return date.toLocaleDateString();\n}\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n);\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkSelector = memo(function DataSinkSelector({\n value,\n onChange,\n filterStatus,\n placeholder,\n disabled = false,\n error = false,\n errorMessage,\n}: DataSinkSelectorProps) {\n const { t } = useI18n();\n const [isOpen, setIsOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n\n const resolvedPlaceholder =\n placeholder ?? t('bigconsole.parsers.dataSinkSelector.placeholder', 'Select a data source...');\n\n const buildPath = useBuildPath();\n\n const { dataSinks, loading, fetchDataSinks } = useDataSinkOperations({ skipFetch: false });\n\n // Filter data sinks\n const filteredDataSinks = useMemo(\n () =>\n dataSinks.filter((ds) => {\n // Filter by status if specified\n if (filterStatus && ds.status !== filterStatus) return false;\n\n // Filter by search query\n if (searchQuery) {\n const query = searchQuery.toLowerCase();\n return (\n (ds.name || ds.key).toLowerCase().includes(query) ||\n ds.key.toLowerCase().includes(query) ||\n ds.description?.toLowerCase().includes(query)\n );\n }\n\n return true;\n }),\n [dataSinks, filterStatus, searchQuery]\n );\n\n // Find selected DataSink\n const selectedDataSink = useMemo(() => dataSinks.find((ds) => ds.key === value), [dataSinks, value]);\n\n // Handle selection\n const handleSelect = useCallback(\n (key: string | null) => {\n onChange(key);\n setIsOpen(false);\n setSearchQuery('');\n },\n [onChange]\n );\n\n // Toggle dropdown\n const handleToggle = useCallback(() => {\n if (disabled) return;\n const next = !isOpen;\n // Refetch on open so a DataSink created via the \"Create new\" tab\n // shows up here without needing a full page reload.\n if (next) void fetchDataSinks();\n setIsOpen(next);\n }, [disabled, isOpen, fetchDataSinks]);\n\n // Close dropdown\n const handleClose = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n // Open the create-DataSink page in a new tab so the current editing\n // context (e.g. an unsaved widget in the dashboard builder) is preserved.\n const handleCreateNew = useCallback(() => {\n setIsOpen(false);\n window.open(buildPath('/datasinks/new'), '_blank', 'noopener,noreferrer');\n }, [buildPath]);\n\n return (\n <div className=\"relative\">\n {/* Trigger button */}\n <button\n type=\"button\"\n onClick={handleToggle}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n className={`\n w-full min-w-0 min-h-control-md\n px-3 py-2\n bg-bg-surface\n border rounded-md\n text-left\n flex items-center justify-between gap-2\n motion-safe:transition-colors\n ${SECTION_FOCUS_RING}\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:border-action-primary-bg cursor-pointer'}\n ${error ? 'border-status-error-border' : 'border-[var(--color-border-default)]'}\n ${isOpen ? 'border-action-primary-bg ring-2 ring-action-primary-bg/20' : ''}\n `}\n >\n <div className=\"flex-1 min-w-0\">\n {selectedDataSink ? (\n <div className=\"flex min-w-0 items-center gap-2\">\n <DataSinkStatusBadge status={selectedDataSink.status} size=\"sm\" showIcon={false} />\n <span className=\"text-sm text-text-primary truncate\">\n {selectedDataSink.name || selectedDataSink.key}\n </span>\n </div>\n ) : (\n <span className=\"text-sm text-text-muted\">{resolvedPlaceholder}</span>\n )}\n </div>\n\n <ChevronDownIcon\n aria-hidden=\"true\"\n className={`w-4 h-4 shrink-0 text-text-secondary motion-safe:transition-transform ${isOpen ? 'transform rotate-180' : ''}`}\n />\n </button>\n\n {/* Error message */}\n {error && errorMessage && <p className=\"mt-1 text-xs text-status-error-text\">{errorMessage}</p>}\n\n {/* Dropdown */}\n {isOpen && (\n <Fragment>\n {/* Backdrop */}\n <div className=\"fixed inset-0 z-10\" onClick={handleClose} />\n\n {/* Dropdown content */}\n <div className=\"absolute left-0 right-0 top-full mt-1 z-20 bg-bg-surface border border-[var(--color-border-default)] rounded-md shadow-lg max-h-80 flex flex-col overflow-hidden\">\n {/* Search input */}\n <div className=\"p-2 border-b border-[var(--color-border-default)]\">\n <input\n type=\"text\"\n aria-label={t('bigconsole.parsers.dataSinkSelector.searchPlaceholder', 'Search data sources...')}\n placeholder={t('bigconsole.parsers.dataSinkSelector.searchPlaceholder', 'Search data sources...')}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={`\n w-full min-w-0 min-h-control-md px-3 py-2\n bg-bg-sunken\n border border-[var(--color-border-default)]\n rounded-md\n text-sm text-text-primary\n placeholder:text-text-muted\n focus:outline-none\n focus:border-action-primary-bg\n focus:ring-2\n focus:ring-action-primary-bg/20\n `}\n />\n </div>\n\n {/* Options list */}\n <div className=\"overflow-y-auto flex-1\">\n {loading ? (\n <div className=\"p-4 text-center text-sm text-text-secondary\">\n {t('bigconsole.parsers.dataSinkSelector.loading', 'Loading data sources...')}\n </div>\n ) : filteredDataSinks.length === 0 ? (\n <div className=\"p-4 text-center text-sm text-text-secondary\">\n {searchQuery\n ? t('bigconsole.parsers.dataSinkSelector.emptySearch', 'No matching data sources found')\n : t('bigconsole.parsers.dataSinkSelector.empty', 'No data sources available')}\n </div>\n ) : (\n <Fragment>\n {/* None option */}\n <button\n type=\"button\"\n onClick={() => handleSelect(null)}\n className={`\n w-full min-h-control-md px-3 py-2\n text-left text-sm\n hover:bg-bg-sunken\n motion-safe:transition-colors\n ${SECTION_FOCUS_RING}\n ${value === null ? 'bg-action-primary-bg/10 text-action-primary-bg' : 'text-text-secondary'}\n `}\n >\n <span className=\"italic\">{t('bigconsole.parsers.dataSinkSelector.none', 'None')}</span>\n </button>\n\n {/* DataSink options — labelled group, matching ParserSelector */}\n <div className={GROUP_HEADER}>\n <span className={GROUP_HEADER_LABEL}>Data Sources</span>\n </div>\n {filteredDataSinks.map((ds) => (\n <button\n key={ds.id}\n type=\"button\"\n onClick={() => handleSelect(ds.key)}\n className={`\n w-full min-h-control-md px-3 py-2.5\n text-left\n hover:bg-bg-sunken\n motion-safe:transition-colors\n border-b border-[var(--color-border-default)] last:border-b-0\n ${SECTION_FOCUS_RING}\n ${value === ds.key ? 'bg-action-primary-bg/10' : ''}\n `}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n {/* Name and status */}\n <div className=\"flex min-w-0 items-center gap-2 mb-1\">\n <DataSinkStatusBadge status={ds.status} size=\"sm\" showIcon={false} />\n <span className=\"text-sm font-medium text-text-primary truncate\">{ds.name || ds.key}</span>\n </div>\n\n {/* Description */}\n {ds.description && (\n <p className=\"text-xs text-text-secondary line-clamp-1 mb-1\">{ds.description}</p>\n )}\n\n {/* Metadata */}\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-2 text-xs text-text-muted\">\n <span className=\"min-w-0 truncate font-mono\">\n {t('bigconsole.parsers.dataSinkSelector.keyLabel', 'key: {{key}}', { key: ds.key })}\n </span>\n <span aria-hidden=\"true\">•</span>\n <span className=\"truncate\">\n {t('bigconsole.parsers.dataSinkSelector.refreshedLabel', 'Refreshed: {{time}}', {\n time: formatRelativeTime(ds.lastRefreshedAt, t),\n })}\n </span>\n </div>\n </div>\n </div>\n </button>\n ))}\n </Fragment>\n )}\n </div>\n\n {/* Create new — persistent footer action (opens in a new tab) */}\n <div className=\"p-2 border-t border-border-default\">\n <button\n type=\"button\"\n onClick={handleCreateNew}\n className=\"\n w-full flex items-center gap-2\n px-3 py-2\n text-sm font-medium text-action-primary-bg\n rounded-md\n hover:bg-action-primary-bg/10\n transition-colors\n \"\n >\n <Plus className=\"w-4 h-4\" />\n {t('bigconsole.parsers.dataSinkSelector.createNew', 'Create new data source')}\n </button>\n </div>\n </div>\n </Fragment>\n )}\n </div>\n );\n});\n\nexport default DataSinkSelector;\n"],"mappings":";;;;;;;;;;;AAoBA,IAAM,IAAe,6FACf,IAAqB;AAoC3B,SAAS,EAAmB,GAAuC,GAAwB;AACzF,KAAI,CAAC,EAAY,QAAO,EAAE,0DAA0D,QAAQ;CAE5F,IAAM,IAAO,IAAI,KAAK,EAAW,EAC3B,IAAO,KAAK,KAAK,GAAG,EAAK,SAAS,EAClC,IAAU,KAAK,MAAM,IAAO,IAAM;AAExC,KAAI,IAAU,EAAG,QAAO,EAAE,4DAA4D,WAAW;AACjG,KAAI,IAAU,GACZ,QAAO,EAAE,+DAA+D,oBAAoB,EAAE,YAAS,CAAC;CAE1G,IAAM,IAAQ,KAAK,MAAM,IAAU,GAAG;AACtC,KAAI,IAAQ,GAAI,QAAO,EAAE,6DAA6D,kBAAkB,EAAE,UAAO,CAAC;CAElH,IAAM,IAAO,KAAK,MAAM,IAAQ,GAAG;AAGnC,QAFI,IAAO,IAAU,EAAE,4DAA4D,iBAAiB,EAAE,SAAM,CAAC,GAEtG,EAAK,oBAAoB;;AAOlC,IAAM,KAAmB,EAAE,mBACzB,kBAAC,OAAD;CAAgB;CAAW,MAAK;CAAO,QAAO;CAAe,SAAQ;WACnE,kBAAC,QAAD;EAAM,eAAc;EAAQ,gBAAe;EAAQ,aAAa;EAAG,GAAE;EAAmB,CAAA;CACpF,CAAA,EAOK,IAAmB,EAAK,SAA0B,EAC7D,UACA,aACA,iBACA,gBACA,cAAW,IACX,WAAQ,IACR,mBACwB;CACxB,IAAM,EAAE,SAAM,GAAS,EACjB,CAAC,GAAQ,KAAa,EAAS,GAAM,EACrC,CAAC,GAAa,KAAkB,EAAS,GAAG,EAE5C,IACJ,KAAe,EAAE,mDAAmD,0BAA0B,EAE1F,IAAY,GAAc,EAE1B,EAAE,cAAW,YAAS,sBAAmB,EAAsB,EAAE,WAAW,IAAO,CAAC,EAGpF,IAAoB,QAEtB,EAAU,QAAQ,MAAO;AAEvB,MAAI,KAAgB,EAAG,WAAW,EAAc,QAAO;AAGvD,MAAI,GAAa;GACf,IAAM,IAAQ,EAAY,aAAa;AACvC,WACG,EAAG,QAAQ,EAAG,KAAK,aAAa,CAAC,SAAS,EAAM,IACjD,EAAG,IAAI,aAAa,CAAC,SAAS,EAAM,IACpC,EAAG,aAAa,aAAa,CAAC,SAAS,EAAM;;AAIjD,SAAO;GACP,EACJ;EAAC;EAAW;EAAc;EAAY,CACvC,EAGK,IAAmB,QAAc,EAAU,MAAM,MAAO,EAAG,QAAQ,EAAM,EAAE,CAAC,GAAW,EAAM,CAAC,EAG9F,IAAe,GAClB,MAAuB;AAGtB,EAFA,EAAS,EAAI,EACb,EAAU,GAAM,EAChB,EAAe,GAAG;IAEpB,CAAC,EAAS,CACX,EAGK,IAAe,QAAkB;AACrC,MAAI,EAAU;EACd,IAAM,IAAO,CAAC;AAId,EADI,KAAW,GAAgB,EAC/B,EAAU,EAAK;IACd;EAAC;EAAU;EAAQ;EAAe,CAAC,EAGhC,IAAc,QAAkB;AACpC,IAAU,GAAM;IACf,EAAE,CAAC,EAIA,IAAkB,QAAkB;AAExC,EADA,EAAU,GAAM,EAChB,OAAO,KAAK,EAAU,iBAAiB,EAAE,UAAU,sBAAsB;IACxE,CAAC,EAAU,CAAC;AAEf,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GAEE,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACC;IACV,iBAAc;IACd,iBAAe;IACf,WAAW;;;;;;;;YAQP,EAAmB;YACnB,IAAW,kCAAkC,gDAAgD;YAC7F,IAAQ,+BAA+B,uCAAuC;YAC9E,IAAS,8DAA8D,GAAG;;cAjBhF,CAoBE,kBAAC,OAAD;KAAK,WAAU;eACZ,IACC,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAqB,QAAQ,EAAiB;OAAQ,MAAK;OAAK,UAAU;OAAS,CAAA,EACnF,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAiB,QAAQ,EAAiB;OACtC,CAAA,CACH;UAEN,kBAAC,QAAD;MAAM,WAAU;gBAA2B;MAA2B,CAAA;KAEpE,CAAA,EAEN,kBAAC,GAAD;KACE,eAAY;KACZ,WAAW,yEAAyE,IAAS,yBAAyB;KACtH,CAAA,CACK;;GAGR,KAAS,KAAgB,kBAAC,KAAD;IAAG,WAAU;cAAuC;IAAiB,CAAA;GAG9F,KACC,kBAAC,GAAD,EAAA,UAAA,CAEE,kBAAC,OAAD;IAAK,WAAU;IAAqB,SAAS;IAAe,CAAA,EAG5D,kBAAC,OAAD;IAAK,WAAU;cAAf;KAEE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,SAAD;OACE,MAAK;OACL,cAAY,EAAE,yDAAyD,yBAAyB;OAChG,aAAa,EAAE,yDAAyD,yBAAyB;OACjG,OAAO;OACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;OAC/C,WAAW;OAYX,CAAA;MACE,CAAA;KAGN,kBAAC,OAAD;MAAK,WAAU;gBACZ,IACC,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAE,+CAA+C,0BAA0B;OACxE,CAAA,GACJ,EAAkB,WAAW,IAC/B,kBAAC,OAAD;OAAK,WAAU;iBACZ,IACG,EAAE,mDAAmD,iCAAiC,GACtF,EAAE,6CAA6C,4BAA4B;OAC3E,CAAA,GAEN,kBAAC,GAAD,EAAA,UAAA;OAEE,kBAAC,UAAD;QACE,MAAK;QACL,eAAe,EAAa,KAAK;QACjC,WAAW;;;;;;wBAMP,MAAU,OAAO,mDAAmD,sBAAsB;;kBAG9F,kBAAC,QAAD;SAAM,WAAU;mBAAU,EAAE,4CAA4C,OAAO;SAAQ,CAAA;QAChF,CAAA;OAGT,kBAAC,OAAD;QAAK,WAAW;kBACd,kBAAC,QAAD;SAAM,WAAW;mBAAoB;SAAmB,CAAA;QACpD,CAAA;OACL,EAAkB,KAAK,MACtB,kBAAC,UAAD;QAEE,MAAK;QACL,eAAe,EAAa,EAAG,IAAI;QACnC,WAAW;;;;;;;0BAOP,MAAU,EAAG,MAAM,4BAA4B,GAAG;;kBAGtD,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,OAAD;UAAK,WAAU;oBAAf;WAEE,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,GAAD;aAAqB,QAAQ,EAAG;aAAQ,MAAK;aAAK,UAAU;aAAS,CAAA,EACrE,kBAAC,QAAD;aAAM,WAAU;uBAAkD,EAAG,QAAQ,EAAG;aAAW,CAAA,CACvF;;WAGL,EAAG,eACF,kBAAC,KAAD;YAAG,WAAU;sBAAiD,EAAG;YAAgB,CAAA;WAInF,kBAAC,OAAD;YAAK,WAAU;sBAAf;aACE,kBAAC,QAAD;cAAM,WAAU;wBACb,EAAE,gDAAgD,gBAAgB,EAAE,KAAK,EAAG,KAAK,CAAC;cAC9E,CAAA;aACP,kBAAC,QAAD;cAAM,eAAY;wBAAO;cAAQ,CAAA;aACjC,kBAAC,QAAD;cAAM,WAAU;wBACb,EAAE,sDAAsD,uBAAuB,EAC9E,MAAM,EAAmB,EAAG,iBAAiB,EAAE,EAChD,CAAC;cACG,CAAA;aACH;;WACF;;SACF,CAAA;QACC,EAxCF,EAAG,GAwCD,CACT;OACO,EAAA,CAAA;MAET,CAAA;KAGN,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,UAAD;OACE,MAAK;OACL,SAAS;OACT,WAAU;iBAHZ,CAYE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAC3B,EAAE,iDAAiD,yBAAyB,CACtE;;MACL,CAAA;KACF;MACG,EAAA,CAAA;GAET;;EAER"}
@@ -39,12 +39,12 @@ var o = e(function({ value: e, type: o, onChange: s, readOnly: c = !1, height: l
39
39
  s && e !== void 0 && s(e);
40
40
  }, v = p ?? a(o), y = l.includes("%");
41
41
  return /* @__PURE__ */ r("div", {
42
- className: `relative ${y ? "h-full flex flex-col" : ""}`,
42
+ className: `relative min-w-0 ${y ? "h-full flex flex-col" : ""}`,
43
43
  children: [/* @__PURE__ */ n("div", {
44
44
  className: `
45
- border rounded-md overflow-hidden
45
+ min-w-0 border rounded-md overflow-hidden
46
46
  ${y ? "flex-1 min-h-0" : ""}
47
- ${f ? "border-status-error-border" : "border-border-default"}
47
+ ${f ? "border-status-error-border" : "border-[var(--color-border-default)]"}
48
48
  `,
49
49
  style: y ? { height: "100%" } : void 0,
50
50
  children: /* @__PURE__ */ n(i, {
@@ -1 +1 @@
1
- {"version":3,"file":"ExpressionEditor.js","names":[],"sources":["../../../../src/bigconsole/components/parser/ExpressionEditor.tsx"],"sourcesContent":["/**\n * Expression Editor\n *\n * Monaco-based code editor for JQ/JSONata expressions.\n * Provides syntax highlighting, auto-completion, and error display.\n */\n\nimport { memo, useRef } from 'react';\nimport { Editor as MonacoEditor } from '@monaco-editor/react';\nimport type { ParserType } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface ExpressionEditorProps {\n /** Current value */\n value: string;\n /** Parser type for syntax highlighting */\n type?: ParserType;\n /** Callback when value changes */\n onChange?: (value: string) => void;\n /** Whether editor is read-only */\n readOnly?: boolean;\n /** Editor height (CSS value) */\n height?: string;\n /** Show line numbers */\n lineNumbers?: boolean;\n /** Placeholder text */\n placeholder?: string;\n /** Error message to display */\n error?: string | null;\n /** Override language (json, plaintext, etc.) */\n language?: string;\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\n/**\n * Get Monaco language for parser type\n */\nfunction getLanguageForParserType(type?: ParserType): string {\n switch (type) {\n case 'jq':\n return 'plaintext'; // JQ doesn't have native Monaco support\n case 'jsonata':\n return 'javascript'; // JSONata is similar to JavaScript\n default:\n return 'plaintext';\n }\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const ExpressionEditor = memo(function ExpressionEditor({\n value,\n type,\n onChange,\n readOnly = false,\n height = '300px',\n lineNumbers = true,\n placeholder,\n error,\n language,\n}: ExpressionEditorProps) {\n const editorRef = useRef<unknown>(null);\n\n // Configure Monaco theme before mount\n const handleBeforeMount = (monaco: unknown) => {\n const m = monaco as { editor: { defineTheme: (name: string, theme: unknown) => void } };\n m.editor.defineTheme('bigconsole-dark', {\n base: 'vs-dark',\n inherit: true,\n rules: [],\n colors: {\n 'editorCursor.foreground': '#ffffff',\n 'editorCursor.background': '#000000',\n 'editor.background': '#1e1e1e',\n 'editor.lineHighlightBackground': '#2a2a2a',\n },\n });\n };\n\n // Handle editor mount\n const handleMount = (editor: unknown) => {\n editorRef.current = editor;\n const ed = editor as {\n setValue: (v: string) => void;\n getModel: () => {\n getLineCount: () => number;\n getLineMaxColumn: (n: number) => number;\n } | null;\n setSelection: (s: {\n startLineNumber: number;\n startColumn: number;\n endLineNumber: number;\n endColumn: number;\n }) => void;\n };\n\n // If no value but placeholder exists, set it\n if (!value && placeholder) {\n ed.setValue(placeholder);\n onChange?.(placeholder);\n\n // Select all text so user can easily replace\n const model = ed.getModel();\n if (model) {\n ed.setSelection({\n startLineNumber: 1,\n startColumn: 1,\n endLineNumber: model.getLineCount(),\n endColumn: model.getLineMaxColumn(model.getLineCount()),\n });\n }\n }\n };\n\n // Handle value change\n const handleChange = (newValue: string | undefined) => {\n if (onChange && newValue !== undefined) {\n onChange(newValue);\n }\n };\n\n const editorLanguage = language ?? getLanguageForParserType(type);\n const isPercentHeight = height.includes('%');\n\n return (\n <div className={`relative ${isPercentHeight ? 'h-full flex flex-col' : ''}`}>\n <div\n className={`\n border rounded-md overflow-hidden\n ${isPercentHeight ? 'flex-1 min-h-0' : ''}\n ${error ? 'border-status-error-border' : 'border-border-default'}\n `}\n style={isPercentHeight ? { height: '100%' } : undefined}\n >\n <MonacoEditor\n height={isPercentHeight ? '100%' : height}\n language={editorLanguage}\n value={value}\n onChange={handleChange}\n beforeMount={handleBeforeMount}\n onMount={handleMount}\n options={{\n readOnly,\n minimap: { enabled: false },\n lineNumbers: lineNumbers ? 'on' : 'off',\n scrollBeyondLastLine: false,\n fontSize: 13,\n fontFamily: \"'JetBrains Mono', 'Fira Code', 'Courier New', monospace\",\n wordWrap: 'on',\n automaticLayout: true,\n padding: { top: 16, bottom: 12 },\n lineDecorationsWidth: 8,\n lineNumbersMinChars: 3,\n glyphMargin: false,\n folding: true,\n renderLineHighlight: 'line',\n selectOnLineNumbers: true,\n roundedSelection: false,\n cursorStyle: 'line',\n cursorWidth: 2,\n cursorBlinking: 'smooth',\n smoothScrolling: true,\n contextmenu: true,\n mouseWheelZoom: false,\n quickSuggestions: !readOnly,\n suggestOnTriggerCharacters: !readOnly,\n acceptSuggestionOnEnter: 'on',\n tabCompletion: 'on',\n wordBasedSuggestions: 'matchingDocuments',\n parameterHints: { enabled: !readOnly },\n suggest: {\n showKeywords: true,\n showSnippets: true,\n },\n }}\n theme=\"bigconsole-dark\"\n />\n </div>\n\n {error && (\n <div className=\"mt-2 flex items-start gap-2\">\n <svg\n className=\"w-4 h-4 text-status-error-text flex-shrink-0 mt-0.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <p className=\"text-xs text-status-error-text\">{error}</p>\n </div>\n )}\n </div>\n );\n});\n\nexport default ExpressionEditor;\n"],"mappings":";;;;AA2CA,SAAS,EAAyB,GAA2B;AAC3D,SAAQ,GAAR;EACE,KAAK,KACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,QACE,QAAO;;;AAQb,IAAa,IAAmB,EAAK,SAA0B,EAC7D,UACA,SACA,aACA,cAAW,IACX,YAAS,SACT,iBAAc,IACd,gBACA,UACA,eACwB;CACxB,IAAM,IAAY,EAAgB,KAAK,EAGjC,KAAqB,MAAoB;AACnC,IACR,OAAO,YAAY,mBAAmB;GACtC,MAAM;GACN,SAAS;GACT,OAAO,EAAE;GACT,QAAQ;IACN,2BAA2B;IAC3B,2BAA2B;IAC3B,qBAAqB;IACrB,kCAAkC;IACnC;GACF,CAAC;IAIE,KAAe,MAAoB;AACvC,IAAU,UAAU;EACpB,IAAM,IAAK;AAeX,MAAI,CAAC,KAAS,GAAa;AAEzB,GADA,EAAG,SAAS,EAAY,EACxB,IAAW,EAAY;GAGvB,IAAM,IAAQ,EAAG,UAAU;AAC3B,GAAI,KACF,EAAG,aAAa;IACd,iBAAiB;IACjB,aAAa;IACb,eAAe,EAAM,cAAc;IACnC,WAAW,EAAM,iBAAiB,EAAM,cAAc,CAAC;IACxD,CAAC;;IAMF,KAAgB,MAAiC;AACrD,EAAI,KAAY,MAAa,KAAA,KAC3B,EAAS,EAAS;IAIhB,IAAiB,KAAY,EAAyB,EAAK,EAC3D,IAAkB,EAAO,SAAS,IAAI;AAE5C,QACE,kBAAC,OAAD;EAAK,WAAW,YAAY,IAAkB,yBAAyB;YAAvE,CACE,kBAAC,OAAD;GACE,WAAW;;YAEP,IAAkB,mBAAmB,GAAG;YACxC,IAAQ,+BAA+B,wBAAwB;;GAEnE,OAAO,IAAkB,EAAE,QAAQ,QAAQ,GAAG,KAAA;aAE9C,kBAAC,GAAD;IACE,QAAQ,IAAkB,SAAS;IACnC,UAAU;IACH;IACP,UAAU;IACV,aAAa;IACb,SAAS;IACT,SAAS;KACP;KACA,SAAS,EAAE,SAAS,IAAO;KAC3B,aAAa,IAAc,OAAO;KAClC,sBAAsB;KACtB,UAAU;KACV,YAAY;KACZ,UAAU;KACV,iBAAiB;KACjB,SAAS;MAAE,KAAK;MAAI,QAAQ;MAAI;KAChC,sBAAsB;KACtB,qBAAqB;KACrB,aAAa;KACb,SAAS;KACT,qBAAqB;KACrB,qBAAqB;KACrB,kBAAkB;KAClB,aAAa;KACb,aAAa;KACb,gBAAgB;KAChB,iBAAiB;KACjB,aAAa;KACb,gBAAgB;KAChB,kBAAkB,CAAC;KACnB,4BAA4B,CAAC;KAC7B,yBAAyB;KACzB,eAAe;KACf,sBAAsB;KACtB,gBAAgB,EAAE,SAAS,CAAC,GAAU;KACtC,SAAS;MACP,cAAc;MACd,cAAc;MACf;KACF;IACD,OAAM;IACN,CAAA;GACE,CAAA,EAEL,KACC,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IACE,WAAU;IACV,MAAK;IACL,QAAO;IACP,SAAQ;cAER,kBAAC,QAAD;KACE,eAAc;KACd,gBAAe;KACf,aAAa;KACb,GAAE;KACF,CAAA;IACE,CAAA,EACN,kBAAC,KAAD;IAAG,WAAU;cAAkC;IAAU,CAAA,CACrD;KAEJ;;EAER"}
1
+ {"version":3,"file":"ExpressionEditor.js","names":[],"sources":["../../../../src/bigconsole/components/parser/ExpressionEditor.tsx"],"sourcesContent":["/**\n * Expression Editor\n *\n * Monaco-based code editor for JQ/JSONata expressions.\n * Provides syntax highlighting, auto-completion, and error display.\n */\n\nimport { memo, useRef } from 'react';\nimport { Editor as MonacoEditor } from '@monaco-editor/react';\nimport type { ParserType } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface ExpressionEditorProps {\n /** Current value */\n value: string;\n /** Parser type for syntax highlighting */\n type?: ParserType;\n /** Callback when value changes */\n onChange?: (value: string) => void;\n /** Whether editor is read-only */\n readOnly?: boolean;\n /** Editor height (CSS value) */\n height?: string;\n /** Show line numbers */\n lineNumbers?: boolean;\n /** Placeholder text */\n placeholder?: string;\n /** Error message to display */\n error?: string | null;\n /** Override language (json, plaintext, etc.) */\n language?: string;\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\n/**\n * Get Monaco language for parser type\n */\nfunction getLanguageForParserType(type?: ParserType): string {\n switch (type) {\n case 'jq':\n return 'plaintext'; // JQ doesn't have native Monaco support\n case 'jsonata':\n return 'javascript'; // JSONata is similar to JavaScript\n default:\n return 'plaintext';\n }\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const ExpressionEditor = memo(function ExpressionEditor({\n value,\n type,\n onChange,\n readOnly = false,\n height = '300px',\n lineNumbers = true,\n placeholder,\n error,\n language,\n}: ExpressionEditorProps) {\n const editorRef = useRef<unknown>(null);\n\n // Configure Monaco theme before mount.\n //\n // The hex literals below are deliberate and must NOT be replaced with design\n // tokens: Monaco's `defineTheme` writes these values into its own generated\n // stylesheet and only accepts literal colours — it does not resolve `var(...)`\n // or Tailwind classes. Everything *around* the editor (the wrapper border, the\n // error text) uses tokens; only the editor's internal chrome is literal.\n const handleBeforeMount = (monaco: unknown) => {\n const m = monaco as { editor: { defineTheme: (name: string, theme: unknown) => void } };\n m.editor.defineTheme('bigconsole-dark', {\n base: 'vs-dark',\n inherit: true,\n rules: [],\n colors: {\n 'editorCursor.foreground': '#ffffff',\n 'editorCursor.background': '#000000',\n 'editor.background': '#1e1e1e',\n 'editor.lineHighlightBackground': '#2a2a2a',\n },\n });\n };\n\n // Handle editor mount\n const handleMount = (editor: unknown) => {\n editorRef.current = editor;\n const ed = editor as {\n setValue: (v: string) => void;\n getModel: () => {\n getLineCount: () => number;\n getLineMaxColumn: (n: number) => number;\n } | null;\n setSelection: (s: {\n startLineNumber: number;\n startColumn: number;\n endLineNumber: number;\n endColumn: number;\n }) => void;\n };\n\n // If no value but placeholder exists, set it\n if (!value && placeholder) {\n ed.setValue(placeholder);\n onChange?.(placeholder);\n\n // Select all text so user can easily replace\n const model = ed.getModel();\n if (model) {\n ed.setSelection({\n startLineNumber: 1,\n startColumn: 1,\n endLineNumber: model.getLineCount(),\n endColumn: model.getLineMaxColumn(model.getLineCount()),\n });\n }\n }\n };\n\n // Handle value change\n const handleChange = (newValue: string | undefined) => {\n if (onChange && newValue !== undefined) {\n onChange(newValue);\n }\n };\n\n const editorLanguage = language ?? getLanguageForParserType(type);\n const isPercentHeight = height.includes('%');\n\n return (\n <div className={`relative min-w-0 ${isPercentHeight ? 'h-full flex flex-col' : ''}`}>\n <div\n className={`\n min-w-0 border rounded-md overflow-hidden\n ${isPercentHeight ? 'flex-1 min-h-0' : ''}\n ${error ? 'border-status-error-border' : 'border-[var(--color-border-default)]'}\n `}\n style={isPercentHeight ? { height: '100%' } : undefined}\n >\n <MonacoEditor\n height={isPercentHeight ? '100%' : height}\n language={editorLanguage}\n value={value}\n onChange={handleChange}\n beforeMount={handleBeforeMount}\n onMount={handleMount}\n options={{\n readOnly,\n minimap: { enabled: false },\n lineNumbers: lineNumbers ? 'on' : 'off',\n scrollBeyondLastLine: false,\n fontSize: 13,\n fontFamily: \"'JetBrains Mono', 'Fira Code', 'Courier New', monospace\",\n wordWrap: 'on',\n automaticLayout: true,\n padding: { top: 16, bottom: 12 },\n lineDecorationsWidth: 8,\n lineNumbersMinChars: 3,\n glyphMargin: false,\n folding: true,\n renderLineHighlight: 'line',\n selectOnLineNumbers: true,\n roundedSelection: false,\n cursorStyle: 'line',\n cursorWidth: 2,\n cursorBlinking: 'smooth',\n smoothScrolling: true,\n contextmenu: true,\n mouseWheelZoom: false,\n quickSuggestions: !readOnly,\n suggestOnTriggerCharacters: !readOnly,\n acceptSuggestionOnEnter: 'on',\n tabCompletion: 'on',\n wordBasedSuggestions: 'matchingDocuments',\n parameterHints: { enabled: !readOnly },\n suggest: {\n showKeywords: true,\n showSnippets: true,\n },\n }}\n theme=\"bigconsole-dark\"\n />\n </div>\n\n {error && (\n <div className=\"mt-2 flex items-start gap-2\">\n <svg\n className=\"w-4 h-4 text-status-error-text flex-shrink-0 mt-0.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <p className=\"text-xs text-status-error-text\">{error}</p>\n </div>\n )}\n </div>\n );\n});\n\nexport default ExpressionEditor;\n"],"mappings":";;;;AA2CA,SAAS,EAAyB,GAA2B;AAC3D,SAAQ,GAAR;EACE,KAAK,KACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,QACE,QAAO;;;AAQb,IAAa,IAAmB,EAAK,SAA0B,EAC7D,UACA,SACA,aACA,cAAW,IACX,YAAS,SACT,iBAAc,IACd,gBACA,UACA,eACwB;CACxB,IAAM,IAAY,EAAgB,KAAK,EASjC,KAAqB,MAAoB;AACnC,IACR,OAAO,YAAY,mBAAmB;GACtC,MAAM;GACN,SAAS;GACT,OAAO,EAAE;GACT,QAAQ;IACN,2BAA2B;IAC3B,2BAA2B;IAC3B,qBAAqB;IACrB,kCAAkC;IACnC;GACF,CAAC;IAIE,KAAe,MAAoB;AACvC,IAAU,UAAU;EACpB,IAAM,IAAK;AAeX,MAAI,CAAC,KAAS,GAAa;AAEzB,GADA,EAAG,SAAS,EAAY,EACxB,IAAW,EAAY;GAGvB,IAAM,IAAQ,EAAG,UAAU;AAC3B,GAAI,KACF,EAAG,aAAa;IACd,iBAAiB;IACjB,aAAa;IACb,eAAe,EAAM,cAAc;IACnC,WAAW,EAAM,iBAAiB,EAAM,cAAc,CAAC;IACxD,CAAC;;IAMF,KAAgB,MAAiC;AACrD,EAAI,KAAY,MAAa,KAAA,KAC3B,EAAS,EAAS;IAIhB,IAAiB,KAAY,EAAyB,EAAK,EAC3D,IAAkB,EAAO,SAAS,IAAI;AAE5C,QACE,kBAAC,OAAD;EAAK,WAAW,oBAAoB,IAAkB,yBAAyB;YAA/E,CACE,kBAAC,OAAD;GACE,WAAW;;YAEP,IAAkB,mBAAmB,GAAG;YACxC,IAAQ,+BAA+B,uCAAuC;;GAElF,OAAO,IAAkB,EAAE,QAAQ,QAAQ,GAAG,KAAA;aAE9C,kBAAC,GAAD;IACE,QAAQ,IAAkB,SAAS;IACnC,UAAU;IACH;IACP,UAAU;IACV,aAAa;IACb,SAAS;IACT,SAAS;KACP;KACA,SAAS,EAAE,SAAS,IAAO;KAC3B,aAAa,IAAc,OAAO;KAClC,sBAAsB;KACtB,UAAU;KACV,YAAY;KACZ,UAAU;KACV,iBAAiB;KACjB,SAAS;MAAE,KAAK;MAAI,QAAQ;MAAI;KAChC,sBAAsB;KACtB,qBAAqB;KACrB,aAAa;KACb,SAAS;KACT,qBAAqB;KACrB,qBAAqB;KACrB,kBAAkB;KAClB,aAAa;KACb,aAAa;KACb,gBAAgB;KAChB,iBAAiB;KACjB,aAAa;KACb,gBAAgB;KAChB,kBAAkB,CAAC;KACnB,4BAA4B,CAAC;KAC7B,yBAAyB;KACzB,eAAe;KACf,sBAAsB;KACtB,gBAAgB,EAAE,SAAS,CAAC,GAAU;KACtC,SAAS;MACP,cAAc;MACd,cAAc;MACf;KACF;IACD,OAAM;IACN,CAAA;GACE,CAAA,EAEL,KACC,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IACE,WAAU;IACV,MAAK;IACL,QAAO;IACP,SAAQ;cAER,kBAAC,QAAD;KACE,eAAc;KACd,gBAAe;KACf,aAAa;KACb,GAAE;KACF,CAAA;IACE,CAAA,EACN,kBAAC,KAAD;IAAG,WAAU;cAAkC;IAAU,CAAA,CACrD;KAEJ;;EAER"}