@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.
- package/AGENT-PATTERNS.md +96 -10
- package/dist/admin/content-form.d.ts.map +1 -1
- package/dist/admin/content-form.js +97 -10
- package/dist/admin/content-form.js.map +1 -1
- package/dist/admin/layout-editor/component-actions.d.ts +219 -22
- package/dist/admin/layout-editor/component-actions.d.ts.map +1 -1
- package/dist/admin/layout-editor/component-actions.js +356 -36
- package/dist/admin/layout-editor/component-actions.js.map +1 -1
- package/dist/admin/layout-editor/component-fork.d.ts +224 -0
- package/dist/admin/layout-editor/component-fork.d.ts.map +1 -0
- package/dist/admin/layout-editor/component-fork.js +342 -0
- package/dist/admin/layout-editor/component-fork.js.map +1 -0
- package/dist/admin/layout-editor/editor-canvas.d.ts +8 -0
- package/dist/admin/layout-editor/editor-canvas.d.ts.map +1 -1
- package/dist/admin/layout-editor/editor-canvas.js +120 -12
- package/dist/admin/layout-editor/editor-canvas.js.map +1 -1
- package/dist/admin/layout-editor/editor-dialog.d.ts +164 -0
- package/dist/admin/layout-editor/editor-dialog.d.ts.map +1 -0
- package/dist/admin/layout-editor/editor-dialog.js +195 -0
- package/dist/admin/layout-editor/editor-dialog.js.map +1 -0
- package/dist/admin/layout-editor/editor-state.d.ts +76 -0
- package/dist/admin/layout-editor/editor-state.d.ts.map +1 -1
- package/dist/admin/layout-editor/editor-state.js +47 -1
- package/dist/admin/layout-editor/editor-state.js.map +1 -1
- package/dist/admin/layout-editor/editor.css +279 -2
- package/dist/admin/layout-editor/index.d.ts +10 -1
- package/dist/admin/layout-editor/index.d.ts.map +1 -1
- package/dist/admin/layout-editor/index.js +11 -1
- package/dist/admin/layout-editor/index.js.map +1 -1
- package/dist/admin/layout-editor/layout-editor.d.ts +58 -1
- package/dist/admin/layout-editor/layout-editor.d.ts.map +1 -1
- package/dist/admin/layout-editor/layout-editor.js +160 -190
- package/dist/admin/layout-editor/layout-editor.js.map +1 -1
- package/dist/admin/layout-editor/linked-component.d.ts +39 -0
- package/dist/admin/layout-editor/linked-component.d.ts.map +1 -0
- package/dist/admin/layout-editor/linked-component.js +42 -0
- package/dist/admin/layout-editor/linked-component.js.map +1 -0
- package/dist/admin/layout-editor/module-overlay.d.ts +10 -1
- package/dist/admin/layout-editor/module-overlay.d.ts.map +1 -1
- package/dist/admin/layout-editor/module-overlay.js +33 -4
- package/dist/admin/layout-editor/module-overlay.js.map +1 -1
- package/dist/admin/layout-editor/node-lookup.d.ts +35 -0
- package/dist/admin/layout-editor/node-lookup.d.ts.map +1 -1
- package/dist/admin/layout-editor/node-lookup.js +91 -0
- package/dist/admin/layout-editor/node-lookup.js.map +1 -1
- package/dist/admin/layout-editor/overlay-shell.d.ts.map +1 -1
- package/dist/admin/layout-editor/overlay-shell.js +114 -23
- package/dist/admin/layout-editor/overlay-shell.js.map +1 -1
- package/dist/admin/layout-editor/props-panel.d.ts +54 -1
- package/dist/admin/layout-editor/props-panel.d.ts.map +1 -1
- package/dist/admin/layout-editor/props-panel.js +118 -9
- package/dist/admin/layout-editor/props-panel.js.map +1 -1
- package/dist/admin/layout-editor/section-overlay.d.ts +9 -1
- package/dist/admin/layout-editor/section-overlay.d.ts.map +1 -1
- package/dist/admin/layout-editor/section-overlay.js +14 -4
- package/dist/admin/layout-editor/section-overlay.js.map +1 -1
- package/dist/admin/layout-editor/section-template-picker.d.ts +27 -1
- package/dist/admin/layout-editor/section-template-picker.d.ts.map +1 -1
- package/dist/admin/layout-editor/section-template-picker.js +71 -17
- package/dist/admin/layout-editor/section-template-picker.js.map +1 -1
- package/dist/admin/layout-editor/use-component-connect.d.ts +61 -0
- package/dist/admin/layout-editor/use-component-connect.d.ts.map +1 -0
- package/dist/admin/layout-editor/use-component-connect.js +292 -0
- package/dist/admin/layout-editor/use-component-connect.js.map +1 -0
- package/dist/admin/layout-editor/use-component-fork.d.ts +123 -0
- package/dist/admin/layout-editor/use-component-fork.d.ts.map +1 -0
- package/dist/admin/layout-editor/use-component-fork.js +346 -0
- package/dist/admin/layout-editor/use-component-fork.js.map +1 -0
- package/dist/admin/layout-editor/use-component-library.d.ts +94 -0
- package/dist/admin/layout-editor/use-component-library.d.ts.map +1 -0
- package/dist/admin/layout-editor/use-component-library.js +55 -0
- package/dist/admin/layout-editor/use-component-library.js.map +1 -0
- package/dist/admin/registry.d.ts +11 -2
- package/dist/admin/registry.d.ts.map +1 -1
- package/dist/admin/registry.js +40 -4
- package/dist/admin/registry.js.map +1 -1
- package/dist/admin/server.d.ts +1 -0
- package/dist/admin/server.d.ts.map +1 -1
- package/dist/admin/server.js +5 -0
- package/dist/admin/server.js.map +1 -1
- package/dist/admin/styles/admin.css +43 -0
- package/dist/admin/surfaces/components/component-edit.d.ts +3 -0
- package/dist/admin/surfaces/components/component-edit.d.ts.map +1 -0
- package/dist/admin/surfaces/components/component-edit.js +235 -0
- package/dist/admin/surfaces/components/component-edit.js.map +1 -0
- package/dist/admin/surfaces/components/components-data.d.ts +153 -0
- package/dist/admin/surfaces/components/components-data.d.ts.map +1 -0
- package/dist/admin/surfaces/components/components-data.js +154 -0
- package/dist/admin/surfaces/components/components-data.js.map +1 -0
- package/dist/admin/surfaces/components/components-list.d.ts +3 -0
- package/dist/admin/surfaces/components/components-list.d.ts.map +1 -0
- package/dist/admin/surfaces/components/components-list.js +196 -0
- package/dist/admin/surfaces/components/components-list.js.map +1 -0
- package/dist/admin/surfaces/components/definition-canvas.d.ts +73 -0
- package/dist/admin/surfaces/components/definition-canvas.d.ts.map +1 -0
- package/dist/admin/surfaces/components/definition-canvas.js +207 -0
- package/dist/admin/surfaces/components/definition-canvas.js.map +1 -0
- package/dist/admin/surfaces/layouts/layout-editor-client.d.ts.map +1 -1
- package/dist/admin/surfaces/layouts/layout-editor-client.js +14 -2
- package/dist/admin/surfaces/layouts/layout-editor-client.js.map +1 -1
- package/dist/admin/surfaces/layouts/layouts-data.d.ts +3 -14
- package/dist/admin/surfaces/layouts/layouts-data.d.ts.map +1 -1
- package/dist/admin/surfaces/layouts/layouts-data.js +4 -7
- package/dist/admin/surfaces/layouts/layouts-data.js.map +1 -1
- package/dist/admin/surfaces/layouts/layouts-list.d.ts.map +1 -1
- package/dist/admin/surfaces/layouts/layouts-list.js +16 -22
- package/dist/admin/surfaces/layouts/layouts-list.js.map +1 -1
- package/dist/admin/surfaces/settings/admin-features.d.ts.map +1 -1
- package/dist/admin/surfaces/settings/admin-features.js +1 -0
- package/dist/admin/surfaces/settings/admin-features.js.map +1 -1
- package/dist/api/bulk-routes.d.ts.map +1 -1
- package/dist/api/bulk-routes.js +25 -0
- package/dist/api/bulk-routes.js.map +1 -1
- package/dist/api/changeset-routes.d.ts.map +1 -1
- package/dist/api/changeset-routes.js +17 -3
- package/dist/api/changeset-routes.js.map +1 -1
- package/dist/api/component-routes.d.ts.map +1 -1
- package/dist/api/component-routes.js +228 -8
- package/dist/api/component-routes.js.map +1 -1
- package/dist/api/content-routes.d.ts.map +1 -1
- package/dist/api/content-routes.js +64 -0
- package/dist/api/content-routes.js.map +1 -1
- package/dist/api/feed-routes.d.ts +6 -6
- package/dist/api/graphql/resolvers.d.ts +4 -4
- package/dist/api/layout-routes.d.ts.map +1 -1
- package/dist/api/layout-routes.js +4 -17
- package/dist/api/layout-routes.js.map +1 -1
- package/dist/api/layout-write-guard.d.ts +80 -0
- package/dist/api/layout-write-guard.d.ts.map +1 -0
- package/dist/api/layout-write-guard.js +88 -0
- package/dist/api/layout-write-guard.js.map +1 -0
- package/dist/api/section-template-routes.d.ts.map +1 -1
- package/dist/api/section-template-routes.js +11 -0
- package/dist/api/section-template-routes.js.map +1 -1
- package/dist/api/translation-routes.d.ts.map +1 -1
- package/dist/api/translation-routes.js +8 -0
- package/dist/api/translation-routes.js.map +1 -1
- package/dist/api/version-routes.d.ts.map +1 -1
- package/dist/api/version-routes.js +20 -8
- package/dist/api/version-routes.js.map +1 -1
- package/dist/api/workflow-routes.d.ts.map +1 -1
- package/dist/api/workflow-routes.js +53 -8
- package/dist/api/workflow-routes.js.map +1 -1
- package/dist/db/analytics-queries.d.ts +3 -3
- package/dist/db/apply-snapshot.d.ts +75 -8
- package/dist/db/apply-snapshot.d.ts.map +1 -1
- package/dist/db/apply-snapshot.js +104 -8
- package/dist/db/apply-snapshot.js.map +1 -1
- package/dist/db/audit-queries.d.ts +12 -12
- package/dist/db/category-queries.d.ts +3 -3
- package/dist/db/changeset-audit-queries.d.ts +4 -4
- package/dist/db/changeset-queries.d.ts +7 -7
- package/dist/db/comment-queries.d.ts +8 -8
- package/dist/db/comment-subscription-queries.d.ts +2 -2
- package/dist/db/component-instance-queries.d.ts +197 -0
- package/dist/db/component-instance-queries.d.ts.map +1 -0
- package/dist/db/component-instance-queries.js +405 -0
- package/dist/db/component-instance-queries.js.map +1 -0
- package/dist/db/content-queries.d.ts.map +1 -1
- package/dist/db/content-queries.js +39 -2
- package/dist/db/content-queries.js.map +1 -1
- package/dist/db/extension-queries.d.ts +7 -7
- package/dist/db/feed-queries.d.ts +3 -3
- package/dist/db/index.d.ts +1 -0
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +1 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/layout-queries.d.ts +13 -1
- package/dist/db/layout-queries.d.ts.map +1 -1
- package/dist/db/layout-queries.js +52 -7
- package/dist/db/layout-queries.js.map +1 -1
- package/dist/db/locale-queries.d.ts.map +1 -1
- package/dist/db/locale-queries.js +0 -0
- package/dist/db/locale-queries.js.map +1 -1
- package/dist/db/media-queries.d.ts +12 -12
- package/dist/db/revision-queries.d.ts +3 -3
- package/dist/db/site-admin-queries.d.ts +2 -2
- package/dist/db/site-membership-queries.d.ts +3 -3
- package/dist/db/site-plugin-queries.d.ts +2 -2
- package/dist/db/site-queries.d.ts +6 -6
- package/dist/db/version-queries.d.ts +12 -12
- package/dist/db/webhook-queries.d.ts +11 -11
- package/dist/db/workflow-queries.d.ts +6 -6
- package/dist/db/workflow-queries.d.ts.map +1 -1
- package/dist/db/workflow-queries.js +11 -2
- package/dist/db/workflow-queries.js.map +1 -1
- package/dist/layout/component-refs.d.ts +465 -0
- package/dist/layout/component-refs.d.ts.map +1 -0
- package/dist/layout/component-refs.js +848 -0
- package/dist/layout/component-refs.js.map +1 -0
- package/dist/layout/index.d.ts +2 -1
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +1 -0
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/module-permissions.d.ts +49 -1
- package/dist/layout/module-permissions.d.ts.map +1 -1
- package/dist/layout/module-permissions.js +117 -6
- package/dist/layout/module-permissions.js.map +1 -1
- package/dist/layout/renderer.d.ts +51 -4
- package/dist/layout/renderer.d.ts.map +1 -1
- package/dist/layout/renderer.js +36 -38
- package/dist/layout/renderer.js.map +1 -1
- package/dist/layout/types.d.ts +42 -0
- package/dist/layout/types.d.ts.map +1 -1
- package/dist/layout/types.js +54 -11
- package/dist/layout/types.js.map +1 -1
- package/dist/schema/base.d.ts +1 -1
- package/dist/schema/components.d.ts +150 -0
- package/dist/schema/components.d.ts.map +1 -1
- package/dist/schema/components.js +50 -4
- package/dist/schema/components.js.map +1 -1
- package/dist/versioning/scheduler.d.ts +8 -0
- package/dist/versioning/scheduler.d.ts.map +1 -1
- package/dist/versioning/scheduler.js +21 -7
- package/dist/versioning/scheduler.js.map +1 -1
- 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":"AAkFA,iFAAiF;AAEjF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAoD;IACrF,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAA;QACjB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAA;QAClB,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,MAAM,GAAG,GAAG,SAAS,CAAC,UAAmD,CAAA;YACzE,OAAO,GAAG,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,sBAAsB,CAAA;QAChF,CAAC;QACD;YACE,OAAO,SAAS,CAAC,IAAI,CAAA;IACzB,CAAC;AACH,CAAC;AAED,8CAA8C;AAC9C,MAAM,CAAC,MAAM,sBAAsB,GAA2D;IAC5F,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;IACrC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE;IACvC,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,uBAAuB,EAAE;CACrD,CAAA;AAEV;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAuB,EAAE,KAAa;IAC3E,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACpC,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,IAAI,CAAA;IACzB,OAAO,CACL,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxC,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvD,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CACvD,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAuC;IAClE,IAAI,CAAC,KAAK;QAAE,OAAO,mBAAmB,CAAA;IACtC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;IACpC,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CACR,GAAG,KAAK,CAAC,SAAS,YAAY,KAAK,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM;YAClE,GAAG,KAAK,CAAC,KAAK,QAAQ,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CACvD,CAAA;IACH,CAAC;IACD,IAAI,KAAK,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CACR,QAAQ,KAAK,CAAC,gBAAgB,eAAe,CAC9C,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,iFAAiF;AAEjF;;;;;;GAMG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,IAAI,CAAQ;IACZ,MAAM,CAAQ;IACd,OAAO,CAAS;IAEzB,YAAY,OAAe,EAAE,IAAY,EAAE,MAAc,EAAE,OAAgB;QACzE,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAA;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAED,KAAK,UAAU,QAAQ,CAAI,GAAa;IACtC,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;IAC7B,OAAO,IAAI,CAAC,IAAS,CAAA;AACvB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAa;IACrC,IAAI,OAAO,GAAG,mBAAmB,GAAG,CAAC,MAAM,GAAG,CAAA;IAC9C,IAAI,IAAI,GAAG,gBAAgB,CAAA;IAC3B,IAAI,OAAgB,CAAA;IACpB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAC7B,OAAO,GAAG,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,OAAO,CAAA;QACzC,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI,CAAA;QAChC,OAAO,GAAG,IAAI,EAAE,KAAK,EAAE,OAAO,CAAA;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;IAC1E,CAAC;IACD,OAAO,IAAI,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAClE,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAkB;IACrD,OAAO,QAAQ,CAAiB,MAAM,OAAO,CAAC,gCAAgC,CAAC,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAkB,EAAE,EAAU;IAChE,OAAO,QAAQ,CAAe,MAAM,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC,CAAA;AAC1E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAkB,EAAE,EAAU;IACrE,OAAO,QAAQ,CAAiB,MAAM,OAAO,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC,CAAA;AAClF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAkB,EAClB,EAAU,EACV,IAAkD;IAElD,OAAO,QAAQ,CACb,MAAM,OAAO,CAAC,sBAAsB,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CACzF,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAkB,EAClB,EAAU,EACV,UAAmB;IAEnB,OAAO,QAAQ,CACb,MAAM,OAAO,CAAC,sBAAsB,EAAE,EAAE,EAAE;QACxC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC;KACrC,CAAC,CACH,CAAA;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAkB,EAClB,EAAU,EACV,OAA+B;IAE/B,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;IACrD,OAAO,QAAQ,CACb,MAAM,OAAO,CAAC,sBAAsB,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CACxE,CAAA;AACH,CAAC"}
|
|
@@ -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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"}
|