@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.
- 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 +135 -97
- 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 +209 -193
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js +213 -231
- 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 +109 -102
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +81 -70
- 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 +25 -23
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +3 -3
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +5 -3
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +170 -284
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +147 -151
- 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/SavedViewsDropdown/SavedViewsDropdown.js +17 -8
- package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.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/TemplateSetupBanner.js +26 -58
- package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js.map +1 -1
- package/dist/bigconsole/components/dashboard/WidgetPalette.js +307 -231
- package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
- package/dist/bigconsole/components/datasink/CacheTTLSelector.js +29 -29
- 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 -56
- package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +75 -65
- 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/ImportDataSinkDialog.js +263 -243
- 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 +33 -26
- 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 +154 -123
- 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 +235 -275
- 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 +191 -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 -106
- package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js.map +1 -1
- package/dist/bigconsole/components/preview/AiPreviewPanel.js +193 -152
- 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 +342 -308
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +262 -238
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/PropertiesPanel.js +783 -867
- 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/WidgetRegistry.js +4 -4
- package/dist/bigconsole/components/widgets/WidgetRegistry.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 +2 -2
- package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/chart/ChartConfig.js +11 -5
- package/dist/bigconsole/components/widgets/chart/ChartConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/comments/WidgetComments.js +19 -15
- package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
- package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +154 -102
- package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js.map +1 -1
- package/dist/bigconsole/components/widgets/gauge/CircularGauge.js +36 -32
- package/dist/bigconsole/components/widgets/gauge/CircularGauge.js.map +1 -1
- package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +85 -60
- package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js +64 -35
- package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/gauge/LinearGauge.js +46 -45
- package/dist/bigconsole/components/widgets/gauge/LinearGauge.js.map +1 -1
- package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +35 -24
- 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 +4 -4
- package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js +153 -90
- package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/list/ListConfig.js +8 -2
- 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 +14 -4
- package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js +112 -89
- package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +21 -13
- package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/index.js +4 -4
- package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +3 -3
- package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +34 -25
- package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/progress/ProgressWidget.js +129 -114
- package/dist/bigconsole/components/widgets/progress/ProgressWidget.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 +10 -4
- 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/utils/targetProgress.js +13 -0
- package/dist/bigconsole/components/widgets/utils/targetProgress.js.map +1 -0
- package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +112 -85
- 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 +6 -4
- package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js.map +1 -1
- package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +360 -338
- 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 +209 -203
- package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardViewPage.js +126 -120
- package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardsPage.js +838 -800
- package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
- package/dist/bigconsole/pages/DataParsersPage.js +263 -315
- package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkBuilderPage.js +301 -341
- package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkViewPage.js +346 -339
- 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 +7 -2
- 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 +887 -740
- package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserBuilderPage.js +679 -637
- package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserViewPage.js +368 -342
- package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineBuilderPage.js +537 -444
- package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineViewPage.js +412 -377
- package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelinesPage.js +248 -298
- package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
- package/dist/bigconsole/pages/WidgetDemoPage.js +251 -153
- package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowViewPage.js +381 -371
- package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowsPage.js +171 -286
- package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataSinkStatusBadge.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkStatusBadge.tsx"],"sourcesContent":["/**\n * DataSink Status Badge\n *\n * Display badge showing DataSink status with icon and color coding.\n */\n\nimport { memo, type ReactNode } from 'react';\nimport type { DataSinkStatus } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkStatusBadgeProps {\n /** DataSink status */\n status: DataSinkStatus;\n /** Badge size */\n size?: 'sm' | 'md' | 'lg';\n /** Whether to show icon */\n showIcon?: boolean;\n}\n\ninterface StatusConfig {\n bg: string;\n text: string;\n icon: ReactNode;\n label: string;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkStatusBadge = memo(function DataSinkStatusBadge({\n status,\n size = 'md',\n showIcon = true,\n}: DataSinkStatusBadgeProps) {\n const sizeClasses: Record<string, string> = {\n sm: 'px-2 py-0.5 text-xs',\n md: 'px-2.5 py-1 text-sm',\n lg: 'px-3 py-1.5 text-base',\n };\n\n const iconSizes: Record<string, string> = {\n sm: 'w-3 h-3',\n md: 'w-4 h-4',\n lg: 'w-5 h-5',\n };\n\n const statusConfigs: Record<DataSinkStatus, StatusConfig> = {\n ready: {\n bg: 'bg-status-success-bg/10',\n text: 'text-status-success-text',\n icon: (\n <svg className={iconSizes[size]} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n ),\n label: 'Ready',\n },\n error: {\n bg: 'bg-status-error-bg/10',\n text: 'text-status-error-text',\n icon: (\n <svg className={iconSizes[size]} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n ),\n label: 'Error',\n },\n stale: {\n bg: 'bg-status-warning-bg/10',\n text: 'text-status-warning-text',\n icon: (\n <svg className={iconSizes[size]} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n ),\n label: 'Stale',\n },\n refreshing: {\n bg: 'bg-action-primary-bg/10',\n text: 'text-action-primary-bg',\n icon: (\n <svg className={`${iconSizes[size]} animate-spin`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\n />\n </svg>\n ),\n label: 'Refreshing',\n },\n };\n\n const config = statusConfigs[status];\n\n if (!config) {\n return null;\n }\n\n return (\n <span\n className={`\n inline-flex items-center gap-1.5\n ${sizeClasses[size]}\n ${config.bg}\n ${config.text}\n rounded-full\n font-medium\n `}\n >\n {showIcon && config.icon}\n <span>{config.label}</span>\n </span>\n );\n});\n\nexport default DataSinkStatusBadge;\n"],"mappings":";;;AAiCA,IAAa,IAAsB,EAAK,SAA6B,EACnE,WACA,UAAO,MACP,cAAW,MACgB;CAC3B,IAAM,IAAsC;EAC1C,IAAI;EACJ,IAAI;EACJ,IAAI;EACL,EAEK,IAAoC;EACxC,IAAI;EACJ,IAAI;EACJ,IAAI;EACL,EA4DK,IA1DsD;EAC1D,OAAO;GACL,IAAI;GACJ,MAAM;GACN,MACE,kBAAC,OAAD;IAAK,WAAW,EAAU;IAAO,MAAK;IAAO,QAAO;IAAe,SAAQ;cACzE,kBAAC,QAAD;KAAM,eAAc;KAAQ,gBAAe;KAAQ,aAAa;KAAG,GAAE;KAAmB,CAAA;IACpF,CAAA;GAER,OAAO;GACR;EACD,OAAO;GACL,IAAI;GACJ,MAAM;GACN,MACE,kBAAC,OAAD;IAAK,WAAW,EAAU;IAAO,MAAK;IAAO,QAAO;IAAe,SAAQ;cACzE,kBAAC,QAAD;KACE,eAAc;KACd,gBAAe;KACf,aAAa;KACb,GAAE;KACF,CAAA;IACE,CAAA;GAER,OAAO;GACR;EACD,OAAO;GACL,IAAI;GACJ,MAAM;GACN,MACE,kBAAC,OAAD;IAAK,WAAW,EAAU;IAAO,MAAK;IAAO,QAAO;IAAe,SAAQ;cACzE,kBAAC,QAAD;KACE,eAAc;KACd,gBAAe;KACf,aAAa;KACb,GAAE;KACF,CAAA;IACE,CAAA;GAER,OAAO;GACR;EACD,YAAY;GACV,IAAI;GACJ,MAAM;GACN,MACE,kBAAC,OAAD;IAAK,WAAW,GAAG,EAAU,GAAM;IAAgB,MAAK;IAAO,QAAO;IAAe,SAAQ;cAC3F,kBAAC,QAAD;KACE,eAAc;KACd,gBAAe;KACf,aAAa;KACb,GAAE;KACF,CAAA;IACE,CAAA;GAER,OAAO;GACR;EACF,CAE4B;AAM7B,QAJK,IAKH,kBAAC,QAAD;EACE,WAAW;;UAEP,EAAY,GAAM;UAClB,EAAO,GAAG;UACV,EAAO,KAAK;;;;YALlB,CAUG,KAAY,EAAO,MACpB,kBAAC,QAAD,EAAA,UAAO,EAAO,OAAa,CAAA,CACtB;MAhBA;EAkBT"}
|
|
1
|
+
{"version":3,"file":"DataSinkStatusBadge.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkStatusBadge.tsx"],"sourcesContent":["/**\n * DataSink Status Badge\n *\n * Display badge showing DataSink status with icon and color coding.\n */\n\nimport { memo, type ReactNode } from 'react';\nimport type { DataSinkStatus } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface DataSinkStatusBadgeProps {\n /** DataSink status */\n status: DataSinkStatus;\n /** Badge size */\n size?: 'sm' | 'md' | 'lg';\n /** Whether to show icon */\n showIcon?: boolean;\n}\n\ninterface StatusConfig {\n bg: string;\n text: string;\n icon: ReactNode;\n label: string;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkStatusBadge = memo(function DataSinkStatusBadge({\n status,\n size = 'md',\n showIcon = true,\n}: DataSinkStatusBadgeProps) {\n const sizeClasses: Record<string, string> = {\n sm: 'px-2 py-0.5 text-xs',\n md: 'px-2.5 py-1 text-sm',\n lg: 'px-3 py-1.5 text-base',\n };\n\n const iconSizes: Record<string, string> = {\n sm: 'w-3 h-3',\n md: 'w-4 h-4',\n lg: 'w-5 h-5',\n };\n\n const statusConfigs: Record<DataSinkStatus, StatusConfig> = {\n ready: {\n bg: 'bg-status-success-bg/10',\n text: 'text-status-success-text',\n icon: (\n <svg className={iconSizes[size]} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n ),\n label: 'Ready',\n },\n error: {\n bg: 'bg-status-error-bg/10',\n text: 'text-status-error-text',\n icon: (\n <svg className={iconSizes[size]} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n ),\n label: 'Error',\n },\n stale: {\n bg: 'bg-status-warning-bg/10',\n text: 'text-[var(--color-status-warning-text)]',\n icon: (\n <svg className={iconSizes[size]} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n ),\n label: 'Stale',\n },\n refreshing: {\n bg: 'bg-action-primary-bg/10',\n text: 'text-action-primary-bg',\n icon: (\n <svg className={`${iconSizes[size]} animate-spin`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\n />\n </svg>\n ),\n label: 'Refreshing',\n },\n };\n\n const config = statusConfigs[status];\n\n if (!config) {\n return null;\n }\n\n return (\n <span\n className={`\n inline-flex items-center gap-1.5\n ${sizeClasses[size]}\n ${config.bg}\n ${config.text}\n rounded-full\n font-medium\n `}\n >\n {showIcon && config.icon}\n <span>{config.label}</span>\n </span>\n );\n});\n\nexport default DataSinkStatusBadge;\n"],"mappings":";;;AAiCA,IAAa,IAAsB,EAAK,SAA6B,EACnE,WACA,UAAO,MACP,cAAW,MACgB;CAC3B,IAAM,IAAsC;EAC1C,IAAI;EACJ,IAAI;EACJ,IAAI;EACL,EAEK,IAAoC;EACxC,IAAI;EACJ,IAAI;EACJ,IAAI;EACL,EA4DK,IA1DsD;EAC1D,OAAO;GACL,IAAI;GACJ,MAAM;GACN,MACE,kBAAC,OAAD;IAAK,WAAW,EAAU;IAAO,MAAK;IAAO,QAAO;IAAe,SAAQ;cACzE,kBAAC,QAAD;KAAM,eAAc;KAAQ,gBAAe;KAAQ,aAAa;KAAG,GAAE;KAAmB,CAAA;IACpF,CAAA;GAER,OAAO;GACR;EACD,OAAO;GACL,IAAI;GACJ,MAAM;GACN,MACE,kBAAC,OAAD;IAAK,WAAW,EAAU;IAAO,MAAK;IAAO,QAAO;IAAe,SAAQ;cACzE,kBAAC,QAAD;KACE,eAAc;KACd,gBAAe;KACf,aAAa;KACb,GAAE;KACF,CAAA;IACE,CAAA;GAER,OAAO;GACR;EACD,OAAO;GACL,IAAI;GACJ,MAAM;GACN,MACE,kBAAC,OAAD;IAAK,WAAW,EAAU;IAAO,MAAK;IAAO,QAAO;IAAe,SAAQ;cACzE,kBAAC,QAAD;KACE,eAAc;KACd,gBAAe;KACf,aAAa;KACb,GAAE;KACF,CAAA;IACE,CAAA;GAER,OAAO;GACR;EACD,YAAY;GACV,IAAI;GACJ,MAAM;GACN,MACE,kBAAC,OAAD;IAAK,WAAW,GAAG,EAAU,GAAM;IAAgB,MAAK;IAAO,QAAO;IAAe,SAAQ;cAC3F,kBAAC,QAAD;KACE,eAAc;KACd,gBAAe;KACf,aAAa;KACb,GAAE;KACF,CAAA;IACE,CAAA;GAER,OAAO;GACR;EACF,CAE4B;AAM7B,QAJK,IAKH,kBAAC,QAAD;EACE,WAAW;;UAEP,EAAY,GAAM;UAClB,EAAO,GAAG;UACV,EAAO,KAAK;;;;YALlB,CAUG,KAAY,EAAO,MACpB,kBAAC,QAAD,EAAA,UAAO,EAAO,OAAa,CAAA,CACtB;MAhBA;EAkBT"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import "../common/sectionStyles.js";
|
|
2
|
+
import "../common/index.js";
|
|
1
3
|
import { memo as e, useCallback as t, useMemo as n, useState as r } from "react";
|
|
2
4
|
import { ChevronLeft as i, ChevronRight as a, ChevronsLeft as o, ChevronsRight as s, Settings2 as c, X as l } from "lucide-react";
|
|
3
5
|
import { Button as u } from "@burdenoff/fe-libs/ui";
|
|
@@ -58,13 +60,13 @@ var w = e(function({ data: e, maxHeight: w = "400px" }) {
|
|
|
58
60
|
O(null), A(!1);
|
|
59
61
|
}, []);
|
|
60
62
|
return j.length === 0 ? /* @__PURE__ */ d("div", {
|
|
61
|
-
className: "flex items-center justify-center p-8 text-text-
|
|
63
|
+
className: "flex items-center justify-center p-8 text-center text-sm text-text-secondary",
|
|
62
64
|
children: "No tabular data available. Data must be an array of objects for table view."
|
|
63
65
|
}) : /* @__PURE__ */ f("div", {
|
|
64
|
-
className: "relative",
|
|
66
|
+
className: "relative min-w-0",
|
|
65
67
|
children: [
|
|
66
68
|
/* @__PURE__ */ f("div", {
|
|
67
|
-
className: "flex items-center justify-between
|
|
69
|
+
className: "mb-control-gap flex flex-wrap items-center justify-between gap-control-gap",
|
|
68
70
|
children: [/* @__PURE__ */ f("span", {
|
|
69
71
|
className: "text-xs text-text-secondary",
|
|
70
72
|
children: [
|
|
@@ -73,38 +75,37 @@ var w = e(function({ data: e, maxHeight: w = "400px" }) {
|
|
|
73
75
|
N.length,
|
|
74
76
|
" columns"
|
|
75
77
|
]
|
|
76
|
-
}), /* @__PURE__ */ d(
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
children: /* @__PURE__ */ d(c, { className: "w-4 h-4" })
|
|
83
|
-
})
|
|
78
|
+
}), /* @__PURE__ */ d(u, {
|
|
79
|
+
variant: "ghost",
|
|
80
|
+
size: "sm",
|
|
81
|
+
onClick: () => A((e) => !e),
|
|
82
|
+
"aria-label": "Select columns",
|
|
83
|
+
children: /* @__PURE__ */ d(c, { className: "w-4 h-4" })
|
|
84
84
|
})]
|
|
85
85
|
}),
|
|
86
86
|
k && /* @__PURE__ */ f("div", {
|
|
87
|
-
className: "absolute right-0 top-10 z-10
|
|
87
|
+
className: "absolute right-0 top-10 z-10 max-h-[300px] w-56 max-w-[calc(100vw-2rem)] overflow-auto rounded-card border border-[var(--color-border-subtle)] bg-bg-surface p-3 shadow-[var(--shadow-elevation-2)]",
|
|
88
88
|
children: [/* @__PURE__ */ f("div", {
|
|
89
|
-
className: "flex items-center justify-between
|
|
89
|
+
className: "mb-2 flex items-center justify-between gap-control-gap",
|
|
90
90
|
children: [/* @__PURE__ */ d("span", {
|
|
91
91
|
className: "text-xs font-medium text-text-primary",
|
|
92
|
-
children: "Select
|
|
92
|
+
children: "Select columns"
|
|
93
93
|
}), /* @__PURE__ */ d(u, {
|
|
94
94
|
variant: "ghost",
|
|
95
95
|
size: "sm",
|
|
96
96
|
onClick: L,
|
|
97
|
+
"aria-label": "Reset columns",
|
|
97
98
|
children: /* @__PURE__ */ d(l, { className: "w-3 h-3" })
|
|
98
99
|
})]
|
|
99
100
|
}), /* @__PURE__ */ d("div", {
|
|
100
101
|
className: "space-y-1",
|
|
101
102
|
children: M.map((e) => /* @__PURE__ */ f("label", {
|
|
102
|
-
className: "flex items-center gap-2 text-xs text-text-secondary hover:text-text-primary
|
|
103
|
+
className: "flex min-h-[var(--size-controlHeight-md)] cursor-pointer items-center gap-2 text-xs text-text-secondary hover:text-text-primary",
|
|
103
104
|
children: [/* @__PURE__ */ d("input", {
|
|
104
105
|
type: "checkbox",
|
|
105
106
|
checked: !D || D.includes(e.key),
|
|
106
107
|
onChange: () => I(e.key),
|
|
107
|
-
className: "rounded border-border-default"
|
|
108
|
+
className: "rounded border-[var(--color-border-default)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-bg-surface"
|
|
108
109
|
}), /* @__PURE__ */ d("span", {
|
|
109
110
|
className: "truncate",
|
|
110
111
|
title: e.key,
|
|
@@ -114,7 +115,7 @@ var w = e(function({ data: e, maxHeight: w = "400px" }) {
|
|
|
114
115
|
})]
|
|
115
116
|
}),
|
|
116
117
|
/* @__PURE__ */ d("div", {
|
|
117
|
-
className: "overflow-auto",
|
|
118
|
+
className: "min-w-0 overflow-auto rounded-input border border-[var(--color-border-subtle)]",
|
|
118
119
|
style: { maxHeight: w },
|
|
119
120
|
children: /* @__PURE__ */ f(p, { children: [/* @__PURE__ */ d(_, { children: /* @__PURE__ */ d(v, { children: N.map((e) => /* @__PURE__ */ d(g, {
|
|
120
121
|
title: e.path,
|
|
@@ -122,7 +123,7 @@ var w = e(function({ data: e, maxHeight: w = "400px" }) {
|
|
|
122
123
|
}, e.key)) }) }), /* @__PURE__ */ d(m, { children: P.map((e, t) => /* @__PURE__ */ d(v, { children: N.map((t) => /* @__PURE__ */ d(h, { children: C(S(e, t.path)) }, t.key)) }, t)) })] })
|
|
123
124
|
}),
|
|
124
125
|
F > 1 && /* @__PURE__ */ f("div", {
|
|
125
|
-
className: "flex items-center justify-between
|
|
126
|
+
className: "mt-control-gap flex flex-wrap items-center justify-between gap-control-gap",
|
|
126
127
|
children: [/* @__PURE__ */ f("span", {
|
|
127
128
|
className: "text-xs text-text-secondary",
|
|
128
129
|
children: [
|
|
@@ -132,7 +133,7 @@ var w = e(function({ data: e, maxHeight: w = "400px" }) {
|
|
|
132
133
|
F
|
|
133
134
|
]
|
|
134
135
|
}), /* @__PURE__ */ f("div", {
|
|
135
|
-
className: "flex items-center gap-1",
|
|
136
|
+
className: "flex flex-wrap items-center gap-1",
|
|
136
137
|
children: [
|
|
137
138
|
/* @__PURE__ */ d(u, {
|
|
138
139
|
variant: "ghost",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataSinkTableViewer.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkTableViewer.tsx"],"sourcesContent":["/**\n * DataSink Table Viewer\n *\n * Component for viewing DataSink data in tabular format with support for\n * nested data, column selection, and multiple view modes.\n */\n\nimport { memo, useState, useMemo, useCallback } from 'react';\n\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@burdenoff/fe-libs/ui/table';\n\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, Settings2, X } from 'lucide-react';\n\ninterface DataSinkTableViewerProps {\n data: unknown;\n maxHeight?: string;\n}\n\ninterface Column {\n key: string;\n label: string;\n path: string;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isArrayOfObjects(value: unknown): boolean {\n return Array.isArray(value) && value.length > 0 && isObject(value[0]);\n}\n\nfunction flattenObject(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (isObject(value) && !Array.isArray(value)) {\n Object.assign(result, flattenObject(value, newKey));\n } else {\n result[newKey] = value;\n }\n }\n\n return result;\n}\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((acc: unknown, key) => {\n if (acc && typeof acc === 'object' && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\nfunction formatCellValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '-';\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nexport const DataSinkTableViewer = memo(function DataSinkTableViewer({\n data,\n maxHeight = '400px',\n}: DataSinkTableViewerProps) {\n const [page, setPage] = useState(0);\n const PAGE_SIZE = 50;\n const [selectedColumns, setSelectedColumns] = useState<string[] | null>(null);\n const [showColumnPicker, setShowColumnPicker] = useState(false);\n\n const rows = useMemo(() => {\n if (!data) return [];\n if (Array.isArray(data) && isArrayOfObjects(data)) {\n return data as Record<string, unknown>[];\n }\n if (isObject(data)) {\n return [data];\n }\n return [];\n }, [data]);\n\n const allColumns = useMemo(() => {\n if (rows.length === 0) return [];\n\n const columnMap = new Map<string, Column>();\n\n for (const row of rows) {\n const flat = flattenObject(row);\n for (const key of Object.keys(flat)) {\n if (!columnMap.has(key)) {\n const parts = key.split('.');\n const label = parts[parts.length - 1];\n columnMap.set(key, { key, label, path: key });\n }\n }\n }\n\n return Array.from(columnMap.values());\n }, [rows]);\n\n const displayColumns = useMemo(() => {\n if (selectedColumns) {\n return allColumns.filter((col) => selectedColumns.includes(col.key));\n }\n return allColumns.slice(0, 10);\n }, [allColumns, selectedColumns]);\n\n const paginatedRows = useMemo(() => {\n const start = page * PAGE_SIZE;\n return rows.slice(start, start + PAGE_SIZE);\n }, [rows, page]);\n\n const totalPages = Math.ceil(rows.length / PAGE_SIZE);\n\n const handleColumnToggle = useCallback((columnKey: string) => {\n setSelectedColumns((prev) => {\n if (!prev) {\n return [columnKey];\n }\n if (prev.includes(columnKey)) {\n const next = prev.filter((k) => k !== columnKey);\n return next.length > 0 ? next : null;\n }\n return [...prev, columnKey];\n });\n }, []);\n\n const handleResetColumns = useCallback(() => {\n setSelectedColumns(null);\n setShowColumnPicker(false);\n }, []);\n\n if (rows.length === 0) {\n return (\n <div className=\"flex items-center justify-center p-8 text-text-secondary text-body-sm\">\n No tabular data available. Data must be an array of objects for table view.\n </div>\n );\n }\n\n return (\n <div className=\"relative\">\n <div className=\"flex items-center justify-between p-3 bg-bg-sunken border-b border-border-default\">\n <span className=\"text-xs text-text-secondary\">\n {rows.length} rows · {displayColumns.length} columns\n </span>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setShowColumnPicker((v) => !v)}>\n <Settings2 className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n\n {showColumnPicker && (\n <div className=\"absolute right-0 top-10 z-10 bg-bg-surface border border-border-default rounded-md shadow-lg p-3 min-w-[200px] max-h-[300px] overflow-auto\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs font-medium text-text-primary\">Select Columns</span>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleResetColumns}>\n <X className=\"w-3 h-3\" />\n </Button>\n </div>\n <div className=\"space-y-1\">\n {allColumns.map((col) => {\n const isSelected = !selectedColumns || selectedColumns.includes(col.key);\n return (\n <label\n key={col.key}\n className=\"flex items-center gap-2 text-xs text-text-secondary hover:text-text-primary cursor-pointer\"\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => handleColumnToggle(col.key)}\n className=\"rounded border-border-default\"\n />\n <span className=\"truncate\" title={col.key}>\n {col.label}\n </span>\n </label>\n );\n })}\n </div>\n </div>\n )}\n\n <div className=\"overflow-auto\" style={{ maxHeight }}>\n <Table>\n <TableHeader>\n <TableRow>\n {displayColumns.map((col) => (\n <TableHead key={col.key} title={col.path}>\n {col.label}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {paginatedRows.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {displayColumns.map((col) => (\n <TableCell key={col.key}>{formatCellValue(getNestedValue(row, col.path))}</TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {totalPages > 1 && (\n <div className=\"flex items-center justify-between p-3 bg-bg-sunken border-t border-border-default\">\n <span className=\"text-xs text-text-secondary\">\n Page {page + 1} of {totalPages}\n </span>\n <div className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage(0)} disabled={page === 0}>\n <ChevronsLeft className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage((p) => Math.max(0, p - 1))} disabled={page === 0}>\n <ChevronLeft className=\"w-4 h-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setPage((p) => Math.min(totalPages - 1, p + 1))}\n disabled={page >= totalPages - 1}\n >\n <ChevronRight className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage(totalPages - 1)} disabled={page >= totalPages - 1}>\n <ChevronsRight className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n});\n\nexport default DataSinkTableViewer;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataSinkTableViewer.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/DataSinkTableViewer.tsx"],"sourcesContent":["/**\n * DataSink Table Viewer\n *\n * Component for viewing DataSink data in tabular format with support for\n * nested data, column selection, and multiple view modes.\n */\n\nimport { memo, useState, useMemo, useCallback } from 'react';\n\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@burdenoff/fe-libs/ui/table';\n\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, Settings2, X } from 'lucide-react';\n\nimport { SECTION_FOCUS_RING } from '../common';\n\ninterface DataSinkTableViewerProps {\n data: unknown;\n maxHeight?: string;\n}\n\ninterface Column {\n key: string;\n label: string;\n path: string;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isArrayOfObjects(value: unknown): boolean {\n return Array.isArray(value) && value.length > 0 && isObject(value[0]);\n}\n\nfunction flattenObject(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (isObject(value) && !Array.isArray(value)) {\n Object.assign(result, flattenObject(value, newKey));\n } else {\n result[newKey] = value;\n }\n }\n\n return result;\n}\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((acc: unknown, key) => {\n if (acc && typeof acc === 'object' && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\nfunction formatCellValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '-';\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nexport const DataSinkTableViewer = memo(function DataSinkTableViewer({\n data,\n maxHeight = '400px',\n}: DataSinkTableViewerProps) {\n const [page, setPage] = useState(0);\n const PAGE_SIZE = 50;\n const [selectedColumns, setSelectedColumns] = useState<string[] | null>(null);\n const [showColumnPicker, setShowColumnPicker] = useState(false);\n\n const rows = useMemo(() => {\n if (!data) return [];\n if (Array.isArray(data) && isArrayOfObjects(data)) {\n return data as Record<string, unknown>[];\n }\n if (isObject(data)) {\n return [data];\n }\n return [];\n }, [data]);\n\n const allColumns = useMemo(() => {\n if (rows.length === 0) return [];\n\n const columnMap = new Map<string, Column>();\n\n for (const row of rows) {\n const flat = flattenObject(row);\n for (const key of Object.keys(flat)) {\n if (!columnMap.has(key)) {\n const parts = key.split('.');\n const label = parts[parts.length - 1];\n columnMap.set(key, { key, label, path: key });\n }\n }\n }\n\n return Array.from(columnMap.values());\n }, [rows]);\n\n const displayColumns = useMemo(() => {\n if (selectedColumns) {\n return allColumns.filter((col) => selectedColumns.includes(col.key));\n }\n return allColumns.slice(0, 10);\n }, [allColumns, selectedColumns]);\n\n const paginatedRows = useMemo(() => {\n const start = page * PAGE_SIZE;\n return rows.slice(start, start + PAGE_SIZE);\n }, [rows, page]);\n\n const totalPages = Math.ceil(rows.length / PAGE_SIZE);\n\n const handleColumnToggle = useCallback((columnKey: string) => {\n setSelectedColumns((prev) => {\n if (!prev) {\n return [columnKey];\n }\n if (prev.includes(columnKey)) {\n const next = prev.filter((k) => k !== columnKey);\n return next.length > 0 ? next : null;\n }\n return [...prev, columnKey];\n });\n }, []);\n\n const handleResetColumns = useCallback(() => {\n setSelectedColumns(null);\n setShowColumnPicker(false);\n }, []);\n\n if (rows.length === 0) {\n return (\n <div className=\"flex items-center justify-center p-8 text-center text-sm text-text-secondary\">\n No tabular data available. Data must be an array of objects for table view.\n </div>\n );\n }\n\n return (\n <div className=\"relative min-w-0\">\n {/* Toolbar. Deliberately surface-less: this viewer is rendered inside an\n already-headed section, and a second sunken band stacked three bars\n deep was the main reason the preview did not scan. */}\n <div className=\"mb-control-gap flex flex-wrap items-center justify-between gap-control-gap\">\n <span className=\"text-xs text-text-secondary\">\n {rows.length} rows · {displayColumns.length} columns\n </span>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setShowColumnPicker((v) => !v)} aria-label=\"Select columns\">\n <Settings2 className=\"w-4 h-4\" />\n </Button>\n </div>\n\n {showColumnPicker && (\n <div className=\"absolute right-0 top-10 z-10 max-h-[300px] w-56 max-w-[calc(100vw-2rem)] overflow-auto rounded-card border border-[var(--color-border-subtle)] bg-bg-surface p-3 shadow-[var(--shadow-elevation-2)]\">\n <div className=\"mb-2 flex items-center justify-between gap-control-gap\">\n <span className=\"text-xs font-medium text-text-primary\">Select columns</span>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleResetColumns} aria-label=\"Reset columns\">\n <X className=\"w-3 h-3\" />\n </Button>\n </div>\n <div className=\"space-y-1\">\n {allColumns.map((col) => {\n const isSelected = !selectedColumns || selectedColumns.includes(col.key);\n return (\n <label\n key={col.key}\n className=\"flex min-h-[var(--size-controlHeight-md)] cursor-pointer items-center gap-2 text-xs text-text-secondary hover:text-text-primary\"\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => handleColumnToggle(col.key)}\n className={`rounded border-[var(--color-border-default)] ${SECTION_FOCUS_RING}`}\n />\n <span className=\"truncate\" title={col.key}>\n {col.label}\n </span>\n </label>\n );\n })}\n </div>\n </div>\n )}\n\n <div\n className=\"min-w-0 overflow-auto rounded-input border border-[var(--color-border-subtle)]\"\n style={{ maxHeight }}\n >\n <Table>\n <TableHeader>\n <TableRow>\n {displayColumns.map((col) => (\n <TableHead key={col.key} title={col.path}>\n {col.label}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {paginatedRows.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {displayColumns.map((col) => (\n <TableCell key={col.key}>{formatCellValue(getNestedValue(row, col.path))}</TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {totalPages > 1 && (\n <div className=\"mt-control-gap flex flex-wrap items-center justify-between gap-control-gap\">\n <span className=\"text-xs text-text-secondary\">\n Page {page + 1} of {totalPages}\n </span>\n <div className=\"flex flex-wrap items-center gap-1\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage(0)} disabled={page === 0}>\n <ChevronsLeft className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage((p) => Math.max(0, p - 1))} disabled={page === 0}>\n <ChevronLeft className=\"w-4 h-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setPage((p) => Math.min(totalPages - 1, p + 1))}\n disabled={page >= totalPages - 1}\n >\n <ChevronRight className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setPage(totalPages - 1)} disabled={page >= totalPages - 1}>\n <ChevronsRight className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n});\n\nexport default DataSinkTableViewer;\n"],"mappings":"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"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import e from "
|
|
1
|
+
import { SECTION_FOCUS_RING as e } from "../common/sectionStyles.js";
|
|
2
|
+
import { Section as t } from "../common/Section.js";
|
|
3
|
+
import "../common/index.js";
|
|
4
|
+
import n from "../../hooks/useExportDataSink.js";
|
|
2
5
|
import "../../hooks/index.js";
|
|
3
|
-
import { memo as
|
|
4
|
-
import { Check as
|
|
5
|
-
import { Dialog as
|
|
6
|
-
import { Fragment as
|
|
6
|
+
import { memo as r, useCallback as i, useEffect as a, useState as o } from "react";
|
|
7
|
+
import { Check as s, Download as c, FileJson as l } from "lucide-react";
|
|
8
|
+
import { Dialog as u, DialogContent as d, DialogDescription as f, DialogTitle as p, Spinner as m } from "@burdenoff/fe-libs/ui";
|
|
9
|
+
import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
7
10
|
//#region src/bigconsole/components/datasink/ExportDataSinkDialog.tsx
|
|
8
|
-
var
|
|
11
|
+
var v = {
|
|
9
12
|
dialogContent: {
|
|
10
13
|
maxWidth: "450px",
|
|
11
14
|
width: "95vw",
|
|
@@ -45,48 +48,30 @@ var g = {
|
|
|
45
48
|
margin: "4px 0 0 0"
|
|
46
49
|
},
|
|
47
50
|
content: { padding: "20px 24px" },
|
|
48
|
-
dataSinkInfo: {
|
|
49
|
-
padding: "12px 16px",
|
|
50
|
-
backgroundColor: "var(--color-bg-muted)",
|
|
51
|
-
borderRadius: "8px",
|
|
52
|
-
marginBottom: "20px"
|
|
53
|
-
},
|
|
54
|
-
dataSinkLabel: {
|
|
55
|
-
fontSize: "12px",
|
|
56
|
-
color: "var(--color-text-secondary)",
|
|
57
|
-
margin: 0
|
|
58
|
-
},
|
|
59
51
|
dataSinkName: {
|
|
60
52
|
fontSize: "14px",
|
|
61
53
|
fontWeight: 500,
|
|
62
54
|
color: "var(--color-text-primary)",
|
|
63
|
-
margin:
|
|
55
|
+
margin: 0,
|
|
64
56
|
overflow: "hidden",
|
|
65
57
|
textOverflow: "ellipsis",
|
|
66
58
|
whiteSpace: "nowrap"
|
|
67
59
|
},
|
|
68
|
-
optionsTitle: {
|
|
69
|
-
fontSize: "13px",
|
|
70
|
-
fontWeight: 600,
|
|
71
|
-
color: "var(--color-text-secondary)",
|
|
72
|
-
marginBottom: "16px",
|
|
73
|
-
textTransform: "uppercase",
|
|
74
|
-
letterSpacing: "0.05em"
|
|
75
|
-
},
|
|
76
60
|
optionItem: {
|
|
77
61
|
display: "flex",
|
|
78
62
|
alignItems: "flex-start",
|
|
79
63
|
gap: "12px",
|
|
64
|
+
width: "100%",
|
|
65
|
+
textAlign: "left",
|
|
80
66
|
padding: "12px",
|
|
81
|
-
borderRadius: "
|
|
67
|
+
borderRadius: "var(--radius-card)",
|
|
82
68
|
marginBottom: "8px",
|
|
83
69
|
backgroundColor: "var(--color-bg-sunken)",
|
|
84
70
|
border: "1px solid var(--color-border)",
|
|
85
|
-
cursor: "pointer"
|
|
86
|
-
transition: "all 0.15s ease"
|
|
71
|
+
cursor: "pointer"
|
|
87
72
|
},
|
|
88
73
|
optionItemActive: {
|
|
89
|
-
backgroundColor: "var(--color-
|
|
74
|
+
backgroundColor: "var(--color-bg-accentSubtle)",
|
|
90
75
|
borderColor: "var(--color-action-primary-bg)"
|
|
91
76
|
},
|
|
92
77
|
checkbox: {
|
|
@@ -118,13 +103,6 @@ var g = {
|
|
|
118
103
|
color: "var(--color-text-secondary)",
|
|
119
104
|
margin: "4px 0 0 0"
|
|
120
105
|
},
|
|
121
|
-
error: {
|
|
122
|
-
padding: "12px 16px",
|
|
123
|
-
backgroundColor: "var(--color-status-error-bgSubtle)",
|
|
124
|
-
border: "1px solid var(--color-status-error-border)",
|
|
125
|
-
borderRadius: "8px",
|
|
126
|
-
marginTop: "16px"
|
|
127
|
-
},
|
|
128
106
|
errorText: {
|
|
129
107
|
fontSize: "13px",
|
|
130
108
|
color: "var(--color-status-error-text)",
|
|
@@ -132,184 +110,162 @@ var g = {
|
|
|
132
110
|
},
|
|
133
111
|
footer: {
|
|
134
112
|
display: "flex",
|
|
113
|
+
flexWrap: "wrap",
|
|
135
114
|
justifyContent: "flex-end",
|
|
136
115
|
gap: "12px",
|
|
137
116
|
padding: "16px 24px",
|
|
138
117
|
borderTop: "1px solid var(--color-border)",
|
|
139
118
|
backgroundColor: "var(--color-bg-sunken)"
|
|
140
|
-
},
|
|
141
|
-
cancelButton: {
|
|
142
|
-
padding: "10px 20px",
|
|
143
|
-
fontSize: "14px",
|
|
144
|
-
fontWeight: 500,
|
|
145
|
-
borderRadius: "8px",
|
|
146
|
-
border: "1px solid var(--color-border)",
|
|
147
|
-
backgroundColor: "var(--color-bg-surface)",
|
|
148
|
-
color: "var(--color-text-secondary)",
|
|
149
|
-
cursor: "pointer",
|
|
150
|
-
transition: "all 0.15s ease"
|
|
151
|
-
},
|
|
152
|
-
exportButton: {
|
|
153
|
-
display: "flex",
|
|
154
|
-
alignItems: "center",
|
|
155
|
-
gap: "8px",
|
|
156
|
-
padding: "10px 20px",
|
|
157
|
-
fontSize: "14px",
|
|
158
|
-
fontWeight: 500,
|
|
159
|
-
borderRadius: "8px",
|
|
160
|
-
border: "none",
|
|
161
|
-
backgroundColor: "var(--color-action-primary-bg)",
|
|
162
|
-
color: "var(--color-action-primary-text)",
|
|
163
|
-
cursor: "pointer",
|
|
164
|
-
transition: "all 0.15s ease"
|
|
165
|
-
},
|
|
166
|
-
exportButtonDisabled: {
|
|
167
|
-
backgroundColor: "var(--color-action-primary-bg)",
|
|
168
|
-
opacity: .5,
|
|
169
|
-
cursor: "not-allowed"
|
|
170
119
|
}
|
|
171
|
-
},
|
|
172
|
-
return /* @__PURE__ */
|
|
120
|
+
}, y = `inline-flex min-h-[var(--size-controlHeight-md)] items-center gap-2 rounded-button px-5 py-2 text-sm font-medium motion-safe:transition-colors ${e}`, b = r(function({ checked: t, onChange: n, disabled: r, label: i, description: a }) {
|
|
121
|
+
return /* @__PURE__ */ _("button", {
|
|
122
|
+
type: "button",
|
|
123
|
+
role: "checkbox",
|
|
124
|
+
"aria-checked": t,
|
|
125
|
+
disabled: r,
|
|
126
|
+
className: e,
|
|
173
127
|
style: {
|
|
174
|
-
...
|
|
175
|
-
...
|
|
176
|
-
opacity:
|
|
177
|
-
cursor:
|
|
128
|
+
...v.optionItem,
|
|
129
|
+
...t ? v.optionItemActive : {},
|
|
130
|
+
opacity: r ? .6 : 1,
|
|
131
|
+
cursor: r ? "not-allowed" : "pointer"
|
|
178
132
|
},
|
|
179
|
-
onClick: () => !
|
|
180
|
-
children: [/* @__PURE__ */
|
|
133
|
+
onClick: () => !r && n(!t),
|
|
134
|
+
children: [/* @__PURE__ */ g("span", {
|
|
135
|
+
"aria-hidden": "true",
|
|
181
136
|
style: {
|
|
182
|
-
...
|
|
183
|
-
...
|
|
137
|
+
...v.checkbox,
|
|
138
|
+
...t ? v.checkboxChecked : {}
|
|
184
139
|
},
|
|
185
|
-
children:
|
|
140
|
+
children: t && /* @__PURE__ */ g(s, { style: {
|
|
186
141
|
width: "14px",
|
|
187
142
|
height: "14px",
|
|
188
143
|
color: "var(--color-action-primary-text)"
|
|
189
144
|
} })
|
|
190
|
-
}), /* @__PURE__ */
|
|
191
|
-
style:
|
|
192
|
-
children: [/* @__PURE__ */
|
|
193
|
-
style:
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
145
|
+
}), /* @__PURE__ */ _("span", {
|
|
146
|
+
style: v.optionText,
|
|
147
|
+
children: [/* @__PURE__ */ g("span", {
|
|
148
|
+
style: {
|
|
149
|
+
...v.optionLabel,
|
|
150
|
+
display: "block"
|
|
151
|
+
},
|
|
197
152
|
children: i
|
|
153
|
+
}), /* @__PURE__ */ g("span", {
|
|
154
|
+
style: {
|
|
155
|
+
...v.optionDescription,
|
|
156
|
+
display: "block"
|
|
157
|
+
},
|
|
158
|
+
children: a
|
|
198
159
|
})]
|
|
199
160
|
})]
|
|
200
161
|
});
|
|
201
|
-
}),
|
|
202
|
-
let [
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
}, [
|
|
206
|
-
let
|
|
207
|
-
|
|
162
|
+
}), x = r(function({ isOpen: e, dataSinkId: r, dataSinkName: s, onClose: x, onSuccess: S }) {
|
|
163
|
+
let [C, w] = o(!0), { loading: T, error: E, downloadDataSink: D, clearError: O } = n();
|
|
164
|
+
a(() => {
|
|
165
|
+
e && (w(!0), O());
|
|
166
|
+
}, [e, O]);
|
|
167
|
+
let k = i(async () => {
|
|
168
|
+
r && await D(r, s, { prettyPrint: C }) && (S?.(), x());
|
|
208
169
|
}, [
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
170
|
+
r,
|
|
171
|
+
s,
|
|
172
|
+
C,
|
|
173
|
+
D,
|
|
174
|
+
S,
|
|
175
|
+
x
|
|
215
176
|
]);
|
|
216
|
-
return
|
|
217
|
-
open:
|
|
218
|
-
onOpenChange: (e) => !e && !
|
|
219
|
-
children: /* @__PURE__ */
|
|
220
|
-
style:
|
|
177
|
+
return r ? /* @__PURE__ */ g(u, {
|
|
178
|
+
open: e,
|
|
179
|
+
onOpenChange: (e) => !e && !T && x(),
|
|
180
|
+
children: /* @__PURE__ */ _(d, {
|
|
181
|
+
style: v.dialogContent,
|
|
221
182
|
children: [
|
|
222
|
-
/* @__PURE__ */
|
|
223
|
-
style:
|
|
224
|
-
children: [/* @__PURE__ */
|
|
225
|
-
style:
|
|
226
|
-
children: /* @__PURE__ */
|
|
183
|
+
/* @__PURE__ */ _("div", {
|
|
184
|
+
style: v.header,
|
|
185
|
+
children: [/* @__PURE__ */ g("div", {
|
|
186
|
+
style: v.iconWrapper,
|
|
187
|
+
children: /* @__PURE__ */ g(l, { style: {
|
|
227
188
|
width: "22px",
|
|
228
189
|
height: "22px"
|
|
229
190
|
} })
|
|
230
|
-
}), /* @__PURE__ */
|
|
231
|
-
style:
|
|
232
|
-
children: [/* @__PURE__ */
|
|
191
|
+
}), /* @__PURE__ */ _("div", {
|
|
192
|
+
style: v.headerText,
|
|
193
|
+
children: [/* @__PURE__ */ g(p, {
|
|
233
194
|
asChild: !0,
|
|
234
|
-
children: /* @__PURE__ */
|
|
235
|
-
style:
|
|
195
|
+
children: /* @__PURE__ */ g("h2", {
|
|
196
|
+
style: v.title,
|
|
236
197
|
children: "Export DataSink"
|
|
237
198
|
})
|
|
238
|
-
}), /* @__PURE__ */
|
|
199
|
+
}), /* @__PURE__ */ g(f, {
|
|
239
200
|
asChild: !0,
|
|
240
|
-
children: /* @__PURE__ */
|
|
241
|
-
style:
|
|
201
|
+
children: /* @__PURE__ */ g("p", {
|
|
202
|
+
style: v.description,
|
|
242
203
|
children: "Export your DataSink configuration to a JSON file."
|
|
243
204
|
})
|
|
244
205
|
})]
|
|
245
206
|
})]
|
|
246
207
|
}),
|
|
247
|
-
/* @__PURE__ */
|
|
248
|
-
style:
|
|
208
|
+
/* @__PURE__ */ _("div", {
|
|
209
|
+
style: v.content,
|
|
210
|
+
className: "space-y-form-gap",
|
|
249
211
|
children: [
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
/* @__PURE__ */ m("p", {
|
|
261
|
-
style: g.optionsTitle,
|
|
262
|
-
children: "Export Options"
|
|
212
|
+
s && /* @__PURE__ */ g(t, {
|
|
213
|
+
emphasis: "muted",
|
|
214
|
+
padding: "compact",
|
|
215
|
+
headingLevel: 3,
|
|
216
|
+
title: "Exporting",
|
|
217
|
+
headerClassName: "mb-control-gap",
|
|
218
|
+
children: /* @__PURE__ */ g("p", {
|
|
219
|
+
style: v.dataSinkName,
|
|
220
|
+
children: s
|
|
221
|
+
})
|
|
263
222
|
}),
|
|
264
|
-
/* @__PURE__ */
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
223
|
+
/* @__PURE__ */ g(t, {
|
|
224
|
+
emphasis: "bare",
|
|
225
|
+
padding: "none",
|
|
226
|
+
headingLevel: 3,
|
|
227
|
+
title: "Export options",
|
|
228
|
+
headerClassName: "mb-control-gap",
|
|
229
|
+
children: /* @__PURE__ */ g(b, {
|
|
230
|
+
checked: C,
|
|
231
|
+
onChange: w,
|
|
232
|
+
disabled: T,
|
|
233
|
+
label: "Format JSON (pretty print)",
|
|
234
|
+
description: "Makes the export file human-readable (larger file size)"
|
|
235
|
+
})
|
|
270
236
|
}),
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
237
|
+
E && /* @__PURE__ */ g(t, {
|
|
238
|
+
tone: "danger",
|
|
239
|
+
padding: "compact",
|
|
240
|
+
headingLevel: 3,
|
|
241
|
+
title: "Export failed",
|
|
242
|
+
children: /* @__PURE__ */ g("p", {
|
|
243
|
+
style: v.errorText,
|
|
244
|
+
children: E.message
|
|
276
245
|
})
|
|
277
246
|
})
|
|
278
247
|
]
|
|
279
248
|
}),
|
|
280
|
-
/* @__PURE__ */
|
|
281
|
-
style:
|
|
282
|
-
children: [/* @__PURE__ */
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
e.currentTarget.style.backgroundColor = "var(--color-bg-muted)";
|
|
288
|
-
},
|
|
289
|
-
onMouseLeave: (e) => {
|
|
290
|
-
e.currentTarget.style.backgroundColor = "var(--color-bg-surface)";
|
|
291
|
-
},
|
|
249
|
+
/* @__PURE__ */ _("div", {
|
|
250
|
+
style: v.footer,
|
|
251
|
+
children: [/* @__PURE__ */ g("button", {
|
|
252
|
+
type: "button",
|
|
253
|
+
className: `${y} border border-[var(--color-border-default)] bg-bg-surface text-text-secondary hover:bg-bg-sunken`,
|
|
254
|
+
onClick: x,
|
|
255
|
+
disabled: T,
|
|
292
256
|
children: "Cancel"
|
|
293
|
-
}), /* @__PURE__ */
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
disabled: C,
|
|
300
|
-
onMouseEnter: (e) => {
|
|
301
|
-
C || (e.currentTarget.style.opacity = "0.9");
|
|
302
|
-
},
|
|
303
|
-
onMouseLeave: (e) => {
|
|
304
|
-
C || (e.currentTarget.style.opacity = "1");
|
|
305
|
-
},
|
|
306
|
-
children: C ? /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m(f, { style: {
|
|
257
|
+
}), /* @__PURE__ */ g("button", {
|
|
258
|
+
type: "button",
|
|
259
|
+
className: `${y} bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bgHover disabled:cursor-not-allowed disabled:opacity-50`,
|
|
260
|
+
onClick: k,
|
|
261
|
+
disabled: T,
|
|
262
|
+
children: T ? /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g(m, { style: {
|
|
307
263
|
width: "16px",
|
|
308
264
|
height: "16px"
|
|
309
|
-
} }), "Exporting..."] }) : /* @__PURE__ */ h
|
|
265
|
+
} }), "Exporting..."] }) : /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g(c, { style: {
|
|
310
266
|
width: "16px",
|
|
311
267
|
height: "16px"
|
|
312
|
-
} }), "Download
|
|
268
|
+
} }), "Download export"] })
|
|
313
269
|
})]
|
|
314
270
|
})
|
|
315
271
|
]
|
|
@@ -317,6 +273,6 @@ var g = {
|
|
|
317
273
|
}) : null;
|
|
318
274
|
});
|
|
319
275
|
//#endregion
|
|
320
|
-
export {
|
|
276
|
+
export { x as default };
|
|
321
277
|
|
|
322
278
|
//# sourceMappingURL=ExportDataSinkDialog.js.map
|