@burdenoff/microfe-cosmicintersection 2026.805.1 → 2026.830.1
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/cosmicintersection/api/cosmicApi.d.ts +84 -2
- package/dist/cosmicintersection/api/cosmicApi.d.ts.map +1 -1
- package/dist/cosmicintersection/api/cosmicApi.js +135 -79
- package/dist/cosmicintersection/api/cosmicApi.js.map +1 -1
- package/dist/cosmicintersection/components/ActionMenu.d.ts +1 -1
- package/dist/cosmicintersection/components/ActionMenu.d.ts.map +1 -1
- package/dist/cosmicintersection/components/ActionMenu.js +51 -54
- package/dist/cosmicintersection/components/ActionMenu.js.map +1 -1
- package/dist/cosmicintersection/components/EntityFormShell.d.ts +1 -1
- package/dist/cosmicintersection/components/EntityFormShell.d.ts.map +1 -1
- package/dist/cosmicintersection/components/EntityFormShell.js +29 -27
- package/dist/cosmicintersection/components/EntityFormShell.js.map +1 -1
- package/dist/cosmicintersection/components/ErrorState.d.ts +1 -1
- package/dist/cosmicintersection/components/ErrorState.d.ts.map +1 -1
- package/dist/cosmicintersection/components/ErrorState.js +19 -17
- package/dist/cosmicintersection/components/ErrorState.js.map +1 -1
- package/dist/cosmicintersection/components/FileUploadField.d.ts.map +1 -1
- package/dist/cosmicintersection/components/FileUploadField.js +61 -60
- package/dist/cosmicintersection/components/FileUploadField.js.map +1 -1
- package/dist/cosmicintersection/components/LineageGraph.d.ts +6 -1
- package/dist/cosmicintersection/components/LineageGraph.d.ts.map +1 -1
- package/dist/cosmicintersection/components/LineageGraph.js.map +1 -1
- package/dist/cosmicintersection/components/LoadingState.d.ts +1 -1
- package/dist/cosmicintersection/components/LoadingState.d.ts.map +1 -1
- package/dist/cosmicintersection/components/LoadingState.js +15 -13
- package/dist/cosmicintersection/components/LoadingState.js.map +1 -1
- package/dist/cosmicintersection/components/PageLayout.d.ts.map +1 -1
- package/dist/cosmicintersection/components/PageLayout.js +28 -27
- package/dist/cosmicintersection/components/PageLayout.js.map +1 -1
- package/dist/cosmicintersection/components/Pagination.d.ts.map +1 -1
- package/dist/cosmicintersection/components/Pagination.js +38 -35
- package/dist/cosmicintersection/components/Pagination.js.map +1 -1
- package/dist/cosmicintersection/components/StatusBadge.d.ts.map +1 -1
- package/dist/cosmicintersection/components/StatusBadge.js +30 -9
- package/dist/cosmicintersection/components/StatusBadge.js.map +1 -1
- package/dist/cosmicintersection/components/StepDAG.d.ts.map +1 -1
- package/dist/cosmicintersection/components/StepDAG.js +22 -18
- package/dist/cosmicintersection/components/StepDAG.js.map +1 -1
- package/dist/cosmicintersection/pages/access/AccessPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/access/AccessPage.js +147 -146
- package/dist/cosmicintersection/pages/access/AccessPage.js.map +1 -1
- package/dist/cosmicintersection/pages/analyses/AnalysesPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/analyses/AnalysesPage.js +260 -259
- package/dist/cosmicintersection/pages/analyses/AnalysesPage.js.map +1 -1
- package/dist/cosmicintersection/pages/collections/CollectionsPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/collections/CollectionsPage.js +80 -65
- package/dist/cosmicintersection/pages/collections/CollectionsPage.js.map +1 -1
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.js +132 -131
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js +212 -164
- package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js.map +1 -1
- package/dist/cosmicintersection/pages/datasets/DatasetsPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/datasets/DatasetsPage.js +178 -177
- package/dist/cosmicintersection/pages/datasets/DatasetsPage.js.map +1 -1
- package/dist/cosmicintersection/pages/discovery/DiscoveryPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/discovery/DiscoveryPage.js +138 -145
- package/dist/cosmicintersection/pages/discovery/DiscoveryPage.js.map +1 -1
- package/dist/cosmicintersection/pages/lineage/LineagePage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/lineage/LineagePage.js +78 -88
- package/dist/cosmicintersection/pages/lineage/LineagePage.js.map +1 -1
- package/dist/cosmicintersection/pages/notebooks/NotebooksPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js +125 -124
- package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js.map +1 -1
- package/dist/cosmicintersection/pages/pipelines/PipelinesPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js +152 -151
- package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js.map +1 -1
- package/dist/cosmicintersection/pages/releases/ReleasesPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/releases/ReleasesPage.js +175 -174
- package/dist/cosmicintersection/pages/releases/ReleasesPage.js.map +1 -1
- package/dist/cosmicintersection/pages/runs/RunDetailPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/runs/RunDetailPage.js +252 -118
- package/dist/cosmicintersection/pages/runs/RunDetailPage.js.map +1 -1
- package/dist/cosmicintersection/pages/runs/RunsPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/runs/RunsPage.js +197 -188
- package/dist/cosmicintersection/pages/runs/RunsPage.js.map +1 -1
- package/dist/cosmicintersection/pages/sources/SourcesPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/sources/SourcesPage.js +65 -64
- package/dist/cosmicintersection/pages/sources/SourcesPage.js.map +1 -1
- package/dist/dev/main.d.ts.map +1 -1
- package/dist/shared/hooks/useTr.d.ts +12 -0
- package/dist/shared/hooks/useTr.d.ts.map +1 -0
- package/dist/shared/hooks/useTr.js +16 -0
- package/dist/shared/hooks/useTr.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
|
|
2
2
|
import { notify as t } from "../../lib/toast.js";
|
|
3
3
|
import { useCosArchiveNotebookMutation as n, useCosNotebooksQuery as r } from "../../api/cosmicApi.js";
|
|
4
|
-
import i from "
|
|
5
|
-
import a from "../../components/
|
|
6
|
-
import o from "../../components/
|
|
7
|
-
import s from "../../components/
|
|
8
|
-
import c from "../../components/
|
|
9
|
-
import l
|
|
10
|
-
import d from "../../components/
|
|
4
|
+
import { useTr as i } from "../../../shared/hooks/useTr.js";
|
|
5
|
+
import a from "../../components/ActionMenu.js";
|
|
6
|
+
import o from "../../components/EmptyState.js";
|
|
7
|
+
import s from "../../components/ErrorState.js";
|
|
8
|
+
import c from "../../components/LoadingState.js";
|
|
9
|
+
import l from "../../components/PageLayout.js";
|
|
10
|
+
import u, { usePagination as d } from "../../components/Pagination.js";
|
|
11
|
+
import f from "../../components/StatusBadge.js";
|
|
11
12
|
import "../../components/index.js";
|
|
12
|
-
import { useState as
|
|
13
|
-
import { Fragment as
|
|
14
|
-
import { NotebookText as
|
|
15
|
-
import { Badge as
|
|
13
|
+
import { useState as p } from "react";
|
|
14
|
+
import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
15
|
+
import { NotebookText as _, Plus as v, Share2 as y } from "lucide-react";
|
|
16
|
+
import { Badge as b, Button as x, Select as S, SelectContent as C, SelectItem as w, SelectTrigger as T, SelectValue as E, Table as D, TableBody as O, TableCell as k, TableHead as A, TableHeader as j, TableRow as M } from "@burdenoff/fe-libs/ui";
|
|
16
17
|
//#region src/cosmicintersection/pages/notebooks/NotebooksPage.tsx
|
|
17
|
-
var
|
|
18
|
+
var N = [
|
|
18
19
|
{
|
|
19
20
|
value: "DRAFT",
|
|
20
21
|
label: "Draft"
|
|
@@ -31,8 +32,8 @@ var M = [
|
|
|
31
32
|
value: "ARCHIVED",
|
|
32
33
|
label: "Archived"
|
|
33
34
|
}
|
|
34
|
-
],
|
|
35
|
-
function
|
|
35
|
+
], P = "ALL";
|
|
36
|
+
function F(e) {
|
|
36
37
|
if (!e) return "—";
|
|
37
38
|
let t = new Date(e);
|
|
38
39
|
return Number.isNaN(t.getTime()) ? "—" : t.toLocaleDateString(void 0, {
|
|
@@ -41,170 +42,170 @@ function P(e) {
|
|
|
41
42
|
day: "numeric"
|
|
42
43
|
});
|
|
43
44
|
}
|
|
44
|
-
function
|
|
45
|
-
let { navigate:
|
|
45
|
+
function I() {
|
|
46
|
+
let { navigate: I } = e(), L = i(), [R, z] = p(void 0), B = d({
|
|
46
47
|
pageSize: 50,
|
|
47
|
-
resetKey:
|
|
48
|
-
}), { data:
|
|
49
|
-
status:
|
|
48
|
+
resetKey: R
|
|
49
|
+
}), { data: V, loading: H, error: U, refetch: W } = r({
|
|
50
|
+
status: R,
|
|
50
51
|
pagination: {
|
|
51
|
-
limit:
|
|
52
|
-
offset:
|
|
52
|
+
limit: B.limit,
|
|
53
|
+
offset: B.offset
|
|
53
54
|
}
|
|
54
|
-
}), [
|
|
55
|
-
let n = await
|
|
55
|
+
}), [G] = n(), K = V?.cosListNotebooks.items ?? [], q = V?.cosListNotebooks.pageInfo, J = async (e) => {
|
|
56
|
+
let n = await G({ variables: { id: e.id } });
|
|
56
57
|
if (n.error) throw Error(n.error.message);
|
|
57
|
-
if (!n.data?.cosArchiveNotebook) throw t.error("Could not archive notebook", "The server did not confirm the change."), Error("Archive not confirmed");
|
|
58
|
-
await
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
children: /* @__PURE__ */
|
|
58
|
+
if (!n.data?.cosArchiveNotebook) throw t.error(L("cosmicintersection.pages.notebooks.archiveError", "Could not archive notebook"), L("cosmicintersection.pages.notebooks.archiveErrorDescription", "The server did not confirm the change.")), Error("Archive not confirmed");
|
|
59
|
+
await W(), t.success(L("cosmicintersection.pages.notebooks.archiveSuccess", "Notebook archived"), L("cosmicintersection.pages.notebooks.archiveSuccessDescription", "“{{name}}” was archived.", { name: e.title }));
|
|
60
|
+
}, Y = /* @__PURE__ */ g(x, {
|
|
61
|
+
type: "button",
|
|
62
|
+
onClick: () => I("notebooks/create"),
|
|
63
|
+
children: [/* @__PURE__ */ h(v, { className: "size-4" }), L("cosmicintersection.pages.notebooks.create", "New notebook")]
|
|
64
|
+
});
|
|
65
|
+
return /* @__PURE__ */ h(l, {
|
|
66
|
+
title: L("cosmicintersection.pages.notebooks.title", "Notebooks"),
|
|
67
|
+
description: L("cosmicintersection.pages.notebooks.description", "Computational notebooks for running analyses over federated science datasets."),
|
|
68
|
+
actions: Y,
|
|
69
|
+
children: /* @__PURE__ */ g("div", {
|
|
69
70
|
className: "space-y-4",
|
|
70
71
|
children: [
|
|
71
|
-
/* @__PURE__ */
|
|
72
|
+
/* @__PURE__ */ g("div", {
|
|
72
73
|
className: "flex flex-wrap items-center gap-3",
|
|
73
|
-
children: [/* @__PURE__ */
|
|
74
|
+
children: [/* @__PURE__ */ h("label", {
|
|
74
75
|
className: "text-sm text-text-secondary",
|
|
75
76
|
htmlFor: "notebook-status-filter",
|
|
76
77
|
children: "Status"
|
|
77
|
-
}), /* @__PURE__ */
|
|
78
|
-
value:
|
|
79
|
-
onValueChange: (e) =>
|
|
80
|
-
children: [/* @__PURE__ */
|
|
78
|
+
}), /* @__PURE__ */ g(S, {
|
|
79
|
+
value: R ?? P,
|
|
80
|
+
onValueChange: (e) => z(e === P ? void 0 : e),
|
|
81
|
+
children: [/* @__PURE__ */ h(T, {
|
|
81
82
|
id: "notebook-status-filter",
|
|
82
83
|
className: "w-48",
|
|
83
84
|
"aria-label": "Filter by status",
|
|
84
|
-
children: /* @__PURE__ */
|
|
85
|
-
}), /* @__PURE__ */
|
|
86
|
-
value:
|
|
85
|
+
children: /* @__PURE__ */ h(E, {})
|
|
86
|
+
}), /* @__PURE__ */ g(C, { children: [/* @__PURE__ */ h(w, {
|
|
87
|
+
value: P,
|
|
87
88
|
children: "All statuses"
|
|
88
|
-
}),
|
|
89
|
+
}), N.map((e) => /* @__PURE__ */ h(w, {
|
|
89
90
|
value: e.value,
|
|
90
91
|
children: e.label
|
|
91
92
|
}, e.value))] })]
|
|
92
93
|
})]
|
|
93
94
|
}),
|
|
94
|
-
|
|
95
|
+
H ? /* @__PURE__ */ h(c, {
|
|
95
96
|
variant: "rows",
|
|
96
97
|
rows: 6,
|
|
97
|
-
label: "Loading notebooks…"
|
|
98
|
-
}) :
|
|
99
|
-
message: "We could not load your notebooks. Please try again.",
|
|
100
|
-
onRetry: () => void
|
|
101
|
-
}) :
|
|
102
|
-
icon:
|
|
103
|
-
title:
|
|
104
|
-
description:
|
|
105
|
-
action:
|
|
98
|
+
label: L("cosmicintersection.pages.notebooks.loading", "Loading notebooks…")
|
|
99
|
+
}) : U ? /* @__PURE__ */ h(s, {
|
|
100
|
+
message: L("cosmicintersection.pages.notebooks.error", "We could not load your notebooks. Please try again."),
|
|
101
|
+
onRetry: () => void W()
|
|
102
|
+
}) : K.length === 0 ? /* @__PURE__ */ h(o, {
|
|
103
|
+
icon: _,
|
|
104
|
+
title: R ? L("cosmicintersection.pages.notebooks.emptyFilterTitle", "No notebooks match this filter.") : L("cosmicintersection.pages.notebooks.emptyTitle", "No notebooks yet."),
|
|
105
|
+
description: R ? L("cosmicintersection.pages.notebooks.emptyFilterDescription", "Try a different status filter.") : L("cosmicintersection.pages.notebooks.emptyDescription", "Create your first notebook to start analysing federated datasets."),
|
|
106
|
+
action: R ? void 0 : /* @__PURE__ */ g(x, {
|
|
106
107
|
type: "button",
|
|
107
|
-
onClick: () =>
|
|
108
|
-
children: [/* @__PURE__ */
|
|
108
|
+
onClick: () => I("notebooks/create"),
|
|
109
|
+
children: [/* @__PURE__ */ h(v, { className: "size-4" }), L("cosmicintersection.pages.notebooks.create", "New notebook")]
|
|
109
110
|
})
|
|
110
|
-
}) : /* @__PURE__ */
|
|
111
|
+
}) : /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h("div", {
|
|
111
112
|
className: "hidden rounded-card border border-border-default bg-bg-elevated md:block",
|
|
112
|
-
children: /* @__PURE__ */
|
|
113
|
-
/* @__PURE__ */
|
|
114
|
-
/* @__PURE__ */
|
|
115
|
-
/* @__PURE__ */
|
|
116
|
-
/* @__PURE__ */
|
|
113
|
+
children: /* @__PURE__ */ g(D, { children: [/* @__PURE__ */ h(j, { children: /* @__PURE__ */ g(M, { children: [
|
|
114
|
+
/* @__PURE__ */ h(A, { children: "Title" }),
|
|
115
|
+
/* @__PURE__ */ h(A, { children: "Status" }),
|
|
116
|
+
/* @__PURE__ */ h(A, { children: "Runtime" }),
|
|
117
|
+
/* @__PURE__ */ h(A, {
|
|
117
118
|
className: "text-right",
|
|
118
119
|
children: "Datasets"
|
|
119
120
|
}),
|
|
120
|
-
/* @__PURE__ */
|
|
121
|
-
/* @__PURE__ */
|
|
122
|
-
/* @__PURE__ */
|
|
123
|
-
/* @__PURE__ */
|
|
121
|
+
/* @__PURE__ */ h(A, { children: "Sharing" }),
|
|
122
|
+
/* @__PURE__ */ h(A, { children: "Tags" }),
|
|
123
|
+
/* @__PURE__ */ h(A, { children: "Updated" }),
|
|
124
|
+
/* @__PURE__ */ h(A, {
|
|
124
125
|
className: "w-12 text-right",
|
|
125
126
|
children: "Actions"
|
|
126
127
|
})
|
|
127
|
-
] }) }), /* @__PURE__ */
|
|
128
|
+
] }) }), /* @__PURE__ */ h(O, { children: K.map((e) => /* @__PURE__ */ g(M, {
|
|
128
129
|
className: "cursor-pointer",
|
|
129
|
-
onClick: () =>
|
|
130
|
+
onClick: () => I(`notebooks/${e.id}`),
|
|
130
131
|
children: [
|
|
131
|
-
/* @__PURE__ */
|
|
132
|
+
/* @__PURE__ */ h(k, {
|
|
132
133
|
className: "font-medium text-text-primary",
|
|
133
134
|
children: e.title
|
|
134
135
|
}),
|
|
135
|
-
/* @__PURE__ */
|
|
136
|
-
/* @__PURE__ */
|
|
136
|
+
/* @__PURE__ */ h(k, { children: /* @__PURE__ */ h(f, { status: e.status }) }),
|
|
137
|
+
/* @__PURE__ */ h(k, {
|
|
137
138
|
className: "text-text-secondary",
|
|
138
139
|
children: e.runtime ?? "—"
|
|
139
140
|
}),
|
|
140
|
-
/* @__PURE__ */
|
|
141
|
+
/* @__PURE__ */ h(k, {
|
|
141
142
|
className: "text-right tabular-nums text-text-secondary",
|
|
142
143
|
children: e.datasetIds.length
|
|
143
144
|
}),
|
|
144
|
-
/* @__PURE__ */
|
|
145
|
+
/* @__PURE__ */ h(k, { children: e.isShared ? /* @__PURE__ */ g(b, {
|
|
145
146
|
variant: "secondary",
|
|
146
147
|
className: "gap-1",
|
|
147
|
-
children: [/* @__PURE__ */
|
|
148
|
+
children: [/* @__PURE__ */ h(y, {
|
|
148
149
|
className: "size-3",
|
|
149
150
|
"aria-hidden": "true"
|
|
150
|
-
}), "Shared"]
|
|
151
|
-
}) : /* @__PURE__ */
|
|
151
|
+
}), L("cosmicintersection.common.shared", "Shared")]
|
|
152
|
+
}) : /* @__PURE__ */ h("span", {
|
|
152
153
|
className: "text-text-secondary",
|
|
153
|
-
children: "Private"
|
|
154
|
+
children: L("cosmicintersection.common.private", "Private")
|
|
154
155
|
}) }),
|
|
155
|
-
/* @__PURE__ */
|
|
156
|
+
/* @__PURE__ */ h(k, { children: e.tags.length > 0 ? /* @__PURE__ */ g("div", {
|
|
156
157
|
className: "flex flex-wrap gap-1",
|
|
157
|
-
children: [e.tags.slice(0, 3).map((e) => /* @__PURE__ */
|
|
158
|
+
children: [e.tags.slice(0, 3).map((e) => /* @__PURE__ */ h(b, {
|
|
158
159
|
variant: "outline",
|
|
159
160
|
children: e
|
|
160
|
-
}, e)), e.tags.length > 3 ? /* @__PURE__ */
|
|
161
|
+
}, e)), e.tags.length > 3 ? /* @__PURE__ */ g("span", {
|
|
161
162
|
className: "text-xs text-text-secondary",
|
|
162
163
|
children: ["+", e.tags.length - 3]
|
|
163
164
|
}) : null]
|
|
164
|
-
}) : /* @__PURE__ */
|
|
165
|
+
}) : /* @__PURE__ */ h("span", {
|
|
165
166
|
className: "text-text-secondary",
|
|
166
167
|
children: "—"
|
|
167
168
|
}) }),
|
|
168
|
-
/* @__PURE__ */
|
|
169
|
+
/* @__PURE__ */ h(k, {
|
|
169
170
|
className: "whitespace-nowrap text-text-secondary",
|
|
170
|
-
children:
|
|
171
|
+
children: F(e.updatedAt)
|
|
171
172
|
}),
|
|
172
|
-
/* @__PURE__ */
|
|
173
|
+
/* @__PURE__ */ h(k, {
|
|
173
174
|
className: "text-right",
|
|
174
|
-
children: /* @__PURE__ */
|
|
175
|
+
children: /* @__PURE__ */ h(a, {
|
|
175
176
|
ariaLabel: `Actions for ${e.title}`,
|
|
176
177
|
entityName: e.title,
|
|
177
|
-
onView: () =>
|
|
178
|
-
onEdit: () =>
|
|
179
|
-
onDelete: e.status === "ARCHIVED" ? void 0 : () =>
|
|
180
|
-
deleteLabel: "Archive notebook"
|
|
178
|
+
onView: () => I(`notebooks/${e.id}`),
|
|
179
|
+
onEdit: () => I(`notebooks/${e.id}/edit`),
|
|
180
|
+
onDelete: e.status === "ARCHIVED" ? void 0 : () => J(e),
|
|
181
|
+
deleteLabel: L("cosmicintersection.pages.notebooks.archive", "Archive notebook")
|
|
181
182
|
})
|
|
182
183
|
})
|
|
183
184
|
]
|
|
184
185
|
}, e.id)) })] })
|
|
185
|
-
}), /* @__PURE__ */
|
|
186
|
+
}), /* @__PURE__ */ h("ul", {
|
|
186
187
|
className: "space-y-3 md:hidden",
|
|
187
|
-
children:
|
|
188
|
+
children: K.map((e) => /* @__PURE__ */ h("li", {
|
|
188
189
|
className: "rounded-card border border-border-default bg-bg-elevated",
|
|
189
|
-
children: /* @__PURE__ */
|
|
190
|
+
children: /* @__PURE__ */ g("div", {
|
|
190
191
|
className: "flex items-start justify-between gap-2 p-4",
|
|
191
|
-
children: [/* @__PURE__ */
|
|
192
|
+
children: [/* @__PURE__ */ g("button", {
|
|
192
193
|
type: "button",
|
|
193
|
-
onClick: () =>
|
|
194
|
+
onClick: () => I(`notebooks/${e.id}`),
|
|
194
195
|
className: "min-w-0 flex-1 space-y-2 text-left",
|
|
195
196
|
children: [
|
|
196
|
-
/* @__PURE__ */
|
|
197
|
+
/* @__PURE__ */ g("div", {
|
|
197
198
|
className: "flex flex-wrap items-center gap-2",
|
|
198
|
-
children: [/* @__PURE__ */
|
|
199
|
+
children: [/* @__PURE__ */ h("span", {
|
|
199
200
|
className: "truncate font-medium text-text-primary",
|
|
200
201
|
children: e.title
|
|
201
|
-
}), /* @__PURE__ */
|
|
202
|
+
}), /* @__PURE__ */ h(f, { status: e.status })]
|
|
202
203
|
}),
|
|
203
|
-
/* @__PURE__ */
|
|
204
|
+
/* @__PURE__ */ g("div", {
|
|
204
205
|
className: "flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-text-secondary",
|
|
205
206
|
children: [
|
|
206
|
-
/* @__PURE__ */
|
|
207
|
-
/* @__PURE__ */
|
|
207
|
+
/* @__PURE__ */ g("span", { children: ["Runtime: ", e.runtime ?? "—"] }),
|
|
208
|
+
/* @__PURE__ */ g("span", {
|
|
208
209
|
className: "tabular-nums",
|
|
209
210
|
children: [
|
|
210
211
|
e.datasetIds.length,
|
|
@@ -212,53 +213,53 @@ function F() {
|
|
|
212
213
|
e.datasetIds.length === 1 ? "" : "s"
|
|
213
214
|
]
|
|
214
215
|
}),
|
|
215
|
-
e.isShared ? /* @__PURE__ */
|
|
216
|
+
e.isShared ? /* @__PURE__ */ g("span", {
|
|
216
217
|
className: "inline-flex items-center gap-1",
|
|
217
|
-
children: [/* @__PURE__ */
|
|
218
|
+
children: [/* @__PURE__ */ h(y, {
|
|
218
219
|
className: "size-3",
|
|
219
220
|
"aria-hidden": "true"
|
|
220
|
-
}), "Shared"]
|
|
221
|
-
}) : /* @__PURE__ */
|
|
222
|
-
/* @__PURE__ */
|
|
221
|
+
}), L("cosmicintersection.common.shared", "Shared")]
|
|
222
|
+
}) : /* @__PURE__ */ h("span", { children: L("cosmicintersection.common.private", "Private") }),
|
|
223
|
+
/* @__PURE__ */ g("span", { children: ["Updated ", F(e.updatedAt)] })
|
|
223
224
|
]
|
|
224
225
|
}),
|
|
225
|
-
e.tags.length > 0 ? /* @__PURE__ */
|
|
226
|
+
e.tags.length > 0 ? /* @__PURE__ */ g("div", {
|
|
226
227
|
className: "flex flex-wrap gap-1",
|
|
227
|
-
children: [e.tags.slice(0, 4).map((e) => /* @__PURE__ */
|
|
228
|
+
children: [e.tags.slice(0, 4).map((e) => /* @__PURE__ */ h(b, {
|
|
228
229
|
variant: "outline",
|
|
229
230
|
children: e
|
|
230
|
-
}, e)), e.tags.length > 4 ? /* @__PURE__ */
|
|
231
|
+
}, e)), e.tags.length > 4 ? /* @__PURE__ */ g("span", {
|
|
231
232
|
className: "text-xs text-text-secondary",
|
|
232
233
|
children: ["+", e.tags.length - 4]
|
|
233
234
|
}) : null]
|
|
234
235
|
}) : null
|
|
235
236
|
]
|
|
236
|
-
}), /* @__PURE__ */
|
|
237
|
+
}), /* @__PURE__ */ h(a, {
|
|
237
238
|
ariaLabel: `Actions for ${e.title}`,
|
|
238
239
|
entityName: e.title,
|
|
239
|
-
onView: () =>
|
|
240
|
-
onEdit: () =>
|
|
241
|
-
onDelete: e.status === "ARCHIVED" ? void 0 : () =>
|
|
242
|
-
deleteLabel: "Archive notebook"
|
|
240
|
+
onView: () => I(`notebooks/${e.id}`),
|
|
241
|
+
onEdit: () => I(`notebooks/${e.id}/edit`),
|
|
242
|
+
onDelete: e.status === "ARCHIVED" ? void 0 : () => J(e),
|
|
243
|
+
deleteLabel: L("cosmicintersection.pages.notebooks.archive", "Archive notebook")
|
|
243
244
|
})]
|
|
244
245
|
})
|
|
245
246
|
}, e.id))
|
|
246
247
|
})] }),
|
|
247
|
-
!
|
|
248
|
-
offset:
|
|
249
|
-
limit:
|
|
250
|
-
loadedCount:
|
|
251
|
-
hasMore:
|
|
252
|
-
onPrev:
|
|
253
|
-
onNext:
|
|
254
|
-
itemLabel: "notebooks",
|
|
255
|
-
loading:
|
|
248
|
+
!H && !U && K.length > 0 ? /* @__PURE__ */ h(u, {
|
|
249
|
+
offset: B.offset,
|
|
250
|
+
limit: B.limit,
|
|
251
|
+
loadedCount: K.length,
|
|
252
|
+
hasMore: q?.hasMore ?? !1,
|
|
253
|
+
onPrev: B.prevPage,
|
|
254
|
+
onNext: B.nextPage,
|
|
255
|
+
itemLabel: L("cosmicintersection.pages.notebooks.itemLabel", "notebooks"),
|
|
256
|
+
loading: H
|
|
256
257
|
}) : null
|
|
257
258
|
]
|
|
258
259
|
})
|
|
259
260
|
});
|
|
260
261
|
}
|
|
261
262
|
//#endregion
|
|
262
|
-
export {
|
|
263
|
+
export { I as default };
|
|
263
264
|
|
|
264
265
|
//# sourceMappingURL=NotebooksPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotebooksPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/notebooks/NotebooksPage.tsx"],"sourcesContent":["/**\n * NotebooksPage — paginated list of analysis notebooks.\n *\n * Notebooks are computational documents (title, runtime, environment, linked\n * datasets) that scientists run analyses inside. This surface lists them from\n * `cosListNotebooks` with a status filter, per-row View / Edit / Archive\n * actions, and offset pagination. Every value here comes from the backend —\n * there is no fabricated data.\n */\nimport { useState } from 'react';\nimport { NotebookText, Plus, Share2 } from 'lucide-react';\nimport {\n Badge,\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 useCosArchiveNotebookMutation,\n useCosNotebooksQuery,\n type CosNotebook,\n type CosNotebookStatus,\n} from '../../api/cosmicApi';\nimport {\n ActionMenu,\n EmptyState,\n ErrorState,\n LoadingState,\n PageLayout,\n Pagination,\n StatusBadge,\n usePagination,\n} from '../../components';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\nimport { notify } from '../../lib/toast';\n\nconst STATUS_OPTIONS: { value: CosNotebookStatus; label: string }[] = [\n { value: 'DRAFT', label: 'Draft' },\n { value: 'RUNNING', label: 'Running' },\n { value: 'PUBLISHED', label: 'Published' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\nconst ALL = 'ALL';\n\nfunction formatDate(value?: string | null): string {\n if (!value) {\n return '—';\n }\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return '—';\n }\n return date.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\n\nexport default function NotebooksPage() {\n const { navigate } = useCosmicIntersection();\n const [statusFilter, setStatusFilter] = useState<CosNotebookStatus | undefined>(undefined);\n const pagination = usePagination({ pageSize: 50, resetKey: statusFilter });\n\n const { data, loading, error, refetch } = useCosNotebooksQuery({\n status: statusFilter,\n pagination: { limit: pagination.limit, offset: pagination.offset },\n });\n const [archiveNotebook] = useCosArchiveNotebookMutation();\n\n const notebooks = data?.cosListNotebooks.items ?? [];\n const pageInfo = data?.cosListNotebooks.pageInfo;\n\n const handleArchive = async (notebook: CosNotebook) => {\n const response = await archiveNotebook({ variables: { id: notebook.id } });\n if (response.error) {\n // onError already surfaced the toast; rethrow so the confirm dialog stays open.\n throw new Error(response.error.message);\n }\n if (!response.data?.cosArchiveNotebook) {\n notify.error('Could not archive notebook', 'The server did not confirm the change.');\n throw new Error('Archive not confirmed');\n }\n await refetch();\n notify.success('Notebook archived', `“${notebook.title}” was archived.`);\n };\n\n const actions = (\n <Button type=\"button\" onClick={() => navigate('notebooks/create')}>\n <Plus className=\"size-4\" />\n New notebook\n </Button>\n );\n\n return (\n <PageLayout\n title=\"Notebooks\"\n description=\"Computational notebooks for running analyses over federated science datasets.\"\n actions={actions}\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <label className=\"text-sm text-text-secondary\" htmlFor=\"notebook-status-filter\">\n Status\n </label>\n <Select\n value={statusFilter ?? ALL}\n onValueChange={(value) =>\n setStatusFilter(value === ALL ? undefined : (value as CosNotebookStatus))\n }\n >\n <SelectTrigger\n id=\"notebook-status-filter\"\n className=\"w-48\"\n aria-label=\"Filter by status\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>All statuses</SelectItem>\n {STATUS_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {loading ? (\n <LoadingState variant=\"rows\" rows={6} label=\"Loading notebooks…\" />\n ) : error ? (\n <ErrorState\n message=\"We could not load your notebooks. Please try again.\"\n onRetry={() => void refetch()}\n />\n ) : notebooks.length === 0 ? (\n <EmptyState\n icon={NotebookText}\n title={statusFilter ? 'No notebooks match this filter.' : 'No notebooks yet.'}\n description={\n statusFilter\n ? 'Try a different status filter.'\n : 'Create your first notebook to start analysing federated datasets.'\n }\n action={\n statusFilter ? undefined : (\n <Button type=\"button\" onClick={() => navigate('notebooks/create')}>\n <Plus className=\"size-4\" />\n New notebook\n </Button>\n )\n }\n />\n ) : (\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>Title</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Runtime</TableHead>\n <TableHead className=\"text-right\">Datasets</TableHead>\n <TableHead>Sharing</TableHead>\n <TableHead>Tags</TableHead>\n <TableHead>Updated</TableHead>\n <TableHead className=\"w-12 text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {notebooks.map((notebook) => (\n <TableRow\n key={notebook.id}\n className=\"cursor-pointer\"\n onClick={() => navigate(`notebooks/${notebook.id}`)}\n >\n <TableCell className=\"font-medium text-text-primary\">\n {notebook.title}\n </TableCell>\n <TableCell>\n <StatusBadge status={notebook.status} />\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {notebook.runtime ?? '—'}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-secondary\">\n {notebook.datasetIds.length}\n </TableCell>\n <TableCell>\n {notebook.isShared ? (\n <Badge variant=\"secondary\" className=\"gap-1\">\n <Share2 className=\"size-3\" aria-hidden=\"true\" />\n Shared\n </Badge>\n ) : (\n <span className=\"text-text-secondary\">Private</span>\n )}\n </TableCell>\n <TableCell>\n {notebook.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {notebook.tags.slice(0, 3).map((tag) => (\n <Badge key={tag} variant=\"outline\">\n {tag}\n </Badge>\n ))}\n {notebook.tags.length > 3 ? (\n <span className=\"text-xs text-text-secondary\">\n +{notebook.tags.length - 3}\n </span>\n ) : null}\n </div>\n ) : (\n <span className=\"text-text-secondary\">—</span>\n )}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-text-secondary\">\n {formatDate(notebook.updatedAt)}\n </TableCell>\n <TableCell className=\"text-right\">\n <ActionMenu\n ariaLabel={`Actions for ${notebook.title}`}\n entityName={notebook.title}\n onView={() => navigate(`notebooks/${notebook.id}`)}\n onEdit={() => navigate(`notebooks/${notebook.id}/edit`)}\n onDelete={\n notebook.status === 'ARCHIVED'\n ? undefined\n : () => handleArchive(notebook)\n }\n deleteLabel=\"Archive notebook\"\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {/* Mobile card list */}\n <ul className=\"space-y-3 md:hidden\">\n {notebooks.map((notebook) => (\n <li\n key={notebook.id}\n className=\"rounded-card border border-border-default bg-bg-elevated\"\n >\n <div className=\"flex items-start justify-between gap-2 p-4\">\n <button\n type=\"button\"\n onClick={() => navigate(`notebooks/${notebook.id}`)}\n className=\"min-w-0 flex-1 space-y-2 text-left\"\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"truncate font-medium text-text-primary\">\n {notebook.title}\n </span>\n <StatusBadge status={notebook.status} />\n </div>\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-text-secondary\">\n <span>Runtime: {notebook.runtime ?? '—'}</span>\n <span className=\"tabular-nums\">\n {notebook.datasetIds.length} dataset\n {notebook.datasetIds.length === 1 ? '' : 's'}\n </span>\n {notebook.isShared ? (\n <span className=\"inline-flex items-center gap-1\">\n <Share2 className=\"size-3\" aria-hidden=\"true\" />\n Shared\n </span>\n ) : (\n <span>Private</span>\n )}\n <span>Updated {formatDate(notebook.updatedAt)}</span>\n </div>\n {notebook.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {notebook.tags.slice(0, 4).map((tag) => (\n <Badge key={tag} variant=\"outline\">\n {tag}\n </Badge>\n ))}\n {notebook.tags.length > 4 ? (\n <span className=\"text-xs text-text-secondary\">\n +{notebook.tags.length - 4}\n </span>\n ) : null}\n </div>\n ) : null}\n </button>\n <ActionMenu\n ariaLabel={`Actions for ${notebook.title}`}\n entityName={notebook.title}\n onView={() => navigate(`notebooks/${notebook.id}`)}\n onEdit={() => navigate(`notebooks/${notebook.id}/edit`)}\n onDelete={\n notebook.status === 'ARCHIVED' ? undefined : () => handleArchive(notebook)\n }\n deleteLabel=\"Archive notebook\"\n />\n </div>\n </li>\n ))}\n </ul>\n </>\n )}\n\n {!loading && !error && notebooks.length > 0 ? (\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={notebooks.length}\n hasMore={pageInfo?.hasMore ?? false}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"notebooks\"\n loading={loading}\n />\n ) : null}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NotebooksPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/notebooks/NotebooksPage.tsx"],"sourcesContent":["/**\n * NotebooksPage — paginated list of analysis notebooks.\n *\n * Notebooks are computational documents (title, runtime, environment, linked\n * datasets) that scientists run analyses inside. This surface lists them from\n * `cosListNotebooks` with a status filter, per-row View / Edit / Archive\n * actions, and offset pagination. Every value here comes from the backend —\n * there is no fabricated data.\n */\nimport { useState } from 'react';\nimport { NotebookText, Plus, Share2 } from 'lucide-react';\nimport {\n Badge,\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 useCosArchiveNotebookMutation,\n useCosNotebooksQuery,\n type CosNotebook,\n type CosNotebookStatus,\n} from '../../api/cosmicApi';\nimport {\n ActionMenu,\n EmptyState,\n ErrorState,\n LoadingState,\n PageLayout,\n Pagination,\n StatusBadge,\n usePagination,\n} from '../../components';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\nimport { notify } from '../../lib/toast';\nimport { useTr } from '../../../shared/hooks/useTr';\n\nconst STATUS_OPTIONS: { value: CosNotebookStatus; label: string }[] = [\n { value: 'DRAFT', label: 'Draft' },\n { value: 'RUNNING', label: 'Running' },\n { value: 'PUBLISHED', label: 'Published' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\nconst ALL = 'ALL';\n\nfunction formatDate(value?: string | null): string {\n if (!value) {\n return '—';\n }\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return '—';\n }\n return date.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\n\nexport default function NotebooksPage() {\n const { navigate } = useCosmicIntersection();\n const tr = useTr();\n const [statusFilter, setStatusFilter] = useState<CosNotebookStatus | undefined>(undefined);\n const pagination = usePagination({ pageSize: 50, resetKey: statusFilter });\n\n const { data, loading, error, refetch } = useCosNotebooksQuery({\n status: statusFilter,\n pagination: { limit: pagination.limit, offset: pagination.offset },\n });\n const [archiveNotebook] = useCosArchiveNotebookMutation();\n\n const notebooks = data?.cosListNotebooks.items ?? [];\n const pageInfo = data?.cosListNotebooks.pageInfo;\n\n const handleArchive = async (notebook: CosNotebook) => {\n const response = await archiveNotebook({ variables: { id: notebook.id } });\n if (response.error) {\n // onError already surfaced the toast; rethrow so the confirm dialog stays open.\n throw new Error(response.error.message);\n }\n if (!response.data?.cosArchiveNotebook) {\n notify.error(\n tr('cosmicintersection.pages.notebooks.archiveError', 'Could not archive notebook'),\n tr(\n 'cosmicintersection.pages.notebooks.archiveErrorDescription',\n 'The server did not confirm the change.',\n ),\n );\n throw new Error('Archive not confirmed');\n }\n await refetch();\n notify.success(\n tr('cosmicintersection.pages.notebooks.archiveSuccess', 'Notebook archived'),\n tr(\n 'cosmicintersection.pages.notebooks.archiveSuccessDescription',\n '“{{name}}” was archived.',\n { name: notebook.title },\n ),\n );\n };\n\n const actions = (\n <Button type=\"button\" onClick={() => navigate('notebooks/create')}>\n <Plus className=\"size-4\" />\n {tr('cosmicintersection.pages.notebooks.create', 'New notebook')}\n </Button>\n );\n\n return (\n <PageLayout\n title={tr('cosmicintersection.pages.notebooks.title', 'Notebooks')}\n description={tr(\n 'cosmicintersection.pages.notebooks.description',\n 'Computational notebooks for running analyses over federated science datasets.',\n )}\n actions={actions}\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <label className=\"text-sm text-text-secondary\" htmlFor=\"notebook-status-filter\">\n Status\n </label>\n <Select\n value={statusFilter ?? ALL}\n onValueChange={(value) =>\n setStatusFilter(value === ALL ? undefined : (value as CosNotebookStatus))\n }\n >\n <SelectTrigger\n id=\"notebook-status-filter\"\n className=\"w-48\"\n aria-label=\"Filter by status\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>All statuses</SelectItem>\n {STATUS_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {loading ? (\n <LoadingState variant=\"rows\" rows={6} label={tr('cosmicintersection.pages.notebooks.loading', 'Loading notebooks…')} />\n ) : error ? (\n <ErrorState\n message={tr(\n 'cosmicintersection.pages.notebooks.error',\n 'We could not load your notebooks. Please try again.',\n )}\n onRetry={() => void refetch()}\n />\n ) : notebooks.length === 0 ? (\n <EmptyState\n icon={NotebookText}\n title={\n statusFilter\n ? tr(\n 'cosmicintersection.pages.notebooks.emptyFilterTitle',\n 'No notebooks match this filter.',\n )\n : tr('cosmicintersection.pages.notebooks.emptyTitle', 'No notebooks yet.')\n }\n description={\n statusFilter\n ? tr(\n 'cosmicintersection.pages.notebooks.emptyFilterDescription',\n 'Try a different status filter.',\n )\n : tr(\n 'cosmicintersection.pages.notebooks.emptyDescription',\n 'Create your first notebook to start analysing federated datasets.',\n )\n }\n action={\n statusFilter ? undefined : (\n <Button type=\"button\" onClick={() => navigate('notebooks/create')}>\n <Plus className=\"size-4\" />\n {tr('cosmicintersection.pages.notebooks.create', 'New notebook')}\n </Button>\n )\n }\n />\n ) : (\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>Title</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Runtime</TableHead>\n <TableHead className=\"text-right\">Datasets</TableHead>\n <TableHead>Sharing</TableHead>\n <TableHead>Tags</TableHead>\n <TableHead>Updated</TableHead>\n <TableHead className=\"w-12 text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {notebooks.map((notebook) => (\n <TableRow\n key={notebook.id}\n className=\"cursor-pointer\"\n onClick={() => navigate(`notebooks/${notebook.id}`)}\n >\n <TableCell className=\"font-medium text-text-primary\">\n {notebook.title}\n </TableCell>\n <TableCell>\n <StatusBadge status={notebook.status} />\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {notebook.runtime ?? '—'}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-secondary\">\n {notebook.datasetIds.length}\n </TableCell>\n <TableCell>\n {notebook.isShared ? (\n <Badge variant=\"secondary\" className=\"gap-1\">\n <Share2 className=\"size-3\" aria-hidden=\"true\" />\n {tr('cosmicintersection.common.shared', 'Shared')}\n </Badge>\n ) : (\n <span className=\"text-text-secondary\">\n {tr('cosmicintersection.common.private', 'Private')}\n </span>\n )}\n </TableCell>\n <TableCell>\n {notebook.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {notebook.tags.slice(0, 3).map((tag) => (\n <Badge key={tag} variant=\"outline\">\n {tag}\n </Badge>\n ))}\n {notebook.tags.length > 3 ? (\n <span className=\"text-xs text-text-secondary\">\n +{notebook.tags.length - 3}\n </span>\n ) : null}\n </div>\n ) : (\n <span className=\"text-text-secondary\">—</span>\n )}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-text-secondary\">\n {formatDate(notebook.updatedAt)}\n </TableCell>\n <TableCell className=\"text-right\">\n <ActionMenu\n ariaLabel={`Actions for ${notebook.title}`}\n entityName={notebook.title}\n onView={() => navigate(`notebooks/${notebook.id}`)}\n onEdit={() => navigate(`notebooks/${notebook.id}/edit`)}\n onDelete={\n notebook.status === 'ARCHIVED'\n ? undefined\n : () => handleArchive(notebook)\n }\n deleteLabel={tr('cosmicintersection.pages.notebooks.archive', 'Archive notebook')}\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {/* Mobile card list */}\n <ul className=\"space-y-3 md:hidden\">\n {notebooks.map((notebook) => (\n <li\n key={notebook.id}\n className=\"rounded-card border border-border-default bg-bg-elevated\"\n >\n <div className=\"flex items-start justify-between gap-2 p-4\">\n <button\n type=\"button\"\n onClick={() => navigate(`notebooks/${notebook.id}`)}\n className=\"min-w-0 flex-1 space-y-2 text-left\"\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"truncate font-medium text-text-primary\">\n {notebook.title}\n </span>\n <StatusBadge status={notebook.status} />\n </div>\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-text-secondary\">\n <span>Runtime: {notebook.runtime ?? '—'}</span>\n <span className=\"tabular-nums\">\n {notebook.datasetIds.length} dataset\n {notebook.datasetIds.length === 1 ? '' : 's'}\n </span>\n {notebook.isShared ? (\n <span className=\"inline-flex items-center gap-1\">\n <Share2 className=\"size-3\" aria-hidden=\"true\" />\n {tr('cosmicintersection.common.shared', 'Shared')}\n </span>\n ) : (\n <span>{tr('cosmicintersection.common.private', 'Private')}</span>\n )}\n <span>Updated {formatDate(notebook.updatedAt)}</span>\n </div>\n {notebook.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {notebook.tags.slice(0, 4).map((tag) => (\n <Badge key={tag} variant=\"outline\">\n {tag}\n </Badge>\n ))}\n {notebook.tags.length > 4 ? (\n <span className=\"text-xs text-text-secondary\">\n +{notebook.tags.length - 4}\n </span>\n ) : null}\n </div>\n ) : null}\n </button>\n <ActionMenu\n ariaLabel={`Actions for ${notebook.title}`}\n entityName={notebook.title}\n onView={() => navigate(`notebooks/${notebook.id}`)}\n onEdit={() => navigate(`notebooks/${notebook.id}/edit`)}\n onDelete={\n notebook.status === 'ARCHIVED' ? undefined : () => handleArchive(notebook)\n }\n deleteLabel={tr('cosmicintersection.pages.notebooks.archive', 'Archive notebook')}\n />\n </div>\n </li>\n ))}\n </ul>\n </>\n )}\n\n {!loading && !error && notebooks.length > 0 ? (\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={notebooks.length}\n hasMore={pageInfo?.hasMore ?? false}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel={tr('cosmicintersection.pages.notebooks.itemLabel', 'notebooks')}\n loading={loading}\n />\n ) : null}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PipelinesPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/pipelines/PipelinesPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PipelinesPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/pipelines/PipelinesPage.tsx"],"names":[],"mappings":"AAmDA,MAAM,CAAC,OAAO,UAAU,aAAa,4CA8UpC"}
|