@burdenoff/microfe-bigconsole 2026.1004.3 → 2026.1004.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bigconsole/BigConsoleRoutes.d.ts +1 -1
- package/dist/bigconsole/BigConsoleRoutes.d.ts.map +1 -1
- package/dist/bigconsole/BigConsoleRoutes.js +15 -1
- package/dist/bigconsole/BigConsoleRoutes.js.map +1 -1
- package/dist/bigconsole/components/DrilldownDashboardRenderer.d.ts.map +1 -1
- package/dist/bigconsole/components/DrilldownDashboardRenderer.js +57 -56
- package/dist/bigconsole/components/DrilldownDashboardRenderer.js.map +1 -1
- package/dist/bigconsole/components/DrilldownModal.d.ts.map +1 -1
- package/dist/bigconsole/components/DrilldownModal.js +55 -53
- package/dist/bigconsole/components/DrilldownModal.js.map +1 -1
- package/dist/bigconsole/components/builder/inspector/DataBindingSection.d.ts +3 -1
- package/dist/bigconsole/components/builder/inspector/DataBindingSection.d.ts.map +1 -1
- package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +40 -39
- package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardCanvas.d.ts.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js +184 -177
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardGrid.d.ts.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardGrid.js +40 -22
- package/dist/bigconsole/components/dashboard/DashboardGrid.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ExportDashboardDialog.d.ts.map +1 -1
- package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js +31 -25
- package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.d.ts +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.d.ts.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +115 -80
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.d.ts.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +177 -146
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.d.ts +1 -1
- package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.d.ts.map +1 -1
- package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js +375 -325
- package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/CacheTTLSelector.d.ts.map +1 -1
- package/dist/bigconsole/components/datasink/CacheTTLSelector.js +7 -1
- package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
- package/dist/bigconsole/components/parser/ParserSelector.d.ts +3 -1
- package/dist/bigconsole/components/parser/ParserSelector.d.ts.map +1 -1
- package/dist/bigconsole/components/parser/ParserSelector.js +94 -94
- package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
- package/dist/bigconsole/components/pipeline/PipelineCard.d.ts.map +1 -1
- package/dist/bigconsole/components/pipeline/PipelineCard.js +111 -89
- package/dist/bigconsole/components/pipeline/PipelineCard.js.map +1 -1
- package/dist/bigconsole/components/pipeline/PipelineScopePicker.d.ts +8 -0
- package/dist/bigconsole/components/pipeline/PipelineScopePicker.d.ts.map +1 -0
- package/dist/bigconsole/components/pipeline/PipelineScopePicker.js +52 -0
- package/dist/bigconsole/components/pipeline/PipelineScopePicker.js.map +1 -0
- package/dist/bigconsole/components/widgets/PropertiesPanel.d.ts.map +1 -1
- package/dist/bigconsole/components/widgets/PropertiesPanel.js +257 -221
- package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetHeader.d.ts +1 -0
- package/dist/bigconsole/components/widgets/WidgetHeader.d.ts.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetHeader.js +29 -29
- package/dist/bigconsole/components/widgets/WidgetHeader.js.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetWrapper.d.ts +2 -0
- package/dist/bigconsole/components/widgets/WidgetWrapper.d.ts.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetWrapper.js +247 -239
- package/dist/bigconsole/components/widgets/WidgetWrapper.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.d.ts.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js +6 -4
- package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/states/EmptyState.d.ts +1 -0
- package/dist/bigconsole/components/widgets/states/EmptyState.d.ts.map +1 -1
- package/dist/bigconsole/components/widgets/states/EmptyState.js +4 -4
- package/dist/bigconsole/components/widgets/states/EmptyState.js.map +1 -1
- package/dist/bigconsole/components/workflow/WorkflowDesignPreview.d.ts +7 -0
- package/dist/bigconsole/components/workflow/WorkflowDesignPreview.d.ts.map +1 -0
- package/dist/bigconsole/components/workflow/WorkflowDesignPreview.js +94 -0
- package/dist/bigconsole/components/workflow/WorkflowDesignPreview.js.map +1 -0
- package/dist/bigconsole/components/workflow/WorkflowSinkLinkForm.d.ts +7 -0
- package/dist/bigconsole/components/workflow/WorkflowSinkLinkForm.d.ts.map +1 -0
- package/dist/bigconsole/components/workflow/WorkflowSinkLinkForm.js +101 -0
- package/dist/bigconsole/components/workflow/WorkflowSinkLinkForm.js.map +1 -0
- package/dist/bigconsole/hooks/useBigConsoleSettings.d.ts +16 -0
- package/dist/bigconsole/hooks/useBigConsoleSettings.d.ts.map +1 -0
- package/dist/bigconsole/hooks/useBigConsoleSettings.js +57 -0
- package/dist/bigconsole/hooks/useBigConsoleSettings.js.map +1 -0
- package/dist/bigconsole/hooks/useDashboardOperations.d.ts.map +1 -1
- package/dist/bigconsole/hooks/useDashboardOperations.js +102 -79
- package/dist/bigconsole/hooks/useDashboardOperations.js.map +1 -1
- package/dist/bigconsole/hooks/useExportDashboard.d.ts +3 -1
- package/dist/bigconsole/hooks/useExportDashboard.d.ts.map +1 -1
- package/dist/bigconsole/hooks/useExportDashboard.js +23 -13
- package/dist/bigconsole/hooks/useExportDashboard.js.map +1 -1
- package/dist/bigconsole/hooks/useFilterUrlSync.d.ts +18 -0
- package/dist/bigconsole/hooks/useFilterUrlSync.d.ts.map +1 -1
- package/dist/bigconsole/hooks/useFilterUrlSync.js +87 -57
- package/dist/bigconsole/hooks/useFilterUrlSync.js.map +1 -1
- package/dist/bigconsole/hooks/useGlobalFilters.d.ts.map +1 -1
- package/dist/bigconsole/hooks/useGlobalFilters.js +39 -29
- package/dist/bigconsole/hooks/useGlobalFilters.js.map +1 -1
- package/dist/bigconsole/hooks/usePageOperations.d.ts.map +1 -1
- package/dist/bigconsole/hooks/usePageOperations.js +1 -0
- package/dist/bigconsole/hooks/usePageOperations.js.map +1 -1
- package/dist/bigconsole/hooks/usePipelineOperations.d.ts.map +1 -1
- package/dist/bigconsole/hooks/usePipelineOperations.js +114 -112
- package/dist/bigconsole/hooks/usePipelineOperations.js.map +1 -1
- package/dist/bigconsole/hooks/useShareRecipients.d.ts +22 -0
- package/dist/bigconsole/hooks/useShareRecipients.d.ts.map +1 -0
- package/dist/bigconsole/hooks/useShareRecipients.js +198 -0
- package/dist/bigconsole/hooks/useShareRecipients.js.map +1 -0
- package/dist/bigconsole/pages/DashboardBuilderPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/DashboardBuilderPage.js +198 -193
- package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardViewPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/DashboardViewPage.js +171 -167
- package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardsPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/DashboardsPage.js +313 -266
- package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkBuilderPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/DataSinkBuilderPage.js +84 -79
- package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkViewPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/DataSinkViewPage.js +267 -257
- package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
- package/dist/bigconsole/pages/InsightsPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/InsightsPage.js +465 -402
- package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineBuilderPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/PipelineBuilderPage.js +169 -157
- package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineViewPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/PipelineViewPage.js +370 -230
- package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelinesPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/PipelinesPage.js +181 -151
- package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
- package/dist/bigconsole/pages/SettingsPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/SettingsPage.js +188 -208
- package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
- package/dist/bigconsole/pages/WidgetDemoPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/WidgetDemoPage.js +134 -117
- package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowViewPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/WorkflowViewPage.js +315 -267
- package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowsPage.d.ts.map +1 -1
- package/dist/bigconsole/pages/WorkflowsPage.js +4 -3
- package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
- package/dist/bigconsole/types/index.d.ts +4 -0
- package/dist/bigconsole/types/index.d.ts.map +1 -1
- package/dist/bigconsole/utils/drilldownParams.d.ts +3 -0
- package/dist/bigconsole/utils/drilldownParams.d.ts.map +1 -0
- package/dist/bigconsole/utils/drilldownParams.js +8 -0
- package/dist/bigconsole/utils/drilldownParams.js.map +1 -0
- package/dist/generated/wspace-operations.d.ts +148 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -1
- package/dist/generated/wspace-operations.js +172 -133
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.d.ts +21 -0
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/dist/generated/wspace-types.js.map +1 -1
- package/dist/microfe-bigconsole.css +1 -1
- package/dist/translations/en.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -108,95 +108,95 @@ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y bor
|
|
|
108
108
|
})]
|
|
109
109
|
})
|
|
110
110
|
});
|
|
111
|
-
}), x = o(function({ consoleId: i, value: o,
|
|
112
|
-
let { t:
|
|
111
|
+
}), x = o(function({ consoleId: i, value: o, resolvedParser: y, onChange: x, filterType: S, filterStatus: C = "active", filterInputSinkKey: w, placeholder: T, disabled: E = !1, error: D = !1, errorMessage: O }) {
|
|
112
|
+
let { t: k } = m(), [A, j] = u(!1), [M, N] = u(""), P = T ?? k("bigconsole.parsers.selector.placeholder", "Select a parser..."), F = e(), I = i === h, { parsers: L, loading: R, fetchParsers: z } = n({
|
|
113
113
|
consoleId: i,
|
|
114
|
-
skipFetch:
|
|
115
|
-
}), { parsers:
|
|
114
|
+
skipFetch: I
|
|
115
|
+
}), { parsers: B, loading: V, fetchParsers: H } = n({
|
|
116
116
|
consoleId: h,
|
|
117
|
-
skipFetch:
|
|
118
|
-
}),
|
|
119
|
-
if (
|
|
120
|
-
let e = new Set(
|
|
121
|
-
return [...
|
|
117
|
+
skipFetch: I
|
|
118
|
+
}), U = l(() => {
|
|
119
|
+
if (I) return L;
|
|
120
|
+
let e = new Set(L.map((e) => e.id)), t = B.filter((t) => !e.has(t.id));
|
|
121
|
+
return [...L, ...t];
|
|
122
122
|
}, [
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
]),
|
|
127
|
-
if (
|
|
128
|
-
if (
|
|
129
|
-
let t =
|
|
123
|
+
L,
|
|
124
|
+
B,
|
|
125
|
+
I
|
|
126
|
+
]), W = R || V, G = l(() => U.filter((e) => {
|
|
127
|
+
if (S && e.type !== S || C && e.status !== C || w && e.inputSinkKey !== w) return !1;
|
|
128
|
+
if (M) {
|
|
129
|
+
let t = M.toLowerCase();
|
|
130
130
|
return e.name.toLowerCase().includes(t) || e.description?.toLowerCase().includes(t) || e.inputSinkKey.toLowerCase().includes(t) || e.outputKey.toLowerCase().includes(t);
|
|
131
131
|
}
|
|
132
132
|
return !0;
|
|
133
133
|
}), [
|
|
134
|
-
|
|
135
|
-
x,
|
|
134
|
+
U,
|
|
136
135
|
S,
|
|
137
136
|
C,
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
137
|
+
w,
|
|
138
|
+
M
|
|
139
|
+
]), { dashboardScopedParsers: K, globalScopedParsers: q } = l(() => ({
|
|
140
|
+
dashboardScopedParsers: G.filter((e) => e.consoleId !== h),
|
|
141
|
+
globalScopedParsers: G.filter((e) => e.consoleId === h)
|
|
142
|
+
}), [G]), J = U.find((e) => e.id === o) ?? (y?.id === o ? y : void 0);
|
|
143
143
|
c(() => {
|
|
144
|
-
i && (
|
|
145
|
-
type:
|
|
146
|
-
status:
|
|
147
|
-
}),
|
|
148
|
-
type:
|
|
149
|
-
status:
|
|
144
|
+
i && (z({
|
|
145
|
+
type: S,
|
|
146
|
+
status: C ?? void 0
|
|
147
|
+
}), I || H({
|
|
148
|
+
type: S,
|
|
149
|
+
status: C ?? void 0
|
|
150
150
|
}));
|
|
151
151
|
}, [
|
|
152
152
|
i,
|
|
153
|
-
x,
|
|
154
153
|
S,
|
|
155
154
|
C,
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
155
|
+
w,
|
|
156
|
+
z,
|
|
157
|
+
H,
|
|
158
|
+
I
|
|
159
159
|
]);
|
|
160
|
-
let
|
|
161
|
-
|
|
162
|
-
}, [
|
|
163
|
-
if (
|
|
164
|
-
let e = !
|
|
165
|
-
e && (
|
|
166
|
-
type:
|
|
167
|
-
status:
|
|
168
|
-
}),
|
|
169
|
-
type:
|
|
170
|
-
status:
|
|
171
|
-
})),
|
|
160
|
+
let Y = s((e) => {
|
|
161
|
+
x(e), j(!1), N("");
|
|
162
|
+
}, [x]), X = s(() => {
|
|
163
|
+
if (E) return;
|
|
164
|
+
let e = !A;
|
|
165
|
+
e && (z({
|
|
166
|
+
type: S,
|
|
167
|
+
status: C ?? void 0
|
|
168
|
+
}), I || H({
|
|
169
|
+
type: S,
|
|
170
|
+
status: C ?? void 0
|
|
171
|
+
})), j(e);
|
|
172
172
|
}, [
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
x,
|
|
173
|
+
E,
|
|
174
|
+
A,
|
|
175
|
+
z,
|
|
176
|
+
H,
|
|
178
177
|
S,
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
178
|
+
C,
|
|
179
|
+
I
|
|
180
|
+
]), Z = s(() => {
|
|
181
|
+
j(!1);
|
|
182
|
+
}, []), Q = s(() => {
|
|
183
|
+
j(!1);
|
|
184
|
+
let e = I ? "/parsers/new" : `/dashboards/${i}/parsers/new`;
|
|
185
|
+
window.open(F(e), "_blank", "noopener,noreferrer");
|
|
186
186
|
}, [
|
|
187
|
-
|
|
187
|
+
F,
|
|
188
188
|
i,
|
|
189
|
-
|
|
189
|
+
I
|
|
190
190
|
]);
|
|
191
191
|
return /* @__PURE__ */ p("div", {
|
|
192
192
|
className: "relative",
|
|
193
193
|
children: [
|
|
194
194
|
/* @__PURE__ */ p("button", {
|
|
195
195
|
type: "button",
|
|
196
|
-
onClick:
|
|
197
|
-
disabled:
|
|
196
|
+
onClick: X,
|
|
197
|
+
disabled: E,
|
|
198
198
|
"aria-haspopup": "listbox",
|
|
199
|
-
"aria-expanded":
|
|
199
|
+
"aria-expanded": A,
|
|
200
200
|
className: `
|
|
201
201
|
w-full min-w-0 min-h-control-md
|
|
202
202
|
px-3 py-2
|
|
@@ -206,37 +206,37 @@ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y bor
|
|
|
206
206
|
flex items-center justify-between gap-2
|
|
207
207
|
motion-safe:transition-colors
|
|
208
208
|
${t}
|
|
209
|
-
${
|
|
210
|
-
${
|
|
211
|
-
${
|
|
209
|
+
${E ? "opacity-50 cursor-not-allowed" : "hover:border-action-primary-bg cursor-pointer"}
|
|
210
|
+
${D ? "border-status-error-border" : "border-[var(--color-border-default)]"}
|
|
211
|
+
${A ? "border-action-primary-bg ring-2 ring-action-primary-bg/20" : ""}
|
|
212
212
|
`,
|
|
213
213
|
children: [/* @__PURE__ */ f("div", {
|
|
214
214
|
className: "flex-1 min-w-0",
|
|
215
|
-
children:
|
|
215
|
+
children: J ? /* @__PURE__ */ p("div", {
|
|
216
216
|
className: "flex min-w-0 items-center gap-2",
|
|
217
217
|
children: [/* @__PURE__ */ f(r, {
|
|
218
|
-
type:
|
|
218
|
+
type: J.type,
|
|
219
219
|
size: "sm"
|
|
220
220
|
}), /* @__PURE__ */ f("span", {
|
|
221
221
|
className: "text-sm text-text-primary truncate",
|
|
222
|
-
children:
|
|
222
|
+
children: J.name
|
|
223
223
|
})]
|
|
224
224
|
}) : /* @__PURE__ */ f("span", {
|
|
225
225
|
className: "text-sm text-text-muted",
|
|
226
|
-
children:
|
|
226
|
+
children: P
|
|
227
227
|
})
|
|
228
228
|
}), /* @__PURE__ */ f(v, {
|
|
229
229
|
"aria-hidden": "true",
|
|
230
|
-
className: `w-4 h-4 shrink-0 text-text-secondary motion-safe:transition-transform ${
|
|
230
|
+
className: `w-4 h-4 shrink-0 text-text-secondary motion-safe:transition-transform ${A ? "transform rotate-180" : ""}`
|
|
231
231
|
})]
|
|
232
232
|
}),
|
|
233
|
-
|
|
233
|
+
D && O && /* @__PURE__ */ f("p", {
|
|
234
234
|
className: "mt-1 text-xs text-status-error-text",
|
|
235
|
-
children:
|
|
235
|
+
children: O
|
|
236
236
|
}),
|
|
237
|
-
|
|
237
|
+
A && /* @__PURE__ */ p(a, { children: [/* @__PURE__ */ f("div", {
|
|
238
238
|
className: "fixed inset-0 z-10",
|
|
239
|
-
onClick:
|
|
239
|
+
onClick: Z
|
|
240
240
|
}), /* @__PURE__ */ p("div", {
|
|
241
241
|
className: "absolute left-0 right-0 top-full mt-1 z-20 bg-bg-surface border border-[var(--color-border-default)] rounded-md shadow-lg max-h-80 flex flex-col overflow-hidden",
|
|
242
242
|
children: [
|
|
@@ -244,25 +244,25 @@ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y bor
|
|
|
244
244
|
className: "p-2 border-b border-[var(--color-border-default)]",
|
|
245
245
|
children: /* @__PURE__ */ f("input", {
|
|
246
246
|
type: "text",
|
|
247
|
-
"aria-label":
|
|
248
|
-
placeholder:
|
|
249
|
-
value:
|
|
250
|
-
onChange: (e) =>
|
|
247
|
+
"aria-label": k("bigconsole.parsers.selector.searchPlaceholder", "Search parsers..."),
|
|
248
|
+
placeholder: k("bigconsole.parsers.selector.searchPlaceholder", "Search parsers..."),
|
|
249
|
+
value: M,
|
|
250
|
+
onChange: (e) => N(e.target.value),
|
|
251
251
|
className: "\n w-full min-w-0 min-h-control-md px-3 py-2\n bg-bg-sunken\n border border-[var(--color-border-default)]\n rounded-md\n text-sm text-text-primary\n placeholder:text-text-muted\n focus:outline-none\n focus:border-action-primary-bg\n focus:ring-2\n focus:ring-action-primary-bg/20\n "
|
|
252
252
|
})
|
|
253
253
|
}),
|
|
254
254
|
/* @__PURE__ */ f("div", {
|
|
255
255
|
className: "overflow-y-auto flex-1",
|
|
256
|
-
children:
|
|
256
|
+
children: W ? /* @__PURE__ */ f("div", {
|
|
257
257
|
className: "p-4 text-center text-sm text-text-secondary",
|
|
258
|
-
children:
|
|
259
|
-
}) :
|
|
258
|
+
children: k("bigconsole.parsers.selector.loading", "Loading parsers...")
|
|
259
|
+
}) : G.length === 0 ? /* @__PURE__ */ f("div", {
|
|
260
260
|
className: "p-4 text-center text-sm text-text-secondary",
|
|
261
|
-
children:
|
|
261
|
+
children: k("bigconsole.parsers.selector.empty", "No parsers found")
|
|
262
262
|
}) : /* @__PURE__ */ p(a, { children: [
|
|
263
263
|
/* @__PURE__ */ f("button", {
|
|
264
264
|
type: "button",
|
|
265
|
-
onClick: () =>
|
|
265
|
+
onClick: () => Y(null),
|
|
266
266
|
className: `
|
|
267
267
|
w-full min-h-control-md px-3 py-2
|
|
268
268
|
text-left text-sm
|
|
@@ -273,30 +273,30 @@ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y bor
|
|
|
273
273
|
`,
|
|
274
274
|
children: /* @__PURE__ */ f("span", {
|
|
275
275
|
className: "italic",
|
|
276
|
-
children:
|
|
276
|
+
children: k("bigconsole.parsers.selector.none", "None")
|
|
277
277
|
})
|
|
278
278
|
}),
|
|
279
|
-
|
|
279
|
+
K.length > 0 && /* @__PURE__ */ p(a, { children: [/* @__PURE__ */ f("div", {
|
|
280
280
|
className: g,
|
|
281
281
|
children: /* @__PURE__ */ f("span", {
|
|
282
282
|
className: _,
|
|
283
|
-
children:
|
|
283
|
+
children: k("bigconsole.parsers.selector.dashboardParsers", "Dashboard Parsers")
|
|
284
284
|
})
|
|
285
|
-
}),
|
|
285
|
+
}), K.map((e) => /* @__PURE__ */ f(b, {
|
|
286
286
|
parser: e,
|
|
287
287
|
isSelected: o === e.id,
|
|
288
|
-
onSelect:
|
|
288
|
+
onSelect: Y
|
|
289
289
|
}, e.id))] }),
|
|
290
|
-
|
|
290
|
+
q.length > 0 && /* @__PURE__ */ p(a, { children: [/* @__PURE__ */ f("div", {
|
|
291
291
|
className: g,
|
|
292
292
|
children: /* @__PURE__ */ f("span", {
|
|
293
293
|
className: _,
|
|
294
|
-
children:
|
|
294
|
+
children: k("bigconsole.parsers.selector.globalParsers", "Global Parsers")
|
|
295
295
|
})
|
|
296
|
-
}),
|
|
296
|
+
}), q.map((e) => /* @__PURE__ */ f(b, {
|
|
297
297
|
parser: e,
|
|
298
298
|
isSelected: o === e.id,
|
|
299
|
-
onSelect:
|
|
299
|
+
onSelect: Y,
|
|
300
300
|
isGlobal: !0
|
|
301
301
|
}, e.id))] })
|
|
302
302
|
] })
|
|
@@ -305,9 +305,9 @@ var h = "default", g = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y bor
|
|
|
305
305
|
className: "p-2 border-t border-border-default",
|
|
306
306
|
children: /* @__PURE__ */ p("button", {
|
|
307
307
|
type: "button",
|
|
308
|
-
onClick:
|
|
308
|
+
onClick: Q,
|
|
309
309
|
className: "\n w-full flex items-center gap-2\n px-3 py-2\n text-sm font-medium text-action-primary-bg\n rounded-md\n hover:bg-action-primary-bg/10\n transition-colors\n ",
|
|
310
|
-
children: [/* @__PURE__ */ f(d, { className: "w-4 h-4" }),
|
|
310
|
+
children: [/* @__PURE__ */ f(d, { className: "w-4 h-4" }), k("bigconsole.parsers.selector.createNew", "Create new parser")]
|
|
311
311
|
})
|
|
312
312
|
})
|
|
313
313
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ParserSelector.js","names":[],"sources":["../../../../src/bigconsole/components/parser/ParserSelector.tsx"],"sourcesContent":["/**\n * Parser Selector\n *\n * Dropdown component for selecting a parser.\n * Shows both dashboard-specific parsers and global parsers.\n */\n\nimport { memo, useState, useEffect, useCallback, Fragment, useMemo } from 'react';\nimport { Plus } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useParserOperations } from '../../hooks/useParserOperations';\nimport { useBuildPath } from '../../contexts';\nimport { ParserTypeBadge } from './ParserTypeBadge';\nimport { ParserStatusBadge } from './ParserStatusBadge';\nimport { SECTION_FOCUS_RING } from '../common';\nimport type { ParserType, ParserStatus } from '../../types';\n\n// Default console ID for global parsers\nconst DEFAULT_CONSOLE_ID = 'default';\n\n/**\n * Group header inside the dropdown. This sunken, bordered, uppercase strip is the\n * module's section-header idiom at list scale — it is kept in step with the\n * `Section` primitive so a grouped dropdown reads like a grouped page.\n */\nconst GROUP_HEADER = 'sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y border-[var(--color-border-default)]';\nconst GROUP_HEADER_LABEL = 'text-xs font-semibold uppercase tracking-wide text-text-secondary';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface ParserSelectorProps {\n /** Console ID */\n consoleId: string;\n /** Currently selected parser ID */\n value: string | null;\n /** Callback when selection changes */\n onChange: (id: string | null) => void;\n /** Filter by type */\n filterType?: ParserType;\n /** Filter by status */\n filterStatus?: ParserStatus;\n /** Filter by input DataSink key */\n filterInputSinkKey?: string | null;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the selector is disabled */\n disabled?: boolean;\n /** Whether to show error state */\n error?: boolean;\n /** Error message to display */\n errorMessage?: string;\n}\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n);\n\nconst GlobeIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 21a9 9 0 100-18 9 9 0 000 18z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3.6 9h16.8M3.6 15h16.8\" />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 3a15 15 0 014 9 15 15 0 01-4 9 15 15 0 01-4-9 15 15 0 014-9z\"\n />\n </svg>\n);\n\n// ============================================================================\n// PARSER OPTION BUTTON\n// ============================================================================\n\ninterface ParserOptionButtonProps {\n parser: {\n id: string;\n name: string;\n description: string | null;\n type: 'jq' | 'jsonata';\n inputSinkKey: string;\n outputKey: string;\n status: 'active' | 'inactive';\n };\n isSelected: boolean;\n onSelect: (id: string) => void;\n isGlobal?: boolean;\n}\n\nconst ParserOptionButton = memo(function ParserOptionButton({\n parser,\n isSelected,\n onSelect,\n isGlobal = false,\n}: ParserOptionButtonProps) {\n const { t } = useI18n();\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(parser.id)}\n className={`\n w-full min-h-control-md px-3 py-2.5\n text-left\n hover:bg-bg-sunken\n motion-safe:transition-colors\n border-b border-[var(--color-border-default)] last:border-b-0\n ${SECTION_FOCUS_RING}\n ${isSelected ? 'bg-action-primary-bg/10' : ''}\n `}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n {/* Name and type */}\n <div className=\"flex items-center gap-2 mb-1\">\n <ParserTypeBadge type={parser.type} size=\"sm\" />\n <span className=\"text-sm font-medium text-text-primary truncate\">{parser.name}</span>\n {isGlobal && (\n <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 text-xs bg-bg-sunken text-text-secondary rounded\">\n <GlobeIcon className=\"w-3 h-3\" />\n {t('bigconsole.parsers.selector.globalBadge', 'Global')}\n </span>\n )}\n </div>\n\n {/* Description */}\n {parser.description && <p className=\"text-xs text-text-secondary line-clamp-1 mb-1\">{parser.description}</p>}\n\n {/* Data flow */}\n <div className=\"flex min-w-0 items-center gap-2 text-xs text-text-muted\">\n <span className=\"truncate font-mono\">\n {parser.inputSinkKey} → {parser.outputKey}\n </span>\n </div>\n </div>\n\n {/* Status badge */}\n <div className=\"shrink-0\">\n <ParserStatusBadge status={parser.status} size=\"sm\" showIcon={false} />\n </div>\n </div>\n </button>\n );\n});\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport const ParserSelector = memo(function ParserSelector({\n consoleId,\n value,\n onChange,\n filterType,\n filterStatus = 'active',\n filterInputSinkKey,\n placeholder,\n disabled = false,\n error = false,\n errorMessage,\n}: ParserSelectorProps) {\n const { t } = useI18n();\n const [isOpen, setIsOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n\n const resolvedPlaceholder = placeholder ?? t('bigconsole.parsers.selector.placeholder', 'Select a parser...');\n\n const buildPath = useBuildPath();\n\n // Determine if we need to fetch global parsers separately\n const isGlobalConsole = consoleId === DEFAULT_CONSOLE_ID;\n\n // Fetch dashboard-specific parsers\n const {\n parsers: dashboardParsers,\n loading: dashboardLoading,\n fetchParsers: fetchDashboardParsers,\n } = useParserOperations({\n consoleId,\n skipFetch: isGlobalConsole, // Skip if already fetching global\n });\n\n // Fetch global parsers (only if consoleId is not already 'default')\n const {\n parsers: globalParsers,\n loading: globalLoading,\n fetchParsers: fetchGlobalParsers,\n } = useParserOperations({\n consoleId: DEFAULT_CONSOLE_ID,\n skipFetch: isGlobalConsole, // Skip if consoleId is already 'default'\n });\n\n // Combine parsers: dashboard-specific + global (avoiding duplicates)\n const allParsers = useMemo(() => {\n if (isGlobalConsole) {\n // If we're already on global console, just return dashboard parsers\n return dashboardParsers;\n }\n\n // Combine both, with dashboard parsers first\n const parserIds = new Set(dashboardParsers.map((p) => p.id));\n const uniqueGlobalParsers = globalParsers.filter((p) => !parserIds.has(p.id));\n\n return [...dashboardParsers, ...uniqueGlobalParsers];\n }, [dashboardParsers, globalParsers, isGlobalConsole]);\n\n // Combined loading state\n const loading = dashboardLoading || globalLoading;\n\n // Filter parsers\n const filteredParsers = useMemo(() => {\n return allParsers.filter((p) => {\n // Filter by type if specified\n if (filterType && p.type !== filterType) return false;\n\n // Filter by status if specified\n if (filterStatus && p.status !== filterStatus) return false;\n\n // Filter by input DataSink key if specified\n if (filterInputSinkKey && p.inputSinkKey !== filterInputSinkKey) return false;\n\n // Filter by search query\n if (searchQuery) {\n const query = searchQuery.toLowerCase();\n return (\n p.name.toLowerCase().includes(query) ||\n p.description?.toLowerCase().includes(query) ||\n p.inputSinkKey.toLowerCase().includes(query) ||\n p.outputKey.toLowerCase().includes(query)\n );\n }\n\n return true;\n });\n }, [allParsers, filterType, filterStatus, filterInputSinkKey, searchQuery]);\n\n // Group parsers by scope for display\n const { dashboardScopedParsers, globalScopedParsers } = useMemo(() => {\n const dashboard = filteredParsers.filter((p) => p.consoleId !== DEFAULT_CONSOLE_ID);\n const global = filteredParsers.filter((p) => p.consoleId === DEFAULT_CONSOLE_ID);\n return { dashboardScopedParsers: dashboard, globalScopedParsers: global };\n }, [filteredParsers]);\n\n // Find selected parser\n const selectedParser = allParsers.find((p) => p.id === value);\n\n // Fetch parsers when console changes or DataSink filter changes\n useEffect(() => {\n if (consoleId) {\n fetchDashboardParsers({ type: filterType, status: filterStatus ?? undefined });\n\n // Also fetch global parsers if not already on global console\n if (!isGlobalConsole) {\n fetchGlobalParsers({ type: filterType, status: filterStatus ?? undefined });\n }\n }\n }, [\n consoleId,\n filterType,\n filterStatus,\n filterInputSinkKey,\n fetchDashboardParsers,\n fetchGlobalParsers,\n isGlobalConsole,\n ]);\n\n // Handle selection\n const handleSelect = useCallback(\n (id: string | null) => {\n onChange(id);\n setIsOpen(false);\n setSearchQuery('');\n },\n [onChange]\n );\n\n // Toggle dropdown\n const handleToggle = useCallback(() => {\n if (disabled) return;\n const next = !isOpen;\n // Refetch on open so a parser created via the \"Create new\" tab shows\n // up here without needing a full page reload.\n if (next) {\n void fetchDashboardParsers({ type: filterType, status: filterStatus ?? undefined });\n if (!isGlobalConsole) {\n void fetchGlobalParsers({ type: filterType, status: filterStatus ?? undefined });\n }\n }\n setIsOpen(next);\n }, [disabled, isOpen, fetchDashboardParsers, fetchGlobalParsers, filterType, filterStatus, isGlobalConsole]);\n\n // Close dropdown\n const handleClose = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n // Open the create-Parser page in a new tab so the current editing\n // context (e.g. an unsaved widget in the dashboard builder) is preserved.\n // Preserve the dashboard scope so the new parser is created for this\n // console rather than as a global parser.\n const handleCreateNew = useCallback(() => {\n setIsOpen(false);\n const path = isGlobalConsole ? '/parsers/new' : `/dashboards/${consoleId}/parsers/new`;\n window.open(buildPath(path), '_blank', 'noopener,noreferrer');\n }, [buildPath, consoleId, isGlobalConsole]);\n\n return (\n <div className=\"relative\">\n {/* Trigger button */}\n <button\n type=\"button\"\n onClick={handleToggle}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n className={`\n w-full min-w-0 min-h-control-md\n px-3 py-2\n bg-bg-surface\n border rounded-md\n text-left\n flex items-center justify-between gap-2\n motion-safe:transition-colors\n ${SECTION_FOCUS_RING}\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:border-action-primary-bg cursor-pointer'}\n ${error ? 'border-status-error-border' : 'border-[var(--color-border-default)]'}\n ${isOpen ? 'border-action-primary-bg ring-2 ring-action-primary-bg/20' : ''}\n `}\n >\n <div className=\"flex-1 min-w-0\">\n {selectedParser ? (\n <div className=\"flex min-w-0 items-center gap-2\">\n <ParserTypeBadge type={selectedParser.type} size=\"sm\" />\n <span className=\"text-sm text-text-primary truncate\">{selectedParser.name}</span>\n </div>\n ) : (\n <span className=\"text-sm text-text-muted\">{resolvedPlaceholder}</span>\n )}\n </div>\n\n <ChevronDownIcon\n aria-hidden=\"true\"\n className={`w-4 h-4 shrink-0 text-text-secondary motion-safe:transition-transform ${isOpen ? 'transform rotate-180' : ''}`}\n />\n </button>\n\n {/* Error message */}\n {error && errorMessage && <p className=\"mt-1 text-xs text-status-error-text\">{errorMessage}</p>}\n\n {/* Dropdown */}\n {isOpen && (\n <Fragment>\n {/* Backdrop */}\n <div className=\"fixed inset-0 z-10\" onClick={handleClose} />\n\n {/* Dropdown content */}\n <div className=\"absolute left-0 right-0 top-full mt-1 z-20 bg-bg-surface border border-[var(--color-border-default)] rounded-md shadow-lg max-h-80 flex flex-col overflow-hidden\">\n {/* Search input */}\n <div className=\"p-2 border-b border-[var(--color-border-default)]\">\n <input\n type=\"text\"\n aria-label={t('bigconsole.parsers.selector.searchPlaceholder', 'Search parsers...')}\n placeholder={t('bigconsole.parsers.selector.searchPlaceholder', 'Search parsers...')}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={`\n w-full min-w-0 min-h-control-md px-3 py-2\n bg-bg-sunken\n border border-[var(--color-border-default)]\n rounded-md\n text-sm text-text-primary\n placeholder:text-text-muted\n focus:outline-none\n focus:border-action-primary-bg\n focus:ring-2\n focus:ring-action-primary-bg/20\n `}\n />\n </div>\n\n {/* Options list */}\n <div className=\"overflow-y-auto flex-1\">\n {loading ? (\n <div className=\"p-4 text-center text-sm text-text-secondary\">\n {t('bigconsole.parsers.selector.loading', 'Loading parsers...')}\n </div>\n ) : filteredParsers.length === 0 ? (\n <div className=\"p-4 text-center text-sm text-text-secondary\">\n {t('bigconsole.parsers.selector.empty', 'No parsers found')}\n </div>\n ) : (\n <Fragment>\n {/* None option */}\n <button\n type=\"button\"\n onClick={() => handleSelect(null)}\n className={`\n w-full min-h-control-md px-3 py-2\n text-left text-sm\n hover:bg-bg-sunken\n motion-safe:transition-colors\n ${SECTION_FOCUS_RING}\n ${value === null ? 'bg-action-primary-bg/10 text-action-primary-bg' : 'text-text-secondary'}\n `}\n >\n <span className=\"italic\">{t('bigconsole.parsers.selector.none', 'None')}</span>\n </button>\n\n {/* Dashboard-scoped parsers section */}\n {dashboardScopedParsers.length > 0 && (\n <Fragment>\n <div className={GROUP_HEADER}>\n <span className={GROUP_HEADER_LABEL}>\n {t('bigconsole.parsers.selector.dashboardParsers', 'Dashboard Parsers')}\n </span>\n </div>\n {dashboardScopedParsers.map((parser) => (\n <ParserOptionButton\n key={parser.id}\n parser={parser}\n isSelected={value === parser.id}\n onSelect={handleSelect}\n />\n ))}\n </Fragment>\n )}\n\n {/* Global parsers section */}\n {globalScopedParsers.length > 0 && (\n <Fragment>\n <div className={GROUP_HEADER}>\n <span className={GROUP_HEADER_LABEL}>\n {t('bigconsole.parsers.selector.globalParsers', 'Global Parsers')}\n </span>\n </div>\n {globalScopedParsers.map((parser) => (\n <ParserOptionButton\n key={parser.id}\n parser={parser}\n isSelected={value === parser.id}\n onSelect={handleSelect}\n isGlobal\n />\n ))}\n </Fragment>\n )}\n </Fragment>\n )}\n </div>\n\n {/* Create new — persistent footer action (opens in a new tab) */}\n <div className=\"p-2 border-t border-border-default\">\n <button\n type=\"button\"\n onClick={handleCreateNew}\n className=\"\n w-full flex items-center gap-2\n px-3 py-2\n text-sm font-medium text-action-primary-bg\n rounded-md\n hover:bg-action-primary-bg/10\n transition-colors\n \"\n >\n <Plus className=\"w-4 h-4\" />\n {t('bigconsole.parsers.selector.createNew', 'Create new parser')}\n </button>\n </div>\n </div>\n </Fragment>\n )}\n </div>\n );\n});\n\nexport default ParserSelector;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ParserSelector.js","names":[],"sources":["../../../../src/bigconsole/components/parser/ParserSelector.tsx"],"sourcesContent":["/**\n * Parser Selector\n *\n * Dropdown component for selecting a parser.\n * Shows both dashboard-specific parsers and global parsers.\n */\n\nimport { memo, useState, useEffect, useCallback, Fragment, useMemo } from 'react';\nimport { Plus } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useParserOperations } from '../../hooks/useParserOperations';\nimport { useBuildPath } from '../../contexts';\nimport { ParserTypeBadge } from './ParserTypeBadge';\nimport { ParserStatusBadge } from './ParserStatusBadge';\nimport { SECTION_FOCUS_RING } from '../common';\nimport type { ParserType, ParserStatus, Parser } from '../../types';\n\n// Default console ID for global parsers\nconst DEFAULT_CONSOLE_ID = 'default';\n\n/**\n * Group header inside the dropdown. This sunken, bordered, uppercase strip is the\n * module's section-header idiom at list scale — it is kept in step with the\n * `Section` primitive so a grouped dropdown reads like a grouped page.\n */\nconst GROUP_HEADER = 'sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y border-[var(--color-border-default)]';\nconst GROUP_HEADER_LABEL = 'text-xs font-semibold uppercase tracking-wide text-text-secondary';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface ParserSelectorProps {\n /** Console ID */\n consoleId: string;\n /** Currently selected parser ID */\n value: string | null;\n /** Actual bound parser fetched by ID, even when list requests are still loading. */\n resolvedParser?: Parser;\n /** Callback when selection changes */\n onChange: (id: string | null) => void;\n /** Filter by type */\n filterType?: ParserType;\n /** Filter by status */\n filterStatus?: ParserStatus;\n /** Filter by input DataSink key */\n filterInputSinkKey?: string | null;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the selector is disabled */\n disabled?: boolean;\n /** Whether to show error state */\n error?: boolean;\n /** Error message to display */\n errorMessage?: string;\n}\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n);\n\nconst GlobeIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 21a9 9 0 100-18 9 9 0 000 18z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3.6 9h16.8M3.6 15h16.8\" />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 3a15 15 0 014 9 15 15 0 01-4 9 15 15 0 01-4-9 15 15 0 014-9z\"\n />\n </svg>\n);\n\n// ============================================================================\n// PARSER OPTION BUTTON\n// ============================================================================\n\ninterface ParserOptionButtonProps {\n parser: {\n id: string;\n name: string;\n description: string | null;\n type: 'jq' | 'jsonata';\n inputSinkKey: string;\n outputKey: string;\n status: 'active' | 'inactive';\n };\n isSelected: boolean;\n onSelect: (id: string) => void;\n isGlobal?: boolean;\n}\n\nconst ParserOptionButton = memo(function ParserOptionButton({\n parser,\n isSelected,\n onSelect,\n isGlobal = false,\n}: ParserOptionButtonProps) {\n const { t } = useI18n();\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(parser.id)}\n className={`\n w-full min-h-control-md px-3 py-2.5\n text-left\n hover:bg-bg-sunken\n motion-safe:transition-colors\n border-b border-[var(--color-border-default)] last:border-b-0\n ${SECTION_FOCUS_RING}\n ${isSelected ? 'bg-action-primary-bg/10' : ''}\n `}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n {/* Name and type */}\n <div className=\"flex items-center gap-2 mb-1\">\n <ParserTypeBadge type={parser.type} size=\"sm\" />\n <span className=\"text-sm font-medium text-text-primary truncate\">{parser.name}</span>\n {isGlobal && (\n <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 text-xs bg-bg-sunken text-text-secondary rounded\">\n <GlobeIcon className=\"w-3 h-3\" />\n {t('bigconsole.parsers.selector.globalBadge', 'Global')}\n </span>\n )}\n </div>\n\n {/* Description */}\n {parser.description && <p className=\"text-xs text-text-secondary line-clamp-1 mb-1\">{parser.description}</p>}\n\n {/* Data flow */}\n <div className=\"flex min-w-0 items-center gap-2 text-xs text-text-muted\">\n <span className=\"truncate font-mono\">\n {parser.inputSinkKey} → {parser.outputKey}\n </span>\n </div>\n </div>\n\n {/* Status badge */}\n <div className=\"shrink-0\">\n <ParserStatusBadge status={parser.status} size=\"sm\" showIcon={false} />\n </div>\n </div>\n </button>\n );\n});\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport const ParserSelector = memo(function ParserSelector({\n consoleId,\n value,\n resolvedParser,\n onChange,\n filterType,\n filterStatus = 'active',\n filterInputSinkKey,\n placeholder,\n disabled = false,\n error = false,\n errorMessage,\n}: ParserSelectorProps) {\n const { t } = useI18n();\n const [isOpen, setIsOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n\n const resolvedPlaceholder = placeholder ?? t('bigconsole.parsers.selector.placeholder', 'Select a parser...');\n\n const buildPath = useBuildPath();\n\n // Determine if we need to fetch global parsers separately\n const isGlobalConsole = consoleId === DEFAULT_CONSOLE_ID;\n\n // Fetch dashboard-specific parsers\n const {\n parsers: dashboardParsers,\n loading: dashboardLoading,\n fetchParsers: fetchDashboardParsers,\n } = useParserOperations({\n consoleId,\n skipFetch: isGlobalConsole, // Skip if already fetching global\n });\n\n // Fetch global parsers (only if consoleId is not already 'default')\n const {\n parsers: globalParsers,\n loading: globalLoading,\n fetchParsers: fetchGlobalParsers,\n } = useParserOperations({\n consoleId: DEFAULT_CONSOLE_ID,\n skipFetch: isGlobalConsole, // Skip if consoleId is already 'default'\n });\n\n // Combine parsers: dashboard-specific + global (avoiding duplicates)\n const allParsers = useMemo(() => {\n if (isGlobalConsole) {\n // If we're already on global console, just return dashboard parsers\n return dashboardParsers;\n }\n\n // Combine both, with dashboard parsers first\n const parserIds = new Set(dashboardParsers.map((p) => p.id));\n const uniqueGlobalParsers = globalParsers.filter((p) => !parserIds.has(p.id));\n\n return [...dashboardParsers, ...uniqueGlobalParsers];\n }, [dashboardParsers, globalParsers, isGlobalConsole]);\n\n // Combined loading state\n const loading = dashboardLoading || globalLoading;\n\n // Filter parsers\n const filteredParsers = useMemo(() => {\n return allParsers.filter((p) => {\n // Filter by type if specified\n if (filterType && p.type !== filterType) return false;\n\n // Filter by status if specified\n if (filterStatus && p.status !== filterStatus) return false;\n\n // Filter by input DataSink key if specified\n if (filterInputSinkKey && p.inputSinkKey !== filterInputSinkKey) return false;\n\n // Filter by search query\n if (searchQuery) {\n const query = searchQuery.toLowerCase();\n return (\n p.name.toLowerCase().includes(query) ||\n p.description?.toLowerCase().includes(query) ||\n p.inputSinkKey.toLowerCase().includes(query) ||\n p.outputKey.toLowerCase().includes(query)\n );\n }\n\n return true;\n });\n }, [allParsers, filterType, filterStatus, filterInputSinkKey, searchQuery]);\n\n // Group parsers by scope for display\n const { dashboardScopedParsers, globalScopedParsers } = useMemo(() => {\n const dashboard = filteredParsers.filter((p) => p.consoleId !== DEFAULT_CONSOLE_ID);\n const global = filteredParsers.filter((p) => p.consoleId === DEFAULT_CONSOLE_ID);\n return { dashboardScopedParsers: dashboard, globalScopedParsers: global };\n }, [filteredParsers]);\n\n // Find selected parser\n const selectedParser =\n allParsers.find((p) => p.id === value) ?? (resolvedParser?.id === value ? resolvedParser : undefined);\n\n // Fetch parsers when console changes or DataSink filter changes\n useEffect(() => {\n if (consoleId) {\n fetchDashboardParsers({ type: filterType, status: filterStatus ?? undefined });\n\n // Also fetch global parsers if not already on global console\n if (!isGlobalConsole) {\n fetchGlobalParsers({ type: filterType, status: filterStatus ?? undefined });\n }\n }\n }, [\n consoleId,\n filterType,\n filterStatus,\n filterInputSinkKey,\n fetchDashboardParsers,\n fetchGlobalParsers,\n isGlobalConsole,\n ]);\n\n // Handle selection\n const handleSelect = useCallback(\n (id: string | null) => {\n onChange(id);\n setIsOpen(false);\n setSearchQuery('');\n },\n [onChange]\n );\n\n // Toggle dropdown\n const handleToggle = useCallback(() => {\n if (disabled) return;\n const next = !isOpen;\n // Refetch on open so a parser created via the \"Create new\" tab shows\n // up here without needing a full page reload.\n if (next) {\n void fetchDashboardParsers({ type: filterType, status: filterStatus ?? undefined });\n if (!isGlobalConsole) {\n void fetchGlobalParsers({ type: filterType, status: filterStatus ?? undefined });\n }\n }\n setIsOpen(next);\n }, [disabled, isOpen, fetchDashboardParsers, fetchGlobalParsers, filterType, filterStatus, isGlobalConsole]);\n\n // Close dropdown\n const handleClose = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n // Open the create-Parser page in a new tab so the current editing\n // context (e.g. an unsaved widget in the dashboard builder) is preserved.\n // Preserve the dashboard scope so the new parser is created for this\n // console rather than as a global parser.\n const handleCreateNew = useCallback(() => {\n setIsOpen(false);\n const path = isGlobalConsole ? '/parsers/new' : `/dashboards/${consoleId}/parsers/new`;\n window.open(buildPath(path), '_blank', 'noopener,noreferrer');\n }, [buildPath, consoleId, isGlobalConsole]);\n\n return (\n <div className=\"relative\">\n {/* Trigger button */}\n <button\n type=\"button\"\n onClick={handleToggle}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n className={`\n w-full min-w-0 min-h-control-md\n px-3 py-2\n bg-bg-surface\n border rounded-md\n text-left\n flex items-center justify-between gap-2\n motion-safe:transition-colors\n ${SECTION_FOCUS_RING}\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:border-action-primary-bg cursor-pointer'}\n ${error ? 'border-status-error-border' : 'border-[var(--color-border-default)]'}\n ${isOpen ? 'border-action-primary-bg ring-2 ring-action-primary-bg/20' : ''}\n `}\n >\n <div className=\"flex-1 min-w-0\">\n {selectedParser ? (\n <div className=\"flex min-w-0 items-center gap-2\">\n <ParserTypeBadge type={selectedParser.type} size=\"sm\" />\n <span className=\"text-sm text-text-primary truncate\">{selectedParser.name}</span>\n </div>\n ) : (\n <span className=\"text-sm text-text-muted\">{resolvedPlaceholder}</span>\n )}\n </div>\n\n <ChevronDownIcon\n aria-hidden=\"true\"\n className={`w-4 h-4 shrink-0 text-text-secondary motion-safe:transition-transform ${isOpen ? 'transform rotate-180' : ''}`}\n />\n </button>\n\n {/* Error message */}\n {error && errorMessage && <p className=\"mt-1 text-xs text-status-error-text\">{errorMessage}</p>}\n\n {/* Dropdown */}\n {isOpen && (\n <Fragment>\n {/* Backdrop */}\n <div className=\"fixed inset-0 z-10\" onClick={handleClose} />\n\n {/* Dropdown content */}\n <div className=\"absolute left-0 right-0 top-full mt-1 z-20 bg-bg-surface border border-[var(--color-border-default)] rounded-md shadow-lg max-h-80 flex flex-col overflow-hidden\">\n {/* Search input */}\n <div className=\"p-2 border-b border-[var(--color-border-default)]\">\n <input\n type=\"text\"\n aria-label={t('bigconsole.parsers.selector.searchPlaceholder', 'Search parsers...')}\n placeholder={t('bigconsole.parsers.selector.searchPlaceholder', 'Search parsers...')}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={`\n w-full min-w-0 min-h-control-md px-3 py-2\n bg-bg-sunken\n border border-[var(--color-border-default)]\n rounded-md\n text-sm text-text-primary\n placeholder:text-text-muted\n focus:outline-none\n focus:border-action-primary-bg\n focus:ring-2\n focus:ring-action-primary-bg/20\n `}\n />\n </div>\n\n {/* Options list */}\n <div className=\"overflow-y-auto flex-1\">\n {loading ? (\n <div className=\"p-4 text-center text-sm text-text-secondary\">\n {t('bigconsole.parsers.selector.loading', 'Loading parsers...')}\n </div>\n ) : filteredParsers.length === 0 ? (\n <div className=\"p-4 text-center text-sm text-text-secondary\">\n {t('bigconsole.parsers.selector.empty', 'No parsers found')}\n </div>\n ) : (\n <Fragment>\n {/* None option */}\n <button\n type=\"button\"\n onClick={() => handleSelect(null)}\n className={`\n w-full min-h-control-md px-3 py-2\n text-left text-sm\n hover:bg-bg-sunken\n motion-safe:transition-colors\n ${SECTION_FOCUS_RING}\n ${value === null ? 'bg-action-primary-bg/10 text-action-primary-bg' : 'text-text-secondary'}\n `}\n >\n <span className=\"italic\">{t('bigconsole.parsers.selector.none', 'None')}</span>\n </button>\n\n {/* Dashboard-scoped parsers section */}\n {dashboardScopedParsers.length > 0 && (\n <Fragment>\n <div className={GROUP_HEADER}>\n <span className={GROUP_HEADER_LABEL}>\n {t('bigconsole.parsers.selector.dashboardParsers', 'Dashboard Parsers')}\n </span>\n </div>\n {dashboardScopedParsers.map((parser) => (\n <ParserOptionButton\n key={parser.id}\n parser={parser}\n isSelected={value === parser.id}\n onSelect={handleSelect}\n />\n ))}\n </Fragment>\n )}\n\n {/* Global parsers section */}\n {globalScopedParsers.length > 0 && (\n <Fragment>\n <div className={GROUP_HEADER}>\n <span className={GROUP_HEADER_LABEL}>\n {t('bigconsole.parsers.selector.globalParsers', 'Global Parsers')}\n </span>\n </div>\n {globalScopedParsers.map((parser) => (\n <ParserOptionButton\n key={parser.id}\n parser={parser}\n isSelected={value === parser.id}\n onSelect={handleSelect}\n isGlobal\n />\n ))}\n </Fragment>\n )}\n </Fragment>\n )}\n </div>\n\n {/* Create new — persistent footer action (opens in a new tab) */}\n <div className=\"p-2 border-t border-border-default\">\n <button\n type=\"button\"\n onClick={handleCreateNew}\n className=\"\n w-full flex items-center gap-2\n px-3 py-2\n text-sm font-medium text-action-primary-bg\n rounded-md\n hover:bg-action-primary-bg/10\n transition-colors\n \"\n >\n <Plus className=\"w-4 h-4\" />\n {t('bigconsole.parsers.selector.createNew', 'Create new parser')}\n </button>\n </div>\n </div>\n </Fragment>\n )}\n </div>\n );\n});\n\nexport default ParserSelector;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PipelineCard.d.ts","sourceRoot":"","sources":["../../../../src/bigconsole/components/pipeline/PipelineCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAM5C,UAAU,iBAAiB;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAoFD,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"PipelineCard.d.ts","sourceRoot":"","sources":["../../../../src/bigconsole/components/pipeline/PipelineCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAM5C,UAAU,iBAAiB;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAoFD,eAAO,MAAM,YAAY,yDA2KvB,CAAC;AAEH,eAAe,YAAY,CAAC"}
|
|
@@ -99,103 +99,125 @@ var s = `inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-butt
|
|
|
99
99
|
onClick: b,
|
|
100
100
|
"data-testid": "pipeline-card",
|
|
101
101
|
className: "group flex min-w-0 cursor-pointer flex-col rounded-card border border-[var(--color-border-subtle)] bg-bg-surface shadow-[var(--shadow-elevation-1)] motion-safe:transition-[box-shadow,border-color] hover:border-[var(--color-border-strong)] hover:shadow-[var(--shadow-elevation-2)]",
|
|
102
|
-
children: [
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
102
|
+
children: [
|
|
103
|
+
/* @__PURE__ */ a("div", {
|
|
104
|
+
className: "flex min-w-0 items-start gap-icon-gap border-b border-[var(--color-border-subtle)] p-4",
|
|
105
|
+
children: [
|
|
106
|
+
/* @__PURE__ */ i("span", {
|
|
107
|
+
"aria-hidden": "true",
|
|
108
|
+
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-button bg-bg-sunken text-text-secondary",
|
|
109
|
+
children: /* @__PURE__ */ i(c, { className: "h-icon-md w-icon-md" })
|
|
110
|
+
}),
|
|
111
|
+
/* @__PURE__ */ a("div", {
|
|
112
|
+
className: "min-w-0 flex-1",
|
|
113
|
+
children: [/* @__PURE__ */ i("h3", {
|
|
114
|
+
className: "min-w-0 text-base font-semibold leading-tight text-text-primary",
|
|
115
|
+
children: /* @__PURE__ */ i("button", {
|
|
116
|
+
type: "button",
|
|
117
|
+
onClick: x,
|
|
118
|
+
title: n.name,
|
|
119
|
+
className: `block w-full truncate rounded-button text-left ${e}`,
|
|
120
|
+
children: n.name
|
|
121
|
+
})
|
|
122
|
+
}), n.description && /* @__PURE__ */ i("p", {
|
|
123
|
+
className: "mt-0.5 line-clamp-2 text-sm text-text-secondary",
|
|
124
|
+
children: n.description
|
|
125
|
+
})]
|
|
126
|
+
}),
|
|
127
|
+
/* @__PURE__ */ i(t, {
|
|
128
|
+
status: n.status,
|
|
129
|
+
size: "sm"
|
|
130
|
+
})
|
|
131
|
+
]
|
|
132
|
+
}),
|
|
133
|
+
v > 0 && /* @__PURE__ */ i("ol", {
|
|
134
|
+
"aria-label": "Stage data flow",
|
|
135
|
+
className: "flex min-w-0 flex-wrap items-center gap-2 px-4 pt-4 text-xs",
|
|
136
|
+
children: n.stages.map((e, t) => /* @__PURE__ */ a("li", {
|
|
137
|
+
className: "flex min-w-0 items-center gap-2",
|
|
138
|
+
children: [t > 0 && /* @__PURE__ */ i("span", {
|
|
139
|
+
"aria-hidden": "true",
|
|
140
|
+
className: "text-text-muted",
|
|
141
|
+
children: "→"
|
|
142
|
+
}), /* @__PURE__ */ a("code", {
|
|
143
|
+
className: "min-w-0 break-all rounded-button border border-[var(--color-border-subtle)] bg-bg-sunken px-2 py-1 text-text-secondary",
|
|
144
|
+
children: [
|
|
145
|
+
e.inputKey,
|
|
146
|
+
" → ",
|
|
147
|
+
e.outputKey
|
|
148
|
+
]
|
|
149
|
+
})]
|
|
150
|
+
}, e.id))
|
|
151
|
+
}),
|
|
152
|
+
/* @__PURE__ */ a("div", {
|
|
153
|
+
className: "flex flex-wrap items-center justify-between gap-control-gap p-4",
|
|
154
|
+
children: [/* @__PURE__ */ a("dl", {
|
|
155
|
+
className: "flex min-w-0 flex-wrap items-center gap-x-4 gap-y-1 text-xs text-text-secondary",
|
|
156
|
+
children: [/* @__PURE__ */ a("div", {
|
|
157
|
+
className: "flex items-center gap-1",
|
|
158
|
+
children: [
|
|
159
|
+
/* @__PURE__ */ i("dt", {
|
|
160
|
+
className: "sr-only",
|
|
161
|
+
children: "Stages"
|
|
162
|
+
}),
|
|
163
|
+
/* @__PURE__ */ i(f, {
|
|
164
|
+
className: "h-3.5 w-3.5 shrink-0",
|
|
165
|
+
"aria-hidden": "true"
|
|
166
|
+
}),
|
|
167
|
+
/* @__PURE__ */ a("dd", { children: [
|
|
168
|
+
v,
|
|
169
|
+
" stage",
|
|
170
|
+
v === 1 ? "" : "s"
|
|
171
|
+
] })
|
|
172
|
+
]
|
|
173
|
+
}), /* @__PURE__ */ a("div", {
|
|
174
|
+
className: "flex items-center gap-1",
|
|
175
|
+
children: [
|
|
176
|
+
/* @__PURE__ */ i("dt", {
|
|
177
|
+
className: "sr-only",
|
|
178
|
+
children: "Last run"
|
|
179
|
+
}),
|
|
180
|
+
/* @__PURE__ */ i(p, {
|
|
181
|
+
className: "h-3.5 w-3.5 shrink-0",
|
|
182
|
+
"aria-hidden": "true"
|
|
183
|
+
}),
|
|
184
|
+
/* @__PURE__ */ i("dd", {
|
|
185
|
+
title: n.lastExecutedAt ? `Last executed: ${new Date(n.lastExecutedAt).toLocaleString()}` : "Never executed",
|
|
186
|
+
children: y(n.lastExecutedAt)
|
|
187
|
+
})
|
|
188
|
+
]
|
|
124
189
|
})]
|
|
125
|
-
}),
|
|
126
|
-
/* @__PURE__ */ i(t, {
|
|
127
|
-
status: n.status,
|
|
128
|
-
size: "sm"
|
|
129
|
-
})
|
|
130
|
-
]
|
|
131
|
-
}), /* @__PURE__ */ a("div", {
|
|
132
|
-
className: "flex flex-wrap items-center justify-between gap-control-gap p-4",
|
|
133
|
-
children: [/* @__PURE__ */ a("dl", {
|
|
134
|
-
className: "flex min-w-0 flex-wrap items-center gap-x-4 gap-y-1 text-xs text-text-secondary",
|
|
135
|
-
children: [/* @__PURE__ */ a("div", {
|
|
136
|
-
className: "flex items-center gap-1",
|
|
137
|
-
children: [
|
|
138
|
-
/* @__PURE__ */ i("dt", {
|
|
139
|
-
className: "sr-only",
|
|
140
|
-
children: "Stages"
|
|
141
|
-
}),
|
|
142
|
-
/* @__PURE__ */ i(f, {
|
|
143
|
-
className: "h-3.5 w-3.5 shrink-0",
|
|
144
|
-
"aria-hidden": "true"
|
|
145
|
-
}),
|
|
146
|
-
/* @__PURE__ */ a("dd", { children: [
|
|
147
|
-
v,
|
|
148
|
-
" stage",
|
|
149
|
-
v === 1 ? "" : "s"
|
|
150
|
-
] })
|
|
151
|
-
]
|
|
152
190
|
}), /* @__PURE__ */ a("div", {
|
|
153
|
-
className: "flex items-center gap-1",
|
|
191
|
+
className: "flex shrink-0 items-center gap-1",
|
|
154
192
|
children: [
|
|
155
|
-
/* @__PURE__ */ i("
|
|
156
|
-
|
|
157
|
-
|
|
193
|
+
g && /* @__PURE__ */ i("button", {
|
|
194
|
+
type: "button",
|
|
195
|
+
onClick: C,
|
|
196
|
+
className: `${s} hover:bg-[var(--color-status-success-bgSubtle)] hover:text-status-success-text`,
|
|
197
|
+
title: "Test Pipeline",
|
|
198
|
+
"aria-label": `Test ${n.name}`,
|
|
199
|
+
children: /* @__PURE__ */ i(u, { className: "h-icon-sm w-icon-sm" })
|
|
158
200
|
}),
|
|
159
|
-
/* @__PURE__ */ i(
|
|
160
|
-
|
|
161
|
-
|
|
201
|
+
h && /* @__PURE__ */ i("button", {
|
|
202
|
+
type: "button",
|
|
203
|
+
onClick: S,
|
|
204
|
+
className: `${s} hover:bg-bg-sunken hover:text-text-primary`,
|
|
205
|
+
title: "Edit Pipeline",
|
|
206
|
+
"aria-label": `Edit ${n.name}`,
|
|
207
|
+
children: /* @__PURE__ */ i(l, { className: "h-icon-sm w-icon-sm" })
|
|
162
208
|
}),
|
|
163
|
-
/* @__PURE__ */ i("
|
|
164
|
-
|
|
165
|
-
|
|
209
|
+
_ && /* @__PURE__ */ i("button", {
|
|
210
|
+
type: "button",
|
|
211
|
+
onClick: w,
|
|
212
|
+
className: `${s} hover:bg-[var(--color-status-error-bgSubtle)] hover:text-status-error-text`,
|
|
213
|
+
title: "Delete Pipeline",
|
|
214
|
+
"aria-label": `Delete ${n.name}`,
|
|
215
|
+
children: /* @__PURE__ */ i(d, { className: "h-icon-sm w-icon-sm" })
|
|
166
216
|
})
|
|
167
217
|
]
|
|
168
218
|
})]
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
children: [
|
|
172
|
-
g && /* @__PURE__ */ i("button", {
|
|
173
|
-
type: "button",
|
|
174
|
-
onClick: C,
|
|
175
|
-
className: `${s} hover:bg-[var(--color-status-success-bgSubtle)] hover:text-status-success-text`,
|
|
176
|
-
title: "Test Pipeline",
|
|
177
|
-
"aria-label": `Test ${n.name}`,
|
|
178
|
-
children: /* @__PURE__ */ i(u, { className: "h-icon-sm w-icon-sm" })
|
|
179
|
-
}),
|
|
180
|
-
h && /* @__PURE__ */ i("button", {
|
|
181
|
-
type: "button",
|
|
182
|
-
onClick: S,
|
|
183
|
-
className: `${s} hover:bg-bg-sunken hover:text-text-primary`,
|
|
184
|
-
title: "Edit Pipeline",
|
|
185
|
-
"aria-label": `Edit ${n.name}`,
|
|
186
|
-
children: /* @__PURE__ */ i(l, { className: "h-icon-sm w-icon-sm" })
|
|
187
|
-
}),
|
|
188
|
-
_ && /* @__PURE__ */ i("button", {
|
|
189
|
-
type: "button",
|
|
190
|
-
onClick: w,
|
|
191
|
-
className: `${s} hover:bg-[var(--color-status-error-bgSubtle)] hover:text-status-error-text`,
|
|
192
|
-
title: "Delete Pipeline",
|
|
193
|
-
"aria-label": `Delete ${n.name}`,
|
|
194
|
-
children: /* @__PURE__ */ i(d, { className: "h-icon-sm w-icon-sm" })
|
|
195
|
-
})
|
|
196
|
-
]
|
|
197
|
-
})]
|
|
198
|
-
})]
|
|
219
|
+
})
|
|
220
|
+
]
|
|
199
221
|
});
|
|
200
222
|
});
|
|
201
223
|
//#endregion
|