convex-cms 0.0.15 → 0.0.16
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/README.md +18 -18
- package/admin/dist/types/admin/src/components/AdminLayout.d.ts +7 -0
- package/admin/dist/types/admin/src/components/AdminLayout.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/BreakingChangesWarningDialog.d.ts +11 -0
- package/admin/dist/types/admin/src/components/BreakingChangesWarningDialog.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/BulkActionBar.d.ts +8 -0
- package/admin/dist/types/admin/src/components/BulkActionBar.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/BulkOperationModal.d.ts +16 -0
- package/admin/dist/types/admin/src/components/BulkOperationModal.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ContentEntryEditor.d.ts +42 -0
- package/admin/dist/types/admin/src/components/ContentEntryEditor.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ContentTypeFormModal.d.ts +13 -0
- package/admin/dist/types/admin/src/components/ContentTypeFormModal.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ErrorBoundary.d.ts +35 -0
- package/admin/dist/types/admin/src/components/ErrorBoundary.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ErrorState.d.ts +52 -0
- package/admin/dist/types/admin/src/components/ErrorState.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/FieldGroupSection.d.ts +23 -0
- package/admin/dist/types/admin/src/components/FieldGroupSection.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/Header.d.ts +2 -0
- package/admin/dist/types/admin/src/components/Header.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/RouteGuard.d.ts +70 -0
- package/admin/dist/types/admin/src/components/RouteGuard.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/SchemaDriftWarning.d.ts +13 -0
- package/admin/dist/types/admin/src/components/SchemaDriftWarning.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/Sidebar.d.ts +2 -0
- package/admin/dist/types/admin/src/components/Sidebar.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/TaxonomyEditor.d.ts +19 -0
- package/admin/dist/types/admin/src/components/TaxonomyEditor.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/TermTree.d.ts +8 -0
- package/admin/dist/types/admin/src/components/TermTree.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/UploadDropzone.d.ts +20 -0
- package/admin/dist/types/admin/src/components/UploadDropzone.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/VersionCompare.d.ts +10 -0
- package/admin/dist/types/admin/src/components/VersionCompare.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/VersionHistory.d.ts +9 -0
- package/admin/dist/types/admin/src/components/VersionHistory.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/VersionRollbackModal.d.ts +11 -0
- package/admin/dist/types/admin/src/components/VersionRollbackModal.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsButton.d.ts +10 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsButton.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsDialog.d.ts +28 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsDialog.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsDropdown.d.ts +15 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsDropdown.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsEmptyState.d.ts +14 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsEmptyState.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsFilterBar.d.ts +25 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsFilterBar.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsInput.d.ts +6 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsInput.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsPageHeader.d.ts +9 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsPageHeader.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsPagination.d.ts +9 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsPagination.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsSelect.d.ts +16 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsSelect.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsStatCard.d.ts +16 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsStatCard.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsStatusBadge.d.ts +15 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsStatusBadge.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsSurface.d.ts +9 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsSurface.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsTable.d.ts +24 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsTable.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsToolbar.d.ts +14 -0
- package/admin/dist/types/admin/src/components/cmsds/CmsToolbar.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/cmsds/index.d.ts +15 -0
- package/admin/dist/types/admin/src/components/cmsds/index.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/editor/AutosaveIndicator.d.ts +12 -0
- package/admin/dist/types/admin/src/components/editor/AutosaveIndicator.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/editor/EditorContentPanel.d.ts +11 -0
- package/admin/dist/types/admin/src/components/editor/EditorContentPanel.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/editor/EditorModals.d.ts +29 -0
- package/admin/dist/types/admin/src/components/editor/EditorModals.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/editor/EditorPropertiesPanel.d.ts +24 -0
- package/admin/dist/types/admin/src/components/editor/EditorPropertiesPanel.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/editor/EditorToolbar.d.ts +38 -0
- package/admin/dist/types/admin/src/components/editor/EditorToolbar.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/editor/index.d.ts +6 -0
- package/admin/dist/types/admin/src/components/editor/index.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/ArrayObjectField.d.ts +3 -0
- package/admin/dist/types/admin/src/components/fields/ArrayObjectField.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/BooleanField.d.ts +3 -0
- package/admin/dist/types/admin/src/components/fields/BooleanField.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/CategoryField.d.ts +6 -0
- package/admin/dist/types/admin/src/components/fields/CategoryField.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/DateField.d.ts +3 -0
- package/admin/dist/types/admin/src/components/fields/DateField.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/DefaultFieldRenderer.d.ts +9 -0
- package/admin/dist/types/admin/src/components/fields/DefaultFieldRenderer.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/FieldRenderer.d.ts +23 -0
- package/admin/dist/types/admin/src/components/fields/FieldRenderer.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/FieldWrapper.d.ts +13 -0
- package/admin/dist/types/admin/src/components/fields/FieldWrapper.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/JsonField.d.ts +7 -0
- package/admin/dist/types/admin/src/components/fields/JsonField.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/MediaField.d.ts +6 -0
- package/admin/dist/types/admin/src/components/fields/MediaField.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/MoneyField.d.ts +3 -0
- package/admin/dist/types/admin/src/components/fields/MoneyField.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/MultiSelectField.d.ts +6 -0
- package/admin/dist/types/admin/src/components/fields/MultiSelectField.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/NumberField.d.ts +3 -0
- package/admin/dist/types/admin/src/components/fields/NumberField.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/ReferenceField.d.ts +6 -0
- package/admin/dist/types/admin/src/components/fields/ReferenceField.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/RichTextField.d.ts +3 -0
- package/admin/dist/types/admin/src/components/fields/RichTextField.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/SelectField.d.ts +6 -0
- package/admin/dist/types/admin/src/components/fields/SelectField.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/TagField.d.ts +6 -0
- package/admin/dist/types/admin/src/components/fields/TagField.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/TextAreaField.d.ts +3 -0
- package/admin/dist/types/admin/src/components/fields/TextAreaField.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/TextField.d.ts +3 -0
- package/admin/dist/types/admin/src/components/fields/TextField.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/registry.d.ts +18 -0
- package/admin/dist/types/admin/src/components/fields/registry.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/fields/types.d.ts +202 -0
- package/admin/dist/types/admin/src/components/fields/types.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/filters/TaxonomyFilter.d.ts +10 -0
- package/admin/dist/types/admin/src/components/filters/TaxonomyFilter.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/index.d.ts +9 -0
- package/admin/dist/types/admin/src/components/index.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/media/MediaAssetActions.d.ts +15 -0
- package/admin/dist/types/admin/src/components/media/MediaAssetActions.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/media/MediaAssetEditDialog.d.ts +17 -0
- package/admin/dist/types/admin/src/components/media/MediaAssetEditDialog.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/media/MediaBulkActionBar.d.ts +10 -0
- package/admin/dist/types/admin/src/components/media/MediaBulkActionBar.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/media/MediaFolderActions.d.ts +13 -0
- package/admin/dist/types/admin/src/components/media/MediaFolderActions.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/media/MediaFolderEditDialog.d.ts +14 -0
- package/admin/dist/types/admin/src/components/media/MediaFolderEditDialog.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/media/MediaMoveModal.d.ts +10 -0
- package/admin/dist/types/admin/src/components/media/MediaMoveModal.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/media/MediaPreviewModal.d.ts +27 -0
- package/admin/dist/types/admin/src/components/media/MediaPreviewModal.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/media/MediaTaxonomyPicker.d.ts +11 -0
- package/admin/dist/types/admin/src/components/media/MediaTaxonomyPicker.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/media/MediaTrashBulkActionBar.d.ts +11 -0
- package/admin/dist/types/admin/src/components/media/MediaTrashBulkActionBar.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/alert-dialog.d.ts +15 -0
- package/admin/dist/types/admin/src/components/ui/alert-dialog.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/alert.d.ts +10 -0
- package/admin/dist/types/admin/src/components/ui/alert.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/avatar.d.ts +7 -0
- package/admin/dist/types/admin/src/components/ui/avatar.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/badge.d.ts +10 -0
- package/admin/dist/types/admin/src/components/ui/badge.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/breadcrumb.d.ts +12 -0
- package/admin/dist/types/admin/src/components/ui/breadcrumb.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/button.d.ts +11 -0
- package/admin/dist/types/admin/src/components/ui/button.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/calendar.d.ts +9 -0
- package/admin/dist/types/admin/src/components/ui/calendar.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/card.d.ts +10 -0
- package/admin/dist/types/admin/src/components/ui/card.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/checkbox.d.ts +5 -0
- package/admin/dist/types/admin/src/components/ui/checkbox.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/collapsible.d.ts +7 -0
- package/admin/dist/types/admin/src/components/ui/collapsible.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/command.d.ts +19 -0
- package/admin/dist/types/admin/src/components/ui/command.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/dialog.d.ts +16 -0
- package/admin/dist/types/admin/src/components/ui/dialog.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/drawer.d.ts +14 -0
- package/admin/dist/types/admin/src/components/ui/drawer.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/dropdown-menu.d.ts +26 -0
- package/admin/dist/types/admin/src/components/ui/dropdown-menu.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/field.d.ts +25 -0
- package/admin/dist/types/admin/src/components/ui/field.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/input-group.d.ts +17 -0
- package/admin/dist/types/admin/src/components/ui/input-group.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/input.d.ts +4 -0
- package/admin/dist/types/admin/src/components/ui/input.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/label.d.ts +5 -0
- package/admin/dist/types/admin/src/components/ui/label.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/popover.d.ts +8 -0
- package/admin/dist/types/admin/src/components/ui/popover.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/scroll-area.d.ts +6 -0
- package/admin/dist/types/admin/src/components/ui/scroll-area.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/select.d.ts +16 -0
- package/admin/dist/types/admin/src/components/ui/select.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/separator.d.ts +5 -0
- package/admin/dist/types/admin/src/components/ui/separator.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/sheet.d.ts +14 -0
- package/admin/dist/types/admin/src/components/ui/sheet.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/sidebar.d.ts +70 -0
- package/admin/dist/types/admin/src/components/ui/sidebar.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/skeleton.d.ts +3 -0
- package/admin/dist/types/admin/src/components/ui/skeleton.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/spinner.d.ts +3 -0
- package/admin/dist/types/admin/src/components/ui/spinner.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/switch.d.ts +5 -0
- package/admin/dist/types/admin/src/components/ui/switch.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/table.d.ts +11 -0
- package/admin/dist/types/admin/src/components/ui/table.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/tabs.d.ts +8 -0
- package/admin/dist/types/admin/src/components/ui/tabs.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/textarea.d.ts +4 -0
- package/admin/dist/types/admin/src/components/ui/textarea.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/toggle-group.d.ts +10 -0
- package/admin/dist/types/admin/src/components/ui/toggle-group.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/toggle.d.ts +10 -0
- package/admin/dist/types/admin/src/components/ui/toggle.d.ts.map +1 -0
- package/admin/dist/types/admin/src/components/ui/tooltip.d.ts +8 -0
- package/admin/dist/types/admin/src/components/ui/tooltip.d.ts.map +1 -0
- package/admin/dist/types/admin/src/contexts/AdminConfigContext.d.ts +15 -0
- package/admin/dist/types/admin/src/contexts/AdminConfigContext.d.ts.map +1 -0
- package/admin/dist/types/admin/src/contexts/AuthContext.d.ts +161 -0
- package/admin/dist/types/admin/src/contexts/AuthContext.d.ts.map +1 -0
- package/admin/dist/types/admin/src/contexts/BreadcrumbContext.d.ts +12 -0
- package/admin/dist/types/admin/src/contexts/BreadcrumbContext.d.ts.map +1 -0
- package/admin/dist/types/admin/src/contexts/SettingsConfigContext.d.ts +30 -0
- package/admin/dist/types/admin/src/contexts/SettingsConfigContext.d.ts.map +1 -0
- package/admin/dist/types/admin/src/contexts/ThemeContext.d.ts +17 -0
- package/admin/dist/types/admin/src/contexts/ThemeContext.d.ts.map +1 -0
- package/admin/dist/types/admin/src/contexts/index.d.ts +6 -0
- package/admin/dist/types/admin/src/contexts/index.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/components/EmbedHeader.d.ts +7 -0
- package/admin/dist/types/admin/src/embed/components/EmbedHeader.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/components/EmbedLayout.d.ts +13 -0
- package/admin/dist/types/admin/src/embed/components/EmbedLayout.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/components/EmbedSidebar.d.ts +8 -0
- package/admin/dist/types/admin/src/embed/components/EmbedSidebar.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/components/index.d.ts +4 -0
- package/admin/dist/types/admin/src/embed/components/index.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/contexts/ApiContext.d.ts +18 -0
- package/admin/dist/types/admin/src/embed/contexts/ApiContext.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/index.d.ts +23 -0
- package/admin/dist/types/admin/src/embed/index.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/navigation.d.ts +42 -0
- package/admin/dist/types/admin/src/embed/navigation.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/pages/Content.d.ts +8 -0
- package/admin/dist/types/admin/src/embed/pages/Content.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/pages/ContentTypeEntries.d.ts +10 -0
- package/admin/dist/types/admin/src/embed/pages/ContentTypeEntries.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/pages/ContentTypes.d.ts +8 -0
- package/admin/dist/types/admin/src/embed/pages/ContentTypes.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/pages/Dashboard.d.ts +8 -0
- package/admin/dist/types/admin/src/embed/pages/Dashboard.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/pages/Entry.d.ts +7 -0
- package/admin/dist/types/admin/src/embed/pages/Entry.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/pages/Media.d.ts +8 -0
- package/admin/dist/types/admin/src/embed/pages/Media.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/pages/NewEntry.d.ts +7 -0
- package/admin/dist/types/admin/src/embed/pages/NewEntry.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/pages/Settings.d.ts +11 -0
- package/admin/dist/types/admin/src/embed/pages/Settings.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/pages/Taxonomies.d.ts +11 -0
- package/admin/dist/types/admin/src/embed/pages/Taxonomies.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/pages/Trash.d.ts +11 -0
- package/admin/dist/types/admin/src/embed/pages/Trash.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/pages/Users.d.ts +7 -0
- package/admin/dist/types/admin/src/embed/pages/Users.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/pages/index.d.ts +12 -0
- package/admin/dist/types/admin/src/embed/pages/index.d.ts.map +1 -0
- package/admin/dist/types/admin/src/embed/types.d.ts +33 -0
- package/admin/dist/types/admin/src/embed/types.d.ts.map +1 -0
- package/admin/dist/types/admin/src/hooks/index.d.ts +4 -0
- package/admin/dist/types/admin/src/hooks/index.d.ts.map +1 -0
- package/admin/dist/types/admin/src/hooks/use-mobile.d.ts +2 -0
- package/admin/dist/types/admin/src/hooks/use-mobile.d.ts.map +1 -0
- package/admin/dist/types/admin/src/hooks/useBreadcrumbLabel.d.ts +2 -0
- package/admin/dist/types/admin/src/hooks/useBreadcrumbLabel.d.ts.map +1 -0
- package/admin/dist/types/admin/src/hooks/usePermissions.d.ts +65 -0
- package/admin/dist/types/admin/src/hooks/usePermissions.d.ts.map +1 -0
- package/admin/dist/types/admin/src/hooks/useTaxonomyId.d.ts +13 -0
- package/admin/dist/types/admin/src/hooks/useTaxonomyId.d.ts.map +1 -0
- package/admin/dist/types/admin/src/lib/admin-config.d.ts +69 -0
- package/admin/dist/types/admin/src/lib/admin-config.d.ts.map +1 -0
- package/admin/dist/types/admin/src/lib/cmsExports.d.ts +7 -0
- package/admin/dist/types/admin/src/lib/cmsExports.d.ts.map +1 -0
- package/admin/dist/types/admin/src/lib/cn.d.ts +3 -0
- package/admin/dist/types/admin/src/lib/cn.d.ts.map +1 -0
- package/admin/dist/types/admin/src/lib/embed-adapter.d.ts +10 -0
- package/admin/dist/types/admin/src/lib/embed-adapter.d.ts.map +1 -0
- package/admin/dist/types/admin/src/lib/icons.d.ts +7 -0
- package/admin/dist/types/admin/src/lib/icons.d.ts.map +1 -0
- package/admin/dist/types/admin/src/lib/motion.d.ts +27 -0
- package/admin/dist/types/admin/src/lib/motion.d.ts.map +1 -0
- package/admin/dist/types/admin/src/lib/navigation.d.ts +31 -0
- package/admin/dist/types/admin/src/lib/navigation.d.ts.map +1 -0
- package/admin/dist/types/admin/src/pages/ContentPage.d.ts +14 -0
- package/admin/dist/types/admin/src/pages/ContentPage.d.ts.map +1 -0
- package/admin/dist/types/admin/src/pages/ContentTypeEntriesPage.d.ts +15 -0
- package/admin/dist/types/admin/src/pages/ContentTypeEntriesPage.d.ts.map +1 -0
- package/admin/dist/types/admin/src/pages/ContentTypesPage.d.ts +14 -0
- package/admin/dist/types/admin/src/pages/ContentTypesPage.d.ts.map +1 -0
- package/admin/dist/types/admin/src/pages/DashboardPage.d.ts +15 -0
- package/admin/dist/types/admin/src/pages/DashboardPage.d.ts.map +1 -0
- package/admin/dist/types/admin/src/pages/MediaPage.d.ts +19 -0
- package/admin/dist/types/admin/src/pages/MediaPage.d.ts.map +1 -0
- package/admin/dist/types/admin/src/pages/SettingsPage.d.ts +14 -0
- package/admin/dist/types/admin/src/pages/SettingsPage.d.ts.map +1 -0
- package/admin/dist/types/admin/src/pages/TaxonomiesPage.d.ts +14 -0
- package/admin/dist/types/admin/src/pages/TaxonomiesPage.d.ts.map +1 -0
- package/admin/dist/types/admin/src/pages/TrashPage.d.ts +14 -0
- package/admin/dist/types/admin/src/pages/TrashPage.d.ts.map +1 -0
- package/admin/dist/types/admin/src/pages/UsersPage.d.ts +8 -0
- package/admin/dist/types/admin/src/pages/UsersPage.d.ts.map +1 -0
- package/admin/dist/types/admin/src/pages/index.d.ts +16 -0
- package/admin/dist/types/admin/src/pages/index.d.ts.map +1 -0
- package/admin/dist/types/admin/src/types/index.d.ts +144 -0
- package/admin/dist/types/admin/src/types/index.d.ts.map +1 -0
- package/admin/dist/types/admin/src/utils/errorParsing.d.ts +27 -0
- package/admin/dist/types/admin/src/utils/errorParsing.d.ts.map +1 -0
- package/admin/dist/types/admin/src/utils/index.d.ts +2 -0
- package/admin/dist/types/admin/src/utils/index.d.ts.map +1 -0
- package/admin/dist/types/src/client/admin/bulk.d.ts +79 -0
- package/admin/dist/types/src/client/admin/bulk.d.ts.map +1 -0
- package/admin/dist/types/src/client/admin/contentLock.d.ts +118 -0
- package/admin/dist/types/src/client/admin/contentLock.d.ts.map +1 -0
- package/admin/dist/types/src/client/admin/contentTypes.d.ts +1627 -0
- package/admin/dist/types/src/client/admin/contentTypes.d.ts.map +1 -0
- package/admin/dist/types/src/client/admin/dashboard.d.ts +16 -0
- package/admin/dist/types/src/client/admin/dashboard.d.ts.map +1 -0
- package/admin/dist/types/src/client/admin/entries.d.ts +357 -0
- package/admin/dist/types/src/client/admin/entries.d.ts.map +1 -0
- package/admin/dist/types/src/client/admin/index.d.ts +7502 -0
- package/admin/dist/types/src/client/admin/index.d.ts.map +1 -0
- package/admin/dist/types/src/client/admin/media.d.ts +1038 -0
- package/admin/dist/types/src/client/admin/media.d.ts.map +1 -0
- package/admin/dist/types/src/client/admin/settings.d.ts +50 -0
- package/admin/dist/types/src/client/admin/settings.d.ts.map +1 -0
- package/admin/dist/types/src/client/admin/taxonomies.d.ts +339 -0
- package/admin/dist/types/src/client/admin/taxonomies.d.ts.map +1 -0
- package/admin/dist/types/src/client/admin/trash.d.ts +90 -0
- package/admin/dist/types/src/client/admin/trash.d.ts.map +1 -0
- package/admin/dist/types/src/client/admin/types.d.ts +594 -0
- package/admin/dist/types/src/client/admin/types.d.ts.map +1 -0
- package/admin/dist/types/src/client/admin/users.d.ts +58 -0
- package/admin/dist/types/src/client/admin/users.d.ts.map +1 -0
- package/admin/dist/types/src/client/admin/validators.d.ts +7732 -0
- package/admin/dist/types/src/client/admin/validators.d.ts.map +1 -0
- package/admin/dist/types/src/client/admin/versions.d.ts +106 -0
- package/admin/dist/types/src/client/admin/versions.d.ts.map +1 -0
- package/admin/dist/types/src/client/adminConfig.d.ts +125 -0
- package/admin/dist/types/src/client/adminConfig.d.ts.map +1 -0
- package/admin/dist/types/src/client/config.d.ts +155 -0
- package/admin/dist/types/src/client/config.d.ts.map +1 -0
- package/admin/dist/types/src/client/field-types.d.ts +55 -0
- package/admin/dist/types/src/client/field-types.d.ts.map +1 -0
- package/admin/dist/types/src/client/fields.d.ts +70 -0
- package/admin/dist/types/src/client/fields.d.ts.map +1 -0
- package/admin/dist/types/src/client/registry.d.ts +77 -0
- package/admin/dist/types/src/client/registry.d.ts.map +1 -0
- package/admin/dist/types/src/client/schema/defineContentType.d.ts +233 -0
- package/admin/dist/types/src/client/schema/defineContentType.d.ts.map +1 -0
- package/admin/dist/types/src/client/schema/types.d.ts +540 -0
- package/admin/dist/types/src/client/schema/types.d.ts.map +1 -0
- package/admin/dist/types/src/client/types.d.ts +449 -0
- package/admin/dist/types/src/client/types.d.ts.map +1 -0
- package/admin/dist/types/src/client/utils/toSlug.d.ts +60 -0
- package/admin/dist/types/src/client/utils/toSlug.d.ts.map +1 -0
- package/admin/dist/types/src/client/workflows.d.ts +51 -0
- package/admin/dist/types/src/client/workflows.d.ts.map +1 -0
- package/admin/dist/types/src/component/_generated/component.d.ts +4813 -0
- package/admin/dist/types/src/component/_generated/component.d.ts.map +1 -0
- package/admin/dist/types/src/component/_generated/dataModel.d.ts +46 -0
- package/admin/dist/types/src/component/_generated/dataModel.d.ts.map +1 -0
- package/admin/dist/types/src/component/_generated/server.d.ts +121 -0
- package/admin/dist/types/src/component/_generated/server.d.ts.map +1 -0
- package/admin/dist/types/src/component/contentEntryMutations.d.ts +551 -0
- package/admin/dist/types/src/component/contentEntryMutations.d.ts.map +1 -0
- package/admin/dist/types/src/component/contentLock.d.ts +328 -0
- package/admin/dist/types/src/component/contentLock.d.ts.map +1 -0
- package/admin/dist/types/src/component/contentTypeMutations.d.ts +1253 -0
- package/admin/dist/types/src/component/contentTypeMutations.d.ts.map +1 -0
- package/admin/dist/types/src/component/documentTypes.d.ts +186 -0
- package/admin/dist/types/src/component/documentTypes.d.ts.map +1 -0
- package/admin/dist/types/src/component/eventEmitter.d.ts +309 -0
- package/admin/dist/types/src/component/eventEmitter.d.ts.map +1 -0
- package/admin/dist/types/src/component/lib/errors.d.ts +306 -0
- package/admin/dist/types/src/component/lib/errors.d.ts.map +1 -0
- package/admin/dist/types/src/component/lib/metadataExtractor.d.ts +245 -0
- package/admin/dist/types/src/component/lib/metadataExtractor.d.ts.map +1 -0
- package/admin/dist/types/src/component/lib/mutationAuth.d.ts +95 -0
- package/admin/dist/types/src/component/lib/mutationAuth.d.ts.map +1 -0
- package/admin/dist/types/src/component/lib/slugGenerator.d.ts +71 -0
- package/admin/dist/types/src/component/lib/slugGenerator.d.ts.map +1 -0
- package/admin/dist/types/src/component/lib/slugUniqueness.d.ts +131 -0
- package/admin/dist/types/src/component/lib/slugUniqueness.d.ts.map +1 -0
- package/admin/dist/types/src/component/lib/softDelete.d.ts +18 -0
- package/admin/dist/types/src/component/lib/softDelete.d.ts.map +1 -0
- package/admin/dist/types/src/component/localeFields.d.ts +508 -0
- package/admin/dist/types/src/component/localeFields.d.ts.map +1 -0
- package/admin/dist/types/src/component/mediaAssetMutations.d.ts +282 -0
- package/admin/dist/types/src/component/mediaAssetMutations.d.ts.map +1 -0
- package/admin/dist/types/src/component/roles.d.ts +649 -0
- package/admin/dist/types/src/component/roles.d.ts.map +1 -0
- package/admin/dist/types/src/component/schema.d.ts +5248 -0
- package/admin/dist/types/src/component/schema.d.ts.map +1 -0
- package/admin/dist/types/src/component/validation.d.ts +407 -0
- package/admin/dist/types/src/component/validation.d.ts.map +1 -0
- package/admin/dist/types/src/component/validators.d.ts +5722 -0
- package/admin/dist/types/src/component/validators.d.ts.map +1 -0
- package/admin/dist/types/src/react/index.d.ts +493 -0
- package/admin/dist/types/src/react/index.d.ts.map +1 -0
- package/admin/src/components/AdminLayout.tsx +14 -6
- package/admin/src/components/BreakingChangesWarningDialog.tsx +6 -6
- package/admin/src/components/BulkActionBar.tsx +3 -3
- package/admin/src/components/BulkOperationModal.tsx +7 -7
- package/admin/src/components/ContentEntryEditor.tsx +319 -630
- package/admin/src/components/ContentTypeFormModal.tsx +39 -28
- package/admin/src/components/FieldGroupSection.tsx +178 -0
- package/admin/src/components/Header.tsx +18 -12
- package/admin/src/components/RouteGuard.tsx +1 -1
- package/admin/src/components/SchemaDriftWarning.tsx +10 -6
- package/admin/src/components/Sidebar.tsx +180 -162
- package/admin/src/components/TaxonomyEditor.tsx +17 -17
- package/admin/src/components/TermTree.tsx +16 -16
- package/admin/src/components/UploadDropzone.tsx +18 -8
- package/admin/src/components/VersionCompare.tsx +7 -7
- package/admin/src/components/VersionHistory.tsx +7 -7
- package/admin/src/components/VersionRollbackModal.tsx +5 -5
- package/admin/src/components/cmsds/CmsButton.tsx +5 -27
- package/admin/src/components/cmsds/CmsDialog.tsx +3 -3
- package/admin/src/components/cmsds/CmsDropdown.tsx +1 -1
- package/admin/src/components/cmsds/CmsEmptyState.tsx +1 -1
- package/admin/src/components/cmsds/CmsField.tsx +3 -3
- package/admin/src/components/cmsds/CmsFilterBar.tsx +8 -7
- package/admin/src/components/cmsds/CmsInput.tsx +2 -2
- package/admin/src/components/cmsds/CmsPageHeader.tsx +4 -4
- package/admin/src/components/cmsds/CmsPagination.tsx +1 -1
- package/admin/src/components/cmsds/CmsSelect.tsx +2 -2
- package/admin/src/components/cmsds/CmsStatCard.tsx +2 -2
- package/admin/src/components/cmsds/CmsStatusBadge.tsx +2 -2
- package/admin/src/components/cmsds/CmsSurface.tsx +1 -1
- package/admin/src/components/cmsds/CmsTable.tsx +3 -3
- package/admin/src/components/cmsds/CmsToolbar.tsx +2 -2
- package/admin/src/components/cmsds/index.ts +0 -1
- package/admin/src/components/editor/AutosaveIndicator.tsx +56 -0
- package/admin/src/components/editor/EditorContentPanel.tsx +60 -0
- package/admin/src/components/editor/EditorModals.tsx +122 -0
- package/admin/src/components/editor/EditorPropertiesPanel.tsx +179 -0
- package/admin/src/components/editor/EditorToolbar.tsx +284 -0
- package/admin/src/components/editor/index.ts +5 -0
- package/admin/src/components/fields/ArrayObjectField.tsx +304 -0
- package/admin/src/components/fields/BooleanField.tsx +30 -35
- package/admin/src/components/fields/CategoryField.tsx +8 -7
- package/admin/src/components/fields/DateField.tsx +5 -5
- package/admin/src/components/fields/DefaultFieldRenderer.tsx +1 -1
- package/admin/src/components/fields/FieldRenderer.tsx +30 -0
- package/admin/src/components/fields/FieldWrapper.tsx +12 -25
- package/admin/src/components/fields/JsonField.tsx +3 -3
- package/admin/src/components/fields/MediaField.tsx +269 -132
- package/admin/src/components/fields/MoneyField.tsx +179 -0
- package/admin/src/components/fields/MultiSelectField.tsx +67 -62
- package/admin/src/components/fields/NumberField.tsx +141 -28
- package/admin/src/components/fields/ReferenceField.tsx +12 -12
- package/admin/src/components/fields/RichTextField.tsx +4 -4
- package/admin/src/components/fields/SelectField.tsx +10 -7
- package/admin/src/components/fields/TagField.tsx +11 -9
- package/admin/src/components/fields/TextAreaField.tsx +2 -2
- package/admin/src/components/fields/TextField.tsx +2 -2
- package/admin/src/components/fields/index.ts +4 -0
- package/admin/src/components/fields/registry.ts +2 -0
- package/admin/src/components/fields/types.ts +34 -0
- package/admin/src/components/filters/TaxonomyFilter.tsx +7 -7
- package/admin/src/components/media/MediaAssetActions.tsx +2 -2
- package/admin/src/components/media/MediaAssetEditDialog.tsx +30 -34
- package/admin/src/components/media/MediaBulkActionBar.tsx +1 -1
- package/admin/src/components/media/MediaFolderActions.tsx +2 -2
- package/admin/src/components/media/MediaFolderEditDialog.tsx +17 -15
- package/admin/src/components/media/MediaMoveModal.tsx +5 -5
- package/admin/src/components/media/MediaPreviewModal.tsx +5 -5
- package/admin/src/components/media/MediaTaxonomyPicker.tsx +6 -6
- package/admin/src/components/media/MediaTrashBulkActionBar.tsx +1 -1
- package/admin/src/components/ui/accordion.tsx +1 -1
- package/admin/src/components/ui/alert-dialog.tsx +2 -2
- package/admin/src/components/ui/alert.tsx +1 -1
- package/admin/src/components/ui/avatar.tsx +1 -1
- package/admin/src/components/ui/badge.tsx +1 -1
- package/admin/src/components/ui/breadcrumb.tsx +1 -1
- package/admin/src/components/ui/button.tsx +1 -1
- package/admin/src/components/ui/calendar.tsx +2 -2
- package/admin/src/components/ui/card.tsx +1 -1
- package/admin/src/components/ui/checkbox.tsx +1 -1
- package/admin/src/components/ui/collapsible.tsx +25 -5
- package/admin/src/components/ui/command.tsx +2 -2
- package/admin/src/components/ui/dialog.tsx +1 -1
- package/admin/src/components/ui/drawer.tsx +133 -0
- package/admin/src/components/ui/dropdown-menu.tsx +1 -1
- package/admin/src/components/ui/field.tsx +246 -0
- package/admin/src/components/ui/form.tsx +2 -2
- package/admin/src/components/ui/input-group.tsx +168 -0
- package/admin/src/components/ui/input.tsx +1 -1
- package/admin/src/components/ui/label.tsx +1 -1
- package/admin/src/components/ui/popover.tsx +1 -1
- package/admin/src/components/ui/scroll-area.tsx +1 -1
- package/admin/src/components/ui/select.tsx +1 -1
- package/admin/src/components/ui/separator.tsx +1 -1
- package/admin/src/components/ui/sheet.tsx +1 -1
- package/admin/src/components/ui/sidebar.tsx +8 -8
- package/admin/src/components/ui/skeleton.tsx +1 -1
- package/admin/src/components/ui/spinner.tsx +16 -0
- package/admin/src/components/ui/switch.tsx +1 -1
- package/admin/src/components/ui/table.tsx +1 -1
- package/admin/src/components/ui/tabs.tsx +1 -1
- package/admin/src/components/ui/textarea.tsx +1 -1
- package/admin/src/components/ui/toggle-group.tsx +83 -0
- package/admin/src/components/ui/toggle.tsx +45 -0
- package/admin/src/components/ui/tooltip.tsx +1 -1
- package/admin/src/contexts/SettingsConfigContext.tsx +1 -1
- package/admin/src/embed/components/EmbedHeader.tsx +13 -9
- package/admin/src/embed/components/EmbedLayout.tsx +13 -5
- package/admin/src/embed/components/EmbedSidebar.tsx +107 -102
- package/admin/src/embed/contexts/ApiContext.tsx +1 -1
- package/admin/src/embed/index.tsx +31 -32
- package/admin/src/embed/navigation.tsx +3 -0
- package/admin/src/embed/pages/Entry.tsx +50 -15
- package/admin/src/embed/pages/Users.tsx +11 -0
- package/admin/src/embed/pages/index.ts +1 -0
- package/admin/src/embed/theme.css +65 -0
- package/admin/src/hooks/index.ts +1 -0
- package/admin/src/hooks/useBreadcrumbLabel.ts +1 -1
- package/admin/src/hooks/useTaxonomyId.ts +32 -0
- package/admin/src/index.css +21 -0
- package/admin/src/lib/admin-config.ts +16 -0
- package/admin/src/lib/adminApi.ts +1 -1
- package/admin/src/lib/cmsExports.ts +8 -15
- package/admin/src/lib/icons.tsx +2 -0
- package/admin/src/pages/ContentPage.tsx +11 -11
- package/admin/src/pages/ContentTypeEntriesPage.tsx +9 -9
- package/admin/src/pages/ContentTypesPage.tsx +9 -9
- package/admin/src/pages/DashboardPage.tsx +7 -7
- package/admin/src/pages/MediaPage.tsx +26 -26
- package/admin/src/pages/SettingsPage.tsx +36 -39
- package/admin/src/pages/TaxonomiesPage.tsx +12 -12
- package/admin/src/pages/TrashPage.tsx +8 -8
- package/admin/src/pages/UsersPage.tsx +344 -0
- package/admin/src/pages/index.ts +1 -0
- package/admin/src/standalone/App.tsx +6 -6
- package/admin/src/standalone/config.ts +1 -1
- package/admin/src/standalone/router.tsx +17 -17
- package/admin-dist/assets/index-CQLWK5Wb.css +1 -0
- package/admin-dist/assets/index-DTgANhXL.js +104 -0
- package/admin-dist/index.html +2 -2
- package/dist/client/admin/contentLock.d.ts.map +1 -1
- package/dist/client/admin/contentTypes.d.ts +287 -4
- package/dist/client/admin/contentTypes.d.ts.map +1 -1
- package/dist/client/admin/contentTypes.js +19 -1
- package/dist/client/admin/contentTypes.js.map +1 -1
- package/dist/client/admin/entries.d.ts.map +1 -1
- package/dist/client/admin/index.d.ts +612 -8
- package/dist/client/admin/index.d.ts.map +1 -1
- package/dist/client/admin/index.js +34 -3
- package/dist/client/admin/index.js.map +1 -1
- package/dist/client/admin/media.d.ts.map +1 -1
- package/dist/client/admin/media.js +10 -1
- package/dist/client/admin/media.js.map +1 -1
- package/dist/client/admin/taxonomies.d.ts.map +1 -1
- package/dist/client/admin/taxonomies.js +36 -11
- package/dist/client/admin/taxonomies.js.map +1 -1
- package/dist/client/admin/trash.d.ts.map +1 -1
- package/dist/client/admin/types.d.ts +47 -7
- package/dist/client/admin/types.d.ts.map +1 -1
- package/dist/client/admin/users.d.ts +58 -0
- package/dist/client/admin/users.d.ts.map +1 -0
- package/dist/client/admin/users.js +111 -0
- package/dist/client/admin/users.js.map +1 -0
- package/dist/client/admin/validators.d.ts +1266 -120
- package/dist/client/admin/validators.d.ts.map +1 -1
- package/dist/client/admin/validators.js +3 -2
- package/dist/client/admin/validators.js.map +1 -1
- package/dist/client/admin/versions.d.ts.map +1 -1
- package/dist/client/config.js.map +1 -1
- package/dist/client/defineContent.d.ts +98 -8
- package/dist/client/defineContent.d.ts.map +1 -1
- package/dist/client/defineContent.js +329 -19
- package/dist/client/defineContent.js.map +1 -1
- package/dist/client/field-types.d.ts.map +1 -1
- package/dist/client/field-types.js +27 -0
- package/dist/client/field-types.js.map +1 -1
- package/dist/client/fields.d.ts +70 -0
- package/dist/client/fields.d.ts.map +1 -0
- package/dist/client/fields.js +118 -0
- package/dist/client/fields.js.map +1 -0
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/registry.js.map +1 -1
- package/dist/client/schema/defineContentType.d.ts +3 -3
- package/dist/client/schema/defineContentType.d.ts.map +1 -1
- package/dist/client/schema/defineContentType.js +86 -3
- package/dist/client/schema/defineContentType.js.map +1 -1
- package/dist/client/schema/index.d.ts +1 -1
- package/dist/client/schema/index.d.ts.map +1 -1
- package/dist/client/schema/index.js.map +1 -1
- package/dist/client/schema/types.d.ts +65 -9
- package/dist/client/schema/types.d.ts.map +1 -1
- package/dist/client/schema/types.js.map +1 -1
- package/dist/component/_generated/api.d.ts +2 -0
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +361 -18
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/authorization.d.ts.map +1 -1
- package/dist/component/authorization.js +1 -0
- package/dist/component/authorization.js.map +1 -1
- package/dist/component/cmsUsers.d.ts +97 -0
- package/dist/component/cmsUsers.d.ts.map +1 -0
- package/dist/component/cmsUsers.js +224 -0
- package/dist/component/cmsUsers.js.map +1 -0
- package/dist/component/contentEntryMutations.d.ts +7 -7
- package/dist/component/contentTypeMutations.d.ts +199 -11
- package/dist/component/contentTypeMutations.d.ts.map +1 -1
- package/dist/component/contentTypes.d.ts +98 -4
- package/dist/component/contentTypes.d.ts.map +1 -1
- package/dist/component/eventEmitter.d.ts +43 -14
- package/dist/component/eventEmitter.d.ts.map +1 -1
- package/dist/component/eventEmitter.js +50 -2
- package/dist/component/eventEmitter.js.map +1 -1
- package/dist/component/exportImport.d.ts +12 -12
- package/dist/component/mediaAssetMutations.d.ts +5 -5
- package/dist/component/mediaFolderMutations.d.ts +5 -5
- package/dist/component/ragContentIndexer.d.ts +51 -4
- package/dist/component/ragContentIndexer.d.ts.map +1 -1
- package/dist/component/roles.d.ts +4 -4
- package/dist/component/roles.d.ts.map +1 -1
- package/dist/component/roles.js +5 -1
- package/dist/component/roles.js.map +1 -1
- package/dist/component/schema.d.ts +897 -112
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +48 -7
- package/dist/component/schema.js.map +1 -1
- package/dist/component/taxonomies.d.ts +1 -1
- package/dist/component/taxonomies.d.ts.map +1 -1
- package/dist/component/taxonomies.js +11 -2
- package/dist/component/taxonomies.js.map +1 -1
- package/dist/component/validation.d.ts +22 -2
- package/dist/component/validation.d.ts.map +1 -1
- package/dist/component/validation.js +174 -1
- package/dist/component/validation.js.map +1 -1
- package/dist/component/validators.d.ts +847 -106
- package/dist/component/validators.d.ts.map +1 -1
- package/dist/component/validators.js +5 -2
- package/dist/component/validators.js.map +1 -1
- package/dist/component/webhookTrigger.d.ts +17 -17
- package/dist/component/webhookTrigger.d.ts.map +1 -1
- package/dist/component/webhookTrigger.js +4 -4
- package/dist/component/webhookTrigger.js.map +1 -1
- package/dist/react/index.d.ts +3 -2
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/test.d.ts +309 -33
- package/dist/test.d.ts.map +1 -1
- package/package.json +238 -230
- package/admin-dist/assets/index-BrbXSzjb.css +0 -1
- package/admin-dist/assets/index-CdHu1-Ex.js +0 -96
|
@@ -1,25 +1,33 @@
|
|
|
1
1
|
import { useState, useCallback, useEffect, useRef } from 'react'
|
|
2
2
|
import { useMutation } from 'convex/react'
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { toast } from 'sonner'
|
|
4
|
+
import { useApi } from '../embed/contexts/ApiContext'
|
|
5
5
|
import { VersionHistory } from './VersionHistory'
|
|
6
6
|
import type { FieldDefinition, FieldError } from './fields/types'
|
|
7
|
-
import { parseServerError, isRetryableError } from '
|
|
8
|
-
import { useSettingsConfig } from '
|
|
9
|
-
import { CmsButton } from '~/components/cmsds/CmsButton'
|
|
10
|
-
import { CmsStatusBadge } from '~/components/cmsds/CmsStatusBadge'
|
|
11
|
-
import { CmsDialog, CmsConfirmDialog } from '~/components/cmsds/CmsDialog'
|
|
12
|
-
import { Badge as _Badge } from '~/components/ui/badge'
|
|
13
|
-
import { Input } from '~/components/ui/input'
|
|
7
|
+
import { parseServerError, isRetryableError } from '../utils'
|
|
8
|
+
import { useSettingsConfig } from '../contexts'
|
|
14
9
|
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
10
|
+
AlertDialog,
|
|
11
|
+
AlertDialogAction,
|
|
12
|
+
AlertDialogCancel,
|
|
13
|
+
AlertDialogContent,
|
|
14
|
+
AlertDialogDescription,
|
|
15
|
+
AlertDialogFooter,
|
|
16
|
+
AlertDialogHeader,
|
|
17
|
+
AlertDialogTitle,
|
|
18
|
+
} from './ui/alert-dialog'
|
|
19
|
+
import {
|
|
20
|
+
EditorToolbar,
|
|
21
|
+
EditorContentPanel,
|
|
22
|
+
EditorPropertiesPanel,
|
|
23
|
+
ScheduleModal,
|
|
24
|
+
PublishConfirmModal,
|
|
25
|
+
DeleteConfirmModal,
|
|
26
|
+
} from './editor'
|
|
27
|
+
import { Sheet, SheetContent, SheetTitle } from './ui/sheet'
|
|
28
|
+
import { Drawer, DrawerContent, DrawerHeader, DrawerTitle } from './ui/drawer'
|
|
29
|
+
|
|
30
|
+
// --- Utility functions ---
|
|
23
31
|
|
|
24
32
|
function formatDateTimeLocal(timestamp: number): string {
|
|
25
33
|
const date = new Date(timestamp)
|
|
@@ -81,6 +89,8 @@ function transformDataForBackend(
|
|
|
81
89
|
return transformed
|
|
82
90
|
}
|
|
83
91
|
|
|
92
|
+
// --- Types ---
|
|
93
|
+
|
|
84
94
|
export interface ContentType {
|
|
85
95
|
_id: string
|
|
86
96
|
name: string
|
|
@@ -111,23 +121,33 @@ interface ContentEntryEditorProps {
|
|
|
111
121
|
onSave?: (entry: ContentEntry) => void
|
|
112
122
|
onCancel?: () => void
|
|
113
123
|
onDelete?: () => void
|
|
124
|
+
onNavigateToEntry?: (entryId: string) => void
|
|
125
|
+
onNavigateToNewEntry?: () => void
|
|
126
|
+
siblingEntries?: Array<{ _id: string; title: string }>
|
|
114
127
|
autosaveEnabled?: boolean
|
|
115
128
|
autosaveInterval?: number
|
|
116
129
|
canDelete?: boolean
|
|
117
130
|
}
|
|
118
131
|
|
|
132
|
+
// --- Main Component ---
|
|
133
|
+
|
|
119
134
|
export function ContentEntryEditor({
|
|
120
135
|
contentType,
|
|
121
136
|
entry,
|
|
122
137
|
onSave,
|
|
123
138
|
onCancel,
|
|
124
139
|
onDelete,
|
|
140
|
+
onNavigateToEntry,
|
|
141
|
+
onNavigateToNewEntry,
|
|
142
|
+
siblingEntries,
|
|
125
143
|
autosaveEnabled = true,
|
|
126
144
|
autosaveInterval = 30000,
|
|
127
145
|
canDelete: canDeleteProp = false,
|
|
128
146
|
}: ContentEntryEditorProps) {
|
|
129
147
|
const { settings } = useSettingsConfig()
|
|
130
148
|
|
|
149
|
+
// --- Initial data ---
|
|
150
|
+
|
|
131
151
|
const getInitialData = useCallback(() => {
|
|
132
152
|
if (entry) {
|
|
133
153
|
return transformDataForUI({ ...entry.data }, contentType.fields)
|
|
@@ -166,28 +186,49 @@ export function ContentEntryEditor({
|
|
|
166
186
|
return defaults
|
|
167
187
|
}, [contentType.fields, entry])
|
|
168
188
|
|
|
169
|
-
|
|
170
|
-
|
|
189
|
+
// --- State ---
|
|
190
|
+
|
|
191
|
+
const [formData, setFormData] = useState<Record<string, unknown>>(getInitialData)
|
|
171
192
|
const [fieldErrors, setFieldErrors] = useState<Record<string, FieldError>>({})
|
|
172
193
|
const [isSubmitting, setIsSubmitting] = useState(false)
|
|
173
194
|
const [isDirty, setIsDirty] = useState(false)
|
|
174
|
-
const [_lastSavedData, setLastSavedData] = useState<Record<
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
const [autosaveStatus, setAutosaveStatus] = useState<
|
|
179
|
-
'idle' | 'saving' | 'saved' | 'error'
|
|
180
|
-
>('idle')
|
|
195
|
+
const [_lastSavedData, setLastSavedData] = useState<Record<string, unknown> | null>(
|
|
196
|
+
entry ? { ...entry.data } : null
|
|
197
|
+
)
|
|
198
|
+
const [autosaveStatus, setAutosaveStatus] = useState<'idle' | 'saving' | 'saved' | 'error'>('idle')
|
|
181
199
|
const [autosaveError, setAutosaveError] = useState<string | null>(null)
|
|
182
200
|
const [autosaveRetryCount, setAutosaveRetryCount] = useState(0)
|
|
183
|
-
const [submitError, setSubmitError] = useState<string | null>(null)
|
|
184
|
-
const [saveSuccess, setSaveSuccess] = useState(false)
|
|
185
201
|
const maxAutosaveRetries = 3
|
|
186
202
|
|
|
203
|
+
const [showScheduleModal, setShowScheduleModal] = useState(false)
|
|
204
|
+
const [scheduleDateTime, setScheduleDateTime] = useState<string>(() => {
|
|
205
|
+
const tomorrow = new Date()
|
|
206
|
+
tomorrow.setDate(tomorrow.getDate() + 1)
|
|
207
|
+
tomorrow.setHours(9, 0, 0, 0)
|
|
208
|
+
return formatDateTimeLocal(tomorrow.getTime())
|
|
209
|
+
})
|
|
210
|
+
const [isPublishing, setIsPublishing] = useState(false)
|
|
211
|
+
const [publishError, setPublishError] = useState<string | null>(null)
|
|
212
|
+
|
|
213
|
+
const [showConfirmModal, setShowConfirmModal] = useState(false)
|
|
214
|
+
const [confirmAction, setConfirmAction] = useState<'publish' | 'unpublish' | null>(null)
|
|
215
|
+
|
|
216
|
+
const [showDeleteModal, setShowDeleteModal] = useState(false)
|
|
217
|
+
const [isDeleting, setIsDeleting] = useState(false)
|
|
218
|
+
const [deleteError, setDeleteError] = useState<string | null>(null)
|
|
219
|
+
|
|
220
|
+
const [isDuplicating, setIsDuplicating] = useState(false)
|
|
221
|
+
const [isArchiving, setIsArchiving] = useState(false)
|
|
222
|
+
const [showVersionHistory, setShowVersionHistory] = useState(false)
|
|
223
|
+
const [showMobileProperties, setShowMobileProperties] = useState(false)
|
|
224
|
+
const [showUnsavedWarning, setShowUnsavedWarning] = useState(false)
|
|
225
|
+
|
|
187
226
|
const autosaveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)
|
|
188
227
|
const formDataRef = useRef(formData)
|
|
189
228
|
formDataRef.current = formData
|
|
190
229
|
|
|
230
|
+
// --- Mutations ---
|
|
231
|
+
|
|
191
232
|
const api = useApi()
|
|
192
233
|
const createEntry = useMutation(api.createEntry)
|
|
193
234
|
const updateEntry = useMutation(api.updateEntry)
|
|
@@ -198,15 +239,7 @@ export function ContentEntryEditor({
|
|
|
198
239
|
const deleteEntryMutation = useMutation(api.deleteEntry)
|
|
199
240
|
const duplicateEntryMutation = useMutation(api.duplicateEntry)
|
|
200
241
|
|
|
201
|
-
|
|
202
|
-
const [scheduleDateTime, setScheduleDateTime] = useState<string>(() => {
|
|
203
|
-
const tomorrow = new Date()
|
|
204
|
-
tomorrow.setDate(tomorrow.getDate() + 1)
|
|
205
|
-
tomorrow.setHours(9, 0, 0, 0)
|
|
206
|
-
return formatDateTimeLocal(tomorrow.getTime())
|
|
207
|
-
})
|
|
208
|
-
const [isPublishing, setIsPublishing] = useState(false)
|
|
209
|
-
const [publishError, setPublishError] = useState<string | null>(null)
|
|
242
|
+
// --- Effects ---
|
|
210
243
|
|
|
211
244
|
useEffect(() => {
|
|
212
245
|
const newData = getInitialData()
|
|
@@ -214,16 +247,13 @@ export function ContentEntryEditor({
|
|
|
214
247
|
setFieldErrors({})
|
|
215
248
|
setIsDirty(false)
|
|
216
249
|
setLastSavedData(entry ? { ...entry.data } : null)
|
|
217
|
-
setSubmitError(null)
|
|
218
250
|
}, [entry?._id, getInitialData])
|
|
219
251
|
|
|
252
|
+
// --- Field handling ---
|
|
253
|
+
|
|
220
254
|
const handleFieldChange = useCallback((fieldName: string, value: unknown) => {
|
|
221
|
-
setFormData((prev) => {
|
|
222
|
-
const updated = { ...prev, [fieldName]: value }
|
|
223
|
-
return updated
|
|
224
|
-
})
|
|
255
|
+
setFormData((prev) => ({ ...prev, [fieldName]: value }))
|
|
225
256
|
setIsDirty(true)
|
|
226
|
-
|
|
227
257
|
setFieldErrors((prev) => {
|
|
228
258
|
if (prev[fieldName]) {
|
|
229
259
|
const { [fieldName]: _removed, ...rest } = prev
|
|
@@ -233,6 +263,8 @@ export function ContentEntryEditor({
|
|
|
233
263
|
})
|
|
234
264
|
}, [])
|
|
235
265
|
|
|
266
|
+
// --- Validation ---
|
|
267
|
+
|
|
236
268
|
const validateForm = useCallback(async (): Promise<boolean> => {
|
|
237
269
|
const errors: Record<string, FieldError> = {}
|
|
238
270
|
|
|
@@ -247,10 +279,7 @@ export function ContentEntryEditor({
|
|
|
247
279
|
(Array.isArray(value) && value.length === 0)
|
|
248
280
|
|
|
249
281
|
if (isEmpty) {
|
|
250
|
-
errors[field.name] = {
|
|
251
|
-
message: `${field.label} is required`,
|
|
252
|
-
code: 'REQUIRED',
|
|
253
|
-
}
|
|
282
|
+
errors[field.name] = { message: `${field.label} is required`, code: 'REQUIRED' }
|
|
254
283
|
continue
|
|
255
284
|
}
|
|
256
285
|
}
|
|
@@ -261,79 +290,47 @@ export function ContentEntryEditor({
|
|
|
261
290
|
const strValue = String(value)
|
|
262
291
|
const opts = field.options
|
|
263
292
|
if (opts?.minLength && strValue.length < opts.minLength) {
|
|
264
|
-
errors[field.name] = {
|
|
265
|
-
message: `Minimum ${opts.minLength} characters required`,
|
|
266
|
-
code: 'MIN_LENGTH',
|
|
267
|
-
}
|
|
293
|
+
errors[field.name] = { message: `Minimum ${opts.minLength} characters required`, code: 'MIN_LENGTH' }
|
|
268
294
|
} else if (opts?.maxLength && strValue.length > opts.maxLength) {
|
|
269
|
-
errors[field.name] = {
|
|
270
|
-
message: `Maximum ${opts.maxLength} characters allowed`,
|
|
271
|
-
code: 'MAX_LENGTH',
|
|
272
|
-
}
|
|
295
|
+
errors[field.name] = { message: `Maximum ${opts.maxLength} characters allowed`, code: 'MAX_LENGTH' }
|
|
273
296
|
} else if (opts?.pattern) {
|
|
274
297
|
const regex = new RegExp(opts.pattern)
|
|
275
298
|
if (!regex.test(strValue)) {
|
|
276
|
-
errors[field.name] = {
|
|
277
|
-
message: 'Value does not match the required format',
|
|
278
|
-
code: 'PATTERN_MISMATCH',
|
|
279
|
-
}
|
|
299
|
+
errors[field.name] = { message: 'Value does not match the required format', code: 'PATTERN_MISMATCH' }
|
|
280
300
|
}
|
|
281
301
|
}
|
|
282
302
|
break
|
|
283
303
|
}
|
|
284
|
-
|
|
285
304
|
case 'number': {
|
|
286
305
|
const numValue = Number(value)
|
|
287
306
|
const opts = field.options
|
|
288
307
|
if (isNaN(numValue)) {
|
|
289
|
-
errors[field.name] = {
|
|
290
|
-
message: 'Must be a valid number',
|
|
291
|
-
code: 'INVALID_TYPE',
|
|
292
|
-
}
|
|
308
|
+
errors[field.name] = { message: 'Must be a valid number', code: 'INVALID_TYPE' }
|
|
293
309
|
} else {
|
|
294
310
|
if (opts?.min !== undefined && numValue < opts.min) {
|
|
295
|
-
errors[field.name] = {
|
|
296
|
-
message: `Minimum value is ${opts.min}`,
|
|
297
|
-
code: 'MIN_VALUE',
|
|
298
|
-
}
|
|
311
|
+
errors[field.name] = { message: `Minimum value is ${opts.min}`, code: 'MIN_VALUE' }
|
|
299
312
|
} else if (opts?.max !== undefined && numValue > opts.max) {
|
|
300
|
-
errors[field.name] = {
|
|
301
|
-
message: `Maximum value is ${opts.max}`,
|
|
302
|
-
code: 'MAX_VALUE',
|
|
303
|
-
}
|
|
313
|
+
errors[field.name] = { message: `Maximum value is ${opts.max}`, code: 'MAX_VALUE' }
|
|
304
314
|
} else if (opts?.precision === 0 && !Number.isInteger(numValue)) {
|
|
305
|
-
errors[field.name] = {
|
|
306
|
-
message: 'Must be a whole number',
|
|
307
|
-
code: 'NOT_INTEGER',
|
|
308
|
-
}
|
|
315
|
+
errors[field.name] = { message: 'Must be a whole number', code: 'NOT_INTEGER' }
|
|
309
316
|
}
|
|
310
317
|
}
|
|
311
318
|
break
|
|
312
319
|
}
|
|
313
|
-
|
|
314
320
|
case 'select': {
|
|
315
321
|
const opts = field.options
|
|
316
322
|
if (opts?.options && !opts.options.some((o) => o.value === value)) {
|
|
317
|
-
errors[field.name] = {
|
|
318
|
-
message: 'Please select a valid option',
|
|
319
|
-
code: 'INVALID_OPTION',
|
|
320
|
-
}
|
|
323
|
+
errors[field.name] = { message: 'Please select a valid option', code: 'INVALID_OPTION' }
|
|
321
324
|
}
|
|
322
325
|
break
|
|
323
326
|
}
|
|
324
|
-
|
|
325
327
|
case 'multiSelect': {
|
|
326
328
|
const opts = field.options
|
|
327
329
|
if (Array.isArray(value) && opts?.options) {
|
|
328
330
|
const validValues = opts.options.map((o) => o.value)
|
|
329
|
-
const invalid = value.filter(
|
|
330
|
-
(v) => !validValues.includes(String(v))
|
|
331
|
-
)
|
|
331
|
+
const invalid = value.filter((v) => !validValues.includes(String(v)))
|
|
332
332
|
if (invalid.length > 0) {
|
|
333
|
-
errors[field.name] = {
|
|
334
|
-
message: 'Contains invalid options',
|
|
335
|
-
code: 'INVALID_OPTION',
|
|
336
|
-
}
|
|
333
|
+
errors[field.name] = { message: 'Contains invalid options', code: 'INVALID_OPTION' }
|
|
337
334
|
}
|
|
338
335
|
}
|
|
339
336
|
break
|
|
@@ -346,10 +343,11 @@ export function ContentEntryEditor({
|
|
|
346
343
|
return Object.keys(errors).length === 0
|
|
347
344
|
}, [contentType.fields, formData])
|
|
348
345
|
|
|
346
|
+
// --- Autosave ---
|
|
347
|
+
|
|
349
348
|
const autosaveDraft = useCallback(
|
|
350
349
|
async (retryAttempt = 0) => {
|
|
351
350
|
if (!isDirty || !entry) return
|
|
352
|
-
|
|
353
351
|
if (entry.status !== 'draft') return
|
|
354
352
|
|
|
355
353
|
try {
|
|
@@ -365,29 +363,18 @@ export function ContentEntryEditor({
|
|
|
365
363
|
setAutosaveStatus('saved')
|
|
366
364
|
setIsDirty(false)
|
|
367
365
|
setAutosaveRetryCount(0)
|
|
368
|
-
|
|
369
|
-
setTimeout(() => {
|
|
370
|
-
setAutosaveStatus('idle')
|
|
371
|
-
}, 3000)
|
|
366
|
+
setTimeout(() => setAutosaveStatus('idle'), 3000)
|
|
372
367
|
} catch (error) {
|
|
373
368
|
console.error('Autosave failed:', error)
|
|
374
|
-
|
|
375
|
-
const
|
|
376
|
-
error instanceof Error ? error.message : 'Failed to save'
|
|
377
|
-
const canRetry =
|
|
378
|
-
isRetryableError(error) && retryAttempt < maxAutosaveRetries
|
|
369
|
+
const errorMessage = error instanceof Error ? error.message : 'Failed to save'
|
|
370
|
+
const canRetry = isRetryableError(error) && retryAttempt < maxAutosaveRetries
|
|
379
371
|
|
|
380
372
|
if (canRetry) {
|
|
381
373
|
const retryDelay = Math.min(1000 * Math.pow(2, retryAttempt), 10000)
|
|
382
374
|
setAutosaveStatus('error')
|
|
383
|
-
setAutosaveError(
|
|
384
|
-
`Save failed, retrying in ${Math.round(retryDelay / 1000)}s...`
|
|
385
|
-
)
|
|
375
|
+
setAutosaveError(`Save failed, retrying in ${Math.round(retryDelay / 1000)}s...`)
|
|
386
376
|
setAutosaveRetryCount(retryAttempt + 1)
|
|
387
|
-
|
|
388
|
-
setTimeout(() => {
|
|
389
|
-
autosaveDraft(retryAttempt + 1)
|
|
390
|
-
}, retryDelay)
|
|
377
|
+
setTimeout(() => autosaveDraft(retryAttempt + 1), retryDelay)
|
|
391
378
|
} else {
|
|
392
379
|
setAutosaveStatus('error')
|
|
393
380
|
setAutosaveError(errorMessage)
|
|
@@ -404,39 +391,64 @@ export function ContentEntryEditor({
|
|
|
404
391
|
}, [autosaveDraft])
|
|
405
392
|
|
|
406
393
|
useEffect(() => {
|
|
407
|
-
if (!autosaveEnabled || !entry || entry.status !== 'draft')
|
|
408
|
-
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
if (autosaveTimerRef.current) {
|
|
412
|
-
clearTimeout(autosaveTimerRef.current)
|
|
413
|
-
}
|
|
414
|
-
|
|
394
|
+
if (!autosaveEnabled || !entry || entry.status !== 'draft') return
|
|
395
|
+
if (autosaveTimerRef.current) clearTimeout(autosaveTimerRef.current)
|
|
415
396
|
if (isDirty) {
|
|
416
|
-
autosaveTimerRef.current = setTimeout(() =>
|
|
417
|
-
autosaveDraft()
|
|
418
|
-
}, autosaveInterval)
|
|
397
|
+
autosaveTimerRef.current = setTimeout(() => autosaveDraft(), autosaveInterval)
|
|
419
398
|
}
|
|
420
|
-
|
|
421
399
|
return () => {
|
|
422
|
-
if (autosaveTimerRef.current)
|
|
423
|
-
clearTimeout(autosaveTimerRef.current)
|
|
424
|
-
}
|
|
400
|
+
if (autosaveTimerRef.current) clearTimeout(autosaveTimerRef.current)
|
|
425
401
|
}
|
|
426
402
|
}, [autosaveEnabled, autosaveInterval, isDirty, entry, autosaveDraft])
|
|
427
403
|
|
|
428
|
-
|
|
429
|
-
const [confirmAction, setConfirmAction] = useState<
|
|
430
|
-
'publish' | 'unpublish' | null
|
|
431
|
-
>(null)
|
|
404
|
+
// --- Handlers ---
|
|
432
405
|
|
|
433
|
-
const
|
|
434
|
-
|
|
435
|
-
|
|
406
|
+
const handleSubmit = useCallback(async () => {
|
|
407
|
+
const isValid = await validateForm()
|
|
408
|
+
if (!isValid) return
|
|
436
409
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
410
|
+
setIsSubmitting(true)
|
|
411
|
+
try {
|
|
412
|
+
let savedEntry: ContentEntry
|
|
413
|
+
const dataForBackend = transformDataForBackend(formData, contentType.fields)
|
|
414
|
+
|
|
415
|
+
if (entry) {
|
|
416
|
+
savedEntry = (await updateEntry({ id: entry._id, data: dataForBackend })) as ContentEntry
|
|
417
|
+
} else {
|
|
418
|
+
savedEntry = (await createEntry({
|
|
419
|
+
contentTypeName: contentType.name,
|
|
420
|
+
data: dataForBackend,
|
|
421
|
+
})) as ContentEntry
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
setIsDirty(false)
|
|
425
|
+
setLastSavedData({ ...formData })
|
|
426
|
+
toast.success('Changes saved')
|
|
427
|
+
onSave?.(savedEntry)
|
|
428
|
+
} catch (error) {
|
|
429
|
+
const { fieldErrors: serverFieldErrors, generalError } = parseServerError(error)
|
|
430
|
+
const message = generalError ?? (error instanceof Error ? error.message : 'Failed to save entry')
|
|
431
|
+
toast.error('Failed to save', { description: message })
|
|
432
|
+
if (Object.keys(serverFieldErrors).length > 0) {
|
|
433
|
+
setFieldErrors((prev) => ({ ...prev, ...serverFieldErrors }))
|
|
434
|
+
}
|
|
435
|
+
} finally {
|
|
436
|
+
setIsSubmitting(false)
|
|
437
|
+
}
|
|
438
|
+
}, [validateForm, entry, formData, contentType.fields, contentType.name, contentType._id, createEntry, updateEntry, onSave])
|
|
439
|
+
|
|
440
|
+
const handleCancel = useCallback(() => {
|
|
441
|
+
if (isDirty) {
|
|
442
|
+
setShowUnsavedWarning(true)
|
|
443
|
+
return
|
|
444
|
+
}
|
|
445
|
+
onCancel?.()
|
|
446
|
+
}, [isDirty, onCancel])
|
|
447
|
+
|
|
448
|
+
const handleConfirmLeave = useCallback(() => {
|
|
449
|
+
setShowUnsavedWarning(false)
|
|
450
|
+
onCancel?.()
|
|
451
|
+
}, [onCancel])
|
|
440
452
|
|
|
441
453
|
const handlePublishClick = useCallback(() => {
|
|
442
454
|
setConfirmAction('publish')
|
|
@@ -450,52 +462,37 @@ export function ContentEntryEditor({
|
|
|
450
462
|
|
|
451
463
|
const handleConfirmAction = useCallback(async () => {
|
|
452
464
|
if (!entry || !confirmAction) return
|
|
453
|
-
|
|
454
465
|
setShowConfirmModal(false)
|
|
455
466
|
setIsPublishing(true)
|
|
456
467
|
setPublishError(null)
|
|
457
468
|
|
|
458
469
|
try {
|
|
459
470
|
if (confirmAction === 'publish') {
|
|
460
|
-
const publishedEntry = (await publishEntry({
|
|
461
|
-
|
|
462
|
-
changeDescription: 'Published from editor',
|
|
463
|
-
})) as ContentEntry
|
|
471
|
+
const publishedEntry = (await publishEntry({ id: entry._id, changeDescription: 'Published from editor' })) as ContentEntry
|
|
472
|
+
toast.success('Entry published')
|
|
464
473
|
onSave?.(publishedEntry)
|
|
465
474
|
} else {
|
|
466
|
-
const draftEntry = (await unpublishEntry({
|
|
467
|
-
|
|
468
|
-
})) as ContentEntry
|
|
475
|
+
const draftEntry = (await unpublishEntry({ id: entry._id })) as ContentEntry
|
|
476
|
+
toast.success('Entry unpublished')
|
|
469
477
|
onSave?.(draftEntry)
|
|
470
478
|
}
|
|
471
479
|
} catch (error) {
|
|
472
|
-
|
|
473
|
-
error instanceof Error
|
|
474
|
-
? error.message
|
|
475
|
-
: `Failed to ${confirmAction}`
|
|
476
|
-
setPublishError(message)
|
|
480
|
+
toast.error(`Failed to ${confirmAction}`, { description: error instanceof Error ? error.message : undefined })
|
|
477
481
|
} finally {
|
|
478
482
|
setIsPublishing(false)
|
|
479
483
|
setConfirmAction(null)
|
|
480
484
|
}
|
|
481
485
|
}, [entry, confirmAction, publishEntry, unpublishEntry, onSave])
|
|
482
486
|
|
|
483
|
-
const
|
|
487
|
+
const handlePublishNow = useCallback(async () => {
|
|
484
488
|
if (!entry) return
|
|
485
|
-
|
|
486
489
|
setIsPublishing(true)
|
|
487
|
-
setPublishError(null)
|
|
488
|
-
|
|
489
490
|
try {
|
|
490
|
-
const publishedEntry = (await publishEntry({
|
|
491
|
-
|
|
492
|
-
changeDescription: 'Published from editor',
|
|
493
|
-
})) as ContentEntry
|
|
491
|
+
const publishedEntry = (await publishEntry({ id: entry._id, changeDescription: 'Published from editor' })) as ContentEntry
|
|
492
|
+
toast.success('Entry published')
|
|
494
493
|
onSave?.(publishedEntry)
|
|
495
494
|
} catch (error) {
|
|
496
|
-
|
|
497
|
-
error instanceof Error ? error.message : 'Failed to publish'
|
|
498
|
-
setPublishError(message)
|
|
495
|
+
toast.error('Failed to publish', { description: error instanceof Error ? error.message : undefined })
|
|
499
496
|
} finally {
|
|
500
497
|
setIsPublishing(false)
|
|
501
498
|
}
|
|
@@ -503,29 +500,19 @@ export function ContentEntryEditor({
|
|
|
503
500
|
|
|
504
501
|
const handleSchedule = useCallback(async () => {
|
|
505
502
|
if (!entry) return
|
|
506
|
-
|
|
507
503
|
const publishAt = parseDateTimeLocal(scheduleDateTime)
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
if (publishAt < minimumTime) {
|
|
504
|
+
if (publishAt < Date.now() + 60 * 1000) {
|
|
511
505
|
setPublishError('Schedule time must be at least 1 minute in the future')
|
|
512
506
|
return
|
|
513
507
|
}
|
|
514
|
-
|
|
515
508
|
setIsPublishing(true)
|
|
516
509
|
setPublishError(null)
|
|
517
|
-
|
|
518
510
|
try {
|
|
519
|
-
const scheduledEntry = (await scheduleEntry({
|
|
520
|
-
id: entry._id,
|
|
521
|
-
publishAt,
|
|
522
|
-
})) as ContentEntry
|
|
511
|
+
const scheduledEntry = (await scheduleEntry({ id: entry._id, publishAt })) as ContentEntry
|
|
523
512
|
setShowScheduleModal(false)
|
|
524
513
|
onSave?.(scheduledEntry)
|
|
525
514
|
} catch (error) {
|
|
526
|
-
|
|
527
|
-
error instanceof Error ? error.message : 'Failed to schedule'
|
|
528
|
-
setPublishError(message)
|
|
515
|
+
setPublishError(error instanceof Error ? error.message : 'Failed to schedule')
|
|
529
516
|
} finally {
|
|
530
517
|
setIsPublishing(false)
|
|
531
518
|
}
|
|
@@ -533,19 +520,13 @@ export function ContentEntryEditor({
|
|
|
533
520
|
|
|
534
521
|
const handleCancelSchedule = useCallback(async () => {
|
|
535
522
|
if (!entry) return
|
|
536
|
-
|
|
537
523
|
setIsPublishing(true)
|
|
538
524
|
setPublishError(null)
|
|
539
|
-
|
|
540
525
|
try {
|
|
541
|
-
const draftEntry = (await cancelScheduleEntry({
|
|
542
|
-
id: entry._id,
|
|
543
|
-
})) as ContentEntry
|
|
526
|
+
const draftEntry = (await cancelScheduleEntry({ id: entry._id })) as ContentEntry
|
|
544
527
|
onSave?.(draftEntry)
|
|
545
528
|
} catch (error) {
|
|
546
|
-
|
|
547
|
-
error instanceof Error ? error.message : 'Failed to cancel schedule'
|
|
548
|
-
setPublishError(message)
|
|
529
|
+
setPublishError(error instanceof Error ? error.message : 'Failed to cancel schedule')
|
|
549
530
|
} finally {
|
|
550
531
|
setIsPublishing(false)
|
|
551
532
|
}
|
|
@@ -558,21 +539,14 @@ export function ContentEntryEditor({
|
|
|
558
539
|
|
|
559
540
|
const handleDeleteConfirm = useCallback(async () => {
|
|
560
541
|
if (!entry) return
|
|
561
|
-
|
|
562
542
|
setIsDeleting(true)
|
|
563
543
|
setDeleteError(null)
|
|
564
|
-
|
|
565
544
|
try {
|
|
566
|
-
await deleteEntryMutation({
|
|
567
|
-
id: entry._id,
|
|
568
|
-
hardDelete: false,
|
|
569
|
-
})
|
|
545
|
+
await deleteEntryMutation({ id: entry._id, hardDelete: false })
|
|
570
546
|
setShowDeleteModal(false)
|
|
571
547
|
onDelete?.()
|
|
572
548
|
} catch (error) {
|
|
573
|
-
|
|
574
|
-
error instanceof Error ? error.message : 'Failed to delete entry'
|
|
575
|
-
setDeleteError(message)
|
|
549
|
+
setDeleteError(error instanceof Error ? error.message : 'Failed to delete entry')
|
|
576
550
|
} finally {
|
|
577
551
|
setIsDeleting(false)
|
|
578
552
|
}
|
|
@@ -580,19 +554,13 @@ export function ContentEntryEditor({
|
|
|
580
554
|
|
|
581
555
|
const handleDuplicate = useCallback(async () => {
|
|
582
556
|
if (!entry) return
|
|
583
|
-
|
|
584
557
|
setIsDuplicating(true)
|
|
585
|
-
setSubmitError(null)
|
|
586
|
-
|
|
587
558
|
try {
|
|
588
|
-
const duplicatedEntry = (await duplicateEntryMutation({
|
|
589
|
-
|
|
590
|
-
})) as ContentEntry
|
|
559
|
+
const duplicatedEntry = (await duplicateEntryMutation({ sourceEntryId: entry._id })) as ContentEntry
|
|
560
|
+
toast.success('Entry duplicated')
|
|
591
561
|
onSave?.(duplicatedEntry)
|
|
592
562
|
} catch (error) {
|
|
593
|
-
|
|
594
|
-
error instanceof Error ? error.message : 'Failed to duplicate entry'
|
|
595
|
-
setSubmitError(message)
|
|
563
|
+
toast.error('Failed to duplicate', { description: error instanceof Error ? error.message : undefined })
|
|
596
564
|
} finally {
|
|
597
565
|
setIsDuplicating(false)
|
|
598
566
|
}
|
|
@@ -600,457 +568,196 @@ export function ContentEntryEditor({
|
|
|
600
568
|
|
|
601
569
|
const handleArchive = useCallback(async () => {
|
|
602
570
|
if (!entry) return
|
|
603
|
-
|
|
604
571
|
setIsArchiving(true)
|
|
605
|
-
setSubmitError(null)
|
|
606
|
-
|
|
607
572
|
try {
|
|
608
|
-
const archivedEntry = (await updateEntry({
|
|
609
|
-
|
|
610
|
-
status: 'archived',
|
|
611
|
-
})) as ContentEntry
|
|
573
|
+
const archivedEntry = (await updateEntry({ id: entry._id, status: 'archived' })) as ContentEntry
|
|
574
|
+
toast.success('Entry archived')
|
|
612
575
|
onSave?.(archivedEntry)
|
|
613
576
|
} catch (error) {
|
|
614
|
-
|
|
615
|
-
error instanceof Error ? error.message : 'Failed to archive entry'
|
|
616
|
-
setSubmitError(message)
|
|
577
|
+
toast.error('Failed to archive', { description: error instanceof Error ? error.message : undefined })
|
|
617
578
|
} finally {
|
|
618
579
|
setIsArchiving(false)
|
|
619
580
|
}
|
|
620
581
|
}, [entry, updateEntry, onSave])
|
|
621
582
|
|
|
622
|
-
|
|
623
|
-
async (e: React.FormEvent) => {
|
|
624
|
-
e.preventDefault()
|
|
625
|
-
setSubmitError(null)
|
|
626
|
-
|
|
627
|
-
const isValid = await validateForm()
|
|
628
|
-
if (!isValid) {
|
|
629
|
-
return
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
setIsSubmitting(true)
|
|
583
|
+
// --- Derived ---
|
|
633
584
|
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
const dataForBackend = transformDataForBackend(
|
|
638
|
-
formData,
|
|
639
|
-
contentType.fields
|
|
640
|
-
)
|
|
641
|
-
|
|
642
|
-
if (entry) {
|
|
643
|
-
savedEntry = (await updateEntry({
|
|
644
|
-
id: entry._id,
|
|
645
|
-
data: dataForBackend,
|
|
646
|
-
})) as ContentEntry
|
|
647
|
-
} else {
|
|
648
|
-
savedEntry = (await createEntry({
|
|
649
|
-
contentTypeName: contentType.name,
|
|
650
|
-
data: dataForBackend,
|
|
651
|
-
})) as ContentEntry
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
setIsDirty(false)
|
|
655
|
-
setLastSavedData({ ...formData })
|
|
656
|
-
setSaveSuccess(true)
|
|
657
|
-
setTimeout(() => setSaveSuccess(false), 3000)
|
|
658
|
-
onSave?.(savedEntry)
|
|
659
|
-
} catch (error) {
|
|
660
|
-
const { fieldErrors: serverFieldErrors, generalError } =
|
|
661
|
-
parseServerError(error)
|
|
662
|
-
const message =
|
|
663
|
-
generalError ??
|
|
664
|
-
(error instanceof Error ? error.message : 'Failed to save entry')
|
|
585
|
+
const entryTitle = contentType.titleField
|
|
586
|
+
? (formData[contentType.titleField] as string) || undefined
|
|
587
|
+
: undefined
|
|
665
588
|
|
|
666
|
-
|
|
589
|
+
const hasScheduling = !!settings?.features.scheduling
|
|
590
|
+
const hasVersioning = !!settings?.features.versioning
|
|
667
591
|
|
|
668
|
-
|
|
669
|
-
setFieldErrors((prev) => ({ ...prev, ...serverFieldErrors }))
|
|
670
|
-
}
|
|
671
|
-
} finally {
|
|
672
|
-
setIsSubmitting(false)
|
|
673
|
-
}
|
|
674
|
-
},
|
|
675
|
-
[
|
|
676
|
-
validateForm,
|
|
677
|
-
entry,
|
|
678
|
-
formData,
|
|
679
|
-
contentType._id,
|
|
680
|
-
createEntry,
|
|
681
|
-
updateEntry,
|
|
682
|
-
onSave,
|
|
683
|
-
]
|
|
684
|
-
)
|
|
685
|
-
|
|
686
|
-
const handleCancel = useCallback(() => {
|
|
687
|
-
if (isDirty) {
|
|
688
|
-
const confirmed = window.confirm(
|
|
689
|
-
'You have unsaved changes. Are you sure you want to leave?'
|
|
690
|
-
)
|
|
691
|
-
if (!confirmed) return
|
|
692
|
-
}
|
|
693
|
-
onCancel?.()
|
|
694
|
-
}, [isDirty, onCancel])
|
|
695
|
-
|
|
696
|
-
const getAutosaveStatusText = () => {
|
|
697
|
-
switch (autosaveStatus) {
|
|
698
|
-
case 'saving':
|
|
699
|
-
return autosaveRetryCount > 0
|
|
700
|
-
? `Retrying (${autosaveRetryCount}/${maxAutosaveRetries})...`
|
|
701
|
-
: 'Saving...'
|
|
702
|
-
case 'saved':
|
|
703
|
-
return 'Draft saved'
|
|
704
|
-
case 'error':
|
|
705
|
-
return autosaveError ?? 'Autosave failed'
|
|
706
|
-
default:
|
|
707
|
-
return null
|
|
708
|
-
}
|
|
709
|
-
}
|
|
592
|
+
// --- Render ---
|
|
710
593
|
|
|
711
594
|
return (
|
|
712
|
-
<
|
|
713
|
-
{/*
|
|
714
|
-
<
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
{getAutosaveStatusText()}
|
|
744
|
-
</span>
|
|
745
|
-
{autosaveStatus === 'error' && autosaveRetryCount === 0 && (
|
|
746
|
-
<button
|
|
747
|
-
type="button"
|
|
748
|
-
onClick={handleAutosaveRetry}
|
|
749
|
-
className="text-sm text-primary hover:underline"
|
|
750
|
-
data-testid="autosave-retry-button"
|
|
751
|
-
>
|
|
752
|
-
<RefreshCw className="size-3" />
|
|
753
|
-
</button>
|
|
754
|
-
)}
|
|
755
|
-
</div>
|
|
756
|
-
)}
|
|
757
|
-
|
|
758
|
-
{isDirty && (
|
|
759
|
-
<span className="text-sm text-warning">Unsaved changes</span>
|
|
760
|
-
)}
|
|
761
|
-
</div>
|
|
762
|
-
</div>
|
|
595
|
+
<div className="flex h-full flex-col">
|
|
596
|
+
{/* Sticky Toolbar */}
|
|
597
|
+
<EditorToolbar
|
|
598
|
+
contentType={contentType}
|
|
599
|
+
entry={entry}
|
|
600
|
+
entryTitle={entryTitle}
|
|
601
|
+
isDirty={isDirty}
|
|
602
|
+
isSubmitting={isSubmitting}
|
|
603
|
+
isPublishing={isPublishing}
|
|
604
|
+
autosaveStatus={autosaveStatus}
|
|
605
|
+
autosaveError={autosaveError}
|
|
606
|
+
autosaveRetryCount={autosaveRetryCount}
|
|
607
|
+
maxAutosaveRetries={maxAutosaveRetries}
|
|
608
|
+
canDelete={canDeleteProp}
|
|
609
|
+
hasScheduling={hasScheduling}
|
|
610
|
+
onSave={handleSubmit}
|
|
611
|
+
onCancel={handleCancel}
|
|
612
|
+
onPublishClick={handlePublishClick}
|
|
613
|
+
onUnpublishClick={handleUnpublishClick}
|
|
614
|
+
onScheduleClick={() => setShowScheduleModal(true)}
|
|
615
|
+
onCancelSchedule={handleCancelSchedule}
|
|
616
|
+
onPublishNow={handlePublishNow}
|
|
617
|
+
onDuplicate={handleDuplicate}
|
|
618
|
+
onArchive={handleArchive}
|
|
619
|
+
onDelete={handleDeleteClick}
|
|
620
|
+
onAutosaveRetry={handleAutosaveRetry}
|
|
621
|
+
onToggleProperties={() => setShowMobileProperties(true)}
|
|
622
|
+
siblingEntries={siblingEntries}
|
|
623
|
+
onNavigateToEntry={onNavigateToEntry}
|
|
624
|
+
onNavigateToNewEntry={onNavigateToNewEntry}
|
|
625
|
+
/>
|
|
763
626
|
|
|
764
|
-
{/*
|
|
765
|
-
{
|
|
766
|
-
<
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
627
|
+
{/* Unsaved changes warning */}
|
|
628
|
+
<AlertDialog open={showUnsavedWarning} onOpenChange={setShowUnsavedWarning}>
|
|
629
|
+
<AlertDialogContent>
|
|
630
|
+
<AlertDialogHeader>
|
|
631
|
+
<AlertDialogTitle>Unsaved changes</AlertDialogTitle>
|
|
632
|
+
<AlertDialogDescription>
|
|
633
|
+
You have unsaved changes that will be lost if you leave.
|
|
634
|
+
</AlertDialogDescription>
|
|
635
|
+
</AlertDialogHeader>
|
|
636
|
+
<AlertDialogFooter>
|
|
637
|
+
<AlertDialogCancel>Keep editing</AlertDialogCancel>
|
|
638
|
+
<AlertDialogAction onClick={handleConfirmLeave} className="bg-destructive text-destructive-foreground hover:bg-destructive/90">
|
|
639
|
+
Discard changes
|
|
640
|
+
</AlertDialogAction>
|
|
641
|
+
</AlertDialogFooter>
|
|
642
|
+
</AlertDialogContent>
|
|
643
|
+
</AlertDialog>
|
|
644
|
+
|
|
645
|
+
{/* Two-panel layout — each panel scrolls independently */}
|
|
646
|
+
<div className="flex min-h-0 flex-1">
|
|
647
|
+
{/* Content panel — independent scroll */}
|
|
648
|
+
<div className="min-w-0 flex-1 overflow-y-auto p-6">
|
|
649
|
+
<EditorContentPanel
|
|
650
|
+
fields={contentType.fields as FieldDefinition[]}
|
|
651
|
+
formData={formData}
|
|
652
|
+
fieldErrors={fieldErrors}
|
|
653
|
+
isSubmitting={isSubmitting}
|
|
654
|
+
onFieldChange={handleFieldChange}
|
|
655
|
+
/>
|
|
772
656
|
</div>
|
|
773
|
-
)}
|
|
774
657
|
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
className="
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
658
|
+
{/* Properties panel — independent scroll, desktop only */}
|
|
659
|
+
{entry && (
|
|
660
|
+
<aside className="hidden w-80 shrink-0 overflow-y-auto border-l p-6 lg:block">
|
|
661
|
+
<EditorPropertiesPanel
|
|
662
|
+
entry={entry}
|
|
663
|
+
hasScheduling={hasScheduling}
|
|
664
|
+
hasVersioning={hasVersioning}
|
|
665
|
+
canDelete={canDeleteProp}
|
|
666
|
+
isSubmitting={isSubmitting}
|
|
667
|
+
isPublishing={isPublishing}
|
|
668
|
+
isDuplicating={isDuplicating}
|
|
669
|
+
isArchiving={isArchiving}
|
|
670
|
+
isDeleting={isDeleting}
|
|
671
|
+
onPublishClick={handlePublishClick}
|
|
672
|
+
onUnpublishClick={handleUnpublishClick}
|
|
673
|
+
onScheduleClick={() => setShowScheduleModal(true)}
|
|
674
|
+
onCancelSchedule={handleCancelSchedule}
|
|
675
|
+
onPublishNow={handlePublishNow}
|
|
676
|
+
onDuplicate={handleDuplicate}
|
|
677
|
+
onArchive={handleArchive}
|
|
678
|
+
onDelete={handleDeleteClick}
|
|
679
|
+
onViewHistory={() => setShowVersionHistory(true)}
|
|
680
|
+
/>
|
|
681
|
+
</aside>
|
|
682
|
+
)}
|
|
796
683
|
</div>
|
|
797
684
|
|
|
798
|
-
{/*
|
|
799
|
-
|
|
800
|
-
<
|
|
801
|
-
|
|
802
|
-
<
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
isPublishing ||
|
|
827
|
-
isDeleting ||
|
|
828
|
-
isDuplicating ||
|
|
829
|
-
isArchiving
|
|
830
|
-
}
|
|
831
|
-
loading={isDuplicating}
|
|
832
|
-
data-testid="duplicate-button"
|
|
833
|
-
>
|
|
834
|
-
Duplicate
|
|
835
|
-
</CmsButton>
|
|
836
|
-
)}
|
|
837
|
-
|
|
838
|
-
{entry &&
|
|
839
|
-
(entry.status === 'draft' || entry.status === 'scheduled') && (
|
|
840
|
-
<CmsButton
|
|
841
|
-
type="button"
|
|
842
|
-
variant="secondary"
|
|
843
|
-
onClick={handleArchive}
|
|
844
|
-
disabled={
|
|
845
|
-
isSubmitting ||
|
|
846
|
-
isPublishing ||
|
|
847
|
-
isDeleting ||
|
|
848
|
-
isDuplicating ||
|
|
849
|
-
isArchiving
|
|
850
|
-
}
|
|
851
|
-
loading={isArchiving}
|
|
852
|
-
data-testid="archive-button"
|
|
853
|
-
>
|
|
854
|
-
Archive
|
|
855
|
-
</CmsButton>
|
|
856
|
-
)}
|
|
857
|
-
|
|
858
|
-
{entry && (
|
|
859
|
-
<div className="flex items-center gap-4 text-sm text-muted-foreground">
|
|
860
|
-
{settings?.features.versioning && (
|
|
861
|
-
<button
|
|
862
|
-
type="button"
|
|
863
|
-
onClick={() => setShowVersionHistory(true)}
|
|
864
|
-
className="flex items-center gap-2 rounded-md border bg-muted/30 px-3 py-1.5 transition-colors hover:bg-muted/50"
|
|
865
|
-
>
|
|
866
|
-
<History className="size-4 text-muted-foreground" />
|
|
867
|
-
<span className="text-xs font-medium text-foreground">
|
|
868
|
-
Version {entry.version}
|
|
869
|
-
</span>
|
|
870
|
-
<span className="text-xs text-muted-foreground">
|
|
871
|
-
View history
|
|
872
|
-
</span>
|
|
873
|
-
</button>
|
|
874
|
-
)}
|
|
875
|
-
|
|
876
|
-
{entry.lastPublishedAt && (
|
|
877
|
-
<span
|
|
878
|
-
className="text-xs"
|
|
879
|
-
data-testid="last-published-time"
|
|
880
|
-
>
|
|
881
|
-
Last published:{' '}
|
|
882
|
-
{new Date(entry.lastPublishedAt).toLocaleString()}
|
|
883
|
-
</span>
|
|
884
|
-
)}
|
|
885
|
-
|
|
886
|
-
{settings?.features.scheduling &&
|
|
887
|
-
entry.status === 'scheduled' &&
|
|
888
|
-
entry.scheduledPublishAt && (
|
|
889
|
-
<span
|
|
890
|
-
className="flex items-center gap-1 text-xs text-info"
|
|
891
|
-
data-testid="scheduled-time"
|
|
892
|
-
>
|
|
893
|
-
<Clock className="size-3" />
|
|
894
|
-
Scheduled:{' '}
|
|
895
|
-
{new Date(entry.scheduledPublishAt).toLocaleString()}
|
|
896
|
-
</span>
|
|
897
|
-
)}
|
|
685
|
+
{/* Mobile properties drawer (bottom sheet) */}
|
|
686
|
+
{entry && (
|
|
687
|
+
<Drawer open={showMobileProperties} onOpenChange={setShowMobileProperties}>
|
|
688
|
+
<DrawerContent>
|
|
689
|
+
<DrawerHeader>
|
|
690
|
+
<DrawerTitle>Properties</DrawerTitle>
|
|
691
|
+
</DrawerHeader>
|
|
692
|
+
<div className="overflow-y-auto px-4 pb-6">
|
|
693
|
+
<EditorPropertiesPanel
|
|
694
|
+
entry={entry}
|
|
695
|
+
hasScheduling={hasScheduling}
|
|
696
|
+
hasVersioning={hasVersioning}
|
|
697
|
+
canDelete={canDeleteProp}
|
|
698
|
+
isSubmitting={isSubmitting}
|
|
699
|
+
isPublishing={isPublishing}
|
|
700
|
+
isDuplicating={isDuplicating}
|
|
701
|
+
isArchiving={isArchiving}
|
|
702
|
+
isDeleting={isDeleting}
|
|
703
|
+
onPublishClick={handlePublishClick}
|
|
704
|
+
onUnpublishClick={handleUnpublishClick}
|
|
705
|
+
onScheduleClick={() => setShowScheduleModal(true)}
|
|
706
|
+
onCancelSchedule={handleCancelSchedule}
|
|
707
|
+
onPublishNow={handlePublishNow}
|
|
708
|
+
onDuplicate={handleDuplicate}
|
|
709
|
+
onArchive={handleArchive}
|
|
710
|
+
onDelete={handleDeleteClick}
|
|
711
|
+
onViewHistory={() => setShowVersionHistory(true)}
|
|
712
|
+
/>
|
|
898
713
|
</div>
|
|
899
|
-
|
|
900
|
-
</
|
|
714
|
+
</DrawerContent>
|
|
715
|
+
</Drawer>
|
|
716
|
+
)}
|
|
901
717
|
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
loading={isSubmitting}
|
|
917
|
-
>
|
|
918
|
-
{entry ? 'Save Changes' : 'Create Entry'}
|
|
919
|
-
</CmsButton>
|
|
920
|
-
|
|
921
|
-
{entry && (
|
|
922
|
-
<>
|
|
923
|
-
{entry.status === 'draft' && (
|
|
924
|
-
<>
|
|
925
|
-
{settings?.features.scheduling && (
|
|
926
|
-
<CmsButton
|
|
927
|
-
type="button"
|
|
928
|
-
variant="secondary"
|
|
929
|
-
onClick={() => setShowScheduleModal(true)}
|
|
930
|
-
disabled={isSubmitting || isPublishing}
|
|
931
|
-
>
|
|
932
|
-
Schedule
|
|
933
|
-
</CmsButton>
|
|
934
|
-
)}
|
|
935
|
-
<CmsButton
|
|
936
|
-
type="button"
|
|
937
|
-
variant="success"
|
|
938
|
-
onClick={handlePublishClick}
|
|
939
|
-
disabled={isSubmitting || isPublishing}
|
|
940
|
-
loading={isPublishing}
|
|
941
|
-
data-testid="publish-button"
|
|
942
|
-
>
|
|
943
|
-
Publish Now
|
|
944
|
-
</CmsButton>
|
|
945
|
-
</>
|
|
946
|
-
)}
|
|
947
|
-
|
|
948
|
-
{settings?.features.scheduling && entry.status === 'scheduled' && (
|
|
949
|
-
<>
|
|
950
|
-
<CmsButton
|
|
951
|
-
type="button"
|
|
952
|
-
variant="secondary"
|
|
953
|
-
onClick={handleCancelSchedule}
|
|
954
|
-
disabled={isSubmitting || isPublishing}
|
|
955
|
-
>
|
|
956
|
-
Cancel Schedule
|
|
957
|
-
</CmsButton>
|
|
958
|
-
<CmsButton
|
|
959
|
-
type="button"
|
|
960
|
-
variant="success"
|
|
961
|
-
onClick={handlePublish}
|
|
962
|
-
disabled={isSubmitting || isPublishing}
|
|
963
|
-
loading={isPublishing}
|
|
964
|
-
>
|
|
965
|
-
Publish Now
|
|
966
|
-
</CmsButton>
|
|
967
|
-
</>
|
|
968
|
-
)}
|
|
969
|
-
|
|
970
|
-
{entry.status === 'published' && (
|
|
971
|
-
<CmsButton
|
|
972
|
-
type="button"
|
|
973
|
-
variant="warning"
|
|
974
|
-
onClick={handleUnpublishClick}
|
|
975
|
-
disabled={isSubmitting || isPublishing}
|
|
976
|
-
loading={isPublishing}
|
|
977
|
-
data-testid="unpublish-button"
|
|
978
|
-
>
|
|
979
|
-
Unpublish
|
|
980
|
-
</CmsButton>
|
|
981
|
-
)}
|
|
982
|
-
</>
|
|
983
|
-
)}
|
|
984
|
-
</div>
|
|
985
|
-
</div>
|
|
718
|
+
{/* Version History sheet */}
|
|
719
|
+
{hasVersioning && entry && (
|
|
720
|
+
<Sheet open={showVersionHistory} onOpenChange={setShowVersionHistory}>
|
|
721
|
+
<SheetContent side="right" className="w-96 sm:w-[420px]">
|
|
722
|
+
<SheetTitle>Version History</SheetTitle>
|
|
723
|
+
<VersionHistory
|
|
724
|
+
entryId={entry._id}
|
|
725
|
+
currentVersion={entry.version}
|
|
726
|
+
onRollbackComplete={() => setShowVersionHistory(false)}
|
|
727
|
+
onClose={() => setShowVersionHistory(false)}
|
|
728
|
+
/>
|
|
729
|
+
</SheetContent>
|
|
730
|
+
</Sheet>
|
|
731
|
+
)}
|
|
986
732
|
|
|
987
|
-
{/*
|
|
988
|
-
{
|
|
989
|
-
<
|
|
733
|
+
{/* Modals */}
|
|
734
|
+
{hasScheduling && (
|
|
735
|
+
<ScheduleModal
|
|
990
736
|
open={showScheduleModal}
|
|
991
737
|
onOpenChange={setShowScheduleModal}
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
>
|
|
1000
|
-
Cancel
|
|
1001
|
-
</CmsButton>
|
|
1002
|
-
<CmsButton
|
|
1003
|
-
variant="primary"
|
|
1004
|
-
onClick={handleSchedule}
|
|
1005
|
-
loading={isPublishing}
|
|
1006
|
-
>
|
|
1007
|
-
Schedule
|
|
1008
|
-
</CmsButton>
|
|
1009
|
-
</>
|
|
1010
|
-
}
|
|
1011
|
-
>
|
|
1012
|
-
<div className="space-y-4">
|
|
1013
|
-
<p className="text-sm text-muted-foreground">
|
|
1014
|
-
Choose when this content should be automatically published:
|
|
1015
|
-
</p>
|
|
1016
|
-
<Input
|
|
1017
|
-
type="datetime-local"
|
|
1018
|
-
value={scheduleDateTime}
|
|
1019
|
-
onChange={(e) => setScheduleDateTime(e.target.value)}
|
|
1020
|
-
min={formatDateTimeLocal(Date.now() + 60 * 1000)}
|
|
1021
|
-
/>
|
|
1022
|
-
{publishError && (
|
|
1023
|
-
<p className="text-sm text-destructive">{publishError}</p>
|
|
1024
|
-
)}
|
|
1025
|
-
</div>
|
|
1026
|
-
</CmsDialog>
|
|
738
|
+
scheduleDateTime={scheduleDateTime}
|
|
739
|
+
onScheduleDateTimeChange={setScheduleDateTime}
|
|
740
|
+
onSchedule={handleSchedule}
|
|
741
|
+
isPublishing={isPublishing}
|
|
742
|
+
publishError={publishError}
|
|
743
|
+
minDateTime={formatDateTimeLocal(Date.now() + 60 * 1000)}
|
|
744
|
+
/>
|
|
1027
745
|
)}
|
|
1028
746
|
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
open={showConfirmModal && confirmAction !== null}
|
|
747
|
+
<PublishConfirmModal
|
|
748
|
+
open={showConfirmModal}
|
|
1032
749
|
onOpenChange={(open) => {
|
|
1033
750
|
if (!open) {
|
|
1034
751
|
setShowConfirmModal(false)
|
|
1035
752
|
setConfirmAction(null)
|
|
1036
753
|
}
|
|
1037
754
|
}}
|
|
1038
|
-
|
|
1039
|
-
confirmAction === 'publish' ? 'Confirm Publish' : 'Confirm Unpublish'
|
|
1040
|
-
}
|
|
1041
|
-
description={
|
|
1042
|
-
confirmAction === 'publish'
|
|
1043
|
-
? 'Are you sure you want to publish this entry? It will become publicly visible.'
|
|
1044
|
-
: 'Are you sure you want to unpublish this entry? It will no longer be publicly visible.'
|
|
1045
|
-
}
|
|
1046
|
-
confirmLabel={confirmAction === 'publish' ? 'Publish' : 'Unpublish'}
|
|
1047
|
-
variant={confirmAction === 'publish' ? 'primary' : 'warning'}
|
|
755
|
+
action={confirmAction}
|
|
1048
756
|
onConfirm={handleConfirmAction}
|
|
1049
|
-
|
|
757
|
+
isPublishing={isPublishing}
|
|
1050
758
|
/>
|
|
1051
759
|
|
|
1052
|
-
|
|
1053
|
-
<CmsConfirmDialog
|
|
760
|
+
<DeleteConfirmModal
|
|
1054
761
|
open={showDeleteModal}
|
|
1055
762
|
onOpenChange={(open) => {
|
|
1056
763
|
if (!open && !isDeleting) {
|
|
@@ -1058,28 +765,10 @@ export function ContentEntryEditor({
|
|
|
1058
765
|
setDeleteError(null)
|
|
1059
766
|
}
|
|
1060
767
|
}}
|
|
1061
|
-
title="Delete Entry"
|
|
1062
|
-
description="Are you sure you want to delete this entry? It will be moved to the trash and can be restored within the retention period."
|
|
1063
|
-
confirmLabel="Delete"
|
|
1064
|
-
variant="danger"
|
|
1065
768
|
onConfirm={handleDeleteConfirm}
|
|
1066
|
-
|
|
769
|
+
isDeleting={isDeleting}
|
|
1067
770
|
error={deleteError}
|
|
1068
771
|
/>
|
|
1069
|
-
|
|
1070
|
-
{/* Version History Panel */}
|
|
1071
|
-
{settings?.features.versioning && showVersionHistory && entry && (
|
|
1072
|
-
<div className="fixed inset-y-0 right-0 z-50 flex w-96 flex-col shadow-xl">
|
|
1073
|
-
<VersionHistory
|
|
1074
|
-
entryId={entry._id}
|
|
1075
|
-
currentVersion={entry.version}
|
|
1076
|
-
onRollbackComplete={() => {
|
|
1077
|
-
setShowVersionHistory(false)
|
|
1078
|
-
}}
|
|
1079
|
-
onClose={() => setShowVersionHistory(false)}
|
|
1080
|
-
/>
|
|
1081
|
-
</div>
|
|
1082
|
-
)}
|
|
1083
|
-
</form>
|
|
772
|
+
</div>
|
|
1084
773
|
)
|
|
1085
774
|
}
|