@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,248 +1,249 @@
|
|
|
1
1
|
import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
|
|
2
2
|
import { useCosDatasetsQuery as t, useCosNotebooksQuery as n, useCosPipelinesQuery as r, useCosReleasesQuery as i, useCosRunsQuery as a, useCosSourcesQuery as o } from "../../api/cosmicApi.js";
|
|
3
|
-
import s from "
|
|
4
|
-
import c from "../../components/
|
|
5
|
-
import l from "../../components/
|
|
3
|
+
import { useTr as s } from "../../../shared/hooks/useTr.js";
|
|
4
|
+
import c from "../../components/EmptyState.js";
|
|
5
|
+
import l from "../../components/PageLayout.js";
|
|
6
|
+
import u from "../../components/StatusBadge.js";
|
|
6
7
|
import "../../components/index.js";
|
|
7
|
-
import { jsx as
|
|
8
|
-
import { Boxes as
|
|
9
|
-
import { Button as
|
|
8
|
+
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
9
|
+
import { Boxes as p, Database as m, FileText as h, NotebookPen as g, Plus as _, Radar as v, Rocket as y, Workflow as b } from "lucide-react";
|
|
10
|
+
import { Button as x } from "@burdenoff/fe-libs/ui";
|
|
10
11
|
//#region src/cosmicintersection/pages/dashboard/DashboardPage.tsx
|
|
11
|
-
var
|
|
12
|
-
function
|
|
12
|
+
var S = 50;
|
|
13
|
+
function C(e) {
|
|
13
14
|
if (!e) return "—";
|
|
14
15
|
let t = new Date(e);
|
|
15
16
|
return Number.isNaN(t.getTime()) ? "—" : t.toLocaleString();
|
|
16
17
|
}
|
|
17
|
-
function
|
|
18
|
+
function w(e) {
|
|
18
19
|
if (!e) return "—";
|
|
19
20
|
let t = e.items.length;
|
|
20
21
|
return e.pageInfo?.hasMore ? `${t}+` : String(t);
|
|
21
22
|
}
|
|
22
|
-
function
|
|
23
|
-
return /* @__PURE__ */
|
|
23
|
+
function T({ label: e, count: t, icon: n, loading: r, onClick: i }) {
|
|
24
|
+
return /* @__PURE__ */ f("button", {
|
|
24
25
|
type: "button",
|
|
25
26
|
onClick: i,
|
|
26
27
|
className: "group flex flex-col gap-2 rounded-card border border-border-default bg-bg-elevated p-4 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
|
|
27
|
-
children: [/* @__PURE__ */
|
|
28
|
+
children: [/* @__PURE__ */ f("div", {
|
|
28
29
|
className: "flex items-center justify-between",
|
|
29
|
-
children: [/* @__PURE__ */
|
|
30
|
+
children: [/* @__PURE__ */ d("span", {
|
|
30
31
|
className: "text-sm font-medium text-text-secondary",
|
|
31
32
|
children: e
|
|
32
|
-
}), /* @__PURE__ */
|
|
33
|
+
}), /* @__PURE__ */ d("span", {
|
|
33
34
|
className: "flex size-8 items-center justify-center rounded-button border border-border-default bg-bg-sunken text-text-secondary transition-colors group-hover:border-border-strong",
|
|
34
|
-
children: /* @__PURE__ */
|
|
35
|
+
children: /* @__PURE__ */ d(n, {
|
|
35
36
|
className: "size-4",
|
|
36
37
|
"aria-hidden": "true"
|
|
37
38
|
})
|
|
38
39
|
})]
|
|
39
|
-
}), /* @__PURE__ */
|
|
40
|
+
}), /* @__PURE__ */ d("span", {
|
|
40
41
|
className: "text-2xl font-semibold tabular-nums text-text-primary",
|
|
41
42
|
children: r ? "…" : t
|
|
42
43
|
})]
|
|
43
44
|
});
|
|
44
45
|
}
|
|
45
|
-
function
|
|
46
|
-
let { navigate:
|
|
47
|
-
limit:
|
|
46
|
+
function E() {
|
|
47
|
+
let { navigate: E } = e(), D = s(), O = t({ pagination: {
|
|
48
|
+
limit: S,
|
|
48
49
|
offset: 0
|
|
49
|
-
} }),
|
|
50
|
-
limit:
|
|
50
|
+
} }), k = o({ pagination: {
|
|
51
|
+
limit: S,
|
|
51
52
|
offset: 0
|
|
52
|
-
} }),
|
|
53
|
-
limit:
|
|
53
|
+
} }), A = r({ pagination: {
|
|
54
|
+
limit: S,
|
|
54
55
|
offset: 0
|
|
55
|
-
} }),
|
|
56
|
-
limit:
|
|
56
|
+
} }), j = a({ pagination: {
|
|
57
|
+
limit: S,
|
|
57
58
|
offset: 0
|
|
58
|
-
} }),
|
|
59
|
-
limit:
|
|
59
|
+
} }), M = n({ pagination: {
|
|
60
|
+
limit: S,
|
|
60
61
|
offset: 0
|
|
61
|
-
} }),
|
|
62
|
-
limit:
|
|
62
|
+
} }), N = i({ pagination: {
|
|
63
|
+
limit: S,
|
|
63
64
|
offset: 0
|
|
64
|
-
} }),
|
|
65
|
+
} }), P = i({
|
|
65
66
|
status: "PUBLISHED",
|
|
66
67
|
pagination: {
|
|
67
68
|
limit: 5,
|
|
68
69
|
offset: 0
|
|
69
70
|
}
|
|
70
|
-
}),
|
|
71
|
-
return /* @__PURE__ */
|
|
72
|
-
title: "CosmicIntersection",
|
|
73
|
-
description: "A federation workspace for science data — sources, datasets, pipelines, notebooks and releases in one place.",
|
|
74
|
-
actions: /* @__PURE__ */
|
|
71
|
+
}), F = (j.data?.cosListRuns?.items ?? []).slice(0, 6), I = P.data?.cosListReleases?.items ?? [];
|
|
72
|
+
return /* @__PURE__ */ d(l, {
|
|
73
|
+
title: D("cosmicintersection.pages.dashboard.title", "CosmicIntersection"),
|
|
74
|
+
description: D("cosmicintersection.pages.dashboard.description", "A federation workspace for science data — sources, datasets, pipelines, notebooks and releases in one place."),
|
|
75
|
+
actions: /* @__PURE__ */ f(x, {
|
|
75
76
|
type: "button",
|
|
76
|
-
onClick: () =>
|
|
77
|
-
children: [/* @__PURE__ */
|
|
77
|
+
onClick: () => E("datasets/create"),
|
|
78
|
+
children: [/* @__PURE__ */ d(_, { className: "size-4" }), D("cosmicintersection.pages.dashboard.newDataset", "New dataset")]
|
|
78
79
|
}),
|
|
79
|
-
children: /* @__PURE__ */
|
|
80
|
+
children: /* @__PURE__ */ f("div", {
|
|
80
81
|
className: "space-y-6",
|
|
81
82
|
children: [
|
|
82
|
-
/* @__PURE__ */
|
|
83
|
+
/* @__PURE__ */ f("div", {
|
|
83
84
|
className: "grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6",
|
|
84
85
|
children: [
|
|
85
|
-
/* @__PURE__ */
|
|
86
|
-
label: "Datasets",
|
|
87
|
-
icon:
|
|
88
|
-
loading: E.loading,
|
|
89
|
-
count: C(E.data?.cosListDatasets),
|
|
90
|
-
onClick: () => T("datasets")
|
|
91
|
-
}),
|
|
92
|
-
/* @__PURE__ */ u(w, {
|
|
93
|
-
label: "Sources",
|
|
94
|
-
icon: _,
|
|
95
|
-
loading: D.loading,
|
|
96
|
-
count: C(D.data?.cosListSources),
|
|
97
|
-
onClick: () => T("sources")
|
|
98
|
-
}),
|
|
99
|
-
/* @__PURE__ */ u(w, {
|
|
100
|
-
label: "Pipelines",
|
|
101
|
-
icon: y,
|
|
86
|
+
/* @__PURE__ */ d(T, {
|
|
87
|
+
label: D("nav.datasets", "Datasets"),
|
|
88
|
+
icon: m,
|
|
102
89
|
loading: O.loading,
|
|
103
|
-
count:
|
|
104
|
-
onClick: () =>
|
|
90
|
+
count: w(O.data?.cosListDatasets),
|
|
91
|
+
onClick: () => E("datasets")
|
|
105
92
|
}),
|
|
106
|
-
/* @__PURE__ */
|
|
107
|
-
label: "
|
|
108
|
-
icon:
|
|
93
|
+
/* @__PURE__ */ d(T, {
|
|
94
|
+
label: D("nav.sources", "Sources"),
|
|
95
|
+
icon: v,
|
|
109
96
|
loading: k.loading,
|
|
110
|
-
count:
|
|
111
|
-
onClick: () =>
|
|
97
|
+
count: w(k.data?.cosListSources),
|
|
98
|
+
onClick: () => E("sources")
|
|
112
99
|
}),
|
|
113
|
-
/* @__PURE__ */
|
|
114
|
-
label: "
|
|
115
|
-
icon:
|
|
100
|
+
/* @__PURE__ */ d(T, {
|
|
101
|
+
label: D("nav.pipelines", "Pipelines"),
|
|
102
|
+
icon: b,
|
|
116
103
|
loading: A.loading,
|
|
117
|
-
count:
|
|
118
|
-
onClick: () =>
|
|
104
|
+
count: w(A.data?.cosListPipelines),
|
|
105
|
+
onClick: () => E("pipelines")
|
|
119
106
|
}),
|
|
120
|
-
/* @__PURE__ */
|
|
121
|
-
label: "
|
|
122
|
-
icon:
|
|
107
|
+
/* @__PURE__ */ d(T, {
|
|
108
|
+
label: D("nav.runs", "Runs"),
|
|
109
|
+
icon: p,
|
|
123
110
|
loading: j.loading,
|
|
124
|
-
count:
|
|
125
|
-
onClick: () =>
|
|
111
|
+
count: w(j.data?.cosListRuns),
|
|
112
|
+
onClick: () => E("runs")
|
|
113
|
+
}),
|
|
114
|
+
/* @__PURE__ */ d(T, {
|
|
115
|
+
label: D("nav.notebooks", "Notebooks"),
|
|
116
|
+
icon: g,
|
|
117
|
+
loading: M.loading,
|
|
118
|
+
count: w(M.data?.cosListNotebooks),
|
|
119
|
+
onClick: () => E("notebooks")
|
|
120
|
+
}),
|
|
121
|
+
/* @__PURE__ */ d(T, {
|
|
122
|
+
label: D("nav.releases", "Releases"),
|
|
123
|
+
icon: h,
|
|
124
|
+
loading: N.loading,
|
|
125
|
+
count: w(N.data?.cosListReleases),
|
|
126
|
+
onClick: () => E("releases")
|
|
126
127
|
})
|
|
127
128
|
]
|
|
128
129
|
}),
|
|
129
|
-
/* @__PURE__ */
|
|
130
|
+
/* @__PURE__ */ f("div", {
|
|
130
131
|
className: "rounded-card border border-border-default bg-bg-elevated p-5",
|
|
131
|
-
children: [/* @__PURE__ */
|
|
132
|
+
children: [/* @__PURE__ */ d("h2", {
|
|
132
133
|
className: "text-sm font-semibold text-text-primary",
|
|
133
|
-
children: "Quick actions"
|
|
134
|
-
}), /* @__PURE__ */
|
|
134
|
+
children: D("cosmicintersection.pages.dashboard.quickActions", "Quick actions")
|
|
135
|
+
}), /* @__PURE__ */ f("div", {
|
|
135
136
|
className: "mt-3 flex flex-wrap gap-2",
|
|
136
137
|
children: [
|
|
137
|
-
/* @__PURE__ */
|
|
138
|
+
/* @__PURE__ */ f(x, {
|
|
138
139
|
type: "button",
|
|
139
140
|
variant: "outline",
|
|
140
|
-
onClick: () =>
|
|
141
|
-
children: [/* @__PURE__ */
|
|
141
|
+
onClick: () => E("datasets/create"),
|
|
142
|
+
children: [/* @__PURE__ */ d(m, { className: "size-4" }), D("cosmicintersection.pages.dashboard.registerDataset", "Register dataset")]
|
|
142
143
|
}),
|
|
143
|
-
/* @__PURE__ */
|
|
144
|
+
/* @__PURE__ */ f(x, {
|
|
144
145
|
type: "button",
|
|
145
146
|
variant: "outline",
|
|
146
|
-
onClick: () =>
|
|
147
|
-
children: [/* @__PURE__ */
|
|
147
|
+
onClick: () => E("sources/create"),
|
|
148
|
+
children: [/* @__PURE__ */ d(v, { className: "size-4" }), D("cosmicintersection.pages.dashboard.connectSource", "Connect source")]
|
|
148
149
|
}),
|
|
149
|
-
/* @__PURE__ */
|
|
150
|
+
/* @__PURE__ */ f(x, {
|
|
150
151
|
type: "button",
|
|
151
152
|
variant: "outline",
|
|
152
|
-
onClick: () =>
|
|
153
|
-
children: [/* @__PURE__ */
|
|
153
|
+
onClick: () => E("pipelines/create"),
|
|
154
|
+
children: [/* @__PURE__ */ d(b, { className: "size-4" }), D("cosmicintersection.pages.dashboard.createPipeline", "Create pipeline")]
|
|
154
155
|
})
|
|
155
156
|
]
|
|
156
157
|
})]
|
|
157
158
|
}),
|
|
158
|
-
/* @__PURE__ */
|
|
159
|
+
/* @__PURE__ */ f("div", {
|
|
159
160
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
|
|
160
|
-
children: [/* @__PURE__ */
|
|
161
|
+
children: [/* @__PURE__ */ f("section", {
|
|
161
162
|
className: "space-y-3",
|
|
162
|
-
children: [/* @__PURE__ */
|
|
163
|
+
children: [/* @__PURE__ */ f("div", {
|
|
163
164
|
className: "flex items-center justify-between",
|
|
164
|
-
children: [/* @__PURE__ */
|
|
165
|
+
children: [/* @__PURE__ */ d("h2", {
|
|
165
166
|
className: "text-lg font-semibold text-text-primary",
|
|
166
|
-
children: "Recent runs"
|
|
167
|
-
}), /* @__PURE__ */
|
|
167
|
+
children: D("cosmicintersection.pages.dashboard.recentRuns", "Recent runs")
|
|
168
|
+
}), /* @__PURE__ */ d("button", {
|
|
168
169
|
type: "button",
|
|
169
|
-
onClick: () =>
|
|
170
|
+
onClick: () => E("runs"),
|
|
170
171
|
className: "text-sm text-text-secondary underline-offset-2 hover:text-text-primary hover:underline",
|
|
171
|
-
children: "View all"
|
|
172
|
+
children: D("cosmicintersection.pages.dashboard.viewAll", "View all")
|
|
172
173
|
})]
|
|
173
|
-
}),
|
|
174
|
+
}), j.loading ? /* @__PURE__ */ d("div", {
|
|
174
175
|
className: "space-y-2",
|
|
175
|
-
children: Array.from({ length: 3 }).map((e, t) => /* @__PURE__ */
|
|
176
|
-
}) :
|
|
177
|
-
icon:
|
|
178
|
-
title: "No pipeline runs yet.",
|
|
179
|
-
description: "Start a pipeline run to see execution history here."
|
|
180
|
-
}) : /* @__PURE__ */
|
|
176
|
+
children: Array.from({ length: 3 }).map((e, t) => /* @__PURE__ */ d("div", { className: "h-14 animate-pulse rounded-card bg-bg-sunken" }, t))
|
|
177
|
+
}) : F.length === 0 ? /* @__PURE__ */ d(c, {
|
|
178
|
+
icon: p,
|
|
179
|
+
title: D("cosmicintersection.pages.dashboard.noRunsYet", "No pipeline runs yet."),
|
|
180
|
+
description: D("cosmicintersection.pages.dashboard.noRunsDescription", "Start a pipeline run to see execution history here.")
|
|
181
|
+
}) : /* @__PURE__ */ d("ul", {
|
|
181
182
|
className: "space-y-2",
|
|
182
|
-
children:
|
|
183
|
+
children: F.map((e) => /* @__PURE__ */ d("li", { children: /* @__PURE__ */ f("button", {
|
|
183
184
|
type: "button",
|
|
184
|
-
onClick: () =>
|
|
185
|
+
onClick: () => E(`runs/${e.id}`),
|
|
185
186
|
className: "flex w-full items-center justify-between gap-3 rounded-card border border-border-default bg-bg-elevated px-4 py-3 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken",
|
|
186
|
-
children: [/* @__PURE__ */
|
|
187
|
+
children: [/* @__PURE__ */ f("div", {
|
|
187
188
|
className: "min-w-0",
|
|
188
189
|
children: [/* @__PURE__ */ d("p", {
|
|
189
190
|
className: "font-medium text-text-primary",
|
|
190
|
-
children:
|
|
191
|
-
}), /* @__PURE__ */
|
|
191
|
+
children: D("cosmicintersection.pages.dashboard.runNumber", "Run #{{number}}", { number: e.runNumber })
|
|
192
|
+
}), /* @__PURE__ */ d("p", {
|
|
192
193
|
className: "text-xs text-text-secondary",
|
|
193
|
-
children: e.startedAt ?
|
|
194
|
+
children: e.startedAt ? D("cosmicintersection.pages.dashboard.startedAt", "Started {{date}}", { date: C(e.startedAt) }) : D("cosmicintersection.pages.dashboard.runNotStarted", "Not started")
|
|
194
195
|
})]
|
|
195
|
-
}), /* @__PURE__ */ u
|
|
196
|
+
}), /* @__PURE__ */ d(u, { status: e.status })]
|
|
196
197
|
}) }, e.id))
|
|
197
198
|
})]
|
|
198
|
-
}), /* @__PURE__ */
|
|
199
|
+
}), /* @__PURE__ */ f("section", {
|
|
199
200
|
className: "space-y-3",
|
|
200
|
-
children: [/* @__PURE__ */
|
|
201
|
+
children: [/* @__PURE__ */ f("div", {
|
|
201
202
|
className: "flex items-center justify-between",
|
|
202
|
-
children: [/* @__PURE__ */
|
|
203
|
+
children: [/* @__PURE__ */ d("h2", {
|
|
203
204
|
className: "text-lg font-semibold text-text-primary",
|
|
204
|
-
children: "Recently published"
|
|
205
|
-
}), /* @__PURE__ */
|
|
205
|
+
children: D("cosmicintersection.pages.dashboard.recentlyPublished", "Recently published")
|
|
206
|
+
}), /* @__PURE__ */ d("button", {
|
|
206
207
|
type: "button",
|
|
207
|
-
onClick: () =>
|
|
208
|
+
onClick: () => E("releases"),
|
|
208
209
|
className: "text-sm text-text-secondary underline-offset-2 hover:text-text-primary hover:underline",
|
|
209
|
-
children: "View all"
|
|
210
|
+
children: D("cosmicintersection.pages.dashboard.viewAll", "View all")
|
|
210
211
|
})]
|
|
211
|
-
}),
|
|
212
|
+
}), P.loading ? /* @__PURE__ */ d("div", {
|
|
212
213
|
className: "space-y-2",
|
|
213
|
-
children: Array.from({ length: 3 }).map((e, t) => /* @__PURE__ */
|
|
214
|
-
}) :
|
|
215
|
-
icon:
|
|
216
|
-
title: "No published releases yet.",
|
|
217
|
-
description: "Publish a release to share datasets and notebooks with a citable version."
|
|
218
|
-
}) : /* @__PURE__ */
|
|
214
|
+
children: Array.from({ length: 3 }).map((e, t) => /* @__PURE__ */ d("div", { className: "h-14 animate-pulse rounded-card bg-bg-sunken" }, t))
|
|
215
|
+
}) : I.length === 0 ? /* @__PURE__ */ d(c, {
|
|
216
|
+
icon: y,
|
|
217
|
+
title: D("cosmicintersection.pages.dashboard.noPublishedReleases", "No published releases yet."),
|
|
218
|
+
description: D("cosmicintersection.pages.dashboard.noPublishedReleasesDescription", "Publish a release to share datasets and notebooks with a citable version.")
|
|
219
|
+
}) : /* @__PURE__ */ d("ul", {
|
|
219
220
|
className: "space-y-2",
|
|
220
|
-
children:
|
|
221
|
+
children: I.map((e) => /* @__PURE__ */ d("li", { children: /* @__PURE__ */ f("button", {
|
|
221
222
|
type: "button",
|
|
222
|
-
onClick: () =>
|
|
223
|
+
onClick: () => E("releases"),
|
|
223
224
|
className: "flex w-full items-center justify-between gap-3 rounded-card border border-border-default bg-bg-elevated px-4 py-3 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken",
|
|
224
|
-
children: [/* @__PURE__ */
|
|
225
|
+
children: [/* @__PURE__ */ f("div", {
|
|
225
226
|
className: "min-w-0",
|
|
226
227
|
children: [
|
|
227
|
-
/* @__PURE__ */
|
|
228
|
+
/* @__PURE__ */ d("p", {
|
|
228
229
|
className: "truncate font-medium text-text-primary",
|
|
229
230
|
children: e.title
|
|
230
231
|
}),
|
|
231
|
-
/* @__PURE__ */
|
|
232
|
+
/* @__PURE__ */ f("p", {
|
|
232
233
|
className: "text-xs text-text-secondary",
|
|
233
234
|
children: [
|
|
234
235
|
"v",
|
|
235
236
|
e.version,
|
|
236
|
-
e.publishedAt ? ` · Published
|
|
237
|
+
e.publishedAt ? ` · ${D("cosmicintersection.pages.dashboard.publishedAt", "Published {{date}}", { date: C(e.publishedAt) })}` : ""
|
|
237
238
|
]
|
|
238
239
|
}),
|
|
239
|
-
e.doi ? /* @__PURE__ */
|
|
240
|
+
e.doi ? /* @__PURE__ */ f("p", {
|
|
240
241
|
className: "mt-0.5 truncate font-mono text-xs text-text-tertiary",
|
|
241
242
|
title: e.doi,
|
|
242
243
|
children: ["DOI: ", e.doi]
|
|
243
244
|
}) : null
|
|
244
245
|
]
|
|
245
|
-
}), /* @__PURE__ */ u
|
|
246
|
+
}), /* @__PURE__ */ d(u, { status: e.status })]
|
|
246
247
|
}) }, e.id))
|
|
247
248
|
})]
|
|
248
249
|
})]
|
|
@@ -252,6 +253,6 @@ function T() {
|
|
|
252
253
|
});
|
|
253
254
|
}
|
|
254
255
|
//#endregion
|
|
255
|
-
export {
|
|
256
|
+
export { E as default };
|
|
256
257
|
|
|
257
258
|
//# sourceMappingURL=DashboardPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/dashboard/DashboardPage.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport {\n Boxes,\n Database,\n FileText,\n NotebookPen,\n Plus,\n Radar,\n Rocket,\n Workflow,\n} from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\n\nimport {\n useCosDatasetsQuery,\n useCosNotebooksQuery,\n useCosPipelinesQuery,\n useCosReleasesQuery,\n useCosRunsQuery,\n useCosSourcesQuery,\n type CosConnection,\n} from '../../api/cosmicApi';\nimport { EmptyState, PageLayout, StatusBadge } from '../../components';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\n\nconst TILE_LIMIT = 50;\n\nfunction formatDateTime(raw: string | null | undefined): string {\n if (!raw) {\n return '—';\n }\n const date = new Date(raw);\n return Number.isNaN(date.getTime()) ? '—' : date.toLocaleString();\n}\n\n/** \"13\" or \"50+\" — the honest count of the page we fetched, never a fabricated total. */\nfunction connectionCount<T>(connection: CosConnection<T> | undefined): string {\n if (!connection) {\n return '—';\n }\n const loaded = connection.items.length;\n return connection.pageInfo?.hasMore ? `${loaded}+` : String(loaded);\n}\n\ninterface SummaryTileProps {\n label: string;\n count: string;\n icon: LucideIcon;\n loading: boolean;\n onClick: () => void;\n}\n\nfunction SummaryTile({ label, count, icon: Icon, loading, onClick }: SummaryTileProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group flex flex-col gap-2 rounded-card border border-border-default bg-bg-elevated p-4 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus\"\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-secondary\">{label}</span>\n <span className=\"flex size-8 items-center justify-center rounded-button border border-border-default bg-bg-sunken text-text-secondary transition-colors group-hover:border-border-strong\">\n <Icon className=\"size-4\" aria-hidden=\"true\" />\n </span>\n </div>\n <span className=\"text-2xl font-semibold tabular-nums text-text-primary\">\n {loading ? '…' : count}\n </span>\n </button>\n );\n}\n\nexport default function DashboardPage() {\n const { navigate } = useCosmicIntersection();\n\n const datasetsQuery = useCosDatasetsQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const sourcesQuery = useCosSourcesQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const pipelinesQuery = useCosPipelinesQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const runsQuery = useCosRunsQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const notebooksQuery = useCosNotebooksQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const releasesQuery = useCosReleasesQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const publishedQuery = useCosReleasesQuery({\n status: 'PUBLISHED',\n pagination: { limit: 5, offset: 0 },\n });\n\n const recentRuns = (runsQuery.data?.cosListRuns?.items ?? []).slice(0, 6);\n const publishedReleases = publishedQuery.data?.cosListReleases?.items ?? [];\n\n return (\n <PageLayout\n title=\"CosmicIntersection\"\n description=\"A federation workspace for science data — sources, datasets, pipelines, notebooks and releases in one place.\"\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-6\">\n {/* Summary tiles */}\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6\">\n <SummaryTile\n label=\"Datasets\"\n icon={Database}\n loading={datasetsQuery.loading}\n count={connectionCount(datasetsQuery.data?.cosListDatasets)}\n onClick={() => navigate('datasets')}\n />\n <SummaryTile\n label=\"Sources\"\n icon={Radar}\n loading={sourcesQuery.loading}\n count={connectionCount(sourcesQuery.data?.cosListSources)}\n onClick={() => navigate('sources')}\n />\n <SummaryTile\n label=\"Pipelines\"\n icon={Workflow}\n loading={pipelinesQuery.loading}\n count={connectionCount(pipelinesQuery.data?.cosListPipelines)}\n onClick={() => navigate('pipelines')}\n />\n <SummaryTile\n label=\"Runs\"\n icon={Boxes}\n loading={runsQuery.loading}\n count={connectionCount(runsQuery.data?.cosListRuns)}\n onClick={() => navigate('runs')}\n />\n <SummaryTile\n label=\"Notebooks\"\n icon={NotebookPen}\n loading={notebooksQuery.loading}\n count={connectionCount(notebooksQuery.data?.cosListNotebooks)}\n onClick={() => navigate('notebooks')}\n />\n <SummaryTile\n label=\"Releases\"\n icon={FileText}\n loading={releasesQuery.loading}\n count={connectionCount(releasesQuery.data?.cosListReleases)}\n onClick={() => navigate('releases')}\n />\n </div>\n\n {/* Quick actions */}\n <div className=\"rounded-card border border-border-default bg-bg-elevated p-5\">\n <h2 className=\"text-sm font-semibold text-text-primary\">Quick actions</h2>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={() => navigate('datasets/create')}>\n <Database className=\"size-4\" />\n Register dataset\n </Button>\n <Button type=\"button\" variant=\"outline\" onClick={() => navigate('sources/create')}>\n <Radar className=\"size-4\" />\n Connect source\n </Button>\n <Button type=\"button\" variant=\"outline\" onClick={() => navigate('pipelines/create')}>\n <Workflow className=\"size-4\" />\n Create pipeline\n </Button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Recent runs */}\n <section className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Recent runs</h2>\n <button\n type=\"button\"\n onClick={() => navigate('runs')}\n className=\"text-sm text-text-secondary underline-offset-2 hover:text-text-primary hover:underline\"\n >\n View all\n </button>\n </div>\n {runsQuery.loading ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"h-14 animate-pulse rounded-card bg-bg-sunken\" />\n ))}\n </div>\n ) : recentRuns.length === 0 ? (\n <EmptyState\n icon={Boxes}\n title=\"No pipeline runs yet.\"\n description=\"Start a pipeline run to see execution history here.\"\n />\n ) : (\n <ul className=\"space-y-2\">\n {recentRuns.map((run) => (\n <li key={run.id}>\n <button\n type=\"button\"\n onClick={() => navigate(`runs/${run.id}`)}\n className=\"flex w-full items-center justify-between gap-3 rounded-card border border-border-default bg-bg-elevated px-4 py-3 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken\"\n >\n <div className=\"min-w-0\">\n <p className=\"font-medium text-text-primary\">Run #{run.runNumber}</p>\n <p className=\"text-xs text-text-secondary\">\n {run.startedAt\n ? `Started ${formatDateTime(run.startedAt)}`\n : 'Not started'}\n </p>\n </div>\n <StatusBadge status={run.status} />\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n\n {/* Recently published releases */}\n <section className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Recently published</h2>\n <button\n type=\"button\"\n onClick={() => navigate('releases')}\n className=\"text-sm text-text-secondary underline-offset-2 hover:text-text-primary hover:underline\"\n >\n View all\n </button>\n </div>\n {publishedQuery.loading ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"h-14 animate-pulse rounded-card bg-bg-sunken\" />\n ))}\n </div>\n ) : publishedReleases.length === 0 ? (\n <EmptyState\n icon={Rocket}\n title=\"No published releases yet.\"\n description=\"Publish a release to share datasets and notebooks with a citable version.\"\n />\n ) : (\n <ul className=\"space-y-2\">\n {publishedReleases.map((release) => (\n <li key={release.id}>\n <button\n type=\"button\"\n onClick={() => navigate('releases')}\n className=\"flex w-full items-center justify-between gap-3 rounded-card border border-border-default bg-bg-elevated px-4 py-3 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken\"\n >\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">{release.title}</p>\n <p className=\"text-xs text-text-secondary\">\n v{release.version}\n {release.publishedAt\n ? ` · Published ${formatDateTime(release.publishedAt)}`\n : ''}\n </p>\n {release.doi ? (\n <p\n className=\"mt-0.5 truncate font-mono text-xs text-text-tertiary\"\n title={release.doi}\n >\n DOI: {release.doi}\n </p>\n ) : null}\n </div>\n <StatusBadge status={release.status} />\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;AAyBA,IAAM,IAAa;AAEnB,SAAS,EAAe,GAAwC;CAC9D,IAAI,CAAC,GACH,OAAO;CAET,IAAM,IAAO,IAAI,KAAK,CAAG;CACzB,OAAO,OAAO,MAAM,EAAK,QAAQ,CAAC,IAAI,MAAM,EAAK,eAAe;AAClE;AAGA,SAAS,EAAmB,GAAkD;CAC5E,IAAI,CAAC,GACH,OAAO;CAET,IAAM,IAAS,EAAW,MAAM;CAChC,OAAO,EAAW,UAAU,UAAU,GAAG,EAAO,KAAK,OAAO,CAAM;AACpE;AAUA,SAAS,EAAY,EAAE,UAAO,UAAO,MAAM,GAAM,YAAS,cAA6B;CACrF,OACE,kBAAC,UAAD;EACE,MAAK;EACI;EACT,WAAU;YAHZ,CAKE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,QAAD;IAAM,WAAU;cAA2C;GAAY,CAAA,GACvE,kBAAC,QAAD;IAAM,WAAU;cACd,kBAAC,GAAD;KAAM,WAAU;KAAS,eAAY;IAAQ,CAAA;GACzC,CAAA,CACH;MACL,kBAAC,QAAD;GAAM,WAAU;aACb,IAAU,MAAM;EACb,CAAA,CACA;;AAEZ;AAEA,SAAwB,IAAgB;CACtC,IAAM,EAAE,gBAAa,EAAsB,GAErC,IAAgB,EAAoB,EAAE,YAAY;EAAE,OAAO;EAAY,QAAQ;CAAE,EAAE,CAAC,GACpF,IAAe,EAAmB,EAAE,YAAY;EAAE,OAAO;EAAY,QAAQ;CAAE,EAAE,CAAC,GAClF,IAAiB,EAAqB,EAAE,YAAY;EAAE,OAAO;EAAY,QAAQ;CAAE,EAAE,CAAC,GACtF,IAAY,EAAgB,EAAE,YAAY;EAAE,OAAO;EAAY,QAAQ;CAAE,EAAE,CAAC,GAC5E,IAAiB,EAAqB,EAAE,YAAY;EAAE,OAAO;EAAY,QAAQ;CAAE,EAAE,CAAC,GACtF,IAAgB,EAAoB,EAAE,YAAY;EAAE,OAAO;EAAY,QAAQ;CAAE,EAAE,CAAC,GACpF,IAAiB,EAAoB;EACzC,QAAQ;EACR,YAAY;GAAE,OAAO;GAAG,QAAQ;EAAE;CACpC,CAAC,GAEK,KAAc,EAAU,MAAM,aAAa,SAAS,CAAC,GAAG,MAAM,GAAG,CAAC,GAClE,IAAoB,EAAe,MAAM,iBAAiB,SAAS,CAAC;CAE1E,OACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,GAAD;GAAQ,MAAK;GAAS,eAAe,EAAS,iBAAiB;aAA/D,CACE,kBAAC,GAAD,EAAM,WAAU,SAAU,CAAA,GAAC,aAErB;;YAGV,kBAAC,OAAD;GAAK,WAAU;aAAf;IAEE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OACE,OAAM;OACN,MAAM;OACN,SAAS,EAAc;OACvB,OAAO,EAAgB,EAAc,MAAM,eAAe;OAC1D,eAAe,EAAS,UAAU;MACnC,CAAA;MACD,kBAAC,GAAD;OACE,OAAM;OACN,MAAM;OACN,SAAS,EAAa;OACtB,OAAO,EAAgB,EAAa,MAAM,cAAc;OACxD,eAAe,EAAS,SAAS;MAClC,CAAA;MACD,kBAAC,GAAD;OACE,OAAM;OACN,MAAM;OACN,SAAS,EAAe;OACxB,OAAO,EAAgB,EAAe,MAAM,gBAAgB;OAC5D,eAAe,EAAS,WAAW;MACpC,CAAA;MACD,kBAAC,GAAD;OACE,OAAM;OACN,MAAM;OACN,SAAS,EAAU;OACnB,OAAO,EAAgB,EAAU,MAAM,WAAW;OAClD,eAAe,EAAS,MAAM;MAC/B,CAAA;MACD,kBAAC,GAAD;OACE,OAAM;OACN,MAAM;OACN,SAAS,EAAe;OACxB,OAAO,EAAgB,EAAe,MAAM,gBAAgB;OAC5D,eAAe,EAAS,WAAW;MACpC,CAAA;MACD,kBAAC,GAAD;OACE,OAAM;OACN,MAAM;OACN,SAAS,EAAc;OACvB,OAAO,EAAgB,EAAc,MAAM,eAAe;OAC1D,eAAe,EAAS,UAAU;MACnC,CAAA;KACE;;IAGL,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,MAAD;MAAI,WAAU;gBAA0C;KAAiB,CAAA,GACzE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD;QAAQ,MAAK;QAAS,SAAQ;QAAU,eAAe,EAAS,iBAAiB;kBAAjF,CACE,kBAAC,GAAD,EAAU,WAAU,SAAU,CAAA,GAAC,kBAEzB;;OACR,kBAAC,GAAD;QAAQ,MAAK;QAAS,SAAQ;QAAU,eAAe,EAAS,gBAAgB;kBAAhF,CACE,kBAAC,GAAD,EAAO,WAAU,SAAU,CAAA,GAAC,gBAEtB;;OACR,kBAAC,GAAD;QAAQ,MAAK;QAAS,SAAQ;QAAU,eAAe,EAAS,kBAAkB;kBAAlF,CACE,kBAAC,GAAD,EAAU,WAAU,SAAU,CAAA,GAAC,iBAEzB;;MACL;OACF;;IAEL,kBAAC,OAAD;KAAK,WAAU;eAAf,CAEE,kBAAC,WAAD;MAAS,WAAU;gBAAnB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,MAAD;QAAI,WAAU;kBAA0C;OAAe,CAAA,GACvE,kBAAC,UAAD;QACE,MAAK;QACL,eAAe,EAAS,MAAM;QAC9B,WAAU;kBACX;OAEO,CAAA,CACL;UACJ,EAAU,UACT,kBAAC,OAAD;OAAK,WAAU;iBACZ,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,GAAG,MACjC,kBAAC,OAAD,EAAiB,WAAU,+CAAgD,GAAjE,CAAiE,CAC5E;MACE,CAAA,IACH,EAAW,WAAW,IACxB,kBAAC,GAAD;OACE,MAAM;OACN,OAAM;OACN,aAAY;MACb,CAAA,IAED,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAW,KAAK,MACf,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;QACE,MAAK;QACL,eAAe,EAAS,QAAQ,EAAI,IAAI;QACxC,WAAU;kBAHZ,CAKE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,KAAD;UAAG,WAAU;oBAAb,CAA6C,SAAM,EAAI,SAAa;aACpE,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAI,YACD,WAAW,EAAe,EAAI,SAAS,MACvC;SACH,CAAA,CACA;YACL,kBAAC,GAAD,EAAa,QAAQ,EAAI,OAAS,CAAA,CAC5B;UACN,GAhBK,EAAI,EAgBT,CACL;MACC,CAAA,CAEC;SAGT,kBAAC,WAAD;MAAS,WAAU;gBAAnB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,MAAD;QAAI,WAAU;kBAA0C;OAAsB,CAAA,GAC9E,kBAAC,UAAD;QACE,MAAK;QACL,eAAe,EAAS,UAAU;QAClC,WAAU;kBACX;OAEO,CAAA,CACL;UACJ,EAAe,UACd,kBAAC,OAAD;OAAK,WAAU;iBACZ,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,GAAG,MACjC,kBAAC,OAAD,EAAiB,WAAU,+CAAgD,GAAjE,CAAiE,CAC5E;MACE,CAAA,IACH,EAAkB,WAAW,IAC/B,kBAAC,GAAD;OACE,MAAM;OACN,OAAM;OACN,aAAY;MACb,CAAA,IAED,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAkB,KAAK,MACtB,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;QACE,MAAK;QACL,eAAe,EAAS,UAAU;QAClC,WAAU;kBAHZ,CAKE,kBAAC,OAAD;SAAK,WAAU;mBAAf;UACE,kBAAC,KAAD;WAAG,WAAU;qBAA0C,EAAQ;UAAS,CAAA;UACxE,kBAAC,KAAD;WAAG,WAAU;qBAAb;YAA2C;YACvC,EAAQ;YACT,EAAQ,cACL,gBAAgB,EAAe,EAAQ,WAAW,MAClD;WACH;;UACF,EAAQ,MACP,kBAAC,KAAD;WACE,WAAU;WACV,OAAO,EAAQ;qBAFjB,CAGC,SACO,EAAQ,GACb;eACD;SACD;YACL,kBAAC,GAAD,EAAa,QAAQ,EAAQ,OAAS,CAAA,CAChC;UACN,GAzBK,EAAQ,EAyBb,CACL;MACC,CAAA,CAEC;OACN;;GACF;;CACK,CAAA;AAEhB"}
|
|
1
|
+
{"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/dashboard/DashboardPage.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport {\n Boxes,\n Database,\n FileText,\n NotebookPen,\n Plus,\n Radar,\n Rocket,\n Workflow,\n} from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\n\nimport {\n useCosDatasetsQuery,\n useCosNotebooksQuery,\n useCosPipelinesQuery,\n useCosReleasesQuery,\n useCosRunsQuery,\n useCosSourcesQuery,\n type CosConnection,\n} from '../../api/cosmicApi';\nimport { EmptyState, PageLayout, StatusBadge } from '../../components';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\nimport { useTr } from '../../../shared/hooks/useTr';\n\nconst TILE_LIMIT = 50;\n\nfunction formatDateTime(raw: string | null | undefined): string {\n if (!raw) {\n return '—';\n }\n const date = new Date(raw);\n return Number.isNaN(date.getTime()) ? '—' : date.toLocaleString();\n}\n\n/** \"13\" or \"50+\" — the honest count of the page we fetched, never a fabricated total. */\nfunction connectionCount<T>(connection: CosConnection<T> | undefined): string {\n if (!connection) {\n return '—';\n }\n const loaded = connection.items.length;\n return connection.pageInfo?.hasMore ? `${loaded}+` : String(loaded);\n}\n\ninterface SummaryTileProps {\n label: string;\n count: string;\n icon: LucideIcon;\n loading: boolean;\n onClick: () => void;\n}\n\nfunction SummaryTile({ label, count, icon: Icon, loading, onClick }: SummaryTileProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group flex flex-col gap-2 rounded-card border border-border-default bg-bg-elevated p-4 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus\"\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-secondary\">{label}</span>\n <span className=\"flex size-8 items-center justify-center rounded-button border border-border-default bg-bg-sunken text-text-secondary transition-colors group-hover:border-border-strong\">\n <Icon className=\"size-4\" aria-hidden=\"true\" />\n </span>\n </div>\n <span className=\"text-2xl font-semibold tabular-nums text-text-primary\">\n {loading ? '…' : count}\n </span>\n </button>\n );\n}\n\nexport default function DashboardPage() {\n const { navigate } = useCosmicIntersection();\n const tr = useTr();\n\n const datasetsQuery = useCosDatasetsQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const sourcesQuery = useCosSourcesQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const pipelinesQuery = useCosPipelinesQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const runsQuery = useCosRunsQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const notebooksQuery = useCosNotebooksQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const releasesQuery = useCosReleasesQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const publishedQuery = useCosReleasesQuery({\n status: 'PUBLISHED',\n pagination: { limit: 5, offset: 0 },\n });\n\n const recentRuns = (runsQuery.data?.cosListRuns?.items ?? []).slice(0, 6);\n const publishedReleases = publishedQuery.data?.cosListReleases?.items ?? [];\n\n return (\n <PageLayout\n title={tr('cosmicintersection.pages.dashboard.title', 'CosmicIntersection')}\n description={tr(\n 'cosmicintersection.pages.dashboard.description',\n 'A federation workspace for science data — sources, datasets, pipelines, notebooks and releases in one place.',\n )}\n actions={\n <Button type=\"button\" onClick={() => navigate('datasets/create')}>\n <Plus className=\"size-4\" />\n {tr('cosmicintersection.pages.dashboard.newDataset', 'New dataset')}\n </Button>\n }\n >\n <div className=\"space-y-6\">\n {/* Summary tiles */}\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6\">\n <SummaryTile\n label={tr('nav.datasets', 'Datasets')}\n icon={Database}\n loading={datasetsQuery.loading}\n count={connectionCount(datasetsQuery.data?.cosListDatasets)}\n onClick={() => navigate('datasets')}\n />\n <SummaryTile\n label={tr('nav.sources', 'Sources')}\n icon={Radar}\n loading={sourcesQuery.loading}\n count={connectionCount(sourcesQuery.data?.cosListSources)}\n onClick={() => navigate('sources')}\n />\n <SummaryTile\n label={tr('nav.pipelines', 'Pipelines')}\n icon={Workflow}\n loading={pipelinesQuery.loading}\n count={connectionCount(pipelinesQuery.data?.cosListPipelines)}\n onClick={() => navigate('pipelines')}\n />\n <SummaryTile\n label={tr('nav.runs', 'Runs')}\n icon={Boxes}\n loading={runsQuery.loading}\n count={connectionCount(runsQuery.data?.cosListRuns)}\n onClick={() => navigate('runs')}\n />\n <SummaryTile\n label={tr('nav.notebooks', 'Notebooks')}\n icon={NotebookPen}\n loading={notebooksQuery.loading}\n count={connectionCount(notebooksQuery.data?.cosListNotebooks)}\n onClick={() => navigate('notebooks')}\n />\n <SummaryTile\n label={tr('nav.releases', 'Releases')}\n icon={FileText}\n loading={releasesQuery.loading}\n count={connectionCount(releasesQuery.data?.cosListReleases)}\n onClick={() => navigate('releases')}\n />\n </div>\n\n {/* Quick actions */}\n <div className=\"rounded-card border border-border-default bg-bg-elevated p-5\">\n <h2 className=\"text-sm font-semibold text-text-primary\">\n {tr('cosmicintersection.pages.dashboard.quickActions', 'Quick actions')}\n </h2>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={() => navigate('datasets/create')}>\n <Database className=\"size-4\" />\n {tr('cosmicintersection.pages.dashboard.registerDataset', 'Register dataset')}\n </Button>\n <Button type=\"button\" variant=\"outline\" onClick={() => navigate('sources/create')}>\n <Radar className=\"size-4\" />\n {tr('cosmicintersection.pages.dashboard.connectSource', 'Connect source')}\n </Button>\n <Button type=\"button\" variant=\"outline\" onClick={() => navigate('pipelines/create')}>\n <Workflow className=\"size-4\" />\n {tr('cosmicintersection.pages.dashboard.createPipeline', 'Create pipeline')}\n </Button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Recent runs */}\n <section className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {tr('cosmicintersection.pages.dashboard.recentRuns', 'Recent runs')}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigate('runs')}\n className=\"text-sm text-text-secondary underline-offset-2 hover:text-text-primary hover:underline\"\n >\n {tr('cosmicintersection.pages.dashboard.viewAll', 'View all')}\n </button>\n </div>\n {runsQuery.loading ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"h-14 animate-pulse rounded-card bg-bg-sunken\" />\n ))}\n </div>\n ) : recentRuns.length === 0 ? (\n <EmptyState\n icon={Boxes}\n title={tr('cosmicintersection.pages.dashboard.noRunsYet', 'No pipeline runs yet.')}\n description={tr(\n 'cosmicintersection.pages.dashboard.noRunsDescription',\n 'Start a pipeline run to see execution history here.',\n )}\n />\n ) : (\n <ul className=\"space-y-2\">\n {recentRuns.map((run) => (\n <li key={run.id}>\n <button\n type=\"button\"\n onClick={() => navigate(`runs/${run.id}`)}\n className=\"flex w-full items-center justify-between gap-3 rounded-card border border-border-default bg-bg-elevated px-4 py-3 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken\"\n >\n <div className=\"min-w-0\">\n <p className=\"font-medium text-text-primary\">\n {tr('cosmicintersection.pages.dashboard.runNumber', 'Run #{{number}}', {\n number: run.runNumber,\n })}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {run.startedAt\n ? tr(\n 'cosmicintersection.pages.dashboard.startedAt',\n 'Started {{date}}',\n { date: formatDateTime(run.startedAt) },\n )\n : tr(\n 'cosmicintersection.pages.dashboard.runNotStarted',\n 'Not started',\n )}\n </p>\n </div>\n <StatusBadge status={run.status} />\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n\n {/* Recently published releases */}\n <section className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {tr('cosmicintersection.pages.dashboard.recentlyPublished', 'Recently published')}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigate('releases')}\n className=\"text-sm text-text-secondary underline-offset-2 hover:text-text-primary hover:underline\"\n >\n {tr('cosmicintersection.pages.dashboard.viewAll', 'View all')}\n </button>\n </div>\n {publishedQuery.loading ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"h-14 animate-pulse rounded-card bg-bg-sunken\" />\n ))}\n </div>\n ) : publishedReleases.length === 0 ? (\n <EmptyState\n icon={Rocket}\n title={tr(\n 'cosmicintersection.pages.dashboard.noPublishedReleases',\n 'No published releases yet.',\n )}\n description={tr(\n 'cosmicintersection.pages.dashboard.noPublishedReleasesDescription',\n 'Publish a release to share datasets and notebooks with a citable version.',\n )}\n />\n ) : (\n <ul className=\"space-y-2\">\n {publishedReleases.map((release) => (\n <li key={release.id}>\n <button\n type=\"button\"\n onClick={() => navigate('releases')}\n className=\"flex w-full items-center justify-between gap-3 rounded-card border border-border-default bg-bg-elevated px-4 py-3 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken\"\n >\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">{release.title}</p>\n <p className=\"text-xs text-text-secondary\">\n v{release.version}\n {release.publishedAt\n ? ` · ${tr(\n 'cosmicintersection.pages.dashboard.publishedAt',\n 'Published {{date}}',\n { date: formatDateTime(release.publishedAt) },\n )}`\n : ''}\n </p>\n {release.doi ? (\n <p\n className=\"mt-0.5 truncate font-mono text-xs text-text-tertiary\"\n title={release.doi}\n >\n DOI: {release.doi}\n </p>\n ) : null}\n </div>\n <StatusBadge status={release.status} />\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatasetDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/datasets/DatasetDetailPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DatasetDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/datasets/DatasetDetailPage.tsx"],"names":[],"mappings":"AAiJA,MAAM,CAAC,OAAO,UAAU,iBAAiB,4CAwmBxC"}
|