@marinoscar/platform-web 0.1.0-next.18 → 0.1.0-next.20
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/CHANGELOG.md +32 -0
- package/README.md +5 -3
- package/dist/ai/headless/errors.d.ts +7 -0
- package/dist/ai/headless/errors.d.ts.map +1 -1
- package/dist/ai/headless/errors.js +2 -0
- package/dist/ai/headless/errors.js.map +1 -1
- package/dist/ai/headless/types.d.ts +30 -5
- package/dist/ai/headless/types.d.ts.map +1 -1
- package/dist/ai/headless/types.js +22 -10
- package/dist/ai/headless/types.js.map +1 -1
- package/dist/ai/headless/use-ai-usage.d.ts +5 -2
- package/dist/ai/headless/use-ai-usage.d.ts.map +1 -1
- package/dist/ai/headless/use-ai-usage.js +15 -5
- package/dist/ai/headless/use-ai-usage.js.map +1 -1
- package/dist/ai/ui/AiUsagePage.d.ts.map +1 -1
- package/dist/ai/ui/AiUsagePage.js +7 -5
- package/dist/ai/ui/AiUsagePage.js.map +1 -1
- package/dist/ai/ui/shared/AiErrorAlert.d.ts.map +1 -1
- package/dist/ai/ui/shared/AiErrorAlert.js +5 -1
- package/dist/ai/ui/shared/AiErrorAlert.js.map +1 -1
- package/dist/ai/ui/usage/aiUsageFormat.d.ts +9 -6
- package/dist/ai/ui/usage/aiUsageFormat.d.ts.map +1 -1
- package/dist/ai/ui/usage/aiUsageFormat.js +28 -12
- package/dist/ai/ui/usage/aiUsageFormat.js.map +1 -1
- package/dist/ai/ui/user/MyAiUsageSection.d.ts.map +1 -1
- package/dist/ai/ui/user/MyAiUsageSection.js +5 -2
- package/dist/ai/ui/user/MyAiUsageSection.js.map +1 -1
- package/dist/ai/ui/user/aiErrorText.d.ts +4 -1
- package/dist/ai/ui/user/aiErrorText.d.ts.map +1 -1
- package/dist/ai/ui/user/aiErrorText.js +10 -2
- package/dist/ai/ui/user/aiErrorText.js.map +1 -1
- package/dist/alerts/headless/client.d.ts +134 -0
- package/dist/alerts/headless/client.d.ts.map +1 -0
- package/dist/alerts/headless/client.js +105 -0
- package/dist/alerts/headless/client.js.map +1 -0
- package/dist/alerts/headless/format.d.ts +95 -0
- package/dist/alerts/headless/format.d.ts.map +1 -0
- package/dist/alerts/headless/format.js +164 -0
- package/dist/alerts/headless/format.js.map +1 -0
- package/dist/alerts/headless/hooks.d.ts +245 -0
- package/dist/alerts/headless/hooks.d.ts.map +1 -0
- package/dist/alerts/headless/hooks.js +315 -0
- package/dist/alerts/headless/hooks.js.map +1 -0
- package/dist/alerts/headless/index.d.ts +9 -0
- package/dist/alerts/headless/index.d.ts.map +1 -0
- package/dist/alerts/headless/index.js +9 -0
- package/dist/alerts/headless/index.js.map +1 -0
- package/dist/alerts/headless/rule-draft.d.ts +175 -0
- package/dist/alerts/headless/rule-draft.d.ts.map +1 -0
- package/dist/alerts/headless/rule-draft.js +261 -0
- package/dist/alerts/headless/rule-draft.js.map +1 -0
- package/dist/alerts/ui/AlertIncidentDrawer.d.ts +30 -0
- package/dist/alerts/ui/AlertIncidentDrawer.d.ts.map +1 -0
- package/dist/alerts/ui/AlertIncidentDrawer.js +33 -0
- package/dist/alerts/ui/AlertIncidentDrawer.js.map +1 -0
- package/dist/alerts/ui/AlertRuleDialog.d.ts +47 -0
- package/dist/alerts/ui/AlertRuleDialog.d.ts.map +1 -0
- package/dist/alerts/ui/AlertRuleDialog.js +124 -0
- package/dist/alerts/ui/AlertRuleDialog.js.map +1 -0
- package/dist/alerts/ui/AlertRuleTestResult.d.ts +23 -0
- package/dist/alerts/ui/AlertRuleTestResult.d.ts.map +1 -0
- package/dist/alerts/ui/AlertRuleTestResult.js +30 -0
- package/dist/alerts/ui/AlertRuleTestResult.js.map +1 -0
- package/dist/alerts/ui/AlertsPage.d.ts +41 -0
- package/dist/alerts/ui/AlertsPage.d.ts.map +1 -0
- package/dist/alerts/ui/AlertsPage.js +238 -0
- package/dist/alerts/ui/AlertsPage.js.map +1 -0
- package/dist/alerts/ui/FiringAlertsBanner.d.ts +28 -0
- package/dist/alerts/ui/FiringAlertsBanner.d.ts.map +1 -0
- package/dist/alerts/ui/FiringAlertsBanner.js +45 -0
- package/dist/alerts/ui/FiringAlertsBanner.js.map +1 -0
- package/dist/alerts/ui/copy.d.ts +15 -0
- package/dist/alerts/ui/copy.d.ts.map +1 -0
- package/dist/alerts/ui/copy.js +14 -0
- package/dist/alerts/ui/copy.js.map +1 -0
- package/dist/alerts/ui/index.d.ts +14 -0
- package/dist/alerts/ui/index.d.ts.map +1 -0
- package/dist/alerts/ui/index.js +12 -0
- package/dist/alerts/ui/index.js.map +1 -0
- package/dist/alerts/ui/parts.d.ts +26 -0
- package/dist/alerts/ui/parts.d.ts.map +1 -0
- package/dist/alerts/ui/parts.js +27 -0
- package/dist/alerts/ui/parts.js.map +1 -0
- package/dist/alerts/ui/settings.d.ts +27 -0
- package/dist/alerts/ui/settings.d.ts.map +1 -0
- package/dist/alerts/ui/settings.js +37 -0
- package/dist/alerts/ui/settings.js.map +1 -0
- package/dist/core/http/client.d.ts.map +1 -1
- package/dist/core/http/client.js +7 -0
- package/dist/core/http/client.js.map +1 -1
- package/dist/core/http/sse.d.ts.map +1 -1
- package/dist/core/http/sse.js +3 -1
- package/dist/core/http/sse.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/time-zone/format.d.ts +6 -2
- package/dist/core/time-zone/format.d.ts.map +1 -1
- package/dist/core/time-zone/format.js +27 -25
- package/dist/core/time-zone/format.js.map +1 -1
- package/dist/core/time-zone/request.d.ts +17 -0
- package/dist/core/time-zone/request.d.ts.map +1 -0
- package/dist/core/time-zone/request.js +26 -0
- package/dist/core/time-zone/request.js.map +1 -0
- package/dist/datatable/headless/export/exportModel.d.ts +7 -1
- package/dist/datatable/headless/export/exportModel.d.ts.map +1 -1
- package/dist/datatable/headless/export/exportModel.js +10 -2
- package/dist/datatable/headless/export/exportModel.js.map +1 -1
- package/dist/datatable/headless/filter/dateRange.d.ts +40 -0
- package/dist/datatable/headless/filter/dateRange.d.ts.map +1 -0
- package/dist/datatable/headless/filter/dateRange.js +53 -0
- package/dist/datatable/headless/filter/dateRange.js.map +1 -0
- package/dist/datatable/headless/filter/filterTypes.d.ts.map +1 -1
- package/dist/datatable/headless/filter/filterTypes.js +24 -4
- package/dist/datatable/headless/filter/filterTypes.js.map +1 -1
- package/dist/datatable/headless/index.d.ts +2 -0
- package/dist/datatable/headless/index.d.ts.map +1 -1
- package/dist/datatable/headless/index.js +1 -0
- package/dist/datatable/headless/index.js.map +1 -1
- package/dist/db-backup/internal/time-zones.d.ts +3 -0
- package/dist/db-backup/internal/time-zones.d.ts.map +1 -0
- package/dist/db-backup/internal/time-zones.js +24 -0
- package/dist/db-backup/internal/time-zones.js.map +1 -0
- package/dist/db-backup/ui/DbBackupConfigPanel.d.ts +11 -6
- package/dist/db-backup/ui/DbBackupConfigPanel.d.ts.map +1 -1
- package/dist/db-backup/ui/DbBackupConfigPanel.js +18 -11
- package/dist/db-backup/ui/DbBackupConfigPanel.js.map +1 -1
- package/dist/identity/ui/tokens/CreatePatDialog.d.ts +17 -0
- package/dist/identity/ui/tokens/CreatePatDialog.d.ts.map +1 -1
- package/dist/identity/ui/tokens/CreatePatDialog.js +34 -11
- package/dist/identity/ui/tokens/CreatePatDialog.js.map +1 -1
- package/dist/nodes/headless/api.d.ts +3 -1
- package/dist/nodes/headless/api.d.ts.map +1 -1
- package/dist/nodes/headless/api.js +22 -0
- package/dist/nodes/headless/api.js.map +1 -1
- package/dist/nodes/headless/index.d.ts +7 -2
- package/dist/nodes/headless/index.d.ts.map +1 -1
- package/dist/nodes/headless/index.js +4 -1
- package/dist/nodes/headless/index.js.map +1 -1
- package/dist/nodes/headless/node-events.d.ts +43 -0
- package/dist/nodes/headless/node-events.d.ts.map +1 -0
- package/dist/nodes/headless/node-events.js +150 -0
- package/dist/nodes/headless/node-events.js.map +1 -0
- package/dist/nodes/headless/power.d.ts +43 -0
- package/dist/nodes/headless/power.d.ts.map +1 -0
- package/dist/nodes/headless/power.js +74 -0
- package/dist/nodes/headless/power.js.map +1 -0
- package/dist/nodes/headless/types.d.ts +40 -3
- package/dist/nodes/headless/types.d.ts.map +1 -1
- package/dist/nodes/headless/types.js +1 -1
- package/dist/nodes/headless/types.js.map +1 -1
- package/dist/nodes/headless/use-node-events.d.ts +59 -0
- package/dist/nodes/headless/use-node-events.d.ts.map +1 -0
- package/dist/nodes/headless/use-node-events.js +159 -0
- package/dist/nodes/headless/use-node-events.js.map +1 -0
- package/dist/nodes/ui/NodeEventsTimeline.d.ts +39 -0
- package/dist/nodes/ui/NodeEventsTimeline.d.ts.map +1 -0
- package/dist/nodes/ui/NodeEventsTimeline.js +63 -0
- package/dist/nodes/ui/NodeEventsTimeline.js.map +1 -0
- package/dist/nodes/ui/NodePowerBadge.d.ts +27 -0
- package/dist/nodes/ui/NodePowerBadge.d.ts.map +1 -0
- package/dist/nodes/ui/NodePowerBadge.js +48 -0
- package/dist/nodes/ui/NodePowerBadge.js.map +1 -0
- package/dist/nodes/ui/NodeVitalsDialog.d.ts +11 -1
- package/dist/nodes/ui/NodeVitalsDialog.d.ts.map +1 -1
- package/dist/nodes/ui/NodeVitalsDialog.js +14 -5
- package/dist/nodes/ui/NodeVitalsDialog.js.map +1 -1
- package/dist/nodes/ui/WorkersPage.d.ts.map +1 -1
- package/dist/nodes/ui/WorkersPage.js +2 -1
- package/dist/nodes/ui/WorkersPage.js.map +1 -1
- package/dist/nodes/ui/workerVitals.d.ts +17 -1
- package/dist/nodes/ui/workerVitals.d.ts.map +1 -1
- package/dist/nodes/ui/workerVitals.js +43 -0
- package/dist/nodes/ui/workerVitals.js.map +1 -1
- package/dist/nodes/ui/workersTable.d.ts.map +1 -1
- package/dist/nodes/ui/workersTable.js +2 -1
- package/dist/nodes/ui/workersTable.js.map +1 -1
- package/dist/settings/ui/ProfileSettings.d.ts +1 -1
- package/dist/settings/ui/ProfileSettings.d.ts.map +1 -1
- package/dist/settings/ui/UserSettingsSection.d.ts +1 -1
- package/dist/settings/ui/UserSettingsSection.d.ts.map +1 -1
- package/dist/sharing/internal/format.d.ts +10 -1
- package/dist/sharing/internal/format.d.ts.map +1 -1
- package/dist/sharing/internal/format.js +10 -1
- package/dist/sharing/internal/format.js.map +1 -1
- package/dist/telemetry/headless/hooks/useTelemetryDashboard.d.ts +1 -1
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts +11 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts.map +1 -1
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js +17 -2
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js.map +1 -1
- package/dist/webhooks/headless/client.d.ts +101 -0
- package/dist/webhooks/headless/client.d.ts.map +1 -0
- package/dist/webhooks/headless/client.js +105 -0
- package/dist/webhooks/headless/client.js.map +1 -0
- package/dist/webhooks/headless/event-selection.d.ts +119 -0
- package/dist/webhooks/headless/event-selection.d.ts.map +1 -0
- package/dist/webhooks/headless/event-selection.js +225 -0
- package/dist/webhooks/headless/event-selection.js.map +1 -0
- package/dist/webhooks/headless/format.d.ts +84 -0
- package/dist/webhooks/headless/format.d.ts.map +1 -0
- package/dist/webhooks/headless/format.js +142 -0
- package/dist/webhooks/headless/format.js.map +1 -0
- package/dist/webhooks/headless/hooks.d.ts +199 -0
- package/dist/webhooks/headless/hooks.d.ts.map +1 -0
- package/dist/webhooks/headless/hooks.js +249 -0
- package/dist/webhooks/headless/hooks.js.map +1 -0
- package/dist/webhooks/headless/index.d.ts +9 -0
- package/dist/webhooks/headless/index.d.ts.map +1 -0
- package/dist/webhooks/headless/index.js +9 -0
- package/dist/webhooks/headless/index.js.map +1 -0
- package/dist/webhooks/ui/WebhookDeliveryDrawer.d.ts +32 -0
- package/dist/webhooks/ui/WebhookDeliveryDrawer.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookDeliveryDrawer.js +64 -0
- package/dist/webhooks/ui/WebhookDeliveryDrawer.js.map +1 -0
- package/dist/webhooks/ui/WebhookEndpointDetail.d.ts +21 -0
- package/dist/webhooks/ui/WebhookEndpointDetail.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookEndpointDetail.js +96 -0
- package/dist/webhooks/ui/WebhookEndpointDetail.js.map +1 -0
- package/dist/webhooks/ui/WebhookEndpointDialog.d.ts +39 -0
- package/dist/webhooks/ui/WebhookEndpointDialog.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookEndpointDialog.js +79 -0
- package/dist/webhooks/ui/WebhookEndpointDialog.js.map +1 -0
- package/dist/webhooks/ui/WebhookEventPicker.d.ts +30 -0
- package/dist/webhooks/ui/WebhookEventPicker.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookEventPicker.js +33 -0
- package/dist/webhooks/ui/WebhookEventPicker.js.map +1 -0
- package/dist/webhooks/ui/WebhookSecretDialog.d.ts +27 -0
- package/dist/webhooks/ui/WebhookSecretDialog.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookSecretDialog.js +52 -0
- package/dist/webhooks/ui/WebhookSecretDialog.js.map +1 -0
- package/dist/webhooks/ui/WebhookSignatureHelp.d.ts +18 -0
- package/dist/webhooks/ui/WebhookSignatureHelp.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookSignatureHelp.js +40 -0
- package/dist/webhooks/ui/WebhookSignatureHelp.js.map +1 -0
- package/dist/webhooks/ui/WebhooksPage.d.ts +47 -0
- package/dist/webhooks/ui/WebhooksPage.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhooksPage.js +172 -0
- package/dist/webhooks/ui/WebhooksPage.js.map +1 -0
- package/dist/webhooks/ui/copy.d.ts +24 -0
- package/dist/webhooks/ui/copy.d.ts.map +1 -0
- package/dist/webhooks/ui/copy.js +34 -0
- package/dist/webhooks/ui/copy.js.map +1 -0
- package/dist/webhooks/ui/index.d.ts +15 -0
- package/dist/webhooks/ui/index.d.ts.map +1 -0
- package/dist/webhooks/ui/index.js +12 -0
- package/dist/webhooks/ui/index.js.map +1 -0
- package/dist/webhooks/ui/parts.d.ts +25 -0
- package/dist/webhooks/ui/parts.d.ts.map +1 -0
- package/dist/webhooks/ui/parts.js +28 -0
- package/dist/webhooks/ui/parts.js.map +1 -0
- package/dist/webhooks/ui/settings.d.ts +58 -0
- package/dist/webhooks/ui/settings.d.ts.map +1 -0
- package/dist/webhooks/ui/settings.js +79 -0
- package/dist/webhooks/ui/settings.js.map +1 -0
- package/package.json +18 -2
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
import type { AlertRuleTestResponse } from '@marinoscar/platform-contract/alerts';
|
|
3
|
+
/**
|
|
4
|
+
* Props of {@link AlertRuleTestResult}.
|
|
5
|
+
*
|
|
6
|
+
* @stability experimental
|
|
7
|
+
*/
|
|
8
|
+
export interface AlertRuleTestResultProps {
|
|
9
|
+
/** The dry run's answer. */
|
|
10
|
+
result: AlertRuleTestResponse;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A rule's dry-run observations: the error, or each label set with its value
|
|
14
|
+
* and whether it breached, breached ones first.
|
|
15
|
+
*
|
|
16
|
+
* @param props - see {@link AlertRuleTestResultProps}.
|
|
17
|
+
* @returns the panel.
|
|
18
|
+
*
|
|
19
|
+
* @extensionPoint component
|
|
20
|
+
* @stability experimental
|
|
21
|
+
*/
|
|
22
|
+
export declare function AlertRuleTestResult({ result }: AlertRuleTestResultProps): ReactElement;
|
|
23
|
+
//# sourceMappingURL=AlertRuleTestResult.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertRuleTestResult.d.ts","sourceRoot":"","sources":["../../../src/alerts/ui/AlertRuleTestResult.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAKlF;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,4BAA4B;IAC5B,MAAM,EAAE,qBAAqB,CAAC;CAC/B;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,MAAM,EAAE,EAAE,wBAAwB,GAAG,YAAY,CA+CtF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// The observations of a rule's dry run (issue #1047): what `POST
|
|
3
|
+
// /admin/alerts/rules/:id/test` saw, one row per label set, breached first.
|
|
4
|
+
// Nothing was stored and nothing was sent; the panel says so.
|
|
5
|
+
import { Alert, Box, Chip, List, ListItem, ListItemText, Stack, Typography } from '@mui/material';
|
|
6
|
+
import { formatAlertLabels } from '../headless/index.js';
|
|
7
|
+
import { when } from './parts.js';
|
|
8
|
+
/**
|
|
9
|
+
* A rule's dry-run observations: the error, or each label set with its value
|
|
10
|
+
* and whether it breached, breached ones first.
|
|
11
|
+
*
|
|
12
|
+
* @param props - see {@link AlertRuleTestResultProps}.
|
|
13
|
+
* @returns the panel.
|
|
14
|
+
*
|
|
15
|
+
* @extensionPoint component
|
|
16
|
+
* @stability experimental
|
|
17
|
+
*/
|
|
18
|
+
export function AlertRuleTestResult({ result }) {
|
|
19
|
+
const observations = [...result.observations].sort((a, b) => Number(b.breached) - Number(a.breached));
|
|
20
|
+
const breached = observations.filter((observation) => observation.breached).length;
|
|
21
|
+
return (_jsxs(Box, { "data-testid": "alert-test-result", children: [_jsxs(Typography, { variant: "body2", color: "text.secondary", sx: { mb: 1 }, children: ["Evaluated ", when(result.evaluatedAt), " in ", result.durationMs, " ms. Nothing was stored and no notification was sent."] }), result.error ? (_jsxs(Alert, { severity: "error", children: ["The rule could not be evaluated: ", result.error] })) : observations.length === 0 ? (_jsx(Alert, { severity: "info", children: "No observations: nothing matched the rule right now." })) : (_jsxs(_Fragment, { children: [_jsx(Alert, { severity: breached > 0 ? 'warning' : 'success', sx: { mb: 1 }, children: breached > 0
|
|
22
|
+
? `${breached} of ${observations.length} ${observations.length === 1 ? 'observation' : 'observations'} would fire.`
|
|
23
|
+
: `None of the ${observations.length} ${observations.length === 1 ? 'observation' : 'observations'} would fire.` }), _jsx(List, { dense: true, "aria-label": "Observations", children: observations.map((observation, index) => (_jsx(ListItem, { divider: true, children: _jsx(ListItemText, { primary: _jsxs(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { alignItems: 'center', flexWrap: 'wrap' }, children: [_jsx(Chip, { size: "small", label: observation.breached ? 'Breached' : 'OK', color: observation.breached ? 'warning' : 'success' }), _jsx("span", { children: observation.summary })] }), secondary: [
|
|
24
|
+
formatAlertLabels(observation.labels) || 'No labels',
|
|
25
|
+
observation.value === null ? null : `value ${observation.value}`,
|
|
26
|
+
]
|
|
27
|
+
.filter(Boolean)
|
|
28
|
+
.join(' · ') }) }, `${formatAlertLabels(observation.labels)}-${index}`))) })] }))] }));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=AlertRuleTestResult.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertRuleTestResult.js","sourceRoot":"","sources":["../../../src/alerts/ui/AlertRuleTestResult.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type ReactElement } from 'react';
|
|
2
|
+
import type { PageSlotsBase } from '../../core/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* The slots of {@link AlertsPage}: the page-slot contract.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* <AlertsPage slots={{ BeforeContent: OnCallNotice }} />
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* @extensionPoint slot
|
|
12
|
+
* @stability experimental
|
|
13
|
+
*/
|
|
14
|
+
export type AlertsPageSlots = PageSlotsBase;
|
|
15
|
+
/**
|
|
16
|
+
* Props of {@link AlertsPage}.
|
|
17
|
+
*
|
|
18
|
+
* @stability experimental
|
|
19
|
+
*/
|
|
20
|
+
export interface AlertsPageProps {
|
|
21
|
+
/** Optional extension slots; omitted, the page renders exactly its own markup. */
|
|
22
|
+
slots?: AlertsPageSlots;
|
|
23
|
+
/** The notification channel ids the rule editor offers; default `email`, `browser`, `push`. */
|
|
24
|
+
channels?: readonly string[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The Alerts page: the Rules and Incidents tabs.
|
|
28
|
+
*
|
|
29
|
+
* @param props - see {@link AlertsPageProps}.
|
|
30
|
+
* @returns the page.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```tsx
|
|
34
|
+
* <Route path="/admin/settings/alerts" element={<AlertsPage />} />
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* @extensionPoint component
|
|
38
|
+
* @stability experimental
|
|
39
|
+
*/
|
|
40
|
+
export declare function AlertsPage({ slots, channels }?: AlertsPageProps): ReactElement;
|
|
41
|
+
//# sourceMappingURL=AlertsPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertsPage.d.ts","sourceRoot":"","sources":["../../../src/alerts/ui/AlertsPage.tsx"],"names":[],"mappings":"AAuCA,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAe1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAmBzD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,eAAe,GAAG,aAAa,CAAC;AAE5C;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,kFAAkF;IAClF,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAyXD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAE,eAAoB,GAAG,YAAY,CAiDlF"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// =============================================================================
|
|
3
|
+
// AlertsPage (issue #1047): the rules and the incidents they raised
|
|
4
|
+
// =============================================================================
|
|
5
|
+
//
|
|
6
|
+
// One destination (`/admin/settings/alerts`, `alerts:read`) with two tabs of
|
|
7
|
+
// PARALLEL content: Rules (the list with the enable switch, the editor, the
|
|
8
|
+
// dry-run "Test") and Incidents (filters, the table, the detail drawer,
|
|
9
|
+
// Acknowledge). The tab is kept in the URL (`?tab=incidents`) so the firing
|
|
10
|
+
// banner can link straight to it. Write controls are drawn only for a viewer
|
|
11
|
+
// holding `alerts:write`; the API enforces it either way. A built-in (starter)
|
|
12
|
+
// rule shows "Built-in" and has no Delete.
|
|
13
|
+
// =============================================================================
|
|
14
|
+
import AddIcon from '@mui/icons-material/Add';
|
|
15
|
+
import EditOutlinedIcon from '@mui/icons-material/EditOutlined';
|
|
16
|
+
import PlayArrowOutlinedIcon from '@mui/icons-material/PlayArrowOutlined';
|
|
17
|
+
import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined';
|
|
18
|
+
import DoneIcon from '@mui/icons-material/Done';
|
|
19
|
+
import { Alert, Box, Button, Card, CardContent, Chip, Container, Dialog, DialogActions, DialogContent, DialogTitle, Link, MenuItem, Stack, Switch, Tab, Tabs, TextField, Typography, } from '@mui/material';
|
|
20
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
21
|
+
import { useSearchParams } from 'react-router-dom';
|
|
22
|
+
import { ALERT_INCIDENT_STATES, ALERT_PAGE_SIZE_DEFAULT, ALERT_PERMISSIONS, ALERT_SEVERITIES } from '@marinoscar/platform-contract/alerts';
|
|
23
|
+
import { PageSlotsFrame, useDisplayTimeZone, usePlatformViewer } from '../../core/index.js';
|
|
24
|
+
import { DataTable } from '../../datatable/index.js';
|
|
25
|
+
import { ALERT_SEVERITY_LABELS, ALERT_STATE_LABELS, alertKindLabel, formatAlertLabels, useAlertIncidents, useAlertKinds, useAlertMetricCatalog, useAlertMutations, useAlertRules, } from '../headless/index.js';
|
|
26
|
+
import { AlertIncidentDrawer } from './AlertIncidentDrawer.js';
|
|
27
|
+
import { AlertRuleDialog } from './AlertRuleDialog.js';
|
|
28
|
+
import { AlertRuleTestResult } from './AlertRuleTestResult.js';
|
|
29
|
+
import { ALERTS_PAGE_COPY } from './copy.js';
|
|
30
|
+
import { ConfirmDialog, SeverityChip, StateChip, when } from './parts.js';
|
|
31
|
+
function RulesTab({ canWrite, channels }) {
|
|
32
|
+
const { rules, isLoading, error, refresh } = useAlertRules();
|
|
33
|
+
const { kinds } = useAlertKinds();
|
|
34
|
+
const mutations = useAlertMutations();
|
|
35
|
+
const [editing, setEditing] = useState(null);
|
|
36
|
+
const metricsWanted = editing !== null && canWrite;
|
|
37
|
+
const catalog = useAlertMetricCatalog({ enabled: metricsWanted });
|
|
38
|
+
const [deleting, setDeleting] = useState(null);
|
|
39
|
+
const [testing, setTesting] = useState(null);
|
|
40
|
+
const [notice, setNotice] = useState(null);
|
|
41
|
+
const open = useCallback((rule) => {
|
|
42
|
+
mutations.reset();
|
|
43
|
+
setNotice(null);
|
|
44
|
+
setEditing(rule);
|
|
45
|
+
}, [mutations]);
|
|
46
|
+
const save = async (body) => {
|
|
47
|
+
if (editing === null)
|
|
48
|
+
return;
|
|
49
|
+
const saved = editing === 'new' ? await mutations.create(body) : await mutations.update(editing.id, body);
|
|
50
|
+
if (!saved)
|
|
51
|
+
return;
|
|
52
|
+
setEditing(null);
|
|
53
|
+
setNotice(editing === 'new' ? `Rule “${saved.name}” created.` : `Rule “${saved.name}” saved.`);
|
|
54
|
+
await refresh();
|
|
55
|
+
};
|
|
56
|
+
const toggle = useCallback(async (rule, enabled) => {
|
|
57
|
+
const updated = await mutations.toggle(rule.id, enabled);
|
|
58
|
+
if (updated)
|
|
59
|
+
await refresh();
|
|
60
|
+
}, [mutations, refresh]);
|
|
61
|
+
const runTest = useCallback(async (rule) => {
|
|
62
|
+
setTesting({ rule, result: null });
|
|
63
|
+
const result = await mutations.test(rule.id);
|
|
64
|
+
setTesting(result ? { rule, result } : null);
|
|
65
|
+
}, [mutations]);
|
|
66
|
+
const remove = async () => {
|
|
67
|
+
if (!deleting)
|
|
68
|
+
return;
|
|
69
|
+
const ok = await mutations.remove(deleting.id);
|
|
70
|
+
const name = deleting.name;
|
|
71
|
+
setDeleting(null);
|
|
72
|
+
if (!ok)
|
|
73
|
+
return;
|
|
74
|
+
setEditing(null);
|
|
75
|
+
setNotice(`Rule “${name}” deleted.`);
|
|
76
|
+
await refresh();
|
|
77
|
+
};
|
|
78
|
+
const columns = useMemo(() => [
|
|
79
|
+
{
|
|
80
|
+
id: 'enabled',
|
|
81
|
+
label: 'Enabled',
|
|
82
|
+
priority: 'primary',
|
|
83
|
+
value: (row) => (row.enabled ? 'On' : 'Off'),
|
|
84
|
+
render: (row) => (_jsx(Switch, { checked: row.enabled, disabled: !canWrite || mutations.pending, onChange: (event) => void toggle(row, event.target.checked), slotProps: { input: { 'aria-label': `${row.enabled ? 'Disable' : 'Enable'} ${row.name}` } } })),
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
id: 'name',
|
|
88
|
+
label: 'Name',
|
|
89
|
+
priority: 'primary',
|
|
90
|
+
value: (row) => row.name,
|
|
91
|
+
render: (row) => (_jsxs(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { alignItems: 'center', flexWrap: 'wrap' }, children: [_jsx(Link, { component: "button", type: "button", variant: "body2", onClick: () => open(row), sx: { textAlign: 'left', fontWeight: 600 }, children: row.name }), row.starter ? _jsx(Chip, { size: "small", variant: "outlined", label: "Built-in" }) : null] })),
|
|
92
|
+
},
|
|
93
|
+
{ id: 'kind', label: 'Kind', priority: 'secondary', value: (row) => alertKindLabel(row.kind, kinds) },
|
|
94
|
+
{
|
|
95
|
+
id: 'severity',
|
|
96
|
+
label: 'Severity',
|
|
97
|
+
priority: 'secondary',
|
|
98
|
+
value: (row) => ALERT_SEVERITY_LABELS[row.severity],
|
|
99
|
+
render: (row) => _jsx(SeverityChip, { severity: row.severity }),
|
|
100
|
+
},
|
|
101
|
+
{ id: 'lastEvaluatedAt', label: 'Last evaluated', priority: 'detail', value: (row) => when(row.lastEvaluatedAt) },
|
|
102
|
+
{
|
|
103
|
+
id: 'lastError',
|
|
104
|
+
label: 'Last error',
|
|
105
|
+
priority: 'detail',
|
|
106
|
+
value: (row) => row.lastError ?? '',
|
|
107
|
+
render: (row) => row.lastError ? (_jsx(Typography, { variant: "body2", color: "error", children: row.lastError })) : ('—'),
|
|
108
|
+
},
|
|
109
|
+
], [canWrite, kinds, mutations.pending, open, toggle]);
|
|
110
|
+
const rowActions = useMemo(() => {
|
|
111
|
+
const actions = [
|
|
112
|
+
canWrite
|
|
113
|
+
? { id: 'edit', label: 'Edit rule', icon: _jsx(EditOutlinedIcon, {}), onClick: (row) => open(row) }
|
|
114
|
+
: { id: 'view', label: 'View rule', icon: _jsx(VisibilityOutlinedIcon, {}), onClick: (row) => open(row) },
|
|
115
|
+
];
|
|
116
|
+
if (canWrite) {
|
|
117
|
+
actions.push({ id: 'test', label: 'Test rule', icon: _jsx(PlayArrowOutlinedIcon, {}), onClick: (row) => void runTest(row) });
|
|
118
|
+
}
|
|
119
|
+
return actions;
|
|
120
|
+
}, [canWrite, open, runTest]);
|
|
121
|
+
return (_jsxs(Stack, { spacing: 2, children: [error ? _jsx(Alert, { severity: "error", children: error }) : null, mutations.error && editing === null ? (_jsx(Alert, { severity: "error", onClose: mutations.reset, children: mutations.error })) : null, notice ? (_jsx(Alert, { severity: "success", onClose: () => setNotice(null), children: notice })) : null, canWrite ? (_jsx(Box, { children: _jsx(Button, { variant: "contained", startIcon: _jsx(AddIcon, {}), onClick: () => open('new'), sx: { minHeight: 44 }, children: "New rule" }) })) : null, _jsx(Card, { variant: "outlined", children: _jsx(CardContent, { children: _jsx(DataTable, { tableId: "alert-rules", ariaLabel: "Alert rules", columns: columns, rows: rules, rowId: (row) => row.id, loading: isLoading, rowActions: rowActions, emptyState: _jsxs(Typography, { variant: "body2", color: "text.secondary", sx: { p: 2 }, children: ["No alert rules yet.", canWrite ? ' Create one to get told when something needs attention.' : ''] }), disableExport: true }) }) }), _jsx(AlertRuleDialog, { open: editing !== null, rule: editing === 'new' ? null : editing, kinds: kinds, metrics: catalog.metrics, metricsError: metricsWanted ? catalog.error : null, ...(channels ? { channels } : {}), readOnly: !canWrite, saving: mutations.pending, error: editing !== null ? mutations.error : null, onSubmit: (body) => void save(body), ...(canWrite && editing !== null && editing !== 'new'
|
|
122
|
+
? { onTest: () => mutations.test(editing.id) }
|
|
123
|
+
: {}), ...(canWrite && editing !== null && editing !== 'new' && !editing.starter
|
|
124
|
+
? { onDelete: () => setDeleting(editing) }
|
|
125
|
+
: {}), onClose: () => {
|
|
126
|
+
setEditing(null);
|
|
127
|
+
mutations.reset();
|
|
128
|
+
} }), _jsxs(ConfirmDialog, { open: deleting !== null, title: "Delete this rule?", confirmLabel: "Delete rule", destructive: true, busy: mutations.pending, onConfirm: () => void remove(), onClose: () => setDeleting(null), children: [deleting ? _jsx("strong", { children: deleting.name }) : 'The rule', " stops being evaluated now, and its incidents are deleted with it. This cannot be undone."] }), _jsxs(Dialog, { open: testing !== null, onClose: () => setTesting(null), maxWidth: "sm", fullWidth: true, "aria-labelledby": "alert-test-title", children: [_jsxs(DialogTitle, { id: "alert-test-title", children: ["Test: ", testing?.rule.name] }), _jsx(DialogContent, { dividers: true, children: testing?.result ? _jsx(AlertRuleTestResult, { result: testing.result }) : _jsx(Typography, { color: "text.secondary", children: "Evaluating\u2026" }) }), _jsx(DialogActions, { children: _jsx(Button, { onClick: () => setTesting(null), sx: { minHeight: 44 }, children: "Close" }) })] })] }));
|
|
129
|
+
}
|
|
130
|
+
function IncidentsTab({ canWrite }) {
|
|
131
|
+
const [state, setState] = useState('');
|
|
132
|
+
const [severity, setSeverity] = useState('');
|
|
133
|
+
const [paging, setPaging] = useState({ page: 0, pageSize: ALERT_PAGE_SIZE_DEFAULT });
|
|
134
|
+
const { incidents, total, isLoading, error, refresh } = useAlertIncidents({
|
|
135
|
+
...(state ? { state } : {}),
|
|
136
|
+
...(severity ? { severity } : {}),
|
|
137
|
+
page: paging.page + 1,
|
|
138
|
+
pageSize: paging.pageSize,
|
|
139
|
+
});
|
|
140
|
+
const mutations = useAlertMutations();
|
|
141
|
+
const [openId, setOpenId] = useState(null);
|
|
142
|
+
const acknowledge = useCallback(async (incident) => {
|
|
143
|
+
const updated = await mutations.acknowledge(incident.id);
|
|
144
|
+
if (updated)
|
|
145
|
+
await refresh();
|
|
146
|
+
return updated;
|
|
147
|
+
}, [mutations, refresh]);
|
|
148
|
+
const columns = useMemo(() => [
|
|
149
|
+
{
|
|
150
|
+
id: 'state',
|
|
151
|
+
label: 'State',
|
|
152
|
+
priority: 'primary',
|
|
153
|
+
value: (row) => ALERT_STATE_LABELS[row.state],
|
|
154
|
+
render: (row) => _jsx(StateChip, { state: row.state }),
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
id: 'rule',
|
|
158
|
+
label: 'Rule',
|
|
159
|
+
priority: 'primary',
|
|
160
|
+
value: (row) => row.ruleName,
|
|
161
|
+
render: (row) => (_jsx(Link, { component: "button", type: "button", variant: "body2", onClick: () => setOpenId(row.id), sx: { textAlign: 'left', fontWeight: 600 }, children: row.ruleName })),
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
id: 'severity',
|
|
165
|
+
label: 'Severity',
|
|
166
|
+
priority: 'secondary',
|
|
167
|
+
value: (row) => ALERT_SEVERITY_LABELS[row.severity],
|
|
168
|
+
render: (row) => _jsx(SeverityChip, { severity: row.severity }),
|
|
169
|
+
},
|
|
170
|
+
{ id: 'summary', label: 'Summary', priority: 'secondary', value: (row) => row.summary },
|
|
171
|
+
{ id: 'labels', label: 'Labels', priority: 'detail', value: (row) => formatAlertLabels(row.labels) || '—' },
|
|
172
|
+
{ id: 'firedAt', label: 'Fired', priority: 'detail', value: (row) => when(row.firedAt ?? row.pendingSince) },
|
|
173
|
+
{
|
|
174
|
+
id: 'acknowledged',
|
|
175
|
+
label: 'Acknowledged',
|
|
176
|
+
priority: 'detail',
|
|
177
|
+
value: (row) => (row.acknowledgedAt ? when(row.acknowledgedAt) : 'No'),
|
|
178
|
+
},
|
|
179
|
+
], []);
|
|
180
|
+
const rowActions = useMemo(() => {
|
|
181
|
+
const actions = [
|
|
182
|
+
{ id: 'view', label: 'View incident', icon: _jsx(VisibilityOutlinedIcon, {}), onClick: (row) => setOpenId(row.id) },
|
|
183
|
+
];
|
|
184
|
+
if (canWrite) {
|
|
185
|
+
actions.push({
|
|
186
|
+
id: 'acknowledge',
|
|
187
|
+
label: 'Acknowledge',
|
|
188
|
+
icon: _jsx(DoneIcon, {}),
|
|
189
|
+
onClick: (row) => void acknowledge(row),
|
|
190
|
+
disabled: (row) => row.acknowledgedAt !== null || row.state === 'resolved',
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
return actions;
|
|
194
|
+
}, [acknowledge, canWrite]);
|
|
195
|
+
return (_jsxs(Stack, { spacing: 2, children: [error ? _jsx(Alert, { severity: "error", children: error }) : null, mutations.error ? (_jsx(Alert, { severity: "error", onClose: mutations.reset, children: mutations.error })) : null, _jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 2, children: [_jsxs(TextField, { select: true, label: "State", value: state, onChange: (event) => {
|
|
196
|
+
setState(event.target.value);
|
|
197
|
+
setPaging((current) => ({ ...current, page: 0 }));
|
|
198
|
+
}, sx: { minWidth: 180 }, children: [_jsx(MenuItem, { value: "", children: "Any state" }), ALERT_INCIDENT_STATES.map((value) => (_jsx(MenuItem, { value: value, children: ALERT_STATE_LABELS[value] }, value)))] }), _jsxs(TextField, { select: true, label: "Severity", value: severity, onChange: (event) => {
|
|
199
|
+
setSeverity(event.target.value);
|
|
200
|
+
setPaging((current) => ({ ...current, page: 0 }));
|
|
201
|
+
}, sx: { minWidth: 180 }, children: [_jsx(MenuItem, { value: "", children: "Any severity" }), ALERT_SEVERITIES.map((value) => (_jsx(MenuItem, { value: value, children: ALERT_SEVERITY_LABELS[value] }, value)))] })] }), _jsx(Card, { variant: "outlined", children: _jsx(CardContent, { children: _jsx(DataTable, { tableId: "alert-incidents", ariaLabel: "Alert incidents", columns: columns, rows: incidents, rowId: (row) => row.id, loading: isLoading, rowActions: rowActions, pagination: {
|
|
202
|
+
page: paging.page,
|
|
203
|
+
pageSize: paging.pageSize,
|
|
204
|
+
total,
|
|
205
|
+
onPaginationChange: (next) => setPaging(next),
|
|
206
|
+
}, emptyState: _jsx(Typography, { variant: "body2", color: "text.secondary", sx: { p: 2 }, children: "No incidents match." }), disableExport: true }) }) }), _jsx(AlertIncidentDrawer, { incidentId: openId, canWrite: canWrite, onAcknowledge: acknowledge, acknowledging: mutations.pending, onClose: () => setOpenId(null) })] }));
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* The Alerts page: the Rules and Incidents tabs.
|
|
210
|
+
*
|
|
211
|
+
* @param props - see {@link AlertsPageProps}.
|
|
212
|
+
* @returns the page.
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* ```tsx
|
|
216
|
+
* <Route path="/admin/settings/alerts" element={<AlertsPage />} />
|
|
217
|
+
* ```
|
|
218
|
+
*
|
|
219
|
+
* @extensionPoint component
|
|
220
|
+
* @stability experimental
|
|
221
|
+
*/
|
|
222
|
+
export function AlertsPage({ slots, channels } = {}) {
|
|
223
|
+
useDisplayTimeZone();
|
|
224
|
+
const viewer = usePlatformViewer();
|
|
225
|
+
const canWrite = viewer.hasPermission(ALERT_PERMISSIONS.WRITE);
|
|
226
|
+
const [params, setParams] = useSearchParams();
|
|
227
|
+
const tab = params.get('tab') === 'incidents' ? 'incidents' : 'rules';
|
|
228
|
+
const setTab = (next) => {
|
|
229
|
+
const updated = new URLSearchParams(params);
|
|
230
|
+
if (next === 'rules')
|
|
231
|
+
updated.delete('tab');
|
|
232
|
+
else
|
|
233
|
+
updated.set('tab', next);
|
|
234
|
+
setParams(updated, { replace: true });
|
|
235
|
+
};
|
|
236
|
+
return (_jsx(Container, { maxWidth: "lg", children: _jsx(Box, { sx: { py: { xs: 2, sm: 4 } }, children: _jsxs(PageSlotsFrame, { slots: slots, headerProps: { title: ALERTS_PAGE_COPY.title, description: ALERTS_PAGE_COPY.description, readOnly: !canWrite, actions: null }, header: _jsxs(_Fragment, { children: [_jsxs(Typography, { variant: "h4", component: "h1", gutterBottom: true, children: [ALERTS_PAGE_COPY.title, canWrite ? null : ' (read-only)'] }), _jsx(Typography, { color: "text.secondary", sx: { mb: 2 }, children: ALERTS_PAGE_COPY.description })] }), children: [_jsxs(Tabs, { value: tab, onChange: (_, next) => setTab(next), "aria-label": "Alerts sections", variant: "scrollable", allowScrollButtonsMobile: true, sx: { mb: 2, borderBottom: 1, borderColor: 'divider' }, children: [_jsx(Tab, { value: "rules", label: "Rules", id: "alerts-tab-rules", "aria-controls": "alerts-panel-rules", sx: { minHeight: 48 } }), _jsx(Tab, { value: "incidents", label: "Incidents", id: "alerts-tab-incidents", "aria-controls": "alerts-panel-incidents", sx: { minHeight: 48 } })] }), _jsx(Box, { role: "tabpanel", id: `alerts-panel-${tab}`, "aria-labelledby": `alerts-tab-${tab}`, children: tab === 'rules' ? _jsx(RulesTab, { canWrite: canWrite, channels: channels }) : _jsx(IncidentsTab, { canWrite: canWrite }) })] }) }) }));
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=AlertsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertsPage.js","sourceRoot":"","sources":["../../../src/alerts/ui/AlertsPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Props of {@link FiringAlertsBanner}.
|
|
4
|
+
*
|
|
5
|
+
* @stability experimental
|
|
6
|
+
*/
|
|
7
|
+
export interface FiringAlertsBannerProps {
|
|
8
|
+
/** Where "View incidents" goes; default the Alerts page's Incidents tab. */
|
|
9
|
+
to?: string;
|
|
10
|
+
/** The poll interval in milliseconds; default 30 000. */
|
|
11
|
+
intervalMs?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The number of firing alerts by severity, with a link to the incidents.
|
|
15
|
+
*
|
|
16
|
+
* @param props - see {@link FiringAlertsBannerProps}.
|
|
17
|
+
* @returns the banner, or `null` when nothing is firing.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* <TelemetryDashboardPage slots={{ BeforeContent: () => <FiringAlertsBanner /> }} />
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @extensionPoint component
|
|
25
|
+
* @stability experimental
|
|
26
|
+
*/
|
|
27
|
+
export declare function FiringAlertsBanner({ to, intervalMs }?: FiringAlertsBannerProps): ReactElement | null;
|
|
28
|
+
//# sourceMappingURL=FiringAlertsBanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FiringAlertsBanner.d.ts","sourceRoot":"","sources":["../../../src/alerts/ui/FiringAlertsBanner.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAU1C;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,4EAA4E;IAC5E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAQD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAA6C,EAAE,UAAU,EAAE,GAAE,uBAA4B,GAAG,YAAY,GAAG,IAAI,CAgCnJ"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// The firing-alerts banner (issue #1047): how many alerts are firing now, by
|
|
3
|
+
// severity, linking to the Alerts page's incidents. Built for the telemetry
|
|
4
|
+
// dashboard's `BeforeContent` slot (the app passes it; telemetry does not
|
|
5
|
+
// depend on alerts), and usable on any page. Draws nothing while nothing is
|
|
6
|
+
// firing, before the first answer, or for a viewer without `alerts:read`.
|
|
7
|
+
import { Alert, AlertTitle, Button, Stack } from '@mui/material';
|
|
8
|
+
import { Link as RouterLink } from 'react-router-dom';
|
|
9
|
+
import { ALERT_PERMISSIONS, ALERT_SEVERITIES } from '@marinoscar/platform-contract/alerts';
|
|
10
|
+
import { usePlatformViewer } from '../../core/index.js';
|
|
11
|
+
import { ALERT_SEVERITY_LABELS, alertFiringTotal, alertTopSeverity, useAlertSummary } from '../headless/index.js';
|
|
12
|
+
import { ALERTS_PAGE_COPY } from './copy.js';
|
|
13
|
+
import { SeverityChip } from './parts.js';
|
|
14
|
+
const ALERT_SEVERITY_FOR = {
|
|
15
|
+
critical: 'error',
|
|
16
|
+
warning: 'warning',
|
|
17
|
+
info: 'info',
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* The number of firing alerts by severity, with a link to the incidents.
|
|
21
|
+
*
|
|
22
|
+
* @param props - see {@link FiringAlertsBannerProps}.
|
|
23
|
+
* @returns the banner, or `null` when nothing is firing.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* <TelemetryDashboardPage slots={{ BeforeContent: () => <FiringAlertsBanner /> }} />
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @extensionPoint component
|
|
31
|
+
* @stability experimental
|
|
32
|
+
*/
|
|
33
|
+
export function FiringAlertsBanner({ to = `${ALERTS_PAGE_COPY.path}?tab=incidents`, intervalMs } = {}) {
|
|
34
|
+
const viewer = usePlatformViewer();
|
|
35
|
+
const allowed = viewer.hasPermission(ALERT_PERMISSIONS.READ);
|
|
36
|
+
const { summary } = useAlertSummary({ enabled: allowed, ...(intervalMs === undefined ? {} : { intervalMs }) });
|
|
37
|
+
const total = alertFiringTotal(summary);
|
|
38
|
+
const top = alertTopSeverity(summary);
|
|
39
|
+
if (!allowed || !summary || total === 0 || !top)
|
|
40
|
+
return null;
|
|
41
|
+
return (_jsxs(Alert, { severity: ALERT_SEVERITY_FOR[top] ?? 'warning', sx: { mb: 2 }, "data-testid": "firing-alerts-banner", action: _jsx(Button, { component: RouterLink, to: to, color: "inherit", size: "small", sx: { minHeight: 44 }, children: "View incidents" }), children: [_jsx(AlertTitle, { children: total === 1 ? '1 alert is firing' : `${total} alerts are firing` }), _jsx(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { flexWrap: 'wrap' }, children: ALERT_SEVERITIES.filter((severity) => summary.firing[severity] > 0)
|
|
42
|
+
.reverse()
|
|
43
|
+
.map((severity) => (_jsx(SeverityChip, { severity: severity, label: `${summary.firing[severity]} ${ALERT_SEVERITY_LABELS[severity].toLowerCase()}` }, severity))) })] }));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=FiringAlertsBanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FiringAlertsBanner.js","sourceRoot":"","sources":["../../../src/alerts/ui/FiringAlertsBanner.tsx"],"names":[],"mappings":";AAAA,6EAA6E;AAC7E,4EAA4E;AAC5E,0EAA0E;AAC1E,4EAA4E;AAC5E,0EAA0E;AAE1E,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAE3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAClH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAc1C,MAAM,kBAAkB,GAA2D;IACjF,QAAQ,EAAE,OAAO;IACjB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;CACb,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAE,EAAE,GAAG,GAAG,gBAAgB,CAAC,IAAI,gBAAgB,EAAE,UAAU,KAA8B,EAAE;IAC5H,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/G,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAC7D,OAAO,CACL,MAAC,KAAK,IACJ,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC,IAAI,SAAS,EAC9C,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,iBACD,sBAAsB,EAClC,MAAM,EACJ,KAAC,MAAM,IAAC,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAC,SAAS,EAAC,IAAI,EAAC,OAAO,EAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,+BAEhF,aAGX,KAAC,UAAU,cAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,KAAK,oBAAoB,GAAc,EAC3F,KAAC,KAAK,IAAC,SAAS,EAAC,KAAK,EAAC,OAAO,EAAE,CAAC,EAAE,UAAU,QAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YACnE,gBAAgB,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;qBACjE,OAAO,EAAE;qBACT,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CACjB,KAAC,YAAY,IAEX,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,IAFhF,QAAQ,CAGb,CACH,CAAC,GACE,IACF,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The title, description and route of the Alerts page: the registry card's
|
|
3
|
+
* text and the page's heading.
|
|
4
|
+
*
|
|
5
|
+
* @stability experimental
|
|
6
|
+
*/
|
|
7
|
+
export declare const ALERTS_PAGE_COPY: Readonly<{
|
|
8
|
+
/** The card title and the page heading. */
|
|
9
|
+
readonly title: string;
|
|
10
|
+
/** The card text and the page lead. */
|
|
11
|
+
readonly description: string;
|
|
12
|
+
/** The route of the page. */
|
|
13
|
+
readonly path: string;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=copy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../../src/alerts/ui/copy.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC;IACtC,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAKC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// The alerts UI's copy (issue #1047), in one place so a fork rewords it once.
|
|
2
|
+
// The card text and the page heading are the same words.
|
|
3
|
+
/**
|
|
4
|
+
* The title, description and route of the Alerts page: the registry card's
|
|
5
|
+
* text and the page's heading.
|
|
6
|
+
*
|
|
7
|
+
* @stability experimental
|
|
8
|
+
*/
|
|
9
|
+
export const ALERTS_PAGE_COPY = Object.freeze({
|
|
10
|
+
title: 'Alerts',
|
|
11
|
+
description: 'Get told when something needs attention: metric thresholds, worker node events, offline nodes and the dashboard verdict, with the incidents they raised.',
|
|
12
|
+
path: '/admin/settings/alerts',
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../src/alerts/ui/copy.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yDAAyD;AAEzD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAOxB,MAAM,CAAC,MAAM,CAAC;IACjB,KAAK,EAAE,QAAQ;IACf,WAAW,EACT,0JAA0J;IAC5J,IAAI,EAAE,wBAAwB;CAC/B,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { ALERTS_PAGE_COPY } from './copy.js';
|
|
2
|
+
export { alertsAdminCards } from './settings.js';
|
|
3
|
+
export type { AlertsAdminCard } from './settings.js';
|
|
4
|
+
export { AlertIncidentDrawer } from './AlertIncidentDrawer.js';
|
|
5
|
+
export type { AlertIncidentDrawerProps } from './AlertIncidentDrawer.js';
|
|
6
|
+
export { AlertRuleDialog } from './AlertRuleDialog.js';
|
|
7
|
+
export type { AlertRuleDialogProps } from './AlertRuleDialog.js';
|
|
8
|
+
export { AlertRuleTestResult } from './AlertRuleTestResult.js';
|
|
9
|
+
export type { AlertRuleTestResultProps } from './AlertRuleTestResult.js';
|
|
10
|
+
export { AlertsPage } from './AlertsPage.js';
|
|
11
|
+
export type { AlertsPageProps, AlertsPageSlots } from './AlertsPage.js';
|
|
12
|
+
export { FiringAlertsBanner } from './FiringAlertsBanner.js';
|
|
13
|
+
export type { FiringAlertsBannerProps } from './FiringAlertsBanner.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/alerts/ui/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// `@marinoscar/platform-web/alerts/ui`: the Alerts page (Rules and Incidents
|
|
2
|
+
// tabs), the rule editor, the dry-run result, the incident drawer, the firing
|
|
3
|
+
// banner for the telemetry dashboard and the admin card as data, built on
|
|
4
|
+
// `/alerts/headless` (issue #1047). Documented in ../README.md.
|
|
5
|
+
export { ALERTS_PAGE_COPY } from './copy.js';
|
|
6
|
+
export { alertsAdminCards } from './settings.js';
|
|
7
|
+
export { AlertIncidentDrawer } from './AlertIncidentDrawer.js';
|
|
8
|
+
export { AlertRuleDialog } from './AlertRuleDialog.js';
|
|
9
|
+
export { AlertRuleTestResult } from './AlertRuleTestResult.js';
|
|
10
|
+
export { AlertsPage } from './AlertsPage.js';
|
|
11
|
+
export { FiringAlertsBanner } from './FiringAlertsBanner.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/alerts/ui/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,8EAA8E;AAC9E,0EAA0E;AAC1E,gEAAgE;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
2
|
+
import type { AlertIncidentState, AlertSeverity } from '@marinoscar/platform-contract/alerts';
|
|
3
|
+
/** A severity as a labelled chip (the words carry the meaning, not the colour). */
|
|
4
|
+
export declare function SeverityChip({ severity, label }: {
|
|
5
|
+
severity: AlertSeverity;
|
|
6
|
+
label?: string;
|
|
7
|
+
}): ReactElement;
|
|
8
|
+
/** An incident state as a labelled chip. */
|
|
9
|
+
export declare function StateChip({ state }: {
|
|
10
|
+
state: AlertIncidentState;
|
|
11
|
+
}): ReactElement;
|
|
12
|
+
/** A timestamp in the display zone, or a dash. */
|
|
13
|
+
export declare function when(iso: string | null | undefined): string;
|
|
14
|
+
export interface ConfirmDialogProps {
|
|
15
|
+
open: boolean;
|
|
16
|
+
title: string;
|
|
17
|
+
children: ReactNode;
|
|
18
|
+
confirmLabel: string;
|
|
19
|
+
destructive?: boolean;
|
|
20
|
+
busy?: boolean;
|
|
21
|
+
onConfirm: () => void;
|
|
22
|
+
onClose: () => void;
|
|
23
|
+
}
|
|
24
|
+
/** A yes/no dialog whose text says what will happen. */
|
|
25
|
+
export declare function ConfirmDialog({ open, title, children, confirmLabel, destructive, busy, onConfirm, onClose }: ConfirmDialogProps): ReactElement;
|
|
26
|
+
//# sourceMappingURL=parts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../../src/alerts/ui/parts.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAErD,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAe9F,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAE3G;AAED,4CAA4C;AAC5C,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,kBAAkB,CAAA;CAAE,GAAG,YAAY,CAGhF;AAED,kDAAkD;AAClD,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAE3D;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,kBAAkB,GAAG,YAAY,CAiB9I"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// Small building blocks of the alerts UI (issue #1047): the severity and state
|
|
3
|
+
// chips, the confirm dialog and the date text. Internal to the slice.
|
|
4
|
+
import { Button, Chip, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material';
|
|
5
|
+
import { formatDateTime } from '../../core/index.js';
|
|
6
|
+
import { ALERT_SEVERITY_LABELS, ALERT_SEVERITY_TONES, ALERT_STATE_LABELS, ALERT_STATE_TONES, } from '../headless/index.js';
|
|
7
|
+
function chipColor(tone) {
|
|
8
|
+
return tone;
|
|
9
|
+
}
|
|
10
|
+
/** A severity as a labelled chip (the words carry the meaning, not the colour). */
|
|
11
|
+
export function SeverityChip({ severity, label }) {
|
|
12
|
+
return _jsx(Chip, { size: "small", label: label ?? ALERT_SEVERITY_LABELS[severity], color: chipColor(ALERT_SEVERITY_TONES[severity]) });
|
|
13
|
+
}
|
|
14
|
+
/** An incident state as a labelled chip. */
|
|
15
|
+
export function StateChip({ state }) {
|
|
16
|
+
const tone = ALERT_STATE_TONES[state];
|
|
17
|
+
return _jsx(Chip, { size: "small", label: ALERT_STATE_LABELS[state], color: chipColor(tone), variant: state === 'resolved' ? 'outlined' : 'filled' });
|
|
18
|
+
}
|
|
19
|
+
/** A timestamp in the display zone, or a dash. */
|
|
20
|
+
export function when(iso) {
|
|
21
|
+
return iso ? formatDateTime(iso) : '—';
|
|
22
|
+
}
|
|
23
|
+
/** A yes/no dialog whose text says what will happen. */
|
|
24
|
+
export function ConfirmDialog({ open, title, children, confirmLabel, destructive, busy, onConfirm, onClose }) {
|
|
25
|
+
return (_jsxs(Dialog, { open: open, onClose: onClose, maxWidth: "xs", fullWidth: true, "aria-labelledby": "alerts-confirm-title", children: [_jsx(DialogTitle, { id: "alerts-confirm-title", children: title }), _jsx(DialogContent, { children: _jsx(DialogContentText, { component: "div", children: children }) }), _jsxs(DialogActions, { children: [_jsx(Button, { onClick: onClose, sx: { minHeight: 44 }, children: "Cancel" }), _jsx(Button, { variant: "contained", color: destructive ? 'error' : 'primary', onClick: onConfirm, disabled: busy, sx: { minHeight: 44 }, children: confirmLabel })] })] }));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=parts.js.map
|