@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.
Files changed (253) hide show
  1. package/README.md +111 -49
  2. package/dist/client/beacons.d.ts +3 -13
  3. package/dist/client/beacons.js +8 -46
  4. package/dist/client/beacons.js.map +1 -1
  5. package/dist/client/client.d.ts +3 -0
  6. package/dist/client/client.js +45 -43
  7. package/dist/client/client.js.map +1 -1
  8. package/dist/client/content/favorites.d.ts +2 -0
  9. package/dist/client/content/favorites.js.map +1 -1
  10. package/dist/client/content/types.d.ts +3 -0
  11. package/dist/client/content/types.js.map +1 -1
  12. package/dist/client/contents.d.ts +7 -1
  13. package/dist/client/contents.js +8 -0
  14. package/dist/client/contents.js.map +1 -1
  15. package/dist/client/discovery.d.ts +34 -5
  16. package/dist/client/discovery.js +23 -2
  17. package/dist/client/discovery.js.map +1 -1
  18. package/dist/client/engagement.d.ts +70 -0
  19. package/dist/client/engagement.js +191 -0
  20. package/dist/client/engagement.js.map +1 -0
  21. package/dist/client/generated/routes.d.ts +74 -35
  22. package/dist/client/generated/routes.js +119 -60
  23. package/dist/client/generated/routes.js.map +1 -1
  24. package/dist/client/generated/wire.d.ts +88 -85
  25. package/dist/client/generated/wire.js.map +1 -1
  26. package/dist/client/guest-reading-history.d.ts +40 -0
  27. package/dist/client/guest-reading-history.js +144 -0
  28. package/dist/client/guest-reading-history.js.map +1 -0
  29. package/dist/client/index.d.ts +5 -3
  30. package/dist/client/media/windows.d.ts +2 -0
  31. package/dist/client/media/windows.js +4 -1
  32. package/dist/client/media/windows.js.map +1 -1
  33. package/dist/client/stats.d.ts +4 -20
  34. package/dist/client/stats.js +0 -11
  35. package/dist/client/stats.js.map +1 -1
  36. package/dist/client/versions.d.ts +8 -6
  37. package/dist/client/versions.js +15 -10
  38. package/dist/client/versions.js.map +1 -1
  39. package/dist/client.js +24 -22
  40. package/dist/components/admin/bulk-drafts.d.ts +17 -0
  41. package/dist/components/admin/bulk-drafts.js +41 -0
  42. package/dist/components/admin/bulk-drafts.js.map +1 -0
  43. package/dist/components/admin/content-admin.d.ts +1 -1
  44. package/dist/components/admin/content-admin.js.map +1 -1
  45. package/dist/components/admin/content-manager.d.ts +11 -3
  46. package/dist/components/admin/content-manager.js +751 -394
  47. package/dist/components/admin/content-manager.js.map +1 -1
  48. package/dist/components/admin/group-manager.d.ts +8 -3
  49. package/dist/components/admin/group-manager.js +218 -146
  50. package/dist/components/admin/group-manager.js.map +1 -1
  51. package/dist/components/admin/page-notices.d.ts +16 -0
  52. package/dist/components/admin/page-notices.js +113 -0
  53. package/dist/components/admin/page-notices.js.map +1 -0
  54. package/dist/components/admin/page-picker.d.ts +38 -0
  55. package/dist/components/admin/page-picker.js +159 -0
  56. package/dist/components/admin/page-picker.js.map +1 -0
  57. package/dist/components/admin/quick-search.d.ts +14 -0
  58. package/dist/components/admin/quick-search.js +60 -0
  59. package/dist/components/admin/quick-search.js.map +1 -0
  60. package/dist/components/admin/reader-content-editor.js +382 -321
  61. package/dist/components/admin/reader-content-editor.js.map +1 -1
  62. package/dist/components/admin/reader-manifest.js +181 -179
  63. package/dist/components/admin/reader-manifest.js.map +1 -1
  64. package/dist/components/admin/shell.d.ts +10 -2
  65. package/dist/components/admin/shell.js +114 -42
  66. package/dist/components/admin/shell.js.map +1 -1
  67. package/dist/components/admin/stats-dashboard.d.ts +4 -9
  68. package/dist/components/admin/stats-dashboard.js +303 -207
  69. package/dist/components/admin/stats-dashboard.js.map +1 -1
  70. package/dist/components/admin/upload-queue.d.ts +14 -0
  71. package/dist/components/admin/upload-queue.js +115 -98
  72. package/dist/components/admin/upload-queue.js.map +1 -1
  73. package/dist/components/content/card.d.ts +31 -3
  74. package/dist/components/content/card.js +324 -158
  75. package/dist/components/content/card.js.map +1 -1
  76. package/dist/components/content/daily-releases.js +144 -190
  77. package/dist/components/content/daily-releases.js.map +1 -1
  78. package/dist/components/content/editor-save.js +27 -25
  79. package/dist/components/content/editor-save.js.map +1 -1
  80. package/dist/components/content/editors.js +274 -253
  81. package/dist/components/content/editors.js.map +1 -1
  82. package/dist/components/content/favorites.d.ts +6 -0
  83. package/dist/components/content/favorites.js +47 -0
  84. package/dist/components/content/favorites.js.map +1 -0
  85. package/dist/components/content/filter-dialog.js +19 -15
  86. package/dist/components/content/filter-dialog.js.map +1 -1
  87. package/dist/components/content/filters.d.ts +2 -0
  88. package/dist/components/content/filters.js +5 -1
  89. package/dist/components/content/filters.js.map +1 -1
  90. package/dist/components/content/grid.d.ts +44 -16
  91. package/dist/components/content/grid.js +308 -270
  92. package/dist/components/content/grid.js.map +1 -1
  93. package/dist/components/content/history.d.ts +6 -0
  94. package/dist/components/content/history.js +111 -0
  95. package/dist/components/content/history.js.map +1 -0
  96. package/dist/components/content/index.d.ts +6 -3
  97. package/dist/components/content/listing.d.ts +14 -3
  98. package/dist/components/content/listing.js +65 -56
  99. package/dist/components/content/listing.js.map +1 -1
  100. package/dist/components/content/offer-fields.js +6 -6
  101. package/dist/components/content/paged-grid.d.ts +10 -0
  102. package/dist/components/content/paged-grid.js +116 -0
  103. package/dist/components/content/paged-grid.js.map +1 -0
  104. package/dist/components/content/pagination.d.ts +19 -0
  105. package/dist/components/content/pagination.js +97 -0
  106. package/dist/components/content/pagination.js.map +1 -0
  107. package/dist/components/content/paywall.d.ts +9 -0
  108. package/dist/components/content/paywall.js +27 -3
  109. package/dist/components/content/paywall.js.map +1 -1
  110. package/dist/components/content/post-list.d.ts +37 -0
  111. package/dist/components/content/post-list.js +203 -0
  112. package/dist/components/content/post-list.js.map +1 -0
  113. package/dist/components/content/reader-settings.d.ts +2 -0
  114. package/dist/components/content/reader-settings.js +1 -1
  115. package/dist/components/content/reader-settings.js.map +1 -1
  116. package/dist/components/content/search.d.ts +11 -4
  117. package/dist/components/content/search.js +22 -11
  118. package/dist/components/content/search.js.map +1 -1
  119. package/dist/components/content/summary-tile.d.ts +14 -0
  120. package/dist/components/content/summary-tile.js +63 -0
  121. package/dist/components/content/summary-tile.js.map +1 -0
  122. package/dist/components/groups/banner.d.ts +6 -2
  123. package/dist/components/groups/banner.js +79 -61
  124. package/dist/components/groups/banner.js.map +1 -1
  125. package/dist/components/groups/directory.d.ts +12 -2
  126. package/dist/components/groups/directory.js +168 -105
  127. package/dist/components/groups/directory.js.map +1 -1
  128. package/dist/components/groups/editor.js +10 -10
  129. package/dist/components/groups/editor.js.map +1 -1
  130. package/dist/components/groups/entity-chips.d.ts +61 -0
  131. package/dist/components/groups/entity-chips.js +382 -0
  132. package/dist/components/groups/entity-chips.js.map +1 -0
  133. package/dist/components/groups/group-members.d.ts +29 -0
  134. package/dist/components/groups/group-members.js +474 -0
  135. package/dist/components/groups/group-members.js.map +1 -0
  136. package/dist/components/groups/header.js +53 -45
  137. package/dist/components/groups/header.js.map +1 -1
  138. package/dist/components/groups/index.d.ts +3 -1
  139. package/dist/components/groups/memberships.d.ts +3 -36
  140. package/dist/components/groups/memberships.js +105 -480
  141. package/dist/components/groups/memberships.js.map +1 -1
  142. package/dist/components/groups/scoped.d.ts +23 -0
  143. package/dist/components/groups/scoped.js +92 -0
  144. package/dist/components/groups/scoped.js.map +1 -0
  145. package/dist/components/media-folder-editor.d.ts +5 -0
  146. package/dist/components/media-folder-editor.js +419 -231
  147. package/dist/components/media-folder-editor.js.map +1 -1
  148. package/dist/components/sortable-list.d.ts +5 -1
  149. package/dist/components/sortable-list.js +97 -81
  150. package/dist/components/sortable-list.js.map +1 -1
  151. package/dist/components/video-mini-player.d.ts +4 -1
  152. package/dist/components/video-mini-player.js +77 -71
  153. package/dist/components/video-mini-player.js.map +1 -1
  154. package/dist/components/video-player.d.ts +4 -1
  155. package/dist/components/video-player.js +280 -276
  156. package/dist/components/video-player.js.map +1 -1
  157. package/dist/index.d.ts +2 -1
  158. package/dist/index.js +41 -34
  159. package/dist/locales/admin/de.js +80 -47
  160. package/dist/locales/admin/de.js.map +1 -1
  161. package/dist/locales/admin/en.d.ts +74 -41
  162. package/dist/locales/admin/en.js +80 -47
  163. package/dist/locales/admin/en.js.map +1 -1
  164. package/dist/locales/admin/es.js +80 -47
  165. package/dist/locales/admin/es.js.map +1 -1
  166. package/dist/locales/admin/ja.js +80 -47
  167. package/dist/locales/admin/ja.js.map +1 -1
  168. package/dist/locales/admin/ko.js +80 -47
  169. package/dist/locales/admin/ko.js.map +1 -1
  170. package/dist/locales/admin/zh.js +80 -47
  171. package/dist/locales/admin/zh.js.map +1 -1
  172. package/dist/locales/de.js +1 -0
  173. package/dist/locales/de.js.map +1 -1
  174. package/dist/locales/discovery/de.js +25 -2
  175. package/dist/locales/discovery/de.js.map +1 -1
  176. package/dist/locales/discovery/en.d.ts +24 -1
  177. package/dist/locales/discovery/en.js +25 -2
  178. package/dist/locales/discovery/en.js.map +1 -1
  179. package/dist/locales/discovery/es.js +25 -2
  180. package/dist/locales/discovery/es.js.map +1 -1
  181. package/dist/locales/discovery/ja.js +25 -2
  182. package/dist/locales/discovery/ja.js.map +1 -1
  183. package/dist/locales/discovery/ko.js +25 -2
  184. package/dist/locales/discovery/ko.js.map +1 -1
  185. package/dist/locales/discovery/zh.js +25 -2
  186. package/dist/locales/discovery/zh.js.map +1 -1
  187. package/dist/locales/en.d.ts +119 -44
  188. package/dist/locales/en.js +1 -0
  189. package/dist/locales/en.js.map +1 -1
  190. package/dist/locales/es.js +1 -0
  191. package/dist/locales/es.js.map +1 -1
  192. package/dist/locales/groups/de.js +22 -4
  193. package/dist/locales/groups/de.js.map +1 -1
  194. package/dist/locales/groups/en.d.ts +20 -2
  195. package/dist/locales/groups/en.js +22 -4
  196. package/dist/locales/groups/en.js.map +1 -1
  197. package/dist/locales/groups/es.js +22 -4
  198. package/dist/locales/groups/es.js.map +1 -1
  199. package/dist/locales/groups/ja.js +22 -4
  200. package/dist/locales/groups/ja.js.map +1 -1
  201. package/dist/locales/groups/ko.js +22 -4
  202. package/dist/locales/groups/ko.js.map +1 -1
  203. package/dist/locales/groups/zh.js +22 -4
  204. package/dist/locales/groups/zh.js.map +1 -1
  205. package/dist/locales/ja.js +1 -0
  206. package/dist/locales/ja.js.map +1 -1
  207. package/dist/locales/ko.js +1 -0
  208. package/dist/locales/ko.js.map +1 -1
  209. package/dist/locales/zh.js +1 -0
  210. package/dist/locales/zh.js.map +1 -1
  211. package/dist/react/discovery.d.ts +36 -17
  212. package/dist/react/discovery.js +305 -221
  213. package/dist/react/discovery.js.map +1 -1
  214. package/dist/react/groups.d.ts +19 -3
  215. package/dist/react/groups.js +49 -22
  216. package/dist/react/groups.js.map +1 -1
  217. package/dist/react/index.d.ts +7 -4
  218. package/dist/react/page-notices.d.ts +13 -0
  219. package/dist/react/page-notices.js +38 -0
  220. package/dist/react/page-notices.js.map +1 -0
  221. package/dist/react/post-reads.d.ts +23 -0
  222. package/dist/react/post-reads.js +90 -0
  223. package/dist/react/post-reads.js.map +1 -0
  224. package/dist/react/remembered-sort.d.ts +5 -0
  225. package/dist/react/remembered-sort.js +29 -0
  226. package/dist/react/remembered-sort.js.map +1 -0
  227. package/dist/react/resources.d.ts +3 -1
  228. package/dist/react/resources.js +6 -2
  229. package/dist/react/resources.js.map +1 -1
  230. package/dist/react/stats.d.ts +3 -7
  231. package/dist/react/stats.js +2 -6
  232. package/dist/react/stats.js.map +1 -1
  233. package/dist/react/use-engagement.d.ts +28 -0
  234. package/dist/react/use-engagement.js +226 -0
  235. package/dist/react/use-engagement.js.map +1 -0
  236. package/dist/react/use-resource.d.ts +4 -3
  237. package/dist/react/use-resource.js +2 -1
  238. package/dist/react/use-resource.js.map +1 -1
  239. package/dist/react.js +29 -26
  240. package/dist/styles.css +1 -1
  241. package/dist/ui/dialog.d.ts +2 -1
  242. package/dist/ui/dialog.js +23 -20
  243. package/dist/ui/dialog.js.map +1 -1
  244. package/dist/urls/index.d.ts +1 -1
  245. package/dist/urls.js +2 -2
  246. package/dist/urls.js.map +1 -1
  247. package/package.json +1 -1
  248. package/dist/components/admin/page-review.d.ts +0 -13
  249. package/dist/components/admin/page-review.js +0 -225
  250. package/dist/components/admin/page-review.js.map +0 -1
  251. package/dist/react/page-review.d.ts +0 -14
  252. package/dist/react/page-review.js +0 -37
  253. package/dist/react/page-review.js.map +0 -1
