@burdenoff/microfe-bigconsole 2026.717.2 → 2026.717.4
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/widgets/kanban/KanbanWidget.js +109 -9
- package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js +2 -1
- package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkBuilderPage.js +15 -15
- package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkViewPage.js +19 -19
- package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserBuilderPage.js +8 -8
- package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserViewPage.js +19 -19
- package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -90,13 +90,13 @@ var j = "default", M = s(function() {
|
|
|
90
90
|
children: /* @__PURE__ */ k("div", {
|
|
91
91
|
className: "text-center",
|
|
92
92
|
children: [
|
|
93
|
-
/* @__PURE__ */ O(f, { className: "w-12 h-12 text-state-error mx-auto mb-
|
|
93
|
+
/* @__PURE__ */ O(f, { className: "w-12 h-12 text-state-error mx-auto mb-4" }),
|
|
94
94
|
/* @__PURE__ */ O("p", {
|
|
95
|
-
className: "text-state-error text-body-sm font-medium mb-
|
|
95
|
+
className: "text-state-error text-body-sm font-medium mb-2",
|
|
96
96
|
children: "Failed to load Parser"
|
|
97
97
|
}),
|
|
98
98
|
/* @__PURE__ */ O("p", {
|
|
99
|
-
className: "text-text-tertiary text-body-xs mb-
|
|
99
|
+
className: "text-text-tertiary text-body-xs mb-6",
|
|
100
100
|
children: G.message
|
|
101
101
|
}),
|
|
102
102
|
/* @__PURE__ */ k(v, {
|
|
@@ -108,10 +108,10 @@ var j = "default", M = s(function() {
|
|
|
108
108
|
]
|
|
109
109
|
})
|
|
110
110
|
}) : W ? /* @__PURE__ */ k("div", {
|
|
111
|
-
className: "p-card-padding space-y-
|
|
111
|
+
className: "p-card-padding space-y-6",
|
|
112
112
|
children: [
|
|
113
113
|
/* @__PURE__ */ k("div", {
|
|
114
|
-
className: "flex flex-col sm:flex-row sm:items-start sm:justify-between gap-
|
|
114
|
+
className: "flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4",
|
|
115
115
|
children: [/* @__PURE__ */ k("div", {
|
|
116
116
|
className: "flex-1",
|
|
117
117
|
children: [
|
|
@@ -119,11 +119,11 @@ var j = "default", M = s(function() {
|
|
|
119
119
|
onClick: Z,
|
|
120
120
|
variant: "ghost",
|
|
121
121
|
size: "sm",
|
|
122
|
-
className: "mb-
|
|
122
|
+
className: "mb-4",
|
|
123
123
|
children: [/* @__PURE__ */ O(p, { className: "w-4 h-4 mr-2" }), "Back to Parsers"]
|
|
124
124
|
}),
|
|
125
125
|
/* @__PURE__ */ k("div", {
|
|
126
|
-
className: "flex items-center gap-
|
|
126
|
+
className: "flex items-center gap-2 flex-wrap",
|
|
127
127
|
children: [
|
|
128
128
|
/* @__PURE__ */ O("h1", {
|
|
129
129
|
className: "text-heading-h1 font-bold text-text-primary",
|
|
@@ -134,12 +134,12 @@ var j = "default", M = s(function() {
|
|
|
134
134
|
]
|
|
135
135
|
}),
|
|
136
136
|
W.description && /* @__PURE__ */ O("p", {
|
|
137
|
-
className: "text-body-sm text-text-secondary mt-
|
|
137
|
+
className: "text-body-sm text-text-secondary mt-2",
|
|
138
138
|
children: W.description
|
|
139
139
|
})
|
|
140
140
|
]
|
|
141
141
|
}), /* @__PURE__ */ k("div", {
|
|
142
|
-
className: "flex items-center gap-
|
|
142
|
+
className: "flex items-center gap-2 flex-wrap",
|
|
143
143
|
children: [
|
|
144
144
|
/* @__PURE__ */ k(v, {
|
|
145
145
|
onClick: $,
|
|
@@ -195,16 +195,16 @@ var j = "default", M = s(function() {
|
|
|
195
195
|
]
|
|
196
196
|
}),
|
|
197
197
|
/* @__PURE__ */ k("div", {
|
|
198
|
-
className: "grid gap-
|
|
198
|
+
className: "grid gap-6 lg:grid-cols-3",
|
|
199
199
|
children: [/* @__PURE__ */ k("div", {
|
|
200
|
-
className: "lg:col-span-2 space-y-
|
|
200
|
+
className: "lg:col-span-2 space-y-6",
|
|
201
201
|
children: [/* @__PURE__ */ k(C, {
|
|
202
202
|
treatment: "glass",
|
|
203
203
|
glow: !0,
|
|
204
204
|
children: [/* @__PURE__ */ k(x, {
|
|
205
205
|
className: "flex flex-row items-center justify-between space-y-0",
|
|
206
206
|
children: [/* @__PURE__ */ k(S, {
|
|
207
|
-
className: "flex items-center gap-
|
|
207
|
+
className: "flex items-center gap-2",
|
|
208
208
|
children: [
|
|
209
209
|
/* @__PURE__ */ O(pe, { className: "w-4 h-4 text-text-secondary" }),
|
|
210
210
|
"Expression",
|
|
@@ -229,7 +229,7 @@ var j = "default", M = s(function() {
|
|
|
229
229
|
}), H && /* @__PURE__ */ k(y, { children: [/* @__PURE__ */ k(x, {
|
|
230
230
|
className: "flex flex-row items-center justify-between space-y-0",
|
|
231
231
|
children: [/* @__PURE__ */ k(S, {
|
|
232
|
-
className: "flex items-center gap-
|
|
232
|
+
className: "flex items-center gap-2",
|
|
233
233
|
children: ["Execution Result", /* @__PURE__ */ O(_, {
|
|
234
234
|
variant: H.success ? "default" : "destructive",
|
|
235
235
|
children: H.success ? "Success" : "Failed"
|
|
@@ -240,17 +240,17 @@ var j = "default", M = s(function() {
|
|
|
240
240
|
children: [H.executionTimeMs, "ms"]
|
|
241
241
|
})]
|
|
242
242
|
}), /* @__PURE__ */ O(b, { children: H.error ? /* @__PURE__ */ O("div", {
|
|
243
|
-
className: "bg-state-error/5 border border-state-error/20 rounded-md p-
|
|
243
|
+
className: "bg-state-error/5 border border-state-error/20 rounded-md p-4",
|
|
244
244
|
children: /* @__PURE__ */ O("p", {
|
|
245
245
|
className: "text-body-sm text-state-error font-mono",
|
|
246
246
|
children: H.error
|
|
247
247
|
})
|
|
248
248
|
}) : /* @__PURE__ */ O("pre", {
|
|
249
|
-
className: "text-body-sm text-text-primary font-mono bg-bg-sunken rounded-md p-
|
|
249
|
+
className: "text-body-sm text-text-primary font-mono bg-bg-sunken rounded-md p-4 overflow-auto max-h-[300px]",
|
|
250
250
|
children: JSON.stringify(H.output, null, 2)
|
|
251
251
|
}) })] })]
|
|
252
252
|
}), /* @__PURE__ */ k("div", {
|
|
253
|
-
className: "space-y-
|
|
253
|
+
className: "space-y-6",
|
|
254
254
|
children: [
|
|
255
255
|
/* @__PURE__ */ k(y, { children: [/* @__PURE__ */ O(x, { children: /* @__PURE__ */ O(S, { children: "Data Flow" }) }), /* @__PURE__ */ O(b, { children: /* @__PURE__ */ k("div", {
|
|
256
256
|
className: "space-y-3",
|
|
@@ -292,7 +292,7 @@ var j = "default", M = s(function() {
|
|
|
292
292
|
]
|
|
293
293
|
}) })] }),
|
|
294
294
|
/* @__PURE__ */ k(y, { children: [/* @__PURE__ */ O(x, { children: /* @__PURE__ */ O(S, { children: "Configuration" }) }), /* @__PURE__ */ O(b, { children: /* @__PURE__ */ k("dl", {
|
|
295
|
-
className: "space-y-
|
|
295
|
+
className: "space-y-4 text-body-sm",
|
|
296
296
|
children: [
|
|
297
297
|
/* @__PURE__ */ k("div", {
|
|
298
298
|
className: "flex justify-between items-center",
|
|
@@ -331,7 +331,7 @@ var j = "default", M = s(function() {
|
|
|
331
331
|
]
|
|
332
332
|
}) })] }),
|
|
333
333
|
/* @__PURE__ */ k(y, { children: [/* @__PURE__ */ O(x, { children: /* @__PURE__ */ O(S, { children: "Timestamps" }) }), /* @__PURE__ */ O(b, { children: /* @__PURE__ */ k("dl", {
|
|
334
|
-
className: "space-y-
|
|
334
|
+
className: "space-y-4 text-body-sm",
|
|
335
335
|
children: [/* @__PURE__ */ k("div", {
|
|
336
336
|
className: "flex justify-between items-center",
|
|
337
337
|
children: [/* @__PURE__ */ O("dt", {
|
|
@@ -365,7 +365,7 @@ var j = "default", M = s(function() {
|
|
|
365
365
|
"? This action cannot be undone."
|
|
366
366
|
] })] }),
|
|
367
367
|
/* @__PURE__ */ k("div", {
|
|
368
|
-
className: "bg-state-warning/10 border border-state-warning/20 rounded-md p-
|
|
368
|
+
className: "bg-state-warning/10 border border-state-warning/20 rounded-md p-4 flex items-start gap-2",
|
|
369
369
|
children: [/* @__PURE__ */ O(oe, { className: "w-4 h-4 text-state-warning flex-shrink-0 mt-0.5" }), /* @__PURE__ */ O("p", {
|
|
370
370
|
className: "text-body-xs text-state-warning",
|
|
371
371
|
children: "Widgets and pipelines using this parser may stop working correctly after deletion."
|
|
@@ -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-dom';\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// 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 // 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\n if (loading && !parser) {\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 // 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-state-error mx-auto mb-spacing-md\" />\n <p className=\"text-state-error text-body-sm font-medium mb-spacing-sm\">Failed to load Parser</p>\n <p className=\"text-text-tertiary text-body-xs mb-spacing-lg\">{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-spacing-lg\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-spacing-md\">\n <div className=\"flex-1\">\n <Button onClick={handleBack} variant=\"ghost\" size=\"sm\" className=\"mb-spacing-md\">\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n Back to Parsers\n </Button>\n <div className=\"flex items-center gap-spacing-sm 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-spacing-sm\">{parser.description}</p>}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-spacing-sm flex-wrap\">\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 <Button onClick={handleExport} variant=\"secondary\" size=\"default\">\n <Download className=\"w-4 h-4 mr-2\" />\n Export\n </Button>\n <Button onClick={handleEdit} variant=\"secondary\" size=\"default\">\n <Edit className=\"w-4 h-4 mr-2\" />\n Edit\n </Button>\n <Button onClick={() => setShowDeleteConfirm(true)} disabled={isDeleting} variant=\"destructive\" size=\"default\">\n <Trash2 className=\"w-4 h-4 mr-2\" />\n Delete\n </Button>\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-spacing-lg lg:grid-cols-3\">\n {/* Expression Panel (2/3 width) — primary emphasis zone */}\n <div className=\"lg:col-span-2 space-y-spacing-lg\">\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-spacing-sm\">\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-state-success 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-spacing-sm\">\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-state-error/5 border border-state-error/20 rounded-md p-spacing-md\">\n <p className=\"text-body-sm text-state-error 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-spacing-md 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-spacing-lg\">\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-spacing-md 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-spacing-md 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-state-warning/10 border border-state-warning/20 rounded-md p-spacing-md flex items-start gap-spacing-sm\">\n <AlertTriangle className=\"w-4 h-4 text-state-warning flex-shrink-0 mt-0.5\" />\n <p className=\"text-body-xs text-state-warning\">\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-dom';\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// 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 // 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\n if (loading && !parser) {\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 // 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-state-error mx-auto mb-4\" />\n <p className=\"text-state-error 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 <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 <Button onClick={handleExport} variant=\"secondary\" size=\"default\">\n <Download className=\"w-4 h-4 mr-2\" />\n Export\n </Button>\n <Button onClick={handleEdit} variant=\"secondary\" size=\"default\">\n <Edit className=\"w-4 h-4 mr-2\" />\n Edit\n </Button>\n <Button onClick={() => setShowDeleteConfirm(true)} disabled={isDeleting} variant=\"destructive\" size=\"default\">\n <Trash2 className=\"w-4 h-4 mr-2\" />\n Delete\n </Button>\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-state-success 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-state-error/5 border border-state-error/20 rounded-md p-4\">\n <p className=\"text-body-sm text-state-error 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-state-warning/10 border border-state-warning/20 rounded-md p-4 flex items-start gap-2\">\n <AlertTriangle className=\"w-4 h-4 text-state-warning flex-shrink-0 mt-0.5\" />\n <p className=\"text-body-xs text-state-warning\">\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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"}
|