@actuate-media/cms-admin 0.75.0 → 0.76.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.
Files changed (34) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/__tests__/lib/post-editor-service.test.js +2 -0
  3. package/dist/__tests__/lib/post-editor-service.test.js.map +1 -1
  4. package/dist/__tests__/views/editor-top-bar.render.test.js +12 -0
  5. package/dist/__tests__/views/editor-top-bar.render.test.js.map +1 -1
  6. package/dist/__tests__/views/post-fields-modal.render.test.js +2 -0
  7. package/dist/__tests__/views/post-fields-modal.render.test.js.map +1 -1
  8. package/dist/lib/page-editor-service.d.ts +2 -0
  9. package/dist/lib/page-editor-service.d.ts.map +1 -1
  10. package/dist/lib/page-editor-service.js +4 -0
  11. package/dist/lib/page-editor-service.js.map +1 -1
  12. package/dist/lib/post-editor-service.d.ts +3 -0
  13. package/dist/lib/post-editor-service.d.ts.map +1 -1
  14. package/dist/lib/post-editor-service.js +4 -0
  15. package/dist/lib/post-editor-service.js.map +1 -1
  16. package/dist/views/page-editor/EditorTopBar.d.ts +7 -1
  17. package/dist/views/page-editor/EditorTopBar.d.ts.map +1 -1
  18. package/dist/views/page-editor/EditorTopBar.js +35 -4
  19. package/dist/views/page-editor/EditorTopBar.js.map +1 -1
  20. package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
  21. package/dist/views/page-editor/PageSectionEditor.js +35 -2
  22. package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
  23. package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
  24. package/dist/views/post-editor/PostSectionEditor.js +35 -1
  25. package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
  26. package/package.json +3 -3
  27. package/src/__tests__/lib/post-editor-service.test.ts +2 -0
  28. package/src/__tests__/views/editor-top-bar.render.test.tsx +24 -0
  29. package/src/__tests__/views/post-fields-modal.render.test.tsx +2 -0
  30. package/src/lib/page-editor-service.ts +8 -0
  31. package/src/lib/post-editor-service.ts +8 -0
  32. package/src/views/page-editor/EditorTopBar.tsx +69 -0
  33. package/src/views/page-editor/PageSectionEditor.tsx +55 -0
  34. package/src/views/post-editor/PostSectionEditor.tsx +55 -0
@@ -4,6 +4,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react'
4
4
  import { AlertTriangle, Loader2, Lock } from 'lucide-react'
5
5
  import { toast } from 'sonner'
6
6
  import { ConfirmDialog } from '../../components/ui/ConfirmDialog.js'
7
+ import { SchedulePublishDialog } from '../../components/SchedulePublishDialog.js'
7
8
  import { EditorSeoAside } from '../../components/EditorSeoAside.js'
8
9
  import { ErrorBoundary } from '../../components/ErrorBoundary.js'
9
10
  import { VersionHistory } from '../../components/VersionHistory.js'
@@ -128,6 +129,7 @@ export function PostSectionEditor({
128
129
  const [historyOpen, setHistoryOpen] = useState(false)
129
130
  const [deleteTargetId, setDeleteTargetId] = useState<string | null>(null)
130
131
  const [confirmPublish, setConfirmPublish] = useState(false)
132
+ const [scheduleOpen, setScheduleOpen] = useState(false)
131
133
  const [leaveTarget, setLeaveTarget] = useState<string | null>(null)
132
134
  const [validation, setValidation] = useState<ValidationResult | null>(null)
133
135
 
@@ -375,6 +377,43 @@ export function PostSectionEditor({
375
377
  setConfirmPublish(true)
376
378
  }, [post])
377
379
 
380
+ const requestSchedule = useCallback(async () => {
381
+ if (!post) return
382
+ if (!post.id) {
383
+ toast.error('Save the post before scheduling')
384
+ return
385
+ }
386
+ const result = validatePost(post, true)
387
+ setValidation(result.errors.length || result.warnings.length ? result : null)
388
+ if (result.errors.length > 0) {
389
+ toast.error('Resolve the listed issues before scheduling')
390
+ return
391
+ }
392
+ if (dirty) {
393
+ const ok = await handleSaveDraft()
394
+ if (!ok) return
395
+ }
396
+ setScheduleOpen(true)
397
+ }, [post, dirty, handleSaveDraft])
398
+
399
+ const handleScheduled = useCallback(
400
+ (next: { status: string; scheduledAt: string | null; scheduledUnpublishAt: string | null }) => {
401
+ setPost((prev) =>
402
+ prev
403
+ ? {
404
+ ...prev,
405
+ status: next.status as EditorPost['status'],
406
+ scheduledAt: next.scheduledAt,
407
+ scheduledUnpublishAt: next.scheduledUnpublishAt,
408
+ publishDate: next.scheduledAt ?? prev.publishDate,
409
+ }
410
+ : prev,
411
+ )
412
+ setValidation(null)
413
+ },
414
+ [],
415
+ )
416
+
378
417
  const doPublish = useCallback(async () => {
379
418
  if (!post) return
380
419
  setPublishing(true)
@@ -576,6 +615,10 @@ export function PostSectionEditor({
576
615
  seoScore={liveSeoScore}
577
616
  onSaveDraft={handleSaveDraft}
578
617
  onPublish={requestPublish}
618
+ onSchedule={post.id ? requestSchedule : undefined}
619
+ scheduleReady={Boolean(post.id)}
620
+ scheduledAt={post.scheduledAt}
621
+ scheduledUnpublishAt={post.scheduledUnpublishAt}
579
622
  structuralTypes={structuralTypes}
580
623
  />
581
624
 
@@ -718,6 +761,18 @@ export function PostSectionEditor({
718
761
  confirmLabel="Publish"
719
762
  />
720
763
 
764
+ {post.id && (
765
+ <SchedulePublishDialog
766
+ collectionSlug={postType}
767
+ documentId={post.id}
768
+ scheduledAt={post.scheduledAt}
769
+ scheduledUnpublishAt={post.scheduledUnpublishAt}
770
+ open={scheduleOpen}
771
+ onClose={() => setScheduleOpen(false)}
772
+ onScheduled={handleScheduled}
773
+ />
774
+ )}
775
+
721
776
  <ConfirmDialog
722
777
  open={leaveTarget !== null}
723
778
  onClose={() => setLeaveTarget(null)}