@actuate-media/cms-admin 0.9.0 → 0.11.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/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +8 -5
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/layout/primitives.test.d.ts +2 -0
- package/dist/__tests__/layout/primitives.test.d.ts.map +1 -0
- package/dist/__tests__/layout/primitives.test.js +34 -0
- package/dist/__tests__/layout/primitives.test.js.map +1 -0
- package/dist/__tests__/lib/cv.test.d.ts +2 -0
- package/dist/__tests__/lib/cv.test.d.ts.map +1 -0
- package/dist/__tests__/lib/cv.test.js +66 -0
- package/dist/__tests__/lib/cv.test.js.map +1 -0
- package/dist/actuate-admin.css +1 -1
- package/dist/assets/actuate-logo.d.ts +36 -0
- package/dist/assets/actuate-logo.d.ts.map +1 -0
- package/dist/assets/actuate-logo.js +15 -0
- package/dist/assets/actuate-logo.js.map +1 -0
- package/dist/components/Breadcrumbs.js +2 -2
- package/dist/components/CommandPalette.js +10 -10
- package/dist/components/ContentOverviewChart.js +3 -3
- package/dist/components/ErrorBoundary.js +1 -1
- package/dist/components/FocalPointPicker.js +2 -2
- package/dist/components/FolderTree.js +20 -20
- package/dist/components/LivePreview.js +3 -3
- package/dist/components/LocaleSwitcher.js +1 -1
- package/dist/components/MediaPickerModal.js +4 -4
- package/dist/components/PresenceIndicator.js +1 -1
- package/dist/components/SEOConfigPanel.d.ts +2 -0
- package/dist/components/SEOConfigPanel.d.ts.map +1 -0
- package/dist/components/SEOConfigPanel.js +174 -0
- package/dist/components/SEOConfigPanel.js.map +1 -0
- package/dist/components/SEOPanel.js +9 -9
- package/dist/components/SEOPerformance.js +2 -2
- package/dist/components/SchedulePublishDialog.d.ts +18 -0
- package/dist/components/SchedulePublishDialog.d.ts.map +1 -0
- package/dist/components/SchedulePublishDialog.js +106 -0
- package/dist/components/SchedulePublishDialog.js.map +1 -0
- package/dist/components/SharePreviewLinkDialog.d.ts +17 -0
- package/dist/components/SharePreviewLinkDialog.d.ts.map +1 -0
- package/dist/components/SharePreviewLinkDialog.js +83 -0
- package/dist/components/SharePreviewLinkDialog.js.map +1 -0
- package/dist/components/TipTapEditor.js +5 -5
- package/dist/components/VersionHistory.js +2 -2
- package/dist/components/ui/Badge.d.ts +33 -3
- package/dist/components/ui/Badge.d.ts.map +1 -1
- package/dist/components/ui/Badge.js +42 -8
- package/dist/components/ui/Badge.js.map +1 -1
- package/dist/components/ui/Button.d.ts +19 -8
- package/dist/components/ui/Button.d.ts.map +1 -1
- package/dist/components/ui/Button.js +35 -14
- package/dist/components/ui/Button.js.map +1 -1
- package/dist/components/ui/Card.d.ts +26 -0
- package/dist/components/ui/Card.d.ts.map +1 -0
- package/dist/components/ui/Card.js +45 -0
- package/dist/components/ui/Card.js.map +1 -0
- package/dist/components/ui/DataTable.js +1 -1
- package/dist/components/ui/Input.d.ts +15 -0
- package/dist/components/ui/Input.d.ts.map +1 -0
- package/dist/components/ui/Input.js +23 -0
- package/dist/components/ui/Input.js.map +1 -0
- package/dist/components/ui/SearchInput.js +1 -1
- package/dist/components/ui/Select.d.ts +16 -0
- package/dist/components/ui/Select.d.ts.map +1 -0
- package/dist/components/ui/Select.js +25 -0
- package/dist/components/ui/Select.js.map +1 -0
- package/dist/components/ui/Toast.js +1 -1
- package/dist/components/ui/index.d.ts +10 -4
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +5 -2
- package/dist/components/ui/index.js.map +1 -1
- package/dist/fields/BlockBuilderField.js +3 -3
- package/dist/fields/DateField.js +1 -1
- package/dist/fields/RelationshipField.js +3 -3
- package/dist/fields/TextField.js +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/Header.js +1 -1
- package/dist/layout/Layout.d.ts +14 -0
- package/dist/layout/Layout.d.ts.map +1 -1
- package/dist/layout/Layout.js +17 -11
- package/dist/layout/Layout.js.map +1 -1
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/Sidebar.js +21 -11
- package/dist/layout/Sidebar.js.map +1 -1
- package/dist/layout/primitives/AdminShell.d.ts +43 -0
- package/dist/layout/primitives/AdminShell.d.ts.map +1 -0
- package/dist/layout/primitives/AdminShell.js +51 -0
- package/dist/layout/primitives/AdminShell.js.map +1 -0
- package/dist/layout/primitives/Box.d.ts +19 -0
- package/dist/layout/primitives/Box.d.ts.map +1 -0
- package/dist/layout/primitives/Box.js +12 -0
- package/dist/layout/primitives/Box.js.map +1 -0
- package/dist/layout/primitives/Cluster.d.ts +27 -0
- package/dist/layout/primitives/Cluster.d.ts.map +1 -0
- package/dist/layout/primitives/Cluster.js +37 -0
- package/dist/layout/primitives/Cluster.js.map +1 -0
- package/dist/layout/primitives/Grid.d.ts +45 -0
- package/dist/layout/primitives/Grid.d.ts.map +1 -0
- package/dist/layout/primitives/Grid.js +59 -0
- package/dist/layout/primitives/Grid.js.map +1 -0
- package/dist/layout/primitives/PageContainer.d.ts +36 -0
- package/dist/layout/primitives/PageContainer.d.ts.map +1 -0
- package/dist/layout/primitives/PageContainer.js +41 -0
- package/dist/layout/primitives/PageContainer.js.map +1 -0
- package/dist/layout/primitives/Split.d.ts +34 -0
- package/dist/layout/primitives/Split.d.ts.map +1 -0
- package/dist/layout/primitives/Split.js +27 -0
- package/dist/layout/primitives/Split.js.map +1 -0
- package/dist/layout/primitives/Stack.d.ts +23 -0
- package/dist/layout/primitives/Stack.d.ts.map +1 -0
- package/dist/layout/primitives/Stack.js +34 -0
- package/dist/layout/primitives/Stack.js.map +1 -0
- package/dist/layout/primitives/index.d.ts +30 -0
- package/dist/layout/primitives/index.d.ts.map +1 -0
- package/dist/layout/primitives/index.js +22 -0
- package/dist/layout/primitives/index.js.map +1 -0
- package/dist/layout/primitives/tokens.d.ts +48 -0
- package/dist/layout/primitives/tokens.d.ts.map +1 -0
- package/dist/layout/primitives/tokens.js +54 -0
- package/dist/layout/primitives/tokens.js.map +1 -0
- package/dist/lib/cv.d.ts +53 -0
- package/dist/lib/cv.d.ts.map +1 -0
- package/dist/lib/cv.js +39 -0
- package/dist/lib/cv.js.map +1 -0
- package/dist/views/ApiKeys.d.ts.map +1 -1
- package/dist/views/ApiKeys.js +13 -11
- package/dist/views/ApiKeys.js.map +1 -1
- package/dist/views/CollectionList.js +8 -8
- package/dist/views/Dashboard.d.ts.map +1 -1
- package/dist/views/Dashboard.js +333 -78
- package/dist/views/Dashboard.js.map +1 -1
- package/dist/views/DocumentEdit.d.ts.map +1 -1
- package/dist/views/DocumentEdit.js +17 -5
- package/dist/views/DocumentEdit.js.map +1 -1
- package/dist/views/ForgotPassword.js +2 -2
- package/dist/views/FormEditor.js +5 -5
- package/dist/views/FormSubmissions.js +6 -6
- package/dist/views/Forms.js +2 -2
- package/dist/views/Login.d.ts +16 -1
- package/dist/views/Login.d.ts.map +1 -1
- package/dist/views/Login.js +17 -7
- package/dist/views/Login.js.map +1 -1
- package/dist/views/MediaBrowser.js +16 -16
- package/dist/views/PageEditor.js +2 -2
- package/dist/views/Pages.js +10 -10
- package/dist/views/PostEditor.js +2 -2
- package/dist/views/Posts.js +4 -4
- package/dist/views/Redirects.js +4 -4
- package/dist/views/ResetPassword.js +2 -2
- package/dist/views/SEO.js +6 -6
- package/dist/views/ScriptTagEditor.js +4 -4
- package/dist/views/ScriptTags.js +2 -2
- package/dist/views/Settings.d.ts.map +1 -1
- package/dist/views/Settings.js +9 -8
- package/dist/views/Settings.js.map +1 -1
- package/dist/views/SetupWizard.js +2 -2
- package/dist/views/Users.js +4 -4
- package/dist/views/page-builder/AIBlockAssist.js +1 -1
- package/dist/views/page-builder/AIGenerateDialog.js +10 -10
- package/dist/views/page-builder/BlockEditor.js +10 -10
- package/dist/views/page-builder/BlockPicker.js +4 -4
- package/dist/views/page-builder/BottomBar.js +1 -1
- package/dist/views/page-builder/BuilderToolbar.js +2 -2
- package/dist/views/page-builder/ContextPanel.js +2 -2
- package/dist/views/page-builder/DesignScore.js +9 -9
- package/dist/views/page-builder/NodeSettings.js +8 -8
- package/dist/views/page-builder/PageBuilder.js +3 -3
- package/dist/views/page-builder/PageSettings.js +1 -1
- package/dist/views/page-builder/PageTemplates.js +2 -2
- package/dist/views/page-builder/SEOPanel.js +13 -13
- package/dist/views/page-builder/SavedSections.js +5 -5
- package/dist/views/page-builder/TemplatePicker.js +2 -2
- package/dist/views/page-builder/block-renderers/CTAPreview.js +5 -5
- package/dist/views/page-builder/block-renderers/CardsPreview.js +1 -1
- package/dist/views/page-builder/block-renderers/CodePreview.js +1 -1
- package/dist/views/page-builder/block-renderers/FAQPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/FallbackPreview.js +1 -1
- package/dist/views/page-builder/block-renderers/FormPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/GalleryPreview.js +5 -5
- package/dist/views/page-builder/block-renderers/HeroPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/ImagePreview.js +3 -3
- package/dist/views/page-builder/block-renderers/TextPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/VideoPreview.js +4 -4
- package/dist/views/page-builder/canvas/BlockRenderer.js +1 -1
- package/dist/views/page-builder/canvas/BuilderCanvas.js +3 -3
- package/dist/views/page-builder/canvas/ColumnRenderer.js +2 -2
- package/dist/views/page-builder/canvas/ContainerRenderer.js +2 -2
- package/dist/views/page-builder/canvas/RowRenderer.js +2 -2
- package/dist/views/page-builder/canvas/SectionRenderer.js +2 -2
- package/package.json +6 -2
- package/src/AdminRoot.tsx +21 -11
- package/src/__tests__/layout/primitives.test.ts +37 -0
- package/src/__tests__/lib/cv.test.ts +74 -0
- package/src/assets/actuate-logo.tsx +72 -0
- package/src/components/Breadcrumbs.tsx +6 -6
- package/src/components/CommandPalette.tsx +34 -34
- package/src/components/ContentOverviewChart.tsx +3 -3
- package/src/components/ErrorBoundary.tsx +3 -3
- package/src/components/FocalPointPicker.tsx +4 -4
- package/src/components/FolderTree.tsx +38 -38
- package/src/components/LivePreview.tsx +16 -16
- package/src/components/LocaleSwitcher.tsx +7 -7
- package/src/components/MediaPickerModal.tsx +21 -21
- package/src/components/PresenceIndicator.tsx +2 -2
- package/src/components/SEOConfigPanel.tsx +582 -0
- package/src/components/SEOPanel.tsx +46 -46
- package/src/components/SEOPerformance.tsx +21 -21
- package/src/components/SchedulePublishDialog.tsx +241 -0
- package/src/components/SharePreviewLinkDialog.tsx +227 -0
- package/src/components/TipTapEditor.tsx +33 -33
- package/src/components/VersionHistory.tsx +16 -16
- package/src/components/ui/Badge.tsx +66 -14
- package/src/components/ui/Button.tsx +70 -33
- package/src/components/ui/Card.tsx +101 -0
- package/src/components/ui/DataTable.tsx +1 -1
- package/src/components/ui/Input.tsx +35 -0
- package/src/components/ui/SearchInput.tsx +4 -4
- package/src/components/ui/Select.tsx +56 -0
- package/src/components/ui/Toast.tsx +1 -1
- package/src/components/ui/index.ts +18 -4
- package/src/fields/BlockBuilderField.tsx +3 -3
- package/src/fields/DateField.tsx +1 -1
- package/src/fields/RelationshipField.tsx +10 -10
- package/src/fields/TextField.tsx +1 -1
- package/src/index.ts +32 -0
- package/src/layout/Header.tsx +28 -28
- package/src/layout/Layout.tsx +39 -46
- package/src/layout/Sidebar.tsx +37 -64
- package/src/layout/primitives/AdminShell.tsx +118 -0
- package/src/layout/primitives/Box.tsx +30 -0
- package/src/layout/primitives/Cluster.tsx +74 -0
- package/src/layout/primitives/Grid.tsx +120 -0
- package/src/layout/primitives/PageContainer.tsx +96 -0
- package/src/layout/primitives/Split.tsx +73 -0
- package/src/layout/primitives/Stack.tsx +67 -0
- package/src/layout/primitives/index.ts +36 -0
- package/src/layout/primitives/tokens.ts +76 -0
- package/src/lib/cv.ts +96 -0
- package/src/styles/build-input.css +1 -1
- package/src/views/ApiKeys.tsx +57 -57
- package/src/views/CollectionList.tsx +30 -30
- package/src/views/Dashboard.tsx +737 -186
- package/src/views/DocumentEdit.tsx +90 -10
- package/src/views/ForgotPassword.tsx +18 -18
- package/src/views/FormEditor.tsx +75 -75
- package/src/views/FormSubmissions.tsx +76 -76
- package/src/views/Forms.tsx +27 -27
- package/src/views/Login.tsx +65 -25
- package/src/views/MediaBrowser.tsx +127 -127
- package/src/views/PageEditor.tsx +25 -25
- package/src/views/Pages.tsx +59 -59
- package/src/views/PostEditor.tsx +37 -37
- package/src/views/Posts.tsx +48 -48
- package/src/views/Redirects.tsx +21 -21
- package/src/views/ResetPassword.tsx +28 -28
- package/src/views/SEO.tsx +144 -144
- package/src/views/ScriptTagEditor.tsx +24 -24
- package/src/views/ScriptTags.tsx +10 -10
- package/src/views/Settings.tsx +88 -80
- package/src/views/SetupWizard.tsx +28 -28
- package/src/views/Users.tsx +20 -20
- package/src/views/page-builder/AIBlockAssist.tsx +1 -1
- package/src/views/page-builder/AIGenerateDialog.tsx +63 -63
- package/src/views/page-builder/BlockEditor.tsx +26 -26
- package/src/views/page-builder/BlockPicker.tsx +22 -22
- package/src/views/page-builder/BottomBar.tsx +8 -8
- package/src/views/page-builder/BuilderToolbar.tsx +17 -17
- package/src/views/page-builder/ContextPanel.tsx +3 -3
- package/src/views/page-builder/DesignScore.tsx +21 -21
- package/src/views/page-builder/NodeSettings.tsx +27 -27
- package/src/views/page-builder/PageBuilder.tsx +11 -11
- package/src/views/page-builder/PageSettings.tsx +4 -4
- package/src/views/page-builder/PageTemplates.tsx +18 -18
- package/src/views/page-builder/SEOPanel.tsx +53 -53
- package/src/views/page-builder/SavedSections.tsx +37 -37
- package/src/views/page-builder/TemplatePicker.tsx +17 -17
- package/src/views/page-builder/block-renderers/CTAPreview.tsx +13 -13
- package/src/views/page-builder/block-renderers/CardsPreview.tsx +5 -5
- package/src/views/page-builder/block-renderers/CodePreview.tsx +6 -6
- package/src/views/page-builder/block-renderers/FAQPreview.tsx +13 -13
- package/src/views/page-builder/block-renderers/FallbackPreview.tsx +3 -3
- package/src/views/page-builder/block-renderers/FormPreview.tsx +20 -20
- package/src/views/page-builder/block-renderers/GalleryPreview.tsx +8 -8
- package/src/views/page-builder/block-renderers/HeroPreview.tsx +16 -16
- package/src/views/page-builder/block-renderers/ImagePreview.tsx +4 -4
- package/src/views/page-builder/block-renderers/TextPreview.tsx +14 -14
- package/src/views/page-builder/block-renderers/VideoPreview.tsx +12 -12
- package/src/views/page-builder/canvas/BlockRenderer.tsx +4 -4
- package/src/views/page-builder/canvas/BuilderCanvas.tsx +6 -6
- package/src/views/page-builder/canvas/ColumnRenderer.tsx +3 -3
- package/src/views/page-builder/canvas/ContainerRenderer.tsx +2 -2
- package/src/views/page-builder/canvas/RowRenderer.tsx +2 -2
- package/src/views/page-builder/canvas/SectionRenderer.tsx +2 -2
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
3
|
import { useState, useEffect, useCallback, useRef } from 'react'
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
AlertTriangle,
|
|
6
|
+
Calendar,
|
|
7
|
+
Eye,
|
|
8
|
+
EyeOff,
|
|
9
|
+
Save,
|
|
10
|
+
Copy,
|
|
11
|
+
Loader2,
|
|
12
|
+
Clock,
|
|
13
|
+
Share2,
|
|
14
|
+
XCircle,
|
|
15
|
+
} from 'lucide-react'
|
|
5
16
|
import { toast } from 'sonner'
|
|
6
17
|
import { FieldRenderer } from '../fields/FieldRenderer.js'
|
|
7
18
|
import { RelationshipField } from '../fields/RelationshipField.js'
|
|
@@ -12,6 +23,8 @@ import { VersionHistory } from '../components/VersionHistory.js'
|
|
|
12
23
|
import { PresenceIndicator } from '../components/PresenceIndicator.js'
|
|
13
24
|
import { SEOPanel } from '../components/SEOPanel.js'
|
|
14
25
|
import type { SEOData } from '../components/SEOPanel.js'
|
|
26
|
+
import { SchedulePublishDialog } from '../components/SchedulePublishDialog.js'
|
|
27
|
+
import { SharePreviewLinkDialog } from '../components/SharePreviewLinkDialog.js'
|
|
15
28
|
import { cmsApi } from '../lib/api.js'
|
|
16
29
|
|
|
17
30
|
export interface DocumentEditProps {
|
|
@@ -40,7 +53,11 @@ export function DocumentEdit({
|
|
|
40
53
|
const [loading, setLoading] = useState(!isNew)
|
|
41
54
|
const [showPreview, setShowPreview] = useState(false)
|
|
42
55
|
const [showVersions, setShowVersions] = useState(false)
|
|
56
|
+
const [showSchedule, setShowSchedule] = useState(false)
|
|
57
|
+
const [showShareLink, setShowShareLink] = useState(false)
|
|
43
58
|
const [docStatus, setDocStatus] = useState<string>('DRAFT')
|
|
59
|
+
const [scheduledAt, setScheduledAt] = useState<string | null>(null)
|
|
60
|
+
const [scheduledUnpublishAt, setScheduledUnpublishAt] = useState<string | null>(null)
|
|
44
61
|
const hasLoadedRef = useRef(false)
|
|
45
62
|
|
|
46
63
|
const collections = config?.collections
|
|
@@ -125,6 +142,8 @@ export function DocumentEdit({
|
|
|
125
142
|
setValues(merged)
|
|
126
143
|
setInitialValues(merged)
|
|
127
144
|
setDocStatus(doc.status ?? 'DRAFT')
|
|
145
|
+
setScheduledAt(doc.scheduledAt ?? null)
|
|
146
|
+
setScheduledUnpublishAt(doc.scheduledUnpublishAt ?? null)
|
|
128
147
|
|
|
129
148
|
const loadedSeo: SEOData = {}
|
|
130
149
|
for (const key of SEO_FIELDS) {
|
|
@@ -279,8 +298,8 @@ export function DocumentEdit({
|
|
|
279
298
|
|
|
280
299
|
if (loading) {
|
|
281
300
|
return (
|
|
282
|
-
<div className="flex items-center justify-center
|
|
283
|
-
<Loader2 className="
|
|
301
|
+
<div className="flex min-h-[300px] items-center justify-center">
|
|
302
|
+
<Loader2 className="h-8 w-8 animate-spin text-gray-400" />
|
|
284
303
|
</div>
|
|
285
304
|
)
|
|
286
305
|
}
|
|
@@ -291,12 +310,12 @@ export function DocumentEdit({
|
|
|
291
310
|
<div className="flex items-center gap-3">
|
|
292
311
|
<h1 className="text-2xl font-bold">{displayTitle}</h1>
|
|
293
312
|
<span
|
|
294
|
-
className={`inline-flex items-center px-2.5 py-0.5
|
|
313
|
+
className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${statusColor}`}
|
|
295
314
|
>
|
|
296
315
|
{docStatus}
|
|
297
316
|
</span>
|
|
298
317
|
{documentId && <PresenceIndicator documentId={documentId} />}
|
|
299
|
-
{isDirty && <span className="text-xs text-amber-600
|
|
318
|
+
{isDirty && <span className="text-xs font-medium text-amber-600">Unsaved changes</span>}
|
|
300
319
|
</div>
|
|
301
320
|
<div className="flex items-center gap-2">
|
|
302
321
|
<button
|
|
@@ -309,6 +328,14 @@ export function DocumentEdit({
|
|
|
309
328
|
</button>
|
|
310
329
|
{!isNew && (
|
|
311
330
|
<>
|
|
331
|
+
<button
|
|
332
|
+
onClick={() => setShowShareLink(true)}
|
|
333
|
+
className="inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-sm text-[var(--muted-foreground)] hover:bg-[var(--muted)] hover:text-[var(--foreground)]"
|
|
334
|
+
title="Share a signed preview link for the current draft"
|
|
335
|
+
>
|
|
336
|
+
<Share2 className="h-4 w-4" />
|
|
337
|
+
Share preview
|
|
338
|
+
</button>
|
|
312
339
|
<button
|
|
313
340
|
onClick={() => setShowVersions(true)}
|
|
314
341
|
className="inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-sm text-[var(--muted-foreground)] hover:bg-[var(--muted)] hover:text-[var(--foreground)]"
|
|
@@ -333,11 +360,11 @@ export function DocumentEdit({
|
|
|
333
360
|
<div className={showPreview ? 'grid grid-cols-2 gap-6' : ''}>
|
|
334
361
|
<div className="space-y-6">
|
|
335
362
|
{fields.length === 0 ? (
|
|
336
|
-
<div className="flex flex-col items-center justify-center
|
|
337
|
-
<div className="
|
|
338
|
-
<AlertTriangle className="
|
|
363
|
+
<div className="flex flex-col items-center justify-center rounded-lg border border-[var(--border)] py-16 text-center">
|
|
364
|
+
<div className="mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-gray-100">
|
|
365
|
+
<AlertTriangle className="h-6 w-6 text-gray-400" />
|
|
339
366
|
</div>
|
|
340
|
-
<h3 className="text-sm font-medium text-gray-900
|
|
367
|
+
<h3 className="mb-1 text-sm font-medium text-gray-900">
|
|
341
368
|
Collection schema not found
|
|
342
369
|
</h3>
|
|
343
370
|
<p className="text-sm text-gray-500">No fields are defined for this collection.</p>
|
|
@@ -379,6 +406,31 @@ export function DocumentEdit({
|
|
|
379
406
|
Unpublish
|
|
380
407
|
</Button>
|
|
381
408
|
)}
|
|
409
|
+
{!isNew && (
|
|
410
|
+
<button
|
|
411
|
+
onClick={() => setShowSchedule(true)}
|
|
412
|
+
className="inline-flex w-full items-center justify-center gap-1.5 rounded-md border border-[var(--border)] bg-white px-3 py-1.5 text-sm font-medium text-gray-700 hover:bg-gray-50"
|
|
413
|
+
>
|
|
414
|
+
<Calendar className="h-4 w-4" />
|
|
415
|
+
{scheduledAt || scheduledUnpublishAt ? 'Reschedule' : 'Schedule'}
|
|
416
|
+
</button>
|
|
417
|
+
)}
|
|
418
|
+
{!isNew && (scheduledAt || scheduledUnpublishAt) && (
|
|
419
|
+
<div className="space-y-1 rounded-md border border-blue-100 bg-blue-50 px-3 py-2 text-xs text-blue-900">
|
|
420
|
+
{scheduledAt && (
|
|
421
|
+
<div className="flex items-center gap-1.5">
|
|
422
|
+
<Calendar className="h-3.5 w-3.5" />
|
|
423
|
+
Publishes {new Date(scheduledAt).toLocaleString()}
|
|
424
|
+
</div>
|
|
425
|
+
)}
|
|
426
|
+
{scheduledUnpublishAt && (
|
|
427
|
+
<div className="flex items-center gap-1.5">
|
|
428
|
+
<XCircle className="h-3.5 w-3.5" />
|
|
429
|
+
Unpublishes {new Date(scheduledUnpublishAt).toLocaleString()}
|
|
430
|
+
</div>
|
|
431
|
+
)}
|
|
432
|
+
</div>
|
|
433
|
+
)}
|
|
382
434
|
</div>
|
|
383
435
|
</div>
|
|
384
436
|
|
|
@@ -465,7 +517,7 @@ export function DocumentEdit({
|
|
|
465
517
|
Cancel
|
|
466
518
|
</Button>
|
|
467
519
|
<Button variant="primary" loading={saving} onClick={handleSave} data-shortcut="save">
|
|
468
|
-
<Save className="h-4 w-4
|
|
520
|
+
<Save className="mr-1.5 h-4 w-4" />
|
|
469
521
|
{isNew ? 'Create' : 'Save Changes'}
|
|
470
522
|
</Button>
|
|
471
523
|
</div>
|
|
@@ -495,6 +547,34 @@ export function DocumentEdit({
|
|
|
495
547
|
}}
|
|
496
548
|
/>
|
|
497
549
|
)}
|
|
550
|
+
|
|
551
|
+
{!isNew && documentId && (
|
|
552
|
+
<SchedulePublishDialog
|
|
553
|
+
collectionSlug={collectionSlug}
|
|
554
|
+
documentId={documentId}
|
|
555
|
+
scheduledAt={scheduledAt}
|
|
556
|
+
scheduledUnpublishAt={scheduledUnpublishAt}
|
|
557
|
+
open={showSchedule}
|
|
558
|
+
onClose={() => setShowSchedule(false)}
|
|
559
|
+
onScheduled={(next) => {
|
|
560
|
+
setDocStatus(next.status)
|
|
561
|
+
setScheduledAt(next.scheduledAt)
|
|
562
|
+
setScheduledUnpublishAt(next.scheduledUnpublishAt)
|
|
563
|
+
}}
|
|
564
|
+
/>
|
|
565
|
+
)}
|
|
566
|
+
|
|
567
|
+
{!isNew && documentId && (
|
|
568
|
+
<SharePreviewLinkDialog
|
|
569
|
+
collectionSlug={collectionSlug}
|
|
570
|
+
documentId={documentId}
|
|
571
|
+
documentSlug={docSlug}
|
|
572
|
+
siteUrl={config?.siteUrl}
|
|
573
|
+
urlPrefix={collection?.urlPrefix ?? collectionSlug}
|
|
574
|
+
open={showShareLink}
|
|
575
|
+
onClose={() => setShowShareLink(false)}
|
|
576
|
+
/>
|
|
577
|
+
)}
|
|
498
578
|
</div>
|
|
499
579
|
)
|
|
500
580
|
}
|
|
@@ -42,25 +42,25 @@ export function ForgotPassword({ onNavigate }: ForgotPasswordProps) {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
return (
|
|
45
|
-
<div className="min-h-screen
|
|
45
|
+
<div className="flex min-h-screen items-center justify-center bg-gray-50 px-4">
|
|
46
46
|
<div className="w-full max-w-md">
|
|
47
|
-
<div className="text-center
|
|
48
|
-
<div className="mx-auto mb-4
|
|
49
|
-
<Shield className="
|
|
47
|
+
<div className="mb-8 text-center">
|
|
48
|
+
<div className="mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-xl bg-blue-600">
|
|
49
|
+
<Shield className="h-7 w-7 text-white" />
|
|
50
50
|
</div>
|
|
51
51
|
<h1 className="text-2xl font-bold text-gray-900">Reset Password</h1>
|
|
52
|
-
<p className="text-gray-600
|
|
52
|
+
<p className="mt-2 text-gray-600">
|
|
53
53
|
{sent
|
|
54
54
|
? 'Check your inbox for a reset link'
|
|
55
55
|
: "Enter your email and we'll send you a reset link"}
|
|
56
56
|
</p>
|
|
57
57
|
</div>
|
|
58
58
|
|
|
59
|
-
<div className="
|
|
59
|
+
<div className="space-y-5 rounded-xl border border-gray-200 bg-white p-6 shadow-sm">
|
|
60
60
|
{sent ? (
|
|
61
|
-
<div className="
|
|
62
|
-
<div className="mx-auto
|
|
63
|
-
<CheckCircle2 className="
|
|
61
|
+
<div className="space-y-4 text-center">
|
|
62
|
+
<div className="mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-green-100">
|
|
63
|
+
<CheckCircle2 className="h-6 w-6 text-green-600" />
|
|
64
64
|
</div>
|
|
65
65
|
<p className="text-sm text-gray-600">
|
|
66
66
|
If an account exists for <strong>{email}</strong>, you will receive a password reset
|
|
@@ -72,7 +72,7 @@ export function ForgotPassword({ onNavigate }: ForgotPasswordProps) {
|
|
|
72
72
|
<button
|
|
73
73
|
type="button"
|
|
74
74
|
onClick={() => onNavigate('/login')}
|
|
75
|
-
className="w-full
|
|
75
|
+
className="w-full rounded-lg bg-blue-600 py-2.5 font-medium text-white transition-colors hover:bg-blue-700"
|
|
76
76
|
>
|
|
77
77
|
Back to Sign In
|
|
78
78
|
</button>
|
|
@@ -80,8 +80,8 @@ export function ForgotPassword({ onNavigate }: ForgotPasswordProps) {
|
|
|
80
80
|
) : (
|
|
81
81
|
<form onSubmit={handleSubmit} className="space-y-5">
|
|
82
82
|
{error && (
|
|
83
|
-
<div className="flex items-start gap-3
|
|
84
|
-
<AlertTriangle className="
|
|
83
|
+
<div className="flex items-start gap-3 rounded-lg border border-red-200 bg-red-50 p-3">
|
|
84
|
+
<AlertTriangle className="mt-0.5 h-5 w-5 shrink-0 text-red-600" />
|
|
85
85
|
<p className="text-sm text-red-800">{error}</p>
|
|
86
86
|
</div>
|
|
87
87
|
)}
|
|
@@ -89,7 +89,7 @@ export function ForgotPassword({ onNavigate }: ForgotPasswordProps) {
|
|
|
89
89
|
<div>
|
|
90
90
|
<label
|
|
91
91
|
htmlFor="forgot-email"
|
|
92
|
-
className="block text-sm font-medium text-gray-700
|
|
92
|
+
className="mb-1.5 block text-sm font-medium text-gray-700"
|
|
93
93
|
>
|
|
94
94
|
Email Address
|
|
95
95
|
</label>
|
|
@@ -99,7 +99,7 @@ export function ForgotPassword({ onNavigate }: ForgotPasswordProps) {
|
|
|
99
99
|
value={email}
|
|
100
100
|
onChange={(e) => setEmail(e.target.value)}
|
|
101
101
|
placeholder="admin@example.com"
|
|
102
|
-
className="w-full
|
|
102
|
+
className="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500 focus:outline-none"
|
|
103
103
|
required
|
|
104
104
|
autoFocus
|
|
105
105
|
autoComplete="email"
|
|
@@ -109,11 +109,11 @@ export function ForgotPassword({ onNavigate }: ForgotPasswordProps) {
|
|
|
109
109
|
<button
|
|
110
110
|
type="submit"
|
|
111
111
|
disabled={!canSubmit}
|
|
112
|
-
className="w-full
|
|
112
|
+
className="flex w-full items-center justify-center gap-2 rounded-lg bg-blue-600 py-2.5 font-medium text-white transition-colors hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-50"
|
|
113
113
|
>
|
|
114
114
|
{submitting ? (
|
|
115
115
|
<>
|
|
116
|
-
<Loader2 className="
|
|
116
|
+
<Loader2 className="h-4 w-4 animate-spin" />
|
|
117
117
|
Sending...
|
|
118
118
|
</>
|
|
119
119
|
) : (
|
|
@@ -127,9 +127,9 @@ export function ForgotPassword({ onNavigate }: ForgotPasswordProps) {
|
|
|
127
127
|
<button
|
|
128
128
|
type="button"
|
|
129
129
|
onClick={() => onNavigate('/login')}
|
|
130
|
-
className="w-full
|
|
130
|
+
className="flex w-full items-center justify-center gap-2 text-sm text-gray-600 transition-colors hover:text-gray-800"
|
|
131
131
|
>
|
|
132
|
-
<ArrowLeft className="
|
|
132
|
+
<ArrowLeft className="h-4 w-4" />
|
|
133
133
|
Back to Sign In
|
|
134
134
|
</button>
|
|
135
135
|
)}
|