@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
|
@@ -10,67 +10,89 @@ import { memo as c, useCallback as l, useMemo as u, useState as d } from "react"
|
|
|
10
10
|
import { AccessDenied as f, PermissionButton as p } from "@burdenoff/fe-libs/shared/components";
|
|
11
11
|
import { usePermissions as m } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
12
12
|
import { AlertCircle as h, GitBranch as g, Plus as _, Search as v } from "lucide-react";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
13
|
+
import { useI18n as y } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
14
|
+
import { AuroraBackground as b, Button as x, Card as S, CardContent as C, GlassCard as w, GradientText as T, IllustratedEmptyState as E, Input as D, PagePurpose as O, Spinner as k } from "@burdenoff/fe-libs/ui";
|
|
15
|
+
import { jsx as A, jsxs as j } from "react/jsx-runtime";
|
|
15
16
|
//#region src/bigconsole/pages/PipelinesPage.tsx
|
|
16
|
-
var
|
|
17
|
-
let c = t(), { hasPermission:
|
|
18
|
-
let e = [...
|
|
19
|
-
if (
|
|
20
|
-
let t =
|
|
17
|
+
var M = c(function() {
|
|
18
|
+
let c = t(), { t: M } = y(), { hasPermission: N, isLoading: P } = m(), F = N(r.PIPELINE_READ), I = N(r.PIPELINE_UPDATE), L = N(r.PIPELINE_DELETE), R = N(r.PIPELINE_TEST), [z, B] = d("all"), V = e((e) => e.searchQuery), H = e((e) => e.setSearchQuery), U = e((e) => e.deleteDialogOpen), W = e((e) => e.currentPipeline), G = e((e) => e.openDeleteDialog), K = e((e) => e.closeDeleteDialog), { loading: q, error: J, pipelines: Y, deletePipeline: X, refetch: Z } = n({ consoleId: "default" }), Q = u(() => {
|
|
19
|
+
let e = [...Y];
|
|
20
|
+
if (z !== "all" && (e = e.filter((e) => e.status === z)), V.trim()) {
|
|
21
|
+
let t = V.toLowerCase();
|
|
21
22
|
e = e.filter((e) => e.name.toLowerCase().includes(t) || e.description?.toLowerCase().includes(t));
|
|
22
23
|
}
|
|
23
24
|
return e.sort((e, t) => new Date(t.updatedAt).getTime() - new Date(e.updatedAt).getTime());
|
|
24
25
|
}, [
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
]),
|
|
26
|
+
Y,
|
|
27
|
+
z,
|
|
28
|
+
V
|
|
29
|
+
]), $ = l(() => {
|
|
29
30
|
c("/pipelines/new");
|
|
30
|
-
}, [c]),
|
|
31
|
+
}, [c]), ee = l((e) => {
|
|
31
32
|
c(`/pipelines/${e}`);
|
|
32
|
-
}, [c]),
|
|
33
|
+
}, [c]), te = l((e) => {
|
|
33
34
|
c(`/pipelines/${e}/edit`);
|
|
34
|
-
}, [c]),
|
|
35
|
+
}, [c]), ne = l((e) => {
|
|
35
36
|
c(`/pipelines/${e}?test=true`);
|
|
36
|
-
}, [c]),
|
|
37
|
-
let t =
|
|
38
|
-
t &&
|
|
39
|
-
}, [
|
|
40
|
-
if (
|
|
37
|
+
}, [c]), re = l((e) => {
|
|
38
|
+
let t = Y.find((t) => t.id === e);
|
|
39
|
+
t && G(t);
|
|
40
|
+
}, [Y, G]), ie = l(async () => {
|
|
41
|
+
if (W) {
|
|
41
42
|
try {
|
|
42
|
-
await
|
|
43
|
+
await X(W.id), i() && a("success");
|
|
43
44
|
} catch (e) {
|
|
44
45
|
throw i() && a("error"), e;
|
|
45
46
|
}
|
|
46
|
-
|
|
47
|
+
K();
|
|
47
48
|
}
|
|
48
49
|
}, [
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
])
|
|
53
|
-
|
|
50
|
+
W,
|
|
51
|
+
X,
|
|
52
|
+
K
|
|
53
|
+
]), ae = [
|
|
54
|
+
{
|
|
55
|
+
value: "all",
|
|
56
|
+
label: M("bigconsole.pipelines.filters.all", "All")
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
value: "draft",
|
|
60
|
+
label: M("bigconsole.pipelines.filters.draft", "Draft")
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
value: "active",
|
|
64
|
+
label: M("bigconsole.pipelines.filters.active", "Active")
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
value: "inactive",
|
|
68
|
+
label: M("bigconsole.pipelines.filters.inactive", "Inactive")
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
value: "error",
|
|
72
|
+
label: M("bigconsole.pipelines.filters.error", "Error")
|
|
73
|
+
}
|
|
74
|
+
];
|
|
75
|
+
return P ? /* @__PURE__ */ A("div", {
|
|
54
76
|
style: {
|
|
55
77
|
display: "flex",
|
|
56
78
|
alignItems: "center",
|
|
57
79
|
justifyContent: "center",
|
|
58
80
|
padding: "80px 0"
|
|
59
81
|
},
|
|
60
|
-
children: /* @__PURE__ */ k
|
|
82
|
+
children: /* @__PURE__ */ A(k, { style: {
|
|
61
83
|
height: "var(--size-icon-xl)",
|
|
62
84
|
width: "var(--size-icon-xl)"
|
|
63
85
|
} })
|
|
64
|
-
}) :
|
|
86
|
+
}) : F ? J ? /* @__PURE__ */ A("div", {
|
|
65
87
|
style: { padding: "var(--space-pagePadding)" },
|
|
66
|
-
children: /* @__PURE__ */
|
|
88
|
+
children: /* @__PURE__ */ A(S, {
|
|
67
89
|
style: {
|
|
68
90
|
borderColor: "var(--color-status-error-border)",
|
|
69
91
|
backgroundColor: "var(--color-status-error-bgSubtle)"
|
|
70
92
|
},
|
|
71
|
-
children: /* @__PURE__ */
|
|
93
|
+
children: /* @__PURE__ */ A(C, {
|
|
72
94
|
style: { padding: "var(--space-pagePadding)" },
|
|
73
|
-
children: /* @__PURE__ */
|
|
95
|
+
children: /* @__PURE__ */ j("div", {
|
|
74
96
|
style: {
|
|
75
97
|
display: "flex",
|
|
76
98
|
flexDirection: "column",
|
|
@@ -78,68 +100,68 @@ var j = c(function() {
|
|
|
78
100
|
textAlign: "center"
|
|
79
101
|
},
|
|
80
102
|
children: [
|
|
81
|
-
/* @__PURE__ */
|
|
103
|
+
/* @__PURE__ */ A("div", {
|
|
82
104
|
style: {
|
|
83
105
|
padding: "var(--space-controlGap)",
|
|
84
106
|
borderRadius: "50%",
|
|
85
107
|
backgroundColor: "var(--color-status-error-bgSubtle)",
|
|
86
108
|
marginBottom: "var(--space-formGap)"
|
|
87
109
|
},
|
|
88
|
-
children: /* @__PURE__ */
|
|
110
|
+
children: /* @__PURE__ */ A(h, { style: {
|
|
89
111
|
height: "var(--size-icon-xl)",
|
|
90
112
|
width: "var(--size-icon-xl)",
|
|
91
113
|
color: "var(--color-status-error-text)"
|
|
92
114
|
} })
|
|
93
115
|
}),
|
|
94
|
-
/* @__PURE__ */
|
|
116
|
+
/* @__PURE__ */ A("h3", {
|
|
95
117
|
style: {
|
|
96
118
|
fontSize: "var(--font-size-body-lg)",
|
|
97
119
|
fontWeight: "var(--font-weight-medium)",
|
|
98
120
|
color: "var(--color-status-error-text)",
|
|
99
121
|
marginBottom: "var(--space-controlGap)"
|
|
100
122
|
},
|
|
101
|
-
children: "Failed to load Pipelines"
|
|
123
|
+
children: M("bigconsole.pipelines.errors.loadListTitle", "Failed to load Pipelines")
|
|
102
124
|
}),
|
|
103
|
-
/* @__PURE__ */
|
|
125
|
+
/* @__PURE__ */ A("p", {
|
|
104
126
|
style: {
|
|
105
127
|
fontSize: "var(--font-size-body-sm)",
|
|
106
128
|
color: "var(--color-text-secondary)",
|
|
107
129
|
marginBottom: "var(--space-formGap)"
|
|
108
130
|
},
|
|
109
|
-
children:
|
|
131
|
+
children: J.message
|
|
110
132
|
}),
|
|
111
|
-
/* @__PURE__ */
|
|
133
|
+
/* @__PURE__ */ A(x, {
|
|
112
134
|
size: "sm",
|
|
113
|
-
onClick: () =>
|
|
114
|
-
children: "Try Again"
|
|
135
|
+
onClick: () => Z(),
|
|
136
|
+
children: M("bigconsole.pipelines.actions.tryAgain", "Try Again")
|
|
115
137
|
})
|
|
116
138
|
]
|
|
117
139
|
})
|
|
118
140
|
})
|
|
119
141
|
})
|
|
120
|
-
}) : /* @__PURE__ */
|
|
142
|
+
}) : /* @__PURE__ */ j("div", {
|
|
121
143
|
style: {
|
|
122
144
|
minHeight: "100vh",
|
|
123
145
|
backgroundColor: "var(--color-bg-canvas)"
|
|
124
146
|
},
|
|
125
147
|
children: [
|
|
126
|
-
/* @__PURE__ */
|
|
148
|
+
/* @__PURE__ */ j("div", {
|
|
127
149
|
className: "relative overflow-hidden border-b border-border-seam bg-gloss-card",
|
|
128
|
-
children: [/* @__PURE__ */
|
|
150
|
+
children: [/* @__PURE__ */ A(b, { intensity: "subtle" }), /* @__PURE__ */ A("div", {
|
|
129
151
|
style: { padding: "var(--space-pagePadding)" },
|
|
130
|
-
children: /* @__PURE__ */
|
|
152
|
+
children: /* @__PURE__ */ j("div", {
|
|
131
153
|
style: {
|
|
132
154
|
display: "flex",
|
|
133
155
|
alignItems: "center",
|
|
134
156
|
justifyContent: "space-between"
|
|
135
157
|
},
|
|
136
|
-
children: [/* @__PURE__ */
|
|
158
|
+
children: [/* @__PURE__ */ j("div", {
|
|
137
159
|
style: {
|
|
138
160
|
display: "flex",
|
|
139
161
|
alignItems: "center",
|
|
140
162
|
gap: "var(--space-formGap)"
|
|
141
163
|
},
|
|
142
|
-
children: [/* @__PURE__ */
|
|
164
|
+
children: [/* @__PURE__ */ A("div", {
|
|
143
165
|
style: {
|
|
144
166
|
display: "flex",
|
|
145
167
|
height: "var(--size-controlHeight-lg)",
|
|
@@ -149,52 +171,52 @@ var j = c(function() {
|
|
|
149
171
|
borderRadius: "var(--radius-card)",
|
|
150
172
|
backgroundColor: "var(--color-action-primary-bg)"
|
|
151
173
|
},
|
|
152
|
-
children: /* @__PURE__ */
|
|
174
|
+
children: /* @__PURE__ */ A(g, { style: {
|
|
153
175
|
height: "var(--size-icon-lg)",
|
|
154
176
|
width: "var(--size-icon-lg)",
|
|
155
177
|
color: "var(--color-action-primary-text)"
|
|
156
178
|
} })
|
|
157
|
-
}), /* @__PURE__ */
|
|
179
|
+
}), /* @__PURE__ */ j("div", { children: [/* @__PURE__ */ A("h1", {
|
|
158
180
|
style: {
|
|
159
181
|
fontSize: "var(--font-size-heading-h4)",
|
|
160
182
|
fontWeight: "var(--font-weight-bold)",
|
|
161
183
|
margin: 0,
|
|
162
184
|
color: "var(--color-text-primary)"
|
|
163
185
|
},
|
|
164
|
-
children: /* @__PURE__ */
|
|
165
|
-
}), /* @__PURE__ */
|
|
186
|
+
children: /* @__PURE__ */ A(T, { children: M("bigconsole.pipelines.list.heading", "Pipelines") })
|
|
187
|
+
}), /* @__PURE__ */ A("p", {
|
|
166
188
|
style: {
|
|
167
189
|
fontSize: "var(--font-size-body-sm)",
|
|
168
190
|
color: "var(--color-text-secondary)",
|
|
169
191
|
margin: 0
|
|
170
192
|
},
|
|
171
|
-
children: "Create and manage sequential parser chains for data transformation"
|
|
193
|
+
children: M("bigconsole.pipelines.list.subtitle", "Create and manage sequential parser chains for data transformation")
|
|
172
194
|
})] })]
|
|
173
|
-
}), /* @__PURE__ */
|
|
195
|
+
}), /* @__PURE__ */ A(p, {
|
|
174
196
|
permission: r.PIPELINE_CREATE,
|
|
175
197
|
deniedBehavior: "disable",
|
|
176
|
-
children: /* @__PURE__ */
|
|
177
|
-
onClick:
|
|
178
|
-
children: [/* @__PURE__ */
|
|
198
|
+
children: /* @__PURE__ */ j(x, {
|
|
199
|
+
onClick: $,
|
|
200
|
+
children: [/* @__PURE__ */ A(_, { style: {
|
|
179
201
|
marginRight: "var(--space-iconGap)",
|
|
180
202
|
height: "var(--size-icon-sm)",
|
|
181
203
|
width: "var(--size-icon-sm)"
|
|
182
|
-
} }), "Create Pipeline"]
|
|
204
|
+
} }), M("bigconsole.pipelines.actions.createPipeline", "Create Pipeline")]
|
|
183
205
|
})
|
|
184
206
|
})]
|
|
185
207
|
})
|
|
186
208
|
})]
|
|
187
209
|
}),
|
|
188
|
-
/* @__PURE__ */
|
|
210
|
+
/* @__PURE__ */ j("div", {
|
|
189
211
|
style: { padding: "var(--space-pagePadding)" },
|
|
190
212
|
children: [
|
|
191
|
-
/* @__PURE__ */
|
|
213
|
+
/* @__PURE__ */ A(O, {
|
|
192
214
|
className: "mb-[var(--space-sectionGap)]",
|
|
193
|
-
children: "Pipelines chain parsers and data sinks into a repeatable flow — they take raw input, run it through your parsers, and route the structured result into a sink. Use them to turn messy logs, files, or API payloads into clean, queryable data your dashboards can use."
|
|
215
|
+
children: M("bigconsole.pipelines.list.purpose", "Pipelines chain parsers and data sinks into a repeatable flow — they take raw input, run it through your parsers, and route the structured result into a sink. Use them to turn messy logs, files, or API payloads into clean, queryable data your dashboards can use.")
|
|
194
216
|
}),
|
|
195
|
-
/* @__PURE__ */
|
|
217
|
+
/* @__PURE__ */ A("div", {
|
|
196
218
|
style: { marginBottom: "var(--space-formGap)" },
|
|
197
|
-
children: /* @__PURE__ */
|
|
219
|
+
children: /* @__PURE__ */ A("div", {
|
|
198
220
|
style: {
|
|
199
221
|
display: "flex",
|
|
200
222
|
alignItems: "center",
|
|
@@ -204,30 +226,9 @@ var j = c(function() {
|
|
|
204
226
|
borderRadius: "var(--radius-card)",
|
|
205
227
|
width: "fit-content"
|
|
206
228
|
},
|
|
207
|
-
children:
|
|
208
|
-
{
|
|
209
|
-
value: "all",
|
|
210
|
-
label: "All"
|
|
211
|
-
},
|
|
212
|
-
{
|
|
213
|
-
value: "draft",
|
|
214
|
-
label: "Draft"
|
|
215
|
-
},
|
|
216
|
-
{
|
|
217
|
-
value: "active",
|
|
218
|
-
label: "Active"
|
|
219
|
-
},
|
|
220
|
-
{
|
|
221
|
-
value: "inactive",
|
|
222
|
-
label: "Inactive"
|
|
223
|
-
},
|
|
224
|
-
{
|
|
225
|
-
value: "error",
|
|
226
|
-
label: "Error"
|
|
227
|
-
}
|
|
228
|
-
].map((e) => /* @__PURE__ */ k("button", {
|
|
229
|
+
children: ae.map((e) => /* @__PURE__ */ A("button", {
|
|
229
230
|
type: "button",
|
|
230
|
-
onClick: () =>
|
|
231
|
+
onClick: () => B(e.value),
|
|
231
232
|
style: {
|
|
232
233
|
padding: "var(--space-controlGap) var(--space-formGap)",
|
|
233
234
|
fontSize: "var(--font-size-body-sm)",
|
|
@@ -236,22 +237,22 @@ var j = c(function() {
|
|
|
236
237
|
border: "none",
|
|
237
238
|
cursor: "pointer",
|
|
238
239
|
transition: "all 0.2s ease",
|
|
239
|
-
backgroundColor:
|
|
240
|
-
color:
|
|
241
|
-
boxShadow:
|
|
240
|
+
backgroundColor: z === e.value ? "var(--color-bg-surface)" : "transparent",
|
|
241
|
+
color: z === e.value ? "var(--color-text-primary)" : "var(--color-text-secondary)",
|
|
242
|
+
boxShadow: z === e.value ? "0 1px 2px rgba(0,0,0,0.05)" : "none"
|
|
242
243
|
},
|
|
243
244
|
children: e.label
|
|
244
245
|
}, e.value))
|
|
245
246
|
})
|
|
246
247
|
}),
|
|
247
|
-
/* @__PURE__ */
|
|
248
|
+
/* @__PURE__ */ A("div", {
|
|
248
249
|
style: { marginBottom: "var(--space-sectionGap)" },
|
|
249
|
-
children: /* @__PURE__ */
|
|
250
|
+
children: /* @__PURE__ */ j("div", {
|
|
250
251
|
style: {
|
|
251
252
|
position: "relative",
|
|
252
253
|
maxWidth: "400px"
|
|
253
254
|
},
|
|
254
|
-
children: [/* @__PURE__ */
|
|
255
|
+
children: [/* @__PURE__ */ A(v, { style: {
|
|
255
256
|
position: "absolute",
|
|
256
257
|
left: "var(--space-controlGap)",
|
|
257
258
|
top: "50%",
|
|
@@ -259,11 +260,11 @@ var j = c(function() {
|
|
|
259
260
|
height: "var(--size-icon-sm)",
|
|
260
261
|
width: "var(--size-icon-sm)",
|
|
261
262
|
color: "var(--color-text-muted)"
|
|
262
|
-
} }), /* @__PURE__ */
|
|
263
|
+
} }), /* @__PURE__ */ A(D, {
|
|
263
264
|
type: "text",
|
|
264
|
-
placeholder: "Search pipelines...",
|
|
265
|
-
value:
|
|
266
|
-
onChange: (e) =>
|
|
265
|
+
placeholder: M("bigconsole.pipelines.list.searchPlaceholder", "Search pipelines..."),
|
|
266
|
+
value: V,
|
|
267
|
+
onChange: (e) => H(e.target.value),
|
|
267
268
|
style: {
|
|
268
269
|
paddingLeft: "var(--size-controlHeight-md)",
|
|
269
270
|
height: "var(--size-controlHeight-md)"
|
|
@@ -271,87 +272,87 @@ var j = c(function() {
|
|
|
271
272
|
})]
|
|
272
273
|
})
|
|
273
274
|
}),
|
|
274
|
-
|
|
275
|
+
q && Y.length === 0 && /* @__PURE__ */ A("div", {
|
|
275
276
|
style: {
|
|
276
277
|
display: "flex",
|
|
277
278
|
alignItems: "center",
|
|
278
279
|
justifyContent: "center",
|
|
279
280
|
padding: "80px 0"
|
|
280
281
|
},
|
|
281
|
-
children: /* @__PURE__ */
|
|
282
|
+
children: /* @__PURE__ */ j("div", {
|
|
282
283
|
style: { textAlign: "center" },
|
|
283
|
-
children: [/* @__PURE__ */ k
|
|
284
|
+
children: [/* @__PURE__ */ A(k, { style: {
|
|
284
285
|
height: "var(--size-icon-xl)",
|
|
285
286
|
width: "var(--size-icon-xl)",
|
|
286
287
|
margin: "0 auto var(--space-formGap)"
|
|
287
|
-
} }), /* @__PURE__ */
|
|
288
|
+
} }), /* @__PURE__ */ A("p", {
|
|
288
289
|
style: {
|
|
289
290
|
fontSize: "var(--font-size-body-sm)",
|
|
290
291
|
color: "var(--color-text-muted)"
|
|
291
292
|
},
|
|
292
|
-
children: "Loading pipelines..."
|
|
293
|
+
children: M("bigconsole.pipelines.list.loading", "Loading pipelines...")
|
|
293
294
|
})]
|
|
294
295
|
})
|
|
295
296
|
}),
|
|
296
|
-
!
|
|
297
|
+
!q && Y.length === 0 && /* @__PURE__ */ A(w, {
|
|
297
298
|
treatment: "insight",
|
|
298
299
|
className: "border-border-seam",
|
|
299
|
-
children: /* @__PURE__ */
|
|
300
|
+
children: /* @__PURE__ */ A(E, {
|
|
300
301
|
illustration: "empty-data",
|
|
301
|
-
title: "No Pipelines yet",
|
|
302
|
-
description: "Create a pipeline to chain parsers together for sequential data transformation. Each stage processes the output of the previous stage.",
|
|
303
|
-
action: /* @__PURE__ */
|
|
302
|
+
title: M("bigconsole.pipelines.list.emptyTitle", "No Pipelines yet"),
|
|
303
|
+
description: M("bigconsole.pipelines.list.emptyDescription", "Create a pipeline to chain parsers together for sequential data transformation. Each stage processes the output of the previous stage."),
|
|
304
|
+
action: /* @__PURE__ */ A(p, {
|
|
304
305
|
permission: r.PIPELINE_CREATE,
|
|
305
306
|
deniedBehavior: "disable",
|
|
306
|
-
children: /* @__PURE__ */
|
|
307
|
-
onClick:
|
|
308
|
-
children: [/* @__PURE__ */
|
|
307
|
+
children: /* @__PURE__ */ j(x, {
|
|
308
|
+
onClick: $,
|
|
309
|
+
children: [/* @__PURE__ */ A(_, { style: {
|
|
309
310
|
marginRight: "var(--space-iconGap)",
|
|
310
311
|
height: "var(--size-icon-sm)",
|
|
311
312
|
width: "var(--size-icon-sm)"
|
|
312
|
-
} }), "Create Pipeline"]
|
|
313
|
+
} }), M("bigconsole.pipelines.actions.createPipeline", "Create Pipeline")]
|
|
313
314
|
})
|
|
314
315
|
})
|
|
315
316
|
})
|
|
316
317
|
}),
|
|
317
|
-
!
|
|
318
|
+
!q && Q.length === 0 && Y.length > 0 && /* @__PURE__ */ A(w, {
|
|
318
319
|
treatment: "insight",
|
|
319
320
|
className: "border-border-seam",
|
|
320
|
-
children: /* @__PURE__ */
|
|
321
|
+
children: /* @__PURE__ */ A(E, {
|
|
321
322
|
illustration: "empty-search",
|
|
322
|
-
title: "No matching pipelines",
|
|
323
|
-
description: "No pipelines match your filters"
|
|
323
|
+
title: M("bigconsole.pipelines.list.noResultsTitle", "No matching pipelines"),
|
|
324
|
+
description: M("bigconsole.pipelines.list.noResultsDescription", "No pipelines match your filters")
|
|
324
325
|
})
|
|
325
326
|
}),
|
|
326
|
-
|
|
327
|
+
Q.length > 0 && /* @__PURE__ */ A("div", {
|
|
327
328
|
style: {
|
|
328
329
|
display: "grid",
|
|
329
330
|
gridTemplateColumns: "repeat(auto-fill, minmax(320px, 1fr))",
|
|
330
331
|
gap: "var(--space-formGap)"
|
|
331
332
|
},
|
|
332
|
-
children:
|
|
333
|
+
children: Q.map((e) => /* @__PURE__ */ A(s, {
|
|
333
334
|
pipeline: e,
|
|
334
|
-
onView:
|
|
335
|
-
onEdit:
|
|
336
|
-
onTest:
|
|
337
|
-
onDelete:
|
|
335
|
+
onView: ee,
|
|
336
|
+
onEdit: I ? te : void 0,
|
|
337
|
+
onTest: R ? ne : void 0,
|
|
338
|
+
onDelete: L ? re : void 0
|
|
338
339
|
}, e.id))
|
|
339
340
|
})
|
|
340
341
|
]
|
|
341
342
|
}),
|
|
342
|
-
|
|
343
|
-
pipeline:
|
|
344
|
-
isOpen:
|
|
345
|
-
onClose:
|
|
346
|
-
onConfirm:
|
|
343
|
+
W && /* @__PURE__ */ A(o, {
|
|
344
|
+
pipeline: W,
|
|
345
|
+
isOpen: U,
|
|
346
|
+
onClose: K,
|
|
347
|
+
onConfirm: ie
|
|
347
348
|
})
|
|
348
349
|
]
|
|
349
|
-
}) : /* @__PURE__ */
|
|
350
|
-
title: "Access Denied",
|
|
351
|
-
description: "You don't have permission to view pipelines."
|
|
350
|
+
}) : /* @__PURE__ */ A(f, {
|
|
351
|
+
title: M("bigconsole.pipelines.errors.accessDeniedTitle", "Access Denied"),
|
|
352
|
+
description: M("bigconsole.pipelines.errors.accessDeniedListDescription", "You don't have permission to view pipelines.")
|
|
352
353
|
});
|
|
353
354
|
});
|
|
354
355
|
//#endregion
|
|
355
|
-
export {
|
|
356
|
+
export { M as PipelinesPage, M as default };
|
|
356
357
|
|
|
357
358
|
//# sourceMappingURL=PipelinesPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PipelinesPage.js","names":[],"sources":["../../../src/bigconsole/pages/PipelinesPage.tsx"],"sourcesContent":["/**\n * Pipelines Page\n *\n * List and manage Pipelines.\n * Uses fe-libs shared UI components and semantic tokens for consistent styling.\n */\n\nimport { memo, useState, useMemo, useCallback } from 'react';\nimport { useAppNavigate } from '../contexts';\nimport { isNative, nativeNotify } from '../../utils/nativeBridge';\nimport { usePipelineOperations } from '../hooks/usePipelineOperations';\nimport { usePipelineStore } from '../store/pipelineStore';\nimport { PipelineCard } from '../components/pipeline/PipelineCard';\nimport { PipelineDeleteDialog } from '../components/pipeline/PipelineDeleteDialog';\nimport type { PipelineStatus } from '../types';\n\n// fe-libs 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 { Input } from '@burdenoff/fe-libs/ui';\nimport { Card, CardContent } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { AuroraBackground, GradientText, GlassCard, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\n\n// Lucide icons\nimport { Plus, Search, GitBranch, AlertCircle } from 'lucide-react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ntype StatusFilter = 'all' | PipelineStatus;\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const PipelinesPage = memo(function PipelinesPage() {\n const navigate = useAppNavigate();\n\n // Permissions\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canRead = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_READ);\n // Create is gated inline via <PermissionButton permission=PIPELINE_CREATE>.\n const canUpdate = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_UPDATE);\n const canDelete = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_DELETE);\n const canTest = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_TEST);\n\n // Local state\n const [statusFilter, setStatusFilter] = useState<StatusFilter>('all');\n\n // Store state\n const searchQuery = usePipelineStore((state) => state.searchQuery);\n const setSearchQuery = usePipelineStore((state) => state.setSearchQuery);\n const deleteDialogOpen = usePipelineStore((state) => state.deleteDialogOpen);\n const currentPipeline = usePipelineStore((state) => state.currentPipeline);\n const openDeleteDialog = usePipelineStore((state) => state.openDeleteDialog);\n const closeDeleteDialog = usePipelineStore((state) => state.closeDeleteDialog);\n\n // Operations\n const { loading, error, pipelines, deletePipeline, refetch } = usePipelineOperations({\n consoleId: 'default',\n });\n\n // Filter pipelines\n const filteredPipelines = useMemo(() => {\n let filtered = [...pipelines];\n\n // Apply status filter\n if (statusFilter !== 'all') {\n filtered = filtered.filter((p) => p.status === statusFilter);\n }\n\n // Apply search filter\n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase();\n filtered = filtered.filter(\n (p) => p.name.toLowerCase().includes(query) || p.description?.toLowerCase().includes(query)\n );\n }\n\n // Sort by updatedAt descending\n return filtered.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());\n }, [pipelines, statusFilter, searchQuery]);\n\n // Handlers\n const handleCreatePipeline = useCallback(() => {\n navigate('/pipelines/new');\n }, [navigate]);\n\n const handleViewPipeline = useCallback(\n (id: string) => {\n navigate(`/pipelines/${id}`);\n },\n [navigate]\n );\n\n const handleEditPipeline = useCallback(\n (id: string) => {\n navigate(`/pipelines/${id}/edit`);\n },\n [navigate]\n );\n\n const handleTestPipeline = useCallback(\n (id: string) => {\n navigate(`/pipelines/${id}?test=true`);\n },\n [navigate]\n );\n\n const handleDeleteClick = useCallback(\n (id: string) => {\n const pipeline = pipelines.find((p) => p.id === id);\n if (pipeline) {\n openDeleteDialog(pipeline);\n }\n },\n [pipelines, openDeleteDialog]\n );\n\n const handleDeleteConfirm = useCallback(async () => {\n if (currentPipeline) {\n try {\n await deletePipeline(currentPipeline.id);\n if (isNative()) void nativeNotify('success');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n throw err;\n }\n closeDeleteDialog();\n }\n }, [currentPipeline, deletePipeline, closeDeleteDialog]);\n\n // Status filter options\n const statusOptions: { value: StatusFilter; label: string }[] = [\n { value: 'all', label: 'All' },\n { value: 'draft', label: 'Draft' },\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'error', label: 'Error' },\n ];\n\n // Permission gate — wait for permissions to resolve, then block callers\n // without pipeline read access before rendering the page body.\n if (permissionsLoading) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '80px 0' }}>\n <Spinner\n style={{\n height: 'var(--size-icon-xl)',\n width: 'var(--size-icon-xl)',\n }}\n />\n </div>\n );\n }\n\n if (!canRead) {\n return <AccessDenied title=\"Access Denied\" description=\"You don't have permission to view pipelines.\" />;\n }\n\n // Error state\n if (error) {\n return (\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <Card\n style={{\n borderColor: 'var(--color-status-error-border)',\n backgroundColor: 'var(--color-status-error-bgSubtle)',\n }}\n >\n <CardContent style={{ padding: 'var(--space-pagePadding)' }}>\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', textAlign: 'center' }}>\n <div\n style={{\n padding: 'var(--space-controlGap)',\n borderRadius: '50%',\n backgroundColor: 'var(--color-status-error-bgSubtle)',\n marginBottom: 'var(--space-formGap)',\n }}\n >\n <AlertCircle\n style={{\n height: 'var(--size-icon-xl)',\n width: 'var(--size-icon-xl)',\n color: 'var(--color-status-error-text)',\n }}\n />\n </div>\n <h3\n style={{\n fontSize: 'var(--font-size-body-lg)',\n fontWeight: 'var(--font-weight-medium)',\n color: 'var(--color-status-error-text)',\n marginBottom: 'var(--space-controlGap)',\n }}\n >\n Failed to load Pipelines\n </h3>\n <p\n style={{\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-secondary)',\n marginBottom: 'var(--space-formGap)',\n }}\n >\n {error.message}\n </p>\n <Button size=\"sm\" onClick={() => refetch()}>\n Try Again\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n return (\n <div style={{ minHeight: '100vh', backgroundColor: 'var(--color-bg-canvas)' }}>\n {/* Header Section */}\n <div className=\"relative overflow-hidden border-b border-border-seam bg-gloss-card\">\n <AuroraBackground intensity=\"subtle\" />\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-formGap)' }}>\n <div\n style={{\n display: 'flex',\n height: 'var(--size-controlHeight-lg)',\n width: 'var(--size-controlHeight-lg)',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'var(--radius-card)',\n backgroundColor: 'var(--color-action-primary-bg)',\n }}\n >\n <GitBranch\n style={{\n height: 'var(--size-icon-lg)',\n width: 'var(--size-icon-lg)',\n color: 'var(--color-action-primary-text)',\n }}\n />\n </div>\n <div>\n <h1\n style={{\n fontSize: 'var(--font-size-heading-h4)',\n fontWeight: 'var(--font-weight-bold)',\n margin: 0,\n color: 'var(--color-text-primary)',\n }}\n >\n <GradientText>Pipelines</GradientText>\n </h1>\n <p style={{ fontSize: 'var(--font-size-body-sm)', color: 'var(--color-text-secondary)', margin: 0 }}>\n Create and manage sequential parser chains for data transformation\n </p>\n </div>\n </div>\n\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.PIPELINE_CREATE} deniedBehavior=\"disable\">\n <Button onClick={handleCreatePipeline}>\n <Plus\n style={{\n marginRight: 'var(--space-iconGap)',\n height: 'var(--size-icon-sm)',\n width: 'var(--size-icon-sm)',\n }}\n />\n Create Pipeline\n </Button>\n </PermissionButton>\n </div>\n </div>\n </div>\n\n {/* Main Content */}\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <PagePurpose className=\"mb-[var(--space-sectionGap)]\">\n Pipelines chain parsers and data sinks into a repeatable flow — they take raw input, run it through your\n parsers, and route the structured result into a sink. Use them to turn messy logs, files, or API payloads into\n clean, queryable data your dashboards can use.\n </PagePurpose>\n\n {/* Status Filter Tabs */}\n <div style={{ marginBottom: 'var(--space-formGap)' }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n padding: '4px',\n backgroundColor: 'var(--color-bg-sunken)',\n borderRadius: 'var(--radius-card)',\n width: 'fit-content',\n }}\n >\n {statusOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => setStatusFilter(option.value)}\n style={{\n padding: 'var(--space-controlGap) var(--space-formGap)',\n fontSize: 'var(--font-size-body-sm)',\n fontWeight: 'var(--font-weight-medium)',\n borderRadius: 'var(--radius-button)',\n border: 'none',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n backgroundColor: statusFilter === option.value ? 'var(--color-bg-surface)' : 'transparent',\n color: statusFilter === option.value ? 'var(--color-text-primary)' : 'var(--color-text-secondary)',\n boxShadow: statusFilter === option.value ? '0 1px 2px rgba(0,0,0,0.05)' : 'none',\n }}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Search Bar */}\n <div style={{ marginBottom: 'var(--space-sectionGap)' }}>\n <div style={{ position: 'relative', maxWidth: '400px' }}>\n <Search\n style={{\n position: 'absolute',\n left: 'var(--space-controlGap)',\n top: '50%',\n transform: 'translateY(-50%)',\n height: 'var(--size-icon-sm)',\n width: 'var(--size-icon-sm)',\n color: 'var(--color-text-muted)',\n }}\n />\n <Input\n type=\"text\"\n placeholder=\"Search pipelines...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={{ paddingLeft: 'var(--size-controlHeight-md)', height: 'var(--size-controlHeight-md)' }}\n />\n </div>\n </div>\n\n {/* Loading state */}\n {loading && pipelines.length === 0 && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '80px 0' }}>\n <div style={{ textAlign: 'center' }}>\n <Spinner\n style={{\n height: 'var(--size-icon-xl)',\n width: 'var(--size-icon-xl)',\n margin: '0 auto var(--space-formGap)',\n }}\n />\n <p style={{ fontSize: 'var(--font-size-body-sm)', color: 'var(--color-text-muted)' }}>\n Loading pipelines...\n </p>\n </div>\n </div>\n )}\n\n {/* Empty state */}\n {!loading && pipelines.length === 0 && (\n <GlassCard treatment=\"insight\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No Pipelines yet\"\n description=\"Create a pipeline to chain parsers together for sequential data transformation. Each stage processes the output of the previous stage.\"\n action={\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.PIPELINE_CREATE} deniedBehavior=\"disable\">\n <Button onClick={handleCreatePipeline}>\n <Plus\n style={{\n marginRight: 'var(--space-iconGap)',\n height: 'var(--size-icon-sm)',\n width: 'var(--size-icon-sm)',\n }}\n />\n Create Pipeline\n </Button>\n </PermissionButton>\n }\n />\n </GlassCard>\n )}\n\n {/* No results state */}\n {!loading && filteredPipelines.length === 0 && pipelines.length > 0 && (\n <GlassCard treatment=\"insight\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No matching pipelines\"\n description=\"No pipelines match your filters\"\n />\n </GlassCard>\n )}\n\n {/* Pipeline Grid */}\n {filteredPipelines.length > 0 && (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',\n gap: 'var(--space-formGap)',\n }}\n >\n {filteredPipelines.map((pipeline) => (\n <PipelineCard\n key={pipeline.id}\n pipeline={pipeline}\n onView={handleViewPipeline}\n onEdit={canUpdate ? handleEditPipeline : undefined}\n onTest={canTest ? handleTestPipeline : undefined}\n onDelete={canDelete ? handleDeleteClick : undefined}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Delete Dialog */}\n {currentPipeline && (\n <PipelineDeleteDialog\n pipeline={currentPipeline}\n isOpen={deleteDialogOpen}\n onClose={closeDeleteDialog}\n onConfirm={handleDeleteConfirm}\n />\n )}\n </div>\n );\n});\n\nexport default PipelinesPage;\n"],"mappings":";;;;;;;;;;;;;;;AAyCA,IAAa,IAAgB,EAAK,WAAyB;CACzD,IAAM,IAAW,GAAgB,EAG3B,EAAE,kBAAe,WAAW,MAAuB,GAAgB,EACnE,IAAU,EAAc,EAAuB,cAAc,EAE7D,IAAY,EAAc,EAAuB,gBAAgB,EACjE,IAAY,EAAc,EAAuB,gBAAgB,EACjE,IAAU,EAAc,EAAuB,cAAc,EAG7D,CAAC,GAAc,KAAmB,EAAuB,MAAM,EAG/D,IAAc,GAAkB,MAAU,EAAM,YAAY,EAC5D,IAAiB,GAAkB,MAAU,EAAM,eAAe,EAClE,IAAmB,GAAkB,MAAU,EAAM,iBAAiB,EACtE,IAAkB,GAAkB,MAAU,EAAM,gBAAgB,EACpE,IAAmB,GAAkB,MAAU,EAAM,iBAAiB,EACtE,IAAoB,GAAkB,MAAU,EAAM,kBAAkB,EAGxE,EAAE,YAAS,UAAO,cAAW,mBAAgB,eAAY,EAAsB,EACnF,WAAW,WACZ,CAAC,EAGI,IAAoB,QAAc;EACtC,IAAI,IAAW,CAAC,GAAG,EAAU;AAQ7B,MALI,MAAiB,UACnB,IAAW,EAAS,QAAQ,MAAM,EAAE,WAAW,EAAa,GAI1D,EAAY,MAAM,EAAE;GACtB,IAAM,IAAQ,EAAY,aAAa;AACvC,OAAW,EAAS,QACjB,MAAM,EAAE,KAAK,aAAa,CAAC,SAAS,EAAM,IAAI,EAAE,aAAa,aAAa,CAAC,SAAS,EAAM,CAC5F;;AAIH,SAAO,EAAS,MAAM,GAAG,MAAM,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC;IAChG;EAAC;EAAW;EAAc;EAAY,CAAC,EAGpC,IAAuB,QAAkB;AAC7C,IAAS,iBAAiB;IACzB,CAAC,EAAS,CAAC,EAER,IAAqB,GACxB,MAAe;AACd,IAAS,cAAc,IAAK;IAE9B,CAAC,EAAS,CACX,EAEK,IAAqB,GACxB,MAAe;AACd,IAAS,cAAc,EAAG,OAAO;IAEnC,CAAC,EAAS,CACX,EAEK,KAAqB,GACxB,MAAe;AACd,IAAS,cAAc,EAAG,YAAY;IAExC,CAAC,EAAS,CACX,EAEK,KAAoB,GACvB,MAAe;EACd,IAAM,IAAW,EAAU,MAAM,MAAM,EAAE,OAAO,EAAG;AACnD,EAAI,KACF,EAAiB,EAAS;IAG9B,CAAC,GAAW,EAAiB,CAC9B,EAEK,KAAsB,EAAY,YAAY;AAClD,MAAI,GAAiB;AACnB,OAAI;AAEF,IADA,MAAM,EAAe,EAAgB,GAAG,EACpC,GAAU,IAAO,EAAa,UAAU;YACrC,GAAK;AAEZ,UADI,GAAU,IAAO,EAAa,QAAQ,EACpC;;AAER,MAAmB;;IAEpB;EAAC;EAAiB;EAAgB;EAAkB,CAAC;AAuFxD,QA1EI,IAEA,kBAAC,OAAD;EAAK,OAAO;GAAE,SAAS;GAAQ,YAAY;GAAU,gBAAgB;GAAU,SAAS;GAAU;YAChG,kBAAC,GAAD,EACE,OAAO;GACL,QAAQ;GACR,OAAO;GACR,EACD,CAAA;EACE,CAAA,GAIL,IAKD,IAEA,kBAAC,OAAD;EAAK,OAAO,EAAE,SAAS,4BAA4B;YACjD,kBAAC,GAAD;GACE,OAAO;IACL,aAAa;IACb,iBAAiB;IAClB;aAED,kBAAC,GAAD;IAAa,OAAO,EAAE,SAAS,4BAA4B;cACzD,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,eAAe;MAAU,YAAY;MAAU,WAAW;MAAU;eAAnG;MACE,kBAAC,OAAD;OACE,OAAO;QACL,SAAS;QACT,cAAc;QACd,iBAAiB;QACjB,cAAc;QACf;iBAED,kBAAC,GAAD,EACE,OAAO;QACL,QAAQ;QACR,OAAO;QACP,OAAO;QACR,EACD,CAAA;OACE,CAAA;MACN,kBAAC,MAAD;OACE,OAAO;QACL,UAAU;QACV,YAAY;QACZ,OAAO;QACP,cAAc;QACf;iBACF;OAEI,CAAA;MACL,kBAAC,KAAD;OACE,OAAO;QACL,UAAU;QACV,OAAO;QACP,cAAc;QACf;iBAEA,EAAM;OACL,CAAA;MACJ,kBAAC,GAAD;OAAQ,MAAK;OAAK,eAAe,GAAS;iBAAE;OAEnC,CAAA;MACL;;IACM,CAAA;GACT,CAAA;EACH,CAAA,GAKR,kBAAC,OAAD;EAAK,OAAO;GAAE,WAAW;GAAS,iBAAiB;GAA0B;YAA7E;GAEE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA,EACvC,kBAAC,OAAD;KAAK,OAAO,EAAE,SAAS,4BAA4B;eACjD,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,gBAAgB;OAAiB;gBAAtF,CACE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,KAAK;QAAwB;iBAAlF,CACE,kBAAC,OAAD;QACE,OAAO;SACL,SAAS;SACT,QAAQ;SACR,OAAO;SACP,YAAY;SACZ,gBAAgB;SAChB,cAAc;SACd,iBAAiB;SAClB;kBAED,kBAAC,GAAD,EACE,OAAO;SACL,QAAQ;SACR,OAAO;SACP,OAAO;SACR,EACD,CAAA;QACE,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;QACE,OAAO;SACL,UAAU;SACV,YAAY;SACZ,QAAQ;SACR,OAAO;SACR;kBAED,kBAAC,GAAD,EAAA,UAAc,aAAwB,CAAA;QACnC,CAAA,EACL,kBAAC,KAAD;QAAG,OAAO;SAAE,UAAU;SAA4B,OAAO;SAA+B,QAAQ;SAAG;kBAAE;QAEjG,CAAA,CACA,EAAA,CAAA,CACF;UAEN,kBAAC,GAAD;OAAkB,YAAY,EAAuB;OAAiB,gBAAe;iBACnF,kBAAC,GAAD;QAAQ,SAAS;kBAAjB,CACE,kBAAC,GAAD,EACE,OAAO;SACL,aAAa;SACb,QAAQ;SACR,OAAO;SACR,EACD,CAAA,EAAA,kBAEK;;OACQ,CAAA,CACf;;KACF,CAAA,CACF;;GAGN,kBAAC,OAAD;IAAK,OAAO,EAAE,SAAS,4BAA4B;cAAnD;KACE,kBAAC,GAAD;MAAa,WAAU;gBAA+B;MAIxC,CAAA;KAGd,kBAAC,OAAD;MAAK,OAAO,EAAE,cAAc,wBAAwB;gBAClD,kBAAC,OAAD;OACE,OAAO;QACL,SAAS;QACT,YAAY;QACZ,KAAK;QACL,SAAS;QACT,iBAAiB;QACjB,cAAc;QACd,OAAO;QACR;iBAnKqD;QAC9D;SAAE,OAAO;SAAO,OAAO;SAAO;QAC9B;SAAE,OAAO;SAAS,OAAO;SAAS;QAClC;SAAE,OAAO;SAAU,OAAO;SAAU;QACpC;SAAE,OAAO;SAAY,OAAO;SAAY;QACxC;SAAE,OAAO;SAAS,OAAO;SAAS;QACnC,CA+JwB,KAAK,MAClB,kBAAC,UAAD;QAEE,MAAK;QACL,eAAe,EAAgB,EAAO,MAAM;QAC5C,OAAO;SACL,SAAS;SACT,UAAU;SACV,YAAY;SACZ,cAAc;SACd,QAAQ;SACR,QAAQ;SACR,YAAY;SACZ,iBAAiB,MAAiB,EAAO,QAAQ,4BAA4B;SAC7E,OAAO,MAAiB,EAAO,QAAQ,8BAA8B;SACrE,WAAW,MAAiB,EAAO,QAAQ,+BAA+B;SAC3E;kBAEA,EAAO;QACD,EAjBF,EAAO,MAiBL,CACT;OACE,CAAA;MACF,CAAA;KAGN,kBAAC,OAAD;MAAK,OAAO,EAAE,cAAc,2BAA2B;gBACrD,kBAAC,OAAD;OAAK,OAAO;QAAE,UAAU;QAAY,UAAU;QAAS;iBAAvD,CACE,kBAAC,GAAD,EACE,OAAO;QACL,UAAU;QACV,MAAM;QACN,KAAK;QACL,WAAW;QACX,QAAQ;QACR,OAAO;QACP,OAAO;QACR,EACD,CAAA,EACF,kBAAC,GAAD;QACE,MAAK;QACL,aAAY;QACZ,OAAO;QACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;QAC/C,OAAO;SAAE,aAAa;SAAgC,QAAQ;SAAgC;QAC9F,CAAA,CACE;;MACF,CAAA;KAGL,KAAW,EAAU,WAAW,KAC/B,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,gBAAgB;OAAU,SAAS;OAAU;gBAChG,kBAAC,OAAD;OAAK,OAAO,EAAE,WAAW,UAAU;iBAAnC,CACE,kBAAC,GAAD,EACE,OAAO;QACL,QAAQ;QACR,OAAO;QACP,QAAQ;QACT,EACD,CAAA,EACF,kBAAC,KAAD;QAAG,OAAO;SAAE,UAAU;SAA4B,OAAO;SAA2B;kBAAE;QAElF,CAAA,CACA;;MACF,CAAA;KAIP,CAAC,KAAW,EAAU,WAAW,KAChC,kBAAC,GAAD;MAAW,WAAU;MAAU,WAAU;gBACvC,kBAAC,GAAD;OACE,cAAa;OACb,OAAM;OACN,aAAY;OACZ,QACE,kBAAC,GAAD;QAAkB,YAAY,EAAuB;QAAiB,gBAAe;kBACnF,kBAAC,GAAD;SAAQ,SAAS;mBAAjB,CACE,kBAAC,GAAD,EACE,OAAO;UACL,aAAa;UACb,QAAQ;UACR,OAAO;UACR,EACD,CAAA,EAAA,kBAEK;;QACQ,CAAA;OAErB,CAAA;MACQ,CAAA;KAIb,CAAC,KAAW,EAAkB,WAAW,KAAK,EAAU,SAAS,KAChE,kBAAC,GAAD;MAAW,WAAU;MAAU,WAAU;gBACvC,kBAAC,GAAD;OACE,cAAa;OACb,OAAM;OACN,aAAY;OACZ,CAAA;MACQ,CAAA;KAIb,EAAkB,SAAS,KAC1B,kBAAC,OAAD;MACE,OAAO;OACL,SAAS;OACT,qBAAqB;OACrB,KAAK;OACN;gBAEA,EAAkB,KAAK,MACtB,kBAAC,GAAD;OAEY;OACV,QAAQ;OACR,QAAQ,IAAY,IAAqB,KAAA;OACzC,QAAQ,IAAU,KAAqB,KAAA;OACvC,UAAU,IAAY,KAAoB,KAAA;OAC1C,EANK,EAAS,GAMd,CACF;MACE,CAAA;KAEJ;;GAGL,KACC,kBAAC,GAAD;IACE,UAAU;IACV,QAAQ;IACR,SAAS;IACT,WAAW;IACX,CAAA;GAEA;MAnRC,kBAAC,GAAD;EAAc,OAAM;EAAgB,aAAY;EAAiD,CAAA;EAqR1G"}
|
|
1
|
+
{"version":3,"file":"PipelinesPage.js","names":[],"sources":["../../../src/bigconsole/pages/PipelinesPage.tsx"],"sourcesContent":["/**\n * Pipelines Page\n *\n * List and manage Pipelines.\n * Uses fe-libs shared UI components and semantic tokens for consistent styling.\n */\n\nimport { memo, useState, useMemo, useCallback } from 'react';\nimport { useAppNavigate } from '../contexts';\nimport { isNative, nativeNotify } from '../../utils/nativeBridge';\nimport { usePipelineOperations } from '../hooks/usePipelineOperations';\nimport { usePipelineStore } from '../store/pipelineStore';\nimport { PipelineCard } from '../components/pipeline/PipelineCard';\nimport { PipelineDeleteDialog } from '../components/pipeline/PipelineDeleteDialog';\nimport type { PipelineStatus } from '../types';\n\n// fe-libs RBAC\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\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 { Input } from '@burdenoff/fe-libs/ui';\nimport { Card, CardContent } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { AuroraBackground, GradientText, GlassCard, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\n\n// Lucide icons\nimport { Plus, Search, GitBranch, AlertCircle } from 'lucide-react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ntype StatusFilter = 'all' | PipelineStatus;\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const PipelinesPage = memo(function PipelinesPage() {\n const navigate = useAppNavigate();\n const { t } = useI18n();\n\n // Permissions\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canRead = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_READ);\n // Create is gated inline via <PermissionButton permission=PIPELINE_CREATE>.\n const canUpdate = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_UPDATE);\n const canDelete = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_DELETE);\n const canTest = hasPermission(BIGCONSOLE_PERMISSIONS.PIPELINE_TEST);\n\n // Local state\n const [statusFilter, setStatusFilter] = useState<StatusFilter>('all');\n\n // Store state\n const searchQuery = usePipelineStore((state) => state.searchQuery);\n const setSearchQuery = usePipelineStore((state) => state.setSearchQuery);\n const deleteDialogOpen = usePipelineStore((state) => state.deleteDialogOpen);\n const currentPipeline = usePipelineStore((state) => state.currentPipeline);\n const openDeleteDialog = usePipelineStore((state) => state.openDeleteDialog);\n const closeDeleteDialog = usePipelineStore((state) => state.closeDeleteDialog);\n\n // Operations\n const { loading, error, pipelines, deletePipeline, refetch } = usePipelineOperations({\n consoleId: 'default',\n });\n\n // Filter pipelines\n const filteredPipelines = useMemo(() => {\n let filtered = [...pipelines];\n\n // Apply status filter\n if (statusFilter !== 'all') {\n filtered = filtered.filter((p) => p.status === statusFilter);\n }\n\n // Apply search filter\n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase();\n filtered = filtered.filter(\n (p) => p.name.toLowerCase().includes(query) || p.description?.toLowerCase().includes(query)\n );\n }\n\n // Sort by updatedAt descending\n return filtered.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());\n }, [pipelines, statusFilter, searchQuery]);\n\n // Handlers\n const handleCreatePipeline = useCallback(() => {\n navigate('/pipelines/new');\n }, [navigate]);\n\n const handleViewPipeline = useCallback(\n (id: string) => {\n navigate(`/pipelines/${id}`);\n },\n [navigate]\n );\n\n const handleEditPipeline = useCallback(\n (id: string) => {\n navigate(`/pipelines/${id}/edit`);\n },\n [navigate]\n );\n\n const handleTestPipeline = useCallback(\n (id: string) => {\n navigate(`/pipelines/${id}?test=true`);\n },\n [navigate]\n );\n\n const handleDeleteClick = useCallback(\n (id: string) => {\n const pipeline = pipelines.find((p) => p.id === id);\n if (pipeline) {\n openDeleteDialog(pipeline);\n }\n },\n [pipelines, openDeleteDialog]\n );\n\n const handleDeleteConfirm = useCallback(async () => {\n if (currentPipeline) {\n try {\n await deletePipeline(currentPipeline.id);\n if (isNative()) void nativeNotify('success');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n throw err;\n }\n closeDeleteDialog();\n }\n }, [currentPipeline, deletePipeline, closeDeleteDialog]);\n\n // Status filter options\n const statusOptions: { value: StatusFilter; label: string }[] = [\n { value: 'all', label: t('bigconsole.pipelines.filters.all', 'All') },\n { value: 'draft', label: t('bigconsole.pipelines.filters.draft', 'Draft') },\n { value: 'active', label: t('bigconsole.pipelines.filters.active', 'Active') },\n { value: 'inactive', label: t('bigconsole.pipelines.filters.inactive', 'Inactive') },\n { value: 'error', label: t('bigconsole.pipelines.filters.error', 'Error') },\n ];\n\n // Permission gate — wait for permissions to resolve, then block callers\n // without pipeline read access before rendering the page body.\n if (permissionsLoading) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '80px 0' }}>\n <Spinner\n style={{\n height: 'var(--size-icon-xl)',\n width: 'var(--size-icon-xl)',\n }}\n />\n </div>\n );\n }\n\n if (!canRead) {\n return (\n <AccessDenied\n title={t('bigconsole.pipelines.errors.accessDeniedTitle', 'Access Denied')}\n description={t(\n 'bigconsole.pipelines.errors.accessDeniedListDescription',\n \"You don't have permission to view pipelines.\"\n )}\n />\n );\n }\n\n // Error state\n if (error) {\n return (\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <Card\n style={{\n borderColor: 'var(--color-status-error-border)',\n backgroundColor: 'var(--color-status-error-bgSubtle)',\n }}\n >\n <CardContent style={{ padding: 'var(--space-pagePadding)' }}>\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', textAlign: 'center' }}>\n <div\n style={{\n padding: 'var(--space-controlGap)',\n borderRadius: '50%',\n backgroundColor: 'var(--color-status-error-bgSubtle)',\n marginBottom: 'var(--space-formGap)',\n }}\n >\n <AlertCircle\n style={{\n height: 'var(--size-icon-xl)',\n width: 'var(--size-icon-xl)',\n color: 'var(--color-status-error-text)',\n }}\n />\n </div>\n <h3\n style={{\n fontSize: 'var(--font-size-body-lg)',\n fontWeight: 'var(--font-weight-medium)',\n color: 'var(--color-status-error-text)',\n marginBottom: 'var(--space-controlGap)',\n }}\n >\n {t('bigconsole.pipelines.errors.loadListTitle', 'Failed to load Pipelines')}\n </h3>\n <p\n style={{\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-secondary)',\n marginBottom: 'var(--space-formGap)',\n }}\n >\n {error.message}\n </p>\n <Button size=\"sm\" onClick={() => refetch()}>\n {t('bigconsole.pipelines.actions.tryAgain', 'Try Again')}\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n return (\n <div style={{ minHeight: '100vh', backgroundColor: 'var(--color-bg-canvas)' }}>\n {/* Header Section */}\n <div className=\"relative overflow-hidden border-b border-border-seam bg-gloss-card\">\n <AuroraBackground intensity=\"subtle\" />\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-formGap)' }}>\n <div\n style={{\n display: 'flex',\n height: 'var(--size-controlHeight-lg)',\n width: 'var(--size-controlHeight-lg)',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'var(--radius-card)',\n backgroundColor: 'var(--color-action-primary-bg)',\n }}\n >\n <GitBranch\n style={{\n height: 'var(--size-icon-lg)',\n width: 'var(--size-icon-lg)',\n color: 'var(--color-action-primary-text)',\n }}\n />\n </div>\n <div>\n <h1\n style={{\n fontSize: 'var(--font-size-heading-h4)',\n fontWeight: 'var(--font-weight-bold)',\n margin: 0,\n color: 'var(--color-text-primary)',\n }}\n >\n <GradientText>{t('bigconsole.pipelines.list.heading', 'Pipelines')}</GradientText>\n </h1>\n <p style={{ fontSize: 'var(--font-size-body-sm)', color: 'var(--color-text-secondary)', margin: 0 }}>\n {t(\n 'bigconsole.pipelines.list.subtitle',\n 'Create and manage sequential parser chains for data transformation'\n )}\n </p>\n </div>\n </div>\n\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.PIPELINE_CREATE} deniedBehavior=\"disable\">\n <Button onClick={handleCreatePipeline}>\n <Plus\n style={{\n marginRight: 'var(--space-iconGap)',\n height: 'var(--size-icon-sm)',\n width: 'var(--size-icon-sm)',\n }}\n />\n {t('bigconsole.pipelines.actions.createPipeline', 'Create Pipeline')}\n </Button>\n </PermissionButton>\n </div>\n </div>\n </div>\n\n {/* Main Content */}\n <div style={{ padding: 'var(--space-pagePadding)' }}>\n <PagePurpose className=\"mb-[var(--space-sectionGap)]\">\n {t(\n 'bigconsole.pipelines.list.purpose',\n 'Pipelines chain parsers and data sinks into a repeatable flow — they take raw input, run it through your parsers, and route the structured result into a sink. Use them to turn messy logs, files, or API payloads into clean, queryable data your dashboards can use.'\n )}\n </PagePurpose>\n\n {/* Status Filter Tabs */}\n <div style={{ marginBottom: 'var(--space-formGap)' }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n padding: '4px',\n backgroundColor: 'var(--color-bg-sunken)',\n borderRadius: 'var(--radius-card)',\n width: 'fit-content',\n }}\n >\n {statusOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => setStatusFilter(option.value)}\n style={{\n padding: 'var(--space-controlGap) var(--space-formGap)',\n fontSize: 'var(--font-size-body-sm)',\n fontWeight: 'var(--font-weight-medium)',\n borderRadius: 'var(--radius-button)',\n border: 'none',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n backgroundColor: statusFilter === option.value ? 'var(--color-bg-surface)' : 'transparent',\n color: statusFilter === option.value ? 'var(--color-text-primary)' : 'var(--color-text-secondary)',\n boxShadow: statusFilter === option.value ? '0 1px 2px rgba(0,0,0,0.05)' : 'none',\n }}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Search Bar */}\n <div style={{ marginBottom: 'var(--space-sectionGap)' }}>\n <div style={{ position: 'relative', maxWidth: '400px' }}>\n <Search\n style={{\n position: 'absolute',\n left: 'var(--space-controlGap)',\n top: '50%',\n transform: 'translateY(-50%)',\n height: 'var(--size-icon-sm)',\n width: 'var(--size-icon-sm)',\n color: 'var(--color-text-muted)',\n }}\n />\n <Input\n type=\"text\"\n placeholder={t('bigconsole.pipelines.list.searchPlaceholder', 'Search pipelines...')}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={{ paddingLeft: 'var(--size-controlHeight-md)', height: 'var(--size-controlHeight-md)' }}\n />\n </div>\n </div>\n\n {/* Loading state */}\n {loading && pipelines.length === 0 && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '80px 0' }}>\n <div style={{ textAlign: 'center' }}>\n <Spinner\n style={{\n height: 'var(--size-icon-xl)',\n width: 'var(--size-icon-xl)',\n margin: '0 auto var(--space-formGap)',\n }}\n />\n <p style={{ fontSize: 'var(--font-size-body-sm)', color: 'var(--color-text-muted)' }}>\n {t('bigconsole.pipelines.list.loading', 'Loading pipelines...')}\n </p>\n </div>\n </div>\n )}\n\n {/* Empty state */}\n {!loading && pipelines.length === 0 && (\n <GlassCard treatment=\"insight\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('bigconsole.pipelines.list.emptyTitle', 'No Pipelines yet')}\n description={t(\n 'bigconsole.pipelines.list.emptyDescription',\n 'Create a pipeline to chain parsers together for sequential data transformation. Each stage processes the output of the previous stage.'\n )}\n action={\n <PermissionButton permission={BIGCONSOLE_PERMISSIONS.PIPELINE_CREATE} deniedBehavior=\"disable\">\n <Button onClick={handleCreatePipeline}>\n <Plus\n style={{\n marginRight: 'var(--space-iconGap)',\n height: 'var(--size-icon-sm)',\n width: 'var(--size-icon-sm)',\n }}\n />\n {t('bigconsole.pipelines.actions.createPipeline', 'Create Pipeline')}\n </Button>\n </PermissionButton>\n }\n />\n </GlassCard>\n )}\n\n {/* No results state */}\n {!loading && filteredPipelines.length === 0 && pipelines.length > 0 && (\n <GlassCard treatment=\"insight\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title={t('bigconsole.pipelines.list.noResultsTitle', 'No matching pipelines')}\n description={t('bigconsole.pipelines.list.noResultsDescription', 'No pipelines match your filters')}\n />\n </GlassCard>\n )}\n\n {/* Pipeline Grid */}\n {filteredPipelines.length > 0 && (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',\n gap: 'var(--space-formGap)',\n }}\n >\n {filteredPipelines.map((pipeline) => (\n <PipelineCard\n key={pipeline.id}\n pipeline={pipeline}\n onView={handleViewPipeline}\n onEdit={canUpdate ? handleEditPipeline : undefined}\n onTest={canTest ? handleTestPipeline : undefined}\n onDelete={canDelete ? handleDeleteClick : undefined}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Delete Dialog */}\n {currentPipeline && (\n <PipelineDeleteDialog\n pipeline={currentPipeline}\n isOpen={deleteDialogOpen}\n onClose={closeDeleteDialog}\n onConfirm={handleDeleteConfirm}\n />\n )}\n </div>\n );\n});\n\nexport default PipelinesPage;\n"],"mappings":"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"}
|