@burdenoff/microfe-cosmicintersection 2026.512.1 → 2026.704.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cosmicintersection/CosmicIntersectionRoot.js +38 -113
- package/dist/cosmicintersection/CosmicIntersectionRoot.js.map +1 -1
- package/dist/cosmicintersection/CosmicIntersectionRoutes.js +102 -44
- package/dist/cosmicintersection/CosmicIntersectionRoutes.js.map +1 -1
- package/dist/cosmicintersection/api/cosmicApi.js +853 -0
- package/dist/cosmicintersection/api/cosmicApi.js.map +1 -0
- package/dist/cosmicintersection/components/ActionMenu.js +106 -0
- package/dist/cosmicintersection/components/ActionMenu.js.map +1 -0
- package/dist/cosmicintersection/components/EmptyState.js +35 -0
- package/dist/cosmicintersection/components/EmptyState.js.map +1 -0
- package/dist/cosmicintersection/components/EntityFormShell.js +57 -0
- package/dist/cosmicintersection/components/EntityFormShell.js.map +1 -0
- package/dist/cosmicintersection/components/EntityTagsField.js +77 -0
- package/dist/cosmicintersection/components/EntityTagsField.js.map +1 -0
- package/dist/cosmicintersection/components/ErrorState.js +40 -0
- package/dist/cosmicintersection/components/ErrorState.js.map +1 -0
- package/dist/cosmicintersection/components/FileUploadField.js +146 -0
- package/dist/cosmicintersection/components/FileUploadField.js.map +1 -0
- package/dist/cosmicintersection/components/LoadingState.js +23 -0
- package/dist/cosmicintersection/components/LoadingState.js.map +1 -0
- package/dist/cosmicintersection/components/PageLayout.js +46 -0
- package/dist/cosmicintersection/components/PageLayout.js.map +1 -0
- package/dist/cosmicintersection/components/Pagination.js +65 -0
- package/dist/cosmicintersection/components/Pagination.js.map +1 -0
- package/dist/cosmicintersection/components/SafeLink.js +35 -0
- package/dist/cosmicintersection/components/SafeLink.js.map +1 -0
- package/dist/cosmicintersection/components/StatusBadge.js +53 -0
- package/dist/cosmicintersection/components/StatusBadge.js.map +1 -0
- package/dist/cosmicintersection/components/index.js +11 -0
- package/dist/cosmicintersection/context/CosmicIntersectionContext.js +46 -0
- package/dist/cosmicintersection/context/CosmicIntersectionContext.js.map +1 -0
- package/dist/cosmicintersection/index.js +0 -2
- package/dist/cosmicintersection/lib/mutationResult.js +12 -0
- package/dist/cosmicintersection/lib/mutationResult.js.map +1 -0
- package/dist/cosmicintersection/lib/toast.js +36 -0
- package/dist/cosmicintersection/lib/toast.js.map +1 -0
- package/dist/cosmicintersection/pages/access/AccessPage.js +340 -0
- package/dist/cosmicintersection/pages/access/AccessPage.js.map +1 -0
- package/dist/cosmicintersection/pages/analyses/AnalysesPage.js +484 -0
- package/dist/cosmicintersection/pages/analyses/AnalysesPage.js.map +1 -0
- package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js +164 -0
- package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/collections/CollectionFormPage.js +117 -0
- package/dist/cosmicintersection/pages/collections/CollectionFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/collections/CollectionsPage.js +103 -0
- package/dist/cosmicintersection/pages/collections/CollectionsPage.js.map +1 -0
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.js +244 -0
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.js.map +1 -0
- package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js +460 -0
- package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/datasets/DatasetFormPage.js +218 -0
- package/dist/cosmicintersection/pages/datasets/DatasetFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/datasets/DatasetsPage.js +252 -0
- package/dist/cosmicintersection/pages/datasets/DatasetsPage.js.map +1 -0
- package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js +393 -0
- package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/notebooks/NotebookFormPage.js +313 -0
- package/dist/cosmicintersection/pages/notebooks/NotebookFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js +203 -0
- package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js.map +1 -0
- package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js +244 -0
- package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js +210 -0
- package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js +193 -0
- package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js.map +1 -0
- package/dist/cosmicintersection/pages/releases/ReleaseFormPage.js +184 -0
- package/dist/cosmicintersection/pages/releases/ReleaseFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/releases/ReleasesPage.js +368 -0
- package/dist/cosmicintersection/pages/releases/ReleasesPage.js.map +1 -0
- package/dist/cosmicintersection/pages/runs/RunDetailPage.js +375 -0
- package/dist/cosmicintersection/pages/runs/RunDetailPage.js.map +1 -0
- package/dist/cosmicintersection/pages/runs/RunsPage.js +180 -0
- package/dist/cosmicintersection/pages/runs/RunsPage.js.map +1 -0
- package/dist/cosmicintersection/pages/sources/SourceFormPage.js +229 -0
- package/dist/cosmicintersection/pages/sources/SourceFormPage.js.map +1 -0
- package/dist/cosmicintersection/pages/sources/SourcesPage.js +217 -0
- package/dist/cosmicintersection/pages/sources/SourcesPage.js.map +1 -0
- package/dist/cosmicintersection/utils/cn.js +10 -0
- package/dist/cosmicintersection/utils/cn.js.map +1 -0
- package/dist/index.js +2 -4
- package/dist/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/package.json +2 -1
- package/dist/cosmicintersection/CosmicIntersectionRoot.d.ts +0 -5
- package/dist/cosmicintersection/CosmicIntersectionRoot.d.ts.map +0 -1
- package/dist/cosmicintersection/CosmicIntersectionRoutes.d.ts +0 -2
- package/dist/cosmicintersection/CosmicIntersectionRoutes.d.ts.map +0 -1
- package/dist/cosmicintersection/index.d.ts +0 -5
- package/dist/cosmicintersection/index.d.ts.map +0 -1
- package/dist/cosmicintersection/pages/AiDiscoveryPage.d.ts +0 -2
- package/dist/cosmicintersection/pages/AiDiscoveryPage.d.ts.map +0 -1
- package/dist/cosmicintersection/pages/AiDiscoveryPage.js +0 -363
- package/dist/cosmicintersection/pages/AiDiscoveryPage.js.map +0 -1
- package/dist/cosmicintersection/pages/DashboardPage.d.ts +0 -2
- package/dist/cosmicintersection/pages/DashboardPage.d.ts.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.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceScienceCitizenPage.d.ts.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.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceScienceDataPage.d.ts.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.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceScienceDataPage1.d.ts.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.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceScienceLearningPage.d.ts.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.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceScienceLearningPage1.d.ts.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.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceSciencePage.d.ts.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.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceScienceResearchPage.d.ts.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.d.ts +0 -2
- package/dist/cosmicintersection/pages/SpaceScienceSimulationPage.d.ts.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.d.ts +0 -6
- package/dist/cosmicintersection/providers/CosmicIntersectionProvider.d.ts.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.d.ts +0 -18
- package/dist/cosmicintersection/store/cosmicintersectionStore.d.ts.map +0 -1
- package/dist/cosmicintersection/store/cosmicintersectionStore.js +0 -478
- package/dist/cosmicintersection/store/cosmicintersectionStore.js.map +0 -1
- package/dist/cosmicintersection/types/index.d.ts +0 -109
- package/dist/cosmicintersection/types/index.d.ts.map +0 -1
- package/dist/cosmicintersection/utils/cn.d.ts +0 -4
- package/dist/cosmicintersection/utils/cn.d.ts.map +0 -1
- package/dist/cosmicintersection/utils/i18n.d.ts +0 -6
- package/dist/cosmicintersection/utils/i18n.d.ts.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.d.ts +0 -2
- package/dist/cosmicintersection/utils/navigation.d.ts.map +0 -1
- package/dist/cosmicintersection/utils/navigation.js +0 -8
- package/dist/cosmicintersection/utils/navigation.js.map +0 -1
- package/dist/dev/main.d.ts +0 -2
- package/dist/dev/main.d.ts.map +0 -1
- package/dist/generated/global-operations.d.ts +0 -2
- package/dist/generated/global-operations.d.ts.map +0 -1
- package/dist/generated/global-types.d.ts +0 -18199
- package/dist/generated/global-types.d.ts.map +0 -1
- package/dist/generated/wspace-operations.d.ts +0 -2
- package/dist/generated/wspace-operations.d.ts.map +0 -1
- package/dist/generated/wspace-types.d.ts +0 -43046
- package/dist/generated/wspace-types.d.ts.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
|
|
2
|
+
import { notify as t } from "../../lib/toast.js";
|
|
3
|
+
import { useCosCreateSourceMutation as n, useCosSourceQuery as r, useCosUpdateSourceMutation as i } from "../../api/cosmicApi.js";
|
|
4
|
+
import a from "../../components/EntityFormShell.js";
|
|
5
|
+
import o from "../../components/EntityTagsField.js";
|
|
6
|
+
import { formatEnumLabel as s } from "../../components/StatusBadge.js";
|
|
7
|
+
import "../../components/index.js";
|
|
8
|
+
import { useEffect as c, useMemo as l, useState as u } from "react";
|
|
9
|
+
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
10
|
+
import { useParams as p } from "react-router-dom";
|
|
11
|
+
import { Input as m, Select as h, SelectContent as g, SelectItem as _, SelectTrigger as v, SelectValue as y, Textarea as b } from "@burdenoff/fe-libs/ui";
|
|
12
|
+
//#region src/cosmicintersection/pages/sources/SourceFormPage.tsx
|
|
13
|
+
var x = [
|
|
14
|
+
"TELESCOPE",
|
|
15
|
+
"SATELLITE",
|
|
16
|
+
"GROUND_SENSOR",
|
|
17
|
+
"ARCHIVE",
|
|
18
|
+
"API",
|
|
19
|
+
"STREAM",
|
|
20
|
+
"FILE_DROP",
|
|
21
|
+
"SIMULATION"
|
|
22
|
+
], S = [
|
|
23
|
+
"CONFIGURING",
|
|
24
|
+
"CONNECTED",
|
|
25
|
+
"SYNCING",
|
|
26
|
+
"DEGRADED",
|
|
27
|
+
"ERROR",
|
|
28
|
+
"DISABLED"
|
|
29
|
+
], C = {
|
|
30
|
+
name: "",
|
|
31
|
+
description: "",
|
|
32
|
+
type: "TELESCOPE",
|
|
33
|
+
status: "CONFIGURING",
|
|
34
|
+
endpoint: "",
|
|
35
|
+
credentialRef: "",
|
|
36
|
+
config: "",
|
|
37
|
+
tags: []
|
|
38
|
+
}, w = "block space-y-1.5 text-sm", T = "font-medium text-text-primary";
|
|
39
|
+
function E() {
|
|
40
|
+
let { id: E = "" } = p(), D = l(() => !!E, [E]), { navigate: O } = e(), { data: k, loading: A } = r(E), [j, { loading: M }] = n(), [N, { loading: P }] = i(), [F, I] = u(C), [L, R] = u(!1);
|
|
41
|
+
c(() => {
|
|
42
|
+
if (!D || L || !k?.cosSource) return;
|
|
43
|
+
let e = k.cosSource;
|
|
44
|
+
I({
|
|
45
|
+
name: e.name ?? "",
|
|
46
|
+
description: e.description ?? "",
|
|
47
|
+
type: e.type,
|
|
48
|
+
status: e.status,
|
|
49
|
+
endpoint: e.endpoint ?? "",
|
|
50
|
+
credentialRef: "",
|
|
51
|
+
config: e.config ? JSON.stringify(e.config, null, 2) : "",
|
|
52
|
+
tags: e.tags ?? []
|
|
53
|
+
}), R(!0);
|
|
54
|
+
}, [
|
|
55
|
+
D,
|
|
56
|
+
L,
|
|
57
|
+
k
|
|
58
|
+
]);
|
|
59
|
+
let z = (e, t) => {
|
|
60
|
+
I((n) => ({
|
|
61
|
+
...n,
|
|
62
|
+
[e]: t
|
|
63
|
+
}));
|
|
64
|
+
}, B = M || P, V = async (e) => {
|
|
65
|
+
if (e.preventDefault(), !F.name.trim()) {
|
|
66
|
+
t.error("Name is required", "Give this source a recognizable name.");
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
let n;
|
|
70
|
+
if (F.config.trim()) try {
|
|
71
|
+
let e = JSON.parse(F.config);
|
|
72
|
+
if (typeof e != "object" || !e || Array.isArray(e)) throw Error("Config must be a JSON object.");
|
|
73
|
+
n = e;
|
|
74
|
+
} catch (e) {
|
|
75
|
+
t.error("Invalid config JSON", e instanceof Error ? e.message : "Please provide valid JSON.");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
let r = {
|
|
79
|
+
name: F.name.trim(),
|
|
80
|
+
type: F.type,
|
|
81
|
+
status: F.status,
|
|
82
|
+
description: F.description.trim() || void 0,
|
|
83
|
+
endpoint: F.endpoint.trim() || void 0,
|
|
84
|
+
credentialRef: F.credentialRef.trim() || void 0,
|
|
85
|
+
config: n,
|
|
86
|
+
tags: F.tags
|
|
87
|
+
};
|
|
88
|
+
if (D) {
|
|
89
|
+
(await N({ variables: {
|
|
90
|
+
id: E,
|
|
91
|
+
input: r
|
|
92
|
+
} })).data?.cosUpdateSource?.id && (t.success("Source updated"), O("sources"));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
(await j({ variables: { input: r } })).data?.cosCreateSource?.id && (t.success("Source created"), O("sources"));
|
|
96
|
+
};
|
|
97
|
+
return /* @__PURE__ */ f(a, {
|
|
98
|
+
title: D ? "Edit source" : "New data source",
|
|
99
|
+
description: "Instruments, archives and feeds that supply raw data into your federation.",
|
|
100
|
+
purpose: "A source describes where data comes from — a telescope, satellite feed, archive, API or file drop. Configure it once, then attach datasets that ingest from it and mark it synced as data arrives.",
|
|
101
|
+
backLabel: "Back to sources",
|
|
102
|
+
onBack: () => O("sources"),
|
|
103
|
+
onSubmit: (e) => void V(e),
|
|
104
|
+
submitLabel: D ? "Save source" : "Create source",
|
|
105
|
+
saving: B || D && A && !L,
|
|
106
|
+
children: [
|
|
107
|
+
/* @__PURE__ */ f("div", {
|
|
108
|
+
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
109
|
+
children: [/* @__PURE__ */ f("label", {
|
|
110
|
+
className: w,
|
|
111
|
+
children: [/* @__PURE__ */ d("span", {
|
|
112
|
+
className: T,
|
|
113
|
+
children: "Name"
|
|
114
|
+
}), /* @__PURE__ */ d(m, {
|
|
115
|
+
value: F.name,
|
|
116
|
+
onChange: (e) => z("name", e.target.value),
|
|
117
|
+
placeholder: "e.g. VLA Radio Array",
|
|
118
|
+
required: !0
|
|
119
|
+
})]
|
|
120
|
+
}), /* @__PURE__ */ f("label", {
|
|
121
|
+
className: w,
|
|
122
|
+
children: [/* @__PURE__ */ d("span", {
|
|
123
|
+
className: T,
|
|
124
|
+
children: "Endpoint"
|
|
125
|
+
}), /* @__PURE__ */ d(m, {
|
|
126
|
+
value: F.endpoint,
|
|
127
|
+
onChange: (e) => z("endpoint", e.target.value),
|
|
128
|
+
placeholder: "https://archive.example.org/api"
|
|
129
|
+
})]
|
|
130
|
+
})]
|
|
131
|
+
}),
|
|
132
|
+
/* @__PURE__ */ f("label", {
|
|
133
|
+
className: w,
|
|
134
|
+
children: [/* @__PURE__ */ d("span", {
|
|
135
|
+
className: T,
|
|
136
|
+
children: "Description"
|
|
137
|
+
}), /* @__PURE__ */ d(b, {
|
|
138
|
+
value: F.description,
|
|
139
|
+
onChange: (e) => z("description", e.target.value),
|
|
140
|
+
rows: 3,
|
|
141
|
+
placeholder: "What this source provides and how it connects."
|
|
142
|
+
})]
|
|
143
|
+
}),
|
|
144
|
+
/* @__PURE__ */ f("div", {
|
|
145
|
+
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
146
|
+
children: [/* @__PURE__ */ f("label", {
|
|
147
|
+
className: w,
|
|
148
|
+
children: [/* @__PURE__ */ d("span", {
|
|
149
|
+
className: T,
|
|
150
|
+
children: "Type"
|
|
151
|
+
}), /* @__PURE__ */ f(h, {
|
|
152
|
+
value: F.type,
|
|
153
|
+
onValueChange: (e) => z("type", e),
|
|
154
|
+
children: [/* @__PURE__ */ d(v, {
|
|
155
|
+
"aria-label": "Source type",
|
|
156
|
+
children: /* @__PURE__ */ d(y, {})
|
|
157
|
+
}), /* @__PURE__ */ d(g, { children: x.map((e) => /* @__PURE__ */ d(_, {
|
|
158
|
+
value: e,
|
|
159
|
+
children: s(e)
|
|
160
|
+
}, e)) })]
|
|
161
|
+
})]
|
|
162
|
+
}), /* @__PURE__ */ f("label", {
|
|
163
|
+
className: w,
|
|
164
|
+
children: [/* @__PURE__ */ d("span", {
|
|
165
|
+
className: T,
|
|
166
|
+
children: "Status"
|
|
167
|
+
}), /* @__PURE__ */ f(h, {
|
|
168
|
+
value: F.status,
|
|
169
|
+
onValueChange: (e) => z("status", e),
|
|
170
|
+
children: [/* @__PURE__ */ d(v, {
|
|
171
|
+
"aria-label": "Source status",
|
|
172
|
+
children: /* @__PURE__ */ d(y, {})
|
|
173
|
+
}), /* @__PURE__ */ d(g, { children: S.map((e) => /* @__PURE__ */ d(_, {
|
|
174
|
+
value: e,
|
|
175
|
+
children: s(e)
|
|
176
|
+
}, e)) })]
|
|
177
|
+
})]
|
|
178
|
+
})]
|
|
179
|
+
}),
|
|
180
|
+
/* @__PURE__ */ f("label", {
|
|
181
|
+
className: w,
|
|
182
|
+
children: [
|
|
183
|
+
/* @__PURE__ */ d("span", {
|
|
184
|
+
className: T,
|
|
185
|
+
children: "Credential reference"
|
|
186
|
+
}),
|
|
187
|
+
/* @__PURE__ */ d(m, {
|
|
188
|
+
value: F.credentialRef,
|
|
189
|
+
onChange: (e) => z("credentialRef", e.target.value),
|
|
190
|
+
placeholder: "Secret key or vault reference (write-only)"
|
|
191
|
+
}),
|
|
192
|
+
/* @__PURE__ */ d("span", {
|
|
193
|
+
className: "text-xs text-text-secondary",
|
|
194
|
+
children: "A pointer to a stored credential — never paste raw secrets here."
|
|
195
|
+
})
|
|
196
|
+
]
|
|
197
|
+
}),
|
|
198
|
+
/* @__PURE__ */ f("label", {
|
|
199
|
+
className: w,
|
|
200
|
+
children: [
|
|
201
|
+
/* @__PURE__ */ d("span", {
|
|
202
|
+
className: T,
|
|
203
|
+
children: "Config (JSON)"
|
|
204
|
+
}),
|
|
205
|
+
/* @__PURE__ */ d(b, {
|
|
206
|
+
value: F.config,
|
|
207
|
+
onChange: (e) => z("config", e.target.value),
|
|
208
|
+
rows: 5,
|
|
209
|
+
className: "font-mono text-xs",
|
|
210
|
+
placeholder: "{ \"pollIntervalMinutes\": 30 }"
|
|
211
|
+
}),
|
|
212
|
+
/* @__PURE__ */ d("span", {
|
|
213
|
+
className: "text-xs text-text-secondary",
|
|
214
|
+
children: "Optional connection parameters as a JSON object."
|
|
215
|
+
})
|
|
216
|
+
]
|
|
217
|
+
}),
|
|
218
|
+
/* @__PURE__ */ d(o, {
|
|
219
|
+
value: F.tags,
|
|
220
|
+
onChange: (e) => z("tags", e),
|
|
221
|
+
disabled: B
|
|
222
|
+
})
|
|
223
|
+
]
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
//#endregion
|
|
227
|
+
export { E as default };
|
|
228
|
+
|
|
229
|
+
//# sourceMappingURL=SourceFormPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SourceFormPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/sources/SourceFormPage.tsx"],"sourcesContent":["/* eslint-disable react-hooks/set-state-in-effect */\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\n\nimport {\n useCosCreateSourceMutation,\n useCosSourceQuery,\n useCosUpdateSourceMutation,\n type CosSourceStatus,\n type CosSourceType,\n} from '../../api/cosmicApi';\nimport { EntityFormShell, EntityTagsField, formatEnumLabel } from '../../components';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\nimport { notify } from '../../lib/toast';\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\ninterface SourceFormState {\n name: string;\n description: string;\n type: CosSourceType;\n status: CosSourceStatus;\n endpoint: string;\n credentialRef: string;\n config: string;\n tags: string[];\n}\n\nconst INITIAL_STATE: SourceFormState = {\n name: '',\n description: '',\n type: 'TELESCOPE',\n status: 'CONFIGURING',\n endpoint: '',\n credentialRef: '',\n config: '',\n tags: [],\n};\n\nconst fieldLabelClass = 'block space-y-1.5 text-sm';\nconst fieldSpanClass = 'font-medium text-text-primary';\n\nexport default function SourceFormPage() {\n const { id = '' } = useParams<{ id: string }>();\n const isEdit = useMemo(() => Boolean(id), [id]);\n const { navigate } = useCosmicIntersection();\n\n const { data, loading: loadingSource } = useCosSourceQuery(id);\n const [createSource, { loading: creating }] = useCosCreateSourceMutation();\n const [updateSource, { loading: updating }] = useCosUpdateSourceMutation();\n\n const [form, setForm] = useState<SourceFormState>(INITIAL_STATE);\n const [hydrated, setHydrated] = useState(false);\n\n useEffect(() => {\n if (!isEdit || hydrated || !data?.cosSource) {\n return;\n }\n const source = data.cosSource;\n setForm({\n name: source.name ?? '',\n description: source.description ?? '',\n type: source.type,\n status: source.status,\n endpoint: source.endpoint ?? '',\n credentialRef: '',\n config: source.config ? JSON.stringify(source.config, null, 2) : '',\n tags: source.tags ?? [],\n });\n setHydrated(true);\n }, [isEdit, hydrated, data]);\n\n const onChange = <K extends keyof SourceFormState>(field: K, value: SourceFormState[K]) => {\n setForm((prev) => ({ ...prev, [field]: value }));\n };\n\n const saving = creating || updating;\n\n const onSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n if (!form.name.trim()) {\n notify.error('Name is required', 'Give this source a recognizable name.');\n return;\n }\n\n let config: Record<string, unknown> | undefined;\n if (form.config.trim()) {\n try {\n const parsed = JSON.parse(form.config) as unknown;\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error('Config must be a JSON object.');\n }\n config = parsed as Record<string, unknown>;\n } catch (parseError) {\n notify.error(\n 'Invalid config JSON',\n parseError instanceof Error ? parseError.message : 'Please provide valid JSON.'\n );\n return;\n }\n }\n\n const base = {\n name: form.name.trim(),\n type: form.type,\n status: form.status,\n description: form.description.trim() || undefined,\n endpoint: form.endpoint.trim() || undefined,\n credentialRef: form.credentialRef.trim() || undefined,\n config,\n tags: form.tags,\n };\n\n if (isEdit) {\n const response = await updateSource({ variables: { id, input: base } });\n if (response.data?.cosUpdateSource?.id) {\n notify.success('Source updated');\n navigate('sources');\n }\n return;\n }\n\n const response = await createSource({ variables: { input: base } });\n if (response.data?.cosCreateSource?.id) {\n notify.success('Source created');\n navigate('sources');\n }\n };\n\n return (\n <EntityFormShell\n title={isEdit ? 'Edit source' : 'New data source'}\n description=\"Instruments, archives and feeds that supply raw data into your federation.\"\n purpose=\"A source describes where data comes from — a telescope, satellite feed, archive, API or file drop. Configure it once, then attach datasets that ingest from it and mark it synced as data arrives.\"\n backLabel=\"Back to sources\"\n onBack={() => navigate('sources')}\n onSubmit={(event) => void onSubmit(event)}\n submitLabel={isEdit ? 'Save source' : 'Create source'}\n saving={saving || (isEdit && loadingSource && !hydrated)}\n >\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <label className={fieldLabelClass}>\n <span className={fieldSpanClass}>Name</span>\n <Input\n value={form.name}\n onChange={(event) => onChange('name', event.target.value)}\n placeholder=\"e.g. VLA Radio Array\"\n required\n />\n </label>\n <label className={fieldLabelClass}>\n <span className={fieldSpanClass}>Endpoint</span>\n <Input\n value={form.endpoint}\n onChange={(event) => onChange('endpoint', event.target.value)}\n placeholder=\"https://archive.example.org/api\"\n />\n </label>\n </div>\n\n <label className={fieldLabelClass}>\n <span className={fieldSpanClass}>Description</span>\n <Textarea\n value={form.description}\n onChange={(event) => onChange('description', event.target.value)}\n rows={3}\n placeholder=\"What this source provides and how it connects.\"\n />\n </label>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <label className={fieldLabelClass}>\n <span className={fieldSpanClass}>Type</span>\n <Select\n value={form.type}\n onValueChange={(value) => onChange('type', value as CosSourceType)}\n >\n <SelectTrigger aria-label=\"Source type\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SOURCE_TYPES.map((type) => (\n <SelectItem key={type} value={type}>\n {formatEnumLabel(type)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className={fieldLabelClass}>\n <span className={fieldSpanClass}>Status</span>\n <Select\n value={form.status}\n onValueChange={(value) => onChange('status', value as CosSourceStatus)}\n >\n <SelectTrigger aria-label=\"Source status\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SOURCE_STATUSES.map((status) => (\n <SelectItem key={status} value={status}>\n {formatEnumLabel(status)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n </div>\n\n <label className={fieldLabelClass}>\n <span className={fieldSpanClass}>Credential reference</span>\n <Input\n value={form.credentialRef}\n onChange={(event) => onChange('credentialRef', event.target.value)}\n placeholder=\"Secret key or vault reference (write-only)\"\n />\n <span className=\"text-xs text-text-secondary\">\n A pointer to a stored credential — never paste raw secrets here.\n </span>\n </label>\n\n <label className={fieldLabelClass}>\n <span className={fieldSpanClass}>Config (JSON)</span>\n <Textarea\n value={form.config}\n onChange={(event) => onChange('config', event.target.value)}\n rows={5}\n className=\"font-mono text-xs\"\n placeholder='{ \"pollIntervalMinutes\": 30 }'\n />\n <span className=\"text-xs text-text-secondary\">\n Optional connection parameters as a JSON object.\n </span>\n </label>\n\n <EntityTagsField\n value={form.tags}\n onChange={(tags) => onChange('tags', tags)}\n disabled={saving}\n />\n </EntityFormShell>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,217 @@
|
|
|
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 ee from "../../components/ActionMenu.js";
|
|
5
|
+
import a from "../../components/EmptyState.js";
|
|
6
|
+
import o from "../../components/ErrorState.js";
|
|
7
|
+
import s from "../../components/LoadingState.js";
|
|
8
|
+
import c from "../../components/PageLayout.js";
|
|
9
|
+
import l, { usePagination as u } from "../../components/Pagination.js";
|
|
10
|
+
import d from "../../components/SafeLink.js";
|
|
11
|
+
import f, { formatEnumLabel as p } from "../../components/StatusBadge.js";
|
|
12
|
+
import "../../components/index.js";
|
|
13
|
+
import { useMemo as m, useState as h } from "react";
|
|
14
|
+
import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
15
|
+
import { Plus as y, 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] = h(F), [H, U] = h(F), W = u({
|
|
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 = m(() => 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__ */ v(C, {
|
|
63
|
+
type: "button",
|
|
64
|
+
onClick: () => z("sources/create"),
|
|
65
|
+
children: [/* @__PURE__ */ _(y, { className: "size-4" }), "New source"]
|
|
66
|
+
});
|
|
67
|
+
return /* @__PURE__ */ _(c, {
|
|
68
|
+
title: "Data sources",
|
|
69
|
+
description: "Instruments, archives and feeds that supply raw data into your federation.",
|
|
70
|
+
actions: $,
|
|
71
|
+
children: /* @__PURE__ */ v("div", {
|
|
72
|
+
className: "space-y-4",
|
|
73
|
+
children: [/* @__PURE__ */ v("div", {
|
|
74
|
+
className: "flex flex-wrap items-center gap-3",
|
|
75
|
+
children: [/* @__PURE__ */ _("div", {
|
|
76
|
+
className: "w-full max-w-[14rem]",
|
|
77
|
+
children: /* @__PURE__ */ v(w, {
|
|
78
|
+
value: B,
|
|
79
|
+
onValueChange: V,
|
|
80
|
+
children: [/* @__PURE__ */ _(D, {
|
|
81
|
+
"aria-label": "Filter by type",
|
|
82
|
+
children: /* @__PURE__ */ _(O, { placeholder: "All types" })
|
|
83
|
+
}), /* @__PURE__ */ v(T, { children: [/* @__PURE__ */ _(E, {
|
|
84
|
+
value: F,
|
|
85
|
+
children: "All types"
|
|
86
|
+
}), I.map((e) => /* @__PURE__ */ _(E, {
|
|
87
|
+
value: e,
|
|
88
|
+
children: p(e)
|
|
89
|
+
}, e))] })]
|
|
90
|
+
})
|
|
91
|
+
}), /* @__PURE__ */ _("div", {
|
|
92
|
+
className: "w-full max-w-[14rem]",
|
|
93
|
+
children: /* @__PURE__ */ v(w, {
|
|
94
|
+
value: H,
|
|
95
|
+
onValueChange: U,
|
|
96
|
+
children: [/* @__PURE__ */ _(D, {
|
|
97
|
+
"aria-label": "Filter by status",
|
|
98
|
+
children: /* @__PURE__ */ _(O, { placeholder: "All statuses" })
|
|
99
|
+
}), /* @__PURE__ */ v(T, { children: [/* @__PURE__ */ _(E, {
|
|
100
|
+
value: F,
|
|
101
|
+
children: "All statuses"
|
|
102
|
+
}), L.map((e) => /* @__PURE__ */ _(E, {
|
|
103
|
+
value: e,
|
|
104
|
+
children: p(e)
|
|
105
|
+
}, e))] })]
|
|
106
|
+
})
|
|
107
|
+
})]
|
|
108
|
+
}), (() => {
|
|
109
|
+
if (K) return /* @__PURE__ */ _(s, {
|
|
110
|
+
variant: "rows",
|
|
111
|
+
rows: 6,
|
|
112
|
+
label: "Loading sources…"
|
|
113
|
+
});
|
|
114
|
+
if (q) return /* @__PURE__ */ _(o, {
|
|
115
|
+
message: q.message,
|
|
116
|
+
onRetry: () => void J()
|
|
117
|
+
});
|
|
118
|
+
if (Z.length === 0) {
|
|
119
|
+
let e = B !== F || H !== F;
|
|
120
|
+
return /* @__PURE__ */ _(a, {
|
|
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__ */ v(g, { children: [/* @__PURE__ */ _("div", {
|
|
128
|
+
className: "overflow-hidden rounded-card border border-border-default bg-bg-elevated",
|
|
129
|
+
children: /* @__PURE__ */ v(k, { children: [/* @__PURE__ */ _(N, { children: /* @__PURE__ */ v(P, { children: [
|
|
130
|
+
/* @__PURE__ */ _(M, { children: "Name" }),
|
|
131
|
+
/* @__PURE__ */ _(M, { children: "Type" }),
|
|
132
|
+
/* @__PURE__ */ _(M, { children: "Status" }),
|
|
133
|
+
/* @__PURE__ */ _(M, { children: "Endpoint" }),
|
|
134
|
+
/* @__PURE__ */ _(M, { children: "Last synced" }),
|
|
135
|
+
/* @__PURE__ */ _(M, { children: "Tags" }),
|
|
136
|
+
/* @__PURE__ */ _(M, {
|
|
137
|
+
className: "text-right",
|
|
138
|
+
children: "Actions"
|
|
139
|
+
})
|
|
140
|
+
] }) }), /* @__PURE__ */ _(A, { children: Z.map((e) => /* @__PURE__ */ v(P, { children: [
|
|
141
|
+
/* @__PURE__ */ v(j, { children: [/* @__PURE__ */ _("div", {
|
|
142
|
+
className: "font-medium text-text-primary",
|
|
143
|
+
children: e.name
|
|
144
|
+
}), e.description ? /* @__PURE__ */ _("div", {
|
|
145
|
+
className: "mt-0.5 line-clamp-1 max-w-xs text-xs text-text-secondary",
|
|
146
|
+
children: e.description
|
|
147
|
+
}) : null] }),
|
|
148
|
+
/* @__PURE__ */ _(j, { children: /* @__PURE__ */ _(S, {
|
|
149
|
+
variant: "secondary",
|
|
150
|
+
children: p(e.type)
|
|
151
|
+
}) }),
|
|
152
|
+
/* @__PURE__ */ _(j, { children: /* @__PURE__ */ _(f, { status: e.status }) }),
|
|
153
|
+
/* @__PURE__ */ _(j, {
|
|
154
|
+
className: "max-w-[16rem]",
|
|
155
|
+
children: e.endpoint ? /* @__PURE__ */ _(d, {
|
|
156
|
+
href: e.endpoint,
|
|
157
|
+
className: "block truncate text-sm text-text-primary underline-offset-2 hover:underline",
|
|
158
|
+
fallbackClassName: "block truncate text-sm text-text-secondary",
|
|
159
|
+
children: e.endpoint
|
|
160
|
+
}) : /* @__PURE__ */ _("span", {
|
|
161
|
+
className: "text-sm text-text-secondary",
|
|
162
|
+
children: "—"
|
|
163
|
+
})
|
|
164
|
+
}),
|
|
165
|
+
/* @__PURE__ */ _(j, {
|
|
166
|
+
className: "whitespace-nowrap text-sm text-text-secondary",
|
|
167
|
+
children: R(e.lastSyncedAt)
|
|
168
|
+
}),
|
|
169
|
+
/* @__PURE__ */ _(j, { children: /* @__PURE__ */ v("div", {
|
|
170
|
+
className: "flex max-w-[12rem] flex-wrap gap-1",
|
|
171
|
+
children: [e.tags.length === 0 ? /* @__PURE__ */ _("span", {
|
|
172
|
+
className: "text-xs text-text-secondary",
|
|
173
|
+
children: "—"
|
|
174
|
+
}) : e.tags.slice(0, 3).map((e) => /* @__PURE__ */ _(S, {
|
|
175
|
+
variant: "outline",
|
|
176
|
+
className: "text-xs",
|
|
177
|
+
children: e
|
|
178
|
+
}, e)), e.tags.length > 3 ? /* @__PURE__ */ v("span", {
|
|
179
|
+
className: "text-xs text-text-secondary",
|
|
180
|
+
children: ["+", e.tags.length - 3]
|
|
181
|
+
}) : null]
|
|
182
|
+
}) }),
|
|
183
|
+
/* @__PURE__ */ _(j, {
|
|
184
|
+
className: "text-right",
|
|
185
|
+
children: /* @__PURE__ */ _(ee, {
|
|
186
|
+
ariaLabel: `Actions for ${e.name}`,
|
|
187
|
+
entityName: e.name,
|
|
188
|
+
onEdit: () => z(`sources/${e.id}/edit`),
|
|
189
|
+
onDelete: () => ne(e),
|
|
190
|
+
deleteLabel: "Archive source",
|
|
191
|
+
extraItems: [{
|
|
192
|
+
key: "mark-synced",
|
|
193
|
+
label: "Mark synced",
|
|
194
|
+
icon: x,
|
|
195
|
+
onSelect: () => void te(e)
|
|
196
|
+
}]
|
|
197
|
+
})
|
|
198
|
+
})
|
|
199
|
+
] }, e.id)) })] })
|
|
200
|
+
}), /* @__PURE__ */ _(l, {
|
|
201
|
+
offset: W.offset,
|
|
202
|
+
limit: W.limit,
|
|
203
|
+
loadedCount: Z.length,
|
|
204
|
+
hasMore: Q?.hasMore ?? !1,
|
|
205
|
+
onPrev: W.prevPage,
|
|
206
|
+
onNext: W.nextPage,
|
|
207
|
+
itemLabel: "sources",
|
|
208
|
+
loading: K
|
|
209
|
+
})] });
|
|
210
|
+
})()]
|
|
211
|
+
})
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
//#endregion
|
|
215
|
+
export { z as default };
|
|
216
|
+
|
|
217
|
+
//# 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 key={source.id}>\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 className=\"max-w-[16rem]\">\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 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":"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"}
|
|
@@ -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"}
|