@burdenoff/microfe-cosmicintersection 2026.525.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/CosmicIntersectionRoot.js +38 -113
- package/dist/cosmicintersection/CosmicIntersectionRoot.js.map +1 -1
- package/dist/cosmicintersection/CosmicIntersectionRoutes.js +110 -44
- package/dist/cosmicintersection/CosmicIntersectionRoutes.js.map +1 -1
- package/dist/cosmicintersection/api/cosmicApi.js +918 -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/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/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 +13 -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 +347 -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 +177 -0
- package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/collections/CollectionFormPage.js +143 -0
- package/dist/cosmicintersection/pages/collections/CollectionFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/collections/CollectionsPage.js +112 -0
- package/dist/cosmicintersection/pages/collections/CollectionsPage.js.map +1 -0
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.js +246 -0
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.js.map +1 -0
- package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js +480 -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 +402 -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 +418 -0
- package/dist/cosmicintersection/pages/releases/ReleasesPage.js.map +1 -0
- package/dist/cosmicintersection/pages/runs/RunDetailPage.js +380 -0
- package/dist/cosmicintersection/pages/runs/RunDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/runs/RunsPage.js +165 -0
- package/dist/cosmicintersection/pages/runs/RunsPage.js.map +1 -0
- package/dist/cosmicintersection/pages/sources/SourceDetailPage.js +205 -0
- package/dist/cosmicintersection/pages/sources/SourceDetailPage.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 +223 -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,223 @@
|
|
|
1
|
+
import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
|
|
2
|
+
import { notify as t } from "../../lib/toast.js";
|
|
3
|
+
import { useCosArchiveSourceMutation as n, useCosMarkSourceSyncedMutation as r, useCosSourcesQuery 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/SafeLink.js";
|
|
9
|
+
import u from "../../components/PageLayout.js";
|
|
10
|
+
import d, { usePagination as f } from "../../components/Pagination.js";
|
|
11
|
+
import p, { formatEnumLabel as m } from "../../components/StatusBadge.js";
|
|
12
|
+
import "../../components/index.js";
|
|
13
|
+
import { useMemo as h, useState as g } from "react";
|
|
14
|
+
import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
15
|
+
import { Plus as ee, Radio as b, RefreshCw as x } from "lucide-react";
|
|
16
|
+
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 A, TableCell as j, TableHead as M, TableHeader as N, TableRow as P } from "@burdenoff/fe-libs/ui";
|
|
17
|
+
//#region src/cosmicintersection/pages/sources/SourcesPage.tsx
|
|
18
|
+
var F = "ALL", I = [
|
|
19
|
+
"TELESCOPE",
|
|
20
|
+
"SATELLITE",
|
|
21
|
+
"GROUND_SENSOR",
|
|
22
|
+
"ARCHIVE",
|
|
23
|
+
"API",
|
|
24
|
+
"STREAM",
|
|
25
|
+
"FILE_DROP",
|
|
26
|
+
"SIMULATION"
|
|
27
|
+
], L = [
|
|
28
|
+
"CONFIGURING",
|
|
29
|
+
"CONNECTED",
|
|
30
|
+
"SYNCING",
|
|
31
|
+
"DEGRADED",
|
|
32
|
+
"ERROR",
|
|
33
|
+
"DISABLED"
|
|
34
|
+
];
|
|
35
|
+
function R(e) {
|
|
36
|
+
if (!e) return "—";
|
|
37
|
+
let t = new Date(e);
|
|
38
|
+
return Number.isNaN(t.getTime()) ? "—" : t.toLocaleDateString(void 0, {
|
|
39
|
+
year: "numeric",
|
|
40
|
+
month: "short",
|
|
41
|
+
day: "numeric"
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function z() {
|
|
45
|
+
let { navigate: z } = e(), [B, V] = g(F), [H, U] = g(F), W = f({
|
|
46
|
+
pageSize: 20,
|
|
47
|
+
resetKey: `${B}|${H}`
|
|
48
|
+
}), { data: G, loading: K, error: q, refetch: J } = i({
|
|
49
|
+
type: B === F ? void 0 : B,
|
|
50
|
+
status: H === F ? void 0 : H,
|
|
51
|
+
pagination: {
|
|
52
|
+
limit: W.limit,
|
|
53
|
+
offset: W.offset
|
|
54
|
+
}
|
|
55
|
+
}), [Y] = r(), [X] = n(), Z = h(() => G?.cosListSources.items ?? [], [G]), Q = G?.cosListSources.pageInfo, te = async (e) => {
|
|
56
|
+
(await Y({ variables: { id: e.id } })).data?.cosMarkSourceSynced && (t.success("Source marked synced", `“${e.name}” is now up to date.`), await J());
|
|
57
|
+
}, ne = async (e) => {
|
|
58
|
+
let n = await X({ variables: { id: e.id } });
|
|
59
|
+
if (n.error) throw Error(n.error.message);
|
|
60
|
+
if (!n.data?.cosArchiveSource) throw t.error("Could not archive source", "The server did not confirm the change."), Error("Archive not confirmed");
|
|
61
|
+
t.success("Source archived"), await J();
|
|
62
|
+
}, $ = /* @__PURE__ */ y(C, {
|
|
63
|
+
type: "button",
|
|
64
|
+
onClick: () => z("sources/create"),
|
|
65
|
+
children: [/* @__PURE__ */ v(ee, { className: "size-4" }), "New source"]
|
|
66
|
+
});
|
|
67
|
+
return /* @__PURE__ */ v(u, {
|
|
68
|
+
title: "Data sources",
|
|
69
|
+
description: "Instruments, archives and feeds that supply raw data into your federation.",
|
|
70
|
+
actions: $,
|
|
71
|
+
children: /* @__PURE__ */ y("div", {
|
|
72
|
+
className: "space-y-4",
|
|
73
|
+
children: [/* @__PURE__ */ y("div", {
|
|
74
|
+
className: "flex flex-wrap items-center gap-3",
|
|
75
|
+
children: [/* @__PURE__ */ v("div", {
|
|
76
|
+
className: "w-full max-w-[14rem]",
|
|
77
|
+
children: /* @__PURE__ */ y(w, {
|
|
78
|
+
value: B,
|
|
79
|
+
onValueChange: V,
|
|
80
|
+
children: [/* @__PURE__ */ v(D, {
|
|
81
|
+
"aria-label": "Filter by type",
|
|
82
|
+
children: /* @__PURE__ */ v(O, { placeholder: "All types" })
|
|
83
|
+
}), /* @__PURE__ */ y(T, { children: [/* @__PURE__ */ v(E, {
|
|
84
|
+
value: F,
|
|
85
|
+
children: "All types"
|
|
86
|
+
}), I.map((e) => /* @__PURE__ */ v(E, {
|
|
87
|
+
value: e,
|
|
88
|
+
children: m(e)
|
|
89
|
+
}, e))] })]
|
|
90
|
+
})
|
|
91
|
+
}), /* @__PURE__ */ v("div", {
|
|
92
|
+
className: "w-full max-w-[14rem]",
|
|
93
|
+
children: /* @__PURE__ */ y(w, {
|
|
94
|
+
value: H,
|
|
95
|
+
onValueChange: U,
|
|
96
|
+
children: [/* @__PURE__ */ v(D, {
|
|
97
|
+
"aria-label": "Filter by status",
|
|
98
|
+
children: /* @__PURE__ */ v(O, { placeholder: "All statuses" })
|
|
99
|
+
}), /* @__PURE__ */ y(T, { children: [/* @__PURE__ */ v(E, {
|
|
100
|
+
value: F,
|
|
101
|
+
children: "All statuses"
|
|
102
|
+
}), L.map((e) => /* @__PURE__ */ v(E, {
|
|
103
|
+
value: e,
|
|
104
|
+
children: m(e)
|
|
105
|
+
}, e))] })]
|
|
106
|
+
})
|
|
107
|
+
})]
|
|
108
|
+
}), (() => {
|
|
109
|
+
if (K) return /* @__PURE__ */ v(c, {
|
|
110
|
+
variant: "rows",
|
|
111
|
+
rows: 6,
|
|
112
|
+
label: "Loading sources…"
|
|
113
|
+
});
|
|
114
|
+
if (q) return /* @__PURE__ */ v(s, {
|
|
115
|
+
message: q.message,
|
|
116
|
+
onRetry: () => void J()
|
|
117
|
+
});
|
|
118
|
+
if (Z.length === 0) {
|
|
119
|
+
let e = B !== F || H !== F;
|
|
120
|
+
return /* @__PURE__ */ v(o, {
|
|
121
|
+
icon: b,
|
|
122
|
+
title: e ? "No sources match these filters" : "No data sources yet",
|
|
123
|
+
description: e ? "Try clearing the type or status filter to see more sources." : "Connect a telescope, satellite feed, archive or API to start ingesting scientific data.",
|
|
124
|
+
action: e ? void 0 : $
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v("div", {
|
|
128
|
+
className: "overflow-hidden rounded-card border border-border-default bg-bg-elevated",
|
|
129
|
+
children: /* @__PURE__ */ y(k, { children: [/* @__PURE__ */ v(N, { children: /* @__PURE__ */ y(P, { children: [
|
|
130
|
+
/* @__PURE__ */ v(M, { children: "Name" }),
|
|
131
|
+
/* @__PURE__ */ v(M, { children: "Type" }),
|
|
132
|
+
/* @__PURE__ */ v(M, { children: "Status" }),
|
|
133
|
+
/* @__PURE__ */ v(M, { children: "Endpoint" }),
|
|
134
|
+
/* @__PURE__ */ v(M, { children: "Last synced" }),
|
|
135
|
+
/* @__PURE__ */ v(M, { children: "Tags" }),
|
|
136
|
+
/* @__PURE__ */ v(M, {
|
|
137
|
+
className: "text-right",
|
|
138
|
+
children: "Actions"
|
|
139
|
+
})
|
|
140
|
+
] }) }), /* @__PURE__ */ v(A, { children: Z.map((e) => /* @__PURE__ */ y(P, {
|
|
141
|
+
className: "cursor-pointer",
|
|
142
|
+
onClick: () => z(`sources/${e.id}`),
|
|
143
|
+
children: [
|
|
144
|
+
/* @__PURE__ */ y(j, { children: [/* @__PURE__ */ v("div", {
|
|
145
|
+
className: "font-medium text-text-primary",
|
|
146
|
+
children: e.name
|
|
147
|
+
}), e.description ? /* @__PURE__ */ v("div", {
|
|
148
|
+
className: "mt-0.5 line-clamp-1 max-w-xs text-xs text-text-secondary",
|
|
149
|
+
children: e.description
|
|
150
|
+
}) : null] }),
|
|
151
|
+
/* @__PURE__ */ v(j, { children: /* @__PURE__ */ v(S, {
|
|
152
|
+
variant: "secondary",
|
|
153
|
+
children: m(e.type)
|
|
154
|
+
}) }),
|
|
155
|
+
/* @__PURE__ */ v(j, { children: /* @__PURE__ */ v(p, { status: e.status }) }),
|
|
156
|
+
/* @__PURE__ */ v(j, {
|
|
157
|
+
className: "max-w-[16rem]",
|
|
158
|
+
onClick: (e) => e.stopPropagation(),
|
|
159
|
+
children: e.endpoint ? /* @__PURE__ */ v(l, {
|
|
160
|
+
href: e.endpoint,
|
|
161
|
+
className: "block truncate text-sm text-text-primary underline-offset-2 hover:underline",
|
|
162
|
+
fallbackClassName: "block truncate text-sm text-text-secondary",
|
|
163
|
+
children: e.endpoint
|
|
164
|
+
}) : /* @__PURE__ */ v("span", {
|
|
165
|
+
className: "text-sm text-text-secondary",
|
|
166
|
+
children: "—"
|
|
167
|
+
})
|
|
168
|
+
}),
|
|
169
|
+
/* @__PURE__ */ v(j, {
|
|
170
|
+
className: "whitespace-nowrap text-sm text-text-secondary",
|
|
171
|
+
children: R(e.lastSyncedAt)
|
|
172
|
+
}),
|
|
173
|
+
/* @__PURE__ */ v(j, { children: /* @__PURE__ */ y("div", {
|
|
174
|
+
className: "flex max-w-[12rem] flex-wrap gap-1",
|
|
175
|
+
children: [e.tags.length === 0 ? /* @__PURE__ */ v("span", {
|
|
176
|
+
className: "text-xs text-text-secondary",
|
|
177
|
+
children: "—"
|
|
178
|
+
}) : e.tags.slice(0, 3).map((e) => /* @__PURE__ */ v(S, {
|
|
179
|
+
variant: "outline",
|
|
180
|
+
className: "text-xs",
|
|
181
|
+
children: e
|
|
182
|
+
}, e)), e.tags.length > 3 ? /* @__PURE__ */ y("span", {
|
|
183
|
+
className: "text-xs text-text-secondary",
|
|
184
|
+
children: ["+", e.tags.length - 3]
|
|
185
|
+
}) : null]
|
|
186
|
+
}) }),
|
|
187
|
+
/* @__PURE__ */ v(j, {
|
|
188
|
+
className: "text-right",
|
|
189
|
+
children: /* @__PURE__ */ v(a, {
|
|
190
|
+
ariaLabel: `Actions for ${e.name}`,
|
|
191
|
+
entityName: e.name,
|
|
192
|
+
onView: () => z(`sources/${e.id}`),
|
|
193
|
+
onEdit: () => z(`sources/${e.id}/edit`),
|
|
194
|
+
onDelete: () => ne(e),
|
|
195
|
+
deleteLabel: "Archive source",
|
|
196
|
+
extraItems: [{
|
|
197
|
+
key: "mark-synced",
|
|
198
|
+
label: "Mark synced",
|
|
199
|
+
icon: x,
|
|
200
|
+
onSelect: () => void te(e)
|
|
201
|
+
}]
|
|
202
|
+
})
|
|
203
|
+
})
|
|
204
|
+
]
|
|
205
|
+
}, e.id)) })] })
|
|
206
|
+
}), /* @__PURE__ */ v(d, {
|
|
207
|
+
offset: W.offset,
|
|
208
|
+
limit: W.limit,
|
|
209
|
+
loadedCount: Z.length,
|
|
210
|
+
hasMore: Q?.hasMore ?? !1,
|
|
211
|
+
onPrev: W.prevPage,
|
|
212
|
+
onNext: W.nextPage,
|
|
213
|
+
itemLabel: "sources",
|
|
214
|
+
loading: K
|
|
215
|
+
})] });
|
|
216
|
+
})()]
|
|
217
|
+
})
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
//#endregion
|
|
221
|
+
export { z as default };
|
|
222
|
+
|
|
223
|
+
//# sourceMappingURL=SourcesPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SourcesPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/sources/SourcesPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { Plus, RefreshCw, Radio } 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 useCosArchiveSourceMutation,\n useCosMarkSourceSyncedMutation,\n useCosSourcesQuery,\n type CosSource,\n type CosSourceStatus,\n type CosSourceType,\n} from '../../api/cosmicApi';\nimport {\n ActionMenu,\n EmptyState,\n ErrorState,\n LoadingState,\n PageLayout,\n Pagination,\n SafeLink,\n StatusBadge,\n formatEnumLabel,\n usePagination,\n} from '../../components';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\nimport { notify } from '../../lib/toast';\n\nconst ALL = 'ALL';\n\nconst SOURCE_TYPES: CosSourceType[] = [\n 'TELESCOPE',\n 'SATELLITE',\n 'GROUND_SENSOR',\n 'ARCHIVE',\n 'API',\n 'STREAM',\n 'FILE_DROP',\n 'SIMULATION',\n];\n\nconst SOURCE_STATUSES: CosSourceStatus[] = [\n 'CONFIGURING',\n 'CONNECTED',\n 'SYNCING',\n 'DEGRADED',\n 'ERROR',\n 'DISABLED',\n];\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 SourcesPage() {\n const { navigate } = useCosmicIntersection();\n const [typeFilter, setTypeFilter] = useState<string>(ALL);\n const [statusFilter, setStatusFilter] = useState<string>(ALL);\n const pagination = usePagination({ pageSize: 20, resetKey: `${typeFilter}|${statusFilter}` });\n\n const { data, loading, error, refetch } = useCosSourcesQuery({\n type: typeFilter === ALL ? undefined : (typeFilter as CosSourceType),\n status: statusFilter === ALL ? undefined : (statusFilter as CosSourceStatus),\n pagination: { limit: pagination.limit, offset: pagination.offset },\n });\n\n const [markSynced] = useCosMarkSourceSyncedMutation();\n const [archiveSource] = useCosArchiveSourceMutation();\n\n const sources = useMemo(() => data?.cosListSources.items ?? [], [data]);\n const pageInfo = data?.cosListSources.pageInfo;\n\n const handleMarkSynced = async (source: CosSource) => {\n const response = await markSynced({ variables: { id: source.id } });\n if (response.data?.cosMarkSourceSynced) {\n notify.success('Source marked synced', `“${source.name}” is now up to date.`);\n await refetch();\n }\n };\n\n const handleArchive = async (source: CosSource) => {\n const response = await archiveSource({ variables: { id: source.id } });\n if (response.error) {\n throw new Error(response.error.message);\n }\n if (!response.data?.cosArchiveSource) {\n notify.error('Could not archive source', 'The server did not confirm the change.');\n throw new Error('Archive not confirmed');\n }\n notify.success('Source archived');\n await refetch();\n };\n\n const newButton = (\n <Button type=\"button\" onClick={() => navigate('sources/create')}>\n <Plus className=\"size-4\" />\n New source\n </Button>\n );\n\n const renderBody = () => {\n if (loading) {\n return <LoadingState variant=\"rows\" rows={6} label=\"Loading sources…\" />;\n }\n if (error) {\n return <ErrorState message={error.message} onRetry={() => void refetch()} />;\n }\n if (sources.length === 0) {\n const filtered = typeFilter !== ALL || statusFilter !== ALL;\n return (\n <EmptyState\n icon={Radio}\n title={filtered ? 'No sources match these filters' : 'No data sources yet'}\n description={\n filtered\n ? 'Try clearing the type or status filter to see more sources.'\n : 'Connect a telescope, satellite feed, archive or API to start ingesting scientific data.'\n }\n action={filtered ? undefined : newButton}\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>Type</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Endpoint</TableHead>\n <TableHead>Last synced</TableHead>\n <TableHead>Tags</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {sources.map((source) => (\n <TableRow\n key={source.id}\n className=\"cursor-pointer\"\n onClick={() => navigate(`sources/${source.id}`)}\n >\n <TableCell>\n <div className=\"font-medium text-text-primary\">{source.name}</div>\n {source.description ? (\n <div className=\"mt-0.5 line-clamp-1 max-w-xs text-xs text-text-secondary\">\n {source.description}\n </div>\n ) : null}\n </TableCell>\n <TableCell>\n <Badge variant=\"secondary\">{formatEnumLabel(source.type)}</Badge>\n </TableCell>\n <TableCell>\n <StatusBadge status={source.status} />\n </TableCell>\n <TableCell\n className=\"max-w-[16rem]\"\n onClick={(event) => event.stopPropagation()}\n >\n {source.endpoint ? (\n <SafeLink\n href={source.endpoint}\n className=\"block truncate text-sm text-text-primary underline-offset-2 hover:underline\"\n fallbackClassName=\"block truncate text-sm text-text-secondary\"\n >\n {source.endpoint}\n </SafeLink>\n ) : (\n <span className=\"text-sm text-text-secondary\">—</span>\n )}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm text-text-secondary\">\n {formatDate(source.lastSyncedAt)}\n </TableCell>\n <TableCell>\n <div className=\"flex max-w-[12rem] flex-wrap gap-1\">\n {source.tags.length === 0 ? (\n <span className=\"text-xs text-text-secondary\">—</span>\n ) : (\n source.tags.slice(0, 3).map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))\n )}\n {source.tags.length > 3 ? (\n <span className=\"text-xs text-text-secondary\">\n +{source.tags.length - 3}\n </span>\n ) : null}\n </div>\n </TableCell>\n <TableCell className=\"text-right\">\n <ActionMenu\n ariaLabel={`Actions for ${source.name}`}\n entityName={source.name}\n onView={() => navigate(`sources/${source.id}`)}\n onEdit={() => navigate(`sources/${source.id}/edit`)}\n onDelete={() => handleArchive(source)}\n deleteLabel=\"Archive source\"\n extraItems={[\n {\n key: 'mark-synced',\n label: 'Mark synced',\n icon: RefreshCw,\n onSelect: () => void handleMarkSynced(source),\n },\n ]}\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={sources.length}\n hasMore={pageInfo?.hasMore ?? false}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"sources\"\n loading={loading}\n />\n </>\n );\n };\n\n return (\n <PageLayout\n title=\"Data sources\"\n description=\"Instruments, archives and feeds that supply raw data into your federation.\"\n actions={newButton}\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"w-full max-w-[14rem]\">\n <Select value={typeFilter} onValueChange={setTypeFilter}>\n <SelectTrigger aria-label=\"Filter by type\">\n <SelectValue placeholder=\"All types\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>All types</SelectItem>\n {SOURCE_TYPES.map((type) => (\n <SelectItem key={type} value={type}>\n {formatEnumLabel(type)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"w-full max-w-[14rem]\">\n <Select value={statusFilter} onValueChange={setStatusFilter}>\n <SelectTrigger aria-label=\"Filter by status\">\n <SelectValue placeholder=\"All statuses\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>All statuses</SelectItem>\n {SOURCE_STATUSES.map((status) => (\n <SelectItem key={status} value={status}>\n {formatEnumLabel(status)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n {renderBody()}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAyCA,IAAM,IAAM,OAEN,IAAgC;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,EAEK,IAAqC;CACzC;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAS,EAAW,GAA+B;AACjD,KAAI,CAAC,EACH,QAAO;CAET,IAAM,IAAS,IAAI,KAAK,EAAM;AAI9B,QAHI,OAAO,MAAM,EAAO,SAAS,CAAC,GACzB,MAEF,EAAO,mBAAmB,KAAA,GAAW;EAAE,MAAM;EAAW,OAAO;EAAS,KAAK;EAAW,CAAC;;AAGlG,SAAwB,IAAc;CACpC,IAAM,EAAE,gBAAa,GAAuB,EACtC,CAAC,GAAY,KAAiB,EAAiB,EAAI,EACnD,CAAC,GAAc,KAAmB,EAAiB,EAAI,EACvD,IAAa,EAAc;EAAE,UAAU;EAAI,UAAU,GAAG,EAAW,GAAG;EAAgB,CAAC,EAEvF,EAAE,SAAM,YAAS,UAAO,eAAY,EAAmB;EAC3D,MAAM,MAAe,IAAM,KAAA,IAAa;EACxC,QAAQ,MAAiB,IAAM,KAAA,IAAa;EAC5C,YAAY;GAAE,OAAO,EAAW;GAAO,QAAQ,EAAW;GAAQ;EACnE,CAAC,EAEI,CAAC,KAAc,GAAgC,EAC/C,CAAC,KAAiB,GAA6B,EAE/C,IAAU,QAAc,GAAM,eAAe,SAAS,EAAE,EAAE,CAAC,EAAK,CAAC,EACjE,IAAW,GAAM,eAAe,UAEhC,KAAmB,OAAO,MAAsB;AAEpD,GADiB,MAAM,EAAW,EAAE,WAAW,EAAE,IAAI,EAAO,IAAI,EAAE,CAAC,EACtD,MAAM,wBACjB,EAAO,QAAQ,wBAAwB,IAAI,EAAO,KAAK,sBAAsB,EAC7E,MAAM,GAAS;IAIb,KAAgB,OAAO,MAAsB;EACjD,IAAM,IAAW,MAAM,EAAc,EAAE,WAAW,EAAE,IAAI,EAAO,IAAI,EAAE,CAAC;AACtE,MAAI,EAAS,MACX,OAAU,MAAM,EAAS,MAAM,QAAQ;AAEzC,MAAI,CAAC,EAAS,MAAM,iBAElB,OADA,EAAO,MAAM,4BAA4B,yCAAyC,EACxE,MAAM,wBAAwB;AAG1C,EADA,EAAO,QAAQ,kBAAkB,EACjC,MAAM,GAAS;IAGX,IACJ,kBAAC,GAAD;EAAQ,MAAK;EAAS,eAAe,EAAS,iBAAiB;YAA/D,CACE,kBAAC,IAAD,EAAM,WAAU,UAAW,CAAA,EAAA,aAEpB;;AAyIX,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAS;YAET,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD;MAAQ,OAAO;MAAY,eAAe;gBAA1C,CACE,kBAAC,GAAD;OAAe,cAAW;iBACxB,kBAAC,GAAD,EAAa,aAAY,aAAc,CAAA;OACzB,CAAA,EAChB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;OAAY,OAAO;iBAAK;OAAsB,CAAA,EAC7C,EAAa,KAAK,MACjB,kBAAC,GAAD;OAAuB,OAAO;iBAC3B,EAAgB,EAAK;OACX,EAFI,EAEJ,CACb,CACY,EAAA,CAAA,CACT;;KACL,CAAA,EACN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD;MAAQ,OAAO;MAAc,eAAe;gBAA5C,CACE,kBAAC,GAAD;OAAe,cAAW;iBACxB,kBAAC,GAAD,EAAa,aAAY,gBAAiB,CAAA;OAC5B,CAAA,EAChB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;OAAY,OAAO;iBAAK;OAAyB,CAAA,EAChD,EAAgB,KAAK,MACpB,kBAAC,GAAD;OAAyB,OAAO;iBAC7B,EAAgB,EAAO;OACb,EAFI,EAEJ,CACb,CACY,EAAA,CAAA,CACT;;KACL,CAAA,CACF;cA5Ka;AACvB,QAAI,EACF,QAAO,kBAAC,GAAD;KAAc,SAAQ;KAAO,MAAM;KAAG,OAAM;KAAqB,CAAA;AAE1E,QAAI,EACF,QAAO,kBAAC,GAAD;KAAY,SAAS,EAAM;KAAS,eAAe,KAAK,GAAS;KAAI,CAAA;AAE9E,QAAI,EAAQ,WAAW,GAAG;KACxB,IAAM,IAAW,MAAe,KAAO,MAAiB;AACxD,YACE,kBAAC,GAAD;MACE,MAAM;MACN,OAAO,IAAW,mCAAmC;MACrD,aACE,IACI,gEACA;MAEN,QAAQ,IAAW,KAAA,IAAY;MAC/B,CAAA;;AAIN,WACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA;MACE,kBAAC,GAAD,EAAA,UAAW,QAAgB,CAAA;MAC3B,kBAAC,GAAD,EAAA,UAAW,QAAgB,CAAA;MAC3B,kBAAC,GAAD,EAAA,UAAW,UAAkB,CAAA;MAC7B,kBAAC,GAAD,EAAA,UAAW,YAAoB,CAAA;MAC/B,kBAAC,GAAD,EAAA,UAAW,eAAuB,CAAA;MAClC,kBAAC,GAAD,EAAA,UAAW,QAAgB,CAAA;MAC3B,kBAAC,GAAD;OAAW,WAAU;iBAAa;OAAmB,CAAA;MAC5C,EAAA,CAAA,EACC,CAAA,EACd,kBAAC,GAAD,EAAA,UACG,EAAQ,KAAK,MACZ,kBAAC,GAAD;MAEE,WAAU;MACV,eAAe,EAAS,WAAW,EAAO,KAAK;gBAHjD;OAKE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAiC,EAAO;QAAW,CAAA,EACjE,EAAO,cACN,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAO;QACJ,CAAA,GACJ,KACM,EAAA,CAAA;OACZ,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;QAAO,SAAQ;kBAAa,EAAgB,EAAO,KAAK;QAAS,CAAA,EACvD,CAAA;OACZ,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAa,QAAQ,EAAO,QAAU,CAAA,EAC5B,CAAA;OACZ,kBAAC,GAAD;QACE,WAAU;QACV,UAAU,MAAU,EAAM,iBAAiB;kBAE1C,EAAO,WACN,kBAAC,GAAD;SACE,MAAM,EAAO;SACb,WAAU;SACV,mBAAkB;mBAEjB,EAAO;SACC,CAAA,GAEX,kBAAC,QAAD;SAAM,WAAU;mBAA8B;SAAQ,CAAA;QAE9C,CAAA;OACZ,kBAAC,GAAD;QAAW,WAAU;kBAClB,EAAW,EAAO,aAAa;QACtB,CAAA;OACZ,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACG,EAAO,KAAK,WAAW,IACtB,kBAAC,QAAD;SAAM,WAAU;mBAA8B;SAAQ,CAAA,GAEtD,EAAO,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,MAC3B,kBAAC,GAAD;SAAiB,SAAQ;SAAU,WAAU;mBAC1C;SACK,EAFI,EAEJ,CACR,EAEH,EAAO,KAAK,SAAS,IACpB,kBAAC,QAAD;SAAM,WAAU;mBAAhB,CAA8C,KAC1C,EAAO,KAAK,SAAS,EAClB;aACL,KACA;WACI,CAAA;OACZ,kBAAC,GAAD;QAAW,WAAU;kBACnB,kBAAC,GAAD;SACE,WAAW,eAAe,EAAO;SACjC,YAAY,EAAO;SACnB,cAAc,EAAS,WAAW,EAAO,KAAK;SAC9C,cAAc,EAAS,WAAW,EAAO,GAAG,OAAO;SACnD,gBAAgB,GAAc,EAAO;SACrC,aAAY;SACZ,YAAY,CACV;UACE,KAAK;UACL,OAAO;UACP,MAAM;UACN,gBAAgB,KAAK,GAAiB,EAAO;UAC9C,CACF;SACD,CAAA;QACQ,CAAA;OACH;QAzEJ,EAAO,GAyEH,CACX,EACQ,CAAA,CACN,EAAA,CAAA;KACJ,CAAA,EAEN,kBAAC,GAAD;KACE,QAAQ,EAAW;KACnB,OAAO,EAAW;KAClB,aAAa,EAAQ;KACrB,SAAS,GAAU,WAAW;KAC9B,QAAQ,EAAW;KACnB,QAAQ,EAAW;KACnB,WAAU;KACD;KACT,CAAA,CACD,EAAA,CAAA;OA4CY,CACT;;EACK,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import e from "../../node_modules/clsx/dist/clsx.js";
|
|
2
|
+
import { twMerge as t } from "../../node_modules/tailwind-merge/dist/bundle-mjs.js";
|
|
3
|
+
//#region src/cosmicintersection/utils/cn.ts
|
|
4
|
+
function n(...n) {
|
|
5
|
+
return t(e(n));
|
|
6
|
+
}
|
|
7
|
+
//#endregion
|
|
8
|
+
export { n as cn };
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=cn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cn.js","names":[],"sources":["../../../src/cosmicintersection/utils/cn.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";;;AAGA,SAAgB,EAAG,GAAG,GAAsB;AAC1C,QAAO,EAAQ,EAAK,EAAO,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { useCosmicIntersectionStore as t } from "./cosmicintersection/store/cosmicintersectionStore.js";
|
|
3
|
-
import { CosmicIntersectionRoot as n } from "./cosmicintersection/CosmicIntersectionRoot.js";
|
|
1
|
+
import e from "./cosmicintersection/CosmicIntersectionRoot.js";
|
|
4
2
|
import "./cosmicintersection/index.js";
|
|
5
|
-
export {
|
|
3
|
+
export { e as CosmicIntersectionRoot };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//#region node_modules/clsx/dist/clsx.mjs
|
|
2
|
+
function e(t) {
|
|
3
|
+
var n, r, i = "";
|
|
4
|
+
if (typeof t == "string" || typeof t == "number") i += t;
|
|
5
|
+
else if (typeof t == "object") if (Array.isArray(t)) {
|
|
6
|
+
var a = t.length;
|
|
7
|
+
for (n = 0; n < a; n++) t[n] && (r = e(t[n])) && (i && (i += " "), i += r);
|
|
8
|
+
} else for (r in t) t[r] && (i && (i += " "), i += r);
|
|
9
|
+
return i;
|
|
10
|
+
}
|
|
11
|
+
function t() {
|
|
12
|
+
for (var t, n, r = 0, i = "", a = arguments.length; r < a; r++) (t = arguments[r]) && (n = e(t)) && (i && (i += " "), i += n);
|
|
13
|
+
return i;
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { t as default };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=clsx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clsx.js","names":[],"sources":["../../../../node_modules/clsx/dist/clsx.mjs"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAS,EAAE,GAAE;CAAC,IAAI,GAAE,GAAE,IAAE;AAAG,KAAa,OAAO,KAAjB,YAA8B,OAAO,KAAjB,SAAmB,MAAG;UAAoB,OAAO,KAAjB,SAAmB,KAAG,MAAM,QAAQ,EAAE,EAAC;EAAC,IAAI,IAAE,EAAE;AAAO,OAAI,IAAE,GAAE,IAAE,GAAE,IAAI,GAAE,OAAK,IAAE,EAAE,EAAE,GAAG,MAAI,MAAI,KAAG,MAAK,KAAG;OAAQ,MAAI,KAAK,EAAE,GAAE,OAAK,MAAI,KAAG,MAAK,KAAG;AAAG,QAAO;;AAAE,SAAgB,IAAM;AAAC,MAAI,IAAI,GAAE,GAAE,IAAE,GAAE,IAAE,IAAG,IAAE,UAAU,QAAO,IAAE,GAAE,IAAI,EAAC,IAAE,UAAU,QAAM,IAAE,EAAE,EAAE,MAAI,MAAI,KAAG,MAAK,KAAG;AAAG,QAAO"}
|