@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,368 @@
|
|
|
1
|
+
import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
|
|
2
|
+
import { notify as t } from "../../lib/toast.js";
|
|
3
|
+
import { useCosPublishReleaseMutation as n, useCosReleasesQuery as r } from "../../api/cosmicApi.js";
|
|
4
|
+
import i from "../../components/ActionMenu.js";
|
|
5
|
+
import ee from "../../components/EmptyState.js";
|
|
6
|
+
import te from "../../components/ErrorState.js";
|
|
7
|
+
import ne from "../../components/LoadingState.js";
|
|
8
|
+
import re from "../../components/PageLayout.js";
|
|
9
|
+
import a, { usePagination as o } from "../../components/Pagination.js";
|
|
10
|
+
import s from "../../components/SafeLink.js";
|
|
11
|
+
import c, { formatEnumLabel as l } from "../../components/StatusBadge.js";
|
|
12
|
+
import "../../components/index.js";
|
|
13
|
+
import { useMemo as u, useState as d } from "react";
|
|
14
|
+
import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
15
|
+
import { BookOpen as ie, ExternalLink as h, Plus as ae, Rocket as g } from "lucide-react";
|
|
16
|
+
import { Badge as _, Button as v, Dialog as y, DialogClose as b, DialogContent as x, DialogDescription as S, DialogFooter as C, DialogHeader as w, DialogTitle as T, Input as oe, Label as se, Select as ce, SelectContent as le, SelectItem as E, SelectTrigger as ue, SelectValue as de, Table as D, TableBody as fe, TableCell as O, TableHead as k, TableHeader as pe, TableRow as A } from "@burdenoff/fe-libs/ui";
|
|
17
|
+
//#region src/cosmicintersection/pages/releases/ReleasesPage.tsx
|
|
18
|
+
var j = "ALL", M = [
|
|
19
|
+
"DRAFT",
|
|
20
|
+
"UNDER_REVIEW",
|
|
21
|
+
"PUBLISHED",
|
|
22
|
+
"RETRACTED"
|
|
23
|
+
];
|
|
24
|
+
function N(e) {
|
|
25
|
+
return e === "DRAFT" || e === "UNDER_REVIEW";
|
|
26
|
+
}
|
|
27
|
+
function P(e) {
|
|
28
|
+
if (!e) return "—";
|
|
29
|
+
let t = new Date(e);
|
|
30
|
+
return Number.isNaN(t.getTime()) ? "—" : t.toLocaleDateString(void 0, {
|
|
31
|
+
year: "numeric",
|
|
32
|
+
month: "short",
|
|
33
|
+
day: "numeric"
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function F(e) {
|
|
37
|
+
let t = e.trim();
|
|
38
|
+
return /^https?:\/\//i.test(t) ? t : `https://doi.org/${t.replace(/^doi:/i, "")}`;
|
|
39
|
+
}
|
|
40
|
+
function I() {
|
|
41
|
+
let { navigate: I } = e(), [L, R] = d(j), z = o({
|
|
42
|
+
pageSize: 20,
|
|
43
|
+
resetKey: L
|
|
44
|
+
}), { data: B, loading: V, error: H, refetch: U } = r({
|
|
45
|
+
status: L === j ? void 0 : L,
|
|
46
|
+
pagination: {
|
|
47
|
+
limit: z.limit,
|
|
48
|
+
offset: z.offset
|
|
49
|
+
}
|
|
50
|
+
}), [me, { loading: W }] = n(), G = u(() => B?.cosListReleases.items ?? [], [B]), he = B?.cosListReleases.pageInfo, [K, q] = d(null), [J, Y] = d(null), [X, Z] = d(""), Q = (e) => {
|
|
51
|
+
Z(e.doi ?? ""), Y(e);
|
|
52
|
+
}, ge = async () => {
|
|
53
|
+
if (!J) return;
|
|
54
|
+
let e = X.trim();
|
|
55
|
+
(await me({ variables: {
|
|
56
|
+
id: J.id,
|
|
57
|
+
doi: e || void 0
|
|
58
|
+
} })).data?.cosPublishRelease?.id && (t.success("Release published", `“${J.title}” is now public.`), Y(null), Z(""), await U());
|
|
59
|
+
}, $ = /* @__PURE__ */ m(v, {
|
|
60
|
+
type: "button",
|
|
61
|
+
onClick: () => I("releases/create"),
|
|
62
|
+
children: [/* @__PURE__ */ p(ae, { className: "size-4" }), "New release"]
|
|
63
|
+
});
|
|
64
|
+
return /* @__PURE__ */ m(re, {
|
|
65
|
+
title: "Releases",
|
|
66
|
+
description: "Citable, versioned publications that bundle datasets and notebooks for the community.",
|
|
67
|
+
actions: $,
|
|
68
|
+
children: [
|
|
69
|
+
/* @__PURE__ */ m("div", {
|
|
70
|
+
className: "space-y-4",
|
|
71
|
+
children: [/* @__PURE__ */ p("div", {
|
|
72
|
+
className: "flex flex-wrap items-center gap-3",
|
|
73
|
+
children: /* @__PURE__ */ p("div", {
|
|
74
|
+
className: "w-full max-w-[14rem]",
|
|
75
|
+
children: /* @__PURE__ */ m(ce, {
|
|
76
|
+
value: L,
|
|
77
|
+
onValueChange: R,
|
|
78
|
+
children: [/* @__PURE__ */ p(ue, {
|
|
79
|
+
"aria-label": "Filter by status",
|
|
80
|
+
children: /* @__PURE__ */ p(de, { placeholder: "All statuses" })
|
|
81
|
+
}), /* @__PURE__ */ m(le, { children: [/* @__PURE__ */ p(E, {
|
|
82
|
+
value: j,
|
|
83
|
+
children: "All statuses"
|
|
84
|
+
}), M.map((e) => /* @__PURE__ */ p(E, {
|
|
85
|
+
value: e,
|
|
86
|
+
children: l(e)
|
|
87
|
+
}, e))] })]
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
}), (() => {
|
|
91
|
+
if (V) return /* @__PURE__ */ p(ne, {
|
|
92
|
+
variant: "rows",
|
|
93
|
+
rows: 6,
|
|
94
|
+
label: "Loading releases…"
|
|
95
|
+
});
|
|
96
|
+
if (H) return /* @__PURE__ */ p(te, {
|
|
97
|
+
message: H.message,
|
|
98
|
+
onRetry: () => void U()
|
|
99
|
+
});
|
|
100
|
+
if (G.length === 0) {
|
|
101
|
+
let e = L !== j;
|
|
102
|
+
return /* @__PURE__ */ p(ee, {
|
|
103
|
+
icon: g,
|
|
104
|
+
title: e ? "No releases match this filter" : "No releases yet",
|
|
105
|
+
description: e ? "Try clearing the status filter to see more releases." : "Package datasets and notebooks into a citable, versioned release for publication.",
|
|
106
|
+
action: e ? void 0 : $
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p("div", {
|
|
110
|
+
className: "overflow-x-auto rounded-card border border-border-default bg-bg-elevated",
|
|
111
|
+
children: /* @__PURE__ */ m(D, { children: [/* @__PURE__ */ p(pe, { children: /* @__PURE__ */ m(A, { children: [
|
|
112
|
+
/* @__PURE__ */ p(k, { children: "Title" }),
|
|
113
|
+
/* @__PURE__ */ p(k, { children: "Version" }),
|
|
114
|
+
/* @__PURE__ */ p(k, { children: "Status" }),
|
|
115
|
+
/* @__PURE__ */ p(k, { children: "DOI" }),
|
|
116
|
+
/* @__PURE__ */ p(k, { children: "Authors" }),
|
|
117
|
+
/* @__PURE__ */ p(k, { children: "Published" }),
|
|
118
|
+
/* @__PURE__ */ p(k, { children: "License" }),
|
|
119
|
+
/* @__PURE__ */ p(k, {
|
|
120
|
+
className: "text-right",
|
|
121
|
+
children: "Actions"
|
|
122
|
+
})
|
|
123
|
+
] }) }), /* @__PURE__ */ p(fe, { children: G.map((e) => /* @__PURE__ */ m(A, { children: [
|
|
124
|
+
/* @__PURE__ */ p(O, { children: /* @__PURE__ */ p("button", {
|
|
125
|
+
type: "button",
|
|
126
|
+
onClick: () => q(e),
|
|
127
|
+
className: "text-left font-medium text-text-primary underline-offset-2 hover:underline focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border-focus",
|
|
128
|
+
children: e.title
|
|
129
|
+
}) }),
|
|
130
|
+
/* @__PURE__ */ p(O, {
|
|
131
|
+
className: "whitespace-nowrap text-sm text-text-secondary",
|
|
132
|
+
children: e.version || "—"
|
|
133
|
+
}),
|
|
134
|
+
/* @__PURE__ */ p(O, { children: /* @__PURE__ */ p(c, { status: e.status }) }),
|
|
135
|
+
/* @__PURE__ */ p(O, {
|
|
136
|
+
className: "max-w-[14rem]",
|
|
137
|
+
children: e.doi ? /* @__PURE__ */ m(s, {
|
|
138
|
+
href: F(e.doi),
|
|
139
|
+
className: "inline-flex items-center gap-1 truncate text-sm text-text-primary underline-offset-2 hover:underline",
|
|
140
|
+
fallbackClassName: "block truncate text-sm text-text-secondary",
|
|
141
|
+
children: [/* @__PURE__ */ p("span", {
|
|
142
|
+
className: "truncate",
|
|
143
|
+
children: e.doi
|
|
144
|
+
}), /* @__PURE__ */ p(h, {
|
|
145
|
+
className: "size-3.5 shrink-0",
|
|
146
|
+
"aria-hidden": "true"
|
|
147
|
+
})]
|
|
148
|
+
}) : /* @__PURE__ */ p("span", {
|
|
149
|
+
className: "text-sm text-text-secondary",
|
|
150
|
+
children: "—"
|
|
151
|
+
})
|
|
152
|
+
}),
|
|
153
|
+
/* @__PURE__ */ p(O, {
|
|
154
|
+
className: "max-w-[14rem]",
|
|
155
|
+
children: e.authors.length === 0 ? /* @__PURE__ */ p("span", {
|
|
156
|
+
className: "text-sm text-text-secondary",
|
|
157
|
+
children: "—"
|
|
158
|
+
}) : /* @__PURE__ */ p("span", {
|
|
159
|
+
className: "line-clamp-1 text-sm text-text-secondary",
|
|
160
|
+
children: e.authors.join(", ")
|
|
161
|
+
})
|
|
162
|
+
}),
|
|
163
|
+
/* @__PURE__ */ p(O, {
|
|
164
|
+
className: "whitespace-nowrap text-sm text-text-secondary",
|
|
165
|
+
children: P(e.publishedAt)
|
|
166
|
+
}),
|
|
167
|
+
/* @__PURE__ */ p(O, {
|
|
168
|
+
className: "whitespace-nowrap text-sm text-text-secondary",
|
|
169
|
+
children: e.license || "—"
|
|
170
|
+
}),
|
|
171
|
+
/* @__PURE__ */ p(O, {
|
|
172
|
+
className: "text-right",
|
|
173
|
+
children: /* @__PURE__ */ p(i, {
|
|
174
|
+
ariaLabel: `Actions for ${e.title}`,
|
|
175
|
+
onView: () => q(e),
|
|
176
|
+
extraItems: N(e.status) ? [{
|
|
177
|
+
key: "publish",
|
|
178
|
+
label: "Publish",
|
|
179
|
+
icon: g,
|
|
180
|
+
onSelect: () => Q(e)
|
|
181
|
+
}] : []
|
|
182
|
+
})
|
|
183
|
+
})
|
|
184
|
+
] }, e.id)) })] })
|
|
185
|
+
}), /* @__PURE__ */ p(a, {
|
|
186
|
+
offset: z.offset,
|
|
187
|
+
limit: z.limit,
|
|
188
|
+
loadedCount: G.length,
|
|
189
|
+
hasMore: he?.hasMore ?? !1,
|
|
190
|
+
onPrev: z.prevPage,
|
|
191
|
+
onNext: z.nextPage,
|
|
192
|
+
itemLabel: "releases",
|
|
193
|
+
loading: V
|
|
194
|
+
})] });
|
|
195
|
+
})()]
|
|
196
|
+
}),
|
|
197
|
+
/* @__PURE__ */ p(y, {
|
|
198
|
+
open: K !== null,
|
|
199
|
+
onOpenChange: (e) => e ? void 0 : q(null),
|
|
200
|
+
children: /* @__PURE__ */ p(x, {
|
|
201
|
+
className: "max-w-lg",
|
|
202
|
+
children: K ? /* @__PURE__ */ m(f, { children: [
|
|
203
|
+
/* @__PURE__ */ m(w, { children: [/* @__PURE__ */ m(T, {
|
|
204
|
+
className: "flex items-center gap-2",
|
|
205
|
+
children: [/* @__PURE__ */ p(ie, {
|
|
206
|
+
className: "size-5 text-text-secondary",
|
|
207
|
+
"aria-hidden": "true"
|
|
208
|
+
}), K.title]
|
|
209
|
+
}), /* @__PURE__ */ m(S, { children: [
|
|
210
|
+
"Version ",
|
|
211
|
+
K.version || "—",
|
|
212
|
+
" · ",
|
|
213
|
+
/* @__PURE__ */ p(c, { status: K.status })
|
|
214
|
+
] })] }),
|
|
215
|
+
/* @__PURE__ */ m("div", {
|
|
216
|
+
className: "space-y-4 text-sm",
|
|
217
|
+
children: [
|
|
218
|
+
/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
|
|
219
|
+
className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
|
|
220
|
+
children: "Abstract"
|
|
221
|
+
}), /* @__PURE__ */ p("p", {
|
|
222
|
+
className: "mt-1 whitespace-pre-wrap text-text-primary",
|
|
223
|
+
children: K.abstract?.trim() || "No abstract provided."
|
|
224
|
+
})] }),
|
|
225
|
+
/* @__PURE__ */ m("div", {
|
|
226
|
+
className: "grid grid-cols-2 gap-4",
|
|
227
|
+
children: [
|
|
228
|
+
/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
|
|
229
|
+
className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
|
|
230
|
+
children: "Authors"
|
|
231
|
+
}), /* @__PURE__ */ p("p", {
|
|
232
|
+
className: "mt-1 text-text-primary",
|
|
233
|
+
children: K.authors.length ? K.authors.join(", ") : "—"
|
|
234
|
+
})] }),
|
|
235
|
+
/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
|
|
236
|
+
className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
|
|
237
|
+
children: "License"
|
|
238
|
+
}), /* @__PURE__ */ p("p", {
|
|
239
|
+
className: "mt-1 text-text-primary",
|
|
240
|
+
children: K.license || "—"
|
|
241
|
+
})] }),
|
|
242
|
+
/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
|
|
243
|
+
className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
|
|
244
|
+
children: "Published"
|
|
245
|
+
}), /* @__PURE__ */ p("p", {
|
|
246
|
+
className: "mt-1 text-text-primary",
|
|
247
|
+
children: P(K.publishedAt)
|
|
248
|
+
})] }),
|
|
249
|
+
/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
|
|
250
|
+
className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
|
|
251
|
+
children: "DOI"
|
|
252
|
+
}), /* @__PURE__ */ p("p", {
|
|
253
|
+
className: "mt-1",
|
|
254
|
+
children: K.doi ? /* @__PURE__ */ m(s, {
|
|
255
|
+
href: F(K.doi),
|
|
256
|
+
className: "inline-flex items-center gap-1 text-text-primary underline-offset-2 hover:underline",
|
|
257
|
+
fallbackClassName: "text-text-secondary",
|
|
258
|
+
children: [K.doi, /* @__PURE__ */ p(h, {
|
|
259
|
+
className: "size-3.5",
|
|
260
|
+
"aria-hidden": "true"
|
|
261
|
+
})]
|
|
262
|
+
}) : /* @__PURE__ */ p("span", {
|
|
263
|
+
className: "text-text-secondary",
|
|
264
|
+
children: "Not assigned"
|
|
265
|
+
})
|
|
266
|
+
})] })
|
|
267
|
+
]
|
|
268
|
+
}),
|
|
269
|
+
/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ m("p", {
|
|
270
|
+
className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
|
|
271
|
+
children: [
|
|
272
|
+
"Datasets (",
|
|
273
|
+
K.datasetIds.length,
|
|
274
|
+
")"
|
|
275
|
+
]
|
|
276
|
+
}), /* @__PURE__ */ p("div", {
|
|
277
|
+
className: "mt-1 flex flex-wrap gap-1",
|
|
278
|
+
children: K.datasetIds.length === 0 ? /* @__PURE__ */ p("span", {
|
|
279
|
+
className: "text-text-secondary",
|
|
280
|
+
children: "None linked."
|
|
281
|
+
}) : K.datasetIds.map((e) => /* @__PURE__ */ p(_, {
|
|
282
|
+
variant: "outline",
|
|
283
|
+
className: "font-mono text-xs",
|
|
284
|
+
children: e
|
|
285
|
+
}, e))
|
|
286
|
+
})] }),
|
|
287
|
+
/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
|
|
288
|
+
className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
|
|
289
|
+
children: "Notebook"
|
|
290
|
+
}), /* @__PURE__ */ p("p", {
|
|
291
|
+
className: "mt-1",
|
|
292
|
+
children: K.notebookId ? /* @__PURE__ */ p(_, {
|
|
293
|
+
variant: "outline",
|
|
294
|
+
className: "font-mono text-xs",
|
|
295
|
+
children: K.notebookId
|
|
296
|
+
}) : /* @__PURE__ */ p("span", {
|
|
297
|
+
className: "text-text-secondary",
|
|
298
|
+
children: "None linked."
|
|
299
|
+
})
|
|
300
|
+
})] })
|
|
301
|
+
]
|
|
302
|
+
}),
|
|
303
|
+
/* @__PURE__ */ m(C, { children: [N(K.status) ? /* @__PURE__ */ m(v, {
|
|
304
|
+
type: "button",
|
|
305
|
+
onClick: () => {
|
|
306
|
+
let e = K;
|
|
307
|
+
q(null), Q(e);
|
|
308
|
+
},
|
|
309
|
+
children: [/* @__PURE__ */ p(g, { className: "size-4" }), "Publish"]
|
|
310
|
+
}) : null, /* @__PURE__ */ p(b, {
|
|
311
|
+
asChild: !0,
|
|
312
|
+
children: /* @__PURE__ */ p(v, {
|
|
313
|
+
type: "button",
|
|
314
|
+
variant: "outline",
|
|
315
|
+
children: "Close"
|
|
316
|
+
})
|
|
317
|
+
})] })
|
|
318
|
+
] }) : null
|
|
319
|
+
})
|
|
320
|
+
}),
|
|
321
|
+
/* @__PURE__ */ p(y, {
|
|
322
|
+
open: J !== null,
|
|
323
|
+
onOpenChange: (e) => e || W ? void 0 : Y(null),
|
|
324
|
+
children: /* @__PURE__ */ m(x, {
|
|
325
|
+
className: "max-w-md",
|
|
326
|
+
children: [
|
|
327
|
+
/* @__PURE__ */ m(w, { children: [/* @__PURE__ */ p(T, { children: "Publish release" }), /* @__PURE__ */ p(S, { children: J ? `Publish “${J.title}” to make it publicly citable. You can attach a DOI now or later.` : "" })] }),
|
|
328
|
+
/* @__PURE__ */ m("div", {
|
|
329
|
+
className: "space-y-2",
|
|
330
|
+
children: [
|
|
331
|
+
/* @__PURE__ */ p(se, {
|
|
332
|
+
htmlFor: "release-doi",
|
|
333
|
+
children: "DOI (optional)"
|
|
334
|
+
}),
|
|
335
|
+
/* @__PURE__ */ p(oe, {
|
|
336
|
+
id: "release-doi",
|
|
337
|
+
value: X,
|
|
338
|
+
onChange: (e) => Z(e.target.value),
|
|
339
|
+
placeholder: "10.1234/cosmic.2026.0001"
|
|
340
|
+
}),
|
|
341
|
+
/* @__PURE__ */ p("p", {
|
|
342
|
+
className: "text-xs text-text-secondary",
|
|
343
|
+
children: "A Digital Object Identifier makes the release permanently referenceable."
|
|
344
|
+
})
|
|
345
|
+
]
|
|
346
|
+
}),
|
|
347
|
+
/* @__PURE__ */ m(C, { children: [/* @__PURE__ */ p(v, {
|
|
348
|
+
type: "button",
|
|
349
|
+
variant: "outline",
|
|
350
|
+
onClick: () => Y(null),
|
|
351
|
+
disabled: W,
|
|
352
|
+
children: "Cancel"
|
|
353
|
+
}), /* @__PURE__ */ m(v, {
|
|
354
|
+
type: "button",
|
|
355
|
+
onClick: () => void ge(),
|
|
356
|
+
disabled: W,
|
|
357
|
+
children: [/* @__PURE__ */ p(g, { className: "size-4" }), W ? "Publishing…" : "Publish release"]
|
|
358
|
+
})] })
|
|
359
|
+
]
|
|
360
|
+
})
|
|
361
|
+
})
|
|
362
|
+
]
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
//#endregion
|
|
366
|
+
export { I as default };
|
|
367
|
+
|
|
368
|
+
//# sourceMappingURL=ReleasesPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReleasesPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/releases/ReleasesPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { BookOpen, ExternalLink, Plus, Rocket } from 'lucide-react';\nimport {\n Badge,\n Button,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\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 useCosPublishReleaseMutation,\n useCosReleasesQuery,\n type CosRelease,\n type CosReleaseStatus,\n} from '../../api/cosmicApi';\nimport {\n EmptyState,\n ErrorState,\n LoadingState,\n PageLayout,\n Pagination,\n SafeLink,\n StatusBadge,\n formatEnumLabel,\n usePagination,\n} from '../../components';\nimport { ActionMenu } from '../../components/ActionMenu';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\nimport { notify } from '../../lib/toast';\n\nconst ALL = 'ALL';\n\nconst RELEASE_STATUSES: CosReleaseStatus[] = ['DRAFT', 'UNDER_REVIEW', 'PUBLISHED', 'RETRACTED'];\n\n/** A release can be published only while it is still in a pre-publication state. */\nfunction canPublish(status: CosReleaseStatus): boolean {\n return status === 'DRAFT' || status === 'UNDER_REVIEW';\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\nfunction doiUrl(doi: string): string {\n const trimmed = doi.trim();\n return /^https?:\\/\\//i.test(trimmed)\n ? trimmed\n : `https://doi.org/${trimmed.replace(/^doi:/i, '')}`;\n}\n\nexport default function ReleasesPage() {\n const { navigate } = useCosmicIntersection();\n const [statusFilter, setStatusFilter] = useState<string>(ALL);\n const pagination = usePagination({ pageSize: 20, resetKey: statusFilter });\n\n const { data, loading, error, refetch } = useCosReleasesQuery({\n status: statusFilter === ALL ? undefined : (statusFilter as CosReleaseStatus),\n pagination: { limit: pagination.limit, offset: pagination.offset },\n });\n\n const [publishRelease, { loading: publishing }] = useCosPublishReleaseMutation();\n\n const releases = useMemo(() => data?.cosListReleases.items ?? [], [data]);\n const pageInfo = data?.cosListReleases.pageInfo;\n\n // Detail (View) dialog — rendered from row data, no extra fetch needed.\n const [detail, setDetail] = useState<CosRelease | null>(null);\n\n // Publish dialog — captures an optional DOI before transitioning the release.\n const [publishTarget, setPublishTarget] = useState<CosRelease | null>(null);\n const [doiDraft, setDoiDraft] = useState('');\n\n const openPublish = (release: CosRelease) => {\n setDoiDraft(release.doi ?? '');\n setPublishTarget(release);\n };\n\n const submitPublish = async () => {\n if (!publishTarget) {\n return;\n }\n const doi = doiDraft.trim();\n const response = await publishRelease({\n variables: { id: publishTarget.id, doi: doi || undefined },\n });\n if (response.data?.cosPublishRelease?.id) {\n notify.success('Release published', `“${publishTarget.title}” is now public.`);\n setPublishTarget(null);\n setDoiDraft('');\n await refetch();\n }\n };\n\n const newButton = (\n <Button type=\"button\" onClick={() => navigate('releases/create')}>\n <Plus className=\"size-4\" />\n New release\n </Button>\n );\n\n const renderBody = () => {\n if (loading) {\n return <LoadingState variant=\"rows\" rows={6} label=\"Loading releases…\" />;\n }\n if (error) {\n return <ErrorState message={error.message} onRetry={() => void refetch()} />;\n }\n if (releases.length === 0) {\n const filtered = statusFilter !== ALL;\n return (\n <EmptyState\n icon={Rocket}\n title={filtered ? 'No releases match this filter' : 'No releases yet'}\n description={\n filtered\n ? 'Try clearing the status filter to see more releases.'\n : 'Package datasets and notebooks into a citable, versioned release for publication.'\n }\n action={filtered ? undefined : newButton}\n />\n );\n }\n\n return (\n <>\n <div className=\"overflow-x-auto rounded-card border border-border-default bg-bg-elevated\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Title</TableHead>\n <TableHead>Version</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>DOI</TableHead>\n <TableHead>Authors</TableHead>\n <TableHead>Published</TableHead>\n <TableHead>License</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {releases.map((release) => (\n <TableRow key={release.id}>\n <TableCell>\n <button\n type=\"button\"\n onClick={() => setDetail(release)}\n className=\"text-left font-medium text-text-primary underline-offset-2 hover:underline focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border-focus\"\n >\n {release.title}\n </button>\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm text-text-secondary\">\n {release.version || '—'}\n </TableCell>\n <TableCell>\n <StatusBadge status={release.status} />\n </TableCell>\n <TableCell className=\"max-w-[14rem]\">\n {release.doi ? (\n <SafeLink\n href={doiUrl(release.doi)}\n className=\"inline-flex items-center gap-1 truncate text-sm text-text-primary underline-offset-2 hover:underline\"\n fallbackClassName=\"block truncate text-sm text-text-secondary\"\n >\n <span className=\"truncate\">{release.doi}</span>\n <ExternalLink className=\"size-3.5 shrink-0\" aria-hidden=\"true\" />\n </SafeLink>\n ) : (\n <span className=\"text-sm text-text-secondary\">—</span>\n )}\n </TableCell>\n <TableCell className=\"max-w-[14rem]\">\n {release.authors.length === 0 ? (\n <span className=\"text-sm text-text-secondary\">—</span>\n ) : (\n <span className=\"line-clamp-1 text-sm text-text-secondary\">\n {release.authors.join(', ')}\n </span>\n )}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm text-text-secondary\">\n {formatDate(release.publishedAt)}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm text-text-secondary\">\n {release.license || '—'}\n </TableCell>\n <TableCell className=\"text-right\">\n <ActionMenu\n ariaLabel={`Actions for ${release.title}`}\n onView={() => setDetail(release)}\n extraItems={\n canPublish(release.status)\n ? [\n {\n key: 'publish',\n label: 'Publish',\n icon: Rocket,\n onSelect: () => openPublish(release),\n },\n ]\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={releases.length}\n hasMore={pageInfo?.hasMore ?? false}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"releases\"\n loading={loading}\n />\n </>\n );\n };\n\n return (\n <PageLayout\n title=\"Releases\"\n description=\"Citable, versioned publications that bundle datasets and notebooks for the community.\"\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={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 {RELEASE_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\n {/* View / detail dialog */}\n <Dialog open={detail !== null} onOpenChange={(open) => (open ? undefined : setDetail(null))}>\n <DialogContent className=\"max-w-lg\">\n {detail ? (\n <>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <BookOpen className=\"size-5 text-text-secondary\" aria-hidden=\"true\" />\n {detail.title}\n </DialogTitle>\n <DialogDescription>\n Version {detail.version || '—'} · <StatusBadge status={detail.status} />\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 text-sm\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Abstract\n </p>\n <p className=\"mt-1 whitespace-pre-wrap text-text-primary\">\n {detail.abstract?.trim() || 'No abstract provided.'}\n </p>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Authors\n </p>\n <p className=\"mt-1 text-text-primary\">\n {detail.authors.length ? detail.authors.join(', ') : '—'}\n </p>\n </div>\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n License\n </p>\n <p className=\"mt-1 text-text-primary\">{detail.license || '—'}</p>\n </div>\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Published\n </p>\n <p className=\"mt-1 text-text-primary\">{formatDate(detail.publishedAt)}</p>\n </div>\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n DOI\n </p>\n <p className=\"mt-1\">\n {detail.doi ? (\n <SafeLink\n href={doiUrl(detail.doi)}\n className=\"inline-flex items-center gap-1 text-text-primary underline-offset-2 hover:underline\"\n fallbackClassName=\"text-text-secondary\"\n >\n {detail.doi}\n <ExternalLink className=\"size-3.5\" aria-hidden=\"true\" />\n </SafeLink>\n ) : (\n <span className=\"text-text-secondary\">Not assigned</span>\n )}\n </p>\n </div>\n </div>\n\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Datasets ({detail.datasetIds.length})\n </p>\n <div className=\"mt-1 flex flex-wrap gap-1\">\n {detail.datasetIds.length === 0 ? (\n <span className=\"text-text-secondary\">None linked.</span>\n ) : (\n detail.datasetIds.map((id) => (\n <Badge key={id} variant=\"outline\" className=\"font-mono text-xs\">\n {id}\n </Badge>\n ))\n )}\n </div>\n </div>\n\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Notebook\n </p>\n <p className=\"mt-1\">\n {detail.notebookId ? (\n <Badge variant=\"outline\" className=\"font-mono text-xs\">\n {detail.notebookId}\n </Badge>\n ) : (\n <span className=\"text-text-secondary\">None linked.</span>\n )}\n </p>\n </div>\n </div>\n\n <DialogFooter>\n {canPublish(detail.status) ? (\n <Button\n type=\"button\"\n onClick={() => {\n const target = detail;\n setDetail(null);\n openPublish(target);\n }}\n >\n <Rocket className=\"size-4\" />\n Publish\n </Button>\n ) : null}\n <DialogClose asChild>\n <Button type=\"button\" variant=\"outline\">\n Close\n </Button>\n </DialogClose>\n </DialogFooter>\n </>\n ) : null}\n </DialogContent>\n </Dialog>\n\n {/* Publish dialog */}\n <Dialog\n open={publishTarget !== null}\n onOpenChange={(open) => (open || publishing ? undefined : setPublishTarget(null))}\n >\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>Publish release</DialogTitle>\n <DialogDescription>\n {publishTarget\n ? `Publish “${publishTarget.title}” to make it publicly citable. You can attach a DOI now or later.`\n : ''}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"release-doi\">DOI (optional)</Label>\n <Input\n id=\"release-doi\"\n value={doiDraft}\n onChange={(event) => setDoiDraft(event.target.value)}\n placeholder=\"10.1234/cosmic.2026.0001\"\n />\n <p className=\"text-xs text-text-secondary\">\n A Digital Object Identifier makes the release permanently referenceable.\n </p>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setPublishTarget(null)}\n disabled={publishing}\n >\n Cancel\n </Button>\n <Button type=\"button\" onClick={() => void submitPublish()} disabled={publishing}>\n <Rocket className=\"size-4\" />\n {publishing ? 'Publishing…' : 'Publish release'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|