@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 +1 @@
1
- {"version":3,"file":"ParserCard.js","names":[],"sources":["../../../../src/bigconsole/components/parser/ParserCard.tsx"],"sourcesContent":["/**\n * Parser Card\n *\n * Card component displaying parser information with action buttons.\n */\n\nimport { memo, useCallback, useMemo } from 'react';\nimport { ParserStatusBadge } from './ParserStatusBadge';\nimport { ParserTypeBadge } from './ParserTypeBadge';\nimport type { Parser } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface ParserCardProps {\n /** Parser to display */\n parser: Parser;\n /** Callback when card is clicked (view) */\n onView?: (id: string) => void;\n /** Callback to edit parser */\n onEdit?: (id: string) => void;\n /** Callback to test parser */\n onTest?: (id: string) => void;\n /** Callback to execute parser */\n onExecute?: (id: string) => void;\n /** Callback to export parser */\n onExport?: (id: string) => void;\n /** Callback to delete parser */\n onDelete?: (id: string) => void;\n /** Whether this card's delete action is in progress */\n isDeleting?: boolean;\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\n/**\n * Format date to locale string\n */\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return new Intl.DateTimeFormat('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n }).format(date);\n}\n\n/**\n * Format relative time from date string\n */\nfunction formatRelativeTime(dateString: string): string {\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 'just now';\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n\n return formatDate(dateString);\n}\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst JqIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n);\n\nconst JsonataIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n);\n\nconst DefaultIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4\"\n />\n </svg>\n);\n\nconst TestIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"\n />\n </svg>\n);\n\nconst PlayIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z\"\n />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst EditIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n);\n\nconst DeleteIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n);\n\nconst ExportIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n);\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const ParserCard = memo(function ParserCard({\n parser,\n onView,\n onEdit,\n onTest,\n onExecute,\n onExport,\n onDelete,\n}: ParserCardProps) {\n // Handle card click\n const handleCardClick = useCallback(() => {\n onView?.(parser.id);\n }, [onView, parser.id]);\n\n // Handle action button clicks (stop propagation)\n const handleTest = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onTest?.(parser.id);\n },\n [onTest, parser.id]\n );\n\n const handleExecute = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onExecute?.(parser.id);\n },\n [onExecute, parser.id]\n );\n\n const handleEdit = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onEdit?.(parser.id);\n },\n [onEdit, parser.id]\n );\n\n const handleExport = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onExport?.(parser.id);\n },\n [onExport, parser.id]\n );\n\n const handleDelete = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onDelete?.(parser.id);\n },\n [onDelete, parser.id]\n );\n\n // Get type icon - memoized to avoid creating component during render\n const typeIcon = useMemo(() => {\n const iconClass = 'w-10 h-10 text-text-secondary/50';\n switch (parser.type) {\n case 'jq':\n return <JqIcon className={iconClass} />;\n case 'jsonata':\n return <JsonataIcon className={iconClass} />;\n default:\n return <DefaultIcon className={iconClass} />;\n }\n }, [parser.type]);\n\n return (\n <div\n onClick={handleCardClick}\n className={`\n bg-bg-surface\n border border-border-default\n rounded-lg\n overflow-hidden\n cursor-pointer\n hover:border-action-primary-bg\n transition-colors\n `}\n >\n {/* Header with icon and badges */}\n <div className=\"h-24 bg-bg-sunken flex items-center justify-center relative\">\n {typeIcon}\n\n {/* Type badge */}\n <div className=\"absolute top-2 left-2\">\n <ParserTypeBadge type={parser.type} size=\"sm\" />\n </div>\n\n {/* Status badge */}\n <div className=\"absolute top-2 right-2\">\n <ParserStatusBadge status={parser.status} size=\"sm\" />\n </div>\n </div>\n\n {/* Content */}\n <div className=\"p-4\">\n {/* Title and actions */}\n <div className=\"flex items-start justify-between mb-2\">\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-sm font-semibold text-text-primary truncate\">{parser.name || 'Untitled Parser'}</h3>\n <p className=\"text-xs text-text-secondary truncate mt-0.5\">\n {parser.inputSinkKey} → {parser.outputKey}\n </p>\n </div>\n\n {/* Action buttons */}\n <div className=\"flex items-center gap-1 ml-2\">\n {onTest && (\n <button\n type=\"button\"\n onClick={handleTest}\n className={`\n p-1 rounded-md\n text-text-secondary\n hover:text-text-primary\n hover:bg-bg-sunken\n transition-colors\n `}\n title=\"Test Parser\"\n >\n <TestIcon className=\"w-4 h-4\" />\n </button>\n )}\n\n {onExecute && (\n <button\n type=\"button\"\n onClick={handleExecute}\n className={`\n p-1 rounded-md\n text-text-secondary\n hover:text-text-primary\n hover:bg-bg-sunken\n transition-colors\n `}\n title=\"Execute Parser\"\n >\n <PlayIcon className=\"w-4 h-4\" />\n </button>\n )}\n\n {onEdit && (\n <button\n type=\"button\"\n onClick={handleEdit}\n className={`\n p-1 rounded-md\n text-text-secondary\n hover:text-text-primary\n hover:bg-bg-sunken\n transition-colors\n `}\n title=\"Edit Parser\"\n >\n <EditIcon className=\"w-4 h-4\" />\n </button>\n )}\n\n {onExport && (\n <button\n type=\"button\"\n onClick={handleExport}\n className={`\n p-1 rounded-md\n text-text-secondary\n hover:text-text-primary\n hover:bg-bg-sunken\n transition-colors\n `}\n title=\"Export Parser\"\n >\n <ExportIcon className=\"w-4 h-4\" />\n </button>\n )}\n\n {onDelete && (\n <button\n type=\"button\"\n onClick={handleDelete}\n className={`\n p-1 rounded-md\n text-text-secondary\n hover:text-status-error-text\n hover:bg-status-error-bg/10\n transition-colors\n `}\n title=\"Delete Parser\"\n >\n <DeleteIcon className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Description */}\n {parser.description && <p className=\"text-xs text-text-secondary mb-3 line-clamp-2\">{parser.description}</p>}\n\n {/* Footer with version and timestamps */}\n <div className=\"flex items-center justify-between text-xs text-text-secondary\">\n <div className=\"flex items-center gap-3\">\n <span>v{parser.version}</span>\n {parser.ttl && <span title={`Cache TTL: ${parser.ttl} seconds`}>TTL: {parser.ttl}s</span>}\n </div>\n <span title={`Last updated: ${formatDate(parser.updatedAt)}`}>{formatRelativeTime(parser.updatedAt)}</span>\n </div>\n </div>\n </div>\n );\n});\n\nexport default ParserCard;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ParserCard.js","names":[],"sources":["../../../../src/bigconsole/components/parser/ParserCard.tsx"],"sourcesContent":["/**\n * Parser Card\n *\n * Card component displaying parser information with action buttons.\n */\n\nimport { memo, useCallback, useMemo } from 'react';\nimport { ParserStatusBadge } from './ParserStatusBadge';\nimport { ParserTypeBadge } from './ParserTypeBadge';\nimport { SECTION_FOCUS_RING } from '../common';\nimport type { Parser } from '../../types';\n\n/**\n * Icon-only card actions are 40×40 so they clear the mobile touch minimum, and\n * they keep a visible focus ring because the card body is itself clickable.\n */\nconst CARD_ACTION_CLASSES = `inline-flex h-control-md aspect-square items-center justify-center rounded-md text-text-secondary motion-safe:transition-colors hover:bg-bg-sunken hover:text-text-primary ${SECTION_FOCUS_RING}`;\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface ParserCardProps {\n /** Parser to display */\n parser: Parser;\n /** Callback when card is clicked (view) */\n onView?: (id: string) => void;\n /** Callback to edit parser */\n onEdit?: (id: string) => void;\n /** Callback to test parser */\n onTest?: (id: string) => void;\n /** Callback to execute parser */\n onExecute?: (id: string) => void;\n /** Callback to export parser */\n onExport?: (id: string) => void;\n /** Callback to delete parser */\n onDelete?: (id: string) => void;\n /** Whether this card's delete action is in progress */\n isDeleting?: boolean;\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\n/**\n * Format date to locale string\n */\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return new Intl.DateTimeFormat('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n }).format(date);\n}\n\n/**\n * Format relative time from date string\n */\nfunction formatRelativeTime(dateString: string): string {\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 'just now';\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n\n return formatDate(dateString);\n}\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst JqIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n);\n\nconst JsonataIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n);\n\nconst DefaultIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4\"\n />\n </svg>\n);\n\nconst TestIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"\n />\n </svg>\n);\n\nconst PlayIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z\"\n />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst EditIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n);\n\nconst DeleteIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n);\n\nconst ExportIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n);\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const ParserCard = memo(function ParserCard({\n parser,\n onView,\n onEdit,\n onTest,\n onExecute,\n onExport,\n onDelete,\n}: ParserCardProps) {\n // Handle card click\n const handleCardClick = useCallback(() => {\n onView?.(parser.id);\n }, [onView, parser.id]);\n\n // Title button — same action as the card surface, but must not double-fire\n const handleTitleClick = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onView?.(parser.id);\n },\n [onView, parser.id]\n );\n\n // Handle action button clicks (stop propagation)\n const handleTest = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onTest?.(parser.id);\n },\n [onTest, parser.id]\n );\n\n const handleExecute = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onExecute?.(parser.id);\n },\n [onExecute, parser.id]\n );\n\n const handleEdit = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onEdit?.(parser.id);\n },\n [onEdit, parser.id]\n );\n\n const handleExport = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onExport?.(parser.id);\n },\n [onExport, parser.id]\n );\n\n const handleDelete = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onDelete?.(parser.id);\n },\n [onDelete, parser.id]\n );\n\n // Get type icon - memoized to avoid creating component during render\n const typeIcon = useMemo(() => {\n const iconClass = 'w-icon-sm h-icon-sm text-text-secondary';\n switch (parser.type) {\n case 'jq':\n return <JqIcon className={iconClass} />;\n case 'jsonata':\n return <JsonataIcon className={iconClass} />;\n default:\n return <DefaultIcon className={iconClass} />;\n }\n }, [parser.type]);\n\n return (\n <div\n onClick={handleCardClick}\n className={`\n flex h-full flex-col\n bg-bg-elevated\n border border-[var(--color-border-default)]\n rounded-card\n overflow-hidden\n cursor-pointer\n hover:border-action-primary-bg\n motion-safe:transition-colors\n `}\n >\n {/* Identity strip — type + status, the two keys people scan a grid by */}\n <div className=\"flex flex-wrap items-center justify-between gap-icon-gap border-b border-[var(--color-border-subtle)] bg-bg-sunken px-4 py-2\">\n <span className=\"flex min-w-0 items-center gap-icon-gap\">\n {typeIcon}\n <ParserTypeBadge type={parser.type} size=\"sm\" />\n </span>\n <ParserStatusBadge status={parser.status} size=\"sm\" />\n </div>\n\n {/* Content */}\n <div className=\"flex flex-1 flex-col p-4\">\n {/* Title and actions */}\n <div className=\"flex flex-wrap items-start justify-between gap-icon-gap mb-2\">\n <div className=\"flex-1 min-w-0\">\n {/* The title is the card's keyboard-reachable \"open\" affordance. The card\n surface stays mouse-clickable, but it is NOT a `role=\"button\"` — that\n would nest the action buttons below inside another interactive element. */}\n <h3 className=\"min-w-0 text-sm font-semibold text-text-primary\">\n <button\n type=\"button\"\n onClick={handleTitleClick}\n className={`block w-full truncate rounded-sm text-left ${SECTION_FOCUS_RING}`}\n >\n {parser.name || 'Untitled Parser'}\n </button>\n </h3>\n <p\n className=\"text-xs font-mono text-text-secondary truncate mt-0.5\"\n title={`${parser.inputSinkKey} → ${parser.outputKey}`}\n >\n {parser.inputSinkKey} → {parser.outputKey}\n </p>\n </div>\n\n {/* Action buttons */}\n <div className=\"flex flex-wrap items-center gap-icon-gap\">\n {onTest && (\n <button type=\"button\" onClick={handleTest} className={CARD_ACTION_CLASSES} title=\"Test Parser\">\n <span className=\"sr-only\">Test parser</span>\n <TestIcon className=\"w-icon-sm h-icon-sm\" />\n </button>\n )}\n\n {onExecute && (\n <button type=\"button\" onClick={handleExecute} className={CARD_ACTION_CLASSES} title=\"Execute Parser\">\n <span className=\"sr-only\">Execute parser</span>\n <PlayIcon className=\"w-icon-sm h-icon-sm\" />\n </button>\n )}\n\n {onEdit && (\n <button type=\"button\" onClick={handleEdit} className={CARD_ACTION_CLASSES} title=\"Edit Parser\">\n <span className=\"sr-only\">Edit parser</span>\n <EditIcon className=\"w-icon-sm h-icon-sm\" />\n </button>\n )}\n\n {onExport && (\n <button type=\"button\" onClick={handleExport} className={CARD_ACTION_CLASSES} title=\"Export Parser\">\n <span className=\"sr-only\">Export parser</span>\n <ExportIcon className=\"w-icon-sm h-icon-sm\" />\n </button>\n )}\n\n {onDelete && (\n <button\n type=\"button\"\n onClick={handleDelete}\n className={`${CARD_ACTION_CLASSES} hover:text-[var(--color-status-error-text)]`}\n title=\"Delete Parser\"\n >\n <span className=\"sr-only\">Delete parser</span>\n <DeleteIcon className=\"w-icon-sm h-icon-sm\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Description */}\n {parser.description && <p className=\"text-xs text-text-secondary mb-3 line-clamp-2\">{parser.description}</p>}\n\n {/* Footer — supporting metadata, separated from the identity block above */}\n <div className=\"mt-auto flex flex-wrap items-center justify-between gap-x-3 gap-y-1 border-t border-[var(--color-border-subtle)] pt-2 text-xs text-text-muted\">\n <span className=\"flex flex-wrap items-center gap-3\">\n <span>v{parser.version}</span>\n {parser.ttl ? <span title={`Cache TTL: ${parser.ttl} seconds`}>TTL: {parser.ttl}s</span> : null}\n </span>\n <span title={`Last updated: ${formatDate(parser.updatedAt)}`}>{formatRelativeTime(parser.updatedAt)}</span>\n </div>\n </div>\n </div>\n );\n});\n\nexport default ParserCard;\n"],"mappings":"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"}
@@ -1,296 +1,313 @@
1
1
  import { useBuildPath as e } from "../../contexts/NavigationContext.js";
