@openrails/contentkit-ui 0.104.0-rc.1 → 0.104.0-rc.3

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 (217) hide show
  1. package/README.md +6 -6
  2. package/dist/client/beacons.js +4 -1
  3. package/dist/client/beacons.js.map +1 -1
  4. package/dist/client/contents.d.ts +9 -1
  5. package/dist/client/contents.js +73 -55
  6. package/dist/client/contents.js.map +1 -1
  7. package/dist/client/discovery.d.ts +6 -2
  8. package/dist/client/discovery.js +1 -1
  9. package/dist/client/discovery.js.map +1 -1
  10. package/dist/client/generated/error-codes.d.ts +1 -1
  11. package/dist/client/generated/error-codes.js +4 -0
  12. package/dist/client/generated/error-codes.js.map +1 -1
  13. package/dist/client/generated/routes.d.ts +43 -30
  14. package/dist/client/generated/routes.js +70 -63
  15. package/dist/client/generated/routes.js.map +1 -1
  16. package/dist/client/generated/wire.d.ts +36 -74
  17. package/dist/client/generated/wire.js.map +1 -1
  18. package/dist/client/index.d.ts +1 -1
  19. package/dist/client/media/windows.d.ts +2 -0
  20. package/dist/client/media/windows.js +4 -1
  21. package/dist/client/media/windows.js.map +1 -1
  22. package/dist/client/stats.d.ts +4 -20
  23. package/dist/client/stats.js +0 -11
  24. package/dist/client/stats.js.map +1 -1
  25. package/dist/client/versions.d.ts +8 -6
  26. package/dist/client/versions.js +15 -10
  27. package/dist/client/versions.js.map +1 -1
  28. package/dist/components/admin/bulk-drafts.d.ts +17 -0
  29. package/dist/components/admin/bulk-drafts.js +41 -0
  30. package/dist/components/admin/bulk-drafts.js.map +1 -0
  31. package/dist/components/admin/content-admin.d.ts +1 -1
  32. package/dist/components/admin/content-admin.js.map +1 -1
  33. package/dist/components/admin/content-manager.d.ts +11 -3
  34. package/dist/components/admin/content-manager.js +739 -380
  35. package/dist/components/admin/content-manager.js.map +1 -1
  36. package/dist/components/admin/group-manager.d.ts +8 -3
  37. package/dist/components/admin/group-manager.js +218 -146
  38. package/dist/components/admin/group-manager.js.map +1 -1
  39. package/dist/components/admin/page-notices.d.ts +16 -0
  40. package/dist/components/admin/page-notices.js +113 -0
  41. package/dist/components/admin/page-notices.js.map +1 -0
  42. package/dist/components/admin/page-picker.d.ts +38 -0
  43. package/dist/components/admin/page-picker.js +159 -0
  44. package/dist/components/admin/page-picker.js.map +1 -0
  45. package/dist/components/admin/reader-content-editor.js +537 -500
  46. package/dist/components/admin/reader-content-editor.js.map +1 -1
  47. package/dist/components/admin/reader-manifest.js +181 -179
  48. package/dist/components/admin/reader-manifest.js.map +1 -1
  49. package/dist/components/admin/shell.d.ts +10 -2
  50. package/dist/components/admin/shell.js +114 -42
  51. package/dist/components/admin/shell.js.map +1 -1
  52. package/dist/components/admin/stats-dashboard.d.ts +4 -9
  53. package/dist/components/admin/stats-dashboard.js +300 -202
  54. package/dist/components/admin/stats-dashboard.js.map +1 -1
  55. package/dist/components/admin/upload-queue.d.ts +14 -0
  56. package/dist/components/admin/upload-queue.js +115 -98
  57. package/dist/components/admin/upload-queue.js.map +1 -1
  58. package/dist/components/content/card.d.ts +31 -3
  59. package/dist/components/content/card.js +324 -158
  60. package/dist/components/content/card.js.map +1 -1
  61. package/dist/components/content/daily-releases.js +14 -12
  62. package/dist/components/content/daily-releases.js.map +1 -1
  63. package/dist/components/content/editor-save.js +27 -25
  64. package/dist/components/content/editor-save.js.map +1 -1
  65. package/dist/components/content/editors.js +274 -253
  66. package/dist/components/content/editors.js.map +1 -1
  67. package/dist/components/content/favorites.d.ts +1 -1
  68. package/dist/components/content/favorites.js +36 -22
  69. package/dist/components/content/favorites.js.map +1 -1
  70. package/dist/components/content/grid.d.ts +11 -4
  71. package/dist/components/content/grid.js +52 -43
  72. package/dist/components/content/grid.js.map +1 -1
  73. package/dist/components/content/history.js +83 -63
  74. package/dist/components/content/history.js.map +1 -1
  75. package/dist/components/content/index.d.ts +5 -3
  76. package/dist/components/content/listing.d.ts +14 -3
  77. package/dist/components/content/listing.js +65 -56
  78. package/dist/components/content/listing.js.map +1 -1
  79. package/dist/components/content/offer-fields.js +6 -6
  80. package/dist/components/content/paged-grid.d.ts +10 -0
  81. package/dist/components/content/paged-grid.js +116 -0
  82. package/dist/components/content/paged-grid.js.map +1 -0
  83. package/dist/components/content/pagination.d.ts +19 -0
  84. package/dist/components/content/pagination.js +97 -0
  85. package/dist/components/content/pagination.js.map +1 -0
  86. package/dist/components/content/paywall.d.ts +9 -0
  87. package/dist/components/content/paywall.js +27 -3
  88. package/dist/components/content/paywall.js.map +1 -1
  89. package/dist/components/content/post-list.d.ts +37 -0
  90. package/dist/components/content/post-list.js +203 -0
  91. package/dist/components/content/post-list.js.map +1 -0
  92. package/dist/components/content/reader-settings.d.ts +2 -0
  93. package/dist/components/content/reader-settings.js +1 -1
  94. package/dist/components/content/reader-settings.js.map +1 -1
  95. package/dist/components/groups/banner.d.ts +6 -2
  96. package/dist/components/groups/banner.js +79 -61
  97. package/dist/components/groups/banner.js.map +1 -1
  98. package/dist/components/groups/directory.d.ts +12 -2
  99. package/dist/components/groups/directory.js +168 -105
  100. package/dist/components/groups/directory.js.map +1 -1
  101. package/dist/components/groups/editor.js +10 -10
  102. package/dist/components/groups/editor.js.map +1 -1
  103. package/dist/components/groups/entity-chips.d.ts +61 -0
  104. package/dist/components/groups/entity-chips.js +382 -0
  105. package/dist/components/groups/entity-chips.js.map +1 -0
  106. package/dist/components/groups/group-members.d.ts +29 -0
  107. package/dist/components/groups/group-members.js +474 -0
  108. package/dist/components/groups/group-members.js.map +1 -0
  109. package/dist/components/groups/header.js +53 -45
  110. package/dist/components/groups/header.js.map +1 -1
  111. package/dist/components/groups/index.d.ts +3 -1
  112. package/dist/components/groups/memberships.d.ts +3 -36
  113. package/dist/components/groups/memberships.js +105 -480
  114. package/dist/components/groups/memberships.js.map +1 -1
  115. package/dist/components/groups/scoped.d.ts +23 -0
  116. package/dist/components/groups/scoped.js +92 -0
  117. package/dist/components/groups/scoped.js.map +1 -0
  118. package/dist/components/media-folder-editor.d.ts +5 -0
  119. package/dist/components/media-folder-editor.js +418 -230
  120. package/dist/components/media-folder-editor.js.map +1 -1
  121. package/dist/components/social/poll.js +57 -48
  122. package/dist/components/social/poll.js.map +1 -1
  123. package/dist/components/sortable-list.d.ts +5 -1
  124. package/dist/components/sortable-list.js +97 -81
  125. package/dist/components/sortable-list.js.map +1 -1
  126. package/dist/index.d.ts +1 -1
  127. package/dist/index.js +41 -37
  128. package/dist/locales/admin/de.js +78 -45
  129. package/dist/locales/admin/de.js.map +1 -1
  130. package/dist/locales/admin/en.d.ts +74 -41
  131. package/dist/locales/admin/en.js +78 -45
  132. package/dist/locales/admin/en.js.map +1 -1
  133. package/dist/locales/admin/es.js +78 -45
  134. package/dist/locales/admin/es.js.map +1 -1
  135. package/dist/locales/admin/ja.js +78 -45
  136. package/dist/locales/admin/ja.js.map +1 -1
  137. package/dist/locales/admin/ko.js +78 -45
  138. package/dist/locales/admin/ko.js.map +1 -1
  139. package/dist/locales/admin/zh.js +78 -45
  140. package/dist/locales/admin/zh.js.map +1 -1
  141. package/dist/locales/de.js +2 -0
  142. package/dist/locales/de.js.map +1 -1
  143. package/dist/locales/discovery/de.js +25 -1
  144. package/dist/locales/discovery/de.js.map +1 -1
  145. package/dist/locales/discovery/en.d.ts +24 -0
  146. package/dist/locales/discovery/en.js +25 -1
  147. package/dist/locales/discovery/en.js.map +1 -1
  148. package/dist/locales/discovery/es.js +25 -1
  149. package/dist/locales/discovery/es.js.map +1 -1
  150. package/dist/locales/discovery/ja.js +25 -1
  151. package/dist/locales/discovery/ja.js.map +1 -1
  152. package/dist/locales/discovery/ko.js +25 -1
  153. package/dist/locales/discovery/ko.js.map +1 -1
  154. package/dist/locales/discovery/zh.js +25 -1
  155. package/dist/locales/discovery/zh.js.map +1 -1
  156. package/dist/locales/en.d.ts +120 -43
  157. package/dist/locales/en.js +2 -0
  158. package/dist/locales/en.js.map +1 -1
  159. package/dist/locales/es.js +2 -0
  160. package/dist/locales/es.js.map +1 -1
  161. package/dist/locales/groups/de.js +22 -4
  162. package/dist/locales/groups/de.js.map +1 -1
  163. package/dist/locales/groups/en.d.ts +20 -2
  164. package/dist/locales/groups/en.js +22 -4
  165. package/dist/locales/groups/en.js.map +1 -1
  166. package/dist/locales/groups/es.js +22 -4
  167. package/dist/locales/groups/es.js.map +1 -1
  168. package/dist/locales/groups/ja.js +22 -4
  169. package/dist/locales/groups/ja.js.map +1 -1
  170. package/dist/locales/groups/ko.js +22 -4
  171. package/dist/locales/groups/ko.js.map +1 -1
  172. package/dist/locales/groups/zh.js +22 -4
  173. package/dist/locales/groups/zh.js.map +1 -1
  174. package/dist/locales/ja.js +2 -0
  175. package/dist/locales/ja.js.map +1 -1
  176. package/dist/locales/ko.js +2 -0
  177. package/dist/locales/ko.js.map +1 -1
  178. package/dist/locales/zh.js +2 -0
  179. package/dist/locales/zh.js.map +1 -1
  180. package/dist/react/contents.js +1 -1
  181. package/dist/react/contents.js.map +1 -1
  182. package/dist/react/discovery.d.ts +16 -0
  183. package/dist/react/discovery.js +69 -37
  184. package/dist/react/discovery.js.map +1 -1
  185. package/dist/react/groups.d.ts +19 -3
  186. package/dist/react/groups.js +49 -22
  187. package/dist/react/groups.js.map +1 -1
  188. package/dist/react/index.d.ts +6 -4
  189. package/dist/react/page-notices.d.ts +13 -0
  190. package/dist/react/page-notices.js +38 -0
  191. package/dist/react/page-notices.js.map +1 -0
  192. package/dist/react/post-reads.d.ts +23 -0
  193. package/dist/react/post-reads.js +90 -0
  194. package/dist/react/post-reads.js.map +1 -0
  195. package/dist/react/remembered-sort.d.ts +5 -0
  196. package/dist/react/remembered-sort.js +29 -0
  197. package/dist/react/remembered-sort.js.map +1 -0
  198. package/dist/react/resources.js +2 -2
  199. package/dist/react/resources.js.map +1 -1
  200. package/dist/react/stats.d.ts +3 -7
  201. package/dist/react/stats.js +2 -6
  202. package/dist/react/stats.js.map +1 -1
  203. package/dist/react/use-engagement.d.ts +2 -0
  204. package/dist/react/use-engagement.js +40 -34
  205. package/dist/react/use-engagement.js.map +1 -1
  206. package/dist/react.js +29 -27
  207. package/dist/styles.css +1 -1
  208. package/dist/urls/index.d.ts +1 -1
  209. package/dist/urls.js +2 -2
  210. package/dist/urls.js.map +1 -1
  211. package/package.json +1 -1
  212. package/dist/components/admin/page-review.d.ts +0 -13
  213. package/dist/components/admin/page-review.js +0 -225
  214. package/dist/components/admin/page-review.js.map +0 -1
  215. package/dist/react/page-review.d.ts +0 -14
  216. package/dist/react/page-review.js +0 -37
  217. package/dist/react/page-review.js.map +0 -1
