@prenta/admin 0.98.1 → 1.0.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/CHANGELOG.md +6 -0
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +17 -28
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/components/seo-score-bands.test.js +0 -3
- package/dist/__tests__/components/seo-score-bands.test.js.map +1 -1
- package/dist/__tests__/layout/sidebar-posts.test.js +6 -11
- package/dist/__tests__/layout/sidebar-posts.test.js.map +1 -1
- package/dist/__tests__/layout/sidebar-submenu.render.test.js +3 -2
- package/dist/__tests__/layout/sidebar-submenu.render.test.js.map +1 -1
- package/dist/__tests__/lib/page-editor-service-api.test.js +26 -23
- package/dist/__tests__/lib/page-editor-service-api.test.js.map +1 -1
- package/dist/__tests__/views/page-section-editor.test.js +0 -1
- package/dist/__tests__/views/page-section-editor.test.js.map +1 -1
- package/dist/__tests__/views/page-tab.render.test.js +0 -1
- package/dist/__tests__/views/page-tab.render.test.js.map +1 -1
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/layout/Sidebar.d.ts +3 -4
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/Sidebar.js +7 -38
- package/dist/layout/Sidebar.js.map +1 -1
- package/dist/lib/page-editor-service.d.ts +0 -7
- package/dist/lib/page-editor-service.d.ts.map +1 -1
- package/dist/lib/page-editor-service.js +9 -9
- package/dist/lib/page-editor-service.js.map +1 -1
- package/dist/prenta-admin.css +1 -1
- package/dist/views/PageEditor.d.ts +2 -2
- package/dist/views/PageEditor.js +2 -2
- package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
- package/dist/views/page-editor/PageSectionEditor.js +9 -15
- package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
- package/package.json +4 -4
- package/src/AdminRoot.tsx +18 -68
- package/src/__tests__/components/seo-score-bands.test.ts +0 -3
- package/src/__tests__/layout/sidebar-posts.test.ts +6 -11
- package/src/__tests__/layout/sidebar-submenu.render.test.tsx +3 -2
- package/src/__tests__/lib/page-editor-service-api.test.ts +27 -25
- package/src/__tests__/views/page-section-editor.test.tsx +0 -1
- package/src/__tests__/views/page-tab.render.test.tsx +0 -1
- package/src/index.ts +1 -11
- package/src/layout/Sidebar.tsx +6 -41
- package/src/lib/page-editor-service.ts +9 -16
- package/src/views/PageEditor.tsx +2 -2
- package/src/views/page-editor/PageSectionEditor.tsx +8 -37
- package/dist/__tests__/views/page-builder-block-renderer.render.test.d.ts +0 -2
- package/dist/__tests__/views/page-builder-block-renderer.render.test.d.ts.map +0 -1
- package/dist/__tests__/views/page-builder-block-renderer.render.test.js +0 -48
- package/dist/__tests__/views/page-builder-block-renderer.render.test.js.map +0 -1
- package/dist/__tests__/views/page-builder-form-picker.render.test.d.ts +0 -2
- package/dist/__tests__/views/page-builder-form-picker.render.test.d.ts.map +0 -1
- package/dist/__tests__/views/page-builder-form-picker.render.test.js +0 -44
- package/dist/__tests__/views/page-builder-form-picker.render.test.js.map +0 -1
- package/dist/__tests__/views/page-builder-sections-panel.render.test.d.ts +0 -2
- package/dist/__tests__/views/page-builder-sections-panel.render.test.d.ts.map +0 -1
- package/dist/__tests__/views/page-builder-sections-panel.render.test.js +0 -121
- package/dist/__tests__/views/page-builder-sections-panel.render.test.js.map +0 -1
- package/dist/__tests__/views/page-builder-seo-panel.render.test.d.ts +0 -2
- package/dist/__tests__/views/page-builder-seo-panel.render.test.d.ts.map +0 -1
- package/dist/__tests__/views/page-builder-seo-panel.render.test.js +0 -65
- package/dist/__tests__/views/page-builder-seo-panel.render.test.js.map +0 -1
- package/dist/__tests__/views/page-builder-template-seed.render.test.d.ts +0 -2
- package/dist/__tests__/views/page-builder-template-seed.render.test.d.ts.map +0 -1
- package/dist/__tests__/views/page-builder-template-seed.render.test.js +0 -48
- package/dist/__tests__/views/page-builder-template-seed.render.test.js.map +0 -1
- package/dist/__tests__/views/page-templates.render.test.d.ts +0 -2
- package/dist/__tests__/views/page-templates.render.test.d.ts.map +0 -1
- package/dist/__tests__/views/page-templates.render.test.js +0 -126
- package/dist/__tests__/views/page-templates.render.test.js.map +0 -1
- package/dist/hooks/useBuilderState.d.ts +0 -49
- package/dist/hooks/useBuilderState.d.ts.map +0 -1
- package/dist/hooks/useBuilderState.js +0 -238
- package/dist/hooks/useBuilderState.js.map +0 -1
- package/dist/views/page-builder/AIBlockAssist.d.ts +0 -9
- package/dist/views/page-builder/AIBlockAssist.d.ts.map +0 -1
- package/dist/views/page-builder/AIBlockAssist.js +0 -40
- package/dist/views/page-builder/AIBlockAssist.js.map +0 -1
- package/dist/views/page-builder/AIGenerateDialog.d.ts +0 -8
- package/dist/views/page-builder/AIGenerateDialog.d.ts.map +0 -1
- package/dist/views/page-builder/AIGenerateDialog.js +0 -173
- package/dist/views/page-builder/AIGenerateDialog.js.map +0 -1
- package/dist/views/page-builder/BlockEditor.d.ts +0 -11
- package/dist/views/page-builder/BlockEditor.d.ts.map +0 -1
- package/dist/views/page-builder/BlockEditor.js +0 -159
- package/dist/views/page-builder/BlockEditor.js.map +0 -1
- package/dist/views/page-builder/BlockPicker.d.ts +0 -7
- package/dist/views/page-builder/BlockPicker.d.ts.map +0 -1
- package/dist/views/page-builder/BlockPicker.js +0 -103
- package/dist/views/page-builder/BlockPicker.js.map +0 -1
- package/dist/views/page-builder/BottomBar.d.ts +0 -9
- package/dist/views/page-builder/BottomBar.d.ts.map +0 -1
- package/dist/views/page-builder/BottomBar.js +0 -13
- package/dist/views/page-builder/BottomBar.js.map +0 -1
- package/dist/views/page-builder/BuilderSectionsPanel.d.ts +0 -20
- package/dist/views/page-builder/BuilderSectionsPanel.d.ts.map +0 -1
- package/dist/views/page-builder/BuilderSectionsPanel.js +0 -105
- package/dist/views/page-builder/BuilderSectionsPanel.js.map +0 -1
- package/dist/views/page-builder/BuilderToolbar.d.ts +0 -21
- package/dist/views/page-builder/BuilderToolbar.d.ts.map +0 -1
- package/dist/views/page-builder/BuilderToolbar.js +0 -18
- package/dist/views/page-builder/BuilderToolbar.js.map +0 -1
- package/dist/views/page-builder/ContextPanel.d.ts +0 -20
- package/dist/views/page-builder/ContextPanel.d.ts.map +0 -1
- package/dist/views/page-builder/ContextPanel.js +0 -43
- package/dist/views/page-builder/ContextPanel.js.map +0 -1
- package/dist/views/page-builder/DesignScore.d.ts +0 -6
- package/dist/views/page-builder/DesignScore.d.ts.map +0 -1
- package/dist/views/page-builder/DesignScore.js +0 -93
- package/dist/views/page-builder/DesignScore.js.map +0 -1
- package/dist/views/page-builder/NodeSettings.d.ts +0 -12
- package/dist/views/page-builder/NodeSettings.d.ts.map +0 -1
- package/dist/views/page-builder/NodeSettings.js +0 -80
- package/dist/views/page-builder/NodeSettings.js.map +0 -1
- package/dist/views/page-builder/PageBuilder.d.ts +0 -10
- package/dist/views/page-builder/PageBuilder.d.ts.map +0 -1
- package/dist/views/page-builder/PageBuilder.js +0 -222
- package/dist/views/page-builder/PageBuilder.js.map +0 -1
- package/dist/views/page-builder/PageSettings.d.ts +0 -7
- package/dist/views/page-builder/PageSettings.d.ts.map +0 -1
- package/dist/views/page-builder/PageSettings.js +0 -27
- package/dist/views/page-builder/PageSettings.js.map +0 -1
- package/dist/views/page-builder/PageTemplates.d.ts +0 -5
- package/dist/views/page-builder/PageTemplates.d.ts.map +0 -1
- package/dist/views/page-builder/PageTemplates.js +0 -146
- package/dist/views/page-builder/PageTemplates.js.map +0 -1
- package/dist/views/page-builder/RelationshipField.d.ts +0 -15
- package/dist/views/page-builder/RelationshipField.d.ts.map +0 -1
- package/dist/views/page-builder/RelationshipField.js +0 -65
- package/dist/views/page-builder/RelationshipField.js.map +0 -1
- package/dist/views/page-builder/SEOPanel.d.ts +0 -9
- package/dist/views/page-builder/SEOPanel.d.ts.map +0 -1
- package/dist/views/page-builder/SEOPanel.js +0 -38
- package/dist/views/page-builder/SEOPanel.js.map +0 -1
- package/dist/views/page-builder/SavedSections.d.ts +0 -6
- package/dist/views/page-builder/SavedSections.d.ts.map +0 -1
- package/dist/views/page-builder/SavedSections.js +0 -141
- package/dist/views/page-builder/SavedSections.js.map +0 -1
- package/dist/views/page-builder/TemplatePicker.d.ts +0 -7
- package/dist/views/page-builder/TemplatePicker.d.ts.map +0 -1
- package/dist/views/page-builder/TemplatePicker.js +0 -68
- package/dist/views/page-builder/TemplatePicker.js.map +0 -1
- package/dist/views/page-builder/Widgets.d.ts +0 -13
- package/dist/views/page-builder/Widgets.d.ts.map +0 -1
- package/dist/views/page-builder/Widgets.js +0 -15
- package/dist/views/page-builder/Widgets.js.map +0 -1
- package/dist/views/page-builder/block-renderers/CTAPreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/CTAPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/CTAPreview.js +0 -19
- package/dist/views/page-builder/block-renderers/CTAPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/CardsPreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/CardsPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/CardsPreview.js +0 -22
- package/dist/views/page-builder/block-renderers/CardsPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/CodePreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/CodePreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/CodePreview.js +0 -12
- package/dist/views/page-builder/block-renderers/CodePreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/FAQPreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/FAQPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/FAQPreview.js +0 -27
- package/dist/views/page-builder/block-renderers/FAQPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts +0 -6
- package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/FallbackPreview.js +0 -7
- package/dist/views/page-builder/block-renderers/FallbackPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/FormPreview.d.ts +0 -9
- package/dist/views/page-builder/block-renderers/FormPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/FormPreview.js +0 -52
- package/dist/views/page-builder/block-renderers/FormPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/GalleryPreview.js +0 -19
- package/dist/views/page-builder/block-renderers/GalleryPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/HeroPreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/HeroPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/HeroPreview.js +0 -19
- package/dist/views/page-builder/block-renderers/HeroPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/ImagePreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/ImagePreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/ImagePreview.js +0 -17
- package/dist/views/page-builder/block-renderers/ImagePreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/TextPreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/TextPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/TextPreview.js +0 -22
- package/dist/views/page-builder/block-renderers/TextPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/VideoPreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/VideoPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/VideoPreview.js +0 -18
- package/dist/views/page-builder/block-renderers/VideoPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/index.d.ts +0 -9
- package/dist/views/page-builder/block-renderers/index.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/index.js +0 -25
- package/dist/views/page-builder/block-renderers/index.js.map +0 -1
- package/dist/views/page-builder/canvas/BlockRenderer.d.ts +0 -8
- package/dist/views/page-builder/canvas/BlockRenderer.d.ts.map +0 -1
- package/dist/views/page-builder/canvas/BlockRenderer.js +0 -20
- package/dist/views/page-builder/canvas/BlockRenderer.js.map +0 -1
- package/dist/views/page-builder/canvas/BuilderCanvas.d.ts +0 -10
- package/dist/views/page-builder/canvas/BuilderCanvas.d.ts.map +0 -1
- package/dist/views/page-builder/canvas/BuilderCanvas.js +0 -26
- package/dist/views/page-builder/canvas/BuilderCanvas.js.map +0 -1
- package/dist/views/page-builder/canvas/ColumnRenderer.d.ts +0 -8
- package/dist/views/page-builder/canvas/ColumnRenderer.d.ts.map +0 -1
- package/dist/views/page-builder/canvas/ColumnRenderer.js +0 -32
- package/dist/views/page-builder/canvas/ColumnRenderer.js.map +0 -1
- package/dist/views/page-builder/canvas/ContainerRenderer.d.ts +0 -8
- package/dist/views/page-builder/canvas/ContainerRenderer.d.ts.map +0 -1
- package/dist/views/page-builder/canvas/ContainerRenderer.js +0 -29
- package/dist/views/page-builder/canvas/ContainerRenderer.js.map +0 -1
- package/dist/views/page-builder/canvas/RowRenderer.d.ts +0 -8
- package/dist/views/page-builder/canvas/RowRenderer.d.ts.map +0 -1
- package/dist/views/page-builder/canvas/RowRenderer.js +0 -28
- package/dist/views/page-builder/canvas/RowRenderer.js.map +0 -1
- package/dist/views/page-builder/canvas/SectionRenderer.d.ts +0 -8
- package/dist/views/page-builder/canvas/SectionRenderer.d.ts.map +0 -1
- package/dist/views/page-builder/canvas/SectionRenderer.js +0 -50
- package/dist/views/page-builder/canvas/SectionRenderer.js.map +0 -1
- package/dist/views/page-builder/canvas/index.d.ts +0 -3
- package/dist/views/page-builder/canvas/index.d.ts.map +0 -1
- package/dist/views/page-builder/canvas/index.js +0 -2
- package/dist/views/page-builder/canvas/index.js.map +0 -1
- package/src/__tests__/views/page-builder-block-renderer.render.test.tsx +0 -66
- package/src/__tests__/views/page-builder-form-picker.render.test.tsx +0 -54
- package/src/__tests__/views/page-builder-sections-panel.render.test.tsx +0 -138
- package/src/__tests__/views/page-builder-seo-panel.render.test.tsx +0 -77
- package/src/__tests__/views/page-builder-template-seed.render.test.tsx +0 -59
- package/src/__tests__/views/page-templates.render.test.tsx +0 -182
- package/src/hooks/useBuilderState.ts +0 -361
- package/src/views/page-builder/AIBlockAssist.tsx +0 -64
- package/src/views/page-builder/AIGenerateDialog.tsx +0 -593
- package/src/views/page-builder/BlockEditor.tsx +0 -523
- package/src/views/page-builder/BlockPicker.tsx +0 -324
- package/src/views/page-builder/BottomBar.tsx +0 -65
- package/src/views/page-builder/BuilderSectionsPanel.tsx +0 -304
- package/src/views/page-builder/BuilderToolbar.tsx +0 -221
- package/src/views/page-builder/ContextPanel.tsx +0 -144
- package/src/views/page-builder/DesignScore.tsx +0 -251
- package/src/views/page-builder/NodeSettings.tsx +0 -500
- package/src/views/page-builder/PageBuilder.tsx +0 -405
- package/src/views/page-builder/PageSettings.tsx +0 -162
- package/src/views/page-builder/PageTemplates.tsx +0 -435
- package/src/views/page-builder/RelationshipField.tsx +0 -113
- package/src/views/page-builder/SEOPanel.tsx +0 -222
- package/src/views/page-builder/SavedSections.tsx +0 -480
- package/src/views/page-builder/TemplatePicker.tsx +0 -197
- package/src/views/page-builder/Widgets.tsx +0 -44
- package/src/views/page-builder/block-renderers/CTAPreview.tsx +0 -79
- package/src/views/page-builder/block-renderers/CardsPreview.tsx +0 -69
- package/src/views/page-builder/block-renderers/CodePreview.tsx +0 -46
- package/src/views/page-builder/block-renderers/FAQPreview.tsx +0 -87
- package/src/views/page-builder/block-renderers/FallbackPreview.tsx +0 -18
- package/src/views/page-builder/block-renderers/FormPreview.tsx +0 -117
- package/src/views/page-builder/block-renderers/GalleryPreview.tsx +0 -87
- package/src/views/page-builder/block-renderers/HeroPreview.tsx +0 -90
- package/src/views/page-builder/block-renderers/ImagePreview.tsx +0 -54
- package/src/views/page-builder/block-renderers/TextPreview.tsx +0 -81
- package/src/views/page-builder/block-renderers/VideoPreview.tsx +0 -73
- package/src/views/page-builder/block-renderers/index.ts +0 -34
- package/src/views/page-builder/canvas/BlockRenderer.tsx +0 -56
- package/src/views/page-builder/canvas/BuilderCanvas.tsx +0 -87
- package/src/views/page-builder/canvas/ColumnRenderer.tsx +0 -82
- package/src/views/page-builder/canvas/ContainerRenderer.tsx +0 -67
- package/src/views/page-builder/canvas/RowRenderer.tsx +0 -68
- package/src/views/page-builder/canvas/SectionRenderer.tsx +0 -93
- package/src/views/page-builder/canvas/index.ts +0 -2
package/src/layout/Sidebar.tsx
CHANGED
|
@@ -26,9 +26,7 @@ import {
|
|
|
26
26
|
PanelTop,
|
|
27
27
|
PanelBottom,
|
|
28
28
|
Layers,
|
|
29
|
-
LayoutGrid,
|
|
30
29
|
Code2,
|
|
31
|
-
Library,
|
|
32
30
|
ListTree,
|
|
33
31
|
Menu as MenuIcon,
|
|
34
32
|
PanelLeftClose,
|
|
@@ -194,37 +192,16 @@ const POSTS_CHILDREN: NavItem[] = [
|
|
|
194
192
|
{ path: '/posts/types', label: 'Post Types', icon: Layers },
|
|
195
193
|
]
|
|
196
194
|
|
|
197
|
-
/**
|
|
198
|
-
* Children of the Templates parent. Templates is its own top-level item
|
|
199
|
-
* (page building tools) — Saved Sections are reusable content blocks and
|
|
200
|
-
* Widgets are embeddable components. These are deliberately NOT children
|
|
201
|
-
* of Pages: Pages is content, Templates/Sections/Widgets are structure.
|
|
202
|
-
*/
|
|
203
|
-
const TEMPLATES_CHILDREN: NavItem[] = [
|
|
204
|
-
{ path: '/saved-sections', label: 'Saved Sections', icon: Library },
|
|
205
|
-
{ path: '/widgets', label: 'Widgets', icon: LayoutGrid },
|
|
206
|
-
]
|
|
207
|
-
|
|
208
195
|
/**
|
|
209
196
|
* Nav tree for the default (config-less) install. Dashboard sits on its
|
|
210
197
|
* own at the top, then a CONTENT group holding Pages (no children) above
|
|
211
|
-
* Posts (with All Posts + Post Types)
|
|
212
|
-
*
|
|
213
|
-
* SETTINGS group (Users / API Keys / Settings). The group ordering is
|
|
214
|
-
* meaningful — the renderer emits a section header the first time it
|
|
215
|
-
* sees a new group, so "CONTENT" renders once, above Pages.
|
|
198
|
+
* Posts (with All Posts + Post Types), followed by Media / Forms / SEO /
|
|
199
|
+
* Script Tags, then a SETTINGS group (Users / API Keys / Settings).
|
|
216
200
|
*/
|
|
217
201
|
const defaultNavItems: NavItem[] = [
|
|
218
202
|
{ path: '/', label: 'Dashboard', icon: LayoutDashboard },
|
|
219
203
|
{ path: '/pages', label: 'Pages', icon: File, group: 'Content' },
|
|
220
204
|
{ path: '/posts', label: 'Posts', icon: FileText, group: 'Content', children: POSTS_CHILDREN },
|
|
221
|
-
{
|
|
222
|
-
path: '/page-templates',
|
|
223
|
-
label: 'Templates',
|
|
224
|
-
icon: Layers,
|
|
225
|
-
group: 'Content',
|
|
226
|
-
children: TEMPLATES_CHILDREN,
|
|
227
|
-
},
|
|
228
205
|
{ path: '/media', label: 'Media', icon: Image, group: 'Content' },
|
|
229
206
|
{ path: '/forms', label: 'Forms', icon: ClipboardList, group: 'Content' },
|
|
230
207
|
{ path: '/seo', label: 'SEO', icon: SearchIcon, group: 'Content' },
|
|
@@ -773,10 +750,9 @@ export interface NavItem {
|
|
|
773
750
|
/**
|
|
774
751
|
* Build the sidebar nav tree from the CMS config. If no collections are
|
|
775
752
|
* configured, returns the curated `defaultNavItems` tree. When
|
|
776
|
-
* collections ARE configured, page-type collections
|
|
777
|
-
*
|
|
778
|
-
*
|
|
779
|
-
* Settings) is anchored under the right Content / Settings group.
|
|
753
|
+
* collections ARE configured, page-type collections render as Content
|
|
754
|
+
* entries, and every static destination (Media, Forms, SEO, Script Tags,
|
|
755
|
+
* Users, API Keys, Settings) is anchored under the right group.
|
|
780
756
|
*/
|
|
781
757
|
export function buildNavItems(config: any): NavItem[] {
|
|
782
758
|
if (!config?.collections) return defaultNavItems
|
|
@@ -817,8 +793,7 @@ export function buildNavItems(config: any): NavItem[] {
|
|
|
817
793
|
// Script Tags).
|
|
818
794
|
|
|
819
795
|
// Pages-style collections render as plain Content entries (no nested
|
|
820
|
-
// children).
|
|
821
|
-
// Templates parent below, not under Pages.
|
|
796
|
+
// children).
|
|
822
797
|
pages.forEach((collection) => {
|
|
823
798
|
items.push({
|
|
824
799
|
label: collection.labels?.plural ?? collection.slug,
|
|
@@ -843,16 +818,6 @@ export function buildNavItems(config: any): NavItem[] {
|
|
|
843
818
|
})
|
|
844
819
|
}
|
|
845
820
|
|
|
846
|
-
// Templates — its own parent holding Saved Sections + Widgets (page
|
|
847
|
-
// building structure, distinct from Pages content).
|
|
848
|
-
items.push({
|
|
849
|
-
path: '/page-templates',
|
|
850
|
-
label: 'Templates',
|
|
851
|
-
icon: Layers,
|
|
852
|
-
group: 'Content',
|
|
853
|
-
children: TEMPLATES_CHILDREN,
|
|
854
|
-
})
|
|
855
|
-
|
|
856
821
|
// Standard Content destinations (always present — they map to CMS
|
|
857
822
|
// features, not collections).
|
|
858
823
|
items.push(
|
|
@@ -32,6 +32,8 @@ import {
|
|
|
32
32
|
updateSectionMeta,
|
|
33
33
|
coerceSections as coerceSectionsCore,
|
|
34
34
|
validateSectionContent,
|
|
35
|
+
isPageBuilderTree,
|
|
36
|
+
layoutTreeToSections,
|
|
35
37
|
type PageSection,
|
|
36
38
|
} from '@prenta/core/page-sections'
|
|
37
39
|
import { validateSlug } from '@prenta/core/client'
|
|
@@ -91,13 +93,6 @@ export interface EditorPage {
|
|
|
91
93
|
authorName: string
|
|
92
94
|
/** CMS user behind the byline, when it is one. Empty for generic/guest. */
|
|
93
95
|
authorId: string
|
|
94
|
-
/**
|
|
95
|
-
* True when the document was authored in the visual Page Builder (it carries
|
|
96
|
-
* a `_layout` tree). Such a page's `sections` are *compiled* from the layout
|
|
97
|
-
* on every save (ADR 0002), so the flat editor opens it read-only and points
|
|
98
|
-
* the user to the Page Builder instead of silently fighting the next save.
|
|
99
|
-
*/
|
|
100
|
-
builderOwned: boolean
|
|
101
96
|
}
|
|
102
97
|
|
|
103
98
|
export interface ValidationResult {
|
|
@@ -196,20 +191,20 @@ interface DocumentApiRow {
|
|
|
196
191
|
scheduledUnpublishAt?: string | null
|
|
197
192
|
updatedAt: string | null
|
|
198
193
|
data: Record<string, unknown> | null
|
|
199
|
-
/**
|
|
194
|
+
/** Lifted leftover page-builder tree from `getDocument` (ADR 0003). */
|
|
200
195
|
layout?: unknown
|
|
201
196
|
}
|
|
202
197
|
|
|
203
|
-
function
|
|
204
|
-
|
|
198
|
+
function sectionsFromDocumentRow(doc: DocumentApiRow): PageSection[] {
|
|
199
|
+
const stored = coerceSectionsCore(doc.data?.sections, { onUnknown: 'preserve' })
|
|
200
|
+
if (stored.length > 0) return stored
|
|
201
|
+
if (isPageBuilderTree(doc.layout)) return layoutTreeToSections(doc.layout)
|
|
202
|
+
return stored
|
|
205
203
|
}
|
|
206
204
|
|
|
207
205
|
function rowToEditorPage(doc: DocumentApiRow): EditorPage {
|
|
208
206
|
const data = doc.data ?? {}
|
|
209
207
|
const slug = doc.slug ?? ''
|
|
210
|
-
// The API lifts the stored `_layout` onto `doc.layout`, but tolerate either
|
|
211
|
-
// shape so ownership detection is robust to response variations.
|
|
212
|
-
const builderOwned = isPlainObject(doc.layout) || isPlainObject(data._layout)
|
|
213
208
|
return {
|
|
214
209
|
id: doc.id,
|
|
215
210
|
title: doc.title ?? '',
|
|
@@ -220,7 +215,7 @@ function rowToEditorPage(doc: DocumentApiRow): EditorPage {
|
|
|
220
215
|
typeof data.parentPageId === 'string' && data.parentPageId ? data.parentPageId : null,
|
|
221
216
|
// Preserve unknown (externally-managed) sections so the editor can show
|
|
222
217
|
// them read-only and round-trip them on save instead of dropping them.
|
|
223
|
-
sections:
|
|
218
|
+
sections: sectionsFromDocumentRow(doc),
|
|
224
219
|
seoTitle: typeof data.metaTitle === 'string' ? data.metaTitle : '',
|
|
225
220
|
seoDescription: typeof data.metaDescription === 'string' ? data.metaDescription : '',
|
|
226
221
|
publishedAt: doc.publishedAt ?? null,
|
|
@@ -229,7 +224,6 @@ function rowToEditorPage(doc: DocumentApiRow): EditorPage {
|
|
|
229
224
|
scheduledUnpublishAt: doc.scheduledUnpublishAt ?? null,
|
|
230
225
|
authorName: typeof data.authorName === 'string' ? data.authorName : '',
|
|
231
226
|
authorId: typeof data.authorId === 'string' ? data.authorId : '',
|
|
232
|
-
builderOwned,
|
|
233
227
|
}
|
|
234
228
|
}
|
|
235
229
|
|
|
@@ -330,6 +324,5 @@ export function emptyPage(parentPageId: string | null = null): EditorPage {
|
|
|
330
324
|
scheduledUnpublishAt: null,
|
|
331
325
|
authorName: '',
|
|
332
326
|
authorId: '',
|
|
333
|
-
builderOwned: false,
|
|
334
327
|
}
|
|
335
328
|
}
|
package/src/views/PageEditor.tsx
CHANGED
|
@@ -13,8 +13,8 @@ export interface PageEditorProps {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
-
* @deprecated Superseded by the
|
|
17
|
-
*
|
|
16
|
+
* @deprecated Superseded by the section editor (`PageSectionEditor`); will be
|
|
17
|
+
* removed in the next major.
|
|
18
18
|
*/
|
|
19
19
|
export function PageEditor({ id, onNavigate }: PageEditorProps) {
|
|
20
20
|
const isNew = !id
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
3
|
import { useCallback, useEffect, useMemo, useState } from 'react'
|
|
4
|
-
import { AlertTriangle,
|
|
4
|
+
import { AlertTriangle, Loader2, Lock } from 'lucide-react'
|
|
5
5
|
import { toast } from 'sonner'
|
|
6
6
|
import { ConfirmDialog } from '../../components/ui/ConfirmDialog.js'
|
|
7
7
|
import { useNavigationBlocker } from '../../router/index.js'
|
|
@@ -415,25 +415,19 @@ export function PageSectionEditor({
|
|
|
415
415
|
)
|
|
416
416
|
|
|
417
417
|
// ─── Edit permission ─────────────────────────────────────────────────
|
|
418
|
-
/**
|
|
419
|
-
* ADR 0002: a Page-Builder-owned page (it has a `_layout`) compiles its
|
|
420
|
-
* sections from the builder layout on every save, so editing them here would
|
|
421
|
-
* be overwritten. The server independently refuses such edits with 409.
|
|
422
|
-
*/
|
|
423
|
-
const readOnly = page?.builderOwned ?? false
|
|
424
418
|
/**
|
|
425
419
|
* The single gate every writing surface reads.
|
|
426
420
|
*
|
|
427
421
|
* Hoisted above the callbacks rather than derived at render time, because
|
|
428
422
|
* the two that were left behind were the ones that mattered: the site
|
|
429
423
|
* preview's in-place edit handlers close over `canEdit` (the raw role) and
|
|
430
|
-
* so kept accepting edits while a past version was under review
|
|
431
|
-
* a
|
|
432
|
-
*
|
|
424
|
+
* so kept accepting edits while a past version was under review. The iframe
|
|
425
|
+
* is a second editing surface, and a lock that only covers the rail is not
|
|
426
|
+
* a lock.
|
|
433
427
|
*/
|
|
434
|
-
const effectiveCanEdit = canEdit && !
|
|
428
|
+
const effectiveCanEdit = canEdit && !reviewing
|
|
435
429
|
/** Restoring is not editing: it is allowed precisely while reviewing. */
|
|
436
|
-
const canRestoreVersion = canEdit
|
|
430
|
+
const canRestoreVersion = canEdit
|
|
437
431
|
|
|
438
432
|
// ─── Load ──────────────────────────────────────────────────────────
|
|
439
433
|
useEffect(() => {
|
|
@@ -911,8 +905,8 @@ export function PageSectionEditor({
|
|
|
911
905
|
)
|
|
912
906
|
}
|
|
913
907
|
|
|
914
|
-
// `
|
|
915
|
-
//
|
|
908
|
+
// `effectiveCanEdit` / `canRestoreVersion` are computed above, with the
|
|
909
|
+
// hooks, so the callbacks defined there share this one gate.
|
|
916
910
|
|
|
917
911
|
// The canvas shows the reviewed snapshot, but `page.sections` stays the
|
|
918
912
|
// editor's own content throughout — nothing about review mode writes to it.
|
|
@@ -982,29 +976,6 @@ export function PageSectionEditor({
|
|
|
982
976
|
structuralTypes={structuralTypes}
|
|
983
977
|
/>
|
|
984
978
|
|
|
985
|
-
{readOnly && (
|
|
986
|
-
<div
|
|
987
|
-
role="status"
|
|
988
|
-
className="border-border bg-accent/40 flex items-center gap-3 border-b px-4 py-2.5"
|
|
989
|
-
>
|
|
990
|
-
<Blocks className="text-muted-foreground shrink-0" size={16} aria-hidden />
|
|
991
|
-
<p className="text-muted-foreground flex-1 text-sm">
|
|
992
|
-
This page is built in the{' '}
|
|
993
|
-
<span className="text-foreground font-medium">Page Builder</span>. Its sections are
|
|
994
|
-
generated from the builder layout and are read-only here.
|
|
995
|
-
</p>
|
|
996
|
-
{page.id && (
|
|
997
|
-
<button
|
|
998
|
-
type="button"
|
|
999
|
-
onClick={() => guardedNavigate(`/page-builder/${page.id}`)}
|
|
1000
|
-
className="bg-primary text-primary-foreground hover:bg-primary/90 shrink-0 rounded-lg px-3 py-1.5 text-sm font-medium transition-colors"
|
|
1001
|
-
>
|
|
1002
|
-
Open in Page Builder
|
|
1003
|
-
</button>
|
|
1004
|
-
)}
|
|
1005
|
-
</div>
|
|
1006
|
-
)}
|
|
1007
|
-
|
|
1008
979
|
{unmanagedTypes.length > 0 && (
|
|
1009
980
|
<div
|
|
1010
981
|
role="status"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page-builder-block-renderer.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-block-renderer.render.test.tsx"],"names":[],"mappings":""}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
// @vitest-environment happy-dom
|
|
3
|
-
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
-
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
|
|
5
|
-
const cmsApi = vi.fn();
|
|
6
|
-
vi.mock('../../lib/api.js', () => ({ cmsApi: (...args) => cmsApi(...args) }));
|
|
7
|
-
const { BlockRenderer } = await import('../../views/page-builder/canvas/BlockRenderer.js');
|
|
8
|
-
function formNode(over = {}) {
|
|
9
|
-
return {
|
|
10
|
-
id: 'node-1',
|
|
11
|
-
type: 'block',
|
|
12
|
-
settings: { blockType: 'form', variant: 'contact' },
|
|
13
|
-
data: { formId: 'f1' },
|
|
14
|
-
...over,
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
beforeEach(() => {
|
|
18
|
-
cmsApi.mockReset();
|
|
19
|
-
cmsApi.mockResolvedValue({
|
|
20
|
-
data: {
|
|
21
|
-
name: 'Contact Us',
|
|
22
|
-
fields: [
|
|
23
|
-
{ key: 'name', label: 'Full Name', type: 'text' },
|
|
24
|
-
{ key: 'message', label: 'Message', type: 'textarea' },
|
|
25
|
-
],
|
|
26
|
-
},
|
|
27
|
-
status: 200,
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
describe('canvas BlockRenderer', () => {
|
|
31
|
-
it('renders the live form preview with the linked form name and fields', async () => {
|
|
32
|
-
render(_jsx(BlockRenderer, { node: formNode(), selectedNodeId: null, onSelectNode: vi.fn() }));
|
|
33
|
-
await waitFor(() => expect(screen.getByText('Contact Us')).toBeTruthy());
|
|
34
|
-
expect(cmsApi).toHaveBeenCalledWith('/forms/f1');
|
|
35
|
-
expect(screen.getByText('Full Name')).toBeTruthy();
|
|
36
|
-
});
|
|
37
|
-
it('selects the node on click', () => {
|
|
38
|
-
const onSelectNode = vi.fn();
|
|
39
|
-
const { container } = render(_jsx(BlockRenderer, { node: formNode({ data: {} }), selectedNodeId: null, onSelectNode: onSelectNode }));
|
|
40
|
-
fireEvent.click(container.querySelector('[data-node-id="node-1"]'));
|
|
41
|
-
expect(onSelectNode).toHaveBeenCalledWith('node-1');
|
|
42
|
-
});
|
|
43
|
-
it('falls back to a placeholder for unknown block types', () => {
|
|
44
|
-
render(_jsx(BlockRenderer, { node: formNode({ settings: { blockType: 'widget' }, data: {} }), selectedNodeId: null, onSelectNode: vi.fn() }));
|
|
45
|
-
expect(screen.getByText('No preview available')).toBeTruthy();
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
//# sourceMappingURL=page-builder-block-renderer.render.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page-builder-block-renderer.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-block-renderer.render.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page-builder-form-picker.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-form-picker.render.test.tsx"],"names":[],"mappings":""}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
// @vitest-environment happy-dom
|
|
3
|
-
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
-
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
|
|
5
|
-
const cmsApi = vi.fn();
|
|
6
|
-
vi.mock('../../lib/api.js', () => ({ cmsApi: (...args) => cmsApi(...args) }));
|
|
7
|
-
const { RelationshipField } = await import('../../views/page-builder/RelationshipField.js');
|
|
8
|
-
const formField = {
|
|
9
|
-
type: 'relationship',
|
|
10
|
-
label: 'Form',
|
|
11
|
-
relationTo: 'forms',
|
|
12
|
-
};
|
|
13
|
-
beforeEach(() => {
|
|
14
|
-
cmsApi.mockReset();
|
|
15
|
-
});
|
|
16
|
-
describe('RelationshipField (form block picker)', () => {
|
|
17
|
-
it('loads forms and lets the editor pick one by id', async () => {
|
|
18
|
-
cmsApi.mockResolvedValue({
|
|
19
|
-
data: [
|
|
20
|
-
{ id: 'f1', name: 'Contact Us', slug: 'contact-us' },
|
|
21
|
-
{ id: 'f2', name: 'Event RSVP', slug: 'event-rsvp' },
|
|
22
|
-
],
|
|
23
|
-
status: 200,
|
|
24
|
-
});
|
|
25
|
-
const onChange = vi.fn();
|
|
26
|
-
render(_jsx(RelationshipField, { definition: formField, value: "", onChange: onChange, label: "Form" }));
|
|
27
|
-
await waitFor(() => expect(screen.getByText('Contact Us')).toBeTruthy());
|
|
28
|
-
expect(cmsApi).toHaveBeenCalledWith('/forms');
|
|
29
|
-
expect(screen.getByText('Event RSVP')).toBeTruthy();
|
|
30
|
-
fireEvent.change(screen.getByLabelText('Form'), { target: { value: 'f2' } });
|
|
31
|
-
expect(onChange).toHaveBeenCalledWith('f2');
|
|
32
|
-
});
|
|
33
|
-
it('shows an empty hint when the collection has no items', async () => {
|
|
34
|
-
cmsApi.mockResolvedValue({ data: [], status: 200 });
|
|
35
|
-
render(_jsx(RelationshipField, { definition: formField, value: "", onChange: vi.fn(), label: "Form" }));
|
|
36
|
-
await waitFor(() => expect(screen.getByText('No forms found.')).toBeTruthy());
|
|
37
|
-
});
|
|
38
|
-
it('degrades to a plain id input when the collection cannot be loaded', async () => {
|
|
39
|
-
cmsApi.mockResolvedValue({ error: 'boom', status: 500 });
|
|
40
|
-
render(_jsx(RelationshipField, { definition: formField, value: "f9", onChange: vi.fn(), label: "Form" }));
|
|
41
|
-
await waitFor(() => expect(screen.getByPlaceholderText('Enter forms id…').value).toBe('f9'));
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
//# sourceMappingURL=page-builder-form-picker.render.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page-builder-form-picker.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-form-picker.render.test.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAChC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAG3E,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;AACtB,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;AAExF,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,+CAA+C,CAAC,CAAA;AAE3F,MAAM,SAAS,GAAoB;IACjC,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,MAAM;IACb,UAAU,EAAE,OAAO;CACD,CAAA;AAEpB,UAAU,CAAC,GAAG,EAAE;IACd,MAAM,CAAC,SAAS,EAAE,CAAA;AACpB,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,CAAC,iBAAiB,CAAC;YACvB,IAAI,EAAE;gBACJ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE;gBACpD,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE;aACrD;YACD,MAAM,EAAE,GAAG;SACZ,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACxB,MAAM,CAAC,KAAC,iBAAiB,IAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAC,EAAE,EAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAC,MAAM,GAAG,CAAC,CAAA;QAE9F,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;QACxE,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAA;QAC7C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QAEnD,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;QAC5E,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QACnD,MAAM,CAAC,KAAC,iBAAiB,IAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAC,EAAE,EAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAC,MAAM,GAAG,CAAC,CAAA;QAC7F,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;IAC/E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QACxD,MAAM,CAAC,KAAC,iBAAiB,IAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAC,IAAI,EAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAC,MAAM,GAAG,CAAC,CAAA;QAC/F,MAAM,OAAO,CAAC,GAAG,EAAE,CACjB,MAAM,CAAE,MAAM,CAAC,oBAAoB,CAAC,iBAAiB,CAAsB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC9F,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page-builder-sections-panel.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-sections-panel.render.test.tsx"],"names":[],"mappings":""}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
// @vitest-environment happy-dom
|
|
3
|
-
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
-
import { fireEvent, render, screen } from '@testing-library/react';
|
|
5
|
-
const { BuilderSectionsPanel } = await import('../../views/page-builder/BuilderSectionsPanel.js');
|
|
6
|
-
/** Minimal builder tree: a hero section plus an empty, hidden section. */
|
|
7
|
-
function makeTree() {
|
|
8
|
-
return {
|
|
9
|
-
id: 'page1',
|
|
10
|
-
type: 'page',
|
|
11
|
-
children: [
|
|
12
|
-
{
|
|
13
|
-
id: 'sec1',
|
|
14
|
-
type: 'section',
|
|
15
|
-
settings: {},
|
|
16
|
-
children: [
|
|
17
|
-
{
|
|
18
|
-
id: 'cont1',
|
|
19
|
-
type: 'container',
|
|
20
|
-
settings: {},
|
|
21
|
-
children: [
|
|
22
|
-
{
|
|
23
|
-
id: 'row1',
|
|
24
|
-
type: 'row',
|
|
25
|
-
settings: {},
|
|
26
|
-
children: [
|
|
27
|
-
{
|
|
28
|
-
id: 'col1',
|
|
29
|
-
type: 'column',
|
|
30
|
-
settings: { width: 12 },
|
|
31
|
-
children: [
|
|
32
|
-
{
|
|
33
|
-
id: 'blk1',
|
|
34
|
-
type: 'block',
|
|
35
|
-
settings: { blockType: 'hero', variant: 'centered' },
|
|
36
|
-
data: {},
|
|
37
|
-
},
|
|
38
|
-
],
|
|
39
|
-
},
|
|
40
|
-
],
|
|
41
|
-
},
|
|
42
|
-
],
|
|
43
|
-
},
|
|
44
|
-
],
|
|
45
|
-
},
|
|
46
|
-
{ id: 'sec2', type: 'section', settings: { visibility: 'hidden' }, children: [] },
|
|
47
|
-
],
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
function renderPanel(over = {}) {
|
|
51
|
-
const props = {
|
|
52
|
-
tree: makeTree(),
|
|
53
|
-
selectedNodeId: null,
|
|
54
|
-
collapsed: false,
|
|
55
|
-
onToggleCollapsed: vi.fn(),
|
|
56
|
-
onSelect: vi.fn(),
|
|
57
|
-
onReorder: vi.fn(),
|
|
58
|
-
onAddSection: vi.fn(),
|
|
59
|
-
...over,
|
|
60
|
-
};
|
|
61
|
-
render(_jsx(BuilderSectionsPanel, { ...props }));
|
|
62
|
-
return props;
|
|
63
|
-
}
|
|
64
|
-
beforeEach(() => {
|
|
65
|
-
vi.clearAllMocks();
|
|
66
|
-
});
|
|
67
|
-
describe('BuilderSectionsPanel', () => {
|
|
68
|
-
it('lists the page sections in order with derived names and block counts', () => {
|
|
69
|
-
renderPanel();
|
|
70
|
-
// First section is named after its first block's catalog label.
|
|
71
|
-
expect(screen.getByText('Hero')).toBeTruthy();
|
|
72
|
-
expect(screen.getByText('1 block')).toBeTruthy();
|
|
73
|
-
// Empty section falls back to a positional name.
|
|
74
|
-
expect(screen.getByText('Section 2')).toBeTruthy();
|
|
75
|
-
expect(screen.getByText('Empty section')).toBeTruthy();
|
|
76
|
-
// Count chip in the header.
|
|
77
|
-
expect(screen.getByText('2')).toBeTruthy();
|
|
78
|
-
// Panel is an accessible nav landmark.
|
|
79
|
-
expect(screen.getByRole('navigation', { name: 'Page sections' })).toBeTruthy();
|
|
80
|
-
});
|
|
81
|
-
it('fires the selection callback when a section row is clicked', () => {
|
|
82
|
-
const props = renderPanel();
|
|
83
|
-
// `/^Hero/` excludes the drag handle ("Drag to reorder Hero").
|
|
84
|
-
fireEvent.click(screen.getByRole('button', { name: /^Hero/ }));
|
|
85
|
-
expect(props.onSelect).toHaveBeenCalledWith('sec1');
|
|
86
|
-
});
|
|
87
|
-
it('marks the selected section with aria-current', () => {
|
|
88
|
-
renderPanel({ selectedNodeId: 'sec1' });
|
|
89
|
-
const row = screen.getByRole('button', { name: /^Hero/ });
|
|
90
|
-
expect(row.getAttribute('aria-current')).toBe('true');
|
|
91
|
-
});
|
|
92
|
-
it('exposes keyboard-accessible drag handles per section', () => {
|
|
93
|
-
renderPanel();
|
|
94
|
-
expect(screen.getByRole('button', { name: 'Drag to reorder Hero' })).toBeTruthy();
|
|
95
|
-
expect(screen.getByRole('button', { name: 'Drag to reorder Section 2' })).toBeTruthy();
|
|
96
|
-
});
|
|
97
|
-
it('fires the add-section callback from the bottom affordance', () => {
|
|
98
|
-
const props = renderPanel();
|
|
99
|
-
fireEvent.click(screen.getByRole('button', { name: 'Add Section' }));
|
|
100
|
-
expect(props.onAddSection).toHaveBeenCalledTimes(1);
|
|
101
|
-
});
|
|
102
|
-
it('collapses to a rail with an expand toggle', () => {
|
|
103
|
-
const props = renderPanel({ collapsed: true });
|
|
104
|
-
// Section rows are gone; only the expand affordance remains.
|
|
105
|
-
expect(screen.queryByText('Hero')).toBeNull();
|
|
106
|
-
const toggle = screen.getByRole('button', { name: 'Expand sections panel' });
|
|
107
|
-
expect(toggle.getAttribute('aria-expanded')).toBe('false');
|
|
108
|
-
fireEvent.click(toggle);
|
|
109
|
-
expect(props.onToggleCollapsed).toHaveBeenCalledTimes(1);
|
|
110
|
-
});
|
|
111
|
-
it('shows a collapse toggle with aria-expanded when open', () => {
|
|
112
|
-
renderPanel();
|
|
113
|
-
const toggle = screen.getByRole('button', { name: 'Collapse sections panel' });
|
|
114
|
-
expect(toggle.getAttribute('aria-expanded')).toBe('true');
|
|
115
|
-
});
|
|
116
|
-
it('shows an empty message when the page has no sections', () => {
|
|
117
|
-
renderPanel({ tree: { id: 'page1', type: 'page', children: [] } });
|
|
118
|
-
expect(screen.getByText(/No sections yet/)).toBeTruthy();
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
//# sourceMappingURL=page-builder-sections-panel.render.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page-builder-sections-panel.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-sections-panel.render.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page-builder-seo-panel.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-seo-panel.render.test.tsx"],"names":[],"mappings":""}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
// @vitest-environment happy-dom
|
|
3
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
4
|
-
import { render, screen } from '@testing-library/react';
|
|
5
|
-
import { BuilderSEOPanel } from '../../views/page-builder/SEOPanel.js';
|
|
6
|
-
const tree = {
|
|
7
|
-
id: 'page-1',
|
|
8
|
-
type: 'page',
|
|
9
|
-
children: [
|
|
10
|
-
{
|
|
11
|
-
id: 'sec-1',
|
|
12
|
-
type: 'section',
|
|
13
|
-
settings: {},
|
|
14
|
-
children: [
|
|
15
|
-
{
|
|
16
|
-
id: 'row-1',
|
|
17
|
-
type: 'row',
|
|
18
|
-
settings: {},
|
|
19
|
-
children: [
|
|
20
|
-
{
|
|
21
|
-
id: 'col-1',
|
|
22
|
-
type: 'column',
|
|
23
|
-
settings: { width: 12 },
|
|
24
|
-
children: [
|
|
25
|
-
{
|
|
26
|
-
id: 'blk-hero',
|
|
27
|
-
type: 'block',
|
|
28
|
-
settings: { blockType: 'hero' },
|
|
29
|
-
data: {
|
|
30
|
-
title: 'Welcome to Our Service',
|
|
31
|
-
image: { url: '/hero.webp', alt: 'Hero banner' },
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
],
|
|
35
|
-
},
|
|
36
|
-
],
|
|
37
|
-
},
|
|
38
|
-
],
|
|
39
|
-
},
|
|
40
|
-
],
|
|
41
|
-
};
|
|
42
|
-
const pageSettings = {
|
|
43
|
-
title: 'Home',
|
|
44
|
-
slug: 'home',
|
|
45
|
-
metaTitle: 'Welcome to Our Service',
|
|
46
|
-
metaDescription: 'The public description.',
|
|
47
|
-
};
|
|
48
|
-
describe('BuilderSEOPanel', () => {
|
|
49
|
-
it('grades the live tree with the shared page audit panel and keeps meta fields', () => {
|
|
50
|
-
render(_jsx(BuilderSEOPanel, { tree: tree, pageSettings: pageSettings, onPageSettingsChange: vi.fn() }));
|
|
51
|
-
expect(screen.getByRole('img', { name: /SEO score:/i })).toBeTruthy();
|
|
52
|
-
expect(screen.getByRole('img', { name: /GEO score:/i })).toBeTruthy();
|
|
53
|
-
expect(screen.getByText('SEO checks')).toBeTruthy();
|
|
54
|
-
expect(screen.getByText('GEO checks')).toBeTruthy();
|
|
55
|
-
expect(screen.getByLabelText('Meta Title')).toBeTruthy();
|
|
56
|
-
expect(screen.queryByText('Readability')).toBeNull();
|
|
57
|
-
expect(screen.queryByText('Block Hints')).toBeNull();
|
|
58
|
-
});
|
|
59
|
-
it('keeps the empty-tree copy when the canvas has no children', () => {
|
|
60
|
-
render(_jsx(BuilderSEOPanel, { tree: { id: 'page-1', type: 'page', children: [] }, pageSettings: pageSettings, onPageSettingsChange: vi.fn() }));
|
|
61
|
-
expect(screen.getByText('Add content to your page to see SEO analysis')).toBeTruthy();
|
|
62
|
-
expect(screen.queryByRole('img', { name: /SEO score:/i })).toBeNull();
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
//# sourceMappingURL=page-builder-seo-panel.render.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page-builder-seo-panel.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-seo-panel.render.test.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAA;AAEtE,MAAM,IAAI,GAAG;IACX,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE;QACR;YACE,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE;gBACR;oBACE,EAAE,EAAE,OAAO;oBACX,IAAI,EAAE,KAAK;oBACX,QAAQ,EAAE,EAAE;oBACZ,QAAQ,EAAE;wBACR;4BACE,EAAE,EAAE,OAAO;4BACX,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;4BACvB,QAAQ,EAAE;gCACR;oCACE,EAAE,EAAE,UAAU;oCACd,IAAI,EAAE,OAAO;oCACb,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;oCAC/B,IAAI,EAAE;wCACJ,KAAK,EAAE,wBAAwB;wCAC/B,KAAK,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE;qCACjD;iCACF;6BACF;yBACF;qBACF;iBACF;aACF;SACF;KACF;CACU,CAAA;AAEb,MAAM,YAAY,GAAG;IACnB,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,wBAAwB;IACnC,eAAe,EAAE,yBAAyB;CAC3C,CAAA;AAED,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,CACJ,KAAC,eAAe,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,GAAI,CAC3F,CAAA;QAED,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QACrE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QACrE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QACnD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QACnD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QACxD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;QACpD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CACJ,KAAC,eAAe,IACd,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAc,EAC9D,YAAY,EAAE,YAAY,EAC1B,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,GAC7B,CACH,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,8CAA8C,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QACrF,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACvE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page-builder-template-seed.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-template-seed.render.test.tsx"],"names":[],"mappings":""}
|