@pantheon-systems/puck-css 0.4.4 → 0.6.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/dist/auth/P1AuthProvider.d.ts +1 -0
- package/dist/auth/P1AuthProvider.d.ts.map +1 -1
- package/dist/auth/P1AuthProvider.js +9 -0
- package/dist/auth/P1AuthProvider.js.map +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +1 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/core/types.d.ts +31 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/data/dal/init.d.ts +7 -0
- package/dist/data/dal/init.d.ts.map +1 -1
- package/dist/data/dal/init.js +32 -0
- package/dist/data/dal/init.js.map +1 -1
- package/dist/data/dal/p1-store.d.ts +2 -0
- package/dist/data/dal/p1-store.d.ts.map +1 -1
- package/dist/data/dal/p1-store.js +14 -10
- package/dist/data/dal/p1-store.js.map +1 -1
- package/dist/data/fields.d.ts +12 -0
- package/dist/data/fields.d.ts.map +1 -0
- package/dist/data/fields.js +40 -0
- package/dist/data/fields.js.map +1 -0
- package/dist/data/page-store.d.ts +4 -3
- package/dist/data/page-store.d.ts.map +1 -1
- package/dist/data/page-store.js +6 -6
- package/dist/data/page-store.js.map +1 -1
- package/dist/data/paths.js +1 -1
- package/dist/data/paths.js.map +1 -1
- package/dist/editor/P1PuckProvider.d.ts.map +1 -1
- package/dist/editor/P1PuckProvider.js +102 -17
- package/dist/editor/P1PuckProvider.js.map +1 -1
- package/dist/editor/plugin/P1Plugin.d.ts +14 -2
- package/dist/editor/plugin/P1Plugin.d.ts.map +1 -1
- package/dist/editor/plugin/P1Plugin.js +31 -10
- package/dist/editor/plugin/P1Plugin.js.map +1 -1
- package/dist/editor/plugin/createP1Overrides.d.ts +7 -0
- package/dist/editor/plugin/createP1Overrides.d.ts.map +1 -1
- package/dist/editor/plugin/createP1Overrides.js +72 -2
- package/dist/editor/plugin/createP1Overrides.js.map +1 -1
- package/dist/editor/useDocuments.d.ts +1 -0
- package/dist/editor/useDocuments.d.ts.map +1 -1
- package/dist/editor/useDocuments.js +15 -2
- package/dist/editor/useDocuments.js.map +1 -1
- package/dist/editor/useP1Editor.d.ts.map +1 -1
- package/dist/editor/useP1Editor.js +41 -23
- package/dist/editor/useP1Editor.js.map +1 -1
- package/dist/editor/useP1Plugin.d.ts +5 -1
- package/dist/editor/useP1Plugin.d.ts.map +1 -1
- package/dist/editor/useP1Plugin.js +3 -0
- package/dist/editor/useP1Plugin.js.map +1 -1
- package/dist/features/content-type-templates/editor/useTemplateScaffold.d.ts +3 -7
- package/dist/features/content-type-templates/editor/useTemplateScaffold.d.ts.map +1 -1
- package/dist/features/content-type-templates/editor/useTemplateScaffold.js +6 -14
- package/dist/features/content-type-templates/editor/useTemplateScaffold.js.map +1 -1
- package/dist/features/content-type-templates/hooks/useTemplateList.d.ts +3 -3
- package/dist/features/content-type-templates/hooks/useTemplateList.d.ts.map +1 -1
- package/dist/features/content-type-templates/hooks/useTemplateList.js +5 -3
- package/dist/features/content-type-templates/hooks/useTemplateList.js.map +1 -1
- package/dist/features/content-type-templates/index.d.ts +1 -1
- package/dist/features/content-type-templates/index.d.ts.map +1 -1
- package/dist/features/content-type-templates/index.js.map +1 -1
- package/dist/features/content-type-templates/permissions/createPuckPermissions.d.ts +8 -3
- package/dist/features/content-type-templates/permissions/createPuckPermissions.d.ts.map +1 -1
- package/dist/features/content-type-templates/permissions/createPuckPermissions.js +18 -27
- package/dist/features/content-type-templates/permissions/createPuckPermissions.js.map +1 -1
- package/dist/features/content-type-templates/stores/template-store.d.ts +4 -4
- package/dist/features/content-type-templates/stores/template-store.d.ts.map +1 -1
- package/dist/features/content-type-templates/stores/template-store.js +33 -10
- package/dist/features/content-type-templates/stores/template-store.js.map +1 -1
- package/dist/features/content-type-templates/types.d.ts +1 -88
- package/dist/features/content-type-templates/types.d.ts.map +1 -1
- package/dist/features/content-type-templates/ui/ActionBarPinButton.d.ts.map +1 -1
- package/dist/features/content-type-templates/ui/ActionBarPinButton.js +16 -34
- package/dist/features/content-type-templates/ui/ActionBarPinButton.js.map +1 -1
- package/dist/features/content-type-templates/ui/TemplateDetailsPanel.d.ts +24 -0
- package/dist/features/content-type-templates/ui/TemplateDetailsPanel.d.ts.map +1 -0
- package/dist/features/content-type-templates/ui/TemplateDetailsPanel.js +124 -0
- package/dist/features/content-type-templates/ui/TemplateDetailsPanel.js.map +1 -0
- package/dist/features/content-type-templates/ui/TemplateSelector.d.ts +2 -2
- package/dist/features/content-type-templates/ui/TemplateSelector.d.ts.map +1 -1
- package/dist/features/content-type-templates/validation/structural-validation.d.ts.map +1 -1
- package/dist/features/content-type-templates/validation/structural-validation.js +7 -4
- package/dist/features/content-type-templates/validation/structural-validation.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/p1/editor/connect/connect-field-modal.d.ts.map +1 -1
- package/dist/p1/editor/connect/connect-field-modal.js +1 -1
- package/dist/p1/editor/connect/connect-field-modal.js.map +1 -1
- package/dist/p1/editor/remote-datasources/remote-datasource-explorer-plugin.d.ts.map +1 -1
- package/dist/p1/editor/remote-datasources/remote-datasource-explorer-plugin.js +91 -29
- package/dist/p1/editor/remote-datasources/remote-datasource-explorer-plugin.js.map +1 -1
- package/dist/p1/pages/index.d.ts +0 -10
- package/dist/p1/pages/index.d.ts.map +1 -1
- package/dist/p1/pages/index.js +0 -10
- package/dist/p1/pages/index.js.map +1 -1
- package/dist/pds/components/CreatePageModal.d.ts +109 -0
- package/dist/pds/components/CreatePageModal.d.ts.map +1 -0
- package/dist/pds/components/CreatePageModal.js +527 -0
- package/dist/pds/components/CreatePageModal.js.map +1 -0
- package/dist/pds/components/CreatePageModal.module.css +745 -0
- package/dist/pds/components/DocStateBadge.js +1 -1
- package/dist/pds/components/DocStateBadge.js.map +1 -1
- package/dist/pds/components/P1EditorHeader.d.ts +22 -5
- package/dist/pds/components/P1EditorHeader.d.ts.map +1 -1
- package/dist/pds/components/P1EditorHeader.js +103 -9
- package/dist/pds/components/P1EditorHeader.js.map +1 -1
- package/dist/pds/components/P1EditorHeader.module.css +21 -1
- package/dist/pds/components/P1EditorSubheader.d.ts +7 -1
- package/dist/pds/components/P1EditorSubheader.d.ts.map +1 -1
- package/dist/pds/components/P1EditorSubheader.js +2 -2
- package/dist/pds/components/P1EditorSubheader.js.map +1 -1
- package/dist/pds/components/PageNavigator.d.ts +15 -4
- package/dist/pds/components/PageNavigator.d.ts.map +1 -1
- package/dist/pds/components/PageNavigator.js +23 -5
- package/dist/pds/components/PageNavigator.js.map +1 -1
- package/dist/pds/components/PageNavigator.module.css +29 -0
- package/dist/pds/components/WizardQuestion.d.ts +29 -0
- package/dist/pds/components/WizardQuestion.d.ts.map +1 -0
- package/dist/pds/components/WizardQuestion.js +57 -0
- package/dist/pds/components/WizardQuestion.js.map +1 -0
- package/dist/pds/utils/deriveLiveDocState.d.ts +18 -0
- package/dist/pds/utils/deriveLiveDocState.d.ts.map +1 -0
- package/dist/pds/utils/deriveLiveDocState.js +20 -0
- package/dist/pds/utils/deriveLiveDocState.js.map +1 -0
- package/dist/server.d.ts +1 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -3
- package/dist/server.js.map +1 -1
- package/package.json +13 -3
- package/src/pds/theme/PuckEditorTheme.css +3 -1
- package/src/pds/theme/PuckEditorTheme.test.ts +4 -3
- package/dist/features/content-type-templates/editor/useTemplateEditor.d.ts +0 -20
- package/dist/features/content-type-templates/editor/useTemplateEditor.d.ts.map +0 -1
- package/dist/features/content-type-templates/editor/useTemplateEditor.js +0 -62
- package/dist/features/content-type-templates/editor/useTemplateEditor.js.map +0 -1
- package/dist/features/content-type-templates/ui/TemplateManagerOverlay.d.ts +0 -18
- package/dist/features/content-type-templates/ui/TemplateManagerOverlay.d.ts.map +0 -1
- package/dist/features/content-type-templates/ui/TemplateManagerOverlay.js +0 -167
- package/dist/features/content-type-templates/ui/TemplateManagerOverlay.js.map +0 -1
- package/dist/features/content-type-templates/ui/TemplatePinPanel.d.ts +0 -18
- package/dist/features/content-type-templates/ui/TemplatePinPanel.d.ts.map +0 -1
- package/dist/features/content-type-templates/ui/TemplatePinPanel.js +0 -11
- package/dist/features/content-type-templates/ui/TemplatePinPanel.js.map +0 -1
- package/dist/features/content-type-templates/ui/dataToTemplate.d.ts +0 -25
- package/dist/features/content-type-templates/ui/dataToTemplate.d.ts.map +0 -1
- package/dist/features/content-type-templates/ui/dataToTemplate.js +0 -37
- package/dist/features/content-type-templates/ui/dataToTemplate.js.map +0 -1
- package/dist/p1/editor/json-tree.d.ts +0 -6
- package/dist/p1/editor/json-tree.d.ts.map +0 -1
- package/dist/p1/editor/json-tree.js +0 -64
- package/dist/p1/editor/json-tree.js.map +0 -1
- package/dist/p1/pages/add-override-for-template.d.ts +0 -4
- package/dist/p1/pages/add-override-for-template.d.ts.map +0 -1
- package/dist/p1/pages/add-override-for-template.js +0 -47
- package/dist/p1/pages/add-override-for-template.js.map +0 -1
- package/dist/p1/pages/conflict-resolution-panel.d.ts +0 -17
- package/dist/p1/pages/conflict-resolution-panel.d.ts.map +0 -1
- package/dist/p1/pages/conflict-resolution-panel.js +0 -74
- package/dist/p1/pages/conflict-resolution-panel.js.map +0 -1
- package/dist/p1/pages/content-type-template-list.d.ts +0 -7
- package/dist/p1/pages/content-type-template-list.d.ts.map +0 -1
- package/dist/p1/pages/content-type-template-list.js +0 -108
- package/dist/p1/pages/content-type-template-list.js.map +0 -1
- package/dist/p1/pages/create-content-type-form.d.ts +0 -7
- package/dist/p1/pages/create-content-type-form.d.ts.map +0 -1
- package/dist/p1/pages/create-content-type-form.js +0 -102
- package/dist/p1/pages/create-content-type-form.js.map +0 -1
- package/dist/p1/pages/create-page-form.d.ts +0 -9
- package/dist/p1/pages/create-page-form.d.ts.map +0 -1
- package/dist/p1/pages/create-page-form.js +0 -87
- package/dist/p1/pages/create-page-form.js.map +0 -1
- package/dist/p1/pages/create-template-form.d.ts +0 -7
- package/dist/p1/pages/create-template-form.d.ts.map +0 -1
- package/dist/p1/pages/create-template-form.js +0 -82
- package/dist/p1/pages/create-template-form.js.map +0 -1
- package/dist/p1/pages/delete-row-button.d.ts +0 -7
- package/dist/p1/pages/delete-row-button.d.ts.map +0 -1
- package/dist/p1/pages/delete-row-button.js +0 -23
- package/dist/p1/pages/delete-row-button.js.map +0 -1
- package/dist/p1/pages/hooks.d.ts +0 -10
- package/dist/p1/pages/hooks.d.ts.map +0 -1
- package/dist/p1/pages/hooks.js +0 -66
- package/dist/p1/pages/hooks.js.map +0 -1
- package/dist/p1/pages/migration-conflict-queue.d.ts +0 -8
- package/dist/p1/pages/migration-conflict-queue.d.ts.map +0 -1
- package/dist/p1/pages/migration-conflict-queue.js +0 -62
- package/dist/p1/pages/migration-conflict-queue.js.map +0 -1
- package/dist/p1/pages/migration-preview-panel.d.ts +0 -12
- package/dist/p1/pages/migration-preview-panel.d.ts.map +0 -1
- package/dist/p1/pages/migration-preview-panel.js +0 -157
- package/dist/p1/pages/migration-preview-panel.js.map +0 -1
- package/dist/p1/pages/migration-status-panel.d.ts +0 -7
- package/dist/p1/pages/migration-status-panel.d.ts.map +0 -1
- package/dist/p1/pages/migration-status-panel.js +0 -198
- package/dist/p1/pages/migration-status-panel.js.map +0 -1
- package/dist/p1/pages/structure-page.d.ts +0 -2
- package/dist/p1/pages/structure-page.d.ts.map +0 -1
- package/dist/p1/pages/structure-page.js +0 -103
- package/dist/p1/pages/structure-page.js.map +0 -1
- package/dist/p1/pages/structure-tabs.d.ts +0 -11
- package/dist/p1/pages/structure-tabs.d.ts.map +0 -1
- package/dist/p1/pages/structure-tabs.js +0 -45
- package/dist/p1/pages/structure-tabs.js.map +0 -1
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* CreatePageModal
|
|
4
|
+
*
|
|
5
|
+
* The "Create a new page" modal, opened from the PageNavigator's "+ New page".
|
|
6
|
+
* Single-screen design: pick a starting point, name the page (which derives the
|
|
7
|
+
* URL slug), optionally open an Advanced panel, then "Create page".
|
|
8
|
+
*
|
|
9
|
+
* NOTE: This uses a lightweight custom modal shell (backdrop + panel) rather
|
|
10
|
+
* than the PDS `Modal`. The PDS v2 `Modal` (through alpha.16) calls
|
|
11
|
+
* `useOverlayContext()` on every render, which throws unless an
|
|
12
|
+
* `OverlayContextProvider` is an ancestor — but that provider is not exported
|
|
13
|
+
* from the package, making `Modal` unusable here. Interactive fields use native
|
|
14
|
+
* inputs (the PDS TextInput/Textarea are not usable in this context either) and
|
|
15
|
+
* are styled with PDS design tokens.
|
|
16
|
+
*
|
|
17
|
+
* Phase 1 scope:
|
|
18
|
+
* - Starting points: "Blank page" is active; "Content type template" and
|
|
19
|
+
* "Generate with AI" are disabled; "New page template" is admin-only and
|
|
20
|
+
* disabled. Later phases enable the rest.
|
|
21
|
+
* - Page title auto-derives the slug until the slug is edited manually.
|
|
22
|
+
* - Slug is sanitized (lowercase, no spaces, no special characters).
|
|
23
|
+
* - The Advanced panel is rendered as designed but fully disabled.
|
|
24
|
+
* - "Create page" creates the page via onCreateDocument(slug, title); the
|
|
25
|
+
* title is persisted into the new page's root.props.title (see useDocuments).
|
|
26
|
+
*/
|
|
27
|
+
import React, { useState, useEffect, useCallback } from 'react';
|
|
28
|
+
import { createPortal } from 'react-dom';
|
|
29
|
+
import { WizardQuestion } from './WizardQuestion.js';
|
|
30
|
+
import styles from './CreatePageModal.module.css';
|
|
31
|
+
// Phase 1: only "blank" is enabled. The rest are placeholders for later phases.
|
|
32
|
+
const STARTING_POINTS = [
|
|
33
|
+
{
|
|
34
|
+
key: 'blank',
|
|
35
|
+
testId: 'create-page-option-blank',
|
|
36
|
+
label: 'Blank page',
|
|
37
|
+
description: 'Start with an empty canvas.',
|
|
38
|
+
enabled: true,
|
|
39
|
+
adminOnly: false,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
key: 'content-type-template',
|
|
43
|
+
testId: 'create-page-option-content-type-template',
|
|
44
|
+
label: 'From page template',
|
|
45
|
+
description: 'Begin from a proven layout.',
|
|
46
|
+
enabled: true,
|
|
47
|
+
adminOnly: false,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
key: 'generate-ai',
|
|
51
|
+
testId: 'create-page-option-generate-ai',
|
|
52
|
+
label: 'Generate with AI',
|
|
53
|
+
description: 'Describe it — AI drafts a first pass.',
|
|
54
|
+
enabled: true,
|
|
55
|
+
adminOnly: false,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
key: 'plug-external-data',
|
|
59
|
+
testId: 'create-page-option-plug-external-data',
|
|
60
|
+
label: 'Plug external data',
|
|
61
|
+
description: 'Configure data sources and build pages from them.',
|
|
62
|
+
enabled: true,
|
|
63
|
+
adminOnly: false,
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
// Inline icons (stroke = currentColor) so colors are driven by CSS and there's
|
|
67
|
+
// no dependency on PDS icon-name lookups.
|
|
68
|
+
const ICON_PROPS = {
|
|
69
|
+
width: 18,
|
|
70
|
+
height: 18,
|
|
71
|
+
viewBox: '0 0 24 24',
|
|
72
|
+
fill: 'none',
|
|
73
|
+
stroke: 'currentColor',
|
|
74
|
+
strokeWidth: 2,
|
|
75
|
+
strokeLinecap: 'round',
|
|
76
|
+
strokeLinejoin: 'round',
|
|
77
|
+
'aria-hidden': true,
|
|
78
|
+
};
|
|
79
|
+
const OPTION_ICONS = {
|
|
80
|
+
blank: (_jsxs("svg", { ...ICON_PROPS, children: [_jsx("path", { d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" }), _jsx("polyline", { points: "14 2 14 8 20 8" })] })),
|
|
81
|
+
'content-type-template': (_jsxs("svg", { ...ICON_PROPS, children: [_jsx("polygon", { points: "12 2 2 7 12 12 22 7 12 2" }), _jsx("polyline", { points: "2 17 12 22 22 17" }), _jsx("polyline", { points: "2 12 12 17 22 12" })] })),
|
|
82
|
+
'generate-ai': (_jsx("svg", { ...ICON_PROPS, children: _jsx("path", { d: "m12 3-1.9 5.8a2 2 0 0 1-1.3 1.3L3 12l5.8 1.9a2 2 0 0 1 1.3 1.3L12 21l1.9-5.8a2 2 0 0 1 1.3-1.3L21 12l-5.8-1.9a2 2 0 0 1-1.3-1.3z" }) })),
|
|
83
|
+
'plug-external-data': (_jsxs("svg", { ...ICON_PROPS, children: [_jsx("ellipse", { cx: "12", cy: "5", rx: "9", ry: "3" }), _jsx("path", { d: "M3 5v6c0 1.66 4 3 9 3s9-1.34 9-3V5" }), _jsx("path", { d: "M3 11v6c0 1.66 4 3 9 3s9-1.34 9-3v-6" })] })),
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Validate a user-typed URL pattern for a new template. Rules: starts with `/`,
|
|
87
|
+
* each segment is static (`a-z0-9-`) or a param (`:name`), at least one param, and
|
|
88
|
+
* param names are unique. e.g. valid: "/blog/:year/:month/:slug" — invalid:
|
|
89
|
+
* "/blog", "blog/:x", "/:Bad", "/recipe/:p/test/:p" (duplicate param).
|
|
90
|
+
*/
|
|
91
|
+
function isValidUrlPattern(pattern) {
|
|
92
|
+
if (!pattern.startsWith('/'))
|
|
93
|
+
return false;
|
|
94
|
+
const segments = pattern.split('/').filter(Boolean);
|
|
95
|
+
if (segments.length === 0)
|
|
96
|
+
return false;
|
|
97
|
+
const seenParams = new Set();
|
|
98
|
+
for (const seg of segments) {
|
|
99
|
+
if (seg.startsWith(':')) {
|
|
100
|
+
if (!/^:[a-z][a-z0-9]*$/.test(seg))
|
|
101
|
+
return false;
|
|
102
|
+
const name = seg.slice(1);
|
|
103
|
+
if (seenParams.has(name))
|
|
104
|
+
return false; // params must be unique
|
|
105
|
+
seenParams.add(name);
|
|
106
|
+
}
|
|
107
|
+
else if (!/^[a-z0-9-]+$/.test(seg)) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return seenParams.size > 0;
|
|
112
|
+
}
|
|
113
|
+
/** Return a validation message for a URL pattern, or null when it's valid/empty. */
|
|
114
|
+
function getUrlPatternError(pattern) {
|
|
115
|
+
if (pattern.trim() === '')
|
|
116
|
+
return null;
|
|
117
|
+
// Allowed characters only: lowercase letters, digits, '-', '/', ':'.
|
|
118
|
+
if (/[^a-z0-9:/-]/.test(pattern)) {
|
|
119
|
+
return 'Special characters, upper case and spaces are not welcome.';
|
|
120
|
+
}
|
|
121
|
+
if (!isValidUrlPattern(pattern)) {
|
|
122
|
+
return 'Use “/static/:param” segments with at least one unique “:param”.';
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
/** Split a URL pattern into ordered segments (static text or `:param`). */
|
|
127
|
+
function parsePattern(pattern) {
|
|
128
|
+
return pattern
|
|
129
|
+
.split('/')
|
|
130
|
+
.filter(Boolean)
|
|
131
|
+
.map((seg) => seg.startsWith(':')
|
|
132
|
+
? { type: 'param', value: seg.slice(1) }
|
|
133
|
+
: { type: 'static', value: seg });
|
|
134
|
+
}
|
|
135
|
+
/** Resolve a value for a pattern param: `:slug` uses the slug, others use `params`. */
|
|
136
|
+
function patternParamValue(name, slug, params) {
|
|
137
|
+
return name === 'slug' ? slug : (params[name] ?? '');
|
|
138
|
+
}
|
|
139
|
+
/** Build the concrete path for a URL pattern (no leading slash), filling params. */
|
|
140
|
+
function buildPatternPath(pattern, slug, params) {
|
|
141
|
+
return parsePattern(pattern)
|
|
142
|
+
.map((seg) => seg.type === 'static' ? seg.value : patternParamValue(seg.value, slug, params))
|
|
143
|
+
.join('/');
|
|
144
|
+
}
|
|
145
|
+
/** Whether every `:param` in the pattern has a non-empty value. */
|
|
146
|
+
function patternParamsFilled(pattern, slug, params) {
|
|
147
|
+
return parsePattern(pattern)
|
|
148
|
+
.filter((seg) => seg.type === 'param')
|
|
149
|
+
.every((seg) => patternParamValue(seg.value, slug, params).trim().length > 0);
|
|
150
|
+
}
|
|
151
|
+
/** Derive a slug from a free-text title: lowercase, hyphenated, no special chars. */
|
|
152
|
+
function slugify(value) {
|
|
153
|
+
return value
|
|
154
|
+
.toLowerCase()
|
|
155
|
+
.trim()
|
|
156
|
+
.replace(/[^a-z0-9\s-]/g, '')
|
|
157
|
+
.replace(/\s+/g, '-')
|
|
158
|
+
.replace(/-+/g, '-')
|
|
159
|
+
.replace(/^-+|-+$/g, '');
|
|
160
|
+
}
|
|
161
|
+
/** Sanitize a manually-typed slug: lowercase, spaces to hyphens, drop invalid chars. */
|
|
162
|
+
function sanitizeSlug(value) {
|
|
163
|
+
return value
|
|
164
|
+
.toLowerCase()
|
|
165
|
+
.replace(/\s+/g, '-')
|
|
166
|
+
.replace(/[^a-z0-9-]/g, '');
|
|
167
|
+
}
|
|
168
|
+
export function CreatePageModal({ open, onClose, onCreateDocument, siteHost, datasources = [], templates, onCreateTemplate, onNavigate, initialMode = 'page', }) {
|
|
169
|
+
const host = siteHost ?? (typeof window !== 'undefined' ? window.location.host : '');
|
|
170
|
+
const [selected, setSelected] = useState('blank');
|
|
171
|
+
const [contentType, setContentType] = useState(null);
|
|
172
|
+
const [params, setParams] = useState({});
|
|
173
|
+
// "New template" definition form (mocked create; opens the template editor later).
|
|
174
|
+
const [templateName, setTemplateName] = useState('');
|
|
175
|
+
const [templateLabel, setTemplateLabel] = useState('');
|
|
176
|
+
const [templateLabelEdited, setTemplateLabelEdited] = useState(false);
|
|
177
|
+
const [templateDescription, setTemplateDescription] = useState('');
|
|
178
|
+
const [templatePattern, setTemplatePattern] = useState('');
|
|
179
|
+
const [title, setTitle] = useState('');
|
|
180
|
+
const [slug, setSlug] = useState('');
|
|
181
|
+
const [slugEdited, setSlugEdited] = useState(false);
|
|
182
|
+
const [error, setError] = useState(null);
|
|
183
|
+
const [submitting, setSubmitting] = useState(false);
|
|
184
|
+
// "Plug external data" collection builder. Multi-select data sources; route
|
|
185
|
+
// params are derived from the union of the selected sources' inputs (shared
|
|
186
|
+
// name = join key). Sources can be added on the fly (mocked). The route is
|
|
187
|
+
// /<slug>/:<derived params>.
|
|
188
|
+
const [dataSourceMode, setDataSourceMode] = useState('');
|
|
189
|
+
const [pageStructure, setPageStructure] = useState('');
|
|
190
|
+
const [selectedDatasourceIds, setSelectedDatasourceIds] = useState([]);
|
|
191
|
+
const [customSources, setCustomSources] = useState([]);
|
|
192
|
+
const [newType, setNewType] = useState('https-json');
|
|
193
|
+
const [newName, setNewName] = useState('');
|
|
194
|
+
const [newUrl, setNewUrl] = useState('');
|
|
195
|
+
// After creating a collection, show a recap (index + dynamic page) instead of
|
|
196
|
+
// navigating straight to a single page.
|
|
197
|
+
const [recap, setRecap] = useState(null);
|
|
198
|
+
// Reset to a fresh state whenever the modal is closed.
|
|
199
|
+
useEffect(() => {
|
|
200
|
+
if (!open) {
|
|
201
|
+
setSelected('blank');
|
|
202
|
+
setContentType(null);
|
|
203
|
+
setParams({});
|
|
204
|
+
setTemplateName('');
|
|
205
|
+
setTemplateLabel('');
|
|
206
|
+
setTemplateLabelEdited(false);
|
|
207
|
+
setTemplateDescription('');
|
|
208
|
+
setTemplatePattern('');
|
|
209
|
+
setDataSourceMode('');
|
|
210
|
+
setPageStructure('');
|
|
211
|
+
setSelectedDatasourceIds([]);
|
|
212
|
+
setCustomSources([]);
|
|
213
|
+
setNewType('https-json');
|
|
214
|
+
setNewName('');
|
|
215
|
+
setNewUrl('');
|
|
216
|
+
setTitle('');
|
|
217
|
+
setSlug('');
|
|
218
|
+
setSlugEdited(false);
|
|
219
|
+
setError(null);
|
|
220
|
+
setSubmitting(false);
|
|
221
|
+
setRecap(null);
|
|
222
|
+
}
|
|
223
|
+
}, [open]);
|
|
224
|
+
// When opened in 'new-template' mode, jump straight to the New-template form
|
|
225
|
+
// (same state as "From page template" → "+ New template").
|
|
226
|
+
useEffect(() => {
|
|
227
|
+
if (open && initialMode === 'new-template') {
|
|
228
|
+
setSelected('content-type-template');
|
|
229
|
+
setContentType('new-template');
|
|
230
|
+
}
|
|
231
|
+
}, [open, initialMode]);
|
|
232
|
+
// Close on Escape while open.
|
|
233
|
+
useEffect(() => {
|
|
234
|
+
if (!open)
|
|
235
|
+
return;
|
|
236
|
+
function handleKeyDown(e) {
|
|
237
|
+
if (e.key === 'Escape')
|
|
238
|
+
onClose();
|
|
239
|
+
}
|
|
240
|
+
window.addEventListener('keydown', handleKeyDown);
|
|
241
|
+
return () => window.removeEventListener('keydown', handleKeyDown);
|
|
242
|
+
}, [open, onClose]);
|
|
243
|
+
const handleTitleChange = useCallback((e) => {
|
|
244
|
+
const next = e.target.value;
|
|
245
|
+
setTitle(next);
|
|
246
|
+
// Keep the slug in sync with the title until the user overrides it.
|
|
247
|
+
if (!slugEdited)
|
|
248
|
+
setSlug(slugify(next));
|
|
249
|
+
}, [slugEdited]);
|
|
250
|
+
const handleSlugChange = useCallback((e) => {
|
|
251
|
+
setSlug(sanitizeSlug(e.target.value));
|
|
252
|
+
setSlugEdited(true);
|
|
253
|
+
}, []);
|
|
254
|
+
const handleTemplateNameChange = useCallback((e) => {
|
|
255
|
+
const next = e.target.value;
|
|
256
|
+
setTemplateName(next);
|
|
257
|
+
// Label mirrors Name until the user edits the Label.
|
|
258
|
+
if (!templateLabelEdited)
|
|
259
|
+
setTemplateLabel(next);
|
|
260
|
+
}, [templateLabelEdited]);
|
|
261
|
+
const handleTemplateLabelChange = useCallback((e) => {
|
|
262
|
+
setTemplateLabel(e.target.value);
|
|
263
|
+
setTemplateLabelEdited(true);
|
|
264
|
+
}, []);
|
|
265
|
+
const toggleSource = useCallback((id) => {
|
|
266
|
+
setSelectedDatasourceIds((prev) => prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]);
|
|
267
|
+
}, []);
|
|
268
|
+
// Mocked on-the-fly source creation. Inputs are derived from `:param` tokens
|
|
269
|
+
// in the URL (the real version would persist + derive from the urlTemplate).
|
|
270
|
+
const addCustomSource = useCallback(() => {
|
|
271
|
+
const name = newName.trim();
|
|
272
|
+
const id = name.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
|
|
273
|
+
if (!id)
|
|
274
|
+
return;
|
|
275
|
+
const derived = [
|
|
276
|
+
...new Set((newUrl.match(/:([a-z][a-z0-9]*)/gi) ?? []).map((t) => t.slice(1).toLowerCase())),
|
|
277
|
+
];
|
|
278
|
+
// Every source needs at least one param to identify the record. If the URL
|
|
279
|
+
// declares none, default to "<name>Id" so the route still has a key.
|
|
280
|
+
const inputs = derived.length ? derived : [`${id.replace(/-/g, '')}Id`];
|
|
281
|
+
setCustomSources((prev) => prev.some((s) => s.id === id) ? prev : [...prev, { id, label: name, inputs }]);
|
|
282
|
+
setSelectedDatasourceIds((prev) => (prev.includes(id) ? prev : [...prev, id]));
|
|
283
|
+
setNewName('');
|
|
284
|
+
setNewUrl('');
|
|
285
|
+
}, [newName, newUrl]);
|
|
286
|
+
const handleSubmit = useCallback(async (e) => {
|
|
287
|
+
e.preventDefault();
|
|
288
|
+
// "New template" screen: create the template via the real API, then open
|
|
289
|
+
// its editor (template mode at _registry/templates/<name>) and close.
|
|
290
|
+
if (contentType === 'new-template') {
|
|
291
|
+
const name = slugify(templateName);
|
|
292
|
+
const label = templateLabel.trim();
|
|
293
|
+
const pattern = templatePattern.trim();
|
|
294
|
+
if (!onCreateTemplate ||
|
|
295
|
+
submitting ||
|
|
296
|
+
!name ||
|
|
297
|
+
!label ||
|
|
298
|
+
getUrlPatternError(templatePattern)) {
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
setSubmitting(true);
|
|
302
|
+
setError(null);
|
|
303
|
+
try {
|
|
304
|
+
const templateParams = { name, label };
|
|
305
|
+
if (templateDescription.trim())
|
|
306
|
+
templateParams.description = templateDescription.trim();
|
|
307
|
+
if (pattern)
|
|
308
|
+
templateParams.defaultUrlPattern = pattern;
|
|
309
|
+
const created = await onCreateTemplate(templateParams);
|
|
310
|
+
const createdName = (created && 'name' in created ? created.name : undefined) ?? name;
|
|
311
|
+
onNavigate?.(`_registry/templates/${createdName}`);
|
|
312
|
+
onClose();
|
|
313
|
+
}
|
|
314
|
+
catch (err) {
|
|
315
|
+
setError(err instanceof Error ? err.message : 'Failed to create template');
|
|
316
|
+
setSubmitting(false);
|
|
317
|
+
}
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
const finalSlug = slug.trim();
|
|
321
|
+
if (!finalSlug || submitting)
|
|
322
|
+
return;
|
|
323
|
+
// Plug external data. "Everything on one page" → a single page that lists
|
|
324
|
+
// all items. "Index + detail" → an index page plus a dynamic per-item page
|
|
325
|
+
// at /<slug>/:<params>, then a recap.
|
|
326
|
+
if (selected === 'plug-external-data') {
|
|
327
|
+
if (!pageStructure)
|
|
328
|
+
return;
|
|
329
|
+
setSubmitting(true);
|
|
330
|
+
setError(null);
|
|
331
|
+
try {
|
|
332
|
+
if (pageStructure === 'single') {
|
|
333
|
+
await onCreateDocument(finalSlug, title.trim());
|
|
334
|
+
onNavigate?.(finalSlug);
|
|
335
|
+
onClose();
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
const sources = [...datasources, ...customSources].filter((s) => selectedDatasourceIds.includes(s.id));
|
|
339
|
+
const paramNames = [...new Set(sources.flatMap((s) => s.inputs ?? []))];
|
|
340
|
+
// A collection needs a per-item param for its detail page; refuse to
|
|
341
|
+
// create a paramless "collection" (the button is disabled for this too).
|
|
342
|
+
if (paramNames.length === 0) {
|
|
343
|
+
setSubmitting(false);
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
await onCreateDocument(finalSlug, title.trim());
|
|
347
|
+
const dynamicPath = `/${finalSlug}${paramNames
|
|
348
|
+
.map((p) => `/:${p}`)
|
|
349
|
+
.join('')}`;
|
|
350
|
+
await onCreateDocument(dynamicPath, title.trim());
|
|
351
|
+
setSubmitting(false);
|
|
352
|
+
setRecap({ indexPath: `/${finalSlug}`, dynamicPath });
|
|
353
|
+
}
|
|
354
|
+
catch (err) {
|
|
355
|
+
setError(err instanceof Error ? err.message : 'Failed to create pages');
|
|
356
|
+
setSubmitting(false);
|
|
357
|
+
}
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
// Content-type template: build the path from the template's URL pattern,
|
|
361
|
+
// then create the page from that template — the chain scaffolds the
|
|
362
|
+
// template's components and binds templateId/version.
|
|
363
|
+
if (selected === 'content-type-template' &&
|
|
364
|
+
contentType &&
|
|
365
|
+
contentType !== 'new-template') {
|
|
366
|
+
const ct = (templates ?? []).find((t) => t.id === contentType);
|
|
367
|
+
const pattern = ct?.defaultUrlPattern ?? '';
|
|
368
|
+
const filled = pattern
|
|
369
|
+
? patternParamsFilled(pattern, slug, params)
|
|
370
|
+
: slug.trim().length > 0;
|
|
371
|
+
if (!ct || submitting || !filled)
|
|
372
|
+
return;
|
|
373
|
+
const path = pattern ? buildPatternPath(pattern, slug, params) : slug.trim();
|
|
374
|
+
setSubmitting(true);
|
|
375
|
+
setError(null);
|
|
376
|
+
try {
|
|
377
|
+
await onCreateDocument(path, title.trim(), ct.id);
|
|
378
|
+
onNavigate?.(path);
|
|
379
|
+
onClose();
|
|
380
|
+
}
|
|
381
|
+
catch (err) {
|
|
382
|
+
setError(err instanceof Error ? err.message : 'Failed to create page');
|
|
383
|
+
setSubmitting(false);
|
|
384
|
+
}
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
// Blank-page path. (Other tiles are mocked / handled above.)
|
|
388
|
+
if (selected !== 'blank')
|
|
389
|
+
return;
|
|
390
|
+
setSubmitting(true);
|
|
391
|
+
setError(null);
|
|
392
|
+
try {
|
|
393
|
+
await onCreateDocument(finalSlug, title.trim());
|
|
394
|
+
// Navigate to the new page, then close.
|
|
395
|
+
onNavigate?.(finalSlug);
|
|
396
|
+
onClose();
|
|
397
|
+
}
|
|
398
|
+
catch (err) {
|
|
399
|
+
setError(err instanceof Error ? err.message : 'Failed to create page');
|
|
400
|
+
setSubmitting(false);
|
|
401
|
+
}
|
|
402
|
+
}, [
|
|
403
|
+
contentType,
|
|
404
|
+
templateName,
|
|
405
|
+
templateLabel,
|
|
406
|
+
templatePattern,
|
|
407
|
+
templateDescription,
|
|
408
|
+
onCreateTemplate,
|
|
409
|
+
templates,
|
|
410
|
+
params,
|
|
411
|
+
selected,
|
|
412
|
+
slug,
|
|
413
|
+
title,
|
|
414
|
+
submitting,
|
|
415
|
+
pageStructure,
|
|
416
|
+
datasources,
|
|
417
|
+
customSources,
|
|
418
|
+
selectedDatasourceIds,
|
|
419
|
+
onNavigate,
|
|
420
|
+
onCreateDocument,
|
|
421
|
+
onClose,
|
|
422
|
+
]);
|
|
423
|
+
const handleEditPage = useCallback((path) => {
|
|
424
|
+
onNavigate?.(path);
|
|
425
|
+
onClose();
|
|
426
|
+
}, [onNavigate, onClose]);
|
|
427
|
+
if (!open)
|
|
428
|
+
return null;
|
|
429
|
+
// TODO: gate `adminOnly` options behind the `isAdmin` prop once permission
|
|
430
|
+
// checks exist. For now every option is shown to everyone.
|
|
431
|
+
const visiblePoints = STARTING_POINTS;
|
|
432
|
+
// Content types come from the real templates (no built-in/fake list). Keyed by
|
|
433
|
+
// template id; the template's defaultUrlPattern drives the route inputs.
|
|
434
|
+
const contentTypeList = (templates ?? []).map((t) => ({
|
|
435
|
+
key: t.id,
|
|
436
|
+
label: t.label || t.name,
|
|
437
|
+
description: t.description ?? '',
|
|
438
|
+
urlPattern: t.defaultUrlPattern ?? '',
|
|
439
|
+
}));
|
|
440
|
+
// When a content type is chosen, its URL pattern drives the route inputs.
|
|
441
|
+
const selectedCt = selected === 'content-type-template'
|
|
442
|
+
? (contentTypeList.find((c) => c.key === contentType) ?? null)
|
|
443
|
+
: null;
|
|
444
|
+
// The content-type flow can create once a type is picked and the route is
|
|
445
|
+
// defined: a template with a URL pattern needs its `:param`s (incl. `:slug`)
|
|
446
|
+
// filled; a template without a pattern needs a slug.
|
|
447
|
+
const canCreateContentType = selectedCt !== null &&
|
|
448
|
+
(selectedCt.urlPattern
|
|
449
|
+
? patternParamsFilled(selectedCt.urlPattern, slug, params)
|
|
450
|
+
: slug.trim().length > 0);
|
|
451
|
+
// "New template" is a distinct screen within the modal.
|
|
452
|
+
const isTemplateScreen = contentType === 'new-template';
|
|
453
|
+
const templatePatternError = getUrlPatternError(templatePattern);
|
|
454
|
+
// "Create template" is enabled once Name + Label are set and the (optional)
|
|
455
|
+
// URL pattern is valid.
|
|
456
|
+
const canCreateTemplate = slugify(templateName).length > 0 &&
|
|
457
|
+
templateLabel.trim().length > 0 &&
|
|
458
|
+
!templatePatternError;
|
|
459
|
+
// "Plug external data" — the collection builder (data sources → child pages).
|
|
460
|
+
const isPlugExternalData = selected === 'plug-external-data';
|
|
461
|
+
// Page title + URL (at the top) show for Blank or once a content type is
|
|
462
|
+
// picked. The Plug-external-data flow asks for the title later — in its own
|
|
463
|
+
// naming step after the data source + structure questions.
|
|
464
|
+
const showPageFields = selected === 'blank' || selectedCt !== null;
|
|
465
|
+
// Collection builder derived state.
|
|
466
|
+
const availableSources = [...datasources, ...customSources];
|
|
467
|
+
const selectedSources = availableSources.filter((s) => selectedDatasourceIds.includes(s.id));
|
|
468
|
+
// Route params = union of the selected sources' inputs (shared name = join key).
|
|
469
|
+
const routeParamNames = [
|
|
470
|
+
...new Set(selectedSources.flatMap((s) => s.inputs ?? [])),
|
|
471
|
+
];
|
|
472
|
+
const collectionRoutePattern = `/${slug}${routeParamNames
|
|
473
|
+
.map((p) => `/:${p}`)
|
|
474
|
+
.join('')}`;
|
|
475
|
+
// A collection's detail page needs a per-item route param. A list-only source
|
|
476
|
+
// (e.g. swapi_list, no inputs) can't identify a single item, so "index +
|
|
477
|
+
// detail" is invalid until a per-item source is added.
|
|
478
|
+
const collectionNeedsParam = isPlugExternalData &&
|
|
479
|
+
pageStructure === 'collection' &&
|
|
480
|
+
selectedSources.length > 0 &&
|
|
481
|
+
routeParamNames.length === 0;
|
|
482
|
+
const content = (_jsx("div", { className: styles.backdrop, "data-testid": "create-page-modal", onClick: onClose, children: _jsxs("div", { className: styles.panel, role: "dialog", "aria-modal": "true", "aria-labelledby": "create-page-modal-title", onClick: (e) => e.stopPropagation(), children: [_jsxs("header", { className: styles.header, children: [_jsx("span", { className: styles.headerIcon, "aria-hidden": "true", children: "+" }), _jsxs("div", { className: styles.headerText, children: [_jsx("h2", { id: "create-page-modal-title", "data-testid": "create-page-modal-title", className: styles.title, children: isTemplateScreen ? 'Create a page template' : 'Create a new page' }), _jsx("p", { className: styles.subtitle, children: isTemplateScreen
|
|
483
|
+
? 'Initiate a new page template, then define the layout and components used by pages of that type.'
|
|
484
|
+
: 'Pick a starting point, name it, and you’re editing.' })] }), _jsx("button", { type: "button", "data-testid": "create-page-modal-close", className: styles.closeButton, "aria-label": "Close", onClick: onClose, children: "\u00D7" })] }), _jsxs("form", { className: styles.body, onSubmit: handleSubmit, children: [!isTemplateScreen && (_jsxs("fieldset", { className: styles.startFrom, children: [_jsx("legend", { className: styles.sectionLabel, children: "Start from" }), _jsx("div", { className: styles.optionGrid, children: visiblePoints.map((point) => (_jsxs("button", { type: "button", "data-testid": point.testId, className: `${styles.optionButton}${selected === point.key ? ` ${styles.optionButtonSelected}` : ''}`, disabled: !point.enabled, "aria-pressed": selected === point.key, onClick: () => point.enabled && setSelected(point.key), children: [_jsx("span", { className: styles.optionIcon, children: OPTION_ICONS[point.key] }), _jsx("span", { className: styles.optionLabel, children: point.label }), _jsx("span", { className: styles.optionDescription, children: point.description })] }, point.key))) })] })), !isTemplateScreen && selected === 'content-type-template' && (_jsxs("fieldset", { "data-testid": "create-page-content-types", className: styles.startFrom, children: [_jsx("legend", { className: styles.sectionLabel, children: "Choose a content type" }), contentTypeList.length === 0 && (_jsx("p", { "data-testid": "create-page-content-types-empty", className: styles.fieldHint, children: "No Page type template configured." })), _jsxs("div", { className: styles.contentTypeGrid, children: [contentTypeList.map((ct) => (_jsxs("button", { type: "button", "data-testid": `create-page-content-type-${ct.key}`, className: `${styles.contentTypeCard}${contentType === ct.key ? ` ${styles.contentTypeCardSelected}` : ''}`, "aria-pressed": contentType === ct.key, onClick: () => setContentType(ct.key), children: [_jsx("span", { className: styles.contentTypeName, children: ct.label }), _jsx("span", { className: styles.contentTypeDescription, children: ct.description })] }, ct.key))), _jsxs("button", { type: "button", "data-testid": "create-page-content-type-new-template", className: `${styles.contentTypeCard} ${styles.contentTypeCardNew}${contentType === 'new-template'
|
|
485
|
+
? ` ${styles.contentTypeCardSelected}`
|
|
486
|
+
: ''}`, "aria-pressed": contentType === 'new-template', onClick: () => setContentType('new-template'), children: [_jsx("span", { className: styles.contentTypeName, children: "\uFF0B New template" }), _jsx("span", { className: styles.contentTypeDescription, children: "Don\u2019t see the right one? Create a new template." })] })] })] })), contentType === 'new-template' ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", "data-testid": "create-template-back", className: styles.backLink, onClick: () => setContentType(null), children: "\u2190 Back" }), _jsxs("div", { className: styles.fields, children: [_jsxs("div", { className: styles.field, children: [_jsxs("label", { htmlFor: "create-template-name", className: styles.fieldLabel, children: ["Name ", _jsx("span", { className: styles.required, children: "*" })] }), _jsx("input", { id: "create-template-name", type: "text", "data-testid": "create-template-name", className: styles.input, placeholder: "Blog", value: templateName, onChange: handleTemplateNameChange })] }), _jsxs("div", { className: styles.field, children: [_jsx("label", { htmlFor: "create-template-label", className: styles.fieldLabel, children: "Label" }), _jsx("input", { id: "create-template-label", type: "text", "data-testid": "create-template-label", className: styles.input, placeholder: "Blog Post", value: templateLabel, onChange: handleTemplateLabelChange })] }), _jsxs("div", { className: `${styles.field} ${styles.fieldFull}`, children: [_jsxs("label", { htmlFor: "create-template-description", className: styles.fieldLabel, children: ["Description ", _jsx("span", { className: styles.required, children: "*" })] }), _jsx("textarea", { id: "create-template-description", "data-testid": "create-template-description", className: styles.textarea, placeholder: "Standard structure for all blog posts", value: templateDescription, onChange: (e) => setTemplateDescription(e.target.value) })] }), _jsxs("div", { className: `${styles.field} ${styles.fieldFull}`, children: [_jsxs("label", { htmlFor: "create-template-pattern", className: styles.fieldLabel, children: ["Default URL pattern ", _jsx("span", { className: styles.required, children: "*" })] }), _jsx("input", { id: "create-template-pattern", type: "text", "data-testid": "create-template-pattern", className: styles.input, placeholder: "/blog/:year/:month/:slug", value: templatePattern, onChange: (e) => setTemplatePattern(e.target.value) }), templatePatternError && (_jsx("span", { "data-testid": "create-template-pattern-error", role: "alert", className: styles.errorMessage, children: templatePatternError }))] })] })] })) : showPageFields ? (_jsxs("div", { className: styles.fields, children: [_jsxs("div", { className: styles.field, children: [_jsx("label", { htmlFor: "create-page-title", className: styles.fieldLabel, children: "Page title" }), _jsx("input", { id: "create-page-title", type: "text", "data-testid": "create-page-title-input", className: styles.input, placeholder: "New page", value: title, onChange: handleTitleChange }), showPageFields && !slug.trim() && (_jsx("span", { "data-testid": "create-page-title-required", role: "alert", className: styles.errorMessage, children: "Add a page title \u2014 it sets this page\u2019s URL." }))] }), selectedCt && selectedCt.urlPattern ? (_jsxs("div", { className: styles.field, children: [_jsx("label", { className: styles.fieldLabel, children: "URL" }), _jsxs("div", { className: styles.routeBuilder, children: [_jsx("span", { className: styles.routeStatic, children: host }), parsePattern(selectedCt.urlPattern).map((seg, i) => (_jsxs(React.Fragment, { children: [_jsx("span", { className: styles.routeSep, children: "/" }), seg.type === 'static' ? (_jsx("span", { className: styles.routeStatic, children: seg.value })) : (_jsx("input", { type: "text", "data-testid": `create-page-param-${seg.value}`, className: styles.routeInput, placeholder: seg.value, "aria-label": seg.value, size: Math.max(seg.value.length, 4), value: seg.value === 'slug' ? slug : (params[seg.value] ?? ''), onChange: (e) => seg.value === 'slug'
|
|
487
|
+
? handleSlugChange(e)
|
|
488
|
+
: setParams((prev) => ({
|
|
489
|
+
...prev,
|
|
490
|
+
[seg.value]: sanitizeSlug(e.target.value),
|
|
491
|
+
})) }))] }, `${seg.type}-${seg.value}-${i}`)))] })] })) : isPlugExternalData ? null : (_jsxs("div", { className: styles.field, children: [_jsx("label", { htmlFor: "create-page-slug", className: styles.fieldLabel, children: "URL slug" }), _jsxs("div", { className: styles.slugWrap, children: [_jsx("span", { "data-testid": "create-page-slug-prefix", className: styles.slugPrefix, children: `${host} /` }), _jsx("input", { id: "create-page-slug", type: "text", "data-testid": "create-page-slug-input", className: styles.slugInput, placeholder: "new-page", value: slug, onChange: handleSlugChange })] })] }))] })) : selected === 'generate-ai' ? (_jsx("div", { className: styles.fields, children: _jsx("p", { "data-testid": "create-page-generate-ai-note", className: styles.fieldHint, children: "This feature is still in the works." }) })) : null, isPlugExternalData && (_jsxs("div", { "data-testid": "create-page-collection-builder", className: styles.collectionBuilder, children: [_jsx(WizardQuestion, { question: "Where\u2019s your data coming from?", options: [
|
|
492
|
+
{ value: 'configured', label: 'Use a configured source' },
|
|
493
|
+
{ value: 'new', label: 'Add a new one' },
|
|
494
|
+
], value: dataSourceMode, onChange: (v) => setDataSourceMode(v) }), dataSourceMode === 'configured' && (_jsxs("div", { className: styles.dsPane, children: [_jsx("span", { className: styles.fieldLabel, children: "Select data source(s)" }), _jsxs("select", { "data-testid": "create-page-source-select", className: styles.input, value: "", onChange: (e) => {
|
|
495
|
+
if (e.target.value)
|
|
496
|
+
toggleSource(e.target.value);
|
|
497
|
+
}, disabled: availableSources.length === 0 ||
|
|
498
|
+
availableSources.every((s) => selectedDatasourceIds.includes(s.id)), children: [_jsx("option", { value: "", children: availableSources.length === 0
|
|
499
|
+
? 'No data sources yet'
|
|
500
|
+
: 'Select a data source…' }), availableSources
|
|
501
|
+
.filter((s) => !selectedDatasourceIds.includes(s.id))
|
|
502
|
+
.map((s) => {
|
|
503
|
+
const srcParams = s.inputs ?? [];
|
|
504
|
+
return (_jsxs("option", { value: s.id, children: [s.label, srcParams.length
|
|
505
|
+
? ` (${srcParams.map((i) => `:${i}`).join(' ')})`
|
|
506
|
+
: ''] }, s.id));
|
|
507
|
+
})] })] })), dataSourceMode === 'new' && (_jsxs("div", { className: styles.dsPane, children: [_jsx("span", { className: styles.fieldLabel, children: "Add a data source" }), _jsxs("select", { "data-testid": "create-page-new-type", className: styles.input, value: newType, onChange: (e) => setNewType(e.target.value), children: [_jsx("option", { value: "https-json", children: "JSON over HTTPS" }), _jsx("option", { value: "google-sheet", children: "Google Sheet" }), _jsx("option", { value: "other", children: "Other" })] }), _jsx("input", { type: "text", "data-testid": "create-page-new-name", className: styles.input, placeholder: "Name (e.g. recipes)", value: newName, onChange: (e) => setNewName(e.target.value) }), !newName.trim() && (_jsx("span", { "data-testid": "create-page-new-name-required", className: styles.fieldHint, children: "Enter a name to add this source." })), _jsx("input", { type: "text", "data-testid": "create-page-new-url", className: styles.input, placeholder: newType === 'google-sheet'
|
|
508
|
+
? 'Google Sheet link'
|
|
509
|
+
: 'https://api.example.com/items/:id', value: newUrl, onChange: (e) => setNewUrl(e.target.value) }), _jsx("button", { type: "button", "data-testid": "create-page-add-source", className: styles.addParam, disabled: !newName.trim(), onClick: addCustomSource, children: "+ Add source" }), _jsx("p", { "data-testid": "create-page-add-source-note", className: styles.fieldHint, children: "You can only add simple, publicly available data sources here. For sources that need authentication or secrets, ask your developer to configure one programmatically." })] })), selectedSources.length > 0 && (_jsxs("div", { className: styles.field, children: [_jsx("span", { className: styles.fieldLabel, children: "Selected sources" }), _jsx("div", { className: styles.dsChips, children: selectedSources.map((s) => (_jsxs("span", { "data-testid": `create-page-selected-${s.id}`, className: styles.paramChip, children: [s.label, _jsx("button", { type: "button", "data-testid": `create-page-deselect-${s.id}`, className: styles.paramChipRemove, "aria-label": `Remove ${s.label}`, onClick: () => toggleSource(s.id), children: "\u00D7" })] }, s.id))) })] })), selectedSources.length > 0 && (_jsx(WizardQuestion, { question: "How should the pages be structured?", options: [
|
|
510
|
+
{
|
|
511
|
+
value: 'collection',
|
|
512
|
+
label: 'An index + a detail page per item',
|
|
513
|
+
},
|
|
514
|
+
{ value: 'single', label: 'Everything on one page' },
|
|
515
|
+
], value: pageStructure, onChange: (v) => setPageStructure(v) })), pageStructure !== '' && (_jsxs("div", { className: styles.field, children: [_jsx("label", { htmlFor: "create-page-title", className: styles.fieldLabel, children: pageStructure === 'collection' ? 'Index page title' : 'Page title' }), _jsx("input", { id: "create-page-title", type: "text", "data-testid": "create-page-title-input", className: styles.input, placeholder: "New page", value: title, onChange: handleTitleChange })] })), pageStructure === 'single' && (_jsxs("div", { className: styles.field, children: [_jsxs("span", { className: styles.fieldLabel, children: ["URL ", _jsx("span", { className: styles.required, children: "*" })] }), _jsxs("div", { "data-testid": "create-page-route-preview", className: styles.routeBuilder, children: [_jsx("span", { className: styles.routeStatic, children: host }), _jsx("span", { className: styles.routeSep, children: "/" }), _jsx("input", { type: "text", "data-testid": "create-page-route-slug", className: styles.routeInput, placeholder: "new-page", "aria-label": "URL slug", size: Math.max(slug.length, 8), value: slug, onChange: handleSlugChange })] })] })), pageStructure === 'collection' && (_jsxs("div", { className: styles.field, children: [_jsxs("span", { className: styles.fieldLabel, children: ["Routes ", _jsx("span", { className: styles.required, children: "*" })] }), _jsxs("div", { "data-testid": "create-page-route-index", className: styles.routeBuilder, children: [_jsx("span", { className: styles.routeLabel, children: "Index page" }), _jsx("span", { className: styles.routeStatic, children: host }), _jsx("span", { className: styles.routeSep, children: "/" }), _jsx("input", { type: "text", "data-testid": "create-page-route-slug", className: styles.routeInput, placeholder: "new-page", "aria-label": "URL slug", size: Math.max(slug.length, 8), value: slug, onChange: handleSlugChange })] }), _jsxs("div", { "data-testid": "create-page-route-detail", className: styles.routeBuilder, children: [_jsx("span", { className: styles.routeLabel, children: "Detail page" }), _jsx("span", { className: styles.routeStatic, children: host }), _jsx("span", { className: styles.routeSep, children: "/" }), _jsx("span", { className: styles.routeStatic, children: slug || 'new-page' }), routeParamNames.map((name) => (_jsxs(React.Fragment, { children: [_jsx("span", { className: styles.routeSep, children: "/" }), _jsxs("span", { "data-testid": `create-page-route-param-${name}`, className: styles.paramChip, children: [_jsx("span", { className: styles.paramColon, children: ":" }), name] })] }, name)))] })] })), collectionNeedsParam && (_jsxs("div", { "data-testid": "create-page-collection-needs-param", role: "alert", className: styles.errorMessage, children: ["This source lists items but can\u2019t identify a single one, so a detail page can\u2019t be generated. Add a per-item source (one with an ", _jsx("code", { children: ":id" }), "-style input), or choose \u201CEverything on one page\u201D."] })), pageStructure === 'collection' &&
|
|
516
|
+
selectedSources.length > 0 &&
|
|
517
|
+
!collectionNeedsParam && (_jsxs("p", { "data-testid": "create-page-collection-summary", className: styles.collectionSummary, children: ["Generates one page per item \u00B7", ' ', _jsx("code", { children: collectionRoutePattern }), " \u00B7 sources:", ' ', selectedSources.map((s) => s.id).join(', ')] })), submitting && (_jsxs("div", { "data-testid": "create-page-creating", className: styles.creating, children: [_jsx("span", { className: styles.spinner, "aria-hidden": "true" }), "Creating your pages\u2026"] })), recap && (_jsxs("div", { "data-testid": "create-page-recap", className: styles.recap, children: [_jsx("p", { className: styles.recapLead, children: _jsx("strong", { children: "Done \u2014 pages created." }) }), _jsxs("p", { className: styles.recapBody, children: ["We created an ", _jsx("strong", { children: "index page" }), " (place a list or search block there) and a ", _jsx("strong", { children: "detail page" }), " that renders your remote data \u2014 open either to build its layout."] }), _jsxs("p", { className: styles.recapRoutes, children: [_jsx("code", { children: recap.indexPath }), " \u00B7 ", _jsx("code", { children: recap.dynamicPath })] }), _jsxs("div", { className: styles.footerActions, children: [_jsx("button", { type: "button", "data-testid": "create-page-recap-edit-index", className: styles.cancelButton, onClick: () => handleEditPage(recap.indexPath), children: "Edit index page" }), _jsx("button", { type: "button", "data-testid": "create-page-recap-edit-dynamic", className: styles.submitButton, onClick: () => handleEditPage(recap.dynamicPath), children: "Edit detail page" })] })] }))] })), error && (_jsx("div", { "data-testid": "create-page-error", role: "alert", className: styles.errorMessage, children: error })), _jsx("footer", { className: styles.footer, children: _jsxs("div", { className: styles.footerActions, children: [_jsx("button", { type: "button", "data-testid": "create-page-cancel", className: styles.cancelButton, onClick: onClose, children: recap ? 'Done' : 'Cancel' }), !recap && !(isPlugExternalData && submitting) && (_jsx("button", { type: "submit", "data-testid": "create-page-submit", className: styles.submitButton, disabled: submitting ||
|
|
518
|
+
(isTemplateScreen
|
|
519
|
+
? !canCreateTemplate
|
|
520
|
+
: isPlugExternalData
|
|
521
|
+
? !pageStructure || !slug.trim() || collectionNeedsParam
|
|
522
|
+
: selectedCt
|
|
523
|
+
? !canCreateContentType
|
|
524
|
+
: selected !== 'blank' || !slug.trim()), "aria-busy": submitting, children: submitting ? (_jsxs(_Fragment, { children: [_jsx("span", { className: styles.spinner, "aria-hidden": "true" }), "Creating\u2026"] })) : isTemplateScreen ? ('Create template') : isPlugExternalData && pageStructure === 'collection' ? ('+ Create pages') : ('+ Create page') }))] }) })] })] }) }));
|
|
525
|
+
return createPortal(content, document.body);
|
|
526
|
+
}
|
|
527
|
+
//# sourceMappingURL=CreatePageModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreatePageModal.js","sourceRoot":"","sources":["../../../src/pds/components/CreatePageModal.tsx"],"names":[],"mappings":"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"}
|