@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":"GlobalFiltersBar.js","names":[],"sources":["../../../../../src/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.tsx"],"sourcesContent":["/**\n * GlobalFiltersBar Component\n *\n * Displays and manages global dashboard filters.\n * v2.0: Added URL persistence and filter presets support.\n */\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport {\n useGlobalFilters,\n useFilterUrlSync,\n useFilterPresets,\n type GlobalFilter,\n type FilterType,\n} from '../../../hooks';\nimport { FilterChip } from './FilterChip';\nimport { FilterEditor } from './FilterEditor';\nimport { FilterPresetSelector } from './FilterPresetSelector';\nimport { SEMANTIC_COLORS } from '../../../utils/semanticTokens';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface GlobalFiltersBarProps {\n dashboardId: string;\n onFilterChange?: (values: Record<string, unknown>) => void;\n collapsible?: boolean;\n className?: string;\n /** Enable URL sync for shareable filtered views */\n enableUrlSync?: boolean;\n /** Enable filter presets */\n enablePresets?: boolean;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function GlobalFiltersBar({\n dashboardId,\n onFilterChange,\n collapsible = true,\n className = '',\n enableUrlSync = true,\n enablePresets = true,\n}: GlobalFiltersBarProps) {\n const { t } = useI18n();\n const {\n filters,\n activeValues,\n loading,\n fetchFilters,\n createFilter,\n updateFilter,\n deleteFilter,\n setFilterValue,\n resetFilters,\n } = useGlobalFilters();\n\n // URL Sync hook\n const { getShareableUrl, clearUrlParams } = useFilterUrlSync({\n enabled: enableUrlSync,\n paramPrefix: 'filter_',\n debounceMs: 300,\n });\n\n // Filter Presets hook\n const {\n presets,\n activePresetId,\n loadPresets,\n applyPreset,\n saveCurrentAsPreset,\n deletePreset: removePreset,\n clearActivePreset,\n } = useFilterPresets(dashboardId);\n\n const [isCollapsed, setIsCollapsed] = useState(false);\n const [isEditorOpen, setIsEditorOpen] = useState(false);\n const [editingFilter, setEditingFilter] = useState<GlobalFilter | null>(null);\n const [showShareTooltip, setShowShareTooltip] = useState(false);\n\n // Fetch filters on mount\n useEffect(() => {\n if (dashboardId) {\n fetchFilters(dashboardId);\n if (enablePresets) {\n loadPresets(dashboardId);\n }\n }\n }, [dashboardId, fetchFilters, loadPresets, enablePresets]);\n\n // Notify parent of filter changes\n useEffect(() => {\n if (onFilterChange) {\n onFilterChange(activeValues);\n }\n }, [activeValues, onFilterChange]);\n\n // Clear active preset when filter values change manually\n useEffect(() => {\n if (activePresetId && Object.keys(activeValues).length > 0) {\n // Check if current values differ from active preset\n const preset = presets.find((p) => p.id === activePresetId);\n if (preset) {\n const presetStr = JSON.stringify(preset.values);\n const currentStr = JSON.stringify(activeValues);\n if (presetStr !== currentStr) {\n clearActivePreset();\n }\n }\n }\n }, [activeValues, activePresetId, presets, clearActivePreset]);\n\n // Handle filter value change\n const handleFilterChange = useCallback(\n (filterId: string, value: unknown) => {\n setFilterValue(filterId, value);\n },\n [setFilterValue]\n );\n\n // Handle add new filter\n const handleAddFilter = useCallback(() => {\n setEditingFilter(null);\n setIsEditorOpen(true);\n }, []);\n\n // Handle edit filter\n const handleEditFilter = useCallback((filter: GlobalFilter) => {\n setEditingFilter(filter);\n setIsEditorOpen(true);\n }, []);\n\n // Handle save filter\n const handleSaveFilter = useCallback(\n async (data: {\n name: string;\n type: FilterType;\n config: Record<string, unknown>;\n defaultValue?: unknown;\n isRequired?: boolean;\n }) => {\n if (editingFilter) {\n await updateFilter({\n id: editingFilter.id,\n name: data.name,\n config: data.config,\n defaultValue: data.defaultValue,\n isRequired: data.isRequired,\n });\n } else {\n await createFilter({\n dashboardId,\n name: data.name,\n type: data.type,\n config: data.config,\n defaultValue: data.defaultValue,\n isRequired: data.isRequired,\n });\n }\n setIsEditorOpen(false);\n setEditingFilter(null);\n },\n [dashboardId, editingFilter, createFilter, updateFilter]\n );\n\n // Handle delete filter\n const handleDeleteFilter = useCallback(\n async (filterId: string) => {\n await deleteFilter(filterId);\n },\n [deleteFilter]\n );\n\n // Handle reset all filters\n const handleResetAll = useCallback(() => {\n resetFilters();\n clearUrlParams();\n clearActivePreset();\n }, [resetFilters, clearUrlParams, clearActivePreset]);\n\n // Handle copy shareable URL\n const handleCopyShareableUrl = useCallback(async () => {\n const url = getShareableUrl();\n try {\n await navigator.clipboard.writeText(url);\n setShowShareTooltip(true);\n setTimeout(() => setShowShareTooltip(false), 2000);\n } catch {\n // Failed to copy URL to clipboard\n }\n }, [getShareableUrl]);\n\n // Handle apply preset\n const handleApplyPreset = useCallback(\n (presetId: string) => {\n applyPreset(presetId);\n },\n [applyPreset]\n );\n\n // Handle save current as preset\n const handleSavePreset = useCallback(\n (name: string, description?: string) => {\n saveCurrentAsPreset(name, description);\n },\n [saveCurrentAsPreset]\n );\n\n // Handle delete preset\n const handleDeletePreset = useCallback(\n (presetId: string) => {\n removePreset(presetId);\n },\n [removePreset]\n );\n\n // Toggle collapse\n const toggleCollapse = useCallback(() => {\n setIsCollapsed((prev) => !prev);\n }, []);\n\n // Count active filters\n const activeFilterCount = Object.keys(activeValues).filter(\n (key) => activeValues[key] !== undefined && activeValues[key] !== null && activeValues[key] !== ''\n ).length;\n\n if (loading && filters.length === 0) {\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n padding: '12px 16px',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n borderBottom: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n }}\n >\n <div\n style={{\n width: '16px',\n height: '16px',\n border: `2px solid ${SEMANTIC_COLORS.actionPrimaryBg}`,\n borderTopColor: 'transparent',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n }}\n />\n <span style={{ color: SEMANTIC_COLORS.textSecondary, fontSize: '14px' }}>\n {t('bigconsole.filters.bar.loading', 'Loading filters...')}\n </span>\n </div>\n );\n }\n\n // Show empty state with \"Add Filter\" button when no filters exist\n if (filters.length === 0) {\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px 16px',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n borderBottom: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n <span style={{ fontWeight: 600, fontSize: '14px', color: SEMANTIC_COLORS.textPrimary }}>\n {t('bigconsole.filters.bar.title', 'Filters')}\n </span>\n <span style={{ color: SEMANTIC_COLORS.textTertiary, fontSize: '13px' }}>\n {t('bigconsole.filters.bar.noFiltersConfigured', 'No filters configured')}\n </span>\n </div>\n <button\n onClick={handleAddFilter}\n style={{\n padding: '6px 14px',\n fontSize: '13px',\n color: SEMANTIC_COLORS.actionPrimaryFg,\n backgroundColor: SEMANTIC_COLORS.actionPrimaryBg,\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n fontWeight: 500,\n boxShadow: '0 2px 4px rgba(99, 102, 241, 0.3)',\n }}\n >\n {t('bigconsole.filters.bar.addFilter', '+ Add Filter')}\n </button>\n\n {/* Filter Editor Modal */}\n {isEditorOpen && (\n <FilterEditor\n filter={editingFilter}\n onSave={handleSaveFilter}\n onClose={() => {\n setIsEditorOpen(false);\n setEditingFilter(null);\n }}\n />\n )}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n borderBottom: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n boxShadow: '0 2px 4px rgba(0,0,0,0.05)',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '10px 16px',\n borderBottom: isCollapsed ? 'none' : `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n backgroundColor: SEMANTIC_COLORS.bgSecondary,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n <span style={{ fontWeight: 600, fontSize: '14px', color: SEMANTIC_COLORS.textPrimary }}>\n {t('bigconsole.filters.bar.title', 'Filters')}\n </span>\n <span\n style={{\n fontSize: '12px',\n color: SEMANTIC_COLORS.actionPrimaryFg,\n backgroundColor: SEMANTIC_COLORS.actionPrimaryBg,\n padding: '2px 8px',\n borderRadius: '12px',\n fontWeight: 500,\n }}\n >\n {filters.length}\n </span>\n {activeFilterCount > 0 && (\n <span\n style={{\n fontSize: '11px',\n color: SEMANTIC_COLORS.statusSuccessText,\n backgroundColor: SEMANTIC_COLORS.statusSuccessBgSubtle,\n padding: '2px 8px',\n borderRadius: '12px',\n fontWeight: 500,\n }}\n >\n {t('bigconsole.filters.bar.activeCount', '{{count}} active', {\n count: activeFilterCount ?? '',\n })}\n </span>\n )}\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n {/* Filter Presets Selector */}\n {enablePresets && (\n <FilterPresetSelector\n presets={presets}\n activePresetId={activePresetId}\n onApplyPreset={handleApplyPreset}\n onSavePreset={handleSavePreset}\n onDeletePreset={handleDeletePreset}\n />\n )}\n\n {/* Share URL Button */}\n {enableUrlSync && activeFilterCount > 0 && (\n <div style={{ position: 'relative' }}>\n <button\n onClick={handleCopyShareableUrl}\n title={t('bigconsole.filters.bar.shareUrlTitle', 'Copy shareable URL with filters')}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '8px 12px',\n fontSize: '13px',\n color: SEMANTIC_COLORS.textSecondary,\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n border: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '6px',\n cursor: 'pointer',\n fontWeight: 500,\n }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M4 12v8a2 2 0 002 2h12a2 2 0 002-2v-8\" />\n <polyline points=\"16,6 12,2 8,6\" />\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"15\" />\n </svg>\n {t('bigconsole.filters.bar.share', 'Share')}\n </button>\n {showShareTooltip && (\n <div\n style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginTop: '4px',\n padding: '6px 12px',\n backgroundColor: SEMANTIC_COLORS.textPrimary,\n color: SEMANTIC_COLORS.bgPrimary,\n fontSize: '12px',\n borderRadius: '4px',\n whiteSpace: 'nowrap',\n zIndex: 100001,\n }}\n >\n {t('bigconsole.filters.bar.urlCopied', 'URL copied!')}\n </div>\n )}\n </div>\n )}\n\n {/* Reset Button */}\n {activeFilterCount > 0 && (\n <button\n onClick={handleResetAll}\n style={{\n padding: '8px 12px',\n fontSize: '13px',\n color: SEMANTIC_COLORS.statusErrorText,\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n fontWeight: 500,\n }}\n >\n {t('bigconsole.filters.bar.resetAll', 'Reset all')}\n </button>\n )}\n\n {/* Add Filter Button */}\n <button\n onClick={handleAddFilter}\n style={{\n padding: '8px 14px',\n fontSize: '13px',\n color: SEMANTIC_COLORS.actionPrimaryFg,\n backgroundColor: SEMANTIC_COLORS.actionPrimaryBg,\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n fontWeight: 500,\n boxShadow: '0 2px 4px rgba(99, 102, 241, 0.3)',\n }}\n >\n {t('bigconsole.filters.bar.addFilter', '+ Add Filter')}\n </button>\n\n {/* Collapse Button */}\n {collapsible && (\n <button\n onClick={toggleCollapse}\n style={{\n padding: '8px 12px',\n fontSize: '13px',\n color: SEMANTIC_COLORS.textSecondary,\n backgroundColor: 'transparent',\n border: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '6px',\n cursor: 'pointer',\n }}\n >\n {isCollapsed\n ? t('bigconsole.filters.bar.expand', '▼ Expand')\n : t('bigconsole.filters.bar.collapse', '▲ Collapse')}\n </button>\n )}\n </div>\n </div>\n\n {/* Filters List */}\n {!isCollapsed && (\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: '10px',\n padding: '12px 16px',\n overflow: 'visible',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n position: 'relative',\n }}\n >\n {filters.map((filter) => (\n <FilterChip\n key={filter.id}\n filter={filter}\n value={activeValues[filter.id]}\n onChange={(value) => handleFilterChange(filter.id, value)}\n onEdit={() => handleEditFilter(filter)}\n onDelete={() => handleDeleteFilter(filter.id)}\n />\n ))}\n </div>\n )}\n\n {/* Filter Editor Modal */}\n {isEditorOpen && (\n <FilterEditor\n filter={editingFilter}\n onSave={handleSaveFilter}\n onClose={() => {\n setIsEditorOpen(false);\n setEditingFilter(null);\n }}\n />\n )}\n </div>\n );\n}\n\nexport default GlobalFiltersBar;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GlobalFiltersBar.js","names":[],"sources":["../../../../../src/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.tsx"],"sourcesContent":["/**\n * GlobalFiltersBar Component\n *\n * Displays and manages global dashboard filters.\n * v2.0: Added URL persistence and filter presets support.\n */\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport {\n useGlobalFilters,\n useFilterUrlSync,\n useFilterPresets,\n type GlobalFilter,\n type FilterType,\n} from '../../../hooks';\nimport { FilterChip } from './FilterChip';\nimport { FilterEditor } from './FilterEditor';\nimport { FilterPresetSelector } from './FilterPresetSelector';\nimport { SEMANTIC_COLORS } from '../../../utils/semanticTokens';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { SECTION_FOCUS_RING } from '../../common';\n\n// ============================================================================\n// Local class vocabulary\n// ============================================================================\n\n/**\n * The filters bar configures the board below it. Before this it shipped a\n * saturated primary \"+ Add Filter\" with an indigo glow and a drop-shadowed\n * container, which made the configuration louder than the data it filtered.\n * Everything here is deliberately secondary weight.\n */\nconst SECONDARY_BUTTON_CLASSES = `inline-flex min-h-control-sm items-center gap-icon-gap rounded-button border border-[var(--color-border-subtle)] bg-bg-surface px-3 py-1 text-sm font-medium text-text-primary motion-safe:transition-colors hover:bg-bg-accentSubtle ${SECTION_FOCUS_RING}`;\n\n/** Text-only affordances (reset, collapse) sit a step below that again. */\nconst QUIET_BUTTON_CLASSES = `inline-flex min-h-control-sm items-center gap-icon-gap rounded-button px-2 py-1 text-sm font-medium text-text-secondary motion-safe:transition-colors hover:bg-bg-accentSubtle ${SECTION_FOCUS_RING}`;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface GlobalFiltersBarProps {\n dashboardId: string;\n onFilterChange?: (values: Record<string, unknown>) => void;\n collapsible?: boolean;\n className?: string;\n /** Enable URL sync for shareable filtered views */\n enableUrlSync?: boolean;\n /** Enable filter presets */\n enablePresets?: boolean;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function GlobalFiltersBar({\n dashboardId,\n onFilterChange,\n collapsible = true,\n className = '',\n enableUrlSync = true,\n enablePresets = true,\n}: GlobalFiltersBarProps) {\n const { t } = useI18n();\n const {\n filters,\n activeValues,\n loading,\n fetchFilters,\n createFilter,\n updateFilter,\n deleteFilter,\n setFilterValue,\n resetFilters,\n } = useGlobalFilters();\n\n // URL Sync hook\n const { getShareableUrl, clearUrlParams } = useFilterUrlSync({\n enabled: enableUrlSync,\n paramPrefix: 'filter_',\n debounceMs: 300,\n });\n\n // Filter Presets hook\n const {\n presets,\n activePresetId,\n loadPresets,\n applyPreset,\n saveCurrentAsPreset,\n deletePreset: removePreset,\n clearActivePreset,\n } = useFilterPresets(dashboardId);\n\n const [isCollapsed, setIsCollapsed] = useState(false);\n const [isEditorOpen, setIsEditorOpen] = useState(false);\n const [editingFilter, setEditingFilter] = useState<GlobalFilter | null>(null);\n const [showShareTooltip, setShowShareTooltip] = useState(false);\n\n // Fetch filters on mount\n useEffect(() => {\n if (dashboardId) {\n fetchFilters(dashboardId);\n if (enablePresets) {\n loadPresets(dashboardId);\n }\n }\n }, [dashboardId, fetchFilters, loadPresets, enablePresets]);\n\n // Notify parent of filter changes\n useEffect(() => {\n if (onFilterChange) {\n onFilterChange(activeValues);\n }\n }, [activeValues, onFilterChange]);\n\n // Clear active preset when filter values change manually\n useEffect(() => {\n if (activePresetId && Object.keys(activeValues).length > 0) {\n // Check if current values differ from active preset\n const preset = presets.find((p) => p.id === activePresetId);\n if (preset) {\n const presetStr = JSON.stringify(preset.values);\n const currentStr = JSON.stringify(activeValues);\n if (presetStr !== currentStr) {\n clearActivePreset();\n }\n }\n }\n }, [activeValues, activePresetId, presets, clearActivePreset]);\n\n // Handle filter value change\n const handleFilterChange = useCallback(\n (filterId: string, value: unknown) => {\n setFilterValue(filterId, value);\n },\n [setFilterValue]\n );\n\n // Handle add new filter\n const handleAddFilter = useCallback(() => {\n setEditingFilter(null);\n setIsEditorOpen(true);\n }, []);\n\n // Handle edit filter\n const handleEditFilter = useCallback((filter: GlobalFilter) => {\n setEditingFilter(filter);\n setIsEditorOpen(true);\n }, []);\n\n // Handle save filter\n const handleSaveFilter = useCallback(\n async (data: {\n name: string;\n type: FilterType;\n config: Record<string, unknown>;\n defaultValue?: unknown;\n isRequired?: boolean;\n }) => {\n if (editingFilter) {\n await updateFilter({\n id: editingFilter.id,\n name: data.name,\n config: data.config,\n defaultValue: data.defaultValue,\n isRequired: data.isRequired,\n });\n } else {\n await createFilter({\n dashboardId,\n name: data.name,\n type: data.type,\n config: data.config,\n defaultValue: data.defaultValue,\n isRequired: data.isRequired,\n });\n }\n setIsEditorOpen(false);\n setEditingFilter(null);\n },\n [dashboardId, editingFilter, createFilter, updateFilter]\n );\n\n // Handle delete filter\n const handleDeleteFilter = useCallback(\n async (filterId: string) => {\n await deleteFilter(filterId);\n },\n [deleteFilter]\n );\n\n // Handle reset all filters\n const handleResetAll = useCallback(() => {\n resetFilters();\n clearUrlParams();\n clearActivePreset();\n }, [resetFilters, clearUrlParams, clearActivePreset]);\n\n // Handle copy shareable URL\n const handleCopyShareableUrl = useCallback(async () => {\n const url = getShareableUrl();\n try {\n await navigator.clipboard.writeText(url);\n setShowShareTooltip(true);\n setTimeout(() => setShowShareTooltip(false), 2000);\n } catch {\n // Failed to copy URL to clipboard\n }\n }, [getShareableUrl]);\n\n // Handle apply preset\n const handleApplyPreset = useCallback(\n (presetId: string) => {\n applyPreset(presetId);\n },\n [applyPreset]\n );\n\n // Handle save current as preset\n const handleSavePreset = useCallback(\n (name: string, description?: string) => {\n saveCurrentAsPreset(name, description);\n },\n [saveCurrentAsPreset]\n );\n\n // Handle delete preset\n const handleDeletePreset = useCallback(\n (presetId: string) => {\n removePreset(presetId);\n },\n [removePreset]\n );\n\n // Toggle collapse\n const toggleCollapse = useCallback(() => {\n setIsCollapsed((prev) => !prev);\n }, []);\n\n // Count active filters\n const activeFilterCount = Object.keys(activeValues).filter(\n (key) => activeValues[key] !== undefined && activeValues[key] !== null && activeValues[key] !== ''\n ).length;\n\n if (loading && filters.length === 0) {\n return (\n <div\n className={`flex flex-wrap items-center gap-control-gap border-b border-[var(--color-border-subtle)] bg-bg-sunken px-card-padding py-control-gap ${className}`}\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"global-filters-loading\"\n >\n <span className=\"h-icon-sm w-icon-sm animate-spin rounded-full border-2 border-action-primary-bg border-t-transparent\" />\n <span className=\"text-sm text-text-secondary\">{t('bigconsole.filters.bar.loading', 'Loading filters...')}</span>\n </div>\n );\n }\n\n // Show empty state with \"Add Filter\" button when no filters exist\n if (filters.length === 0) {\n return (\n <div\n className={`flex flex-wrap items-center justify-between gap-control-gap border-b border-[var(--color-border-subtle)] bg-bg-sunken px-card-padding py-control-gap ${className}`}\n data-testid=\"global-filters-empty\"\n >\n <div className=\"flex min-w-0 flex-wrap items-center gap-icon-gap\">\n <h2 className=\"text-sm font-semibold text-text-primary\">{t('bigconsole.filters.bar.title', 'Filters')}</h2>\n <span className=\"text-sm text-text-muted\">\n {t('bigconsole.filters.bar.noFiltersConfigured', 'No filters configured')}\n </span>\n </div>\n <button type=\"button\" onClick={handleAddFilter} className={SECONDARY_BUTTON_CLASSES}>\n {t('bigconsole.filters.bar.addFilter', '+ Add Filter')}\n </button>\n\n {/* Filter Editor Modal */}\n {isEditorOpen && (\n <FilterEditor\n filter={editingFilter}\n onSave={handleSaveFilter}\n onClose={() => {\n setIsEditorOpen(false);\n setEditingFilter(null);\n }}\n />\n )}\n </div>\n );\n }\n\n return (\n <section\n // A configuration band, not a result: recessed surface, no drop shadow,\n // secondary-weight controls. It sits directly above the board and must\n // stay quieter than it.\n className={`flex min-w-0 flex-col border-b border-[var(--color-border-subtle)] bg-bg-sunken ${className}`}\n aria-labelledby=\"global-filters-heading\"\n data-testid=\"global-filters-bar\"\n >\n {/* Header */}\n <div\n className={`flex flex-wrap items-center justify-between gap-control-gap px-card-padding py-control-gap ${\n isCollapsed ? '' : 'border-b border-[var(--color-border-subtle)]'\n }`}\n >\n <div className=\"flex min-w-0 flex-wrap items-center gap-icon-gap\">\n <h2 id=\"global-filters-heading\" className=\"text-sm font-semibold text-text-primary\">\n {t('bigconsole.filters.bar.title', 'Filters')}\n </h2>\n <span className=\"rounded-pill bg-bg-surface px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {filters.length}\n </span>\n {activeFilterCount > 0 && (\n <span className=\"rounded-pill bg-[var(--color-status-success-bgSubtle)] px-2 py-0.5 text-xs font-medium text-status-success-text\">\n {t('bigconsole.filters.bar.activeCount', '{{count}} active', {\n count: activeFilterCount ?? '',\n })}\n </span>\n )}\n </div>\n\n <div className=\"flex min-w-0 flex-wrap items-center justify-end gap-control-gap\">\n {/* Filter Presets Selector */}\n {enablePresets && (\n <FilterPresetSelector\n presets={presets}\n activePresetId={activePresetId}\n onApplyPreset={handleApplyPreset}\n onSavePreset={handleSavePreset}\n onDeletePreset={handleDeletePreset}\n />\n )}\n\n {/* Share URL Button */}\n {enableUrlSync && activeFilterCount > 0 && (\n <div style={{ position: 'relative' }}>\n <button\n type=\"button\"\n onClick={handleCopyShareableUrl}\n title={t('bigconsole.filters.bar.shareUrlTitle', 'Copy shareable URL with filters')}\n className={SECONDARY_BUTTON_CLASSES}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M4 12v8a2 2 0 002 2h12a2 2 0 002-2v-8\" />\n <polyline points=\"16,6 12,2 8,6\" />\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"15\" />\n </svg>\n {t('bigconsole.filters.bar.share', 'Share')}\n </button>\n {showShareTooltip && (\n <div\n style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginTop: '4px',\n padding: '6px 12px',\n backgroundColor: SEMANTIC_COLORS.textPrimary,\n color: SEMANTIC_COLORS.bgPrimary,\n fontSize: '12px',\n borderRadius: '4px',\n whiteSpace: 'nowrap',\n zIndex: 100001,\n }}\n >\n {t('bigconsole.filters.bar.urlCopied', 'URL copied!')}\n </div>\n )}\n </div>\n )}\n\n {/* Reset Button */}\n {activeFilterCount > 0 && (\n <button type=\"button\" onClick={handleResetAll} className={`${QUIET_BUTTON_CLASSES} text-status-error-text`}>\n {t('bigconsole.filters.bar.resetAll', 'Reset all')}\n </button>\n )}\n\n {/* Add Filter Button */}\n <button type=\"button\" onClick={handleAddFilter} className={SECONDARY_BUTTON_CLASSES}>\n {t('bigconsole.filters.bar.addFilter', '+ Add Filter')}\n </button>\n\n {/* Collapse Button */}\n {collapsible && (\n <button\n type=\"button\"\n onClick={toggleCollapse}\n aria-expanded={!isCollapsed}\n // The chips container is unmounted while collapsed; pointing\n // aria-controls at a missing id is an invalid reference, so only\n // advertise it when the target actually exists.\n aria-controls={isCollapsed ? undefined : 'global-filters-chips'}\n className={QUIET_BUTTON_CLASSES}\n >\n {isCollapsed\n ? t('bigconsole.filters.bar.expand', '▼ Expand')\n : t('bigconsole.filters.bar.collapse', '▲ Collapse')}\n </button>\n )}\n </div>\n </div>\n\n {/* Filters List */}\n {!isCollapsed && (\n <div\n id=\"global-filters-chips\"\n className=\"relative flex flex-wrap gap-control-gap px-card-padding py-control-gap\"\n style={{ overflow: 'visible' }}\n >\n {filters.map((filter) => (\n <FilterChip\n key={filter.id}\n filter={filter}\n value={activeValues[filter.id]}\n onChange={(value) => handleFilterChange(filter.id, value)}\n onEdit={() => handleEditFilter(filter)}\n onDelete={() => handleDeleteFilter(filter.id)}\n />\n ))}\n </div>\n )}\n\n {/* Filter Editor Modal */}\n {isEditorOpen && (\n <FilterEditor\n filter={editingFilter}\n onSave={handleSaveFilter}\n onClose={() => {\n setIsEditorOpen(false);\n setEditingFilter(null);\n }}\n />\n )}\n </section>\n );\n}\n\nexport default GlobalFiltersBar;\n"],"mappings":"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"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
1
|
+
import { Section as e } from "../common/Section.js";
|
|
2
|
+
import "../common/index.js";
|
|
3
|
+
import { reportBigConsoleQuotaError as t } from "../../utils/quota.js";
|
|
4
|
+
import n from "../../hooks/useBigConsoleAnalytics.js";
|
|
5
|
+
import r from "../../hooks/useImportDashboard.js";
|
|
4
6
|
import "../../hooks/index.js";
|
|
5
|
-
import { memo as
|
|
6
|
-
import { AlertTriangle as
|
|
7
|
+
import { memo as i, useCallback as a, useEffect as o, useRef as s, useState as c } from "react";
|
|
8
|
+
import { AlertTriangle as ee, ArrowLeft as l, Check as u, FileJson as te, Info as d, RefreshCw as ne, Upload as f, XCircle as p } from "lucide-react";
|
|
7
9
|
import { useI18n as m } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
8
|
-
import { Badge as h, Button as g, Card as _, CardContent as v, Checkbox as y, Dialog as b, DialogContent as
|
|
10
|
+
import { Badge as h, Button as g, Card as _, CardContent as v, Checkbox as y, Dialog as b, DialogContent as x, DialogDescription as S, DialogFooter as re, DialogHeader as ie, DialogTitle as ae, Input as C, Label as w, Spinner as T } from "@burdenoff/fe-libs/ui";
|
|
9
11
|
import { Fragment as E, jsx as D, jsxs as O } from "react/jsx-runtime";
|
|
10
12
|
//#region src/bigconsole/components/dashboard/ImportDashboardDialog.tsx
|
|
11
13
|
function k(e) {
|
|
@@ -17,12 +19,12 @@ function k(e) {
|
|
|
17
19
|
return null;
|
|
18
20
|
}
|
|
19
21
|
}
|
|
20
|
-
var A =
|
|
21
|
-
let { t: M } = m(), [N, P] =
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}, [
|
|
25
|
-
let
|
|
22
|
+
var A = i(function({ isOpen: i, onClose: A, onSuccess: j }) {
|
|
23
|
+
let { t: M } = m(), [N, P] = c("select"), [, F] = c(null), [I, L] = c(null), [R, z] = c(""), [B, V] = c("PRIVATE"), [H, U] = c(!1), W = s(null), { loading: G, error: K, validationResult: q, importResult: J, validateImport: Y, importDashboard: X, clearState: Z } = r(), Q = n();
|
|
24
|
+
o(() => {
|
|
25
|
+
i && (P("select"), F(null), L(null), z(""), V("PRIVATE"), U(!1), Z());
|
|
26
|
+
}, [i, Z]);
|
|
27
|
+
let oe = a(async (e) => {
|
|
26
28
|
let t = e.target.files?.[0];
|
|
27
29
|
if (!t) return;
|
|
28
30
|
if (!t.name.endsWith(".json")) {
|
|
@@ -39,31 +41,31 @@ var A = r(function({ isOpen: r, onClose: A, onSuccess: j }) {
|
|
|
39
41
|
}, n.onerror = () => {
|
|
40
42
|
alert(M("bigconsole.dashboards.import.failedToReadFile", "Failed to read file"));
|
|
41
43
|
}, n.readAsText(t);
|
|
42
|
-
}, [Y, M]),
|
|
44
|
+
}, [Y, M]), se = a((e) => {
|
|
43
45
|
e.preventDefault();
|
|
44
46
|
let t = e.dataTransfer.files?.[0];
|
|
45
47
|
if (t) {
|
|
46
48
|
let e = new DataTransfer();
|
|
47
49
|
e.items.add(t), W.current && (W.current.files = e.files, W.current.dispatchEvent(new Event("change", { bubbles: !0 })));
|
|
48
50
|
}
|
|
49
|
-
}, []),
|
|
51
|
+
}, []), ce = a(async () => {
|
|
50
52
|
if (!I) return;
|
|
51
53
|
P("importing");
|
|
52
|
-
let
|
|
54
|
+
let e = {
|
|
53
55
|
name: R.trim() || void 0,
|
|
54
56
|
visibility: B,
|
|
55
57
|
skipWarnings: H
|
|
56
58
|
};
|
|
57
59
|
Q("bigconsole.dashboard.import_clicked", { source: "import" });
|
|
58
60
|
try {
|
|
59
|
-
let
|
|
60
|
-
|
|
61
|
-
dashboardId:
|
|
61
|
+
let t = await X(I, e);
|
|
62
|
+
t?.success && t.dashboard ? (P("complete"), Q("bigconsole.dashboard.imported", {
|
|
63
|
+
dashboardId: t.dashboard.id,
|
|
62
64
|
source: "import",
|
|
63
|
-
originalUpdated:
|
|
64
|
-
}), j?.(
|
|
65
|
-
} catch (
|
|
66
|
-
if (e
|
|
65
|
+
originalUpdated: t.originalUpdated ?? !1
|
|
66
|
+
}), j?.(t.dashboard.id, t.dashboard.name, t.originalUpdated ?? !1)) : P("preview");
|
|
67
|
+
} catch (e) {
|
|
68
|
+
if (t(e, "project")) {
|
|
67
69
|
A();
|
|
68
70
|
return;
|
|
69
71
|
}
|
|
@@ -80,27 +82,27 @@ var A = r(function({ isOpen: r, onClose: A, onSuccess: j }) {
|
|
|
80
82
|
B
|
|
81
83
|
]), $ = !G && N !== "importing";
|
|
82
84
|
return /* @__PURE__ */ D(b, {
|
|
83
|
-
open:
|
|
85
|
+
open: i,
|
|
84
86
|
onOpenChange: (e) => !e && $ && A(),
|
|
85
|
-
children: /* @__PURE__ */ O(
|
|
87
|
+
children: /* @__PURE__ */ O(x, {
|
|
86
88
|
className: "sm:max-w-lg max-h-[85vh] flex flex-col",
|
|
87
89
|
children: [
|
|
88
|
-
/* @__PURE__ */ O(
|
|
90
|
+
/* @__PURE__ */ O(ie, { children: [/* @__PURE__ */ O("div", {
|
|
89
91
|
className: "flex items-center gap-3",
|
|
90
92
|
children: [/* @__PURE__ */ D("div", {
|
|
91
93
|
className: "flex size-10 items-center justify-center rounded-lg bg-action-primary-bg/10",
|
|
92
94
|
children: /* @__PURE__ */ D(f, { className: "size-5 text-primary" })
|
|
93
|
-
}), /* @__PURE__ */ D(
|
|
94
|
-
}), /* @__PURE__ */ D(
|
|
95
|
+
}), /* @__PURE__ */ D(ae, { children: M("bigconsole.dashboards.import.title", "Import Dashboard") })]
|
|
96
|
+
}), /* @__PURE__ */ D(S, { children: M("bigconsole.dashboards.import.description", "Upload a Dashboard export file to restore it into this workspace.") })] }),
|
|
95
97
|
/* @__PURE__ */ O("div", {
|
|
96
98
|
className: "flex-1 overflow-y-auto py-4 space-y-4",
|
|
97
99
|
children: [
|
|
98
100
|
N === "select" && /* @__PURE__ */ O("div", {
|
|
99
101
|
onDragOver: (e) => e.preventDefault(),
|
|
100
|
-
onDrop:
|
|
102
|
+
onDrop: se,
|
|
101
103
|
className: "border-2 border-dashed rounded-lg p-8 text-center hover:border-primary transition-colors",
|
|
102
104
|
children: [
|
|
103
|
-
/* @__PURE__ */ D(
|
|
105
|
+
/* @__PURE__ */ D(te, { className: "size-12 mx-auto text-text-secondary mb-4" }),
|
|
104
106
|
/* @__PURE__ */ D("p", {
|
|
105
107
|
className: "text-sm mb-2",
|
|
106
108
|
children: M("bigconsole.dashboards.import.dropzoneTitle", "Drag and drop a dashboard export file here")
|
|
@@ -113,7 +115,7 @@ var A = r(function({ isOpen: r, onClose: A, onSuccess: j }) {
|
|
|
113
115
|
ref: W,
|
|
114
116
|
type: "file",
|
|
115
117
|
accept: ".json",
|
|
116
|
-
onChange:
|
|
118
|
+
onChange: oe,
|
|
117
119
|
className: "hidden"
|
|
118
120
|
}),
|
|
119
121
|
/* @__PURE__ */ D(g, {
|
|
@@ -128,8 +130,13 @@ var A = r(function({ isOpen: r, onClose: A, onSuccess: j }) {
|
|
|
128
130
|
]
|
|
129
131
|
}),
|
|
130
132
|
(N === "preview" || N === "importing") && q && /* @__PURE__ */ O(E, { children: [
|
|
131
|
-
/* @__PURE__ */
|
|
132
|
-
|
|
133
|
+
/* @__PURE__ */ O(e, {
|
|
134
|
+
headingLevel: 3,
|
|
135
|
+
emphasis: "muted",
|
|
136
|
+
padding: "compact",
|
|
137
|
+
title: "What's in this file",
|
|
138
|
+
"data-testid": "import-summary",
|
|
139
|
+
bodyClassName: "space-y-2",
|
|
133
140
|
children: [
|
|
134
141
|
/* @__PURE__ */ O("div", {
|
|
135
142
|
className: "flex items-center justify-between",
|
|
@@ -182,7 +189,7 @@ var A = r(function({ isOpen: r, onClose: A, onSuccess: j }) {
|
|
|
182
189
|
})]
|
|
183
190
|
}),
|
|
184
191
|
/* @__PURE__ */ O("div", {
|
|
185
|
-
className: "flex items-center justify-between",
|
|
192
|
+
className: "flex flex-wrap items-center justify-between gap-x-4",
|
|
186
193
|
children: [/* @__PURE__ */ D("span", {
|
|
187
194
|
className: "text-sm text-text-secondary",
|
|
188
195
|
children: M("bigconsole.dashboards.import.fieldSchemaVersion", "Schema Version")
|
|
@@ -192,104 +199,99 @@ var A = r(function({ isOpen: r, onClose: A, onSuccess: j }) {
|
|
|
192
199
|
})]
|
|
193
200
|
})
|
|
194
201
|
]
|
|
195
|
-
})
|
|
196
|
-
q.errors.length > 0 && /* @__PURE__ */ D(
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
e.message
|
|
219
|
-
] }, t))
|
|
220
|
-
})]
|
|
202
|
+
}),
|
|
203
|
+
q.errors.length > 0 && /* @__PURE__ */ D(e, {
|
|
204
|
+
headingLevel: 3,
|
|
205
|
+
tone: "danger",
|
|
206
|
+
padding: "compact",
|
|
207
|
+
icon: /* @__PURE__ */ D(p, { className: "size-4" }),
|
|
208
|
+
title: M("bigconsole.dashboards.import.errorsCount", "Errors ({{count}})", { count: q.errors.length }),
|
|
209
|
+
description: "These must be fixed in the export file before it can be imported.",
|
|
210
|
+
"data-testid": "import-errors",
|
|
211
|
+
children: /* @__PURE__ */ D("ul", {
|
|
212
|
+
className: "space-y-1 text-xs text-status-error-text",
|
|
213
|
+
children: q.errors.map((e) => /* @__PURE__ */ O("li", { children: [
|
|
214
|
+
/* @__PURE__ */ O("span", {
|
|
215
|
+
className: "font-mono",
|
|
216
|
+
children: [
|
|
217
|
+
"[",
|
|
218
|
+
e.code,
|
|
219
|
+
"]"
|
|
220
|
+
]
|
|
221
|
+
}),
|
|
222
|
+
" ",
|
|
223
|
+
e.message
|
|
224
|
+
] }, `${e.code}-${e.message}`))
|
|
221
225
|
})
|
|
222
226
|
}),
|
|
223
|
-
q.warnings.length > 0 && /* @__PURE__ */ D(
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
e.message
|
|
246
|
-
] }, t))
|
|
247
|
-
})]
|
|
227
|
+
q.warnings.length > 0 && /* @__PURE__ */ D(e, {
|
|
228
|
+
headingLevel: 3,
|
|
229
|
+
tone: "warning",
|
|
230
|
+
padding: "compact",
|
|
231
|
+
icon: /* @__PURE__ */ D(ee, { className: "size-4" }),
|
|
232
|
+
title: M("bigconsole.dashboards.import.warningsCount", "Warnings ({{count}})", { count: q.warnings.length }),
|
|
233
|
+
description: "Advisory only — acknowledge them below to continue.",
|
|
234
|
+
"data-testid": "import-warnings",
|
|
235
|
+
children: /* @__PURE__ */ D("ul", {
|
|
236
|
+
className: "space-y-1 text-xs text-[var(--color-status-warning-text)]",
|
|
237
|
+
children: q.warnings.map((e) => /* @__PURE__ */ O("li", { children: [
|
|
238
|
+
/* @__PURE__ */ O("span", {
|
|
239
|
+
className: "font-mono",
|
|
240
|
+
children: [
|
|
241
|
+
"[",
|
|
242
|
+
e.code,
|
|
243
|
+
"]"
|
|
244
|
+
]
|
|
245
|
+
}),
|
|
246
|
+
" ",
|
|
247
|
+
e.message
|
|
248
|
+
] }, `${e.code}-${e.message}`))
|
|
248
249
|
})
|
|
249
250
|
}),
|
|
250
|
-
q.isValid && /* @__PURE__ */ O(
|
|
251
|
-
|
|
251
|
+
q.isValid && /* @__PURE__ */ O(e, {
|
|
252
|
+
headingLevel: 3,
|
|
253
|
+
title: M("bigconsole.dashboards.import.optionsTitle", "Import Options"),
|
|
254
|
+
description: "How this file lands in the workspace.",
|
|
255
|
+
"data-testid": "import-options",
|
|
256
|
+
bodyClassName: "space-y-4",
|
|
252
257
|
children: [
|
|
253
|
-
/* @__PURE__ */ D(
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
children: /* @__PURE__ */
|
|
260
|
-
className: "
|
|
261
|
-
children: /* @__PURE__ */
|
|
262
|
-
className: "
|
|
263
|
-
children:
|
|
264
|
-
|
|
265
|
-
children: k(I) ? /* @__PURE__ */ O(E, { children: [
|
|
266
|
-
/* @__PURE__ */ D("p", {
|
|
267
|
-
className: "font-medium mb-1",
|
|
268
|
-
children: M("bigconsole.dashboards.import.checkExistingTitle", "Import will check for existing dashboard")
|
|
269
|
-
}),
|
|
270
|
-
/* @__PURE__ */ O("p", { children: [
|
|
271
|
-
M("bigconsole.dashboards.import.checkExistingIdPrefix", "If the original dashboard (ID:"),
|
|
272
|
-
" ",
|
|
273
|
-
/* @__PURE__ */ O("code", {
|
|
274
|
-
className: "font-mono bg-blue-200/50 px-1 rounded",
|
|
275
|
-
children: [k(I)?.slice(0, 8), "..."]
|
|
276
|
-
}),
|
|
277
|
-
M("bigconsole.dashboards.import.checkExistingIdSuffix", ") exists:")
|
|
278
|
-
] }),
|
|
279
|
-
/* @__PURE__ */ O("ul", {
|
|
280
|
-
className: "list-disc list-inside mt-1 space-y-0.5",
|
|
281
|
-
children: [/* @__PURE__ */ D("li", { children: M("bigconsole.dashboards.import.checkExistingWithChanges", "With changes → Update the existing dashboard") }), /* @__PURE__ */ D("li", { children: M("bigconsole.dashboards.import.checkExistingNoChanges", "No changes → Show \"already exists\" message") })]
|
|
282
|
-
}),
|
|
283
|
-
/* @__PURE__ */ D("p", {
|
|
284
|
-
className: "mt-1",
|
|
285
|
-
children: M("bigconsole.dashboards.import.checkExistingNotFound", "If original doesn't exist → Create a new dashboard")
|
|
286
|
-
})
|
|
287
|
-
] }) : /* @__PURE__ */ O(E, { children: [/* @__PURE__ */ D("p", {
|
|
258
|
+
/* @__PURE__ */ D(e, {
|
|
259
|
+
headingLevel: 4,
|
|
260
|
+
tone: "info",
|
|
261
|
+
"aria-label": M("bigconsole.dashboards.import.infoRegionLabel", "What this import will do"),
|
|
262
|
+
padding: "compact",
|
|
263
|
+
"data-testid": "import-info",
|
|
264
|
+
children: /* @__PURE__ */ O("div", {
|
|
265
|
+
className: "flex items-start gap-2",
|
|
266
|
+
children: [/* @__PURE__ */ D(d, { className: "size-4 mt-0.5 shrink-0 text-[var(--color-status-info-text)]" }), /* @__PURE__ */ D("div", {
|
|
267
|
+
className: "text-xs text-[var(--color-status-info-text)]",
|
|
268
|
+
children: k(I) ? /* @__PURE__ */ O(E, { children: [
|
|
269
|
+
/* @__PURE__ */ D("p", {
|
|
288
270
|
className: "font-medium mb-1",
|
|
289
|
-
children: M("bigconsole.dashboards.import.
|
|
290
|
-
}),
|
|
291
|
-
|
|
292
|
-
|
|
271
|
+
children: M("bigconsole.dashboards.import.checkExistingTitle", "Import will check for existing dashboard")
|
|
272
|
+
}),
|
|
273
|
+
/* @__PURE__ */ O("p", { children: [
|
|
274
|
+
M("bigconsole.dashboards.import.checkExistingIdPrefix", "If the original dashboard (ID:"),
|
|
275
|
+
" ",
|
|
276
|
+
/* @__PURE__ */ O("code", {
|
|
277
|
+
className: "rounded bg-bg-surface px-1 font-mono",
|
|
278
|
+
children: [k(I)?.slice(0, 8), "..."]
|
|
279
|
+
}),
|
|
280
|
+
M("bigconsole.dashboards.import.checkExistingIdSuffix", ") exists:")
|
|
281
|
+
] }),
|
|
282
|
+
/* @__PURE__ */ O("ul", {
|
|
283
|
+
className: "list-disc list-inside mt-1 space-y-0.5",
|
|
284
|
+
children: [/* @__PURE__ */ D("li", { children: M("bigconsole.dashboards.import.checkExistingWithChanges", "With changes → Update the existing dashboard") }), /* @__PURE__ */ D("li", { children: M("bigconsole.dashboards.import.checkExistingNoChanges", "No changes → Show \"already exists\" message") })]
|
|
285
|
+
}),
|
|
286
|
+
/* @__PURE__ */ D("p", {
|
|
287
|
+
className: "mt-1",
|
|
288
|
+
children: M("bigconsole.dashboards.import.checkExistingNotFound", "If original doesn't exist → Create a new dashboard")
|
|
289
|
+
})
|
|
290
|
+
] }) : /* @__PURE__ */ O(E, { children: [/* @__PURE__ */ D("p", {
|
|
291
|
+
className: "font-medium mb-1",
|
|
292
|
+
children: M("bigconsole.dashboards.import.newDashboardTitle", "A new dashboard will be created")
|
|
293
|
+
}), /* @__PURE__ */ D("p", { children: M("bigconsole.dashboards.import.newDashboardBody", "Import as a new dashboard with the specified configuration.") })] })
|
|
294
|
+
})]
|
|
293
295
|
})
|
|
294
296
|
}),
|
|
295
297
|
/* @__PURE__ */ O("div", {
|
|
@@ -348,8 +350,8 @@ var A = r(function({ isOpen: r, onClose: A, onSuccess: j }) {
|
|
|
348
350
|
children: [
|
|
349
351
|
J.alreadyExists && /* @__PURE__ */ O(E, { children: [
|
|
350
352
|
/* @__PURE__ */ D("div", {
|
|
351
|
-
className: "
|
|
352
|
-
children: /* @__PURE__ */ D(d, { className: "size-8 text-
|
|
353
|
+
className: "mx-auto mb-4 flex size-16 items-center justify-center rounded-full bg-[var(--color-status-info-bgSubtle)]",
|
|
354
|
+
children: /* @__PURE__ */ D(d, { className: "size-8 text-[var(--color-status-info-text)]" })
|
|
353
355
|
}),
|
|
354
356
|
/* @__PURE__ */ D("h3", {
|
|
355
357
|
className: "text-lg font-medium mb-2",
|
|
@@ -362,8 +364,8 @@ var A = r(function({ isOpen: r, onClose: A, onSuccess: j }) {
|
|
|
362
364
|
] }),
|
|
363
365
|
J.originalUpdated && !J.alreadyExists && /* @__PURE__ */ O(E, { children: [
|
|
364
366
|
/* @__PURE__ */ D("div", {
|
|
365
|
-
className: "
|
|
366
|
-
children: /* @__PURE__ */ D(
|
|
367
|
+
className: "mx-auto mb-4 flex size-16 items-center justify-center rounded-full bg-[var(--color-status-success-bgSubtle)]",
|
|
368
|
+
children: /* @__PURE__ */ D(ne, { className: "size-8 text-status-success-text" })
|
|
367
369
|
}),
|
|
368
370
|
/* @__PURE__ */ D("h3", {
|
|
369
371
|
className: "text-lg font-medium mb-2",
|
|
@@ -376,8 +378,8 @@ var A = r(function({ isOpen: r, onClose: A, onSuccess: j }) {
|
|
|
376
378
|
] }),
|
|
377
379
|
!J.originalUpdated && !J.alreadyExists && /* @__PURE__ */ O(E, { children: [
|
|
378
380
|
/* @__PURE__ */ D("div", {
|
|
379
|
-
className: "
|
|
380
|
-
children: /* @__PURE__ */ D(u, { className: "size-8 text-
|
|
381
|
+
className: "mx-auto mb-4 flex size-16 items-center justify-center rounded-full bg-[var(--color-status-success-bgSubtle)]",
|
|
382
|
+
children: /* @__PURE__ */ D(u, { className: "size-8 text-status-success-text" })
|
|
381
383
|
}),
|
|
382
384
|
/* @__PURE__ */ D("h3", {
|
|
383
385
|
className: "text-lg font-medium mb-2",
|
|
@@ -419,29 +421,23 @@ var A = r(function({ isOpen: r, onClose: A, onSuccess: j }) {
|
|
|
419
421
|
] })
|
|
420
422
|
]
|
|
421
423
|
}),
|
|
422
|
-
K && /* @__PURE__ */ D(
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
children: K.message
|
|
429
|
-
})
|
|
430
|
-
})
|
|
424
|
+
K && /* @__PURE__ */ D(e, {
|
|
425
|
+
headingLevel: 3,
|
|
426
|
+
tone: "danger",
|
|
427
|
+
padding: "compact",
|
|
428
|
+
title: "Import failed",
|
|
429
|
+
description: K.message
|
|
431
430
|
}),
|
|
432
|
-
J && !J.success && J.errorMessage && /* @__PURE__ */ D(
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
children: J.errorMessage
|
|
439
|
-
})
|
|
440
|
-
})
|
|
431
|
+
J && !J.success && J.errorMessage && /* @__PURE__ */ D(e, {
|
|
432
|
+
headingLevel: 3,
|
|
433
|
+
tone: "danger",
|
|
434
|
+
padding: "compact",
|
|
435
|
+
title: "Import failed",
|
|
436
|
+
description: J.errorMessage
|
|
441
437
|
})
|
|
442
438
|
]
|
|
443
439
|
}),
|
|
444
|
-
/* @__PURE__ */ O(
|
|
440
|
+
/* @__PURE__ */ O(re, {
|
|
445
441
|
className: "flex-row justify-between sm:justify-between",
|
|
446
442
|
children: [/* @__PURE__ */ D("div", { children: N === "preview" && /* @__PURE__ */ O(g, {
|
|
447
443
|
variant: "ghost",
|
|
@@ -460,7 +456,7 @@ var A = r(function({ isOpen: r, onClose: A, onSuccess: j }) {
|
|
|
460
456
|
children: M("bigconsole.dashboards.import.cancel", "Cancel")
|
|
461
457
|
}),
|
|
462
458
|
N === "preview" && q?.isValid && /* @__PURE__ */ O(g, {
|
|
463
|
-
onClick:
|
|
459
|
+
onClick: ce,
|
|
464
460
|
disabled: G || q.warnings.length > 0 && !H,
|
|
465
461
|
children: [/* @__PURE__ */ D(f, { className: "size-4" }), M("bigconsole.dashboards.import.importButton", "Import Dashboard")]
|
|
466
462
|
}),
|