@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,11 @@
|
|
|
1
|
+
import { AlertExecution, AlertRule } from '../../hooks/useDataSinkAlerts';
|
|
2
|
+
|
|
3
|
+
interface Props {
|
|
4
|
+
owner: string;
|
|
5
|
+
rules: AlertRule[];
|
|
6
|
+
load: (alertId?: string, after?: string) => Promise<AlertExecution[] | null>;
|
|
7
|
+
refreshVersion: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function AlertExecutionHistory({ owner, rules, load, refreshVersion }: Props): import("react").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=AlertExecutionHistory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertExecutionHistory.d.ts","sourceRoot":"","sources":["../../../../src/bigconsole/components/datasink/AlertExecutionHistory.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAqB,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAEvG,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,CAAC;IAC7E,cAAc,EAAE,MAAM,CAAC;CACxB;AAUD,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,KAAK,+BA2LlF"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { SECTION_FOCUS_RING as e } from "../common/sectionStyles.js";
|
|
2
|
+
import { Section as t } from "../common/Section.js";
|
|
3
|
+
import "../common/index.js";
|
|
4
|
+
import { alertErrorMessage as n } from "../../hooks/useDataSinkAlerts.js";
|
|
5
|
+
import { useCallback as r, useEffect as i, useLayoutEffect as a, useRef as o, useState as s } from "react";
|
|
6
|
+
import { Loader2 as c, RefreshCw as l } from "lucide-react";
|
|
7
|
+
import { Button as u } from "@burdenoff/fe-libs/ui";
|
|
8
|
+
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
9
|
+
import { useI18n as p } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
10
|
+
//#region src/bigconsole/components/datasink/AlertExecutionHistory.tsx
|
|
11
|
+
var m = {
|
|
12
|
+
owner: "",
|
|
13
|
+
rows: [],
|
|
14
|
+
loading: !1,
|
|
15
|
+
hasMore: !1,
|
|
16
|
+
error: null
|
|
17
|
+
};
|
|
18
|
+
function h({ owner: h, rules: g, load: _, refreshVersion: v }) {
|
|
19
|
+
let { t: y } = p(), [b, x] = s(""), [S, C] = s([]), w = S.at(-1), T = `${h}|${b}|${w ?? ""}`, E = o(null), D = o(null);
|
|
20
|
+
a(() => (E.current = T, () => {
|
|
21
|
+
E.current = null, D.current = null;
|
|
22
|
+
}), [T]);
|
|
23
|
+
let [O, k] = s(m), A = r(async () => {
|
|
24
|
+
if (E.current !== T || D.current) return;
|
|
25
|
+
let e = {};
|
|
26
|
+
D.current = e, k((e) => ({
|
|
27
|
+
...e.owner === T ? e : m,
|
|
28
|
+
owner: T,
|
|
29
|
+
loading: !0,
|
|
30
|
+
error: null
|
|
31
|
+
}));
|
|
32
|
+
try {
|
|
33
|
+
let t = await _(b || void 0, w);
|
|
34
|
+
if (E.current !== T || D.current !== e || !t) return;
|
|
35
|
+
k({
|
|
36
|
+
owner: T,
|
|
37
|
+
rows: t.slice(0, 20),
|
|
38
|
+
loading: !1,
|
|
39
|
+
hasMore: t.length > 20,
|
|
40
|
+
error: null
|
|
41
|
+
});
|
|
42
|
+
} catch (t) {
|
|
43
|
+
E.current === T && D.current === e && k((e) => ({
|
|
44
|
+
...e,
|
|
45
|
+
owner: T,
|
|
46
|
+
loading: !1,
|
|
47
|
+
error: n(t)
|
|
48
|
+
}));
|
|
49
|
+
} finally {
|
|
50
|
+
D.current === e && (D.current = null);
|
|
51
|
+
}
|
|
52
|
+
}, [
|
|
53
|
+
_,
|
|
54
|
+
b,
|
|
55
|
+
w,
|
|
56
|
+
T
|
|
57
|
+
]);
|
|
58
|
+
i(() => {
|
|
59
|
+
Promise.resolve().then(() => A());
|
|
60
|
+
let e = window.setInterval(() => {
|
|
61
|
+
document.visibilityState === "visible" && A();
|
|
62
|
+
}, 1e4);
|
|
63
|
+
return () => window.clearInterval(e);
|
|
64
|
+
}, [A, v]);
|
|
65
|
+
let j = O.owner === T ? O : {
|
|
66
|
+
...m,
|
|
67
|
+
loading: !0
|
|
68
|
+
};
|
|
69
|
+
return /* @__PURE__ */ f(t, {
|
|
70
|
+
title: y("bigconsole.alerts.history.title", "Execution history"),
|
|
71
|
+
headingLevel: 2,
|
|
72
|
+
description: y("bigconsole.alerts.history.description", "Actual evaluations and notification delivery status. Refreshes every 10 seconds while this page is visible."),
|
|
73
|
+
actions: /* @__PURE__ */ f(u, {
|
|
74
|
+
type: "button",
|
|
75
|
+
variant: "secondary",
|
|
76
|
+
size: "sm",
|
|
77
|
+
onClick: () => void A(),
|
|
78
|
+
disabled: j.loading,
|
|
79
|
+
children: [j.loading ? /* @__PURE__ */ d(c, { className: "mr-2 h-4 w-4 animate-spin" }) : /* @__PURE__ */ d(l, { className: "mr-2 h-4 w-4" }), y("bigconsole.alerts.history.refresh", "Refresh history")]
|
|
80
|
+
}),
|
|
81
|
+
children: [
|
|
82
|
+
/* @__PURE__ */ d("label", {
|
|
83
|
+
htmlFor: "alert-history-filter",
|
|
84
|
+
className: "mb-1 block text-xs font-medium text-text-primary",
|
|
85
|
+
children: y("bigconsole.alerts.history.filter", "Filter by rule")
|
|
86
|
+
}),
|
|
87
|
+
/* @__PURE__ */ f("select", {
|
|
88
|
+
id: "alert-history-filter",
|
|
89
|
+
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 ${e}`,
|
|
90
|
+
value: b,
|
|
91
|
+
onChange: (e) => {
|
|
92
|
+
x(e.target.value), C([]);
|
|
93
|
+
},
|
|
94
|
+
children: [
|
|
95
|
+
/* @__PURE__ */ d("option", {
|
|
96
|
+
value: "",
|
|
97
|
+
children: y("bigconsole.alerts.history.all", "All rules")
|
|
98
|
+
}),
|
|
99
|
+
b && !g.some((e) => e.id === b) && /* @__PURE__ */ d("option", {
|
|
100
|
+
value: b,
|
|
101
|
+
children: b
|
|
102
|
+
}),
|
|
103
|
+
g.map((e) => /* @__PURE__ */ d("option", {
|
|
104
|
+
value: e.id,
|
|
105
|
+
children: e.name
|
|
106
|
+
}, e.id))
|
|
107
|
+
]
|
|
108
|
+
}),
|
|
109
|
+
j.error && /* @__PURE__ */ d("p", {
|
|
110
|
+
role: "alert",
|
|
111
|
+
className: "mb-4 break-words text-sm text-status-error-text",
|
|
112
|
+
children: j.error
|
|
113
|
+
}),
|
|
114
|
+
j.loading && !j.rows.length && /* @__PURE__ */ d("p", {
|
|
115
|
+
role: "status",
|
|
116
|
+
className: "text-sm text-text-secondary",
|
|
117
|
+
children: y("bigconsole.alerts.history.loading", "Loading execution history…")
|
|
118
|
+
}),
|
|
119
|
+
!j.loading && !j.error && !j.rows.length && /* @__PURE__ */ d("p", {
|
|
120
|
+
className: "text-sm text-text-secondary",
|
|
121
|
+
children: y("bigconsole.alerts.history.empty", "No evaluations recorded yet. Enabled rules evaluate when the sink data is updated or refreshed.")
|
|
122
|
+
}),
|
|
123
|
+
/* @__PURE__ */ d("ol", {
|
|
124
|
+
className: "divide-y divide-border-subtle",
|
|
125
|
+
children: j.rows.map((e) => /* @__PURE__ */ f("li", {
|
|
126
|
+
className: "min-w-0 py-4 first:pt-0",
|
|
127
|
+
children: [
|
|
128
|
+
/* @__PURE__ */ f("div", {
|
|
129
|
+
className: "flex flex-wrap items-start justify-between gap-2",
|
|
130
|
+
children: [/* @__PURE__ */ f("div", {
|
|
131
|
+
className: "min-w-0",
|
|
132
|
+
children: [/* @__PURE__ */ d("p", {
|
|
133
|
+
className: "break-words text-sm font-medium text-text-primary",
|
|
134
|
+
children: g.find((t) => t.id === e.alertId)?.name ?? e.alertId
|
|
135
|
+
}), /* @__PURE__ */ d("time", {
|
|
136
|
+
dateTime: e.createdAt,
|
|
137
|
+
className: "text-xs text-text-secondary",
|
|
138
|
+
children: new Date(e.createdAt).toLocaleString()
|
|
139
|
+
})]
|
|
140
|
+
}), /* @__PURE__ */ d("span", {
|
|
141
|
+
className: "rounded-pill border border-border-subtle bg-bg-sunken px-2 py-1 text-xs font-medium text-text-primary",
|
|
142
|
+
children: y(`bigconsole.alerts.history.status.${e.status}`, e.status.replaceAll("_", " "))
|
|
143
|
+
})]
|
|
144
|
+
}),
|
|
145
|
+
/* @__PURE__ */ f("p", {
|
|
146
|
+
className: "mt-2 break-words text-xs text-text-secondary",
|
|
147
|
+
children: [
|
|
148
|
+
y("bigconsole.alerts.history.dataVersion", "Data version"),
|
|
149
|
+
" ",
|
|
150
|
+
e.version,
|
|
151
|
+
" · ",
|
|
152
|
+
e.source,
|
|
153
|
+
" ·",
|
|
154
|
+
" ",
|
|
155
|
+
e.durationMs,
|
|
156
|
+
" ms"
|
|
157
|
+
]
|
|
158
|
+
}),
|
|
159
|
+
e.error && /* @__PURE__ */ d("p", {
|
|
160
|
+
className: "mt-2 break-words text-sm text-status-error-text",
|
|
161
|
+
children: e.error
|
|
162
|
+
}),
|
|
163
|
+
e.deliveries.length > 0 && /* @__PURE__ */ d("ul", {
|
|
164
|
+
className: "mt-3 space-y-2",
|
|
165
|
+
children: e.deliveries.map((e, t) => /* @__PURE__ */ f("li", {
|
|
166
|
+
className: "min-w-0 rounded-control border border-border-subtle bg-bg-sunken p-3 text-xs",
|
|
167
|
+
children: [
|
|
168
|
+
/* @__PURE__ */ f("div", {
|
|
169
|
+
className: "flex flex-wrap justify-between gap-2",
|
|
170
|
+
children: [/* @__PURE__ */ f("span", {
|
|
171
|
+
className: "break-all text-text-primary",
|
|
172
|
+
children: [
|
|
173
|
+
e.channel,
|
|
174
|
+
" · ",
|
|
175
|
+
e.recipient
|
|
176
|
+
]
|
|
177
|
+
}), /* @__PURE__ */ d("span", {
|
|
178
|
+
className: "font-medium text-text-primary",
|
|
179
|
+
children: e.status
|
|
180
|
+
})]
|
|
181
|
+
}),
|
|
182
|
+
e.attemptedAt && /* @__PURE__ */ f("p", {
|
|
183
|
+
className: "mt-1 text-text-secondary",
|
|
184
|
+
children: [
|
|
185
|
+
y("bigconsole.alerts.history.attempted", "Attempted"),
|
|
186
|
+
" ",
|
|
187
|
+
/* @__PURE__ */ d("time", {
|
|
188
|
+
dateTime: e.attemptedAt,
|
|
189
|
+
children: new Date(e.attemptedAt).toLocaleString()
|
|
190
|
+
})
|
|
191
|
+
]
|
|
192
|
+
}),
|
|
193
|
+
e.notificationId && /* @__PURE__ */ f("p", {
|
|
194
|
+
className: "mt-1 break-all text-text-muted",
|
|
195
|
+
children: [
|
|
196
|
+
y("bigconsole.alerts.history.notification", "Notification"),
|
|
197
|
+
" · ",
|
|
198
|
+
e.notificationId
|
|
199
|
+
]
|
|
200
|
+
}),
|
|
201
|
+
e.error && /* @__PURE__ */ d("p", {
|
|
202
|
+
className: "mt-1 break-words text-status-error-text",
|
|
203
|
+
children: e.error
|
|
204
|
+
})
|
|
205
|
+
]
|
|
206
|
+
}, `${e.channelId}|${e.recipient}|${t}`))
|
|
207
|
+
})
|
|
208
|
+
]
|
|
209
|
+
}, e.id))
|
|
210
|
+
}),
|
|
211
|
+
/* @__PURE__ */ f("div", {
|
|
212
|
+
className: "mt-4 flex flex-wrap items-center justify-between gap-control-gap border-t border-border-subtle pt-3",
|
|
213
|
+
children: [/* @__PURE__ */ f("span", {
|
|
214
|
+
className: "text-xs text-text-secondary",
|
|
215
|
+
children: [
|
|
216
|
+
j.rows.length,
|
|
217
|
+
" ",
|
|
218
|
+
y("bigconsole.alerts.history.count", "executions on this page")
|
|
219
|
+
]
|
|
220
|
+
}), /* @__PURE__ */ f("div", {
|
|
221
|
+
className: "flex gap-control-gap",
|
|
222
|
+
children: [/* @__PURE__ */ d(u, {
|
|
223
|
+
type: "button",
|
|
224
|
+
variant: "secondary",
|
|
225
|
+
size: "sm",
|
|
226
|
+
onClick: () => C((e) => e.slice(0, -1)),
|
|
227
|
+
disabled: !S.length || j.loading,
|
|
228
|
+
children: y("bigconsole.alerts.history.newer", "Newer")
|
|
229
|
+
}), /* @__PURE__ */ d(u, {
|
|
230
|
+
type: "button",
|
|
231
|
+
variant: "secondary",
|
|
232
|
+
size: "sm",
|
|
233
|
+
onClick: () => {
|
|
234
|
+
let e = j.rows.at(-1);
|
|
235
|
+
e && C((t) => [...t, e.id]);
|
|
236
|
+
},
|
|
237
|
+
disabled: !j.hasMore || j.loading,
|
|
238
|
+
children: y("bigconsole.alerts.history.older", "Older")
|
|
239
|
+
})]
|
|
240
|
+
})]
|
|
241
|
+
})
|
|
242
|
+
]
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
//#endregion
|
|
246
|
+
export { h as AlertExecutionHistory };
|
|
247
|
+
|
|
248
|
+
//# sourceMappingURL=AlertExecutionHistory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertExecutionHistory.js","names":[],"sources":["../../../../src/bigconsole/components/datasink/AlertExecutionHistory.tsx"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Loader2, RefreshCw } from 'lucide-react';\nimport { Section, SECTION_FOCUS_RING } from '../common';\nimport { alertErrorMessage, type AlertExecution, type AlertRule } from '../../hooks/useDataSinkAlerts';\n\ninterface Props {\n owner: string;\n rules: AlertRule[];\n load: (alertId?: string, after?: string) => Promise<AlertExecution[] | null>;\n refreshVersion: number;\n}\ninterface HistoryPage {\n owner: string;\n rows: AlertExecution[];\n loading: boolean;\n hasMore: boolean;\n error: string | null;\n}\nconst EMPTY: HistoryPage = { owner: '', rows: [], loading: false, hasMore: false, error: null };\n\nexport function AlertExecutionHistory({ owner, rules, load, refreshVersion }: Props) {\n const { t } = useI18n();\n const [alertId, setAlertId] = useState('');\n const [cursors, setCursors] = useState<string[]>([]);\n const after = cursors.at(-1);\n const requestOwner = `${owner}|${alertId}|${after ?? ''}`;\n const activeOwner = useRef<string | null>(null);\n const activeRequest = useRef<object | null>(null);\n useLayoutEffect(() => {\n activeOwner.current = requestOwner;\n return () => {\n activeOwner.current = null;\n activeRequest.current = null;\n };\n }, [requestOwner]);\n const [state, setState] = useState<HistoryPage>(EMPTY);\n const reload = useCallback(async () => {\n if (activeOwner.current !== requestOwner || activeRequest.current) return;\n const request = {};\n activeRequest.current = request;\n setState((previous) => ({\n ...(previous.owner === requestOwner ? previous : EMPTY),\n owner: requestOwner,\n loading: true,\n error: null,\n }));\n try {\n const rows = await load(alertId || undefined, after);\n if (activeOwner.current !== requestOwner || activeRequest.current !== request || !rows) return;\n setState({\n owner: requestOwner,\n rows: rows.slice(0, 20),\n loading: false,\n hasMore: rows.length > 20,\n error: null,\n });\n } catch (error) {\n if (activeOwner.current === requestOwner && activeRequest.current === request)\n setState((previous) => ({ ...previous, owner: requestOwner, loading: false, error: alertErrorMessage(error) }));\n } finally {\n if (activeRequest.current === request) activeRequest.current = null;\n }\n }, [load, alertId, after, requestOwner]);\n useEffect(() => {\n void Promise.resolve().then(() => reload());\n const timer = window.setInterval(() => {\n if (document.visibilityState === 'visible') void reload();\n }, 10000);\n return () => window.clearInterval(timer);\n }, [reload, refreshVersion]);\n const current = state.owner === requestOwner ? state : { ...EMPTY, loading: true };\n return (\n <Section\n title={t('bigconsole.alerts.history.title', 'Execution history')}\n headingLevel={2}\n description={t(\n 'bigconsole.alerts.history.description',\n 'Actual evaluations and notification delivery status. Refreshes every 10 seconds while this page is visible.'\n )}\n actions={\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" onClick={() => void reload()} disabled={current.loading}>\n {current.loading ? <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> : <RefreshCw className=\"mr-2 h-4 w-4\" />}\n {t('bigconsole.alerts.history.refresh', 'Refresh history')}\n </Button>\n }\n >\n <label htmlFor=\"alert-history-filter\" className=\"mb-1 block text-xs font-medium text-text-primary\">\n {t('bigconsole.alerts.history.filter', 'Filter by rule')}\n </label>\n <select\n id=\"alert-history-filter\"\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 value={alertId}\n onChange={(event) => {\n setAlertId(event.target.value);\n setCursors([]);\n }}\n >\n <option value=\"\">{t('bigconsole.alerts.history.all', 'All rules')}</option>\n {alertId && !rules.some((rule) => rule.id === alertId) && <option value={alertId}>{alertId}</option>}\n {rules.map((rule) => (\n <option key={rule.id} value={rule.id}>\n {rule.name}\n </option>\n ))}\n </select>\n {current.error && (\n <p role=\"alert\" className=\"mb-4 break-words text-sm text-status-error-text\">\n {current.error}\n </p>\n )}\n {current.loading && !current.rows.length && (\n <p role=\"status\" className=\"text-sm text-text-secondary\">\n {t('bigconsole.alerts.history.loading', 'Loading execution history…')}\n </p>\n )}\n {!current.loading && !current.error && !current.rows.length && (\n <p className=\"text-sm text-text-secondary\">\n {t(\n 'bigconsole.alerts.history.empty',\n 'No evaluations recorded yet. Enabled rules evaluate when the sink data is updated or refreshed.'\n )}\n </p>\n )}\n <ol className=\"divide-y divide-border-subtle\">\n {current.rows.map((execution) => (\n <li key={execution.id} className=\"min-w-0 py-4 first:pt-0\">\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <p className=\"break-words text-sm font-medium text-text-primary\">\n {rules.find((rule) => rule.id === execution.alertId)?.name ?? execution.alertId}\n </p>\n <time dateTime={execution.createdAt} className=\"text-xs text-text-secondary\">\n {new Date(execution.createdAt).toLocaleString()}\n </time>\n </div>\n <span className=\"rounded-pill border border-border-subtle bg-bg-sunken px-2 py-1 text-xs font-medium text-text-primary\">\n {t(`bigconsole.alerts.history.status.${execution.status}`, execution.status.replaceAll('_', ' '))}\n </span>\n </div>\n <p className=\"mt-2 break-words text-xs text-text-secondary\">\n {t('bigconsole.alerts.history.dataVersion', 'Data version')} {execution.version} · {execution.source} ·{' '}\n {execution.durationMs} ms\n </p>\n {execution.error && <p className=\"mt-2 break-words text-sm text-status-error-text\">{execution.error}</p>}\n {execution.deliveries.length > 0 && (\n <ul className=\"mt-3 space-y-2\">\n {execution.deliveries.map((delivery, index) => (\n <li\n key={`${delivery.channelId}|${delivery.recipient}|${index}`}\n className=\"min-w-0 rounded-control border border-border-subtle bg-bg-sunken p-3 text-xs\"\n >\n <div className=\"flex flex-wrap justify-between gap-2\">\n <span className=\"break-all text-text-primary\">\n {delivery.channel} · {delivery.recipient}\n </span>\n <span className=\"font-medium text-text-primary\">{delivery.status}</span>\n </div>\n {delivery.attemptedAt && (\n <p className=\"mt-1 text-text-secondary\">\n {t('bigconsole.alerts.history.attempted', 'Attempted')}{' '}\n <time dateTime={delivery.attemptedAt}>{new Date(delivery.attemptedAt).toLocaleString()}</time>\n </p>\n )}\n {delivery.notificationId && (\n <p className=\"mt-1 break-all text-text-muted\">\n {t('bigconsole.alerts.history.notification', 'Notification')} · {delivery.notificationId}\n </p>\n )}\n {delivery.error && <p className=\"mt-1 break-words text-status-error-text\">{delivery.error}</p>}\n </li>\n ))}\n </ul>\n )}\n </li>\n ))}\n </ol>\n <div className=\"mt-4 flex flex-wrap items-center justify-between gap-control-gap border-t border-border-subtle pt-3\">\n <span className=\"text-xs text-text-secondary\">\n {current.rows.length} {t('bigconsole.alerts.history.count', 'executions on this page')}\n </span>\n <div className=\"flex gap-control-gap\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => setCursors((previous) => previous.slice(0, -1))}\n disabled={!cursors.length || current.loading}\n >\n {t('bigconsole.alerts.history.newer', 'Newer')}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => {\n const last = current.rows.at(-1);\n if (last) setCursors((previous) => [...previous, last.id]);\n }}\n disabled={!current.hasMore || current.loading}\n >\n {t('bigconsole.alerts.history.older', 'Older')}\n </Button>\n </div>\n </div>\n </Section>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AlertChannel, AlertPreview } from '../../hooks/useDataSinkAlerts';
|
|
2
|
+
import { AlertDraft } from '../../utils/alertRules';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
draft: AlertDraft;
|
|
6
|
+
channels: AlertChannel[];
|
|
7
|
+
channelError: string | null;
|
|
8
|
+
canUpdate: boolean;
|
|
9
|
+
pending: boolean;
|
|
10
|
+
previewing: boolean;
|
|
11
|
+
preview: AlertPreview | null;
|
|
12
|
+
previewError: string | null;
|
|
13
|
+
previewStale: boolean;
|
|
14
|
+
error: string | null;
|
|
15
|
+
onChange: (draft: AlertDraft) => void;
|
|
16
|
+
onSave: () => void;
|
|
17
|
+
onCancel: () => void;
|
|
18
|
+
onPreview: () => void;
|
|
19
|
+
onReloadChannels: () => void;
|
|
20
|
+
}
|
|
21
|
+
export declare function AlertRuleEditor(props: Props): import("react").JSX.Element;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=AlertRuleEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertRuleEditor.d.ts","sourceRoot":"","sources":["../../../../src/bigconsole/components/datasink/AlertRuleEditor.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGzD,UAAU,KAAK;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,+BAgY3C"}
|