@kywi-software/core 0.11.0 → 0.12.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 (216) hide show
  1. package/AGENT-PATTERNS.md +96 -10
  2. package/dist/admin/content-form.d.ts.map +1 -1
  3. package/dist/admin/content-form.js +97 -10
  4. package/dist/admin/content-form.js.map +1 -1
  5. package/dist/admin/layout-editor/component-actions.d.ts +219 -22
  6. package/dist/admin/layout-editor/component-actions.d.ts.map +1 -1
  7. package/dist/admin/layout-editor/component-actions.js +356 -36
  8. package/dist/admin/layout-editor/component-actions.js.map +1 -1
  9. package/dist/admin/layout-editor/component-fork.d.ts +224 -0
  10. package/dist/admin/layout-editor/component-fork.d.ts.map +1 -0
  11. package/dist/admin/layout-editor/component-fork.js +342 -0
  12. package/dist/admin/layout-editor/component-fork.js.map +1 -0
  13. package/dist/admin/layout-editor/editor-canvas.d.ts +8 -0
  14. package/dist/admin/layout-editor/editor-canvas.d.ts.map +1 -1
  15. package/dist/admin/layout-editor/editor-canvas.js +120 -12
  16. package/dist/admin/layout-editor/editor-canvas.js.map +1 -1
  17. package/dist/admin/layout-editor/editor-dialog.d.ts +164 -0
  18. package/dist/admin/layout-editor/editor-dialog.d.ts.map +1 -0
  19. package/dist/admin/layout-editor/editor-dialog.js +195 -0
  20. package/dist/admin/layout-editor/editor-dialog.js.map +1 -0
  21. package/dist/admin/layout-editor/editor-state.d.ts +76 -0
  22. package/dist/admin/layout-editor/editor-state.d.ts.map +1 -1
  23. package/dist/admin/layout-editor/editor-state.js +47 -1
  24. package/dist/admin/layout-editor/editor-state.js.map +1 -1
  25. package/dist/admin/layout-editor/editor.css +279 -2
  26. package/dist/admin/layout-editor/index.d.ts +10 -1
  27. package/dist/admin/layout-editor/index.d.ts.map +1 -1
  28. package/dist/admin/layout-editor/index.js +11 -1
  29. package/dist/admin/layout-editor/index.js.map +1 -1
  30. package/dist/admin/layout-editor/layout-editor.d.ts +58 -1
  31. package/dist/admin/layout-editor/layout-editor.d.ts.map +1 -1
  32. package/dist/admin/layout-editor/layout-editor.js +160 -190
  33. package/dist/admin/layout-editor/layout-editor.js.map +1 -1
  34. package/dist/admin/layout-editor/linked-component.d.ts +39 -0
  35. package/dist/admin/layout-editor/linked-component.d.ts.map +1 -0
  36. package/dist/admin/layout-editor/linked-component.js +42 -0
  37. package/dist/admin/layout-editor/linked-component.js.map +1 -0
  38. package/dist/admin/layout-editor/module-overlay.d.ts +10 -1
  39. package/dist/admin/layout-editor/module-overlay.d.ts.map +1 -1
  40. package/dist/admin/layout-editor/module-overlay.js +33 -4
  41. package/dist/admin/layout-editor/module-overlay.js.map +1 -1
  42. package/dist/admin/layout-editor/node-lookup.d.ts +35 -0
  43. package/dist/admin/layout-editor/node-lookup.d.ts.map +1 -1
  44. package/dist/admin/layout-editor/node-lookup.js +91 -0
  45. package/dist/admin/layout-editor/node-lookup.js.map +1 -1
  46. package/dist/admin/layout-editor/overlay-shell.d.ts.map +1 -1
  47. package/dist/admin/layout-editor/overlay-shell.js +114 -23
  48. package/dist/admin/layout-editor/overlay-shell.js.map +1 -1
  49. package/dist/admin/layout-editor/props-panel.d.ts +54 -1
  50. package/dist/admin/layout-editor/props-panel.d.ts.map +1 -1
  51. package/dist/admin/layout-editor/props-panel.js +118 -9
  52. package/dist/admin/layout-editor/props-panel.js.map +1 -1
  53. package/dist/admin/layout-editor/section-overlay.d.ts +9 -1
  54. package/dist/admin/layout-editor/section-overlay.d.ts.map +1 -1
  55. package/dist/admin/layout-editor/section-overlay.js +14 -4
  56. package/dist/admin/layout-editor/section-overlay.js.map +1 -1
  57. package/dist/admin/layout-editor/section-template-picker.d.ts +27 -1
  58. package/dist/admin/layout-editor/section-template-picker.d.ts.map +1 -1
  59. package/dist/admin/layout-editor/section-template-picker.js +71 -17
  60. package/dist/admin/layout-editor/section-template-picker.js.map +1 -1
  61. package/dist/admin/layout-editor/use-component-connect.d.ts +61 -0
  62. package/dist/admin/layout-editor/use-component-connect.d.ts.map +1 -0
  63. package/dist/admin/layout-editor/use-component-connect.js +292 -0
  64. package/dist/admin/layout-editor/use-component-connect.js.map +1 -0
  65. package/dist/admin/layout-editor/use-component-fork.d.ts +123 -0
  66. package/dist/admin/layout-editor/use-component-fork.d.ts.map +1 -0
  67. package/dist/admin/layout-editor/use-component-fork.js +346 -0
  68. package/dist/admin/layout-editor/use-component-fork.js.map +1 -0
  69. package/dist/admin/layout-editor/use-component-library.d.ts +94 -0
  70. package/dist/admin/layout-editor/use-component-library.d.ts.map +1 -0
  71. package/dist/admin/layout-editor/use-component-library.js +55 -0
  72. package/dist/admin/layout-editor/use-component-library.js.map +1 -0
  73. package/dist/admin/registry.d.ts +11 -2
  74. package/dist/admin/registry.d.ts.map +1 -1
  75. package/dist/admin/registry.js +40 -4
  76. package/dist/admin/registry.js.map +1 -1
  77. package/dist/admin/server.d.ts +1 -0
  78. package/dist/admin/server.d.ts.map +1 -1
  79. package/dist/admin/server.js +5 -0
  80. package/dist/admin/server.js.map +1 -1
  81. package/dist/admin/styles/admin.css +43 -0
  82. package/dist/admin/surfaces/components/component-edit.d.ts +3 -0
  83. package/dist/admin/surfaces/components/component-edit.d.ts.map +1 -0
  84. package/dist/admin/surfaces/components/component-edit.js +235 -0
  85. package/dist/admin/surfaces/components/component-edit.js.map +1 -0
  86. package/dist/admin/surfaces/components/components-data.d.ts +153 -0
  87. package/dist/admin/surfaces/components/components-data.d.ts.map +1 -0
  88. package/dist/admin/surfaces/components/components-data.js +154 -0
  89. package/dist/admin/surfaces/components/components-data.js.map +1 -0
  90. package/dist/admin/surfaces/components/components-list.d.ts +3 -0
  91. package/dist/admin/surfaces/components/components-list.d.ts.map +1 -0
  92. package/dist/admin/surfaces/components/components-list.js +196 -0
  93. package/dist/admin/surfaces/components/components-list.js.map +1 -0
  94. package/dist/admin/surfaces/components/definition-canvas.d.ts +73 -0
  95. package/dist/admin/surfaces/components/definition-canvas.d.ts.map +1 -0
  96. package/dist/admin/surfaces/components/definition-canvas.js +207 -0
  97. package/dist/admin/surfaces/components/definition-canvas.js.map +1 -0
  98. package/dist/admin/surfaces/layouts/layout-editor-client.d.ts.map +1 -1
  99. package/dist/admin/surfaces/layouts/layout-editor-client.js +14 -2
  100. package/dist/admin/surfaces/layouts/layout-editor-client.js.map +1 -1
  101. package/dist/admin/surfaces/layouts/layouts-data.d.ts +3 -14
  102. package/dist/admin/surfaces/layouts/layouts-data.d.ts.map +1 -1
  103. package/dist/admin/surfaces/layouts/layouts-data.js +4 -7
  104. package/dist/admin/surfaces/layouts/layouts-data.js.map +1 -1
  105. package/dist/admin/surfaces/layouts/layouts-list.d.ts.map +1 -1
  106. package/dist/admin/surfaces/layouts/layouts-list.js +16 -22
  107. package/dist/admin/surfaces/layouts/layouts-list.js.map +1 -1
  108. package/dist/admin/surfaces/settings/admin-features.d.ts.map +1 -1
  109. package/dist/admin/surfaces/settings/admin-features.js +1 -0
  110. package/dist/admin/surfaces/settings/admin-features.js.map +1 -1
  111. package/dist/api/bulk-routes.d.ts.map +1 -1
  112. package/dist/api/bulk-routes.js +25 -0
  113. package/dist/api/bulk-routes.js.map +1 -1
  114. package/dist/api/changeset-routes.d.ts.map +1 -1
  115. package/dist/api/changeset-routes.js +17 -3
  116. package/dist/api/changeset-routes.js.map +1 -1
  117. package/dist/api/component-routes.d.ts.map +1 -1
  118. package/dist/api/component-routes.js +228 -8
  119. package/dist/api/component-routes.js.map +1 -1
  120. package/dist/api/content-routes.d.ts.map +1 -1
  121. package/dist/api/content-routes.js +64 -0
  122. package/dist/api/content-routes.js.map +1 -1
  123. package/dist/api/feed-routes.d.ts +6 -6
  124. package/dist/api/graphql/resolvers.d.ts +4 -4
  125. package/dist/api/layout-routes.d.ts.map +1 -1
  126. package/dist/api/layout-routes.js +4 -17
  127. package/dist/api/layout-routes.js.map +1 -1
  128. package/dist/api/layout-write-guard.d.ts +80 -0
  129. package/dist/api/layout-write-guard.d.ts.map +1 -0
  130. package/dist/api/layout-write-guard.js +88 -0
  131. package/dist/api/layout-write-guard.js.map +1 -0
  132. package/dist/api/section-template-routes.d.ts.map +1 -1
  133. package/dist/api/section-template-routes.js +11 -0
  134. package/dist/api/section-template-routes.js.map +1 -1
  135. package/dist/api/translation-routes.d.ts.map +1 -1
  136. package/dist/api/translation-routes.js +8 -0
  137. package/dist/api/translation-routes.js.map +1 -1
  138. package/dist/api/version-routes.d.ts.map +1 -1
  139. package/dist/api/version-routes.js +20 -8
  140. package/dist/api/version-routes.js.map +1 -1
  141. package/dist/api/workflow-routes.d.ts.map +1 -1
  142. package/dist/api/workflow-routes.js +53 -8
  143. package/dist/api/workflow-routes.js.map +1 -1
  144. package/dist/db/analytics-queries.d.ts +3 -3
  145. package/dist/db/apply-snapshot.d.ts +75 -8
  146. package/dist/db/apply-snapshot.d.ts.map +1 -1
  147. package/dist/db/apply-snapshot.js +104 -8
  148. package/dist/db/apply-snapshot.js.map +1 -1
  149. package/dist/db/audit-queries.d.ts +12 -12
  150. package/dist/db/category-queries.d.ts +3 -3
  151. package/dist/db/changeset-audit-queries.d.ts +4 -4
  152. package/dist/db/changeset-queries.d.ts +7 -7
  153. package/dist/db/comment-queries.d.ts +8 -8
  154. package/dist/db/comment-subscription-queries.d.ts +2 -2
  155. package/dist/db/component-instance-queries.d.ts +197 -0
  156. package/dist/db/component-instance-queries.d.ts.map +1 -0
  157. package/dist/db/component-instance-queries.js +405 -0
  158. package/dist/db/component-instance-queries.js.map +1 -0
  159. package/dist/db/content-queries.d.ts.map +1 -1
  160. package/dist/db/content-queries.js +39 -2
  161. package/dist/db/content-queries.js.map +1 -1
  162. package/dist/db/extension-queries.d.ts +7 -7
  163. package/dist/db/feed-queries.d.ts +3 -3
  164. package/dist/db/index.d.ts +1 -0
  165. package/dist/db/index.d.ts.map +1 -1
  166. package/dist/db/index.js +1 -0
  167. package/dist/db/index.js.map +1 -1
  168. package/dist/db/layout-queries.d.ts +13 -1
  169. package/dist/db/layout-queries.d.ts.map +1 -1
  170. package/dist/db/layout-queries.js +52 -7
  171. package/dist/db/layout-queries.js.map +1 -1
  172. package/dist/db/locale-queries.d.ts.map +1 -1
  173. package/dist/db/locale-queries.js +0 -0
  174. package/dist/db/locale-queries.js.map +1 -1
  175. package/dist/db/media-queries.d.ts +12 -12
  176. package/dist/db/revision-queries.d.ts +3 -3
  177. package/dist/db/site-admin-queries.d.ts +2 -2
  178. package/dist/db/site-membership-queries.d.ts +3 -3
  179. package/dist/db/site-plugin-queries.d.ts +2 -2
  180. package/dist/db/site-queries.d.ts +6 -6
  181. package/dist/db/version-queries.d.ts +12 -12
  182. package/dist/db/webhook-queries.d.ts +11 -11
  183. package/dist/db/workflow-queries.d.ts +6 -6
  184. package/dist/db/workflow-queries.d.ts.map +1 -1
  185. package/dist/db/workflow-queries.js +11 -2
  186. package/dist/db/workflow-queries.js.map +1 -1
  187. package/dist/layout/component-refs.d.ts +465 -0
  188. package/dist/layout/component-refs.d.ts.map +1 -0
  189. package/dist/layout/component-refs.js +848 -0
  190. package/dist/layout/component-refs.js.map +1 -0
  191. package/dist/layout/index.d.ts +2 -1
  192. package/dist/layout/index.d.ts.map +1 -1
  193. package/dist/layout/index.js +1 -0
  194. package/dist/layout/index.js.map +1 -1
  195. package/dist/layout/module-permissions.d.ts +49 -1
  196. package/dist/layout/module-permissions.d.ts.map +1 -1
  197. package/dist/layout/module-permissions.js +117 -6
  198. package/dist/layout/module-permissions.js.map +1 -1
  199. package/dist/layout/renderer.d.ts +51 -4
  200. package/dist/layout/renderer.d.ts.map +1 -1
  201. package/dist/layout/renderer.js +36 -38
  202. package/dist/layout/renderer.js.map +1 -1
  203. package/dist/layout/types.d.ts +42 -0
  204. package/dist/layout/types.d.ts.map +1 -1
  205. package/dist/layout/types.js +54 -11
  206. package/dist/layout/types.js.map +1 -1
  207. package/dist/schema/base.d.ts +1 -1
  208. package/dist/schema/components.d.ts +150 -0
  209. package/dist/schema/components.d.ts.map +1 -1
  210. package/dist/schema/components.js +50 -4
  211. package/dist/schema/components.js.map +1 -1
  212. package/dist/versioning/scheduler.d.ts +8 -0
  213. package/dist/versioning/scheduler.d.ts.map +1 -1
  214. package/dist/versioning/scheduler.js +21 -7
  215. package/dist/versioning/scheduler.js.map +1 -1
  216. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-edit.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/components/component-edit.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Data helpers + user-facing vocabulary for the admin Components library