@@ -1,534 +1,159 @@
1
1
  import { useMessages as e } from "../../i18n/context.js";
2
2
  import { ContentKitUiRoot as t } from "../../scope.js";
3
- import { useContentGroups as n, useGroupMembers as r, useKinds as i } from "../../react/groups.js";
4
- import { Button as a } from "../../ui/button.js";
5
- import { SortableList as o } from "../sortable-list.js";
6
- import { Badge as s } from "../../ui/badge.js";
7
- import { Input as c } from "../../ui/input.js";
8
- import { Label as l } from "../../ui/label.js";
9
- import { Select as u, SelectContent as d, SelectItem as f, SelectTrigger as p, SelectValue as m } from "../../ui/select.js";
10
- import { Skeleton as h } from "../../ui/skeleton.js";
11
- import { ErrorLine as g, contentError as _, formatDate as v, useAction as y } from "../social/parts.js";
12
- import { fromLocalInput as b, toLocalInput as x } from "../../client/group-fields.js";
13
- import { GroupPicker as S, labelOf as C } from "./parts.js";
14
- import { useEffect as w, useId as T, useMemo as E, useRef as D, useState as O } from "react";
15
- import { Fragment as k, jsx as A, jsxs as j } from "react/jsx-runtime";
16
- import { cn as M } from "cn";
3
+ import { useContentGroups as n, useKinds as r } from "../../react/groups.js";
4
+ import { Button as i } from "../../ui/button.js";
5
+ import { Skeleton as a } from "../../ui/skeleton.js";
6
+ import { ErrorLine as o, contentError as s, useAction as c } from "../social/parts.js";
7
+ import { labelOf as l } from "./parts.js";
8
+ import { EntityChips as u } from "./entity-chips.js";
9
+ import { useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
10
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
11
+ import { cn as _ } from "cn";
17
12
  //#region src/components/groups/memberships.tsx
18
- var N = "__none__", P = ({ key: e, ...t }) => t, F = (e, t) => JSON.stringify(e) === JSON.stringify(t);
19
- function I(r) {
20
- let o = e(), { t: s } = o, { kinds: c, loading: l } = i({ client: r.client }), u = n(r.content, {
21
- language: r.language,
22
- client: r.client
23
- }), d = E(() => r.groupKinds ?? c?.kinds[r.contentKind]?.entities ?? [], [
24
- r.groupKinds,
25
- c,
26
- r.contentKind
27
- ]), [f, p] = O(/* @__PURE__ */ new Map()), m = E(() => new Map([...u.entities, ...f]), [u.entities, f]), v = D(0), b = E(() => u.memberships.filter((e) => d.includes(u.entities.get(e.group_id ?? "")?.kind ?? "")).map((e) => ({
13
+ var v = ({ key: e, ...t }) => t, y = (e, t) => JSON.stringify(e) === JSON.stringify(t);
14
+ function b(b) {
15
+ let x = e(), { t: S } = x, { kinds: C, loading: w } = r({ client: b.client }), T = n(b.content, {
16
+ language: b.language,
17
+ client: b.client
18
+ }), E = f(() => b.groupKinds ?? C?.kinds[b.contentKind]?.entities ?? [], [
19
+ b.groupKinds,
20
+ C,
21
+ b.contentKind
22
+ ]), [D, O] = m(/* @__PURE__ */ new Map()), k = f(() => new Map([...T.entities, ...D]), [T.entities, D]), A = p(0), j = f(() => T.memberships.filter((e) => E.includes(T.entities.get(e.group_id ?? "")?.kind ?? "")).map((e) => ({
28
23
  ...e,
29
24
  content_id: void 0
30
25
  })), [
31
- u.memberships,
32
- u.entities,
33
- d
34
- ]), [x, T] = O([]), k = !F(x.map(P), b), N = D(k);
35
- N.current = k, w(() => {
36
- (!N.current || !x.length) && T(b.map((e) => ({
26
+ T.memberships,
27
+ T.entities,
28
+ E
29
+ ]), [M, N] = m([]), [P, F] = m({}), I = (e) => {
30
+ let t = C?.entity_kinds?.[e]?.scoped_by;
31
+ if (t) return new Set(M.filter((e) => k.get(e.group_id ?? "")?.kind === t).map((e) => e.group_id)).size + (P[t]?.length ?? 0) === 1 ? void 0 : l(b.labels, t);
32
+ }, L = Object.entries(P).flatMap(([e, t]) => I(e) ? [] : t.map((t) => ({
33
+ kind: e,
34
+ name: t,
35
+ language: b.language
36
+ }))), R = !y(M.map(v), j) || L.length > 0, z = p(R);
37
+ z.current = R, d(() => {
38
+ (!z.current || !M.length) && N(j.map((e) => ({
37
39
  ...e,
38
- key: ++v.current
40
+ key: ++A.current
39
41
  })));
40
- }, [b]);
41
- let I = y("membership.save", r.onError), [R, z] = O(!1), B = (e, t) => {
42
- z(!1), T((n) => n.map((n) => n.key === e ? {
42
+ }, [j]);
43
+ let B = c("membership.save", b.onError), [V, H] = m(!1), U = (e, t) => {
44
+ H(!1), N((n) => n.map((n) => n.key === e ? {
43
45
  ...n,
44
46
  ...t
45
47
  } : n));
46
- }, V = (e) => /* @__PURE__ */ A(t, {
47
- appearance: r.appearance,
48
- className: M("grid gap-4 text-sm", r.className),
48
+ }, W = (e) => /* @__PURE__ */ h(t, {
49
+ appearance: b.appearance,
50
+ className: _("grid gap-4 text-sm", b.className),
49
51
  "data-ckui": "membership-editor",
50
52
  children: e
51
53
  });
52
- if (l || u.loading && !u.memberships.length) return V(/* @__PURE__ */ A(h, { className: "h-32 w-full" }));
53
- if (u.error && !u.memberships.length) return V(/* @__PURE__ */ j("div", {
54
+ if (w || T.loading && !T.memberships.length) return W(/* @__PURE__ */ h(a, { className: "h-32 w-full" }));
55
+ if (T.error && !T.memberships.length) return W(/* @__PURE__ */ g("div", {
54
56
  role: "alert",
55
57
  className: "grid justify-items-start gap-2",
56
- children: [/* @__PURE__ */ A("p", {
58
+ children: [/* @__PURE__ */ h("p", {
57
59
  className: "text-destructive",
58
- children: _(o, u.error)
59
- }), /* @__PURE__ */ A(a, {
60
+ children: s(x, T.error)
61
+ }), /* @__PURE__ */ h(i, {
60
62
  size: "sm",
61
63
  variant: "outline",
62
- onClick: u.reload,
63
- children: s("common.retry")
64
+ onClick: T.reload,
65
+ children: S("common.retry")
64
66
  })]
65
67
  }));
66
- let H = (e) => r.versions?.find((t) => t.id === e)?.label ?? e.slice(0, 8);
67
- return V(/* @__PURE__ */ j("form", {
68
+ let G = (e) => b.versions?.find((t) => t.id === e)?.label ?? e.slice(0, 8);
69
+ return W(/* @__PURE__ */ g("form", {
68
70
  className: "grid gap-5",
69
71
  onSubmit: (e) => {
70
- e.preventDefault(), z(!1), I.run(() => u.set(x.map(P), [...d])).then((e) => {
71
- e && (z(!0), T(e.memberships.filter((t) => d.includes(e.entities.find((e) => e.id === t.group_id)?.kind ?? "")).map((e) => ({
72
+ e.preventDefault(), H(!1), B.run(() => T.set(M.map(v), [...E], L)).then((e) => {
73
+ e && (H(!0), F((e) => Object.fromEntries(Object.entries(e).filter(([e]) => I(e)))), N(e.memberships.filter((t) => E.includes(e.entities.find((e) => e.id === t.group_id)?.kind ?? "")).map((e) => ({
72
74
  ...e,
73
75
  content_id: void 0,
74
- key: ++v.current
75
- }))), r.onSaved?.(e));
76
+ key: ++A.current
77
+ }))), b.onSaved?.(e));
76
78
  });
77
79
  },
78
80
  children: [
79
- d.map((e) => {
80
- let t = c?.entity_kinds?.[e] ?? {}, n = x.filter((t) => m.get(t.group_id ?? "")?.kind === e), i = C(r.labels, e);
81
- return /* @__PURE__ */ j("fieldset", {
82
- className: "grid gap-2",
81
+ E.map((e) => {
82
+ let t = C?.entity_kinds?.[e] ?? {}, n = M.filter((t) => k.get(t.group_id ?? "")?.kind === e), r = l(b.labels, e);
83
+ return /* @__PURE__ */ h("div", {
83
84
  "data-ckui": "membership-kind",
84
85
  "data-group-kind": e,
85
- children: [
86
- /* @__PURE__ */ A("legend", {
87
- className: "mb-1 font-medium",
88
- children: i
89
- }),
90
- n.length > 0 && /* @__PURE__ */ A("ul", {
91
- className: "grid gap-2",
92
- children: n.map((e) => /* @__PURE__ */ A(L, {
93
- m: e,
94
- card: m.get(e.group_id ?? ""),
95
- spec: t,
96
- labels: r.labels,
97
- versions: r.versions,
98
- versionLabel: H,
99
- onChange: (t) => B(e.key, t),
100
- onRemove: () => {
101
- z(!1), T((t) => t.filter((t) => t.key !== e.key));
102
- }
103
- }, e.key))
104
- }),
105
- /* @__PURE__ */ A(S, {
106
- management: r.management,
107
- kind: e,
108
- language: r.language,
109
- label: s("memberships.add", { kind: i }),
110
- exclude: n.filter((e) => !e.version_id && !e.role).map((e) => e.group_id),
111
- client: r.client,
112
- onPick: (e) => {
113
- z(!1), p((t) => new Map(t).set(e.id, e)), T((t) => [...t, {
114
- group_id: e.id,
115
- key: ++v.current
116
- }]);
117
- }
118
- })
119
- ]
86
+ children: /* @__PURE__ */ h(u, {
87
+ kind: e,
88
+ label: r,
89
+ memberships: n,
90
+ cards: k,
91
+ spec: t,
92
+ labels: b.labels,
93
+ versions: b.versions,
94
+ versionLabel: G,
95
+ language: b.language,
96
+ management: b.management,
97
+ client: b.client,
98
+ created: P[e] ?? [],
99
+ needsScope: I(e),
100
+ onCreatedChange: (t) => {
101
+ H(!1), F((n) => ({
102
+ ...n,
103
+ [e]: t
104
+ }));
105
+ },
106
+ onChange: (e, t) => U(n[e].key, t),
107
+ onRemove: (e) => {
108
+ H(!1), N((t) => t.filter((t) => t.key !== n[e].key));
109
+ },
110
+ onAdd: (e) => {
111
+ H(!1), O((t) => new Map(t).set(e.id, e)), N((t) => [...t, {
112
+ group_id: e.id,
113
+ key: ++A.current
114
+ }]);
115
+ }
116
+ })
120
117
  }, e);
121
118
  }),
122
- !d.length && /* @__PURE__ */ A("p", {
119
+ !E.length && /* @__PURE__ */ h("p", {
123
120
  className: "text-muted-foreground",
124
- children: s("memberships.noKinds")
121
+ children: S("memberships.noKinds")
125
122
  }),
126
- /* @__PURE__ */ A(g, { error: I.error }),
127
- /* @__PURE__ */ j("div", {
123
+ /* @__PURE__ */ h(o, { error: B.error }),
124
+ /* @__PURE__ */ g("div", {
128
125
  className: "flex items-center gap-3",
129
126
  children: [
130
- /* @__PURE__ */ A(a, {
127
+ /* @__PURE__ */ h(i, {
131
128
  type: "submit",
132
129
  size: "sm",
133
- disabled: I.pending || !k,
134
- children: I.pending ? s("common.saving") : s("common.save")
130
+ disabled: B.pending || !R,
131
+ children: B.pending ? S("common.saving") : S("common.save")
135
132
  }),
136
- k && /* @__PURE__ */ A(a, {
133
+ R && /* @__PURE__ */ h(i, {
137
134
  type: "button",
138
135
  size: "sm",
139
136
  variant: "ghost",
140
- disabled: I.pending,
141
- onClick: () => T(b.map((e) => ({
142
- ...e,
143
- key: ++v.current
144
- }))),
145
- children: s("memberships.discard")
137
+ disabled: B.pending,
138
+ onClick: () => {
139
+ F({}), N(j.map((e) => ({
140
+ ...e,
141
+ key: ++A.current
142
+ })));
143
+ },
144
+ children: S("memberships.discard")
146
145
  }),
147
- R && !k && /* @__PURE__ */ A("span", {
146
+ V && !R && /* @__PURE__ */ h("span", {
148
147
  role: "status",
149
148
  className: "text-muted-foreground",
150
- children: s("memberships.saved")
149
+ children: S("memberships.saved")
151
150
  })
152
151
  ]
153
152
  })
154
153
  ]
155
154
  }));
156
155
  }
157
- function L({ m: t, card: n, spec: r, labels: i, versions: o, versionLabel: h, onChange: g, onRemove: _ }) {
158
- let { t: v } = e(), y = T(), b = n ? n.name || n.slug : t.group_id ?? "", x = [.../* @__PURE__ */ new Set([...(o ?? []).map((e) => e.id), ...t.version_id ? [t.version_id] : []])];
159
- return /* @__PURE__ */ j("li", {
160
- className: "flex flex-wrap items-center gap-2 rounded-md border border-border p-2",
161
- "data-ckui": "membership",
162
- "data-group": n?.slug,
163
- "data-state": t.state ?? "active",
164
- children: [
165
- /* @__PURE__ */ A("span", {
166
- className: "min-w-0 flex-1 font-medium break-words",
167
- children: b
168
- }),
169
- t.state === "proposed" && /* @__PURE__ */ j(k, { children: [/* @__PURE__ */ A(s, {
170
- variant: "secondary",
171
- children: v("memberships.proposed")
172
- }), /* @__PURE__ */ A(a, {
173
- type: "button",
174
- size: "xs",
175
- variant: "outline",
176
- onClick: () => g({ state: "active" }),
177
- children: v("memberships.accept")
178
- })] }),
179
- r.version_level && x.length > 0 && /* @__PURE__ */ j(u, {
180
- value: t.version_id ?? N,
181
- onValueChange: (e) => g({ version_id: e === N ? void 0 : String(e) }),
182
- children: [/* @__PURE__ */ A(p, {
183
- size: "sm",
184
- "aria-label": v("memberships.versionOf", { name: b }),
185
- children: /* @__PURE__ */ A(m, { children: (e) => e === N ? v("memberships.wholeContent") : h(e) })
186
- }), /* @__PURE__ */ j(d, { children: [/* @__PURE__ */ A(f, {
187
- value: N,
188
- children: v("memberships.wholeContent")
189
- }), x.map((e) => /* @__PURE__ */ A(f, {
190
- value: e,
191
- children: h(e)
192
- }, e))] })]
193
- }),
194
- !!r.roles?.length && /* @__PURE__ */ j(u, {
195
- value: t.role || N,
196
- onValueChange: (e) => g({ role: e === N ? void 0 : String(e) }),
197
- children: [/* @__PURE__ */ A(p, {
198
- size: "sm",
199
- "aria-label": v("memberships.roleOf", { name: b }),
200
- children: /* @__PURE__ */ A(m, { children: (e) => e === N ? v("memberships.noRole") : C(i, e) })
201
- }), /* @__PURE__ */ j(d, { children: [/* @__PURE__ */ A(f, {
202
- value: N,
203
- children: v("memberships.noRole")
204
- }), r.roles.map((e) => /* @__PURE__ */ A(f, {
205
- value: e,
206
- children: C(i, e)
207
- }, e))] })]
208
- }),
209
- r.ordered && /* @__PURE__ */ j("div", {
210
- className: "flex items-center gap-1",
211
- children: [/* @__PURE__ */ A(l, {
212
- htmlFor: `${y}-pos`,
213
- className: "text-xs text-muted-foreground",
214
- children: v("memberships.position")
215
- }), /* @__PURE__ */ A(c, {
216
- id: `${y}-pos`,
217
- className: "h-8 w-20",
218
- type: "number",
219
- min: 0,
220
- step: 1,
221
- value: t.position ?? "",
222
- placeholder: v("memberships.last"),
223
- onChange: (e) => g({ position: e.target.value === "" ? void 0 : Math.max(0, Math.trunc(Number(e.target.value))) })
224
- })]
225
- }),
226
- r.windows && /* @__PURE__ */ A(R, {
227
- from: t.active_from,
228
- until: t.active_until,
229
- name: b,
230
- onChange: g
231
- }),
232
- /* @__PURE__ */ A(a, {
233
- type: "button",
234
- size: "xs",
235
- variant: "ghost",
236
- "aria-label": v("memberships.remove", { name: b }),
237
- onClick: _,
238
- children: v("common.remove")
239
- })
240
- ]
241
- });
242
- }
243
- function R({ from: t, until: n, name: r, onChange: i }) {
244
- let { t: a } = e(), o = T();
245
- return /* @__PURE__ */ j("div", {
246
- className: "flex flex-wrap items-center gap-1",
247
- "data-ckui": "membership-window",
248
- children: [
249
- /* @__PURE__ */ A(l, {
250
- htmlFor: `${o}-from`,
251
- className: "text-xs text-muted-foreground",
252
- children: a("memberships.from")
253
- }),
254
- /* @__PURE__ */ A(c, {
255
- id: `${o}-from`,
256
- className: "h-8 w-48",
257
- type: "datetime-local",
258
- "aria-label": a("memberships.fromOf", { name: r }),
259
- value: x(t),
260
- onChange: (e) => i({ active_from: b(e.target.value) })
261
- }),
262
- /* @__PURE__ */ A(l, {
263
- htmlFor: `${o}-until`,
264
- className: "text-xs text-muted-foreground",
265
- children: a("memberships.until")
266
- }),
267
- /* @__PURE__ */ A(c, {
268
- id: `${o}-until`,
269
- className: "h-8 w-48",
270
- type: "datetime-local",
271
- "aria-label": a("memberships.untilOf", { name: r }),
272
- value: x(n),
273
- onChange: (e) => i({ active_until: b(e.target.value) })
274
- })
275
- ]
276
- });
277
- }
278
- var z = (e) => `${e.content_id}|${e.version_id ?? ""}`;
279
- function B(n) {
280
- let c = e(), { t: l } = c, { kinds: u } = i({ client: n.client }), d = u?.entity_kinds?.[n.group.kind] ?? {}, f = r(n.group.id, {
281
- pageSize: n.pageSize,
282
- client: n.client
283
- }), p = y("membership.save", n.onError), [m, b] = O(null), [x, S] = O({}), w = (e) => n.renderContent ? n.renderContent(e) : /* @__PURE__ */ A("span", {
284
- className: "font-mono text-xs break-all",
285
- children: e.content_id
286
- }), T = (e) => `${e.content_id}${e.version_id ? ` ${e.version_id}` : ""}`, E = (e) => [...new Map(e.map((e) => [z(e), {
287
- content_id: e.content_id,
288
- version_id: e.version_id
289
- }])).values()], D = ({ id: e, ...t }) => t, N = (e, t) => /* @__PURE__ */ j("div", {
290
- className: "flex flex-wrap items-center gap-2",
291
- "data-ckui": "group-member",
292
- "data-content": e.content_id,
293
- "data-state": e.state ?? "active",
294
- children: [
295
- t,
296
- d.ordered && e.position !== void 0 && /* @__PURE__ */ A("span", {
297
- className: "w-8 text-xs text-muted-foreground tabular-nums",
298
- children: e.position
299
- }),
300
- /* @__PURE__ */ A("span", {
301
- className: "min-w-0 flex-1",
302
- children: w(e)
303
- }),
304
- e.version_id && /* @__PURE__ */ A(s, {
305
- variant: "outline",
306
- children: l("memberships.version")
307
- }),
308
- e.role && /* @__PURE__ */ A(s, {
309
- variant: "secondary",
310
- children: C(n.labels, e.role)
311
- }),
312
- e.state === "proposed" && /* @__PURE__ */ j(k, { children: [/* @__PURE__ */ A(s, {
313
- variant: "secondary",
314
- children: l("memberships.proposed")
315
- }), /* @__PURE__ */ A(a, {
316
- size: "xs",
317
- variant: "outline",
318
- disabled: p.pending,
319
- onClick: () => void p.run(() => f.add([{
320
- ...D(e),
321
- state: "active"
322
- }])),
323
- children: l("memberships.accept")
324
- })] }),
325
- d.windows && (m === e.id ? /* @__PURE__ */ j("span", {
326
- className: "flex flex-wrap items-center gap-1",
327
- children: [
328
- /* @__PURE__ */ A(R, {
329
- from: x.from,
330
- until: x.until,
331
- name: T(e),
332
- onChange: (e) => S((t) => ({
333
- from: "active_from" in e ? e.active_from : t.from,
334
- until: "active_until" in e ? e.active_until : t.until
335
- }))
336
- }),
337
- /* @__PURE__ */ A(a, {
338
- size: "xs",
339
- disabled: p.pending,
340
- onClick: () => void p.run(() => f.add([{
341
- ...D(e),
342
- active_from: x.from,
343
- active_until: x.until
344
- }])).then((e) => e !== void 0 && b(null)),
345
- children: l("common.save")
346
- }),
347
- /* @__PURE__ */ A(a, {
348
- size: "xs",
349
- variant: "ghost",
350
- onClick: () => b(null),
351
- children: l("common.cancel")
352
- })
353
- ]
354
- }) : /* @__PURE__ */ j(k, { children: [/* @__PURE__ */ A("span", {
355
- className: "text-xs text-muted-foreground",
356
- "data-ckui": "member-window",
357
- children: e.active_from || e.active_until ? l("memberships.window", {
358
- from: e.active_from ? v(c, e.active_from) : "…",
359
- until: e.active_until ? v(c, e.active_until) : "…"
360
- }) : l("memberships.always")
361
- }), /* @__PURE__ */ A(a, {
362
- size: "xs",
363
- variant: "ghost",
364
- onClick: () => {
365
- S({
366
- from: e.active_from,
367
- until: e.active_until
368
- }), b(e.id);
369
- },
370
- children: l("memberships.editWindow")
371
- })] })),
372
- n.onUseCover && !e.version_id && /* @__PURE__ */ A(a, {
373
- size: "xs",
374
- variant: "ghost",
375
- disabled: p.pending || n.group.cover?.content_id === e.content_id && !n.group.cover?.auto,
376
- onClick: () => void p.run(() => n.onUseCover(e.content_id)),
377
- children: l("memberships.useCover")
378
- }),
379
- /* @__PURE__ */ A(a, {
380
- size: "xs",
381
- variant: "ghost",
382
- disabled: p.pending,
383
- "aria-label": l("memberships.remove", { name: T(e) }),
384
- onClick: () => void p.run(() => f.remove([D(e)])),
385
- children: l("common.remove")
386
- })
387
- ]
388
- });
389
- return /* @__PURE__ */ j(t, {
390
- appearance: n.appearance,
391
- className: M("grid gap-3 text-sm", n.className),
392
- "data-ckui": "group-members",
393
- children: [
394
- /* @__PURE__ */ A("h3", {
395
- className: "font-medium",
396
- children: l("memberships.members")
397
- }),
398
- f.loading && !f.items.length ? /* @__PURE__ */ A(h, { className: "h-20 w-full" }) : f.error && !f.items.length ? /* @__PURE__ */ j("div", {
399
- role: "alert",
400
- className: "grid justify-items-start gap-2",
401
- children: [/* @__PURE__ */ A("p", {
402
- className: "text-destructive",
403
- children: _(c, f.error)
404
- }), /* @__PURE__ */ A(a, {
405
- size: "sm",
406
- variant: "outline",
407
- onClick: f.reload,
408
- children: l("common.retry")
409
- })]
410
- }) : f.items.length ? d.ordered ? /* @__PURE__ */ A(o, {
411
- items: f.items,
412
- id: (e) => e.id,
413
- name: T,
414
- label: l("memberships.members"),
415
- disabled: p.pending,
416
- onMove: (e, t) => {
417
- let n = [...f.items], [r] = n.splice(e, 1);
418
- n.splice(t, 0, r), p.run(() => f.reorder(E(n)));
419
- },
420
- children: (e, t) => N(e, t)
421
- }) : /* @__PURE__ */ A("ul", {
422
- className: "grid divide-y divide-border rounded-lg border border-border",
423
- children: f.items.map((e) => /* @__PURE__ */ A("li", {
424
- className: "p-2",
425
- children: N(e)
426
- }, e.id))
427
- }) : /* @__PURE__ */ A("p", {
428
- className: "text-muted-foreground",
429
- children: l("memberships.noMembers")
430
- }),
431
- f.hasMore && /* @__PURE__ */ j("div", {
432
- className: "grid justify-items-center gap-2",
433
- children: [f.error && /* @__PURE__ */ A("p", {
434
- role: "alert",
435
- className: "text-destructive",
436
- children: _(c, f.error)
437
- }), /* @__PURE__ */ A(a, {
438
- variant: "outline",
439
- size: "sm",
440
- disabled: f.loadingMore,
441
- onClick: () => void f.loadMore(),
442
- children: f.loadingMore ? l("groups.loading") : f.error ? l("common.retry") : l("groups.loadMore")
443
- })]
444
- }),
445
- /* @__PURE__ */ A(H, {
446
- spec: d,
447
- labels: n.labels,
448
- onAdd: (e) => p.run(() => f.add([e]))
449
- }),
450
- /* @__PURE__ */ A(g, { error: p.error })
451
- ]
452
- });
453
- }
454
- var V = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
455
- function H({ spec: t, labels: n, onAdd: r }) {
456
- let { t: i } = e(), o = T(), [s, h] = O(""), [g, _] = O(""), [v, y] = O(""), [b, x] = O(), [S, w] = O(), E = V.test(s.trim()) && (!g.trim() || V.test(g.trim()));
457
- return /* @__PURE__ */ j("form", {
458
- className: "flex flex-wrap items-end gap-2",
459
- "data-ckui": "add-member",
460
- onSubmit: (e) => {
461
- e.preventDefault(), E && r({
462
- content_id: s.trim(),
463
- version_id: g.trim() || void 0,
464
- role: v || void 0,
465
- active_from: b,
466
- active_until: S
467
- }).then((e) => {
468
- e !== void 0 && (h(""), _(""));
469
- });
470
- },
471
- children: [
472
- /* @__PURE__ */ j("div", {
473
- className: "grid gap-1",
474
- children: [/* @__PURE__ */ A(l, {
475
- htmlFor: `${o}-c`,
476
- className: "text-xs text-muted-foreground",
477
- children: i("memberships.contentId")
478
- }), /* @__PURE__ */ A(c, {
479
- id: `${o}-c`,
480
- className: "h-8 w-80 max-w-full font-mono",
481
- value: s,
482
- onChange: (e) => h(e.target.value)
483
- })]
484
- }),
485
- t.version_level && /* @__PURE__ */ j("div", {
486
- className: "grid gap-1",
487
- children: [/* @__PURE__ */ A(l, {
488
- htmlFor: `${o}-v`,
489
- className: "text-xs text-muted-foreground",
490
- children: i("memberships.versionId")
491
- }), /* @__PURE__ */ A(c, {
492
- id: `${o}-v`,
493
- className: "h-8 w-80 max-w-full font-mono",
494
- value: g,
495
- onChange: (e) => _(e.target.value)
496
- })]
497
- }),
498
- !!t.roles?.length && /* @__PURE__ */ j(u, {
499
- value: v || N,
500
- onValueChange: (e) => y(e === N ? "" : String(e)),
501
- children: [/* @__PURE__ */ A(p, {
502
- size: "sm",
503
- "aria-label": i("memberships.role"),
504
- children: /* @__PURE__ */ A(m, { children: (e) => e === N ? i("memberships.noRole") : C(n, e) })
505
- }), /* @__PURE__ */ j(d, { children: [/* @__PURE__ */ A(f, {
506
- value: N,
507
- children: i("memberships.noRole")
508
- }), t.roles.map((e) => /* @__PURE__ */ A(f, {
509
- value: e,
510
- children: C(n, e)
511
- }, e))] })]
512
- }),
513
- t.windows && /* @__PURE__ */ A(R, {
514
- from: b,
515
- until: S,
516
- name: i("memberships.newMember"),
517
- onChange: (e) => {
518
- "active_from" in e && x(e.active_from), "active_until" in e && w(e.active_until);
519
- }
520
- }),
521
- /* @__PURE__ */ A(a, {
522
- type: "submit",
523
- size: "sm",
524
- variant: "outline",
525
- disabled: !E,
526
- children: i("memberships.addMember")
527
- })
528
- ]
529
- });
530
- }
531
156
  //#endregion
532
- export { B as GroupMembers, I as MembershipEditor, L as MembershipRow };
157
+ export { b as MembershipEditor };
533
158
 
534
159
  //# sourceMappingURL=memberships.js.map