@prenta/admin 1.0.0 → 1.2.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 +12 -0
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +5 -56
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/components/breakpoint-controls.render.test.js +4 -4
- package/dist/__tests__/components/breakpoint-controls.render.test.js.map +1 -1
- package/dist/__tests__/lib/canvas-edit-chrome.test.js +1 -22
- package/dist/__tests__/lib/canvas-edit-chrome.test.js.map +1 -1
- package/dist/__tests__/lib/open-public-site-tab.test.d.ts +2 -0
- package/dist/__tests__/lib/open-public-site-tab.test.d.ts.map +1 -0
- package/dist/__tests__/lib/open-public-site-tab.test.js +64 -0
- package/dist/__tests__/lib/open-public-site-tab.test.js.map +1 -0
- package/dist/__tests__/lib/preview-bridge.test.js +19 -79
- package/dist/__tests__/lib/preview-bridge.test.js.map +1 -1
- package/dist/__tests__/lib/view-site-chrome.test.d.ts +2 -0
- package/dist/__tests__/lib/view-site-chrome.test.d.ts.map +1 -0
- package/dist/__tests__/lib/view-site-chrome.test.js +69 -0
- package/dist/__tests__/lib/view-site-chrome.test.js.map +1 -0
- package/dist/__tests__/router/admin-routes.test.js +4 -0
- package/dist/__tests__/router/admin-routes.test.js.map +1 -1
- package/dist/__tests__/views/canvas-review-mode.render.test.js +11 -1
- package/dist/__tests__/views/canvas-review-mode.render.test.js.map +1 -1
- package/dist/__tests__/views/canvas-surface-shared.test.js +0 -16
- package/dist/__tests__/views/canvas-surface-shared.test.js.map +1 -1
- package/dist/__tests__/views/editor-top-bar.render.test.js +52 -22
- package/dist/__tests__/views/editor-top-bar.render.test.js.map +1 -1
- package/dist/__tests__/views/page-section-editor.test.js +53 -18
- package/dist/__tests__/views/page-section-editor.test.js.map +1 -1
- package/dist/__tests__/views/post-section-editor.test.js +23 -0
- package/dist/__tests__/views/post-section-editor.test.js.map +1 -1
- package/dist/components/BreakpointPicker.d.ts +3 -2
- package/dist/components/BreakpointPicker.d.ts.map +1 -1
- package/dist/components/BreakpointPicker.js +5 -3
- package/dist/components/BreakpointPicker.js.map +1 -1
- package/dist/components/CanvasEditTip.js +1 -1
- package/dist/components/CanvasEditTip.js.map +1 -1
- package/dist/lib/canvas-edit-chrome.d.ts +0 -17
- package/dist/lib/canvas-edit-chrome.d.ts.map +1 -1
- package/dist/lib/canvas-edit-chrome.js +0 -62
- package/dist/lib/canvas-edit-chrome.js.map +1 -1
- package/dist/lib/editor-preview.d.ts +4 -1
- package/dist/lib/editor-preview.d.ts.map +1 -1
- package/dist/lib/editor-preview.js +4 -1
- package/dist/lib/editor-preview.js.map +1 -1
- package/dist/lib/open-public-site-tab.d.ts +14 -0
- package/dist/lib/open-public-site-tab.d.ts.map +1 -0
- package/dist/lib/open-public-site-tab.js +46 -0
- package/dist/lib/open-public-site-tab.js.map +1 -0
- package/dist/lib/preview-bridge.d.ts +7 -74
- package/dist/lib/preview-bridge.d.ts.map +1 -1
- package/dist/lib/preview-bridge.js +12 -73
- package/dist/lib/preview-bridge.js.map +1 -1
- package/dist/lib/view-site-chrome.d.ts +19 -0
- package/dist/lib/view-site-chrome.d.ts.map +1 -0
- package/dist/lib/view-site-chrome.js +24 -0
- package/dist/lib/view-site-chrome.js.map +1 -0
- package/dist/router/admin-routes.d.ts.map +1 -1
- package/dist/router/admin-routes.js +0 -2
- package/dist/router/admin-routes.js.map +1 -1
- package/dist/views/page-editor/EditorCanvas.d.ts +2 -3
- package/dist/views/page-editor/EditorCanvas.d.ts.map +1 -1
- package/dist/views/page-editor/EditorCanvas.js +2 -2
- package/dist/views/page-editor/EditorCanvas.js.map +1 -1
- package/dist/views/page-editor/EditorTopBar.d.ts +15 -17
- package/dist/views/page-editor/EditorTopBar.d.ts.map +1 -1
- package/dist/views/page-editor/EditorTopBar.js +20 -21
- package/dist/views/page-editor/EditorTopBar.js.map +1 -1
- package/dist/views/page-editor/PageSectionEditor.d.ts +1 -7
- package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
- package/dist/views/page-editor/PageSectionEditor.js +36 -141
- package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
- package/dist/views/page-editor/StructureNotice.d.ts +2 -5
- package/dist/views/page-editor/StructureNotice.d.ts.map +1 -1
- package/dist/views/page-editor/StructureNotice.js +6 -10
- package/dist/views/page-editor/StructureNotice.js.map +1 -1
- package/dist/views/page-editor/sections/SectionRenderer.d.ts +1 -1
- package/dist/views/page-editor/sections/SectionRenderer.d.ts.map +1 -1
- package/dist/views/page-editor/sections/SectionRenderer.js +2 -1
- package/dist/views/page-editor/sections/SectionRenderer.js.map +1 -1
- package/dist/views/post-editor/PostEditorCanvas.d.ts +2 -4
- package/dist/views/post-editor/PostEditorCanvas.d.ts.map +1 -1
- package/dist/views/post-editor/PostEditorCanvas.js +3 -3
- package/dist/views/post-editor/PostEditorCanvas.js.map +1 -1
- package/dist/views/post-editor/PostSectionEditor.d.ts +1 -15
- package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
- package/dist/views/post-editor/PostSectionEditor.js +36 -128
- package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
- package/dist/views/settings/SeoSettingsTab.d.ts.map +1 -1
- package/dist/views/settings/SeoSettingsTab.js +2 -1
- package/dist/views/settings/SeoSettingsTab.js.map +1 -1
- package/dist/views/settings/SiteInformationCard.d.ts.map +1 -1
- package/dist/views/settings/SiteInformationCard.js +3 -1
- package/dist/views/settings/SiteInformationCard.js.map +1 -1
- package/package.json +6 -6
- package/src/AdminRoot.tsx +0 -70
- package/src/__tests__/components/breakpoint-controls.render.test.tsx +6 -4
- package/src/__tests__/lib/canvas-edit-chrome.test.ts +0 -27
- package/src/__tests__/lib/open-public-site-tab.test.ts +74 -0
- package/src/__tests__/lib/preview-bridge.test.ts +21 -110
- package/src/__tests__/lib/view-site-chrome.test.ts +80 -0
- package/src/__tests__/router/admin-routes.test.ts +5 -0
- package/src/__tests__/views/canvas-review-mode.render.test.tsx +14 -1
- package/src/__tests__/views/canvas-surface-shared.test.ts +0 -19
- package/src/__tests__/views/editor-top-bar.render.test.tsx +104 -22
- package/src/__tests__/views/page-section-editor.test.tsx +65 -22
- package/src/__tests__/views/post-section-editor.test.tsx +35 -0
- package/src/components/BreakpointPicker.tsx +6 -3
- package/src/components/CanvasEditTip.tsx +2 -2
- package/src/lib/canvas-edit-chrome.ts +0 -64
- package/src/lib/editor-preview.ts +4 -1
- package/src/lib/open-public-site-tab.ts +57 -0
- package/src/lib/preview-bridge.ts +11 -157
- package/src/lib/view-site-chrome.ts +46 -0
- package/src/router/admin-routes.ts +0 -2
- package/src/styles/theme.css +4 -4
- package/src/views/page-editor/EditorCanvas.tsx +2 -7
- package/src/views/page-editor/EditorTopBar.tsx +85 -82
- package/src/views/page-editor/PageSectionEditor.tsx +83 -220
- package/src/views/page-editor/StructureNotice.tsx +7 -42
- package/src/views/page-editor/sections/SectionRenderer.tsx +5 -2
- package/src/views/post-editor/PostEditorCanvas.tsx +3 -9
- package/src/views/post-editor/PostSectionEditor.tsx +71 -195
- package/src/views/settings/SeoSettingsTab.tsx +21 -0
- package/src/views/settings/SiteInformationCard.tsx +7 -0
- package/dist/__tests__/views/use-site-preview.render.test.d.ts +0 -2
- package/dist/__tests__/views/use-site-preview.render.test.d.ts.map +0 -1
- package/dist/__tests__/views/use-site-preview.render.test.js +0 -120
- package/dist/__tests__/views/use-site-preview.render.test.js.map +0 -1
- package/dist/views/page-editor/PagePreview.d.ts +0 -13
- package/dist/views/page-editor/PagePreview.d.ts.map +0 -1
- package/dist/views/page-editor/PagePreview.js +0 -46
- package/dist/views/page-editor/PagePreview.js.map +0 -1
- package/dist/views/page-editor/SitePreviewFrame.d.ts +0 -43
- package/dist/views/page-editor/SitePreviewFrame.d.ts.map +0 -1
- package/dist/views/page-editor/SitePreviewFrame.js +0 -165
- package/dist/views/page-editor/SitePreviewFrame.js.map +0 -1
- package/dist/views/page-editor/useSitePreview.d.ts +0 -47
- package/dist/views/page-editor/useSitePreview.d.ts.map +0 -1
- package/dist/views/page-editor/useSitePreview.js +0 -96
- package/dist/views/page-editor/useSitePreview.js.map +0 -1
- package/dist/views/post-editor/PostPreview.d.ts +0 -14
- package/dist/views/post-editor/PostPreview.d.ts.map +0 -1
- package/dist/views/post-editor/PostPreview.js +0 -63
- package/dist/views/post-editor/PostPreview.js.map +0 -1
- package/src/__tests__/views/use-site-preview.render.test.tsx +0 -164
- package/src/views/page-editor/PagePreview.tsx +0 -105
- package/src/views/page-editor/SitePreviewFrame.tsx +0 -250
- package/src/views/page-editor/useSitePreview.ts +0 -158
- package/src/views/post-editor/PostPreview.tsx +0 -125
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
import { useEffect, useState } from 'react'
|
|
4
|
-
import { AlertTriangle, Loader2, Pencil, X } from 'lucide-react'
|
|
5
|
-
import {
|
|
6
|
-
fetchPostForEditor,
|
|
7
|
-
fetchTemplateForEditor,
|
|
8
|
-
type EditorPost,
|
|
9
|
-
type PostHeaderConfig,
|
|
10
|
-
} from '../../lib/post-editor-service.js'
|
|
11
|
-
import { defaultPostHeader } from '@prenta/core/page-sections'
|
|
12
|
-
import { SectionRenderer, type PostRenderContext } from '../page-editor/sections/index.js'
|
|
13
|
-
import { PostHeader } from './PostHeader.js'
|
|
14
|
-
|
|
15
|
-
interface PostPreviewProps {
|
|
16
|
-
postType: string
|
|
17
|
-
documentId: string
|
|
18
|
-
session?: any
|
|
19
|
-
onNavigate: (path: string) => void
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Chrome-free render of a post using the same header + section renderers as
|
|
24
|
-
* the editor canvas, so the preview reflects what ships. Only visible
|
|
25
|
-
* sections render (hidden ones are omitted, like the public page).
|
|
26
|
-
*/
|
|
27
|
-
export function PostPreview({ postType, documentId, session, onNavigate }: PostPreviewProps) {
|
|
28
|
-
const [post, setPost] = useState<EditorPost | null>(null)
|
|
29
|
-
const [header, setHeader] = useState<PostHeaderConfig>(defaultPostHeader())
|
|
30
|
-
const [loading, setLoading] = useState(true)
|
|
31
|
-
const [error, setError] = useState<string | null>(null)
|
|
32
|
-
|
|
33
|
-
useEffect(() => {
|
|
34
|
-
let cancelled = false
|
|
35
|
-
setLoading(true)
|
|
36
|
-
fetchTemplateForEditor(postType)
|
|
37
|
-
.then((t) => !cancelled && setHeader(t.header))
|
|
38
|
-
.catch(() => {
|
|
39
|
-
/* default header */
|
|
40
|
-
})
|
|
41
|
-
fetchPostForEditor(postType, documentId)
|
|
42
|
-
.then((p) => !cancelled && setPost(p))
|
|
43
|
-
.catch((err) => !cancelled && setError(err instanceof Error ? err.message : 'Failed to load'))
|
|
44
|
-
.finally(() => !cancelled && setLoading(false))
|
|
45
|
-
return () => {
|
|
46
|
-
cancelled = true
|
|
47
|
-
}
|
|
48
|
-
}, [postType, documentId])
|
|
49
|
-
|
|
50
|
-
if (loading) {
|
|
51
|
-
return (
|
|
52
|
-
<div className="bg-background flex h-full items-center justify-center">
|
|
53
|
-
<Loader2 className="text-muted-foreground h-6 w-6 animate-spin" aria-hidden />
|
|
54
|
-
<span className="sr-only">Loading preview…</span>
|
|
55
|
-
</div>
|
|
56
|
-
)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (error || !post) {
|
|
60
|
-
return (
|
|
61
|
-
<div className="bg-background flex h-full items-center justify-center p-6">
|
|
62
|
-
<div className="border-destructive/30 bg-destructive/5 flex max-w-md items-center gap-3 rounded-lg border p-4">
|
|
63
|
-
<AlertTriangle className="text-destructive shrink-0" size={20} aria-hidden />
|
|
64
|
-
<p className="text-foreground text-sm font-medium">{error ?? 'Post not found.'}</p>
|
|
65
|
-
</div>
|
|
66
|
-
</div>
|
|
67
|
-
)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const context: PostRenderContext = {
|
|
71
|
-
title: post.title,
|
|
72
|
-
excerpt: post.excerpt,
|
|
73
|
-
body: post.body,
|
|
74
|
-
featuredImageUrl: post.featuredImage,
|
|
75
|
-
publishDate: post.publishDate ?? post.updatedAt ?? null,
|
|
76
|
-
category: post.category,
|
|
77
|
-
author: { name: session?.user?.name || session?.user?.email },
|
|
78
|
-
}
|
|
79
|
-
const visible = post.sections.filter((s) => s.visible)
|
|
80
|
-
|
|
81
|
-
// `window.close()` only works for tabs JS opened (the "View preview" action
|
|
82
|
-
// opens this view via window.open). When the user reached it through in-app
|
|
83
|
-
// navigation there is no opener, so close() is a silent no-op — fall back to
|
|
84
|
-
// the editor after a tick so the Close button always does something.
|
|
85
|
-
const handleClose = () => {
|
|
86
|
-
window.close()
|
|
87
|
-
setTimeout(() => {
|
|
88
|
-
onNavigate(`/posts/${postType}/${documentId}/edit`)
|
|
89
|
-
}, 120)
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return (
|
|
93
|
-
<div className="flex h-full flex-col">
|
|
94
|
-
{/* Slim preview bar. This view opens in its own browser tab, so
|
|
95
|
-
actions are tab-scoped. */}
|
|
96
|
-
<div className="bg-card border-border flex h-12 shrink-0 items-center justify-between border-b px-4">
|
|
97
|
-
<button
|
|
98
|
-
type="button"
|
|
99
|
-
onClick={handleClose}
|
|
100
|
-
className="text-muted-foreground hover:text-foreground inline-flex items-center gap-1.5 text-sm"
|
|
101
|
-
aria-label="Close preview tab"
|
|
102
|
-
>
|
|
103
|
-
<X className="h-4 w-4" aria-hidden />
|
|
104
|
-
Close
|
|
105
|
-
</button>
|
|
106
|
-
<span className="text-muted-foreground text-xs">Preview · {post.title || 'Untitled'}</span>
|
|
107
|
-
<button
|
|
108
|
-
type="button"
|
|
109
|
-
onClick={() => onNavigate(`/posts/${postType}/${documentId}/edit`)}
|
|
110
|
-
className="bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm font-medium"
|
|
111
|
-
>
|
|
112
|
-
<Pencil className="h-3.5 w-3.5" aria-hidden />
|
|
113
|
-
Open editor
|
|
114
|
-
</button>
|
|
115
|
-
</div>
|
|
116
|
-
|
|
117
|
-
<div className="prenta-canvas bg-card flex-1 overflow-auto">
|
|
118
|
-
<PostHeader config={header} context={context} />
|
|
119
|
-
{visible.map((section) => (
|
|
120
|
-
<SectionRenderer key={section.id} section={section} context={context} />
|
|
121
|
-
))}
|
|
122
|
-
</div>
|
|
123
|
-
</div>
|
|
124
|
-
)
|
|
125
|
-
}
|