@burdenoff/microfe-bigconsole 2026.1008.10 → 2026.1008.12

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.
Files changed (131) hide show
  1. package/dist/bigconsole/BigConsoleRoutes.d.ts.map +1 -1
  2. package/dist/bigconsole/BigConsoleRoutes.js +136 -127
  3. package/dist/bigconsole/BigConsoleRoutes.js.map +1 -1
  4. package/dist/bigconsole/assistant/assistantProduct.d.ts.map +1 -1
  5. package/dist/bigconsole/assistant/assistantProduct.js +3 -1
  6. package/dist/bigconsole/assistant/assistantProduct.js.map +1 -1
  7. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +31 -31
  8. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +44 -44
  9. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
  10. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +36 -36
  11. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  12. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +59 -59
  13. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +15 -15
  14. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +30 -30
  15. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +41 -41
  16. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +34 -34
  17. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +34 -34
  18. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +110 -110
  19. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  20. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +21 -21
  21. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +46 -46
  22. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +91 -91
  23. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
  24. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js +101 -101
  25. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js.map +1 -1
  26. package/dist/bigconsole/components/dashboard/TemplateInstallOptions.js +31 -31
  27. package/dist/bigconsole/components/dashboard/TemplateLayoutPreview.js +15 -15
  28. package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -1
  29. package/dist/bigconsole/components/dashboard/WidgetPalette.js +46 -46
  30. package/dist/bigconsole/components/datasink/AlertExecutionHistory.js +37 -37
  31. package/dist/bigconsole/components/datasink/AlertRuleEditor.js +66 -66
  32. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +35 -35
  33. package/dist/bigconsole/components/datasink/DataSinkCard.js +29 -29
  34. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +18 -18
  35. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +20 -20
  36. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +47 -47
  37. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +91 -91
  38. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +35 -35
  39. package/dist/bigconsole/components/parser/DataSinkSelector.js +40 -40
  40. package/dist/bigconsole/components/parser/ImportParserDialog.js +120 -120
  41. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  42. package/dist/bigconsole/components/parser/ParserSelector.js +51 -51
  43. package/dist/bigconsole/components/pipeline/PipelineScopePicker.js +10 -10
  44. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +27 -27
  45. package/dist/bigconsole/components/preview/AiPreviewPanel.js +30 -30
  46. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +4 -4
  47. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +93 -93
  48. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  49. package/dist/bigconsole/components/widgets/PropertiesPanel.d.ts.map +1 -1
  50. package/dist/bigconsole/components/widgets/PropertiesPanel.js +280 -273
  51. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  52. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +4 -4
  53. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +48 -48
  54. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +46 -46
  55. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +61 -61
  56. package/dist/bigconsole/components/widgets/form/FormWidget.js +36 -36
  57. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +42 -42
  58. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +25 -25
  59. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +4 -4
  60. package/dist/bigconsole/components/widgets/list/ListConfig.js +30 -30
  61. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +38 -38
  62. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +9 -9
  63. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +9 -9
  64. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +49 -49
  65. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +39 -39
  66. package/dist/bigconsole/components/widgets/table/TableConfig.js +73 -73
  67. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +64 -64
  68. package/dist/bigconsole/components/workflow/WorkflowOpenGuard.js +15 -15
  69. package/dist/bigconsole/components/workflow/WorkflowSinkLinkForm.js +15 -15
  70. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +9 -9
  71. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +67 -67
  72. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
  73. package/dist/bigconsole/hooks/useDashboardLayoutBaseline.d.ts +15 -0
  74. package/dist/bigconsole/hooks/useDashboardLayoutBaseline.d.ts.map +1 -0
  75. package/dist/bigconsole/hooks/useDashboardLayoutBaseline.js +34 -0
  76. package/dist/bigconsole/hooks/useDashboardLayoutBaseline.js.map +1 -0
  77. package/dist/bigconsole/hooks/useDrilldown.js +3 -3
  78. package/dist/bigconsole/hooks/useGlobalFilters.js +3 -3
  79. package/dist/bigconsole/pages/AdminPage.js +130 -130
  80. package/dist/bigconsole/pages/DashboardBuilderPage.d.ts.map +1 -1
  81. package/dist/bigconsole/pages/DashboardBuilderPage.js +72 -60
  82. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  83. package/dist/bigconsole/pages/DashboardViewPage.js +1 -1
  84. package/dist/bigconsole/pages/DataSinkAlertsPage.d.ts.map +1 -1
  85. package/dist/bigconsole/pages/DataSinkAlertsPage.js +30 -23
  86. package/dist/bigconsole/pages/DataSinkAlertsPage.js.map +1 -1
  87. package/dist/bigconsole/pages/DataSinkBuilderPage.d.ts.map +1 -1
  88. package/dist/bigconsole/pages/DataSinkBuilderPage.js +272 -263
  89. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  90. package/dist/bigconsole/pages/DataSinkViewPage.js +1 -1
  91. package/dist/bigconsole/pages/DataSinksPage.js +1 -1
  92. package/dist/bigconsole/pages/DataSourcesPage.js +5 -5
  93. package/dist/bigconsole/pages/InsightsPage.js +181 -181
  94. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  95. package/dist/bigconsole/pages/OverviewPage.js +47 -47
  96. package/dist/bigconsole/pages/OverviewPage.js.map +1 -1
  97. package/dist/bigconsole/pages/ParserBuilderPage.d.ts.map +1 -1
  98. package/dist/bigconsole/pages/ParserBuilderPage.js +227 -211
  99. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  100. package/dist/bigconsole/pages/ParserViewPage.js +97 -97
  101. package/dist/bigconsole/pages/PipelineBuilderPage.d.ts.map +1 -1
  102. package/dist/bigconsole/pages/PipelineBuilderPage.js +256 -214
  103. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  104. package/dist/bigconsole/pages/PipelineViewPage.js +146 -146
  105. package/dist/bigconsole/pages/PipelinesPage.js +88 -88
  106. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  107. package/dist/bigconsole/pages/SettingsPage.d.ts.map +1 -1
  108. package/dist/bigconsole/pages/SettingsPage.js +179 -173
  109. package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
  110. package/dist/bigconsole/pages/WidgetDemoPage.js +42 -42
  111. package/dist/bigconsole/pages/WorkflowViewPage.js +1 -1
  112. package/dist/bigconsole/pages/WorkflowsPage.js +141 -141
  113. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  114. package/dist/bigconsole/providers/BigConsoleQuotaProvider.js +12 -12
  115. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +34 -34
  116. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +79 -79
  117. package/dist/bigconsole/renderers/adapters/CustomRenderer.js +46 -46
  118. package/dist/bigconsole/store/widgetStore.d.ts +12 -0
  119. package/dist/bigconsole/store/widgetStore.d.ts.map +1 -1
  120. package/dist/bigconsole/store/widgetStore.js +3 -1
  121. package/dist/bigconsole/store/widgetStore.js.map +1 -1
  122. package/dist/bigconsole/utils/formDirty.d.ts +83 -0
  123. package/dist/bigconsole/utils/formDirty.d.ts.map +1 -0
  124. package/dist/bigconsole/utils/formDirty.js +23 -0
  125. package/dist/bigconsole/utils/formDirty.js.map +1 -0
  126. package/dist/bigconsole/utils/layoutBaseline.d.ts +131 -0
  127. package/dist/bigconsole/utils/layoutBaseline.d.ts.map +1 -0
  128. package/dist/bigconsole/utils/layoutBaseline.js +98 -0
  129. package/dist/bigconsole/utils/layoutBaseline.js.map +1 -0
  130. package/dist/translations/en.d.ts.map +1 -1
  131. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"DataSinkAlertsPage.js","names":[],"sources":["../../../src/bigconsole/pages/DataSinkAlertsPage.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { Button, Switch } from '@burdenoff/fe-libs/ui';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { AccessDenied } from '@burdenoff/fe-libs/shared/components';\nimport { ArrowLeft, Bell, Loader2, Plus, RefreshCw, Trash2 } from 'lucide-react';\nimport { BIGCONSOLE_PERMISSIONS } from '../../constants/permissions';\nimport { useBigConsole } from '../context';\nimport { useAppNavigate } from '../contexts';\nimport { Section, SECTION_FOCUS_RING } from '../components/common';\nimport { AlertRuleEditor } from '../components/datasink/AlertRuleEditor';\nimport { AlertExecutionHistory } from '../components/datasink/AlertExecutionHistory';\nimport {\n useDataSinkAlerts,\n alertErrorMessage,\n describeAlertLoadFailure,\n type AlertRule,\n type AlertPreview,\n} from '../hooks/useDataSinkAlerts';\nimport {\n alertDraft,\n alertDraftInput,\n validateAlertDraft,\n ALERT_VALIDATION_MESSAGES,\n type AlertDraft,\n} from '../utils/alertRules';\nimport { nativeConfirm } from '../../utils/nativeBridge';\n\ninterface EditingRule {\n draft: AlertDraft;\n original: string;\n version: number;\n selection: number;\n}\ninterface PreviewResult {\n condition: string;\n conditionType: string;\n result: AlertPreview;\n}\n\nexport default function DataSinkAlertsPage() {\n const { dataSinkId = '' } = useParams<{ dataSinkId: string }>();\n const { currentUser, workspaceId } = useBigConsole();\n return (\n <DataSinkAlertsContent\n key={`${currentUser?.id ?? ''}|${workspaceId ?? ''}|${dataSinkId}`}\n dataSinkId={dataSinkId}\n />\n );\n}\n\nfunction DataSinkAlertsContent({ dataSinkId }: { dataSinkId: string }) {\n const { t } = useI18n();\n const navigate = useAppNavigate();\n const { currentUser, workspaceId } = useBigConsole();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canRead = hasPermission(BIGCONSOLE_PERMISSIONS.DATASINK_READ);\n const canUpdate = !permissionsLoading && hasPermission(BIGCONSOLE_PERMISSIONS.DATASINK_UPDATE);\n const operations = useDataSinkAlerts(\n dataSinkId,\n !permissionsLoading && canRead && !!workspaceId && !!currentUser?.id\n );\n const sink = operations.sink;\n const rules = sink?.alerts ?? [];\n const [search, setSearch] = useState('');\n const [editing, setEditing] = useState<EditingRule | null>(null);\n const [pending, setPending] = useState(false);\n const mutationActive = useRef(false);\n const opener = useRef<HTMLElement | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [status, setStatus] = useState<string | null>(null);\n const [previewing, setPreviewing] = useState(false);\n const [previewError, setPreviewError] = useState<string | null>(null);\n const [preview, setPreview] = useState<PreviewResult | null>(null);\n const [historyVersion, setHistoryVersion] = useState(0);\n const previewRequest = useRef(0);\n const selectionCounter = useRef(0);\n const editingSelection = editing?.selection;\n useEffect(() => {\n if (editingSelection !== undefined) document.getElementById('alert-name')?.focus();\n }, [editingSelection]);\n const dirty = !!editing && JSON.stringify(editing.draft) !== editing.original;\n const confirm = async (message: string) => {\n const native = await nativeConfirm({\n title: t('bigconsole.alerts.confirm.title', 'Confirm alert change'),\n message,\n okButtonTitle: t('bigconsole.alerts.confirm.continue', 'Continue'),\n cancelButtonTitle: t('bigconsole.alerts.rule.cancel', 'Cancel'),\n });\n return native ?? window.confirm(message);\n };\n const discard = () => !dirty || confirm(t('bigconsole.alerts.confirm.discard', 'Discard your unsaved rule changes?'));\n const selectRule = async (rule?: AlertRule) => {\n if (pending || !sink || !(await discard())) return;\n if (document.activeElement instanceof HTMLElement) opener.current = document.activeElement;\n const draft = alertDraft(rule);\n setEditing({\n draft,\n original: JSON.stringify(draft),\n version: sink.version,\n selection: ++selectionCounter.current,\n });\n previewRequest.current++;\n setPreview(null);\n setPreviewError(null);\n setPreviewing(false);\n setError(null);\n setStatus(null);\n };\n const cancel = async () => {\n if (pending || !(await discard())) return;\n setEditing(null);\n setPreview(null);\n setPreviewError(null);\n previewRequest.current++;\n setPreviewing(false);\n setError(null);\n if (opener.current?.isConnected) opener.current.focus();\n };\n const save = async () => {\n if (!editing || !sink || !canUpdate || mutationActive.current) return;\n const invalid = validateAlertDraft(editing.draft, operations.channels);\n if (invalid) {\n setError(t(`bigconsole.alerts.validation.${invalid}`, ALERT_VALIDATION_MESSAGES[invalid]));\n return;\n }\n mutationActive.current = true;\n setPending(true);\n setError(null);\n setStatus(null);\n const knownIds = new Set(rules.map((rule) => rule.id));\n try {\n const saved = await operations.save(alertDraftInput(editing.draft), editing.version);\n if (!saved) return;\n const rule = saved.alerts?.find((item) =>\n editing.draft.id ? item.id === editing.draft.id : !knownIds.has(item.id)\n );\n if (rule) {\n const draft = alertDraft(rule);\n setEditing({ draft, original: JSON.stringify(draft), version: saved.version, selection: editing.selection });\n } else setEditing(null);\n setStatus(t('bigconsole.alerts.feedback.saved', 'Alert rule saved.'));\n setHistoryVersion((previous) => previous + 1);\n } catch (caught) {\n setError(alertErrorMessage(caught));\n } finally {\n mutationActive.current = false;\n setPending(false);\n }\n };\n const toggle = async (rule: AlertRule) => {\n if (!sink || !canUpdate || mutationActive.current) return;\n const draft = { ...alertDraft(rule), enabled: !rule.enabled };\n const invalid = validateAlertDraft(draft, operations.channels);\n if (invalid) {\n setError(t(`bigconsole.alerts.validation.${invalid}`, ALERT_VALIDATION_MESSAGES[invalid]));\n return;\n }\n mutationActive.current = true;\n setPending(true);\n setError(null);\n setStatus(null);\n try {\n const saved = await operations.save(alertDraftInput(draft), sink.version);\n if (saved) {\n setStatus(\n draft.enabled\n ? t('bigconsole.alerts.feedback.enabled', 'Alert rule enabled.')\n : t('bigconsole.alerts.feedback.disabled', 'Alert rule disabled.')\n );\n setHistoryVersion((previous) => previous + 1);\n }\n } catch (caught) {\n setError(alertErrorMessage(caught));\n } finally {\n mutationActive.current = false;\n setPending(false);\n }\n };\n const remove = async (rule: AlertRule) => {\n if (!sink || !canUpdate || mutationActive.current) return;\n const ok = await confirm(`${t('bigconsole.alerts.confirm.delete', 'Delete alert rule')} “${rule.name}”?`);\n if (!ok || mutationActive.current) return;\n mutationActive.current = true;\n setPending(true);\n setError(null);\n setStatus(null);\n try {\n const saved = await operations.remove(rule.id, sink.version);\n if (saved) {\n if (editing?.draft.id === rule.id) setEditing(null);\n setStatus(t('bigconsole.alerts.feedback.deleted', 'Alert rule deleted.'));\n setHistoryVersion((previous) => previous + 1);\n }\n } catch (caught) {\n setError(alertErrorMessage(caught));\n } finally {\n mutationActive.current = false;\n setPending(false);\n }\n };\n const runPreview = async () => {\n if (!editing || previewing || pending) return;\n const request = ++previewRequest.current;\n const { condition, conditionType } = editing.draft;\n setPreviewing(true);\n setPreviewError(null);\n setPreview(null);\n try {\n const result = await operations.preview(condition, conditionType);\n if (result && previewRequest.current === request) setPreview({ condition, conditionType, result });\n } catch (caught) {\n if (previewRequest.current === request) setPreviewError(alertErrorMessage(caught));\n } finally {\n if (previewRequest.current === request) setPreviewing(false);\n }\n };\n const reloadRule = async () => {\n if (!editing?.draft.id || pending || !(await discard())) return;\n const latest = await operations.reload();\n const rule = latest?.alerts?.find((item) => item.id === editing.draft.id);\n if (!latest) return;\n if (!rule) {\n setEditing(null);\n setStatus(t('bigconsole.alerts.feedback.removedElsewhere', 'This rule no longer exists.'));\n return;\n }\n const draft = alertDraft(rule);\n setEditing({\n draft,\n original: JSON.stringify(draft),\n version: latest.version,\n selection: ++selectionCounter.current,\n });\n setError(null);\n setPreview(null);\n };\n if (permissionsLoading || operations.loading)\n return (\n <div role=\"status\" className=\"flex min-h-60 items-center justify-center p-card-padding\">\n <Loader2 className=\"mr-2 h-5 w-5 animate-spin text-text-secondary\" />\n {t('bigconsole.alerts.loading', 'Loading alerts…')}\n </div>\n );\n if (!canRead)\n return (\n <AccessDenied\n title={t('bigconsole.alerts.denied', 'Access denied')}\n description={t('bigconsole.alerts.deniedDescription', 'You do not have permission to read this data sink.')}\n />\n );\n if (!workspaceId || !currentUser?.id)\n return (\n <p className=\"p-card-padding text-text-secondary\">\n {t('bigconsole.alerts.selectWorkspace', 'Select a workspace to view its alerts.')}\n </p>\n );\n if (!sink)\n return (\n <div className=\"p-card-padding\">\n <Section\n title={t('bigconsole.alerts.unavailable', 'Alerts could not be loaded')}\n headingLevel={2}\n tone=\"danger\"\n description={describeAlertLoadFailure(t, operations)}\n actions={\n <Button onClick={() => void operations.reloadSinkThenChannels()} variant=\"secondary\">\n {t('bigconsole.alerts.retry', 'Retry')}\n </Button>\n }\n />\n </div>\n );\n const filtered = rules.filter((rule) =>\n `${rule.name} ${rule.condition}`.toLowerCase().includes(search.trim().toLowerCase())\n );\n return (\n <div className=\"min-w-0 p-card-padding\">\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\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigate(`/datasinks/${dataSinkId}`)} className=\"mb-3\">\n <ArrowLeft className=\"mr-2 h-4 w-4\" />\n {t('bigconsole.alerts.back', 'Back to data sink')}\n </Button>\n <h1 className=\"break-words text-2xl font-bold text-text-primary\">\n {t('bigconsole.alerts.title', 'Alerts')} · {sink.name || sink.key}\n </h1>\n <p className=\"mt-2 text-sm text-text-secondary\">\n {t('bigconsole.alerts.purpose', 'Create and manage alert rules for this data sink.')}\n </p>\n </div>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => {\n void operations.reload();\n void operations.reloadChannels();\n setHistoryVersion((previous) => previous + 1);\n }}\n disabled={operations.refreshing || pending}\n >\n <RefreshCw className={`mr-2 h-4 w-4 ${operations.refreshing ? 'animate-spin' : ''}`} />\n {t('bigconsole.alerts.refresh', 'Refresh alerts')}\n </Button>\n </header>\n {status && (\n <p\n role=\"status\"\n className=\"mb-4 rounded-control bg-[var(--color-status-success-bgSubtle)] p-3 text-sm text-status-success-text\"\n >\n {status}\n </p>\n )}\n {error && !editing && (\n <p role=\"alert\" className=\"mb-4 break-words text-sm text-status-error-text\">\n {error}\n </p>\n )}\n {operations.error && (\n <p role=\"alert\" className=\"mb-4 break-words text-sm text-status-error-text\">\n {describeAlertLoadFailure(t, operations)}\n </p>\n )}\n <div className=\"grid min-w-0 items-start gap-section-gap xl:grid-cols-[minmax(0,1.2fr)_minmax(0,1fr)]\">\n <div className=\"min-w-0 space-y-section-gap\">\n <Section\n title={t('bigconsole.alerts.list.title', 'Alert rules')}\n headingLevel={2}\n icon={<Bell className=\"h-4 w-4\" />}\n actions={\n <Button size=\"sm\" onClick={() => void selectRule()} disabled={!canUpdate || pending}>\n <Plus className=\"mr-2 h-4 w-4\" />\n {t('bigconsole.alerts.list.new', 'New alert rule')}\n </Button>\n }\n >\n <label htmlFor=\"alert-search\" className=\"sr-only\">\n {t('bigconsole.alerts.list.search', 'Search alerts')}\n </label>\n <input\n id=\"alert-search\"\n type=\"search\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder={t('bigconsole.alerts.list.searchPlaceholder', 'Search alerts…')}\n className={`mb-4 w-full min-w-0 rounded-control border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary ${SECTION_FOCUS_RING}`}\n />\n <div className=\"max-w-full overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <caption className=\"sr-only\">{t('bigconsole.alerts.list.caption', 'Rules for this data sink')}</caption>\n <thead>\n <tr className=\"border-b border-border-subtle text-left text-xs text-text-secondary\">\n <th scope=\"col\" className=\"pb-3 pr-2\">\n {t('bigconsole.alerts.rule.name', 'Name')}\n </th>\n <th scope=\"col\" className=\"hidden pb-3 pr-2 sm:table-cell\">\n {t('bigconsole.alerts.rule.severity', 'Severity')}\n </th>\n <th scope=\"col\" className=\"hidden pb-3 pr-2 lg:table-cell\">\n {t('bigconsole.alerts.rule.destinations', 'Delivery destinations')}\n </th>\n <th scope=\"col\" className=\"hidden pb-3 pr-2 md:table-cell\">\n {t('bigconsole.alerts.rule.throttle', 'Throttle')}\n </th>\n <th scope=\"col\" className=\"pb-3 pr-2\">\n {t('bigconsole.alerts.list.enabled', 'Enabled')}\n </th>\n <th scope=\"col\" className=\"pb-3\">\n <span className=\"sr-only\">{t('bigconsole.alerts.list.actions', 'Actions')}</span>\n </th>\n </tr>\n </thead>\n <tbody>\n {filtered.map((rule) => (\n <tr key={rule.id} className=\"border-b border-border-subtle last:border-0\">\n <th scope=\"row\" className=\"max-w-64 py-4 pr-2 text-left font-normal\">\n <button\n type=\"button\"\n onClick={() => void selectRule(rule)}\n disabled={pending}\n className={`break-words text-left font-medium text-text-primary underline-offset-4 hover:underline ${SECTION_FOCUS_RING}`}\n >\n {rule.name}\n </button>\n <p className=\"mt-1 text-xs text-text-secondary sm:hidden\">\n {t(`bigconsole.alerts.severity.${rule.severity}`, rule.severity.toUpperCase())}\n </p>\n <p className=\"mt-1 text-xs text-text-muted md:hidden\">\n {rule.throttle?.enabled\n ? `${rule.throttle.maxAlertsPerWindow} / ${rule.throttle.windowMinutes} min`\n : t('bigconsole.alerts.list.noThrottle', 'No throttle')}\n </p>\n </th>\n <td className=\"hidden py-4 pr-2 sm:table-cell\">\n <span className=\"rounded-pill border border-border-subtle bg-bg-sunken px-2 py-1 text-xs text-text-primary\">\n {t(`bigconsole.alerts.severity.${rule.severity}`, rule.severity.toUpperCase())}\n </span>\n </td>\n <td className=\"hidden py-4 pr-2 text-xs text-text-secondary lg:table-cell\">\n {rule.deliveries.length\n ? [...new Set(rule.deliveries.map((item) => item.channel))].join(', ')\n : t('bigconsole.alerts.list.unconfigured', 'Not configured')}\n </td>\n <td className=\"hidden py-4 pr-2 text-xs text-text-secondary md:table-cell\">\n {rule.throttle?.enabled\n ? `${rule.throttle.maxAlertsPerWindow} / ${rule.throttle.windowMinutes} min`\n : t('bigconsole.alerts.list.noThrottle', 'No throttle')}\n </td>\n <td className=\"py-4 pr-2\">\n <Switch\n checked={rule.enabled}\n onCheckedChange={() => void toggle(rule)}\n disabled={!canUpdate || pending}\n aria-label={`${t('bigconsole.alerts.list.enabled', 'Enabled')} · ${rule.name}`}\n />\n </td>\n <td className=\"py-4\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void remove(rule)}\n disabled={!canUpdate || pending}\n aria-label={`${t('bigconsole.alerts.confirm.delete', 'Delete alert rule')} · ${rule.name}`}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {!filtered.length && (\n <p className=\"py-4 text-sm text-text-secondary\">\n {rules.length\n ? t('bigconsole.alerts.list.noMatches', 'No alerts match your search.')\n : t(\n 'bigconsole.alerts.list.empty',\n 'No alert rules yet. Create a disabled rule and preview its condition before enabling it.'\n )}\n </p>\n )}\n <p className=\"mt-3 text-xs text-text-muted\">\n {filtered.length} {t('bigconsole.alerts.list.count', 'rules shown')}\n </p>\n </Section>\n <AlertExecutionHistory\n owner={operations.owner}\n rules={rules}\n load={operations.history}\n refreshVersion={historyVersion}\n />\n </div>\n <div className=\"min-w-0\">\n {editing ? (\n <>\n <AlertRuleEditor\n draft={editing.draft}\n channels={operations.channels}\n channelError={operations.channelError}\n canUpdate={canUpdate}\n pending={pending}\n previewing={previewing}\n preview={preview?.result ?? null}\n previewError={previewError}\n previewStale={\n !!preview &&\n (preview.condition !== editing.draft.condition ||\n preview.conditionType !== editing.draft.conditionType ||\n sink.version > preview.result.version)\n }\n error={error}\n onChange={(draft) => {\n if (\n draft.condition !== editing.draft.condition ||\n draft.conditionType !== editing.draft.conditionType\n ) {\n previewRequest.current++;\n setPreviewError(null);\n setPreviewing(false);\n }\n setEditing({ ...editing, draft });\n }}\n onSave={() => void save()}\n onCancel={() => void cancel()}\n onPreview={() => void runPreview()}\n onReloadChannels={() => void operations.reloadChannels()}\n />\n {editing.draft.id && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void reloadRule()}\n disabled={pending || operations.refreshing}\n className=\"mt-3\"\n >\n {t('bigconsole.alerts.rule.reloadSaved', 'Reload saved rule')}\n </Button>\n )}\n </>\n ) : (\n <Section\n title={t('bigconsole.alerts.rule.title', 'Alert rule')}\n headingLevel={2}\n description={t(\n 'bigconsole.alerts.rule.select',\n 'Select a rule to inspect it, or create a new alert rule.'\n )}\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataSinkAlertsPage.js","names":[],"sources":["../../../src/bigconsole/pages/DataSinkAlertsPage.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { Button, Switch } from '@burdenoff/fe-libs/ui';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useUnsavedChanges } from '@burdenoff/fe-libs/shared/hooks';\nimport { AccessDenied } from '@burdenoff/fe-libs/shared/components';\nimport { ArrowLeft, Bell, Loader2, Plus, RefreshCw, Trash2 } from 'lucide-react';\nimport { BIGCONSOLE_PERMISSIONS } from '../../constants/permissions';\nimport { useBigConsole } from '../context';\nimport { useAppNavigate } from '../contexts';\nimport { Section, SECTION_FOCUS_RING } from '../components/common';\nimport { AlertRuleEditor } from '../components/datasink/AlertRuleEditor';\nimport { AlertExecutionHistory } from '../components/datasink/AlertExecutionHistory';\nimport {\n useDataSinkAlerts,\n alertErrorMessage,\n describeAlertLoadFailure,\n type AlertRule,\n type AlertPreview,\n} from '../hooks/useDataSinkAlerts';\nimport {\n alertDraft,\n alertDraftInput,\n validateAlertDraft,\n ALERT_VALIDATION_MESSAGES,\n type AlertDraft,\n} from '../utils/alertRules';\nimport { nativeConfirm } from '../../utils/nativeBridge';\n\ninterface EditingRule {\n draft: AlertDraft;\n original: string;\n version: number;\n selection: number;\n}\ninterface PreviewResult {\n condition: string;\n conditionType: string;\n result: AlertPreview;\n}\n\nexport default function DataSinkAlertsPage() {\n const { dataSinkId = '' } = useParams<{ dataSinkId: string }>();\n const { currentUser, workspaceId } = useBigConsole();\n return (\n <DataSinkAlertsContent\n key={`${currentUser?.id ?? ''}|${workspaceId ?? ''}|${dataSinkId}`}\n dataSinkId={dataSinkId}\n />\n );\n}\n\nfunction DataSinkAlertsContent({ dataSinkId }: { dataSinkId: string }) {\n const { t } = useI18n();\n const navigate = useAppNavigate();\n const { currentUser, workspaceId } = useBigConsole();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canRead = hasPermission(BIGCONSOLE_PERMISSIONS.DATASINK_READ);\n const canUpdate = !permissionsLoading && hasPermission(BIGCONSOLE_PERMISSIONS.DATASINK_UPDATE);\n const operations = useDataSinkAlerts(\n dataSinkId,\n !permissionsLoading && canRead && !!workspaceId && !!currentUser?.id\n );\n const sink = operations.sink;\n const rules = sink?.alerts ?? [];\n const [search, setSearch] = useState('');\n const [editing, setEditing] = useState<EditingRule | null>(null);\n const [pending, setPending] = useState(false);\n const mutationActive = useRef(false);\n const opener = useRef<HTMLElement | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [status, setStatus] = useState<string | null>(null);\n const [previewing, setPreviewing] = useState(false);\n const [previewError, setPreviewError] = useState<string | null>(null);\n const [preview, setPreview] = useState<PreviewResult | null>(null);\n const [historyVersion, setHistoryVersion] = useState(0);\n const previewRequest = useRef(0);\n const selectionCounter = useRef(0);\n const editingSelection = editing?.selection;\n useEffect(() => {\n if (editingSelection !== undefined) document.getElementById('alert-name')?.focus();\n }, [editingSelection]);\n const dirty = !!editing && JSON.stringify(editing.draft) !== editing.original;\n useUnsavedChanges({\n id: 'datasink-alert-rule',\n label: t('bigconsole.assistant.unsaved.alertRule', 'the alert rule'),\n dirty,\n });\n const confirm = async (message: string) => {\n const native = await nativeConfirm({\n title: t('bigconsole.alerts.confirm.title', 'Confirm alert change'),\n message,\n okButtonTitle: t('bigconsole.alerts.confirm.continue', 'Continue'),\n cancelButtonTitle: t('bigconsole.alerts.rule.cancel', 'Cancel'),\n });\n return native ?? window.confirm(message);\n };\n const discard = () => !dirty || confirm(t('bigconsole.alerts.confirm.discard', 'Discard your unsaved rule changes?'));\n const selectRule = async (rule?: AlertRule) => {\n if (pending || !sink || !(await discard())) return;\n if (document.activeElement instanceof HTMLElement) opener.current = document.activeElement;\n const draft = alertDraft(rule);\n setEditing({\n draft,\n original: JSON.stringify(draft),\n version: sink.version,\n selection: ++selectionCounter.current,\n });\n previewRequest.current++;\n setPreview(null);\n setPreviewError(null);\n setPreviewing(false);\n setError(null);\n setStatus(null);\n };\n const cancel = async () => {\n if (pending || !(await discard())) return;\n setEditing(null);\n setPreview(null);\n setPreviewError(null);\n previewRequest.current++;\n setPreviewing(false);\n setError(null);\n if (opener.current?.isConnected) opener.current.focus();\n };\n const save = async () => {\n if (!editing || !sink || !canUpdate || mutationActive.current) return;\n const invalid = validateAlertDraft(editing.draft, operations.channels);\n if (invalid) {\n setError(t(`bigconsole.alerts.validation.${invalid}`, ALERT_VALIDATION_MESSAGES[invalid]));\n return;\n }\n mutationActive.current = true;\n setPending(true);\n setError(null);\n setStatus(null);\n const knownIds = new Set(rules.map((rule) => rule.id));\n try {\n const saved = await operations.save(alertDraftInput(editing.draft), editing.version);\n if (!saved) return;\n const rule = saved.alerts?.find((item) =>\n editing.draft.id ? item.id === editing.draft.id : !knownIds.has(item.id)\n );\n if (rule) {\n const draft = alertDraft(rule);\n setEditing({ draft, original: JSON.stringify(draft), version: saved.version, selection: editing.selection });\n } else setEditing(null);\n setStatus(t('bigconsole.alerts.feedback.saved', 'Alert rule saved.'));\n setHistoryVersion((previous) => previous + 1);\n } catch (caught) {\n setError(alertErrorMessage(caught));\n } finally {\n mutationActive.current = false;\n setPending(false);\n }\n };\n const toggle = async (rule: AlertRule) => {\n if (!sink || !canUpdate || mutationActive.current) return;\n const draft = { ...alertDraft(rule), enabled: !rule.enabled };\n const invalid = validateAlertDraft(draft, operations.channels);\n if (invalid) {\n setError(t(`bigconsole.alerts.validation.${invalid}`, ALERT_VALIDATION_MESSAGES[invalid]));\n return;\n }\n mutationActive.current = true;\n setPending(true);\n setError(null);\n setStatus(null);\n try {\n const saved = await operations.save(alertDraftInput(draft), sink.version);\n if (saved) {\n setStatus(\n draft.enabled\n ? t('bigconsole.alerts.feedback.enabled', 'Alert rule enabled.')\n : t('bigconsole.alerts.feedback.disabled', 'Alert rule disabled.')\n );\n setHistoryVersion((previous) => previous + 1);\n }\n } catch (caught) {\n setError(alertErrorMessage(caught));\n } finally {\n mutationActive.current = false;\n setPending(false);\n }\n };\n const remove = async (rule: AlertRule) => {\n if (!sink || !canUpdate || mutationActive.current) return;\n const ok = await confirm(`${t('bigconsole.alerts.confirm.delete', 'Delete alert rule')} “${rule.name}”?`);\n if (!ok || mutationActive.current) return;\n mutationActive.current = true;\n setPending(true);\n setError(null);\n setStatus(null);\n try {\n const saved = await operations.remove(rule.id, sink.version);\n if (saved) {\n if (editing?.draft.id === rule.id) setEditing(null);\n setStatus(t('bigconsole.alerts.feedback.deleted', 'Alert rule deleted.'));\n setHistoryVersion((previous) => previous + 1);\n }\n } catch (caught) {\n setError(alertErrorMessage(caught));\n } finally {\n mutationActive.current = false;\n setPending(false);\n }\n };\n const runPreview = async () => {\n if (!editing || previewing || pending) return;\n const request = ++previewRequest.current;\n const { condition, conditionType } = editing.draft;\n setPreviewing(true);\n setPreviewError(null);\n setPreview(null);\n try {\n const result = await operations.preview(condition, conditionType);\n if (result && previewRequest.current === request) setPreview({ condition, conditionType, result });\n } catch (caught) {\n if (previewRequest.current === request) setPreviewError(alertErrorMessage(caught));\n } finally {\n if (previewRequest.current === request) setPreviewing(false);\n }\n };\n const reloadRule = async () => {\n if (!editing?.draft.id || pending || !(await discard())) return;\n const latest = await operations.reload();\n const rule = latest?.alerts?.find((item) => item.id === editing.draft.id);\n if (!latest) return;\n if (!rule) {\n setEditing(null);\n setStatus(t('bigconsole.alerts.feedback.removedElsewhere', 'This rule no longer exists.'));\n return;\n }\n const draft = alertDraft(rule);\n setEditing({\n draft,\n original: JSON.stringify(draft),\n version: latest.version,\n selection: ++selectionCounter.current,\n });\n setError(null);\n setPreview(null);\n };\n if (permissionsLoading || operations.loading)\n return (\n <div role=\"status\" className=\"flex min-h-60 items-center justify-center p-card-padding\">\n <Loader2 className=\"mr-2 h-5 w-5 animate-spin text-text-secondary\" />\n {t('bigconsole.alerts.loading', 'Loading alerts…')}\n </div>\n );\n if (!canRead)\n return (\n <AccessDenied\n title={t('bigconsole.alerts.denied', 'Access denied')}\n description={t('bigconsole.alerts.deniedDescription', 'You do not have permission to read this data sink.')}\n />\n );\n if (!workspaceId || !currentUser?.id)\n return (\n <p className=\"p-card-padding text-text-secondary\">\n {t('bigconsole.alerts.selectWorkspace', 'Select a workspace to view its alerts.')}\n </p>\n );\n if (!sink)\n return (\n <div className=\"p-card-padding\">\n <Section\n title={t('bigconsole.alerts.unavailable', 'Alerts could not be loaded')}\n headingLevel={2}\n tone=\"danger\"\n description={describeAlertLoadFailure(t, operations)}\n actions={\n <Button onClick={() => void operations.reloadSinkThenChannels()} variant=\"secondary\">\n {t('bigconsole.alerts.retry', 'Retry')}\n </Button>\n }\n />\n </div>\n );\n const filtered = rules.filter((rule) =>\n `${rule.name} ${rule.condition}`.toLowerCase().includes(search.trim().toLowerCase())\n );\n return (\n <div className=\"min-w-0 p-card-padding\">\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\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigate(`/datasinks/${dataSinkId}`)} className=\"mb-3\">\n <ArrowLeft className=\"mr-2 h-4 w-4\" />\n {t('bigconsole.alerts.back', 'Back to data sink')}\n </Button>\n <h1 className=\"break-words text-2xl font-bold text-text-primary\">\n {t('bigconsole.alerts.title', 'Alerts')} · {sink.name || sink.key}\n </h1>\n <p className=\"mt-2 text-sm text-text-secondary\">\n {t('bigconsole.alerts.purpose', 'Create and manage alert rules for this data sink.')}\n </p>\n </div>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => {\n void operations.reload();\n void operations.reloadChannels();\n setHistoryVersion((previous) => previous + 1);\n }}\n disabled={operations.refreshing || pending}\n >\n <RefreshCw className={`mr-2 h-4 w-4 ${operations.refreshing ? 'animate-spin' : ''}`} />\n {t('bigconsole.alerts.refresh', 'Refresh alerts')}\n </Button>\n </header>\n {status && (\n <p\n role=\"status\"\n className=\"mb-4 rounded-control bg-[var(--color-status-success-bgSubtle)] p-3 text-sm text-status-success-text\"\n >\n {status}\n </p>\n )}\n {error && !editing && (\n <p role=\"alert\" className=\"mb-4 break-words text-sm text-status-error-text\">\n {error}\n </p>\n )}\n {operations.error && (\n <p role=\"alert\" className=\"mb-4 break-words text-sm text-status-error-text\">\n {describeAlertLoadFailure(t, operations)}\n </p>\n )}\n <div className=\"grid min-w-0 items-start gap-section-gap xl:grid-cols-[minmax(0,1.2fr)_minmax(0,1fr)]\">\n <div className=\"min-w-0 space-y-section-gap\">\n <Section\n title={t('bigconsole.alerts.list.title', 'Alert rules')}\n headingLevel={2}\n icon={<Bell className=\"h-4 w-4\" />}\n actions={\n <Button size=\"sm\" onClick={() => void selectRule()} disabled={!canUpdate || pending}>\n <Plus className=\"mr-2 h-4 w-4\" />\n {t('bigconsole.alerts.list.new', 'New alert rule')}\n </Button>\n }\n >\n <label htmlFor=\"alert-search\" className=\"sr-only\">\n {t('bigconsole.alerts.list.search', 'Search alerts')}\n </label>\n <input\n id=\"alert-search\"\n type=\"search\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder={t('bigconsole.alerts.list.searchPlaceholder', 'Search alerts…')}\n className={`mb-4 w-full min-w-0 rounded-control border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary ${SECTION_FOCUS_RING}`}\n />\n <div className=\"max-w-full overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <caption className=\"sr-only\">{t('bigconsole.alerts.list.caption', 'Rules for this data sink')}</caption>\n <thead>\n <tr className=\"border-b border-border-subtle text-left text-xs text-text-secondary\">\n <th scope=\"col\" className=\"pb-3 pr-2\">\n {t('bigconsole.alerts.rule.name', 'Name')}\n </th>\n <th scope=\"col\" className=\"hidden pb-3 pr-2 sm:table-cell\">\n {t('bigconsole.alerts.rule.severity', 'Severity')}\n </th>\n <th scope=\"col\" className=\"hidden pb-3 pr-2 lg:table-cell\">\n {t('bigconsole.alerts.rule.destinations', 'Delivery destinations')}\n </th>\n <th scope=\"col\" className=\"hidden pb-3 pr-2 md:table-cell\">\n {t('bigconsole.alerts.rule.throttle', 'Throttle')}\n </th>\n <th scope=\"col\" className=\"pb-3 pr-2\">\n {t('bigconsole.alerts.list.enabled', 'Enabled')}\n </th>\n <th scope=\"col\" className=\"pb-3\">\n <span className=\"sr-only\">{t('bigconsole.alerts.list.actions', 'Actions')}</span>\n </th>\n </tr>\n </thead>\n <tbody>\n {filtered.map((rule) => (\n <tr key={rule.id} className=\"border-b border-border-subtle last:border-0\">\n <th scope=\"row\" className=\"max-w-64 py-4 pr-2 text-left font-normal\">\n <button\n type=\"button\"\n onClick={() => void selectRule(rule)}\n disabled={pending}\n className={`break-words text-left font-medium text-text-primary underline-offset-4 hover:underline ${SECTION_FOCUS_RING}`}\n >\n {rule.name}\n </button>\n <p className=\"mt-1 text-xs text-text-secondary sm:hidden\">\n {t(`bigconsole.alerts.severity.${rule.severity}`, rule.severity.toUpperCase())}\n </p>\n <p className=\"mt-1 text-xs text-text-muted md:hidden\">\n {rule.throttle?.enabled\n ? `${rule.throttle.maxAlertsPerWindow} / ${rule.throttle.windowMinutes} min`\n : t('bigconsole.alerts.list.noThrottle', 'No throttle')}\n </p>\n </th>\n <td className=\"hidden py-4 pr-2 sm:table-cell\">\n <span className=\"rounded-pill border border-border-subtle bg-bg-sunken px-2 py-1 text-xs text-text-primary\">\n {t(`bigconsole.alerts.severity.${rule.severity}`, rule.severity.toUpperCase())}\n </span>\n </td>\n <td className=\"hidden py-4 pr-2 text-xs text-text-secondary lg:table-cell\">\n {rule.deliveries.length\n ? [...new Set(rule.deliveries.map((item) => item.channel))].join(', ')\n : t('bigconsole.alerts.list.unconfigured', 'Not configured')}\n </td>\n <td className=\"hidden py-4 pr-2 text-xs text-text-secondary md:table-cell\">\n {rule.throttle?.enabled\n ? `${rule.throttle.maxAlertsPerWindow} / ${rule.throttle.windowMinutes} min`\n : t('bigconsole.alerts.list.noThrottle', 'No throttle')}\n </td>\n <td className=\"py-4 pr-2\">\n <Switch\n checked={rule.enabled}\n onCheckedChange={() => void toggle(rule)}\n disabled={!canUpdate || pending}\n aria-label={`${t('bigconsole.alerts.list.enabled', 'Enabled')} · ${rule.name}`}\n />\n </td>\n <td className=\"py-4\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void remove(rule)}\n disabled={!canUpdate || pending}\n aria-label={`${t('bigconsole.alerts.confirm.delete', 'Delete alert rule')} · ${rule.name}`}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {!filtered.length && (\n <p className=\"py-4 text-sm text-text-secondary\">\n {rules.length\n ? t('bigconsole.alerts.list.noMatches', 'No alerts match your search.')\n : t(\n 'bigconsole.alerts.list.empty',\n 'No alert rules yet. Create a disabled rule and preview its condition before enabling it.'\n )}\n </p>\n )}\n <p className=\"mt-3 text-xs text-text-muted\">\n {filtered.length} {t('bigconsole.alerts.list.count', 'rules shown')}\n </p>\n </Section>\n <AlertExecutionHistory\n owner={operations.owner}\n rules={rules}\n load={operations.history}\n refreshVersion={historyVersion}\n />\n </div>\n <div className=\"min-w-0\">\n {editing ? (\n <>\n <AlertRuleEditor\n draft={editing.draft}\n channels={operations.channels}\n channelError={operations.channelError}\n canUpdate={canUpdate}\n pending={pending}\n previewing={previewing}\n preview={preview?.result ?? null}\n previewError={previewError}\n previewStale={\n !!preview &&\n (preview.condition !== editing.draft.condition ||\n preview.conditionType !== editing.draft.conditionType ||\n sink.version > preview.result.version)\n }\n error={error}\n onChange={(draft) => {\n if (\n draft.condition !== editing.draft.condition ||\n draft.conditionType !== editing.draft.conditionType\n ) {\n previewRequest.current++;\n setPreviewError(null);\n setPreviewing(false);\n }\n setEditing({ ...editing, draft });\n }}\n onSave={() => void save()}\n onCancel={() => void cancel()}\n onPreview={() => void runPreview()}\n onReloadChannels={() => void operations.reloadChannels()}\n />\n {editing.draft.id && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void reloadRule()}\n disabled={pending || operations.refreshing}\n className=\"mt-3\"\n >\n {t('bigconsole.alerts.rule.reloadSaved', 'Reload saved rule')}\n </Button>\n )}\n </>\n ) : (\n <Section\n title={t('bigconsole.alerts.rule.title', 'Alert rule')}\n headingLevel={2}\n description={t(\n 'bigconsole.alerts.rule.select',\n 'Select a rule to inspect it, or create a new alert rule.'\n )}\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DataSinkBuilderPage.d.ts","sourceRoot":"","sources":["../../../src/bigconsole/pages/DataSinkBuilderPage.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqHH,eAAO,MAAM,mBAAmB,8CAgqB9B,CAAC;AAEH,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"DataSinkBuilderPage.d.ts","sourceRoot":"","sources":["../../../src/bigconsole/pages/DataSinkBuilderPage.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuHH,eAAO,MAAM,mBAAmB,8CA2qB9B,CAAC;AAEH,eAAe,mBAAmB,CAAC"}