@openrails/contentkit-ui 0.103.2 → 0.104.0-rc.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/README.md +111 -49
- package/dist/client/beacons.d.ts +3 -13
- package/dist/client/beacons.js +8 -46
- package/dist/client/beacons.js.map +1 -1
- package/dist/client/client.d.ts +3 -0
- package/dist/client/client.js +45 -43
- package/dist/client/client.js.map +1 -1
- package/dist/client/content/favorites.d.ts +2 -0
- package/dist/client/content/favorites.js.map +1 -1
- package/dist/client/content/types.d.ts +3 -0
- package/dist/client/content/types.js.map +1 -1
- package/dist/client/contents.d.ts +7 -1
- package/dist/client/contents.js +8 -0
- package/dist/client/contents.js.map +1 -1
- package/dist/client/discovery.d.ts +34 -5
- package/dist/client/discovery.js +23 -2
- package/dist/client/discovery.js.map +1 -1
- package/dist/client/engagement.d.ts +70 -0
- package/dist/client/engagement.js +191 -0
- package/dist/client/engagement.js.map +1 -0
- package/dist/client/generated/routes.d.ts +74 -35
- package/dist/client/generated/routes.js +119 -60
- package/dist/client/generated/routes.js.map +1 -1
- package/dist/client/generated/wire.d.ts +88 -85
- package/dist/client/generated/wire.js.map +1 -1
- package/dist/client/guest-reading-history.d.ts +40 -0
- package/dist/client/guest-reading-history.js +144 -0
- package/dist/client/guest-reading-history.js.map +1 -0
- package/dist/client/index.d.ts +5 -3
- package/dist/client/media/windows.d.ts +2 -0
- package/dist/client/media/windows.js +4 -1
- package/dist/client/media/windows.js.map +1 -1
- package/dist/client/stats.d.ts +4 -20
- package/dist/client/stats.js +0 -11
- package/dist/client/stats.js.map +1 -1
- package/dist/client/versions.d.ts +8 -6
- package/dist/client/versions.js +15 -10
- package/dist/client/versions.js.map +1 -1
- package/dist/client.js +24 -22
- package/dist/components/admin/bulk-drafts.d.ts +17 -0
- package/dist/components/admin/bulk-drafts.js +41 -0
- package/dist/components/admin/bulk-drafts.js.map +1 -0
- package/dist/components/admin/content-admin.d.ts +1 -1
- package/dist/components/admin/content-admin.js.map +1 -1
- package/dist/components/admin/content-manager.d.ts +11 -3
- package/dist/components/admin/content-manager.js +751 -394
- package/dist/components/admin/content-manager.js.map +1 -1
- package/dist/components/admin/group-manager.d.ts +8 -3
- package/dist/components/admin/group-manager.js +218 -146
- package/dist/components/admin/group-manager.js.map +1 -1
- package/dist/components/admin/page-notices.d.ts +16 -0
- package/dist/components/admin/page-notices.js +113 -0
- package/dist/components/admin/page-notices.js.map +1 -0
- package/dist/components/admin/page-picker.d.ts +38 -0
- package/dist/components/admin/page-picker.js +159 -0
- package/dist/components/admin/page-picker.js.map +1 -0
- package/dist/components/admin/quick-search.d.ts +14 -0
- package/dist/components/admin/quick-search.js +60 -0
- package/dist/components/admin/quick-search.js.map +1 -0
- package/dist/components/admin/reader-content-editor.js +382 -321
- package/dist/components/admin/reader-content-editor.js.map +1 -1
- package/dist/components/admin/reader-manifest.js +181 -179
- package/dist/components/admin/reader-manifest.js.map +1 -1
- package/dist/components/admin/shell.d.ts +10 -2
- package/dist/components/admin/shell.js +114 -42
- package/dist/components/admin/shell.js.map +1 -1
- package/dist/components/admin/stats-dashboard.d.ts +4 -9
- package/dist/components/admin/stats-dashboard.js +303 -207
- package/dist/components/admin/stats-dashboard.js.map +1 -1
- package/dist/components/admin/upload-queue.d.ts +14 -0
- package/dist/components/admin/upload-queue.js +115 -98
- package/dist/components/admin/upload-queue.js.map +1 -1
- package/dist/components/content/card.d.ts +31 -3
- package/dist/components/content/card.js +324 -158
- package/dist/components/content/card.js.map +1 -1
- package/dist/components/content/daily-releases.js +144 -190
- package/dist/components/content/daily-releases.js.map +1 -1
- package/dist/components/content/editor-save.js +27 -25
- package/dist/components/content/editor-save.js.map +1 -1
- package/dist/components/content/editors.js +274 -253
- package/dist/components/content/editors.js.map +1 -1
- package/dist/components/content/favorites.d.ts +6 -0
- package/dist/components/content/favorites.js +47 -0
- package/dist/components/content/favorites.js.map +1 -0
- package/dist/components/content/filter-dialog.js +19 -15
- package/dist/components/content/filter-dialog.js.map +1 -1
- package/dist/components/content/filters.d.ts +2 -0
- package/dist/components/content/filters.js +5 -1
- package/dist/components/content/filters.js.map +1 -1
- package/dist/components/content/grid.d.ts +44 -16
- package/dist/components/content/grid.js +308 -270
- package/dist/components/content/grid.js.map +1 -1
- package/dist/components/content/history.d.ts +6 -0
- package/dist/components/content/history.js +111 -0
- package/dist/components/content/history.js.map +1 -0
- package/dist/components/content/index.d.ts +6 -3
- package/dist/components/content/listing.d.ts +14 -3
- package/dist/components/content/listing.js +65 -56
- package/dist/components/content/listing.js.map +1 -1
- package/dist/components/content/offer-fields.js +6 -6
- package/dist/components/content/paged-grid.d.ts +10 -0
- package/dist/components/content/paged-grid.js +116 -0
- package/dist/components/content/paged-grid.js.map +1 -0
- package/dist/components/content/pagination.d.ts +19 -0
- package/dist/components/content/pagination.js +97 -0
- package/dist/components/content/pagination.js.map +1 -0
- package/dist/components/content/paywall.d.ts +9 -0
- package/dist/components/content/paywall.js +27 -3
- package/dist/components/content/paywall.js.map +1 -1
- package/dist/components/content/post-list.d.ts +37 -0
- package/dist/components/content/post-list.js +203 -0
- package/dist/components/content/post-list.js.map +1 -0
- package/dist/components/content/reader-settings.d.ts +2 -0
- package/dist/components/content/reader-settings.js +1 -1
- package/dist/components/content/reader-settings.js.map +1 -1
- package/dist/components/content/search.d.ts +11 -4
- package/dist/components/content/search.js +22 -11
- package/dist/components/content/search.js.map +1 -1
- package/dist/components/content/summary-tile.d.ts +14 -0
- package/dist/components/content/summary-tile.js +63 -0
- package/dist/components/content/summary-tile.js.map +1 -0
- package/dist/components/groups/banner.d.ts +6 -2
- package/dist/components/groups/banner.js +79 -61
- package/dist/components/groups/banner.js.map +1 -1
- package/dist/components/groups/directory.d.ts +12 -2
- package/dist/components/groups/directory.js +168 -105
- package/dist/components/groups/directory.js.map +1 -1
- package/dist/components/groups/editor.js +10 -10
- package/dist/components/groups/editor.js.map +1 -1
- package/dist/components/groups/entity-chips.d.ts +61 -0
- package/dist/components/groups/entity-chips.js +382 -0
- package/dist/components/groups/entity-chips.js.map +1 -0
- package/dist/components/groups/group-members.d.ts +29 -0
- package/dist/components/groups/group-members.js +474 -0
- package/dist/components/groups/group-members.js.map +1 -0
- package/dist/components/groups/header.js +53 -45
- package/dist/components/groups/header.js.map +1 -1
- package/dist/components/groups/index.d.ts +3 -1
- package/dist/components/groups/memberships.d.ts +3 -36
- package/dist/components/groups/memberships.js +105 -480
- package/dist/components/groups/memberships.js.map +1 -1
- package/dist/components/groups/scoped.d.ts +23 -0
- package/dist/components/groups/scoped.js +92 -0
- package/dist/components/groups/scoped.js.map +1 -0
- package/dist/components/media-folder-editor.d.ts +5 -0
- package/dist/components/media-folder-editor.js +419 -231
- package/dist/components/media-folder-editor.js.map +1 -1
- package/dist/components/sortable-list.d.ts +5 -1
- package/dist/components/sortable-list.js +97 -81
- package/dist/components/sortable-list.js.map +1 -1
- package/dist/components/video-mini-player.d.ts +4 -1
- package/dist/components/video-mini-player.js +77 -71
- package/dist/components/video-mini-player.js.map +1 -1
- package/dist/components/video-player.d.ts +4 -1
- package/dist/components/video-player.js +280 -276
- package/dist/components/video-player.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +41 -34
- package/dist/locales/admin/de.js +80 -47
- package/dist/locales/admin/de.js.map +1 -1
- package/dist/locales/admin/en.d.ts +74 -41
- package/dist/locales/admin/en.js +80 -47
- package/dist/locales/admin/en.js.map +1 -1
- package/dist/locales/admin/es.js +80 -47
- package/dist/locales/admin/es.js.map +1 -1
- package/dist/locales/admin/ja.js +80 -47
- package/dist/locales/admin/ja.js.map +1 -1
- package/dist/locales/admin/ko.js +80 -47
- package/dist/locales/admin/ko.js.map +1 -1
- package/dist/locales/admin/zh.js +80 -47
- package/dist/locales/admin/zh.js.map +1 -1
- package/dist/locales/de.js +1 -0
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/discovery/de.js +25 -2
- package/dist/locales/discovery/de.js.map +1 -1
- package/dist/locales/discovery/en.d.ts +24 -1
- package/dist/locales/discovery/en.js +25 -2
- package/dist/locales/discovery/en.js.map +1 -1
- package/dist/locales/discovery/es.js +25 -2
- package/dist/locales/discovery/es.js.map +1 -1
- package/dist/locales/discovery/ja.js +25 -2
- package/dist/locales/discovery/ja.js.map +1 -1
- package/dist/locales/discovery/ko.js +25 -2
- package/dist/locales/discovery/ko.js.map +1 -1
- package/dist/locales/discovery/zh.js +25 -2
- package/dist/locales/discovery/zh.js.map +1 -1
- package/dist/locales/en.d.ts +119 -44
- package/dist/locales/en.js +1 -0
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es.js +1 -0
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/groups/de.js +22 -4
- package/dist/locales/groups/de.js.map +1 -1
- package/dist/locales/groups/en.d.ts +20 -2
- package/dist/locales/groups/en.js +22 -4
- package/dist/locales/groups/en.js.map +1 -1
- package/dist/locales/groups/es.js +22 -4
- package/dist/locales/groups/es.js.map +1 -1
- package/dist/locales/groups/ja.js +22 -4
- package/dist/locales/groups/ja.js.map +1 -1
- package/dist/locales/groups/ko.js +22 -4
- package/dist/locales/groups/ko.js.map +1 -1
- package/dist/locales/groups/zh.js +22 -4
- package/dist/locales/groups/zh.js.map +1 -1
- package/dist/locales/ja.js +1 -0
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.js +1 -0
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/zh.js +1 -0
- package/dist/locales/zh.js.map +1 -1
- package/dist/react/discovery.d.ts +36 -17
- package/dist/react/discovery.js +305 -221
- package/dist/react/discovery.js.map +1 -1
- package/dist/react/groups.d.ts +19 -3
- package/dist/react/groups.js +49 -22
- package/dist/react/groups.js.map +1 -1
- package/dist/react/index.d.ts +7 -4
- package/dist/react/page-notices.d.ts +13 -0
- package/dist/react/page-notices.js +38 -0
- package/dist/react/page-notices.js.map +1 -0
- package/dist/react/post-reads.d.ts +23 -0
- package/dist/react/post-reads.js +90 -0
- package/dist/react/post-reads.js.map +1 -0
- package/dist/react/remembered-sort.d.ts +5 -0
- package/dist/react/remembered-sort.js +29 -0
- package/dist/react/remembered-sort.js.map +1 -0
- package/dist/react/resources.d.ts +3 -1
- package/dist/react/resources.js +6 -2
- package/dist/react/resources.js.map +1 -1
- package/dist/react/stats.d.ts +3 -7
- package/dist/react/stats.js +2 -6
- package/dist/react/stats.js.map +1 -1
- package/dist/react/use-engagement.d.ts +28 -0
- package/dist/react/use-engagement.js +226 -0
- package/dist/react/use-engagement.js.map +1 -0
- package/dist/react/use-resource.d.ts +4 -3
- package/dist/react/use-resource.js +2 -1
- package/dist/react/use-resource.js.map +1 -1
- package/dist/react.js +29 -26
- package/dist/styles.css +1 -1
- package/dist/ui/dialog.d.ts +2 -1
- package/dist/ui/dialog.js +23 -20
- package/dist/ui/dialog.js.map +1 -1
- package/dist/urls/index.d.ts +1 -1
- package/dist/urls.js +2 -2
- package/dist/urls.js.map +1 -1
- package/package.json +1 -1
- package/dist/components/admin/page-review.d.ts +0 -13
- package/dist/components/admin/page-review.js +0 -225
- package/dist/components/admin/page-review.js.map +0 -1
- package/dist/react/page-review.d.ts +0 -14
- package/dist/react/page-review.js +0 -37
- package/dist/react/page-review.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-admin.js","names":[],"sources":["../../../src/components/admin/content-admin.tsx"],"sourcesContent":["import { useId, useState } from \"react\";\nimport type { ContentKitClient } from \"../../client/client.js\";\nimport type { ContentModel } from \"../../client/generated/wire.js\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport { useAdminLocation, useFlowClient, type AdminLocation, type AdminNavigation } from \"../../react/admin.js\";\nimport { useKinds } from \"../../react/groups.js\";\nimport { useReadScope } from \"../../react/context.js\";\nimport { Button } from \"#ckui/ui/button\";\nimport { labelOf, type Labels } from \"../groups/parts.js\";\nimport { CommentModeration, type CommentModerationProps } from \"../social/moderation.js\";\nimport { ContentManager, type ContentManagerProps } from \"./content-manager.js\";\nimport { GroupManager, type GroupManagerProps } from \"./group-manager.js\";\nimport { PollManager, type PollManagerProps } from \"./poll-manager.js\";\nimport { AdminRoot, LoadFailed, Rows, type AdminFlowProps, type AdminRouteProps } from \"./shell.js\";\nimport { StatsDashboard } from \"./stats-dashboard.js\";\n\nexport type ContentAdminSection = \"contents\" | \"groups\" | \"moderation\" | \"polls\" | \"statistics\";\n\n/** An optional reference workbench; each section remains usable as its own component. */\nexport interface ContentAdminProps extends AdminFlowProps, AdminRouteProps {\n /** Sections in navigation order. Default all. Navigation does not grant access. */\n sections?: readonly ContentAdminSection[];\n /** Content kinds in picker order; default all configured kinds. Unknown kinds are omitted. */\n contentKinds?: readonly string[];\n /** Group kinds in picker order; default the configured site-owned kinds. Unknown kinds are omitted. */\n groupKinds?: readonly string[];\n labels?: Labels;\n content?: Pick<ContentManagerProps, \"renderEditor\" | \"contentHref\">;\n groups?: Pick<GroupManagerProps, \"renderContent\">;\n moderation?: Pick<CommentModerationProps, \"itemHref\" | \"userHref\" | \"sections\">;\n polls?: Pick<PollManagerProps, \"freeText\" | \"maxOptions\">;\n}\n\nconst SECTIONS: readonly ContentAdminSection[] = [\"contents\", \"groups\", \"moderation\", \"polls\", \"statistics\"];\nconst MODERATION: readonly string[] = [\"comments\", \"queue\", \"bans\", \"words\", \"ips\"];\n\n/**\n * Model-driven content, group, moderation, poll and statistics screens, with\n * the host's transport, router and theme. Only the selected manager mounts;\n * its native permissions and refusals remain authoritative. This component\n * does not mount a server portal, sign users in or define a publishing workflow.\n */\nexport function ContentAdmin({ client: own, baseUrl, auth, guard, appearance, className, language, messages, ...p }: ContentAdminProps) {\n const client = useFlowClient({ client: own, baseUrl, auth });\n const scope = useReadScope();\n const [boundary, setBoundary] = useState({ client, scope, revision: 0 });\n if (boundary.client !== client || boundary.scope !== scope) {\n setBoundary({ client, scope, revision: boundary.revision + 1 });\n }\n return (\n <AdminRoot flow=\"content-admin\" guard={guard} appearance={appearance} className={className} language={language} messages={messages}>\n <Workbench key={boundary.revision} {...p} client={client} guard={guard} />\n </AdminRoot>\n );\n}\n\ntype WorkbenchProps = Omit<ContentAdminProps, \"client\" | \"baseUrl\" | \"auth\" | \"appearance\" | \"className\" | \"language\" | \"messages\"> & { client: ContentKitClient };\n\nfunction knownKinds(wanted: readonly string[] | undefined, configured: object): string[] {\n return [...new Set(wanted ?? Object.keys(configured).sort())].filter((kind) => Object.hasOwn(configured, kind));\n}\n\nfunction groupKinds(wanted: readonly string[] | undefined, model: ContentModel): string[] {\n return knownKinds(wanted ?? Object.keys(model.entity_kinds).filter((kind) => model.entity_kinds[kind]?.owner !== \"user\").sort(), model.entity_kinds);\n}\n\nfunction decode(part: string | undefined): string | undefined {\n if (part === undefined) return undefined;\n try { return decodeURIComponent(part); } catch { return undefined; }\n}\n\n/** Routes nested managers through the same outer history, including memory-only use. */\nfunction childNavigation(base: string, view: string, loc: AdminLocation): AdminNavigation {\n return {\n pathname: `${base}/${view}`,\n search: loc.query.size ? `?${loc.query}` : \"\",\n navigate(to, options) {\n const target = new URL(to, \"https://contentkit.invalid\");\n if (target.origin !== \"https://contentkit.invalid\") return;\n const prefix = `${base}/`;\n if (target.pathname !== base && !target.pathname.startsWith(prefix)) return;\n loc.go(target.pathname.slice(prefix.length), Object.fromEntries(target.searchParams), options);\n },\n };\n}\n\nfunction Workbench({ client, basePath, navigation, sections: wanted, contentKinds: requestedContents, groupKinds: requestedGroups, labels, guard, onError, content, groups, moderation, polls }: WorkbenchProps) {\n const { t } = useMessages();\n const id = useId();\n const loc = useAdminLocation(basePath, navigation);\n const model = useKinds({ client });\n if (model.loading) return <Rows />;\n if (!model.kinds) return <LoadFailed error={model.error} message={t(\"contentAdmin.modelFailed\")} retry={model.reload} />;\n\n const kinds = knownKinds(requestedContents, model.kinds.kinds);\n const managedGroups = groupKinds(requestedGroups, model.kinds);\n const sections = [...new Set(wanted ?? SECTIONS)].filter((section) =>\n SECTIONS.includes(section) &&\n (section !== \"contents\" && section !== \"statistics\" || kinds.length > 0) &&\n (section !== \"groups\" || managedGroups.length > 0) &&\n (section !== \"moderation\" || moderation?.sections?.length !== 0),\n );\n if (!sections.length) return <p role=\"status\" className=\"text-muted-foreground\">{t(\"contentAdmin.empty\")}</p>;\n\n const parts = loc.view.split(\"/\");\n const section = (loc.view ? parts[0] : sections[0]) as ContentAdminSection;\n const requestedKind = parts[1] === undefined ? undefined : decode(parts[1]);\n const kind = requestedKind ?? kinds[0]!;\n const moderationSections: readonly string[] = moderation?.sections ?? MODERATION;\n const valid = sections.includes(section) &&\n (section !== \"contents\" || (parts[1] === undefined || requestedKind !== undefined) && kinds.includes(kind)) &&\n (section !== \"groups\" || parts[1] === undefined || requestedKind !== undefined && managedGroups.includes(requestedKind)) &&\n (section !== \"moderation\" || !parts[1] || moderationSections.includes(parts[1])) &&\n (section !== \"statistics\" || parts.length === 1 || !loc.view);\n const base = basePath?.replace(/\\/+$/, \"\") ?? \"\";\n const prefix = section === \"contents\" ? `contents/${encodeURIComponent(kind)}` : section;\n const view = loc.view || prefix;\n // A contents root selects the first configured kind without changing the URL.\n const effectiveView = section === \"contents\" && parts[1] === undefined ? prefix : view;\n const nav = childNavigation(base, effectiveView, loc);\n const shared = { client, guard, onError };\n const names: Record<ContentAdminSection, string> = {\n contents: t(\"contentManager.title\"), groups: t(\"contentAdmin.groups\"), moderation: t(\"moderation.title\"), polls: t(\"pollManager.title\"), statistics: t(\"stats.title\"),\n };\n const destination = (s: ContentAdminSection) => s === \"contents\" ? `contents/${encodeURIComponent(kinds[0]!)}` : s;\n\n return (\n <>\n <h1 className=\"text-lg font-semibold\">{t(\"contentAdmin.title\")}</h1>\n <div className=\"grid min-w-0 gap-4 sm:grid-cols-[12rem_minmax(0,1fr)]\">\n <nav aria-label={t(\"contentAdmin.navigation\")} className=\"flex gap-1 overflow-x-auto sm:grid sm:content-start\">\n {sections.map((s) => (\n <Button key={s} variant={section === s ? \"secondary\" : \"ghost\"} className=\"justify-start whitespace-nowrap\" aria-current={section === s ? \"page\" : undefined} onClick={() => loc.go(destination(s))}>\n {names[s]}\n </Button>\n ))}\n </nav>\n <div className=\"grid min-w-0 content-start gap-4\" data-ckui=\"content-admin-view\">\n {!valid ? (\n <div className=\"grid justify-items-start gap-2\">\n <p role=\"status\">{t(\"contentAdmin.unavailable\")}</p>\n <Button variant=\"outline\" onClick={() => loc.go(\"\")}>{t(\"contentAdmin.back\")}</Button>\n </div>\n ) : section === \"contents\" ? (\n <>\n <label className=\"grid justify-items-start gap-1 text-sm\" htmlFor={`${id}-kind`}>\n {t(\"contentAdmin.kind\")}\n <select id={`${id}-kind`} className=\"h-8 rounded-md border border-input bg-background px-2 text-sm\" value={kind} onChange={(event) => loc.go(`contents/${encodeURIComponent(event.target.value)}`)}>\n {kinds.map((k) => <option key={k} value={k}>{labelOf(labels, k)}</option>)}\n </select>\n </label>\n <ContentManager key={kind} {...shared} {...content} kind={kind} labels={labels} languages={model.kinds.languages} basePath={`${base}/${prefix}`} navigation={nav} />\n </>\n ) : section === \"groups\" ? (\n <GroupManager {...shared} {...groups} labels={labels} groupKinds={managedGroups} basePath={`${base}/groups`} navigation={nav} />\n ) : section === \"moderation\" ? (\n <CommentModeration {...shared} {...moderation} contentKinds={kinds.map((value) => ({ value, label: labelOf(labels, value) }))} basePath={`${base}/moderation`} navigation={nav} />\n ) : section === \"polls\" ? (\n <PollManager {...shared} {...polls} languages={model.kinds.languages} basePath={`${base}/polls`} navigation={nav} />\n ) : (\n <StatsDashboard {...shared} kinds={kinds.map((value) => ({ value, label: labelOf(labels, value) }))} />\n )}\n </div>\n </div>\n </>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"content-admin.js","names":[],"sources":["../../../src/components/admin/content-admin.tsx"],"sourcesContent":["import { useId, useState } from \"react\";\nimport type { ContentKitClient } from \"../../client/client.js\";\nimport type { ContentModel } from \"../../client/generated/wire.js\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport { useAdminLocation, useFlowClient, type AdminLocation, type AdminNavigation } from \"../../react/admin.js\";\nimport { useKinds } from \"../../react/groups.js\";\nimport { useReadScope } from \"../../react/context.js\";\nimport { Button } from \"#ckui/ui/button\";\nimport { labelOf, type Labels } from \"../groups/parts.js\";\nimport { CommentModeration, type CommentModerationProps } from \"../social/moderation.js\";\nimport { ContentManager, type ContentManagerProps } from \"./content-manager.js\";\nimport { GroupManager, type GroupManagerProps } from \"./group-manager.js\";\nimport { PollManager, type PollManagerProps } from \"./poll-manager.js\";\nimport { AdminRoot, LoadFailed, Rows, type AdminFlowProps, type AdminRouteProps } from \"./shell.js\";\nimport { StatsDashboard } from \"./stats-dashboard.js\";\n\nexport type ContentAdminSection = \"contents\" | \"groups\" | \"moderation\" | \"polls\" | \"statistics\";\n\n/** An optional reference workbench; each section remains usable as its own component. */\nexport interface ContentAdminProps extends AdminFlowProps, AdminRouteProps {\n /** Sections in navigation order. Default all. Navigation does not grant access. */\n sections?: readonly ContentAdminSection[];\n /** Content kinds in picker order; default all configured kinds. Unknown kinds are omitted. */\n contentKinds?: readonly string[];\n /** Group kinds in picker order; default the configured site-owned kinds. Unknown kinds are omitted. */\n groupKinds?: readonly string[];\n labels?: Labels;\n content?: Pick<ContentManagerProps, \"renderEditor\" | \"contentHref\">;\n groups?: Pick<GroupManagerProps, \"renderContent\" | \"contentHref\">;\n moderation?: Pick<CommentModerationProps, \"itemHref\" | \"userHref\" | \"sections\">;\n polls?: Pick<PollManagerProps, \"freeText\" | \"maxOptions\">;\n}\n\nconst SECTIONS: readonly ContentAdminSection[] = [\"contents\", \"groups\", \"moderation\", \"polls\", \"statistics\"];\nconst MODERATION: readonly string[] = [\"comments\", \"queue\", \"bans\", \"words\", \"ips\"];\n\n/**\n * Model-driven content, group, moderation, poll and statistics screens, with\n * the host's transport, router and theme. Only the selected manager mounts;\n * its native permissions and refusals remain authoritative. This component\n * does not mount a server portal, sign users in or define a publishing workflow.\n */\nexport function ContentAdmin({ client: own, baseUrl, auth, guard, appearance, className, language, messages, ...p }: ContentAdminProps) {\n const client = useFlowClient({ client: own, baseUrl, auth });\n const scope = useReadScope();\n const [boundary, setBoundary] = useState({ client, scope, revision: 0 });\n if (boundary.client !== client || boundary.scope !== scope) {\n setBoundary({ client, scope, revision: boundary.revision + 1 });\n }\n return (\n <AdminRoot flow=\"content-admin\" guard={guard} appearance={appearance} className={className} language={language} messages={messages}>\n <Workbench key={boundary.revision} {...p} client={client} guard={guard} />\n </AdminRoot>\n );\n}\n\ntype WorkbenchProps = Omit<ContentAdminProps, \"client\" | \"baseUrl\" | \"auth\" | \"appearance\" | \"className\" | \"language\" | \"messages\"> & { client: ContentKitClient };\n\nfunction knownKinds(wanted: readonly string[] | undefined, configured: object): string[] {\n return [...new Set(wanted ?? Object.keys(configured).sort())].filter((kind) => Object.hasOwn(configured, kind));\n}\n\nfunction groupKinds(wanted: readonly string[] | undefined, model: ContentModel): string[] {\n return knownKinds(wanted ?? Object.keys(model.entity_kinds).filter((kind) => model.entity_kinds[kind]?.owner !== \"user\").sort(), model.entity_kinds);\n}\n\nfunction decode(part: string | undefined): string | undefined {\n if (part === undefined) return undefined;\n try { return decodeURIComponent(part); } catch { return undefined; }\n}\n\n/** Routes nested managers through the same outer history, including memory-only use. */\nfunction childNavigation(base: string, view: string, loc: AdminLocation): AdminNavigation {\n return {\n pathname: `${base}/${view}`,\n search: loc.query.size ? `?${loc.query}` : \"\",\n navigate(to, options) {\n const target = new URL(to, \"https://contentkit.invalid\");\n if (target.origin !== \"https://contentkit.invalid\") return;\n const prefix = `${base}/`;\n if (target.pathname !== base && !target.pathname.startsWith(prefix)) return;\n loc.go(target.pathname.slice(prefix.length), Object.fromEntries(target.searchParams), options);\n },\n };\n}\n\nfunction Workbench({ client, basePath, navigation, sections: wanted, contentKinds: requestedContents, groupKinds: requestedGroups, labels, guard, onError, content, groups, moderation, polls }: WorkbenchProps) {\n const { t } = useMessages();\n const id = useId();\n const loc = useAdminLocation(basePath, navigation);\n const model = useKinds({ client });\n if (model.loading) return <Rows />;\n if (!model.kinds) return <LoadFailed error={model.error} message={t(\"contentAdmin.modelFailed\")} retry={model.reload} />;\n\n const kinds = knownKinds(requestedContents, model.kinds.kinds);\n const managedGroups = groupKinds(requestedGroups, model.kinds);\n const sections = [...new Set(wanted ?? SECTIONS)].filter((section) =>\n SECTIONS.includes(section) &&\n (section !== \"contents\" && section !== \"statistics\" || kinds.length > 0) &&\n (section !== \"groups\" || managedGroups.length > 0) &&\n (section !== \"moderation\" || moderation?.sections?.length !== 0),\n );\n if (!sections.length) return <p role=\"status\" className=\"text-muted-foreground\">{t(\"contentAdmin.empty\")}</p>;\n\n const parts = loc.view.split(\"/\");\n const section = (loc.view ? parts[0] : sections[0]) as ContentAdminSection;\n const requestedKind = parts[1] === undefined ? undefined : decode(parts[1]);\n const kind = requestedKind ?? kinds[0]!;\n const moderationSections: readonly string[] = moderation?.sections ?? MODERATION;\n const valid = sections.includes(section) &&\n (section !== \"contents\" || (parts[1] === undefined || requestedKind !== undefined) && kinds.includes(kind)) &&\n (section !== \"groups\" || parts[1] === undefined || requestedKind !== undefined && managedGroups.includes(requestedKind)) &&\n (section !== \"moderation\" || !parts[1] || moderationSections.includes(parts[1])) &&\n (section !== \"statistics\" || parts.length === 1 || !loc.view);\n const base = basePath?.replace(/\\/+$/, \"\") ?? \"\";\n const prefix = section === \"contents\" ? `contents/${encodeURIComponent(kind)}` : section;\n const view = loc.view || prefix;\n // A contents root selects the first configured kind without changing the URL.\n const effectiveView = section === \"contents\" && parts[1] === undefined ? prefix : view;\n const nav = childNavigation(base, effectiveView, loc);\n const shared = { client, guard, onError };\n const names: Record<ContentAdminSection, string> = {\n contents: t(\"contentManager.title\"), groups: t(\"contentAdmin.groups\"), moderation: t(\"moderation.title\"), polls: t(\"pollManager.title\"), statistics: t(\"stats.title\"),\n };\n const destination = (s: ContentAdminSection) => s === \"contents\" ? `contents/${encodeURIComponent(kinds[0]!)}` : s;\n\n return (\n <>\n <h1 className=\"text-lg font-semibold\">{t(\"contentAdmin.title\")}</h1>\n <div className=\"grid min-w-0 gap-4 sm:grid-cols-[12rem_minmax(0,1fr)]\">\n <nav aria-label={t(\"contentAdmin.navigation\")} className=\"flex gap-1 overflow-x-auto sm:grid sm:content-start\">\n {sections.map((s) => (\n <Button key={s} variant={section === s ? \"secondary\" : \"ghost\"} className=\"justify-start whitespace-nowrap\" aria-current={section === s ? \"page\" : undefined} onClick={() => loc.go(destination(s))}>\n {names[s]}\n </Button>\n ))}\n </nav>\n <div className=\"grid min-w-0 content-start gap-4\" data-ckui=\"content-admin-view\">\n {!valid ? (\n <div className=\"grid justify-items-start gap-2\">\n <p role=\"status\">{t(\"contentAdmin.unavailable\")}</p>\n <Button variant=\"outline\" onClick={() => loc.go(\"\")}>{t(\"contentAdmin.back\")}</Button>\n </div>\n ) : section === \"contents\" ? (\n <>\n <label className=\"grid justify-items-start gap-1 text-sm\" htmlFor={`${id}-kind`}>\n {t(\"contentAdmin.kind\")}\n <select id={`${id}-kind`} className=\"h-8 rounded-md border border-input bg-background px-2 text-sm\" value={kind} onChange={(event) => loc.go(`contents/${encodeURIComponent(event.target.value)}`)}>\n {kinds.map((k) => <option key={k} value={k}>{labelOf(labels, k)}</option>)}\n </select>\n </label>\n <ContentManager key={kind} {...shared} {...content} kind={kind} labels={labels} languages={model.kinds.languages} basePath={`${base}/${prefix}`} navigation={nav} />\n </>\n ) : section === \"groups\" ? (\n <GroupManager {...shared} {...groups} labels={labels} groupKinds={managedGroups} basePath={`${base}/groups`} navigation={nav} />\n ) : section === \"moderation\" ? (\n <CommentModeration {...shared} {...moderation} contentKinds={kinds.map((value) => ({ value, label: labelOf(labels, value) }))} basePath={`${base}/moderation`} navigation={nav} />\n ) : section === \"polls\" ? (\n <PollManager {...shared} {...polls} languages={model.kinds.languages} basePath={`${base}/polls`} navigation={nav} />\n ) : (\n <StatsDashboard {...shared} kinds={kinds.map((value) => ({ value, label: labelOf(labels, value) }))} />\n )}\n </div>\n </div>\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
import { ContentKitClient } from '../../client/client.js';
|
|
3
|
-
import { Content } from '../../client/generated/wire.js';
|
|
3
|
+
import { Content, GroupCard, Rule } from '../../client/generated/wire.js';
|
|
4
|
+
import { Translator } from '../../i18n/messages.js';
|
|
4
5
|
import { FlowClientOptions, StaffAccess } from '../../react/admin.js';
|
|
5
6
|
import { ContentKitErrorHandler } from '../../react/context.js';
|
|
6
7
|
import { Labels } from '../groups/parts.js';
|
|
@@ -34,7 +35,10 @@ export interface ContentManagerProps extends AdminFlowProps, AdminRouteProps {
|
|
|
34
35
|
contentHref?: (content: Content) => string | undefined;
|
|
35
36
|
/** Display names of kinds, traits, tiers, attributes and values by identifier. */
|
|
36
37
|
labels?: Labels;
|
|
38
|
+
/** The list's default page size: 20, 50 or 100. */
|
|
37
39
|
pageSize?: number;
|
|
40
|
+
/** Row checkboxes with bulk access, delete and restore (default true). */
|
|
41
|
+
selectable?: boolean;
|
|
38
42
|
}
|
|
39
43
|
/** Whether the caller manages content: root:content:write holders, creators and owner-group editors. */
|
|
40
44
|
export declare function useContentManagerAccess(o?: FlowClientOptions): StaffAccess<"contents">;
|
|
@@ -44,7 +48,7 @@ export declare function contentStatus(c: Content): ContentStatus;
|
|
|
44
48
|
/**
|
|
45
49
|
* Content items of one kind for their creators and staff: every one the
|
|
46
50
|
* caller manages, by state and text, deleted ones on their own to restore;
|
|
47
|
-
* create and edit title,
|
|
51
|
+
* create and edit title, description, schedule, cover and body with
|
|
48
52
|
* inline images per language, publish or keep a draft, and delete; then its
|
|
49
53
|
* listing and attributes, access rule and price, versions (order, languages,
|
|
50
54
|
* traits, schedule, access override, price, segments, media) and groups. The
|
|
@@ -52,6 +56,8 @@ export declare function contentStatus(c: Content): ContentStatus;
|
|
|
52
56
|
* basePath/{id}, filters in the query.
|
|
53
57
|
*/
|
|
54
58
|
export declare function ContentManager({ client: own, baseUrl, auth, guard, appearance, className, language, messages, ...p }: ContentManagerProps): import('react').JSX.Element;
|
|
59
|
+
/** A rule as a short label: free, its tiers, pay per view or members only. */
|
|
60
|
+
export declare function accessLabel(t: Translator["t"], rule: Rule, labels?: Labels): string;
|
|
55
61
|
export interface ContentEditorProps {
|
|
56
62
|
/** Staff entity lookup, including internal classifications. */
|
|
57
63
|
management?: boolean;
|
|
@@ -67,6 +73,8 @@ export interface ContentEditorProps {
|
|
|
67
73
|
labels?: Labels;
|
|
68
74
|
/** A new item's owner group: a channel its editors write for. */
|
|
69
75
|
ownerGroup?: string;
|
|
76
|
+
/** Entities a new item starts linked to, e.g. the series it was created from; ignored for an existing item. */
|
|
77
|
+
entities?: readonly GroupCard[];
|
|
70
78
|
/** After create: show the new item (the editor goes on editing it). */
|
|
71
79
|
onCreated?: (content: Content) => void;
|
|
72
80
|
onDeleted?: (content: Content) => void;
|
|
@@ -74,7 +82,7 @@ export interface ContentEditorProps {
|
|
|
74
82
|
onError?: ContentKitErrorHandler;
|
|
75
83
|
}
|
|
76
84
|
/**
|
|
77
|
-
* One content item for its creators and staff: title,
|
|
85
|
+
* One content item for its creators and staff: title, description,
|
|
78
86
|
* schedule, cover and body per language, publish, unpublish and delete;
|
|
79
87
|
* then listing and attributes, access rule and price, versions and groups.
|
|
80
88
|
*/
|