@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":"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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExportDataSinkDialog.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/ExportDataSinkDialog.tsx"],"sourcesContent":["/**\n * ExportDataSinkDialog Component\n *\n * Modal dialog for exporting a DataSink to JSON.\n * Uses inline styles for consistent styling across environments.\n */\n\nimport { type FC, memo, useState, useCallback, useEffect } from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { Download, FileJson, Check } from 'lucide-react';\nimport { useExportDataSink, type ExportDataSinkOptions } from '../../hooks';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ExportDataSinkDialogProps {\n /** Whether dialog is open */\n isOpen: boolean;\n /** DataSink ID to export */\n dataSinkId: string | null;\n /** DataSink name for filename */\n dataSinkName?: string;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when export succeeds */\n onSuccess?: () => void;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst styles = {\n dialogContent: {\n maxWidth: '450px',\n width: '95vw',\n padding: 0,\n borderRadius: '12px',\n overflow: 'hidden',\n } as React.CSSProperties,\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '20px 24px',\n borderBottom: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-sunken)',\n } as React.CSSProperties,\n iconWrapper: {\n width: '44px',\n height: '44px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '10px',\n backgroundColor: 'var(--color-action-primary-bg)',\n color: 'var(--color-action-primary-text)',\n flexShrink: 0,\n } as React.CSSProperties,\n headerText: {\n flex: 1,\n } as React.CSSProperties,\n title: {\n fontSize: '16px',\n fontWeight: 600,\n color: 'var(--color-text-primary)',\n margin: 0,\n } as React.CSSProperties,\n description: {\n fontSize: '13px',\n color: 'var(--color-text-secondary)',\n margin: '4px 0 0 0',\n } as React.CSSProperties,\n content: {\n padding: '20px 24px',\n } as React.CSSProperties,\n dataSinkInfo: {\n padding: '12px 16px',\n backgroundColor: 'var(--color-bg-muted)',\n borderRadius: '8px',\n marginBottom: '20px',\n } as React.CSSProperties,\n dataSinkLabel: {\n fontSize: '12px',\n color: 'var(--color-text-secondary)',\n margin: 0,\n } as React.CSSProperties,\n dataSinkName: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--color-text-primary)',\n margin: '4px 0 0 0',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } as React.CSSProperties,\n optionsTitle: {\n fontSize: '13px',\n fontWeight: 600,\n color: 'var(--color-text-secondary)',\n marginBottom: '16px',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n } as React.CSSProperties,\n optionItem: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: '12px',\n padding: '12px',\n borderRadius: '8px',\n marginBottom: '8px',\n backgroundColor: 'var(--color-bg-sunken)',\n border: '1px solid var(--color-border)',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n } as React.CSSProperties,\n optionItemActive: {\n backgroundColor: 'var(--color-action-primary-bg)',\n borderColor: 'var(--color-action-primary-bg)',\n } as React.CSSProperties,\n checkbox: {\n width: '20px',\n height: '20px',\n borderRadius: '4px',\n border: '2px solid var(--color-border)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n marginTop: '2px',\n transition: 'all 0.15s ease',\n cursor: 'pointer',\n } as React.CSSProperties,\n checkboxChecked: {\n backgroundColor: 'var(--color-action-primary-bg)',\n borderColor: 'var(--color-action-primary-bg)',\n } as React.CSSProperties,\n optionText: {\n flex: 1,\n } as React.CSSProperties,\n optionLabel: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--color-text-primary)',\n margin: 0,\n } as React.CSSProperties,\n optionDescription: {\n fontSize: '12px',\n color: 'var(--color-text-secondary)',\n margin: '4px 0 0 0',\n } as React.CSSProperties,\n error: {\n padding: '12px 16px',\n backgroundColor: 'var(--color-status-error-bgSubtle)',\n border: '1px solid var(--color-status-error-border)',\n borderRadius: '8px',\n marginTop: '16px',\n } as React.CSSProperties,\n errorText: {\n fontSize: '13px',\n color: 'var(--color-status-error-text)',\n margin: 0,\n } as React.CSSProperties,\n footer: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '12px',\n padding: '16px 24px',\n borderTop: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-sunken)',\n } as React.CSSProperties,\n cancelButton: {\n padding: '10px 20px',\n fontSize: '14px',\n fontWeight: 500,\n borderRadius: '8px',\n border: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-surface)',\n color: 'var(--color-text-secondary)',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n } as React.CSSProperties,\n exportButton: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '10px 20px',\n fontSize: '14px',\n fontWeight: 500,\n borderRadius: '8px',\n border: 'none',\n backgroundColor: 'var(--color-action-primary-bg)',\n color: 'var(--color-action-primary-text)',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n } as React.CSSProperties,\n exportButtonDisabled: {\n backgroundColor: 'var(--color-action-primary-bg)',\n opacity: 0.5,\n cursor: 'not-allowed',\n } as React.CSSProperties,\n};\n\n// ============================================================================\n// Custom Checkbox Component\n// ============================================================================\n\ninterface CustomCheckboxProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n label: string;\n description: string;\n}\n\nconst CustomCheckbox: FC<CustomCheckboxProps> = memo(function CustomCheckbox({\n checked,\n onChange,\n disabled,\n label,\n description,\n}) {\n return (\n <div\n style={{\n ...styles.optionItem,\n ...(checked ? styles.optionItemActive : {}),\n opacity: disabled ? 0.6 : 1,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n onClick={() => !disabled && onChange(!checked)}\n >\n <div\n style={{\n ...styles.checkbox,\n ...(checked ? styles.checkboxChecked : {}),\n }}\n >\n {checked && <Check style={{ width: '14px', height: '14px', color: 'var(--color-action-primary-text)' }} />}\n </div>\n <div style={styles.optionText}>\n <p style={styles.optionLabel}>{label}</p>\n <p style={styles.optionDescription}>{description}</p>\n </div>\n </div>\n );\n});\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const ExportDataSinkDialog: FC<ExportDataSinkDialogProps> = memo(function ExportDataSinkDialog({\n isOpen,\n dataSinkId,\n dataSinkName,\n onClose,\n onSuccess,\n}) {\n const [prettyPrint, setPrettyPrint] = useState(true);\n\n const { loading, error, downloadDataSink, clearError } = useExportDataSink();\n\n // Reset state when dialog opens\n useEffect(() => {\n if (isOpen) {\n setPrettyPrint(true);\n clearError();\n }\n }, [isOpen, clearError]);\n\n // Handle export\n const handleExport = useCallback(async () => {\n if (!dataSinkId) return;\n\n const options: ExportDataSinkOptions = {\n prettyPrint,\n };\n\n const success = await downloadDataSink(dataSinkId, dataSinkName, options);\n\n if (success) {\n onSuccess?.();\n onClose();\n }\n }, [dataSinkId, dataSinkName, prettyPrint, downloadDataSink, onSuccess, onClose]);\n\n // Don't render if no DataSink\n if (!dataSinkId) return null;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && !loading && onClose()}>\n <DialogContent style={styles.dialogContent}>\n {/* Header */}\n <div style={styles.header}>\n <div style={styles.iconWrapper}>\n <FileJson style={{ width: '22px', height: '22px' }} />\n </div>\n <div style={styles.headerText}>\n <DialogTitle asChild>\n <h2 style={styles.title}>Export DataSink</h2>\n </DialogTitle>\n <DialogDescription asChild>\n <p style={styles.description}>Export your DataSink configuration to a JSON file.</p>\n </DialogDescription>\n </div>\n </div>\n\n {/* Content */}\n <div style={styles.content}>\n {/* DataSink Info */}\n {dataSinkName && (\n <div style={styles.dataSinkInfo}>\n <p style={styles.dataSinkLabel}>Exporting:</p>\n <p style={styles.dataSinkName}>{dataSinkName}</p>\n </div>\n )}\n\n {/* Options */}\n <p style={styles.optionsTitle}>Export Options</p>\n\n <CustomCheckbox\n checked={prettyPrint}\n onChange={setPrettyPrint}\n disabled={loading}\n label=\"Format JSON (Pretty Print)\"\n description=\"Makes the export file human-readable (larger file size)\"\n />\n\n {/* Error */}\n {error && (\n <div style={styles.error}>\n <p style={styles.errorText}>{error.message}</p>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div style={styles.footer}>\n <button\n style={styles.cancelButton}\n onClick={onClose}\n disabled={loading}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--color-bg-muted)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--color-bg-surface)';\n }}\n >\n Cancel\n </button>\n <button\n style={{\n ...styles.exportButton,\n ...(loading ? styles.exportButtonDisabled : {}),\n }}\n onClick={handleExport}\n disabled={loading}\n onMouseEnter={(e) => {\n if (!loading) e.currentTarget.style.opacity = '0.9';\n }}\n onMouseLeave={(e) => {\n if (!loading) e.currentTarget.style.opacity = '1';\n }}\n >\n {loading ? (\n <>\n <Spinner style={{ width: '16px', height: '16px' }} />\n Exporting...\n </>\n ) : (\n <>\n <Download style={{ width: '16px', height: '16px' }} />\n Download Export\n </>\n )}\n </button>\n </div>\n </DialogContent>\n </Dialog>\n );\n});\n\nexport default ExportDataSinkDialog;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExportDataSinkDialog.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/ExportDataSinkDialog.tsx"],"sourcesContent":["/**\n * ExportDataSinkDialog Component\n *\n * Modal dialog for exporting a DataSink to JSON.\n * Uses inline styles for consistent styling across environments.\n */\n\nimport { type FC, memo, useState, useCallback, useEffect } from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { Download, FileJson, Check } from 'lucide-react';\nimport { useExportDataSink, type ExportDataSinkOptions } from '../../hooks';\nimport { Section, SECTION_FOCUS_RING } from '../common';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ExportDataSinkDialogProps {\n /** Whether dialog is open */\n isOpen: boolean;\n /** DataSink ID to export */\n dataSinkId: string | null;\n /** DataSink name for filename */\n dataSinkName?: string;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when export succeeds */\n onSuccess?: () => void;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst styles = {\n dialogContent: {\n maxWidth: '450px',\n width: '95vw',\n padding: 0,\n borderRadius: '12px',\n overflow: 'hidden',\n } as React.CSSProperties,\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '20px 24px',\n borderBottom: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-sunken)',\n } as React.CSSProperties,\n iconWrapper: {\n width: '44px',\n height: '44px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '10px',\n backgroundColor: 'var(--color-action-primary-bg)',\n color: 'var(--color-action-primary-text)',\n flexShrink: 0,\n } as React.CSSProperties,\n headerText: {\n flex: 1,\n } as React.CSSProperties,\n title: {\n fontSize: '16px',\n fontWeight: 600,\n color: 'var(--color-text-primary)',\n margin: 0,\n } as React.CSSProperties,\n description: {\n fontSize: '13px',\n color: 'var(--color-text-secondary)',\n margin: '4px 0 0 0',\n } as React.CSSProperties,\n content: {\n padding: '20px 24px',\n } as React.CSSProperties,\n dataSinkName: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--color-text-primary)',\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } as React.CSSProperties,\n optionItem: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: '12px',\n width: '100%',\n textAlign: 'left',\n padding: '12px',\n borderRadius: 'var(--radius-card)',\n marginBottom: '8px',\n backgroundColor: 'var(--color-bg-sunken)',\n border: '1px solid var(--color-border)',\n cursor: 'pointer',\n } as React.CSSProperties,\n // The selected row used to paint its whole background with the primary action\n // colour, making it by far the loudest selected state in the module. A subtle\n // accent wash plus an accent border reads as \"chosen\" without shouting.\n optionItemActive: {\n backgroundColor: 'var(--color-bg-accentSubtle)',\n borderColor: 'var(--color-action-primary-bg)',\n } as React.CSSProperties,\n checkbox: {\n width: '20px',\n height: '20px',\n borderRadius: '4px',\n border: '2px solid var(--color-border)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n marginTop: '2px',\n transition: 'all 0.15s ease',\n cursor: 'pointer',\n } as React.CSSProperties,\n checkboxChecked: {\n backgroundColor: 'var(--color-action-primary-bg)',\n borderColor: 'var(--color-action-primary-bg)',\n } as React.CSSProperties,\n optionText: {\n flex: 1,\n } as React.CSSProperties,\n optionLabel: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--color-text-primary)',\n margin: 0,\n } as React.CSSProperties,\n optionDescription: {\n fontSize: '12px',\n color: 'var(--color-text-secondary)',\n margin: '4px 0 0 0',\n } as React.CSSProperties,\n errorText: {\n fontSize: '13px',\n color: 'var(--color-status-error-text)',\n margin: 0,\n } as React.CSSProperties,\n footer: {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'flex-end',\n gap: '12px',\n padding: '16px 24px',\n borderTop: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-sunken)',\n } as React.CSSProperties,\n};\n\n/**\n * Footer buttons. Hover used to be JS-driven (`onMouseEnter` mutating inline\n * style), which sticks after a tap on touch devices and cannot express a focus\n * ring; these are CSS classes instead.\n */\nconst FOOTER_BUTTON =\n `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 ${SECTION_FOCUS_RING}` as const;\n\n// ============================================================================\n// Custom Checkbox Component\n// ============================================================================\n\ninterface CustomCheckboxProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n label: string;\n description: string;\n}\n\nconst CustomCheckbox: FC<CustomCheckboxProps> = memo(function CustomCheckbox({\n checked,\n onChange,\n disabled,\n label,\n description,\n}) {\n return (\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={checked}\n disabled={disabled}\n className={SECTION_FOCUS_RING}\n style={{\n ...styles.optionItem,\n ...(checked ? styles.optionItemActive : {}),\n opacity: disabled ? 0.6 : 1,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n onClick={() => !disabled && onChange(!checked)}\n >\n <span\n aria-hidden=\"true\"\n style={{\n ...styles.checkbox,\n ...(checked ? styles.checkboxChecked : {}),\n }}\n >\n {checked && <Check style={{ width: '14px', height: '14px', color: 'var(--color-action-primary-text)' }} />}\n </span>\n <span style={styles.optionText}>\n <span style={{ ...styles.optionLabel, display: 'block' }}>{label}</span>\n <span style={{ ...styles.optionDescription, display: 'block' }}>{description}</span>\n </span>\n </button>\n );\n});\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const ExportDataSinkDialog: FC<ExportDataSinkDialogProps> = memo(function ExportDataSinkDialog({\n isOpen,\n dataSinkId,\n dataSinkName,\n onClose,\n onSuccess,\n}) {\n const [prettyPrint, setPrettyPrint] = useState(true);\n\n const { loading, error, downloadDataSink, clearError } = useExportDataSink();\n\n // Reset state when dialog opens\n useEffect(() => {\n if (isOpen) {\n setPrettyPrint(true);\n clearError();\n }\n }, [isOpen, clearError]);\n\n // Handle export\n const handleExport = useCallback(async () => {\n if (!dataSinkId) return;\n\n const options: ExportDataSinkOptions = {\n prettyPrint,\n };\n\n const success = await downloadDataSink(dataSinkId, dataSinkName, options);\n\n if (success) {\n onSuccess?.();\n onClose();\n }\n }, [dataSinkId, dataSinkName, prettyPrint, downloadDataSink, onSuccess, onClose]);\n\n // Don't render if no DataSink\n if (!dataSinkId) return null;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && !loading && onClose()}>\n <DialogContent style={styles.dialogContent}>\n {/* Header */}\n <div style={styles.header}>\n <div style={styles.iconWrapper}>\n <FileJson style={{ width: '22px', height: '22px' }} />\n </div>\n <div style={styles.headerText}>\n <DialogTitle asChild>\n <h2 style={styles.title}>Export DataSink</h2>\n </DialogTitle>\n <DialogDescription asChild>\n <p style={styles.description}>Export your DataSink configuration to a JSON file.</p>\n </DialogDescription>\n </div>\n </div>\n\n {/* Content */}\n <div style={styles.content} className=\"space-y-form-gap\">\n {/* What is being exported — supporting detail. */}\n {dataSinkName && (\n <Section\n emphasis=\"muted\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Exporting\"\n headerClassName=\"mb-control-gap\"\n >\n <p style={styles.dataSinkName}>{dataSinkName}</p>\n </Section>\n )}\n\n {/* Options */}\n <Section\n emphasis=\"bare\"\n padding=\"none\"\n headingLevel={3}\n title=\"Export options\"\n headerClassName=\"mb-control-gap\"\n >\n <CustomCheckbox\n checked={prettyPrint}\n onChange={setPrettyPrint}\n disabled={loading}\n label=\"Format JSON (pretty print)\"\n description=\"Makes the export file human-readable (larger file size)\"\n />\n </Section>\n\n {/* Error */}\n {error && (\n <Section tone=\"danger\" padding=\"compact\" headingLevel={3} title=\"Export failed\">\n <p style={styles.errorText}>{error.message}</p>\n </Section>\n )}\n </div>\n\n {/* Footer */}\n <div style={styles.footer}>\n <button\n type=\"button\"\n className={`${FOOTER_BUTTON} border border-[var(--color-border-default)] bg-bg-surface text-text-secondary hover:bg-bg-sunken`}\n onClick={onClose}\n disabled={loading}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className={`${FOOTER_BUTTON} bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bgHover disabled:cursor-not-allowed disabled:opacity-50`}\n onClick={handleExport}\n disabled={loading}\n >\n {loading ? (\n <>\n <Spinner style={{ width: '16px', height: '16px' }} />\n Exporting...\n </>\n ) : (\n <>\n <Download style={{ width: '16px', height: '16px' }} />\n Download export\n </>\n )}\n </button>\n </div>\n </DialogContent>\n </Dialog>\n );\n});\n\nexport default ExportDataSinkDialog;\n"],"mappings":"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"}
|