@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
|
@@ -5,183 +5,187 @@ import { StepRail as r, formatAgo as i, useAssistantSidebarWidth as a } from "./
|
|
|
5
5
|
import { DashboardContent as o, DataSinkContent as s, ParserContent as c, WidgetsContent as l } from "./AiPreviewContent.js";
|
|
6
6
|
import { useEffect as u, useState as d } from "react";
|
|
7
7
|
import { ArrowUpRight as f, Loader2 as p, Sparkles as m, X as h } from "lucide-react";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { useI18n as g } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
9
|
+
import { Button as _, Tabs as v, TabsContent as y, TabsList as b, TabsTrigger as x } from "@burdenoff/fe-libs/ui";
|
|
10
|
+
import { jsx as S, jsxs as C } from "react/jsx-runtime";
|
|
10
11
|
//#region src/bigconsole/components/preview/AiPreviewPanel.tsx
|
|
11
|
-
function
|
|
12
|
-
|
|
12
|
+
function w({ label: e, onOpen: t }) {
|
|
13
|
+
let { t: n } = g();
|
|
14
|
+
return /* @__PURE__ */ C("div", {
|
|
13
15
|
className: "mb-2 flex items-center justify-between gap-2",
|
|
14
|
-
children: [/* @__PURE__ */
|
|
16
|
+
children: [/* @__PURE__ */ S("span", {
|
|
15
17
|
className: "text-xs font-semibold uppercase tracking-wide text-text-muted",
|
|
16
18
|
children: e
|
|
17
|
-
}), t ? /* @__PURE__ */
|
|
19
|
+
}), t ? /* @__PURE__ */ C(_, {
|
|
18
20
|
size: "sm",
|
|
19
21
|
variant: "outline",
|
|
20
22
|
onClick: t,
|
|
21
23
|
"data-testid": "ai-preview-open-entity",
|
|
22
|
-
children: ["Open", /* @__PURE__ */
|
|
24
|
+
children: [n("bigconsole.widget.aiPreview.open", "Open"), /* @__PURE__ */ S(f, { className: "ml-1 size-3.5" })]
|
|
23
25
|
}) : null]
|
|
24
26
|
});
|
|
25
27
|
}
|
|
26
|
-
function
|
|
27
|
-
let f = e(),
|
|
28
|
-
u(() => (
|
|
29
|
-
let [
|
|
28
|
+
function T() {
|
|
29
|
+
let { t: f } = g(), T = e(), E = n((e) => e.isRunning), D = n((e) => e.previewOpen), O = n((e) => e.hasRun), k = n((e) => e.steps), A = n((e) => e.entityIds), j = n((e) => e.caption), M = n((e) => e.error), N = n((e) => e.updatedAt), P = n((e) => e.openPreview), F = n((e) => e.closePreview), I = n((e) => e.setRichMounted);
|
|
30
|
+
u(() => (I(!0), () => I(!1)), [I]);
|
|
31
|
+
let [L, R] = d("datasink"), [z, B] = d(() => Date.now()), V = A.dashboard;
|
|
30
32
|
u(() => {
|
|
31
|
-
if (!
|
|
32
|
-
let e = window.setInterval(() =>
|
|
33
|
+
if (!E) return;
|
|
34
|
+
let e = window.setInterval(() => B(Date.now()), 1e3);
|
|
33
35
|
return () => window.clearInterval(e);
|
|
34
|
-
}, [
|
|
35
|
-
let e = t.filter((e) =>
|
|
36
|
+
}, [E]), u(() => {
|
|
37
|
+
let e = t.filter((e) => k[e] === "done"), n = e[e.length - 1];
|
|
36
38
|
if (n) {
|
|
37
|
-
|
|
39
|
+
R(n);
|
|
38
40
|
return;
|
|
39
41
|
}
|
|
40
|
-
let r = t.find((e) =>
|
|
41
|
-
r &&
|
|
42
|
-
}, [
|
|
43
|
-
let
|
|
44
|
-
return
|
|
42
|
+
let r = t.find((e) => k[e] === "running");
|
|
43
|
+
r && R(r);
|
|
44
|
+
}, [k]);
|
|
45
|
+
let H = N ? Math.max(0, Math.floor((z - N) / 1e3)) : 0, U = a();
|
|
46
|
+
return O ? D ? /* @__PURE__ */ C("section", {
|
|
45
47
|
"data-testid": "ai-preview-panel",
|
|
46
|
-
"aria-label": "AI preview",
|
|
47
|
-
style: { marginRight:
|
|
48
|
+
"aria-label": f("bigconsole.widget.aiPreview.ariaLabel", "AI preview"),
|
|
49
|
+
style: { marginRight: U ? U + 16 : void 0 },
|
|
48
50
|
className: "mx-4 mt-3 overflow-hidden rounded-lg border border-border-default bg-bg-sunken shadow-sm md:mx-6",
|
|
49
51
|
children: [
|
|
50
|
-
/* @__PURE__ */
|
|
52
|
+
/* @__PURE__ */ C("div", {
|
|
51
53
|
className: "flex items-center justify-between gap-3 border-b border-border-subtle bg-bg-surface px-3 py-2",
|
|
52
|
-
children: [/* @__PURE__ */
|
|
54
|
+
children: [/* @__PURE__ */ C("div", {
|
|
53
55
|
className: "flex min-w-0 items-center gap-2",
|
|
54
56
|
children: [
|
|
55
|
-
/* @__PURE__ */
|
|
56
|
-
/* @__PURE__ */
|
|
57
|
+
/* @__PURE__ */ S(m, { className: "size-4 shrink-0 text-action-primary-bg" }),
|
|
58
|
+
/* @__PURE__ */ S("h2", {
|
|
57
59
|
className: "truncate text-sm font-semibold text-text-primary",
|
|
58
|
-
children: "AI Preview"
|
|
60
|
+
children: f("bigconsole.widget.aiPreview.title", "AI Preview")
|
|
59
61
|
}),
|
|
60
|
-
|
|
62
|
+
E ? /* @__PURE__ */ C("span", {
|
|
61
63
|
className: "inline-flex items-center gap-1.5 rounded-full bg-status-success-bg px-2 py-0.5 text-[11px] font-semibold uppercase tracking-wide text-status-success-text",
|
|
62
64
|
"data-testid": "ai-preview-live",
|
|
63
|
-
children: [/* @__PURE__ */
|
|
65
|
+
children: [/* @__PURE__ */ C("span", {
|
|
64
66
|
className: "relative flex size-2",
|
|
65
|
-
children: [/* @__PURE__ */
|
|
66
|
-
}), "Live"]
|
|
67
|
+
children: [/* @__PURE__ */ S("span", { className: "absolute inline-flex size-full animate-ping rounded-full bg-status-success-text opacity-75" }), /* @__PURE__ */ S("span", { className: "relative inline-flex size-2 rounded-full bg-status-success-text" })]
|
|
68
|
+
}), f("bigconsole.widget.aiPreview.live", "Live")]
|
|
67
69
|
}) : null,
|
|
68
|
-
/* @__PURE__ */
|
|
70
|
+
/* @__PURE__ */ C("span", {
|
|
69
71
|
className: "truncate text-xs text-text-muted",
|
|
70
72
|
"data-testid": "ai-preview-ago",
|
|
71
73
|
children: [
|
|
72
|
-
|
|
73
|
-
"
|
|
74
|
+
E ? j || f("bigconsole.widget.aiPreview.working", "Working…") : M ? f("bigconsole.widget.aiPreview.stopped", "Stopped") : f("bigconsole.widget.aiPreview.done", "Done"),
|
|
75
|
+
" ",
|
|
76
|
+
"· ",
|
|
77
|
+
f("bigconsole.widget.aiPreview.updated", "updated"),
|
|
74
78
|
" ",
|
|
75
|
-
i(
|
|
79
|
+
i(H)
|
|
76
80
|
]
|
|
77
81
|
})
|
|
78
82
|
]
|
|
79
|
-
}), /* @__PURE__ */
|
|
83
|
+
}), /* @__PURE__ */ S(_, {
|
|
80
84
|
size: "sm",
|
|
81
85
|
variant: "ghost",
|
|
82
|
-
onClick:
|
|
83
|
-
"aria-label": "Close preview",
|
|
86
|
+
onClick: F,
|
|
87
|
+
"aria-label": f("bigconsole.widget.aiPreview.closeAriaLabel", "Close preview"),
|
|
84
88
|
"data-testid": "ai-preview-close",
|
|
85
|
-
children: /* @__PURE__ */
|
|
89
|
+
children: /* @__PURE__ */ S(h, { className: "size-4" })
|
|
86
90
|
})]
|
|
87
91
|
}),
|
|
88
|
-
/* @__PURE__ */
|
|
92
|
+
/* @__PURE__ */ S("div", {
|
|
89
93
|
className: "border-b border-border-subtle px-3 py-2",
|
|
90
|
-
children: /* @__PURE__ */
|
|
94
|
+
children: /* @__PURE__ */ S(r, { steps: k })
|
|
91
95
|
}),
|
|
92
|
-
/* @__PURE__ */
|
|
93
|
-
value:
|
|
94
|
-
onValueChange: (e) =>
|
|
95
|
-
children: [/* @__PURE__ */
|
|
96
|
+
/* @__PURE__ */ C(v, {
|
|
97
|
+
value: L,
|
|
98
|
+
onValueChange: (e) => R(e),
|
|
99
|
+
children: [/* @__PURE__ */ C(b, {
|
|
96
100
|
className: "mx-3 mt-2",
|
|
97
101
|
children: [
|
|
98
|
-
/* @__PURE__ */ x
|
|
102
|
+
/* @__PURE__ */ S(x, {
|
|
99
103
|
value: "datasink",
|
|
100
104
|
"data-testid": "ai-preview-tab-datasink",
|
|
101
|
-
children: "Data Sink"
|
|
105
|
+
children: f("bigconsole.widget.aiPreview.tab.dataSink", "Data Sink")
|
|
102
106
|
}),
|
|
103
|
-
/* @__PURE__ */ x
|
|
107
|
+
/* @__PURE__ */ S(x, {
|
|
104
108
|
value: "dashboard",
|
|
105
109
|
"data-testid": "ai-preview-tab-dashboard",
|
|
106
|
-
children: "Dashboard"
|
|
110
|
+
children: f("bigconsole.widget.aiPreview.tab.dashboard", "Dashboard")
|
|
107
111
|
}),
|
|
108
|
-
/* @__PURE__ */ x
|
|
112
|
+
/* @__PURE__ */ S(x, {
|
|
109
113
|
value: "parser",
|
|
110
114
|
"data-testid": "ai-preview-tab-parser",
|
|
111
|
-
children: "Parser"
|
|
115
|
+
children: f("bigconsole.widget.aiPreview.tab.parser", "Parser")
|
|
112
116
|
}),
|
|
113
|
-
/* @__PURE__ */ x
|
|
117
|
+
/* @__PURE__ */ S(x, {
|
|
114
118
|
value: "widget",
|
|
115
119
|
"data-testid": "ai-preview-tab-widget",
|
|
116
|
-
children: "Widget"
|
|
120
|
+
children: f("bigconsole.widget.aiPreview.tab.widget", "Widget")
|
|
117
121
|
})
|
|
118
122
|
]
|
|
119
|
-
}), /* @__PURE__ */
|
|
123
|
+
}), /* @__PURE__ */ C("div", {
|
|
120
124
|
className: "max-h-[440px] overflow-y-auto p-3",
|
|
121
125
|
children: [
|
|
122
|
-
/* @__PURE__ */
|
|
126
|
+
/* @__PURE__ */ C(y, {
|
|
123
127
|
value: "datasink",
|
|
124
|
-
children: [/* @__PURE__ */
|
|
125
|
-
label: "Data Sink",
|
|
126
|
-
onOpen:
|
|
127
|
-
}), /* @__PURE__ */
|
|
128
|
-
id:
|
|
129
|
-
live:
|
|
128
|
+
children: [/* @__PURE__ */ S(w, {
|
|
129
|
+
label: f("bigconsole.widget.aiPreview.tab.dataSink", "Data Sink"),
|
|
130
|
+
onOpen: A.datasink ? () => T(`/datasinks/${A.datasink}`) : void 0
|
|
131
|
+
}), /* @__PURE__ */ S(s, {
|
|
132
|
+
id: A.datasink,
|
|
133
|
+
live: E
|
|
130
134
|
})]
|
|
131
135
|
}),
|
|
132
|
-
/* @__PURE__ */
|
|
136
|
+
/* @__PURE__ */ C(y, {
|
|
133
137
|
value: "dashboard",
|
|
134
|
-
children: [/* @__PURE__ */
|
|
135
|
-
label: "Dashboard",
|
|
136
|
-
onOpen:
|
|
137
|
-
}), /* @__PURE__ */
|
|
138
|
+
children: [/* @__PURE__ */ S(w, {
|
|
139
|
+
label: f("bigconsole.widget.aiPreview.tab.dashboard", "Dashboard"),
|
|
140
|
+
onOpen: A.dashboard ? () => T(`/dashboards/${A.dashboard}`) : void 0
|
|
141
|
+
}), /* @__PURE__ */ S(o, { dashboardId: A.dashboard })]
|
|
138
142
|
}),
|
|
139
|
-
/* @__PURE__ */
|
|
143
|
+
/* @__PURE__ */ C(y, {
|
|
140
144
|
value: "parser",
|
|
141
|
-
children: [/* @__PURE__ */
|
|
142
|
-
label: "Parser",
|
|
143
|
-
onOpen:
|
|
144
|
-
}), /* @__PURE__ */
|
|
145
|
-
parserId:
|
|
146
|
-
live:
|
|
145
|
+
children: [/* @__PURE__ */ S(w, {
|
|
146
|
+
label: f("bigconsole.widget.aiPreview.tab.parser", "Parser"),
|
|
147
|
+
onOpen: A.parser ? () => T(`/parsers/${A.parser}`) : void 0
|
|
148
|
+
}), /* @__PURE__ */ S(c, {
|
|
149
|
+
parserId: A.parser,
|
|
150
|
+
live: E
|
|
147
151
|
})]
|
|
148
152
|
}),
|
|
149
|
-
/* @__PURE__ */
|
|
153
|
+
/* @__PURE__ */ C(y, {
|
|
150
154
|
value: "widget",
|
|
151
|
-
children: [/* @__PURE__ */
|
|
152
|
-
label: "Widget",
|
|
153
|
-
onOpen:
|
|
154
|
-
}), /* @__PURE__ */
|
|
155
|
-
dashboardId:
|
|
156
|
-
live:
|
|
155
|
+
children: [/* @__PURE__ */ S(w, {
|
|
156
|
+
label: f("bigconsole.widget.aiPreview.tab.widget", "Widget"),
|
|
157
|
+
onOpen: V ? () => T(`/dashboards/${V}`) : void 0
|
|
158
|
+
}), /* @__PURE__ */ S(l, {
|
|
159
|
+
dashboardId: V,
|
|
160
|
+
live: E
|
|
157
161
|
})]
|
|
158
162
|
})
|
|
159
163
|
]
|
|
160
164
|
})]
|
|
161
165
|
}),
|
|
162
|
-
|
|
166
|
+
M ? /* @__PURE__ */ S("p", {
|
|
163
167
|
className: "border-t border-border-subtle px-3 py-2 text-xs text-status-error-text",
|
|
164
168
|
"data-testid": "ai-preview-error",
|
|
165
|
-
children:
|
|
169
|
+
children: M
|
|
166
170
|
}) : null
|
|
167
171
|
]
|
|
168
|
-
}) : /* @__PURE__ */
|
|
172
|
+
}) : /* @__PURE__ */ S("div", {
|
|
169
173
|
className: "flex justify-end px-4 pt-3 md:px-6",
|
|
170
|
-
style: { marginRight:
|
|
171
|
-
children: /* @__PURE__ */
|
|
174
|
+
style: { marginRight: U },
|
|
175
|
+
children: /* @__PURE__ */ C(_, {
|
|
172
176
|
size: "sm",
|
|
173
177
|
variant: "outline",
|
|
174
|
-
onClick:
|
|
178
|
+
onClick: P,
|
|
175
179
|
"data-testid": "ai-preview-open",
|
|
176
180
|
children: [
|
|
177
|
-
/* @__PURE__ */
|
|
178
|
-
"Preview",
|
|
179
|
-
|
|
181
|
+
/* @__PURE__ */ S(m, { className: "mr-1.5 size-4" }),
|
|
182
|
+
f("bigconsole.widget.aiPreview.previewButton", "Preview"),
|
|
183
|
+
E ? /* @__PURE__ */ S(p, { className: "ml-1.5 size-3.5 animate-spin" }) : null
|
|
180
184
|
]
|
|
181
185
|
})
|
|
182
186
|
}) : null;
|
|
183
187
|
}
|
|
184
188
|
//#endregion
|
|
185
|
-
export {
|
|
189
|
+
export { T as default };
|
|
186
190
|
|
|
187
191
|
//# sourceMappingURL=AiPreviewPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiPreviewPanel.js","names":[],"sources":["../../../../src/bigconsole/components/preview/AiPreviewPanel.tsx"],"sourcesContent":["/**\n * AI Preview — watch the assistant build, with the real content inline.\n *\n * Opens by itself the moment a prompt starts. A step rail (driven by the agent's\n * own narration) shows DataSink → Dashboard → Parser → Widget filling in, and\n * the four tabs show the ACTUAL content of each entity as it lands — the data\n * sink's rows, the live dashboard, the parser's transformed output, the rendered\n * widget charts — not a list of links. The tab auto-switches to whatever step is\n * being worked on, and each tab has an \"Open\" button (top-right) that jumps to\n * the real page.\n *\n * The content renderers need Apollo + the BigConsole providers, which is why\n * this full panel lives inside BigConsoleRoot; the store-only app-shell mini\n * panel (AiPreviewMiniPanel) keeps the lighter link view for other pages.\n */\nimport { useEffect, useState } from 'react';\nimport { Button, Tabs, TabsContent, TabsList, TabsTrigger } from '@burdenoff/fe-libs/ui';\nimport { ArrowUpRight, Loader2, Sparkles, X } from 'lucide-react';\n\nimport { PREVIEW_STEPS, type PreviewStepKey, useAssistantRunStore } from '../../assistant/assistantRunStore';\nimport { useBigConsoleNavigate } from '../../context';\nimport { StepRail, formatAgo, useAssistantSidebarWidth } from './previewShared';\nimport { DashboardContent, DataSinkContent, ParserContent, WidgetsContent } from './AiPreviewContent';\n\n/** A tab's top bar: what this tab is, plus a jump-to-the-real-page button. */\nfunction TabHeader({ label, onOpen }: { label: string; onOpen?: () => void }) {\n return (\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-text-muted\">{label}</span>\n {onOpen ? (\n <Button size=\"sm\" variant=\"outline\" onClick={onOpen} data-testid=\"ai-preview-open-entity\">\n Open\n <ArrowUpRight className=\"ml-1 size-3.5\" />\n </Button>\n ) : null}\n </div>\n );\n}\n\nexport function AiPreviewPanel() {\n const navigate = useBigConsoleNavigate();\n\n const isRunning = useAssistantRunStore((state) => state.isRunning);\n const previewOpen = useAssistantRunStore((state) => state.previewOpen);\n const hasRun = useAssistantRunStore((state) => state.hasRun);\n const steps = useAssistantRunStore((state) => state.steps);\n const entityIds = useAssistantRunStore((state) => state.entityIds);\n const caption = useAssistantRunStore((state) => state.caption);\n const error = useAssistantRunStore((state) => state.error);\n const updatedAt = useAssistantRunStore((state) => state.updatedAt);\n const openPreview = useAssistantRunStore((state) => state.openPreview);\n const closePreview = useAssistantRunStore((state) => state.closePreview);\n const setRichMounted = useAssistantRunStore((state) => state.setRichMounted);\n\n // Tell the app-shell mini panel to stand down while this full panel is on a\n // /bigconsole page. On unmount (e.g. navigating to /workflows mid-run) this\n // flips false and the mini panel takes over so the build stays visible.\n useEffect(() => {\n setRichMounted(true);\n return () => setRichMounted(false);\n }, [setRichMounted]);\n\n const [tab, setTab] = useState<PreviewStepKey>('datasink');\n const [now, setNow] = useState(() => Date.now());\n\n const dashboardId = entityIds.dashboard;\n\n // Tick the \"updated Xs ago\" label while a turn is live.\n useEffect(() => {\n if (!isRunning) return;\n const intervalId = window.setInterval(() => setNow(Date.now()), 1000);\n return () => window.clearInterval(intervalId);\n }, [isRunning]);\n\n // Follow the build by showing the LATEST thing that actually landed — so the\n // moment the data sink is created you see its rows, not an empty \"waiting for\n // the dashboard\" tab. (The rail still shows the spinner on the next step.) If\n // nothing has landed yet, sit on whatever is being worked on.\n useEffect(() => {\n const done = PREVIEW_STEPS.filter((key) => steps[key] === 'done');\n const latestDone = done[done.length - 1];\n if (latestDone) {\n setTab(latestDone);\n return;\n }\n const running = PREVIEW_STEPS.find((key) => steps[key] === 'running');\n if (running) setTab(running);\n }, [steps]);\n\n const agoSeconds = updatedAt ? Math.max(0, Math.floor((now - updatedAt) / 1000)) : 0;\n\n // Keep clear of the assistant.\n //\n // The assistant sidebar is `position: fixed` — it OVERLAYS the page instead of\n // reflowing it. A panel that spans the full content width therefore runs\n // underneath it, and everything in that overlapped strip (tabs, Open buttons)\n // silently stops taking clicks. Measure the real element rather than hardcoding\n // 560px: the widget is responsive, and it can be closed mid-run.\n const assistantWidth = useAssistantSidebarWidth();\n\n if (!hasRun) return null;\n\n if (!previewOpen) {\n return (\n <div className=\"flex justify-end px-4 pt-3 md:px-6\" style={{ marginRight: assistantWidth }}>\n <Button size=\"sm\" variant=\"outline\" onClick={openPreview} data-testid=\"ai-preview-open\">\n <Sparkles className=\"mr-1.5 size-4\" />\n Preview\n {isRunning ? <Loader2 className=\"ml-1.5 size-3.5 animate-spin\" /> : null}\n </Button>\n </div>\n );\n }\n\n return (\n <section\n data-testid=\"ai-preview-panel\"\n aria-label=\"AI preview\"\n style={{ marginRight: assistantWidth ? assistantWidth + 16 : undefined }}\n className=\"mx-4 mt-3 overflow-hidden rounded-lg border border-border-default bg-bg-sunken shadow-sm md:mx-6\"\n >\n {/* Header + live strip */}\n <div className=\"flex items-center justify-between gap-3 border-b border-border-subtle bg-bg-surface px-3 py-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <Sparkles className=\"size-4 shrink-0 text-action-primary-bg\" />\n <h2 className=\"truncate text-sm font-semibold text-text-primary\">AI Preview</h2>\n {isRunning ? (\n <span\n className=\"inline-flex items-center gap-1.5 rounded-full bg-status-success-bg px-2 py-0.5 text-[11px] font-semibold uppercase tracking-wide text-status-success-text\"\n data-testid=\"ai-preview-live\"\n >\n <span className=\"relative flex size-2\">\n <span className=\"absolute inline-flex size-full animate-ping rounded-full bg-status-success-text opacity-75\" />\n <span className=\"relative inline-flex size-2 rounded-full bg-status-success-text\" />\n </span>\n Live\n </span>\n ) : null}\n <span className=\"truncate text-xs text-text-muted\" data-testid=\"ai-preview-ago\">\n {isRunning ? (caption ? caption : 'Working…') : error ? 'Stopped' : 'Done'} · updated{' '}\n {formatAgo(agoSeconds)}\n </span>\n </div>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={closePreview}\n aria-label=\"Close preview\"\n data-testid=\"ai-preview-close\"\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n\n {/* Step rail */}\n <div className=\"border-b border-border-subtle px-3 py-2\">\n <StepRail steps={steps} />\n </div>\n\n {/* Tabs — each shows the real content of the built entity */}\n <Tabs value={tab} onValueChange={(value) => setTab(value as PreviewStepKey)}>\n <TabsList className=\"mx-3 mt-2\">\n <TabsTrigger value=\"datasink\" data-testid=\"ai-preview-tab-datasink\">\n Data Sink\n </TabsTrigger>\n <TabsTrigger value=\"dashboard\" data-testid=\"ai-preview-tab-dashboard\">\n Dashboard\n </TabsTrigger>\n <TabsTrigger value=\"parser\" data-testid=\"ai-preview-tab-parser\">\n Parser\n </TabsTrigger>\n <TabsTrigger value=\"widget\" data-testid=\"ai-preview-tab-widget\">\n Widget\n </TabsTrigger>\n </TabsList>\n\n <div className=\"max-h-[440px] overflow-y-auto p-3\">\n <TabsContent value=\"datasink\">\n <TabHeader\n label=\"Data Sink\"\n onOpen={entityIds.datasink ? () => navigate(`/datasinks/${entityIds.datasink}`) : undefined}\n />\n <DataSinkContent id={entityIds.datasink} live={isRunning} />\n </TabsContent>\n\n <TabsContent value=\"dashboard\">\n <TabHeader\n label=\"Dashboard\"\n onOpen={entityIds.dashboard ? () => navigate(`/dashboards/${entityIds.dashboard}`) : undefined}\n />\n <DashboardContent dashboardId={entityIds.dashboard} />\n </TabsContent>\n\n <TabsContent value=\"parser\">\n <TabHeader\n label=\"Parser\"\n onOpen={entityIds.parser ? () => navigate(`/parsers/${entityIds.parser}`) : undefined}\n />\n <ParserContent parserId={entityIds.parser} live={isRunning} />\n </TabsContent>\n\n <TabsContent value=\"widget\">\n <TabHeader label=\"Widget\" onOpen={dashboardId ? () => navigate(`/dashboards/${dashboardId}`) : undefined} />\n <WidgetsContent dashboardId={dashboardId} live={isRunning} />\n </TabsContent>\n </div>\n </Tabs>\n\n {error ? (\n <p\n className=\"border-t border-border-subtle px-3 py-2 text-xs text-status-error-text\"\n data-testid=\"ai-preview-error\"\n >\n {error}\n </p>\n ) : null}\n </section>\n );\n}\n\nexport default AiPreviewPanel;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AiPreviewPanel.js","names":[],"sources":["../../../../src/bigconsole/components/preview/AiPreviewPanel.tsx"],"sourcesContent":["/**\n * AI Preview — watch the assistant build, with the real content inline.\n *\n * Opens by itself the moment a prompt starts. A step rail (driven by the agent's\n * own narration) shows DataSink → Dashboard → Parser → Widget filling in, and\n * the four tabs show the ACTUAL content of each entity as it lands — the data\n * sink's rows, the live dashboard, the parser's transformed output, the rendered\n * widget charts — not a list of links. The tab auto-switches to whatever step is\n * being worked on, and each tab has an \"Open\" button (top-right) that jumps to\n * the real page.\n *\n * The content renderers need Apollo + the BigConsole providers, which is why\n * this full panel lives inside BigConsoleRoot; the store-only app-shell mini\n * panel (AiPreviewMiniPanel) keeps the lighter link view for other pages.\n */\nimport { useEffect, useState } from 'react';\nimport { Button, Tabs, TabsContent, TabsList, TabsTrigger } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { ArrowUpRight, Loader2, Sparkles, X } from 'lucide-react';\n\nimport { PREVIEW_STEPS, type PreviewStepKey, useAssistantRunStore } from '../../assistant/assistantRunStore';\nimport { useBigConsoleNavigate } from '../../context';\nimport { StepRail, formatAgo, useAssistantSidebarWidth } from './previewShared';\nimport { DashboardContent, DataSinkContent, ParserContent, WidgetsContent } from './AiPreviewContent';\n\n/** A tab's top bar: what this tab is, plus a jump-to-the-real-page button. */\nfunction TabHeader({ label, onOpen }: { label: string; onOpen?: () => void }) {\n const { t } = useI18n();\n return (\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-text-muted\">{label}</span>\n {onOpen ? (\n <Button size=\"sm\" variant=\"outline\" onClick={onOpen} data-testid=\"ai-preview-open-entity\">\n {t('bigconsole.widget.aiPreview.open', 'Open')}\n <ArrowUpRight className=\"ml-1 size-3.5\" />\n </Button>\n ) : null}\n </div>\n );\n}\n\nexport function AiPreviewPanel() {\n const { t } = useI18n();\n const navigate = useBigConsoleNavigate();\n\n const isRunning = useAssistantRunStore((state) => state.isRunning);\n const previewOpen = useAssistantRunStore((state) => state.previewOpen);\n const hasRun = useAssistantRunStore((state) => state.hasRun);\n const steps = useAssistantRunStore((state) => state.steps);\n const entityIds = useAssistantRunStore((state) => state.entityIds);\n const caption = useAssistantRunStore((state) => state.caption);\n const error = useAssistantRunStore((state) => state.error);\n const updatedAt = useAssistantRunStore((state) => state.updatedAt);\n const openPreview = useAssistantRunStore((state) => state.openPreview);\n const closePreview = useAssistantRunStore((state) => state.closePreview);\n const setRichMounted = useAssistantRunStore((state) => state.setRichMounted);\n\n // Tell the app-shell mini panel to stand down while this full panel is on a\n // /bigconsole page. On unmount (e.g. navigating to /workflows mid-run) this\n // flips false and the mini panel takes over so the build stays visible.\n useEffect(() => {\n setRichMounted(true);\n return () => setRichMounted(false);\n }, [setRichMounted]);\n\n const [tab, setTab] = useState<PreviewStepKey>('datasink');\n const [now, setNow] = useState(() => Date.now());\n\n const dashboardId = entityIds.dashboard;\n\n // Tick the \"updated Xs ago\" label while a turn is live.\n useEffect(() => {\n if (!isRunning) return;\n const intervalId = window.setInterval(() => setNow(Date.now()), 1000);\n return () => window.clearInterval(intervalId);\n }, [isRunning]);\n\n // Follow the build by showing the LATEST thing that actually landed — so the\n // moment the data sink is created you see its rows, not an empty \"waiting for\n // the dashboard\" tab. (The rail still shows the spinner on the next step.) If\n // nothing has landed yet, sit on whatever is being worked on.\n useEffect(() => {\n const done = PREVIEW_STEPS.filter((key) => steps[key] === 'done');\n const latestDone = done[done.length - 1];\n if (latestDone) {\n setTab(latestDone);\n return;\n }\n const running = PREVIEW_STEPS.find((key) => steps[key] === 'running');\n if (running) setTab(running);\n }, [steps]);\n\n const agoSeconds = updatedAt ? Math.max(0, Math.floor((now - updatedAt) / 1000)) : 0;\n\n // Keep clear of the assistant.\n //\n // The assistant sidebar is `position: fixed` — it OVERLAYS the page instead of\n // reflowing it. A panel that spans the full content width therefore runs\n // underneath it, and everything in that overlapped strip (tabs, Open buttons)\n // silently stops taking clicks. Measure the real element rather than hardcoding\n // 560px: the widget is responsive, and it can be closed mid-run.\n const assistantWidth = useAssistantSidebarWidth();\n\n if (!hasRun) return null;\n\n if (!previewOpen) {\n return (\n <div className=\"flex justify-end px-4 pt-3 md:px-6\" style={{ marginRight: assistantWidth }}>\n <Button size=\"sm\" variant=\"outline\" onClick={openPreview} data-testid=\"ai-preview-open\">\n <Sparkles className=\"mr-1.5 size-4\" />\n {t('bigconsole.widget.aiPreview.previewButton', 'Preview')}\n {isRunning ? <Loader2 className=\"ml-1.5 size-3.5 animate-spin\" /> : null}\n </Button>\n </div>\n );\n }\n\n return (\n <section\n data-testid=\"ai-preview-panel\"\n aria-label={t('bigconsole.widget.aiPreview.ariaLabel', 'AI preview')}\n style={{ marginRight: assistantWidth ? assistantWidth + 16 : undefined }}\n className=\"mx-4 mt-3 overflow-hidden rounded-lg border border-border-default bg-bg-sunken shadow-sm md:mx-6\"\n >\n {/* Header + live strip */}\n <div className=\"flex items-center justify-between gap-3 border-b border-border-subtle bg-bg-surface px-3 py-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <Sparkles className=\"size-4 shrink-0 text-action-primary-bg\" />\n <h2 className=\"truncate text-sm font-semibold text-text-primary\">\n {t('bigconsole.widget.aiPreview.title', 'AI Preview')}\n </h2>\n {isRunning ? (\n <span\n className=\"inline-flex items-center gap-1.5 rounded-full bg-status-success-bg px-2 py-0.5 text-[11px] font-semibold uppercase tracking-wide text-status-success-text\"\n data-testid=\"ai-preview-live\"\n >\n <span className=\"relative flex size-2\">\n <span className=\"absolute inline-flex size-full animate-ping rounded-full bg-status-success-text opacity-75\" />\n <span className=\"relative inline-flex size-2 rounded-full bg-status-success-text\" />\n </span>\n {t('bigconsole.widget.aiPreview.live', 'Live')}\n </span>\n ) : null}\n <span className=\"truncate text-xs text-text-muted\" data-testid=\"ai-preview-ago\">\n {isRunning\n ? caption\n ? caption\n : t('bigconsole.widget.aiPreview.working', 'Working…')\n : error\n ? t('bigconsole.widget.aiPreview.stopped', 'Stopped')\n : t('bigconsole.widget.aiPreview.done', 'Done')}{' '}\n · {t('bigconsole.widget.aiPreview.updated', 'updated')} {formatAgo(agoSeconds)}\n </span>\n </div>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={closePreview}\n aria-label={t('bigconsole.widget.aiPreview.closeAriaLabel', 'Close preview')}\n data-testid=\"ai-preview-close\"\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n\n {/* Step rail */}\n <div className=\"border-b border-border-subtle px-3 py-2\">\n <StepRail steps={steps} />\n </div>\n\n {/* Tabs — each shows the real content of the built entity */}\n <Tabs value={tab} onValueChange={(value) => setTab(value as PreviewStepKey)}>\n <TabsList className=\"mx-3 mt-2\">\n <TabsTrigger value=\"datasink\" data-testid=\"ai-preview-tab-datasink\">\n {t('bigconsole.widget.aiPreview.tab.dataSink', 'Data Sink')}\n </TabsTrigger>\n <TabsTrigger value=\"dashboard\" data-testid=\"ai-preview-tab-dashboard\">\n {t('bigconsole.widget.aiPreview.tab.dashboard', 'Dashboard')}\n </TabsTrigger>\n <TabsTrigger value=\"parser\" data-testid=\"ai-preview-tab-parser\">\n {t('bigconsole.widget.aiPreview.tab.parser', 'Parser')}\n </TabsTrigger>\n <TabsTrigger value=\"widget\" data-testid=\"ai-preview-tab-widget\">\n {t('bigconsole.widget.aiPreview.tab.widget', 'Widget')}\n </TabsTrigger>\n </TabsList>\n\n <div className=\"max-h-[440px] overflow-y-auto p-3\">\n <TabsContent value=\"datasink\">\n <TabHeader\n label={t('bigconsole.widget.aiPreview.tab.dataSink', 'Data Sink')}\n onOpen={entityIds.datasink ? () => navigate(`/datasinks/${entityIds.datasink}`) : undefined}\n />\n <DataSinkContent id={entityIds.datasink} live={isRunning} />\n </TabsContent>\n\n <TabsContent value=\"dashboard\">\n <TabHeader\n label={t('bigconsole.widget.aiPreview.tab.dashboard', 'Dashboard')}\n onOpen={entityIds.dashboard ? () => navigate(`/dashboards/${entityIds.dashboard}`) : undefined}\n />\n <DashboardContent dashboardId={entityIds.dashboard} />\n </TabsContent>\n\n <TabsContent value=\"parser\">\n <TabHeader\n label={t('bigconsole.widget.aiPreview.tab.parser', 'Parser')}\n onOpen={entityIds.parser ? () => navigate(`/parsers/${entityIds.parser}`) : undefined}\n />\n <ParserContent parserId={entityIds.parser} live={isRunning} />\n </TabsContent>\n\n <TabsContent value=\"widget\">\n <TabHeader\n label={t('bigconsole.widget.aiPreview.tab.widget', 'Widget')}\n onOpen={dashboardId ? () => navigate(`/dashboards/${dashboardId}`) : undefined}\n />\n <WidgetsContent dashboardId={dashboardId} live={isRunning} />\n </TabsContent>\n </div>\n </Tabs>\n\n {error ? (\n <p\n className=\"border-t border-border-subtle px-3 py-2 text-xs text-status-error-text\"\n data-testid=\"ai-preview-error\"\n >\n {error}\n </p>\n ) : null}\n </section>\n );\n}\n\nexport default AiPreviewPanel;\n"],"mappings":"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"}
|