@@ -1,28 +1,29 @@
1
- import { isProcessing as e } from "../../client/media/windows.js";
2
- import { createContext as t, useCallback as n, useContext as r, useLayoutEffect as i, useRef as a, useState as o } from "react";
1
+ import { ruleFor as e } from "../../client/media/rules.js";
2
+ import { isProcessing as t, pageRemoved as n } from "../../client/media/windows.js";
3
+ import { createContext as r, useCallback as i, useContext as a, useLayoutEffect as o, useRef as s, useState as c } from "react";
3
4
  //#region src/components/content/editor-save.tsx
4
- var s = t(null);
5
- function c(e, t) {
6
- let n = r(s), o = n?.register, c = n?.changed, l = a(t);
7
- l.current = t, i(() => o?.(e, l), [o, e]), i(() => c?.(), [
8
- c,
5
+ var l = r(null);
6
+ function u(e, t) {
7
+ let n = a(l), r = n?.register, i = n?.changed, c = s(t);
8
+ c.current = t, o(() => r?.(e, c), [r, e]), o(() => i?.(), [
9
+ i,
9
10
  t.dirty,
10
11
  t.pending,
11
12
  t.valid
12
13
  ]);
13
14
  }
14
- function l() {
15
- let e = a(/* @__PURE__ */ new Map()), [, t] = o(0), r = n(() => t((e) => e + 1), []), i = n((t, n) => (e.current.set(t, n), r(), () => {
16
- e.current.delete(t), r();
17
- }), [r]), s = () => [...e.current.values()].map((e) => e.current).find((e) => e.pending || e.dirty && !e.valid)?.label;
15
+ function d() {
16
+ let e = s(/* @__PURE__ */ new Map()), [, t] = c(0), n = i(() => t((e) => e + 1), []), r = i((t, r) => (e.current.set(t, r), n(), () => {
17
+ e.current.delete(t), n();
18
+ }), [n]), a = () => [...e.current.values()].map((e) => e.current).find((e) => e.pending || e.dirty && !e.valid)?.label;
18
19
  return {
19
20
  context: {
20
- register: i,
21
- changed: r
21
+ register: r,
22
+ changed: n
22
23
  },
23
- problem: s,
24
+ problem: a,
24
25
  save: async (t) => {
25
- let n = s();
26
+ let n = a();
26
27
  if (n) return n;
27
28
  let r = [...e.current.values()].sort((e, t) => (e.current.order ?? 0) - (t.current.order ?? 0));
28
29
  for (let e of r) if (!t() || e.current.dirty && !await e.current.save()) return e.current.label;
@@ -31,21 +32,22 @@ function l() {
31
32
  dirty: [...e.current.values()].some((e) => e.current.dirty)
32
33
  };
33
34
  }
34
- async function u(t, n) {
35
- if (!n.version || !(await t.versions.pages(n.id, n.version)).selected) return !1;
36
- let r = 0, i;
35
+ async function f(r, i) {
36
+ if (!i.version) return !1;
37
+ let a = 0, o, s = 0;
37
38
  do {
38
- let a = await t.media.read(n, {
39
+ let c = await r.media.read(i, {
39
40
  editor: !0,
40
- offset: r,
41
+ offset: a,
41
42
  limit: 200
42
43
  });
43
- if (a.files.some((t) => !!t.failed || e(t))) return !1;
44
- i = a.total, r += a.limit || 200;
45
- } while (r < i);
46
- return i > 0;
44
+ if (c.files.some((e) => !!e.failed || t(e))) return !1;
45
+ let l = c.uploads ?? [];
46
+ s += c.files.filter((t) => t.upload && e(l, t.path)?.page && !n(t)).length, o = c.total, a += c.limit || 200;
47
+ } while (a < o);
48
+ return s > 0;
47
49
  }
48
50
  //#endregion
49
- export { s as EditorSaveContext, u as readerMediaReady, l as useEditorSaveCoordinator, c as useEditorSaveTask };
51
+ export { l as EditorSaveContext, f as readerMediaReady, d as useEditorSaveCoordinator, u as useEditorSaveTask };
50
52
 
51
53
  //# sourceMappingURL=editor-save.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"editor-save.js","names":[],"sources":["../../../src/components/content/editor-save.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useLayoutEffect, useRef, useState, type RefObject } from \"react\";\nimport type { ContentKitClient } from \"../../client/client.js\";\nimport type { RefBody } from \"../../client/generated/wire.js\";\nimport { isProcessing } from \"../../client/media/windows.js\";\n\ninterface EditorTask {\n label: string;\n dirty: boolean;\n pending: boolean;\n valid: boolean;\n save: () => Promise<boolean>;\n order?: number;\n}\n\ninterface EditorTasks {\n register: (id: string, task: RefObject<EditorTask>) => () => void;\n changed: () => void;\n}\n\n/** Optional coordination for an editor's existing independently usable tools. */\nexport const EditorSaveContext = createContext<EditorTasks | null>(null);\n\nexport function useEditorSaveTask(id: string, task: EditorTask) {\n const context = useContext(EditorSaveContext);\n const register = context?.register;\n const changed = context?.changed;\n const current = useRef(task);\n current.current = task;\n useLayoutEffect(() => register?.(id, current), [register, id]);\n useLayoutEffect(() => changed?.(), [changed, task.dirty, task.pending, task.valid]);\n}\n\n/** Save only dirty tools, before publication; a refused save never publishes. */\nexport function useEditorSaveCoordinator() {\n const tasks = useRef(new Map<string, RefObject<EditorTask>>());\n const [, refresh] = useState(0);\n const changed = useCallback(() => refresh((value) => value + 1), []);\n const register = useCallback(\n (id: string, task: RefObject<EditorTask>) => {\n tasks.current.set(id, task);\n changed();\n return () => {\n tasks.current.delete(id);\n changed();\n };\n },\n [changed],\n );\n const problem = () => [...tasks.current.values()].map((r) => r.current).find((t) => t.pending || (t.dirty && !t.valid))?.label;\n const save = async (current: () => boolean) => {\n const invalid = problem();\n if (invalid) return invalid;\n const ordered = [...tasks.current.values()].sort((a, b) => (a.current.order ?? 0) - (b.current.order ?? 0));\n for (const ref of ordered) {\n if (!current()) return ref.current.label;\n if (ref.current.dirty && !(await ref.current.save())) return ref.current.label;\n }\n return undefined;\n };\n return {\n context: { register, changed },\n problem,\n save,\n pending: [...tasks.current.values()].some((t) => t.current.pending),\n dirty: [...tasks.current.values()].some((t) => t.current.dirty),\n };\n}\n\n/** Check every metadata window, not only the first page of a long gallery. */\nexport async function readerMediaReady(client: ContentKitClient, ref: RefBody): Promise<boolean> {\n if (!ref.version) return false;\n const pages = await client.versions.pages(ref.id, ref.version);\n if (!pages.selected) return false;\n let offset = 0;\n let total: number;\n do {\n const read = await client.media.read(ref, { editor: true, offset, limit: 200 });\n if (read.files.some((file) => !!file.failed || isProcessing(file))) return false;\n total = read.total;\n offset += read.limit || 200;\n } while (offset < total);\n return total > 0;\n}\n"],"mappings":";;;AAoBA,IAAa,IAAoB,EAAkC,IAAI;AAEvE,SAAgB,EAAkB,GAAY,GAAkB;CAC9D,IAAM,IAAU,EAAW,CAAiB,GACtC,IAAW,GAAS,UACpB,IAAU,GAAS,SACnB,IAAU,EAAO,CAAI;CAG3B,AAFA,EAAQ,UAAU,GAClB,QAAsB,IAAW,GAAI,CAAO,GAAG,CAAC,GAAU,CAAE,CAAC,GAC7D,QAAsB,IAAU,GAAG;EAAC;EAAS,EAAK;EAAO,EAAK;EAAS,EAAK;CAAK,CAAC;AACpF;AAGA,SAAgB,IAA2B;CACzC,IAAM,IAAQ,kBAAO,IAAI,IAAmC,CAAC,GACvD,GAAG,KAAW,EAAS,CAAC,GACxB,IAAU,QAAkB,GAAS,MAAU,IAAQ,CAAC,GAAG,CAAC,CAAC,GAC7D,IAAW,GACd,GAAY,OACX,EAAM,QAAQ,IAAI,GAAI,CAAI,GAC1B,EAAQ,SACK;EAEX,AADA,EAAM,QAAQ,OAAO,CAAE,GACvB,EAAQ;CACV,IAEF,CAAC,CAAO,CACV,GACM,UAAgB,CAAC,GAAG,EAAM,QAAQ,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,MAAM,EAAE,WAAY,EAAE,SAAS,CAAC,EAAE,KAAM,CAAC,EAAE;CAWzH,OAAO;EACL,SAAS;GAAE;GAAU;EAAQ;EAC7B;EACA,aAbkB,MAA2B;GAC7C,IAAM,IAAU,EAAQ;GACxB,IAAI,GAAS,OAAO;GACpB,IAAM,IAAU,CAAC,GAAG,EAAM,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,EAAE,QAAQ,SAAS,MAAM,EAAE,QAAQ,SAAS,EAAE;GAC1G,KAAK,IAAM,KAAO,GAEhB,IADI,CAAC,EAAQ,KACT,EAAI,QAAQ,SAAS,CAAE,MAAM,EAAI,QAAQ,KAAK,GAAI,OAAO,EAAI,QAAQ;EAG7E;EAKE,SAAS,CAAC,GAAG,EAAM,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,QAAQ,OAAO;EAClE,OAAO,CAAC,GAAG,EAAM,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,QAAQ,KAAK;CAChE;AACF;AAGA,eAAsB,EAAiB,GAA0B,GAAgC;CAG/F,IAFI,CAAC,EAAI,WAEL,EAAC,MADe,EAAO,SAAS,MAAM,EAAI,IAAI,EAAI,OAAO,EAAA,CAClD,UAAU,OAAO;CAC5B,IAAI,IAAS,GACT;CACJ,GAAG;EACD,IAAM,IAAO,MAAM,EAAO,MAAM,KAAK,GAAK;GAAE,QAAQ;GAAM;GAAQ,OAAO;EAAI,CAAC;EAC9E,IAAI,EAAK,MAAM,MAAM,MAAS,CAAC,CAAC,EAAK,UAAU,EAAa,CAAI,CAAC,GAAG,OAAO;EAE3E,AADA,IAAQ,EAAK,OACb,KAAU,EAAK,SAAS;CAC1B,SAAS,IAAS;CAClB,OAAO,IAAQ;AACjB"}
1
+ {"version":3,"file":"editor-save.js","names":[],"sources":["../../../src/components/content/editor-save.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useLayoutEffect, useRef, useState, type RefObject } from \"react\";\nimport type { ContentKitClient } from \"../../client/client.js\";\nimport type { RefBody } from \"../../client/generated/wire.js\";\nimport { ruleFor } from \"../../client/media/rules.js\";\nimport { isProcessing, pageRemoved } from \"../../client/media/windows.js\";\n\ninterface EditorTask {\n label: string;\n dirty: boolean;\n pending: boolean;\n valid: boolean;\n save: () => Promise<boolean>;\n order?: number;\n}\n\ninterface EditorTasks {\n register: (id: string, task: RefObject<EditorTask>) => () => void;\n changed: () => void;\n}\n\n/** Optional coordination for an editor's existing independently usable tools. */\nexport const EditorSaveContext = createContext<EditorTasks | null>(null);\n\nexport function useEditorSaveTask(id: string, task: EditorTask) {\n const context = useContext(EditorSaveContext);\n const register = context?.register;\n const changed = context?.changed;\n const current = useRef(task);\n current.current = task;\n useLayoutEffect(() => register?.(id, current), [register, id]);\n useLayoutEffect(() => changed?.(), [changed, task.dirty, task.pending, task.valid]);\n}\n\n/** Save only dirty tools, before publication; a refused save never publishes. */\nexport function useEditorSaveCoordinator() {\n const tasks = useRef(new Map<string, RefObject<EditorTask>>());\n const [, refresh] = useState(0);\n const changed = useCallback(() => refresh((value) => value + 1), []);\n const register = useCallback(\n (id: string, task: RefObject<EditorTask>) => {\n tasks.current.set(id, task);\n changed();\n return () => {\n tasks.current.delete(id);\n changed();\n };\n },\n [changed],\n );\n const problem = () => [...tasks.current.values()].map((r) => r.current).find((t) => t.pending || (t.dirty && !t.valid))?.label;\n const save = async (current: () => boolean) => {\n const invalid = problem();\n if (invalid) return invalid;\n const ordered = [...tasks.current.values()].sort((a, b) => (a.current.order ?? 0) - (b.current.order ?? 0));\n for (const ref of ordered) {\n if (!current()) return ref.current.label;\n if (ref.current.dirty && !(await ref.current.save())) return ref.current.label;\n }\n return undefined;\n };\n return {\n context: { register, changed },\n problem,\n save,\n pending: [...tasks.current.values()].some((t) => t.current.pending),\n dirty: [...tasks.current.values()].some((t) => t.current.dirty),\n };\n}\n\n/** Check every metadata window, not only the first page of a long gallery. */\nexport async function readerMediaReady(client: ContentKitClient, ref: RefBody): Promise<boolean> {\n if (!ref.version) return false;\n let offset = 0;\n let total: number;\n let pages = 0;\n do {\n const read = await client.media.read(ref, { editor: true, offset, limit: 200 });\n if (read.files.some((file) => !!file.failed || isProcessing(file))) return false;\n const rules = read.uploads ?? [];\n pages += read.files.filter((file) => file.upload && ruleFor(rules, file.path)?.page && !pageRemoved(file)).length;\n total = read.total;\n offset += read.limit || 200;\n } while (offset < total);\n return pages > 0;\n}\n"],"mappings":";;;;AAqBA,IAAa,IAAoB,EAAkC,IAAI;AAEvE,SAAgB,EAAkB,GAAY,GAAkB;CAC9D,IAAM,IAAU,EAAW,CAAiB,GACtC,IAAW,GAAS,UACpB,IAAU,GAAS,SACnB,IAAU,EAAO,CAAI;CAG3B,AAFA,EAAQ,UAAU,GAClB,QAAsB,IAAW,GAAI,CAAO,GAAG,CAAC,GAAU,CAAE,CAAC,GAC7D,QAAsB,IAAU,GAAG;EAAC;EAAS,EAAK;EAAO,EAAK;EAAS,EAAK;CAAK,CAAC;AACpF;AAGA,SAAgB,IAA2B;CACzC,IAAM,IAAQ,kBAAO,IAAI,IAAmC,CAAC,GACvD,GAAG,KAAW,EAAS,CAAC,GACxB,IAAU,QAAkB,GAAS,MAAU,IAAQ,CAAC,GAAG,CAAC,CAAC,GAC7D,IAAW,GACd,GAAY,OACX,EAAM,QAAQ,IAAI,GAAI,CAAI,GAC1B,EAAQ,SACK;EAEX,AADA,EAAM,QAAQ,OAAO,CAAE,GACvB,EAAQ;CACV,IAEF,CAAC,CAAO,CACV,GACM,UAAgB,CAAC,GAAG,EAAM,QAAQ,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,MAAM,EAAE,WAAY,EAAE,SAAS,CAAC,EAAE,KAAM,CAAC,EAAE;CAWzH,OAAO;EACL,SAAS;GAAE;GAAU;EAAQ;EAC7B;EACA,aAbkB,MAA2B;GAC7C,IAAM,IAAU,EAAQ;GACxB,IAAI,GAAS,OAAO;GACpB,IAAM,IAAU,CAAC,GAAG,EAAM,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,EAAE,QAAQ,SAAS,MAAM,EAAE,QAAQ,SAAS,EAAE;GAC1G,KAAK,IAAM,KAAO,GAEhB,IADI,CAAC,EAAQ,KACT,EAAI,QAAQ,SAAS,CAAE,MAAM,EAAI,QAAQ,KAAK,GAAI,OAAO,EAAI,QAAQ;EAG7E;EAKE,SAAS,CAAC,GAAG,EAAM,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,QAAQ,OAAO;EAClE,OAAO,CAAC,GAAG,EAAM,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,QAAQ,KAAK;CAChE;AACF;AAGA,eAAsB,EAAiB,GAA0B,GAAgC;CAC/F,IAAI,CAAC,EAAI,SAAS,OAAO;CACzB,IAAI,IAAS,GACT,GACA,IAAQ;CACZ,GAAG;EACD,IAAM,IAAO,MAAM,EAAO,MAAM,KAAK,GAAK;GAAE,QAAQ;GAAM;GAAQ,OAAO;EAAI,CAAC;EAC9E,IAAI,EAAK,MAAM,MAAM,MAAS,CAAC,CAAC,EAAK,UAAU,EAAa,CAAI,CAAC,GAAG,OAAO;EAC3E,IAAM,IAAQ,EAAK,WAAW,CAAC;EAG/B,AAFA,KAAS,EAAK,MAAM,QAAQ,MAAS,EAAK,UAAU,EAAQ,GAAO,EAAK,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAY,CAAI,CAAC,CAAC,CAAC,QAC3G,IAAQ,EAAK,OACb,KAAU,EAAK,SAAS;CAC1B,SAAS,IAAS;CAClB,OAAO,IAAQ;AACjB"}