@openrails/contentkit-ui 0.79.0 → 0.81.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.
Files changed (295) hide show
  1. package/README.md +82 -54
  2. package/dist/client/beacons.d.ts +53 -0
  3. package/dist/client/beacons.js +72 -0
  4. package/dist/client/beacons.js.map +1 -0
  5. package/dist/client/catalog.d.ts +2 -2
  6. package/dist/client/catalog.js +1 -1
  7. package/dist/client/catalog.js.map +1 -1
  8. package/dist/client/client.d.ts +24 -11
  9. package/dist/client/client.js +37 -29
  10. package/dist/client/client.js.map +1 -1
  11. package/dist/client/content/comments.d.ts +12 -8
  12. package/dist/client/content/comments.js +33 -20
  13. package/dist/client/content/comments.js.map +1 -1
  14. package/dist/client/content/favorites.d.ts +24 -9
  15. package/dist/client/content/favorites.js +21 -22
  16. package/dist/client/content/favorites.js.map +1 -1
  17. package/dist/client/content/moderation.d.ts +1 -1
  18. package/dist/client/content/moderation.js.map +1 -1
  19. package/dist/client/content/reactions.d.ts +11 -6
  20. package/dist/client/content/reactions.js +23 -18
  21. package/dist/client/content/reactions.js.map +1 -1
  22. package/dist/client/content/types.d.ts +40 -21
  23. package/dist/client/content/types.js +5 -2
  24. package/dist/client/content/types.js.map +1 -1
  25. package/dist/client/contents.d.ts +55 -0
  26. package/dist/client/contents.js +144 -0
  27. package/dist/client/contents.js.map +1 -0
  28. package/dist/client/discovery.d.ts +126 -0
  29. package/dist/client/discovery.js +125 -0
  30. package/dist/client/discovery.js.map +1 -0
  31. package/dist/client/generated/error-codes.d.ts +1 -1
  32. package/dist/client/generated/error-codes.js +12 -0
  33. package/dist/client/generated/error-codes.js.map +1 -1
  34. package/dist/client/generated/routes.d.ts +1244 -370
  35. package/dist/client/generated/routes.js +1870 -554
  36. package/dist/client/generated/routes.js.map +1 -1
  37. package/dist/client/generated/wire.d.ts +960 -134
  38. package/dist/client/generated/wire.js.map +1 -1
  39. package/dist/client/group-fields.d.ts +25 -0
  40. package/dist/client/group-fields.js +63 -0
  41. package/dist/client/group-fields.js.map +1 -0
  42. package/dist/client/groups.d.ts +58 -0
  43. package/dist/client/groups.js +119 -0
  44. package/dist/client/groups.js.map +1 -0
  45. package/dist/client/http.d.ts +24 -12
  46. package/dist/client/http.js +20 -24
  47. package/dist/client/http.js.map +1 -1
  48. package/dist/client/index.d.ts +11 -6
  49. package/dist/client/media/api.d.ts +1 -1
  50. package/dist/client/media/api.js +4 -2
  51. package/dist/client/media/api.js.map +1 -1
  52. package/dist/client/media/client.d.ts +8 -9
  53. package/dist/client/media/client.js +58 -71
  54. package/dist/client/media/client.js.map +1 -1
  55. package/dist/client/media/ref.d.ts +30 -0
  56. package/dist/client/media/ref.js +10 -3
  57. package/dist/client/media/ref.js.map +1 -1
  58. package/dist/client/offers.d.ts +41 -0
  59. package/dist/client/offers.js +66 -0
  60. package/dist/client/offers.js.map +1 -0
  61. package/dist/client/route.d.ts +2 -0
  62. package/dist/client/route.js +2 -1
  63. package/dist/client/route.js.map +1 -1
  64. package/dist/client/versions.d.ts +20 -0
  65. package/dist/client/versions.js +53 -0
  66. package/dist/client/versions.js.map +1 -0
  67. package/dist/client.js +35 -30
  68. package/dist/components/admin/content-manager.d.ts +80 -0
  69. package/dist/components/admin/content-manager.js +591 -0
  70. package/dist/components/admin/content-manager.js.map +1 -0
  71. package/dist/components/admin/group-manager.d.ts +24 -0
  72. package/dist/components/admin/group-manager.js +244 -0
  73. package/dist/components/admin/group-manager.js.map +1 -0
  74. package/dist/components/admin/media-item-panel.js +1 -1
  75. package/dist/components/admin/media-item-panel.js.map +1 -1
  76. package/dist/components/content/card.d.ts +44 -0
  77. package/dist/components/content/card.js +285 -0
  78. package/dist/components/content/card.js.map +1 -0
  79. package/dist/components/content/editors.d.ts +40 -0
  80. package/dist/components/content/editors.js +764 -0
  81. package/dist/components/content/editors.js.map +1 -0
  82. package/dist/components/content/filters.d.ts +28 -0
  83. package/dist/components/content/filters.js +134 -0
  84. package/dist/components/content/filters.js.map +1 -0
  85. package/dist/components/content/grid.d.ts +62 -0
  86. package/dist/components/content/grid.js +233 -0
  87. package/dist/components/content/grid.js.map +1 -0
  88. package/dist/components/content/index.d.ts +8 -0
  89. package/dist/components/content/listing.d.ts +20 -0
  90. package/dist/components/content/listing.js +150 -0
  91. package/dist/components/content/listing.js.map +1 -0
  92. package/dist/components/content/offer-fields.d.ts +8 -0
  93. package/dist/components/content/offer-fields.js +127 -0
  94. package/dist/components/content/offer-fields.js.map +1 -0
  95. package/dist/components/content/paywall.d.ts +53 -0
  96. package/dist/components/content/paywall.js +221 -0
  97. package/dist/components/content/paywall.js.map +1 -0
  98. package/dist/components/content/search.d.ts +27 -0
  99. package/dist/components/content/search.js +164 -0
  100. package/dist/components/content/search.js.map +1 -0
  101. package/dist/components/groups/banner.d.ts +51 -0
  102. package/dist/components/groups/banner.js +194 -0
  103. package/dist/components/groups/banner.js.map +1 -0
  104. package/dist/components/groups/directory.d.ts +37 -0
  105. package/dist/components/groups/directory.js +117 -0
  106. package/dist/components/groups/directory.js.map +1 -0
  107. package/dist/components/groups/editor.d.ts +44 -0
  108. package/dist/components/groups/editor.js +860 -0
  109. package/dist/components/groups/editor.js.map +1 -0
  110. package/dist/components/groups/fields.d.ts +13 -0
  111. package/dist/components/groups/fields.js +68 -0
  112. package/dist/components/groups/fields.js.map +1 -0
  113. package/dist/components/groups/header.d.ts +25 -0
  114. package/dist/components/groups/header.js +131 -0
  115. package/dist/components/groups/header.js.map +1 -0
  116. package/dist/components/groups/index.d.ts +6 -0
  117. package/dist/components/groups/memberships.d.ts +55 -0
  118. package/dist/components/groups/memberships.js +527 -0
  119. package/dist/components/groups/memberships.js.map +1 -0
  120. package/dist/components/groups/parts.d.ts +49 -0
  121. package/dist/components/groups/parts.js +172 -0
  122. package/dist/components/groups/parts.js.map +1 -0
  123. package/dist/components/media-folder-editor.js +153 -152
  124. package/dist/components/media-folder-editor.js.map +1 -1
  125. package/dist/components/social/comments.d.ts +7 -5
  126. package/dist/components/social/comments.js +6 -2
  127. package/dist/components/social/comments.js.map +1 -1
  128. package/dist/components/social/engagement.d.ts +4 -3
  129. package/dist/components/social/engagement.js.map +1 -1
  130. package/dist/components/social/moderation.d.ts +1 -1
  131. package/dist/components/social/moderation.js +3 -3
  132. package/dist/components/social/moderation.js.map +1 -1
  133. package/dist/editor/rich-text-editor.d.ts +4 -4
  134. package/dist/editor/rich-text-editor.js.map +1 -1
  135. package/dist/index.d.ts +4 -2
  136. package/dist/index.js +23 -9
  137. package/dist/locales/admin/de.js +5 -66
  138. package/dist/locales/admin/de.js.map +1 -1
  139. package/dist/locales/admin/en.d.ts +5 -66
  140. package/dist/locales/admin/en.js +19 -80
  141. package/dist/locales/admin/en.js.map +1 -1
  142. package/dist/locales/admin/es.js +5 -66
  143. package/dist/locales/admin/es.js.map +1 -1
  144. package/dist/locales/admin/ja.js +5 -66
  145. package/dist/locales/admin/ja.js.map +1 -1
  146. package/dist/locales/admin/ko.js +5 -66
  147. package/dist/locales/admin/ko.js.map +1 -1
  148. package/dist/locales/admin/zh.js +5 -66
  149. package/dist/locales/admin/zh.js.map +1 -1
  150. package/dist/locales/content/de.d.ts +2 -0
  151. package/dist/locales/content/de.js +98 -0
  152. package/dist/locales/content/de.js.map +1 -0
  153. package/dist/locales/content/en.d.ts +93 -0
  154. package/dist/locales/content/en.js +98 -0
  155. package/dist/locales/content/en.js.map +1 -0
  156. package/dist/locales/content/es.d.ts +2 -0
  157. package/dist/locales/content/es.js +98 -0
  158. package/dist/locales/content/es.js.map +1 -0
  159. package/dist/locales/content/ja.d.ts +2 -0
  160. package/dist/locales/content/ja.js +98 -0
  161. package/dist/locales/content/ja.js.map +1 -0
  162. package/dist/locales/content/ko.d.ts +2 -0
  163. package/dist/locales/content/ko.js +98 -0
  164. package/dist/locales/content/ko.js.map +1 -0
  165. package/dist/locales/content/zh.d.ts +2 -0
  166. package/dist/locales/content/zh.js +98 -0
  167. package/dist/locales/content/zh.js.map +1 -0
  168. package/dist/locales/de.js +11 -2
  169. package/dist/locales/de.js.map +1 -1
  170. package/dist/locales/discovery/de.d.ts +2 -0
  171. package/dist/locales/discovery/de.js +68 -0
  172. package/dist/locales/discovery/de.js.map +1 -0
  173. package/dist/locales/discovery/en.d.ts +63 -0
  174. package/dist/locales/discovery/en.js +68 -0
  175. package/dist/locales/discovery/en.js.map +1 -0
  176. package/dist/locales/discovery/es.d.ts +2 -0
  177. package/dist/locales/discovery/es.js +68 -0
  178. package/dist/locales/discovery/es.js.map +1 -0
  179. package/dist/locales/discovery/ja.d.ts +2 -0
  180. package/dist/locales/discovery/ja.js +68 -0
  181. package/dist/locales/discovery/ja.js.map +1 -0
  182. package/dist/locales/discovery/ko.d.ts +2 -0
  183. package/dist/locales/discovery/ko.js +68 -0
  184. package/dist/locales/discovery/ko.js.map +1 -0
  185. package/dist/locales/discovery/zh.d.ts +2 -0
  186. package/dist/locales/discovery/zh.js +68 -0
  187. package/dist/locales/discovery/zh.js.map +1 -0
  188. package/dist/locales/en.d.ts +288 -67
  189. package/dist/locales/en.js +11 -2
  190. package/dist/locales/en.js.map +1 -1
  191. package/dist/locales/es.js +11 -2
  192. package/dist/locales/es.js.map +1 -1
  193. package/dist/locales/groups/de.d.ts +2 -0
  194. package/dist/locales/groups/de.js +133 -0
  195. package/dist/locales/groups/de.js.map +1 -0
  196. package/dist/locales/groups/en.d.ts +128 -0
  197. package/dist/locales/groups/en.js +133 -0
  198. package/dist/locales/groups/en.js.map +1 -0
  199. package/dist/locales/groups/es.d.ts +2 -0
  200. package/dist/locales/groups/es.js +133 -0
  201. package/dist/locales/groups/es.js.map +1 -0
  202. package/dist/locales/groups/ja.d.ts +2 -0
  203. package/dist/locales/groups/ja.js +133 -0
  204. package/dist/locales/groups/ja.js.map +1 -0
  205. package/dist/locales/groups/ko.d.ts +2 -0
  206. package/dist/locales/groups/ko.js +133 -0
  207. package/dist/locales/groups/ko.js.map +1 -0
  208. package/dist/locales/groups/zh.d.ts +2 -0
  209. package/dist/locales/groups/zh.js +133 -0
  210. package/dist/locales/groups/zh.js.map +1 -0
  211. package/dist/locales/ja.js +11 -2
  212. package/dist/locales/ja.js.map +1 -1
  213. package/dist/locales/ko.js +11 -2
  214. package/dist/locales/ko.js.map +1 -1
  215. package/dist/locales/social/de.js +2 -1
  216. package/dist/locales/social/de.js.map +1 -1
  217. package/dist/locales/social/en.d.ts +2 -1
  218. package/dist/locales/social/en.js +2 -1
  219. package/dist/locales/social/en.js.map +1 -1
  220. package/dist/locales/social/es.js +2 -1
  221. package/dist/locales/social/es.js.map +1 -1
  222. package/dist/locales/social/ja.js +2 -1
  223. package/dist/locales/social/ja.js.map +1 -1
  224. package/dist/locales/social/ko.js +2 -1
  225. package/dist/locales/social/ko.js.map +1 -1
  226. package/dist/locales/social/zh.js +2 -1
  227. package/dist/locales/social/zh.js.map +1 -1
  228. package/dist/locales/zh.js +11 -2
  229. package/dist/locales/zh.js.map +1 -1
  230. package/dist/react/admin.d.ts +1 -1
  231. package/dist/react/admin.js +8 -6
  232. package/dist/react/admin.js.map +1 -1
  233. package/dist/react/comments.d.ts +9 -7
  234. package/dist/react/comments.js +42 -27
  235. package/dist/react/comments.js.map +1 -1
  236. package/dist/react/contents.d.ts +57 -0
  237. package/dist/react/contents.js +214 -0
  238. package/dist/react/contents.js.map +1 -0
  239. package/dist/react/context.d.ts +1 -1
  240. package/dist/react/context.js.map +1 -1
  241. package/dist/react/crop.js +45 -44
  242. package/dist/react/crop.js.map +1 -1
  243. package/dist/react/detail.d.ts +30 -0
  244. package/dist/react/detail.js +42 -0
  245. package/dist/react/detail.js.map +1 -0
  246. package/dist/react/discovery.d.ts +138 -0
  247. package/dist/react/discovery.js +299 -0
  248. package/dist/react/discovery.js.map +1 -0
  249. package/dist/react/engagement.d.ts +5 -5
  250. package/dist/react/engagement.js +55 -41
  251. package/dist/react/engagement.js.map +1 -1
  252. package/dist/react/folder.js +54 -53
  253. package/dist/react/folder.js.map +1 -1
  254. package/dist/react/groups.d.ts +115 -0
  255. package/dist/react/groups.js +229 -0
  256. package/dist/react/groups.js.map +1 -0
  257. package/dist/react/index.d.ts +5 -1
  258. package/dist/react/public.d.ts +6 -5
  259. package/dist/react/public.js +19 -22
  260. package/dist/react/public.js.map +1 -1
  261. package/dist/react/read.js +105 -106
  262. package/dist/react/read.js.map +1 -1
  263. package/dist/react/resources.d.ts +2 -2
  264. package/dist/react/resources.js +69 -40
  265. package/dist/react/resources.js.map +1 -1
  266. package/dist/react/store.js +41 -39
  267. package/dist/react/store.js.map +1 -1
  268. package/dist/react/upload.js +54 -53
  269. package/dist/react/upload.js.map +1 -1
  270. package/dist/react/use-resource.d.ts +2 -1
  271. package/dist/react/use-resource.js +1 -0
  272. package/dist/react/use-resource.js.map +1 -1
  273. package/dist/react/versions.d.ts +57 -0
  274. package/dist/react/versions.js +94 -0
  275. package/dist/react/versions.js.map +1 -0
  276. package/dist/react/video.js +87 -86
  277. package/dist/react/video.js.map +1 -1
  278. package/dist/react.js +9 -5
  279. package/dist/styles.css +1 -1
  280. package/package.json +1 -1
  281. package/dist/client/content/posts.d.ts +0 -52
  282. package/dist/client/content/posts.js +0 -84
  283. package/dist/client/content/posts.js.map +0 -1
  284. package/dist/client/taxonomy.d.ts +0 -34
  285. package/dist/client/taxonomy.js +0 -84
  286. package/dist/client/taxonomy.js.map +0 -1
  287. package/dist/components/admin/post-manager.d.ts +0 -45
  288. package/dist/components/admin/post-manager.js +0 -602
  289. package/dist/components/admin/post-manager.js.map +0 -1
  290. package/dist/components/admin/taxonomy-manager.d.ts +0 -54
  291. package/dist/components/admin/taxonomy-manager.js +0 -976
  292. package/dist/components/admin/taxonomy-manager.js.map +0 -1
  293. package/dist/react/posts.d.ts +0 -61
  294. package/dist/react/posts.js +0 -183
  295. package/dist/react/posts.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"post-manager.js","names":[],"sources":["../../../src/components/admin/post-manager.tsx"],"sourcesContent":["import { 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/content/posts.js\";\nimport type { Post, PostInput } from \"../../client/generated/wire.js\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport { useAdminLocation, useFlowClient, useStaffAccess, type AdminLocation, type FlowClientOptions, type StaffAccess } from \"../../react/admin.js\";\nimport { useErrorReporter } from \"../../react/context.js\";\nimport { usePost } from \"../../react/posts.js\";\nimport { keyOf, useContentScope, usePaged } 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 { 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 PostManager hands its body editor. */\nexport interface PostEditorProps {\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 post and resolves with a URL that shows it; absent until the post exists. */\n uploadImage?: (file: File) => Promise<string>;\n disabled?: boolean;\n placeholder?: string;\n \"aria-label\"?: string;\n}\n\nexport interface PostManagerProps extends AdminFlowProps, AdminRouteProps {\n /** Languages to filter by and write in: codes, or codes with labels; the first is a new post'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: PostEditorProps) => ReactNode;\n /** A link to a published post's page. */\n postHref?: (post: Post) => string | undefined;\n pageSize?: number;\n}\n\n/** Whether the caller may manage posts (root:posts:write). */\nexport function usePostManagerAccess(o: FlowClientOptions = {}): StaffAccess<\"posts\"> {\n return useStaffAccess([\"posts\"] as const, o);\n}\n\nexport type PostStatus = \"draft\" | \"scheduled\" | \"published\" | \"held\" | \"rejected\";\n\n/** A post's status as the staff list names it. */\nexport function postStatus(p: Post, now = Date.now()): PostStatus {\n if (p.moderation === \"rejected\") return \"rejected\";\n if (p.moderation === \"held\") return \"held\";\n if (p.is_draft) return \"draft\";\n if (p.live_at && Date.parse(p.live_at) > now) 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<PostStatus, \"default\" | \"secondary\" | \"outline\" | \"destructive\"> = { published: \"default\", scheduled: \"secondary\", draft: \"outline\", held: \"secondary\", rejected: \"destructive\" };\n\n/**\n * Staff: every post, by language, draft state and text, deleted ones on\n * their own to restore; create and edit title, slug, language, excerpt,\n * schedule, cover and body with inline images, publish or keep a draft, and\n * delete. The list is at basePath, a new post at basePath/new and each post\n * at basePath/{id}, filters in the query.\n */\nexport function PostManager({ client: own, baseUrl, auth, guard, appearance, className, language, messages, ...p }: PostManagerProps) {\n const client = useFlowClient({ client: own, baseUrl, auth });\n return (\n <AdminRoot flow=\"post-manager\" appearance={appearance} className={className} language={language} messages={messages} guard={guard}>\n <Posts {...p} client={client} />\n </AdminRoot>\n );\n}\n\ntype Inner = Omit<PostManagerProps, \"client\" | \"baseUrl\" | \"auth\" | \"guard\" | \"appearance\" | \"className\" | \"language\" | \"messages\"> & { client: ContentKitClient };\n\nfunction Posts({ basePath, navigation, ...p }: Inner) {\n const { t } = useMessages();\n const loc = useAdminLocation(basePath, navigation);\n const access = usePostManagerAccess({ client: p.client });\n if (access.loading) return <Rows />;\n if (!access.allowed.posts) return <NoAccess>{t(\"postManager.noAccess\")}</NoAccess>;\n if (!loc.view) return <List {...p} loc={loc} />;\n return (\n <>\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-self-start\" onClick={() => loc.go(\"\")}>\n {t(\"postManager.back\")}\n </Button>\n <PostForm key={loc.view} {...p} loc={loc} id={loc.view === \"new\" ? null : loc.view} />\n </>\n );\n}\n\nfunction List({ loc, client, languages: offered, postHref, pageSize = 20, onError }: Inner & { loc: AdminLocation }) {\n const m = useMessages();\n const { t } = m;\n const ids = useId();\n const languages = choices(offered);\n const query = loc.query.get(\"q\") ?? \"\";\n const language = loc.query.get(\"language\") ?? \"\";\n const status = loc.query.get(\"status\") === \"draft\" ? \"draft\" : loc.query.get(\"status\") === \"live\" ? \"live\" : \"\";\n const deleted = loc.query.get(\"deleted\") === \"1\";\n const page = pageOf(loc.query);\n const filters = { q: query, language, status, deleted: deleted ? \"1\" : undefined };\n const filter = (next: Partial<typeof filters>) => loc.go(\"\", { ...filters, ...next });\n const [text, setText] = useState(query);\n useEffect(() => setText(query), [query]);\n const { store, scope } = useContentScope(client);\n const list = usePaged(store, keyOf(\"posts-page\", scope, query, language, status, deleted, pageSize), { type: \"posts\", scope: deleted ? \"deleted\" : undefined }, page, pageSize, (q, signal) =>\n client.posts.adminList(\n { ...q, q: query || undefined, language: language || undefined, draft: deleted || !status ? undefined : status === \"draft\", deleted: deleted || undefined },\n signal,\n ),\n );\n const del = useAction(\"post.save\", onError);\n const { confirm, dialog } = useConfirm();\n const remove = async (post: Post) => {\n if (await confirm({ title: t(\"postManager.deleteTitle\", { title: post.title }), description: t(\"postManager.deleteBody\"), confirm: t(\"postManager.delete\") })) {\n await del.run(() => client.posts.delete(post.id));\n }\n };\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(\"postManager.title\")}</h2>\n <Button size=\"sm\" onClick={() => loc.go(\"new\")}>\n {t(\"postManager.new\")}\n </Button>\n </div>\n <div className=\"flex gap-2\" role=\"group\" aria-label={t(\"postManager.title\")}>\n <Button size=\"sm\" variant={deleted ? \"outline\" : \"default\"} aria-pressed={!deleted} onClick={() => loc.go(\"\", { q: query, language })}>\n {t(\"postManager.posts\")}\n </Button>\n <Button size=\"sm\" variant={deleted ? \"default\" : \"outline\"} aria-pressed={deleted} onClick={() => loc.go(\"\", { q: query, language, deleted: \"1\" })}>\n {t(\"postManager.deleted\")}\n </Button>\n </div>\n <div className=\"grid gap-2 sm:grid-cols-[minmax(0,1fr)_auto]\">\n <form\n className=\"flex gap-2\"\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(\"postManager.search\")}\n </Label>\n <Input id={`${ids}-q`} className=\"h-8\" type=\"search\" value={text} placeholder={t(\"postManager.search\")} onChange={(e) => setText(e.target.value)} />\n <Button type=\"submit\" size=\"sm\" variant=\"outline\">\n {t(\"moderation.filter\")}\n </Button>\n </form>\n <div className=\"flex flex-wrap gap-2\">\n {languages.length > 0 && (\n <Select value={language} onValueChange={(v) => filter({ language: String(v ?? \"\") })}>\n <SelectTrigger size=\"sm\" aria-label={t(\"postManager.language\")}>\n <SelectValue>{(v: string) => (v ? (languages.find((l) => l.value === v)?.label ?? v) : t(\"pollManager.allLanguages\"))}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"\">{t(\"pollManager.allLanguages\")}</SelectItem>\n {languages.map((l) => (\n <SelectItem key={l.value} value={l.value}>\n {l.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n {!deleted && (\n <Select value={status} onValueChange={(v) => filter({ status: String(v ?? \"\") })}>\n <SelectTrigger size=\"sm\" aria-label={t(\"postManager.status\")}>\n <SelectValue>{(v: string) => t(v === \"draft\" ? \"postManager.drafts\" : v === \"live\" ? \"postManager.notDrafts\" : \"postManager.allStatuses\")}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"\">{t(\"postManager.allStatuses\")}</SelectItem>\n <SelectItem value=\"draft\">{t(\"postManager.drafts\")}</SelectItem>\n <SelectItem value=\"live\">{t(\"postManager.notDrafts\")}</SelectItem>\n </SelectContent>\n </Select>\n )}\n </div>\n </div>\n <ErrorLine error={del.error} />\n {list.loading && !list.items.length ? (\n <Rows />\n ) : list.error && !list.items.length ? (\n <LoadFailed error={list.error} message={t(\"postManager.loadFailed\")} retry={list.reload} />\n ) : !list.items.length ? (\n <p className=\"text-muted-foreground\">{t(deleted ? \"postManager.noDeleted\" : \"postManager.empty\")}</p>\n ) : (\n <ul className=\"grid divide-y divide-border rounded-lg border border-border\" aria-busy={list.loading}>\n {list.items.map((post) => {\n const s = postStatus(post);\n const href = s === \"published\" ? postHref?.(post) : undefined;\n return (\n <li key={post.id} className=\"flex flex-wrap items-start gap-3 p-3\" data-ckui=\"post-row\" data-status={deleted ? \"deleted\" : s}>\n <div className=\"grid min-w-0 flex-1 gap-1\">\n {deleted ? (\n <span className=\"font-medium break-words\">{post.title}</span>\n ) : (\n <button type=\"button\" className=\"text-left font-medium break-words hover:underline\" onClick={() => loc.go(post.id)}>\n {post.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(`postManager.${s}`)}</Badge>}\n <span>{post.language}</span>\n <RelativeTime at={deleted && post.deleted_at ? post.deleted_at : post.updated_at} />\n {s === \"scheduled\" && post.live_at && <span>{t(\"pollManager.goesLive\", { date: formatDate(m, post.live_at) })}</span>}\n </div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {deleted ? (\n <Button size=\"sm\" variant=\"outline\" disabled={del.pending} onClick={() => void del.run(() => client.posts.restore(post.id))}>\n {t(\"moderation.restore\")}\n </Button>\n ) : (\n <>\n {href && (\n <a className={buttonVariants({ size: \"sm\", variant: \"ghost\" })} href={href}>\n {t(\"postManager.view\")}\n </a>\n )}\n <Button size=\"sm\" variant=\"outline\" onClick={() => loc.go(post.id)}>\n {t(\"comments.edit\")}\n </Button>\n <Button size=\"sm\" variant=\"destructive\" disabled={del.pending} onClick={() => void remove(post)}>\n {t(\"comments.delete\")}\n </Button>\n </>\n )}\n </div>\n </li>\n );\n })}\n </ul>\n )}\n <Pager page={page} hasNext={list.hasNext} disabled={list.loading} onPage={(n) => loc.go(\"\", { ...filters, page: n > 1 ? n : undefined })} />\n {dialog}\n </div>\n );\n}\n\ninterface Form {\n title: string;\n slug: string;\n language: string;\n excerpt: string;\n liveAt: string;\n body: string;\n}\n\nconst fromPost = (p: Post): Form => ({\n title: p.title,\n slug: p.slug ?? \"\",\n language: p.language,\n excerpt: p.excerpt ?? \"\",\n liveAt: p.live_at ? localInput(new Date(p.live_at)) : \"\",\n body: p.body,\n});\n\nfunction PostForm({ id, loc, client, languages: offered, renderEditor, postHref, onError }: Inner & { id: string | null; loc: AdminLocation }) {\n const m = useMessages();\n const { t } = m;\n const ids = useId();\n const languages = choices(offered);\n const ed = usePost(id, { client });\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 : { title: \"\", slug: \"\", language: languages[0]?.value ?? \"en\", excerpt: \"\", liveAt: \"\", body: \"\" });\n const [error, setError] = useState<ContentKitError | string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const { confirm, dialog } = useConfirm();\n useEffect(() => {\n if (ed.post) setForm((f) => f ?? fromPost(ed.post!));\n }, [ed.post]);\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(\"&\", \"&amp;\") : ref;\n }),\n [form?.body, imageSrc],\n );\n if (id && !form) {\n if (ed.error) return <LoadFailed error={ed.error} message={t(\"postManager.loadFailed\")} retry={() => loc.go(id, undefined, { replace: true })} />;\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, \"post.save\");\n };\n const input = (draft?: boolean): PostInput => ({\n title: f.title.trim(),\n slug: f.slug.trim() || undefined,\n language: f.language,\n excerpt: f.excerpt.trim(),\n body: f.body,\n live_at: f.liveAt ? new Date(f.liveAt).toISOString() : undefined,\n ...(draft === undefined ? {} : { is_draft: draft }),\n });\n const save = async (draft?: boolean) => {\n setError(null);\n setNotice(null);\n if (!f.title.trim()) return setError(t(\"postManager.titleRequired\"));\n try {\n if (!ed.post) {\n const post = await ed.create({ ...input(), is_draft: true });\n loc.go(post.id, undefined, { replace: true });\n return;\n }\n const post = await ed.update(input(draft));\n setNotice(t(draft === false ? \"postManager.publishedNotice\" : draft === true ? \"postManager.unpublishedNotice\" : \"pollEditor.saved\"));\n setForm((cur) => ({ ...cur!, slug: post.slug ?? \"\" }));\n } catch (e) {\n fail(e);\n }\n };\n const remove = async () => {\n if (!ed.post || !(await confirm({ title: t(\"postManager.deleteTitle\", { title: ed.post.title }), description: t(\"postManager.deleteBody\"), confirm: t(\"postManager.delete\") }))) return;\n try {\n await ed.remove();\n loc.go(\"\", undefined, { replace: true });\n } catch (e) {\n fail(e);\n }\n };\n const post = ed.post;\n const s = post ? postStatus(post) : \"draft\";\n const href = post && s === \"published\" ? postHref?.(post) : undefined;\n const editor: PostEditorProps = {\n value: shown,\n onChange: (html) => set({ body: ed.storedBody(html) }),\n uploadImage: post ? (file) => ed.uploadImage(file) : undefined,\n disabled: ed.saving,\n placeholder: t(\"postManager.bodyPlaceholder\"),\n \"aria-label\": t(\"postManager.body\"),\n };\n return (\n <form\n className=\"grid gap-4\"\n data-ckui=\"post-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(post ? \"postManager.editTitle\" : \"postManager.newTitle\")}</h2>\n {post && <Badge variant={badge[s]}>{t(`postManager.${s}`)}</Badge>}\n {href && (\n <a className=\"text-xs text-muted-foreground hover:underline\" href={href}>\n {t(\"postManager.view\")}\n </a>\n )}\n </div>\n {post?.moderation && (\n <Alert variant={post.moderation === \"rejected\" ? \"destructive\" : \"default\"}>\n <AlertDescription>\n {post.moderation_reason ? t(`postManager.${post.moderation === \"rejected\" ? \"rejectedBecause\" : \"heldBecause\"}`, { reason: post.moderation_reason }) : t(`postManager.${post.moderation === \"rejected\" ? \"rejectedNote\" : \"heldNote\"}`)}\n </AlertDescription>\n </Alert>\n )}\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-title`}>{t(\"postManager.postTitle\")}</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}-slug`}>{t(\"postManager.slug\")}</Label>\n <Input id={`${ids}-slug`} value={f.slug} placeholder={t(\"postManager.slugAuto\")} onChange={(e) => set({ slug: e.target.value })} />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-lang`}>{t(\"postManager.language\")}</Label>\n {languages.length ? (\n <Select value={f.language} onValueChange={(v) => set({ language: String(v ?? \"\") })}>\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 ) : (\n <Input id={`${ids}-lang`} value={f.language} onChange={(e) => set({ language: e.target.value })} />\n )}\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-live`}>{t(\"postManager.liveAt\")}</Label>\n <Input id={`${ids}-live`} type=\"datetime-local\" value={f.liveAt} onChange={(e) => set({ liveAt: e.target.value })} />\n </div>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-excerpt`}>{t(\"postManager.excerpt\")}</Label>\n <Textarea id={`${ids}-excerpt`} rows={2} value={f.excerpt} onChange={(e) => set({ excerpt: e.target.value })} />\n </div>\n <Cover post={post} 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(\"postManager.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 {!post && <p className=\"text-xs text-muted-foreground\">{t(\"postManager.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(post ? \"common.save\" : \"postManager.createDraft\")}\n </Button>\n {post && (\n <Button type=\"button\" variant=\"outline\" disabled={ed.saving} onClick={() => void save(!post.is_draft)}>\n {t(post.is_draft ? \"postManager.publish\" : \"postManager.unpublish\")}\n </Button>\n )}\n {post && (\n <Button type=\"button\" variant=\"destructive\" className=\"ms-auto\" disabled={ed.saving} onClick={() => void remove()}>\n {t(\"postManager.delete\")}\n </Button>\n )}\n </div>\n {dialog}\n </form>\n );\n}\n\nfunction Cover({ post, src, saving, onFile }: { post: Post | 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=\"post-cover\">\n <span className=\"text-sm font-medium\">{t(\"postManager.cover\")}</span>\n {post ? (\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(\"postManager.noCover\")}</span>}\n <Button type=\"button\" size=\"sm\" variant=\"outline\" disabled={saving} onClick={() => file.current?.click()}>\n {t(src ? \"pollEditor.replaceImage\" : \"postManager.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(\"postManager.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(\"postManager.imagesAfterCreate\")}</p>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,54 +0,0 @@
1
- import { ReactNode } from 'react';
2
- import { Assignment, ContentRef, Edge, NodeDetail } from '../../client/generated/wire.js';
3
- import { FlowClientOptions, StaffAccess } from '../../react/admin.js';
4
- import { AdminFlowProps, AdminRouteProps } from './shell.js';
5
- type Choice = string | {
6
- value: string;
7
- label: string;
8
- };
9
- export type TaxonomyRelation = Edge["relation"];
10
- /** One node kind the flow manages. */
11
- export interface TaxonomyKind {
12
- /** The kind as the store registers it, e.g. "tag", "series". */
13
- kind: string;
14
- label: string;
15
- /** Edges a node of this kind may have, "node is <relation> of a <to> node": e.g. a character member_of a series. */
16
- relations?: readonly {
17
- relation: TaxonomyRelation;
18
- to: string;
19
- label: string;
20
- inverseLabel?: string;
21
- }[];
22
- /** A cover in the host's media: the media kind whose items are node ids, its upload path ("cover") and public preset ("cover"). */
23
- cover?: {
24
- kind: string;
25
- path?: string;
26
- preset?: string;
27
- };
28
- }
29
- export interface TaxonomyManagerProps extends AdminFlowProps, AdminRouteProps {
30
- /** The kinds, in tab order; the first is at basePath. */
31
- kinds: readonly TaxonomyKind[];
32
- /** Languages names are written in; the first resolves the list's names. */
33
- languages?: readonly Choice[];
34
- /** Counts of this content kind; default every kind. */
35
- contentKind?: string;
36
- /** Host-owned fields of a node (a creator's type, a tag's restricted flag), below its names. */
37
- renderFields?: (node: NodeDetail) => ReactNode;
38
- /** One assigned content, e.g. a link with its title. Default its kind and id. */
39
- renderContent?: (ref: ContentRef, assignment: Assignment) => ReactNode;
40
- pageSize?: number;
41
- }
42
- /** Whether the caller may manage the taxonomy (root:taxonomy:write). */
43
- export declare function useTaxonomyManagerAccess(o?: FlowClientOptions): StaffAccess<"taxonomy">;
44
- /** A slug from a name: lowercase words joined by dashes. */
45
- export declare function slugify(name: string): string;
46
- /**
47
- * Staff: the taxonomy per kind. Each kind's nodes by name, state, language,
48
- * minimum count and order; a node's names and aliases per language, host
49
- * fields, relations (with a typeahead), cover, counts and assigned contents;
50
- * create, delete, restore and merge. Kinds are at basePath/{kind}, a node at
51
- * basePath/{kind}/{id}, filters in the query.
52
- */
53
- export declare function TaxonomyManager({ client: own, baseUrl, auth, guard, appearance, className, language, messages, ...p }: TaxonomyManagerProps): import('react').JSX.Element;
54
- export {};