@burdenoff/microfe-cosmicintersection 2026.827.1 → 2026.830.2

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.
Files changed (70) hide show
  1. package/dist/cosmicintersection/components/ActionMenu.d.ts +1 -1
  2. package/dist/cosmicintersection/components/ActionMenu.d.ts.map +1 -1
  3. package/dist/cosmicintersection/components/ActionMenu.js +51 -54
  4. package/dist/cosmicintersection/components/ActionMenu.js.map +1 -1
  5. package/dist/cosmicintersection/components/EntityFormShell.d.ts +1 -1
  6. package/dist/cosmicintersection/components/EntityFormShell.d.ts.map +1 -1
  7. package/dist/cosmicintersection/components/EntityFormShell.js +29 -27
  8. package/dist/cosmicintersection/components/EntityFormShell.js.map +1 -1
  9. package/dist/cosmicintersection/components/ErrorState.d.ts +1 -1
  10. package/dist/cosmicintersection/components/ErrorState.d.ts.map +1 -1
  11. package/dist/cosmicintersection/components/ErrorState.js +19 -17
  12. package/dist/cosmicintersection/components/ErrorState.js.map +1 -1
  13. package/dist/cosmicintersection/components/FileUploadField.d.ts.map +1 -1
  14. package/dist/cosmicintersection/components/FileUploadField.js +61 -60
  15. package/dist/cosmicintersection/components/FileUploadField.js.map +1 -1
  16. package/dist/cosmicintersection/components/LoadingState.d.ts +1 -1
  17. package/dist/cosmicintersection/components/LoadingState.d.ts.map +1 -1
  18. package/dist/cosmicintersection/components/LoadingState.js +15 -13
  19. package/dist/cosmicintersection/components/LoadingState.js.map +1 -1
  20. package/dist/cosmicintersection/components/PageLayout.d.ts.map +1 -1
  21. package/dist/cosmicintersection/components/PageLayout.js +28 -27
  22. package/dist/cosmicintersection/components/PageLayout.js.map +1 -1
  23. package/dist/cosmicintersection/components/Pagination.d.ts.map +1 -1
  24. package/dist/cosmicintersection/components/Pagination.js +38 -35
  25. package/dist/cosmicintersection/components/Pagination.js.map +1 -1
  26. package/dist/cosmicintersection/components/StatusBadge.d.ts.map +1 -1
  27. package/dist/cosmicintersection/components/StatusBadge.js +30 -9
  28. package/dist/cosmicintersection/components/StatusBadge.js.map +1 -1
  29. package/dist/cosmicintersection/pages/access/AccessPage.d.ts.map +1 -1
  30. package/dist/cosmicintersection/pages/access/AccessPage.js +147 -146
  31. package/dist/cosmicintersection/pages/access/AccessPage.js.map +1 -1
  32. package/dist/cosmicintersection/pages/analyses/AnalysesPage.d.ts.map +1 -1
  33. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js +260 -259
  34. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js.map +1 -1
  35. package/dist/cosmicintersection/pages/collections/CollectionsPage.d.ts.map +1 -1
  36. package/dist/cosmicintersection/pages/collections/CollectionsPage.js +63 -62
  37. package/dist/cosmicintersection/pages/collections/CollectionsPage.js.map +1 -1
  38. package/dist/cosmicintersection/pages/dashboard/DashboardPage.d.ts.map +1 -1
  39. package/dist/cosmicintersection/pages/dashboard/DashboardPage.js +132 -131
  40. package/dist/cosmicintersection/pages/dashboard/DashboardPage.js.map +1 -1
  41. package/dist/cosmicintersection/pages/datasets/DatasetsPage.d.ts.map +1 -1
  42. package/dist/cosmicintersection/pages/datasets/DatasetsPage.js +178 -177
  43. package/dist/cosmicintersection/pages/datasets/DatasetsPage.js.map +1 -1
  44. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.d.ts.map +1 -1
  45. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.js +138 -145
  46. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.js.map +1 -1
  47. package/dist/cosmicintersection/pages/lineage/LineagePage.d.ts.map +1 -1
  48. package/dist/cosmicintersection/pages/lineage/LineagePage.js +78 -88
  49. package/dist/cosmicintersection/pages/lineage/LineagePage.js.map +1 -1
  50. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.d.ts.map +1 -1
  51. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js +125 -124
  52. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js.map +1 -1
  53. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.d.ts.map +1 -1
  54. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js +152 -151
  55. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js.map +1 -1
  56. package/dist/cosmicintersection/pages/releases/ReleasesPage.d.ts.map +1 -1
  57. package/dist/cosmicintersection/pages/releases/ReleasesPage.js +175 -174
  58. package/dist/cosmicintersection/pages/releases/ReleasesPage.js.map +1 -1
  59. package/dist/cosmicintersection/pages/runs/RunsPage.d.ts.map +1 -1
  60. package/dist/cosmicintersection/pages/runs/RunsPage.js +197 -188
  61. package/dist/cosmicintersection/pages/runs/RunsPage.js.map +1 -1
  62. package/dist/cosmicintersection/pages/sources/SourcesPage.d.ts.map +1 -1
  63. package/dist/cosmicintersection/pages/sources/SourcesPage.js +65 -64
  64. package/dist/cosmicintersection/pages/sources/SourcesPage.js.map +1 -1
  65. package/dist/dev/main.d.ts.map +1 -1
  66. package/dist/shared/hooks/useTr.d.ts +12 -0
  67. package/dist/shared/hooks/useTr.d.ts.map +1 -0
  68. package/dist/shared/hooks/useTr.js +16 -0
  69. package/dist/shared/hooks/useTr.js.map +1 -0
  70. package/package.json +1 -1
@@ -1,174 +1,175 @@
1
1
  import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
2
2
  import { notify as t } from "../../lib/toast.js";
3
3
  import { useCosArchivePipelineMutation as n, useCosPipelinesQuery as r, useCosStartRunMutation as i } from "../../api/cosmicApi.js";
4
- import a from "../../components/ActionMenu.js";
5
- import o from "../../components/EmptyState.js";
6
- import s from "../../components/ErrorState.js";
7
- import c from "../../components/LoadingState.js";
8
- import l from "../../components/PageLayout.js";
9
- import u, { usePagination as d } from "../../components/Pagination.js";
10
- import f, { formatEnumLabel as p } from "../../components/StatusBadge.js";
4
+ import { useTr as a } from "../../../shared/hooks/useTr.js";
5
+ import o from "../../components/ActionMenu.js";
6
+ import s from "../../components/EmptyState.js";
7
+ import c from "../../components/ErrorState.js";
8
+ import l from "../../components/LoadingState.js";
9
+ import u from "../../components/PageLayout.js";
10
+ import d, { usePagination as f } from "../../components/Pagination.js";
11
+ import p, { formatEnumLabel as m } from "../../components/StatusBadge.js";
11
12
  import "../../components/index.js";
12
- import { mutationSucceeded as m } from "../../lib/mutationResult.js";
13
- import { useMemo as h, useState as g } from "react";
14
- import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
15
- import { GitBranch as b, Play as x, Plus as S } from "lucide-react";
16
- import { Button as C, Select as w, SelectContent as T, SelectItem as E, SelectTrigger as D, SelectValue as O, Table as k, TableBody as A, TableCell as j, TableHead as M, TableHeader as N, TableRow as P } from "@burdenoff/fe-libs/ui";
13
+ import { mutationSucceeded as h } from "../../lib/mutationResult.js";
14
+ import { useMemo as g, useState as _ } from "react";
15
+ import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
16
+ import { GitBranch as x, Play as S, Plus as C } from "lucide-react";
17
+ import { Button as w, Select as T, SelectContent as E, SelectItem as D, SelectTrigger as O, SelectValue as k, Table as A, TableBody as j, TableCell as M, TableHead as N, TableHeader as P, TableRow as F } from "@burdenoff/fe-libs/ui";
17
18
  //#region src/cosmicintersection/pages/pipelines/PipelinesPage.tsx
