@kywi-software/core 0.10.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 +111 -23
- package/README.md +67 -0
- 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 +28 -7
- package/dist/admin/layout-editor/editor-canvas.d.ts.map +1 -1
- package/dist/admin/layout-editor/editor-canvas.js +145 -32
- 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 +366 -4
- 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/inline-text.d.ts +56 -4
- package/dist/admin/layout-editor/inline-text.d.ts.map +1 -1
- package/dist/admin/layout-editor/inline-text.js +134 -11
- package/dist/admin/layout-editor/inline-text.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 +36 -14
- package/dist/admin/layout-editor/module-overlay.d.ts.map +1 -1
- package/dist/admin/layout-editor/module-overlay.js +233 -25
- 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 +150 -32
- 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 +119 -10
- package/dist/admin/layout-editor/props-panel.js.map +1 -1
- package/dist/admin/layout-editor/section-overlay.d.ts +16 -1
- package/dist/admin/layout-editor/section-overlay.d.ts.map +1 -1
- package/dist/admin/layout-editor/section-overlay.js +21 -11
- 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/section-variant-container-config.js +5 -5
- package/dist/admin/layout-editor/section-variant-container-config.js.map +1 -1
- package/dist/admin/layout-editor/use-chrome-flip.d.ts +111 -11
- package/dist/admin/layout-editor/use-chrome-flip.d.ts.map +1 -1
- package/dist/admin/layout-editor/use-chrome-flip.js +233 -33
- package/dist/admin/layout-editor/use-chrome-flip.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 +57 -1
- 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/comments-module.d.ts.map +1 -1
- package/dist/layout/comments-module.js +6 -2
- package/dist/layout/comments-module.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/module-render-context.d.ts +32 -0
- package/dist/layout/module-render-context.d.ts.map +1 -1
- package/dist/layout/module-render-context.js +32 -1
- package/dist/layout/module-render-context.js.map +1 -1
- package/dist/layout/modules-extended.d.ts.map +1 -1
- package/dist/layout/modules-extended.js +21 -11
- package/dist/layout/modules-extended.js.map +1 -1
- package/dist/layout/modules.d.ts.map +1 -1
- package/dist/layout/modules.js +15 -10
- package/dist/layout/modules.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/scope/inline-editing.d.ts.map +1 -1
- package/dist/scope/inline-editing.js +10 -0
- package/dist/scope/inline-editing.js.map +1 -1
- package/dist/scope/sticky-offset.d.ts +185 -0
- package/dist/scope/sticky-offset.d.ts.map +1 -0
- package/dist/scope/sticky-offset.js +432 -0
- package/dist/scope/sticky-offset.js.map +1 -0
- package/dist/site/styles.css +41 -3
- 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,207 @@
|
|
|
1
|
+
import { validateComponentDefinition } from '../../../layout/component-refs.js';
|
|
2
|
+
/** The single region a definition canvas document has. */
|
|
3
|
+
export const DEFINITION_REGION = 'main';
|
|
4
|
+
/**
|
|
5
|
+
* Wrap a section/container definition as a one-node, one-region document.
|
|
6
|
+
*
|
|
7
|
+
* A definition that does not match its row's declared type (the `unresolvable`
|
|
8
|
+
* case the renderer already degrades on) yields an EMPTY region rather than a
|
|
9
|
+
* document holding a malformed node: the editor would refuse to render it, and an
|
|
10
|
+
* empty canvas at least lets the author rebuild the component from scratch. The
|
|
11
|
+
* caller surfaces the mismatch separately.
|
|
12
|
+
*/
|
|
13
|
+
export function seedDefinitionDocument(component) {
|
|
14
|
+
const node = readRegionNode(component);
|
|
15
|
+
return { regions: { [DEFINITION_REGION]: node ? [node] : [] } };
|
|
16
|
+
}
|
|
17
|
+
/** The definition as a region node, or null when it doesn't match the row's type. */
|
|
18
|
+
export function readRegionNode(component) {
|
|
19
|
+
const def = component.definition;
|
|
20
|
+
if (typeof def !== 'object' || def === null || Array.isArray(def))
|
|
21
|
+
return null;
|
|
22
|
+
const candidate = def;
|
|
23
|
+
// Structure, not just `type`: the same reasoning as `isRegionNodeShape` in
|
|
24
|
+
// component-actions.ts — a host module pack may register a module named
|
|
25
|
+
// `section`, so the discriminant alone is not proof of shape.
|
|
26
|
+
if (component.type === 'section' && candidate.type === 'section' && Array.isArray(candidate.columns)) {
|
|
27
|
+
return def;
|
|
28
|
+
}
|
|
29
|
+
if (component.type === 'variantContainer' &&
|
|
30
|
+
candidate.type === 'variantContainer' &&
|
|
31
|
+
Array.isArray(candidate.defaultSections)) {
|
|
32
|
+
return def;
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Read the edited document back as a definition for a component of `type`, or
|
|
38
|
+
* explain why it isn't one.
|
|
39
|
+
*
|
|
40
|
+
* The validator that runs last is the REAL one — `validateComponentDefinition`,
|
|
41
|
+
* the same function `POST /components` and `PUT /components/:id` call. Running it
|
|
42
|
+
* here does not replace the server's check (the server is still the only gate);
|
|
43
|
+
* it means the author sees the specific reason — columns that don't sum to 12, a
|
|
44
|
+
* link to another component that has to be detached first — against the canvas
|
|
45
|
+
* they are looking at, instead of a round trip ending in a generic 400.
|
|
46
|
+
*/
|
|
47
|
+
export function extractDefinition(doc, component) {
|
|
48
|
+
if ((doc.pageVariants ?? []).length > 0) {
|
|
49
|
+
return {
|
|
50
|
+
ok: false,
|
|
51
|
+
error: 'A component cannot hold page variants. Remove the page variant before saving — ' +
|
|
52
|
+
'personalize the sections on the page that places this component instead.',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if ((doc.abExperiments ?? []).length > 0) {
|
|
56
|
+
return {
|
|
57
|
+
ok: false,
|
|
58
|
+
error: 'A component cannot hold page-level A/B experiments. Remove it before saving — ' +
|
|
59
|
+
'run the experiment on the page that places this component instead.',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const nodes = Object.values(doc.regions ?? {}).flatMap(region => region ?? []);
|
|
63
|
+
if (nodes.length === 0) {
|
|
64
|
+
return { ok: false, error: 'This component is empty. Add a section before saving.' };
|
|
65
|
+
}
|
|
66
|
+
if (nodes.length > 1) {
|
|
67
|
+
return {
|
|
68
|
+
ok: false,
|
|
69
|
+
error: `A component is a single section, but the canvas holds ${nodes.length}. ` +
|
|
70
|
+
'Delete the extra sections, or save them as components of their own.',
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const node = nodes[0];
|
|
74
|
+
if (component.type === 'section' && node.type !== 'section') {
|
|
75
|
+
return {
|
|
76
|
+
ok: false,
|
|
77
|
+
error: 'This is a section component, but the canvas holds a personalized section. ' +
|
|
78
|
+
'Remove the personalization, or save it as a new component.',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
if (component.type === 'variantContainer' && node.type !== 'variantContainer') {
|
|
82
|
+
return {
|
|
83
|
+
ok: false,
|
|
84
|
+
error: 'This is a personalized section component, but the canvas holds a plain section. ' +
|
|
85
|
+
'Personalize it again, or save it as a new component.',
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// An experiment binding is the PLACEMENT's, never the definition's own to mint
|
|
89
|
+
// (kywi-cms#147 T5 review, I2) — see {@link pinDefinitionBinding}.
|
|
90
|
+
let definition = node;
|
|
91
|
+
if (definition.type === 'variantContainer') {
|
|
92
|
+
const pinned = pinDefinitionBinding(definition, readRegionNode({ type: 'variantContainer', definition: component.definition }));
|
|
93
|
+
if (!pinned.ok)
|
|
94
|
+
return pinned;
|
|
95
|
+
definition = pinned.container;
|
|
96
|
+
}
|
|
97
|
+
const check = validateComponentDefinition({
|
|
98
|
+
type: component.type,
|
|
99
|
+
moduleType: component.moduleType,
|
|
100
|
+
definition,
|
|
101
|
+
});
|
|
102
|
+
if (!check.success)
|
|
103
|
+
return { ok: false, error: check.error };
|
|
104
|
+
return { ok: true, definition };
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* A container definition's `experimentId` / `winnerId` are whatever was STORED —
|
|
108
|
+
* never what the canvas happens to be holding (kywi-cms#147 T5 review, I2).
|
|
109
|
+
*
|
|
110
|
+
* THE BUG THIS CLOSES. Switching a personalized band to "A/B tested" makes the
|
|
111
|
+
* reducer mint an `experimentId` on the spot, because `validateLayoutDocument`
|
|
112
|
+
* refuses an `ab_test` container without one (UPDATE_VARIANT_CONTAINER in
|
|
113
|
+
* editor-state.ts). That is right for a page — the binding identifies THAT page's
|
|
114
|
+
* run. On this canvas the node is the definition, so the minted id would be stored
|
|
115
|
+
* as the component's, and `applyVariantContainerPlacement` hands the definition's
|
|
116
|
+
* binding to every placement that has none of its own — which is every placement
|
|
117
|
+
* of a band that was personalized until a moment ago. One shared experiment across
|
|
118
|
+
* N pages: arms on unrelated pages reporting into a single run, one `winnerId`
|
|
119
|
+
* locking them all. `buildConnectedVariantContainerNode` mints a fresh id per
|
|
120
|
+
* placement and `buildUpdateAll` re-pins the stored one precisely so this cannot
|
|
121
|
+
* happen from the page side; this is the same rule on the definition side.
|
|
122
|
+
*
|
|
123
|
+
* WHY PRESERVE THE STORED BINDING RATHER THAN STRIP IT. Strip-always was the
|
|
124
|
+
* reviewer's suggestion, and it is not available: `validateVariantContainer`
|
|
125
|
+
* REQUIRES an `experimentId` when `mode` is `ab_test`, so a bindingless ab_test
|
|
126
|
+
* definition is one neither this canvas nor `PUT /components/:id` would accept —
|
|
127
|
+
* an A/B-tested component would become permanently un-editable here, including for
|
|
128
|
+
* a one-word copy fix. Preserving matches `buildUpdateAll` exactly (unapply strips
|
|
129
|
+
* the placement's, then the stored one is put back), so a definition's binding can
|
|
130
|
+
* only ever be the one it was created with, and two successive saves of an
|
|
131
|
+
* untouched ab_test component still produce identical rows.
|
|
132
|
+
*
|
|
133
|
+
* A container the canvas turned back into a personalized band loses the binding
|
|
134
|
+
* altogether: a band with no experiment has no run to belong to.
|
|
135
|
+
*
|
|
136
|
+
* The conservatism, stated: the mode switch is refused even for a component with no
|
|
137
|
+
* instances, where minting would harm nothing today. Deciding by usage count would
|
|
138
|
+
* mean a destructive save hanging on a best-effort read that races every placement
|
|
139
|
+
* made elsewhere, so the rule is flat — an A/B test is built on a page and saved
|
|
140
|
+
* from there, which is also the only route that gives each placement its own run.
|
|
141
|
+
*/
|
|
142
|
+
function pinDefinitionBinding(container, stored) {
|
|
143
|
+
const { experimentId: _canvasRun, winnerId: _canvasWinner, ...rest } = container;
|
|
144
|
+
if (container.mode !== 'ab_test') {
|
|
145
|
+
if (container.experimentId === undefined && container.winnerId === undefined) {
|
|
146
|
+
return { ok: true, container };
|
|
147
|
+
}
|
|
148
|
+
return { ok: true, container: rest };
|
|
149
|
+
}
|
|
150
|
+
// Was it already an A/B tested band before this canvas opened? If not, this is
|
|
151
|
+
// the mode switch, and the minted id is exactly what must not be stored.
|
|
152
|
+
if (stored?.mode !== 'ab_test') {
|
|
153
|
+
return {
|
|
154
|
+
ok: false,
|
|
155
|
+
error: 'This component cannot be turned into an A/B tested section here. An experiment belongs to ' +
|
|
156
|
+
'one placement — every page that places this component and has no experiment of its own ' +
|
|
157
|
+
'would be pulled into a single shared run. Build the A/B test on a page, then save that ' +
|
|
158
|
+
'section as a component: each placement gets its own experiment.',
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const experimentId = stored.experimentId;
|
|
162
|
+
if (experimentId === undefined) {
|
|
163
|
+
// An `ab_test` row with no binding at all is one no validated door could have
|
|
164
|
+
// written (`validateVariantContainer` refuses it, and `variantContainer`
|
|
165
|
+
// components have never existed without that check). If one turns up anyway,
|
|
166
|
+
// the canvas is the repair surface, so whatever is on it stands and the real
|
|
167
|
+
// validator has the last word rather than this function inventing one.
|
|
168
|
+
return { ok: true, container };
|
|
169
|
+
}
|
|
170
|
+
const winnerId = stored.winnerId;
|
|
171
|
+
if (container.experimentId === experimentId && container.winnerId === winnerId) {
|
|
172
|
+
return { ok: true, container };
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
ok: true,
|
|
176
|
+
container: {
|
|
177
|
+
...rest,
|
|
178
|
+
experimentId,
|
|
179
|
+
...(winnerId !== undefined ? { winnerId } : {}),
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* A module component's definition: exactly the `{ props, style }` pair the
|
|
185
|
+
* renderer reads (`componentDetachSource`). Nothing else is stored, so nothing
|
|
186
|
+
* else is written — a canvas would have to invent a host section and column
|
|
187
|
+
* around it and then silently discard them, which is why module components get a
|
|
188
|
+
* props form instead.
|
|
189
|
+
*/
|
|
190
|
+
export function moduleDefinition(props, style) {
|
|
191
|
+
return { props, style };
|
|
192
|
+
}
|
|
193
|
+
/** The stored `{ props, style }` of a module component, defaulted for editing. */
|
|
194
|
+
export function readModuleDefinition(component) {
|
|
195
|
+
const def = (component.definition ?? {});
|
|
196
|
+
const props = def['props'];
|
|
197
|
+
const style = def['style'];
|
|
198
|
+
return {
|
|
199
|
+
props: typeof props === 'object' && props !== null && !Array.isArray(props)
|
|
200
|
+
? { ...props }
|
|
201
|
+
: {},
|
|
202
|
+
style: typeof style === 'object' && style !== null && !Array.isArray(style)
|
|
203
|
+
? { ...style }
|
|
204
|
+
: {},
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=definition-canvas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition-canvas.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/components/definition-canvas.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-editor-client.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/layouts/layout-editor-client.tsx"],"names":[],"mappings":"AA2BA,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAE5F,UAAU,uBAAuB;IAC/B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,SAAS,CAAA;CACnB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"layout-editor-client.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/layouts/layout-editor-client.tsx"],"names":[],"mappings":"AA2BA,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAE5F,UAAU,uBAAuB;IAC/B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,SAAS,CAAA;CACnB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAAE,uBAAuB,2CAkJrE"}
|
|
@@ -24,7 +24,7 @@ import { createModuleRegistry } from '../../../layout/registry.js';
|
|
|
24
24
|
import { BUILT_IN_MODULE_COMPONENTS } from '../../../layout/modules.js';
|
|
25
25
|
import { createLayout, updateLayout, EMPTY_LAYOUT } from './layouts-data.js';
|
|
26
26
|
export function LayoutEditorClient({ layout }) {
|
|
27
|
-
const { fetch: adminFetch, navigate, runtime, moduleComponents } = useAdminContext();
|
|
27
|
+
const { fetch: adminFetch, navigate, runtime, moduleComponents, user } = useAdminContext();
|
|
28
28
|
const hostModules = runtime.modules;
|
|
29
29
|
const isEdit = layout !== undefined;
|
|
30
30
|
const [name, setName] = useState(layout?.name ?? '');
|
|
@@ -86,6 +86,18 @@ export function LayoutEditorClient({ layout }) {
|
|
|
86
86
|
return false;
|
|
87
87
|
}
|
|
88
88
|
}, [name, category, isEdit, layout, navigate, adminFetch]);
|
|
89
|
-
return (_jsxs("div", { className: "kywi-layout-editor-page", children: [_jsxs("div", { className: "kywi-admin-page-header", children: [_jsxs("div", { children: [_jsx("h1", { children: isEdit ? `Edit layout: ${layout.name}` : 'New layout' }), _jsxs("p", { className: "kywi-text-muted", children: ["Build a reusable layout, then click ", _jsx("strong", { children: "Save" }), " in the editor toolbar to persist it."] })] }), _jsx("button", { type: "button", className: "kywi-btn kywi-btn-secondary", onClick: () => navigate('/admin/layouts'), children: "Back to layouts" })] }), error && _jsx(ErrorState, { message: error }), saving && _jsx("p", { className: "kywi-text-muted", role: "status", children: "Saving\u2026" }), _jsxs("div", { className: "kywi-layout-editor-meta", children: [_jsxs("div", { className: "kywi-field", children: [_jsx("label", { htmlFor: "layout-name", className: "kywi-field-label", children: "Layout name" }), _jsx("input", { id: "layout-name", type: "text", className: "kywi-input", value: name, onChange: e => setName(e.target.value), placeholder: "Landing hero + features" })] }), _jsxs("div", { className: "kywi-field", children: [_jsx("label", { htmlFor: "layout-category", className: "kywi-field-label", children: "Category" }), _jsx("input", { id: "layout-category", type: "text", className: "kywi-input", value: category, onChange: e => setCategory(e.target.value), placeholder: "general" })] })] }), _jsx("div", { className: "kywi-layout-editor-host", children: _jsx(LayoutEditor, { initialLayout: initialLayout, contentId: layout?.id ?? 'new', contentType: "layout", moduleRegistry: moduleRegistry, moduleComponents: layoutModuleComponents, audiences: audiences,
|
|
89
|
+
return (_jsxs("div", { className: "kywi-layout-editor-page", children: [_jsxs("div", { className: "kywi-admin-page-header", children: [_jsxs("div", { children: [_jsx("h1", { children: isEdit ? `Edit layout: ${layout.name}` : 'New layout' }), _jsxs("p", { className: "kywi-text-muted", children: ["Build a reusable layout, then click ", _jsx("strong", { children: "Save" }), " in the editor toolbar to persist it."] })] }), _jsx("button", { type: "button", className: "kywi-btn kywi-btn-secondary", onClick: () => navigate('/admin/layouts'), children: "Back to layouts" })] }), error && _jsx(ErrorState, { message: error }), saving && _jsx("p", { className: "kywi-text-muted", role: "status", children: "Saving\u2026" }), _jsxs("div", { className: "kywi-layout-editor-meta", children: [_jsxs("div", { className: "kywi-field", children: [_jsx("label", { htmlFor: "layout-name", className: "kywi-field-label", children: "Layout name" }), _jsx("input", { id: "layout-name", type: "text", className: "kywi-input", value: name, onChange: e => setName(e.target.value), placeholder: "Landing hero + features" })] }), _jsxs("div", { className: "kywi-field", children: [_jsx("label", { htmlFor: "layout-category", className: "kywi-field-label", children: "Category" }), _jsx("input", { id: "layout-category", type: "text", className: "kywi-input", value: category, onChange: e => setCategory(e.target.value), placeholder: "general" })] })] }), _jsx("div", { className: "kywi-layout-editor-host", children: _jsx(LayoutEditor, { initialLayout: initialLayout, contentId: layout?.id ?? 'new', contentType: "layout", moduleRegistry: moduleRegistry, moduleComponents: layoutModuleComponents, audiences: audiences,
|
|
90
|
+
// A saved layout is a BLUEPRINT, not a page (kywi-cms#147 final review,
|
|
91
|
+
// M2). It is never placed, and `kywi_component_instances` indexes
|
|
92
|
+
// placements in content only (the reasoning is at the decision site in
|
|
93
|
+
// `api/section-template-routes.ts`), so a component minted here — and
|
|
94
|
+
// linked from the blueprint it came out of — would be a link the usage
|
|
95
|
+
// count and the delete confirmation cannot see: "0 instances across 0
|
|
96
|
+
// pages" while a blueprint still renders it. So the component actions are
|
|
97
|
+
// withheld here exactly as they are on the definition canvas, with copy
|
|
98
|
+
// that says why and where they do live. Saving a component out of a
|
|
99
|
+
// blueprint is a coherent feature; it needs the index to reach blueprints
|
|
100
|
+
// first.
|
|
101
|
+
canvasKind: "blueprint", onSave: persist, onCancel: () => navigate('/admin/layouts'), ...(user?.role ? { userRole: user.role } : {}) }) })] }));
|
|
90
102
|
}
|
|
91
103
|
//# sourceMappingURL=layout-editor-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-editor-client.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/layouts/layout-editor-client.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;;;;;;;;;;GAeG;AAEH,OAAc,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAA;AAGvE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,mBAAmB,CAAA;AAO5F,MAAM,UAAU,kBAAkB,CAAC,EAAE,MAAM,EAA2B;IACpE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,eAAe,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"layout-editor-client.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/layouts/layout-editor-client.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;;;;;;;;;;GAeG;AAEH,OAAc,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAA;AAGvE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,mBAAmB,CAAA;AAO5F,MAAM,UAAU,kBAAkB,CAAC,EAAE,MAAM,EAA2B;IACpE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,GAAG,eAAe,EAAE,CAAA;IAC1F,MAAM,WAAW,GAAI,OAA8B,CAAC,OAAO,CAAA;IAC3D,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,CAAA;IAEnC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;IACpD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAA;IACvE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACvD,0EAA0E;IAC1E,4EAA4E;IAC5E,gEAAgE;IAChE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAsC,EAAE,CAAC,CAAA;IACnF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,UAAU,CAAC,mBAAmB,CAAC;aAC5B,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAClB,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAM;YACnB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;YAC/C,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAwC,CAAA;YACtE,IAAI,CAAC,SAAS;gBAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAC7E,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAA+C,CAAC,CAAC,CAAA;QAC/D,OAAO,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAA,CAAC,CAAC,CAAA;IACnC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IAEhB,8EAA8E;IAC9E,sEAAsE;IACtE,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAC5F,MAAM,sBAAsB,GAAG,OAAO,CACpC,GAAG,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,GAAG,0BAA0B,EAAE,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC,0BAA0B,CAAC,EAC9G,CAAC,gBAAgB,CAAC,CACnB,CAAA;IACD,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,MAAM,EAAE,UAAU,IAAI,YAAY,EACxC,CAAC,MAAM,CAAC,CACT,CAAA;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,GAAmB,EAA2B,EAAE;QACjF,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,QAAQ,CAAC,0CAA0C,CAAC,CAAA;YACpD,mEAAmE;YACnE,wEAAwE;YACxE,uEAAuE;YACvE,wEAAwE;YACxE,uEAAuE;YACvE,mEAAmE;YACnE,sBAAsB;YACtB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,CAAA;QACf,IAAI,CAAC;YACH,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAA;YAC7F,CAAC;iBAAM,CAAC;gBACN,MAAM,YAAY,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAA;YAClF,CAAC;YACD,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QAC5B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAA;YACxD,SAAS,CAAC,KAAK,CAAC,CAAA;YAChB,oEAAoE;YACpE,+DAA+D;YAC/D,yBAAyB;YACzB,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAA;IAE1D,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAK,SAAS,EAAC,wBAAwB,aACrC,0BACE,uBAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,YAAY,GAAM,EAChE,aAAG,SAAS,EAAC,iBAAiB,qDACQ,oCAAqB,6CACvD,IACA,EACN,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,6BAA6B,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,gCAE9F,IACL,EAEL,KAAK,IAAI,KAAC,UAAU,IAAC,OAAO,EAAE,KAAK,GAAI,EACvC,MAAM,IAAI,YAAG,SAAS,EAAC,iBAAiB,EAAC,IAAI,EAAC,QAAQ,6BAAY,EAEnE,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAK,SAAS,EAAC,YAAY,aACzB,gBAAO,OAAO,EAAC,aAAa,EAAC,SAAS,EAAC,kBAAkB,4BAAoB,EAC7E,gBACE,EAAE,EAAC,aAAa,EAChB,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,YAAY,EACtB,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACtC,WAAW,EAAC,yBAAyB,GACrC,IACE,EACN,eAAK,SAAS,EAAC,YAAY,aACzB,gBAAO,OAAO,EAAC,iBAAiB,EAAC,SAAS,EAAC,kBAAkB,yBAAiB,EAC9E,gBACE,EAAE,EAAC,iBAAiB,EACpB,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,YAAY,EACtB,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC1C,WAAW,EAAC,SAAS,GACrB,IACE,IACF,EAEN,cAAK,SAAS,EAAC,yBAAyB,YACtC,KAAC,YAAY,IACX,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,KAAK,EAC9B,WAAW,EAAC,QAAQ,EACpB,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,sBAAsB,EACxC,SAAS,EAAE,SAAS;oBACpB,wEAAwE;oBACxE,kEAAkE;oBAClE,uEAAuE;oBACvE,sEAAsE;oBACtE,uEAAuE;oBACvE,sEAAsE;oBACtE,0EAA0E;oBAC1E,wEAAwE;oBACxE,oEAAoE;oBACpE,0EAA0E;oBAC1E,SAAS;oBACT,UAAU,EAAC,WAAW,EACtB,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAStC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAC/C,GACE,IACF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
* "Layouts" are saved, reusable page layouts persisted in kywi_section_templates.
|
|
11
11
|
* Their `definition` column holds a full LayoutDocument (regions → sections →
|
|
12
12
|
* columns → modules) — the exact shape the shipped LayoutEditor produces — so a
|
|
13
|
-
* layout round-trips with no lossy transform. Saved
|
|
14
|
-
*
|
|
15
|
-
*
|
|
13
|
+
* layout round-trips with no lossy transform. Saved COMPONENTS (kywi_components)
|
|
14
|
+
* used to be listed from here too; they have their own surface as of
|
|
15
|
+
* kywi-cms#147 (see surfaces/components/).
|
|
16
16
|
*/
|
|
17
17
|
import type { FetchLike } from '../../content-editor-api.js';
|
|
18
18
|
import type { LayoutDocument } from '../../../layout/types.js';
|
|
@@ -25,15 +25,6 @@ export interface LayoutRow {
|
|
|
25
25
|
createdAt: string;
|
|
26
26
|
updatedAt: string;
|
|
27
27
|
}
|
|
28
|
-
export interface ComponentRow {
|
|
29
|
-
id: string;
|
|
30
|
-
name: string;
|
|
31
|
-
description: string | null;
|
|
32
|
-
type: string;
|
|
33
|
-
moduleType: string | null;
|
|
34
|
-
createdAt: string;
|
|
35
|
-
updatedAt: string;
|
|
36
|
-
}
|
|
37
28
|
export interface LayoutWritePayload {
|
|
38
29
|
name: string;
|
|
39
30
|
category?: string;
|
|
@@ -46,8 +37,6 @@ export declare function loadLayout(fetchFn: FetchLike, id: string): Promise<Layo
|
|
|
46
37
|
export declare function createLayout(fetchFn: FetchLike, payload: LayoutWritePayload): Promise<LayoutRow>;
|
|
47
38
|
export declare function updateLayout(fetchFn: FetchLike, id: string, payload: Partial<LayoutWritePayload>): Promise<LayoutRow>;
|
|
48
39
|
export declare function deleteLayout(fetchFn: FetchLike, id: string): Promise<void>;
|
|
49
|
-
export declare function loadComponents(fetchFn: FetchLike): Promise<ComponentRow[]>;
|
|
50
|
-
export declare function deleteComponent(fetchFn: FetchLike, id: string): Promise<void>;
|
|
51
40
|
/** Count sections across all regions of a layout document. */
|
|
52
41
|
export declare function sectionCount(doc: LayoutDocument | null | undefined): number;
|
|
53
42
|
//# sourceMappingURL=layouts-data.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layouts-data.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/layouts/layouts-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAE9D,YAAY,EAAE,cAAc,EAAE,CAAA;AAE9B,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,cAAc,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"layouts-data.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/layouts/layouts-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAE9D,YAAY,EAAE,cAAc,EAAE,CAAA;AAE9B,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,cAAc,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,cAAc,CAAA;CAC3B;AAED,uEAAuE;AACvE,eAAO,MAAM,YAAY,EAAE,cAA0C,CAAA;AA+BrE,wBAAsB,WAAW,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAE1E;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAEnF;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAItG;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,SAAS,EAClB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACnC,OAAO,CAAC,SAAS,CAAC,CAIpB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhF;AASD,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAG3E"}
|
|
@@ -44,13 +44,10 @@ export async function updateLayout(fetchFn, id, payload) {
|
|
|
44
44
|
export async function deleteLayout(fetchFn, id) {
|
|
45
45
|
await expectOk(await fetchFn(`/api/v1/section-templates/${id}`, { method: 'DELETE' }));
|
|
46
46
|
}
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
export async function deleteComponent(fetchFn, id) {
|
|
52
|
-
await expectOk(await fetchFn(`/api/v1/components/${id}`, { method: 'DELETE' }));
|
|
53
|
-
}
|
|
47
|
+
// Saved components used to live here too (a read-only list + delete). They moved
|
|
48
|
+
// to their own surface in kywi-cms#147 — see surfaces/components/components-data.ts
|
|
49
|
+
// — because a linked component's library needs usage counts, rename, and the
|
|
50
|
+
// detach-all-then-delete flow, none of which this module's shape could carry.
|
|
54
51
|
// ─── Derived helpers ─────────────────────────────────────────────────────────
|
|
55
52
|
/** Count sections across all regions of a layout document. */
|
|
56
53
|
export function sectionCount(doc) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layouts-data.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/layouts/layouts-data.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"layouts-data.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/layouts/layouts-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layouts-list.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/layouts/layouts-list.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"layouts-list.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/layouts/layouts-list.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAUrD,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,MAAM,EAAE,YAAY,2CAmI9D"}
|
|
@@ -1,31 +1,36 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
/**
|
|
4
|
-
* `layouts.list` surface — the saved layouts
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `useAdminContext().navigate`; the `adminFetch`-
|
|
8
|
-
* context `fetch`; `LoadingState`/`ErrorState` are
|
|
9
|
-
* `AdminShellWrapper` is gone — chrome is rendered
|
|
4
|
+
* `layouts.list` surface — the saved layouts list, ported from
|
|
5
|
+
* `apps/reference/app/admin/layouts/page.tsx` (0.2.0 T12). Markup / classes /
|
|
6
|
+
* copy unchanged apart from the change noted below; wiring substitutions (plan
|
|
7
|
+
* §1.3): `useRouter().push` → `useAdminContext().navigate`; the `adminFetch`-
|
|
8
|
+
* backed data helpers take the context `fetch`; `LoadingState`/`ErrorState` are
|
|
9
|
+
* the canonical core primitives. `AdminShellWrapper` is gone — chrome is rendered
|
|
10
|
+
* once by `KywiAdminApp` (T14).
|
|
11
|
+
*
|
|
12
|
+
* kywi-cms#147: the read-only "Saved components" sub-panel that used to sit below
|
|
13
|
+
* the layouts table is GONE — components now have their own surface
|
|
14
|
+
* (`/admin/components`), because a linked component needs usage counts, rename and
|
|
15
|
+
* a detach-all-then-delete confirmation, none of which fit in a sub-panel. A
|
|
16
|
+
* pointer stays here for one release so the panel's readers are not left hunting.
|
|
10
17
|
*/
|
|
11
18
|
import { useCallback, useEffect, useState } from 'react';
|
|
12
19
|
import { useAdminContext } from '../../context.js';
|
|
13
20
|
import { LoadingState, ErrorState } from '../../primitives.js';
|
|
14
|
-
import { loadLayouts,
|
|
21
|
+
import { loadLayouts, deleteLayout, sectionCount, } from './layouts-data.js';
|
|
15
22
|
export default function LayoutsListSurface(_props) {
|
|
16
23
|
const { fetch: adminFetch, navigate } = useAdminContext();
|
|
17
24
|
const [layouts, setLayouts] = useState([]);
|
|
18
|
-
const [components, setComponents] = useState([]);
|
|
19
25
|
const [loading, setLoading] = useState(true);
|
|
20
26
|
const [error, setError] = useState(null);
|
|
21
27
|
const load = useCallback(async () => {
|
|
22
28
|
setLoading(true);
|
|
23
29
|
setError(null);
|
|
24
30
|
try {
|
|
25
|
-
const
|
|
31
|
+
const l = await loadLayouts(adminFetch);
|
|
26
32
|
l.sort((a, b) => (b.updatedAt ?? '').localeCompare(a.updatedAt ?? ''));
|
|
27
33
|
setLayouts(l);
|
|
28
|
-
setComponents(c);
|
|
29
34
|
}
|
|
30
35
|
catch (e) {
|
|
31
36
|
setError(e instanceof Error ? e.message : 'Failed to load layouts');
|
|
@@ -46,17 +51,6 @@ export default function LayoutsListSurface(_props) {
|
|
|
46
51
|
window.alert(e instanceof Error ? e.message : 'Delete failed');
|
|
47
52
|
}
|
|
48
53
|
}, [load, adminFetch]);
|
|
49
|
-
|
|
50
|
-
if (!window.confirm(`Delete component "${component.name}"? This cannot be undone.`))
|
|
51
|
-
return;
|
|
52
|
-
try {
|
|
53
|
-
await deleteComponent(adminFetch, component.id);
|
|
54
|
-
await load();
|
|
55
|
-
}
|
|
56
|
-
catch (e) {
|
|
57
|
-
window.alert(e instanceof Error ? e.message : 'Delete failed');
|
|
58
|
-
}
|
|
59
|
-
}, [load, adminFetch]);
|
|
60
|
-
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "kywi-admin-page-header", children: [_jsxs("div", { children: [_jsx("h1", { children: "Layouts" }), _jsx("p", { className: "kywi-text-muted", children: "Reusable page layouts and saved components for the layout editor." })] }), _jsx("div", { className: "kywi-admin-button-row", children: _jsx("button", { type: "button", className: "kywi-btn kywi-btn-primary", onClick: () => navigate('/admin/layouts/new'), children: "New Layout" }) })] }), loading ? (_jsx(LoadingState, { label: "Loading layouts\u2026" })) : error ? (_jsx(ErrorState, { message: error, onRetry: load })) : (_jsxs(_Fragment, { children: [_jsxs("section", { className: "kywi-admin-form-section", children: [_jsx("h2", { children: "Saved layouts" }), layouts.length === 0 ? (_jsxs("div", { className: "kywi-empty-state", children: [_jsx("p", { children: "No layouts yet." }), _jsx("button", { type: "button", className: "kywi-btn kywi-btn-primary", onClick: () => navigate('/admin/layouts/new'), children: "Create your first layout" })] })) : (_jsx("div", { className: "kywi-table-scroll", children: _jsxs("table", { className: "kywi-table kywi-layouts-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Name" }), _jsx("th", { children: "Category" }), _jsx("th", { children: "Sections" }), _jsx("th", { children: "Updated" }), _jsx("th", { className: "kywi-col-actions", children: "Actions" })] }) }), _jsx("tbody", { children: layouts.map(layout => (_jsxs("tr", { children: [_jsx("td", { children: _jsx("button", { type: "button", className: "kywi-link-button", onClick: () => navigate(`/admin/layouts/${layout.id}`), children: layout.name }) }), _jsx("td", { children: layout.category }), _jsx("td", { children: sectionCount(layout.definition) }), _jsx("td", { children: layout.updatedAt ? new Date(layout.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/layouts/${layout.id}`), children: "Edit" }), _jsx("button", { type: "button", className: "kywi-btn kywi-btn-danger kywi-btn-sm", onClick: () => handleDeleteLayout(layout), children: "Delete" })] })] }, layout.id))) })] }) }))] }), _jsxs("section", { className: "kywi-admin-form-section", children: [_jsx("h2", { children: "Saved components" }), _jsx("p", { className: "kywi-text-muted", children: "Modules and sections saved from the content editor\u2019s layout tab. Reuse them there; remove unused ones here." }), components.length === 0 ? (_jsx("div", { className: "kywi-empty-state", children: _jsx("p", { children: "No saved components yet." }) })) : (_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", { className: "kywi-col-actions", children: "Actions" })] }) }), _jsx("tbody", { children: components.map(component => (_jsxs("tr", { children: [_jsx("td", { children: component.name }), _jsx("td", { children: component.type }), _jsx("td", { children: component.moduleType ?? '—' }), _jsx("td", { className: "kywi-col-actions", children: _jsx("button", { type: "button", className: "kywi-btn kywi-btn-danger kywi-btn-sm", onClick: () => handleDeleteComponent(component), children: "Delete" }) })] }, component.id))) })] }) }))] })] }))] }));
|
|
54
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "kywi-admin-page-header", children: [_jsxs("div", { children: [_jsx("h1", { children: "Layouts" }), _jsx("p", { className: "kywi-text-muted", children: "Reusable page layouts for the layout editor. A layout is a blueprint: placing one COPIES it, so editing a layout never changes a page that already used it." })] }), _jsx("div", { className: "kywi-admin-button-row", children: _jsx("button", { type: "button", className: "kywi-btn kywi-btn-primary", onClick: () => navigate('/admin/layouts/new'), children: "New Layout" }) })] }), _jsx("div", { className: "kywi-admin-callout kywi-admin-callout-info", children: _jsxs("p", { children: [_jsx("strong", { children: "Components" }), " moved to their own page \u2014 with instance counts, renaming, and a delete that detaches every instance first.", ' ', _jsx("button", { type: "button", className: "kywi-link-button", onClick: () => navigate('/admin/components'), children: "Go to Components" })] }) }), loading ? (_jsx(LoadingState, { label: "Loading layouts\u2026" })) : error ? (_jsx(ErrorState, { message: error, onRetry: load })) : (_jsx(_Fragment, { children: _jsxs("section", { className: "kywi-admin-form-section", children: [_jsx("h2", { children: "Saved layouts" }), layouts.length === 0 ? (_jsxs("div", { className: "kywi-empty-state", children: [_jsx("p", { children: "No layouts yet." }), _jsx("button", { type: "button", className: "kywi-btn kywi-btn-primary", onClick: () => navigate('/admin/layouts/new'), children: "Create your first layout" })] })) : (_jsx("div", { className: "kywi-table-scroll", children: _jsxs("table", { className: "kywi-table kywi-layouts-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Name" }), _jsx("th", { children: "Category" }), _jsx("th", { children: "Sections" }), _jsx("th", { children: "Updated" }), _jsx("th", { className: "kywi-col-actions", children: "Actions" })] }) }), _jsx("tbody", { children: layouts.map(layout => (_jsxs("tr", { children: [_jsx("td", { children: _jsx("button", { type: "button", className: "kywi-link-button", onClick: () => navigate(`/admin/layouts/${layout.id}`), children: layout.name }) }), _jsx("td", { children: layout.category }), _jsx("td", { children: sectionCount(layout.definition) }), _jsx("td", { children: layout.updatedAt ? new Date(layout.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/layouts/${layout.id}`), children: "Edit" }), _jsx("button", { type: "button", className: "kywi-btn kywi-btn-danger kywi-btn-sm", onClick: () => handleDeleteLayout(layout), children: "Delete" })] })] }, layout.id))) })] }) }))] }) }))] }));
|
|
61
55
|
}
|
|
62
56
|
//# sourceMappingURL=layouts-list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layouts-list.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/layouts/layouts-list.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ
|
|
1
|
+
{"version":3,"file":"layouts-list.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/layouts/layouts-list.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-features.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/settings/admin-features.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,YAAY,EAAgC,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"admin-features.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/settings/admin-features.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,YAAY,EAAgC,MAAM,mBAAmB,CAAA;AAsCnF,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,MAAM,EAAE,YAAY,2CA2IhE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-features.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/settings/admin-features.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"admin-features.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/settings/admin-features.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bulk-routes.d.ts","sourceRoot":"","sources":["../../src/api/bulk-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAA;AACjG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAM7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AA4CxD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,UAAU,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IAC9C,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAA;IACpD,YAAY,EAAE,YAAY,CAAA;IAC1B,OAAO,EAAE,WAAW,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC;
|
|
1
|
+
{"version":3,"file":"bulk-routes.d.ts","sourceRoot":"","sources":["../../src/api/bulk-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAA;AACjG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAM7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AA4CxD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,UAAU,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IAC9C,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAA;IACpD,YAAY,EAAE,YAAY,CAAA;IAC1B,OAAO,EAAE,WAAW,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC;AAkDD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GAAG,IAAI,CA6N9E"}
|
package/dist/api/bulk-routes.js
CHANGED
|
@@ -53,6 +53,25 @@ const bulkUpdateSchema = z.object({
|
|
|
53
53
|
.min(1, 'At least one item is required')
|
|
54
54
|
.max(MAX_BULK_ITEMS, `Maximum ${MAX_BULK_ITEMS} items per request`),
|
|
55
55
|
});
|
|
56
|
+
/**
|
|
57
|
+
* Refuse a bulk payload that carries a `layout` (kywi-cms#147).
|
|
58
|
+
*
|
|
59
|
+
* The bulk items are typed `z.record(z.unknown())` — anything at all — and go
|
|
60
|
+
* straight to createContent/updateContent, so a `layout` here would be a layout
|
|
61
|
+
* write with no validation and no admin-only-module gate: the very door that was
|
|
62
|
+
* closed on the content POST/PUT/PATCH. Rather than fit a per-item differential
|
|
63
|
+
* gate (each item needs its own stored document, up to 100 of them per request)
|
|
64
|
+
* onto endpoints built for bulk field edits, the field is simply not writable
|
|
65
|
+
* here. Layouts are written one page at a time, through
|
|
66
|
+
* `PUT /content/:type/:id/layout` or the content PUT/PATCH, which do gate.
|
|
67
|
+
*/
|
|
68
|
+
function rejectBulkLayout(items) {
|
|
69
|
+
const index = items.findIndex(item => 'layout' in item);
|
|
70
|
+
if (index === -1)
|
|
71
|
+
return null;
|
|
72
|
+
return jsonError('LAYOUT_NOT_BULK_WRITABLE', `Item ${index} carries a 'layout'. Layout documents are not writable through ` +
|
|
73
|
+
`the bulk endpoints; write them per page via PUT /content/:type/:id/layout.`, 400);
|
|
74
|
+
}
|
|
56
75
|
export function registerBulkRoutes(router, ctx) {
|
|
57
76
|
const { config, db, authSecret, contentTypeMap, customTableMap } = ctx;
|
|
58
77
|
/**
|
|
@@ -99,6 +118,9 @@ export function registerBulkRoutes(router, ctx) {
|
|
|
99
118
|
if (!parsed.success) {
|
|
100
119
|
return validationError(parsed.error.errors.map(e => ({ path: e.path.join('.'), message: e.message })));
|
|
101
120
|
}
|
|
121
|
+
const createLayoutDenied = rejectBulkLayout(parsed.data.items);
|
|
122
|
+
if (createLayoutDenied)
|
|
123
|
+
return createLayoutDenied;
|
|
102
124
|
const siteId = resolveSiteId(req, config, ctx.siteIdMap);
|
|
103
125
|
const siteDenied = assertSiteAccess(auth.user, siteId);
|
|
104
126
|
if (siteDenied)
|
|
@@ -128,6 +150,9 @@ export function registerBulkRoutes(router, ctx) {
|
|
|
128
150
|
if (!parsed.success) {
|
|
129
151
|
return validationError(parsed.error.errors.map(e => ({ path: e.path.join('.'), message: e.message })));
|
|
130
152
|
}
|
|
153
|
+
const updateLayoutDenied = rejectBulkLayout(parsed.data.items);
|
|
154
|
+
if (updateLayoutDenied)
|
|
155
|
+
return updateLayoutDenied;
|
|
131
156
|
const updateIds = parsed.data.items.map((it) => it.id);
|
|
132
157
|
const updateDenied = await assertBulkDocAccess(db, updateIds, auth.user, 'write');
|
|
133
158
|
if (updateDenied)
|