@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":"DataSinkViewPage.js","names":[],"sources":["../../../src/bigconsole/pages/DataSinkViewPage.tsx"],"sourcesContent":["/**\n * DataSink View Page\n *\n * Page for viewing DataSink details, data preview, and actions.\n */\n\nimport { memo, useState, useEffect, useCallback } from 'react';\nimport { useParams } from 'react-router';\nimport { useAppNavigate } from '../contexts';\nimport { newWorkflowPath } from '../BigConsoleRoutes';\nimport { isNative, nativeConfirm, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport { formatDistanceToNow } from 'date-fns';\nimport { useDataSinkOperations } from '../hooks/useDataSinkOperations';\nimport { useDataSinkSubscription } from '../hooks/useDataSinkSubscription';\nimport { useDataSinkStore } from '../store/dataSinkStore';\nimport { DataSinkStatusBadge } from '../components/datasink/DataSinkStatusBadge';\nimport { DataSinkDataViewer } from '../components/datasink/DataSinkDataViewer';\nimport { DataSinkTableViewer } from '../components/datasink/DataSinkTableViewer';\nimport { LinkedWorkflowsPanel } from '../components/datasink/LinkedWorkflowsPanel';\nimport { LinkedParsersPanel } from '../components/datasink/LinkedParsersPanel';\nimport { WorkflowStatusPanel } from '../components/datasink/WorkflowStatusPanel';\nimport { ExportDataSinkDialog } from '../components/datasink/ExportDataSinkDialog';\nimport { ImportDataGuideDialog } from '../components/datasink/ImportDataGuideDialog';\n\n// fe-libs UI components\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { GlassCard, IllustratedEmptyState, PagePurpose, NextSteps } from '@burdenoff/fe-libs/ui';\n\n// RBAC\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { AccessDenied, PermissionButton } from '@burdenoff/fe-libs/shared/components';\nimport { BIGCONSOLE_PERMISSIONS } from '../../constants/permissions';\n\n// Lucide icons\nimport {\n ArrowLeft,\n Edit,\n RefreshCw,\n Trash2,\n Database,\n Loader2,\n AlertCircle,\n Eye,\n EyeOff,\n Download,\n Upload,\n Grid3X3,\n Code,\n} from 'lucide-react';\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkViewPage = memo(function DataSinkViewPage() {\n const { dataSinkId } = useParams<{ dataSinkId: string; consoleId: string }>();\n const navigate = useAppNavigate();\n const { t } = useI18n();\n\n // RBAC — PermissionButton gates the action buttons directly; here we only need\n // the read gate that blocks the whole page.\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canRead = hasPermission(BIGCONSOLE_PERMISSIONS.DATASINK_READ);\n\n // Local state\n const [showData, setShowData] = useState(false);\n const [isRefreshing, setIsRefreshing] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n const [isExportDialogOpen, setIsExportDialogOpen] = useState(false);\n const [isImportDialogOpen, setIsImportDialogOpen] = useState(false);\n const [dataPreview, setDataPreview] = useState<Record<string, unknown> | null>(null);\n const [dataLoading, setDataLoading] = useState(false);\n const [dataViewMode, setDataViewMode] = useState<'table' | 'json'>('table');\n // v3.0: server-side pagination for array payloads (avoids loading millions of rows).\n const [pageSize, setPageSize] = useState(100);\n const [pageOffset, setPageOffset] = useState(0);\n const [dataTotalCount, setDataTotalCount] = useState<number | null>(null);\n const [dataHasMore, setDataHasMore] = useState(false);\n\n // Store\n const dataSink = useDataSinkStore((state) => (dataSinkId ? state.dataSinks.get(dataSinkId) : undefined));\n\n // Operations\n const { loading, error, fetchDataSink, getDataSinkData, refreshDataSink, updateDataSink, deleteDataSink } =\n useDataSinkOperations({\n skipFetch: true,\n });\n\n // Subscribe to updates\n useDataSinkSubscription({\n dataSinkId,\n enabled: !!dataSinkId,\n });\n\n // Load DataSink on mount - always fetch full data to get workflowLinks\n useEffect(() => {\n if (dataSinkId) {\n fetchDataSink(dataSinkId);\n }\n }, [dataSinkId, fetchDataSink]);\n\n // Handle back navigation\n const handleBack = useCallback(() => {\n navigate(`/datasinks`);\n }, [navigate]);\n\n // Handle edit\n const handleEdit = useCallback(() => {\n navigate(`/datasinks/${dataSinkId}/edit`);\n }, [navigate, dataSinkId]);\n\n // Handle refresh\n const handleRefresh = useCallback(async () => {\n if (!dataSinkId) return;\n setIsRefreshing(true);\n try {\n await refreshDataSink({ id: dataSinkId });\n } catch (err) {\n } finally {\n setIsRefreshing(false);\n }\n }, [dataSinkId, refreshDataSink]);\n\n // Handle delete\n const handleDelete = useCallback(async () => {\n if (!dataSinkId) return;\n const native = await nativeConfirm({\n title: t('bigconsole.dataSinks.view.deleteConfirmTitle', 'Delete DataSink?'),\n message: t('bigconsole.dataSinks.view.deleteConfirmMessage', 'Are you sure you want to delete this DataSink?'),\n okButtonTitle: t('bigconsole.dataSinks.view.delete', 'Delete'),\n cancelButtonTitle: t('bigconsole.dataSinks.view.cancel', 'Cancel'),\n });\n const ok =\n native === null\n ? window.confirm(\n t('bigconsole.dataSinks.view.deleteConfirmMessage', 'Are you sure you want to delete this DataSink?')\n )\n : native;\n if (!ok) return;\n nativeImpact('medium');\n setIsDeleting(true);\n try {\n await deleteDataSink(dataSinkId);\n if (isNative()) void nativeNotify('success');\n navigate(`/datasinks`);\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n } finally {\n setIsDeleting(false);\n }\n }, [dataSinkId, deleteDataSink, navigate, t]);\n\n // Load one page of the sink's data (v3.0: server-side pagination).\n const loadDataPage = useCallback(\n async (offset: number, size: number) => {\n if (!dataSinkId) return;\n setDataLoading(true);\n try {\n const result = await getDataSinkData({ id: dataSinkId }, { limit: size, offset });\n if (result) {\n setDataPreview((result.raw as Record<string, unknown>) || {});\n // totalCount is non-null only for array payloads being paginated.\n setDataTotalCount(typeof result.totalCount === 'number' ? result.totalCount : null);\n setDataHasMore(Boolean(result.hasMore));\n setPageOffset(offset);\n }\n } catch {\n // handled by the hook's error state\n } finally {\n setDataLoading(false);\n }\n },\n [dataSinkId, getDataSinkData]\n );\n\n // Handle show data (toggles the preview; loads the first page).\n const handleShowData = useCallback(async () => {\n if (!dataSinkId) return;\n if (showData) {\n setShowData(false);\n return;\n }\n await loadDataPage(0, pageSize);\n setShowData(true);\n }, [dataSinkId, showData, loadDataPage, pageSize]);\n\n const handlePageSizeChange = useCallback(\n (size: number) => {\n setPageSize(size);\n void loadDataPage(0, size);\n },\n [loadDataPage]\n );\n\n // Handle export\n const handleExport = useCallback(() => {\n setIsExportDialogOpen(true);\n }, []);\n\n const handleExportClose = useCallback(() => {\n setIsExportDialogOpen(false);\n }, []);\n\n // Handle import — opens a guide explaining that data is imported via a workflow.\n const handleImport = useCallback(() => {\n setIsImportDialogOpen(true);\n }, []);\n\n const handleImportClose = useCallback(() => {\n setIsImportDialogOpen(false);\n }, []);\n\n const handleGoToWorkflows = useCallback(() => {\n setIsImportDialogOpen(false);\n // Navigate straight to the builder path (basePath-aware via useAppNavigate).\n // Going via /workflows/new would hit a <Navigate> redirect to an absolute\n // path that drops the MFE base path — see WorkflowsPage for the same pattern.\n navigate(newWorkflowPath());\n }, [navigate]);\n\n // Direct CSV import — write the parsed rows straight to the sink (no workflow).\n const handleImportCsv = useCallback(\n async (rows: Record<string, unknown>[]): Promise<boolean> => {\n if (!dataSink) return false;\n // The DataSink `data` payload is a JSON scalar that accepts any JSON value;\n // tabular imports are stored as an array of row objects — the shape the\n // table viewer and parsers read. The generated input type narrows JSON to\n // Record<string, unknown>, so cast the row array to satisfy it.\n const updated = await updateDataSink({\n id: dataSink.id,\n version: dataSink.version,\n data: rows as unknown as Record<string, unknown>,\n });\n if (!updated) return false;\n // The import already succeeded. Revealing the data is best-effort — a\n // failure here must not turn a persisted import into a reported failure\n // (which would prompt a retry and hit a version conflict).\n try {\n await loadDataPage(0, pageSize);\n setShowData(true);\n } catch {\n // Data is saved; the user can open the preview manually.\n }\n return true;\n },\n [dataSink, updateDataSink, loadDataPage, pageSize]\n );\n\n // Loading state\n if (loading && !dataSink) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <Loader2 className=\"w-8 h-8 text-text-secondary animate-spin\" />\n </div>\n );\n }\n\n // Error state\n // Only treat the shared hook error as fatal when the sink never loaded. Once\n // it is loaded, transient action errors (e.g. a failed CSV import) surface\n // inline in their own UI and must not replace the whole page.\n if (error && !dataSink) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px] p-card-padding\">\n <div className=\"text-center\">\n <AlertCircle className=\"w-12 h-12 text-status-error-text mx-auto mb-4\" />\n <p className=\"text-status-error-text text-body-sm font-medium mb-2\">\n {t('bigconsole.dataSinks.view.loadError', 'Failed to load DataSink')}\n </p>\n <p className=\"text-text-tertiary text-body-xs mb-6\">{error.message}</p>\n <Button onClick={handleBack} variant=\"ghost\" size=\"sm\">\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.goBack', 'Go back')}\n </Button>\n </div>\n </div>\n );\n }\n\n // Read gate — once permissions have loaded, block actors without read access.\n if (!permissionsLoading && !canRead) {\n return (\n <AccessDenied\n title={t('bigconsole.dataSinks.view.accessDeniedTitle', 'Access Denied')}\n description={t(\n 'bigconsole.dataSinks.view.accessDeniedDescription',\n \"You don't have permission to view this data sink.\"\n )}\n />\n );\n }\n\n // Not found state\n if (!dataSink) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px] p-card-padding\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('bigconsole.dataSinks.view.notFoundTitle', 'DataSink not found')}\n description={t(\n 'bigconsole.dataSinks.view.notFoundDescription',\n \"The DataSink you're looking for doesn't exist or has been deleted.\"\n )}\n action={\n <Button onClick={handleBack} variant=\"default\" size=\"default\">\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.goBackToDataSinks', 'Go back to DataSinks')}\n </Button>\n }\n />\n </div>\n );\n }\n\n return (\n <div className=\"p-card-padding space-y-6\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4\">\n <div className=\"flex-1\">\n <Button onClick={handleBack} variant=\"ghost\" size=\"sm\" className=\"mb-4\">\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.backToDataSinks', 'Back to DataSinks')}\n </Button>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h1 className=\"text-heading-h1 font-bold text-text-primary\">\n {dataSink.name || t('bigconsole.dataSinks.view.untitled', 'Untitled')}\n </h1>\n <DataSinkStatusBadge status={dataSink.status} />\n </div>\n <p className=\"text-body-sm text-text-tertiary font-mono mt-1\">{dataSink.key}</p>\n {dataSink.description && <p className=\"text-body-sm text-text-secondary mt-2\">{dataSink.description}</p>}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.DATASINK_EXECUTE} deniedBehavior=\"disable\">\n <Button onClick={handleRefresh} disabled={isRefreshing} variant=\"secondary\" size=\"default\">\n <RefreshCw className={`w-4 h-4 mr-2 ${isRefreshing ? 'animate-spin' : ''}`} />\n {isRefreshing\n ? t('bigconsole.dataSinks.view.refreshing', 'Refreshing...')\n : t('bigconsole.dataSinks.view.refresh', 'Refresh')}\n </Button>\n </PermissionButton>\n <Button onClick={handleImport} variant=\"secondary\" size=\"default\">\n <Upload className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.importData', 'Import Data')}\n </Button>\n <Button onClick={handleExport} variant=\"secondary\" size=\"default\">\n <Download className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.export', 'Export')}\n </Button>\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.DATASINK_UPDATE} deniedBehavior=\"disable\">\n <Button onClick={handleEdit} variant=\"secondary\" size=\"default\">\n <Edit className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.edit', 'Edit')}\n </Button>\n </PermissionButton>\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.DATASINK_DELETE} deniedBehavior=\"hide\">\n <Button onClick={handleDelete} disabled={isDeleting} variant=\"destructive\" size=\"default\">\n <Trash2 className=\"w-4 h-4 mr-2\" />\n {isDeleting\n ? t('bigconsole.dataSinks.view.deleting', 'Deleting...')\n : t('bigconsole.dataSinks.view.delete', 'Delete')}\n </Button>\n </PermissionButton>\n </div>\n </div>\n\n <PagePurpose>\n {t(\n 'bigconsole.dataSinks.view.pagePurpose',\n 'A data sink is a structured store that holds your processed data and serves it to dashboards. From here you can inspect its schema and stats, preview the cached rows, refresh it from its linked workflow, or export it.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"bigconsole-datasink-view\"\n steps={[\n {\n id: 'preview',\n label: t('bigconsole.dataSinks.view.nextSteps.previewLabel', 'Preview the data'),\n description: t(\n 'bigconsole.dataSinks.view.nextSteps.previewDescription',\n 'Open the cached rows to confirm the sink holds what you expect.'\n ),\n onClick: handleShowData,\n },\n {\n id: 'refresh',\n label: t('bigconsole.dataSinks.view.nextSteps.refreshLabel', 'Refresh from source'),\n description: t(\n 'bigconsole.dataSinks.view.nextSteps.refreshDescription',\n 'Re-run the linked workflow to pull the latest data.'\n ),\n onClick: handleRefresh,\n },\n {\n id: 'build-dashboard',\n label: t('bigconsole.dataSinks.view.nextSteps.dashboardLabel', 'Visualize it on a dashboard'),\n description: t(\n 'bigconsole.dataSinks.view.nextSteps.dashboardDescription',\n 'Add widgets that query this sink to see your data live.'\n ),\n onClick: () => navigate('/dashboards'),\n },\n {\n id: 'export',\n label: t('bigconsole.dataSinks.view.nextSteps.exportLabel', 'Export the data'),\n description: t(\n 'bigconsole.dataSinks.view.nextSteps.exportDescription',\n 'Download the contents for use elsewhere.'\n ),\n onClick: handleExport,\n },\n ]}\n />\n\n {/* Details Grid */}\n <div className=\"grid gap-6 md:grid-cols-2\">\n {/* Info Panel — primary emphasis zone */}\n <GlassCard treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle>{t('bigconsole.dataSinks.view.details', 'Details')}</CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"space-y-4 text-body-sm\">\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">{t('bigconsole.dataSinks.view.status', 'Status')}</dt>\n <dd>\n <DataSinkStatusBadge status={dataSink.status} />\n </dd>\n </div>\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">{t('bigconsole.dataSinks.view.cacheTtl', 'Cache TTL')}</dt>\n <dd className=\"text-text-primary font-medium\">\n {dataSink.ttl ? `${dataSink.ttl}s` : t('bigconsole.dataSinks.view.none', 'None')}\n </dd>\n </div>\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">{t('bigconsole.dataSinks.view.refreshType', 'Refresh Type')}</dt>\n <dd className=\"text-text-primary font-medium capitalize\">\n {dataSink.refresh?.type || t('bigconsole.dataSinks.view.manual', 'Manual')}\n </dd>\n </div>\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">{t('bigconsole.dataSinks.view.size', 'Size')}</dt>\n <dd className=\"text-text-primary font-medium\">\n {dataSink.sizeBytes ? `${(dataSink.sizeBytes / 1024).toFixed(2)} KB` : '0 KB'}\n </dd>\n </div>\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">{t('bigconsole.dataSinks.view.version', 'Version')}</dt>\n <dd className=\"text-text-primary font-medium\">{dataSink.version || 1}</dd>\n </div>\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">\n {t('bigconsole.dataSinks.view.lastRefreshed', 'Last Refreshed')}\n </dt>\n <dd className=\"text-text-primary font-medium\">\n {dataSink.lastRefreshedAt\n ? formatDistanceToNow(new Date(dataSink.lastRefreshedAt), { addSuffix: true })\n : t('bigconsole.dataSinks.view.never', 'Never')}\n </dd>\n </div>\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">{t('bigconsole.dataSinks.view.created', 'Created')}</dt>\n <dd className=\"text-text-primary font-medium\">\n {formatDistanceToNow(new Date(dataSink.createdAt), { addSuffix: true })}\n </dd>\n </div>\n </dl>\n </CardContent>\n </GlassCard>\n\n {/* Workflow Status Panel */}\n {dataSink.fluidGridsWorkflowId && (\n <WorkflowStatusPanel\n workflowId={dataSink.fluidGridsWorkflowId}\n executionId={dataSink.fluidGridsWorkflowExecutionId || undefined}\n lastRefreshedAt={dataSink.lastRefreshedAt || undefined}\n setupState={dataSink.setupState}\n status={dataSink.status}\n onRerunWorkflow={handleRefresh}\n disabled={isRefreshing}\n isRerunning={isRefreshing}\n />\n )}\n\n {/* Linked Workflows */}\n <LinkedWorkflowsPanel workflowLinks={dataSink.workflowLinks} />\n\n {/* Linked Parsers */}\n <LinkedParsersPanel dataSinkKey={dataSink.key} />\n </div>\n\n {/* Data Preview Section */}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0\">\n <CardTitle className=\"flex items-center gap-2\">\n <Database className=\"w-4 h-4 text-text-secondary\" />\n {t('bigconsole.dataSinks.view.dataPreview', 'Data Preview')}\n </CardTitle>\n <div className=\"flex items-center gap-2\">\n {showData && (\n <div className=\"flex items-center border border-border-default rounded-md overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => setDataViewMode('table')}\n className={`p-1.5 ${dataViewMode === 'table' ? 'bg-bg-sunken text-text-primary' : 'text-text-secondary hover:text-text-primary'}`}\n title={t('bigconsole.dataSinks.view.tableView', 'Table view')}\n >\n <Grid3X3 className=\"w-4 h-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => setDataViewMode('json')}\n className={`p-1.5 ${dataViewMode === 'json' ? 'bg-bg-sunken text-text-primary' : 'text-text-secondary hover:text-text-primary'}`}\n title={t('bigconsole.dataSinks.view.jsonView', 'JSON view')}\n >\n <Code className=\"w-4 h-4\" />\n </button>\n </div>\n )}\n <Button\n onClick={handleShowData}\n disabled={dataLoading}\n variant={showData ? 'secondary' : 'default'}\n size=\"sm\"\n >\n {dataLoading ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n {t('bigconsole.dataSinks.view.loading', 'Loading...')}\n </>\n ) : showData ? (\n <>\n <EyeOff className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.hideData', 'Hide Data')}\n </>\n ) : (\n <>\n <Eye className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.showData', 'Show Data')}\n </>\n )}\n </Button>\n </div>\n </CardHeader>\n\n {showData && dataPreview && (\n <CardContent>\n {dataViewMode === 'table' ? (\n <DataSinkTableViewer data={dataPreview} maxHeight=\"400px\" />\n ) : (\n <DataSinkDataViewer data={dataPreview} maxHeight=\"400px\" />\n )}\n {/* v3.0: pagination controls — shown only for array payloads. */}\n {dataTotalCount !== null && (\n <div className=\"flex items-center justify-between gap-4 mt-4 pt-4 border-t border-border-subtle\">\n <div className=\"flex items-center gap-2 text-body-sm text-text-secondary\">\n <span>{t('bigconsole.dataSinks.view.rowsPerPage', 'Rows per page')}</span>\n <select\n aria-label={t('bigconsole.dataSinks.view.rowsPerPage', 'Rows per page')}\n className=\"bg-bg-canvas border border-border-default rounded px-2 py-0.5 text-text-primary\"\n value={pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n >\n {[100, 500, 1000].map((n) => (\n <option key={n} value={n}>\n {n}\n </option>\n ))}\n </select>\n </div>\n <div className=\"flex items-center gap-4 text-body-sm text-text-secondary\">\n <span>\n {dataTotalCount === 0\n ? t('bigconsole.dataSinks.view.zeroRows', '0 rows')\n : t('bigconsole.dataSinks.view.rowRange', '{{start}}–{{end}} of {{total}}', {\n start: pageOffset + 1,\n end: Math.min(pageOffset + pageSize, dataTotalCount),\n total: dataTotalCount,\n })}\n </span>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={pageOffset === 0 || dataLoading}\n onClick={() => void loadDataPage(Math.max(0, pageOffset - pageSize), pageSize)}\n >\n {t('bigconsole.dataSinks.view.previous', 'Previous')}\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={!dataHasMore || dataLoading}\n onClick={() => void loadDataPage(pageOffset + pageSize, pageSize)}\n >\n {t('bigconsole.dataSinks.view.next', 'Next')}\n </Button>\n </div>\n </div>\n )}\n </CardContent>\n )}\n\n {!showData &&\n (dataSink.data && Object.keys(dataSink.data).length > 0 ? (\n <CardContent className=\"text-center p-8\">\n <Database className=\"w-10 h-10 text-text-tertiary mx-auto mb-4\" />\n <p className=\"text-body-sm text-text-secondary\">\n {t('bigconsole.dataSinks.view.showDataHint', 'Click \"Show Data\" to preview the cached data.')}\n </p>\n </CardContent>\n ) : (\n // No data yet — surface the Import Data flow so a new user knows the next step.\n <CardContent className=\"text-center p-8\">\n <Database className=\"w-10 h-10 text-text-tertiary mx-auto mb-4\" />\n <p className=\"text-body-sm text-text-secondary mb-4\">\n {t(\n 'bigconsole.dataSinks.view.noDataYet',\n 'This data sink has no data yet. Upload a CSV or build a workflow to import data.'\n )}\n </p>\n <Button onClick={handleImport} variant=\"default\" size=\"sm\">\n <Upload className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.importData', 'Import Data')}\n </Button>\n </CardContent>\n ))}\n </Card>\n\n {/* Export DataSink Dialog */}\n <ExportDataSinkDialog\n isOpen={isExportDialogOpen}\n dataSinkId={dataSinkId || null}\n dataSinkName={dataSink.name || dataSink.key}\n onClose={handleExportClose}\n />\n\n {/* Import Data guide Dialog */}\n <ImportDataGuideDialog\n isOpen={isImportDialogOpen}\n dataSinkName={dataSink.name || dataSink.key}\n hasExistingData={Boolean(dataSink.data && Object.keys(dataSink.data).length > 0)}\n onClose={handleImportClose}\n onGoToWorkflows={handleGoToWorkflows}\n onImportCsv={handleImportCsv}\n />\n </div>\n );\n});\n\nexport default DataSinkViewPage;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataSinkViewPage.js","names":[],"sources":["../../../src/bigconsole/pages/DataSinkViewPage.tsx"],"sourcesContent":["/**\n * DataSink View Page\n *\n * Page for viewing DataSink details, data preview, and actions.\n */\n\nimport { memo, useState, useEffect, useCallback } from 'react';\nimport { useParams } from 'react-router';\nimport { useAppNavigate } from '../contexts';\nimport { newWorkflowPath } from '../BigConsoleRoutes';\nimport { isNative, nativeConfirm, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport { formatDistanceToNow } from 'date-fns';\nimport { useDataSinkOperations } from '../hooks/useDataSinkOperations';\nimport { useDataSinkSubscription } from '../hooks/useDataSinkSubscription';\nimport { useDataSinkStore } from '../store/dataSinkStore';\nimport { DataSinkStatusBadge } from '../components/datasink/DataSinkStatusBadge';\nimport { DataSinkDataViewer } from '../components/datasink/DataSinkDataViewer';\nimport { DataSinkTableViewer } from '../components/datasink/DataSinkTableViewer';\nimport { LinkedWorkflowsPanel } from '../components/datasink/LinkedWorkflowsPanel';\nimport { LinkedParsersPanel } from '../components/datasink/LinkedParsersPanel';\nimport { WorkflowStatusPanel } from '../components/datasink/WorkflowStatusPanel';\nimport { ExportDataSinkDialog } from '../components/datasink/ExportDataSinkDialog';\nimport { ImportDataGuideDialog } from '../components/datasink/ImportDataGuideDialog';\n\n// fe-libs UI components\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { IllustratedEmptyState, PagePurpose, NextSteps } from '@burdenoff/fe-libs/ui';\n\n// Section-emphasis primitives (BOFF-5632)\nimport { Section, SectionStack, SECTION_FOCUS_RING } from '../components/common';\n\n// RBAC\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { AccessDenied, PermissionButton } from '@burdenoff/fe-libs/shared/components';\nimport { BIGCONSOLE_PERMISSIONS } from '../../constants/permissions';\n\n// Lucide icons\nimport {\n ArrowLeft,\n Edit,\n RefreshCw,\n Trash2,\n Database,\n Loader2,\n AlertCircle,\n Eye,\n EyeOff,\n Download,\n Upload,\n Grid3X3,\n Code,\n} from 'lucide-react';\n\n/**\n * The preview-format segmented control clips its children (`overflow-hidden`\n * preserves the group's rounded corners), which would swallow an offset focus\n * ring entirely — and `SECTION_FOCUS_RING` also suppresses the native outline,\n * so the buttons would have no visible focus at all. Painting the ring inside\n * the button keeps it visible without dropping the group's rounding.\n */\nconst SEGMENT_RING_FIX = 'focus-visible:ring-inset focus-visible:ring-offset-0' as const;\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const DataSinkViewPage = memo(function DataSinkViewPage() {\n const { dataSinkId } = useParams<{ dataSinkId: string; consoleId: string }>();\n const navigate = useAppNavigate();\n const { t } = useI18n();\n\n // RBAC — PermissionButton gates the action buttons directly; here we only need\n // the read gate that blocks the whole page.\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canRead = hasPermission(BIGCONSOLE_PERMISSIONS.DATASINK_READ);\n\n // Local state\n const [showData, setShowData] = useState(false);\n const [isRefreshing, setIsRefreshing] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n const [isExportDialogOpen, setIsExportDialogOpen] = useState(false);\n const [isImportDialogOpen, setIsImportDialogOpen] = useState(false);\n const [dataPreview, setDataPreview] = useState<Record<string, unknown> | null>(null);\n const [dataLoading, setDataLoading] = useState(false);\n const [dataViewMode, setDataViewMode] = useState<'table' | 'json'>('table');\n // v3.0: server-side pagination for array payloads (avoids loading millions of rows).\n const [pageSize, setPageSize] = useState(100);\n const [pageOffset, setPageOffset] = useState(0);\n const [dataTotalCount, setDataTotalCount] = useState<number | null>(null);\n const [dataHasMore, setDataHasMore] = useState(false);\n\n // Store\n const dataSink = useDataSinkStore((state) => (dataSinkId ? state.dataSinks.get(dataSinkId) : undefined));\n\n // Operations\n const { loading, error, fetchDataSink, getDataSinkData, refreshDataSink, updateDataSink, deleteDataSink } =\n useDataSinkOperations({\n skipFetch: true,\n });\n\n // Subscribe to updates\n useDataSinkSubscription({\n dataSinkId,\n enabled: !!dataSinkId,\n });\n\n // Load DataSink on mount - always fetch full data to get workflowLinks\n useEffect(() => {\n if (dataSinkId) {\n fetchDataSink(dataSinkId);\n }\n }, [dataSinkId, fetchDataSink]);\n\n // Handle back navigation\n const handleBack = useCallback(() => {\n navigate(`/datasinks`);\n }, [navigate]);\n\n // Handle edit\n const handleEdit = useCallback(() => {\n navigate(`/datasinks/${dataSinkId}/edit`);\n }, [navigate, dataSinkId]);\n\n // Handle refresh\n const handleRefresh = useCallback(async () => {\n if (!dataSinkId) return;\n setIsRefreshing(true);\n try {\n await refreshDataSink({ id: dataSinkId });\n } catch (err) {\n } finally {\n setIsRefreshing(false);\n }\n }, [dataSinkId, refreshDataSink]);\n\n // Handle delete\n const handleDelete = useCallback(async () => {\n if (!dataSinkId) return;\n const native = await nativeConfirm({\n title: t('bigconsole.dataSinks.view.deleteConfirmTitle', 'Delete DataSink?'),\n message: t('bigconsole.dataSinks.view.deleteConfirmMessage', 'Are you sure you want to delete this DataSink?'),\n okButtonTitle: t('bigconsole.dataSinks.view.delete', 'Delete'),\n cancelButtonTitle: t('bigconsole.dataSinks.view.cancel', 'Cancel'),\n });\n const ok =\n native === null\n ? window.confirm(\n t('bigconsole.dataSinks.view.deleteConfirmMessage', 'Are you sure you want to delete this DataSink?')\n )\n : native;\n if (!ok) return;\n nativeImpact('medium');\n setIsDeleting(true);\n try {\n await deleteDataSink(dataSinkId);\n if (isNative()) void nativeNotify('success');\n navigate(`/datasinks`);\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n } finally {\n setIsDeleting(false);\n }\n }, [dataSinkId, deleteDataSink, navigate, t]);\n\n // Load one page of the sink's data (v3.0: server-side pagination).\n const loadDataPage = useCallback(\n async (offset: number, size: number) => {\n if (!dataSinkId) return;\n setDataLoading(true);\n try {\n const result = await getDataSinkData({ id: dataSinkId }, { limit: size, offset });\n if (result) {\n setDataPreview((result.raw as Record<string, unknown>) || {});\n // totalCount is non-null only for array payloads being paginated.\n setDataTotalCount(typeof result.totalCount === 'number' ? result.totalCount : null);\n setDataHasMore(Boolean(result.hasMore));\n setPageOffset(offset);\n }\n } catch {\n // handled by the hook's error state\n } finally {\n setDataLoading(false);\n }\n },\n [dataSinkId, getDataSinkData]\n );\n\n // Handle show data (toggles the preview; loads the first page).\n const handleShowData = useCallback(async () => {\n if (!dataSinkId) return;\n if (showData) {\n setShowData(false);\n return;\n }\n await loadDataPage(0, pageSize);\n setShowData(true);\n }, [dataSinkId, showData, loadDataPage, pageSize]);\n\n const handlePageSizeChange = useCallback(\n (size: number) => {\n setPageSize(size);\n void loadDataPage(0, size);\n },\n [loadDataPage]\n );\n\n // Handle export\n const handleExport = useCallback(() => {\n setIsExportDialogOpen(true);\n }, []);\n\n const handleExportClose = useCallback(() => {\n setIsExportDialogOpen(false);\n }, []);\n\n // Handle import — opens a guide explaining that data is imported via a workflow.\n const handleImport = useCallback(() => {\n setIsImportDialogOpen(true);\n }, []);\n\n const handleImportClose = useCallback(() => {\n setIsImportDialogOpen(false);\n }, []);\n\n const handleGoToWorkflows = useCallback(() => {\n setIsImportDialogOpen(false);\n // Navigate straight to the builder path (basePath-aware via useAppNavigate).\n // Going via /workflows/new would hit a <Navigate> redirect to an absolute\n // path that drops the MFE base path — see WorkflowsPage for the same pattern.\n navigate(newWorkflowPath());\n }, [navigate]);\n\n // Direct CSV import — write the parsed rows straight to the sink (no workflow).\n const handleImportCsv = useCallback(\n async (rows: Record<string, unknown>[]): Promise<boolean> => {\n if (!dataSink) return false;\n // The DataSink `data` payload is a JSON scalar that accepts any JSON value;\n // tabular imports are stored as an array of row objects — the shape the\n // table viewer and parsers read. The generated input type narrows JSON to\n // Record<string, unknown>, so cast the row array to satisfy it.\n const updated = await updateDataSink({\n id: dataSink.id,\n version: dataSink.version,\n data: rows as unknown as Record<string, unknown>,\n });\n if (!updated) return false;\n // The import already succeeded. Revealing the data is best-effort — a\n // failure here must not turn a persisted import into a reported failure\n // (which would prompt a retry and hit a version conflict).\n try {\n await loadDataPage(0, pageSize);\n setShowData(true);\n } catch {\n // Data is saved; the user can open the preview manually.\n }\n return true;\n },\n [dataSink, updateDataSink, loadDataPage, pageSize]\n );\n\n // Loading state\n if (loading && !dataSink) {\n return (\n <div className=\"flex min-h-[240px] items-center justify-center p-card-padding\">\n <Loader2 className=\"h-icon-lg w-icon-lg animate-spin text-text-secondary\" />\n </div>\n );\n }\n\n // Error state\n // Only treat the shared hook error as fatal when the sink never loaded. Once\n // it is loaded, transient action errors (e.g. a failed CSV import) surface\n // inline in their own UI and must not replace the whole page.\n if (error && !dataSink) {\n return (\n <div className=\"p-card-padding\">\n <Section\n tone=\"danger\"\n headingLevel={2}\n title={t('bigconsole.dataSinks.view.loadError', 'Failed to load DataSink')}\n description={error.message}\n icon={<AlertCircle className=\"h-icon-sm w-icon-sm\" />}\n actions={\n <Button onClick={handleBack} variant=\"secondary\" size=\"sm\">\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.goBack', 'Go back')}\n </Button>\n }\n />\n </div>\n );\n }\n\n // Read gate — once permissions have loaded, block actors without read access.\n if (!permissionsLoading && !canRead) {\n return (\n <AccessDenied\n title={t('bigconsole.dataSinks.view.accessDeniedTitle', 'Access Denied')}\n description={t(\n 'bigconsole.dataSinks.view.accessDeniedDescription',\n \"You don't have permission to view this data sink.\"\n )}\n />\n );\n }\n\n // Not found state\n if (!dataSink) {\n return (\n <div className=\"flex min-h-[240px] items-center justify-center p-card-padding\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('bigconsole.dataSinks.view.notFoundTitle', 'DataSink not found')}\n description={t(\n 'bigconsole.dataSinks.view.notFoundDescription',\n \"The DataSink you're looking for doesn't exist or has been deleted.\"\n )}\n action={\n <Button onClick={handleBack} variant=\"default\" size=\"default\">\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.goBackToDataSinks', 'Go back to DataSinks')}\n </Button>\n }\n />\n </div>\n );\n }\n\n return (\n <div className=\"min-w-0 p-card-padding\">\n {/* Page header strip — structural only, no surface of its own. */}\n <header className=\"mb-section-gap flex flex-col gap-form-gap sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0 flex-1\">\n <Button onClick={handleBack} variant=\"ghost\" size=\"sm\" className=\"mb-4\">\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.backToDataSinks', 'Back to DataSinks')}\n </Button>\n <div className=\"flex flex-wrap items-center gap-2\">\n <h1 className=\"text-2xl font-bold text-text-primary\">\n {dataSink.name || t('bigconsole.dataSinks.view.untitled', 'Untitled')}\n </h1>\n <DataSinkStatusBadge status={dataSink.status} />\n </div>\n <p className=\"mt-1 break-all font-mono text-sm text-text-muted\">{dataSink.key}</p>\n {dataSink.description && <p className=\"mt-2 text-sm text-text-secondary\">{dataSink.description}</p>}\n </div>\n\n {/* Actions. Refresh is the primary act on this route, so the destructive\n button is no longer the loudest thing under the title. */}\n <div className=\"flex flex-wrap items-center gap-2\">\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.DATASINK_EXECUTE} deniedBehavior=\"disable\">\n <Button onClick={handleRefresh} disabled={isRefreshing} variant=\"default\" size=\"default\">\n <RefreshCw className={`w-4 h-4 mr-2 ${isRefreshing ? 'animate-spin' : ''}`} />\n {isRefreshing\n ? t('bigconsole.dataSinks.view.refreshing', 'Refreshing...')\n : t('bigconsole.dataSinks.view.refresh', 'Refresh')}\n </Button>\n </PermissionButton>\n <Button onClick={handleImport} variant=\"secondary\" size=\"default\">\n <Upload className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.importData', 'Import Data')}\n </Button>\n <Button onClick={handleExport} variant=\"secondary\" size=\"default\">\n <Download className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.export', 'Export')}\n </Button>\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.DATASINK_UPDATE} deniedBehavior=\"disable\">\n <Button onClick={handleEdit} variant=\"secondary\" size=\"default\">\n <Edit className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.edit', 'Edit')}\n </Button>\n </PermissionButton>\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.DATASINK_DELETE} deniedBehavior=\"hide\">\n <Button onClick={handleDelete} disabled={isDeleting} variant=\"destructive\" size=\"default\">\n <Trash2 className=\"w-4 h-4 mr-2\" />\n {isDeleting\n ? t('bigconsole.dataSinks.view.deleting', 'Deleting...')\n : t('bigconsole.dataSinks.view.delete', 'Delete')}\n </Button>\n </PermissionButton>\n </div>\n </header>\n\n <PagePurpose className=\"mb-section-gap\">\n {t(\n 'bigconsole.dataSinks.view.pagePurpose',\n 'A data sink is a structured store that holds your processed data and serves it to dashboards. From here you can inspect its schema and stats, preview the cached rows, refresh it from its linked workflow, or export it.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"bigconsole-datasink-view\"\n steps={[\n {\n id: 'preview',\n label: t('bigconsole.dataSinks.view.nextSteps.previewLabel', 'Preview the data'),\n description: t(\n 'bigconsole.dataSinks.view.nextSteps.previewDescription',\n 'Open the cached rows to confirm the sink holds what you expect.'\n ),\n onClick: handleShowData,\n },\n {\n id: 'refresh',\n label: t('bigconsole.dataSinks.view.nextSteps.refreshLabel', 'Refresh from source'),\n description: t(\n 'bigconsole.dataSinks.view.nextSteps.refreshDescription',\n 'Re-run the linked workflow to pull the latest data.'\n ),\n onClick: handleRefresh,\n },\n {\n id: 'build-dashboard',\n label: t('bigconsole.dataSinks.view.nextSteps.dashboardLabel', 'Visualize it on a dashboard'),\n description: t(\n 'bigconsole.dataSinks.view.nextSteps.dashboardDescription',\n 'Add widgets that query this sink to see your data live.'\n ),\n onClick: () => navigate('/dashboards'),\n },\n {\n id: 'export',\n label: t('bigconsole.dataSinks.view.nextSteps.exportLabel', 'Export the data'),\n description: t(\n 'bigconsole.dataSinks.view.nextSteps.exportDescription',\n 'Download the contents for use elsewhere.'\n ),\n onClick: handleExport,\n },\n ]}\n />\n\n <SectionStack className=\"mt-section-gap\">\n {/* Supporting context: four peer panels, one container idiom. */}\n <div className=\"grid min-w-0 gap-section-gap md:grid-cols-2\">\n {/* Reference metadata. `standard`, matching the three sibling panels in\n this grid — one recessed cell beside three raised ones read as a\n rendering fault rather than as hierarchy. The `primary` preview\n below still carries the elevation that separates it from all four. */}\n <Section\n headingLevel={2}\n title={t('bigconsole.dataSinks.view.details', 'Details')}\n description=\"Cache, refresh and storage settings for this sink.\"\n >\n <dl className=\"divide-y divide-[var(--color-border-subtle)] text-sm\">\n <div className=\"flex flex-wrap items-center justify-between gap-x-form-gap gap-y-1 py-2 first:pt-0\">\n <dt className=\"min-w-0 text-text-secondary\">{t('bigconsole.dataSinks.view.status', 'Status')}</dt>\n <dd>\n <DataSinkStatusBadge status={dataSink.status} size=\"sm\" />\n </dd>\n </div>\n <div className=\"flex flex-wrap items-center justify-between gap-x-form-gap gap-y-1 py-2\">\n <dt className=\"min-w-0 text-text-secondary\">{t('bigconsole.dataSinks.view.cacheTtl', 'Cache TTL')}</dt>\n <dd className=\"font-medium text-text-primary\">\n {dataSink.ttl ? `${dataSink.ttl}s` : t('bigconsole.dataSinks.view.none', 'None')}\n </dd>\n </div>\n <div className=\"flex flex-wrap items-center justify-between gap-x-form-gap gap-y-1 py-2\">\n <dt className=\"min-w-0 text-text-secondary\">\n {t('bigconsole.dataSinks.view.refreshType', 'Refresh Type')}\n </dt>\n <dd className=\"font-medium capitalize text-text-primary\">\n {dataSink.refresh?.type || t('bigconsole.dataSinks.view.manual', 'Manual')}\n </dd>\n </div>\n <div className=\"flex flex-wrap items-center justify-between gap-x-form-gap gap-y-1 py-2\">\n <dt className=\"min-w-0 text-text-secondary\">{t('bigconsole.dataSinks.view.size', 'Size')}</dt>\n <dd className=\"font-medium text-text-primary\">\n {dataSink.sizeBytes ? `${(dataSink.sizeBytes / 1024).toFixed(2)} KB` : '0 KB'}\n </dd>\n </div>\n <div className=\"flex flex-wrap items-center justify-between gap-x-form-gap gap-y-1 py-2\">\n <dt className=\"min-w-0 text-text-secondary\">{t('bigconsole.dataSinks.view.version', 'Version')}</dt>\n <dd className=\"font-medium text-text-primary\">{dataSink.version || 1}</dd>\n </div>\n <div className=\"flex flex-wrap items-center justify-between gap-x-form-gap gap-y-1 py-2\">\n <dt className=\"min-w-0 text-text-secondary\">\n {t('bigconsole.dataSinks.view.lastRefreshed', 'Last Refreshed')}\n </dt>\n <dd className=\"font-medium text-text-primary\">\n {dataSink.lastRefreshedAt\n ? formatDistanceToNow(new Date(dataSink.lastRefreshedAt), { addSuffix: true })\n : t('bigconsole.dataSinks.view.never', 'Never')}\n </dd>\n </div>\n <div className=\"flex flex-wrap items-center justify-between gap-x-form-gap gap-y-1 py-2 last:pb-0\">\n <dt className=\"min-w-0 text-text-secondary\">{t('bigconsole.dataSinks.view.created', 'Created')}</dt>\n <dd className=\"font-medium text-text-primary\">\n {formatDistanceToNow(new Date(dataSink.createdAt), { addSuffix: true })}\n </dd>\n </div>\n </dl>\n </Section>\n\n {/* Workflow Status Panel */}\n {dataSink.fluidGridsWorkflowId && (\n <WorkflowStatusPanel\n workflowId={dataSink.fluidGridsWorkflowId}\n executionId={dataSink.fluidGridsWorkflowExecutionId || undefined}\n lastRefreshedAt={dataSink.lastRefreshedAt || undefined}\n setupState={dataSink.setupState}\n status={dataSink.status}\n onRerunWorkflow={handleRefresh}\n disabled={isRefreshing}\n isRerunning={isRefreshing}\n />\n )}\n\n {/* Linked Workflows */}\n <LinkedWorkflowsPanel workflowLinks={dataSink.workflowLinks} />\n\n {/* Linked Parsers */}\n <LinkedParsersPanel dataSinkKey={dataSink.key} />\n </div>\n\n {/* The point of this route: the cached rows themselves. */}\n <Section\n emphasis=\"primary\"\n headingLevel={2}\n title={t('bigconsole.dataSinks.view.dataPreview', 'Data Preview')}\n description=\"The rows this sink is currently serving to dashboards.\"\n icon={<Database className=\"h-icon-sm w-icon-sm\" />}\n actions={\n <>\n {showData && (\n <div\n role=\"group\"\n aria-label={t('bigconsole.dataSinks.view.dataPreview', 'Data Preview')}\n className=\"flex items-center overflow-hidden rounded-button border border-[var(--color-border-default)]\"\n >\n <button\n type=\"button\"\n onClick={() => setDataViewMode('table')}\n aria-pressed={dataViewMode === 'table'}\n className={`flex h-control-md w-[var(--size-controlHeight-md)] items-center justify-center ${SECTION_FOCUS_RING} ${SEGMENT_RING_FIX} ${\n dataViewMode === 'table'\n ? 'bg-bg-sunken text-text-primary'\n : 'text-text-secondary hover:text-text-primary'\n }`}\n title={t('bigconsole.dataSinks.view.tableView', 'Table view')}\n >\n <Grid3X3 className=\"w-4 h-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => setDataViewMode('json')}\n aria-pressed={dataViewMode === 'json'}\n className={`flex h-control-md w-[var(--size-controlHeight-md)] items-center justify-center ${SECTION_FOCUS_RING} ${SEGMENT_RING_FIX} ${\n dataViewMode === 'json'\n ? 'bg-bg-sunken text-text-primary'\n : 'text-text-secondary hover:text-text-primary'\n }`}\n title={t('bigconsole.dataSinks.view.jsonView', 'JSON view')}\n >\n <Code className=\"w-4 h-4\" />\n </button>\n </div>\n )}\n <Button\n onClick={handleShowData}\n disabled={dataLoading}\n variant={showData ? 'secondary' : 'default'}\n size=\"sm\"\n >\n {dataLoading ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n {t('bigconsole.dataSinks.view.loading', 'Loading...')}\n </>\n ) : showData ? (\n <>\n <EyeOff className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.hideData', 'Hide Data')}\n </>\n ) : (\n <>\n <Eye className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.showData', 'Show Data')}\n </>\n )}\n </Button>\n </>\n }\n >\n {showData && dataPreview && (\n <>\n {dataViewMode === 'table' ? (\n <DataSinkTableViewer data={dataPreview} maxHeight=\"400px\" />\n ) : (\n <DataSinkDataViewer data={dataPreview} maxHeight=\"400px\" />\n )}\n {/* v3.0: pagination controls — shown only for array payloads. */}\n {dataTotalCount !== null && (\n <div className=\"mt-form-gap flex flex-wrap items-center justify-between gap-form-gap border-t border-[var(--color-border-subtle)] pt-form-gap\">\n <label className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <span>{t('bigconsole.dataSinks.view.rowsPerPage', 'Rows per page')}</span>\n <select\n aria-label={t('bigconsole.dataSinks.view.rowsPerPage', 'Rows per page')}\n className={`h-control-md rounded-input border border-[var(--color-border-default)] bg-bg-canvas px-2 text-text-primary ${SECTION_FOCUS_RING}`}\n value={pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n >\n {[100, 500, 1000].map((n) => (\n <option key={n} value={n}>\n {n}\n </option>\n ))}\n </select>\n </label>\n <div className=\"flex flex-wrap items-center gap-control-gap text-sm text-text-secondary\">\n <span>\n {dataTotalCount === 0\n ? t('bigconsole.dataSinks.view.zeroRows', '0 rows')\n : t('bigconsole.dataSinks.view.rowRange', '{{start}}–{{end}} of {{total}}', {\n start: pageOffset + 1,\n end: Math.min(pageOffset + pageSize, dataTotalCount),\n total: dataTotalCount,\n })}\n </span>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={pageOffset === 0 || dataLoading}\n onClick={() => void loadDataPage(Math.max(0, pageOffset - pageSize), pageSize)}\n >\n {t('bigconsole.dataSinks.view.previous', 'Previous')}\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={!dataHasMore || dataLoading}\n onClick={() => void loadDataPage(pageOffset + pageSize, pageSize)}\n >\n {t('bigconsole.dataSinks.view.next', 'Next')}\n </Button>\n </div>\n </div>\n )}\n </>\n )}\n\n {!showData &&\n (dataSink.data && Object.keys(dataSink.data).length > 0 ? (\n <p className=\"flex items-center gap-icon-gap text-sm text-text-secondary\">\n <Database aria-hidden=\"true\" className=\"h-icon-sm w-icon-sm shrink-0 text-text-muted\" />\n {t('bigconsole.dataSinks.view.showDataHint', 'Click \"Show Data\" to preview the cached data.')}\n </p>\n ) : (\n // No data yet — surface the Import Data flow so a new user knows the next step.\n <div className=\"flex flex-col items-center gap-form-gap py-form-gap text-center\">\n <Database aria-hidden=\"true\" className=\"h-icon-lg w-icon-lg text-text-muted\" />\n <p className=\"text-sm text-text-secondary\">\n {t(\n 'bigconsole.dataSinks.view.noDataYet',\n 'This data sink has no data yet. Upload a CSV or build a workflow to import data.'\n )}\n </p>\n <Button onClick={handleImport} variant=\"default\" size=\"sm\">\n <Upload className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.dataSinks.view.importData', 'Import Data')}\n </Button>\n </div>\n ))}\n </Section>\n </SectionStack>\n\n {/* Export DataSink Dialog */}\n <ExportDataSinkDialog\n isOpen={isExportDialogOpen}\n dataSinkId={dataSinkId || null}\n dataSinkName={dataSink.name || dataSink.key}\n onClose={handleExportClose}\n />\n\n {/* Import Data guide Dialog */}\n <ImportDataGuideDialog\n isOpen={isImportDialogOpen}\n dataSinkName={dataSink.name || dataSink.key}\n hasExistingData={Boolean(dataSink.data && Object.keys(dataSink.data).length > 0)}\n onClose={handleImportClose}\n onGoToWorkflows={handleGoToWorkflows}\n onImportCsv={handleImportCsv}\n />\n </div>\n );\n});\n\nexport default DataSinkViewPage;\n"],"mappings":"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"}
|