@burdenoff/microfe-bigconsole 2026.805.2 → 2026.805.3
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/components/builder/inspector/DataBindingSection.js +109 -113
- package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -1
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +115 -113
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js +71 -62
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js +90 -89
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +56 -54
- package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +126 -125
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +151 -150
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +77 -76
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +97 -96
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +172 -191
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +75 -83
- package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +151 -154
- package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +181 -190
- package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
- package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -0
- package/dist/bigconsole/components/dashboard/WidgetPalette.js +110 -108
- package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
- package/dist/bigconsole/components/datasink/CacheTTLSelector.js +102 -103
- package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +36 -41
- package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +38 -37
- package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +113 -117
- package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +182 -197
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +166 -168
- package/dist/bigconsole/components/datasink/RefreshTypeSelector.js.map +1 -1
- package/dist/bigconsole/components/parser/DataSinkSelector.js +87 -86
- package/dist/bigconsole/components/parser/DataSinkSelector.js.map +1 -1
- package/dist/bigconsole/components/parser/ImportParserDialog.js +196 -211
- package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
- package/dist/bigconsole/components/parser/ParserSelector.js +130 -128
- package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
- package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +66 -63
- package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js.map +1 -1
- package/dist/bigconsole/components/preview/AiPreviewPanel.js +95 -91
- package/dist/bigconsole/components/preview/AiPreviewPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js +222 -215
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +149 -145
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/PropertiesPanel.js +504 -470
- package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +44 -47
- package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/chart/ChartConfig.js +143 -142
- package/dist/bigconsole/components/widgets/chart/ChartConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/comments/WidgetComments.js +101 -88
- package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
- package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +135 -134
- package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js.map +1 -1
- package/dist/bigconsole/components/widgets/form/FormWidget.js +167 -159
- package/dist/bigconsole/components/widgets/form/FormWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +69 -68
- package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +64 -72
- package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +60 -59
- package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/list/ListConfig.js +57 -56
- package/dist/bigconsole/components/widgets/list/ListConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +70 -69
- package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +35 -34
- package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +20 -19
- package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js.map +1 -1
- package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +178 -177
- package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +76 -75
- package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/table/TableConfig.js +183 -168
- package/dist/bigconsole/components/widgets/table/TableConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +187 -180
- package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js.map +1 -1
- package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +40 -38
- package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js.map +1 -1
- package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +150 -148
- package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
- package/dist/bigconsole/pages/DashboardBuilderPage.js +181 -176
- package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardViewPage.js +196 -192
- package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardsPage.js +223 -219
- package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
- package/dist/bigconsole/pages/DataParsersPage.js +167 -170
- package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkBuilderPage.js +204 -189
- package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkViewPage.js +175 -169
- package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSourcesPage.js +8 -7
- package/dist/bigconsole/pages/DataSourcesPage.js.map +1 -1
- package/dist/bigconsole/pages/InsightsPage.js +238 -208
- package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserBuilderPage.js +464 -412
- package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserViewPage.js +92 -90
- package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineBuilderPage.js +221 -194
- package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineViewPage.js +181 -184
- package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelinesPage.js +128 -127
- package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
- package/dist/bigconsole/pages/SettingsPage.js +177 -172
- package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
- package/dist/bigconsole/pages/WidgetDemoPage.js +121 -83
- package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowViewPage.js +199 -193
- package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowsPage.js +129 -128
- package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
- package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +111 -109
- package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js.map +1 -1
- package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +127 -126
- package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js.map +1 -1
- package/dist/bigconsole/renderers/adapters/CustomRenderer.js +103 -103
- package/dist/bigconsole/renderers/adapters/CustomRenderer.js.map +1 -1
- package/package.json +2 -1
|
@@ -12,23 +12,24 @@ import oe from "../components/parser/ExportParserDialog.js";
|
|
|
12
12
|
import { memo as s, useCallback as c, useEffect as l, useState as u } from "react";
|
|
13
13
|
import { useParams as se } from "react-router";
|
|
14
14
|
import { AccessDenied as ce, PermissionButton as d } from "@burdenoff/fe-libs/shared/components";
|
|
15
|
-
import { usePermissions as
|
|
16
|
-
import { AlertCircle as
|
|
17
|
-
import {
|
|
15
|
+
import { usePermissions as f } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
16
|
+
import { AlertCircle as le, AlertTriangle as ue, ArrowDown as de, ArrowLeft as p, Check as fe, Copy as pe, Database as me, Download as he, Edit as ge, FileCode2 as _e, Loader2 as m, Play as h, Trash2 as ve } from "lucide-react";
|
|
17
|
+
import { useI18n as ye } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
18
|
+
import { Badge as g, Button as _, Card as v, CardContent as y, CardHeader as b, CardTitle as x, Dialog as be, DialogContent as xe, DialogDescription as Se, DialogFooter as Ce, DialogHeader as S, DialogTitle as C, GlassCard as w, IllustratedEmptyState as T, NextSteps as E, PagePurpose as D } from "@burdenoff/fe-libs/ui";
|
|
18
19
|
import { Fragment as O, jsx as k, jsxs as A } from "react/jsx-runtime";
|
|
19
20
|
import { formatDistanceToNow as j } from "date-fns";
|
|
20
21
|
//#region src/bigconsole/pages/ParserViewPage.tsx
|
|
21
|
-
var
|
|
22
|
-
let { parserId: s, consoleId: M } = se(), N = ee(),
|
|
23
|
-
consoleId:
|
|
22
|
+
var we = "default", M = s(function() {
|
|
23
|
+
let { parserId: s, consoleId: M } = se(), N = ee(), { t: P } = ye(), Te = M || we, { hasPermission: Ee, isLoading: De } = f(), Oe = Ee(n.PARSER_READ), [F, I] = u(!1), [ke, L] = u(!1), [Ae, R] = u(!1), [z, B] = u(!1), [je, V] = u(!1), [H, U] = u(null), W = e((e) => s ? e.parsers.get(s) : void 0), { loading: Me, error: G, fetchParser: K, deleteParser: q, executeParser: J } = t({
|
|
24
|
+
consoleId: Te,
|
|
24
25
|
skipFetch: !0
|
|
25
|
-
}), { dataSinks:
|
|
26
|
+
}), { dataSinks: Ne, fetchDataSinks: Y } = te({ skipFetch: !0 });
|
|
26
27
|
l(() => {
|
|
27
28
|
s && K(s);
|
|
28
29
|
}, [s, K]), l(() => {
|
|
29
30
|
Y();
|
|
30
31
|
}, [Y]);
|
|
31
|
-
let X = W?.inputSinkKey ?
|
|
32
|
+
let X = W?.inputSinkKey ? Ne.find((e) => e.key === W.inputSinkKey) : null, Z = c(() => {
|
|
32
33
|
N(M ? `/dashboards/${M}/parsers` : "/parsers");
|
|
33
34
|
}, [N, M]), Q = c(() => {
|
|
34
35
|
N(M ? `/dashboards/${M}/parsers/${s}/edit` : `/parsers/${s}/edit`);
|
|
@@ -36,15 +37,15 @@ var Ce = "default", M = s(function() {
|
|
|
36
37
|
N,
|
|
37
38
|
s,
|
|
38
39
|
M
|
|
39
|
-
]),
|
|
40
|
+
]), Pe = c(async () => {
|
|
40
41
|
if (s) {
|
|
41
|
-
|
|
42
|
+
I(!0);
|
|
42
43
|
try {
|
|
43
44
|
await q(s) ? (a() && o("success"), N(M ? `/dashboards/${M}/parsers` : "/parsers")) : a() && o("error");
|
|
44
45
|
} catch {
|
|
45
46
|
a() && o("error");
|
|
46
47
|
} finally {
|
|
47
|
-
|
|
48
|
+
I(!1), L(!1);
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
51
|
}, [
|
|
@@ -52,11 +53,11 @@ var Ce = "default", M = s(function() {
|
|
|
52
53
|
q,
|
|
53
54
|
N,
|
|
54
55
|
M
|
|
55
|
-
]),
|
|
56
|
+
]), Fe = c(async () => {
|
|
56
57
|
if (W?.expression) try {
|
|
57
|
-
await ne(W.expression), R(!0), a() && ie("Expression copied"), setTimeout(() => R(!1), 2e3);
|
|
58
|
+
await ne(W.expression), R(!0), a() && ie(P("bigconsole.parsers.view.expressionCopied", "Expression copied")), setTimeout(() => R(!1), 2e3);
|
|
58
59
|
} catch {}
|
|
59
|
-
}, [W?.expression]), $ = c(async () => {
|
|
60
|
+
}, [W?.expression, P]), $ = c(async () => {
|
|
60
61
|
if (s) {
|
|
61
62
|
B(!0), U(null);
|
|
62
63
|
try {
|
|
@@ -71,32 +72,36 @@ var Ce = "default", M = s(function() {
|
|
|
71
72
|
U({
|
|
72
73
|
success: !1,
|
|
73
74
|
output: null,
|
|
74
|
-
error: e instanceof Error ? e.message : "Execution failed",
|
|
75
|
+
error: e instanceof Error ? e.message : P("bigconsole.parsers.view.executionFailed", "Execution failed"),
|
|
75
76
|
executionTimeMs: 0
|
|
76
77
|
});
|
|
77
78
|
} finally {
|
|
78
79
|
B(!1);
|
|
79
80
|
}
|
|
80
81
|
}
|
|
81
|
-
}, [
|
|
82
|
+
}, [
|
|
83
|
+
s,
|
|
84
|
+
J,
|
|
85
|
+
P
|
|
86
|
+
]), Ie = c(() => {
|
|
82
87
|
X && N(`/datasinks/${X.id}`);
|
|
83
|
-
}, [N, X]),
|
|
88
|
+
}, [N, X]), Le = c(() => {
|
|
84
89
|
V(!0);
|
|
85
|
-
}, []),
|
|
90
|
+
}, []), Re = c(() => {
|
|
86
91
|
V(!1);
|
|
87
92
|
}, []);
|
|
88
|
-
return
|
|
93
|
+
return Me && !W || De ? /* @__PURE__ */ k("div", {
|
|
89
94
|
className: "flex items-center justify-center min-h-[400px]",
|
|
90
95
|
children: /* @__PURE__ */ k(m, { className: "w-8 h-8 text-text-secondary animate-spin" })
|
|
91
|
-
}) :
|
|
96
|
+
}) : Oe ? G ? /* @__PURE__ */ k("div", {
|
|
92
97
|
className: "flex items-center justify-center min-h-[400px] p-card-padding",
|
|
93
98
|
children: /* @__PURE__ */ A("div", {
|
|
94
99
|
className: "text-center",
|
|
95
100
|
children: [
|
|
96
|
-
/* @__PURE__ */ k(
|
|
101
|
+
/* @__PURE__ */ k(le, { className: "w-12 h-12 text-status-error-text mx-auto mb-4" }),
|
|
97
102
|
/* @__PURE__ */ k("p", {
|
|
98
103
|
className: "text-status-error-text text-body-sm font-medium mb-2",
|
|
99
|
-
children: "Failed to load Parser"
|
|
104
|
+
children: P("bigconsole.parsers.errors.viewLoadFailed", "Failed to load Parser")
|
|
100
105
|
}),
|
|
101
106
|
/* @__PURE__ */ k("p", {
|
|
102
107
|
className: "text-text-tertiary text-body-xs mb-6",
|
|
@@ -106,7 +111,7 @@ var Ce = "default", M = s(function() {
|
|
|
106
111
|
onClick: Z,
|
|
107
112
|
variant: "ghost",
|
|
108
113
|
size: "sm",
|
|
109
|
-
children: [/* @__PURE__ */ k(
|
|
114
|
+
children: [/* @__PURE__ */ k(p, { className: "w-4 h-4 mr-2" }), P("bigconsole.parsers.actions.goBack", "Go back")]
|
|
110
115
|
})
|
|
111
116
|
]
|
|
112
117
|
})
|
|
@@ -123,14 +128,14 @@ var Ce = "default", M = s(function() {
|
|
|
123
128
|
variant: "ghost",
|
|
124
129
|
size: "sm",
|
|
125
130
|
className: "mb-4",
|
|
126
|
-
children: [/* @__PURE__ */ k(
|
|
131
|
+
children: [/* @__PURE__ */ k(p, { className: "w-4 h-4 mr-2" }), P("bigconsole.parsers.view.backToParsers", "Back to Parsers")]
|
|
127
132
|
}),
|
|
128
133
|
/* @__PURE__ */ A("div", {
|
|
129
134
|
className: "flex items-center gap-2 flex-wrap",
|
|
130
135
|
children: [
|
|
131
136
|
/* @__PURE__ */ k("h1", {
|
|
132
137
|
className: "text-heading-h1 font-bold text-text-primary",
|
|
133
|
-
children: W.name || "Untitled"
|
|
138
|
+
children: W.name || P("bigconsole.parsers.view.untitled", "Untitled")
|
|
134
139
|
}),
|
|
135
140
|
/* @__PURE__ */ k(r, { type: W.type }),
|
|
136
141
|
/* @__PURE__ */ k(i, { status: W.status })
|
|
@@ -152,14 +157,14 @@ var Ce = "default", M = s(function() {
|
|
|
152
157
|
disabled: z,
|
|
153
158
|
variant: "secondary",
|
|
154
159
|
size: "default",
|
|
155
|
-
children: [/* @__PURE__ */ k(h, { className: "w-4 h-4 mr-2" }), z ? "Running..." : "Execute"]
|
|
160
|
+
children: [/* @__PURE__ */ k(h, { className: "w-4 h-4 mr-2" }), z ? P("bigconsole.parsers.view.running", "Running...") : P("bigconsole.parsers.actions.execute", "Execute")]
|
|
156
161
|
})
|
|
157
162
|
}),
|
|
158
163
|
/* @__PURE__ */ A(_, {
|
|
159
|
-
onClick:
|
|
164
|
+
onClick: Le,
|
|
160
165
|
variant: "secondary",
|
|
161
166
|
size: "default",
|
|
162
|
-
children: [/* @__PURE__ */ k(
|
|
167
|
+
children: [/* @__PURE__ */ k(he, { className: "w-4 h-4 mr-2" }), P("bigconsole.parsers.actions.export", "Export")]
|
|
163
168
|
}),
|
|
164
169
|
/* @__PURE__ */ k(d, {
|
|
165
170
|
permission: n.PARSER_UPDATE,
|
|
@@ -168,43 +173,43 @@ var Ce = "default", M = s(function() {
|
|
|
168
173
|
onClick: Q,
|
|
169
174
|
variant: "secondary",
|
|
170
175
|
size: "default",
|
|
171
|
-
children: [/* @__PURE__ */ k(
|
|
176
|
+
children: [/* @__PURE__ */ k(ge, { className: "w-4 h-4 mr-2" }), P("bigconsole.parsers.actions.edit", "Edit")]
|
|
172
177
|
})
|
|
173
178
|
}),
|
|
174
179
|
/* @__PURE__ */ k(d, {
|
|
175
180
|
permission: n.PARSER_DELETE,
|
|
176
181
|
deniedBehavior: "hide",
|
|
177
182
|
children: /* @__PURE__ */ A(_, {
|
|
178
|
-
onClick: () =>
|
|
179
|
-
disabled:
|
|
183
|
+
onClick: () => L(!0),
|
|
184
|
+
disabled: F,
|
|
180
185
|
variant: "destructive",
|
|
181
186
|
size: "default",
|
|
182
|
-
children: [/* @__PURE__ */ k(ve, { className: "w-4 h-4 mr-2" }), "Delete"]
|
|
187
|
+
children: [/* @__PURE__ */ k(ve, { className: "w-4 h-4 mr-2" }), P("bigconsole.parsers.actions.delete", "Delete")]
|
|
183
188
|
})
|
|
184
189
|
})
|
|
185
190
|
]
|
|
186
191
|
})]
|
|
187
192
|
}),
|
|
188
|
-
/* @__PURE__ */ k(D, { children: "A parser turns raw input into structured fields using its expression. Review or copy the expression, run it against a sample to see the output, then edit it or use it inside a pipeline to shape incoming data." }),
|
|
193
|
+
/* @__PURE__ */ k(D, { children: P("bigconsole.parsers.view.purpose", "A parser turns raw input into structured fields using its expression. Review or copy the expression, run it against a sample to see the output, then edit it or use it inside a pipeline to shape incoming data.") }),
|
|
189
194
|
/* @__PURE__ */ k(E, {
|
|
190
195
|
storageKey: "bigconsole-parser-view",
|
|
191
196
|
steps: [
|
|
192
197
|
{
|
|
193
198
|
id: "execute",
|
|
194
|
-
label: "Run a test execution",
|
|
195
|
-
description: "Check the expression produces the fields you expect.",
|
|
199
|
+
label: P("bigconsole.parsers.view.nextSteps.executeLabel", "Run a test execution"),
|
|
200
|
+
description: P("bigconsole.parsers.view.nextSteps.executeDescription", "Check the expression produces the fields you expect."),
|
|
196
201
|
onClick: $
|
|
197
202
|
},
|
|
198
203
|
{
|
|
199
204
|
id: "edit",
|
|
200
|
-
label: "Edit the expression",
|
|
201
|
-
description: "Refine how this parser maps your input.",
|
|
205
|
+
label: P("bigconsole.parsers.view.nextSteps.editLabel", "Edit the expression"),
|
|
206
|
+
description: P("bigconsole.parsers.view.nextSteps.editDescription", "Refine how this parser maps your input."),
|
|
202
207
|
onClick: Q
|
|
203
208
|
},
|
|
204
209
|
{
|
|
205
210
|
id: "pipeline",
|
|
206
|
-
label: "Use it in a pipeline",
|
|
207
|
-
description: "Chain this parser with a data sink to process data end to end.",
|
|
211
|
+
label: P("bigconsole.parsers.view.nextSteps.pipelineLabel", "Use it in a pipeline"),
|
|
212
|
+
description: P("bigconsole.parsers.view.nextSteps.pipelineDescription", "Chain this parser with a data sink to process data end to end."),
|
|
208
213
|
onClick: () => N("/pipelines")
|
|
209
214
|
}
|
|
210
215
|
]
|
|
@@ -221,8 +226,8 @@ var Ce = "default", M = s(function() {
|
|
|
221
226
|
children: [/* @__PURE__ */ A(x, {
|
|
222
227
|
className: "flex items-center gap-2",
|
|
223
228
|
children: [
|
|
224
|
-
/* @__PURE__ */ k(
|
|
225
|
-
"Expression",
|
|
229
|
+
/* @__PURE__ */ k(_e, { className: "w-4 h-4 text-text-secondary" }),
|
|
230
|
+
P("bigconsole.parsers.view.expression", "Expression"),
|
|
226
231
|
/* @__PURE__ */ k(g, {
|
|
227
232
|
variant: "secondary",
|
|
228
233
|
className: "text-xs uppercase",
|
|
@@ -230,10 +235,10 @@ var Ce = "default", M = s(function() {
|
|
|
230
235
|
})
|
|
231
236
|
]
|
|
232
237
|
}), /* @__PURE__ */ k(_, {
|
|
233
|
-
onClick:
|
|
238
|
+
onClick: Fe,
|
|
234
239
|
variant: "ghost",
|
|
235
240
|
size: "sm",
|
|
236
|
-
children:
|
|
241
|
+
children: Ae ? /* @__PURE__ */ A(O, { children: [/* @__PURE__ */ k(fe, { className: "w-3.5 h-3.5 text-status-success-text mr-2" }), P("bigconsole.parsers.view.copied", "Copied!")] }) : /* @__PURE__ */ A(O, { children: [/* @__PURE__ */ k(pe, { className: "w-3.5 h-3.5 mr-2" }), P("bigconsole.parsers.actions.copy", "Copy")] })
|
|
237
242
|
})]
|
|
238
243
|
}), /* @__PURE__ */ k(y, { children: /* @__PURE__ */ k(ae, {
|
|
239
244
|
value: W.expression,
|
|
@@ -245,9 +250,9 @@ var Ce = "default", M = s(function() {
|
|
|
245
250
|
className: "flex flex-row items-center justify-between space-y-0",
|
|
246
251
|
children: [/* @__PURE__ */ A(x, {
|
|
247
252
|
className: "flex items-center gap-2",
|
|
248
|
-
children: ["Execution Result", /* @__PURE__ */ k(g, {
|
|
253
|
+
children: [P("bigconsole.parsers.view.executionResult", "Execution Result"), /* @__PURE__ */ k(g, {
|
|
249
254
|
variant: H.success ? "default" : "destructive",
|
|
250
|
-
children: H.success ? "Success" : "Failed"
|
|
255
|
+
children: H.success ? P("bigconsole.parsers.view.success", "Success") : P("bigconsole.parsers.view.failed", "Failed")
|
|
251
256
|
})]
|
|
252
257
|
}), /* @__PURE__ */ A(g, {
|
|
253
258
|
variant: "secondary",
|
|
@@ -267,77 +272,73 @@ var Ce = "default", M = s(function() {
|
|
|
267
272
|
}), /* @__PURE__ */ A("div", {
|
|
268
273
|
className: "space-y-6",
|
|
269
274
|
children: [
|
|
270
|
-
/* @__PURE__ */ A(v, { children: [/* @__PURE__ */ k(b, { children: /* @__PURE__ */ k(x, { children: "Data Flow" }) }), /* @__PURE__ */ k(y, { children: /* @__PURE__ */ A("div", {
|
|
275
|
+
/* @__PURE__ */ A(v, { children: [/* @__PURE__ */ k(b, { children: /* @__PURE__ */ k(x, { children: P("bigconsole.parsers.view.dataFlow", "Data Flow") }) }), /* @__PURE__ */ k(y, { children: /* @__PURE__ */ A("div", {
|
|
271
276
|
className: "space-y-3",
|
|
272
277
|
children: [
|
|
273
278
|
/* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("label", {
|
|
274
279
|
className: "text-xs font-medium text-text-secondary",
|
|
275
|
-
children: "Source DataSink"
|
|
280
|
+
children: P("bigconsole.parsers.view.sourceDataSink", "Source DataSink")
|
|
276
281
|
}), W.inputSinkKey ? /* @__PURE__ */ A("div", {
|
|
277
282
|
className: "mt-1",
|
|
278
283
|
children: [/* @__PURE__ */ k("p", {
|
|
279
284
|
className: "text-body-sm text-text-primary font-mono",
|
|
280
285
|
children: W.inputSinkKey
|
|
281
286
|
}), X && /* @__PURE__ */ A(_, {
|
|
282
|
-
onClick:
|
|
287
|
+
onClick: Ie,
|
|
283
288
|
variant: "link",
|
|
284
289
|
size: "sm",
|
|
285
290
|
className: "mt-1 p-0 h-auto",
|
|
286
|
-
children: [
|
|
287
|
-
/* @__PURE__ */ k(he, { className: "w-3 h-3 mr-1" }),
|
|
288
|
-
"View ",
|
|
289
|
-
X.name || "DataSink"
|
|
290
|
-
]
|
|
291
|
+
children: [/* @__PURE__ */ k(me, { className: "w-3 h-3 mr-1" }), P("bigconsole.parsers.view.viewDataSink", "View {{name}}", { name: X.name || P("bigconsole.parsers.view.dataSinkFallback", "DataSink") })]
|
|
291
292
|
})]
|
|
292
293
|
}) : /* @__PURE__ */ k("p", {
|
|
293
294
|
className: "text-body-sm text-text-tertiary mt-1",
|
|
294
|
-
children: "None configured"
|
|
295
|
+
children: P("bigconsole.parsers.view.noneConfigured", "None configured")
|
|
295
296
|
})] }),
|
|
296
297
|
/* @__PURE__ */ k("div", {
|
|
297
298
|
className: "flex items-center justify-center py-1",
|
|
298
|
-
children: /* @__PURE__ */ k(
|
|
299
|
+
children: /* @__PURE__ */ k(de, { className: "w-4 h-4 text-text-tertiary" })
|
|
299
300
|
}),
|
|
300
301
|
/* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("label", {
|
|
301
302
|
className: "text-xs font-medium text-text-secondary",
|
|
302
|
-
children: "Output Key"
|
|
303
|
+
children: P("bigconsole.parsers.view.outputKey", "Output Key")
|
|
303
304
|
}), /* @__PURE__ */ k("p", {
|
|
304
305
|
className: "text-body-sm text-text-primary font-mono mt-1",
|
|
305
|
-
children: W.outputKey || "Not configured"
|
|
306
|
+
children: W.outputKey || P("bigconsole.parsers.view.notConfigured", "Not configured")
|
|
306
307
|
})] })
|
|
307
308
|
]
|
|
308
309
|
}) })] }),
|
|
309
|
-
/* @__PURE__ */ A(v, { children: [/* @__PURE__ */ k(b, { children: /* @__PURE__ */ k(x, { children: "Configuration" }) }), /* @__PURE__ */ k(y, { children: /* @__PURE__ */ A("dl", {
|
|
310
|
+
/* @__PURE__ */ A(v, { children: [/* @__PURE__ */ k(b, { children: /* @__PURE__ */ k(x, { children: P("bigconsole.parsers.view.configuration", "Configuration") }) }), /* @__PURE__ */ k(y, { children: /* @__PURE__ */ A("dl", {
|
|
310
311
|
className: "space-y-4 text-body-sm",
|
|
311
312
|
children: [
|
|
312
313
|
/* @__PURE__ */ A("div", {
|
|
313
314
|
className: "flex justify-between items-center",
|
|
314
315
|
children: [/* @__PURE__ */ k("dt", {
|
|
315
316
|
className: "text-text-secondary",
|
|
316
|
-
children: "Status"
|
|
317
|
+
children: P("bigconsole.parsers.view.status", "Status")
|
|
317
318
|
}), /* @__PURE__ */ k("dd", { children: /* @__PURE__ */ k(i, { status: W.status }) })]
|
|
318
319
|
}),
|
|
319
320
|
/* @__PURE__ */ A("div", {
|
|
320
321
|
className: "flex justify-between items-center",
|
|
321
322
|
children: [/* @__PURE__ */ k("dt", {
|
|
322
323
|
className: "text-text-secondary",
|
|
323
|
-
children: "Type"
|
|
324
|
+
children: P("bigconsole.parsers.view.type", "Type")
|
|
324
325
|
}), /* @__PURE__ */ k("dd", { children: /* @__PURE__ */ k(r, { type: W.type }) })]
|
|
325
326
|
}),
|
|
326
327
|
/* @__PURE__ */ A("div", {
|
|
327
328
|
className: "flex justify-between items-center",
|
|
328
329
|
children: [/* @__PURE__ */ k("dt", {
|
|
329
330
|
className: "text-text-secondary",
|
|
330
|
-
children: "Cache TTL"
|
|
331
|
+
children: P("bigconsole.parsers.view.cacheTtl", "Cache TTL")
|
|
331
332
|
}), /* @__PURE__ */ k("dd", {
|
|
332
333
|
className: "text-text-primary font-medium",
|
|
333
|
-
children: W.ttl ?
|
|
334
|
+
children: W.ttl ? P("bigconsole.parsers.view.ttlSeconds", "{{ttl}}s", { ttl: W.ttl }) : P("bigconsole.parsers.view.noCaching", "No caching")
|
|
334
335
|
})]
|
|
335
336
|
}),
|
|
336
337
|
/* @__PURE__ */ A("div", {
|
|
337
338
|
className: "flex justify-between items-center",
|
|
338
339
|
children: [/* @__PURE__ */ k("dt", {
|
|
339
340
|
className: "text-text-secondary",
|
|
340
|
-
children: "Version"
|
|
341
|
+
children: P("bigconsole.parsers.view.version", "Version")
|
|
341
342
|
}), /* @__PURE__ */ k("dd", {
|
|
342
343
|
className: "text-text-primary font-medium",
|
|
343
344
|
children: W.version || 1
|
|
@@ -345,84 +346,85 @@ var Ce = "default", M = s(function() {
|
|
|
345
346
|
})
|
|
346
347
|
]
|
|
347
348
|
}) })] }),
|
|
348
|
-
/* @__PURE__ */ A(v, { children: [/* @__PURE__ */ k(b, { children: /* @__PURE__ */ k(x, { children: "Timestamps" }) }), /* @__PURE__ */ k(y, { children: /* @__PURE__ */ A("dl", {
|
|
349
|
+
/* @__PURE__ */ A(v, { children: [/* @__PURE__ */ k(b, { children: /* @__PURE__ */ k(x, { children: P("bigconsole.parsers.view.timestamps", "Timestamps") }) }), /* @__PURE__ */ k(y, { children: /* @__PURE__ */ A("dl", {
|
|
349
350
|
className: "space-y-4 text-body-sm",
|
|
350
351
|
children: [/* @__PURE__ */ A("div", {
|
|
351
352
|
className: "flex justify-between items-center",
|
|
352
353
|
children: [/* @__PURE__ */ k("dt", {
|
|
353
354
|
className: "text-text-secondary",
|
|
354
|
-
children: "Created"
|
|
355
|
+
children: P("bigconsole.parsers.view.created", "Created")
|
|
355
356
|
}), /* @__PURE__ */ k("dd", {
|
|
356
357
|
className: "text-text-primary font-medium",
|
|
357
|
-
children: W.createdAt ? j(new Date(W.createdAt), { addSuffix: !0 }) : "Unknown"
|
|
358
|
+
children: W.createdAt ? j(new Date(W.createdAt), { addSuffix: !0 }) : P("bigconsole.parsers.view.unknown", "Unknown")
|
|
358
359
|
})]
|
|
359
360
|
}), /* @__PURE__ */ A("div", {
|
|
360
361
|
className: "flex justify-between items-center",
|
|
361
362
|
children: [/* @__PURE__ */ k("dt", {
|
|
362
363
|
className: "text-text-secondary",
|
|
363
|
-
children: "Updated"
|
|
364
|
+
children: P("bigconsole.parsers.view.updated", "Updated")
|
|
364
365
|
}), /* @__PURE__ */ k("dd", {
|
|
365
366
|
className: "text-text-primary font-medium",
|
|
366
|
-
children: W.updatedAt ? j(new Date(W.updatedAt), { addSuffix: !0 }) : "Unknown"
|
|
367
|
+
children: W.updatedAt ? j(new Date(W.updatedAt), { addSuffix: !0 }) : P("bigconsole.parsers.view.unknown", "Unknown")
|
|
367
368
|
})]
|
|
368
369
|
})]
|
|
369
370
|
}) })] })
|
|
370
371
|
]
|
|
371
372
|
})]
|
|
372
373
|
}),
|
|
373
|
-
/* @__PURE__ */ k(
|
|
374
|
-
open:
|
|
375
|
-
onOpenChange:
|
|
376
|
-
children: /* @__PURE__ */ A(
|
|
377
|
-
/* @__PURE__ */ A(S, { children: [/* @__PURE__ */ k(C, { children: "Delete Parser" }), /* @__PURE__ */ A(
|
|
378
|
-
"Are you sure you want to delete
|
|
374
|
+
/* @__PURE__ */ k(be, {
|
|
375
|
+
open: ke,
|
|
376
|
+
onOpenChange: L,
|
|
377
|
+
children: /* @__PURE__ */ A(xe, { children: [
|
|
378
|
+
/* @__PURE__ */ A(S, { children: [/* @__PURE__ */ k(C, { children: P("bigconsole.parsers.view.deleteDialogTitle", "Delete Parser") }), /* @__PURE__ */ A(Se, { children: [
|
|
379
|
+
P("bigconsole.parsers.view.deleteConfirmPrefix", "Are you sure you want to delete"),
|
|
380
|
+
" ",
|
|
379
381
|
/* @__PURE__ */ k("strong", { children: W.name }),
|
|
380
|
-
"? This action cannot be undone."
|
|
382
|
+
P("bigconsole.parsers.view.deleteConfirmSuffix", "? This action cannot be undone.")
|
|
381
383
|
] })] }),
|
|
382
384
|
/* @__PURE__ */ A("div", {
|
|
383
385
|
className: "bg-status-warning-bg/10 border border-status-warning-border/20 rounded-md p-4 flex items-start gap-2",
|
|
384
|
-
children: [/* @__PURE__ */ k(
|
|
386
|
+
children: [/* @__PURE__ */ k(ue, { className: "w-4 h-4 text-status-warning-text flex-shrink-0 mt-0.5" }), /* @__PURE__ */ k("p", {
|
|
385
387
|
className: "text-body-xs text-status-warning-text",
|
|
386
|
-
children: "Widgets and pipelines using this parser may stop working correctly after deletion."
|
|
388
|
+
children: P("bigconsole.parsers.view.deleteWarning", "Widgets and pipelines using this parser may stop working correctly after deletion.")
|
|
387
389
|
})]
|
|
388
390
|
}),
|
|
389
|
-
/* @__PURE__ */ A(
|
|
390
|
-
onClick: () =>
|
|
391
|
+
/* @__PURE__ */ A(Ce, { children: [/* @__PURE__ */ k(_, {
|
|
392
|
+
onClick: () => L(!1),
|
|
391
393
|
variant: "secondary",
|
|
392
|
-
children: "Cancel"
|
|
394
|
+
children: P("bigconsole.parsers.actions.cancel", "Cancel")
|
|
393
395
|
}), /* @__PURE__ */ k(_, {
|
|
394
396
|
onClick: () => {
|
|
395
|
-
re("medium"),
|
|
397
|
+
re("medium"), Pe();
|
|
396
398
|
},
|
|
397
|
-
disabled:
|
|
399
|
+
disabled: F,
|
|
398
400
|
variant: "destructive",
|
|
399
|
-
children:
|
|
401
|
+
children: F ? P("bigconsole.parsers.view.deleting", "Deleting...") : P("bigconsole.parsers.view.deleteDialogTitle", "Delete Parser")
|
|
400
402
|
})] })
|
|
401
403
|
] })
|
|
402
404
|
}),
|
|
403
405
|
/* @__PURE__ */ k(oe, {
|
|
404
|
-
isOpen:
|
|
406
|
+
isOpen: je,
|
|
405
407
|
parserId: s || null,
|
|
406
408
|
parserName: W.name,
|
|
407
|
-
onClose:
|
|
409
|
+
onClose: Re
|
|
408
410
|
})
|
|
409
411
|
]
|
|
410
412
|
}) : /* @__PURE__ */ k("div", {
|
|
411
413
|
className: "flex items-center justify-center min-h-[400px] p-card-padding",
|
|
412
414
|
children: /* @__PURE__ */ k(T, {
|
|
413
415
|
illustration: "empty-data",
|
|
414
|
-
title: "Parser not found",
|
|
415
|
-
description: "The Parser you're looking for doesn't exist or has been deleted.",
|
|
416
|
+
title: P("bigconsole.parsers.view.notFoundTitle", "Parser not found"),
|
|
417
|
+
description: P("bigconsole.parsers.view.notFoundDescription", "The Parser you're looking for doesn't exist or has been deleted."),
|
|
416
418
|
action: /* @__PURE__ */ A(_, {
|
|
417
419
|
onClick: Z,
|
|
418
420
|
variant: "default",
|
|
419
421
|
size: "default",
|
|
420
|
-
children: [/* @__PURE__ */ k(
|
|
422
|
+
children: [/* @__PURE__ */ k(p, { className: "w-4 h-4 mr-2" }), P("bigconsole.parsers.actions.goBackToParsers", "Go back to Parsers")]
|
|
421
423
|
})
|
|
422
424
|
})
|
|
423
425
|
}) : /* @__PURE__ */ k(ce, {
|
|
424
|
-
title: "Access Denied",
|
|
425
|
-
description: "You don't have permission to view this parser."
|
|
426
|
+
title: P("bigconsole.parsers.accessDenied.title", "Access Denied"),
|
|
427
|
+
description: P("bigconsole.parsers.accessDenied.view", "You don't have permission to view this parser.")
|
|
426
428
|
});
|
|
427
429
|
});
|
|
428
430
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ParserViewPage.js","names":[],"sources":["../../../src/bigconsole/pages/ParserViewPage.tsx"],"sourcesContent":["/**\n * Parser View Page\n *\n * Page for viewing Parser details, expression, and test execution.\n */\n\nimport { memo, useState, useEffect, useCallback } from 'react';\nimport { useParams } from 'react-router';\nimport { useAppNavigate } from '../contexts';\nimport { isNative, nativeCopyText, nativeImpact, nativeNotify, nativeToast } from '../../utils/nativeBridge';\nimport { formatDistanceToNow } from 'date-fns';\nimport { useParserOperations } from '../hooks/useParserOperations';\nimport { useParserStore } from '../store/parserStore';\nimport { useDataSinkOperations } from '../hooks/useDataSinkOperations';\nimport { ParserStatusBadge } from '../components/parser/ParserStatusBadge';\nimport { ParserTypeBadge } from '../components/parser/ParserTypeBadge';\nimport { ExpressionEditor } from '../components/parser/ExpressionEditor';\nimport { ExportParserDialog } from '../components/parser/ExportParserDialog';\n\n// RBAC\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { AccessDenied, PermissionButton } from '@burdenoff/fe-libs/shared/components';\nimport { BIGCONSOLE_PERMISSIONS } from '../../constants/permissions';\n\n// fe-libs UI components\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { Badge } from '@burdenoff/fe-libs/ui';\nimport { GlassCard, IllustratedEmptyState, PagePurpose, NextSteps } from '@burdenoff/fe-libs/ui';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@burdenoff/fe-libs/ui';\n\n// Lucide icons\nimport {\n ArrowLeft,\n Edit,\n Play,\n Trash2,\n Copy,\n Check,\n FileCode2,\n Database,\n ArrowDown,\n Loader2,\n AlertCircle,\n AlertTriangle,\n Download,\n} from 'lucide-react';\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n// Default console ID for standalone parser viewing\nconst DEFAULT_CONSOLE_ID = 'default';\n\nexport const ParserViewPage = memo(function ParserViewPage() {\n const { parserId, consoleId: urlConsoleId } = useParams<{ parserId: string; consoleId?: string }>();\n const navigate = useAppNavigate();\n\n // Use URL consoleId or fall back to default\n const consoleId = urlConsoleId || DEFAULT_CONSOLE_ID;\n\n // Permissions\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canRead = hasPermission(BIGCONSOLE_PERMISSIONS.PARSER_READ);\n\n // Local state\n const [isDeleting, setIsDeleting] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [expressionCopied, setExpressionCopied] = useState(false);\n const [isTesting, setIsTesting] = useState(false);\n const [isExportDialogOpen, setIsExportDialogOpen] = useState(false);\n const [testResult, setTestResult] = useState<{\n success: boolean;\n output: unknown;\n error: string | null;\n executionTimeMs: number;\n } | null>(null);\n\n // Store\n const parser = useParserStore((state) => (parserId ? state.parsers.get(parserId) : undefined));\n\n // Operations - use consoleId from URL or default\n const { loading, error, fetchParser, deleteParser, executeParser } = useParserOperations({\n consoleId,\n skipFetch: true,\n });\n\n // DataSink operations for source datasink info\n const { dataSinks, fetchDataSinks } = useDataSinkOperations({ skipFetch: true });\n\n // Load parser on mount - always fetch full data to get expression\n useEffect(() => {\n if (parserId) {\n fetchParser(parserId);\n }\n }, [parserId, fetchParser]);\n\n // Fetch datasinks to show source name\n useEffect(() => {\n fetchDataSinks();\n }, [fetchDataSinks]);\n\n // Get source datasink name\n const sourceDataSink = parser?.inputSinkKey ? dataSinks.find((ds) => ds.key === parser.inputSinkKey) : null;\n\n // Handle back navigation\n const handleBack = useCallback(() => {\n // Navigate to dashboard-scoped parsers list if consoleId is provided\n if (urlConsoleId) {\n navigate(`/dashboards/${urlConsoleId}/parsers`);\n } else {\n navigate(`/parsers`);\n }\n }, [navigate, urlConsoleId]);\n\n // Handle edit\n const handleEdit = useCallback(() => {\n // Navigate to dashboard-scoped parser edit if consoleId is provided\n if (urlConsoleId) {\n navigate(`/dashboards/${urlConsoleId}/parsers/${parserId}/edit`);\n } else {\n navigate(`/parsers/${parserId}/edit`);\n }\n }, [navigate, parserId, urlConsoleId]);\n\n // Handle delete\n const handleDelete = useCallback(async () => {\n if (!parserId) return;\n setIsDeleting(true);\n try {\n const success = await deleteParser(parserId);\n if (success) {\n if (isNative()) void nativeNotify('success');\n // Navigate to dashboard-scoped parsers list if consoleId is provided\n if (urlConsoleId) {\n navigate(`/dashboards/${urlConsoleId}/parsers`);\n } else {\n navigate(`/parsers`);\n }\n } else if (isNative()) {\n void nativeNotify('error');\n }\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n } finally {\n setIsDeleting(false);\n setShowDeleteConfirm(false);\n }\n }, [parserId, deleteParser, navigate, urlConsoleId]);\n\n // Handle copy expression\n const handleCopyExpression = useCallback(async () => {\n if (!parser?.expression) return;\n try {\n await nativeCopyText(parser.expression);\n setExpressionCopied(true);\n if (isNative()) void nativeToast('Expression copied');\n setTimeout(() => setExpressionCopied(false), 2000);\n } catch (err) {}\n }, [parser?.expression]);\n\n // Handle test execution\n const handleTestExecute = useCallback(async () => {\n if (!parserId) return;\n setIsTesting(true);\n setTestResult(null);\n try {\n const result = await executeParser(parserId);\n if (result) {\n setTestResult({\n success: result.success,\n output: result.output,\n error: result.error,\n executionTimeMs: result.executionTimeMs,\n });\n }\n } catch (err) {\n setTestResult({\n success: false,\n output: null,\n error: err instanceof Error ? err.message : 'Execution failed',\n executionTimeMs: 0,\n });\n } finally {\n setIsTesting(false);\n }\n }, [parserId, executeParser]);\n\n // Navigate to source datasink\n const handleViewSourceDataSink = useCallback(() => {\n if (sourceDataSink) {\n navigate(`/datasinks/${sourceDataSink.id}`);\n }\n }, [navigate, sourceDataSink]);\n\n // Handle export\n const handleExport = useCallback(() => {\n setIsExportDialogOpen(true);\n }, []);\n\n const handleExportClose = useCallback(() => {\n setIsExportDialogOpen(false);\n }, []);\n\n // Loading state (wait for both the parser fetch and the permission load)\n if ((loading && !parser) || permissionsLoading) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <Loader2 className=\"w-8 h-8 text-text-secondary animate-spin\" />\n </div>\n );\n }\n\n // Read gate — no permission to view this parser\n if (!canRead) {\n return <AccessDenied title=\"Access Denied\" description=\"You don't have permission to view this parser.\" />;\n }\n\n // Error state\n if (error) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px] p-card-padding\">\n <div className=\"text-center\">\n <AlertCircle className=\"w-12 h-12 text-status-error-text mx-auto mb-4\" />\n <p className=\"text-status-error-text text-body-sm font-medium mb-2\">Failed to load Parser</p>\n <p className=\"text-text-tertiary text-body-xs mb-6\">{error.message}</p>\n <Button onClick={handleBack} variant=\"ghost\" size=\"sm\">\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n Go back\n </Button>\n </div>\n </div>\n );\n }\n\n // Not found state\n if (!parser) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px] p-card-padding\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"Parser not found\"\n description=\"The Parser you're looking for doesn't exist or has been deleted.\"\n action={\n <Button onClick={handleBack} variant=\"default\" size=\"default\">\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n Go back to Parsers\n </Button>\n }\n />\n </div>\n );\n }\n\n return (\n <div className=\"p-card-padding space-y-6\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4\">\n <div className=\"flex-1\">\n <Button onClick={handleBack} variant=\"ghost\" size=\"sm\" className=\"mb-4\">\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n Back to Parsers\n </Button>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h1 className=\"text-heading-h1 font-bold text-text-primary\">{parser.name || 'Untitled'}</h1>\n <ParserTypeBadge type={parser.type} />\n <ParserStatusBadge status={parser.status} />\n </div>\n {parser.description && <p className=\"text-body-sm text-text-secondary mt-2\">{parser.description}</p>}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.PARSER_EXECUTE} deniedBehavior=\"disable\">\n <Button onClick={handleTestExecute} disabled={isTesting} variant=\"secondary\" size=\"default\">\n <Play className=\"w-4 h-4 mr-2\" />\n {isTesting ? 'Running...' : 'Execute'}\n </Button>\n </PermissionButton>\n <Button onClick={handleExport} variant=\"secondary\" size=\"default\">\n <Download className=\"w-4 h-4 mr-2\" />\n Export\n </Button>\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.PARSER_UPDATE} deniedBehavior=\"disable\">\n <Button onClick={handleEdit} variant=\"secondary\" size=\"default\">\n <Edit className=\"w-4 h-4 mr-2\" />\n Edit\n </Button>\n </PermissionButton>\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.PARSER_DELETE} deniedBehavior=\"hide\">\n <Button\n onClick={() => setShowDeleteConfirm(true)}\n disabled={isDeleting}\n variant=\"destructive\"\n size=\"default\"\n >\n <Trash2 className=\"w-4 h-4 mr-2\" />\n Delete\n </Button>\n </PermissionButton>\n </div>\n </div>\n\n <PagePurpose>\n A parser turns raw input into structured fields using its expression. Review or copy the expression, run it\n against a sample to see the output, then edit it or use it inside a pipeline to shape incoming data.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"bigconsole-parser-view\"\n steps={[\n {\n id: 'execute',\n label: 'Run a test execution',\n description: 'Check the expression produces the fields you expect.',\n onClick: handleTestExecute,\n },\n {\n id: 'edit',\n label: 'Edit the expression',\n description: 'Refine how this parser maps your input.',\n onClick: handleEdit,\n },\n {\n id: 'pipeline',\n label: 'Use it in a pipeline',\n description: 'Chain this parser with a data sink to process data end to end.',\n onClick: () => navigate('/pipelines'),\n },\n ]}\n />\n\n {/* Main Content Grid */}\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Expression Panel (2/3 width) — primary emphasis zone */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Expression */}\n <GlassCard treatment=\"glass\" glow>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0\">\n <CardTitle className=\"flex items-center gap-2\">\n <FileCode2 className=\"w-4 h-4 text-text-secondary\" />\n Expression\n <Badge variant=\"secondary\" className=\"text-xs uppercase\">\n {parser.type}\n </Badge>\n </CardTitle>\n <Button onClick={handleCopyExpression} variant=\"ghost\" size=\"sm\">\n {expressionCopied ? (\n <>\n <Check className=\"w-3.5 h-3.5 text-status-success-text mr-2\" />\n Copied!\n </>\n ) : (\n <>\n <Copy className=\"w-3.5 h-3.5 mr-2\" />\n Copy\n </>\n )}\n </Button>\n </CardHeader>\n <CardContent>\n <ExpressionEditor value={parser.expression} type={parser.type} readOnly height=\"300px\" />\n </CardContent>\n </GlassCard>\n\n {/* Test Result Panel */}\n {testResult && (\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0\">\n <CardTitle className=\"flex items-center gap-2\">\n Execution Result\n <Badge variant={testResult.success ? 'default' : 'destructive'}>\n {testResult.success ? 'Success' : 'Failed'}\n </Badge>\n </CardTitle>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {testResult.executionTimeMs}ms\n </Badge>\n </CardHeader>\n <CardContent>\n {testResult.error ? (\n <div className=\"bg-status-error-bg/5 border border-status-error-border/20 rounded-md p-4\">\n <p className=\"text-body-sm text-status-error-text font-mono\">{testResult.error}</p>\n </div>\n ) : (\n <pre className=\"text-body-sm text-text-primary font-mono bg-bg-sunken rounded-md p-4 overflow-auto max-h-[300px]\">\n {JSON.stringify(testResult.output, null, 2)}\n </pre>\n )}\n </CardContent>\n </Card>\n )}\n </div>\n\n {/* Side Panel (1/3 width) */}\n <div className=\"space-y-6\">\n {/* Data Flow */}\n <Card>\n <CardHeader>\n <CardTitle>Data Flow</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {/* Source DataSink */}\n <div>\n <label className=\"text-xs font-medium text-text-secondary\">Source DataSink</label>\n {parser.inputSinkKey ? (\n <div className=\"mt-1\">\n <p className=\"text-body-sm text-text-primary font-mono\">{parser.inputSinkKey}</p>\n {sourceDataSink && (\n <Button onClick={handleViewSourceDataSink} variant=\"link\" size=\"sm\" className=\"mt-1 p-0 h-auto\">\n <Database className=\"w-3 h-3 mr-1\" />\n View {sourceDataSink.name || 'DataSink'}\n </Button>\n )}\n </div>\n ) : (\n <p className=\"text-body-sm text-text-tertiary mt-1\">None configured</p>\n )}\n </div>\n\n {/* Arrow */}\n <div className=\"flex items-center justify-center py-1\">\n <ArrowDown className=\"w-4 h-4 text-text-tertiary\" />\n </div>\n\n {/* Output Key */}\n <div>\n <label className=\"text-xs font-medium text-text-secondary\">Output Key</label>\n <p className=\"text-body-sm text-text-primary font-mono mt-1\">\n {parser.outputKey || 'Not configured'}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Configuration */}\n <Card>\n <CardHeader>\n <CardTitle>Configuration</CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"space-y-4 text-body-sm\">\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">Status</dt>\n <dd>\n <ParserStatusBadge status={parser.status} />\n </dd>\n </div>\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">Type</dt>\n <dd>\n <ParserTypeBadge type={parser.type} />\n </dd>\n </div>\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">Cache TTL</dt>\n <dd className=\"text-text-primary font-medium\">{parser.ttl ? `${parser.ttl}s` : 'No caching'}</dd>\n </div>\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">Version</dt>\n <dd className=\"text-text-primary font-medium\">{parser.version || 1}</dd>\n </div>\n </dl>\n </CardContent>\n </Card>\n\n {/* Timestamps */}\n <Card>\n <CardHeader>\n <CardTitle>Timestamps</CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"space-y-4 text-body-sm\">\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">Created</dt>\n <dd className=\"text-text-primary font-medium\">\n {parser.createdAt\n ? formatDistanceToNow(new Date(parser.createdAt), { addSuffix: true })\n : 'Unknown'}\n </dd>\n </div>\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">Updated</dt>\n <dd className=\"text-text-primary font-medium\">\n {parser.updatedAt\n ? formatDistanceToNow(new Date(parser.updatedAt), { addSuffix: true })\n : 'Unknown'}\n </dd>\n </div>\n </dl>\n </CardContent>\n </Card>\n </div>\n </div>\n\n {/* Delete Confirmation Dialog */}\n <Dialog open={showDeleteConfirm} onOpenChange={setShowDeleteConfirm}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete Parser</DialogTitle>\n <DialogDescription>\n Are you sure you want to delete <strong>{parser.name}</strong>? This action cannot be undone.\n </DialogDescription>\n </DialogHeader>\n <div className=\"bg-status-warning-bg/10 border border-status-warning-border/20 rounded-md p-4 flex items-start gap-2\">\n <AlertTriangle className=\"w-4 h-4 text-status-warning-text flex-shrink-0 mt-0.5\" />\n <p className=\"text-body-xs text-status-warning-text\">\n Widgets and pipelines using this parser may stop working correctly after deletion.\n </p>\n </div>\n <DialogFooter>\n <Button onClick={() => setShowDeleteConfirm(false)} variant=\"secondary\">\n Cancel\n </Button>\n <Button\n onClick={() => {\n nativeImpact('medium');\n void handleDelete();\n }}\n disabled={isDeleting}\n variant=\"destructive\"\n >\n {isDeleting ? 'Deleting...' : 'Delete Parser'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Export Parser Dialog */}\n <ExportParserDialog\n isOpen={isExportDialogOpen}\n parserId={parserId || null}\n parserName={parser.name}\n onClose={handleExportClose}\n />\n </div>\n );\n});\n\nexport default ParserViewPage;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ParserViewPage.js","names":[],"sources":["../../../src/bigconsole/pages/ParserViewPage.tsx"],"sourcesContent":["/**\n * Parser View Page\n *\n * Page for viewing Parser details, expression, and test execution.\n */\n\nimport { memo, useState, useEffect, useCallback } from 'react';\nimport { useParams } from 'react-router';\nimport { useAppNavigate } from '../contexts';\nimport { isNative, nativeCopyText, nativeImpact, nativeNotify, nativeToast } from '../../utils/nativeBridge';\nimport { formatDistanceToNow } from 'date-fns';\nimport { useParserOperations } from '../hooks/useParserOperations';\nimport { useParserStore } from '../store/parserStore';\nimport { useDataSinkOperations } from '../hooks/useDataSinkOperations';\nimport { ParserStatusBadge } from '../components/parser/ParserStatusBadge';\nimport { ParserTypeBadge } from '../components/parser/ParserTypeBadge';\nimport { ExpressionEditor } from '../components/parser/ExpressionEditor';\nimport { ExportParserDialog } from '../components/parser/ExportParserDialog';\n\n// RBAC\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { AccessDenied, PermissionButton } from '@burdenoff/fe-libs/shared/components';\nimport { BIGCONSOLE_PERMISSIONS } from '../../constants/permissions';\n\n// i18n\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\n// fe-libs UI components\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { Badge } from '@burdenoff/fe-libs/ui';\nimport { GlassCard, IllustratedEmptyState, PagePurpose, NextSteps } from '@burdenoff/fe-libs/ui';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@burdenoff/fe-libs/ui';\n\n// Lucide icons\nimport {\n ArrowLeft,\n Edit,\n Play,\n Trash2,\n Copy,\n Check,\n FileCode2,\n Database,\n ArrowDown,\n Loader2,\n AlertCircle,\n AlertTriangle,\n Download,\n} from 'lucide-react';\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n// Default console ID for standalone parser viewing\nconst DEFAULT_CONSOLE_ID = 'default';\n\nexport const ParserViewPage = memo(function ParserViewPage() {\n const { parserId, consoleId: urlConsoleId } = useParams<{ parserId: string; consoleId?: string }>();\n const navigate = useAppNavigate();\n const { t } = useI18n();\n\n // Use URL consoleId or fall back to default\n const consoleId = urlConsoleId || DEFAULT_CONSOLE_ID;\n\n // Permissions\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canRead = hasPermission(BIGCONSOLE_PERMISSIONS.PARSER_READ);\n\n // Local state\n const [isDeleting, setIsDeleting] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [expressionCopied, setExpressionCopied] = useState(false);\n const [isTesting, setIsTesting] = useState(false);\n const [isExportDialogOpen, setIsExportDialogOpen] = useState(false);\n const [testResult, setTestResult] = useState<{\n success: boolean;\n output: unknown;\n error: string | null;\n executionTimeMs: number;\n } | null>(null);\n\n // Store\n const parser = useParserStore((state) => (parserId ? state.parsers.get(parserId) : undefined));\n\n // Operations - use consoleId from URL or default\n const { loading, error, fetchParser, deleteParser, executeParser } = useParserOperations({\n consoleId,\n skipFetch: true,\n });\n\n // DataSink operations for source datasink info\n const { dataSinks, fetchDataSinks } = useDataSinkOperations({ skipFetch: true });\n\n // Load parser on mount - always fetch full data to get expression\n useEffect(() => {\n if (parserId) {\n fetchParser(parserId);\n }\n }, [parserId, fetchParser]);\n\n // Fetch datasinks to show source name\n useEffect(() => {\n fetchDataSinks();\n }, [fetchDataSinks]);\n\n // Get source datasink name\n const sourceDataSink = parser?.inputSinkKey ? dataSinks.find((ds) => ds.key === parser.inputSinkKey) : null;\n\n // Handle back navigation\n const handleBack = useCallback(() => {\n // Navigate to dashboard-scoped parsers list if consoleId is provided\n if (urlConsoleId) {\n navigate(`/dashboards/${urlConsoleId}/parsers`);\n } else {\n navigate(`/parsers`);\n }\n }, [navigate, urlConsoleId]);\n\n // Handle edit\n const handleEdit = useCallback(() => {\n // Navigate to dashboard-scoped parser edit if consoleId is provided\n if (urlConsoleId) {\n navigate(`/dashboards/${urlConsoleId}/parsers/${parserId}/edit`);\n } else {\n navigate(`/parsers/${parserId}/edit`);\n }\n }, [navigate, parserId, urlConsoleId]);\n\n // Handle delete\n const handleDelete = useCallback(async () => {\n if (!parserId) return;\n setIsDeleting(true);\n try {\n const success = await deleteParser(parserId);\n if (success) {\n if (isNative()) void nativeNotify('success');\n // Navigate to dashboard-scoped parsers list if consoleId is provided\n if (urlConsoleId) {\n navigate(`/dashboards/${urlConsoleId}/parsers`);\n } else {\n navigate(`/parsers`);\n }\n } else if (isNative()) {\n void nativeNotify('error');\n }\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n } finally {\n setIsDeleting(false);\n setShowDeleteConfirm(false);\n }\n }, [parserId, deleteParser, navigate, urlConsoleId]);\n\n // Handle copy expression\n const handleCopyExpression = useCallback(async () => {\n if (!parser?.expression) return;\n try {\n await nativeCopyText(parser.expression);\n setExpressionCopied(true);\n if (isNative()) void nativeToast(t('bigconsole.parsers.view.expressionCopied', 'Expression copied'));\n setTimeout(() => setExpressionCopied(false), 2000);\n } catch (err) {}\n }, [parser?.expression, t]);\n\n // Handle test execution\n const handleTestExecute = useCallback(async () => {\n if (!parserId) return;\n setIsTesting(true);\n setTestResult(null);\n try {\n const result = await executeParser(parserId);\n if (result) {\n setTestResult({\n success: result.success,\n output: result.output,\n error: result.error,\n executionTimeMs: result.executionTimeMs,\n });\n }\n } catch (err) {\n setTestResult({\n success: false,\n output: null,\n error: err instanceof Error ? err.message : t('bigconsole.parsers.view.executionFailed', 'Execution failed'),\n executionTimeMs: 0,\n });\n } finally {\n setIsTesting(false);\n }\n }, [parserId, executeParser, t]);\n\n // Navigate to source datasink\n const handleViewSourceDataSink = useCallback(() => {\n if (sourceDataSink) {\n navigate(`/datasinks/${sourceDataSink.id}`);\n }\n }, [navigate, sourceDataSink]);\n\n // Handle export\n const handleExport = useCallback(() => {\n setIsExportDialogOpen(true);\n }, []);\n\n const handleExportClose = useCallback(() => {\n setIsExportDialogOpen(false);\n }, []);\n\n // Loading state (wait for both the parser fetch and the permission load)\n if ((loading && !parser) || permissionsLoading) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <Loader2 className=\"w-8 h-8 text-text-secondary animate-spin\" />\n </div>\n );\n }\n\n // Read gate — no permission to view this parser\n if (!canRead) {\n return (\n <AccessDenied\n title={t('bigconsole.parsers.accessDenied.title', 'Access Denied')}\n description={t('bigconsole.parsers.accessDenied.view', \"You don't have permission to view this parser.\")}\n />\n );\n }\n\n // Error state\n if (error) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px] p-card-padding\">\n <div className=\"text-center\">\n <AlertCircle className=\"w-12 h-12 text-status-error-text mx-auto mb-4\" />\n <p className=\"text-status-error-text text-body-sm font-medium mb-2\">\n {t('bigconsole.parsers.errors.viewLoadFailed', 'Failed to load Parser')}\n </p>\n <p className=\"text-text-tertiary text-body-xs mb-6\">{error.message}</p>\n <Button onClick={handleBack} variant=\"ghost\" size=\"sm\">\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.parsers.actions.goBack', 'Go back')}\n </Button>\n </div>\n </div>\n );\n }\n\n // Not found state\n if (!parser) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px] p-card-padding\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('bigconsole.parsers.view.notFoundTitle', 'Parser not found')}\n description={t(\n 'bigconsole.parsers.view.notFoundDescription',\n \"The Parser you're looking for doesn't exist or has been deleted.\"\n )}\n action={\n <Button onClick={handleBack} variant=\"default\" size=\"default\">\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.parsers.actions.goBackToParsers', 'Go back to Parsers')}\n </Button>\n }\n />\n </div>\n );\n }\n\n return (\n <div className=\"p-card-padding space-y-6\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4\">\n <div className=\"flex-1\">\n <Button onClick={handleBack} variant=\"ghost\" size=\"sm\" className=\"mb-4\">\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.parsers.view.backToParsers', 'Back to Parsers')}\n </Button>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h1 className=\"text-heading-h1 font-bold text-text-primary\">\n {parser.name || t('bigconsole.parsers.view.untitled', 'Untitled')}\n </h1>\n <ParserTypeBadge type={parser.type} />\n <ParserStatusBadge status={parser.status} />\n </div>\n {parser.description && <p className=\"text-body-sm text-text-secondary mt-2\">{parser.description}</p>}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.PARSER_EXECUTE} deniedBehavior=\"disable\">\n <Button onClick={handleTestExecute} disabled={isTesting} variant=\"secondary\" size=\"default\">\n <Play className=\"w-4 h-4 mr-2\" />\n {isTesting\n ? t('bigconsole.parsers.view.running', 'Running...')\n : t('bigconsole.parsers.actions.execute', 'Execute')}\n </Button>\n </PermissionButton>\n <Button onClick={handleExport} variant=\"secondary\" size=\"default\">\n <Download className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.parsers.actions.export', 'Export')}\n </Button>\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.PARSER_UPDATE} deniedBehavior=\"disable\">\n <Button onClick={handleEdit} variant=\"secondary\" size=\"default\">\n <Edit className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.parsers.actions.edit', 'Edit')}\n </Button>\n </PermissionButton>\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.PARSER_DELETE} deniedBehavior=\"hide\">\n <Button\n onClick={() => setShowDeleteConfirm(true)}\n disabled={isDeleting}\n variant=\"destructive\"\n size=\"default\"\n >\n <Trash2 className=\"w-4 h-4 mr-2\" />\n {t('bigconsole.parsers.actions.delete', 'Delete')}\n </Button>\n </PermissionButton>\n </div>\n </div>\n\n <PagePurpose>\n {t(\n 'bigconsole.parsers.view.purpose',\n 'A parser turns raw input into structured fields using its expression. Review or copy the expression, run it against a sample to see the output, then edit it or use it inside a pipeline to shape incoming data.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"bigconsole-parser-view\"\n steps={[\n {\n id: 'execute',\n label: t('bigconsole.parsers.view.nextSteps.executeLabel', 'Run a test execution'),\n description: t(\n 'bigconsole.parsers.view.nextSteps.executeDescription',\n 'Check the expression produces the fields you expect.'\n ),\n onClick: handleTestExecute,\n },\n {\n id: 'edit',\n label: t('bigconsole.parsers.view.nextSteps.editLabel', 'Edit the expression'),\n description: t(\n 'bigconsole.parsers.view.nextSteps.editDescription',\n 'Refine how this parser maps your input.'\n ),\n onClick: handleEdit,\n },\n {\n id: 'pipeline',\n label: t('bigconsole.parsers.view.nextSteps.pipelineLabel', 'Use it in a pipeline'),\n description: t(\n 'bigconsole.parsers.view.nextSteps.pipelineDescription',\n 'Chain this parser with a data sink to process data end to end.'\n ),\n onClick: () => navigate('/pipelines'),\n },\n ]}\n />\n\n {/* Main Content Grid */}\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Expression Panel (2/3 width) — primary emphasis zone */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Expression */}\n <GlassCard treatment=\"glass\" glow>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0\">\n <CardTitle className=\"flex items-center gap-2\">\n <FileCode2 className=\"w-4 h-4 text-text-secondary\" />\n {t('bigconsole.parsers.view.expression', 'Expression')}\n <Badge variant=\"secondary\" className=\"text-xs uppercase\">\n {parser.type}\n </Badge>\n </CardTitle>\n <Button onClick={handleCopyExpression} variant=\"ghost\" size=\"sm\">\n {expressionCopied ? (\n <>\n <Check className=\"w-3.5 h-3.5 text-status-success-text mr-2\" />\n {t('bigconsole.parsers.view.copied', 'Copied!')}\n </>\n ) : (\n <>\n <Copy className=\"w-3.5 h-3.5 mr-2\" />\n {t('bigconsole.parsers.actions.copy', 'Copy')}\n </>\n )}\n </Button>\n </CardHeader>\n <CardContent>\n <ExpressionEditor value={parser.expression} type={parser.type} readOnly height=\"300px\" />\n </CardContent>\n </GlassCard>\n\n {/* Test Result Panel */}\n {testResult && (\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0\">\n <CardTitle className=\"flex items-center gap-2\">\n {t('bigconsole.parsers.view.executionResult', 'Execution Result')}\n <Badge variant={testResult.success ? 'default' : 'destructive'}>\n {testResult.success\n ? t('bigconsole.parsers.view.success', 'Success')\n : t('bigconsole.parsers.view.failed', 'Failed')}\n </Badge>\n </CardTitle>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {testResult.executionTimeMs}ms\n </Badge>\n </CardHeader>\n <CardContent>\n {testResult.error ? (\n <div className=\"bg-status-error-bg/5 border border-status-error-border/20 rounded-md p-4\">\n <p className=\"text-body-sm text-status-error-text font-mono\">{testResult.error}</p>\n </div>\n ) : (\n <pre className=\"text-body-sm text-text-primary font-mono bg-bg-sunken rounded-md p-4 overflow-auto max-h-[300px]\">\n {JSON.stringify(testResult.output, null, 2)}\n </pre>\n )}\n </CardContent>\n </Card>\n )}\n </div>\n\n {/* Side Panel (1/3 width) */}\n <div className=\"space-y-6\">\n {/* Data Flow */}\n <Card>\n <CardHeader>\n <CardTitle>{t('bigconsole.parsers.view.dataFlow', 'Data Flow')}</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {/* Source DataSink */}\n <div>\n <label className=\"text-xs font-medium text-text-secondary\">\n {t('bigconsole.parsers.view.sourceDataSink', 'Source DataSink')}\n </label>\n {parser.inputSinkKey ? (\n <div className=\"mt-1\">\n <p className=\"text-body-sm text-text-primary font-mono\">{parser.inputSinkKey}</p>\n {sourceDataSink && (\n <Button onClick={handleViewSourceDataSink} variant=\"link\" size=\"sm\" className=\"mt-1 p-0 h-auto\">\n <Database className=\"w-3 h-3 mr-1\" />\n {t('bigconsole.parsers.view.viewDataSink', 'View {{name}}', {\n name: sourceDataSink.name || t('bigconsole.parsers.view.dataSinkFallback', 'DataSink'),\n })}\n </Button>\n )}\n </div>\n ) : (\n <p className=\"text-body-sm text-text-tertiary mt-1\">\n {t('bigconsole.parsers.view.noneConfigured', 'None configured')}\n </p>\n )}\n </div>\n\n {/* Arrow */}\n <div className=\"flex items-center justify-center py-1\">\n <ArrowDown className=\"w-4 h-4 text-text-tertiary\" />\n </div>\n\n {/* Output Key */}\n <div>\n <label className=\"text-xs font-medium text-text-secondary\">\n {t('bigconsole.parsers.view.outputKey', 'Output Key')}\n </label>\n <p className=\"text-body-sm text-text-primary font-mono mt-1\">\n {parser.outputKey || t('bigconsole.parsers.view.notConfigured', 'Not configured')}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Configuration */}\n <Card>\n <CardHeader>\n <CardTitle>{t('bigconsole.parsers.view.configuration', 'Configuration')}</CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"space-y-4 text-body-sm\">\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">{t('bigconsole.parsers.view.status', 'Status')}</dt>\n <dd>\n <ParserStatusBadge status={parser.status} />\n </dd>\n </div>\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">{t('bigconsole.parsers.view.type', 'Type')}</dt>\n <dd>\n <ParserTypeBadge type={parser.type} />\n </dd>\n </div>\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">{t('bigconsole.parsers.view.cacheTtl', 'Cache TTL')}</dt>\n <dd className=\"text-text-primary font-medium\">\n {parser.ttl\n ? t('bigconsole.parsers.view.ttlSeconds', '{{ttl}}s', { ttl: parser.ttl })\n : t('bigconsole.parsers.view.noCaching', 'No caching')}\n </dd>\n </div>\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">{t('bigconsole.parsers.view.version', 'Version')}</dt>\n <dd className=\"text-text-primary font-medium\">{parser.version || 1}</dd>\n </div>\n </dl>\n </CardContent>\n </Card>\n\n {/* Timestamps */}\n <Card>\n <CardHeader>\n <CardTitle>{t('bigconsole.parsers.view.timestamps', 'Timestamps')}</CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"space-y-4 text-body-sm\">\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">{t('bigconsole.parsers.view.created', 'Created')}</dt>\n <dd className=\"text-text-primary font-medium\">\n {parser.createdAt\n ? formatDistanceToNow(new Date(parser.createdAt), { addSuffix: true })\n : t('bigconsole.parsers.view.unknown', 'Unknown')}\n </dd>\n </div>\n <div className=\"flex justify-between items-center\">\n <dt className=\"text-text-secondary\">{t('bigconsole.parsers.view.updated', 'Updated')}</dt>\n <dd className=\"text-text-primary font-medium\">\n {parser.updatedAt\n ? formatDistanceToNow(new Date(parser.updatedAt), { addSuffix: true })\n : t('bigconsole.parsers.view.unknown', 'Unknown')}\n </dd>\n </div>\n </dl>\n </CardContent>\n </Card>\n </div>\n </div>\n\n {/* Delete Confirmation Dialog */}\n <Dialog open={showDeleteConfirm} onOpenChange={setShowDeleteConfirm}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{t('bigconsole.parsers.view.deleteDialogTitle', 'Delete Parser')}</DialogTitle>\n <DialogDescription>\n {t('bigconsole.parsers.view.deleteConfirmPrefix', 'Are you sure you want to delete')}{' '}\n <strong>{parser.name}</strong>\n {t('bigconsole.parsers.view.deleteConfirmSuffix', '? This action cannot be undone.')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"bg-status-warning-bg/10 border border-status-warning-border/20 rounded-md p-4 flex items-start gap-2\">\n <AlertTriangle className=\"w-4 h-4 text-status-warning-text flex-shrink-0 mt-0.5\" />\n <p className=\"text-body-xs text-status-warning-text\">\n {t(\n 'bigconsole.parsers.view.deleteWarning',\n 'Widgets and pipelines using this parser may stop working correctly after deletion.'\n )}\n </p>\n </div>\n <DialogFooter>\n <Button onClick={() => setShowDeleteConfirm(false)} variant=\"secondary\">\n {t('bigconsole.parsers.actions.cancel', 'Cancel')}\n </Button>\n <Button\n onClick={() => {\n nativeImpact('medium');\n void handleDelete();\n }}\n disabled={isDeleting}\n variant=\"destructive\"\n >\n {isDeleting\n ? t('bigconsole.parsers.view.deleting', 'Deleting...')\n : t('bigconsole.parsers.view.deleteDialogTitle', 'Delete Parser')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Export Parser Dialog */}\n <ExportParserDialog\n isOpen={isExportDialogOpen}\n parserId={parserId || null}\n parserName={parser.name}\n onClose={handleExportClose}\n />\n </div>\n );\n});\n\nexport default ParserViewPage;\n"],"mappings":"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"}
|