@burdenoff/microfe-cosmicintersection 2026.525.1 → 2026.704.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/CosmicIntersectionRoot.js +38 -113
- package/dist/cosmicintersection/CosmicIntersectionRoot.js.map +1 -1
- package/dist/cosmicintersection/CosmicIntersectionRoutes.js +102 -44
- package/dist/cosmicintersection/CosmicIntersectionRoutes.js.map +1 -1
- package/dist/cosmicintersection/api/cosmicApi.js +853 -0
- package/dist/cosmicintersection/api/cosmicApi.js.map +1 -0
- package/dist/cosmicintersection/components/ActionMenu.js +106 -0
- package/dist/cosmicintersection/components/ActionMenu.js.map +1 -0
- package/dist/cosmicintersection/components/EmptyState.js +35 -0
- package/dist/cosmicintersection/components/EmptyState.js.map +1 -0
- package/dist/cosmicintersection/components/EntityFormShell.js +57 -0
- package/dist/cosmicintersection/components/EntityFormShell.js.map +1 -0
- package/dist/cosmicintersection/components/EntityTagsField.js +77 -0
- package/dist/cosmicintersection/components/EntityTagsField.js.map +1 -0
- package/dist/cosmicintersection/components/ErrorState.js +40 -0
- package/dist/cosmicintersection/components/ErrorState.js.map +1 -0
- package/dist/cosmicintersection/components/FileUploadField.js +146 -0
- package/dist/cosmicintersection/components/FileUploadField.js.map +1 -0
- package/dist/cosmicintersection/components/LoadingState.js +23 -0
- package/dist/cosmicintersection/components/LoadingState.js.map +1 -0
- package/dist/cosmicintersection/components/PageLayout.js +46 -0
- package/dist/cosmicintersection/components/PageLayout.js.map +1 -0
- package/dist/cosmicintersection/components/Pagination.js +65 -0
- package/dist/cosmicintersection/components/Pagination.js.map +1 -0
- package/dist/cosmicintersection/components/SafeLink.js +35 -0
- package/dist/cosmicintersection/components/SafeLink.js.map +1 -0
- package/dist/cosmicintersection/components/StatusBadge.js +53 -0
- package/dist/cosmicintersection/components/StatusBadge.js.map +1 -0
- package/dist/cosmicintersection/components/index.js +11 -0
- package/dist/cosmicintersection/context/CosmicIntersectionContext.js +46 -0
- package/dist/cosmicintersection/context/CosmicIntersectionContext.js.map +1 -0
- package/dist/cosmicintersection/index.js +0 -2
- package/dist/cosmicintersection/lib/mutationResult.js +12 -0
- package/dist/cosmicintersection/lib/mutationResult.js.map +1 -0
- package/dist/cosmicintersection/lib/toast.js +36 -0
- package/dist/cosmicintersection/lib/toast.js.map +1 -0
- package/dist/cosmicintersection/pages/access/AccessPage.js +340 -0
- package/dist/cosmicintersection/pages/access/AccessPage.js.map +1 -0
- package/dist/cosmicintersection/pages/analyses/AnalysesPage.js +484 -0
- package/dist/cosmicintersection/pages/analyses/AnalysesPage.js.map +1 -0
- package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js +164 -0
- package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/collections/CollectionFormPage.js +117 -0
- package/dist/cosmicintersection/pages/collections/CollectionFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/collections/CollectionsPage.js +103 -0
- package/dist/cosmicintersection/pages/collections/CollectionsPage.js.map +1 -0
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.js +244 -0
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.js.map +1 -0
- package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js +460 -0
- package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/datasets/DatasetFormPage.js +218 -0
- package/dist/cosmicintersection/pages/datasets/DatasetFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/datasets/DatasetsPage.js +252 -0
- package/dist/cosmicintersection/pages/datasets/DatasetsPage.js.map +1 -0
- package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js +393 -0
- package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/notebooks/NotebookFormPage.js +313 -0
- package/dist/cosmicintersection/pages/notebooks/NotebookFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js +203 -0
- package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js.map +1 -0
- package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js +244 -0
- package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js +210 -0
- package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js +193 -0
- package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js.map +1 -0
- package/dist/cosmicintersection/pages/releases/ReleaseFormPage.js +184 -0
- package/dist/cosmicintersection/pages/releases/ReleaseFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/releases/ReleasesPage.js +368 -0
- package/dist/cosmicintersection/pages/releases/ReleasesPage.js.map +1 -0
- package/dist/cosmicintersection/pages/runs/RunDetailPage.js +375 -0
- package/dist/cosmicintersection/pages/runs/RunDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/runs/RunsPage.js +180 -0
- package/dist/cosmicintersection/pages/runs/RunsPage.js.map +1 -0
- package/dist/cosmicintersection/pages/sources/SourceFormPage.js +229 -0
- package/dist/cosmicintersection/pages/sources/SourceFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/sources/SourcesPage.js +217 -0
- package/dist/cosmicintersection/pages/sources/SourcesPage.js.map +1 -0
- package/dist/cosmicintersection/utils/cn.js +10 -0
- package/dist/cosmicintersection/utils/cn.js.map +1 -0
- package/dist/index.js +2 -4
- package/dist/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/package.json +2 -1
- package/dist/cosmicintersection/pages/AiDiscoveryPage.js +0 -363
- package/dist/cosmicintersection/pages/AiDiscoveryPage.js.map +0 -1
- package/dist/cosmicintersection/pages/DashboardPage.js +0 -306
- package/dist/cosmicintersection/pages/DashboardPage.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceCitizenPage.js +0 -287
- package/dist/cosmicintersection/pages/SpaceScienceCitizenPage.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceDataPage.js +0 -385
- package/dist/cosmicintersection/pages/SpaceScienceDataPage.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceDataPage1.js +0 -420
- package/dist/cosmicintersection/pages/SpaceScienceDataPage1.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceLearningPage.js +0 -309
- package/dist/cosmicintersection/pages/SpaceScienceLearningPage.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceLearningPage1.js +0 -361
- package/dist/cosmicintersection/pages/SpaceScienceLearningPage1.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceSciencePage.js +0 -194
- package/dist/cosmicintersection/pages/SpaceSciencePage.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceResearchPage.js +0 -290
- package/dist/cosmicintersection/pages/SpaceScienceResearchPage.js.map +0 -1
- package/dist/cosmicintersection/pages/SpaceScienceSimulationPage.js +0 -279
- package/dist/cosmicintersection/pages/SpaceScienceSimulationPage.js.map +0 -1
- package/dist/cosmicintersection/providers/CosmicIntersectionProvider.js +0 -27
- package/dist/cosmicintersection/providers/CosmicIntersectionProvider.js.map +0 -1
- package/dist/cosmicintersection/store/cosmicintersectionStore.js +0 -478
- package/dist/cosmicintersection/store/cosmicintersectionStore.js.map +0 -1
- package/dist/cosmicintersection/utils/i18n.js +0 -15
- package/dist/cosmicintersection/utils/i18n.js.map +0 -1
- package/dist/cosmicintersection/utils/navigation.js +0 -8
- package/dist/cosmicintersection/utils/navigation.js.map +0 -1
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
|
|
2
|
+
import { notify as t } from "../../lib/toast.js";
|
|
3
|
+
import { useCosCollectionsQuery as n, useCosCreateDatasetMutation as r, useCosDatasetQuery as i, useCosSourcesQuery as a, useCosUpdateDatasetMutation as o } from "../../api/cosmicApi.js";
|
|
4
|
+
import s from "../../components/EntityFormShell.js";
|
|
5
|
+
import c from "../../components/EntityTagsField.js";
|
|
6
|
+
import l from "../../components/FileUploadField.js";
|
|
7
|
+
import u from "../../components/LoadingState.js";
|
|
8
|
+
import { formatEnumLabel as d } from "../../components/StatusBadge.js";
|
|
9
|
+
import "../../components/index.js";
|
|
10
|
+
import { useMemo as f, useState as p } from "react";
|
|
11
|
+
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
12
|
+
import { useParams as g } from "react-router-dom";
|
|
13
|
+
import { Input as _, Label as v, Select as y, SelectContent as b, SelectItem as x, SelectTrigger as S, SelectValue as C, Textarea as w } from "@burdenoff/fe-libs/ui";
|
|
14
|
+
//#region src/cosmicintersection/pages/datasets/DatasetFormPage.tsx
|
|
15
|
+
var T = [
|
|
16
|
+
"PUBLIC",
|
|
17
|
+
"WORKSPACE",
|
|
18
|
+
"RESTRICTED",
|
|
19
|
+
"EMBARGOED"
|
|
20
|
+
], E = "__none__", D = {
|
|
21
|
+
name: "",
|
|
22
|
+
description: "",
|
|
23
|
+
format: "",
|
|
24
|
+
accessLevel: "WORKSPACE",
|
|
25
|
+
sourceId: E,
|
|
26
|
+
collectionId: E,
|
|
27
|
+
tags: [],
|
|
28
|
+
fileId: ""
|
|
29
|
+
};
|
|
30
|
+
function O() {
|
|
31
|
+
let { id: O = "" } = g(), k = f(() => !!O, [O]), { navigate: A } = e(), { data: j, loading: M } = i(O), N = a({ pagination: {
|
|
32
|
+
limit: 100,
|
|
33
|
+
offset: 0
|
|
34
|
+
} }), P = n(), [F, { loading: I }] = r(), [L, { loading: R }] = o(), [z, B] = p(D), [V, H] = p(null);
|
|
35
|
+
if (k && j?.cosDataset && V !== j.cosDataset.id) {
|
|
36
|
+
let e = j.cosDataset;
|
|
37
|
+
H(e.id), B({
|
|
38
|
+
name: e.name ?? "",
|
|
39
|
+
description: e.description ?? "",
|
|
40
|
+
format: e.format ?? "",
|
|
41
|
+
accessLevel: e.accessLevel ?? "WORKSPACE",
|
|
42
|
+
sourceId: e.sourceId ?? E,
|
|
43
|
+
collectionId: e.collectionId ?? E,
|
|
44
|
+
tags: e.tags ?? [],
|
|
45
|
+
fileId: e.file?.id ?? ""
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
let U = (e, t) => {
|
|
49
|
+
B((n) => ({
|
|
50
|
+
...n,
|
|
51
|
+
[e]: t
|
|
52
|
+
}));
|
|
53
|
+
}, W = N.data?.cosListSources?.items ?? [], G = P.data?.cosListCollections ?? [], K = I || R;
|
|
54
|
+
return k && M && !j?.cosDataset ? /* @__PURE__ */ m(u, { label: "Loading dataset…" }) : /* @__PURE__ */ h(s, {
|
|
55
|
+
title: k ? "Edit dataset" : "New dataset",
|
|
56
|
+
description: "Register a federated science dataset with its access level, source and schema.",
|
|
57
|
+
purpose: "Datasets are the core unit of federation — catalog the data once, describe where it comes from and how it can be accessed, then reuse it across pipelines, notebooks and releases.",
|
|
58
|
+
backLabel: "Back to datasets",
|
|
59
|
+
onBack: () => A(k ? `datasets/${O}` : "datasets"),
|
|
60
|
+
onSubmit: async (e) => {
|
|
61
|
+
if (e.preventDefault(), !z.name.trim()) {
|
|
62
|
+
t.error("Name is required");
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (k) {
|
|
66
|
+
(await L({ variables: {
|
|
67
|
+
id: O,
|
|
68
|
+
input: {
|
|
69
|
+
name: z.name.trim(),
|
|
70
|
+
description: z.description.trim() || void 0,
|
|
71
|
+
format: z.format.trim() || void 0,
|
|
72
|
+
accessLevel: z.accessLevel,
|
|
73
|
+
collectionId: z.collectionId === E ? void 0 : z.collectionId,
|
|
74
|
+
tags: z.tags
|
|
75
|
+
}
|
|
76
|
+
} })).data?.cosUpdateDataset && (t.success("Dataset updated"), A(`datasets/${O}`));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
let n = (await F({ variables: { input: {
|
|
80
|
+
name: z.name.trim(),
|
|
81
|
+
description: z.description.trim() || void 0,
|
|
82
|
+
format: z.format.trim() || void 0,
|
|
83
|
+
accessLevel: z.accessLevel,
|
|
84
|
+
sourceId: z.sourceId === E ? void 0 : z.sourceId,
|
|
85
|
+
collectionId: z.collectionId === E ? void 0 : z.collectionId,
|
|
86
|
+
tags: z.tags,
|
|
87
|
+
fileId: z.fileId || void 0
|
|
88
|
+
} } })).data?.cosCreateDataset?.id;
|
|
89
|
+
n && (t.success("Dataset created"), A(`datasets/${n}`));
|
|
90
|
+
},
|
|
91
|
+
submitLabel: k ? "Save dataset" : "Create dataset",
|
|
92
|
+
saving: K,
|
|
93
|
+
submitDisabled: !z.name.trim(),
|
|
94
|
+
children: [
|
|
95
|
+
/* @__PURE__ */ h("div", {
|
|
96
|
+
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
97
|
+
children: [
|
|
98
|
+
/* @__PURE__ */ h("div", {
|
|
99
|
+
className: "space-y-1.5 md:col-span-2",
|
|
100
|
+
children: [/* @__PURE__ */ m(v, {
|
|
101
|
+
htmlFor: "cos-ds-name",
|
|
102
|
+
children: "Name"
|
|
103
|
+
}), /* @__PURE__ */ m(_, {
|
|
104
|
+
id: "cos-ds-name",
|
|
105
|
+
value: z.name,
|
|
106
|
+
onChange: (e) => U("name", e.target.value),
|
|
107
|
+
placeholder: "e.g. Kepler DR3 light curves",
|
|
108
|
+
required: !0
|
|
109
|
+
})]
|
|
110
|
+
}),
|
|
111
|
+
/* @__PURE__ */ h("div", {
|
|
112
|
+
className: "space-y-1.5 md:col-span-2",
|
|
113
|
+
children: [/* @__PURE__ */ m(v, {
|
|
114
|
+
htmlFor: "cos-ds-desc",
|
|
115
|
+
children: "Description"
|
|
116
|
+
}), /* @__PURE__ */ m(w, {
|
|
117
|
+
id: "cos-ds-desc",
|
|
118
|
+
value: z.description,
|
|
119
|
+
onChange: (e) => U("description", e.target.value),
|
|
120
|
+
rows: 3,
|
|
121
|
+
placeholder: "What this dataset contains and how it was produced."
|
|
122
|
+
})]
|
|
123
|
+
}),
|
|
124
|
+
/* @__PURE__ */ h("div", {
|
|
125
|
+
className: "space-y-1.5",
|
|
126
|
+
children: [/* @__PURE__ */ m(v, {
|
|
127
|
+
htmlFor: "cos-ds-format",
|
|
128
|
+
children: "Format"
|
|
129
|
+
}), /* @__PURE__ */ m(_, {
|
|
130
|
+
id: "cos-ds-format",
|
|
131
|
+
value: z.format,
|
|
132
|
+
onChange: (e) => U("format", e.target.value),
|
|
133
|
+
placeholder: "e.g. FITS, Parquet, CSV"
|
|
134
|
+
})]
|
|
135
|
+
}),
|
|
136
|
+
/* @__PURE__ */ h("div", {
|
|
137
|
+
className: "space-y-1.5",
|
|
138
|
+
children: [/* @__PURE__ */ m(v, {
|
|
139
|
+
htmlFor: "cos-ds-access",
|
|
140
|
+
children: "Access level"
|
|
141
|
+
}), /* @__PURE__ */ h(y, {
|
|
142
|
+
value: z.accessLevel,
|
|
143
|
+
onValueChange: (e) => U("accessLevel", e),
|
|
144
|
+
children: [/* @__PURE__ */ m(S, {
|
|
145
|
+
id: "cos-ds-access",
|
|
146
|
+
"aria-label": "Access level",
|
|
147
|
+
children: /* @__PURE__ */ m(C, {})
|
|
148
|
+
}), /* @__PURE__ */ m(b, { children: T.map((e) => /* @__PURE__ */ m(x, {
|
|
149
|
+
value: e,
|
|
150
|
+
children: d(e)
|
|
151
|
+
}, e)) })]
|
|
152
|
+
})]
|
|
153
|
+
}),
|
|
154
|
+
k ? null : /* @__PURE__ */ h("div", {
|
|
155
|
+
className: "space-y-1.5",
|
|
156
|
+
children: [/* @__PURE__ */ m(v, {
|
|
157
|
+
htmlFor: "cos-ds-source",
|
|
158
|
+
children: "Source"
|
|
159
|
+
}), /* @__PURE__ */ h(y, {
|
|
160
|
+
value: z.sourceId,
|
|
161
|
+
onValueChange: (e) => U("sourceId", e),
|
|
162
|
+
children: [/* @__PURE__ */ m(S, {
|
|
163
|
+
id: "cos-ds-source",
|
|
164
|
+
"aria-label": "Source",
|
|
165
|
+
children: /* @__PURE__ */ m(C, {})
|
|
166
|
+
}), /* @__PURE__ */ h(b, { children: [/* @__PURE__ */ m(x, {
|
|
167
|
+
value: E,
|
|
168
|
+
children: "No source"
|
|
169
|
+
}), W.map((e) => /* @__PURE__ */ m(x, {
|
|
170
|
+
value: e.id,
|
|
171
|
+
children: e.name
|
|
172
|
+
}, e.id))] })]
|
|
173
|
+
})]
|
|
174
|
+
}),
|
|
175
|
+
/* @__PURE__ */ h("div", {
|
|
176
|
+
className: "space-y-1.5",
|
|
177
|
+
children: [/* @__PURE__ */ m(v, {
|
|
178
|
+
htmlFor: "cos-ds-collection",
|
|
179
|
+
children: "Collection"
|
|
180
|
+
}), /* @__PURE__ */ h(y, {
|
|
181
|
+
value: z.collectionId,
|
|
182
|
+
onValueChange: (e) => U("collectionId", e),
|
|
183
|
+
children: [/* @__PURE__ */ m(S, {
|
|
184
|
+
id: "cos-ds-collection",
|
|
185
|
+
"aria-label": "Collection",
|
|
186
|
+
children: /* @__PURE__ */ m(C, {})
|
|
187
|
+
}), /* @__PURE__ */ h(b, { children: [/* @__PURE__ */ m(x, {
|
|
188
|
+
value: E,
|
|
189
|
+
children: "No collection"
|
|
190
|
+
}), G.map((e) => /* @__PURE__ */ m(x, {
|
|
191
|
+
value: e.id,
|
|
192
|
+
children: e.name
|
|
193
|
+
}, e.id))] })]
|
|
194
|
+
})]
|
|
195
|
+
})
|
|
196
|
+
]
|
|
197
|
+
}),
|
|
198
|
+
/* @__PURE__ */ m(c, {
|
|
199
|
+
value: z.tags,
|
|
200
|
+
onChange: (e) => U("tags", e),
|
|
201
|
+
label: "Tags"
|
|
202
|
+
}),
|
|
203
|
+
k ? null : /* @__PURE__ */ h("div", {
|
|
204
|
+
className: "space-y-1.5",
|
|
205
|
+
children: [/* @__PURE__ */ m(v, { children: "Data file" }), /* @__PURE__ */ m(l, {
|
|
206
|
+
value: z.fileId,
|
|
207
|
+
onChange: (e) => U("fileId", e),
|
|
208
|
+
label: "Upload data file",
|
|
209
|
+
hint: "Optional — attach the dataset blob (stored in workspace files)."
|
|
210
|
+
})]
|
|
211
|
+
})
|
|
212
|
+
]
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
//#endregion
|
|
216
|
+
export { O as default };
|
|
217
|
+
|
|
218
|
+
//# sourceMappingURL=DatasetFormPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatasetFormPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/datasets/DatasetFormPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\n\nimport {\n useCosCollectionsQuery,\n useCosCreateDatasetMutation,\n useCosDatasetQuery,\n useCosSourcesQuery,\n useCosUpdateDatasetMutation,\n type CosAccessLevel,\n type CosCreateDatasetInput,\n type CosUpdateDatasetInput,\n} from '../../api/cosmicApi';\nimport {\n EntityFormShell,\n FileUploadField,\n EntityTagsField,\n LoadingState,\n formatEnumLabel,\n} from '../../components';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\nimport { notify } from '../../lib/toast';\n\nconst ACCESS_LEVELS: CosAccessLevel[] = ['PUBLIC', 'WORKSPACE', 'RESTRICTED', 'EMBARGOED'];\n\nconst NONE = '__none__';\n\ninterface DatasetFormState {\n name: string;\n description: string;\n format: string;\n accessLevel: CosAccessLevel;\n sourceId: string;\n collectionId: string;\n tags: string[];\n fileId: string;\n}\n\nconst initialState: DatasetFormState = {\n name: '',\n description: '',\n format: '',\n accessLevel: 'WORKSPACE',\n sourceId: NONE,\n collectionId: NONE,\n tags: [],\n fileId: '',\n};\n\nexport default function DatasetFormPage() {\n const { id = '' } = useParams<{ id: string }>();\n const isEdit = useMemo(() => Boolean(id), [id]);\n const { navigate } = useCosmicIntersection();\n\n const { data, loading: loadingDataset } = useCosDatasetQuery(id);\n const sourcesQuery = useCosSourcesQuery({ pagination: { limit: 100, offset: 0 } });\n const collectionsQuery = useCosCollectionsQuery();\n\n const [createDataset, { loading: creating }] = useCosCreateDatasetMutation();\n const [updateDataset, { loading: updating }] = useCosUpdateDatasetMutation();\n\n const [form, setForm] = useState<DatasetFormState>(initialState);\n\n // Hydrate the form once the dataset loads in edit mode. Derive-state-during-\n // render (keyed on the loaded id) rather than an effect, per platform lint.\n const [loadedId, setLoadedId] = useState<string | null>(null);\n if (isEdit && data?.cosDataset && loadedId !== data.cosDataset.id) {\n const ds = data.cosDataset;\n setLoadedId(ds.id);\n setForm({\n name: ds.name ?? '',\n description: ds.description ?? '',\n format: ds.format ?? '',\n accessLevel: ds.accessLevel ?? 'WORKSPACE',\n sourceId: ds.sourceId ?? NONE,\n collectionId: ds.collectionId ?? NONE,\n tags: ds.tags ?? [],\n fileId: ds.file?.id ?? '',\n });\n }\n\n const setField = <K extends keyof DatasetFormState>(field: K, value: DatasetFormState[K]) => {\n setForm((prev) => ({ ...prev, [field]: value }));\n };\n\n const sources = sourcesQuery.data?.cosListSources?.items ?? [];\n const collections = collectionsQuery.data?.cosListCollections ?? [];\n const isSaving = creating || updating;\n\n const onSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (!form.name.trim()) {\n notify.error('Name is required');\n return;\n }\n\n if (isEdit) {\n // CosUpdateDatasetInput does not accept sourceId/fileId — those are set at\n // creation time and are read-only afterwards.\n const input: CosUpdateDatasetInput = {\n name: form.name.trim(),\n description: form.description.trim() || undefined,\n format: form.format.trim() || undefined,\n accessLevel: form.accessLevel,\n collectionId: form.collectionId === NONE ? undefined : form.collectionId,\n tags: form.tags,\n };\n const response = await updateDataset({ variables: { id, input } });\n if (response.data?.cosUpdateDataset) {\n notify.success('Dataset updated');\n navigate(`datasets/${id}`);\n }\n return;\n }\n\n const input: CosCreateDatasetInput = {\n name: form.name.trim(),\n description: form.description.trim() || undefined,\n format: form.format.trim() || undefined,\n accessLevel: form.accessLevel,\n sourceId: form.sourceId === NONE ? undefined : form.sourceId,\n collectionId: form.collectionId === NONE ? undefined : form.collectionId,\n tags: form.tags,\n fileId: form.fileId || undefined,\n };\n const response = await createDataset({ variables: { input } });\n const createdId = response.data?.cosCreateDataset?.id;\n if (createdId) {\n notify.success('Dataset created');\n navigate(`datasets/${createdId}`);\n }\n };\n\n if (isEdit && loadingDataset && !data?.cosDataset) {\n return <LoadingState label=\"Loading dataset…\" />;\n }\n\n return (\n <EntityFormShell\n title={isEdit ? 'Edit dataset' : 'New dataset'}\n description=\"Register a federated science dataset with its access level, source and schema.\"\n purpose=\"Datasets are the core unit of federation — catalog the data once, describe where it comes from and how it can be accessed, then reuse it across pipelines, notebooks and releases.\"\n backLabel=\"Back to datasets\"\n onBack={() => navigate(isEdit ? `datasets/${id}` : 'datasets')}\n onSubmit={onSubmit}\n submitLabel={isEdit ? 'Save dataset' : 'Create dataset'}\n saving={isSaving}\n submitDisabled={!form.name.trim()}\n >\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <div className=\"space-y-1.5 md:col-span-2\">\n <Label htmlFor=\"cos-ds-name\">Name</Label>\n <Input\n id=\"cos-ds-name\"\n value={form.name}\n onChange={(event) => setField('name', event.target.value)}\n placeholder=\"e.g. Kepler DR3 light curves\"\n required\n />\n </div>\n\n <div className=\"space-y-1.5 md:col-span-2\">\n <Label htmlFor=\"cos-ds-desc\">Description</Label>\n <Textarea\n id=\"cos-ds-desc\"\n value={form.description}\n onChange={(event) => setField('description', event.target.value)}\n rows={3}\n placeholder=\"What this dataset contains and how it was produced.\"\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"cos-ds-format\">Format</Label>\n <Input\n id=\"cos-ds-format\"\n value={form.format}\n onChange={(event) => setField('format', event.target.value)}\n placeholder=\"e.g. FITS, Parquet, CSV\"\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"cos-ds-access\">Access level</Label>\n <Select\n value={form.accessLevel}\n onValueChange={(value) => setField('accessLevel', value as CosAccessLevel)}\n >\n <SelectTrigger id=\"cos-ds-access\" aria-label=\"Access level\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ACCESS_LEVELS.map((level) => (\n <SelectItem key={level} value={level}>\n {formatEnumLabel(level)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {!isEdit ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"cos-ds-source\">Source</Label>\n <Select value={form.sourceId} onValueChange={(value) => setField('sourceId', value)}>\n <SelectTrigger id=\"cos-ds-source\" aria-label=\"Source\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NONE}>No source</SelectItem>\n {sources.map((source) => (\n <SelectItem key={source.id} value={source.id}>\n {source.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"cos-ds-collection\">Collection</Label>\n <Select\n value={form.collectionId}\n onValueChange={(value) => setField('collectionId', value)}\n >\n <SelectTrigger id=\"cos-ds-collection\" aria-label=\"Collection\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NONE}>No collection</SelectItem>\n {collections.map((collection) => (\n <SelectItem key={collection.id} value={collection.id}>\n {collection.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <EntityTagsField value={form.tags} onChange={(tags) => setField('tags', tags)} label=\"Tags\" />\n\n {!isEdit ? (\n <div className=\"space-y-1.5\">\n <Label>Data file</Label>\n <FileUploadField\n value={form.fileId}\n onChange={(fileId) => setField('fileId', fileId)}\n label=\"Upload data file\"\n hint=\"Optional — attach the dataset blob (stored in workspace files).\"\n />\n </div>\n ) : null}\n </EntityFormShell>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAiCA,IAAM,IAAkC;CAAC;CAAU;CAAa;CAAc;CAAY,EAEpF,IAAO,YAaP,IAAiC;CACrC,MAAM;CACN,aAAa;CACb,QAAQ;CACR,aAAa;CACb,UAAU;CACV,cAAc;CACd,MAAM,EAAE;CACR,QAAQ;CACT;AAED,SAAwB,IAAkB;CACxC,IAAM,EAAE,QAAK,OAAO,GAA2B,EACzC,IAAS,QAAc,EAAQ,GAAK,CAAC,EAAG,CAAC,EACzC,EAAE,gBAAa,GAAuB,EAEtC,EAAE,SAAM,SAAS,MAAmB,EAAmB,EAAG,EAC1D,IAAe,EAAmB,EAAE,YAAY;EAAE,OAAO;EAAK,QAAQ;EAAG,EAAE,CAAC,EAC5E,IAAmB,GAAwB,EAE3C,CAAC,GAAe,EAAE,SAAS,OAAc,GAA6B,EACtE,CAAC,GAAe,EAAE,SAAS,OAAc,GAA6B,EAEtE,CAAC,GAAM,KAAW,EAA2B,EAAa,EAI1D,CAAC,GAAU,KAAe,EAAwB,KAAK;AAC7D,KAAI,KAAU,GAAM,cAAc,MAAa,EAAK,WAAW,IAAI;EACjE,IAAM,IAAK,EAAK;AAEhB,EADA,EAAY,EAAG,GAAG,EAClB,EAAQ;GACN,MAAM,EAAG,QAAQ;GACjB,aAAa,EAAG,eAAe;GAC/B,QAAQ,EAAG,UAAU;GACrB,aAAa,EAAG,eAAe;GAC/B,UAAU,EAAG,YAAY;GACzB,cAAc,EAAG,gBAAgB;GACjC,MAAM,EAAG,QAAQ,EAAE;GACnB,QAAQ,EAAG,MAAM,MAAM;GACxB,CAAC;;CAGJ,IAAM,KAA8C,GAAU,MAA+B;AAC3F,KAAS,OAAU;GAAE,GAAG;IAAO,IAAQ;GAAO,EAAE;IAG5C,IAAU,EAAa,MAAM,gBAAgB,SAAS,EAAE,EACxD,IAAc,EAAiB,MAAM,sBAAsB,EAAE,EAC7D,IAAW,KAAY;AAkD7B,QAJI,KAAU,KAAkB,CAAC,GAAM,aAC9B,kBAAC,GAAD,EAAc,OAAM,oBAAqB,CAAA,GAIhD,kBAAC,GAAD;EACE,OAAO,IAAS,iBAAiB;EACjC,aAAY;EACZ,SAAQ;EACR,WAAU;EACV,cAAc,EAAS,IAAS,YAAY,MAAO,WAAW;EACpD,UAvDG,OAAO,MAA4C;AAElE,OADA,EAAM,gBAAgB,EAClB,CAAC,EAAK,KAAK,MAAM,EAAE;AACrB,MAAO,MAAM,mBAAmB;AAChC;;AAGF,OAAI,GAAQ;AAYV,KADiB,MAAM,EAAc,EAAE,WAAW;KAAE;KAAI,OARnB;MACnC,MAAM,EAAK,KAAK,MAAM;MACtB,aAAa,EAAK,YAAY,MAAM,IAAI,KAAA;MACxC,QAAQ,EAAK,OAAO,MAAM,IAAI,KAAA;MAC9B,aAAa,EAAK;MAClB,cAAc,EAAK,iBAAiB,IAAO,KAAA,IAAY,EAAK;MAC5D,MAAM,EAAK;MACZ;KAC8D,EAAE,CAAC,EACrD,MAAM,qBACjB,EAAO,QAAQ,kBAAkB,EACjC,EAAS,YAAY,IAAK;AAE5B;;GAcF,IAAM,KADW,MAAM,EAAc,EAAE,WAAW,EAAE,OAVf;IACnC,MAAM,EAAK,KAAK,MAAM;IACtB,aAAa,EAAK,YAAY,MAAM,IAAI,KAAA;IACxC,QAAQ,EAAK,OAAO,MAAM,IAAI,KAAA;IAC9B,aAAa,EAAK;IAClB,UAAU,EAAK,aAAa,IAAO,KAAA,IAAY,EAAK;IACpD,cAAc,EAAK,iBAAiB,IAAO,KAAA,IAAY,EAAK;IAC5D,MAAM,EAAK;IACX,QAAQ,EAAK,UAAU,KAAA;IACxB,EAC0D,EAAE,CAAC,EACnC,MAAM,kBAAkB;AACnD,GAAI,MACF,EAAO,QAAQ,kBAAkB,EACjC,EAAS,YAAY,IAAY;;EAgBjC,aAAa,IAAS,iBAAiB;EACvC,QAAQ;EACR,gBAAgB,CAAC,EAAK,KAAK,MAAM;YATnC;GAWE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAO,SAAQ;iBAAc;OAAY,CAAA,EACzC,kBAAC,GAAD;OACE,IAAG;OACH,OAAO,EAAK;OACZ,WAAW,MAAU,EAAS,QAAQ,EAAM,OAAO,MAAM;OACzD,aAAY;OACZ,UAAA;OACA,CAAA,CACE;;KAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAO,SAAQ;iBAAc;OAAmB,CAAA,EAChD,kBAAC,GAAD;OACE,IAAG;OACH,OAAO,EAAK;OACZ,WAAW,MAAU,EAAS,eAAe,EAAM,OAAO,MAAM;OAChE,MAAM;OACN,aAAY;OACZ,CAAA,CACE;;KAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAO,SAAQ;iBAAgB;OAAc,CAAA,EAC7C,kBAAC,GAAD;OACE,IAAG;OACH,OAAO,EAAK;OACZ,WAAW,MAAU,EAAS,UAAU,EAAM,OAAO,MAAM;OAC3D,aAAY;OACZ,CAAA,CACE;;KAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAO,SAAQ;iBAAgB;OAAoB,CAAA,EACnD,kBAAC,GAAD;OACE,OAAO,EAAK;OACZ,gBAAgB,MAAU,EAAS,eAAe,EAAwB;iBAF5E,CAIE,kBAAC,GAAD;QAAe,IAAG;QAAgB,cAAW;kBAC3C,kBAAC,GAAD,EAAe,CAAA;QACD,CAAA,EAChB,kBAAC,GAAD,EAAA,UACG,EAAc,KAAK,MAClB,kBAAC,GAAD;QAAwB,OAAO;kBAC5B,EAAgB,EAAM;QACZ,EAFI,EAEJ,CACb,EACY,CAAA,CACT;SACL;;KAEJ,IAiBE,OAhBF,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAO,SAAQ;iBAAgB;OAAc,CAAA,EAC7C,kBAAC,GAAD;OAAQ,OAAO,EAAK;OAAU,gBAAgB,MAAU,EAAS,YAAY,EAAM;iBAAnF,CACE,kBAAC,GAAD;QAAe,IAAG;QAAgB,cAAW;kBAC3C,kBAAC,GAAD,EAAe,CAAA;QACD,CAAA,EAChB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;QAAY,OAAO;kBAAM;QAAsB,CAAA,EAC9C,EAAQ,KAAK,MACZ,kBAAC,GAAD;QAA4B,OAAO,EAAO;kBACvC,EAAO;QACG,EAFI,EAAO,GAEX,CACb,CACY,EAAA,CAAA,CACT;SACL;;KAGR,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAO,SAAQ;iBAAoB;OAAkB,CAAA,EACrD,kBAAC,GAAD;OACE,OAAO,EAAK;OACZ,gBAAgB,MAAU,EAAS,gBAAgB,EAAM;iBAF3D,CAIE,kBAAC,GAAD;QAAe,IAAG;QAAoB,cAAW;kBAC/C,kBAAC,GAAD,EAAe,CAAA;QACD,CAAA,EAChB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;QAAY,OAAO;kBAAM;QAA0B,CAAA,EAClD,EAAY,KAAK,MAChB,kBAAC,GAAD;QAAgC,OAAO,EAAW;kBAC/C,EAAW;QACD,EAFI,EAAW,GAEf,CACb,CACY,EAAA,CAAA,CACT;SACL;;KACF;;GAEN,kBAAC,GAAD;IAAiB,OAAO,EAAK;IAAM,WAAW,MAAS,EAAS,QAAQ,EAAK;IAAE,OAAM;IAAS,CAAA;GAE5F,IAUE,OATF,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAA,UAAO,aAAiB,CAAA,EACxB,kBAAC,GAAD;KACE,OAAO,EAAK;KACZ,WAAW,MAAW,EAAS,UAAU,EAAO;KAChD,OAAM;KACN,MAAK;KACL,CAAA,CACE;;GAEQ"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
|
|
2
|
+
import { notify as t } from "../../lib/toast.js";
|
|
3
|
+
import { useCosArchiveDatasetMutation as n, useCosCollectionsQuery as r, useCosDatasetsQuery as i, useCosPublishDatasetMutation as a, useCosSourcesQuery as o } from "../../api/cosmicApi.js";
|
|
4
|
+
import s from "../../components/ActionMenu.js";
|
|
5
|
+
import c from "../../components/EmptyState.js";
|
|
6
|
+
import ee from "../../components/ErrorState.js";
|
|
7
|
+
import l from "../../components/LoadingState.js";
|
|
8
|
+
import u from "../../components/PageLayout.js";
|
|
9
|
+
import d, { usePagination as f } from "../../components/Pagination.js";
|
|
10
|
+
import p, { formatEnumLabel as m } from "../../components/StatusBadge.js";
|
|
11
|
+
import "../../components/index.js";
|
|
12
|
+
import { useMemo as h, useState as g } from "react";
|
|
13
|
+
import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
14
|
+
import { Database as b, Plus as x } from "lucide-react";
|
|
15
|
+
import { Badge as S, Button as C, Select as w, SelectContent as T, SelectItem as E, SelectTrigger as D, SelectValue as O, Table as k, TableBody as te, TableCell as A, TableHead as j, TableHeader as M, TableRow as N } from "@burdenoff/fe-libs/ui";
|
|
16
|
+
//#region src/cosmicintersection/pages/datasets/DatasetsPage.tsx
|
|
17
|
+
var P = [
|
|
18
|
+
"DRAFT",
|
|
19
|
+
"INGESTING",
|
|
20
|
+
"AVAILABLE",
|
|
21
|
+
"DEPRECATED",
|
|
22
|
+
"ARCHIVED"
|
|
23
|
+
], F = "__all__";
|
|
24
|
+
function I(e) {
|
|
25
|
+
if (!e) return "—";
|
|
26
|
+
let t = Number(e);
|
|
27
|
+
if (!Number.isFinite(t) || t <= 0) return "—";
|
|
28
|
+
let n = [
|
|
29
|
+
"B",
|
|
30
|
+
"KB",
|
|
31
|
+
"MB",
|
|
32
|
+
"GB",
|
|
33
|
+
"TB",
|
|
34
|
+
"PB"
|
|
35
|
+
], r = t, i = 0;
|
|
36
|
+
for (; r >= 1024 && i < n.length - 1;) r /= 1024, i += 1;
|
|
37
|
+
return `${r >= 10 || i === 0 ? Math.round(r) : r.toFixed(1)} ${n[i]}`;
|
|
38
|
+
}
|
|
39
|
+
function L(e) {
|
|
40
|
+
if (!e) return "—";
|
|
41
|
+
let t = new Date(e);
|
|
42
|
+
return Number.isNaN(t.getTime()) ? "—" : t.toLocaleDateString();
|
|
43
|
+
}
|
|
44
|
+
function R() {
|
|
45
|
+
let { navigate: R } = e(), [z, B] = g(F), [V, H] = g(F), [U, W] = g(F), G = f({
|
|
46
|
+
pageSize: 20,
|
|
47
|
+
resetKey: `${z}|${V}|${U}`
|
|
48
|
+
}), { data: K, loading: q, error: J, refetch: Y } = i({
|
|
49
|
+
status: z === F ? void 0 : z,
|
|
50
|
+
sourceId: V === F ? void 0 : V,
|
|
51
|
+
collectionId: U === F ? void 0 : U,
|
|
52
|
+
pagination: {
|
|
53
|
+
limit: G.limit,
|
|
54
|
+
offset: G.offset
|
|
55
|
+
}
|
|
56
|
+
}), X = o({ pagination: {
|
|
57
|
+
limit: 100,
|
|
58
|
+
offset: 0
|
|
59
|
+
} }), Z = r(), [ne] = a(), [re] = n(), Q = h(() => K?.cosListDatasets?.items ?? [], [K]), ie = K?.cosListDatasets?.pageInfo, ae = X.data?.cosListSources?.items ?? [], oe = Z.data?.cosListCollections ?? [], $ = z === F && V === F && U === F, se = async (e) => {
|
|
60
|
+
(await ne({ variables: { id: e.id } })).data?.cosPublishDataset && (t.success("Dataset published", `“${e.name}” is now available.`), await Y());
|
|
61
|
+
}, ce = async (e) => {
|
|
62
|
+
let n = await re({ variables: { id: e.id } });
|
|
63
|
+
if (n.error) throw Error(n.error.message);
|
|
64
|
+
if (!n.data?.cosArchiveDataset) throw t.error("Could not archive dataset", "The server did not confirm the change."), Error("Archive not confirmed");
|
|
65
|
+
t.success("Dataset archived"), await Y();
|
|
66
|
+
};
|
|
67
|
+
return /* @__PURE__ */ v(u, {
|
|
68
|
+
title: "Datasets",
|
|
69
|
+
description: "Federated science datasets — catalog, schema, lineage and access, all from live data.",
|
|
70
|
+
actions: /* @__PURE__ */ y(C, {
|
|
71
|
+
type: "button",
|
|
72
|
+
onClick: () => R("datasets/create"),
|
|
73
|
+
children: [/* @__PURE__ */ v(x, { className: "size-4" }), "New dataset"]
|
|
74
|
+
}),
|
|
75
|
+
children: /* @__PURE__ */ y("div", {
|
|
76
|
+
className: "space-y-4",
|
|
77
|
+
children: [/* @__PURE__ */ y("div", {
|
|
78
|
+
className: "flex flex-wrap items-end gap-3",
|
|
79
|
+
children: [
|
|
80
|
+
/* @__PURE__ */ y("label", {
|
|
81
|
+
className: "space-y-1 text-sm",
|
|
82
|
+
children: [/* @__PURE__ */ v("span", {
|
|
83
|
+
className: "block font-medium text-text-primary",
|
|
84
|
+
children: "Status"
|
|
85
|
+
}), /* @__PURE__ */ y(w, {
|
|
86
|
+
value: z,
|
|
87
|
+
onValueChange: B,
|
|
88
|
+
children: [/* @__PURE__ */ v(D, {
|
|
89
|
+
"aria-label": "Filter by status",
|
|
90
|
+
className: "w-44",
|
|
91
|
+
children: /* @__PURE__ */ v(O, {})
|
|
92
|
+
}), /* @__PURE__ */ y(T, { children: [/* @__PURE__ */ v(E, {
|
|
93
|
+
value: F,
|
|
94
|
+
children: "All statuses"
|
|
95
|
+
}), P.map((e) => /* @__PURE__ */ v(E, {
|
|
96
|
+
value: e,
|
|
97
|
+
children: m(e)
|
|
98
|
+
}, e))] })]
|
|
99
|
+
})]
|
|
100
|
+
}),
|
|
101
|
+
/* @__PURE__ */ y("label", {
|
|
102
|
+
className: "space-y-1 text-sm",
|
|
103
|
+
children: [/* @__PURE__ */ v("span", {
|
|
104
|
+
className: "block font-medium text-text-primary",
|
|
105
|
+
children: "Source"
|
|
106
|
+
}), /* @__PURE__ */ y(w, {
|
|
107
|
+
value: V,
|
|
108
|
+
onValueChange: H,
|
|
109
|
+
children: [/* @__PURE__ */ v(D, {
|
|
110
|
+
"aria-label": "Filter by source",
|
|
111
|
+
className: "w-48",
|
|
112
|
+
children: /* @__PURE__ */ v(O, {})
|
|
113
|
+
}), /* @__PURE__ */ y(T, { children: [/* @__PURE__ */ v(E, {
|
|
114
|
+
value: F,
|
|
115
|
+
children: "All sources"
|
|
116
|
+
}), ae.map((e) => /* @__PURE__ */ v(E, {
|
|
117
|
+
value: e.id,
|
|
118
|
+
children: e.name
|
|
119
|
+
}, e.id))] })]
|
|
120
|
+
})]
|
|
121
|
+
}),
|
|
122
|
+
/* @__PURE__ */ y("label", {
|
|
123
|
+
className: "space-y-1 text-sm",
|
|
124
|
+
children: [/* @__PURE__ */ v("span", {
|
|
125
|
+
className: "block font-medium text-text-primary",
|
|
126
|
+
children: "Collection"
|
|
127
|
+
}), /* @__PURE__ */ y(w, {
|
|
128
|
+
value: U,
|
|
129
|
+
onValueChange: W,
|
|
130
|
+
children: [/* @__PURE__ */ v(D, {
|
|
131
|
+
"aria-label": "Filter by collection",
|
|
132
|
+
className: "w-48",
|
|
133
|
+
children: /* @__PURE__ */ v(O, {})
|
|
134
|
+
}), /* @__PURE__ */ y(T, { children: [/* @__PURE__ */ v(E, {
|
|
135
|
+
value: F,
|
|
136
|
+
children: "All collections"
|
|
137
|
+
}), oe.map((e) => /* @__PURE__ */ v(E, {
|
|
138
|
+
value: e.id,
|
|
139
|
+
children: e.name
|
|
140
|
+
}, e.id))] })]
|
|
141
|
+
})]
|
|
142
|
+
})
|
|
143
|
+
]
|
|
144
|
+
}), q ? /* @__PURE__ */ v(l, {
|
|
145
|
+
variant: "rows",
|
|
146
|
+
rows: 6,
|
|
147
|
+
label: "Loading datasets…"
|
|
148
|
+
}) : J ? /* @__PURE__ */ v(ee, {
|
|
149
|
+
message: "We could not load datasets. Please try again.",
|
|
150
|
+
onRetry: () => void Y()
|
|
151
|
+
}) : Q.length === 0 ? /* @__PURE__ */ v(c, {
|
|
152
|
+
icon: b,
|
|
153
|
+
title: $ ? "No datasets yet." : "No datasets match these filters.",
|
|
154
|
+
description: $ ? "Register your first dataset to start federating science data across sources." : "Try a different status, source or collection.",
|
|
155
|
+
action: $ ? /* @__PURE__ */ y(C, {
|
|
156
|
+
type: "button",
|
|
157
|
+
onClick: () => R("datasets/create"),
|
|
158
|
+
children: [/* @__PURE__ */ v(x, { className: "size-4" }), "New dataset"]
|
|
159
|
+
}) : void 0
|
|
160
|
+
}) : /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v("div", {
|
|
161
|
+
className: "rounded-card border border-border-default bg-bg-elevated",
|
|
162
|
+
children: /* @__PURE__ */ y(k, { children: [/* @__PURE__ */ v(M, { children: /* @__PURE__ */ y(N, { children: [
|
|
163
|
+
/* @__PURE__ */ v(j, { children: "Name" }),
|
|
164
|
+
/* @__PURE__ */ v(j, { children: "Status" }),
|
|
165
|
+
/* @__PURE__ */ v(j, { children: "Access" }),
|
|
166
|
+
/* @__PURE__ */ v(j, { children: "Format" }),
|
|
167
|
+
/* @__PURE__ */ v(j, {
|
|
168
|
+
className: "text-right",
|
|
169
|
+
children: "Size"
|
|
170
|
+
}),
|
|
171
|
+
/* @__PURE__ */ v(j, { children: "Tags" }),
|
|
172
|
+
/* @__PURE__ */ v(j, { children: "Updated" }),
|
|
173
|
+
/* @__PURE__ */ v(j, {
|
|
174
|
+
className: "text-right",
|
|
175
|
+
children: "Actions"
|
|
176
|
+
})
|
|
177
|
+
] }) }), /* @__PURE__ */ v(te, { children: Q.map((e) => /* @__PURE__ */ y(N, {
|
|
178
|
+
className: "cursor-pointer",
|
|
179
|
+
onClick: () => R(`datasets/${e.id}`),
|
|
180
|
+
children: [
|
|
181
|
+
/* @__PURE__ */ y(A, { children: [/* @__PURE__ */ v("span", {
|
|
182
|
+
className: "font-medium text-text-primary",
|
|
183
|
+
children: e.name
|
|
184
|
+
}), e.description ? /* @__PURE__ */ v("p", {
|
|
185
|
+
className: "mt-0.5 line-clamp-1 max-w-xs text-xs text-text-secondary",
|
|
186
|
+
children: e.description
|
|
187
|
+
}) : null] }),
|
|
188
|
+
/* @__PURE__ */ v(A, { children: /* @__PURE__ */ v(p, { status: e.status }) }),
|
|
189
|
+
/* @__PURE__ */ v(A, { children: /* @__PURE__ */ v("span", {
|
|
190
|
+
className: "text-sm text-text-secondary",
|
|
191
|
+
children: m(e.accessLevel)
|
|
192
|
+
}) }),
|
|
193
|
+
/* @__PURE__ */ v(A, { children: /* @__PURE__ */ v("span", {
|
|
194
|
+
className: "text-sm text-text-secondary",
|
|
195
|
+
children: e.format || "—"
|
|
196
|
+
}) }),
|
|
197
|
+
/* @__PURE__ */ v(A, {
|
|
198
|
+
className: "text-right text-sm tabular-nums text-text-secondary",
|
|
199
|
+
children: I(e.sizeBytes)
|
|
200
|
+
}),
|
|
201
|
+
/* @__PURE__ */ v(A, { children: /* @__PURE__ */ v("div", {
|
|
202
|
+
className: "flex max-w-[12rem] flex-wrap gap-1",
|
|
203
|
+
children: e.tags.length === 0 ? /* @__PURE__ */ v("span", {
|
|
204
|
+
className: "text-xs text-text-secondary",
|
|
205
|
+
children: "—"
|
|
206
|
+
}) : /* @__PURE__ */ y(_, { children: [e.tags.slice(0, 2).map((e) => /* @__PURE__ */ v(S, {
|
|
207
|
+
variant: "secondary",
|
|
208
|
+
children: e
|
|
209
|
+
}, e)), e.tags.length > 2 ? /* @__PURE__ */ y(S, {
|
|
210
|
+
variant: "secondary",
|
|
211
|
+
children: ["+", e.tags.length - 2]
|
|
212
|
+
}) : null] })
|
|
213
|
+
}) }),
|
|
214
|
+
/* @__PURE__ */ v(A, {
|
|
215
|
+
className: "whitespace-nowrap text-sm text-text-secondary",
|
|
216
|
+
children: L(e.updatedAt)
|
|
217
|
+
}),
|
|
218
|
+
/* @__PURE__ */ v(A, {
|
|
219
|
+
className: "text-right",
|
|
220
|
+
children: /* @__PURE__ */ v(s, {
|
|
221
|
+
ariaLabel: `Actions for ${e.name}`,
|
|
222
|
+
entityName: e.name,
|
|
223
|
+
onView: () => R(`datasets/${e.id}`),
|
|
224
|
+
onEdit: () => R(`datasets/${e.id}/edit`),
|
|
225
|
+
extraItems: e.status === "AVAILABLE" || e.status === "ARCHIVED" ? [] : [{
|
|
226
|
+
key: "publish",
|
|
227
|
+
label: "Publish",
|
|
228
|
+
onSelect: () => void se(e)
|
|
229
|
+
}],
|
|
230
|
+
onDelete: () => ce(e),
|
|
231
|
+
deleteLabel: "Archive dataset"
|
|
232
|
+
})
|
|
233
|
+
})
|
|
234
|
+
]
|
|
235
|
+
}, e.id)) })] })
|
|
236
|
+
}), /* @__PURE__ */ v(d, {
|
|
237
|
+
offset: G.offset,
|
|
238
|
+
limit: G.limit,
|
|
239
|
+
loadedCount: Q.length,
|
|
240
|
+
hasMore: !!ie?.hasMore,
|
|
241
|
+
onPrev: G.prevPage,
|
|
242
|
+
onNext: G.nextPage,
|
|
243
|
+
itemLabel: "datasets",
|
|
244
|
+
loading: q
|
|
245
|
+
})] })]
|
|
246
|
+
})
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
//#endregion
|
|
250
|
+
export { R as default };
|
|
251
|
+
|
|
252
|
+
//# sourceMappingURL=DatasetsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatasetsPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/datasets/DatasetsPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { Database, Plus } 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 useCosArchiveDatasetMutation,\n useCosCollectionsQuery,\n useCosDatasetsQuery,\n useCosPublishDatasetMutation,\n useCosSourcesQuery,\n type CosDataset,\n type CosDatasetStatus,\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 { notify } from '../../lib/toast';\n\nconst DATASET_STATUSES: CosDatasetStatus[] = [\n 'DRAFT',\n 'INGESTING',\n 'AVAILABLE',\n 'DEPRECATED',\n 'ARCHIVED',\n];\n\nconst ALL = '__all__';\n\n/** BigInt byte string → human-readable size, or an em dash when absent/zero. */\nfunction formatBytes(raw: string | null | undefined): string {\n if (!raw) {\n return '—';\n }\n const bytes = Number(raw);\n if (!Number.isFinite(bytes) || bytes <= 0) {\n return '—';\n }\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\n let value = bytes;\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) {\n value /= 1024;\n unit += 1;\n }\n return `${value >= 10 || unit === 0 ? Math.round(value) : value.toFixed(1)} ${units[unit]}`;\n}\n\nfunction formatDate(raw: string | null | undefined): string {\n if (!raw) {\n return '—';\n }\n const date = new Date(raw);\n return Number.isNaN(date.getTime()) ? '—' : date.toLocaleDateString();\n}\n\nexport default function DatasetsPage() {\n const { navigate } = useCosmicIntersection();\n\n const [status, setStatus] = useState<string>(ALL);\n const [sourceId, setSourceId] = useState<string>(ALL);\n const [collectionId, setCollectionId] = useState<string>(ALL);\n\n const pagination = usePagination({\n pageSize: 20,\n resetKey: `${status}|${sourceId}|${collectionId}`,\n });\n\n const { data, loading, error, refetch } = useCosDatasetsQuery({\n status: status === ALL ? undefined : (status as CosDatasetStatus),\n sourceId: sourceId === ALL ? undefined : sourceId,\n collectionId: collectionId === ALL ? undefined : collectionId,\n pagination: { limit: pagination.limit, offset: pagination.offset },\n });\n\n const sourcesQuery = useCosSourcesQuery({ pagination: { limit: 100, offset: 0 } });\n const collectionsQuery = useCosCollectionsQuery();\n\n const [publishDataset] = useCosPublishDatasetMutation();\n const [archiveDataset] = useCosArchiveDatasetMutation();\n\n const datasets = useMemo(() => data?.cosListDatasets?.items ?? [], [data]);\n const pageInfo = data?.cosListDatasets?.pageInfo;\n const sources = sourcesQuery.data?.cosListSources?.items ?? [];\n const collections = collectionsQuery.data?.cosListCollections ?? [];\n\n const noFilters = status === ALL && sourceId === ALL && collectionId === ALL;\n\n const handlePublish = async (dataset: CosDataset) => {\n const response = await publishDataset({ variables: { id: dataset.id } });\n if (response.data?.cosPublishDataset) {\n notify.success('Dataset published', `“${dataset.name}” is now available.`);\n await refetch();\n }\n };\n\n const handleArchive = async (dataset: CosDataset) => {\n const response = await archiveDataset({ variables: { id: dataset.id } });\n if (response.error) {\n throw new Error(response.error.message);\n }\n if (!response.data?.cosArchiveDataset) {\n notify.error('Could not archive dataset', 'The server did not confirm the change.');\n throw new Error('Archive not confirmed');\n }\n notify.success('Dataset archived');\n await refetch();\n };\n\n return (\n <PageLayout\n title=\"Datasets\"\n description=\"Federated science datasets — catalog, schema, lineage and access, all from live data.\"\n actions={\n <Button type=\"button\" onClick={() => navigate('datasets/create')}>\n <Plus className=\"size-4\" />\n New dataset\n </Button>\n }\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-end gap-3\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"block font-medium text-text-primary\">Status</span>\n <Select value={status} onValueChange={setStatus}>\n <SelectTrigger aria-label=\"Filter by status\" className=\"w-44\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>All statuses</SelectItem>\n {DATASET_STATUSES.map((value) => (\n <SelectItem key={value} value={value}>\n {formatEnumLabel(value)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n\n <label className=\"space-y-1 text-sm\">\n <span className=\"block font-medium text-text-primary\">Source</span>\n <Select value={sourceId} onValueChange={setSourceId}>\n <SelectTrigger aria-label=\"Filter by source\" className=\"w-48\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>All sources</SelectItem>\n {sources.map((source) => (\n <SelectItem key={source.id} value={source.id}>\n {source.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n\n <label className=\"space-y-1 text-sm\">\n <span className=\"block font-medium text-text-primary\">Collection</span>\n <Select value={collectionId} onValueChange={setCollectionId}>\n <SelectTrigger aria-label=\"Filter by collection\" className=\"w-48\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>All collections</SelectItem>\n {collections.map((collection) => (\n <SelectItem key={collection.id} value={collection.id}>\n {collection.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n </div>\n\n {loading ? (\n <LoadingState variant=\"rows\" rows={6} label=\"Loading datasets…\" />\n ) : error ? (\n <ErrorState\n message=\"We could not load datasets. Please try again.\"\n onRetry={() => void refetch()}\n />\n ) : datasets.length === 0 ? (\n <EmptyState\n icon={Database}\n title={noFilters ? 'No datasets yet.' : 'No datasets match these filters.'}\n description={\n noFilters\n ? 'Register your first dataset to start federating science data across sources.'\n : 'Try a different status, source or collection.'\n }\n action={\n noFilters ? (\n <Button type=\"button\" onClick={() => navigate('datasets/create')}>\n <Plus className=\"size-4\" />\n New dataset\n </Button>\n ) : undefined\n }\n />\n ) : (\n <>\n <div className=\"rounded-card border border-border-default bg-bg-elevated\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Access</TableHead>\n <TableHead>Format</TableHead>\n <TableHead className=\"text-right\">Size</TableHead>\n <TableHead>Tags</TableHead>\n <TableHead>Updated</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {datasets.map((dataset) => (\n <TableRow\n key={dataset.id}\n className=\"cursor-pointer\"\n onClick={() => navigate(`datasets/${dataset.id}`)}\n >\n <TableCell>\n <span className=\"font-medium text-text-primary\">{dataset.name}</span>\n {dataset.description ? (\n <p className=\"mt-0.5 line-clamp-1 max-w-xs text-xs text-text-secondary\">\n {dataset.description}\n </p>\n ) : null}\n </TableCell>\n <TableCell>\n <StatusBadge status={dataset.status} />\n </TableCell>\n <TableCell>\n <span className=\"text-sm text-text-secondary\">\n {formatEnumLabel(dataset.accessLevel)}\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-sm text-text-secondary\">{dataset.format || '—'}</span>\n </TableCell>\n <TableCell className=\"text-right text-sm tabular-nums text-text-secondary\">\n {formatBytes(dataset.sizeBytes)}\n </TableCell>\n <TableCell>\n <div className=\"flex max-w-[12rem] flex-wrap gap-1\">\n {dataset.tags.length === 0 ? (\n <span className=\"text-xs text-text-secondary\">—</span>\n ) : (\n <>\n {dataset.tags.slice(0, 2).map((tag) => (\n <Badge key={tag} variant=\"secondary\">\n {tag}\n </Badge>\n ))}\n {dataset.tags.length > 2 ? (\n <Badge variant=\"secondary\">+{dataset.tags.length - 2}</Badge>\n ) : null}\n </>\n )}\n </div>\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm text-text-secondary\">\n {formatDate(dataset.updatedAt)}\n </TableCell>\n <TableCell className=\"text-right\">\n <ActionMenu\n ariaLabel={`Actions for ${dataset.name}`}\n entityName={dataset.name}\n onView={() => navigate(`datasets/${dataset.id}`)}\n onEdit={() => navigate(`datasets/${dataset.id}/edit`)}\n extraItems={\n dataset.status === 'AVAILABLE' || dataset.status === 'ARCHIVED'\n ? []\n : [\n {\n key: 'publish',\n label: 'Publish',\n onSelect: () => void handlePublish(dataset),\n },\n ]\n }\n onDelete={() => handleArchive(dataset)}\n deleteLabel=\"Archive dataset\"\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={datasets.length}\n hasMore={Boolean(pageInfo?.hasMore)}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"datasets\"\n loading={loading}\n />\n </>\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|