@burdenoff/microfe-theculturepost 2026.1112.3 → 2026.1113.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/theculturepost/components/CommunityNorms.d.ts +22 -0
- package/dist/theculturepost/components/CommunityNorms.js +42 -0
- package/dist/theculturepost/components/CommunityNorms.js.map +1 -0
- package/dist/theculturepost/components/CreateArchiveItemDialog.d.ts +9 -1
- package/dist/theculturepost/components/CreateArchiveItemDialog.js +78 -78
- package/dist/theculturepost/components/CreateArchiveItemDialog.js.map +1 -1
- package/dist/theculturepost/components/EditArchiveItemDialog.d.ts +8 -0
- package/dist/theculturepost/components/EditArchiveItemDialog.js +236 -0
- package/dist/theculturepost/components/EditArchiveItemDialog.js.map +1 -0
- package/dist/theculturepost/components/OpenDiscussionDialog.js +63 -61
- package/dist/theculturepost/components/OpenDiscussionDialog.js.map +1 -1
- package/dist/theculturepost/hooks/index.js +7 -7
- package/dist/theculturepost/hooks/useTcpApi.js +29 -11
- package/dist/theculturepost/hooks/useTcpApi.js.map +1 -1
- package/dist/theculturepost/pages/archive/ArchiveItemDetailPage.d.ts +3 -1
- package/dist/theculturepost/pages/archive/ArchiveItemDetailPage.js +222 -183
- package/dist/theculturepost/pages/archive/ArchiveItemDetailPage.js.map +1 -1
- package/dist/theculturepost/pages/discussions/DiscussionDetailPage.js +151 -146
- package/dist/theculturepost/pages/discussions/DiscussionDetailPage.js.map +1 -1
- package/dist/theculturepost/pages/discussions/DiscussionsPage.js +62 -57
- package/dist/theculturepost/pages/discussions/DiscussionsPage.js.map +1 -1
- package/dist/theculturepost/translations/en.d.ts +6 -0
- package/dist/theculturepost/translations/en.js +6 -0
- package/dist/theculturepost/translations/en.js.map +1 -1
- package/dist/theculturepost/utils/archivePermissions.d.ts +17 -0
- package/dist/theculturepost/utils/archivePermissions.js +13 -0
- package/dist/theculturepost/utils/archivePermissions.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CommunityNorms — the community norms, shown up front wherever people
|
|
3
|
+
* start or join a conversation (discussions list, discussion detail, and the
|
|
4
|
+
* open-discussion dialog).
|
|
5
|
+
* @module theculturepost/components
|
|
6
|
+
*
|
|
7
|
+
* Product-wide norms from i18n keys (`norms.*`); workspace-editable norms are
|
|
8
|
+
* a post-launch enhancement. Semantic tokens only.
|
|
9
|
+
*/
|
|
10
|
+
export interface CommunityNorm {
|
|
11
|
+
key: string;
|
|
12
|
+
fallback: string;
|
|
13
|
+
}
|
|
14
|
+
/** The norms, in display order. Exported so tests can pin the i18n keys. */
|
|
15
|
+
export declare const COMMUNITY_NORMS: readonly CommunityNorm[];
|
|
16
|
+
interface CommunityNormsProps {
|
|
17
|
+
className?: string;
|
|
18
|
+
/** Tighter spacing for dialogs and list headers. */
|
|
19
|
+
compact?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function CommunityNorms({ className, compact }: CommunityNormsProps): import('react').JSX.Element;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import "../hooks/index.js";
|
|
2
|
+
import { useTr as e } from "../hooks/useTr.js";
|
|
3
|
+
import { cn as t } from "../utils/cn.js";
|
|
4
|
+
import { useId as n } from "react";
|
|
5
|
+
import { HeartHandshake as r } from "lucide-react";
|
|
6
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
7
|
+
// src/theculturepost/components/CommunityNorms.tsx
|
|
8
|
+
var o = [
|
|
9
|
+
{
|
|
10
|
+
key: "norms.respect",
|
|
11
|
+
fallback: "Treat every tradition, faith and community with respect."
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
key: "norms.ownVoice",
|
|
15
|
+
fallback: "Speak from your own experience; do not speak for others."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
key: "norms.ideas",
|
|
19
|
+
fallback: "Challenge ideas, never people, and cite sources where you can."
|
|
20
|
+
}
|
|
21
|
+
];
|
|
22
|
+
function s({ className: s, compact: c = !1 }) {
|
|
23
|
+
let l = e(), u = n();
|
|
24
|
+
return /* @__PURE__ */ a("section", {
|
|
25
|
+
"aria-labelledby": u,
|
|
26
|
+
className: t("rounded-xl border border-border-seam bg-[var(--color-accent-soft)]", c ? "p-3" : "p-4", s),
|
|
27
|
+
children: [/* @__PURE__ */ a("h2", {
|
|
28
|
+
id: u,
|
|
29
|
+
className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
|
|
30
|
+
children: [/* @__PURE__ */ i(r, {
|
|
31
|
+
className: "h-4 w-4 text-accent",
|
|
32
|
+
"aria-hidden": "true"
|
|
33
|
+
}), l("norms.title", "Community norms")]
|
|
34
|
+
}), /* @__PURE__ */ i("ul", {
|
|
35
|
+
className: "mt-2 flex list-disc flex-col gap-1 pl-5 text-sm text-text-secondary",
|
|
36
|
+
children: o.map((e) => /* @__PURE__ */ i("li", { children: l(e.key, e.fallback) }, e.key))
|
|
37
|
+
})]
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
export { o as COMMUNITY_NORMS, s as CommunityNorms };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=CommunityNorms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommunityNorms.js","names":["COMMUNITY_NORMS","CommunityNorms","tr","useTr","titleId","useId","cn","compact","className","HeartHandshake","norm"],"sources":["../../../src/theculturepost/components/CommunityNorms.tsx"],"sourcesContent":["/**\n * CommunityNorms — the community norms, shown up front wherever people\n * start or join a conversation (discussions list, discussion detail, and the\n * open-discussion dialog).\n * @module theculturepost/components\n *\n * Product-wide norms from i18n keys (`norms.*`); workspace-editable norms are\n * a post-launch enhancement. Semantic tokens only.\n */\n\nimport { useId } from 'react';\nimport { HeartHandshake } from 'lucide-react';\nimport { useTr } from '../hooks';\nimport { cn } from '../utils/cn';\n\nexport interface CommunityNorm {\n key: string;\n fallback: string;\n}\n\n/** The norms, in display order. Exported so tests can pin the i18n keys. */\nexport const COMMUNITY_NORMS: readonly CommunityNorm[] = [\n {\n key: 'norms.respect',\n fallback: 'Treat every tradition, faith and community with respect.',\n },\n {\n key: 'norms.ownVoice',\n fallback: 'Speak from your own experience; do not speak for others.',\n },\n {\n key: 'norms.ideas',\n fallback: 'Challenge ideas, never people, and cite sources where you can.',\n },\n];\n\ninterface CommunityNormsProps {\n className?: string;\n /** Tighter spacing for dialogs and list headers. */\n compact?: boolean;\n}\n\nexport function CommunityNorms({ className, compact = false }: CommunityNormsProps) {\n const tr = useTr();\n const titleId = useId();\n return (\n <section\n aria-labelledby={titleId}\n className={cn(\n 'rounded-xl border border-border-seam bg-[var(--color-accent-soft)]',\n compact ? 'p-3' : 'p-4',\n className\n )}\n >\n <h2 id={titleId} className=\"flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <HeartHandshake className=\"h-4 w-4 text-accent\" aria-hidden=\"true\" />\n {tr('norms.title', 'Community norms')}\n </h2>\n <ul className=\"mt-2 flex list-disc flex-col gap-1 pl-5 text-sm text-text-secondary\">\n {COMMUNITY_NORMS.map((norm) => (\n <li key={norm.key}>{tr(norm.key, norm.fallback)}</li>\n ))}\n </ul>\n </section>\n );\n}\n"],"mappings":";;;;;;;AAqBA,IAAaA,IAA4C;CACvD;EACE,KAAK;EACL,UAAU;CACZ;CACA;EACE,KAAK;EACL,UAAU;CACZ;CACA;EACE,KAAK;EACL,UAAU;CACZ;AACF;AAQA,SAAgBC,EAAe,EAAE,cAAW,aAAU,MAA8B;CAClF,IAAMC,IAAKC,EAAM,GACXC,IAAUC,EAAM;CACtB,OACE,kBAAC,WAAD;EACE,mBAAiBD;EACjB,WAAWE,EACT,sEACAC,IAAU,QAAQ,OAClBC,CACF;EANF,UAAA,CAQE,kBAAC,MAAD;GAAI,IAAIJ;GAAS,WAAU;GAA3B,UAAA,CACE,kBAACK,GAAD;IAAgB,WAAU;IAAsB,eAAY;GAAQ,CAAA,GACnEP,EAAG,eAAe,iBAAiB,CAClC;EACJ,CAAA,GAAA,kBAAC,MAAD;GAAI,WAAU;GACX,UAAAF,EAAgB,KAAK,MACpB,kBAAC,MAAD,EAAA,UAAoBE,EAAGQ,EAAK,KAAKA,EAAK,QAAQ,EAAM,GAA3CA,EAAK,GAAsC,CACrD;EACC,CAAA,CACG;;AAEb"}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import { TcpArchiveItem } from '../types';
|
|
1
|
+
import { TcpArchiveItem, TcpArchiveItemKind, TcpAccessLevel } from '../types';
|
|
2
|
+
export declare const KINDS: TcpArchiveItemKind[];
|
|
3
|
+
export declare const ACCESS_LEVELS: TcpAccessLevel[];
|
|
4
|
+
export declare const ACCESS_HELP: Record<TcpAccessLevel, string>;
|
|
5
|
+
export declare const TITLE_MAX = 160;
|
|
6
|
+
export declare const DESCRIPTION_MAX = 600;
|
|
7
|
+
export declare const PROVENANCE_MAX = 600;
|
|
8
|
+
export declare const ORIGIN_MAX = 160;
|
|
9
|
+
export declare const dateToIso: (value: string) => string | null;
|
|
2
10
|
interface CreateArchiveItemDialogProps {
|
|
3
11
|
open: boolean;
|
|
4
12
|
onOpenChange: (open: boolean) => void;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { FILE_FOLDERS as e } from "../hooks/useFiles.js";
|
|
2
2
|
import { TagInput as t } from "./TagInput.js";
|
|
3
|
-
import { useTcpCollections as ee, useTcpCreateArchiveItem as
|
|
4
|
-
import { Counter as
|
|
3
|
+
import { useTcpCollections as ee, useTcpCreateArchiveItem as n } from "../hooks/useTcpApi.js";
|
|
4
|
+
import { Counter as r, MediaDropzone as te } from "./RecordOralHistoryDialog.js";
|
|
5
5
|
import "../hooks/index.js";
|
|
6
|
-
import { formatEnumLabel as
|
|
7
|
-
import { describeError as
|
|
8
|
-
import { useState as
|
|
9
|
-
import { jsx as
|
|
10
|
-
import { Button as
|
|
6
|
+
import { formatEnumLabel as i } from "../utils/formatters.js";
|
|
7
|
+
import { describeError as a, notify as o } from "../lib/toast.js";
|
|
8
|
+
import { useState as s } from "react";
|
|
9
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
10
|
+
import { Button as u, Input as d, Label as f, ResponsiveDialog as ne, ResponsiveDialogContent as p, ResponsiveDialogDescription as re, ResponsiveDialogFooter as ie, ResponsiveDialogHeader as ae, ResponsiveDialogTitle as m, Select as h, SelectContent as g, SelectItem as _, SelectTrigger as v, SelectValue as y, Textarea as b } from "@burdenoff/fe-libs/ui";
|
|
11
11
|
// src/theculturepost/components/CreateArchiveItemDialog.tsx
|
|
12
|
-
var
|
|
12
|
+
var x = [
|
|
13
13
|
"DOCUMENT",
|
|
14
14
|
"MANUSCRIPT",
|
|
15
15
|
"PHOTOGRAPH",
|
|
@@ -17,38 +17,38 @@ var se = [
|
|
|
17
17
|
"VIDEO",
|
|
18
18
|
"MAP",
|
|
19
19
|
"OBJECT"
|
|
20
|
-
],
|
|
20
|
+
], S = [
|
|
21
21
|
"PUBLIC",
|
|
22
22
|
"COMMUNITY",
|
|
23
23
|
"RESTRICTED",
|
|
24
24
|
"EMBARGOED"
|
|
25
|
-
],
|
|
25
|
+
], C = {
|
|
26
26
|
PUBLIC: "Visible to everyone.",
|
|
27
27
|
COMMUNITY: "Available to community members.",
|
|
28
28
|
RESTRICTED: "Visible to selected groups.",
|
|
29
29
|
EMBARGOED: "Hidden until a future date."
|
|
30
|
-
},
|
|
30
|
+
}, w = (e) => {
|
|
31
31
|
if (!e) return null;
|
|
32
32
|
let t = new Date(e);
|
|
33
33
|
return Number.isNaN(t.getTime()) ? null : t.toISOString();
|
|
34
34
|
};
|
|
35
|
-
function
|
|
36
|
-
let O =
|
|
37
|
-
j(""), N(""), F("DOCUMENT"), L("PUBLIC"), z(
|
|
35
|
+
function T({ open: T, onOpenChange: E, collectionId: D, onCreated: oe }) {
|
|
36
|
+
let O = n(), k = ee({ limit: 100 }), [A, j] = s(""), [M, N] = s(""), [P, F] = s("DOCUMENT"), [I, L] = s("PUBLIC"), [R, z] = s(D ?? ""), [B, V] = s(null), [H, U] = s(""), [W, G] = s(""), [K, q] = s([]), [J, Y] = s([]), [X, Z] = s(""), [Q, $] = s(null), se = () => {
|
|
37
|
+
j(""), N(""), F("DOCUMENT"), L("PUBLIC"), z(D ?? ""), V(null), U(""), G(""), q([]), Y([]), Z(""), $(null);
|
|
38
38
|
};
|
|
39
|
-
return /* @__PURE__ */
|
|
40
|
-
open:
|
|
41
|
-
onOpenChange:
|
|
42
|
-
children: /* @__PURE__ */
|
|
39
|
+
return /* @__PURE__ */ c(ne, {
|
|
40
|
+
open: T,
|
|
41
|
+
onOpenChange: E,
|
|
42
|
+
children: /* @__PURE__ */ l(p, {
|
|
43
43
|
className: "sm:max-w-2xl",
|
|
44
44
|
children: [
|
|
45
|
-
/* @__PURE__ */
|
|
46
|
-
/* @__PURE__ */
|
|
45
|
+
/* @__PURE__ */ l(ae, { children: [/* @__PURE__ */ c(m, { children: "Add an artifact" }), /* @__PURE__ */ c(re, { children: "Catalogue a manuscript, photograph, recording, map, object or document with its provenance." })] }),
|
|
46
|
+
/* @__PURE__ */ l("div", {
|
|
47
47
|
className: "flex max-h-[64vh] flex-col gap-4 overflow-y-auto py-2",
|
|
48
48
|
children: [
|
|
49
|
-
/* @__PURE__ */
|
|
49
|
+
/* @__PURE__ */ l("div", {
|
|
50
50
|
className: "grid gap-1.5",
|
|
51
|
-
children: [/* @__PURE__ */
|
|
51
|
+
children: [/* @__PURE__ */ c(f, { children: "File" }), /* @__PURE__ */ c(te, {
|
|
52
52
|
folder: e.artifacts,
|
|
53
53
|
accept: "image/*,audio/*,video/*,application/pdf",
|
|
54
54
|
promptLabel: "Drag and drop the artifact file here",
|
|
@@ -58,111 +58,111 @@ function w({ open: w, onOpenChange: T, collectionId: E, onCreated: D }) {
|
|
|
58
58
|
onClear: () => V(null)
|
|
59
59
|
})]
|
|
60
60
|
}),
|
|
61
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ l("div", {
|
|
62
62
|
className: "grid gap-1.5",
|
|
63
63
|
children: [
|
|
64
|
-
/* @__PURE__ */
|
|
64
|
+
/* @__PURE__ */ l(f, {
|
|
65
65
|
htmlFor: "item-title",
|
|
66
|
-
children: ["Title ", /* @__PURE__ */
|
|
66
|
+
children: ["Title ", /* @__PURE__ */ c("span", {
|
|
67
67
|
className: "text-status-error-text",
|
|
68
68
|
children: "*"
|
|
69
69
|
})]
|
|
70
70
|
}),
|
|
71
|
-
/* @__PURE__ */
|
|
71
|
+
/* @__PURE__ */ c(d, {
|
|
72
72
|
id: "item-title",
|
|
73
73
|
value: A,
|
|
74
|
-
maxLength:
|
|
74
|
+
maxLength: 160,
|
|
75
75
|
onChange: (e) => j(e.target.value),
|
|
76
76
|
placeholder: "e.g. Palm-leaf manuscript, 18th c."
|
|
77
77
|
}),
|
|
78
|
-
/* @__PURE__ */
|
|
78
|
+
/* @__PURE__ */ c(r, {
|
|
79
79
|
length: A.length,
|
|
80
|
-
max:
|
|
80
|
+
max: 160
|
|
81
81
|
})
|
|
82
82
|
]
|
|
83
83
|
}),
|
|
84
|
-
/* @__PURE__ */
|
|
84
|
+
/* @__PURE__ */ l("div", {
|
|
85
85
|
className: "grid gap-3 sm:grid-cols-2",
|
|
86
|
-
children: [/* @__PURE__ */
|
|
86
|
+
children: [/* @__PURE__ */ l("div", {
|
|
87
87
|
className: "grid gap-1.5",
|
|
88
|
-
children: [/* @__PURE__ */
|
|
88
|
+
children: [/* @__PURE__ */ c(f, { children: "Kind" }), /* @__PURE__ */ l(h, {
|
|
89
89
|
value: P,
|
|
90
90
|
onValueChange: (e) => F(e),
|
|
91
|
-
children: [/* @__PURE__ */
|
|
91
|
+
children: [/* @__PURE__ */ c(v, { children: /* @__PURE__ */ c(y, {}) }), /* @__PURE__ */ c(g, { children: x.map((e) => /* @__PURE__ */ c(_, {
|
|
92
92
|
value: e,
|
|
93
|
-
children:
|
|
93
|
+
children: i(e)
|
|
94
94
|
}, e)) })]
|
|
95
95
|
})]
|
|
96
|
-
}), /* @__PURE__ */
|
|
96
|
+
}), /* @__PURE__ */ l("div", {
|
|
97
97
|
className: "grid gap-1.5",
|
|
98
98
|
children: [
|
|
99
|
-
/* @__PURE__ */
|
|
100
|
-
/* @__PURE__ */
|
|
99
|
+
/* @__PURE__ */ c(f, { children: "Access level" }),
|
|
100
|
+
/* @__PURE__ */ l(h, {
|
|
101
101
|
value: I,
|
|
102
102
|
onValueChange: (e) => L(e),
|
|
103
|
-
children: [/* @__PURE__ */
|
|
103
|
+
children: [/* @__PURE__ */ c(v, { children: /* @__PURE__ */ c(y, {}) }), /* @__PURE__ */ c(g, { children: S.map((e) => /* @__PURE__ */ c(_, {
|
|
104
104
|
value: e,
|
|
105
|
-
children:
|
|
105
|
+
children: i(e)
|
|
106
106
|
}, e)) })]
|
|
107
107
|
}),
|
|
108
|
-
/* @__PURE__ */
|
|
108
|
+
/* @__PURE__ */ c("p", {
|
|
109
109
|
className: "text-xs text-text-tertiary",
|
|
110
|
-
children:
|
|
110
|
+
children: C[I]
|
|
111
111
|
})
|
|
112
112
|
]
|
|
113
113
|
})]
|
|
114
114
|
}),
|
|
115
|
-
!
|
|
115
|
+
!D && /* @__PURE__ */ l("div", {
|
|
116
116
|
className: "grid gap-1.5",
|
|
117
|
-
children: [/* @__PURE__ */
|
|
117
|
+
children: [/* @__PURE__ */ c(f, { children: "Collection" }), /* @__PURE__ */ l(h, {
|
|
118
118
|
value: R,
|
|
119
119
|
onValueChange: z,
|
|
120
|
-
children: [/* @__PURE__ */
|
|
120
|
+
children: [/* @__PURE__ */ c(v, { children: /* @__PURE__ */ c(y, { placeholder: "Add to a collection (optional)" }) }), /* @__PURE__ */ c(g, { children: (k.data ?? []).map((e) => /* @__PURE__ */ c(_, {
|
|
121
121
|
value: e.id,
|
|
122
122
|
children: e.name
|
|
123
123
|
}, e.id)) })]
|
|
124
124
|
})]
|
|
125
125
|
}),
|
|
126
|
-
/* @__PURE__ */
|
|
126
|
+
/* @__PURE__ */ l("div", {
|
|
127
127
|
className: "grid gap-1.5",
|
|
128
128
|
children: [
|
|
129
|
-
/* @__PURE__ */
|
|
129
|
+
/* @__PURE__ */ c(f, {
|
|
130
130
|
htmlFor: "item-desc",
|
|
131
131
|
children: "Description"
|
|
132
132
|
}),
|
|
133
|
-
/* @__PURE__ */
|
|
133
|
+
/* @__PURE__ */ c(b, {
|
|
134
134
|
id: "item-desc",
|
|
135
135
|
value: M,
|
|
136
|
-
maxLength:
|
|
136
|
+
maxLength: 600,
|
|
137
137
|
onChange: (e) => N(e.target.value),
|
|
138
138
|
rows: 2
|
|
139
139
|
}),
|
|
140
|
-
/* @__PURE__ */
|
|
140
|
+
/* @__PURE__ */ c(r, {
|
|
141
141
|
length: M.length,
|
|
142
|
-
max:
|
|
142
|
+
max: 600
|
|
143
143
|
})
|
|
144
144
|
]
|
|
145
145
|
}),
|
|
146
|
-
/* @__PURE__ */
|
|
146
|
+
/* @__PURE__ */ l("div", {
|
|
147
147
|
className: "grid gap-3 sm:grid-cols-2",
|
|
148
|
-
children: [/* @__PURE__ */
|
|
148
|
+
children: [/* @__PURE__ */ l("div", {
|
|
149
149
|
className: "grid gap-1.5",
|
|
150
|
-
children: [/* @__PURE__ */
|
|
150
|
+
children: [/* @__PURE__ */ c(f, {
|
|
151
151
|
htmlFor: "item-origin",
|
|
152
152
|
children: "Origin"
|
|
153
|
-
}), /* @__PURE__ */
|
|
153
|
+
}), /* @__PURE__ */ c(d, {
|
|
154
154
|
id: "item-origin",
|
|
155
155
|
value: W,
|
|
156
|
-
maxLength:
|
|
156
|
+
maxLength: 160,
|
|
157
157
|
onChange: (e) => G(e.target.value),
|
|
158
158
|
placeholder: "Place of origin"
|
|
159
159
|
})]
|
|
160
|
-
}), /* @__PURE__ */
|
|
160
|
+
}), /* @__PURE__ */ l("div", {
|
|
161
161
|
className: "grid gap-1.5",
|
|
162
|
-
children: [/* @__PURE__ */
|
|
162
|
+
children: [/* @__PURE__ */ c(f, {
|
|
163
163
|
htmlFor: "item-dated",
|
|
164
164
|
children: "Dated"
|
|
165
|
-
}), /* @__PURE__ */
|
|
165
|
+
}), /* @__PURE__ */ c(d, {
|
|
166
166
|
id: "item-dated",
|
|
167
167
|
type: "date",
|
|
168
168
|
value: X,
|
|
@@ -170,33 +170,33 @@ function w({ open: w, onOpenChange: T, collectionId: E, onCreated: D }) {
|
|
|
170
170
|
})]
|
|
171
171
|
})]
|
|
172
172
|
}),
|
|
173
|
-
/* @__PURE__ */
|
|
173
|
+
/* @__PURE__ */ l("div", {
|
|
174
174
|
className: "grid gap-1.5",
|
|
175
175
|
children: [
|
|
176
|
-
/* @__PURE__ */
|
|
176
|
+
/* @__PURE__ */ c(f, {
|
|
177
177
|
htmlFor: "item-provenance",
|
|
178
178
|
children: "Provenance"
|
|
179
179
|
}),
|
|
180
|
-
/* @__PURE__ */
|
|
180
|
+
/* @__PURE__ */ c(b, {
|
|
181
181
|
id: "item-provenance",
|
|
182
182
|
value: H,
|
|
183
|
-
maxLength:
|
|
183
|
+
maxLength: 600,
|
|
184
184
|
onChange: (e) => U(e.target.value),
|
|
185
185
|
placeholder: "Chain of custody / source history",
|
|
186
186
|
rows: 2
|
|
187
187
|
}),
|
|
188
|
-
/* @__PURE__ */
|
|
188
|
+
/* @__PURE__ */ c(r, {
|
|
189
189
|
length: H.length,
|
|
190
|
-
max:
|
|
190
|
+
max: 600
|
|
191
191
|
})
|
|
192
192
|
]
|
|
193
193
|
}),
|
|
194
|
-
/* @__PURE__ */
|
|
194
|
+
/* @__PURE__ */ l("div", {
|
|
195
195
|
className: "grid gap-1.5",
|
|
196
|
-
children: [/* @__PURE__ */
|
|
196
|
+
children: [/* @__PURE__ */ c(f, {
|
|
197
197
|
htmlFor: "item-langs",
|
|
198
198
|
children: "Languages"
|
|
199
|
-
}), /* @__PURE__ */
|
|
199
|
+
}), /* @__PURE__ */ c(t, {
|
|
200
200
|
id: "item-langs",
|
|
201
201
|
value: K,
|
|
202
202
|
onChange: q,
|
|
@@ -204,29 +204,29 @@ function w({ open: w, onOpenChange: T, collectionId: E, onCreated: D }) {
|
|
|
204
204
|
preserveCase: !0
|
|
205
205
|
})]
|
|
206
206
|
}),
|
|
207
|
-
/* @__PURE__ */
|
|
207
|
+
/* @__PURE__ */ l("div", {
|
|
208
208
|
className: "grid gap-1.5",
|
|
209
|
-
children: [/* @__PURE__ */
|
|
209
|
+
children: [/* @__PURE__ */ c(f, {
|
|
210
210
|
htmlFor: "item-tags",
|
|
211
211
|
children: "Tags"
|
|
212
|
-
}), /* @__PURE__ */
|
|
212
|
+
}), /* @__PURE__ */ c(t, {
|
|
213
213
|
id: "item-tags",
|
|
214
214
|
value: J,
|
|
215
215
|
onChange: Y,
|
|
216
216
|
placeholder: "Add tags…"
|
|
217
217
|
})]
|
|
218
218
|
}),
|
|
219
|
-
Q && /* @__PURE__ */
|
|
219
|
+
Q && /* @__PURE__ */ c("p", {
|
|
220
220
|
className: "text-sm text-status-error-text",
|
|
221
221
|
children: Q
|
|
222
222
|
})
|
|
223
223
|
]
|
|
224
224
|
}),
|
|
225
|
-
/* @__PURE__ */
|
|
225
|
+
/* @__PURE__ */ l(ie, { children: [/* @__PURE__ */ c(u, {
|
|
226
226
|
variant: "outline",
|
|
227
|
-
onClick: () =>
|
|
227
|
+
onClick: () => E(!1),
|
|
228
228
|
children: "Cancel"
|
|
229
|
-
}), /* @__PURE__ */
|
|
229
|
+
}), /* @__PURE__ */ c(u, {
|
|
230
230
|
onClick: async () => {
|
|
231
231
|
if (!A.trim()) $("A title is required.");
|
|
232
232
|
else try {
|
|
@@ -241,11 +241,11 @@ function w({ open: w, onOpenChange: T, collectionId: E, onCreated: D }) {
|
|
|
241
241
|
origin: W.trim() || null,
|
|
242
242
|
languages: K.length ? K : null,
|
|
243
243
|
tags: J.length ? J : null,
|
|
244
|
-
datedAt:
|
|
244
|
+
datedAt: w(X)
|
|
245
245
|
});
|
|
246
|
-
|
|
246
|
+
o.success("Artifact added", e.title), E(!1), se(), oe?.(e);
|
|
247
247
|
} catch (e) {
|
|
248
|
-
$(
|
|
248
|
+
$(a(e));
|
|
249
249
|
}
|
|
250
250
|
},
|
|
251
251
|
disabled: O.isPending,
|
|
@@ -255,6 +255,6 @@ function w({ open: w, onOpenChange: T, collectionId: E, onCreated: D }) {
|
|
|
255
255
|
})
|
|
256
256
|
});
|
|
257
257
|
}
|
|
258
|
-
export {
|
|
258
|
+
export { C as ACCESS_HELP, S as ACCESS_LEVELS, T as CreateArchiveItemDialog, x as KINDS, w as dateToIso };
|
|
259
259
|
|
|
260
260
|
//# sourceMappingURL=CreateArchiveItemDialog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateArchiveItemDialog.js","names":["KINDS","ACCESS_LEVELS","ACCESS_HELP","TITLE_MAX","DESCRIPTION_MAX","PROVENANCE_MAX","ORIGIN_MAX","dateToIso","value","d","CreateArchiveItemDialog","createItem","useTcpCreateArchiveItem","collectionsQuery","useTcpCollections","title","setTitle","useState","description","setDescription","kind","setKind","accessLevel","setAccessLevel","pickedCollection","setPickedCollection","collectionId","file","setFile","provenance","setProvenance","origin","setOrigin","languages","setLanguages","tags","setTags","datedAt","setDatedAt","error","setError","reset","ResponsiveDialog","ResponsiveDialogContent","ResponsiveDialogHeader","ResponsiveDialogTitle","ResponsiveDialogDescription","Label","MediaDropzone","FILE_FOLDERS","ref","Input","Counter","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","k","formatEnumLabel","a","collection","Textarea","TagInput","ResponsiveDialogFooter","Button","onOpenChange","created","notify","onCreated","err","describeError"],"sources":["../../../src/theculturepost/components/CreateArchiveItemDialog.tsx"],"sourcesContent":["/**\n * CreateArchiveItemDialog — add an artifact to the archive.\n * @module theculturepost/components\n *\n * Writes `tcpCreateArchiveItem`. The binary is uploaded to wspace-files-svc via\n * the shared {@link MediaDropzone} (drag-drop) and only its id is stored here.\n * The schema exposes a SINGLE `file` per item — never a gallery. Kind + access\n * level are chosen up front.\n */\n\nimport { useState } from 'react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { TagInput } from './TagInput';\nimport { MediaDropzone, Counter, type UploadedRef } from './RecordOralHistoryDialog';\nimport { useTcpCreateArchiveItem, useTcpCollections, FILE_FOLDERS } from '../hooks';\nimport { formatEnumLabel } from '../utils/formatters';\nimport { notify, describeError } from '../lib/toast';\nimport type { TcpArchiveItem, TcpArchiveItemKind, TcpAccessLevel } from '../types';\n\nconst KINDS: TcpArchiveItemKind[] = [\n 'DOCUMENT',\n 'MANUSCRIPT',\n 'PHOTOGRAPH',\n 'AUDIO',\n 'VIDEO',\n 'MAP',\n 'OBJECT',\n];\n\nconst ACCESS_LEVELS: TcpAccessLevel[] = ['PUBLIC', 'COMMUNITY', 'RESTRICTED', 'EMBARGOED'];\n\nconst ACCESS_HELP: Record<TcpAccessLevel, string> = {\n PUBLIC: 'Visible to everyone.',\n COMMUNITY: 'Available to community members.',\n RESTRICTED: 'Visible to selected groups.',\n EMBARGOED: 'Hidden until a future date.',\n};\n\nconst TITLE_MAX = 160;\nconst DESCRIPTION_MAX = 600;\nconst PROVENANCE_MAX = 600;\nconst ORIGIN_MAX = 160;\n\nconst dateToIso = (value: string): string | null => {\n if (!value) return null;\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d.toISOString();\n};\n\ninterface CreateArchiveItemDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Pre-select a collection (e.g. from a collection detail page). */\n collectionId?: string;\n onCreated?: (item: TcpArchiveItem) => void;\n}\n\nexport function CreateArchiveItemDialog({\n open,\n onOpenChange,\n collectionId,\n onCreated,\n}: CreateArchiveItemDialogProps) {\n const createItem = useTcpCreateArchiveItem();\n const collectionsQuery = useTcpCollections({ limit: 100 });\n\n const [title, setTitle] = useState('');\n const [description, setDescription] = useState('');\n const [kind, setKind] = useState<TcpArchiveItemKind>('DOCUMENT');\n const [accessLevel, setAccessLevel] = useState<TcpAccessLevel>('PUBLIC');\n const [pickedCollection, setPickedCollection] = useState(collectionId ?? '');\n const [file, setFile] = useState<UploadedRef | null>(null);\n const [provenance, setProvenance] = useState('');\n const [origin, setOrigin] = useState('');\n const [languages, setLanguages] = useState<string[]>([]);\n const [tags, setTags] = useState<string[]>([]);\n const [datedAt, setDatedAt] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const reset = () => {\n setTitle('');\n setDescription('');\n setKind('DOCUMENT');\n setAccessLevel('PUBLIC');\n setPickedCollection(collectionId ?? '');\n setFile(null);\n setProvenance('');\n setOrigin('');\n setLanguages([]);\n setTags([]);\n setDatedAt('');\n setError(null);\n };\n\n const submit = async () => {\n if (!title.trim()) {\n setError('A title is required.');\n return;\n }\n try {\n const created = await createItem.mutateAsync({\n title: title.trim(),\n description: description.trim() || null,\n kind,\n accessLevel,\n collectionId: pickedCollection || null,\n fileId: file?.id ?? null,\n provenance: provenance.trim() || null,\n origin: origin.trim() || null,\n languages: languages.length ? languages : null,\n tags: tags.length ? tags : null,\n datedAt: dateToIso(datedAt),\n });\n notify.success('Artifact added', created.title);\n onOpenChange(false);\n reset();\n onCreated?.(created);\n } catch (err) {\n setError(describeError(err));\n }\n };\n\n return (\n <ResponsiveDialog open={open} onOpenChange={onOpenChange}>\n <ResponsiveDialogContent className=\"sm:max-w-2xl\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Add an artifact</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Catalogue a manuscript, photograph, recording, map, object or document with its\n provenance.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"flex max-h-[64vh] flex-col gap-4 overflow-y-auto py-2\">\n <div className=\"grid gap-1.5\">\n <Label>File</Label>\n <MediaDropzone\n folder={FILE_FOLDERS.artifacts}\n accept=\"image/*,audio/*,video/*,application/pdf\"\n promptLabel=\"Drag and drop the artifact file here\"\n hint=\"Image, audio, video or PDF, up to 25 MB. One file per artifact.\"\n value={file}\n onUploaded={(ref) => setFile(ref)}\n onClear={() => setFile(null)}\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"item-title\">\n Title <span className=\"text-status-error-text\">*</span>\n </Label>\n <Input\n id=\"item-title\"\n value={title}\n maxLength={TITLE_MAX}\n onChange={(e) => setTitle(e.target.value)}\n placeholder=\"e.g. Palm-leaf manuscript, 18th c.\"\n />\n <Counter length={title.length} max={TITLE_MAX} />\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label>Kind</Label>\n <Select value={kind} onValueChange={(v) => setKind(v as TcpArchiveItemKind)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {KINDS.map((k) => (\n <SelectItem key={k} value={k}>\n {formatEnumLabel(k)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label>Access level</Label>\n <Select\n value={accessLevel}\n onValueChange={(v) => setAccessLevel(v as TcpAccessLevel)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ACCESS_LEVELS.map((a) => (\n <SelectItem key={a} value={a}>\n {formatEnumLabel(a)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-xs text-text-tertiary\">{ACCESS_HELP[accessLevel]}</p>\n </div>\n </div>\n\n {!collectionId && (\n <div className=\"grid gap-1.5\">\n <Label>Collection</Label>\n <Select value={pickedCollection} onValueChange={setPickedCollection}>\n <SelectTrigger>\n <SelectValue placeholder=\"Add to a collection (optional)\" />\n </SelectTrigger>\n <SelectContent>\n {(collectionsQuery.data ?? []).map((collection) => (\n <SelectItem key={collection.id} value={collection.id}>\n {collection.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"item-desc\">Description</Label>\n <Textarea\n id=\"item-desc\"\n value={description}\n maxLength={DESCRIPTION_MAX}\n onChange={(e) => setDescription(e.target.value)}\n rows={2}\n />\n <Counter length={description.length} max={DESCRIPTION_MAX} />\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"item-origin\">Origin</Label>\n <Input\n id=\"item-origin\"\n value={origin}\n maxLength={ORIGIN_MAX}\n onChange={(e) => setOrigin(e.target.value)}\n placeholder=\"Place of origin\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"item-dated\">Dated</Label>\n <Input\n id=\"item-dated\"\n type=\"date\"\n value={datedAt}\n onChange={(e) => setDatedAt(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"item-provenance\">Provenance</Label>\n <Textarea\n id=\"item-provenance\"\n value={provenance}\n maxLength={PROVENANCE_MAX}\n onChange={(e) => setProvenance(e.target.value)}\n placeholder=\"Chain of custody / source history\"\n rows={2}\n />\n <Counter length={provenance.length} max={PROVENANCE_MAX} />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"item-langs\">Languages</Label>\n <TagInput\n id=\"item-langs\"\n value={languages}\n onChange={setLanguages}\n placeholder=\"e.g. Tamil, Sanskrit…\"\n preserveCase\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"item-tags\">Tags</Label>\n <TagInput id=\"item-tags\" value={tags} onChange={setTags} placeholder=\"Add tags…\" />\n </div>\n\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button onClick={submit} disabled={createItem.isPending}>\n Add artifact\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CreateArchiveItemDialog.js","names":["KINDS","ACCESS_LEVELS","ACCESS_HELP","dateToIso","value","d","CreateArchiveItemDialog","createItem","useTcpCreateArchiveItem","collectionsQuery","useTcpCollections","title","setTitle","useState","description","setDescription","kind","setKind","accessLevel","setAccessLevel","pickedCollection","setPickedCollection","collectionId","file","setFile","provenance","setProvenance","origin","setOrigin","languages","setLanguages","tags","setTags","datedAt","setDatedAt","error","setError","reset","ResponsiveDialog","ResponsiveDialogContent","ResponsiveDialogHeader","ResponsiveDialogTitle","ResponsiveDialogDescription","Label","MediaDropzone","FILE_FOLDERS","ref","Input","Counter","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","k","formatEnumLabel","a","collection","Textarea","TagInput","ResponsiveDialogFooter","Button","onOpenChange","created","notify","onCreated","err","describeError"],"sources":["../../../src/theculturepost/components/CreateArchiveItemDialog.tsx"],"sourcesContent":["/**\n * CreateArchiveItemDialog — add an artifact to the archive.\n * @module theculturepost/components\n *\n * Writes `tcpCreateArchiveItem`. The binary is uploaded to wspace-files-svc via\n * the shared {@link MediaDropzone} (drag-drop) and only its id is stored here.\n * The schema exposes a SINGLE `file` per item — never a gallery. Kind + access\n * level are chosen up front.\n */\n\nimport { useState } from 'react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { TagInput } from './TagInput';\nimport { MediaDropzone, Counter, type UploadedRef } from './RecordOralHistoryDialog';\nimport { useTcpCreateArchiveItem, useTcpCollections, FILE_FOLDERS } from '../hooks';\nimport { formatEnumLabel } from '../utils/formatters';\nimport { notify, describeError } from '../lib/toast';\nimport type { TcpArchiveItem, TcpArchiveItemKind, TcpAccessLevel } from '../types';\n\nexport const KINDS: TcpArchiveItemKind[] = [\n 'DOCUMENT',\n 'MANUSCRIPT',\n 'PHOTOGRAPH',\n 'AUDIO',\n 'VIDEO',\n 'MAP',\n 'OBJECT',\n];\n\nexport const ACCESS_LEVELS: TcpAccessLevel[] = ['PUBLIC', 'COMMUNITY', 'RESTRICTED', 'EMBARGOED'];\n\nexport const ACCESS_HELP: Record<TcpAccessLevel, string> = {\n PUBLIC: 'Visible to everyone.',\n COMMUNITY: 'Available to community members.',\n RESTRICTED: 'Visible to selected groups.',\n EMBARGOED: 'Hidden until a future date.',\n};\n\nexport const TITLE_MAX = 160;\nexport const DESCRIPTION_MAX = 600;\nexport const PROVENANCE_MAX = 600;\nexport const ORIGIN_MAX = 160;\n\nexport const dateToIso = (value: string): string | null => {\n if (!value) return null;\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d.toISOString();\n};\n\ninterface CreateArchiveItemDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Pre-select a collection (e.g. from a collection detail page). */\n collectionId?: string;\n onCreated?: (item: TcpArchiveItem) => void;\n}\n\nexport function CreateArchiveItemDialog({\n open,\n onOpenChange,\n collectionId,\n onCreated,\n}: CreateArchiveItemDialogProps) {\n const createItem = useTcpCreateArchiveItem();\n const collectionsQuery = useTcpCollections({ limit: 100 });\n\n const [title, setTitle] = useState('');\n const [description, setDescription] = useState('');\n const [kind, setKind] = useState<TcpArchiveItemKind>('DOCUMENT');\n const [accessLevel, setAccessLevel] = useState<TcpAccessLevel>('PUBLIC');\n const [pickedCollection, setPickedCollection] = useState(collectionId ?? '');\n const [file, setFile] = useState<UploadedRef | null>(null);\n const [provenance, setProvenance] = useState('');\n const [origin, setOrigin] = useState('');\n const [languages, setLanguages] = useState<string[]>([]);\n const [tags, setTags] = useState<string[]>([]);\n const [datedAt, setDatedAt] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const reset = () => {\n setTitle('');\n setDescription('');\n setKind('DOCUMENT');\n setAccessLevel('PUBLIC');\n setPickedCollection(collectionId ?? '');\n setFile(null);\n setProvenance('');\n setOrigin('');\n setLanguages([]);\n setTags([]);\n setDatedAt('');\n setError(null);\n };\n\n const submit = async () => {\n if (!title.trim()) {\n setError('A title is required.');\n return;\n }\n try {\n const created = await createItem.mutateAsync({\n title: title.trim(),\n description: description.trim() || null,\n kind,\n accessLevel,\n collectionId: pickedCollection || null,\n fileId: file?.id ?? null,\n provenance: provenance.trim() || null,\n origin: origin.trim() || null,\n languages: languages.length ? languages : null,\n tags: tags.length ? tags : null,\n datedAt: dateToIso(datedAt),\n });\n notify.success('Artifact added', created.title);\n onOpenChange(false);\n reset();\n onCreated?.(created);\n } catch (err) {\n setError(describeError(err));\n }\n };\n\n return (\n <ResponsiveDialog open={open} onOpenChange={onOpenChange}>\n <ResponsiveDialogContent className=\"sm:max-w-2xl\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Add an artifact</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Catalogue a manuscript, photograph, recording, map, object or document with its\n provenance.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"flex max-h-[64vh] flex-col gap-4 overflow-y-auto py-2\">\n <div className=\"grid gap-1.5\">\n <Label>File</Label>\n <MediaDropzone\n folder={FILE_FOLDERS.artifacts}\n accept=\"image/*,audio/*,video/*,application/pdf\"\n promptLabel=\"Drag and drop the artifact file here\"\n hint=\"Image, audio, video or PDF, up to 25 MB. One file per artifact.\"\n value={file}\n onUploaded={(ref) => setFile(ref)}\n onClear={() => setFile(null)}\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"item-title\">\n Title <span className=\"text-status-error-text\">*</span>\n </Label>\n <Input\n id=\"item-title\"\n value={title}\n maxLength={TITLE_MAX}\n onChange={(e) => setTitle(e.target.value)}\n placeholder=\"e.g. Palm-leaf manuscript, 18th c.\"\n />\n <Counter length={title.length} max={TITLE_MAX} />\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label>Kind</Label>\n <Select value={kind} onValueChange={(v) => setKind(v as TcpArchiveItemKind)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {KINDS.map((k) => (\n <SelectItem key={k} value={k}>\n {formatEnumLabel(k)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label>Access level</Label>\n <Select\n value={accessLevel}\n onValueChange={(v) => setAccessLevel(v as TcpAccessLevel)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ACCESS_LEVELS.map((a) => (\n <SelectItem key={a} value={a}>\n {formatEnumLabel(a)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-xs text-text-tertiary\">{ACCESS_HELP[accessLevel]}</p>\n </div>\n </div>\n\n {!collectionId && (\n <div className=\"grid gap-1.5\">\n <Label>Collection</Label>\n <Select value={pickedCollection} onValueChange={setPickedCollection}>\n <SelectTrigger>\n <SelectValue placeholder=\"Add to a collection (optional)\" />\n </SelectTrigger>\n <SelectContent>\n {(collectionsQuery.data ?? []).map((collection) => (\n <SelectItem key={collection.id} value={collection.id}>\n {collection.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"item-desc\">Description</Label>\n <Textarea\n id=\"item-desc\"\n value={description}\n maxLength={DESCRIPTION_MAX}\n onChange={(e) => setDescription(e.target.value)}\n rows={2}\n />\n <Counter length={description.length} max={DESCRIPTION_MAX} />\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"item-origin\">Origin</Label>\n <Input\n id=\"item-origin\"\n value={origin}\n maxLength={ORIGIN_MAX}\n onChange={(e) => setOrigin(e.target.value)}\n placeholder=\"Place of origin\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"item-dated\">Dated</Label>\n <Input\n id=\"item-dated\"\n type=\"date\"\n value={datedAt}\n onChange={(e) => setDatedAt(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"item-provenance\">Provenance</Label>\n <Textarea\n id=\"item-provenance\"\n value={provenance}\n maxLength={PROVENANCE_MAX}\n onChange={(e) => setProvenance(e.target.value)}\n placeholder=\"Chain of custody / source history\"\n rows={2}\n />\n <Counter length={provenance.length} max={PROVENANCE_MAX} />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"item-langs\">Languages</Label>\n <TagInput\n id=\"item-langs\"\n value={languages}\n onChange={setLanguages}\n placeholder=\"e.g. Tamil, Sanskrit…\"\n preserveCase\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"item-tags\">Tags</Label>\n <TagInput id=\"item-tags\" value={tags} onChange={setTags} placeholder=\"Add tags…\" />\n </div>\n\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button onClick={submit} disabled={createItem.isPending}>\n Add artifact\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TcpArchiveItem } from '../types';
|
|
2
|
+
interface EditArchiveItemDialogProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
onOpenChange: (open: boolean) => void;
|
|
5
|
+
item: TcpArchiveItem;
|
|
6
|
+
}
|
|
7
|
+
export declare function EditArchiveItemDialog({ open, onOpenChange, item }: EditArchiveItemDialogProps): import('react').JSX.Element;
|
|
8
|
+
export {};
|