2
2
  import "../../contexts/index.js";
3
- import t from "../../hooks/useParserOperations.js";
4
- import n from "./ParserTypeBadge.js";
5
- import r from "./ParserStatusBadge.js";
6
- import { Fragment as i, memo as a, useCallback as o, useEffect as s, useMemo as c, useState as l } from "react";
7
- import { Plus as u } from "lucide-react";
8
- import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
9
- import { jsx as f, jsxs as p } 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/useParserOperations.js";
6
+ import r from "./ParserTypeBadge.js";
7
+ import i from "./ParserStatusBadge.js";
8
+ import { Fragment as a, memo as o, useCallback as s, useEffect as c, useMemo as l, useState as u } from "react";
9
+ import { Plus as d } from "lucide-react";
10
+ import { useI18n as f } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
11
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
10
12
  //#region src/bigconsole/components/parser/ParserSelector.tsx
11
- var m = "default", h = ({ className: e }) => /* @__PURE__ */ f("svg", {
13
+ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y border-[var(--color-border-default)]", _ = "text-xs font-semibold uppercase tracking-wide text-text-secondary", v = ({ className: e }) => /* @__PURE__ */ p("svg", {
12
14
  className: e,
13
15
  fill: "none",
14
16
  stroke: "currentColor",
15
17
  viewBox: "0 0 24 24",
16
- children: /* @__PURE__ */ f("path", {
18
+ children: /* @__PURE__ */ p("path", {
17
19
  strokeLinecap: "round",
18
20
  strokeLinejoin: "round",
19
21
  strokeWidth: 2,
20
22
  d: "M19 9l-7 7-7-7"
21
23
  })
22
- }), g = ({ className: e }) => /* @__PURE__ */ p("svg", {
24
+ }), y = ({ className: e }) => /* @__PURE__ */ m("svg", {
23
25
  className: e,
24
26
  fill: "none",
25
27
  stroke: "currentColor",
26
28
  viewBox: "0 0 24 24",
27
29
  children: [
28
- /* @__PURE__ */ f("path", {
30
+ /* @__PURE__ */ p("path", {
29
31
  strokeLinecap: "round",
30
32
  strokeLinejoin: "round",
31
33
  strokeWidth: 2,
32
34
  d: "M12 21a9 9 0 100-18 9 9 0 000 18z"
33
35
  }),
34
- /* @__PURE__ */ f("path", {
36
+ /* @__PURE__ */ p("path", {
35
37
  strokeLinecap: "round",
36
38
  strokeLinejoin: "round",
37
39
  strokeWidth: 2,
38
40
  d: "M3.6 9h16.8M3.6 15h16.8"
39
41
  }),
40
- /* @__PURE__ */ f("path", {
42
+ /* @__PURE__ */ p("path", {
41
43
  strokeLinecap: "round",
42
44
  strokeLinejoin: "round",
43
45
  strokeWidth: 2,
44
46
  d: "M12 3a15 15 0 014 9 15 15 0 01-4 9 15 15 0 01-4-9 15 15 0 014-9z"
45
47
  })
46
48
  ]
47
- }), _ = a(function({ parser: e, isSelected: t, onSelect: i, isGlobal: a = !1 }) {
48
- let { t: o } = d();
49
- return /* @__PURE__ */ f("button", {
49
+ }), b = o(function({ parser: e, isSelected: n, onSelect: a, isGlobal: o = !1 }) {
50
+ let { t: s } = f();
51
+ return /* @__PURE__ */ p("button", {
50
52
  type: "button",
51
- onClick: () => i(e.id),
53
+ onClick: () => a(e.id),
52
54
  className: `
53
- w-full px-3 py-2.5
55
+ w-full min-h-control-md px-3 py-2.5
54
56
  text-left
55
57
  hover:bg-bg-sunken
56
- transition-colors
57
- border-b border-border-default last:border-b-0
58
- ${t ? "bg-action-primary-bg/10" : ""}
58
+ motion-safe:transition-colors
59
+ border-b border-[var(--color-border-default)] last:border-b-0
60
+ ${t}
61
+ ${n ? "bg-action-primary-bg/10" : ""}
59
62
  `,
60
- children: /* @__PURE__ */ p("div", {
63
+ children: /* @__PURE__ */ m("div", {
61
64
  className: "flex items-start justify-between gap-2",
62
- children: [/* @__PURE__ */ p("div", {
65
+ children: [/* @__PURE__ */ m("div", {
63
66
  className: "flex-1 min-w-0",
64
67
  children: [
65
- /* @__PURE__ */ p("div", {
68
+ /* @__PURE__ */ m("div", {
66
69
  className: "flex items-center gap-2 mb-1",
67
70
  children: [
68
- /* @__PURE__ */ f(n, {
71
+ /* @__PURE__ */ p(r, {
69
72
  type: e.type,
70
73
  size: "sm"
71
74
  }),
72
- /* @__PURE__ */ f("span", {
75
+ /* @__PURE__ */ p("span", {
73
76
  className: "text-sm font-medium text-text-primary truncate",
74
77
  children: e.name
75
78
  }),
76
- a && /* @__PURE__ */ p("span", {
79
+ o && /* @__PURE__ */ m("span", {
77
80
  className: "inline-flex items-center gap-1 px-1.5 py-0.5 text-xs bg-bg-sunken text-text-secondary rounded",
78
- children: [/* @__PURE__ */ f(g, { className: "w-3 h-3" }), o("bigconsole.parsers.selector.globalBadge", "Global")]
81
+ children: [/* @__PURE__ */ p(y, { className: "w-3 h-3" }), s("bigconsole.parsers.selector.globalBadge", "Global")]
79
82
  })
80
83
  ]
81
84
  }),
82
- e.description && /* @__PURE__ */ f("p", {
85
+ e.description && /* @__PURE__ */ p("p", {
83
86
  className: "text-xs text-text-secondary line-clamp-1 mb-1",
84
87
  children: e.description
85
88
  }),
86
- /* @__PURE__ */ f("div", {
87
- className: "flex items-center gap-2 text-xs text-text-tertiary",
88
- children: /* @__PURE__ */ p("span", { children: [
89
- e.inputSinkKey,
90
- " → ",
91
- e.outputKey
92
- ] })
89
+ /* @__PURE__ */ p("div", {
90
+ className: "flex min-w-0 items-center gap-2 text-xs text-text-muted",
91
+ children: /* @__PURE__ */ m("span", {
92
+ className: "truncate font-mono",
93
+ children: [
94
+ e.inputSinkKey,
95
+ " → ",
96
+ e.outputKey
97
+ ]
98
+ })
93
99
  })
94
100
  ]
95
- }), /* @__PURE__ */ f("div", { children: /* @__PURE__ */ f(r, {
96
- status: e.status,
97
- size: "sm",
98
- showIcon: !1
99
- }) })]
101
+ }), /* @__PURE__ */ p("div", {
102
+ className: "shrink-0",
103
+ children: /* @__PURE__ */ p(i, {
104
+ status: e.status,
105
+ size: "sm",
106
+ showIcon: !1
107
+ })
108
+ })]
100
109
  })
101
110
  });
102
- }), v = a(function({ consoleId: r, value: a, onChange: g, filterType: v, filterStatus: y = "active", filterInputSinkKey: b, placeholder: x, disabled: S = !1, error: C = !1, errorMessage: w }) {
103
- let { t: T } = d(), [E, D] = l(!1), [O, k] = l(""), A = x ?? T("bigconsole.parsers.selector.placeholder", "Select a parser..."), j = e(), M = r === m, { parsers: N, loading: P, fetchParsers: F } = t({
104
- consoleId: r,
105
- skipFetch: M
106
- }), { parsers: I, loading: L, fetchParsers: R } = t({
107
- consoleId: m,
108
- skipFetch: M
109
- }), z = c(() => {
110
- if (M) return N;
111
- let e = new Set(N.map((e) => e.id)), t = I.filter((t) => !e.has(t.id));
112
- return [...N, ...t];
111
+ }), x = o(function({ consoleId: i, value: o, onChange: y, filterType: x, filterStatus: S = "active", filterInputSinkKey: C, placeholder: w, disabled: T = !1, error: E = !1, errorMessage: D }) {
112
+ let { t: O } = f(), [k, A] = u(!1), [j, M] = u(""), N = w ?? O("bigconsole.parsers.selector.placeholder", "Select a parser..."), P = e(), F = i === h, { parsers: I, loading: L, fetchParsers: R } = n({
113
+ consoleId: i,
114
+ skipFetch: F
115
+ }), { parsers: z, loading: B, fetchParsers: V } = n({
116
+ consoleId: h,
117
+ skipFetch: F
118
+ }), H = l(() => {
119
+ if (F) return I;
120
+ let e = new Set(I.map((e) => e.id)), t = z.filter((t) => !e.has(t.id));
121
+ return [...I, ...t];
113
122
  }, [
114
- N,
115
123
  I,
116
- M
117
- ]), B = P || L, V = c(() => z.filter((e) => {
118
- if (v && e.type !== v || y && e.status !== y || b && e.inputSinkKey !== b) return !1;
119
- if (O) {
120
- let t = O.toLowerCase();
124
+ z,
125
+ F
126
+ ]), U = L || B, W = l(() => H.filter((e) => {
127
+ if (x && e.type !== x || S && e.status !== S || C && e.inputSinkKey !== C) return !1;
128
+ if (j) {
129
+ let t = j.toLowerCase();
121
130
  return e.name.toLowerCase().includes(t) || e.description?.toLowerCase().includes(t) || e.inputSinkKey.toLowerCase().includes(t) || e.outputKey.toLowerCase().includes(t);
122
131
  }
123
132
  return !0;
124
133
  }), [
125
- z,
126
- v,
127
- y,
128
- b,
129
- O
130
- ]), { dashboardScopedParsers: H, globalScopedParsers: U } = c(() => ({
131
- dashboardScopedParsers: V.filter((e) => e.consoleId !== m),
132
- globalScopedParsers: V.filter((e) => e.consoleId === m)
133
- }), [V]), W = z.find((e) => e.id === a);
134
- s(() => {
135
- r && (F({
136
- type: v,
137
- status: y ?? void 0
138
- }), M || R({
139
- type: v,
140
- status: y ?? void 0
134
+ H,
135
+ x,
136
+ S,
137
+ C,
138
+ j
139
+ ]), { dashboardScopedParsers: G, globalScopedParsers: K } = l(() => ({
140
+ dashboardScopedParsers: W.filter((e) => e.consoleId !== h),
141
+ globalScopedParsers: W.filter((e) => e.consoleId === h)
142
+ }), [W]), q = H.find((e) => e.id === o);
143
+ c(() => {
144
+ i && (R({
145
+ type: x,
146
+ status: S ?? void 0
147
+ }), F || V({
148
+ type: x,
149
+ status: S ?? void 0
141
150
  }));
142
151
  }, [
143
- r,
144
- v,
145
- y,
146
- b,
147
- F,
152
+ i,
153
+ x,
154
+ S,
155
+ C,
148
156
  R,
149
- M
157
+ V,
158
+ F
150
159
  ]);
151
- let G = o((e) => {
152
- g(e), D(!1), k("");
153
- }, [g]), K = o(() => {
154
- if (S) return;
155
- let e = !E;
156
- e && (F({
157
- type: v,
158
- status: y ?? void 0
159
- }), M || R({
160
- type: v,
161
- status: y ?? void 0
162
- })), D(e);
160
+ let J = s((e) => {
161
+ y(e), A(!1), M("");
162
+ }, [y]), Y = s(() => {
163
+ if (T) return;
164
+ let e = !k;
165
+ e && (R({
166
+ type: x,
167
+ status: S ?? void 0
168
+ }), F || V({
169
+ type: x,
170
+ status: S ?? void 0
171
+ })), A(e);
163
172
  }, [
164
- S,
165
- E,
166
- F,
173
+ T,
174
+ k,
167
175
  R,
168
- v,
169
- y,
170
- M
171
- ]), q = o(() => {
172
- D(!1);
173
- }, []), J = o(() => {
174
- D(!1);
175
- let e = M ? "/parsers/new" : `/dashboards/${r}/parsers/new`;
176
- window.open(j(e), "_blank", "noopener,noreferrer");
176
+ V,
177
+ x,
178
+ S,
179
+ F
180
+ ]), X = s(() => {
181
+ A(!1);
182
+ }, []), Z = s(() => {
183
+ A(!1);
184
+ let e = F ? "/parsers/new" : `/dashboards/${i}/parsers/new`;
185
+ window.open(P(e), "_blank", "noopener,noreferrer");
177
186
  }, [
178
- j,
179
- r,
180
- M
187
+ P,
188
+ i,
189
+ F
181
190
  ]);
182
- return /* @__PURE__ */ p("div", {
191
+ return /* @__PURE__ */ m("div", {
183
192
  className: "relative",
184
193
  children: [
185
- /* @__PURE__ */ p("button", {
194
+ /* @__PURE__ */ m("button", {
186
195
  type: "button",
187
- onClick: K,
188
- disabled: S,
196
+ onClick: Y,
197
+ disabled: T,
198
+ "aria-haspopup": "listbox",
199
+ "aria-expanded": k,
189
200
  className: `
190
- w-full
201
+ w-full min-w-0 min-h-control-md
191
202
  px-3 py-2
192
203
  bg-bg-surface
193
204
  border rounded-md
194
205
  text-left
195
206
  flex items-center justify-between gap-2
196
- transition-colors
197
- ${S ? "opacity-50 cursor-not-allowed" : "hover:border-action-primary-bg cursor-pointer"}
198
- ${C ? "border-status-error-border" : "border-border-default"}
199
- ${E ? "border-action-primary-bg ring-2 ring-action-primary-bg/20" : ""}
207
+ motion-safe:transition-colors
208
+ ${t}
209
+ ${T ? "opacity-50 cursor-not-allowed" : "hover:border-action-primary-bg cursor-pointer"}
210
+ ${E ? "border-status-error-border" : "border-[var(--color-border-default)]"}
211
+ ${k ? "border-action-primary-bg ring-2 ring-action-primary-bg/20" : ""}
200
212
  `,
201
- children: [/* @__PURE__ */ f("div", {
213
+ children: [/* @__PURE__ */ p("div", {
202
214
  className: "flex-1 min-w-0",
203
- children: W ? /* @__PURE__ */ p("div", {
204
- className: "flex items-center gap-2",
205
- children: [/* @__PURE__ */ f(n, {
206
- type: W.type,
215
+ children: q ? /* @__PURE__ */ m("div", {
216
+ className: "flex min-w-0 items-center gap-2",
217
+ children: [/* @__PURE__ */ p(r, {
218
+ type: q.type,
207
219
  size: "sm"
208
- }), /* @__PURE__ */ f("span", {
220
+ }), /* @__PURE__ */ p("span", {
209
221
  className: "text-sm text-text-primary truncate",
210
- children: W.name
222
+ children: q.name
211
223
  })]
212
- }) : /* @__PURE__ */ f("span", {
213
- className: "text-sm text-text-tertiary",
214
- children: A
224
+ }) : /* @__PURE__ */ p("span", {
225
+ className: "text-sm text-text-muted",
226
+ children: N
215
227
  })
216
- }), /* @__PURE__ */ f(h, { className: `w-4 h-4 text-text-secondary transition-transform ${E ? "transform rotate-180" : ""}` })]
228
+ }), /* @__PURE__ */ p(v, {
229
+ "aria-hidden": "true",
230
+ className: `w-4 h-4 shrink-0 text-text-secondary motion-safe:transition-transform ${k ? "transform rotate-180" : ""}`
231
+ })]
217
232
  }),
218
- C && w && /* @__PURE__ */ f("p", {
233
+ E && D && /* @__PURE__ */ p("p", {
219
234
  className: "mt-1 text-xs text-status-error-text",
220
- children: w
235
+ children: D
221
236
  }),
222
- E && /* @__PURE__ */ p(i, { children: [/* @__PURE__ */ f("div", {
237
+ k && /* @__PURE__ */ m(a, { children: [/* @__PURE__ */ p("div", {
223
238
  className: "fixed inset-0 z-10",
224
- onClick: q
225
- }), /* @__PURE__ */ p("div", {
226
- 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",
239
+ onClick: X
240
+ }), /* @__PURE__ */ m("div", {
241
+ 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",
227
242
  children: [
228
- /* @__PURE__ */ f("div", {
229
- className: "p-2 border-b border-border-default",
230
- children: /* @__PURE__ */ f("input", {
243
+ /* @__PURE__ */ p("div", {
244
+ className: "p-2 border-b border-[var(--color-border-default)]",
245
+ children: /* @__PURE__ */ p("input", {
231
246
  type: "text",
232
- placeholder: T("bigconsole.parsers.selector.searchPlaceholder", "Search parsers..."),
233
- value: O,
234
- onChange: (e) => k(e.target.value),
235
- 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 "
247
+ "aria-label": O("bigconsole.parsers.selector.searchPlaceholder", "Search parsers..."),
248
+ placeholder: O("bigconsole.parsers.selector.searchPlaceholder", "Search parsers..."),
249
+ value: j,
250
+ onChange: (e) => M(e.target.value),
251
+ 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 "
236
252
  })
237
253
  }),
238
- /* @__PURE__ */ f("div", {
254
+ /* @__PURE__ */ p("div", {
239
255
  className: "overflow-y-auto flex-1",
240
- children: B ? /* @__PURE__ */ f("div", {
256
+ children: U ? /* @__PURE__ */ p("div", {
241
257
  className: "p-4 text-center text-sm text-text-secondary",
242
- children: T("bigconsole.parsers.selector.loading", "Loading parsers...")
243
- }) : V.length === 0 ? /* @__PURE__ */ f("div", {
258
+ children: O("bigconsole.parsers.selector.loading", "Loading parsers...")
259
+ }) : W.length === 0 ? /* @__PURE__ */ p("div", {
244
260
  className: "p-4 text-center text-sm text-text-secondary",
245
- children: T("bigconsole.parsers.selector.empty", "No parsers found")
246
- }) : /* @__PURE__ */ p(i, { children: [
247
- /* @__PURE__ */ f("button", {
261
+ children: O("bigconsole.parsers.selector.empty", "No parsers found")
262
+ }) : /* @__PURE__ */ m(a, { children: [
263
+ /* @__PURE__ */ p("button", {
248
264
  type: "button",
249
- onClick: () => G(null),
265
+ onClick: () => J(null),
250
266
  className: `
251
- w-full px-3 py-2
267
+ w-full min-h-control-md px-3 py-2
252
268
  text-left text-sm
253
269
  hover:bg-bg-sunken
254
- transition-colors
255
- ${a === null ? "bg-action-primary-bg/10 text-action-primary-bg" : "text-text-secondary"}
270
+ motion-safe:transition-colors
271
+ focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-bg-surface
272
+ ${o === null ? "bg-action-primary-bg/10 text-action-primary-bg" : "text-text-secondary"}
256
273
  `,
257
- children: /* @__PURE__ */ f("span", {
274
+ children: /* @__PURE__ */ p("span", {
258
275
  className: "italic",
259
- children: T("bigconsole.parsers.selector.none", "None")
276
+ children: O("bigconsole.parsers.selector.none", "None")
260
277
  })
261
278
  }),
262
- H.length > 0 && /* @__PURE__ */ p(i, { children: [/* @__PURE__ */ f("div", {
263
- className: "px-3 py-1.5 bg-bg-sunken border-y border-border-default",
264
- children: /* @__PURE__ */ f("span", {
265
- className: "text-xs font-medium text-text-secondary uppercase tracking-wide",
266
- children: T("bigconsole.parsers.selector.dashboardParsers", "Dashboard Parsers")
279
+ G.length > 0 && /* @__PURE__ */ m(a, { children: [/* @__PURE__ */ p("div", {
280
+ className: g,
281
+ children: /* @__PURE__ */ p("span", {
282
+ className: _,
283
+ children: O("bigconsole.parsers.selector.dashboardParsers", "Dashboard Parsers")
267
284
  })
268
- }), H.map((e) => /* @__PURE__ */ f(_, {
285
+ }), G.map((e) => /* @__PURE__ */ p(b, {
269
286
  parser: e,
270
- isSelected: a === e.id,
271
- onSelect: G
287
+ isSelected: o === e.id,
288
+ onSelect: J
272
289
  }, e.id))] }),
273
- U.length > 0 && /* @__PURE__ */ p(i, { children: [/* @__PURE__ */ f("div", {
274
- className: "px-3 py-1.5 bg-bg-sunken border-y border-border-default",
275
- children: /* @__PURE__ */ f("span", {
276
- className: "text-xs font-medium text-text-secondary uppercase tracking-wide",
277
- children: T("bigconsole.parsers.selector.globalParsers", "Global Parsers")
290
+ K.length > 0 && /* @__PURE__ */ m(a, { children: [/* @__PURE__ */ p("div", {
291
+ className: g,
292
+ children: /* @__PURE__ */ p("span", {
293
+ className: _,
294
+ children: O("bigconsole.parsers.selector.globalParsers", "Global Parsers")
278
295
  })
279
- }), U.map((e) => /* @__PURE__ */ f(_, {
296
+ }), K.map((e) => /* @__PURE__ */ p(b, {
280
297
  parser: e,
281
- isSelected: a === e.id,
282
- onSelect: G,
298
+ isSelected: o === e.id,
299
+ onSelect: J,
283
300
  isGlobal: !0
284
301
  }, e.id))] })
285
302
  ] })
286
303
  }),
287
- /* @__PURE__ */ f("div", {
304
+ /* @__PURE__ */ p("div", {
288
305
  className: "p-2 border-t border-border-default",
289
- children: /* @__PURE__ */ p("button", {
306
+ children: /* @__PURE__ */ m("button", {
290
307
  type: "button",
291
- onClick: J,
308
+ onClick: Z,
292
309
  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 ",
293
- children: [/* @__PURE__ */ f(u, { className: "w-4 h-4" }), T("bigconsole.parsers.selector.createNew", "Create new parser")]
310
+ children: [/* @__PURE__ */ p(d, { className: "w-4 h-4" }), O("bigconsole.parsers.selector.createNew", "Create new parser")]
294
311
  })
295
312
  })
296
313
  ]
@@ -299,6 +316,6 @@ var m = "default", h = ({ className: e }) => /* @__PURE__ */ f("svg", {
299
316
  });
300
317
  });
301
318
  //#endregion
302
- export { v as default };
319
+ export { x as default };
303
320
 
304
321
  //# sourceMappingURL=ParserSelector.js.map