@openrails/contentkit-ui 0.104.0-rc.3 → 0.105.0
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/client/generated/wire.d.ts +2 -0
- package/dist/client/generated/wire.js.map +1 -1
- package/dist/components/admin/content-manager.js +344 -344
- package/dist/components/admin/content-manager.js.map +1 -1
- package/dist/components/admin/reader-content-editor.js +179 -175
- package/dist/components/admin/reader-content-editor.js.map +1 -1
- package/dist/components/content/editors.d.ts +4 -0
- package/dist/components/content/editors.js +101 -89
- package/dist/components/content/editors.js.map +1 -1
- package/dist/locales/content/de.js +1 -0
- package/dist/locales/content/de.js.map +1 -1
- package/dist/locales/content/en.d.ts +1 -0
- package/dist/locales/content/en.js +1 -0
- package/dist/locales/content/en.js.map +1 -1
- package/dist/locales/content/es.js +1 -0
- package/dist/locales/content/es.js.map +1 -1
- package/dist/locales/content/ja.js +1 -0
- package/dist/locales/content/ja.js.map +1 -1
- package/dist/locales/content/ko.js +1 -0
- package/dist/locales/content/ko.js.map +1 -1
- package/dist/locales/content/zh.js +1 -0
- package/dist/locales/content/zh.js.map +1 -1
- package/dist/locales/en.d.ts +1 -0
- package/dist/react/versions.d.ts +3 -1
- package/dist/react/versions.js +62 -60
- package/dist/react/versions.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-manager.js","names":[],"sources":["../../../src/components/admin/content-manager.tsx"],"sourcesContent":["import { Image01Icon } from \"@hugeicons/core-free-icons\";\nimport { HugeiconsIcon } from \"@hugeicons/react\";\nimport { useEffect, useId, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport type { ContentKitClient } from \"../../client/client.js\";\nimport { toContentKitError, type ContentKitError } from \"../../client/errors.js\";\nimport { imageRefs } from \"../../client/contents.js\";\nimport type { Content, GroupCard, GroupDetail, ManageCount, Rule } from \"../../client/generated/wire.js\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport type { Translator } from \"../../i18n/messages.js\";\nimport { useAdminLocation, useFlowClient, useStaffAccess, type AdminLocation, type FlowClientOptions, type StaffAccess } from \"../../react/admin.js\";\nimport { useContentKitClient, useErrorReporter, type ContentKitErrorHandler } from \"../../react/context.js\";\nimport { useContent } from \"../../react/contents.js\";\nimport { useKinds } from \"../../react/groups.js\";\nimport { keyOf, useContentScope, usePaged, useResource } from \"../../react/use-resource.js\";\nimport { Alert, AlertDescription } from \"#ckui/ui/alert\";\nimport { Badge } from \"#ckui/ui/badge\";\nimport { Button, buttonVariants } from \"#ckui/ui/button\";\nimport { Input } from \"#ckui/ui/input\";\nimport { Label } from \"#ckui/ui/label\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"#ckui/ui/select\";\nimport { Skeleton } from \"#ckui/ui/skeleton\";\nimport { Textarea } from \"#ckui/ui/textarea\";\nimport { localInput } from \"../social/bans.js\";\nimport { contentError, ErrorLine, formatDate, RelativeTime, useAction } from \"../social/parts.js\";\nimport { ReaderContentEditor } from \"./reader-content-editor.js\";\nimport { createDraft, uploadTarget } from \"./bulk-drafts.js\";\nimport { UploadQueueBody } from \"./upload-queue.js\";\nimport { ContentSections } from \"../content/editors.js\";\nimport { labelOf, type Labels } from \"../groups/parts.js\";\nimport { AdminRoot, LoadFailed, NoAccess, Pager, Rows, pageOf, useConfirm, type AdminFlowProps, type AdminRouteProps } from \"./shell.js\";\n\ntype Choice = string | { value: string; label: string };\n\n/** What ContentManager hands its body editor. */\nexport interface BodyEditorProps {\n /** The body as HTML, its images at URLs that show them now. */\n value: string;\n onChange: (html: string) => void;\n /** Uploads an image to the item and resolves with a URL that shows it; absent until the item exists. */\n uploadImage?: (file: File) => Promise<string>;\n disabled?: boolean;\n placeholder?: string;\n \"aria-label\"?: string;\n}\n\nexport interface ContentManagerProps extends AdminFlowProps, AdminRouteProps {\n /** The content kind managed. */\n kind: string;\n /** Languages to write in: codes, or codes with labels; the first is a new item's. */\n languages?: readonly Choice[];\n /**\n * The body editor: `richTextEditor` from `@openrails/contentkit-ui/editor`,\n * or the host's own. Without it, the body is a plain HTML field.\n */\n renderEditor?: (props: BodyEditorProps) => ReactNode;\n /** A link to a live item's page. */\n contentHref?: (content: Content) => string | undefined;\n /** Display names of kinds, traits, tiers, attributes and values by identifier. */\n labels?: Labels;\n /** The list's default page size: 20, 50 or 100. */\n pageSize?: number;\n /** Row checkboxes with bulk access, delete and restore (default true). */\n selectable?: boolean;\n}\n\n/** Whether the caller manages content: root:content:write holders, creators and owner-group editors. */\nexport function useContentManagerAccess(o: FlowClientOptions = {}): StaffAccess<\"contents\"> {\n return useStaffAccess([\"contents\"] as const, o);\n}\n\nexport type ContentStatus = \"draft\" | \"scheduled\" | \"published\" | \"held\" | \"rejected\";\n\n/** An item's status as the manager names it. */\nexport function contentStatus(c: Content): ContentStatus {\n if (c.moderation === \"rejected\") return \"rejected\";\n if (c.moderation === \"held\") return \"held\";\n if (c.state === \"draft\") return \"draft\";\n if (!c.live) return \"scheduled\";\n return \"published\";\n}\n\nconst choices = (list?: readonly Choice[]) => (list ?? []).map((c) => (typeof c === \"string\" ? { value: c, label: c } : c));\nconst badge: Record<ContentStatus, \"default\" | \"secondary\" | \"outline\" | \"destructive\"> = { published: \"default\", scheduled: \"secondary\", draft: \"outline\", held: \"secondary\", rejected: \"destructive\" };\nconst states = [\"draft\", \"scheduled\", \"published\"] as const;\n\n/**\n * Content items of one kind for their creators and staff: every one the\n * caller manages, by state and text, deleted ones on their own to restore;\n * create and edit title, description, schedule, cover and body with\n * inline images per language, publish or keep a draft, and delete; then its\n * listing and attributes, access rule and price, versions (order, languages,\n * traits, schedule, access override, price, segments, media) and groups. The\n * list is at basePath, a new item at basePath/new and each item at\n * basePath/{id}, filters in the query.\n */\nexport function ContentManager({ client: own, baseUrl, auth, guard, appearance, className, language, messages, ...p }: ContentManagerProps) {\n const client = useFlowClient({ client: own, baseUrl, auth });\n return (\n <AdminRoot flow=\"content-manager\" appearance={appearance} className={className} language={language} messages={messages} guard={guard}>\n <Contents {...p} client={client} />\n </AdminRoot>\n );\n}\n\ntype Inner = Omit<ContentManagerProps, \"client\" | \"baseUrl\" | \"auth\" | \"guard\" | \"appearance\" | \"className\" | \"language\" | \"messages\"> & { client: ContentKitClient };\n\nfunction Contents({ basePath, navigation, ...p }: Inner) {\n const { t } = useMessages();\n const loc = useAdminLocation(basePath, navigation);\n const access = useContentManagerAccess({ client: p.client });\n // Editor URLs name items by content code; the editor itself works on ids.\n const known = useRef(new Map<string, string>()).current;\n const open = (c: Content, replace = false) => {\n known.set(c.code, c.id);\n loc.go(c.code, undefined, replace ? { replace: true } : undefined);\n };\n const target = useCodeTarget(p.client, p.kind, loc.view && loc.view !== \"new\" ? loc.view : null, known);\n const entities = useStartingEntities(p.client, loc.view === \"new\" ? (loc.query.get(\"with\") ?? \"\") : \"\");\n if (access.loading) return <Rows />;\n if (!access.allowed.contents) return <NoAccess>{t(\"contentManager.noAccess\")}</NoAccess>;\n if (!loc.view) return <List {...p} loc={loc} open={open} />;\n if (loc.view !== \"new\" && !target.id) {\n if (target.error) return <LoadFailed error={target.error} message={t(\"contentManager.loadFailed\")} retry={target.retry} />;\n return target.missing ? <NoAccess>{t(\"contentManager.notFound\")}</NoAccess> : <Rows />;\n }\n return (\n <>\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-self-start\" onClick={() => loc.go(\"\")}>\n {t(\"contentManager.back\")}\n </Button>\n <ContentEditor\n management\n {...p}\n id={loc.view === \"new\" ? null : target.id}\n entities={entities}\n onCreated={(c) => open(c, true)}\n onDeleted={() => loc.go(\"\", undefined, { replace: true })}\n />\n </>\n );\n}\n\n/** Resolves an editor URL's content code to its id within the caller's manage rights; known codes resolve at once. */\nfunction useCodeTarget(client: ContentKitClient, kind: string, code: string | null, known: Map<string, string>) {\n const [found, setFound] = useState<{ code: string; id: string | null; error?: ContentKitError } | null>(null);\n const [attempt, setAttempt] = useState(0);\n const cached = code ? known.get(code) : undefined;\n useEffect(() => {\n if (!code || cached) return;\n const ctl = new AbortController();\n client.contents.manage({ kind, code, limit: 1 }, ctl.signal).then(\n (items) => {\n const id = items[0]?.id ?? null;\n if (id) known.set(code, id);\n setFound({ code, id });\n },\n (e) => {\n if (!ctl.signal.aborted) setFound({ code, id: null, error: toContentKitError(e) });\n },\n );\n return () => ctl.abort();\n }, [client, kind, code, cached, known, attempt]);\n const retry = () => setAttempt((n) => n + 1);\n if (!code) return { id: null, retry };\n if (cached) return { id: cached, retry };\n if (found?.code !== code) return { id: null, retry };\n return { id: found.id, error: found.error, missing: !found.id && !found.error, retry };\n}\n\nconst asCard = (g: GroupDetail): GroupCard => ({ ...g, count: 0 });\n\n/** A new item's starting entities from `?with=CODE[,CODE]`, each with its scope (a character's series); unresolvable codes are skipped. */\nfunction useStartingEntities(client: ContentKitClient, codes: string): readonly GroupCard[] | undefined {\n const [found, setFound] = useState<{ codes: string; entities: GroupCard[] } | null>(null);\n useEffect(() => {\n if (!codes) return;\n const ctl = new AbortController();\n const one = async (code: string) => {\n const r = await client.codes.resolve(code, { signal: ctl.signal });\n const g = await client.entities.getForManagement(r.content_id, undefined, ctl.signal);\n return g.scope ? [asCard(g), g.scope] : [asCard(g)];\n };\n void Promise.all(codes.split(\",\").filter(Boolean).map((c) => one(c).catch(() => [] as GroupCard[]))).then((all) => {\n if (!ctl.signal.aborted) setFound({ codes, entities: all.flat() });\n });\n return () => ctl.abort();\n }, [client, codes]);\n return codes && found?.codes === codes ? found.entities : undefined;\n}\n\nconst PAGE_SIZES = [20, 50, 100] as const;\n// Bulk writes run a few at a time so one selection never floods the server.\nconst BULK_CONCURRENCY = 4;\n\n/** A rule as a short label: free, its tiers, pay per view or members only. */\nexport function accessLabel(t: Translator[\"t\"], rule: Rule, labels?: Labels): string {\n switch (rule.level) {\n case \"public\":\n return t(\"contentManager.free\");\n case \"tier\":\n return (rule.tiers ?? []).map((x) => labelOf(labels, x)).join(\", \") || t(\"contentManager.premium\");\n case \"ppv\":\n return t(\"contentManager.ppv\");\n case \"group\":\n return t(\"contentManager.members\");\n case \"group_ppv\":\n return t(\"contentManager.membersPpv\");\n }\n}\n\n// Filter values: \"\" every rule, a level, or \"tier:{name}\" for one tier.\nconst accessQuery = (v: string): { access?: string; tier?: string } =>\n !v ? {} : v.startsWith(\"tier:\") ? { access: \"tier\", tier: v.slice(5) } : { access: v };\n\nasync function eachLimited<T>(items: readonly T[], fn: (item: T) => Promise<unknown>): Promise<number> {\n let failed = 0;\n let next = 0;\n const worker = async () => {\n while (next < items.length) {\n const item = items[next++]!;\n try {\n await fn(item);\n } catch {\n failed++;\n }\n }\n };\n await Promise.all(Array.from({ length: Math.min(BULK_CONCURRENCY, items.length) }, worker));\n return failed;\n}\n\nfunction List({ loc, open, client, kind, languages: offered, contentHref, labels, pageSize: defaultSize = 20, selectable = true, onError }: Inner & { loc: AdminLocation; open: (c: Content) => void }) {\n const m = useMessages();\n const { t } = m;\n const ids = useId();\n const language = choices(offered)[0]?.value;\n const query = loc.query.get(\"q\") ?? \"\";\n const status = states.find((s) => s === loc.query.get(\"status\")) ?? \"\";\n const accessFilter = loc.query.get(\"access\") ?? \"\";\n const deleted = loc.query.get(\"deleted\") === \"1\";\n const page = pageOf(loc.query);\n const sizeParam = Number(loc.query.get(\"size\"));\n const size = PAGE_SIZES.find((n) => n === sizeParam) ?? defaultSize;\n const filters = { q: query, status, access: accessFilter || undefined, deleted: deleted ? \"1\" : undefined, size: size !== defaultSize ? size : undefined };\n const filter = (next: Partial<typeof filters>) => loc.go(\"\", { ...filters, ...next });\n const filtered = !!(query || status || accessFilter);\n const [text, setText] = useState(query);\n useEffect(() => setText(query), [query]);\n // Searches as the admin types; Enter applies at once.\n useEffect(() => {\n if (text.trim() === query) return;\n const id = setTimeout(() => filter({ q: text.trim() }), 300);\n return () => clearTimeout(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [text]);\n const { kinds: model } = useKinds({ client });\n const tiers = model?.tiers ?? [];\n // Reader works take one ZIP per draft, players one video per draft.\n const presentation = model?.kinds[kind]?.presentation;\n const bulkable = presentation === \"reader\" || presentation === \"player\";\n const [bulkOpen, setBulkOpen] = useState(false);\n const drafts = useRef(new Map<string, Content>()).current;\n const report = useErrorReporter(onError);\n const createItem = async (file: File) => {\n const { content, ref } = await createDraft(client, kind, language ?? model?.languages[0] ?? \"en\", file, t(\"readerEditor.untitled\"));\n drafts.set(content.id, content);\n return ref;\n };\n const openDraft = (ref: { id: string }) => {\n const known = drafts.get(ref.id);\n if (known) return open(known);\n // Resumed after a reload: the draft is no longer in memory.\n void client.contents.manage({ kind, ids: [ref.id], limit: 1 }).then(\n ([c]) => {\n if (c) open(c);\n },\n (e) => report(e, \"upload\"),\n );\n };\n const { store, scope } = useContentScope(client);\n const state = deleted ? \"deleted\" : status || undefined;\n const tag = { type: \"contents\", scope: deleted ? \"deleted\" : undefined } as const;\n const filterQuery = { q: query || undefined, state, ...accessQuery(accessFilter) };\n const listing = usePaged(store, keyOf(\"contents-page\", scope, kind, query, state, accessFilter, language, size), tag, page, size, (q, signal) =>\n client.contents.manage({ ...q, ...filterQuery, kind, language }, signal),\n );\n const counted = useResource<ManageCount>(store, keyOf(\"contents-count\", scope, kind, query, state, accessFilter), tag, (signal) =>\n client.contents.manageCount({ ...filterQuery, kind }, signal),\n );\n const items = listing.items;\n const total = counted.data?.total;\n const loading = listing.loading;\n const del = useAction(\"content.save\", onError);\n const { confirm, dialog } = useConfirm();\n const [selected, setSelected] = useState<ReadonlySet<string>>(new Set());\n useEffect(() => setSelected(new Set()), [kind, query, state, accessFilter, page, size]);\n const [busy, setBusy] = useState<ReadonlySet<string>>(new Set());\n const [rowErrors, setRowErrors] = useState<Readonly<Record<string, ContentKitError>>>({});\n const [bulk, setBulk] = useState<{ pending: boolean; summary?: string }>({ pending: false });\n const premium = tiers[0];\n const toggleable = (c: Content) => !!premium && (c.access.level === \"public\" || c.access.level === \"tier\");\n const nextRule = (c: Content, toPremium: boolean): Rule => (toPremium ? { level: \"tier\", tiers: [premium!] } : { level: \"public\" });\n const setAccess = async (c: Content, toPremium: boolean) => {\n setBusy((b) => new Set(b).add(c.id));\n setRowErrors(({ [c.id]: _, ...rest }) => rest);\n try {\n await client.contents.update(c.id, { access: nextRule(c, toPremium) });\n } catch (e) {\n const err = toContentKitError(e);\n setRowErrors((r) => ({ ...r, [c.id]: err }));\n } finally {\n setBusy((b) => {\n const n = new Set(b);\n n.delete(c.id);\n return n;\n });\n }\n };\n const remove = async (c: Content) => {\n if (await confirm({ title: t(\"contentManager.deleteTitle\", { title: c.title }), description: t(\"contentManager.deleteBody\"), confirm: t(\"contentManager.delete\") })) {\n await del.run(() => client.contents.remove(c.id));\n }\n };\n const chosen = items.filter((c) => selected.has(c.id));\n const runBulk = async (targets: Content[], fn: (c: Content) => Promise<unknown>) => {\n setBulk({ pending: true });\n const failed = await eachLimited(targets, fn);\n const done = targets.length - failed;\n setSelected(new Set());\n setBulk({\n pending: false,\n summary: failed ? t(\"contentManager.bulkPartial\", { done, total: targets.length, failed }) : m.plural(\"contentManager.bulkDone\", done),\n });\n };\n const bulkDelete = async () => {\n if (await confirm({ title: m.plural(\"contentManager.bulkDeleteTitle\", chosen.length), description: t(\"contentManager.bulkDeleteBody\"), confirm: t(\"contentManager.delete\") })) {\n await runBulk(chosen, (c) => client.contents.remove(c.id));\n }\n };\n const allChosen = items.length > 0 && chosen.length === items.length;\n return (\n <div className=\"grid gap-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <h2 className=\"text-base font-semibold\">{t(\"contentManager.title\")}</h2>\n <div className=\"flex gap-2\">\n {bulkable && !deleted && (\n <Button size=\"sm\" variant=\"outline\" aria-expanded={bulkOpen} onClick={() => setBulkOpen((o) => !o)}>\n {t(\"contentManager.bulkUpload\")}\n </Button>\n )}\n <Button size=\"sm\" onClick={() => loc.go(\"new\")}>\n {t(\"contentManager.new\")}\n </Button>\n </div>\n </div>\n {bulkable && bulkOpen && !deleted && (\n <section className=\"grid gap-3 rounded-lg border border-border p-3\" aria-label={t(\"contentManager.bulkUpload\")} data-ckui=\"bulk-upload\">\n <p className=\"text-sm text-muted-foreground\">{t(presentation === \"reader\" ? \"contentManager.bulkHintArchive\" : \"contentManager.bulkHintFile\")}</p>\n <UploadQueueBody\n client={client}\n createItem={createItem}\n target={(ref, file, signal) => uploadTarget(client, ref, file, signal)}\n accept={presentation === \"reader\" ? \".zip,application/zip\" : \"video/*\"}\n concurrency={2}\n storageKey={`ckui.bulk.${kind}`}\n onOpen={openDraft}\n onError={onError}\n />\n </section>\n )}\n <div className=\"flex gap-2\" role=\"group\" aria-label={t(\"contentManager.title\")}>\n <Button size=\"sm\" variant={deleted ? \"outline\" : \"default\"} aria-pressed={!deleted} onClick={() => loc.go(\"\", { q: query })}>\n {t(\"contentManager.items\")}\n </Button>\n <Button size=\"sm\" variant={deleted ? \"default\" : \"outline\"} aria-pressed={deleted} onClick={() => loc.go(\"\", { q: query, deleted: \"1\" })}>\n {t(\"contentManager.deleted\")}\n </Button>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <form\n className=\"min-w-48 flex-1\"\n role=\"search\"\n onSubmit={(e) => {\n e.preventDefault();\n filter({ q: text.trim() });\n }}\n >\n <Label htmlFor={`${ids}-q`} className=\"sr-only\">\n {t(\"contentManager.search\")}\n </Label>\n <Input id={`${ids}-q`} className=\"h-8\" type=\"search\" value={text} placeholder={t(\"contentManager.search\")} onChange={(e) => setText(e.target.value)} />\n </form>\n {!deleted && (\n <Select value={status} onValueChange={(v) => filter({ status: String(v ?? \"\") as typeof status })}>\n <SelectTrigger size=\"sm\" aria-label={t(\"contentManager.status\")}>\n <SelectValue>{(v: string) => t(v ? `contentManager.${v as (typeof states)[number]}` : \"contentManager.allStatuses\")}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"\">{t(\"contentManager.allStatuses\")}</SelectItem>\n {states.map((s) => (\n <SelectItem key={s} value={s}>\n {t(`contentManager.${s}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n <Select value={accessFilter} onValueChange={(v) => filter({ access: String(v ?? \"\") || undefined })}>\n <SelectTrigger size=\"sm\" aria-label={t(\"contentManager.access\")}>\n <SelectValue>\n {(v: string) =>\n !v\n ? t(\"contentManager.anyAccess\")\n : v.startsWith(\"tier:\")\n ? labelOf(labels, v.slice(5))\n : accessLabel(t, { level: v as Rule[\"level\"] }, labels)\n }\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"\">{t(\"contentManager.anyAccess\")}</SelectItem>\n <SelectItem value=\"public\">{t(\"contentManager.free\")}</SelectItem>\n {tiers.length > 0 && <SelectItem value=\"tier\">{t(\"contentManager.premium\")}</SelectItem>}\n {tiers.length > 1 &&\n tiers.map((x) => (\n <SelectItem key={x} value={`tier:${x}`}>\n {labelOf(labels, x)}\n </SelectItem>\n ))}\n <SelectItem value=\"ppv\">{t(\"contentManager.ppv\")}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <ErrorLine error={del.error} />\n {bulk.summary && (\n <p role=\"status\" className=\"text-sm text-muted-foreground\">\n {bulk.summary}\n </p>\n )}\n {selectable && chosen.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-2 rounded-lg border border-border bg-muted/40 p-2 text-sm\" data-ckui=\"bulk-bar\">\n <span className=\"font-medium\">{t(\"contentManager.selected\", { count: chosen.length })}</span>\n {deleted ? (\n <Button size=\"sm\" variant=\"outline\" disabled={bulk.pending} onClick={() => void runBulk(chosen, (c) => client.contents.restore(c.id))}>\n {t(\"moderation.restore\")}\n </Button>\n ) : (\n <>\n {premium && (\n <Button size=\"sm\" variant=\"outline\" disabled={bulk.pending} onClick={() => void runBulk(chosen.filter(toggleable), (c) => client.contents.update(c.id, { access: nextRule(c, true) }))}>\n {t(\"contentManager.makePremium\")}\n </Button>\n )}\n {premium && (\n <Button size=\"sm\" variant=\"outline\" disabled={bulk.pending} onClick={() => void runBulk(chosen.filter(toggleable), (c) => client.contents.update(c.id, { access: nextRule(c, false) }))}>\n {t(\"contentManager.makeFree\")}\n </Button>\n )}\n <Button size=\"sm\" variant=\"destructive\" disabled={bulk.pending} onClick={() => void bulkDelete()}>\n {t(\"contentManager.delete\")}\n </Button>\n </>\n )}\n <Button size=\"sm\" variant=\"ghost\" disabled={bulk.pending} onClick={() => setSelected(new Set())}>\n {t(\"contentManager.clearSelection\")}\n </Button>\n </div>\n )}\n {loading && !items.length ? (\n <Rows />\n ) : listing.error && !items.length ? (\n <LoadFailed error={listing.error} message={t(\"contentManager.loadFailed\")} retry={listing.reload} />\n ) : !items.length ? (\n <div className=\"grid justify-items-start gap-2\">\n <p className=\"text-muted-foreground\">{t(filtered ? \"contentManager.noMatches\" : deleted ? \"contentManager.noDeleted\" : \"contentManager.emptyAll\")}</p>\n {filtered ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => loc.go(\"\", { deleted: deleted ? \"1\" : undefined })}>\n {t(\"contentManager.clearFilters\")}\n </Button>\n ) : (\n !deleted && (\n <Button size=\"sm\" onClick={() => loc.go(\"new\")}>\n {t(\"contentManager.new\")}\n </Button>\n )\n )}\n </div>\n ) : (\n <ul className=\"grid divide-y divide-border rounded-lg border border-border\" aria-busy={loading}>\n {selectable && (\n <li className=\"flex items-center gap-3 px-3 py-2 text-xs text-muted-foreground\">\n <input\n type=\"checkbox\"\n className=\"size-4 shrink-0 accent-primary\"\n checked={allChosen}\n aria-label={t(\"contentManager.selectPage\")}\n onChange={(e) => setSelected(e.target.checked ? new Set(items.map((c) => c.id)) : new Set())}\n />\n <span>{t(\"contentManager.selectPage\")}</span>\n </li>\n )}\n {items.map((c) => {\n const s = contentStatus(c);\n const href = s === \"published\" ? contentHref?.(c) : undefined;\n const pending = busy.has(c.id);\n const isPremium = c.access.level === \"tier\";\n return (\n <li key={c.id} className=\"flex flex-wrap items-start gap-3 p-3\" data-ckui=\"content-row\" data-status={deleted ? \"deleted\" : s}>\n {selectable && (\n <input\n type=\"checkbox\"\n className=\"mt-1 size-4 shrink-0 accent-primary\"\n checked={selected.has(c.id)}\n aria-label={t(\"contentManager.select\", { title: c.title })}\n onChange={(e) =>\n setSelected((cur) => {\n const n = new Set(cur);\n if (e.target.checked) n.add(c.id);\n else n.delete(c.id);\n return n;\n })\n }\n />\n )}\n <RowCover url={c.cover?.url} />\n <div className=\"grid min-w-0 flex-1 gap-1\">\n {deleted ? (\n <span className=\"font-medium break-words line-through\">{c.title}</span>\n ) : (\n <button type=\"button\" className=\"text-left font-medium break-words hover:underline\" onClick={() => open(c)}>\n {c.title}\n </button>\n )}\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted-foreground\">\n {!deleted && <Badge variant={badge[s]}>{t(`contentManager.${s}`)}</Badge>}\n <Badge variant={isPremium ? \"secondary\" : \"outline\"} data-ckui=\"access-badge\">\n {accessLabel(t, c.access, labels)}\n </Badge>\n <span className=\"font-mono\">{c.code}</span>\n <span>{c.language}</span>\n {c.published_at && s === \"published\" ? (\n <time dateTime={c.published_at} title={formatDate(m, c.published_at)}>\n {t(\"contentManager.liveOn\", { date: formatDate(m, c.published_at, false) })}\n </time>\n ) : (\n <RelativeTime at={deleted && c.deleted_at ? c.deleted_at : c.updated_at} />\n )}\n {s === \"scheduled\" && c.publish_at && <span>{t(\"pollManager.goesLive\", { date: formatDate(m, c.publish_at) })}</span>}\n </div>\n <ErrorLine error={rowErrors[c.id] ?? null} />\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n {deleted ? (\n <Button size=\"sm\" variant=\"outline\" disabled={del.pending} onClick={() => void del.run(() => client.contents.restore(c.id))}>\n {t(\"moderation.restore\")}\n </Button>\n ) : (\n <>\n {toggleable(c) && (\n <Button size=\"sm\" variant=\"outline\" disabled={pending} aria-busy={pending} onClick={() => void setAccess(c, !isPremium)}>\n {pending && <Spinner />}\n {t(isPremium ? \"contentManager.makeFree\" : \"contentManager.makePremium\")}\n </Button>\n )}\n {href && (\n <a className={buttonVariants({ size: \"sm\", variant: \"ghost\" })} href={href}>\n {t(\"contentManager.view\")}\n </a>\n )}\n <Button size=\"sm\" variant=\"outline\" onClick={() => open(c)}>\n {t(\"comments.edit\")}\n </Button>\n <Button size=\"sm\" variant=\"destructive\" disabled={del.pending} onClick={() => void remove(c)}>\n {t(\"comments.delete\")}\n </Button>\n </>\n )}\n </div>\n </li>\n );\n })}\n </ul>\n )}\n <Pager\n page={page}\n hasNext={listing.hasNext}\n disabled={loading}\n total={total}\n truncated={counted.data?.truncated}\n pageSize={size}\n pageSizes={PAGE_SIZES}\n onPageSize={(n) => loc.go(\"\", { ...filters, size: n !== defaultSize ? n : undefined, page: undefined })}\n onPage={(n) => loc.go(\"\", { ...filters, page: n > 1 ? n : undefined })}\n />\n {dialog}\n </div>\n );\n}\n\n/** A row's portrait cover, or a quiet placeholder. */\nfunction RowCover({ url }: { url?: string }) {\n return url ? (\n <img src={url} alt=\"\" loading=\"lazy\" className=\"aspect-[7/10] w-12 shrink-0 rounded-sm bg-muted object-cover\" />\n ) : (\n <span aria-hidden className=\"grid aspect-[7/10] w-12 shrink-0 place-items-center rounded-sm bg-muted text-muted-foreground\">\n <HugeiconsIcon icon={Image01Icon} strokeWidth={1.5} className=\"size-5\" />\n </span>\n );\n}\n\nfunction Spinner() {\n return <span aria-hidden className=\"size-3 animate-spin rounded-full border-2 border-current border-t-transparent\" />;\n}\n\ninterface Form {\n title: string;\n description: string;\n publishAt: string;\n body: string;\n}\n\nconst empty: Form = { title: \"\", description: \"\", publishAt: \"\", body: \"\" };\n\nexport interface ContentEditorProps {\n /** Staff entity lookup, including internal classifications. */\n management?: boolean;\n /** The item edited; null creates one of kind. */\n id: string | null;\n kind: string;\n /** Languages to write in: codes, or codes with labels; the first is a new item's. */\n languages?: readonly Choice[];\n /** The body editor; without it, a plain HTML field. */\n renderEditor?: (props: BodyEditorProps) => ReactNode;\n /** A link to a live item's page. */\n contentHref?: (content: Content) => string | undefined;\n labels?: Labels;\n /** A new item's owner group: a channel its editors write for. */\n ownerGroup?: string;\n /** Entities a new item starts linked to, e.g. the series it was created from; ignored for an existing item. */\n entities?: readonly GroupCard[];\n /** After create: show the new item (the editor goes on editing it). */\n onCreated?: (content: Content) => void;\n onDeleted?: (content: Content) => void;\n client?: ContentKitClient;\n onError?: ContentKitErrorHandler;\n}\n\n/**\n * One content item for its creators and staff: title, description,\n * schedule, cover and body per language, publish, unpublish and delete;\n * then listing and attributes, access rule and price, versions and groups.\n */\nexport function ContentEditor(p:ContentEditorProps){\n const {client,scope}=useContentScope(p.client);\n const allocated=useRef<{id:string;session:number}|null>(null);\n const [session,setSession]=useState({id:p.id,kind:p.kind,client,scope,key:0});\n let boundary=session;\n if(session.id!==p.id||session.kind!==p.kind||session.client!==client||session.scope!==scope){\n const continues=session.id==null&&p.id===allocated.current?.id&&allocated.current?.session===session.key&&session.kind===p.kind&&session.client===client&&session.scope===scope;\n boundary={id:p.id,kind:p.kind,client,scope,key:continues?session.key:session.key+1};\n setSession(boundary);\n }\n const {kinds,error,reload}=useKinds({client});\n const {t}=useMessages();\n if(!kinds)return error?<LoadFailed error={error} message={t(\"contentManager.loadFailed\")} retry={reload}/>:<Rows/>;\n const props={...p,client,onCreated:(content:Content)=>{allocated.current={id:content.id,session:boundary.key};p.onCreated?.(content);}};\n if(kinds.kinds[p.kind]?.presentation===\"reader\")return <ReaderContentEditor key={boundary.key} {...props} model={kinds}/>;\n return <StandardContentEditor key={boundary.key} {...props}/>;\n}\n\nfunction StandardContentEditor({ id, client: own, kind, languages: offered, renderEditor, contentHref, labels, ownerGroup, entities, onCreated, onDeleted, onError, management }: ContentEditorProps) {\n const client = useContentKitClient(own);\n const m = useMessages();\n const { t } = m;\n const ids = useId();\n const languages = choices(offered);\n const [language, setLanguage] = useState(languages[0]?.value ?? \"en\");\n const ed = useContent(id, kind, language, { client });\n // A hidden version's cover is edited here; a visible version's in its own form.\n const model = useKinds({ client }).kinds;\n const hidden = !!model?.kinds[kind]?.versions.hidden;\n const report = useErrorReporter(onError);\n // The body is kept as stored (image references); the editor shows it with URLs.\n const [form, setForm] = useState<Form | null>(id ? null : empty);\n const [error, setError] = useState<ContentKitError | string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const { confirm, dialog } = useConfirm();\n const item = ed.content;\n useEffect(() => {\n if (!item) return;\n const stored = item.text?.[language];\n setForm((f) => f ?? { title: stored?.title ?? \"\", description: stored?.description ?? \"\", body: stored?.body ?? \"\",\n publishAt: item.publish_at && !item.live ? localInput(new Date(item.publish_at)) : \"\" });\n }, [item, language]);\n const { imageSrc } = ed;\n const shown = useMemo(\n () => (form?.body ?? \"\").replace(imageRefs(), (ref, name: string) => {\n const src = imageSrc(name);\n return src && src !== name ? src.replaceAll(\"&\", \"&\") : ref;\n }),\n [form?.body, imageSrc],\n );\n if (id && !form) {\n if (ed.error) return <LoadFailed error={ed.error} message={t(\"contentManager.loadFailed\")} retry={ed.reload} />;\n return (\n <div className=\"grid gap-3\" aria-busy>\n <Skeleton className=\"h-9 w-full\" />\n <Skeleton className=\"h-48 w-full\" />\n </div>\n );\n }\n const f = form!;\n const set = (patch: Partial<Form>) => setForm((cur) => ({ ...cur!, ...patch }));\n const fail = (e: unknown) => {\n const err = toContentKitError(e);\n setError(err);\n report(err, \"content.save\");\n };\n const text = () => ({ title: f.title.trim(), description: f.description.trim(), body: f.body });\n const save = async () => {\n setError(null);\n setNotice(null);\n if (!f.title.trim()) return setError(t(\"contentManager.titleRequired\"));\n try {\n if (!item) {\n const created = await ed.create({ kind, text: { [language]: text() }, owner_group_id: ownerGroup });\n // Starting entities link once the item exists; version-level kinds need a version first.\n const linked = (entities ?? []).filter((g) => model?.kinds[kind]?.entities?.includes(g.kind) && !model.entity_kinds[g.kind]?.version_level);\n if (linked.length) {\n await client.entities\n .setOfContent(created.id, { kinds: [...new Set(linked.map((g) => g.kind))], memberships: linked.map((g) => ({ group_id: g.id })) }, language)\n .catch(fail);\n }\n onCreated?.(created);\n return;\n }\n await ed.putText(text());\n setNotice(t(\"pollEditor.saved\"));\n } catch (e) {\n fail(e);\n }\n };\n const publish = async (live: boolean) => {\n setError(null);\n setNotice(null);\n try {\n if (live) await ed.publish(f.publishAt ? new Date(f.publishAt).toISOString() : undefined);\n else await ed.unpublish();\n setNotice(t(live ? \"contentManager.publishedNotice\" : \"contentManager.unpublishedNotice\"));\n } catch (e) {\n fail(e);\n }\n };\n const remove = async () => {\n if (!item || !(await confirm({ title: t(\"contentManager.deleteTitle\", { title: item.title }), description: t(\"contentManager.deleteBody\"), confirm: t(\"contentManager.delete\") }))) return;\n try {\n await ed.remove();\n onDeleted?.(item);\n } catch (e) {\n fail(e);\n }\n };\n const s = item ? contentStatus(item) : \"draft\";\n const href = item && s === \"published\" ? contentHref?.(item) : undefined;\n const editor: BodyEditorProps = {\n value: shown,\n onChange: (html) => set({ body: ed.storedBody(html) }),\n uploadImage: item ? (file) => ed.uploadImage(file) : undefined,\n disabled: ed.saving,\n placeholder: t(\"contentManager.bodyPlaceholder\"),\n \"aria-label\": t(\"contentManager.body\"),\n };\n return (\n <>\n <form\n className=\"grid gap-4\"\n data-ckui=\"content-form\"\n onSubmit={(e) => {\n e.preventDefault();\n void save();\n }}\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <h2 className=\"text-base font-semibold\">{t(item ? \"contentManager.editTitle\" : \"contentManager.newTitle\")}</h2>\n {item && <Badge variant={badge[s]}>{t(`contentManager.${s}`)}</Badge>}\n {href && (\n <a className=\"text-xs text-muted-foreground hover:underline\" href={href}>\n {t(\"contentManager.view\")}\n </a>\n )}\n </div>\n {item?.moderation && (\n <Alert variant={item.moderation === \"rejected\" ? \"destructive\" : \"default\"}>\n <AlertDescription>\n {item.moderation_reason\n ? t(`contentManager.${item.moderation === \"rejected\" ? \"rejectedBecause\" : \"heldBecause\"}`, { reason: item.moderation_reason })\n : t(`contentManager.${item.moderation === \"rejected\" ? \"rejectedNote\" : \"heldNote\"}`)}\n </AlertDescription>\n </Alert>\n )}\n {languages.length > 1 && (\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-lang`}>{t(\"contentManager.language\")}</Label>\n <Select\n value={language}\n onValueChange={(v) => {\n setLanguage(String(v ?? \"\"));\n setForm(item ? null : empty);\n }}\n >\n <SelectTrigger id={`${ids}-lang`} className=\"w-full\">\n <SelectValue>{(v: string) => languages.find((l) => l.value === v)?.label ?? v}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n {languages.map((l) => (\n <SelectItem key={l.value} value={l.value}>\n {l.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-title`}>{t(\"contentManager.itemTitle\")}</Label>\n <Input id={`${ids}-title`} value={f.title} required maxLength={300} onChange={(e) => set({ title: e.target.value })} />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-publish`}>{t(\"contentManager.publishAt\")}</Label>\n <Input id={`${ids}-publish`} type=\"datetime-local\" value={f.publishAt} onChange={(e) => set({ publishAt: e.target.value })} />\n </div>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-description`}>{t(\"contentManager.description\")}</Label>\n <Textarea id={`${ids}-description`} rows={2} value={f.description} onChange={(e) => set({ description: e.target.value })} />\n </div>\n {(hidden || !item) && <Cover item={item} src={ed.coverSrc} saving={ed.saving} onFile={(file) => void ed.setCover(file).catch(fail)} />}\n <div className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium\">{t(\"contentManager.body\")}</span>\n {renderEditor ? renderEditor(editor) : <Textarea aria-label={editor[\"aria-label\"]} rows={12} value={f.body} placeholder={editor.placeholder} onChange={(e) => set({ body: e.target.value })} />}\n {!item && <p className=\"text-xs text-muted-foreground\">{t(\"contentManager.imagesAfterCreate\")}</p>}\n </div>\n {error && <ErrorLine>{typeof error === \"string\" ? error : contentError(m, error)}</ErrorLine>}\n {notice && !error && (\n <p role=\"status\" className=\"text-sm text-muted-foreground\">\n {notice}\n </p>\n )}\n <div className=\"flex flex-wrap gap-2 border-t border-border pt-4\">\n <Button type=\"submit\" disabled={ed.saving}>\n {ed.saving ? t(\"common.saving\") : t(item ? \"common.save\" : \"contentManager.createDraft\")}\n </Button>\n {item && !item.live && (\n <Button type=\"button\" variant=\"outline\" disabled={ed.saving} onClick={() => void publish(true)}>\n {t(\"contentManager.publish\")}\n </Button>\n )}\n {item?.state === \"published\" && (\n <Button type=\"button\" variant=\"outline\" disabled={ed.saving} onClick={() => void publish(false)}>\n {t(\"contentManager.unpublish\")}\n </Button>\n )}\n {item && (\n <Button type=\"button\" variant=\"destructive\" className=\"ms-auto\" disabled={ed.saving} onClick={() => void remove()}>\n {t(\"contentManager.delete\")}\n </Button>\n )}\n </div>\n {dialog}\n </form>\n {item && <ContentSections management={management} content={item} client={client} onError={onError} labels={labels} />}\n </>\n );\n}\n\nfunction Cover({ item, src, saving, onFile }: { item: Content | null; src?: string; saving: boolean; onFile: (file: File | null) => void }) {\n const { t } = useMessages();\n const file = useRef<HTMLInputElement>(null);\n return (\n <div className=\"grid gap-1.5\" data-ckui=\"content-cover\">\n <span className=\"text-sm font-medium\">{t(\"contentManager.cover\")}</span>\n {item ? (\n <div className=\"flex flex-wrap items-center gap-3\">\n {src ? <img src={src} alt=\"\" className=\"h-20 w-36 rounded-md border border-border object-cover\" /> : <span className=\"text-muted-foreground\">{t(\"contentManager.noCover\")}</span>}\n <Button type=\"button\" size=\"sm\" variant=\"outline\" disabled={saving} onClick={() => file.current?.click()}>\n {t(src ? \"pollEditor.replaceImage\" : \"contentManager.addCover\")}\n </Button>\n {src && (\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" disabled={saving} onClick={() => onFile(null)}>\n {t(\"pollEditor.removeImage\")}\n </Button>\n )}\n <input\n ref={file}\n type=\"file\"\n accept=\"image/*\"\n hidden\n aria-label={t(\"contentManager.cover\")}\n onChange={(e) => {\n const f = e.target.files?.[0];\n e.target.value = \"\";\n if (f) onFile(f);\n }}\n />\n </div>\n ) : (\n <p className=\"text-xs text-muted-foreground\">{t(\"contentManager.imagesAfterCreate\")}</p>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"content-manager.js","names":[],"sources":["../../../src/components/admin/content-manager.tsx"],"sourcesContent":["import { Image01Icon } from \"@hugeicons/core-free-icons\";\nimport { HugeiconsIcon } from \"@hugeicons/react\";\nimport { useEffect, useId, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport type { ContentKitClient } from \"../../client/client.js\";\nimport { toContentKitError, type ContentKitError } from \"../../client/errors.js\";\nimport { imageRefs } from \"../../client/contents.js\";\nimport type { Content, GroupCard, GroupDetail, ManageCount, Rule } from \"../../client/generated/wire.js\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport type { Translator } from \"../../i18n/messages.js\";\nimport { useAdminLocation, useFlowClient, useStaffAccess, type AdminLocation, type FlowClientOptions, type StaffAccess } from \"../../react/admin.js\";\nimport { useContentKitClient, useErrorReporter, type ContentKitErrorHandler } from \"../../react/context.js\";\nimport { useContent } from \"../../react/contents.js\";\nimport { useKinds } from \"../../react/groups.js\";\nimport { keyOf, useContentScope, usePaged, useResource } from \"../../react/use-resource.js\";\nimport { Alert, AlertDescription } from \"#ckui/ui/alert\";\nimport { Badge } from \"#ckui/ui/badge\";\nimport { Button, buttonVariants } from \"#ckui/ui/button\";\nimport { Input } from \"#ckui/ui/input\";\nimport { Label } from \"#ckui/ui/label\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"#ckui/ui/select\";\nimport { Skeleton } from \"#ckui/ui/skeleton\";\nimport { Textarea } from \"#ckui/ui/textarea\";\nimport { localInput } from \"../social/bans.js\";\nimport { contentError, ErrorLine, formatDate, RelativeTime, useAction } from \"../social/parts.js\";\nimport { ReaderContentEditor } from \"./reader-content-editor.js\";\nimport { createDraft, uploadTarget } from \"./bulk-drafts.js\";\nimport { UploadQueueBody } from \"./upload-queue.js\";\nimport { ContentSections, allowsIndividualSales } from \"../content/editors.js\";\nimport { labelOf, type Labels } from \"../groups/parts.js\";\nimport { AdminRoot, LoadFailed, NoAccess, Pager, Rows, pageOf, useConfirm, type AdminFlowProps, type AdminRouteProps } from \"./shell.js\";\n\ntype Choice = string | { value: string; label: string };\n\n/** What ContentManager hands its body editor. */\nexport interface BodyEditorProps {\n /** The body as HTML, its images at URLs that show them now. */\n value: string;\n onChange: (html: string) => void;\n /** Uploads an image to the item and resolves with a URL that shows it; absent until the item exists. */\n uploadImage?: (file: File) => Promise<string>;\n disabled?: boolean;\n placeholder?: string;\n \"aria-label\"?: string;\n}\n\nexport interface ContentManagerProps extends AdminFlowProps, AdminRouteProps {\n /** The content kind managed. */\n kind: string;\n /** Languages to write in: codes, or codes with labels; the first is a new item's. */\n languages?: readonly Choice[];\n /**\n * The body editor: `richTextEditor` from `@openrails/contentkit-ui/editor`,\n * or the host's own. Without it, the body is a plain HTML field.\n */\n renderEditor?: (props: BodyEditorProps) => ReactNode;\n /** A link to a live item's page. */\n contentHref?: (content: Content) => string | undefined;\n /** Display names of kinds, traits, tiers, attributes and values by identifier. */\n labels?: Labels;\n /** The list's default page size: 20, 50 or 100. */\n pageSize?: number;\n /** Row checkboxes with bulk access, delete and restore (default true). */\n selectable?: boolean;\n}\n\n/** Whether the caller manages content: root:content:write holders, creators and owner-group editors. */\nexport function useContentManagerAccess(o: FlowClientOptions = {}): StaffAccess<\"contents\"> {\n return useStaffAccess([\"contents\"] as const, o);\n}\n\nexport type ContentStatus = \"draft\" | \"scheduled\" | \"published\" | \"held\" | \"rejected\";\n\n/** An item's status as the manager names it. */\nexport function contentStatus(c: Content): ContentStatus {\n if (c.moderation === \"rejected\") return \"rejected\";\n if (c.moderation === \"held\") return \"held\";\n if (c.state === \"draft\") return \"draft\";\n if (!c.live) return \"scheduled\";\n return \"published\";\n}\n\nconst choices = (list?: readonly Choice[]) => (list ?? []).map((c) => (typeof c === \"string\" ? { value: c, label: c } : c));\nconst badge: Record<ContentStatus, \"default\" | \"secondary\" | \"outline\" | \"destructive\"> = { published: \"default\", scheduled: \"secondary\", draft: \"outline\", held: \"secondary\", rejected: \"destructive\" };\nconst states = [\"draft\", \"scheduled\", \"published\"] as const;\n\n/**\n * Content items of one kind for their creators and staff: every one the\n * caller manages, by state and text, deleted ones on their own to restore;\n * create and edit title, description, schedule, cover and body with\n * inline images per language, publish or keep a draft, and delete; then its\n * listing and attributes, access rule and price, versions (order, languages,\n * traits, schedule, access override, price, segments, media) and groups. The\n * list is at basePath, a new item at basePath/new and each item at\n * basePath/{id}, filters in the query.\n */\nexport function ContentManager({ client: own, baseUrl, auth, guard, appearance, className, language, messages, ...p }: ContentManagerProps) {\n const client = useFlowClient({ client: own, baseUrl, auth });\n return (\n <AdminRoot flow=\"content-manager\" appearance={appearance} className={className} language={language} messages={messages} guard={guard}>\n <Contents {...p} client={client} />\n </AdminRoot>\n );\n}\n\ntype Inner = Omit<ContentManagerProps, \"client\" | \"baseUrl\" | \"auth\" | \"guard\" | \"appearance\" | \"className\" | \"language\" | \"messages\"> & { client: ContentKitClient };\n\nfunction Contents({ basePath, navigation, ...p }: Inner) {\n const { t } = useMessages();\n const loc = useAdminLocation(basePath, navigation);\n const access = useContentManagerAccess({ client: p.client });\n // Editor URLs name items by content code; the editor itself works on ids.\n const known = useRef(new Map<string, string>()).current;\n const open = (c: Content, replace = false) => {\n known.set(c.code, c.id);\n loc.go(c.code, undefined, replace ? { replace: true } : undefined);\n };\n const target = useCodeTarget(p.client, p.kind, loc.view && loc.view !== \"new\" ? loc.view : null, known);\n const entities = useStartingEntities(p.client, loc.view === \"new\" ? (loc.query.get(\"with\") ?? \"\") : \"\");\n if (access.loading) return <Rows />;\n if (!access.allowed.contents) return <NoAccess>{t(\"contentManager.noAccess\")}</NoAccess>;\n if (!loc.view) return <List {...p} loc={loc} open={open} />;\n if (loc.view !== \"new\" && !target.id) {\n if (target.error) return <LoadFailed error={target.error} message={t(\"contentManager.loadFailed\")} retry={target.retry} />;\n return target.missing ? <NoAccess>{t(\"contentManager.notFound\")}</NoAccess> : <Rows />;\n }\n return (\n <>\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-self-start\" onClick={() => loc.go(\"\")}>\n {t(\"contentManager.back\")}\n </Button>\n <ContentEditor\n management\n {...p}\n id={loc.view === \"new\" ? null : target.id}\n entities={entities}\n onCreated={(c) => open(c, true)}\n onDeleted={() => loc.go(\"\", undefined, { replace: true })}\n />\n </>\n );\n}\n\n/** Resolves an editor URL's content code to its id within the caller's manage rights; known codes resolve at once. */\nfunction useCodeTarget(client: ContentKitClient, kind: string, code: string | null, known: Map<string, string>) {\n const [found, setFound] = useState<{ code: string; id: string | null; error?: ContentKitError } | null>(null);\n const [attempt, setAttempt] = useState(0);\n const cached = code ? known.get(code) : undefined;\n useEffect(() => {\n if (!code || cached) return;\n const ctl = new AbortController();\n client.contents.manage({ kind, code, limit: 1 }, ctl.signal).then(\n (items) => {\n const id = items[0]?.id ?? null;\n if (id) known.set(code, id);\n setFound({ code, id });\n },\n (e) => {\n if (!ctl.signal.aborted) setFound({ code, id: null, error: toContentKitError(e) });\n },\n );\n return () => ctl.abort();\n }, [client, kind, code, cached, known, attempt]);\n const retry = () => setAttempt((n) => n + 1);\n if (!code) return { id: null, retry };\n if (cached) return { id: cached, retry };\n if (found?.code !== code) return { id: null, retry };\n return { id: found.id, error: found.error, missing: !found.id && !found.error, retry };\n}\n\nconst asCard = (g: GroupDetail): GroupCard => ({ ...g, count: 0 });\n\n/** A new item's starting entities from `?with=CODE[,CODE]`, each with its scope (a character's series); unresolvable codes are skipped. */\nfunction useStartingEntities(client: ContentKitClient, codes: string): readonly GroupCard[] | undefined {\n const [found, setFound] = useState<{ codes: string; entities: GroupCard[] } | null>(null);\n useEffect(() => {\n if (!codes) return;\n const ctl = new AbortController();\n const one = async (code: string) => {\n const r = await client.codes.resolve(code, { signal: ctl.signal });\n const g = await client.entities.getForManagement(r.content_id, undefined, ctl.signal);\n return g.scope ? [asCard(g), g.scope] : [asCard(g)];\n };\n void Promise.all(codes.split(\",\").filter(Boolean).map((c) => one(c).catch(() => [] as GroupCard[]))).then((all) => {\n if (!ctl.signal.aborted) setFound({ codes, entities: all.flat() });\n });\n return () => ctl.abort();\n }, [client, codes]);\n return codes && found?.codes === codes ? found.entities : undefined;\n}\n\nconst PAGE_SIZES = [20, 50, 100] as const;\n// Bulk writes run a few at a time so one selection never floods the server.\nconst BULK_CONCURRENCY = 4;\n\n/** A rule as a short label: free, its tiers, pay per view or members only. */\nexport function accessLabel(t: Translator[\"t\"], rule: Rule, labels?: Labels): string {\n switch (rule.level) {\n case \"public\":\n return t(\"contentManager.free\");\n case \"tier\":\n return (rule.tiers ?? []).map((x) => labelOf(labels, x)).join(\", \") || t(\"contentManager.premium\");\n case \"ppv\":\n return t(\"contentManager.ppv\");\n case \"group\":\n return t(\"contentManager.members\");\n case \"group_ppv\":\n return t(\"contentManager.membersPpv\");\n }\n}\n\n// Filter values: \"\" every rule, a level, or \"tier:{name}\" for one tier.\nconst accessQuery = (v: string): { access?: string; tier?: string } =>\n !v ? {} : v.startsWith(\"tier:\") ? { access: \"tier\", tier: v.slice(5) } : { access: v };\n\nasync function eachLimited<T>(items: readonly T[], fn: (item: T) => Promise<unknown>): Promise<number> {\n let failed = 0;\n let next = 0;\n const worker = async () => {\n while (next < items.length) {\n const item = items[next++]!;\n try {\n await fn(item);\n } catch {\n failed++;\n }\n }\n };\n await Promise.all(Array.from({ length: Math.min(BULK_CONCURRENCY, items.length) }, worker));\n return failed;\n}\n\nfunction List({ loc, open, client, kind, languages: offered, contentHref, labels, pageSize: defaultSize = 20, selectable = true, onError }: Inner & { loc: AdminLocation; open: (c: Content) => void }) {\n const m = useMessages();\n const { t } = m;\n const ids = useId();\n const language = choices(offered)[0]?.value;\n const query = loc.query.get(\"q\") ?? \"\";\n const status = states.find((s) => s === loc.query.get(\"status\")) ?? \"\";\n const accessFilter = loc.query.get(\"access\") ?? \"\";\n const deleted = loc.query.get(\"deleted\") === \"1\";\n const page = pageOf(loc.query);\n const sizeParam = Number(loc.query.get(\"size\"));\n const size = PAGE_SIZES.find((n) => n === sizeParam) ?? defaultSize;\n const filters = { q: query, status, access: accessFilter || undefined, deleted: deleted ? \"1\" : undefined, size: size !== defaultSize ? size : undefined };\n const filter = (next: Partial<typeof filters>) => loc.go(\"\", { ...filters, ...next });\n const filtered = !!(query || status || accessFilter);\n const [text, setText] = useState(query);\n useEffect(() => setText(query), [query]);\n // Searches as the admin types; Enter applies at once.\n useEffect(() => {\n if (text.trim() === query) return;\n const id = setTimeout(() => filter({ q: text.trim() }), 300);\n return () => clearTimeout(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [text]);\n const { kinds: model } = useKinds({ client });\n const tiers = model?.tiers ?? [];\n // Reader works take one ZIP per draft, players one video per draft.\n const presentation = model?.kinds[kind]?.presentation;\n const bulkable = presentation === \"reader\" || presentation === \"player\";\n const [bulkOpen, setBulkOpen] = useState(false);\n const drafts = useRef(new Map<string, Content>()).current;\n const report = useErrorReporter(onError);\n const createItem = async (file: File) => {\n const { content, ref } = await createDraft(client, kind, language ?? model?.languages[0] ?? \"en\", file, t(\"readerEditor.untitled\"));\n drafts.set(content.id, content);\n return ref;\n };\n const openDraft = (ref: { id: string }) => {\n const known = drafts.get(ref.id);\n if (known) return open(known);\n // Resumed after a reload: the draft is no longer in memory.\n void client.contents.manage({ kind, ids: [ref.id], limit: 1 }).then(\n ([c]) => {\n if (c) open(c);\n },\n (e) => report(e, \"upload\"),\n );\n };\n const { store, scope } = useContentScope(client);\n const state = deleted ? \"deleted\" : status || undefined;\n const tag = { type: \"contents\", scope: deleted ? \"deleted\" : undefined } as const;\n const filterQuery = { q: query || undefined, state, ...accessQuery(accessFilter) };\n const listing = usePaged(store, keyOf(\"contents-page\", scope, kind, query, state, accessFilter, language, size), tag, page, size, (q, signal) =>\n client.contents.manage({ ...q, ...filterQuery, kind, language }, signal),\n );\n const counted = useResource<ManageCount>(store, keyOf(\"contents-count\", scope, kind, query, state, accessFilter), tag, (signal) =>\n client.contents.manageCount({ ...filterQuery, kind }, signal),\n );\n const items = listing.items;\n const total = counted.data?.total;\n const loading = listing.loading;\n const del = useAction(\"content.save\", onError);\n const { confirm, dialog } = useConfirm();\n const [selected, setSelected] = useState<ReadonlySet<string>>(new Set());\n useEffect(() => setSelected(new Set()), [kind, query, state, accessFilter, page, size]);\n const [busy, setBusy] = useState<ReadonlySet<string>>(new Set());\n const [rowErrors, setRowErrors] = useState<Readonly<Record<string, ContentKitError>>>({});\n const [bulk, setBulk] = useState<{ pending: boolean; summary?: string }>({ pending: false });\n const premium = tiers[0];\n const toggleable = (c: Content) => !!premium && (c.access.level === \"public\" || c.access.level === \"tier\");\n const nextRule = (c: Content, toPremium: boolean): Rule => (toPremium ? { level: \"tier\", tiers: [premium!] } : { level: \"public\" });\n const setAccess = async (c: Content, toPremium: boolean) => {\n setBusy((b) => new Set(b).add(c.id));\n setRowErrors(({ [c.id]: _, ...rest }) => rest);\n try {\n await client.contents.update(c.id, { access: nextRule(c, toPremium) });\n } catch (e) {\n const err = toContentKitError(e);\n setRowErrors((r) => ({ ...r, [c.id]: err }));\n } finally {\n setBusy((b) => {\n const n = new Set(b);\n n.delete(c.id);\n return n;\n });\n }\n };\n const remove = async (c: Content) => {\n if (await confirm({ title: t(\"contentManager.deleteTitle\", { title: c.title }), description: t(\"contentManager.deleteBody\"), confirm: t(\"contentManager.delete\") })) {\n await del.run(() => client.contents.remove(c.id));\n }\n };\n const chosen = items.filter((c) => selected.has(c.id));\n const runBulk = async (targets: Content[], fn: (c: Content) => Promise<unknown>) => {\n setBulk({ pending: true });\n const failed = await eachLimited(targets, fn);\n const done = targets.length - failed;\n setSelected(new Set());\n setBulk({\n pending: false,\n summary: failed ? t(\"contentManager.bulkPartial\", { done, total: targets.length, failed }) : m.plural(\"contentManager.bulkDone\", done),\n });\n };\n const bulkDelete = async () => {\n if (await confirm({ title: m.plural(\"contentManager.bulkDeleteTitle\", chosen.length), description: t(\"contentManager.bulkDeleteBody\"), confirm: t(\"contentManager.delete\") })) {\n await runBulk(chosen, (c) => client.contents.remove(c.id));\n }\n };\n const allChosen = items.length > 0 && chosen.length === items.length;\n return (\n <div className=\"grid gap-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <h2 className=\"text-base font-semibold\">{t(\"contentManager.title\")}</h2>\n <div className=\"flex gap-2\">\n {bulkable && !deleted && (\n <Button size=\"sm\" variant=\"outline\" aria-expanded={bulkOpen} onClick={() => setBulkOpen((o) => !o)}>\n {t(\"contentManager.bulkUpload\")}\n </Button>\n )}\n <Button size=\"sm\" onClick={() => loc.go(\"new\")}>\n {t(\"contentManager.new\")}\n </Button>\n </div>\n </div>\n {bulkable && bulkOpen && !deleted && (\n <section className=\"grid gap-3 rounded-lg border border-border p-3\" aria-label={t(\"contentManager.bulkUpload\")} data-ckui=\"bulk-upload\">\n <p className=\"text-sm text-muted-foreground\">{t(presentation === \"reader\" ? \"contentManager.bulkHintArchive\" : \"contentManager.bulkHintFile\")}</p>\n <UploadQueueBody\n client={client}\n createItem={createItem}\n target={(ref, file, signal) => uploadTarget(client, ref, file, signal)}\n accept={presentation === \"reader\" ? \".zip,application/zip\" : \"video/*\"}\n concurrency={2}\n storageKey={`ckui.bulk.${kind}`}\n onOpen={openDraft}\n onError={onError}\n />\n </section>\n )}\n <div className=\"flex gap-2\" role=\"group\" aria-label={t(\"contentManager.title\")}>\n <Button size=\"sm\" variant={deleted ? \"outline\" : \"default\"} aria-pressed={!deleted} onClick={() => loc.go(\"\", { q: query })}>\n {t(\"contentManager.items\")}\n </Button>\n <Button size=\"sm\" variant={deleted ? \"default\" : \"outline\"} aria-pressed={deleted} onClick={() => loc.go(\"\", { q: query, deleted: \"1\" })}>\n {t(\"contentManager.deleted\")}\n </Button>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <form\n className=\"min-w-48 flex-1\"\n role=\"search\"\n onSubmit={(e) => {\n e.preventDefault();\n filter({ q: text.trim() });\n }}\n >\n <Label htmlFor={`${ids}-q`} className=\"sr-only\">\n {t(\"contentManager.search\")}\n </Label>\n <Input id={`${ids}-q`} className=\"h-8\" type=\"search\" value={text} placeholder={t(\"contentManager.search\")} onChange={(e) => setText(e.target.value)} />\n </form>\n {!deleted && (\n <Select value={status} onValueChange={(v) => filter({ status: String(v ?? \"\") as typeof status })}>\n <SelectTrigger size=\"sm\" aria-label={t(\"contentManager.status\")}>\n <SelectValue>{(v: string) => t(v ? `contentManager.${v as (typeof states)[number]}` : \"contentManager.allStatuses\")}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"\">{t(\"contentManager.allStatuses\")}</SelectItem>\n {states.map((s) => (\n <SelectItem key={s} value={s}>\n {t(`contentManager.${s}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n <Select value={accessFilter} onValueChange={(v) => filter({ access: String(v ?? \"\") || undefined })}>\n <SelectTrigger size=\"sm\" aria-label={t(\"contentManager.access\")}>\n <SelectValue>\n {(v: string) =>\n !v\n ? t(\"contentManager.anyAccess\")\n : v.startsWith(\"tier:\")\n ? labelOf(labels, v.slice(5))\n : accessLabel(t, { level: v as Rule[\"level\"] }, labels)\n }\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"\">{t(\"contentManager.anyAccess\")}</SelectItem>\n <SelectItem value=\"public\">{t(\"contentManager.free\")}</SelectItem>\n {tiers.length > 0 && <SelectItem value=\"tier\">{t(\"contentManager.premium\")}</SelectItem>}\n {tiers.length > 1 &&\n tiers.map((x) => (\n <SelectItem key={x} value={`tier:${x}`}>\n {labelOf(labels, x)}\n </SelectItem>\n ))}\n {allowsIndividualSales(model, kind) && <SelectItem value=\"ppv\">{t(\"contentManager.ppv\")}</SelectItem>}\n </SelectContent>\n </Select>\n </div>\n <ErrorLine error={del.error} />\n {bulk.summary && (\n <p role=\"status\" className=\"text-sm text-muted-foreground\">\n {bulk.summary}\n </p>\n )}\n {selectable && chosen.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-2 rounded-lg border border-border bg-muted/40 p-2 text-sm\" data-ckui=\"bulk-bar\">\n <span className=\"font-medium\">{t(\"contentManager.selected\", { count: chosen.length })}</span>\n {deleted ? (\n <Button size=\"sm\" variant=\"outline\" disabled={bulk.pending} onClick={() => void runBulk(chosen, (c) => client.contents.restore(c.id))}>\n {t(\"moderation.restore\")}\n </Button>\n ) : (\n <>\n {premium && (\n <Button size=\"sm\" variant=\"outline\" disabled={bulk.pending} onClick={() => void runBulk(chosen.filter(toggleable), (c) => client.contents.update(c.id, { access: nextRule(c, true) }))}>\n {t(\"contentManager.makePremium\")}\n </Button>\n )}\n {premium && (\n <Button size=\"sm\" variant=\"outline\" disabled={bulk.pending} onClick={() => void runBulk(chosen.filter(toggleable), (c) => client.contents.update(c.id, { access: nextRule(c, false) }))}>\n {t(\"contentManager.makeFree\")}\n </Button>\n )}\n <Button size=\"sm\" variant=\"destructive\" disabled={bulk.pending} onClick={() => void bulkDelete()}>\n {t(\"contentManager.delete\")}\n </Button>\n </>\n )}\n <Button size=\"sm\" variant=\"ghost\" disabled={bulk.pending} onClick={() => setSelected(new Set())}>\n {t(\"contentManager.clearSelection\")}\n </Button>\n </div>\n )}\n {loading && !items.length ? (\n <Rows />\n ) : listing.error && !items.length ? (\n <LoadFailed error={listing.error} message={t(\"contentManager.loadFailed\")} retry={listing.reload} />\n ) : !items.length ? (\n <div className=\"grid justify-items-start gap-2\">\n <p className=\"text-muted-foreground\">{t(filtered ? \"contentManager.noMatches\" : deleted ? \"contentManager.noDeleted\" : \"contentManager.emptyAll\")}</p>\n {filtered ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => loc.go(\"\", { deleted: deleted ? \"1\" : undefined })}>\n {t(\"contentManager.clearFilters\")}\n </Button>\n ) : (\n !deleted && (\n <Button size=\"sm\" onClick={() => loc.go(\"new\")}>\n {t(\"contentManager.new\")}\n </Button>\n )\n )}\n </div>\n ) : (\n <ul className=\"grid divide-y divide-border rounded-lg border border-border\" aria-busy={loading}>\n {selectable && (\n <li className=\"flex items-center gap-3 px-3 py-2 text-xs text-muted-foreground\">\n <input\n type=\"checkbox\"\n className=\"size-4 shrink-0 accent-primary\"\n checked={allChosen}\n aria-label={t(\"contentManager.selectPage\")}\n onChange={(e) => setSelected(e.target.checked ? new Set(items.map((c) => c.id)) : new Set())}\n />\n <span>{t(\"contentManager.selectPage\")}</span>\n </li>\n )}\n {items.map((c) => {\n const s = contentStatus(c);\n const href = s === \"published\" ? contentHref?.(c) : undefined;\n const pending = busy.has(c.id);\n const isPremium = c.access.level === \"tier\";\n return (\n <li key={c.id} className=\"flex flex-wrap items-start gap-3 p-3\" data-ckui=\"content-row\" data-status={deleted ? \"deleted\" : s}>\n {selectable && (\n <input\n type=\"checkbox\"\n className=\"mt-1 size-4 shrink-0 accent-primary\"\n checked={selected.has(c.id)}\n aria-label={t(\"contentManager.select\", { title: c.title })}\n onChange={(e) =>\n setSelected((cur) => {\n const n = new Set(cur);\n if (e.target.checked) n.add(c.id);\n else n.delete(c.id);\n return n;\n })\n }\n />\n )}\n <RowCover url={c.cover?.url} />\n <div className=\"grid min-w-0 flex-1 gap-1\">\n {deleted ? (\n <span className=\"font-medium break-words line-through\">{c.title}</span>\n ) : (\n <button type=\"button\" className=\"text-left font-medium break-words hover:underline\" onClick={() => open(c)}>\n {c.title}\n </button>\n )}\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted-foreground\">\n {!deleted && <Badge variant={badge[s]}>{t(`contentManager.${s}`)}</Badge>}\n <Badge variant={isPremium ? \"secondary\" : \"outline\"} data-ckui=\"access-badge\">\n {accessLabel(t, c.access, labels)}\n </Badge>\n <span className=\"font-mono\">{c.code}</span>\n <span>{c.language}</span>\n {c.published_at && s === \"published\" ? (\n <time dateTime={c.published_at} title={formatDate(m, c.published_at)}>\n {t(\"contentManager.liveOn\", { date: formatDate(m, c.published_at, false) })}\n </time>\n ) : (\n <RelativeTime at={deleted && c.deleted_at ? c.deleted_at : c.updated_at} />\n )}\n {s === \"scheduled\" && c.publish_at && <span>{t(\"pollManager.goesLive\", { date: formatDate(m, c.publish_at) })}</span>}\n </div>\n <ErrorLine error={rowErrors[c.id] ?? null} />\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n {deleted ? (\n <Button size=\"sm\" variant=\"outline\" disabled={del.pending} onClick={() => void del.run(() => client.contents.restore(c.id))}>\n {t(\"moderation.restore\")}\n </Button>\n ) : (\n <>\n {toggleable(c) && (\n <Button size=\"sm\" variant=\"outline\" disabled={pending} aria-busy={pending} onClick={() => void setAccess(c, !isPremium)}>\n {pending && <Spinner />}\n {t(isPremium ? \"contentManager.makeFree\" : \"contentManager.makePremium\")}\n </Button>\n )}\n {href && (\n <a className={buttonVariants({ size: \"sm\", variant: \"ghost\" })} href={href}>\n {t(\"contentManager.view\")}\n </a>\n )}\n <Button size=\"sm\" variant=\"outline\" onClick={() => open(c)}>\n {t(\"comments.edit\")}\n </Button>\n <Button size=\"sm\" variant=\"destructive\" disabled={del.pending} onClick={() => void remove(c)}>\n {t(\"comments.delete\")}\n </Button>\n </>\n )}\n </div>\n </li>\n );\n })}\n </ul>\n )}\n <Pager\n page={page}\n hasNext={listing.hasNext}\n disabled={loading}\n total={total}\n truncated={counted.data?.truncated}\n pageSize={size}\n pageSizes={PAGE_SIZES}\n onPageSize={(n) => loc.go(\"\", { ...filters, size: n !== defaultSize ? n : undefined, page: undefined })}\n onPage={(n) => loc.go(\"\", { ...filters, page: n > 1 ? n : undefined })}\n />\n {dialog}\n </div>\n );\n}\n\n/** A row's portrait cover, or a quiet placeholder. */\nfunction RowCover({ url }: { url?: string }) {\n return url ? (\n <img src={url} alt=\"\" loading=\"lazy\" className=\"aspect-[7/10] w-12 shrink-0 rounded-sm bg-muted object-cover\" />\n ) : (\n <span aria-hidden className=\"grid aspect-[7/10] w-12 shrink-0 place-items-center rounded-sm bg-muted text-muted-foreground\">\n <HugeiconsIcon icon={Image01Icon} strokeWidth={1.5} className=\"size-5\" />\n </span>\n );\n}\n\nfunction Spinner() {\n return <span aria-hidden className=\"size-3 animate-spin rounded-full border-2 border-current border-t-transparent\" />;\n}\n\ninterface Form {\n title: string;\n description: string;\n publishAt: string;\n body: string;\n}\n\nconst empty: Form = { title: \"\", description: \"\", publishAt: \"\", body: \"\" };\n\nexport interface ContentEditorProps {\n /** Staff entity lookup, including internal classifications. */\n management?: boolean;\n /** The item edited; null creates one of kind. */\n id: string | null;\n kind: string;\n /** Languages to write in: codes, or codes with labels; the first is a new item's. */\n languages?: readonly Choice[];\n /** The body editor; without it, a plain HTML field. */\n renderEditor?: (props: BodyEditorProps) => ReactNode;\n /** A link to a live item's page. */\n contentHref?: (content: Content) => string | undefined;\n labels?: Labels;\n /** A new item's owner group: a channel its editors write for. */\n ownerGroup?: string;\n /** Entities a new item starts linked to, e.g. the series it was created from; ignored for an existing item. */\n entities?: readonly GroupCard[];\n /** After create: show the new item (the editor goes on editing it). */\n onCreated?: (content: Content) => void;\n onDeleted?: (content: Content) => void;\n client?: ContentKitClient;\n onError?: ContentKitErrorHandler;\n}\n\n/**\n * One content item for its creators and staff: title, description,\n * schedule, cover and body per language, publish, unpublish and delete;\n * then listing and attributes, access rule and price, versions and groups.\n */\nexport function ContentEditor(p:ContentEditorProps){\n const {client,scope}=useContentScope(p.client);\n const allocated=useRef<{id:string;session:number}|null>(null);\n const [session,setSession]=useState({id:p.id,kind:p.kind,client,scope,key:0});\n let boundary=session;\n if(session.id!==p.id||session.kind!==p.kind||session.client!==client||session.scope!==scope){\n const continues=session.id==null&&p.id===allocated.current?.id&&allocated.current?.session===session.key&&session.kind===p.kind&&session.client===client&&session.scope===scope;\n boundary={id:p.id,kind:p.kind,client,scope,key:continues?session.key:session.key+1};\n setSession(boundary);\n }\n const {kinds,error,reload}=useKinds({client});\n const {t}=useMessages();\n if(!kinds)return error?<LoadFailed error={error} message={t(\"contentManager.loadFailed\")} retry={reload}/>:<Rows/>;\n const props={...p,client,onCreated:(content:Content)=>{allocated.current={id:content.id,session:boundary.key};p.onCreated?.(content);}};\n if(kinds.kinds[p.kind]?.presentation===\"reader\")return <ReaderContentEditor key={boundary.key} {...props} model={kinds}/>;\n return <StandardContentEditor key={boundary.key} {...props}/>;\n}\n\nfunction StandardContentEditor({ id, client: own, kind, languages: offered, renderEditor, contentHref, labels, ownerGroup, entities, onCreated, onDeleted, onError, management }: ContentEditorProps) {\n const client = useContentKitClient(own);\n const m = useMessages();\n const { t } = m;\n const ids = useId();\n const languages = choices(offered);\n const [language, setLanguage] = useState(languages[0]?.value ?? \"en\");\n const ed = useContent(id, kind, language, { client });\n // A hidden version's cover is edited here; a visible version's in its own form.\n const model = useKinds({ client }).kinds;\n const hidden = !!model?.kinds[kind]?.versions.hidden;\n const report = useErrorReporter(onError);\n // The body is kept as stored (image references); the editor shows it with URLs.\n const [form, setForm] = useState<Form | null>(id ? null : empty);\n const [error, setError] = useState<ContentKitError | string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const { confirm, dialog } = useConfirm();\n const item = ed.content;\n useEffect(() => {\n if (!item) return;\n const stored = item.text?.[language];\n setForm((f) => f ?? { title: stored?.title ?? \"\", description: stored?.description ?? \"\", body: stored?.body ?? \"\",\n publishAt: item.publish_at && !item.live ? localInput(new Date(item.publish_at)) : \"\" });\n }, [item, language]);\n const { imageSrc } = ed;\n const shown = useMemo(\n () => (form?.body ?? \"\").replace(imageRefs(), (ref, name: string) => {\n const src = imageSrc(name);\n return src && src !== name ? src.replaceAll(\"&\", \"&\") : ref;\n }),\n [form?.body, imageSrc],\n );\n if (id && !form) {\n if (ed.error) return <LoadFailed error={ed.error} message={t(\"contentManager.loadFailed\")} retry={ed.reload} />;\n return (\n <div className=\"grid gap-3\" aria-busy>\n <Skeleton className=\"h-9 w-full\" />\n <Skeleton className=\"h-48 w-full\" />\n </div>\n );\n }\n const f = form!;\n const set = (patch: Partial<Form>) => setForm((cur) => ({ ...cur!, ...patch }));\n const fail = (e: unknown) => {\n const err = toContentKitError(e);\n setError(err);\n report(err, \"content.save\");\n };\n const text = () => ({ title: f.title.trim(), description: f.description.trim(), body: f.body });\n const save = async () => {\n setError(null);\n setNotice(null);\n if (!f.title.trim()) return setError(t(\"contentManager.titleRequired\"));\n try {\n if (!item) {\n const created = await ed.create({ kind, text: { [language]: text() }, owner_group_id: ownerGroup });\n // Starting entities link once the item exists; version-level kinds need a version first.\n const linked = (entities ?? []).filter((g) => model?.kinds[kind]?.entities?.includes(g.kind) && !model.entity_kinds[g.kind]?.version_level);\n if (linked.length) {\n await client.entities\n .setOfContent(created.id, { kinds: [...new Set(linked.map((g) => g.kind))], memberships: linked.map((g) => ({ group_id: g.id })) }, language)\n .catch(fail);\n }\n onCreated?.(created);\n return;\n }\n await ed.putText(text());\n setNotice(t(\"pollEditor.saved\"));\n } catch (e) {\n fail(e);\n }\n };\n const publish = async (live: boolean) => {\n setError(null);\n setNotice(null);\n try {\n if (live) await ed.publish(f.publishAt ? new Date(f.publishAt).toISOString() : undefined);\n else await ed.unpublish();\n setNotice(t(live ? \"contentManager.publishedNotice\" : \"contentManager.unpublishedNotice\"));\n } catch (e) {\n fail(e);\n }\n };\n const remove = async () => {\n if (!item || !(await confirm({ title: t(\"contentManager.deleteTitle\", { title: item.title }), description: t(\"contentManager.deleteBody\"), confirm: t(\"contentManager.delete\") }))) return;\n try {\n await ed.remove();\n onDeleted?.(item);\n } catch (e) {\n fail(e);\n }\n };\n const s = item ? contentStatus(item) : \"draft\";\n const href = item && s === \"published\" ? contentHref?.(item) : undefined;\n const editor: BodyEditorProps = {\n value: shown,\n onChange: (html) => set({ body: ed.storedBody(html) }),\n uploadImage: item ? (file) => ed.uploadImage(file) : undefined,\n disabled: ed.saving,\n placeholder: t(\"contentManager.bodyPlaceholder\"),\n \"aria-label\": t(\"contentManager.body\"),\n };\n return (\n <>\n <form\n className=\"grid gap-4\"\n data-ckui=\"content-form\"\n onSubmit={(e) => {\n e.preventDefault();\n void save();\n }}\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <h2 className=\"text-base font-semibold\">{t(item ? \"contentManager.editTitle\" : \"contentManager.newTitle\")}</h2>\n {item && <Badge variant={badge[s]}>{t(`contentManager.${s}`)}</Badge>}\n {href && (\n <a className=\"text-xs text-muted-foreground hover:underline\" href={href}>\n {t(\"contentManager.view\")}\n </a>\n )}\n </div>\n {item?.moderation && (\n <Alert variant={item.moderation === \"rejected\" ? \"destructive\" : \"default\"}>\n <AlertDescription>\n {item.moderation_reason\n ? t(`contentManager.${item.moderation === \"rejected\" ? \"rejectedBecause\" : \"heldBecause\"}`, { reason: item.moderation_reason })\n : t(`contentManager.${item.moderation === \"rejected\" ? \"rejectedNote\" : \"heldNote\"}`)}\n </AlertDescription>\n </Alert>\n )}\n {languages.length > 1 && (\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-lang`}>{t(\"contentManager.language\")}</Label>\n <Select\n value={language}\n onValueChange={(v) => {\n setLanguage(String(v ?? \"\"));\n setForm(item ? null : empty);\n }}\n >\n <SelectTrigger id={`${ids}-lang`} className=\"w-full\">\n <SelectValue>{(v: string) => languages.find((l) => l.value === v)?.label ?? v}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n {languages.map((l) => (\n <SelectItem key={l.value} value={l.value}>\n {l.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-title`}>{t(\"contentManager.itemTitle\")}</Label>\n <Input id={`${ids}-title`} value={f.title} required maxLength={300} onChange={(e) => set({ title: e.target.value })} />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-publish`}>{t(\"contentManager.publishAt\")}</Label>\n <Input id={`${ids}-publish`} type=\"datetime-local\" value={f.publishAt} onChange={(e) => set({ publishAt: e.target.value })} />\n </div>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-description`}>{t(\"contentManager.description\")}</Label>\n <Textarea id={`${ids}-description`} rows={2} value={f.description} onChange={(e) => set({ description: e.target.value })} />\n </div>\n {(hidden || !item) && <Cover item={item} src={ed.coverSrc} saving={ed.saving} onFile={(file) => void ed.setCover(file).catch(fail)} />}\n <div className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium\">{t(\"contentManager.body\")}</span>\n {renderEditor ? renderEditor(editor) : <Textarea aria-label={editor[\"aria-label\"]} rows={12} value={f.body} placeholder={editor.placeholder} onChange={(e) => set({ body: e.target.value })} />}\n {!item && <p className=\"text-xs text-muted-foreground\">{t(\"contentManager.imagesAfterCreate\")}</p>}\n </div>\n {error && <ErrorLine>{typeof error === \"string\" ? error : contentError(m, error)}</ErrorLine>}\n {notice && !error && (\n <p role=\"status\" className=\"text-sm text-muted-foreground\">\n {notice}\n </p>\n )}\n <div className=\"flex flex-wrap gap-2 border-t border-border pt-4\">\n <Button type=\"submit\" disabled={ed.saving}>\n {ed.saving ? t(\"common.saving\") : t(item ? \"common.save\" : \"contentManager.createDraft\")}\n </Button>\n {item && !item.live && (\n <Button type=\"button\" variant=\"outline\" disabled={ed.saving} onClick={() => void publish(true)}>\n {t(\"contentManager.publish\")}\n </Button>\n )}\n {item?.state === \"published\" && (\n <Button type=\"button\" variant=\"outline\" disabled={ed.saving} onClick={() => void publish(false)}>\n {t(\"contentManager.unpublish\")}\n </Button>\n )}\n {item && (\n <Button type=\"button\" variant=\"destructive\" className=\"ms-auto\" disabled={ed.saving} onClick={() => void remove()}>\n {t(\"contentManager.delete\")}\n </Button>\n )}\n </div>\n {dialog}\n </form>\n {item && <ContentSections management={management} content={item} client={client} onError={onError} labels={labels} />}\n </>\n );\n}\n\nfunction Cover({ item, src, saving, onFile }: { item: Content | null; src?: string; saving: boolean; onFile: (file: File | null) => void }) {\n const { t } = useMessages();\n const file = useRef<HTMLInputElement>(null);\n return (\n <div className=\"grid gap-1.5\" data-ckui=\"content-cover\">\n <span className=\"text-sm font-medium\">{t(\"contentManager.cover\")}</span>\n {item ? (\n <div className=\"flex flex-wrap items-center gap-3\">\n {src ? <img src={src} alt=\"\" className=\"h-20 w-36 rounded-md border border-border object-cover\" /> : <span className=\"text-muted-foreground\">{t(\"contentManager.noCover\")}</span>}\n <Button type=\"button\" size=\"sm\" variant=\"outline\" disabled={saving} onClick={() => file.current?.click()}>\n {t(src ? \"pollEditor.replaceImage\" : \"contentManager.addCover\")}\n </Button>\n {src && (\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" disabled={saving} onClick={() => onFile(null)}>\n {t(\"pollEditor.removeImage\")}\n </Button>\n )}\n <input\n ref={file}\n type=\"file\"\n accept=\"image/*\"\n hidden\n aria-label={t(\"contentManager.cover\")}\n onChange={(e) => {\n const f = e.target.files?.[0];\n e.target.value = \"\";\n if (f) onFile(f);\n }}\n />\n </div>\n ) : (\n <p className=\"text-xs text-muted-foreground\">{t(\"contentManager.imagesAfterCreate\")}</p>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|