@burdenoff/microfe-bigconsole 2026.805.2 → 2026.812.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bigconsole/components/DrilldownDashboardRenderer.js +118 -106
- package/dist/bigconsole/components/DrilldownDashboardRenderer.js.map +1 -1
- package/dist/bigconsole/components/DrilldownModal.js +54 -50
- package/dist/bigconsole/components/DrilldownModal.js.map +1 -1
- package/dist/bigconsole/components/builder/BuilderCanvas.js +2 -2
- package/dist/bigconsole/components/builder/BuilderCanvas.js.map +1 -1
- package/dist/bigconsole/components/builder/BuilderTopbar.js +3 -3
- package/dist/bigconsole/components/builder/BuilderTopbar.js.map +1 -1
- package/dist/bigconsole/components/builder/inspector/AdvancedSection.js +24 -25
- package/dist/bigconsole/components/builder/inspector/AdvancedSection.js.map +1 -1
- package/dist/bigconsole/components/builder/inspector/AppearanceSection.js +40 -29
- package/dist/bigconsole/components/builder/inspector/AppearanceSection.js.map +1 -1
- package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +145 -111
- package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -1
- package/dist/bigconsole/components/builder/inspector/GeneralSection.js +58 -44
- package/dist/bigconsole/components/builder/inspector/GeneralSection.js.map +1 -1
- package/dist/bigconsole/components/common/Section.js +70 -0
- package/dist/bigconsole/components/common/Section.js.map +1 -0
- package/dist/bigconsole/components/common/index.js +2 -0
- package/dist/bigconsole/components/common/sectionStyles.js +42 -0
- package/dist/bigconsole/components/common/sectionStyles.js.map +1 -0
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +269 -251
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js +214 -223
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardGrid.js +12 -18
- package/dist/bigconsole/components/dashboard/DashboardGrid.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js +110 -102
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +81 -68
- package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js +125 -159
- package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +147 -144
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +154 -153
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +82 -79
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +171 -284
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +250 -273
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/LiveBoardBanner.js +45 -53
- package/dist/bigconsole/components/dashboard/LiveBoardBanner.js.map +1 -1
- package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js +157 -148
- package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js.map +1 -1
- package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +75 -83
- package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +167 -161
- package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +181 -190
- package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js +101 -95
- package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js +20 -18
- package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js.map +1 -1
- package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -0
- package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js +26 -58
- package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js.map +1 -1
- package/dist/bigconsole/components/dashboard/WidgetPalette.js +307 -229
- package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
- package/dist/bigconsole/components/datasink/CacheTTLSelector.js +128 -129
- package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkCard.js +78 -79
- package/dist/bigconsole/components/datasink/DataSinkCard.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkDataViewer.js +33 -34
- package/dist/bigconsole/components/datasink/DataSinkDataViewer.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +79 -61
- package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +75 -64
- package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js +1 -1
- package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkTableViewer.js +20 -19
- package/dist/bigconsole/components/datasink/DataSinkTableViewer.js.map +1 -1
- package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js +127 -171
- package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +113 -117
- package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +312 -307
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/LinkedParsersPanel.js +65 -66
- package/dist/bigconsole/components/datasink/LinkedParsersPanel.js.map +1 -1
- package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js +121 -127
- package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js.map +1 -1
- package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +194 -189
- package/dist/bigconsole/components/datasink/RefreshTypeSelector.js.map +1 -1
- package/dist/bigconsole/components/datasink/SetupStateBadge.js +3 -3
- package/dist/bigconsole/components/datasink/SetupStateBadge.js.map +1 -1
- package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js +95 -95
- package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js.map +1 -1
- package/dist/bigconsole/components/parser/DataSinkSelector.js +163 -131
- package/dist/bigconsole/components/parser/DataSinkSelector.js.map +1 -1
- package/dist/bigconsole/components/parser/ExpressionEditor.js +3 -3
- package/dist/bigconsole/components/parser/ExpressionEditor.js.map +1 -1
- package/dist/bigconsole/components/parser/ImportParserDialog.js +205 -260
- package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
- package/dist/bigconsole/components/parser/ParserCard.js +133 -114
- package/dist/bigconsole/components/parser/ParserCard.js.map +1 -1
- package/dist/bigconsole/components/parser/ParserSelector.js +193 -174
- package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
- package/dist/bigconsole/components/parser/ParserStatusBadge.js +2 -2
- package/dist/bigconsole/components/parser/ParserStatusBadge.js.map +1 -1
- package/dist/bigconsole/components/parser/ParserTypeBadge.js +4 -4
- package/dist/bigconsole/components/parser/ParserTypeBadge.js.map +1 -1
- package/dist/bigconsole/components/pipeline/PipelineCard.js +134 -89
- package/dist/bigconsole/components/pipeline/PipelineCard.js.map +1 -1
- package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js +77 -64
- package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js.map +1 -1
- package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js +7 -10
- package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js.map +1 -1
- package/dist/bigconsole/components/preview/AiPreviewContent.js +31 -32
- package/dist/bigconsole/components/preview/AiPreviewContent.js.map +1 -1
- package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +152 -103
- package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js.map +1 -1
- package/dist/bigconsole/components/preview/AiPreviewPanel.js +193 -148
- package/dist/bigconsole/components/preview/AiPreviewPanel.js.map +1 -1
- package/dist/bigconsole/components/preview/previewShared.js +41 -23
- package/dist/bigconsole/components/preview/previewShared.js.map +1 -1
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js +405 -364
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +265 -237
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/PropertiesPanel.js +764 -821
- package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js +7 -5
- package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetHeader.js +7 -8
- package/dist/bigconsole/components/widgets/WidgetHeader.js.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetWrapper.js +8 -7
- package/dist/bigconsole/components/widgets/WidgetWrapper.js.map +1 -1
- package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js +1 -1
- package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +46 -49
- package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/chart/ChartConfig.js +154 -147
- package/dist/bigconsole/components/widgets/chart/ChartConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/comments/WidgetComments.js +118 -101
- package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
- package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +244 -191
- package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js.map +1 -1
- package/dist/bigconsole/components/widgets/form/FormWidget.js +167 -159
- package/dist/bigconsole/components/widgets/form/FormWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +92 -76
- package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js +1 -1
- package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +89 -86
- package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js +2 -2
- package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +64 -63
- package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js +2 -2
- package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/list/ListConfig.js +65 -58
- package/dist/bigconsole/components/widgets/list/ListConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/list/ListItem.js +1 -1
- package/dist/bigconsole/components/widgets/list/ListItem.js.map +1 -1
- package/dist/bigconsole/components/widgets/map-widget/MapWidget.js +1 -1
- package/dist/bigconsole/components/widgets/map-widget/MapWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +79 -72
- package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +35 -34
- package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +20 -19
- package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js.map +1 -1
- package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +181 -180
- package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +100 -90
- package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/retention/RetentionWidget.js +3 -3
- package/dist/bigconsole/components/widgets/retention/RetentionWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/states/EmptyState.js +6 -4
- package/dist/bigconsole/components/widgets/states/EmptyState.js.map +1 -1
- package/dist/bigconsole/components/widgets/states/ErrorState.js +7 -5
- package/dist/bigconsole/components/widgets/states/ErrorState.js.map +1 -1
- package/dist/bigconsole/components/widgets/states/LoadingState.js +5 -4
- package/dist/bigconsole/components/widgets/states/LoadingState.js.map +1 -1
- package/dist/bigconsole/components/widgets/table/TableConfig.js +193 -172
- package/dist/bigconsole/components/widgets/table/TableConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/table/TableHeader.js +1 -1
- package/dist/bigconsole/components/widgets/table/TableHeader.js.map +1 -1
- package/dist/bigconsole/components/widgets/table/TableWidget.js +1 -1
- package/dist/bigconsole/components/widgets/table/TableWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/text-widget/TextWidget.js +1 -1
- package/dist/bigconsole/components/widgets/text-widget/TextWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js +3 -3
- package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/utils/conditionalFormat.js +2 -2
- package/dist/bigconsole/components/widgets/utils/conditionalFormat.js.map +1 -1
- package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +283 -249
- package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js +28 -20
- package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js.map +1 -1
- package/dist/bigconsole/components/workflow/WorkflowCard.js +92 -77
- package/dist/bigconsole/components/workflow/WorkflowCard.js.map +1 -1
- package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js +70 -51
- package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js.map +1 -1
- package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js +16 -17
- package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js.map +1 -1
- package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +46 -42
- package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js.map +1 -1
- package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +372 -348
- package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
- package/dist/bigconsole/hooks/useModalFocusTrap.js +53 -0
- package/dist/bigconsole/hooks/useModalFocusTrap.js.map +1 -0
- package/dist/bigconsole/pages/DashboardBuilderPage.js +153 -142
- package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardViewPage.js +230 -220
- package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardsPage.js +832 -790
- package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
- package/dist/bigconsole/pages/DataParsersPage.js +249 -304
- package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkBuilderPage.js +324 -349
- package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkViewPage.js +336 -323
- package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinksPage.js +356 -458
- package/dist/bigconsole/pages/DataSinksPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSourcesPage.js +14 -8
- package/dist/bigconsole/pages/DataSourcesPage.js.map +1 -1
- package/dist/bigconsole/pages/HomePage.js +186 -193
- package/dist/bigconsole/pages/HomePage.js.map +1 -1
- package/dist/bigconsole/pages/InsightsPage.js +901 -724
- package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserBuilderPage.js +769 -675
- package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserViewPage.js +382 -354
- package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineBuilderPage.js +540 -420
- package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineViewPage.js +416 -384
- package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelinesPage.js +260 -309
- package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
- package/dist/bigconsole/pages/SettingsPage.js +177 -172
- package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
- package/dist/bigconsole/pages/WidgetDemoPage.js +278 -142
- package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowViewPage.js +382 -366
- package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowsPage.js +202 -316
- package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
- package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +111 -109
- package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js.map +1 -1
- package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +127 -126
- package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js.map +1 -1
- package/dist/bigconsole/renderers/adapters/CustomRenderer.js +103 -103
- package/dist/bigconsole/renderers/adapters/CustomRenderer.js.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PipelineDeleteDialog.js","names":[],"sources":["../../../../src/bigconsole/components/pipeline/PipelineDeleteDialog.tsx"],"sourcesContent":["/**\n * PipelineDeleteDialog Component\n *\n * Confirmation dialog for deleting a Pipeline.\n * Shows warning about stages before deletion.\n */\n\nimport { memo, useCallback } from 'react';\nimport type { Pipeline } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface PipelineDeleteDialogProps {\n pipeline: Pipeline;\n isOpen: boolean;\n onClose: () => void;\n onConfirm: () => void | Promise<void>;\n}\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst WarningIcon = ({ 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=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n);\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const PipelineDeleteDialog = memo(function PipelineDeleteDialog({\n pipeline,\n isOpen,\n onClose,\n onConfirm,\n}: PipelineDeleteDialogProps) {\n // Calculate stage count\n const stageCount = pipeline.stages?.length ?? 0;\n\n // Event handlers\n const handleBackdropClick = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const handleConfirmClick = useCallback(() => {\n onConfirm();\n }, [onConfirm]);\n\n // Don't render if not open\n if (!isOpen) {\n return null;\n }\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div className=\"absolute inset-0 bg-
|
|
1
|
+
{"version":3,"file":"PipelineDeleteDialog.js","names":[],"sources":["../../../../src/bigconsole/components/pipeline/PipelineDeleteDialog.tsx"],"sourcesContent":["/**\n * PipelineDeleteDialog Component\n *\n * Confirmation dialog for deleting a Pipeline.\n * Shows warning about stages before deletion.\n *\n * BOFF-5635: this is a hand-rolled overlay (not fe-libs `Dialog`), so the\n * hierarchy work here is: a real `role=\"dialog\"` labelled by its heading, the\n * raw `bg-black/50` backdrop replaced with `--color-bg-overlay`, the stage-loss\n * warning promoted from a tinted paragraph to a `tone=\"warning\"` Section, and a\n * separated actions zone whose destructive commit reads as destructive.\n *\n * `aria-modal=\"true\"` hides the rest of the page from assistive tech, so this\n * overlay has to own the whole focus contract, not just the label:\n * - on open, focus moves to Cancel — the least-destructive control, so a\n * stray Enter/Space dismisses instead of deleting;\n * - Tab / Shift+Tab cycle inside the panel while it is open (the browser\n * still tabs into `aria-hidden` content otherwise);\n * - on close, focus returns to whatever opened the dialog;\n * - Escape still closes.\n *\n * It stays hand-rolled rather than migrating to the fe-libs `Dialog` /\n * `AlertDialog` primitives: those wrap Radix and would fix focus for free, but\n * their `DialogContent` ships `bg-bg-elevated`, `backdrop-blur-sm`, `p-6`,\n * `gap-4`, `sm:max-w-lg`, a close \"X\" and un-guarded `animate-in` / `zoom-in-95`\n * entry animation. That is a visual change and a new animation with no\n * `motion-safe` guard, and it would split this dialog from its two siblings\n * (WorkflowDeleteDialog, DataSinkDeleteDialog) which use exactly this markup.\n * The focus contract below is the same one Radix implements, scoped to this panel.\n */\n\nimport { memo, useCallback, useId, useRef } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Section } from '../common';\nimport { useModalFocusTrap } from '../../hooks/useModalFocusTrap';\nimport type { Pipeline } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface PipelineDeleteDialogProps {\n pipeline: Pipeline;\n isOpen: boolean;\n onClose: () => void;\n onConfirm: () => void | Promise<void>;\n}\n\n// ============================================================================\n// FOCUS TRAP HELPERS\n// ============================================================================\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst WarningIcon = ({ 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=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n);\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const PipelineDeleteDialog = memo(function PipelineDeleteDialog({\n pipeline,\n isOpen,\n onClose,\n onConfirm,\n}: PipelineDeleteDialogProps) {\n // Calculate stage count\n const stageCount = pipeline.stages?.length ?? 0;\n const titleId = useId();\n const descriptionId = useId();\n const panelRef = useRef<HTMLDivElement | null>(null);\n const cancelRef = useRef<HTMLButtonElement | null>(null);\n\n // Event handlers\n const handleBackdropClick = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const handleConfirmClick = useCallback(() => {\n onConfirm();\n }, [onConfirm]);\n\n useModalFocusTrap({ isOpen, panelRef, onClose, initialFocusRef: cancelRef });\n\n // Don't render if not open\n if (!isOpen) {\n return null;\n }\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n {/* Backdrop */}\n <div aria-hidden=\"true\" className=\"absolute inset-0 bg-[var(--color-bg-overlay)]\" onClick={handleBackdropClick} />\n\n {/* Dialog */}\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n tabIndex={-1}\n data-testid=\"pipeline-delete-dialog\"\n className=\"relative flex max-h-[calc(100dvh-2rem)] w-full max-w-md min-w-0 flex-col gap-form-gap overflow-y-auto rounded-card border border-[var(--color-border-subtle)] bg-bg-surface p-card-padding shadow-[var(--shadow-elevation-4)] focus:outline-none\"\n >\n {/* Header */}\n <div className=\"flex items-center gap-icon-gap\">\n <span aria-hidden=\"true\" className=\"rounded-pill bg-[var(--color-status-error-bgSubtle)] p-2\">\n <WarningIcon className=\"h-icon-md w-icon-md text-status-error-text\" />\n </span>\n <h2 id={titleId} className=\"text-lg font-semibold text-text-primary\">\n Delete Pipeline\n </h2>\n </div>\n\n {/* Content */}\n <div className=\"flex min-w-0 flex-col gap-form-gap\">\n <p id={descriptionId} className=\"text-sm text-text-secondary\">\n Are you sure you want to delete the pipeline{' '}\n <span className=\"font-medium text-text-primary\">{pipeline.name}</span>? This action cannot be undone.\n </p>\n\n {/* Warning about stages */}\n {stageCount > 0 && (\n <Section\n tone=\"warning\"\n padding=\"compact\"\n headingLevel={3}\n title={`${stageCount} stage${stageCount !== 1 ? 's' : ''} will be deleted`}\n icon={<WarningIcon className=\"h-icon-sm w-icon-sm\" />}\n data-testid=\"pipeline-delete-stage-warning\"\n >\n <p className=\"text-sm text-text-secondary\">\n Every stage in this pipeline is removed with it. The parsers themselves are not deleted.\n </p>\n </Section>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex flex-wrap justify-end gap-control-gap border-t border-[var(--color-border-subtle)] pt-form-gap\">\n <Button ref={cancelRef} type=\"button\" variant=\"secondary\" onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"button\" variant=\"destructive\" onClick={handleConfirmClick}>\n Delete Pipeline\n </Button>\n </div>\n </div>\n </div>\n );\n});\n\nexport default PipelineDeleteDialog;\n"],"mappings":";;;;;;;AAwDA,IAAM,KAAe,EAAE,mBACrB,kBAAC,OAAD;CAAgB;CAAW,MAAK;CAAO,QAAO;CAAe,SAAQ;WACnE,kBAAC,QAAD;EACE,eAAc;EACd,gBAAe;EACf,aAAa;EACb,GAAE;EACF,CAAA;CACE,CAAA,EAOK,IAAuB,EAAK,SAA8B,EACrE,aACA,WACA,YACA,gBAC4B;CAE5B,IAAM,IAAa,EAAS,QAAQ,UAAU,GACxC,IAAU,GAAO,EACjB,IAAgB,GAAO,EACvB,IAAW,EAA8B,KAAK,EAC9C,IAAY,EAAiC,KAAK,EAGlD,IAAsB,QAAkB;AAC5C,KAAS;IACR,CAAC,EAAQ,CAAC,EAEP,IAAqB,QAAkB;AAC3C,KAAW;IACV,CAAC,EAAU,CAAC;AASf,QAPA,EAAkB;EAAE;EAAQ;EAAU;EAAS,iBAAiB;EAAW,CAAC,EAGvE,IAKH,kBAAC,OAAD;EAAK,WAAU;YAAf,CAEE,kBAAC,OAAD;GAAK,eAAY;GAAO,WAAU;GAAgD,SAAS;GAAuB,CAAA,EAGlH,kBAAC,OAAD;GACE,KAAK;GACL,MAAK;GACL,cAAW;GACX,mBAAiB;GACjB,oBAAkB;GAClB,UAAU;GACV,eAAY;GACZ,WAAU;aARZ;IAWE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,QAAD;MAAM,eAAY;MAAO,WAAU;gBACjC,kBAAC,GAAD,EAAa,WAAU,8CAA+C,CAAA;MACjE,CAAA,EACP,kBAAC,MAAD;MAAI,IAAI;MAAS,WAAU;gBAA0C;MAEhE,CAAA,CACD;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,IAAI;MAAe,WAAU;gBAAhC;OAA8D;OACf;OAC7C,kBAAC,QAAD;QAAM,WAAU;kBAAiC,EAAS;QAAY,CAAA;;OACpE;SAGH,IAAa,KACZ,kBAAC,GAAD;MACE,MAAK;MACL,SAAQ;MACR,cAAc;MACd,OAAO,GAAG,EAAW,QAAQ,MAAe,IAAU,KAAN,IAAS;MACzD,MAAM,kBAAC,GAAD,EAAa,WAAU,uBAAwB,CAAA;MACrD,eAAY;gBAEZ,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAEvC,CAAA;MACI,CAAA,CAER;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAQ,KAAK;MAAW,MAAK;MAAS,SAAQ;MAAY,SAAS;gBAAS;MAEnE,CAAA,EACT,kBAAC,GAAD;MAAQ,MAAK;MAAS,SAAQ;MAAc,SAAS;gBAAoB;MAEhE,CAAA,CACL;;IACF;KACF;MA/DC;EAiET"}
|
|
@@ -4,29 +4,26 @@ import { jsx as t } from "react/jsx-runtime";
|
|
|
4
4
|
var n = {
|
|
5
5
|
draft: {
|
|
6
6
|
label: "Draft",
|
|
7
|
-
className: "bg-bg-sunken text-text-secondary"
|
|
7
|
+
className: "bg-bg-sunken text-text-secondary border-[var(--color-border-subtle)]"
|
|
8
8
|
},
|
|
9
9
|
active: {
|
|
10
10
|
label: "Active",
|
|
11
|
-
className: "bg-status-success-
|
|
11
|
+
className: "bg-[var(--color-status-success-bgSubtle)] text-status-success-text border-[var(--color-status-success-border)]"
|
|
12
12
|
},
|
|
13
13
|
inactive: {
|
|
14
14
|
label: "Inactive",
|
|
15
|
-
className: "bg-status-warning-
|
|
15
|
+
className: "bg-[var(--color-status-warning-bgSubtle)] text-[var(--color-status-warning-text)] border-[var(--color-status-warning-border)]"
|
|
16
16
|
},
|
|
17
17
|
error: {
|
|
18
18
|
label: "Error",
|
|
19
|
-
className: "bg-status-error-
|
|
19
|
+
className: "bg-[var(--color-status-error-bgSubtle)] text-status-error-text border-[var(--color-status-error-border)]"
|
|
20
20
|
}
|
|
21
21
|
}, r = e(function({ status: e, size: r = "md" }) {
|
|
22
22
|
let i = n[e] || n.draft;
|
|
23
23
|
return /* @__PURE__ */ t("span", {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
${r === "sm" ? "px-1.5 py-0.5 text-xs" : "px-2 py-1 text-xs"}
|
|
28
|
-
${i.className}
|
|
29
|
-
`,
|
|
24
|
+
"data-testid": "pipeline-status-badge",
|
|
25
|
+
"data-status": e,
|
|
26
|
+
className: `inline-flex shrink-0 items-center whitespace-nowrap rounded-pill border font-medium ${r === "sm" ? "px-2 py-0.5 text-xs" : "px-2.5 py-1 text-sm"} ${i.className}`,
|
|
30
27
|
children: i.label
|
|
31
28
|
});
|
|
32
29
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PipelineStatusBadge.js","names":[],"sources":["../../../../src/bigconsole/components/pipeline/PipelineStatusBadge.tsx"],"sourcesContent":["/**\n * PipelineStatusBadge Component\n *\n * Displays the status of a Pipeline with appropriate styling.\n */\n\nimport { memo } from 'react';\nimport type { PipelineStatus } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface PipelineStatusBadgeProps {\n status: PipelineStatus;\n size?: 'sm' | 'md';\n}\n\n// ============================================================================\n// STATUS CONFIG\n// ============================================================================\n\nconst STATUS_CONFIG: Record<PipelineStatus, { label: string; className: string }> = {\n draft: {\n label: 'Draft',\n className: 'bg-bg-sunken text-text-secondary',\n },\n active: {\n label: 'Active',\n className
|
|
1
|
+
{"version":3,"file":"PipelineStatusBadge.js","names":[],"sources":["../../../../src/bigconsole/components/pipeline/PipelineStatusBadge.tsx"],"sourcesContent":["/**\n * PipelineStatusBadge Component\n *\n * Displays the status of a Pipeline with appropriate styling.\n *\n * BOFF-5635: the fills used to be `bg-status-*-bg/10`, which is almost invisible\n * against `bg-bg-surface` — the chip carried no signal at a glance. Each status\n * now uses its own `bgSubtle` fill plus a matching border, and `md` steps up to\n * `text-sm` so the badge holds its own next to a page `h1`.\n */\n\nimport { memo } from 'react';\nimport type { PipelineStatus } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface PipelineStatusBadgeProps {\n status: PipelineStatus;\n size?: 'sm' | 'md';\n}\n\n// ============================================================================\n// STATUS CONFIG\n// ============================================================================\n\nconst STATUS_CONFIG: Record<PipelineStatus, { label: string; className: string }> = {\n draft: {\n label: 'Draft',\n className: 'bg-bg-sunken text-text-secondary border-[var(--color-border-subtle)]',\n },\n active: {\n label: 'Active',\n className:\n 'bg-[var(--color-status-success-bgSubtle)] text-status-success-text border-[var(--color-status-success-border)]',\n },\n inactive: {\n label: 'Inactive',\n className:\n 'bg-[var(--color-status-warning-bgSubtle)] text-[var(--color-status-warning-text)] border-[var(--color-status-warning-border)]',\n },\n error: {\n label: 'Error',\n className:\n 'bg-[var(--color-status-error-bgSubtle)] text-status-error-text border-[var(--color-status-error-border)]',\n },\n};\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const PipelineStatusBadge = memo(function PipelineStatusBadge({\n status,\n size = 'md',\n}: PipelineStatusBadgeProps) {\n const config = STATUS_CONFIG[status] || STATUS_CONFIG.draft;\n\n const sizeClasses = size === 'sm' ? 'px-2 py-0.5 text-xs' : 'px-2.5 py-1 text-sm';\n\n return (\n <span\n data-testid=\"pipeline-status-badge\"\n data-status={status}\n className={`inline-flex shrink-0 items-center whitespace-nowrap rounded-pill border font-medium ${sizeClasses} ${config.className}`}\n >\n {config.label}\n </span>\n );\n});\n\nexport default PipelineStatusBadge;\n"],"mappings":";;;AA2BA,IAAM,IAA8E;CAClF,OAAO;EACL,OAAO;EACP,WAAW;EACZ;CACD,QAAQ;EACN,OAAO;EACP,WACE;EACH;CACD,UAAU;EACR,OAAO;EACP,WACE;EACH;CACD,OAAO;EACL,OAAO;EACP,WACE;EACH;CACF,EAMY,IAAsB,EAAK,SAA6B,EACnE,WACA,UAAO,QACoB;CAC3B,IAAM,IAAS,EAAc,MAAW,EAAc;AAItD,QACE,kBAAC,QAAD;EACE,eAAY;EACZ,eAAa;EACb,WAAW,uFANK,MAAS,OAAO,wBAAwB,sBAMsD,GAAG,EAAO;YAEvH,EAAO;EACH,CAAA;EAET"}
|
|
@@ -8,20 +8,20 @@ import { useEffect as o, useRef as s, useState as c } from "react";
|
|
|
8
8
|
import { Spinner as l } from "@burdenoff/fe-libs/ui";
|
|
9
9
|
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
10
10
|
//#region src/bigconsole/components/preview/AiPreviewContent.tsx
|
|
11
|
-
var f = 4e3, p = 6e4;
|
|
12
|
-
function
|
|
11
|
+
var f = 4e3, p = 6e4, m = "flex min-h-[6rem] min-w-0 items-center justify-center gap-2 rounded-card bg-bg-sunken px-3 py-6 text-center text-sm text-text-muted";
|
|
12
|
+
function h({ label: e }) {
|
|
13
13
|
return /* @__PURE__ */ d("div", {
|
|
14
|
-
className:
|
|
15
|
-
children: [/* @__PURE__ */ u(l, { className: "size-4" }), e]
|
|
14
|
+
className: m,
|
|
15
|
+
children: [/* @__PURE__ */ u(l, { className: "size-4 shrink-0" }), e]
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
|
-
function
|
|
18
|
+
function g({ text: e }) {
|
|
19
19
|
return /* @__PURE__ */ u("p", {
|
|
20
|
-
className:
|
|
20
|
+
className: m,
|
|
21
21
|
children: e
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
|
-
function
|
|
24
|
+
function _(e, t, n) {
|
|
25
25
|
let [r, i] = c(null), [a, l] = c(!0), u = s(e);
|
|
26
26
|
return u.current = e, o(() => {
|
|
27
27
|
if (!t) {
|
|
@@ -44,50 +44,49 @@ function g(e, t, n) {
|
|
|
44
44
|
loading: a
|
|
45
45
|
};
|
|
46
46
|
}
|
|
47
|
-
function
|
|
48
|
-
let { getDataSinkData: i } = n({ skipFetch: !0 }), { data: a, loading: o } =
|
|
47
|
+
function v({ id: t, live: r }) {
|
|
48
|
+
let { getDataSinkData: i } = n({ skipFetch: !0 }), { data: a, loading: o } = _(async () => {
|
|
49
49
|
let e = await i({ id: t }, { limit: 50 });
|
|
50
50
|
return e ? e.raw : null;
|
|
51
51
|
}, t, r);
|
|
52
|
-
return t ? o ? /* @__PURE__ */ u(
|
|
52
|
+
return t ? o ? /* @__PURE__ */ u(h, { label: "Loading the data sink’s data…" }) : /* @__PURE__ */ u("div", {
|
|
53
53
|
"data-testid": "ai-preview-content-datasink",
|
|
54
|
+
className: "min-w-0",
|
|
54
55
|
children: /* @__PURE__ */ u(e, {
|
|
55
56
|
data: a,
|
|
56
57
|
maxHeight: "300px"
|
|
57
58
|
})
|
|
58
|
-
}) : /* @__PURE__ */ u(
|
|
59
|
+
}) : /* @__PURE__ */ u(g, { text: "Waiting for the data sink to be created…" });
|
|
59
60
|
}
|
|
60
|
-
function
|
|
61
|
+
function y({ dashboardId: e }) {
|
|
61
62
|
return e ? /* @__PURE__ */ u("div", {
|
|
62
63
|
"data-testid": "ai-preview-content-dashboard",
|
|
63
|
-
className: "
|
|
64
|
+
className: "min-w-0",
|
|
64
65
|
children: /* @__PURE__ */ u(a, {
|
|
65
66
|
dashboardId: e,
|
|
66
67
|
params: {}
|
|
67
68
|
})
|
|
68
|
-
}) : /* @__PURE__ */ u(
|
|
69
|
+
}) : /* @__PURE__ */ u(g, { text: "Waiting for the dashboard to be created…" });
|
|
69
70
|
}
|
|
70
|
-
function
|
|
71
|
-
let { executeParser: i } = r({ skipFetch: !0 }), { data: a, loading: o } =
|
|
71
|
+
function b({ parserId: t, live: n }) {
|
|
72
|
+
let { executeParser: i } = r({ skipFetch: !0 }), { data: a, loading: o } = _(async () => {
|
|
72
73
|
let e = await i(t ?? "");
|
|
73
74
|
return e ? e.output : null;
|
|
74
75
|
}, t, n);
|
|
75
|
-
return t ? o ? /* @__PURE__ */ u(
|
|
76
|
+
return t ? o ? /* @__PURE__ */ u(h, { label: "Running the parser…" }) : /* @__PURE__ */ u("div", {
|
|
76
77
|
"data-testid": "ai-preview-content-parser",
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
children: "Parser output (transformed rows):"
|
|
80
|
-
}), /* @__PURE__ */ u(e, {
|
|
78
|
+
className: "min-w-0",
|
|
79
|
+
children: /* @__PURE__ */ u(e, {
|
|
81
80
|
data: a,
|
|
82
81
|
maxHeight: "280px"
|
|
83
|
-
})
|
|
84
|
-
}) : /* @__PURE__ */ u(
|
|
82
|
+
})
|
|
83
|
+
}) : /* @__PURE__ */ u(g, { text: "No parser in this build — the rows were already shaped." });
|
|
85
84
|
}
|
|
86
|
-
function
|
|
85
|
+
function x(e) {
|
|
87
86
|
let t = e.toUpperCase();
|
|
88
|
-
return t.includes("METRIC") || t.includes("KPI") || t.includes("CARD") || t.includes("STAT") ?
|
|
87
|
+
return t.includes("METRIC") || t.includes("KPI") || t.includes("CARD") || t.includes("STAT") ? "min(160px, 40vh)" : t.includes("TABLE") || t.includes("LIST") ? "min(280px, 50vh)" : "min(320px, 50vh)";
|
|
89
88
|
}
|
|
90
|
-
function
|
|
89
|
+
function S({ dashboardId: e, live: n }) {
|
|
91
90
|
let { widgets: r, loading: a, refetch: c } = t(void 0, e, { skipFetch: !e }), l = s(c);
|
|
92
91
|
return l.current = c, o(() => {
|
|
93
92
|
if (!e) return;
|
|
@@ -95,12 +94,12 @@ function x({ dashboardId: e, live: n }) {
|
|
|
95
94
|
!n || Date.now() - t > p || typeof document < "u" && document.visibilityState !== "visible" || l.current();
|
|
96
95
|
}, f);
|
|
97
96
|
return () => window.clearInterval(r);
|
|
98
|
-
}, [e, n]), e ? a && r.length === 0 ? /* @__PURE__ */ u(
|
|
97
|
+
}, [e, n]), e ? a && r.length === 0 ? /* @__PURE__ */ u(h, { label: "Loading widgets…" }) : r.length === 0 ? /* @__PURE__ */ u(g, { text: "No widgets on this dashboard yet." }) : /* @__PURE__ */ u("div", {
|
|
99
98
|
"data-testid": "ai-preview-content-widget",
|
|
100
|
-
className: "
|
|
99
|
+
className: "flex min-w-0 flex-col gap-list-gap",
|
|
101
100
|
children: r.map((e) => /* @__PURE__ */ u("div", {
|
|
102
|
-
className: "overflow-hidden rounded-
|
|
103
|
-
style: { height:
|
|
101
|
+
className: "min-w-0 overflow-hidden rounded-card border border-[var(--color-border-subtle)] bg-bg-canvas",
|
|
102
|
+
style: { height: x(e.type) },
|
|
104
103
|
children: /* @__PURE__ */ u(i, {
|
|
105
104
|
widget: e,
|
|
106
105
|
isLoading: !1,
|
|
@@ -108,9 +107,9 @@ function x({ dashboardId: e, live: n }) {
|
|
|
108
107
|
filterValues: {}
|
|
109
108
|
})
|
|
110
109
|
}, e.id))
|
|
111
|
-
}) : /* @__PURE__ */ u(
|
|
110
|
+
}) : /* @__PURE__ */ u(g, { text: "Waiting for the dashboard — widgets live on it." });
|
|
112
111
|
}
|
|
113
112
|
//#endregion
|
|
114
|
-
export {
|
|
113
|
+
export { y as DashboardContent, v as DataSinkContent, b as ParserContent, S as WidgetsContent };
|
|
115
114
|
|
|
116
115
|
//# sourceMappingURL=AiPreviewContent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiPreviewContent.js","names":[],"sources":["../../../../src/bigconsole/components/preview/AiPreviewContent.tsx"],"sourcesContent":["/**\n * Live content renderers for the AI preview tabs.\n *\n * Each tab shows the REAL content of the entity the assistant just built —\n * the data sink's rows, the live dashboard, the parser's transformed output,\n * the rendered widget charts — not a list with an Open button. They reuse the\n * same components the real pages use (DataSinkTableViewer, DrilldownDashboard-\n * Renderer, WidgetWrapper) so what you see in the preview is what you get.\n *\n * These require Apollo + the BigConsole providers, which is why they live only\n * in the full AiPreviewPanel (mounted inside BigConsoleRoot), never in the\n * store-only app-shell mini panel.\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\n\nimport { DataSinkTableViewer } from '../datasink/DataSinkTableViewer';\nimport { DrilldownDashboardRenderer } from '../DrilldownDashboardRenderer';\nimport { WidgetWrapper } from '../widgets/WidgetWrapper';\nimport { useDataSinkOperations } from '../../hooks/useDataSinkOperations';\nimport { useParserOperations } from '../../hooks/useParserOperations';\nimport { useWidgetOperations } from '../../hooks/useWidgetOperations';\n\n/** While the build is live, re-pull content on this cadence so it fills in. */\nconst CONTENT_POLL_MS = 4000;\n/** Stop the live re-pull after this long even if the turn is still running. */\nconst CONTENT_POLL_WINDOW_MS = 60_000;\n\nfunction CenteredSpinner({ label }: { label: string }) {\n return (\n <div className=\"flex items-center gap-2 px-1 py-8 text-sm text-text-muted\">\n <Spinner className=\"size-4\" />\n {label}\n </div>\n );\n}\n\nfunction Waiting({ text }: { text: string }) {\n return <p className=\"px-1 py-8 text-sm text-text-muted\">{text}</p>;\n}\n\n/**\n * Fetch-on-mount, then re-fetch every CONTENT_POLL_MS while `live`, bounded to\n * CONTENT_POLL_WINDOW_MS. Returns { data, loading, done }. `fetcher` must be\n * stable-ish; we hold it in a ref so the effect keys only on `key`/`live`.\n */\nfunction useLiveContent<T>(fetcher: () => Promise<T | null>, key: string | undefined, live: boolean) {\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(true);\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n\n useEffect(() => {\n if (!key) {\n setLoading(false);\n return;\n }\n let cancelled = false;\n const startedAt = Date.now();\n const pull = async () => {\n const result = await fetcherRef.current();\n if (cancelled) return;\n if (result !== null && result !== undefined) setData(result);\n setLoading(false);\n };\n void pull();\n const intervalId = window.setInterval(() => {\n if (!live || Date.now() - startedAt > CONTENT_POLL_WINDOW_MS) return;\n if (typeof document !== 'undefined' && document.visibilityState !== 'visible') return;\n void pull();\n }, CONTENT_POLL_MS);\n return () => {\n cancelled = true;\n window.clearInterval(intervalId);\n };\n }, [key, live]);\n\n return { data, loading };\n}\n\nexport function DataSinkContent({ id, live }: { id?: string; live: boolean }) {\n const { getDataSinkData } = useDataSinkOperations({ skipFetch: true });\n const { data, loading } = useLiveContent(\n async () => {\n const res = await getDataSinkData({ id }, { limit: 50 });\n return res ? res.raw : null;\n },\n id,\n live\n );\n\n if (!id) return <Waiting text=\"Waiting for the data sink to be created…\" />;\n if (loading) return <CenteredSpinner label=\"Loading the data sink’s data…\" />;\n return (\n <div data-testid=\"ai-preview-content-datasink\">\n <DataSinkTableViewer data={data} maxHeight=\"300px\" />\n </div>\n );\n}\n\nexport function DashboardContent({ dashboardId }: { dashboardId?: string }) {\n if (!dashboardId) return <Waiting text=\"Waiting for the dashboard to be created…\" />;\n return (\n <div data-testid=\"ai-preview-content-dashboard\" className=\"max-h-[340px] overflow-y-auto\">\n <DrilldownDashboardRenderer dashboardId={dashboardId} params={{}} />\n </div>\n );\n}\n\nexport function ParserContent({ parserId, live }: { parserId?: string; live: boolean }) {\n const { executeParser } = useParserOperations({ skipFetch: true });\n const { data, loading } = useLiveContent(\n async () => {\n const res = await executeParser(parserId ?? '');\n return res ? res.output : null;\n },\n parserId,\n live\n );\n\n if (!parserId) return <Waiting text=\"No parser in this build — the rows were already shaped.\" />;\n if (loading) return <CenteredSpinner label=\"Running the parser…\" />;\n return (\n <div data-testid=\"ai-preview-content-parser\">\n <p className=\"mb-2 px-1 text-xs text-text-muted\">Parser output (transformed rows):</p>\n <DataSinkTableViewer data={data} maxHeight=\"280px\" />\n </div>\n );\n}\n\n/** Recharts needs a definite pixel height or it renders 0px tall. */\nfunction widgetBoxHeight(type: string): number {\n const t = type.toUpperCase();\n if (t.includes('METRIC') || t.includes('KPI') || t.includes('CARD') || t.includes('STAT')) return 160;\n if (t.includes('TABLE') || t.includes('LIST')) return 280;\n return 320;\n}\n\nexport function WidgetsContent({ dashboardId, live }: { dashboardId?: string; live: boolean }) {\n const { widgets, loading, refetch } = useWidgetOperations(undefined, dashboardId, {\n skipFetch: !dashboardId,\n });\n\n const refetchRef = useRef(refetch);\n refetchRef.current = refetch;\n useEffect(() => {\n if (!dashboardId) return;\n const startedAt = Date.now();\n const intervalId = window.setInterval(() => {\n if (!live || Date.now() - startedAt > CONTENT_POLL_WINDOW_MS) return;\n if (typeof document !== 'undefined' && document.visibilityState !== 'visible') return;\n void refetchRef.current();\n }, CONTENT_POLL_MS);\n return () => window.clearInterval(intervalId);\n }, [dashboardId, live]);\n\n if (!dashboardId) return <Waiting text=\"Waiting for the dashboard — widgets live on it.\" />;\n if (loading && widgets.length === 0) return <CenteredSpinner label=\"Loading widgets…\" />;\n if (widgets.length === 0) return <Waiting text=\"No widgets on this dashboard yet.\" />;\n\n return (\n <div data-testid=\"ai-preview-content-widget\" className=\"space-y-3\">\n {widgets.map((widget) => (\n <div\n key={widget.id}\n className=\"overflow-hidden rounded-md border border-border-subtle bg-bg-surface\"\n style={{ height: widgetBoxHeight(widget.type) }}\n >\n <WidgetWrapper widget={widget} isLoading={false} error={null} filterValues={{}} />\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AiPreviewContent.js","names":[],"sources":["../../../../src/bigconsole/components/preview/AiPreviewContent.tsx"],"sourcesContent":["/**\n * Live content renderers for the AI preview tabs.\n *\n * Each tab shows the REAL content of the entity the assistant just built —\n * the data sink's rows, the live dashboard, the parser's transformed output,\n * the rendered widget charts — not a list with an Open button. They reuse the\n * same components the real pages use (DataSinkTableViewer, DrilldownDashboard-\n * Renderer, WidgetWrapper) so what you see in the preview is what you get.\n *\n * These require Apollo + the BigConsole providers, which is why they live only\n * in the full AiPreviewPanel (mounted inside BigConsoleRoot), never in the\n * store-only app-shell mini panel.\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\n\nimport { DataSinkTableViewer } from '../datasink/DataSinkTableViewer';\nimport { DrilldownDashboardRenderer } from '../DrilldownDashboardRenderer';\nimport { WidgetWrapper } from '../widgets/WidgetWrapper';\nimport { useDataSinkOperations } from '../../hooks/useDataSinkOperations';\nimport { useParserOperations } from '../../hooks/useParserOperations';\nimport { useWidgetOperations } from '../../hooks/useWidgetOperations';\n\n/** While the build is live, re-pull content on this cadence so it fills in. */\nconst CONTENT_POLL_MS = 4000;\n/** Stop the live re-pull after this long even if the turn is still running. */\nconst CONTENT_POLL_WINDOW_MS = 60_000;\n\n/**\n * Loading and waiting states share one recessed, height-reserved block so the\n * panel does not jump every time a tab fills in — previously each tab had its\n * own bare paragraph and its own height.\n */\nconst PLACEHOLDER_BOX =\n 'flex min-h-[6rem] min-w-0 items-center justify-center gap-2 rounded-card bg-bg-sunken px-3 py-6 text-center text-sm text-text-muted';\n\nfunction CenteredSpinner({ label }: { label: string }) {\n return (\n <div className={PLACEHOLDER_BOX}>\n <Spinner className=\"size-4 shrink-0\" />\n {label}\n </div>\n );\n}\n\nfunction Waiting({ text }: { text: string }) {\n return <p className={PLACEHOLDER_BOX}>{text}</p>;\n}\n\n/**\n * Fetch-on-mount, then re-fetch every CONTENT_POLL_MS while `live`, bounded to\n * CONTENT_POLL_WINDOW_MS. Returns { data, loading, done }. `fetcher` must be\n * stable-ish; we hold it in a ref so the effect keys only on `key`/`live`.\n */\nfunction useLiveContent<T>(fetcher: () => Promise<T | null>, key: string | undefined, live: boolean) {\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(true);\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n\n useEffect(() => {\n if (!key) {\n setLoading(false);\n return;\n }\n let cancelled = false;\n const startedAt = Date.now();\n const pull = async () => {\n const result = await fetcherRef.current();\n if (cancelled) return;\n if (result !== null && result !== undefined) setData(result);\n setLoading(false);\n };\n void pull();\n const intervalId = window.setInterval(() => {\n if (!live || Date.now() - startedAt > CONTENT_POLL_WINDOW_MS) return;\n if (typeof document !== 'undefined' && document.visibilityState !== 'visible') return;\n void pull();\n }, CONTENT_POLL_MS);\n return () => {\n cancelled = true;\n window.clearInterval(intervalId);\n };\n }, [key, live]);\n\n return { data, loading };\n}\n\nexport function DataSinkContent({ id, live }: { id?: string; live: boolean }) {\n const { getDataSinkData } = useDataSinkOperations({ skipFetch: true });\n const { data, loading } = useLiveContent(\n async () => {\n const res = await getDataSinkData({ id }, { limit: 50 });\n return res ? res.raw : null;\n },\n id,\n live\n );\n\n if (!id) return <Waiting text=\"Waiting for the data sink to be created…\" />;\n if (loading) return <CenteredSpinner label=\"Loading the data sink’s data…\" />;\n return (\n <div data-testid=\"ai-preview-content-datasink\" className=\"min-w-0\">\n <DataSinkTableViewer data={data} maxHeight=\"300px\" />\n </div>\n );\n}\n\nexport function DashboardContent({ dashboardId }: { dashboardId?: string }) {\n if (!dashboardId) return <Waiting text=\"Waiting for the dashboard to be created…\" />;\n // No inner `max-h + overflow-y-auto`: the panel already owns a vertical\n // scroll, and nesting a second one put two scrollbars in ~440px of space.\n return (\n <div data-testid=\"ai-preview-content-dashboard\" className=\"min-w-0\">\n <DrilldownDashboardRenderer dashboardId={dashboardId} params={{}} />\n </div>\n );\n}\n\nexport function ParserContent({ parserId, live }: { parserId?: string; live: boolean }) {\n const { executeParser } = useParserOperations({ skipFetch: true });\n const { data, loading } = useLiveContent(\n async () => {\n const res = await executeParser(parserId ?? '');\n return res ? res.output : null;\n },\n parserId,\n live\n );\n\n if (!parserId) return <Waiting text=\"No parser in this build — the rows were already shaped.\" />;\n if (loading) return <CenteredSpinner label=\"Running the parser…\" />;\n // The \"Parser output (transformed rows)\" caption used to sit here; it now\n // lives on the section header, so the tab does not label itself twice.\n return (\n <div data-testid=\"ai-preview-content-parser\" className=\"min-w-0\">\n <DataSinkTableViewer data={data} maxHeight=\"280px\" />\n </div>\n );\n}\n\n/**\n * Recharts needs a definite height or it renders 0px tall, but a hard 320px box\n * eats a short viewport whole. `min(px, vh)` keeps the definite height Recharts\n * needs while letting the box shrink on small screens.\n */\nfunction widgetBoxHeight(type: string): string {\n const t = type.toUpperCase();\n if (t.includes('METRIC') || t.includes('KPI') || t.includes('CARD') || t.includes('STAT')) return 'min(160px, 40vh)';\n if (t.includes('TABLE') || t.includes('LIST')) return 'min(280px, 50vh)';\n return 'min(320px, 50vh)';\n}\n\nexport function WidgetsContent({ dashboardId, live }: { dashboardId?: string; live: boolean }) {\n const { widgets, loading, refetch } = useWidgetOperations(undefined, dashboardId, {\n skipFetch: !dashboardId,\n });\n\n const refetchRef = useRef(refetch);\n refetchRef.current = refetch;\n useEffect(() => {\n if (!dashboardId) return;\n const startedAt = Date.now();\n const intervalId = window.setInterval(() => {\n if (!live || Date.now() - startedAt > CONTENT_POLL_WINDOW_MS) return;\n if (typeof document !== 'undefined' && document.visibilityState !== 'visible') return;\n void refetchRef.current();\n }, CONTENT_POLL_MS);\n return () => window.clearInterval(intervalId);\n }, [dashboardId, live]);\n\n if (!dashboardId) return <Waiting text=\"Waiting for the dashboard — widgets live on it.\" />;\n if (loading && widgets.length === 0) return <CenteredSpinner label=\"Loading widgets…\" />;\n if (widgets.length === 0) return <Waiting text=\"No widgets on this dashboard yet.\" />;\n\n return (\n <div data-testid=\"ai-preview-content-widget\" className=\"flex min-w-0 flex-col gap-list-gap\">\n {widgets.map((widget) => (\n <div\n key={widget.id}\n // `border-border-subtle` is registered as a frozen light hex in this\n // shell, so the box kept a light border in dark mode.\n className=\"min-w-0 overflow-hidden rounded-card border border-[var(--color-border-subtle)] bg-bg-canvas\"\n style={{ height: widgetBoxHeight(widget.type) }}\n >\n <WidgetWrapper widget={widget} isLoading={false} error={null} filterValues={{}} />\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAwBA,IAAM,IAAkB,KAElB,IAAyB,KAOzB,IACJ;AAEF,SAAS,EAAgB,EAAE,YAA4B;AACrD,QACE,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,GAAD,EAAS,WAAU,mBAAoB,CAAA,EACtC,EACG;;;AAIV,SAAS,EAAQ,EAAE,WAA0B;AAC3C,QAAO,kBAAC,KAAD;EAAG,WAAW;YAAkB;EAAS,CAAA;;AAQlD,SAAS,EAAkB,GAAkC,GAAyB,GAAe;CACnG,IAAM,CAAC,GAAM,KAAW,EAAmB,KAAK,EAC1C,CAAC,GAAS,KAAc,EAAS,GAAK,EACtC,IAAa,EAAO,EAAQ;AA4BlC,QA3BA,EAAW,UAAU,GAErB,QAAgB;AACd,MAAI,CAAC,GAAK;AACR,KAAW,GAAM;AACjB;;EAEF,IAAI,IAAY,IACV,IAAY,KAAK,KAAK,EACtB,IAAO,YAAY;GACvB,IAAM,IAAS,MAAM,EAAW,SAAS;AACrC,SACA,KAAW,QAA8B,EAAQ,EAAO,EAC5D,EAAW,GAAM;;AAEd,KAAM;EACX,IAAM,IAAa,OAAO,kBAAkB;AACtC,IAAC,KAAQ,KAAK,KAAK,GAAG,IAAY,KAClC,OAAO,WAAa,OAAe,SAAS,oBAAoB,aAC/D,GAAM;KACV,EAAgB;AACnB,eAAa;AAEX,GADA,IAAY,IACZ,OAAO,cAAc,EAAW;;IAEjC,CAAC,GAAK,EAAK,CAAC,EAER;EAAE;EAAM;EAAS;;AAG1B,SAAgB,EAAgB,EAAE,OAAI,WAAwC;CAC5E,IAAM,EAAE,uBAAoB,EAAsB,EAAE,WAAW,IAAM,CAAC,EAChE,EAAE,SAAM,eAAY,EACxB,YAAY;EACV,IAAM,IAAM,MAAM,EAAgB,EAAE,OAAI,EAAE,EAAE,OAAO,IAAI,CAAC;AACxD,SAAO,IAAM,EAAI,MAAM;IAEzB,GACA,EACD;AAID,QAFK,IACD,IAAgB,kBAAC,GAAD,EAAiB,OAAM,iCAAkC,CAAA,GAE3E,kBAAC,OAAD;EAAK,eAAY;EAA8B,WAAU;YACvD,kBAAC,GAAD;GAA2B;GAAM,WAAU;GAAU,CAAA;EACjD,CAAA,GALQ,kBAAC,GAAD,EAAS,MAAK,4CAA6C,CAAA;;AAS7E,SAAgB,EAAiB,EAAE,kBAAyC;AAI1E,QAHK,IAIH,kBAAC,OAAD;EAAK,eAAY;EAA+B,WAAU;YACxD,kBAAC,GAAD;GAAyC;GAAa,QAAQ,EAAE;GAAI,CAAA;EAChE,CAAA,GANiB,kBAAC,GAAD,EAAS,MAAK,4CAA6C,CAAA;;AAUtF,SAAgB,EAAc,EAAE,aAAU,WAA8C;CACtF,IAAM,EAAE,qBAAkB,EAAoB,EAAE,WAAW,IAAM,CAAC,EAC5D,EAAE,SAAM,eAAY,EACxB,YAAY;EACV,IAAM,IAAM,MAAM,EAAc,KAAY,GAAG;AAC/C,SAAO,IAAM,EAAI,SAAS;IAE5B,GACA,EACD;AAMD,QAJK,IACD,IAAgB,kBAAC,GAAD,EAAiB,OAAM,uBAAwB,CAAA,GAIjE,kBAAC,OAAD;EAAK,eAAY;EAA4B,WAAU;YACrD,kBAAC,GAAD;GAA2B;GAAM,WAAU;GAAU,CAAA;EACjD,CAAA,GAPc,kBAAC,GAAD,EAAS,MAAK,2DAA4D,CAAA;;AAgBlG,SAAS,EAAgB,GAAsB;CAC7C,IAAM,IAAI,EAAK,aAAa;AAG5B,QAFI,EAAE,SAAS,SAAS,IAAI,EAAE,SAAS,MAAM,IAAI,EAAE,SAAS,OAAO,IAAI,EAAE,SAAS,OAAO,GAAS,qBAC9F,EAAE,SAAS,QAAQ,IAAI,EAAE,SAAS,OAAO,GAAS,qBAC/C;;AAGT,SAAgB,EAAe,EAAE,gBAAa,WAAiD;CAC7F,IAAM,EAAE,YAAS,YAAS,eAAY,EAAoB,KAAA,GAAW,GAAa,EAChF,WAAW,CAAC,GACb,CAAC,EAEI,IAAa,EAAO,EAAQ;AAiBlC,QAhBA,EAAW,UAAU,GACrB,QAAgB;AACd,MAAI,CAAC,EAAa;EAClB,IAAM,IAAY,KAAK,KAAK,EACtB,IAAa,OAAO,kBAAkB;AACtC,IAAC,KAAQ,KAAK,KAAK,GAAG,IAAY,KAClC,OAAO,WAAa,OAAe,SAAS,oBAAoB,aAC/D,EAAW,SAAS;KACxB,EAAgB;AACnB,eAAa,OAAO,cAAc,EAAW;IAC5C,CAAC,GAAa,EAAK,CAAC,EAElB,IACD,KAAW,EAAQ,WAAW,IAAU,kBAAC,GAAD,EAAiB,OAAM,oBAAqB,CAAA,GACpF,EAAQ,WAAW,IAAU,kBAAC,GAAD,EAAS,MAAK,qCAAsC,CAAA,GAGnF,kBAAC,OAAD;EAAK,eAAY;EAA4B,WAAU;YACpD,EAAQ,KAAK,MACZ,kBAAC,OAAD;GAIE,WAAU;GACV,OAAO,EAAE,QAAQ,EAAgB,EAAO,KAAK,EAAE;aAE/C,kBAAC,GAAD;IAAuB;IAAQ,WAAW;IAAO,OAAO;IAAM,cAAc,EAAE;IAAI,CAAA;GAC9E,EAPC,EAAO,GAOR,CACN;EACE,CAAA,GAjBiB,kBAAC,GAAD,EAAS,MAAK,mDAAoD,CAAA"}
|
|
@@ -1,133 +1,182 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { Section as e } from "../common/Section.js";
|
|
2
|
+
import "../common/index.js";
|
|
3
|
+
import { useAssistantRunStore as t } from "../../assistant/assistantRunStore.js";
|
|
4
|
+
import { PREVIEW_CHROME_DIVIDER as n, PREVIEW_PANEL_SHELL as r, StepRail as i, formatAgo as a, useAssistantSidebarWidth as o } from "./previewShared.js";
|
|
5
|
+
import { useEffect as s, useState as c } from "react";
|
|
6
|
+
import { AlertCircle as l, ArrowUpRight as u, Braces as d, Database as f, LayoutDashboard as p, Loader2 as m, Sparkles as h, X as g } from "lucide-react";
|
|
7
|
+
import { useI18n as _ } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
8
|
+
import { Button as v } from "@burdenoff/fe-libs/ui";
|
|
9
|
+
import { jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
7
10
|
//#region src/bigconsole/components/preview/AiPreviewMiniPanel.tsx
|
|
8
|
-
function
|
|
9
|
-
let
|
|
10
|
-
|
|
11
|
-
if (!
|
|
12
|
-
let e = window.setInterval(() =>
|
|
11
|
+
function x({ onNavigate: x }) {
|
|
12
|
+
let { t: S } = _(), C = t((e) => e.isRunning), w = t((e) => e.previewOpen), T = t((e) => e.hasRun), E = t((e) => e.richMounted), D = t((e) => e.steps), O = t((e) => e.entityIds), k = t((e) => e.caption), A = t((e) => e.error), j = t((e) => e.updatedAt), M = t((e) => e.openPreview), N = t((e) => e.closePreview), [P, F] = c(() => Date.now());
|
|
13
|
+
s(() => {
|
|
14
|
+
if (!C) return;
|
|
15
|
+
let e = window.setInterval(() => F(Date.now()), 1e3);
|
|
13
16
|
return () => window.clearInterval(e);
|
|
14
|
-
}, [
|
|
15
|
-
let
|
|
16
|
-
|
|
17
|
+
}, [C]);
|
|
18
|
+
let I = o(), L = (e) => {
|
|
19
|
+
x ? x(e) : typeof window < "u" && window.location.assign(e);
|
|
17
20
|
};
|
|
18
|
-
if (!
|
|
19
|
-
if (!
|
|
20
|
-
className: "flex justify-end px-4 pt-
|
|
21
|
-
style: { marginRight:
|
|
22
|
-
children: /* @__PURE__ */
|
|
21
|
+
if (!T || E) return null;
|
|
22
|
+
if (!w) return /* @__PURE__ */ b("div", {
|
|
23
|
+
className: "flex flex-wrap items-center justify-end gap-control-gap px-4 pt-3 md:px-6",
|
|
24
|
+
style: { marginRight: I },
|
|
25
|
+
children: [/* @__PURE__ */ y("span", {
|
|
26
|
+
className: "text-xs text-text-muted",
|
|
27
|
+
children: C ? "AI build running" : "AI build finished"
|
|
28
|
+
}), /* @__PURE__ */ b(v, {
|
|
23
29
|
size: "sm",
|
|
24
30
|
variant: "outline",
|
|
25
|
-
onClick:
|
|
31
|
+
onClick: M,
|
|
26
32
|
"data-testid": "ai-preview-open",
|
|
27
33
|
children: [
|
|
28
|
-
/* @__PURE__ */
|
|
29
|
-
"Preview",
|
|
30
|
-
|
|
34
|
+
/* @__PURE__ */ y(h, { className: "mr-1.5 size-4" }),
|
|
35
|
+
S("bigconsole.widget.aiPreviewMini.previewButton", "Preview"),
|
|
36
|
+
C ? /* @__PURE__ */ y(m, { className: "ml-1.5 size-3.5 animate-spin" }) : null
|
|
31
37
|
]
|
|
32
|
-
})
|
|
38
|
+
})]
|
|
33
39
|
});
|
|
34
|
-
let
|
|
35
|
-
return
|
|
40
|
+
let R = j ? Math.max(0, Math.floor((P - j) / 1e3)) : 0, z = [];
|
|
41
|
+
return O.datasink && z.push({
|
|
36
42
|
key: "datasink",
|
|
37
|
-
label: "Data Sink",
|
|
38
|
-
path: `/bigconsole/datasinks/${
|
|
39
|
-
|
|
43
|
+
label: S("bigconsole.widget.aiPreviewMini.link.dataSink", "Data Sink"),
|
|
44
|
+
path: `/bigconsole/datasinks/${O.datasink}`,
|
|
45
|
+
icon: /* @__PURE__ */ y(f, {
|
|
46
|
+
className: "size-4 shrink-0 text-text-muted",
|
|
47
|
+
"aria-hidden": "true"
|
|
48
|
+
})
|
|
49
|
+
}), O.dashboard && z.push({
|
|
40
50
|
key: "dashboard",
|
|
41
|
-
label: "Dashboard",
|
|
42
|
-
path: `/bigconsole/dashboards/${
|
|
43
|
-
|
|
51
|
+
label: S("bigconsole.widget.aiPreviewMini.link.dashboard", "Dashboard"),
|
|
52
|
+
path: `/bigconsole/dashboards/${O.dashboard}`,
|
|
53
|
+
icon: /* @__PURE__ */ y(p, {
|
|
54
|
+
className: "size-4 shrink-0 text-text-muted",
|
|
55
|
+
"aria-hidden": "true"
|
|
56
|
+
})
|
|
57
|
+
}), O.parser && z.push({
|
|
44
58
|
key: "parser",
|
|
45
|
-
label: "Parser",
|
|
46
|
-
path: `/bigconsole/parsers/${
|
|
47
|
-
|
|
59
|
+
label: S("bigconsole.widget.aiPreviewMini.link.parser", "Parser"),
|
|
60
|
+
path: `/bigconsole/parsers/${O.parser}`,
|
|
61
|
+
icon: /* @__PURE__ */ y(d, {
|
|
62
|
+
className: "size-4 shrink-0 text-text-muted",
|
|
63
|
+
"aria-hidden": "true"
|
|
64
|
+
})
|
|
65
|
+
}), /* @__PURE__ */ b("section", {
|
|
48
66
|
"data-testid": "ai-preview-panel",
|
|
49
67
|
"data-variant": "mini",
|
|
50
|
-
"aria-label": "AI preview",
|
|
51
|
-
style: { marginRight:
|
|
52
|
-
className:
|
|
68
|
+
"aria-label": S("bigconsole.widget.aiPreviewMini.ariaLabel", "AI preview"),
|
|
69
|
+
style: { marginRight: I ? I + 16 : void 0 },
|
|
70
|
+
className: `${r} mx-4 mt-3 mb-3 md:mx-6`,
|
|
53
71
|
children: [
|
|
54
|
-
/* @__PURE__ */
|
|
55
|
-
className:
|
|
56
|
-
children: [/* @__PURE__ */
|
|
57
|
-
className: "flex min-w-0
|
|
58
|
-
children: [
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
className: "
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
children: [/* @__PURE__ */
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
72
|
+
/* @__PURE__ */ b("div", {
|
|
73
|
+
className: `flex items-start justify-between gap-control-gap bg-bg-surface px-3 py-2 ${n}`,
|
|
74
|
+
children: [/* @__PURE__ */ b("div", {
|
|
75
|
+
className: "flex min-w-0 flex-col gap-0.5",
|
|
76
|
+
children: [/* @__PURE__ */ b("div", {
|
|
77
|
+
className: "flex min-w-0 flex-wrap items-center gap-2",
|
|
78
|
+
children: [
|
|
79
|
+
/* @__PURE__ */ y(h, { className: "size-4 shrink-0 text-action-primary-bg" }),
|
|
80
|
+
/* @__PURE__ */ y("h2", {
|
|
81
|
+
className: "text-sm font-semibold text-text-primary",
|
|
82
|
+
children: S("bigconsole.widget.aiPreviewMini.title", "AI Preview")
|
|
83
|
+
}),
|
|
84
|
+
C ? /* @__PURE__ */ b("span", {
|
|
85
|
+
className: "inline-flex items-center gap-1.5 rounded-full bg-status-success-bg px-2 py-0.5 text-[11px] font-semibold uppercase tracking-wide text-status-success-text",
|
|
86
|
+
"data-testid": "ai-preview-live",
|
|
87
|
+
children: [/* @__PURE__ */ b("span", {
|
|
88
|
+
className: "relative flex size-2",
|
|
89
|
+
children: [/* @__PURE__ */ y("span", { className: "absolute inline-flex size-full rounded-full bg-status-success-text opacity-75 motion-safe:animate-ping" }), /* @__PURE__ */ y("span", { className: "relative inline-flex size-2 rounded-full bg-status-success-text" })]
|
|
90
|
+
}), S("bigconsole.widget.aiPreviewMini.live", "Live")]
|
|
91
|
+
}) : null
|
|
92
|
+
]
|
|
93
|
+
}), /* @__PURE__ */ b("span", {
|
|
94
|
+
className: "min-w-0 break-words text-xs text-text-muted",
|
|
95
|
+
"data-testid": "ai-preview-ago",
|
|
96
|
+
children: [
|
|
97
|
+
C ? k || S("bigconsole.widget.aiPreviewMini.working", "Working…") : A ? S("bigconsole.widget.aiPreviewMini.stopped", "Stopped") : S("bigconsole.widget.aiPreviewMini.done", "Done"),
|
|
98
|
+
" ",
|
|
99
|
+
"· ",
|
|
100
|
+
S("bigconsole.widget.aiPreviewMini.updated", "updated"),
|
|
101
|
+
" ",
|
|
102
|
+
a(R)
|
|
103
|
+
]
|
|
104
|
+
})]
|
|
105
|
+
}), /* @__PURE__ */ y(v, {
|
|
84
106
|
size: "sm",
|
|
85
107
|
variant: "ghost",
|
|
86
|
-
onClick:
|
|
87
|
-
"aria-label": "Close preview",
|
|
108
|
+
onClick: N,
|
|
109
|
+
"aria-label": S("bigconsole.widget.aiPreviewMini.closeAriaLabel", "Close preview"),
|
|
88
110
|
"data-testid": "ai-preview-close",
|
|
89
|
-
children: /* @__PURE__ */
|
|
111
|
+
children: /* @__PURE__ */ y(g, { className: "size-4" })
|
|
90
112
|
})]
|
|
91
113
|
}),
|
|
92
|
-
/* @__PURE__ */
|
|
93
|
-
className:
|
|
94
|
-
children: /* @__PURE__ */
|
|
114
|
+
/* @__PURE__ */ b("div", {
|
|
115
|
+
className: `px-3 py-2 ${n}`,
|
|
116
|
+
children: [/* @__PURE__ */ y("h3", {
|
|
117
|
+
className: "mb-1 text-[11px] font-semibold uppercase tracking-wide text-text-muted",
|
|
118
|
+
children: "Build progress"
|
|
119
|
+
}), /* @__PURE__ */ y(i, { steps: D })]
|
|
95
120
|
}),
|
|
96
|
-
/* @__PURE__ */
|
|
97
|
-
className: "
|
|
98
|
-
children:
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
121
|
+
/* @__PURE__ */ y("div", {
|
|
122
|
+
className: "p-3",
|
|
123
|
+
children: /* @__PURE__ */ b(e, {
|
|
124
|
+
emphasis: "standard",
|
|
125
|
+
padding: "compact",
|
|
126
|
+
headingLevel: 3,
|
|
127
|
+
title: "Built so far",
|
|
128
|
+
description: "Open any piece to see the real thing.",
|
|
129
|
+
bodyClassName: "flex flex-col gap-list-gap",
|
|
130
|
+
children: [z.length === 0 ? /* @__PURE__ */ y("p", {
|
|
131
|
+
className: "text-sm text-text-muted",
|
|
132
|
+
children: C ? S("bigconsole.widget.aiPreviewMini.building", "Building… links appear here as each piece is created.") : S("bigconsole.widget.aiPreviewMini.nothingBuilt", "Nothing built yet.")
|
|
133
|
+
}) : z.map((e) => /* @__PURE__ */ b("div", {
|
|
134
|
+
"data-testid": "ai-preview-row",
|
|
135
|
+
className: "flex min-w-0 items-center justify-between gap-control-gap rounded-card border border-[var(--color-border-subtle)] bg-bg-canvas px-3 py-2",
|
|
136
|
+
children: [/* @__PURE__ */ b("p", {
|
|
137
|
+
className: "flex min-w-0 items-center gap-icon-gap text-sm font-medium text-text-primary",
|
|
138
|
+
children: [e.icon, /* @__PURE__ */ y("span", {
|
|
139
|
+
className: "truncate",
|
|
140
|
+
children: S("bigconsole.widget.aiPreviewMini.linkReady", "{{label}} ready", { label: e.label })
|
|
141
|
+
})]
|
|
142
|
+
}), /* @__PURE__ */ b(v, {
|
|
143
|
+
size: "sm",
|
|
144
|
+
variant: "ghost",
|
|
145
|
+
onClick: () => L(e.path),
|
|
146
|
+
children: [S("bigconsole.widget.aiPreviewMini.open", "Open"), /* @__PURE__ */ y(u, { className: "ml-1 size-3.5" })]
|
|
147
|
+
})]
|
|
148
|
+
}, e.key)), O.dashboard ? /* @__PURE__ */ b(v, {
|
|
108
149
|
size: "sm",
|
|
109
|
-
variant: "
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
className: "w-full",
|
|
117
|
-
"data-testid": "ai-preview-open-in-bigconsole",
|
|
118
|
-
onClick: () => O(`/bigconsole/dashboards/${y.dashboard ?? ""}`),
|
|
119
|
-
children: ["Open in BigConsole for the live view", /* @__PURE__ */ d(o, { className: "ml-1 size-3.5" })]
|
|
120
|
-
}) : null]
|
|
150
|
+
variant: "outline",
|
|
151
|
+
className: "h-auto w-full whitespace-normal py-1.5 text-center",
|
|
152
|
+
"data-testid": "ai-preview-open-in-bigconsole",
|
|
153
|
+
onClick: () => L(`/bigconsole/dashboards/${O.dashboard ?? ""}`),
|
|
154
|
+
children: [S("bigconsole.widget.aiPreviewMini.openInBigConsole", "Open in BigConsole for the live view"), /* @__PURE__ */ y(u, { className: "ml-1 size-3.5" })]
|
|
155
|
+
}) : null]
|
|
156
|
+
})
|
|
121
157
|
}),
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
children:
|
|
158
|
+
A ? /* @__PURE__ */ b("div", {
|
|
159
|
+
role: "alert",
|
|
160
|
+
className: "border-t border-[var(--color-status-error-border)] bg-[var(--color-status-error-bgSubtle)] px-3 py-2",
|
|
161
|
+
children: [/* @__PURE__ */ y("h3", {
|
|
162
|
+
className: "text-[11px] font-semibold uppercase tracking-wide text-[var(--color-status-error-text)]",
|
|
163
|
+
children: "Build stopped"
|
|
164
|
+
}), /* @__PURE__ */ b("p", {
|
|
165
|
+
className: "mt-0.5 flex items-start gap-icon-gap text-xs text-[var(--color-status-error-text)]",
|
|
166
|
+
"data-testid": "ai-preview-error",
|
|
167
|
+
children: [/* @__PURE__ */ y(l, {
|
|
168
|
+
className: "mt-0.5 size-3.5 shrink-0",
|
|
169
|
+
"aria-hidden": "true"
|
|
170
|
+
}), /* @__PURE__ */ y("span", {
|
|
171
|
+
className: "min-w-0 break-words",
|
|
172
|
+
children: A
|
|
173
|
+
})]
|
|
174
|
+
})]
|
|
126
175
|
}) : null
|
|
127
176
|
]
|
|
128
177
|
});
|
|
129
178
|
}
|
|
130
179
|
//#endregion
|
|
131
|
-
export {
|
|
180
|
+
export { x as default };
|
|
132
181
|
|
|
133
182
|
//# sourceMappingURL=AiPreviewMiniPanel.js.map
|