@burdenoff/microfe-cosmicintersection 2026.704.1 → 2026.704.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cosmicintersection/CosmicIntersectionRoutes.js +31 -23
- package/dist/cosmicintersection/CosmicIntersectionRoutes.js.map +1 -1
- package/dist/cosmicintersection/api/cosmicApi.js +131 -66
- package/dist/cosmicintersection/api/cosmicApi.js.map +1 -1
- package/dist/cosmicintersection/components/ActivityFeedPanel.js +68 -0
- package/dist/cosmicintersection/components/ActivityFeedPanel.js.map +1 -0
- package/dist/cosmicintersection/components/DiscussionPanel.js +57 -0
- package/dist/cosmicintersection/components/DiscussionPanel.js.map +1 -0
- package/dist/cosmicintersection/components/index.js +5 -3
- package/dist/cosmicintersection/pages/access/AccessPage.js +24 -17
- package/dist/cosmicintersection/pages/access/AccessPage.js.map +1 -1
- package/dist/cosmicintersection/pages/analyses/AnalysesPage.js +12 -12
- package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js +109 -96
- package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js.map +1 -1
- package/dist/cosmicintersection/pages/collections/CollectionFormPage.js +87 -61
- package/dist/cosmicintersection/pages/collections/CollectionFormPage.js.map +1 -1
- package/dist/cosmicintersection/pages/collections/CollectionsPage.js +51 -42
- package/dist/cosmicintersection/pages/collections/CollectionsPage.js.map +1 -1
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.js +5 -3
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js +172 -152
- package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js.map +1 -1
- package/dist/cosmicintersection/pages/datasets/DatasetFormPage.js +7 -7
- package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js +205 -196
- package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js.map +1 -1
- package/dist/cosmicintersection/pages/releases/ReleasesPage.js +211 -161
- package/dist/cosmicintersection/pages/releases/ReleasesPage.js.map +1 -1
- package/dist/cosmicintersection/pages/runs/RunDetailPage.js +113 -108
- package/dist/cosmicintersection/pages/runs/RunDetailPage.js.map +1 -1
- package/dist/cosmicintersection/pages/runs/RunsPage.js +86 -101
- package/dist/cosmicintersection/pages/runs/RunsPage.js.map +1 -1
- package/dist/cosmicintersection/pages/sources/SourceDetailPage.js +205 -0
- package/dist/cosmicintersection/pages/sources/SourceDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/sources/SourcesPage.js +110 -104
- package/dist/cosmicintersection/pages/sources/SourcesPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,8 +4,8 @@ import { useCosAnalysesQuery as n, useCosCompleteAnalysisMutation as r, useCosDa
|
|
|
4
4
|
import s from "../../components/ActionMenu.js";
|
|
5
5
|
import c from "../../components/EmptyState.js";
|
|
6
6
|
import l from "../../components/ErrorState.js";
|
|
7
|
-
import u
|
|
8
|
-
import f from "../../components/
|
|
7
|
+
import u from "../../components/LoadingState.js";
|
|
8
|
+
import d, { useFileDownloadUrl as f } from "../../components/FileUploadField.js";
|
|
9
9
|
import p from "../../components/PageLayout.js";
|
|
10
10
|
import m from "../../components/StatusBadge.js";
|
|
11
11
|
import "../../components/index.js";
|
|
@@ -44,7 +44,7 @@ function Y(e) {
|
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
46
|
function X({ fileId: e }) {
|
|
47
|
-
let { data: t, loading: n } =
|
|
47
|
+
let { data: t, loading: n } = f(e), r = t?.getFileDownloadUrl ?? null;
|
|
48
48
|
return n ? /* @__PURE__ */ _("span", {
|
|
49
49
|
className: "text-xs text-text-secondary",
|
|
50
50
|
children: "Resolving…"
|
|
@@ -221,7 +221,7 @@ function Q({ open: e, onOpenChange: n, onCompleted: r }) {
|
|
|
221
221
|
});
|
|
222
222
|
}
|
|
223
223
|
function $({ analysis: e, onOpenChange: n, onCompleted: i }) {
|
|
224
|
-
let [a, o] = g("COMPLETED"), [s, c] = g(""), [l,
|
|
224
|
+
let [a, o] = g("COMPLETED"), [s, c] = g(""), [l, u] = g(""), [f, { loading: p }] = r();
|
|
225
225
|
return /* @__PURE__ */ _(E, {
|
|
226
226
|
open: !!e,
|
|
227
227
|
onOpenChange: (e) => {
|
|
@@ -292,9 +292,9 @@ function $({ analysis: e, onOpenChange: n, onCompleted: i }) {
|
|
|
292
292
|
})
|
|
293
293
|
]
|
|
294
294
|
}),
|
|
295
|
-
/* @__PURE__ */ _(
|
|
295
|
+
/* @__PURE__ */ _(d, {
|
|
296
296
|
value: l,
|
|
297
|
-
onChange: (e) =>
|
|
297
|
+
onChange: (e) => u(e),
|
|
298
298
|
label: "Attach output file",
|
|
299
299
|
hint: "Optional output artifact (plots, tables, exports). Stored in workspace files."
|
|
300
300
|
}),
|
|
@@ -314,7 +314,7 @@ function $({ analysis: e, onOpenChange: n, onCompleted: i }) {
|
|
|
314
314
|
});
|
|
315
315
|
}
|
|
316
316
|
function ee() {
|
|
317
|
-
let { navigate: t } = e(), [r, o] = g(void 0), [
|
|
317
|
+
let { navigate: t } = e(), [r, o] = g(void 0), [d, f] = g(!1), [b, E] = g(null), { data: D, loading: O, error: k, refetch: A } = n({ status: r }), { data: j } = a({ pagination: {
|
|
318
318
|
limit: 100,
|
|
319
319
|
offset: 0
|
|
320
320
|
} }), { data: M } = i({ pagination: {
|
|
@@ -334,7 +334,7 @@ function ee() {
|
|
|
334
334
|
description: "Analysis runs executed over notebooks and federated datasets.",
|
|
335
335
|
actions: /* @__PURE__ */ v(T, {
|
|
336
336
|
type: "button",
|
|
337
|
-
onClick: () =>
|
|
337
|
+
onClick: () => f(!0),
|
|
338
338
|
children: [/* @__PURE__ */ _(S, { className: "size-4" }), "Run analysis"]
|
|
339
339
|
}),
|
|
340
340
|
children: [
|
|
@@ -362,7 +362,7 @@ function ee() {
|
|
|
362
362
|
children: e.label
|
|
363
363
|
}, e.value))] })]
|
|
364
364
|
})]
|
|
365
|
-
}), O ? /* @__PURE__ */ _(
|
|
365
|
+
}), O ? /* @__PURE__ */ _(u, {
|
|
366
366
|
variant: "rows",
|
|
367
367
|
rows: 6,
|
|
368
368
|
label: "Loading analyses…"
|
|
@@ -375,7 +375,7 @@ function ee() {
|
|
|
375
375
|
description: r ? "Try a different status filter." : "Run an analysis against a notebook or dataset to see results here.",
|
|
376
376
|
action: r ? void 0 : /* @__PURE__ */ v(T, {
|
|
377
377
|
type: "button",
|
|
378
|
-
onClick: () =>
|
|
378
|
+
onClick: () => f(!0),
|
|
379
379
|
children: [/* @__PURE__ */ _(S, { className: "size-4" }), "Run analysis"]
|
|
380
380
|
})
|
|
381
381
|
}) : /* @__PURE__ */ _("div", {
|
|
@@ -464,8 +464,8 @@ function ee() {
|
|
|
464
464
|
})]
|
|
465
465
|
}),
|
|
466
466
|
/* @__PURE__ */ _(Q, {
|
|
467
|
-
open:
|
|
468
|
-
onOpenChange:
|
|
467
|
+
open: d,
|
|
468
|
+
onOpenChange: f,
|
|
469
469
|
onCompleted: () => void A()
|
|
470
470
|
}),
|
|
471
471
|
/* @__PURE__ */ _($, {
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
|
|
2
|
-
import {
|
|
3
|
-
import r from "../../
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import u from "../../components/
|
|
2
|
+
import { notify as t } from "../../lib/toast.js";
|
|
3
|
+
import { useCosArchiveCollectionMutation as n, useCosCollectionsQuery as r, useCosDatasetsQuery as i } from "../../api/cosmicApi.js";
|
|
4
|
+
import a from "../../components/ActionMenu.js";
|
|
5
|
+
import o from "../../components/EmptyState.js";
|
|
6
|
+
import s from "../../components/ErrorState.js";
|
|
7
|
+
import c from "../../components/LoadingState.js";
|
|
8
|
+
import l from "../../components/PageLayout.js";
|
|
9
|
+
import u, { usePagination as d } from "../../components/Pagination.js";
|
|
10
|
+
import f from "../../components/StatusBadge.js";
|
|
10
11
|
import "../../components/index.js";
|
|
11
|
-
import { useMemo as
|
|
12
|
-
import { Fragment as
|
|
13
|
-
import { useParams as
|
|
14
|
-
import { Database as
|
|
15
|
-
import { Badge as
|
|
12
|
+
import { useMemo as p } from "react";
|
|
13
|
+
import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
14
|
+
import { useParams as _ } from "react-router-dom";
|
|
15
|
+
import { Database as v, FolderOpen as y, Globe as b, Lock as x, Pencil as S } from "lucide-react";
|
|
16
|
+
import { Badge as C, Button as w, Table as T, TableBody as E, TableCell as D, TableHead as O, TableHeader as k, TableRow as A } from "@burdenoff/fe-libs/ui";
|
|
16
17
|
//#region src/cosmicintersection/pages/collections/CollectionDetailPage.tsx
|
|
17
|
-
function
|
|
18
|
+
function j(e) {
|
|
18
19
|
if (!e) return "—";
|
|
19
20
|
let t = new Date(e);
|
|
20
21
|
return Number.isNaN(t.getTime()) ? "—" : t.toLocaleDateString(void 0, {
|
|
@@ -23,142 +24,154 @@ function D(e) {
|
|
|
23
24
|
day: "numeric"
|
|
24
25
|
});
|
|
25
26
|
}
|
|
26
|
-
function
|
|
27
|
-
let { id:
|
|
27
|
+
function M() {
|
|
28
|
+
let { id: M = "" } = _(), { navigate: N } = e(), { data: P, loading: F, error: I, refetch: L } = r(), R = p(() => P?.cosListCollections.find((e) => e.id === M) ?? null, [P, M]), z = d({
|
|
28
29
|
pageSize: 20,
|
|
29
|
-
resetKey:
|
|
30
|
-
}), { data:
|
|
31
|
-
collectionId:
|
|
30
|
+
resetKey: M
|
|
31
|
+
}), { data: B, loading: V, error: H, refetch: U } = i({
|
|
32
|
+
collectionId: M,
|
|
32
33
|
pagination: {
|
|
33
|
-
limit:
|
|
34
|
-
offset:
|
|
34
|
+
limit: z.limit,
|
|
35
|
+
offset: z.offset
|
|
35
36
|
}
|
|
36
|
-
}),
|
|
37
|
-
|
|
37
|
+
}), W = B?.cosListDatasets.items ?? [], G = B?.cosListDatasets.pageInfo, [K] = n(), q = async () => {
|
|
38
|
+
if (!R) return;
|
|
39
|
+
let e = await K({ variables: { id: R.id } });
|
|
40
|
+
if (e.error) throw Error(e.error.message);
|
|
41
|
+
if (!e.data?.cosArchiveCollection) throw t.error("Could not archive collection", "The server did not confirm the change."), Error("Archive not confirmed");
|
|
42
|
+
t.success("Collection archived"), N("collections");
|
|
43
|
+
};
|
|
44
|
+
return F ? /* @__PURE__ */ h(l, {
|
|
38
45
|
title: "Collection",
|
|
39
46
|
backPath: "collections",
|
|
40
|
-
children: /* @__PURE__ */
|
|
41
|
-
}) :
|
|
47
|
+
children: /* @__PURE__ */ h(c, { label: "Loading collection…" })
|
|
48
|
+
}) : I ? /* @__PURE__ */ h(l, {
|
|
42
49
|
title: "Collection",
|
|
43
50
|
backPath: "collections",
|
|
44
|
-
children: /* @__PURE__ */
|
|
45
|
-
message:
|
|
46
|
-
onRetry: () => void
|
|
51
|
+
children: /* @__PURE__ */ h(s, {
|
|
52
|
+
message: I.message,
|
|
53
|
+
onRetry: () => void L()
|
|
47
54
|
})
|
|
48
|
-
}) :
|
|
49
|
-
title:
|
|
50
|
-
description:
|
|
55
|
+
}) : R ? /* @__PURE__ */ h(l, {
|
|
56
|
+
title: R.name,
|
|
57
|
+
description: R.slug ? `/${R.slug}` : void 0,
|
|
51
58
|
backPath: "collections",
|
|
52
|
-
actions:
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
59
|
+
actions: /* @__PURE__ */ g("div", {
|
|
60
|
+
className: "flex items-center gap-2",
|
|
61
|
+
children: [
|
|
62
|
+
R.isPublic ? /* @__PURE__ */ g(C, {
|
|
63
|
+
variant: "outline",
|
|
64
|
+
className: "gap-1 border-status-success-border bg-status-success-bg-subtle text-status-success-text",
|
|
65
|
+
children: [/* @__PURE__ */ h(b, {
|
|
66
|
+
className: "size-3",
|
|
67
|
+
"aria-hidden": "true"
|
|
68
|
+
}), "Public"]
|
|
69
|
+
}) : /* @__PURE__ */ g(C, {
|
|
70
|
+
variant: "secondary",
|
|
71
|
+
className: "gap-1",
|
|
72
|
+
children: [/* @__PURE__ */ h(x, {
|
|
73
|
+
className: "size-3",
|
|
74
|
+
"aria-hidden": "true"
|
|
75
|
+
}), "Private"]
|
|
76
|
+
}),
|
|
77
|
+
/* @__PURE__ */ g(w, {
|
|
78
|
+
type: "button",
|
|
79
|
+
variant: "outline",
|
|
80
|
+
onClick: () => N(`collections/${R.id}/edit`),
|
|
81
|
+
children: [/* @__PURE__ */ h(S, { className: "size-4" }), "Edit"]
|
|
82
|
+
}),
|
|
83
|
+
/* @__PURE__ */ h(a, {
|
|
84
|
+
ariaLabel: `Actions for ${R.name}`,
|
|
85
|
+
entityName: R.name,
|
|
86
|
+
onDelete: () => q(),
|
|
87
|
+
deleteLabel: "Archive collection"
|
|
88
|
+
})
|
|
89
|
+
]
|
|
66
90
|
}),
|
|
67
|
-
children: /* @__PURE__ */
|
|
91
|
+
children: /* @__PURE__ */ g("div", {
|
|
68
92
|
className: "space-y-6",
|
|
69
|
-
children: [/* @__PURE__ */
|
|
93
|
+
children: [/* @__PURE__ */ g("div", {
|
|
70
94
|
className: "rounded-card border border-border-default bg-bg-elevated p-5",
|
|
71
95
|
children: [
|
|
72
|
-
/* @__PURE__ */
|
|
96
|
+
/* @__PURE__ */ h("h2", {
|
|
73
97
|
className: "text-sm font-semibold text-text-primary",
|
|
74
98
|
children: "About"
|
|
75
99
|
}),
|
|
76
|
-
/* @__PURE__ */
|
|
100
|
+
/* @__PURE__ */ h("p", {
|
|
77
101
|
className: "mt-2 text-sm text-text-secondary",
|
|
78
|
-
children:
|
|
102
|
+
children: R.description ?? "No description provided."
|
|
79
103
|
}),
|
|
80
|
-
|
|
104
|
+
R.tags.length > 0 ? /* @__PURE__ */ h("div", {
|
|
81
105
|
className: "mt-4 flex flex-wrap gap-1",
|
|
82
|
-
children:
|
|
106
|
+
children: R.tags.map((e) => /* @__PURE__ */ h(C, {
|
|
83
107
|
variant: "outline",
|
|
84
108
|
className: "text-xs",
|
|
85
109
|
children: e
|
|
86
110
|
}, e))
|
|
87
111
|
}) : null
|
|
88
112
|
]
|
|
89
|
-
}), /* @__PURE__ */
|
|
113
|
+
}), /* @__PURE__ */ g("div", {
|
|
90
114
|
className: "space-y-3",
|
|
91
|
-
children: [/* @__PURE__ */
|
|
115
|
+
children: [/* @__PURE__ */ h("h2", {
|
|
92
116
|
className: "text-sm font-semibold text-text-primary",
|
|
93
117
|
children: "Datasets"
|
|
94
|
-
}),
|
|
118
|
+
}), V ? /* @__PURE__ */ h(c, {
|
|
95
119
|
variant: "rows",
|
|
96
120
|
rows: 4,
|
|
97
121
|
label: "Loading datasets…"
|
|
98
|
-
}) :
|
|
99
|
-
message:
|
|
100
|
-
onRetry: () => void
|
|
101
|
-
}) :
|
|
102
|
-
icon:
|
|
122
|
+
}) : H ? /* @__PURE__ */ h(s, {
|
|
123
|
+
message: H.message,
|
|
124
|
+
onRetry: () => void U()
|
|
125
|
+
}) : W.length === 0 ? /* @__PURE__ */ h(o, {
|
|
126
|
+
icon: v,
|
|
103
127
|
title: "No datasets in this collection",
|
|
104
128
|
description: "Assign a dataset to this collection to see it listed here."
|
|
105
|
-
}) : /* @__PURE__ */ m
|
|
129
|
+
}) : /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h("div", {
|
|
106
130
|
className: "overflow-hidden rounded-card border border-border-default bg-bg-elevated",
|
|
107
|
-
children: /* @__PURE__ */
|
|
108
|
-
/* @__PURE__ */
|
|
109
|
-
/* @__PURE__ */
|
|
110
|
-
/* @__PURE__ */
|
|
111
|
-
/* @__PURE__ */
|
|
112
|
-
|
|
113
|
-
className: "text-right",
|
|
114
|
-
children: "Actions"
|
|
115
|
-
})
|
|
116
|
-
] }) }), /* @__PURE__ */ p(S, { children: B.map((e) => /* @__PURE__ */ m(E, {
|
|
131
|
+
children: /* @__PURE__ */ g(T, { children: [/* @__PURE__ */ h(k, { children: /* @__PURE__ */ g(A, { children: [
|
|
132
|
+
/* @__PURE__ */ h(O, { children: "Name" }),
|
|
133
|
+
/* @__PURE__ */ h(O, { children: "Status" }),
|
|
134
|
+
/* @__PURE__ */ h(O, { children: "Access" }),
|
|
135
|
+
/* @__PURE__ */ h(O, { children: "Updated" })
|
|
136
|
+
] }) }), /* @__PURE__ */ h(E, { children: W.map((e) => /* @__PURE__ */ g(A, {
|
|
117
137
|
className: "cursor-pointer",
|
|
118
|
-
onClick: () =>
|
|
138
|
+
onClick: () => N(`datasets/${e.id}`),
|
|
119
139
|
children: [
|
|
120
|
-
/* @__PURE__ */
|
|
140
|
+
/* @__PURE__ */ h(D, {
|
|
121
141
|
className: "font-medium text-text-primary",
|
|
122
142
|
children: e.name
|
|
123
143
|
}),
|
|
124
|
-
/* @__PURE__ */
|
|
125
|
-
/* @__PURE__ */
|
|
126
|
-
/* @__PURE__ */
|
|
144
|
+
/* @__PURE__ */ h(D, { children: /* @__PURE__ */ h(f, { status: e.status }) }),
|
|
145
|
+
/* @__PURE__ */ h(D, { children: /* @__PURE__ */ h(f, { status: e.accessLevel }) }),
|
|
146
|
+
/* @__PURE__ */ h(D, {
|
|
127
147
|
className: "whitespace-nowrap text-sm text-text-secondary",
|
|
128
|
-
children:
|
|
129
|
-
}),
|
|
130
|
-
/* @__PURE__ */ p(C, {
|
|
131
|
-
className: "text-right",
|
|
132
|
-
children: /* @__PURE__ */ p(r, {
|
|
133
|
-
ariaLabel: `Actions for ${e.name}`,
|
|
134
|
-
onView: () => k(`datasets/${e.id}`)
|
|
135
|
-
})
|
|
148
|
+
children: j(e.updatedAt)
|
|
136
149
|
})
|
|
137
150
|
]
|
|
138
151
|
}, e.id)) })] })
|
|
139
|
-
}), /* @__PURE__ */
|
|
140
|
-
offset:
|
|
141
|
-
limit:
|
|
142
|
-
loadedCount:
|
|
143
|
-
hasMore:
|
|
144
|
-
onPrev:
|
|
145
|
-
onNext:
|
|
152
|
+
}), /* @__PURE__ */ h(u, {
|
|
153
|
+
offset: z.offset,
|
|
154
|
+
limit: z.limit,
|
|
155
|
+
loadedCount: W.length,
|
|
156
|
+
hasMore: G?.hasMore ?? !1,
|
|
157
|
+
onPrev: z.prevPage,
|
|
158
|
+
onNext: z.nextPage,
|
|
146
159
|
itemLabel: "datasets",
|
|
147
|
-
loading:
|
|
160
|
+
loading: V
|
|
148
161
|
})] })]
|
|
149
162
|
})]
|
|
150
163
|
})
|
|
151
|
-
}) : /* @__PURE__ */
|
|
164
|
+
}) : /* @__PURE__ */ h(l, {
|
|
152
165
|
title: "Collection",
|
|
153
166
|
backPath: "collections",
|
|
154
|
-
children: /* @__PURE__ */
|
|
155
|
-
icon:
|
|
167
|
+
children: /* @__PURE__ */ h(o, {
|
|
168
|
+
icon: y,
|
|
156
169
|
title: "Collection not found",
|
|
157
170
|
description: "This collection may have been removed or you may not have access to it."
|
|
158
171
|
})
|
|
159
172
|
});
|
|
160
173
|
}
|
|
161
174
|
//#endregion
|
|
162
|
-
export {
|
|
175
|
+
export { M as default };
|
|
163
176
|
|
|
164
177
|
//# sourceMappingURL=CollectionDetailPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionDetailPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/collections/CollectionDetailPage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { Database, FolderOpen, Globe, Lock } from 'lucide-react';\nimport {\n Badge,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\n\nimport { useCosCollectionsQuery, useCosDatasetsQuery } 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';\n\nfunction formatDate(value?: string | null): string {\n if (!value) {\n return '—';\n }\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return '—';\n }\n return parsed.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\n\nexport default function CollectionDetailPage() {\n const { id = '' } = useParams<{ id: string }>();\n const { navigate } = useCosmicIntersection();\n\n // No cosCollection(id) query exists — resolve the header from the list query.\n const {\n data: collectionsData,\n loading: loadingCollections,\n error: collectionsError,\n refetch: refetchCollections,\n } = useCosCollectionsQuery();\n\n const collection = useMemo(\n () => collectionsData?.cosListCollections.find((item) => item.id === id) ?? null,\n [collectionsData, id]\n );\n\n const pagination = usePagination({ pageSize: 20, resetKey: id });\n const {\n data: datasetsData,\n loading: loadingDatasets,\n error: datasetsError,\n refetch: refetchDatasets,\n } = useCosDatasetsQuery({\n collectionId: id,\n pagination: { limit: pagination.limit, offset: pagination.offset },\n });\n\n const datasets = datasetsData?.cosListDatasets.items ?? [];\n const pageInfo = datasetsData?.cosListDatasets.pageInfo;\n\n if (loadingCollections) {\n return (\n <PageLayout title=\"Collection\" backPath=\"collections\">\n <LoadingState label=\"Loading collection…\" />\n </PageLayout>\n );\n }\n\n if (collectionsError) {\n return (\n <PageLayout title=\"Collection\" backPath=\"collections\">\n <ErrorState message={collectionsError.message} onRetry={() => void refetchCollections()} />\n </PageLayout>\n );\n }\n\n if (!collection) {\n return (\n <PageLayout title=\"Collection\" backPath=\"collections\">\n <EmptyState\n icon={FolderOpen}\n title=\"Collection not found\"\n description=\"This collection may have been removed or you may not have access to it.\"\n />\n </PageLayout>\n );\n }\n\n const renderDatasets = () => {\n if (loadingDatasets) {\n return <LoadingState variant=\"rows\" rows={4} label=\"Loading datasets…\" />;\n }\n if (datasetsError) {\n return <ErrorState message={datasetsError.message} onRetry={() => void refetchDatasets()} />;\n }\n if (datasets.length === 0) {\n return (\n <EmptyState\n icon={Database}\n title=\"No datasets in this collection\"\n description=\"Assign a dataset to this collection to see it listed here.\"\n />\n );\n }\n\n return (\n <>\n <div className=\"overflow-hidden 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>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 className=\"font-medium text-text-primary\">{dataset.name}</TableCell>\n <TableCell>\n <StatusBadge status={dataset.status} />\n </TableCell>\n <TableCell>\n <StatusBadge status={dataset.accessLevel} />\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 onView={() => navigate(`datasets/${dataset.id}`)}\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={pageInfo?.hasMore ?? false}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"datasets\"\n loading={loadingDatasets}\n />\n </>\n );\n };\n\n return (\n <PageLayout\n title={collection.name}\n description={collection.slug ? `/${collection.slug}` : undefined}\n backPath=\"collections\"\n actions={\n collection.isPublic ? (\n <Badge\n variant=\"outline\"\n className=\"gap-1 border-status-success-border bg-status-success-bg-subtle text-status-success-text\"\n >\n <Globe className=\"size-3\" aria-hidden=\"true\" />\n Public\n </Badge>\n ) : (\n <Badge variant=\"secondary\" className=\"gap-1\">\n <Lock className=\"size-3\" aria-hidden=\"true\" />\n Private\n </Badge>\n )\n }\n >\n <div className=\"space-y-6\">\n <div className=\"rounded-card border border-border-default bg-bg-elevated p-5\">\n <h2 className=\"text-sm font-semibold text-text-primary\">About</h2>\n <p className=\"mt-2 text-sm text-text-secondary\">\n {collection.description ?? 'No description provided.'}\n </p>\n {collection.tags.length > 0 ? (\n <div className=\"mt-4 flex flex-wrap gap-1\">\n {collection.tags.map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n\n <div className=\"space-y-3\">\n <h2 className=\"text-sm font-semibold text-text-primary\">Datasets</h2>\n {renderDatasets()}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CollectionDetailPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/collections/CollectionDetailPage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { Database, FolderOpen, Globe, Lock, Pencil } from 'lucide-react';\nimport {\n Badge,\n Button,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\n\nimport {\n useCosArchiveCollectionMutation,\n useCosCollectionsQuery,\n useCosDatasetsQuery,\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\nfunction formatDate(value?: string | null): string {\n if (!value) {\n return '—';\n }\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return '—';\n }\n return parsed.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\n\nexport default function CollectionDetailPage() {\n const { id = '' } = useParams<{ id: string }>();\n const { navigate } = useCosmicIntersection();\n\n // No cosCollection(id) query exists — resolve the header from the list query.\n const {\n data: collectionsData,\n loading: loadingCollections,\n error: collectionsError,\n refetch: refetchCollections,\n } = useCosCollectionsQuery();\n\n const collection = useMemo(\n () => collectionsData?.cosListCollections.find((item) => item.id === id) ?? null,\n [collectionsData, id]\n );\n\n const pagination = usePagination({ pageSize: 20, resetKey: id });\n const {\n data: datasetsData,\n loading: loadingDatasets,\n error: datasetsError,\n refetch: refetchDatasets,\n } = useCosDatasetsQuery({\n collectionId: id,\n pagination: { limit: pagination.limit, offset: pagination.offset },\n });\n\n const datasets = datasetsData?.cosListDatasets.items ?? [];\n const pageInfo = datasetsData?.cosListDatasets.pageInfo;\n\n const [archiveCollection] = useCosArchiveCollectionMutation();\n\n const handleArchive = async () => {\n if (!collection) {\n return;\n }\n const response = await archiveCollection({ variables: { id: collection.id } });\n if (response.error) {\n throw new Error(response.error.message);\n }\n if (!response.data?.cosArchiveCollection) {\n notify.error('Could not archive collection', 'The server did not confirm the change.');\n throw new Error('Archive not confirmed');\n }\n notify.success('Collection archived');\n navigate('collections');\n };\n\n if (loadingCollections) {\n return (\n <PageLayout title=\"Collection\" backPath=\"collections\">\n <LoadingState label=\"Loading collection…\" />\n </PageLayout>\n );\n }\n\n if (collectionsError) {\n return (\n <PageLayout title=\"Collection\" backPath=\"collections\">\n <ErrorState message={collectionsError.message} onRetry={() => void refetchCollections()} />\n </PageLayout>\n );\n }\n\n if (!collection) {\n return (\n <PageLayout title=\"Collection\" backPath=\"collections\">\n <EmptyState\n icon={FolderOpen}\n title=\"Collection not found\"\n description=\"This collection may have been removed or you may not have access to it.\"\n />\n </PageLayout>\n );\n }\n\n const renderDatasets = () => {\n if (loadingDatasets) {\n return <LoadingState variant=\"rows\" rows={4} label=\"Loading datasets…\" />;\n }\n if (datasetsError) {\n return <ErrorState message={datasetsError.message} onRetry={() => void refetchDatasets()} />;\n }\n if (datasets.length === 0) {\n return (\n <EmptyState\n icon={Database}\n title=\"No datasets in this collection\"\n description=\"Assign a dataset to this collection to see it listed here.\"\n />\n );\n }\n\n return (\n <>\n <div className=\"overflow-hidden 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>Updated</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 className=\"font-medium text-text-primary\">{dataset.name}</TableCell>\n <TableCell>\n <StatusBadge status={dataset.status} />\n </TableCell>\n <TableCell>\n <StatusBadge status={dataset.accessLevel} />\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm text-text-secondary\">\n {formatDate(dataset.updatedAt)}\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={pageInfo?.hasMore ?? false}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"datasets\"\n loading={loadingDatasets}\n />\n </>\n );\n };\n\n return (\n <PageLayout\n title={collection.name}\n description={collection.slug ? `/${collection.slug}` : undefined}\n backPath=\"collections\"\n actions={\n <div className=\"flex items-center gap-2\">\n {collection.isPublic ? (\n <Badge\n variant=\"outline\"\n className=\"gap-1 border-status-success-border bg-status-success-bg-subtle text-status-success-text\"\n >\n <Globe className=\"size-3\" aria-hidden=\"true\" />\n Public\n </Badge>\n ) : (\n <Badge variant=\"secondary\" className=\"gap-1\">\n <Lock className=\"size-3\" aria-hidden=\"true\" />\n Private\n </Badge>\n )}\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => navigate(`collections/${collection.id}/edit`)}\n >\n <Pencil className=\"size-4\" />\n Edit\n </Button>\n <ActionMenu\n ariaLabel={`Actions for ${collection.name}`}\n entityName={collection.name}\n onDelete={() => handleArchive()}\n deleteLabel=\"Archive collection\"\n />\n </div>\n }\n >\n <div className=\"space-y-6\">\n <div className=\"rounded-card border border-border-default bg-bg-elevated p-5\">\n <h2 className=\"text-sm font-semibold text-text-primary\">About</h2>\n <p className=\"mt-2 text-sm text-text-secondary\">\n {collection.description ?? 'No description provided.'}\n </p>\n {collection.tags.length > 0 ? (\n <div className=\"mt-4 flex flex-wrap gap-1\">\n {collection.tags.map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n\n <div className=\"space-y-3\">\n <h2 className=\"text-sm font-semibold text-text-primary\">Datasets</h2>\n {renderDatasets()}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,117 +1,143 @@
|
|
|
1
1
|
import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
|
|
2
2
|
import { notify as t } from "../../lib/toast.js";
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import
|
|
3
|
+
import { useCosCollectionQuery as n, useCosCreateCollectionMutation as r, useCosUpdateCollectionMutation as i } from "../../api/cosmicApi.js";
|
|
4
|
+
import a from "../../components/LoadingState.js";
|
|
5
|
+
import o from "../../components/EntityFormShell.js";
|
|
6
|
+
import s from "../../components/EntityTagsField.js";
|
|
6
7
|
import "../../components/index.js";
|
|
7
|
-
import { useState as
|
|
8
|
-
import { jsx as
|
|
9
|
-
import {
|
|
8
|
+
import { useMemo as c, useState as l } from "react";
|
|
9
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
10
|
+
import { useParams as f } from "react-router-dom";
|
|
11
|
+
import { Input as p, Switch as m, Textarea as h } from "@burdenoff/fe-libs/ui";
|
|
10
12
|
//#region src/cosmicintersection/pages/collections/CollectionFormPage.tsx
|
|
11
|
-
var
|
|
13
|
+
var g = {
|
|
12
14
|
name: "",
|
|
13
15
|
slug: "",
|
|
14
16
|
description: "",
|
|
15
17
|
isPublic: !1,
|
|
16
18
|
tags: []
|
|
17
|
-
},
|
|
18
|
-
function
|
|
19
|
-
let { navigate:
|
|
20
|
-
|
|
19
|
+
}, _ = "block space-y-1.5 text-sm", v = "font-medium text-text-primary";
|
|
20
|
+
function y() {
|
|
21
|
+
let { id: y = "" } = f(), b = c(() => !!y, [y]), { navigate: x } = e(), { data: S, loading: C } = n(y), [w, { loading: T }] = r(), [E, { loading: D }] = i(), [O, k] = l(g), [A, j] = l(null);
|
|
22
|
+
if (b && S?.cosCollection && A !== S.cosCollection.id) {
|
|
23
|
+
let e = S.cosCollection;
|
|
24
|
+
j(e.id), k({
|
|
25
|
+
name: e.name ?? "",
|
|
26
|
+
slug: e.slug ?? "",
|
|
27
|
+
description: e.description ?? "",
|
|
28
|
+
isPublic: e.isPublic,
|
|
29
|
+
tags: e.tags ?? []
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
let M = (e, t) => {
|
|
33
|
+
k((n) => ({
|
|
21
34
|
...n,
|
|
22
35
|
[e]: t
|
|
23
36
|
}));
|
|
24
|
-
},
|
|
25
|
-
if (e.preventDefault(), !
|
|
37
|
+
}, N = T || D, P = async (e) => {
|
|
38
|
+
if (e.preventDefault(), !O.name.trim()) {
|
|
26
39
|
t.error("Name is required", "Give this collection a recognizable name.");
|
|
27
40
|
return;
|
|
28
41
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
42
|
+
if (b) {
|
|
43
|
+
(await E({ variables: {
|
|
44
|
+
id: y,
|
|
45
|
+
input: {
|
|
46
|
+
name: O.name.trim(),
|
|
47
|
+
slug: O.slug.trim() || void 0,
|
|
48
|
+
description: O.description.trim() || void 0,
|
|
49
|
+
isPublic: O.isPublic,
|
|
50
|
+
tags: O.tags
|
|
51
|
+
}
|
|
52
|
+
} })).data?.cosUpdateCollection?.id && (t.success("Collection updated"), x(`collections/${y}`));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
let n = (await w({ variables: { input: {
|
|
56
|
+
name: O.name.trim(),
|
|
57
|
+
slug: O.slug.trim() || void 0,
|
|
58
|
+
description: O.description.trim() || void 0,
|
|
59
|
+
isPublic: O.isPublic,
|
|
60
|
+
tags: O.tags
|
|
35
61
|
} } })).data?.cosCreateCollection;
|
|
36
|
-
n?.id && (t.success("Collection created"),
|
|
62
|
+
n?.id && (t.success("Collection created"), x(`collections/${n.id}`));
|
|
37
63
|
};
|
|
38
|
-
return /* @__PURE__ */
|
|
39
|
-
title: "New collection",
|
|
64
|
+
return b && C && !S?.cosCollection ? /* @__PURE__ */ u(a, { label: "Loading collection…" }) : /* @__PURE__ */ d(o, {
|
|
65
|
+
title: b ? "Edit collection" : "New collection",
|
|
40
66
|
description: "Group related datasets into a shareable, themed collection.",
|
|
41
67
|
purpose: "Collections curate datasets by mission, survey or research theme so collaborators can browse a coherent set instead of a flat list. Mark a collection public to make it discoverable across the workspace.",
|
|
42
|
-
backLabel: "Back to collections",
|
|
43
|
-
onBack: () =>
|
|
44
|
-
onSubmit: (e) => void
|
|
45
|
-
submitLabel: "Create collection",
|
|
46
|
-
saving:
|
|
68
|
+
backLabel: b ? "Back to collection" : "Back to collections",
|
|
69
|
+
onBack: () => x(b ? `collections/${y}` : "collections"),
|
|
70
|
+
onSubmit: (e) => void P(e),
|
|
71
|
+
submitLabel: b ? "Save collection" : "Create collection",
|
|
72
|
+
saving: N,
|
|
47
73
|
children: [
|
|
48
|
-
/* @__PURE__ */
|
|
74
|
+
/* @__PURE__ */ d("div", {
|
|
49
75
|
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
50
|
-
children: [/* @__PURE__ */
|
|
51
|
-
className:
|
|
52
|
-
children: [/* @__PURE__ */
|
|
53
|
-
className:
|
|
76
|
+
children: [/* @__PURE__ */ d("label", {
|
|
77
|
+
className: _,
|
|
78
|
+
children: [/* @__PURE__ */ u("span", {
|
|
79
|
+
className: v,
|
|
54
80
|
children: "Name"
|
|
55
|
-
}), /* @__PURE__ */
|
|
56
|
-
value:
|
|
57
|
-
onChange: (e) =>
|
|
81
|
+
}), /* @__PURE__ */ u(p, {
|
|
82
|
+
value: O.name,
|
|
83
|
+
onChange: (e) => M("name", e.target.value),
|
|
58
84
|
placeholder: "e.g. Kepler Mission Data",
|
|
59
85
|
required: !0
|
|
60
86
|
})]
|
|
61
|
-
}), /* @__PURE__ */
|
|
62
|
-
className:
|
|
87
|
+
}), /* @__PURE__ */ d("label", {
|
|
88
|
+
className: _,
|
|
63
89
|
children: [
|
|
64
|
-
/* @__PURE__ */
|
|
65
|
-
className:
|
|
90
|
+
/* @__PURE__ */ u("span", {
|
|
91
|
+
className: v,
|
|
66
92
|
children: "Slug"
|
|
67
93
|
}),
|
|
68
|
-
/* @__PURE__ */
|
|
69
|
-
value:
|
|
70
|
-
onChange: (e) =>
|
|
94
|
+
/* @__PURE__ */ u(p, {
|
|
95
|
+
value: O.slug,
|
|
96
|
+
onChange: (e) => M("slug", e.target.value),
|
|
71
97
|
placeholder: "kepler-mission"
|
|
72
98
|
}),
|
|
73
|
-
/* @__PURE__ */
|
|
99
|
+
/* @__PURE__ */ u("span", {
|
|
74
100
|
className: "text-xs text-text-secondary",
|
|
75
101
|
children: "Optional URL-friendly identifier for sharing."
|
|
76
102
|
})
|
|
77
103
|
]
|
|
78
104
|
})]
|
|
79
105
|
}),
|
|
80
|
-
/* @__PURE__ */
|
|
81
|
-
className:
|
|
82
|
-
children: [/* @__PURE__ */
|
|
83
|
-
className:
|
|
106
|
+
/* @__PURE__ */ d("label", {
|
|
107
|
+
className: _,
|
|
108
|
+
children: [/* @__PURE__ */ u("span", {
|
|
109
|
+
className: v,
|
|
84
110
|
children: "Description"
|
|
85
|
-
}), /* @__PURE__ */
|
|
86
|
-
value:
|
|
87
|
-
onChange: (e) =>
|
|
111
|
+
}), /* @__PURE__ */ u(h, {
|
|
112
|
+
value: O.description,
|
|
113
|
+
onChange: (e) => M("description", e.target.value),
|
|
88
114
|
rows: 3,
|
|
89
115
|
placeholder: "What this collection groups together and who it is for."
|
|
90
116
|
})]
|
|
91
117
|
}),
|
|
92
|
-
/* @__PURE__ */
|
|
118
|
+
/* @__PURE__ */ d("div", {
|
|
93
119
|
className: "flex items-center justify-between gap-4 rounded-card border border-border-default bg-bg-sunken px-4 py-3",
|
|
94
|
-
children: [/* @__PURE__ */
|
|
120
|
+
children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
|
|
95
121
|
className: "text-sm font-medium text-text-primary",
|
|
96
122
|
children: "Public collection"
|
|
97
|
-
}), /* @__PURE__ */
|
|
123
|
+
}), /* @__PURE__ */ u("p", {
|
|
98
124
|
className: "text-xs text-text-secondary",
|
|
99
125
|
children: "Make this collection discoverable across the workspace."
|
|
100
|
-
})] }), /* @__PURE__ */
|
|
101
|
-
checked:
|
|
102
|
-
onCheckedChange: (e) =>
|
|
126
|
+
})] }), /* @__PURE__ */ u(m, {
|
|
127
|
+
checked: O.isPublic,
|
|
128
|
+
onCheckedChange: (e) => M("isPublic", e),
|
|
103
129
|
"aria-label": "Public collection"
|
|
104
130
|
})]
|
|
105
131
|
}),
|
|
106
|
-
/* @__PURE__ */
|
|
107
|
-
value:
|
|
108
|
-
onChange: (e) =>
|
|
109
|
-
disabled:
|
|
132
|
+
/* @__PURE__ */ u(s, {
|
|
133
|
+
value: O.tags,
|
|
134
|
+
onChange: (e) => M("tags", e),
|
|
135
|
+
disabled: N
|
|
110
136
|
})
|
|
111
137
|
]
|
|
112
138
|
});
|
|
113
139
|
}
|
|
114
140
|
//#endregion
|
|
115
|
-
export {
|
|
141
|
+
export { y as default };
|
|
116
142
|
|
|
117
143
|
//# sourceMappingURL=CollectionFormPage.js.map
|