@burdenoff/microfe-bigconsole 2026.1004.7 → 2026.1005.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bigconsole/BigConsoleRoutes.d.ts +7 -1
- package/dist/bigconsole/BigConsoleRoutes.d.ts.map +1 -1
- package/dist/bigconsole/BigConsoleRoutes.js +154 -144
- package/dist/bigconsole/BigConsoleRoutes.js.map +1 -1
- package/dist/bigconsole/components/datasink/AlertExecutionHistory.d.ts +11 -0
- package/dist/bigconsole/components/datasink/AlertExecutionHistory.d.ts.map +1 -0
- package/dist/bigconsole/components/datasink/AlertExecutionHistory.js +248 -0
- package/dist/bigconsole/components/datasink/AlertExecutionHistory.js.map +1 -0
- package/dist/bigconsole/components/datasink/AlertRuleEditor.d.ts +23 -0
- package/dist/bigconsole/components/datasink/AlertRuleEditor.d.ts.map +1 -0
- package/dist/bigconsole/components/datasink/AlertRuleEditor.js +357 -0
- package/dist/bigconsole/components/datasink/AlertRuleEditor.js.map +1 -0
- package/dist/bigconsole/components/workflow/WorkflowOpenGuard.d.ts +25 -0
- package/dist/bigconsole/components/workflow/WorkflowOpenGuard.d.ts.map +1 -0
- package/dist/bigconsole/components/workflow/WorkflowOpenGuard.js +89 -0
- package/dist/bigconsole/components/workflow/WorkflowOpenGuard.js.map +1 -0
- package/dist/bigconsole/hooks/useDataSinkAlerts.d.ts +146 -0
- package/dist/bigconsole/hooks/useDataSinkAlerts.d.ts.map +1 -0
- package/dist/bigconsole/hooks/useDataSinkAlerts.js +221 -0
- package/dist/bigconsole/hooks/useDataSinkAlerts.js.map +1 -0
- package/dist/bigconsole/pages/DataSinkAlertsPage.d.ts +2 -0
- package/dist/bigconsole/pages/DataSinkAlertsPage.d.ts.map +1 -0
- package/dist/bigconsole/pages/DataSinkAlertsPage.js +422 -0
- package/dist/bigconsole/pages/DataSinkAlertsPage.js.map +1 -0
- package/dist/bigconsole/pages/DataSinkViewPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/DataSinkViewPage.js +151 -144
- package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowViewPage.js +4 -4
- package/dist/bigconsole/pages/WorkflowsPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/WorkflowsPage.js +61 -60
- package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
- package/dist/bigconsole/utils/alertRules.d.ts +40 -0
- package/dist/bigconsole/utils/alertRules.d.ts.map +1 -0
- package/dist/bigconsole/utils/alertRules.js +83 -0
- package/dist/bigconsole/utils/alertRules.js.map +1 -0
- package/dist/bigconsole/workflowOpen.d.ts +78 -0
- package/dist/bigconsole/workflowOpen.d.ts.map +1 -0
- package/dist/bigconsole/workflowOpen.js +33 -0
- package/dist/bigconsole/workflowOpen.js.map +1 -0
- package/dist/generated/wspace-operations.d.ts +418 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -1
- package/dist/generated/wspace-operations.js +329 -200
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.d.ts +122 -0
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/dist/generated/wspace-types.js +7 -1
- package/dist/generated/wspace-types.js.map +1 -1
- package/dist/translations/en.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
import { useAppNavigate as e } from "../contexts/NavigationContext.js";
|
|
2
|
+
import "../contexts/index.js";
|
|
3
|
+
import { useBigConsole as t } from "../context/BigConsoleContext.js";
|
|
4
|
+
import "../context/index.js";
|
|
5
|
+
import { SECTION_FOCUS_RING as n } from "../components/common/sectionStyles.js";
|
|
6
|
+
import { Section as r } from "../components/common/Section.js";
|
|
7
|
+
import "../components/common/index.js";
|
|
8
|
+
import { BIGCONSOLE_PERMISSIONS as i } from "../../constants/permissions.js";
|
|
9
|
+
import { nativeConfirm as ee } from "../../utils/nativeBridge.js";
|
|
10
|
+
import { AlertRuleEditor as te } from "../components/datasink/AlertRuleEditor.js";
|
|
11
|
+
import { alertErrorMessage as a, useDataSinkAlerts as ne } from "../hooks/useDataSinkAlerts.js";
|
|
12
|
+
import { AlertExecutionHistory as re } from "../components/datasink/AlertExecutionHistory.js";
|
|
13
|
+
import { ALERT_VALIDATION_MESSAGES as o, alertDraft as s, alertDraftInput as c, validateAlertDraft as l } from "../utils/alertRules.js";
|
|
14
|
+
import { useEffect as u, useRef as d, useState as f } from "react";
|
|
15
|
+
import { useParams as p } from "react-router";
|
|
16
|
+
import { AccessDenied as ie } from "@burdenoff/fe-libs/shared/components";
|
|
17
|
+
import { usePermissions as ae } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
18
|
+
import { ArrowLeft as oe, Bell as se, Loader2 as ce, Plus as le, RefreshCw as ue, Trash2 as m } from "lucide-react";
|
|
19
|
+
import { Button as h, Switch as de } from "@burdenoff/fe-libs/ui";
|
|
20
|
+
import { Fragment as fe, jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
21
|
+
import { useI18n as pe } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
22
|
+
//#region src/bigconsole/pages/DataSinkAlertsPage.tsx
|
|
23
|
+
function v() {
|
|
24
|
+
let { dataSinkId: e = "" } = p(), { currentUser: n, workspaceId: r } = t();
|
|
25
|
+
return /* @__PURE__ */ g(y, { dataSinkId: e }, `${n?.id ?? ""}|${r ?? ""}|${e}`);
|
|
26
|
+
}
|
|
27
|
+
function y({ dataSinkId: p }) {
|
|
28
|
+
let { t: v } = pe(), y = e(), { currentUser: b, workspaceId: x } = t(), { hasPermission: S, isLoading: C } = ae(), w = S(i.DATASINK_READ), T = !C && S(i.DATASINK_UPDATE), E = ne(p, !C && w && !!x && !!b?.id), D = E.sink, O = D?.alerts ?? [], [k, me] = f(""), [A, j] = f(null), [M, N] = f(!1), P = d(!1), F = d(null), [I, L] = f(null), [R, z] = f(null), [B, V] = f(!1), [he, H] = f(null), [U, W] = f(null), [ge, G] = f(0), K = d(0), q = d(0), J = A?.selection;
|
|
29
|
+
u(() => {
|
|
30
|
+
J !== void 0 && document.getElementById("alert-name")?.focus();
|
|
31
|
+
}, [J]);
|
|
32
|
+
let _e = !!A && JSON.stringify(A.draft) !== A.original, Y = async (e) => await ee({
|
|
33
|
+
title: v("bigconsole.alerts.confirm.title", "Confirm alert change"),
|
|
34
|
+
message: e,
|
|
35
|
+
okButtonTitle: v("bigconsole.alerts.confirm.continue", "Continue"),
|
|
36
|
+
cancelButtonTitle: v("bigconsole.alerts.rule.cancel", "Cancel")
|
|
37
|
+
}) ?? window.confirm(e), X = () => !_e || Y(v("bigconsole.alerts.confirm.discard", "Discard your unsaved rule changes?")), Z = async (e) => {
|
|
38
|
+
if (M || !D || !await X()) return;
|
|
39
|
+
document.activeElement instanceof HTMLElement && (F.current = document.activeElement);
|
|
40
|
+
let t = s(e);
|
|
41
|
+
j({
|
|
42
|
+
draft: t,
|
|
43
|
+
original: JSON.stringify(t),
|
|
44
|
+
version: D.version,
|
|
45
|
+
selection: ++q.current
|
|
46
|
+
}), K.current++, W(null), H(null), V(!1), L(null), z(null);
|
|
47
|
+
}, ve = async () => {
|
|
48
|
+
M || !await X() || (j(null), W(null), H(null), K.current++, V(!1), L(null), F.current?.isConnected && F.current.focus());
|
|
49
|
+
}, Q = async () => {
|
|
50
|
+
if (!A || !D || !T || P.current) return;
|
|
51
|
+
let e = l(A.draft, E.channels);
|
|
52
|
+
if (e) {
|
|
53
|
+
L(v(`bigconsole.alerts.validation.${e}`, o[e]));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
P.current = !0, N(!0), L(null), z(null);
|
|
57
|
+
let t = new Set(O.map((e) => e.id));
|
|
58
|
+
try {
|
|
59
|
+
let e = await E.save(c(A.draft), A.version);
|
|
60
|
+
if (!e) return;
|
|
61
|
+
let n = e.alerts?.find((e) => A.draft.id ? e.id === A.draft.id : !t.has(e.id));
|
|
62
|
+
if (n) {
|
|
63
|
+
let t = s(n);
|
|
64
|
+
j({
|
|
65
|
+
draft: t,
|
|
66
|
+
original: JSON.stringify(t),
|
|
67
|
+
version: e.version,
|
|
68
|
+
selection: A.selection
|
|
69
|
+
});
|
|
70
|
+
} else j(null);
|
|
71
|
+
z(v("bigconsole.alerts.feedback.saved", "Alert rule saved.")), G((e) => e + 1);
|
|
72
|
+
} catch (e) {
|
|
73
|
+
L(a(e));
|
|
74
|
+
} finally {
|
|
75
|
+
P.current = !1, N(!1);
|
|
76
|
+
}
|
|
77
|
+
}, ye = async (e) => {
|
|
78
|
+
if (!D || !T || P.current) return;
|
|
79
|
+
let t = {
|
|
80
|
+
...s(e),
|
|
81
|
+
enabled: !e.enabled
|
|
82
|
+
}, n = l(t, E.channels);
|
|
83
|
+
if (n) {
|
|
84
|
+
L(v(`bigconsole.alerts.validation.${n}`, o[n]));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
P.current = !0, N(!0), L(null), z(null);
|
|
88
|
+
try {
|
|
89
|
+
await E.save(c(t), D.version) && (z(t.enabled ? v("bigconsole.alerts.feedback.enabled", "Alert rule enabled.") : v("bigconsole.alerts.feedback.disabled", "Alert rule disabled.")), G((e) => e + 1));
|
|
90
|
+
} catch (e) {
|
|
91
|
+
L(a(e));
|
|
92
|
+
} finally {
|
|
93
|
+
P.current = !1, N(!1);
|
|
94
|
+
}
|
|
95
|
+
}, be = async (e) => {
|
|
96
|
+
if (!(!D || !T || P.current) && !(!await Y(`${v("bigconsole.alerts.confirm.delete", "Delete alert rule")} “${e.name}”?`) || P.current)) {
|
|
97
|
+
P.current = !0, N(!0), L(null), z(null);
|
|
98
|
+
try {
|
|
99
|
+
await E.remove(e.id, D.version) && (A?.draft.id === e.id && j(null), z(v("bigconsole.alerts.feedback.deleted", "Alert rule deleted.")), G((e) => e + 1));
|
|
100
|
+
} catch (e) {
|
|
101
|
+
L(a(e));
|
|
102
|
+
} finally {
|
|
103
|
+
P.current = !1, N(!1);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}, xe = async () => {
|
|
107
|
+
if (!A || B || M) return;
|
|
108
|
+
let e = ++K.current, { condition: t, conditionType: n } = A.draft;
|
|
109
|
+
V(!0), H(null), W(null);
|
|
110
|
+
try {
|
|
111
|
+
let r = await E.preview(t, n);
|
|
112
|
+
r && K.current === e && W({
|
|
113
|
+
condition: t,
|
|
114
|
+
conditionType: n,
|
|
115
|
+
result: r
|
|
116
|
+
});
|
|
117
|
+
} catch (t) {
|
|
118
|
+
K.current === e && H(a(t));
|
|
119
|
+
} finally {
|
|
120
|
+
K.current === e && V(!1);
|
|
121
|
+
}
|
|
122
|
+
}, Se = async () => {
|
|
123
|
+
if (!A?.draft.id || M || !await X()) return;
|
|
124
|
+
let e = await E.reload(), t = e?.alerts?.find((e) => e.id === A.draft.id);
|
|
125
|
+
if (!e) return;
|
|
126
|
+
if (!t) {
|
|
127
|
+
j(null), z(v("bigconsole.alerts.feedback.removedElsewhere", "This rule no longer exists."));
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
let n = s(t);
|
|
131
|
+
j({
|
|
132
|
+
draft: n,
|
|
133
|
+
original: JSON.stringify(n),
|
|
134
|
+
version: e.version,
|
|
135
|
+
selection: ++q.current
|
|
136
|
+
}), L(null), W(null);
|
|
137
|
+
};
|
|
138
|
+
if (C || E.loading) return /* @__PURE__ */ _("div", {
|
|
139
|
+
role: "status",
|
|
140
|
+
className: "flex min-h-60 items-center justify-center p-card-padding",
|
|
141
|
+
children: [/* @__PURE__ */ g(ce, { className: "mr-2 h-5 w-5 animate-spin text-text-secondary" }), v("bigconsole.alerts.loading", "Loading alerts…")]
|
|
142
|
+
});
|
|
143
|
+
if (!w) return /* @__PURE__ */ g(ie, {
|
|
144
|
+
title: v("bigconsole.alerts.denied", "Access denied"),
|
|
145
|
+
description: v("bigconsole.alerts.deniedDescription", "You do not have permission to read this data sink.")
|
|
146
|
+
});
|
|
147
|
+
if (!x || !b?.id) return /* @__PURE__ */ g("p", {
|
|
148
|
+
className: "p-card-padding text-text-secondary",
|
|
149
|
+
children: v("bigconsole.alerts.selectWorkspace", "Select a workspace to view its alerts.")
|
|
150
|
+
});
|
|
151
|
+
if (!D) return /* @__PURE__ */ g("div", {
|
|
152
|
+
className: "p-card-padding",
|
|
153
|
+
children: /* @__PURE__ */ g(r, {
|
|
154
|
+
title: v("bigconsole.alerts.unavailable", "Alerts could not be loaded"),
|
|
155
|
+
headingLevel: 2,
|
|
156
|
+
tone: "danger",
|
|
157
|
+
description: E.error ?? v("bigconsole.alerts.notFound", "Data sink not found."),
|
|
158
|
+
actions: /* @__PURE__ */ g(h, {
|
|
159
|
+
onClick: () => void E.reload(),
|
|
160
|
+
variant: "secondary",
|
|
161
|
+
children: v("bigconsole.alerts.retry", "Retry")
|
|
162
|
+
})
|
|
163
|
+
})
|
|
164
|
+
});
|
|
165
|
+
let $ = O.filter((e) => `${e.name} ${e.condition}`.toLowerCase().includes(k.trim().toLowerCase()));
|
|
166
|
+
return /* @__PURE__ */ _("div", {
|
|
167
|
+
className: "min-w-0 p-card-padding",
|
|
168
|
+
children: [
|
|
169
|
+
/* @__PURE__ */ _("header", {
|
|
170
|
+
className: "mb-section-gap flex flex-col gap-form-gap sm:flex-row sm:items-start sm:justify-between",
|
|
171
|
+
children: [/* @__PURE__ */ _("div", {
|
|
172
|
+
className: "min-w-0",
|
|
173
|
+
children: [
|
|
174
|
+
/* @__PURE__ */ _(h, {
|
|
175
|
+
variant: "ghost",
|
|
176
|
+
size: "sm",
|
|
177
|
+
onClick: () => y(`/datasinks/${p}`),
|
|
178
|
+
className: "mb-3",
|
|
179
|
+
children: [/* @__PURE__ */ g(oe, { className: "mr-2 h-4 w-4" }), v("bigconsole.alerts.back", "Back to data sink")]
|
|
180
|
+
}),
|
|
181
|
+
/* @__PURE__ */ _("h1", {
|
|
182
|
+
className: "break-words text-2xl font-bold text-text-primary",
|
|
183
|
+
children: [
|
|
184
|
+
v("bigconsole.alerts.title", "Alerts"),
|
|
185
|
+
" · ",
|
|
186
|
+
D.name || D.key
|
|
187
|
+
]
|
|
188
|
+
}),
|
|
189
|
+
/* @__PURE__ */ g("p", {
|
|
190
|
+
className: "mt-2 text-sm text-text-secondary",
|
|
191
|
+
children: v("bigconsole.alerts.purpose", "Create and manage alert rules for this data sink.")
|
|
192
|
+
})
|
|
193
|
+
]
|
|
194
|
+
}), /* @__PURE__ */ _(h, {
|
|
195
|
+
variant: "secondary",
|
|
196
|
+
size: "sm",
|
|
197
|
+
onClick: () => {
|
|
198
|
+
E.reload(), E.reloadChannels(), G((e) => e + 1);
|
|
199
|
+
},
|
|
200
|
+
disabled: E.refreshing || M,
|
|
201
|
+
children: [/* @__PURE__ */ g(ue, { className: `mr-2 h-4 w-4 ${E.refreshing ? "animate-spin" : ""}` }), v("bigconsole.alerts.refresh", "Refresh alerts")]
|
|
202
|
+
})]
|
|
203
|
+
}),
|
|
204
|
+
R && /* @__PURE__ */ g("p", {
|
|
205
|
+
role: "status",
|
|
206
|
+
className: "mb-4 rounded-control bg-[var(--color-status-success-bgSubtle)] p-3 text-sm text-status-success-text",
|
|
207
|
+
children: R
|
|
208
|
+
}),
|
|
209
|
+
I && !A && /* @__PURE__ */ g("p", {
|
|
210
|
+
role: "alert",
|
|
211
|
+
className: "mb-4 break-words text-sm text-status-error-text",
|
|
212
|
+
children: I
|
|
213
|
+
}),
|
|
214
|
+
E.error && /* @__PURE__ */ g("p", {
|
|
215
|
+
role: "alert",
|
|
216
|
+
className: "mb-4 break-words text-sm text-status-error-text",
|
|
217
|
+
children: E.error
|
|
218
|
+
}),
|
|
219
|
+
/* @__PURE__ */ _("div", {
|
|
220
|
+
className: "grid min-w-0 items-start gap-section-gap xl:grid-cols-[minmax(0,1.2fr)_minmax(0,1fr)]",
|
|
221
|
+
children: [/* @__PURE__ */ _("div", {
|
|
222
|
+
className: "min-w-0 space-y-section-gap",
|
|
223
|
+
children: [/* @__PURE__ */ _(r, {
|
|
224
|
+
title: v("bigconsole.alerts.list.title", "Alert rules"),
|
|
225
|
+
headingLevel: 2,
|
|
226
|
+
icon: /* @__PURE__ */ g(se, { className: "h-4 w-4" }),
|
|
227
|
+
actions: /* @__PURE__ */ _(h, {
|
|
228
|
+
size: "sm",
|
|
229
|
+
onClick: () => void Z(),
|
|
230
|
+
disabled: !T || M,
|
|
231
|
+
children: [/* @__PURE__ */ g(le, { className: "mr-2 h-4 w-4" }), v("bigconsole.alerts.list.new", "New alert rule")]
|
|
232
|
+
}),
|
|
233
|
+
children: [
|
|
234
|
+
/* @__PURE__ */ g("label", {
|
|
235
|
+
htmlFor: "alert-search",
|
|
236
|
+
className: "sr-only",
|
|
237
|
+
children: v("bigconsole.alerts.list.search", "Search alerts")
|
|
238
|
+
}),
|
|
239
|
+
/* @__PURE__ */ g("input", {
|
|
240
|
+
id: "alert-search",
|
|
241
|
+
type: "search",
|
|
242
|
+
value: k,
|
|
243
|
+
onChange: (e) => me(e.target.value),
|
|
244
|
+
placeholder: v("bigconsole.alerts.list.searchPlaceholder", "Search alerts…"),
|
|
245
|
+
className: `mb-4 w-full min-w-0 rounded-control border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary ${n}`
|
|
246
|
+
}),
|
|
247
|
+
/* @__PURE__ */ g("div", {
|
|
248
|
+
className: "max-w-full overflow-x-auto",
|
|
249
|
+
children: /* @__PURE__ */ _("table", {
|
|
250
|
+
className: "w-full text-sm",
|
|
251
|
+
children: [
|
|
252
|
+
/* @__PURE__ */ g("caption", {
|
|
253
|
+
className: "sr-only",
|
|
254
|
+
children: v("bigconsole.alerts.list.caption", "Rules for this data sink")
|
|
255
|
+
}),
|
|
256
|
+
/* @__PURE__ */ g("thead", { children: /* @__PURE__ */ _("tr", {
|
|
257
|
+
className: "border-b border-border-subtle text-left text-xs text-text-secondary",
|
|
258
|
+
children: [
|
|
259
|
+
/* @__PURE__ */ g("th", {
|
|
260
|
+
scope: "col",
|
|
261
|
+
className: "pb-3 pr-2",
|
|
262
|
+
children: v("bigconsole.alerts.rule.name", "Name")
|
|
263
|
+
}),
|
|
264
|
+
/* @__PURE__ */ g("th", {
|
|
265
|
+
scope: "col",
|
|
266
|
+
className: "hidden pb-3 pr-2 sm:table-cell",
|
|
267
|
+
children: v("bigconsole.alerts.rule.severity", "Severity")
|
|
268
|
+
}),
|
|
269
|
+
/* @__PURE__ */ g("th", {
|
|
270
|
+
scope: "col",
|
|
271
|
+
className: "hidden pb-3 pr-2 lg:table-cell",
|
|
272
|
+
children: v("bigconsole.alerts.rule.destinations", "Delivery destinations")
|
|
273
|
+
}),
|
|
274
|
+
/* @__PURE__ */ g("th", {
|
|
275
|
+
scope: "col",
|
|
276
|
+
className: "hidden pb-3 pr-2 md:table-cell",
|
|
277
|
+
children: v("bigconsole.alerts.rule.throttle", "Throttle")
|
|
278
|
+
}),
|
|
279
|
+
/* @__PURE__ */ g("th", {
|
|
280
|
+
scope: "col",
|
|
281
|
+
className: "pb-3 pr-2",
|
|
282
|
+
children: v("bigconsole.alerts.list.enabled", "Enabled")
|
|
283
|
+
}),
|
|
284
|
+
/* @__PURE__ */ g("th", {
|
|
285
|
+
scope: "col",
|
|
286
|
+
className: "pb-3",
|
|
287
|
+
children: /* @__PURE__ */ g("span", {
|
|
288
|
+
className: "sr-only",
|
|
289
|
+
children: v("bigconsole.alerts.list.actions", "Actions")
|
|
290
|
+
})
|
|
291
|
+
})
|
|
292
|
+
]
|
|
293
|
+
}) }),
|
|
294
|
+
/* @__PURE__ */ g("tbody", { children: $.map((e) => /* @__PURE__ */ _("tr", {
|
|
295
|
+
className: "border-b border-border-subtle last:border-0",
|
|
296
|
+
children: [
|
|
297
|
+
/* @__PURE__ */ _("th", {
|
|
298
|
+
scope: "row",
|
|
299
|
+
className: "max-w-64 py-4 pr-2 text-left font-normal",
|
|
300
|
+
children: [
|
|
301
|
+
/* @__PURE__ */ g("button", {
|
|
302
|
+
type: "button",
|
|
303
|
+
onClick: () => void Z(e),
|
|
304
|
+
disabled: M,
|
|
305
|
+
className: `break-words text-left font-medium text-text-primary underline-offset-4 hover:underline ${n}`,
|
|
306
|
+
children: e.name
|
|
307
|
+
}),
|
|
308
|
+
/* @__PURE__ */ g("p", {
|
|
309
|
+
className: "mt-1 text-xs text-text-secondary sm:hidden",
|
|
310
|
+
children: v(`bigconsole.alerts.severity.${e.severity}`, e.severity.toUpperCase())
|
|
311
|
+
}),
|
|
312
|
+
/* @__PURE__ */ g("p", {
|
|
313
|
+
className: "mt-1 text-xs text-text-muted md:hidden",
|
|
314
|
+
children: e.throttle?.enabled ? `${e.throttle.maxAlertsPerWindow} / ${e.throttle.windowMinutes} min` : v("bigconsole.alerts.list.noThrottle", "No throttle")
|
|
315
|
+
})
|
|
316
|
+
]
|
|
317
|
+
}),
|
|
318
|
+
/* @__PURE__ */ g("td", {
|
|
319
|
+
className: "hidden py-4 pr-2 sm:table-cell",
|
|
320
|
+
children: /* @__PURE__ */ g("span", {
|
|
321
|
+
className: "rounded-pill border border-border-subtle bg-bg-sunken px-2 py-1 text-xs text-text-primary",
|
|
322
|
+
children: v(`bigconsole.alerts.severity.${e.severity}`, e.severity.toUpperCase())
|
|
323
|
+
})
|
|
324
|
+
}),
|
|
325
|
+
/* @__PURE__ */ g("td", {
|
|
326
|
+
className: "hidden py-4 pr-2 text-xs text-text-secondary lg:table-cell",
|
|
327
|
+
children: e.deliveries.length ? [...new Set(e.deliveries.map((e) => e.channel))].join(", ") : v("bigconsole.alerts.list.unconfigured", "Not configured")
|
|
328
|
+
}),
|
|
329
|
+
/* @__PURE__ */ g("td", {
|
|
330
|
+
className: "hidden py-4 pr-2 text-xs text-text-secondary md:table-cell",
|
|
331
|
+
children: e.throttle?.enabled ? `${e.throttle.maxAlertsPerWindow} / ${e.throttle.windowMinutes} min` : v("bigconsole.alerts.list.noThrottle", "No throttle")
|
|
332
|
+
}),
|
|
333
|
+
/* @__PURE__ */ g("td", {
|
|
334
|
+
className: "py-4 pr-2",
|
|
335
|
+
children: /* @__PURE__ */ g(de, {
|
|
336
|
+
checked: e.enabled,
|
|
337
|
+
onCheckedChange: () => void ye(e),
|
|
338
|
+
disabled: !T || M,
|
|
339
|
+
"aria-label": `${v("bigconsole.alerts.list.enabled", "Enabled")} · ${e.name}`
|
|
340
|
+
})
|
|
341
|
+
}),
|
|
342
|
+
/* @__PURE__ */ g("td", {
|
|
343
|
+
className: "py-4",
|
|
344
|
+
children: /* @__PURE__ */ g(h, {
|
|
345
|
+
type: "button",
|
|
346
|
+
variant: "ghost",
|
|
347
|
+
size: "sm",
|
|
348
|
+
onClick: () => void be(e),
|
|
349
|
+
disabled: !T || M,
|
|
350
|
+
"aria-label": `${v("bigconsole.alerts.confirm.delete", "Delete alert rule")} · ${e.name}`,
|
|
351
|
+
children: /* @__PURE__ */ g(m, { className: "h-4 w-4" })
|
|
352
|
+
})
|
|
353
|
+
})
|
|
354
|
+
]
|
|
355
|
+
}, e.id)) })
|
|
356
|
+
]
|
|
357
|
+
})
|
|
358
|
+
}),
|
|
359
|
+
!$.length && /* @__PURE__ */ g("p", {
|
|
360
|
+
className: "py-4 text-sm text-text-secondary",
|
|
361
|
+
children: O.length ? v("bigconsole.alerts.list.noMatches", "No alerts match your search.") : v("bigconsole.alerts.list.empty", "No alert rules yet. Create a disabled rule and preview its condition before enabling it.")
|
|
362
|
+
}),
|
|
363
|
+
/* @__PURE__ */ _("p", {
|
|
364
|
+
className: "mt-3 text-xs text-text-muted",
|
|
365
|
+
children: [
|
|
366
|
+
$.length,
|
|
367
|
+
" ",
|
|
368
|
+
v("bigconsole.alerts.list.count", "rules shown")
|
|
369
|
+
]
|
|
370
|
+
})
|
|
371
|
+
]
|
|
372
|
+
}), /* @__PURE__ */ g(re, {
|
|
373
|
+
owner: E.owner,
|
|
374
|
+
rules: O,
|
|
375
|
+
load: E.history,
|
|
376
|
+
refreshVersion: ge
|
|
377
|
+
})]
|
|
378
|
+
}), /* @__PURE__ */ g("div", {
|
|
379
|
+
className: "min-w-0",
|
|
380
|
+
children: A ? /* @__PURE__ */ _(fe, { children: [/* @__PURE__ */ g(te, {
|
|
381
|
+
draft: A.draft,
|
|
382
|
+
channels: E.channels,
|
|
383
|
+
channelError: E.channelError,
|
|
384
|
+
canUpdate: T,
|
|
385
|
+
pending: M,
|
|
386
|
+
previewing: B,
|
|
387
|
+
preview: U?.result ?? null,
|
|
388
|
+
previewError: he,
|
|
389
|
+
previewStale: !!U && (U.condition !== A.draft.condition || U.conditionType !== A.draft.conditionType || D.version > U.result.version),
|
|
390
|
+
error: I,
|
|
391
|
+
onChange: (e) => {
|
|
392
|
+
(e.condition !== A.draft.condition || e.conditionType !== A.draft.conditionType) && (K.current++, H(null), V(!1)), j({
|
|
393
|
+
...A,
|
|
394
|
+
draft: e
|
|
395
|
+
});
|
|
396
|
+
},
|
|
397
|
+
onSave: () => void Q(),
|
|
398
|
+
onCancel: () => void ve(),
|
|
399
|
+
onPreview: () => void xe(),
|
|
400
|
+
onReloadChannels: () => void E.reloadChannels()
|
|
401
|
+
}), A.draft.id && /* @__PURE__ */ g(h, {
|
|
402
|
+
type: "button",
|
|
403
|
+
variant: "ghost",
|
|
404
|
+
size: "sm",
|
|
405
|
+
onClick: () => void Se(),
|
|
406
|
+
disabled: M || E.refreshing,
|
|
407
|
+
className: "mt-3",
|
|
408
|
+
children: v("bigconsole.alerts.rule.reloadSaved", "Reload saved rule")
|
|
409
|
+
})] }) : /* @__PURE__ */ g(r, {
|
|
410
|
+
title: v("bigconsole.alerts.rule.title", "Alert rule"),
|
|
411
|
+
headingLevel: 2,
|
|
412
|
+
description: v("bigconsole.alerts.rule.select", "Select a rule to inspect it, or create a new alert rule.")
|
|
413
|
+
})
|
|
414
|
+
})]
|
|
415
|
+
})
|
|
416
|
+
]
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
//#endregion
|
|
420
|
+
export { v as default };
|
|
421
|
+
|
|
422
|
+
//# sourceMappingURL=DataSinkAlertsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataSinkAlertsPage.js","names":[],"sources":["../../../src/bigconsole/pages/DataSinkAlertsPage.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { Button, Switch } from '@burdenoff/fe-libs/ui';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { AccessDenied } from '@burdenoff/fe-libs/shared/components';\nimport { ArrowLeft, Bell, Loader2, Plus, RefreshCw, Trash2 } from 'lucide-react';\nimport { BIGCONSOLE_PERMISSIONS } from '../../constants/permissions';\nimport { useBigConsole } from '../context';\nimport { useAppNavigate } from '../contexts';\nimport { Section, SECTION_FOCUS_RING } from '../components/common';\nimport { AlertRuleEditor } from '../components/datasink/AlertRuleEditor';\nimport { AlertExecutionHistory } from '../components/datasink/AlertExecutionHistory';\nimport { useDataSinkAlerts, alertErrorMessage, type AlertRule, type AlertPreview } from '../hooks/useDataSinkAlerts';\nimport {\n alertDraft,\n alertDraftInput,\n validateAlertDraft,\n ALERT_VALIDATION_MESSAGES,\n type AlertDraft,\n} from '../utils/alertRules';\nimport { nativeConfirm } from '../../utils/nativeBridge';\n\ninterface EditingRule {\n draft: AlertDraft;\n original: string;\n version: number;\n selection: number;\n}\ninterface PreviewResult {\n condition: string;\n conditionType: string;\n result: AlertPreview;\n}\n\nexport default function DataSinkAlertsPage() {\n const { dataSinkId = '' } = useParams<{ dataSinkId: string }>();\n const { currentUser, workspaceId } = useBigConsole();\n return (\n <DataSinkAlertsContent\n key={`${currentUser?.id ?? ''}|${workspaceId ?? ''}|${dataSinkId}`}\n dataSinkId={dataSinkId}\n />\n );\n}\n\nfunction DataSinkAlertsContent({ dataSinkId }: { dataSinkId: string }) {\n const { t } = useI18n();\n const navigate = useAppNavigate();\n const { currentUser, workspaceId } = useBigConsole();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canRead = hasPermission(BIGCONSOLE_PERMISSIONS.DATASINK_READ);\n const canUpdate = !permissionsLoading && hasPermission(BIGCONSOLE_PERMISSIONS.DATASINK_UPDATE);\n const operations = useDataSinkAlerts(\n dataSinkId,\n !permissionsLoading && canRead && !!workspaceId && !!currentUser?.id\n );\n const sink = operations.sink;\n const rules = sink?.alerts ?? [];\n const [search, setSearch] = useState('');\n const [editing, setEditing] = useState<EditingRule | null>(null);\n const [pending, setPending] = useState(false);\n const mutationActive = useRef(false);\n const opener = useRef<HTMLElement | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [status, setStatus] = useState<string | null>(null);\n const [previewing, setPreviewing] = useState(false);\n const [previewError, setPreviewError] = useState<string | null>(null);\n const [preview, setPreview] = useState<PreviewResult | null>(null);\n const [historyVersion, setHistoryVersion] = useState(0);\n const previewRequest = useRef(0);\n const selectionCounter = useRef(0);\n const editingSelection = editing?.selection;\n useEffect(() => {\n if (editingSelection !== undefined) document.getElementById('alert-name')?.focus();\n }, [editingSelection]);\n const dirty = !!editing && JSON.stringify(editing.draft) !== editing.original;\n const confirm = async (message: string) => {\n const native = await nativeConfirm({\n title: t('bigconsole.alerts.confirm.title', 'Confirm alert change'),\n message,\n okButtonTitle: t('bigconsole.alerts.confirm.continue', 'Continue'),\n cancelButtonTitle: t('bigconsole.alerts.rule.cancel', 'Cancel'),\n });\n return native ?? window.confirm(message);\n };\n const discard = () => !dirty || confirm(t('bigconsole.alerts.confirm.discard', 'Discard your unsaved rule changes?'));\n const selectRule = async (rule?: AlertRule) => {\n if (pending || !sink || !(await discard())) return;\n if (document.activeElement instanceof HTMLElement) opener.current = document.activeElement;\n const draft = alertDraft(rule);\n setEditing({\n draft,\n original: JSON.stringify(draft),\n version: sink.version,\n selection: ++selectionCounter.current,\n });\n previewRequest.current++;\n setPreview(null);\n setPreviewError(null);\n setPreviewing(false);\n setError(null);\n setStatus(null);\n };\n const cancel = async () => {\n if (pending || !(await discard())) return;\n setEditing(null);\n setPreview(null);\n setPreviewError(null);\n previewRequest.current++;\n setPreviewing(false);\n setError(null);\n if (opener.current?.isConnected) opener.current.focus();\n };\n const save = async () => {\n if (!editing || !sink || !canUpdate || mutationActive.current) return;\n const invalid = validateAlertDraft(editing.draft, operations.channels);\n if (invalid) {\n setError(t(`bigconsole.alerts.validation.${invalid}`, ALERT_VALIDATION_MESSAGES[invalid]));\n return;\n }\n mutationActive.current = true;\n setPending(true);\n setError(null);\n setStatus(null);\n const knownIds = new Set(rules.map((rule) => rule.id));\n try {\n const saved = await operations.save(alertDraftInput(editing.draft), editing.version);\n if (!saved) return;\n const rule = saved.alerts?.find((item) =>\n editing.draft.id ? item.id === editing.draft.id : !knownIds.has(item.id)\n );\n if (rule) {\n const draft = alertDraft(rule);\n setEditing({ draft, original: JSON.stringify(draft), version: saved.version, selection: editing.selection });\n } else setEditing(null);\n setStatus(t('bigconsole.alerts.feedback.saved', 'Alert rule saved.'));\n setHistoryVersion((previous) => previous + 1);\n } catch (caught) {\n setError(alertErrorMessage(caught));\n } finally {\n mutationActive.current = false;\n setPending(false);\n }\n };\n const toggle = async (rule: AlertRule) => {\n if (!sink || !canUpdate || mutationActive.current) return;\n const draft = { ...alertDraft(rule), enabled: !rule.enabled };\n const invalid = validateAlertDraft(draft, operations.channels);\n if (invalid) {\n setError(t(`bigconsole.alerts.validation.${invalid}`, ALERT_VALIDATION_MESSAGES[invalid]));\n return;\n }\n mutationActive.current = true;\n setPending(true);\n setError(null);\n setStatus(null);\n try {\n const saved = await operations.save(alertDraftInput(draft), sink.version);\n if (saved) {\n setStatus(\n draft.enabled\n ? t('bigconsole.alerts.feedback.enabled', 'Alert rule enabled.')\n : t('bigconsole.alerts.feedback.disabled', 'Alert rule disabled.')\n );\n setHistoryVersion((previous) => previous + 1);\n }\n } catch (caught) {\n setError(alertErrorMessage(caught));\n } finally {\n mutationActive.current = false;\n setPending(false);\n }\n };\n const remove = async (rule: AlertRule) => {\n if (!sink || !canUpdate || mutationActive.current) return;\n const ok = await confirm(`${t('bigconsole.alerts.confirm.delete', 'Delete alert rule')} “${rule.name}”?`);\n if (!ok || mutationActive.current) return;\n mutationActive.current = true;\n setPending(true);\n setError(null);\n setStatus(null);\n try {\n const saved = await operations.remove(rule.id, sink.version);\n if (saved) {\n if (editing?.draft.id === rule.id) setEditing(null);\n setStatus(t('bigconsole.alerts.feedback.deleted', 'Alert rule deleted.'));\n setHistoryVersion((previous) => previous + 1);\n }\n } catch (caught) {\n setError(alertErrorMessage(caught));\n } finally {\n mutationActive.current = false;\n setPending(false);\n }\n };\n const runPreview = async () => {\n if (!editing || previewing || pending) return;\n const request = ++previewRequest.current;\n const { condition, conditionType } = editing.draft;\n setPreviewing(true);\n setPreviewError(null);\n setPreview(null);\n try {\n const result = await operations.preview(condition, conditionType);\n if (result && previewRequest.current === request) setPreview({ condition, conditionType, result });\n } catch (caught) {\n if (previewRequest.current === request) setPreviewError(alertErrorMessage(caught));\n } finally {\n if (previewRequest.current === request) setPreviewing(false);\n }\n };\n const reloadRule = async () => {\n if (!editing?.draft.id || pending || !(await discard())) return;\n const latest = await operations.reload();\n const rule = latest?.alerts?.find((item) => item.id === editing.draft.id);\n if (!latest) return;\n if (!rule) {\n setEditing(null);\n setStatus(t('bigconsole.alerts.feedback.removedElsewhere', 'This rule no longer exists.'));\n return;\n }\n const draft = alertDraft(rule);\n setEditing({\n draft,\n original: JSON.stringify(draft),\n version: latest.version,\n selection: ++selectionCounter.current,\n });\n setError(null);\n setPreview(null);\n };\n if (permissionsLoading || operations.loading)\n return (\n <div role=\"status\" className=\"flex min-h-60 items-center justify-center p-card-padding\">\n <Loader2 className=\"mr-2 h-5 w-5 animate-spin text-text-secondary\" />\n {t('bigconsole.alerts.loading', 'Loading alerts…')}\n </div>\n );\n if (!canRead)\n return (\n <AccessDenied\n title={t('bigconsole.alerts.denied', 'Access denied')}\n description={t('bigconsole.alerts.deniedDescription', 'You do not have permission to read this data sink.')}\n />\n );\n if (!workspaceId || !currentUser?.id)\n return (\n <p className=\"p-card-padding text-text-secondary\">\n {t('bigconsole.alerts.selectWorkspace', 'Select a workspace to view its alerts.')}\n </p>\n );\n if (!sink)\n return (\n <div className=\"p-card-padding\">\n <Section\n title={t('bigconsole.alerts.unavailable', 'Alerts could not be loaded')}\n headingLevel={2}\n tone=\"danger\"\n description={operations.error ?? t('bigconsole.alerts.notFound', 'Data sink not found.')}\n actions={\n <Button onClick={() => void operations.reload()} variant=\"secondary\">\n {t('bigconsole.alerts.retry', 'Retry')}\n </Button>\n }\n />\n </div>\n );\n const filtered = rules.filter((rule) =>\n `${rule.name} ${rule.condition}`.toLowerCase().includes(search.trim().toLowerCase())\n );\n return (\n <div className=\"min-w-0 p-card-padding\">\n <header className=\"mb-section-gap flex flex-col gap-form-gap sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigate(`/datasinks/${dataSinkId}`)} className=\"mb-3\">\n <ArrowLeft className=\"mr-2 h-4 w-4\" />\n {t('bigconsole.alerts.back', 'Back to data sink')}\n </Button>\n <h1 className=\"break-words text-2xl font-bold text-text-primary\">\n {t('bigconsole.alerts.title', 'Alerts')} · {sink.name || sink.key}\n </h1>\n <p className=\"mt-2 text-sm text-text-secondary\">\n {t('bigconsole.alerts.purpose', 'Create and manage alert rules for this data sink.')}\n </p>\n </div>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => {\n void operations.reload();\n void operations.reloadChannels();\n setHistoryVersion((previous) => previous + 1);\n }}\n disabled={operations.refreshing || pending}\n >\n <RefreshCw className={`mr-2 h-4 w-4 ${operations.refreshing ? 'animate-spin' : ''}`} />\n {t('bigconsole.alerts.refresh', 'Refresh alerts')}\n </Button>\n </header>\n {status && (\n <p\n role=\"status\"\n className=\"mb-4 rounded-control bg-[var(--color-status-success-bgSubtle)] p-3 text-sm text-status-success-text\"\n >\n {status}\n </p>\n )}\n {error && !editing && (\n <p role=\"alert\" className=\"mb-4 break-words text-sm text-status-error-text\">\n {error}\n </p>\n )}\n {operations.error && (\n <p role=\"alert\" className=\"mb-4 break-words text-sm text-status-error-text\">\n {operations.error}\n </p>\n )}\n <div className=\"grid min-w-0 items-start gap-section-gap xl:grid-cols-[minmax(0,1.2fr)_minmax(0,1fr)]\">\n <div className=\"min-w-0 space-y-section-gap\">\n <Section\n title={t('bigconsole.alerts.list.title', 'Alert rules')}\n headingLevel={2}\n icon={<Bell className=\"h-4 w-4\" />}\n actions={\n <Button size=\"sm\" onClick={() => void selectRule()} disabled={!canUpdate || pending}>\n <Plus className=\"mr-2 h-4 w-4\" />\n {t('bigconsole.alerts.list.new', 'New alert rule')}\n </Button>\n }\n >\n <label htmlFor=\"alert-search\" className=\"sr-only\">\n {t('bigconsole.alerts.list.search', 'Search alerts')}\n </label>\n <input\n id=\"alert-search\"\n type=\"search\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder={t('bigconsole.alerts.list.searchPlaceholder', 'Search alerts…')}\n className={`mb-4 w-full min-w-0 rounded-control border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary ${SECTION_FOCUS_RING}`}\n />\n <div className=\"max-w-full overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <caption className=\"sr-only\">{t('bigconsole.alerts.list.caption', 'Rules for this data sink')}</caption>\n <thead>\n <tr className=\"border-b border-border-subtle text-left text-xs text-text-secondary\">\n <th scope=\"col\" className=\"pb-3 pr-2\">\n {t('bigconsole.alerts.rule.name', 'Name')}\n </th>\n <th scope=\"col\" className=\"hidden pb-3 pr-2 sm:table-cell\">\n {t('bigconsole.alerts.rule.severity', 'Severity')}\n </th>\n <th scope=\"col\" className=\"hidden pb-3 pr-2 lg:table-cell\">\n {t('bigconsole.alerts.rule.destinations', 'Delivery destinations')}\n </th>\n <th scope=\"col\" className=\"hidden pb-3 pr-2 md:table-cell\">\n {t('bigconsole.alerts.rule.throttle', 'Throttle')}\n </th>\n <th scope=\"col\" className=\"pb-3 pr-2\">\n {t('bigconsole.alerts.list.enabled', 'Enabled')}\n </th>\n <th scope=\"col\" className=\"pb-3\">\n <span className=\"sr-only\">{t('bigconsole.alerts.list.actions', 'Actions')}</span>\n </th>\n </tr>\n </thead>\n <tbody>\n {filtered.map((rule) => (\n <tr key={rule.id} className=\"border-b border-border-subtle last:border-0\">\n <th scope=\"row\" className=\"max-w-64 py-4 pr-2 text-left font-normal\">\n <button\n type=\"button\"\n onClick={() => void selectRule(rule)}\n disabled={pending}\n className={`break-words text-left font-medium text-text-primary underline-offset-4 hover:underline ${SECTION_FOCUS_RING}`}\n >\n {rule.name}\n </button>\n <p className=\"mt-1 text-xs text-text-secondary sm:hidden\">\n {t(`bigconsole.alerts.severity.${rule.severity}`, rule.severity.toUpperCase())}\n </p>\n <p className=\"mt-1 text-xs text-text-muted md:hidden\">\n {rule.throttle?.enabled\n ? `${rule.throttle.maxAlertsPerWindow} / ${rule.throttle.windowMinutes} min`\n : t('bigconsole.alerts.list.noThrottle', 'No throttle')}\n </p>\n </th>\n <td className=\"hidden py-4 pr-2 sm:table-cell\">\n <span className=\"rounded-pill border border-border-subtle bg-bg-sunken px-2 py-1 text-xs text-text-primary\">\n {t(`bigconsole.alerts.severity.${rule.severity}`, rule.severity.toUpperCase())}\n </span>\n </td>\n <td className=\"hidden py-4 pr-2 text-xs text-text-secondary lg:table-cell\">\n {rule.deliveries.length\n ? [...new Set(rule.deliveries.map((item) => item.channel))].join(', ')\n : t('bigconsole.alerts.list.unconfigured', 'Not configured')}\n </td>\n <td className=\"hidden py-4 pr-2 text-xs text-text-secondary md:table-cell\">\n {rule.throttle?.enabled\n ? `${rule.throttle.maxAlertsPerWindow} / ${rule.throttle.windowMinutes} min`\n : t('bigconsole.alerts.list.noThrottle', 'No throttle')}\n </td>\n <td className=\"py-4 pr-2\">\n <Switch\n checked={rule.enabled}\n onCheckedChange={() => void toggle(rule)}\n disabled={!canUpdate || pending}\n aria-label={`${t('bigconsole.alerts.list.enabled', 'Enabled')} · ${rule.name}`}\n />\n </td>\n <td className=\"py-4\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void remove(rule)}\n disabled={!canUpdate || pending}\n aria-label={`${t('bigconsole.alerts.confirm.delete', 'Delete alert rule')} · ${rule.name}`}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {!filtered.length && (\n <p className=\"py-4 text-sm text-text-secondary\">\n {rules.length\n ? t('bigconsole.alerts.list.noMatches', 'No alerts match your search.')\n : t(\n 'bigconsole.alerts.list.empty',\n 'No alert rules yet. Create a disabled rule and preview its condition before enabling it.'\n )}\n </p>\n )}\n <p className=\"mt-3 text-xs text-text-muted\">\n {filtered.length} {t('bigconsole.alerts.list.count', 'rules shown')}\n </p>\n </Section>\n <AlertExecutionHistory\n owner={operations.owner}\n rules={rules}\n load={operations.history}\n refreshVersion={historyVersion}\n />\n </div>\n <div className=\"min-w-0\">\n {editing ? (\n <>\n <AlertRuleEditor\n draft={editing.draft}\n channels={operations.channels}\n channelError={operations.channelError}\n canUpdate={canUpdate}\n pending={pending}\n previewing={previewing}\n preview={preview?.result ?? null}\n previewError={previewError}\n previewStale={\n !!preview &&\n (preview.condition !== editing.draft.condition ||\n preview.conditionType !== editing.draft.conditionType ||\n sink.version > preview.result.version)\n }\n error={error}\n onChange={(draft) => {\n if (\n draft.condition !== editing.draft.condition ||\n draft.conditionType !== editing.draft.conditionType\n ) {\n previewRequest.current++;\n setPreviewError(null);\n setPreviewing(false);\n }\n setEditing({ ...editing, draft });\n }}\n onSave={() => void save()}\n onCancel={() => void cancel()}\n onPreview={() => void runPreview()}\n onReloadChannels={() => void operations.reloadChannels()}\n />\n {editing.draft.id && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void reloadRule()}\n disabled={pending || operations.refreshing}\n className=\"mt-3\"\n >\n {t('bigconsole.alerts.rule.reloadSaved', 'Reload saved rule')}\n </Button>\n )}\n </>\n ) : (\n <Section\n title={t('bigconsole.alerts.rule.title', 'Alert rule')}\n headingLevel={2}\n description={t(\n 'bigconsole.alerts.rule.select',\n 'Select a rule to inspect it, or create a new alert rule.'\n )}\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataSinkViewPage.d.ts","sourceRoot":"","sources":["../../../src/bigconsole/pages/DataSinkViewPage.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"DataSinkViewPage.d.ts","sourceRoot":"","sources":["../../../src/bigconsole/pages/DataSinkViewPage.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAkEH,eAAO,MAAM,gBAAgB,8CAgnB3B,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
|