3
+ * (kywi-cms#147 T5).
4
+ *
5
+ * The library is the second editing surface for reusable components; the primary
6
+ * one is in place, through the editors (spec decision 6). What only lives here is
7
+ * the whole-library view: what exists, where each one is placed, renaming, the
8
+ * detach-all-then-delete flow (decision 7), and a canvas for editing a definition
9
+ * directly.
10
+ *
11
+ * Everything goes through `component-routes.ts`, which is the only door a
12
+ * definition can come in through — so this module never validates on the server's
13
+ * behalf, it just refuses to send what it can already tell is not a definition
14
+ * (see `definition-canvas.ts`) and reports what the server says otherwise.
15
+ */
16
+ import type { FetchLike } from '../../content-editor-api.js';
17
+ /** The three component kinds (`kywi_components.type`). */
18
+ export type ComponentKind = 'module' | 'section' | 'variantContainer';
19
+ /** Placement counts as `GET /components?withUsage=1` folds them into each row. */
20
+ export interface ComponentUsageCounts {
21
+ /** Placements on live (not trashed) pages. */
22
+ instances: number;
23
+ /** Distinct live pages holding at least one placement. */
24
+ pages: number;
25
+ /** Placements held by pages in the trash — see {@link ComponentUsage}. */
26
+ trashedInstances: number;
27
+ }
28
+ /** A `kywi_components` row as the API returns it. */
29
+ export interface ComponentRow {
30
+ id: string;
31
+ name: string;
32
+ description: string | null;
33
+ type: string;
34
+ moduleType: string | null;
35
+ definition: unknown;
36
+ createdAt: string;
37
+ updatedAt: string;
38
+ /** Present only on the `?withUsage=1` list. */
39
+ usage?: ComponentUsageCounts;
40
+ }
41
+ /** One page holding placements of a component (`GET /components/:id/usage`). */
42
+ export interface ComponentUsageItem {
43
+ contentId: string;
44
+ contentType: string;
45
+ title: string | null;
46
+ nodeIds: string[];
47
+ }
48
+ /**
49
+ * The full usage payload. Trashed pages are counted separately by the API on
50
+ * purpose: "used on 4 pages" has to mean four pages the reader can open, but a
51
+ * trashed page still holds its link and restoring it brings the link back — so
52
+ * the delete confirmation has to name those too.
53
+ */
54
+ export interface ComponentUsage {
55
+ instances: number;
56
+ pages: number;
57
+ items: ComponentUsageItem[];
58
+ trashedInstances: number;
59
+ trashedPages: number;
60
+ }
61
+ /** One page `POST /detach-all` (or `DELETE ?detachAll=1`) deliberately left linked. */
62
+ export interface DetachSkippedPage {
63
+ contentId: string;
64
+ contentType: string;
65
+ reason: string;
66
+ detail: string;
67
+ }
68
+ export interface DetachEverywhereResult {
69
+ pages: number;
70
+ instances: number;
71
+ skipped: DetachSkippedPage[];
72
+ }
73
+ /**
74
+ * What a component's kind is CALLED in the UI.
75
+ *
76
+ * These are the words the editors already use for the same three things, not new
77
+ * ones: `editor-canvas.tsx` labels a variant container "Personalized section" or
78
+ * "A/B tested section" depending on its mode, and the save dialog says the same
79
+ * (`use-component-connect.tsx`). A library that called the same object a
80
+ * "Container" would be the only place in the product using that word — and
81
+ * "arm"-style internal vocabulary in user copy is exactly what kywi-cms#148 was
82
+ * filed for. `mode` is read off the definition because that is where it lives;
83
+ * an unreadable definition degrades to the neutral "Personalized section".
84
+ */
85
+ export declare function componentKindLabel(component: Pick<ComponentRow, 'type' | 'definition'>): string;
86
+ /** The type-filter choices, in list order. */
87
+ export declare const COMPONENT_KIND_FILTERS: ReadonlyArray<{
88
+ value: ComponentKind;
89
+ label: string;
90
+ }>;
91
+ /**
92
+ * Does this component match the library's name/description search box?
93
+ * Client-side, case-insensitive, substring — the library is a per-site list of
94
+ * tens of rows, so a server round trip per keystroke would buy nothing.
95
+ */
96
+ export declare function matchesComponentSearch(component: ComponentRow, query: string): boolean;
97
+ /**
98
+ * The usage cell's text.
99
+ *
100
+ * Zero has to READ as zero (kywi-cms#147 T4 ledger, M6): an undo after connecting
101
+ * leaves a component row nobody placed, and the library showing it as plainly
102
+ * unused is the whole mitigation for that. "—" would not do it.
103
+ */
104
+ export declare function usageSummary(usage: ComponentUsageCounts | undefined): string;
105
+ /**
106
+ * A failed component request, carrying the server's own code and `details`.
107
+ *
108
+ * The delete flow needs both: `COMPONENT_IN_USE` comes with the usage payload and
109
+ * `COMPONENT_DETACH_INCOMPLETE` comes with the list of pages that could not be
110
+ * detached, and both have to be shown rather than flattened into "Delete failed".
111
+ */
112
+ export declare class ComponentApiError extends Error {
113
+ readonly code: string;
114
+ readonly status: number;
115
+ readonly details: unknown;
116
+ constructor(message: string, code: string, status: number, details: unknown);
117
+ }
118
+ /** Every component in the site, each with its placement counts. */
119
+ export declare function loadComponents(fetchFn: FetchLike): Promise<ComponentRow[]>;
120
+ export declare function loadComponent(fetchFn: FetchLike, id: string): Promise<ComponentRow>;
121
+ export declare function loadComponentUsage(fetchFn: FetchLike, id: string): Promise<ComponentUsage>;
122
+ /**
123
+ * Rename / re-describe a component. Deliberately sends NO `definition`: the route
124
+ * treats a metadata-only body as a rename and never re-validates or re-propagates,
125
+ * so nothing any page renders changes.
126
+ */
127
+ export declare function renameComponent(fetchFn: FetchLike, id: string, data: {
128
+ name: string;
129
+ description: string | null;
130
+ }): Promise<ComponentRow>;
131
+ /**
132
+ * Write a new definition — the propagating save. Every linked instance resolves
133
+ * the component at render time, so this is live on every page (published ones
134
+ * included) the moment it returns.
135
+ */
136
+ export declare function saveComponentDefinition(fetchFn: FetchLike, id: string, definition: unknown): Promise<ComponentRow>;
137
+ /**
138
+ * Delete a component. `detachAll` is the caller confirming the blast radius: the
139
+ * server materialises every placement into an independent copy first, then
140
+ * deletes — in that order, so a failed detach leaves both the component and every
141
+ * page untouched.
142
+ *
143
+ * Throws `ComponentApiError`; the two codes the UI must handle by name are
144
+ * `COMPONENT_IN_USE` (sent without `detachAll`) and `COMPONENT_DETACH_INCOMPLETE`
145
+ * (some page could not be detached, so nothing was deleted).
146
+ */
147
+ export declare function deleteComponent(fetchFn: FetchLike, id: string, options: {
148
+ detachAll: boolean;
149
+ }): Promise<{
150
+ deleted: boolean;
151
+ detached: DetachEverywhereResult;
152
+ }>;
153
+ //# sourceMappingURL=components-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components-data.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/components/components-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ // ─── Vocabulary ───────────────────────────────────────────────────────────────
2
+ /**
3
+ * What a component's kind is CALLED in the UI.
4
+ *
5
+ * These are the words the editors already use for the same three things, not new
6
+ * ones: `editor-canvas.tsx` labels a variant container "Personalized section" or
7
+ * "A/B tested section" depending on its mode, and the save dialog says the same
8
+ * (`use-component-connect.tsx`). A library that called the same object a
9
+ * "Container" would be the only place in the product using that word — and
10
+ * "arm"-style internal vocabulary in user copy is exactly what kywi-cms#148 was
11
+ * filed for. `mode` is read off the definition because that is where it lives;
12
+ * an unreadable definition degrades to the neutral "Personalized section".
13
+ */
14
+ export function componentKindLabel(component) {
15
+ switch (component.type) {
16
+ case 'module':
17
+ return 'Module';
18
+ case 'section':
19
+ return 'Section';
20
+ case 'variantContainer': {
21
+ const def = component.definition;
22
+ return def?.mode === 'ab_test' ? 'A/B tested section' : 'Personalized section';
23
+ }
24
+ default:
25
+ return component.type;
26
+ }
27
+ }
28
+ /** The type-filter choices, in list order. */
29
+ export const COMPONENT_KIND_FILTERS = [
30
+ { value: 'module', label: 'Modules' },
31
+ { value: 'section', label: 'Sections' },
32
+ { value: 'variantContainer', label: 'Personalized sections' },
33
+ ];
34
+ /**
35
+ * Does this component match the library's name/description search box?
36
+ * Client-side, case-insensitive, substring — the library is a per-site list of
37
+ * tens of rows, so a server round trip per keystroke would buy nothing.
38
+ */
39
+ export function matchesComponentSearch(component, query) {
40
+ const q = query.trim().toLowerCase();
41
+ if (q === '')
42
+ return true;
43
+ return (component.name.toLowerCase().includes(q) ||
44
+ (component.description ?? '').toLowerCase().includes(q) ||
45
+ (component.moduleType ?? '').toLowerCase().includes(q));
46
+ }
47
+ /**
48
+ * The usage cell's text.
49
+ *
50
+ * Zero has to READ as zero (kywi-cms#147 T4 ledger, M6): an undo after connecting
51
+ * leaves a component row nobody placed, and the library showing it as plainly
52
+ * unused is the whole mitigation for that. "—" would not do it.
53
+ */
54
+ export function usageSummary(usage) {
55
+ if (!usage)
56
+ return 'Usage unavailable';
57
+ const parts = [];
58
+ if (usage.instances === 0) {
59
+ parts.push('Not used on any page');
60
+ }
61
+ else {
62
+ parts.push(`${usage.instances} instance${usage.instances === 1 ? '' : 's'} on ` +
63
+ `${usage.pages} page${usage.pages === 1 ? '' : 's'}`);
64
+ }
65
+ if (usage.trashedInstances > 0) {
66
+ parts.push(`plus ${usage.trashedInstances} in the trash`);
67
+ }
68
+ return parts.join(' · ');
69
+ }
70
+ // ─── Transport ────────────────────────────────────────────────────────────────
71
+ /**
72
+ * A failed component request, carrying the server's own code and `details`.
73
+ *
74
+ * The delete flow needs both: `COMPONENT_IN_USE` comes with the usage payload and
75
+ * `COMPONENT_DETACH_INCOMPLETE` comes with the list of pages that could not be
76
+ * detached, and both have to be shown rather than flattened into "Delete failed".
77
+ */
78
+ export class ComponentApiError extends Error {
79
+ code;
80
+ status;
81
+ details;
82
+ constructor(message, code, status, details) {
83
+ super(message);
84
+ this.name = 'ComponentApiError';
85
+ this.code = code;
86
+ this.status = status;
87
+ this.details = details;
88
+ }
89
+ }
90
+ async function readData(res) {
91
+ if (!res.ok)
92
+ throw await toApiError(res);
93
+ const body = await res.json();
94
+ return body.data;
95
+ }
96
+ async function toApiError(res) {
97
+ let message = `Request failed (${res.status})`;
98
+ let code = 'REQUEST_FAILED';
99
+ let details;
100
+ try {
101
+ const body = await res.json();
102
+ message = body?.error?.message ?? message;
103
+ code = body?.error?.code ?? code;
104
+ details = body?.error?.details;
105
+ }
106
+ catch {
107
+ /* keep defaults — a non-JSON body is still a failure worth reporting */
108
+ }
109
+ return new ComponentApiError(message, code, res.status, details);
110
+ }
111
+ /** Every component in the site, each with its placement counts. */
112
+ export async function loadComponents(fetchFn) {
113
+ return readData(await fetchFn('/api/v1/components?withUsage=1'));
114
+ }
115
+ export async function loadComponent(fetchFn, id) {
116
+ return readData(await fetchFn(`/api/v1/components/${id}`));
117
+ }
118
+ export async function loadComponentUsage(fetchFn, id) {
119
+ return readData(await fetchFn(`/api/v1/components/${id}/usage`));
120
+ }
121
+ /**
122
+ * Rename / re-describe a component. Deliberately sends NO `definition`: the route
123
+ * treats a metadata-only body as a rename and never re-validates or re-propagates,
124
+ * so nothing any page renders changes.
125
+ */
126
+ export async function renameComponent(fetchFn, id, data) {
127
+ return readData(await fetchFn(`/api/v1/components/${id}`, { method: 'PUT', body: JSON.stringify(data) }));
128
+ }
129
+ /**
130
+ * Write a new definition — the propagating save. Every linked instance resolves
131
+ * the component at render time, so this is live on every page (published ones
132
+ * included) the moment it returns.
133
+ */
134
+ export async function saveComponentDefinition(fetchFn, id, definition) {
135
+ return readData(await fetchFn(`/api/v1/components/${id}`, {
136
+ method: 'PUT',
137
+ body: JSON.stringify({ definition }),
138
+ }));
139
+ }
140
+ /**
141
+ * Delete a component. `detachAll` is the caller confirming the blast radius: the
142
+ * server materialises every placement into an independent copy first, then
143
+ * deletes — in that order, so a failed detach leaves both the component and every
144
+ * page untouched.
145
+ *
146
+ * Throws `ComponentApiError`; the two codes the UI must handle by name are
147
+ * `COMPONENT_IN_USE` (sent without `detachAll`) and `COMPONENT_DETACH_INCOMPLETE`
148
+ * (some page could not be detached, so nothing was deleted).
149
+ */
150
+ export async function deleteComponent(fetchFn, id, options) {
151
+ const query = options.detachAll ? '?detachAll=1' : '';
152
+ return readData(await fetchFn(`/api/v1/components/${id}${query}`, { method: 'DELETE' }));
153
+ }
154
+ //# sourceMappingURL=components-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components-data.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/components/components-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SurfaceProps } from '../../registry.js';
2
+ export default function ComponentsListSurface(_props: SurfaceProps): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=components-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components-list.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/components/components-list.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AA6CrD,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,MAAM,EAAE,YAAY,2CAkcjE"}
@@ -0,0 +1,196 @@
1
+ 'use client';
2
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
3
+ /**
4
+ * `components.list` surface — the reusable-components library (kywi-cms#147,
5
+ * spec decision 6).
6
+ *
7
+ * This replaces the read-only "Saved components" sub-panel that used to sit at
8
+ * the bottom of the Layouts page. That panel could only list a name and delete a
9
+ * row, which stopped being adequate the moment components became LINKED: a
10
+ * component is now a live source, editing it changes every page it is placed on,
11
+ * and deleting it rewrites those pages. So the library has to answer "where is
12
+ * this used" before it offers either.
13
+ *
14
+ * List / row-action conventions follow the sibling list surfaces (Menus, Layouts,
15
+ * Feeds): page header, `kywi-table`, `Modal` for the rename form, `ConfirmDialog`
16
+ * for the destructive one.
17
+ */
18
+ import { useCallback, useEffect, useMemo, useState } from 'react';
19
+ import { useAdminContext } from '../../context.js';
20
+ import { LoadingState, ErrorState, ConfirmDialog, Modal } from '../../primitives.js';
21
+ import { hasMinRole } from '../../../auth/roles.js';
22
+ import { loadComponents, loadComponentUsage, renameComponent, deleteComponent, componentKindLabel, matchesComponentSearch, usageSummary, ComponentApiError, COMPONENT_KIND_FILTERS, } from './components-data.js';
23
+ export default function ComponentsListSurface(_props) {
24
+ const { fetch: adminFetch, navigate, user } = useAdminContext();
25
+ const [components, setComponents] = useState([]);
26
+ const [loading, setLoading] = useState(true);
27
+ const [error, setError] = useState(null);
28
+ const [kindFilter, setKindFilter] = useState('');
29
+ const [search, setSearch] = useState('');
30
+ const [rename, setRename] = useState(null);
31
+ const [pendingDelete, setPendingDelete] = useState(null);
32
+ /**
33
+ * Pages `?detachAll=1` refused to detach. Kept OUT of the dialog's lifetime on
34
+ * purpose: the dialog closes, the component is still there, and this is the
35
+ * explanation for why — so it stays on the page until dismissed or reloaded.
36
+ *
37
+ * `titles` is the usage read's own contentId → title map, carried over from the
38
+ * dialog that just closed (kywi-cms#147 T5 review, minor): the server's skip
39
+ * report identifies pages by id, and a reader who was just shown "Home,
40
+ * Pricing" should not have to translate two UUIDs to find out which page held
41
+ * the delete back. A page missing from the map — one in the trash, or placed
42
+ * between the usage read and the delete — still prints its id, which is better
43
+ * than printing nothing.
44
+ */
45
+ const [skipped, setSkipped] = useState(null);
46
+ /**
47
+ * Delete is gated at `delete` (siteAdmin) by `component-routes.ts`, because it
48
+ * removes the row AND rewrites every page that used it. Below that role the
49
+ * action is not offered rather than offered-and-403'd.
50
+ */
51
+ const canDelete = hasMinRole(user?.role ?? 'deny', 'siteAdmin');
52
+ const load = useCallback(async () => {
53
+ setLoading(true);
54
+ setError(null);
55
+ try {
56
+ const rows = await loadComponents(adminFetch);
57
+ rows.sort((a, b) => (b.updatedAt ?? '').localeCompare(a.updatedAt ?? ''));
58
+ setComponents(rows);
59
+ }
60
+ catch (e) {
61
+ setError(e instanceof Error ? e.message : 'Failed to load components');
62
+ }
63
+ finally {
64
+ setLoading(false);
65
+ }
66
+ }, [adminFetch]);
67
+ useEffect(() => { load(); }, [load]);
68
+ const visible = useMemo(() => components.filter(c => (kindFilter === '' || c.type === kindFilter) && matchesComponentSearch(c, search)), [components, kindFilter, search]);
69
+ // ── Rename ─────────────────────────────────────────────────────────────────
70
+ const handleRenameSubmit = useCallback(async () => {
71
+ if (!rename)
72
+ return;
73
+ const name = rename.name.trim();
74
+ if (!name) {
75
+ setRename({ ...rename, error: 'A component name is required.' });
76
+ return;
77
+ }
78
+ setRename({ ...rename, busy: true, error: null });
79
+ try {
80
+ await renameComponent(adminFetch, rename.component.id, {
81
+ name,
82
+ // Empty clears the description; the route accepts an explicit null.
83
+ description: rename.description.trim() === '' ? null : rename.description.trim(),
84
+ });
85
+ setRename(null);
86
+ await load();
87
+ }
88
+ catch (e) {
89
+ setRename({ ...rename, busy: false, error: e instanceof Error ? e.message : 'Save failed' });
90
+ }
91
+ }, [rename, adminFetch, load]);
92
+ // ── Delete ─────────────────────────────────────────────────────────────────
93
+ /**
94
+ * Open the confirm dialog, naming the real blast radius.
95
+ *
96
+ * The counts come from `GET /components/:id/usage` rather than the list row's
97
+ * folded-in numbers, freshly, at the moment of asking: the list may have been
98
+ * open for a while and the whole point of this dialog is that the number in it
99
+ * is the number of pages about to be rewritten. The row's counts are the
100
+ * fallback if that read fails — a stale number with a caveat beats refusing to
101
+ * let anything be deleted because one GET failed.
102
+ */
103
+ const openDelete = useCallback(async (component) => {
104
+ setSkipped(null);
105
+ setPendingDelete({
106
+ component, usage: null, loaded: false, usageError: null, busy: false, error: null,
107
+ forceDetachAll: false,
108
+ });
109
+ try {
110
+ const usage = await loadComponentUsage(adminFetch, component.id);
111
+ setPendingDelete(prev => (prev?.component.id === component.id ? { ...prev, usage, loaded: true } : prev));
112
+ }
113
+ catch (e) {
114
+ setPendingDelete(prev => prev?.component.id === component.id
115
+ ? {
116
+ ...prev,
117
+ loaded: true,
118
+ usageError: e instanceof Error ? e.message : 'Could not read where this component is used',
119
+ }
120
+ : prev);
121
+ }
122
+ }, [adminFetch]);
123
+ const handleDelete = useCallback(async () => {
124
+ if (!pendingDelete)
125
+ return;
126
+ const { component, usage } = pendingDelete;
127
+ // Without a usage read, assume there ARE instances: `?detachAll=1` is safe on
128
+ // a component with none (nothing to detach, then delete), whereas omitting it
129
+ // on one that has some is a 409 the user would have to answer again.
130
+ const placed = pendingDelete.forceDetachAll || usage === null || usage.instances + usage.trashedInstances > 0;
131
+ setPendingDelete({ ...pendingDelete, busy: true, error: null });
132
+ try {
133
+ await deleteComponent(adminFetch, component.id, { detachAll: placed });
134
+ setPendingDelete(null);
135
+ await load();
136
+ }
137
+ catch (e) {
138
+ if (e instanceof ComponentApiError && e.code === 'COMPONENT_DETACH_INCOMPLETE') {
139
+ // Nothing was deleted. Say which pages held it back, and why.
140
+ const details = e.details;
141
+ setPendingDelete(null);
142
+ setSkipped({
143
+ name: component.name,
144
+ pages: details?.skipped ?? [],
145
+ titles: Object.fromEntries((usage?.items ?? [])
146
+ .filter(item => item.title !== null)
147
+ .map(item => [item.contentId, item.title])),
148
+ });
149
+ await load();
150
+ return;
151
+ }
152
+ // The zero-instance race (kywi-cms#147 T5 review, minor): the usage read said
153
+ // nothing used this, so `?detachAll=1` was deliberately NOT sent — and between
154
+ // that read and this request someone placed it. The server's own message says
155
+ // "Re-send with ?detachAll=1", which is API-speak for the reader and describes
156
+ // a button rather than being one. So the fresh counts from the 409's details
157
+ // replace the stale ones, the dialog stays open saying what changed, and
158
+ // confirming again now sends detachAll (`placed` reads the new usage).
159
+ if (e instanceof ComponentApiError && e.code === 'COMPONENT_IN_USE') {
160
+ const fresh = e.details;
161
+ setPendingDelete({
162
+ ...pendingDelete,
163
+ ...(fresh && typeof fresh.instances === 'number' ? { usage: fresh } : {}),
164
+ forceDetachAll: true,
165
+ busy: false,
166
+ error: `“${component.name}” is now placed on a page, so nothing was deleted. ` +
167
+ 'Confirm again to detach every instance into an independent copy and then delete it.',
168
+ });
169
+ return;
170
+ }
171
+ setPendingDelete({
172
+ ...pendingDelete,
173
+ busy: false,
174
+ error: e instanceof Error ? e.message : 'Delete failed',
175
+ });
176
+ }
177
+ }, [pendingDelete, adminFetch, load]);
178
+ const deleteMessage = useMemo(() => {
179
+ if (!pendingDelete)
180
+ return null;
181
+ const { component, usage, loaded, usageError, error } = pendingDelete;
182
+ return (_jsxs(_Fragment, { children: [!loaded ? (_jsxs("p", { children: ["Checking where \u201C", component.name, "\u201D is used\u2026"] })) : usage === null ? (_jsxs("p", { children: ["Could not read where \u201C", component.name, "\u201D is used (", usageError, "). Any instances will be detached into independent copies before it is deleted, and each page will keep rendering exactly what it renders now."] })) : usage.instances === 0 && usage.trashedInstances === 0 ? (_jsxs("p", { children: ["\u201C", component.name, "\u201D is not used on any page. Deleting it cannot change what any page renders."] })) : (_jsxs(_Fragment, { children: [_jsxs("p", { children: [_jsxs("strong", { children: [usage.instances, " instance", usage.instances === 1 ? '' : 's', " across ", usage.pages, ' ', "page", usage.pages === 1 ? '' : 's'] }), ' ', "will be detached into independent copies, then \u201C", component.name, "\u201D will be deleted. Every page keeps rendering exactly what it renders now \u2014 published pages included \u2014 but they stop following this component."] }), usage.trashedInstances > 0 && (_jsxs("p", { className: "kywi-text-muted", children: ["Plus ", usage.trashedInstances, " instance", usage.trashedInstances === 1 ? '' : 's', " on", ' ', usage.trashedPages, " page", usage.trashedPages === 1 ? '' : 's', " in the trash, which are detached too so restoring one does not bring back a broken link."] })), usage.items.length > 0 && (_jsx("ul", { className: "kywi-admin-confirm-list", children: usage.items.map(item => (_jsxs("li", { children: [item.title ?? item.contentId, item.nodeIds.length > 1 ? ` (${item.nodeIds.length} instances)` : ''] }, item.contentId))) }))] })), error && _jsx("p", { className: "kywi-admin-error-message", role: "alert", children: error })] }));
183
+ }, [pendingDelete]);
184
+ // ── Render ─────────────────────────────────────────────────────────────────
185
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: "kywi-admin-page-header", children: _jsxs("div", { children: [_jsx("h1", { children: "Components" }), _jsxs("p", { className: "kywi-text-muted", children: ["Reusable modules, sections and personalized sections, saved from the editors. Every page that places one ", _jsx("strong", { children: "links" }), " to it, so editing a component here updates every instance everywhere \u2014 published pages included \u2014 the moment you save."] })] }) }), skipped && (_jsxs("div", { className: "kywi-admin-error", role: "alert", children: [_jsxs("p", { className: "kywi-admin-error-message", children: ["\u201C", skipped.name, "\u201D was ", _jsx("strong", { children: "not" }), " deleted: ", skipped.pages.length, " page", skipped.pages.length === 1 ? '' : 's', " could not be detached, so they still use it."] }), _jsx("ul", { className: "kywi-admin-confirm-list", children: skipped.pages.map(page => (_jsxs("li", { children: [skipped.titles[page.contentId] ?? page.contentId, " (", page.contentType, ") \u2014 ", page.detail] }, page.contentId))) }), _jsx("button", { type: "button", className: "kywi-btn kywi-btn-secondary", onClick: () => setSkipped(null), children: "Dismiss" })] })), loading ? (_jsx(LoadingState, { label: "Loading components\u2026" })) : error ? (_jsx(ErrorState, { message: error, onRetry: load })) : components.length === 0 ? (_jsx("div", { className: "kywi-empty-state", children: _jsxs("p", { children: ["No components yet. Open a page in the editor, select a module or section, and choose", ' ', _jsx("strong", { children: "Save as component" }), " \u2014 components are born from real pages rather than created blank here."] }) })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "kywi-components-filters", children: [_jsxs("div", { className: "kywi-field", children: [_jsx("label", { htmlFor: "kywi-components-search", className: "kywi-field-label", children: "Search" }), _jsx("input", { id: "kywi-components-search", type: "search", className: "kywi-input", value: search, placeholder: "Name, description or module type", onChange: e => setSearch(e.target.value) })] }), _jsxs("div", { className: "kywi-field", children: [_jsx("label", { htmlFor: "kywi-components-type", className: "kywi-field-label", children: "Type" }), _jsxs("select", { id: "kywi-components-type", className: "kywi-input", value: kindFilter, onChange: e => setKindFilter(e.target.value), children: [_jsx("option", { value: "", children: "All types" }), COMPONENT_KIND_FILTERS.map(filter => (_jsx("option", { value: filter.value, children: filter.label }, filter.value)))] })] })] }), visible.length === 0 ? (_jsx("div", { className: "kywi-empty-state", children: _jsx("p", { children: "No components match that filter." }) })) : (_jsx("div", { className: "kywi-table-scroll", children: _jsxs("table", { className: "kywi-table kywi-components-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Name" }), _jsx("th", { children: "Type" }), _jsx("th", { children: "Module" }), _jsx("th", { children: "Used on" }), _jsx("th", { children: "Updated" }), _jsx("th", { className: "kywi-col-actions", children: "Actions" })] }) }), _jsx("tbody", { children: visible.map(component => {
186
+ const unused = component.usage?.instances === 0;
187
+ return (_jsxs("tr", { children: [_jsxs("td", { children: [_jsx("button", { type: "button", className: "kywi-link-button", onClick: () => navigate(`/admin/components/${component.id}`), children: component.name }), component.description && (_jsx("div", { className: "kywi-text-muted", children: component.description }))] }), _jsx("td", { children: componentKindLabel(component) }), _jsx("td", { children: component.moduleType ? _jsx("code", { children: component.moduleType }) : '—' }), _jsx("td", { className: unused ? 'kywi-component-usage kywi-component-usage--unused' : 'kywi-component-usage', children: usageSummary(component.usage) }), _jsx("td", { children: component.updatedAt ? new Date(component.updatedAt).toLocaleDateString() : '—' }), _jsxs("td", { className: "kywi-col-actions", children: [_jsx("button", { type: "button", className: "kywi-btn kywi-btn-ghost kywi-btn-sm", onClick: () => navigate(`/admin/components/${component.id}`), children: "Edit" }), _jsx("button", { type: "button", className: "kywi-btn kywi-btn-ghost kywi-btn-sm", onClick: () => setRename({
188
+ component,
189
+ name: component.name,
190
+ description: component.description ?? '',
191
+ error: null,
192
+ busy: false,
193
+ }), children: "Rename" }), canDelete && (_jsx("button", { type: "button", className: "kywi-btn kywi-btn-danger kywi-btn-sm", onClick: () => { void openDelete(component); }, children: "Delete" }))] })] }, component.id));
194
+ }) })] }) }))] })), rename && (_jsxs(Modal, { title: `Rename “${rename.component.name}”`, onClose: () => setRename(null), labelledBy: "kywi-component-rename-title", children: [_jsx("p", { className: "kywi-text-muted", children: "The name and description are library labels only \u2014 renaming changes nothing any page renders." }), _jsxs("div", { className: "kywi-field", children: [_jsx("label", { htmlFor: "kywi-component-name", className: "kywi-field-label", children: "Component name" }), _jsx("input", { id: "kywi-component-name", type: "text", className: "kywi-input", value: rename.name, onChange: e => setRename({ ...rename, name: e.target.value }) })] }), _jsxs("div", { className: "kywi-field", children: [_jsx("label", { htmlFor: "kywi-component-description", className: "kywi-field-label", children: "Description" }), _jsx("textarea", { id: "kywi-component-description", className: "kywi-input", rows: 3, value: rename.description, placeholder: "Where this belongs, or what it is for", onChange: e => setRename({ ...rename, description: e.target.value }) })] }), rename.error && _jsx("p", { className: "kywi-admin-error-message", role: "alert", children: rename.error }), _jsxs("div", { className: "kywi-admin-form-actions", children: [_jsx("button", { type: "button", className: "kywi-btn kywi-btn-secondary", onClick: () => setRename(null), disabled: rename.busy, children: "Cancel" }), _jsx("button", { type: "button", className: "kywi-btn kywi-btn-primary", onClick: handleRenameSubmit, disabled: rename.busy, children: rename.busy ? 'Saving…' : 'Save' })] })] })), pendingDelete && (_jsx(ConfirmDialog, { title: `Delete “${pendingDelete.component.name}”?`, message: deleteMessage, confirmLabel: "Detach and delete", busy: pendingDelete.busy || !pendingDelete.loaded, onConfirm: handleDelete, onCancel: () => setPendingDelete(null) }))] }));
195
+ }
196
+ //# sourceMappingURL=components-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components-list.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/components/components-list.tsx"],"names":[],"mappings":"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"}