@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,261 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// The rule editor's model (issue #1047): a form draft and the payload it builds
|
|
3
|
+
// =============================================================================
|
|
4
|
+
//
|
|
5
|
+
// The editor edits a flat, string-friendly DRAFT; `buildAlertRulePayload`
|
|
6
|
+
// turns it into the wire body (`CreateAlertRule` / `UpdateAlertRule`) with the
|
|
7
|
+
// kind's config, checked against the contract's schemas so a field error is
|
|
8
|
+
// shown before the request. The API validates again and decides: this check
|
|
9
|
+
// only spares a round trip.
|
|
10
|
+
// =============================================================================
|
|
11
|
+
import { ALERT_COOLDOWN_SECONDS_DEFAULT, ALERT_KIND_IDS, ALERT_NODE_EVENT_RESOLVE_AFTER_DEFAULT, createAlertRuleSchema, emptyAlertConfigSchema, metricThresholdConfigSchema, nodeEventConfigSchema, verdictConfigSchema, } from '@marinoscar/platform-contract/alerts';
|
|
12
|
+
/**
|
|
13
|
+
* The kinds the editor has a dedicated form for. Any other kind (an app's
|
|
14
|
+
* own, registered with `registerAlertRuleKind`) is edited as JSON.
|
|
15
|
+
*
|
|
16
|
+
* @stability experimental
|
|
17
|
+
*/
|
|
18
|
+
export const ALERT_FORM_KINDS = Object.freeze([
|
|
19
|
+
ALERT_KIND_IDS.METRIC_THRESHOLD,
|
|
20
|
+
ALERT_KIND_IDS.NODE_EVENT,
|
|
21
|
+
ALERT_KIND_IDS.VERDICT,
|
|
22
|
+
ALERT_KIND_IDS.NODE_OFFLINE,
|
|
23
|
+
ALERT_KIND_IDS.TELEMETRY_UNAVAILABLE,
|
|
24
|
+
]);
|
|
25
|
+
/** Kinds whose config is always `{}`. */
|
|
26
|
+
const EMPTY_CONFIG_KINDS = new Set([ALERT_KIND_IDS.NODE_OFFLINE, ALERT_KIND_IDS.TELEMETRY_UNAVAILABLE]);
|
|
27
|
+
/**
|
|
28
|
+
* Whether a kind takes no configuration (`node_offline`, `telemetry_unavailable`).
|
|
29
|
+
*
|
|
30
|
+
* @param kind - the kind id.
|
|
31
|
+
* @returns `true` when the config is always `{}`.
|
|
32
|
+
*
|
|
33
|
+
* @stability experimental
|
|
34
|
+
*/
|
|
35
|
+
export function alertKindHasNoConfig(kind) {
|
|
36
|
+
return EMPTY_CONFIG_KINDS.has(kind);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A blank draft of a kind, with the API's defaults.
|
|
40
|
+
*
|
|
41
|
+
* @param kind - the kind id; default `metric_threshold`.
|
|
42
|
+
* @returns the draft.
|
|
43
|
+
*
|
|
44
|
+
* @stability experimental
|
|
45
|
+
*/
|
|
46
|
+
export function emptyAlertRuleDraft(kind = ALERT_KIND_IDS.METRIC_THRESHOLD) {
|
|
47
|
+
return {
|
|
48
|
+
name: '',
|
|
49
|
+
description: '',
|
|
50
|
+
enabled: false,
|
|
51
|
+
kind,
|
|
52
|
+
severity: 'warning',
|
|
53
|
+
forSeconds: 0,
|
|
54
|
+
cooldownSeconds: ALERT_COOLDOWN_SECONDS_DEFAULT,
|
|
55
|
+
notifyChannels: [],
|
|
56
|
+
webhook: true,
|
|
57
|
+
metric: {
|
|
58
|
+
metric: '',
|
|
59
|
+
aggregation: 'avg',
|
|
60
|
+
windowSeconds: 300,
|
|
61
|
+
comparator: 'gt',
|
|
62
|
+
threshold: '',
|
|
63
|
+
groupBy: [],
|
|
64
|
+
filters: [],
|
|
65
|
+
},
|
|
66
|
+
nodeEvent: {
|
|
67
|
+
eventTypes: [],
|
|
68
|
+
minSeverity: '',
|
|
69
|
+
nodeIds: [],
|
|
70
|
+
attrs: [],
|
|
71
|
+
recoveryEventTypes: [],
|
|
72
|
+
recoveryAttrs: [],
|
|
73
|
+
resolveAfterSeconds: ALERT_NODE_EVENT_RESOLVE_AFTER_DEFAULT,
|
|
74
|
+
},
|
|
75
|
+
verdict: { minLevel: 'critical' },
|
|
76
|
+
rawConfig: '{}',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function strings(value) {
|
|
80
|
+
return Array.isArray(value) ? value.filter((item) => typeof item === 'string') : [];
|
|
81
|
+
}
|
|
82
|
+
function attrsOf(value) {
|
|
83
|
+
if (!value || typeof value !== 'object')
|
|
84
|
+
return [];
|
|
85
|
+
return Object.entries(value).map(([key, raw]) => ({ key, value: String(raw) }));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* The draft of an existing rule, its config spread into the kind's form.
|
|
89
|
+
*
|
|
90
|
+
* @param rule - the rule as the API returned it.
|
|
91
|
+
* @returns the draft.
|
|
92
|
+
*
|
|
93
|
+
* @stability experimental
|
|
94
|
+
*/
|
|
95
|
+
export function alertRuleDraftFromRule(rule) {
|
|
96
|
+
const draft = emptyAlertRuleDraft(rule.kind);
|
|
97
|
+
const config = rule.config;
|
|
98
|
+
draft.name = rule.name;
|
|
99
|
+
draft.description = rule.description ?? '';
|
|
100
|
+
draft.enabled = rule.enabled;
|
|
101
|
+
draft.severity = rule.severity;
|
|
102
|
+
draft.forSeconds = rule.forSeconds;
|
|
103
|
+
draft.cooldownSeconds = rule.cooldownSeconds;
|
|
104
|
+
draft.notifyChannels = [...rule.notifyChannels];
|
|
105
|
+
draft.webhook = rule.webhook;
|
|
106
|
+
draft.rawConfig = JSON.stringify(config, null, 2);
|
|
107
|
+
if (rule.kind === ALERT_KIND_IDS.METRIC_THRESHOLD) {
|
|
108
|
+
const filters = Array.isArray(config['filters']) ? config['filters'] : [];
|
|
109
|
+
draft.metric = {
|
|
110
|
+
metric: typeof config['metric'] === 'string' ? config['metric'] : '',
|
|
111
|
+
aggregation: config['aggregation'] ?? 'avg',
|
|
112
|
+
windowSeconds: typeof config['windowSeconds'] === 'number' ? config['windowSeconds'] : 300,
|
|
113
|
+
comparator: config['comparator'] ?? 'gt',
|
|
114
|
+
threshold: typeof config['threshold'] === 'number' ? String(config['threshold']) : '',
|
|
115
|
+
groupBy: strings(config['groupBy']),
|
|
116
|
+
filters: filters.map((filter) => ({
|
|
117
|
+
attr: String(filter['attr'] ?? ''),
|
|
118
|
+
op: filter['op'] === 'neq' ? 'neq' : 'eq',
|
|
119
|
+
value: String(filter['value'] ?? ''),
|
|
120
|
+
})),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
else if (rule.kind === ALERT_KIND_IDS.NODE_EVENT) {
|
|
124
|
+
const recovery = (config['recovery'] ?? null);
|
|
125
|
+
draft.nodeEvent = {
|
|
126
|
+
eventTypes: strings(config['eventTypes']),
|
|
127
|
+
minSeverity: config['minSeverity'] ?? '',
|
|
128
|
+
nodeIds: strings(config['nodeIds']),
|
|
129
|
+
attrs: attrsOf(config['attrs']),
|
|
130
|
+
recoveryEventTypes: recovery ? strings(recovery['eventTypes']) : [],
|
|
131
|
+
recoveryAttrs: recovery ? attrsOf(recovery['attrs']) : [],
|
|
132
|
+
resolveAfterSeconds: typeof config['resolveAfterSeconds'] === 'number' ? config['resolveAfterSeconds'] : ALERT_NODE_EVENT_RESOLVE_AFTER_DEFAULT,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
else if (rule.kind === ALERT_KIND_IDS.VERDICT) {
|
|
136
|
+
draft.verdict = { minLevel: config['minLevel'] === 'degraded' ? 'degraded' : 'critical' };
|
|
137
|
+
}
|
|
138
|
+
return draft;
|
|
139
|
+
}
|
|
140
|
+
function attrsRecord(attrs) {
|
|
141
|
+
const entries = attrs.filter((attr) => attr.key.trim() !== '').map((attr) => [attr.key.trim(), attr.value]);
|
|
142
|
+
return entries.length === 0 ? undefined : Object.fromEntries(entries);
|
|
143
|
+
}
|
|
144
|
+
/** Field names the config's zod issues map onto, by their first path segment. */
|
|
145
|
+
function issueErrors(issues) {
|
|
146
|
+
const errors = {};
|
|
147
|
+
for (const issue of issues) {
|
|
148
|
+
const field = issue.path.length > 0 ? String(issue.path[0]) : 'config';
|
|
149
|
+
errors[field] ??= issue.message;
|
|
150
|
+
}
|
|
151
|
+
return errors;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* The config of a draft's kind, checked against the contract's schema.
|
|
155
|
+
*
|
|
156
|
+
* @param draft - the editor state.
|
|
157
|
+
* @returns the config, or the field errors.
|
|
158
|
+
*
|
|
159
|
+
* @stability experimental
|
|
160
|
+
*/
|
|
161
|
+
export function buildAlertRuleConfig(draft) {
|
|
162
|
+
if (draft.kind === ALERT_KIND_IDS.METRIC_THRESHOLD) {
|
|
163
|
+
const m = draft.metric;
|
|
164
|
+
const thresholdText = m.threshold.trim();
|
|
165
|
+
const threshold = thresholdText === '' ? Number.NaN : Number(thresholdText);
|
|
166
|
+
const filters = m.filters.filter((filter) => filter.attr.trim() !== '');
|
|
167
|
+
const config = {
|
|
168
|
+
metric: m.metric.trim(),
|
|
169
|
+
aggregation: m.aggregation,
|
|
170
|
+
windowSeconds: m.windowSeconds,
|
|
171
|
+
comparator: m.comparator,
|
|
172
|
+
threshold,
|
|
173
|
+
...(m.groupBy.length > 0 ? { groupBy: m.groupBy } : {}),
|
|
174
|
+
...(filters.length > 0 ? { filters: filters.map((f) => ({ attr: f.attr.trim(), op: f.op, value: f.value })) } : {}),
|
|
175
|
+
};
|
|
176
|
+
const errors = {};
|
|
177
|
+
if (config.metric === '')
|
|
178
|
+
errors['metric'] = 'Choose a metric.';
|
|
179
|
+
if (!Number.isFinite(threshold))
|
|
180
|
+
errors['threshold'] = 'Enter a number.';
|
|
181
|
+
const parsed = metricThresholdConfigSchema.safeParse(config);
|
|
182
|
+
if (!parsed.success)
|
|
183
|
+
Object.assign(errors, { ...issueErrors(parsed.error.issues), ...errors });
|
|
184
|
+
return Object.keys(errors).length > 0 ? { ok: false, errors } : { ok: true, value: config };
|
|
185
|
+
}
|
|
186
|
+
if (draft.kind === ALERT_KIND_IDS.NODE_EVENT) {
|
|
187
|
+
const n = draft.nodeEvent;
|
|
188
|
+
const attrs = attrsRecord(n.attrs);
|
|
189
|
+
const recoveryAttrs = attrsRecord(n.recoveryAttrs);
|
|
190
|
+
const config = {
|
|
191
|
+
eventTypes: n.eventTypes,
|
|
192
|
+
...(n.minSeverity ? { minSeverity: n.minSeverity } : {}),
|
|
193
|
+
...(n.nodeIds.length > 0 ? { nodeIds: n.nodeIds } : {}),
|
|
194
|
+
...(attrs ? { attrs } : {}),
|
|
195
|
+
...(n.recoveryEventTypes.length > 0
|
|
196
|
+
? { recovery: { eventTypes: n.recoveryEventTypes, ...(recoveryAttrs ? { attrs: recoveryAttrs } : {}) } }
|
|
197
|
+
: {}),
|
|
198
|
+
resolveAfterSeconds: n.resolveAfterSeconds,
|
|
199
|
+
};
|
|
200
|
+
const errors = {};
|
|
201
|
+
if (n.eventTypes.length === 0)
|
|
202
|
+
errors['eventTypes'] = 'Choose at least one event type.';
|
|
203
|
+
const parsed = nodeEventConfigSchema.safeParse(config);
|
|
204
|
+
if (!parsed.success)
|
|
205
|
+
Object.assign(errors, { ...issueErrors(parsed.error.issues), ...errors });
|
|
206
|
+
return Object.keys(errors).length > 0 ? { ok: false, errors } : { ok: true, value: config };
|
|
207
|
+
}
|
|
208
|
+
if (draft.kind === ALERT_KIND_IDS.VERDICT) {
|
|
209
|
+
const config = { minLevel: draft.verdict.minLevel };
|
|
210
|
+
const parsed = verdictConfigSchema.safeParse(config);
|
|
211
|
+
return parsed.success ? { ok: true, value: config } : { ok: false, errors: issueErrors(parsed.error.issues) };
|
|
212
|
+
}
|
|
213
|
+
if (alertKindHasNoConfig(draft.kind)) {
|
|
214
|
+
const parsed = emptyAlertConfigSchema.safeParse({});
|
|
215
|
+
return parsed.success ? { ok: true, value: {} } : { ok: false, errors: { config: 'Invalid configuration.' } };
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
const value = JSON.parse(draft.rawConfig === '' ? '{}' : draft.rawConfig);
|
|
219
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
220
|
+
return { ok: false, errors: { config: 'The configuration must be a JSON object.' } };
|
|
221
|
+
}
|
|
222
|
+
return { ok: true, value: value };
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return { ok: false, errors: { config: 'The configuration is not valid JSON.' } };
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
export function buildAlertRulePayload(draft, mode) {
|
|
229
|
+
const errors = {};
|
|
230
|
+
const config = buildAlertRuleConfig(draft);
|
|
231
|
+
if (!config.ok)
|
|
232
|
+
Object.assign(errors, config.errors);
|
|
233
|
+
const name = draft.name.trim();
|
|
234
|
+
if (name === '')
|
|
235
|
+
errors['name'] = 'Enter a name.';
|
|
236
|
+
if (!Number.isInteger(draft.forSeconds) || draft.forSeconds < 0)
|
|
237
|
+
errors['forSeconds'] = 'Enter whole seconds, 0 or more.';
|
|
238
|
+
if (!Number.isInteger(draft.cooldownSeconds) || draft.cooldownSeconds < 0) {
|
|
239
|
+
errors['cooldownSeconds'] = 'Enter whole seconds, 0 or more.';
|
|
240
|
+
}
|
|
241
|
+
const common = {
|
|
242
|
+
name,
|
|
243
|
+
description: draft.description.trim() === '' ? null : draft.description.trim(),
|
|
244
|
+
enabled: draft.enabled,
|
|
245
|
+
severity: draft.severity,
|
|
246
|
+
config: config.ok ? config.value : {},
|
|
247
|
+
forSeconds: draft.forSeconds,
|
|
248
|
+
cooldownSeconds: draft.cooldownSeconds,
|
|
249
|
+
notifyChannels: draft.notifyChannels,
|
|
250
|
+
webhook: draft.webhook,
|
|
251
|
+
};
|
|
252
|
+
if (Object.keys(errors).length === 0) {
|
|
253
|
+
const parsed = createAlertRuleSchema.safeParse({ ...common, kind: draft.kind });
|
|
254
|
+
if (!parsed.success)
|
|
255
|
+
Object.assign(errors, issueErrors(parsed.error.issues));
|
|
256
|
+
}
|
|
257
|
+
if (Object.keys(errors).length > 0)
|
|
258
|
+
return { ok: false, errors };
|
|
259
|
+
return { ok: true, value: mode === 'create' ? { ...common, kind: draft.kind } : common };
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=rule-draft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-draft.js","sourceRoot":"","sources":["../../../src/alerts/headless/rule-draft.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAChF,EAAE;AACF,0EAA0E;AAC1E,+EAA+E;AAC/E,4EAA4E;AAC5E,4EAA4E;AAC5E,4BAA4B;AAC5B,gFAAgF;AAEhF,OAAO,EACL,8BAA8B,EAC9B,cAAc,EACd,sCAAsC,EACtC,qBAAqB,EACrB,sBAAsB,EACtB,2BAA2B,EAC3B,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,sCAAsC,CAAC;AAkI9C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAsB,MAAM,CAAC,MAAM,CAAC;IAC/D,cAAc,CAAC,gBAAgB;IAC/B,cAAc,CAAC,UAAU;IACzB,cAAc,CAAC,OAAO;IACtB,cAAc,CAAC,YAAY;IAC3B,cAAc,CAAC,qBAAqB;CACrC,CAAC,CAAC;AAEH,yCAAyC;AACzC,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,qBAAqB,CAAC,CAAC,CAAC;AAE7H;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe,cAAc,CAAC,gBAAgB;IAChF,OAAO;QACL,IAAI,EAAE,EAAE;QACR,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,KAAK;QACd,IAAI;QACJ,QAAQ,EAAE,SAAS;QACnB,UAAU,EAAE,CAAC;QACb,eAAe,EAAE,8BAA8B;QAC/C,cAAc,EAAE,EAAE;QAClB,OAAO,EAAE,IAAI;QACb,MAAM,EAAE;YACN,MAAM,EAAE,EAAE;YACV,WAAW,EAAE,KAAK;YAClB,aAAa,EAAE,GAAG;YAClB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,EAAE;SACZ;QACD,SAAS,EAAE;YACT,UAAU,EAAE,EAAE;YACd,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE;YACT,kBAAkB,EAAE,EAAE;YACtB,aAAa,EAAE,EAAE;YACjB,mBAAmB,EAAE,sCAAsC;SAC5D;QACD,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;QACjC,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtG,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACnD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7G,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAe;IACpD,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;IAC3C,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACnC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;IAC7C,KAAK,CAAC,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;IAChD,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAE,MAAM,CAAC,SAAS,CAAoC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9G,KAAK,CAAC,MAAM,GAAG;YACb,MAAM,EAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;YACpE,WAAW,EAAG,MAAM,CAAC,aAAa,CAAkC,IAAI,KAAK;YAC7E,aAAa,EAAE,OAAO,MAAM,CAAC,eAAe,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG;YAC1F,UAAU,EAAG,MAAM,CAAC,YAAY,CAAiC,IAAI,IAAI;YACzE,SAAS,EAAE,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YACrF,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACnC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAChC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAClC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;gBACzC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;aACrC,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,IAAI,CAAmC,CAAC;QAChF,KAAK,CAAC,SAAS,GAAG;YAChB,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACzC,WAAW,EAAG,MAAM,CAAC,aAAa,CAA+B,IAAI,EAAE;YACvE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACnC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/B,kBAAkB,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YACnE,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YACzD,mBAAmB,EACjB,OAAO,MAAM,CAAC,qBAAqB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,sCAAsC;SAC7H,CAAC;IACJ,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO,EAAE,CAAC;QAChD,KAAK,CAAC,OAAO,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAC5F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,KAAgC;IACnD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,CAAU,CAAC,CAAC;IACrH,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACxE,CAAC;AAED,iFAAiF;AACjF,SAAS,WAAW,CAAC,MAA4E;IAC/F,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAqB;IACxD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QACvB,MAAM,aAAa,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,aAAa,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;YACvB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,aAAa,EAAE,CAAC,CAAC,aAAa;YAC9B,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,SAAS;YACT,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpH,CAAC;QACF,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE;YAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,kBAAkB,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,MAAM,CAAC,WAAW,CAAC,GAAG,iBAAiB,CAAC;QACzE,MAAM,MAAM,GAAG,2BAA2B,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAC/F,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC9F,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;QAC1B,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG;YACb,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;gBACjC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,kBAAkB,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACxG,CAAC,CAAC,EAAE,CAAC;YACP,mBAAmB,EAAE,CAAC,CAAC,mBAAmB;SAC3C,CAAC;QACF,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,CAAC,YAAY,CAAC,GAAG,iCAAiC,CAAC;QACxF,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAC/F,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC9F,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;IAChH,CAAC;IACD,IAAI,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,wBAAwB,EAAE,EAAE,CAAC;IAChH,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnF,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,0CAA0C,EAAE,EAAE,CAAC;QACvF,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAgC,EAAE,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,sCAAsC,EAAE,EAAE,CAAC;IACnF,CAAC;AACH,CAAC;AAoBD,MAAM,UAAU,qBAAqB,CACnC,KAAqB,EACrB,IAAyB;IAEzB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,IAAI,KAAK,EAAE;QAAE,MAAM,CAAC,MAAM,CAAC,GAAG,eAAe,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC;QAAE,MAAM,CAAC,YAAY,CAAC,GAAG,iCAAiC,CAAC;IAC1H,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;QAC1E,MAAM,CAAC,iBAAiB,CAAC,GAAG,iCAAiC,CAAC;IAChE,CAAC;IACD,MAAM,MAAM,GAAG;QACb,IAAI;QACJ,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE;QAC9E,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QACrC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;IACF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACjE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
import type { AlertIncident } from '@marinoscar/platform-contract/alerts';
|
|
3
|
+
/**
|
|
4
|
+
* Props of {@link AlertIncidentDrawer}.
|
|
5
|
+
*
|
|
6
|
+
* @stability experimental
|
|
7
|
+
*/
|
|
8
|
+
export interface AlertIncidentDrawerProps {
|
|
9
|
+
/** The incident to show; `null` closes the drawer. */
|
|
10
|
+
incidentId: string | null;
|
|
11
|
+
/** Whether the viewer holds `alerts:write` (draws Acknowledge). */
|
|
12
|
+
canWrite: boolean;
|
|
13
|
+
/** Acknowledges the incident; resolves with the updated incident, or `null` when refused. */
|
|
14
|
+
onAcknowledge: (incident: AlertIncident) => Promise<AlertIncident | null>;
|
|
15
|
+
/** Whether an acknowledge is in flight. */
|
|
16
|
+
acknowledging?: boolean;
|
|
17
|
+
/** Closes the drawer. */
|
|
18
|
+
onClose: () => void;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The incident detail drawer.
|
|
22
|
+
*
|
|
23
|
+
* @param props - see {@link AlertIncidentDrawerProps}.
|
|
24
|
+
* @returns the drawer.
|
|
25
|
+
*
|
|
26
|
+
* @extensionPoint component
|
|
27
|
+
* @stability experimental
|
|
28
|
+
*/
|
|
29
|
+
export declare function AlertIncidentDrawer({ incidentId, canWrite, onAcknowledge, acknowledging, onClose }: AlertIncidentDrawerProps): ReactElement;
|
|
30
|
+
//# sourceMappingURL=AlertIncidentDrawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertIncidentDrawer.d.ts","sourceRoot":"","sources":["../../../src/alerts/ui/AlertIncidentDrawer.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,OAAO,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAK1E;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,sDAAsD;IACtD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,mEAAmE;IACnE,QAAQ,EAAE,OAAO,CAAC;IAClB,6FAA6F;IAC7F,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAC1E,2CAA2C;IAC3C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yBAAyB;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAeD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAqB,EAAE,OAAO,EAAE,EAAE,wBAAwB,GAAG,YAAY,CAiDnJ"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// The detail of one incident (issue #1047): what fired, on which labels, when
|
|
3
|
+
// it went pending, fired and resolved, the last value and summary, and who
|
|
4
|
+
// acknowledged it. "Acknowledge" is drawn only for a viewer who may write; the
|
|
5
|
+
// API enforces `alerts:write` either way.
|
|
6
|
+
import CloseIcon from '@mui/icons-material/Close';
|
|
7
|
+
import { Alert, Box, Button, Divider, Drawer, IconButton, Stack, Typography } from '@mui/material';
|
|
8
|
+
import { formatAlertLabels, useAlertIncident } from '../headless/index.js';
|
|
9
|
+
import { SeverityChip, StateChip, when } from './parts.js';
|
|
10
|
+
function Row({ label, children }) {
|
|
11
|
+
return (_jsxs(Box, { sx: { display: 'grid', gridTemplateColumns: { xs: '1fr', sm: '10rem 1fr' }, gap: 0.5, py: 0.75 }, children: [_jsx(Typography, { variant: "body2", color: "text.secondary", children: label }), _jsx(Typography, { variant: "body2", component: "div", sx: { wordBreak: 'break-word' }, children: children })] }));
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The incident detail drawer.
|
|
15
|
+
*
|
|
16
|
+
* @param props - see {@link AlertIncidentDrawerProps}.
|
|
17
|
+
* @returns the drawer.
|
|
18
|
+
*
|
|
19
|
+
* @extensionPoint component
|
|
20
|
+
* @stability experimental
|
|
21
|
+
*/
|
|
22
|
+
export function AlertIncidentDrawer({ incidentId, canWrite, onAcknowledge, acknowledging = false, onClose }) {
|
|
23
|
+
const { incident, isLoading, error, refresh } = useAlertIncident(incidentId);
|
|
24
|
+
const acknowledge = async () => {
|
|
25
|
+
if (!incident)
|
|
26
|
+
return;
|
|
27
|
+
const updated = await onAcknowledge(incident);
|
|
28
|
+
if (updated)
|
|
29
|
+
await refresh();
|
|
30
|
+
};
|
|
31
|
+
return (_jsx(Drawer, { anchor: "right", open: incidentId !== null, onClose: onClose, slotProps: { paper: { sx: { width: { xs: '100%', sm: 480 } } } }, children: _jsxs(Box, { sx: { p: 2 }, role: "region", "aria-label": "Incident detail", children: [_jsxs(Stack, { direction: "row", sx: { mb: 1, alignItems: 'center', justifyContent: 'space-between' }, children: [_jsx(Typography, { variant: "h6", component: "h2", children: incident ? incident.ruleName : 'Incident' }), _jsx(IconButton, { "aria-label": "Close", onClick: onClose, children: _jsx(CloseIcon, {}) })] }), error ? _jsx(Alert, { severity: "error", children: error }) : null, !incident && isLoading ? _jsx(Typography, { color: "text.secondary", children: "Loading the incident\u2026" }) : null, incident ? (_jsxs(_Fragment, { children: [_jsxs(Stack, { direction: "row", spacing: 1, sx: { mb: 2 }, children: [_jsx(StateChip, { state: incident.state }), _jsx(SeverityChip, { severity: incident.severity })] }), _jsx(Typography, { variant: "body1", sx: { mb: 2 }, children: incident.summary }), _jsx(Divider, {}), _jsx(Row, { label: "Labels", children: formatAlertLabels(incident.labels) || 'None' }), _jsx(Row, { label: "Last value", children: incident.lastValue === null ? '—' : String(incident.lastValue) }), _jsx(Row, { label: "Pending since", children: when(incident.pendingSince) }), _jsx(Row, { label: "Fired", children: when(incident.firedAt) }), _jsx(Row, { label: "Resolved", children: when(incident.resolvedAt) }), _jsx(Row, { label: "Last seen", children: when(incident.lastSeenAt) }), _jsx(Row, { label: "Acknowledged", children: incident.acknowledgedAt ? when(incident.acknowledgedAt) : 'Not yet' }), canWrite && !incident.acknowledgedAt && incident.state !== 'resolved' ? (_jsx(Box, { sx: { mt: 2 }, children: _jsx(Button, { variant: "contained", onClick: () => void acknowledge(), disabled: acknowledging, sx: { minHeight: 44 }, children: "Acknowledge" }) })) : null] })) : null] }) }));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=AlertIncidentDrawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertIncidentDrawer.js","sourceRoot":"","sources":["../../../src/alerts/ui/AlertIncidentDrawer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type ReactElement } from 'react';
|
|
2
|
+
import type { AlertKind, AlertRule, AlertRuleTestResponse, CreateAlertRule, UpdateAlertRule } from '@marinoscar/platform-contract/alerts';
|
|
3
|
+
import { type AlertMetricCatalogEntry } from '../headless/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Props of {@link AlertRuleDialog}.
|
|
6
|
+
*
|
|
7
|
+
* @stability experimental
|
|
8
|
+
*/
|
|
9
|
+
export interface AlertRuleDialogProps {
|
|
10
|
+
/** Whether the dialog is open. */
|
|
11
|
+
open: boolean;
|
|
12
|
+
/** The rule to edit or view; `null` creates one. */
|
|
13
|
+
rule: AlertRule | null;
|
|
14
|
+
/** The registered kinds (`useAlertKinds`); empty falls back to the built-in ones. */
|
|
15
|
+
kinds: readonly AlertKind[];
|
|
16
|
+
/** The metric picker's options (`useAlertMetricCatalog`). */
|
|
17
|
+
metrics?: readonly AlertMetricCatalogEntry[];
|
|
18
|
+
/** Why the metric list is unavailable; the picker still takes a typed name. */
|
|
19
|
+
metricsError?: string | null;
|
|
20
|
+
/** The notification channel ids offered; default `email`, `browser`, `push`. */
|
|
21
|
+
channels?: readonly string[];
|
|
22
|
+
/** Draw every field disabled and no Save (a viewer without `alerts:write`). */
|
|
23
|
+
readOnly?: boolean;
|
|
24
|
+
/** Whether a save is in flight. */
|
|
25
|
+
saving?: boolean;
|
|
26
|
+
/** The API's refusal of the last save, in words. */
|
|
27
|
+
error?: string | null;
|
|
28
|
+
/** Called with the body: a `CreateAlertRule` when `rule` is null, else an `UpdateAlertRule`. */
|
|
29
|
+
onSubmit: (body: CreateAlertRule | UpdateAlertRule) => void;
|
|
30
|
+
/** Runs the saved rule's dry run; omitted, no Test button. */
|
|
31
|
+
onTest?: () => Promise<AlertRuleTestResponse | null>;
|
|
32
|
+
/** Asks to delete the rule; omitted (a new or built-in rule, or a read-only viewer), no Delete button. */
|
|
33
|
+
onDelete?: () => void;
|
|
34
|
+
/** Closes the dialog. */
|
|
35
|
+
onClose: () => void;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The create, edit and view dialog of one alert rule.
|
|
39
|
+
*
|
|
40
|
+
* @param props - see {@link AlertRuleDialogProps}.
|
|
41
|
+
* @returns the dialog.
|
|
42
|
+
*
|
|
43
|
+
* @extensionPoint component
|
|
44
|
+
* @stability experimental
|
|
45
|
+
*/
|
|
46
|
+
export declare function AlertRuleDialog({ open, rule, kinds, metrics, metricsError, channels, readOnly, saving, error, onSubmit, onTest, onDelete, onClose, }: AlertRuleDialogProps): ReactElement;
|
|
47
|
+
//# sourceMappingURL=AlertRuleDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertRuleDialog.d.ts","sourceRoot":"","sources":["../../../src/alerts/ui/AlertRuleDialog.tsx"],"names":[],"mappings":"AA+CA,OAAO,EAAgC,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAUxE,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAI1I,OAAO,EAYL,KAAK,uBAAuB,EAI7B,MAAM,sBAAsB,CAAC;AAQ9B;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,oDAAoD;IACpD,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,qFAAqF;IACrF,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC7C,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gFAAgF;IAChF,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mCAAmC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gGAAgG;IAChG,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,GAAG,eAAe,KAAK,IAAI,CAAC;IAC5D,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;IACrD,0GAA0G;IAC1G,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,yBAAyB;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAiYD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,OAAY,EACZ,YAAmB,EACnB,QAA4C,EAC5C,QAAgB,EAChB,MAAc,EACd,KAAY,EACZ,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,OAAO,GACR,EAAE,oBAAoB,GAAG,YAAY,CAyPrC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// =============================================================================
|
|
3
|
+
// AlertRuleDialog (issue #1047): create, edit or view one alert rule
|
|
4
|
+
// =============================================================================
|
|
5
|
+
//
|
|
6
|
+
// Kind first (fixed once the rule exists), then the kind's own form:
|
|
7
|
+
// metric_threshold: metric (from the telemetry store's table list, or typed),
|
|
8
|
+
// aggregation, window, comparator, threshold, group-by
|
|
9
|
+
// attributes and attribute filters;
|
|
10
|
+
// node_event: event types (NODE_EVENT_TYPES, or a `prefix.*`), least
|
|
11
|
+
// severity, node ids, required attributes, recovery events
|
|
12
|
+
// and the auto-resolve delay;
|
|
13
|
+
// verdict: the least dashboard verdict level;
|
|
14
|
+
// node_offline, telemetry_unavailable: nothing to configure;
|
|
15
|
+
// any other kind: its config as JSON.
|
|
16
|
+
// Then the common fields: severity, `for`, cooldown, notification channels and
|
|
17
|
+
// the webhook toggle. "Test" evaluates the SAVED rule now and shows what it
|
|
18
|
+
// observed. The draft is checked against the contract before sending; the API
|
|
19
|
+
// validates again and decides.
|
|
20
|
+
// =============================================================================
|
|
21
|
+
import { Alert, Autocomplete, Box, Button, Checkbox, Dialog, DialogActions, DialogContent, DialogTitle, Divider, FormControl, FormControlLabel, FormGroup, FormHelperText, FormLabel, IconButton, MenuItem, Stack, Switch, TextField, Typography, useMediaQuery, useTheme, } from '@mui/material';
|
|
22
|
+
import AddIcon from '@mui/icons-material/Add';
|
|
23
|
+
import DeleteOutlineIcon from '@mui/icons-material/DeleteOutlined';
|
|
24
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
25
|
+
import { ALERT_AGGREGATIONS, ALERT_COMPARATORS, ALERT_FILTERS_MAX, ALERT_GROUP_BY_MAX, ALERT_KIND_IDS, ALERT_SEVERITIES, } from '@marinoscar/platform-contract/alerts';
|
|
26
|
+
import { NODE_EVENT_SEVERITIES, NODE_EVENT_TYPES } from '@marinoscar/platform-contract/nodes';
|
|
27
|
+
import { PLATFORM_NOTIFICATION_CHANNEL_IDS } from '@marinoscar/platform-contract/notifications';
|
|
28
|
+
import { ALERT_AGGREGATION_LABELS, ALERT_COMPARATOR_LABELS, ALERT_FORM_KINDS, ALERT_SEVERITY_LABELS, alertKindHasNoConfig, alertKindLabel, alertRuleDraftFromRule, buildAlertRulePayload, emptyAlertRuleDraft, formatAlertSeconds, } from '../headless/index.js';
|
|
29
|
+
import { AlertRuleTestResult } from './AlertRuleTestResult.js';
|
|
30
|
+
/** The node event types the picker offers, then the two prefixes. */
|
|
31
|
+
const EVENT_TYPE_OPTIONS = [...Object.values(NODE_EVENT_TYPES), 'power.*', 'node.*'];
|
|
32
|
+
const CHANNEL_LABELS = { email: 'Email', browser: 'In-app', push: 'Push' };
|
|
33
|
+
function numberOf(text) {
|
|
34
|
+
return text.trim() === '' ? Number.NaN : Number(text);
|
|
35
|
+
}
|
|
36
|
+
function SecondsField({ label, value, onChange, error, disabled, helper, }) {
|
|
37
|
+
return (_jsx(TextField, { label: label, type: "number", value: Number.isFinite(value) ? value : '', onChange: (event) => onChange(numberOf(event.target.value)), error: Boolean(error), helperText: error ?? `${helper ? `${helper} ` : ''}${Number.isFinite(value) ? `(${formatAlertSeconds(value)})` : ''}`, disabled: disabled, slotProps: { htmlInput: { min: 0, step: 1 } }, fullWidth: true }));
|
|
38
|
+
}
|
|
39
|
+
function AttrsEditor({ label, attrs, onChange, disabled, error, }) {
|
|
40
|
+
return (_jsxs(FormControl, { component: "fieldset", error: Boolean(error), fullWidth: true, children: [_jsx(FormLabel, { component: "legend", children: label }), _jsxs(Stack, { spacing: 1, sx: { mt: 1 }, children: [attrs.map((attr, index) => (_jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 1, sx: { alignItems: { sm: 'center' } }, children: [_jsx(TextField, { label: "Attribute", size: "small", value: attr.key, disabled: disabled, onChange: (event) => onChange(attrs.map((a, i) => (i === index ? { ...a, key: event.target.value } : a))) }), _jsx(TextField, { label: "Value", size: "small", value: attr.value, disabled: disabled, onChange: (event) => onChange(attrs.map((a, i) => (i === index ? { ...a, value: event.target.value } : a))) }), disabled ? null : (_jsx(IconButton, { "aria-label": `Remove attribute ${index + 1}`, onClick: () => onChange(attrs.filter((_, i) => i !== index)), children: _jsx(DeleteOutlineIcon, {}) }))] }, index))), disabled || attrs.length >= 5 ? null : (_jsx(Box, { children: _jsx(Button, { size: "small", startIcon: _jsx(AddIcon, {}), onClick: () => onChange([...attrs, { key: '', value: '' }]), children: "Add attribute" }) }))] }), error ? _jsx(FormHelperText, { children: error }) : null] }));
|
|
41
|
+
}
|
|
42
|
+
function MetricThresholdFields({ value, onChange, metrics, metricsError, errors, disabled, }) {
|
|
43
|
+
const metricNames = useMemo(() => metrics.map((metric) => metric.name), [metrics]);
|
|
44
|
+
const attributes = useMemo(() => {
|
|
45
|
+
const table = value.metric.replace(/\./g, '_');
|
|
46
|
+
const entry = metrics.find((metric) => metric.name === value.metric || metric.name.startsWith(table));
|
|
47
|
+
return entry?.attributes ?? [];
|
|
48
|
+
}, [metrics, value.metric]);
|
|
49
|
+
return (_jsxs(Stack, { spacing: 2, children: [_jsx(Autocomplete, { freeSolo: true, options: metricNames, value: value.metric, disabled: disabled, onInputChange: (_, next) => onChange({ ...value, metric: next }), renderInput: (params) => (_jsx(TextField, { ...params, label: "Metric", required: true, error: Boolean(errors['metric']), helperText: errors['metric'] ?? metricsError ?? 'A metric name (app.jobs.settled) or a table of the telemetry store.' })) }), _jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 2, children: [_jsx(TextField, { select: true, label: "Aggregation", value: value.aggregation, disabled: disabled, onChange: (event) => onChange({ ...value, aggregation: event.target.value }), fullWidth: true, children: ALERT_AGGREGATIONS.map((aggregation) => (_jsx(MenuItem, { value: aggregation, children: ALERT_AGGREGATION_LABELS[aggregation] }, aggregation))) }), _jsx(SecondsField, { label: "Window (seconds)", value: value.windowSeconds, onChange: (windowSeconds) => onChange({ ...value, windowSeconds }), error: errors['windowSeconds'], disabled: disabled })] }), _jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 2, children: [_jsx(TextField, { select: true, label: "Comparator", value: value.comparator, disabled: disabled, onChange: (event) => onChange({ ...value, comparator: event.target.value }), fullWidth: true, children: ALERT_COMPARATORS.map((comparator) => (_jsx(MenuItem, { value: comparator, children: ALERT_COMPARATOR_LABELS[comparator] }, comparator))) }), _jsx(TextField, { label: "Threshold", type: "number", required: true, value: value.threshold, disabled: disabled, onChange: (event) => onChange({ ...value, threshold: event.target.value }), error: Boolean(errors['threshold']), helperText: errors['threshold'] ?? ' ', fullWidth: true })] }), _jsx(Autocomplete, { multiple: true, freeSolo: true, options: attributes, value: value.groupBy, disabled: disabled, onChange: (_, next) => onChange({ ...value, groupBy: next.slice(0, ALERT_GROUP_BY_MAX) }), renderInput: (params) => (_jsx(TextField, { ...params, label: "Group by", error: Boolean(errors['groupBy']), helperText: errors['groupBy'] ?? `Up to ${ALERT_GROUP_BY_MAX} attributes; one incident per value.` })) }), _jsxs(FormControl, { component: "fieldset", error: Boolean(errors['filters']), fullWidth: true, children: [_jsx(FormLabel, { component: "legend", children: "Filters" }), _jsxs(Stack, { spacing: 1, sx: { mt: 1 }, children: [value.filters.map((filter, index) => (_jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 1, sx: { alignItems: { sm: 'center' } }, children: [_jsx(TextField, { label: "Attribute", size: "small", value: filter.attr, disabled: disabled, onChange: (event) => onChange({ ...value, filters: value.filters.map((f, i) => (i === index ? { ...f, attr: event.target.value } : f)) }) }), _jsxs(TextField, { select: true, label: "Operator", size: "small", value: filter.op, disabled: disabled, onChange: (event) => onChange({
|
|
50
|
+
...value,
|
|
51
|
+
filters: value.filters.map((f, i) => (i === index ? { ...f, op: event.target.value === 'neq' ? 'neq' : 'eq' } : f)),
|
|
52
|
+
}), sx: { minWidth: 120 }, children: [_jsx(MenuItem, { value: "eq", children: "equals" }), _jsx(MenuItem, { value: "neq", children: "does not equal" })] }), _jsx(TextField, { label: "Value", size: "small", value: filter.value, disabled: disabled, onChange: (event) => onChange({ ...value, filters: value.filters.map((f, i) => (i === index ? { ...f, value: event.target.value } : f)) }) }), disabled ? null : (_jsx(IconButton, { "aria-label": `Remove filter ${index + 1}`, onClick: () => onChange({ ...value, filters: value.filters.filter((_, i) => i !== index) }), children: _jsx(DeleteOutlineIcon, {}) }))] }, index))), disabled || value.filters.length >= ALERT_FILTERS_MAX ? null : (_jsx(Box, { children: _jsx(Button, { size: "small", startIcon: _jsx(AddIcon, {}), onClick: () => onChange({ ...value, filters: [...value.filters, { attr: '', op: 'eq', value: '' }] }), children: "Add filter" }) }))] }), errors['filters'] ? _jsx(FormHelperText, { children: errors['filters'] }) : null] })] }));
|
|
53
|
+
}
|
|
54
|
+
function EventTypesField({ label, value, onChange, disabled, error, helper, required, }) {
|
|
55
|
+
return (_jsx(Autocomplete, { multiple: true, freeSolo: true, options: EVENT_TYPE_OPTIONS, value: value, disabled: disabled, onChange: (_, next) => onChange(next), renderInput: (params) => (_jsx(TextField, { ...params, label: label, required: required ?? false, error: Boolean(error), helperText: error ?? helper })) }));
|
|
56
|
+
}
|
|
57
|
+
function NodeEventFields({ value, onChange, errors, disabled, }) {
|
|
58
|
+
return (_jsxs(Stack, { spacing: 2, children: [_jsx(EventTypesField, { label: "Event types", required: true, value: value.eventTypes, onChange: (eventTypes) => onChange({ ...value, eventTypes }), disabled: disabled, error: errors['eventTypes'], helper: "The node events that raise the alert; a prefix such as power.* matches every power event." }), _jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 2, children: [_jsxs(TextField, { select: true, label: "Least severity", value: value.minSeverity, disabled: disabled, onChange: (event) => onChange({ ...value, minSeverity: event.target.value }), fullWidth: true, children: [_jsx(MenuItem, { value: "", children: "Any severity" }), NODE_EVENT_SEVERITIES.map((severity) => (_jsx(MenuItem, { value: severity, children: ALERT_SEVERITY_LABELS[severity] }, severity)))] }), _jsx(SecondsField, { label: "Resolve after (seconds)", value: value.resolveAfterSeconds, onChange: (resolveAfterSeconds) => onChange({ ...value, resolveAfterSeconds }), error: errors['resolveAfterSeconds'], disabled: disabled, helper: "Without a recovery event." })] }), _jsx(Autocomplete, { multiple: true, freeSolo: true, options: [], value: value.nodeIds, disabled: disabled, onChange: (_, next) => onChange({ ...value, nodeIds: next }), renderInput: (params) => (_jsx(TextField, { ...params, label: "Only these nodes", error: Boolean(errors['nodeIds']), helperText: errors['nodeIds'] ?? 'Node ids; leave empty for every node. Press Enter after each.' })) }), _jsx(AttrsEditor, { label: "The event must carry", attrs: value.attrs, onChange: (attrs) => onChange({ ...value, attrs }), disabled: disabled, error: errors['attrs'] }), _jsx(Divider, {}), _jsx(EventTypesField, { label: "Recovery event types", value: value.recoveryEventTypes, onChange: (recoveryEventTypes) => onChange({ ...value, recoveryEventTypes }), disabled: disabled, error: errors['recovery'], helper: "Events that resolve the incident early; leave empty to resolve only after the delay." }), value.recoveryEventTypes.length > 0 ? (_jsx(AttrsEditor, { label: "The recovery event must carry", attrs: value.recoveryAttrs, onChange: (recoveryAttrs) => onChange({ ...value, recoveryAttrs }), disabled: disabled })) : null] }));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The create, edit and view dialog of one alert rule.
|
|
62
|
+
*
|
|
63
|
+
* @param props - see {@link AlertRuleDialogProps}.
|
|
64
|
+
* @returns the dialog.
|
|
65
|
+
*
|
|
66
|
+
* @extensionPoint component
|
|
67
|
+
* @stability experimental
|
|
68
|
+
*/
|
|
69
|
+
export function AlertRuleDialog({ open, rule, kinds, metrics = [], metricsError = null, channels = PLATFORM_NOTIFICATION_CHANNEL_IDS, readOnly = false, saving = false, error = null, onSubmit, onTest, onDelete, onClose, }) {
|
|
70
|
+
const theme = useTheme();
|
|
71
|
+
const fullScreen = useMediaQuery(theme.breakpoints.down('sm'));
|
|
72
|
+
const [draft, setDraft] = useState(() => (rule ? alertRuleDraftFromRule(rule) : emptyAlertRuleDraft()));
|
|
73
|
+
const [errors, setErrors] = useState({});
|
|
74
|
+
const [testResult, setTestResult] = useState(null);
|
|
75
|
+
const [testing, setTesting] = useState(false);
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
if (!open)
|
|
78
|
+
return;
|
|
79
|
+
setDraft(rule ? alertRuleDraftFromRule(rule) : emptyAlertRuleDraft());
|
|
80
|
+
setErrors({});
|
|
81
|
+
setTestResult(null);
|
|
82
|
+
}, [open, rule]);
|
|
83
|
+
const kindOptions = useMemo(() => {
|
|
84
|
+
const ids = kinds.length > 0 ? kinds.map((kind) => kind.id) : [...ALERT_FORM_KINDS];
|
|
85
|
+
if (rule && !ids.includes(rule.kind))
|
|
86
|
+
ids.push(rule.kind);
|
|
87
|
+
return ids;
|
|
88
|
+
}, [kinds, rule]);
|
|
89
|
+
const kindDescription = kinds.find((kind) => kind.id === draft.kind)?.description;
|
|
90
|
+
const channelOptions = useMemo(() => [...new Set([...channels, ...draft.notifyChannels])], [channels, draft.notifyChannels]);
|
|
91
|
+
const disabled = readOnly || saving;
|
|
92
|
+
const set = (patch) => setDraft((current) => ({ ...current, ...patch }));
|
|
93
|
+
const submit = () => {
|
|
94
|
+
const result = rule ? buildAlertRulePayload(draft, 'update') : buildAlertRulePayload(draft, 'create');
|
|
95
|
+
if (!result.ok) {
|
|
96
|
+
setErrors(result.errors);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
setErrors({});
|
|
100
|
+
onSubmit(result.value);
|
|
101
|
+
};
|
|
102
|
+
const runTest = async () => {
|
|
103
|
+
if (!onTest)
|
|
104
|
+
return;
|
|
105
|
+
setTesting(true);
|
|
106
|
+
try {
|
|
107
|
+
setTestResult(await onTest());
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
setTesting(false);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
const title = rule ? (readOnly ? rule.name : `Edit ${rule.name}`) : 'New alert rule';
|
|
114
|
+
return (_jsxs(Dialog, { open: open, onClose: onClose, fullScreen: fullScreen, maxWidth: "md", fullWidth: true, "aria-labelledby": "alert-rule-dialog-title", children: [_jsx(DialogTitle, { id: "alert-rule-dialog-title", children: title }), _jsx(DialogContent, { dividers: true, children: _jsxs(Stack, { spacing: 2, children: [error ? _jsx(Alert, { severity: "error", children: error }) : null, rule?.starter ? (_jsx(Alert, { severity: "info", children: "This is a built-in rule. You can edit, enable and disable it; it cannot be deleted." })) : null, _jsx(TextField, { label: "Name", required: true, value: draft.name, disabled: disabled, onChange: (event) => set({ name: event.target.value }), error: Boolean(errors['name']), helperText: errors['name'] ?? ' ', fullWidth: true }), _jsx(TextField, { label: "Description", value: draft.description, disabled: disabled, onChange: (event) => set({ description: event.target.value }), multiline: true, minRows: 2, fullWidth: true }), _jsx(TextField, { select: true, label: "Kind", value: draft.kind, disabled: disabled || rule !== null, onChange: (event) => {
|
|
115
|
+
const kind = event.target.value;
|
|
116
|
+
setDraft((current) => ({ ...emptyAlertRuleDraft(kind), name: current.name, description: current.description }));
|
|
117
|
+
setErrors({});
|
|
118
|
+
}, helperText: rule ? 'The kind of an existing rule cannot change.' : (kindDescription ?? ' '), fullWidth: true, children: kindOptions.map((id) => (_jsx(MenuItem, { value: id, children: alertKindLabel(id, kinds) }, id))) }), _jsx(Typography, { variant: "subtitle2", component: "h3", children: "Condition" }), draft.kind === ALERT_KIND_IDS.METRIC_THRESHOLD ? (_jsx(MetricThresholdFields, { value: draft.metric, onChange: (metric) => set({ metric }), metrics: metrics, metricsError: metricsError, errors: errors, disabled: disabled })) : draft.kind === ALERT_KIND_IDS.NODE_EVENT ? (_jsx(NodeEventFields, { value: draft.nodeEvent, onChange: (nodeEvent) => set({ nodeEvent }), errors: errors, disabled: disabled })) : draft.kind === ALERT_KIND_IDS.VERDICT ? (_jsxs(TextField, { select: true, label: "Least verdict level", value: draft.verdict.minLevel, disabled: disabled, onChange: (event) => set({ verdict: { minLevel: event.target.value === 'degraded' ? 'degraded' : 'critical' } }), helperText: "Fires when the telemetry dashboard verdict is at this level or worse.", fullWidth: true, children: [_jsx(MenuItem, { value: "degraded", children: "Degraded" }), _jsx(MenuItem, { value: "critical", children: "Critical" })] })) : alertKindHasNoConfig(draft.kind) ? (_jsx(Typography, { variant: "body2", color: "text.secondary", children: "This kind has nothing to configure." })) : (_jsx(TextField, { label: "Configuration (JSON)", value: draft.rawConfig, disabled: disabled, onChange: (event) => set({ rawConfig: event.target.value }), error: Boolean(errors['config']), helperText: errors['config'] ?? 'Validated by the API against the kind’s schema.', multiline: true, minRows: 4, fullWidth: true, slotProps: { htmlInput: { spellCheck: false, style: { fontFamily: 'monospace' } } } })), errors['config'] && ALERT_FORM_KINDS.includes(draft.kind) ? _jsx(Alert, { severity: "error", children: errors['config'] }) : null, _jsx(Typography, { variant: "subtitle2", component: "h3", children: "Firing and notifications" }), _jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 2, children: [_jsx(TextField, { select: true, label: "Severity", value: draft.severity, disabled: disabled, onChange: (event) => set({ severity: event.target.value }), fullWidth: true, children: ALERT_SEVERITIES.map((severity) => (_jsx(MenuItem, { value: severity, children: ALERT_SEVERITY_LABELS[severity] }, severity))) }), _jsx(SecondsField, { label: "For (seconds)", value: draft.forSeconds, onChange: (forSeconds) => set({ forSeconds }), error: errors['forSeconds'], disabled: disabled, helper: "How long the condition must hold." }), _jsx(SecondsField, { label: "Cooldown (seconds)", value: draft.cooldownSeconds, onChange: (cooldownSeconds) => set({ cooldownSeconds }), error: errors['cooldownSeconds'], disabled: disabled, helper: "Quiet time before firing again." })] }), _jsxs(FormControl, { component: "fieldset", error: Boolean(errors['notifyChannels']), children: [_jsx(FormLabel, { component: "legend", children: "Notification channels" }), _jsx(FormGroup, { row: true, children: channelOptions.map((channel) => (_jsx(FormControlLabel, { label: CHANNEL_LABELS[channel] ?? channel, control: _jsx(Checkbox, { checked: draft.notifyChannels.includes(channel), disabled: disabled, onChange: (event) => set({
|
|
119
|
+
notifyChannels: event.target.checked
|
|
120
|
+
? [...draft.notifyChannels, channel]
|
|
121
|
+
: draft.notifyChannels.filter((id) => id !== channel),
|
|
122
|
+
}) }) }, channel))) }), _jsx(FormHelperText, { children: errors['notifyChannels'] ?? 'None checked: every channel the recipients have turned on for alerts.' })] }), _jsx(FormControlLabel, { control: _jsx(Switch, { checked: draft.webhook, disabled: disabled, onChange: (event) => set({ webhook: event.target.checked }) }), label: "Also send alerts.alert.fired and alerts.alert.resolved webhooks" }), _jsx(FormControlLabel, { control: _jsx(Switch, { checked: draft.enabled, disabled: disabled, onChange: (event) => set({ enabled: event.target.checked }) }), label: "Enabled" }), rule && onTest ? (_jsxs(Box, { children: [_jsx(Divider, { sx: { mb: 2 } }), _jsxs(Stack, { direction: "row", spacing: 2, sx: { mb: 1, alignItems: 'center' }, children: [_jsx(Button, { variant: "outlined", onClick: () => void runTest(), disabled: testing, sx: { minHeight: 44 }, children: testing ? 'Testing…' : 'Test' }), _jsx(Typography, { variant: "body2", color: "text.secondary", children: "Evaluates the saved rule now. Save your changes first to test them." })] }), testResult ? _jsx(AlertRuleTestResult, { result: testResult }) : null] })) : null] }) }), _jsxs(DialogActions, { children: [onDelete && rule && !rule.starter && !readOnly ? (_jsx(Button, { color: "error", startIcon: _jsx(DeleteOutlineIcon, {}), onClick: onDelete, disabled: saving, sx: { minHeight: 44, mr: 'auto' }, children: "Delete" })) : null, _jsx(Button, { onClick: onClose, sx: { minHeight: 44 }, children: readOnly ? 'Close' : 'Cancel' }), readOnly ? null : (_jsx(Button, { variant: "contained", onClick: submit, disabled: saving, sx: { minHeight: 44 }, children: rule ? 'Save' : 'Create rule' }))] })] }));
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=AlertRuleDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertRuleDialog.js","sourceRoot":"","sources":["../../../src/alerts/ui/AlertRuleDialog.tsx"],"names":[],"mappings":"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"}
|