18
- var F = [
19
+ var I = [
19
20
  "DRAFT",
20
21
  "ACTIVE",
21
22
  "PAUSED",
22
23
  "ARCHIVED"
23
- ], I = "ALL";
24
- function L(e) {
24
+ ], L = "ALL";
25
+ function R(e) {
25
26
  if (!e) return "—";
26
27
  let t = new Date(e);
27
28
  return Number.isNaN(t.getTime()) ? "—" : t.toLocaleString();
28
29
  }
29
- function R() {
30
- let { navigate: R } = e(), [z, B] = g(I), V = d({ resetKey: z }), { data: H, loading: U, error: W, refetch: G } = r({
31
- status: z === I ? void 0 : z,
30
+ function z() {
31
+ let { navigate: z } = e(), B = a(), [V, H] = _(L), U = f({ resetKey: V }), { data: W, loading: G, error: K, refetch: q } = r({
32
+ status: V === L ? void 0 : V,
32
33
  pagination: {
33
- limit: V.limit,
34
- offset: V.offset
34
+ limit: U.limit,
35
+ offset: U.offset
35
36
  }
36
- }), [K] = i(), [q] = n(), J = h(() => H?.cosListPipelines.items ?? [], [H]), Y = H?.cosListPipelines.pageInfo, X = async (e) => {
37
- let n = await K({ variables: { input: { pipelineId: e.id } } }), r = n.data?.cosStartRun?.id;
38
- m(n, r, "Could not start a run") && (t.success("Run started", `A new run for “${e.name}” is queued.`), await G(), r && R(`runs/${r}`));
39
- }, Z = async (e) => {
40
- let n = await q({ variables: { id: e.id } });
41
- if (!m(n, n.data?.cosArchivePipeline, "Could not archive pipeline")) throw Error("Archive not confirmed");
42
- await G(), t.success("Pipeline archived", `“${e.name}” was archived.`);
37
+ }), [J] = i(), [Y] = n(), X = g(() => W?.cosListPipelines.items ?? [], [W]), Z = W?.cosListPipelines.pageInfo, Q = async (e) => {
38
+ let n = await J({ variables: { input: { pipelineId: e.id } } }), r = n.data?.cosStartRun?.id;
39
+ h(n, r, B("cosmicintersection.pages.pipelines.startRunError", "Could not start a run")) && (t.success(B("cosmicintersection.pages.pipelines.startRunSuccess", "Run started"), B("cosmicintersection.pages.pipelines.startRunSuccessDescription", "A new run for “{{name}}” is queued.", { name: e.name })), await q(), r && z(`runs/${r}`));
40
+ }, $ = async (e) => {
41
+ let n = await Y({ variables: { id: e.id } });
42
+ if (!h(n, n.data?.cosArchivePipeline, B("cosmicintersection.pages.pipelines.archiveError", "Could not archive pipeline"))) throw Error("Archive not confirmed");
43
+ await q(), t.success(B("cosmicintersection.pages.pipelines.archiveSuccess", "Pipeline archived"), B("cosmicintersection.pages.pipelines.archiveSuccessDescription", "“{{name}}” was archived.", { name: e.name }));
43
44
  };
44
- return /* @__PURE__ */ v(l, {
45
- title: "Pipelines",
46
- description: "Orchestrate ingest, calibration, transform and export steps across your data.",
47
- actions: /* @__PURE__ */ y(C, {
45
+ return /* @__PURE__ */ y(u, {
46
+ title: B("cosmicintersection.pages.pipelines.title", "Pipelines"),
47
+ description: B("cosmicintersection.pages.pipelines.description", "Orchestrate ingest, calibration, transform and export steps across your data."),
48
+ actions: /* @__PURE__ */ b(w, {
48
49
  type: "button",
49
- onClick: () => R("pipelines/create"),
50
- children: [/* @__PURE__ */ v(S, { className: "size-4" }), "New pipeline"]
50
+ onClick: () => z("pipelines/create"),
51
+ children: [/* @__PURE__ */ y(C, { className: "size-4" }), B("cosmicintersection.pages.pipelines.create", "New pipeline")]
51
52
  }),
52
- children: /* @__PURE__ */ y("div", {
53
+ children: /* @__PURE__ */ b("div", {
53
54
  className: "space-y-4",
54
- children: [/* @__PURE__ */ v("div", {
55
+ children: [/* @__PURE__ */ y("div", {
55
56
  className: "flex flex-wrap items-center gap-3",
56
- children: /* @__PURE__ */ y("label", {
57
+ children: /* @__PURE__ */ b("label", {
57
58
  className: "flex items-center gap-2 text-sm text-text-secondary",
58
- children: [/* @__PURE__ */ v("span", { children: "Status" }), /* @__PURE__ */ y(w, {
59
- value: z,
60
- onValueChange: (e) => B(e),
61
- children: [/* @__PURE__ */ v(D, {
62
- "aria-label": "Filter by status",
59
+ children: [/* @__PURE__ */ y("span", { children: B("cosmicintersection.common.status", "Status") }), /* @__PURE__ */ b(T, {
60
+ value: V,
61
+ onValueChange: (e) => H(e),
62
+ children: [/* @__PURE__ */ y(O, {
63
+ "aria-label": B("cosmicintersection.common.filterByStatus", "Filter by status"),
63
64
  className: "w-44",
64
- children: /* @__PURE__ */ v(O, {})
65
- }), /* @__PURE__ */ y(T, { children: [/* @__PURE__ */ v(E, {
66
- value: I,
67
- children: "All statuses"
68
- }), F.map((e) => /* @__PURE__ */ v(E, {
65
+ children: /* @__PURE__ */ y(k, {})
66
+ }), /* @__PURE__ */ b(E, { children: [/* @__PURE__ */ y(D, {
67
+ value: L,
68
+ children: B("cosmicintersection.common.allStatuses", "All statuses")
69
+ }), I.map((e) => /* @__PURE__ */ y(D, {
69
70
  value: e,
70
- children: p(e)
71
+ children: m(e)
71
72
  }, e))] })]
72
73
  })]
73
74
  })
74
- }), U ? /* @__PURE__ */ v(c, {
75
+ }), G ? /* @__PURE__ */ y(l, {
75
76
  variant: "rows",
76
77
  rows: 6,
77
- label: "Loading pipelines…"
78
- }) : W ? /* @__PURE__ */ v(s, {
79
- message: "We could not load your pipelines. Please try again.",
80
- onRetry: () => void G()
81
- }) : J.length === 0 ? /* @__PURE__ */ v(o, {
82
- icon: b,
83
- title: z === I ? "No pipelines yet" : "No pipelines match this filter",
84
- description: z === I ? "Pipelines orchestrate ingest, calibration, transform and export steps over your datasets." : "Try a different status filter to see more pipelines.",
85
- action: z === I ? /* @__PURE__ */ y(C, {
78
+ label: B("cosmicintersection.pages.pipelines.loading", "Loading pipelines…")
79
+ }) : K ? /* @__PURE__ */ y(c, {
80
+ message: B("cosmicintersection.pages.pipelines.error", "We could not load your pipelines. Please try again."),
81
+ onRetry: () => void q()
82
+ }) : X.length === 0 ? /* @__PURE__ */ y(s, {
83
+ icon: x,
84
+ title: V === L ? B("cosmicintersection.pages.pipelines.emptyTitle", "No pipelines yet") : B("cosmicintersection.pages.pipelines.emptyFilterTitle", "No pipelines match this filter"),
85
+ description: V === L ? B("cosmicintersection.pages.pipelines.emptyDescription", "Pipelines orchestrate ingest, calibration, transform and export steps over your datasets.") : B("cosmicintersection.pages.pipelines.emptyFilterDescription", "Try a different status filter to see more pipelines."),
86
+ action: V === L ? /* @__PURE__ */ b(w, {
86
87
  type: "button",
87
- onClick: () => R("pipelines/create"),
88
- children: [/* @__PURE__ */ v(S, { className: "size-4" }), "New pipeline"]
88
+ onClick: () => z("pipelines/create"),
89
+ children: [/* @__PURE__ */ y(C, { className: "size-4" }), B("cosmicintersection.pages.pipelines.create", "New pipeline")]
89
90
  }) : void 0
90
- }) : /* @__PURE__ */ y(_, { children: [
91
- /* @__PURE__ */ v("div", {
91
+ }) : /* @__PURE__ */ b(v, { children: [
92
+ /* @__PURE__ */ y("div", {
92
93
  className: "hidden rounded-card border border-border-default bg-bg-elevated md:block",
93
- children: /* @__PURE__ */ y(k, { children: [/* @__PURE__ */ v(N, { children: /* @__PURE__ */ y(P, { children: [
94
- /* @__PURE__ */ v(M, { children: "Name" }),
95
- /* @__PURE__ */ v(M, { children: "Status" }),
96
- /* @__PURE__ */ v(M, { children: "Trigger" }),
97
- /* @__PURE__ */ v(M, { children: "Schedule" }),
98
- /* @__PURE__ */ v(M, { children: "Last run" }),
99
- /* @__PURE__ */ v(M, {
94
+ children: /* @__PURE__ */ b(A, { children: [/* @__PURE__ */ y(P, { children: /* @__PURE__ */ b(F, { children: [
95
+ /* @__PURE__ */ y(N, { children: B("cosmicintersection.common.name", "Name") }),
96
+ /* @__PURE__ */ y(N, { children: B("cosmicintersection.common.status", "Status") }),
97
+ /* @__PURE__ */ y(N, { children: B("cosmicintersection.common.trigger", "Trigger") }),
98
+ /* @__PURE__ */ y(N, { children: B("cosmicintersection.common.schedule", "Schedule") }),
99
+ /* @__PURE__ */ y(N, { children: B("cosmicintersection.common.lastRun", "Last run") }),
100
+ /* @__PURE__ */ y(N, {
100
101
  className: "text-right",
101
- children: "Version"
102
+ children: B("cosmicintersection.common.version", "Version")
102
103
  }),
103
- /* @__PURE__ */ v(M, { children: "Tags" }),
104
- /* @__PURE__ */ v(M, {
104
+ /* @__PURE__ */ y(N, { children: B("cosmicintersection.common.tags", "Tags") }),
105
+ /* @__PURE__ */ y(N, {
105
106
  className: "w-12 text-right",
106
- children: /* @__PURE__ */ v("span", {
107
+ children: /* @__PURE__ */ y("span", {
107
108
  className: "sr-only",
108
- children: "Actions"
109
+ children: B("cosmicintersection.common.actions", "Actions")
109
110
  })
110
111
  })
111
- ] }) }), /* @__PURE__ */ v(A, { children: J.map((e) => /* @__PURE__ */ y(P, {
112
+ ] }) }), /* @__PURE__ */ y(j, { children: X.map((e) => /* @__PURE__ */ b(F, {
112
113
  className: "cursor-pointer",
113
- onClick: () => R(`pipelines/${e.id}`),
114
+ onClick: () => z(`pipelines/${e.id}`),
114
115
  children: [
115
- /* @__PURE__ */ v(j, {
116
+ /* @__PURE__ */ y(M, {
116
117
  className: "font-medium text-text-primary",
117
- children: /* @__PURE__ */ y("div", {
118
+ children: /* @__PURE__ */ b("div", {
118
119
  className: "flex flex-col",
119
- children: [/* @__PURE__ */ v("span", {
120
+ children: [/* @__PURE__ */ y("span", {
120
121
  className: "truncate",
121
122
  children: e.name
122
- }), e.description ? /* @__PURE__ */ v("span", {
123
+ }), e.description ? /* @__PURE__ */ y("span", {
123
124
  className: "mt-0.5 line-clamp-1 text-xs text-text-secondary",
124
125
  children: e.description
125
126
  }) : null]
126
127
  })
127
128
  }),
128
- /* @__PURE__ */ v(j, { children: /* @__PURE__ */ v(f, { status: e.status }) }),
129
- /* @__PURE__ */ v(j, {
129
+ /* @__PURE__ */ y(M, { children: /* @__PURE__ */ y(p, { status: e.status }) }),
130
+ /* @__PURE__ */ y(M, {
130
131
  className: "text-text-secondary",
131
- children: p(e.trigger)
132
+ children: m(e.trigger)
132
133
  }),
133
- /* @__PURE__ */ v(j, {
134
+ /* @__PURE__ */ y(M, {
134
135
  className: "font-mono text-xs text-text-secondary",
135
136
  children: e.schedule || "—"
136
137
  }),
137
- /* @__PURE__ */ v(j, {
138
+ /* @__PURE__ */ y(M, {
138
139
  className: "whitespace-nowrap text-text-secondary",
139
- children: L(e.lastRunAt)
140
+ children: R(e.lastRunAt)
140
141
  }),
141
- /* @__PURE__ */ y(j, {
142
+ /* @__PURE__ */ b(M, {
142
143
  className: "text-right tabular-nums text-text-secondary",
143
144
  children: ["v", e.version]
144
145
  }),
145
- /* @__PURE__ */ v(j, { children: /* @__PURE__ */ y("div", {
146
+ /* @__PURE__ */ y(M, { children: /* @__PURE__ */ b("div", {
146
147
  className: "flex max-w-[12rem] flex-wrap gap-1",
147
- children: [e.tags.length === 0 ? /* @__PURE__ */ v("span", {
148
+ children: [e.tags.length === 0 ? /* @__PURE__ */ y("span", {
148
149
  className: "text-xs text-text-secondary",
149
150
  children: "—"
150
- }) : e.tags.slice(0, 3).map((e) => /* @__PURE__ */ v("span", {
151
+ }) : e.tags.slice(0, 3).map((e) => /* @__PURE__ */ y("span", {
151
152
  className: "rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary",
152
153
  children: e
153
- }, e)), e.tags.length > 3 ? /* @__PURE__ */ y("span", {
154
+ }, e)), e.tags.length > 3 ? /* @__PURE__ */ b("span", {
154
155
  className: "text-xs text-text-secondary",
155
156
  children: ["+", e.tags.length - 3]
156
157
  }) : null]
157
158
  }) }),
158
- /* @__PURE__ */ v(j, {
159
+ /* @__PURE__ */ y(M, {
159
160
  className: "text-right",
160
- children: /* @__PURE__ */ v(a, {
161
- ariaLabel: `Actions for ${e.name}`,
161
+ children: /* @__PURE__ */ y(o, {
162
+ ariaLabel: B("cosmicintersection.common.actionsFor", "Actions for {{name}}", { name: e.name }),
162
163
  entityName: e.name,
163
- onView: () => R(`pipelines/${e.id}`),
164
- onEdit: () => R(`pipelines/${e.id}/edit`),
165
- onDelete: () => Z(e),
166
- deleteLabel: "Archive pipeline",
164
+ onView: () => z(`pipelines/${e.id}`),
165
+ onEdit: () => z(`pipelines/${e.id}/edit`),
166
+ onDelete: () => $(e),
167
+ deleteLabel: B("cosmicintersection.pages.pipelines.archive", "Archive pipeline"),
167
168
  extraItems: [{
168
169
  key: "start",
169
- label: "Start run",
170
- icon: x,
171
- onSelect: () => void X(e),
170
+ label: B("cosmicintersection.pages.pipelines.startRun", "Start run"),
171
+ icon: S,
172
+ onSelect: () => void Q(e),
172
173
  disabled: e.status === "ARCHIVED"
173
174
  }]
174
175
  })
@@ -176,122 +177,122 @@ function R() {
176
177
  ]
177
178
  }, e.id)) })] })
178
179
  }),
179
- /* @__PURE__ */ v("ul", {
180
+ /* @__PURE__ */ y("ul", {
180
181
  className: "space-y-3 md:hidden",
181
- children: J.map((e) => /* @__PURE__ */ y("li", {
182
+ children: X.map((e) => /* @__PURE__ */ b("li", {
182
183
  className: "relative",
183
- children: [/* @__PURE__ */ y("button", {
184
+ children: [/* @__PURE__ */ b("button", {
184
185
  type: "button",
185
- onClick: () => R(`pipelines/${e.id}`),
186
+ onClick: () => z(`pipelines/${e.id}`),
186
187
  className: "flex w-full flex-col gap-2 rounded-card border border-border-default bg-bg-elevated p-4 pr-12 text-left transition-colors hover:border-border-strong",
187
188
  children: [
188
- /* @__PURE__ */ y("div", {
189
+ /* @__PURE__ */ b("div", {
189
190
  className: "flex items-start justify-between gap-2",
190
- children: [/* @__PURE__ */ y("span", {
191
+ children: [/* @__PURE__ */ b("span", {
191
192
  className: "min-w-0 font-medium text-text-primary",
192
- children: [/* @__PURE__ */ v("span", {
193
+ children: [/* @__PURE__ */ y("span", {
193
194
  className: "block truncate",
194
195
  children: e.name
195
- }), e.description ? /* @__PURE__ */ v("span", {
196
+ }), e.description ? /* @__PURE__ */ y("span", {
196
197
  className: "mt-0.5 line-clamp-1 text-xs font-normal text-text-secondary",
197
198
  children: e.description
198
199
  }) : null]
199
- }), /* @__PURE__ */ v(f, {
200
+ }), /* @__PURE__ */ y(p, {
200
201
  status: e.status,
201
202
  className: "shrink-0"
202
203
  })]
203
204
  }),
204
- /* @__PURE__ */ y("dl", {
205
+ /* @__PURE__ */ b("dl", {
205
206
  className: "grid grid-cols-2 gap-x-3 gap-y-1 text-xs",
206
207
  children: [
207
- /* @__PURE__ */ y("div", {
208
+ /* @__PURE__ */ b("div", {
208
209
  className: "flex flex-col",
209
- children: [/* @__PURE__ */ v("dt", {
210
+ children: [/* @__PURE__ */ y("dt", {
210
211
  className: "text-text-secondary",
211
- children: "Trigger"
212
- }), /* @__PURE__ */ v("dd", {
212
+ children: B("cosmicintersection.common.trigger", "Trigger")
213
+ }), /* @__PURE__ */ y("dd", {
213
214
  className: "text-text-primary",
214
- children: p(e.trigger)
215
+ children: m(e.trigger)
215
216
  })]
216
217
  }),
217
- /* @__PURE__ */ y("div", {
218
+ /* @__PURE__ */ b("div", {
218
219
  className: "flex flex-col",
219
- children: [/* @__PURE__ */ v("dt", {
220
+ children: [/* @__PURE__ */ y("dt", {
220
221
  className: "text-text-secondary",
221
- children: "Version"
222
- }), /* @__PURE__ */ y("dd", {
222
+ children: B("cosmicintersection.common.version", "Version")
223
+ }), /* @__PURE__ */ b("dd", {
223
224
  className: "tabular-nums text-text-primary",
224
225
  children: ["v", e.version]
225
226
  })]
226
227
  }),
227
- /* @__PURE__ */ y("div", {
228
+ /* @__PURE__ */ b("div", {
228
229
  className: "flex flex-col",
229
- children: [/* @__PURE__ */ v("dt", {
230
+ children: [/* @__PURE__ */ y("dt", {
230
231
  className: "text-text-secondary",
231
- children: "Schedule"
232
- }), /* @__PURE__ */ v("dd", {
232
+ children: B("cosmicintersection.common.schedule", "Schedule")
233
+ }), /* @__PURE__ */ y("dd", {
233
234
  className: "font-mono text-text-primary",
234
235
  children: e.schedule || "—"
235
236
  })]
236
237
  }),
237
- /* @__PURE__ */ y("div", {
238
+ /* @__PURE__ */ b("div", {
238
239
  className: "flex flex-col",
239
- children: [/* @__PURE__ */ v("dt", {
240
+ children: [/* @__PURE__ */ y("dt", {
240
241
  className: "text-text-secondary",
241
- children: "Last run"
242
- }), /* @__PURE__ */ v("dd", {
242
+ children: B("cosmicintersection.common.lastRun", "Last run")
243
+ }), /* @__PURE__ */ y("dd", {
243
244
  className: "text-text-primary",
244
- children: L(e.lastRunAt)
245
+ children: R(e.lastRunAt)
245
246
  })]
246
247
  })
247
248
  ]
248
249
  }),
249
- e.tags.length > 0 ? /* @__PURE__ */ y("div", {
250
+ e.tags.length > 0 ? /* @__PURE__ */ b("div", {
250
251
  className: "flex flex-wrap gap-1",
251
- children: [e.tags.slice(0, 4).map((e) => /* @__PURE__ */ v("span", {
252
+ children: [e.tags.slice(0, 4).map((e) => /* @__PURE__ */ y("span", {
252
253
  className: "rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary",
253
254
  children: e
254
- }, e)), e.tags.length > 4 ? /* @__PURE__ */ y("span", {
255
+ }, e)), e.tags.length > 4 ? /* @__PURE__ */ b("span", {
255
256
  className: "text-xs text-text-secondary",
256
257
  children: ["+", e.tags.length - 4]
257
258
  }) : null]
258
259
  }) : null
259
260
  ]
260
- }), /* @__PURE__ */ v("div", {
261
+ }), /* @__PURE__ */ y("div", {
261
262
  className: "absolute right-2 top-2",
262
- children: /* @__PURE__ */ v(a, {
263
- ariaLabel: `Actions for ${e.name}`,
263
+ children: /* @__PURE__ */ y(o, {
264
+ ariaLabel: B("cosmicintersection.common.actionsFor", "Actions for {{name}}", { name: e.name }),
264
265
  entityName: e.name,
265
- onView: () => R(`pipelines/${e.id}`),
266
- onEdit: () => R(`pipelines/${e.id}/edit`),
267
- onDelete: () => Z(e),
268
- deleteLabel: "Archive pipeline",
266
+ onView: () => z(`pipelines/${e.id}`),
267
+ onEdit: () => z(`pipelines/${e.id}/edit`),
268
+ onDelete: () => $(e),
269
+ deleteLabel: B("cosmicintersection.pages.pipelines.archive", "Archive pipeline"),
269
270
  extraItems: [{
270
271
  key: "start",
271
- label: "Start run",
272
- icon: x,
273
- onSelect: () => void X(e),
272
+ label: B("cosmicintersection.pages.pipelines.startRun", "Start run"),
273
+ icon: S,
274
+ onSelect: () => void Q(e),
274
275
  disabled: e.status === "ARCHIVED"
275
276
  }]
276
277
  })
277
278
  })]
278
279
  }, e.id))
279
280
  }),
280
- /* @__PURE__ */ v(u, {
281
- offset: V.offset,
282
- limit: V.limit,
283
- loadedCount: J.length,
284
- hasMore: Y?.hasMore ?? !1,
285
- onPrev: V.prevPage,
286
- onNext: V.nextPage,
287
- itemLabel: "pipelines",
288
- loading: U
281
+ /* @__PURE__ */ y(d, {
282
+ offset: U.offset,
283
+ limit: U.limit,
284
+ loadedCount: X.length,
285
+ hasMore: Z?.hasMore ?? !1,
286
+ onPrev: U.prevPage,
287
+ onNext: U.nextPage,
288
+ itemLabel: B("cosmicintersection.pages.pipelines.itemLabel", "pipelines"),
289
+ loading: G
289
290
  })
290
291
  ] })]
291
292
  })
292
293
  });
293
294
  }
294
295
  //#endregion
295
- export { R as default };
296
+ export { z as default };
296
297
 
297
298
  //# sourceMappingURL=PipelinesPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PipelinesPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/pipelines/PipelinesPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { GitBranch, Play, Plus } from 'lucide-react';\nimport {\n Button,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\n\nimport {\n useCosArchivePipelineMutation,\n useCosPipelinesQuery,\n useCosStartRunMutation,\n type CosPipeline,\n type CosPipelineStatus,\n} from '../../api/cosmicApi';\nimport {\n ActionMenu,\n EmptyState,\n ErrorState,\n LoadingState,\n PageLayout,\n Pagination,\n StatusBadge,\n formatEnumLabel,\n usePagination,\n} from '../../components';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\nimport { mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\n\nconst STATUS_OPTIONS: CosPipelineStatus[] = ['DRAFT', 'ACTIVE', 'PAUSED', 'ARCHIVED'];\nconst ALL = 'ALL';\n\nfunction formatDate(value?: string | null): string {\n if (!value) {\n return '—';\n }\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? '—' : date.toLocaleString();\n}\n\nexport default function PipelinesPage() {\n const { navigate } = useCosmicIntersection();\n const [status, setStatus] = useState<CosPipelineStatus | typeof ALL>(ALL);\n const pagination = usePagination({ resetKey: status });\n\n const { data, loading, error, refetch } = useCosPipelinesQuery({\n status: status === ALL ? undefined : status,\n pagination: { limit: pagination.limit, offset: pagination.offset },\n });\n\n const [startRun] = useCosStartRunMutation();\n const [archivePipeline] = useCosArchivePipelineMutation();\n\n const pipelines = useMemo(() => data?.cosListPipelines.items ?? [], [data]);\n const pageInfo = data?.cosListPipelines.pageInfo;\n\n const handleStartRun = async (pipeline: CosPipeline) => {\n const response = await startRun({ variables: { input: { pipelineId: pipeline.id } } });\n const runId = response.data?.cosStartRun?.id;\n if (!mutationSucceeded(response, runId, 'Could not start a run')) {\n return;\n }\n notify.success('Run started', `A new run for “${pipeline.name}” is queued.`);\n await refetch();\n if (runId) {\n navigate(`runs/${runId}`);\n }\n };\n\n const handleArchive = async (pipeline: CosPipeline) => {\n const response = await archivePipeline({ variables: { id: pipeline.id } });\n if (\n !mutationSucceeded(response, response.data?.cosArchivePipeline, 'Could not archive pipeline')\n ) {\n throw new Error('Archive not confirmed');\n }\n await refetch();\n notify.success('Pipeline archived', `“${pipeline.name}” was archived.`);\n };\n\n const renderBody = () => {\n if (loading) {\n return <LoadingState variant=\"rows\" rows={6} label=\"Loading pipelines…\" />;\n }\n if (error) {\n return (\n <ErrorState\n message=\"We could not load your pipelines. Please try again.\"\n onRetry={() => void refetch()}\n />\n );\n }\n if (pipelines.length === 0) {\n return (\n <EmptyState\n icon={GitBranch}\n title={status === ALL ? 'No pipelines yet' : 'No pipelines match this filter'}\n description={\n status === ALL\n ? 'Pipelines orchestrate ingest, calibration, transform and export steps over your datasets.'\n : 'Try a different status filter to see more pipelines.'\n }\n action={\n status === ALL ? (\n <Button type=\"button\" onClick={() => navigate('pipelines/create')}>\n <Plus className=\"size-4\" />\n New pipeline\n </Button>\n ) : undefined\n }\n />\n );\n }\n\n return (\n <>\n {/* Desktop: table. */}\n <div className=\"hidden rounded-card border border-border-default bg-bg-elevated md:block\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Trigger</TableHead>\n <TableHead>Schedule</TableHead>\n <TableHead>Last run</TableHead>\n <TableHead className=\"text-right\">Version</TableHead>\n <TableHead>Tags</TableHead>\n <TableHead className=\"w-12 text-right\">\n <span className=\"sr-only\">Actions</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {pipelines.map((pipeline) => (\n <TableRow\n key={pipeline.id}\n className=\"cursor-pointer\"\n onClick={() => navigate(`pipelines/${pipeline.id}`)}\n >\n <TableCell className=\"font-medium text-text-primary\">\n <div className=\"flex flex-col\">\n <span className=\"truncate\">{pipeline.name}</span>\n {pipeline.description ? (\n <span className=\"mt-0.5 line-clamp-1 text-xs text-text-secondary\">\n {pipeline.description}\n </span>\n ) : null}\n </div>\n </TableCell>\n <TableCell>\n <StatusBadge status={pipeline.status} />\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatEnumLabel(pipeline.trigger)}\n </TableCell>\n <TableCell className=\"font-mono text-xs text-text-secondary\">\n {pipeline.schedule || '—'}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-text-secondary\">\n {formatDate(pipeline.lastRunAt)}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-secondary\">\n v{pipeline.version}\n </TableCell>\n <TableCell>\n <div className=\"flex max-w-[12rem] flex-wrap gap-1\">\n {pipeline.tags.length === 0 ? (\n <span className=\"text-xs text-text-secondary\">—</span>\n ) : (\n pipeline.tags.slice(0, 3).map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary\"\n >\n {tag}\n </span>\n ))\n )}\n {pipeline.tags.length > 3 ? (\n <span className=\"text-xs text-text-secondary\">\n +{pipeline.tags.length - 3}\n </span>\n ) : null}\n </div>\n </TableCell>\n <TableCell className=\"text-right\">\n <ActionMenu\n ariaLabel={`Actions for ${pipeline.name}`}\n entityName={pipeline.name}\n onView={() => navigate(`pipelines/${pipeline.id}`)}\n onEdit={() => navigate(`pipelines/${pipeline.id}/edit`)}\n onDelete={() => handleArchive(pipeline)}\n deleteLabel=\"Archive pipeline\"\n extraItems={[\n {\n key: 'start',\n label: 'Start run',\n icon: Play,\n onSelect: () => void handleStartRun(pipeline),\n disabled: pipeline.status === 'ARCHIVED',\n },\n ]}\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {/* Mobile: stacked cards. */}\n <ul className=\"space-y-3 md:hidden\">\n {pipelines.map((pipeline) => (\n <li key={pipeline.id} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => navigate(`pipelines/${pipeline.id}`)}\n className=\"flex w-full flex-col gap-2 rounded-card border border-border-default bg-bg-elevated p-4 pr-12 text-left transition-colors hover:border-border-strong\"\n >\n <div className=\"flex items-start justify-between gap-2\">\n <span className=\"min-w-0 font-medium text-text-primary\">\n <span className=\"block truncate\">{pipeline.name}</span>\n {pipeline.description ? (\n <span className=\"mt-0.5 line-clamp-1 text-xs font-normal text-text-secondary\">\n {pipeline.description}\n </span>\n ) : null}\n </span>\n <StatusBadge status={pipeline.status} className=\"shrink-0\" />\n </div>\n <dl className=\"grid grid-cols-2 gap-x-3 gap-y-1 text-xs\">\n <div className=\"flex flex-col\">\n <dt className=\"text-text-secondary\">Trigger</dt>\n <dd className=\"text-text-primary\">{formatEnumLabel(pipeline.trigger)}</dd>\n </div>\n <div className=\"flex flex-col\">\n <dt className=\"text-text-secondary\">Version</dt>\n <dd className=\"tabular-nums text-text-primary\">v{pipeline.version}</dd>\n </div>\n <div className=\"flex flex-col\">\n <dt className=\"text-text-secondary\">Schedule</dt>\n <dd className=\"font-mono text-text-primary\">{pipeline.schedule || '—'}</dd>\n </div>\n <div className=\"flex flex-col\">\n <dt className=\"text-text-secondary\">Last run</dt>\n <dd className=\"text-text-primary\">{formatDate(pipeline.lastRunAt)}</dd>\n </div>\n </dl>\n {pipeline.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {pipeline.tags.slice(0, 4).map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary\"\n >\n {tag}\n </span>\n ))}\n {pipeline.tags.length > 4 ? (\n <span className=\"text-xs text-text-secondary\">\n +{pipeline.tags.length - 4}\n </span>\n ) : null}\n </div>\n ) : null}\n </button>\n <div className=\"absolute right-2 top-2\">\n <ActionMenu\n ariaLabel={`Actions for ${pipeline.name}`}\n entityName={pipeline.name}\n onView={() => navigate(`pipelines/${pipeline.id}`)}\n onEdit={() => navigate(`pipelines/${pipeline.id}/edit`)}\n onDelete={() => handleArchive(pipeline)}\n deleteLabel=\"Archive pipeline\"\n extraItems={[\n {\n key: 'start',\n label: 'Start run',\n icon: Play,\n onSelect: () => void handleStartRun(pipeline),\n disabled: pipeline.status === 'ARCHIVED',\n },\n ]}\n />\n </div>\n </li>\n ))}\n </ul>\n\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={pipelines.length}\n hasMore={pageInfo?.hasMore ?? false}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"pipelines\"\n loading={loading}\n />\n </>\n );\n };\n\n return (\n <PageLayout\n title=\"Pipelines\"\n description=\"Orchestrate ingest, calibration, transform and export steps across your data.\"\n actions={\n <Button type=\"button\" onClick={() => navigate('pipelines/create')}>\n <Plus className=\"size-4\" />\n New pipeline\n </Button>\n }\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <label className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <span>Status</span>\n <Select\n value={status}\n onValueChange={(value) => setStatus(value as CosPipelineStatus | typeof ALL)}\n >\n <SelectTrigger aria-label=\"Filter by status\" className=\"w-44\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>All statuses</SelectItem>\n {STATUS_OPTIONS.map((option) => (\n <SelectItem key={option} value={option}>\n {formatEnumLabel(option)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n </div>\n\n {renderBody()}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAuCA,IAAM,IAAsC;CAAC;CAAS;CAAU;CAAU;AAAU,GAC9E,IAAM;AAEZ,SAAS,EAAW,GAA+B;CACjD,IAAI,CAAC,GACH,OAAO;CAET,IAAM,IAAO,IAAI,KAAK,CAAK;CAC3B,OAAO,OAAO,MAAM,EAAK,QAAQ,CAAC,IAAI,MAAM,EAAK,eAAe;AAClE;AAEA,SAAwB,IAAgB;CACtC,IAAM,EAAE,gBAAa,EAAsB,GACrC,CAAC,GAAQ,KAAa,EAAyC,CAAG,GAClE,IAAa,EAAc,EAAE,UAAU,EAAO,CAAC,GAE/C,EAAE,SAAM,YAAS,UAAO,eAAY,EAAqB;EAC7D,QAAQ,MAAW,IAAM,KAAA,IAAY;EACrC,YAAY;GAAE,OAAO,EAAW;GAAO,QAAQ,EAAW;EAAO;CACnE,CAAC,GAEK,CAAC,KAAY,EAAuB,GACpC,CAAC,KAAmB,EAA8B,GAElD,IAAY,QAAc,GAAM,iBAAiB,SAAS,CAAC,GAAG,CAAC,CAAI,CAAC,GACpE,IAAW,GAAM,iBAAiB,UAElC,IAAiB,OAAO,MAA0B;EACtD,IAAM,IAAW,MAAM,EAAS,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAS,GAAG,EAAE,EAAE,CAAC,GAC/E,IAAQ,EAAS,MAAM,aAAa;EACrC,EAAkB,GAAU,GAAO,uBAAuB,MAG/D,EAAO,QAAQ,eAAe,kBAAkB,EAAS,KAAK,aAAa,GAC3E,MAAM,EAAQ,GACV,KACF,EAAS,QAAQ,GAAO;CAE5B,GAEM,IAAgB,OAAO,MAA0B;EACrD,IAAM,IAAW,MAAM,EAAgB,EAAE,WAAW,EAAE,IAAI,EAAS,GAAG,EAAE,CAAC;EACzE,IACE,CAAC,EAAkB,GAAU,EAAS,MAAM,oBAAoB,4BAA4B,GAE5F,MAAU,MAAM,uBAAuB;EAGzC,AADA,MAAM,EAAQ,GACd,EAAO,QAAQ,qBAAqB,IAAI,EAAS,KAAK,gBAAgB;CACxE;CAkOA,OACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,GAAD;GAAQ,MAAK;GAAS,eAAe,EAAS,kBAAkB;aAAhE,CACE,kBAAC,GAAD,EAAM,WAAU,SAAU,CAAA,GAAC,cAErB;;YAGV,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,SAAD;KAAO,WAAU;eAAjB,CACE,kBAAC,QAAD,EAAA,UAAM,SAAY,CAAA,GAClB,kBAAC,GAAD;MACE,OAAO;MACP,gBAAgB,MAAU,EAAU,CAAuC;gBAF7E,CAIE,kBAAC,GAAD;OAAe,cAAW;OAAmB,WAAU;iBACrD,kBAAC,GAAD,CAAc,CAAA;MACD,CAAA,GACf,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;OAAY,OAAO;iBAAK;MAAwB,CAAA,GAC/C,EAAe,KAAK,MACnB,kBAAC,GAAD;OAAyB,OAAO;iBAC7B,EAAgB,CAAM;MACb,GAFK,CAEL,CACb,CACY,EAAA,CAAA,CACT;OACH;;GACJ,CAAA,GA/PL,IACK,kBAAC,GAAD;IAAc,SAAQ;IAAO,MAAM;IAAG,OAAM;GAAsB,CAAA,IAEvE,IAEA,kBAAC,GAAD;IACE,SAAQ;IACR,eAAe,KAAK,EAAQ;GAC7B,CAAA,IAGD,EAAU,WAAW,IAErB,kBAAC,GAAD;IACE,MAAM;IACN,OAAO,MAAW,IAAM,qBAAqB;IAC7C,aACE,MAAW,IACP,8FACA;IAEN,QACE,MAAW,IACT,kBAAC,GAAD;KAAQ,MAAK;KAAS,eAAe,EAAS,kBAAkB;eAAhE,CACE,kBAAC,GAAD,EAAM,WAAU,SAAU,CAAA,GAAC,cAErB;SACN,KAAA;GAEP,CAAA,IAKH,kBAAA,GAAA,EAAA,UAAA;IAEE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA;MACE,kBAAC,GAAD,EAAA,UAAW,OAAe,CAAA;MAC1B,kBAAC,GAAD,EAAA,UAAW,SAAiB,CAAA;MAC5B,kBAAC,GAAD,EAAA,UAAW,UAAkB,CAAA;MAC7B,kBAAC,GAAD,EAAA,UAAW,WAAmB,CAAA;MAC9B,kBAAC,GAAD,EAAA,UAAW,WAAmB,CAAA;MAC9B,kBAAC,GAAD;OAAW,WAAU;iBAAa;MAAkB,CAAA;MACpD,kBAAC,GAAD,EAAA,UAAW,OAAe,CAAA;MAC1B,kBAAC,GAAD;OAAW,WAAU;iBACnB,kBAAC,QAAD;QAAM,WAAU;kBAAU;OAAa,CAAA;MAC9B,CAAA;KACH,EAAA,CAAA,EACC,CAAA,GACb,kBAAC,GAAD,EAAA,UACG,EAAU,KAAK,MACd,kBAAC,GAAD;MAEE,WAAU;MACV,eAAe,EAAS,aAAa,EAAS,IAAI;gBAHpD;OAKE,kBAAC,GAAD;QAAW,WAAU;kBACnB,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,QAAD;UAAM,WAAU;oBAAY,EAAS;SAAW,CAAA,GAC/C,EAAS,cACR,kBAAC,QAAD;UAAM,WAAU;oBACb,EAAS;SACN,CAAA,IACJ,IACD;;OACI,CAAA;OACX,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAa,QAAQ,EAAS,OAAS,CAAA,EAC9B,CAAA;OACX,kBAAC,GAAD;QAAW,WAAU;kBAClB,EAAgB,EAAS,OAAO;OACxB,CAAA;OACX,kBAAC,GAAD;QAAW,WAAU;kBAClB,EAAS,YAAY;OACb,CAAA;OACX,kBAAC,GAAD;QAAW,WAAU;kBAClB,EAAW,EAAS,SAAS;OACrB,CAAA;OACX,kBAAC,GAAD;QAAW,WAAU;kBAArB,CAAmE,KAC/D,EAAS,OACF;;OACX,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACG,EAAS,KAAK,WAAW,IACxB,kBAAC,QAAD;SAAM,WAAU;mBAA8B;QAAO,CAAA,IAErD,EAAS,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,MAC7B,kBAAC,QAAD;SAEE,WAAU;mBAET;QACG,GAJC,CAID,CACP,GAEF,EAAS,KAAK,SAAS,IACtB,kBAAC,QAAD;SAAM,WAAU;mBAAhB,CAA8C,KAC1C,EAAS,KAAK,SAAS,CACrB;aACJ,IACD;UACI,CAAA;OACX,kBAAC,GAAD;QAAW,WAAU;kBACnB,kBAAC,GAAD;SACE,WAAW,eAAe,EAAS;SACnC,YAAY,EAAS;SACrB,cAAc,EAAS,aAAa,EAAS,IAAI;SACjD,cAAc,EAAS,aAAa,EAAS,GAAG,MAAM;SACtD,gBAAgB,EAAc,CAAQ;SACtC,aAAY;SACZ,YAAY,CACV;UACE,KAAK;UACL,OAAO;UACP,MAAM;UACN,gBAAgB,KAAK,EAAe,CAAQ;UAC5C,UAAU,EAAS,WAAW;SAChC,CACF;QACD,CAAA;OACQ,CAAA;MACH;QArEH,EAAS,EAqEN,CACX,EACQ,CAAA,CACN,EAAA,CAAA;IACJ,CAAA;IAGL,kBAAC,MAAD;KAAI,WAAU;eACX,EAAU,KAAK,MACd,kBAAC,MAAD;MAAsB,WAAU;gBAAhC,CACE,kBAAC,UAAD;OACE,MAAK;OACL,eAAe,EAAS,aAAa,EAAS,IAAI;OAClD,WAAU;iBAHZ;QAKE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,QAAD;UAAM,WAAU;oBAAhB,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAkB,EAAS;UAAW,CAAA,GACrD,EAAS,cACR,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAS;UACN,CAAA,IACJ,IACA;aACN,kBAAC,GAAD;UAAa,QAAQ,EAAS;UAAQ,WAAU;SAAY,CAAA,CACzD;;QACL,kBAAC,MAAD;SAAI,WAAU;mBAAd;UACE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,MAAD;YAAI,WAAU;sBAAsB;WAAW,CAAA,GAC/C,kBAAC,MAAD;YAAI,WAAU;sBAAqB,EAAgB,EAAS,OAAO;WAAM,CAAA,CACtE;;UACL,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,MAAD;YAAI,WAAU;sBAAsB;WAAW,CAAA,GAC/C,kBAAC,MAAD;YAAI,WAAU;sBAAd,CAA+C,KAAE,EAAS,OAAY;aACnE;;UACL,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,MAAD;YAAI,WAAU;sBAAsB;WAAY,CAAA,GAChD,kBAAC,MAAD;YAAI,WAAU;sBAA+B,EAAS,YAAY;WAAQ,CAAA,CACvE;;UACL,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,MAAD;YAAI,WAAU;sBAAsB;WAAY,CAAA,GAChD,kBAAC,MAAD;YAAI,WAAU;sBAAqB,EAAW,EAAS,SAAS;WAAM,CAAA,CACnE;;SACH;;QACH,EAAS,KAAK,SAAS,IACtB,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACG,EAAS,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,MAC9B,kBAAC,QAAD;UAEE,WAAU;oBAET;SACG,GAJC,CAID,CACP,GACA,EAAS,KAAK,SAAS,IACtB,kBAAC,QAAD;UAAM,WAAU;oBAAhB,CAA8C,KAC1C,EAAS,KAAK,SAAS,CACrB;cACJ,IACD;aACH;OACE;UACR,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD;QACE,WAAW,eAAe,EAAS;QACnC,YAAY,EAAS;QACrB,cAAc,EAAS,aAAa,EAAS,IAAI;QACjD,cAAc,EAAS,aAAa,EAAS,GAAG,MAAM;QACtD,gBAAgB,EAAc,CAAQ;QACtC,aAAY;QACZ,YAAY,CACV;SACE,KAAK;SACL,OAAO;SACP,MAAM;SACN,gBAAgB,KAAK,EAAe,CAAQ;SAC5C,UAAU,EAAS,WAAW;QAChC,CACF;OACD,CAAA;MACE,CAAA,CACH;QAxEK,EAAS,EAwEd,CACL;IACC,CAAA;IAEJ,kBAAC,GAAD;KACE,QAAQ,EAAW;KACnB,OAAO,EAAW;KAClB,aAAa,EAAU;KACvB,SAAS,GAAU,WAAW;KAC9B,QAAQ,EAAW;KACnB,QAAQ,EAAW;KACnB,WAAU;KACD;IACV,CAAA;GACD,EAAA,CAAA,CAuCG;;CACK,CAAA;AAEhB"}
1
+ {"version":3,"file":"PipelinesPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/pipelines/PipelinesPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { GitBranch, Play, Plus } from 'lucide-react';\nimport {\n Button,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\n\nimport {\n useCosArchivePipelineMutation,\n useCosPipelinesQuery,\n useCosStartRunMutation,\n type CosPipeline,\n type CosPipelineStatus,\n} from '../../api/cosmicApi';\nimport {\n ActionMenu,\n EmptyState,\n ErrorState,\n LoadingState,\n PageLayout,\n Pagination,\n StatusBadge,\n formatEnumLabel,\n usePagination,\n} from '../../components';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\nimport { mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\nimport { useTr } from '../../../shared/hooks/useTr';\n\nconst STATUS_OPTIONS: CosPipelineStatus[] = ['DRAFT', 'ACTIVE', 'PAUSED', 'ARCHIVED'];\nconst ALL = 'ALL';\n\nfunction formatDate(value?: string | null): string {\n if (!value) {\n return '—';\n }\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? '—' : date.toLocaleString();\n}\n\nexport default function PipelinesPage() {\n const { navigate } = useCosmicIntersection();\n const tr = useTr();\n const [status, setStatus] = useState<CosPipelineStatus | typeof ALL>(ALL);\n const pagination = usePagination({ resetKey: status });\n\n const { data, loading, error, refetch } = useCosPipelinesQuery({\n status: status === ALL ? undefined : status,\n pagination: { limit: pagination.limit, offset: pagination.offset },\n });\n\n const [startRun] = useCosStartRunMutation();\n const [archivePipeline] = useCosArchivePipelineMutation();\n\n const pipelines = useMemo(() => data?.cosListPipelines.items ?? [], [data]);\n const pageInfo = data?.cosListPipelines.pageInfo;\n\n const handleStartRun = async (pipeline: CosPipeline) => {\n const response = await startRun({ variables: { input: { pipelineId: pipeline.id } } });\n const runId = response.data?.cosStartRun?.id;\n if (\n !mutationSucceeded(\n response,\n runId,\n tr('cosmicintersection.pages.pipelines.startRunError', 'Could not start a run')\n )\n ) {\n return;\n }\n notify.success(\n tr('cosmicintersection.pages.pipelines.startRunSuccess', 'Run started'),\n tr(\n 'cosmicintersection.pages.pipelines.startRunSuccessDescription',\n 'A new run for “{{name}}” is queued.',\n { name: pipeline.name }\n )\n );\n await refetch();\n if (runId) {\n navigate(`runs/${runId}`);\n }\n };\n\n const handleArchive = async (pipeline: CosPipeline) => {\n const response = await archivePipeline({ variables: { id: pipeline.id } });\n if (\n !mutationSucceeded(\n response,\n response.data?.cosArchivePipeline,\n tr('cosmicintersection.pages.pipelines.archiveError', 'Could not archive pipeline')\n )\n ) {\n throw new Error('Archive not confirmed');\n }\n await refetch();\n notify.success(\n tr('cosmicintersection.pages.pipelines.archiveSuccess', 'Pipeline archived'),\n tr(\n 'cosmicintersection.pages.pipelines.archiveSuccessDescription',\n '“{{name}}” was archived.',\n { name: pipeline.name }\n )\n );\n };\n\n const renderBody = () => {\n if (loading) {\n return (\n <LoadingState\n variant=\"rows\"\n rows={6}\n label={tr('cosmicintersection.pages.pipelines.loading', 'Loading pipelines…')}\n />\n );\n }\n if (error) {\n return (\n <ErrorState\n message={tr(\n 'cosmicintersection.pages.pipelines.error',\n 'We could not load your pipelines. Please try again.'\n )}\n onRetry={() => void refetch()}\n />\n );\n }\n if (pipelines.length === 0) {\n return (\n <EmptyState\n icon={GitBranch}\n title={\n status === ALL\n ? tr('cosmicintersection.pages.pipelines.emptyTitle', 'No pipelines yet')\n : tr(\n 'cosmicintersection.pages.pipelines.emptyFilterTitle',\n 'No pipelines match this filter'\n )\n }\n description={\n status === ALL\n ? tr(\n 'cosmicintersection.pages.pipelines.emptyDescription',\n 'Pipelines orchestrate ingest, calibration, transform and export steps over your datasets.'\n )\n : tr(\n 'cosmicintersection.pages.pipelines.emptyFilterDescription',\n 'Try a different status filter to see more pipelines.'\n )\n }\n action={\n status === ALL ? (\n <Button type=\"button\" onClick={() => navigate('pipelines/create')}>\n <Plus className=\"size-4\" />\n {tr('cosmicintersection.pages.pipelines.create', 'New pipeline')}\n </Button>\n ) : undefined\n }\n />\n );\n }\n\n return (\n <>\n {/* Desktop: table. */}\n <div className=\"hidden rounded-card border border-border-default bg-bg-elevated md:block\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{tr('cosmicintersection.common.name', 'Name')}</TableHead>\n <TableHead>{tr('cosmicintersection.common.status', 'Status')}</TableHead>\n <TableHead>{tr('cosmicintersection.common.trigger', 'Trigger')}</TableHead>\n <TableHead>{tr('cosmicintersection.common.schedule', 'Schedule')}</TableHead>\n <TableHead>{tr('cosmicintersection.common.lastRun', 'Last run')}</TableHead>\n <TableHead className=\"text-right\">\n {tr('cosmicintersection.common.version', 'Version')}\n </TableHead>\n <TableHead>{tr('cosmicintersection.common.tags', 'Tags')}</TableHead>\n <TableHead className=\"w-12 text-right\">\n <span className=\"sr-only\">\n {tr('cosmicintersection.common.actions', 'Actions')}\n </span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {pipelines.map((pipeline) => (\n <TableRow\n key={pipeline.id}\n className=\"cursor-pointer\"\n onClick={() => navigate(`pipelines/${pipeline.id}`)}\n >\n <TableCell className=\"font-medium text-text-primary\">\n <div className=\"flex flex-col\">\n <span className=\"truncate\">{pipeline.name}</span>\n {pipeline.description ? (\n <span className=\"mt-0.5 line-clamp-1 text-xs text-text-secondary\">\n {pipeline.description}\n </span>\n ) : null}\n </div>\n </TableCell>\n <TableCell>\n <StatusBadge status={pipeline.status} />\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatEnumLabel(pipeline.trigger)}\n </TableCell>\n <TableCell className=\"font-mono text-xs text-text-secondary\">\n {pipeline.schedule || '—'}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-text-secondary\">\n {formatDate(pipeline.lastRunAt)}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-secondary\">\n v{pipeline.version}\n </TableCell>\n <TableCell>\n <div className=\"flex max-w-[12rem] flex-wrap gap-1\">\n {pipeline.tags.length === 0 ? (\n <span className=\"text-xs text-text-secondary\">—</span>\n ) : (\n pipeline.tags.slice(0, 3).map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary\"\n >\n {tag}\n </span>\n ))\n )}\n {pipeline.tags.length > 3 ? (\n <span className=\"text-xs text-text-secondary\">\n +{pipeline.tags.length - 3}\n </span>\n ) : null}\n </div>\n </TableCell>\n <TableCell className=\"text-right\">\n <ActionMenu\n ariaLabel={tr(\n 'cosmicintersection.common.actionsFor',\n 'Actions for {{name}}',\n { name: pipeline.name }\n )}\n entityName={pipeline.name}\n onView={() => navigate(`pipelines/${pipeline.id}`)}\n onEdit={() => navigate(`pipelines/${pipeline.id}/edit`)}\n onDelete={() => handleArchive(pipeline)}\n deleteLabel={tr(\n 'cosmicintersection.pages.pipelines.archive',\n 'Archive pipeline'\n )}\n extraItems={[\n {\n key: 'start',\n label: tr('cosmicintersection.pages.pipelines.startRun', 'Start run'),\n icon: Play,\n onSelect: () => void handleStartRun(pipeline),\n disabled: pipeline.status === 'ARCHIVED',\n },\n ]}\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {/* Mobile: stacked cards. */}\n <ul className=\"space-y-3 md:hidden\">\n {pipelines.map((pipeline) => (\n <li key={pipeline.id} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => navigate(`pipelines/${pipeline.id}`)}\n className=\"flex w-full flex-col gap-2 rounded-card border border-border-default bg-bg-elevated p-4 pr-12 text-left transition-colors hover:border-border-strong\"\n >\n <div className=\"flex items-start justify-between gap-2\">\n <span className=\"min-w-0 font-medium text-text-primary\">\n <span className=\"block truncate\">{pipeline.name}</span>\n {pipeline.description ? (\n <span className=\"mt-0.5 line-clamp-1 text-xs font-normal text-text-secondary\">\n {pipeline.description}\n </span>\n ) : null}\n </span>\n <StatusBadge status={pipeline.status} className=\"shrink-0\" />\n </div>\n <dl className=\"grid grid-cols-2 gap-x-3 gap-y-1 text-xs\">\n <div className=\"flex flex-col\">\n <dt className=\"text-text-secondary\">\n {tr('cosmicintersection.common.trigger', 'Trigger')}\n </dt>\n <dd className=\"text-text-primary\">{formatEnumLabel(pipeline.trigger)}</dd>\n </div>\n <div className=\"flex flex-col\">\n <dt className=\"text-text-secondary\">\n {tr('cosmicintersection.common.version', 'Version')}\n </dt>\n <dd className=\"tabular-nums text-text-primary\">v{pipeline.version}</dd>\n </div>\n <div className=\"flex flex-col\">\n <dt className=\"text-text-secondary\">\n {tr('cosmicintersection.common.schedule', 'Schedule')}\n </dt>\n <dd className=\"font-mono text-text-primary\">{pipeline.schedule || '—'}</dd>\n </div>\n <div className=\"flex flex-col\">\n <dt className=\"text-text-secondary\">\n {tr('cosmicintersection.common.lastRun', 'Last run')}\n </dt>\n <dd className=\"text-text-primary\">{formatDate(pipeline.lastRunAt)}</dd>\n </div>\n </dl>\n {pipeline.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {pipeline.tags.slice(0, 4).map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary\"\n >\n {tag}\n </span>\n ))}\n {pipeline.tags.length > 4 ? (\n <span className=\"text-xs text-text-secondary\">\n +{pipeline.tags.length - 4}\n </span>\n ) : null}\n </div>\n ) : null}\n </button>\n <div className=\"absolute right-2 top-2\">\n <ActionMenu\n ariaLabel={tr('cosmicintersection.common.actionsFor', 'Actions for {{name}}', {\n name: pipeline.name,\n })}\n entityName={pipeline.name}\n onView={() => navigate(`pipelines/${pipeline.id}`)}\n onEdit={() => navigate(`pipelines/${pipeline.id}/edit`)}\n onDelete={() => handleArchive(pipeline)}\n deleteLabel={tr('cosmicintersection.pages.pipelines.archive', 'Archive pipeline')}\n extraItems={[\n {\n key: 'start',\n label: tr('cosmicintersection.pages.pipelines.startRun', 'Start run'),\n icon: Play,\n onSelect: () => void handleStartRun(pipeline),\n disabled: pipeline.status === 'ARCHIVED',\n },\n ]}\n />\n </div>\n </li>\n ))}\n </ul>\n\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={pipelines.length}\n hasMore={pageInfo?.hasMore ?? false}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel={tr('cosmicintersection.pages.pipelines.itemLabel', 'pipelines')}\n loading={loading}\n />\n </>\n );\n };\n\n return (\n <PageLayout\n title={tr('cosmicintersection.pages.pipelines.title', 'Pipelines')}\n description={tr(\n 'cosmicintersection.pages.pipelines.description',\n 'Orchestrate ingest, calibration, transform and export steps across your data.'\n )}\n actions={\n <Button type=\"button\" onClick={() => navigate('pipelines/create')}>\n <Plus className=\"size-4\" />\n {tr('cosmicintersection.pages.pipelines.create', 'New pipeline')}\n </Button>\n }\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <label className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <span>{tr('cosmicintersection.common.status', 'Status')}</span>\n <Select\n value={status}\n onValueChange={(value) => setStatus(value as CosPipelineStatus | typeof ALL)}\n >\n <SelectTrigger\n aria-label={tr('cosmicintersection.common.filterByStatus', 'Filter by status')}\n className=\"w-44\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>\n {tr('cosmicintersection.common.allStatuses', 'All statuses')}\n </SelectItem>\n {STATUS_OPTIONS.map((option) => (\n <SelectItem key={option} value={option}>\n {formatEnumLabel(option)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n </div>\n\n {renderBody()}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ReleasesPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/releases/ReleasesPage.tsx"],"names":[],"mappings":"AA6EA,MAAM,CAAC,OAAO,UAAU,YAAY,4CAohBnC"}
1
+ {"version":3,"file":"ReleasesPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/releases/ReleasesPage.tsx"],"names":[],"mappings":"AA8EA,MAAM,CAAC,OAAO,UAAU,YAAY,4CA+jBnC"}