octocms 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/AdminApp.d.ts +18 -14
- package/dist/admin/AdminApp.d.ts.map +1 -1
- package/dist/admin/AdminApp.js +33 -20
- package/dist/admin/AdminApp.js.map +1 -1
- package/dist/admin/actions/entries.d.ts.map +1 -1
- package/dist/admin/actions/entries.js +38 -6
- package/dist/admin/actions/entries.js.map +1 -1
- package/dist/admin/index.d.ts +13 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +12 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/pages/AdminErrorView.d.ts +32 -0
- package/dist/admin/pages/AdminErrorView.d.ts.map +1 -0
- package/dist/admin/pages/AdminErrorView.js +40 -0
- package/dist/admin/pages/AdminErrorView.js.map +1 -0
- package/dist/admin/pages/AdminLayout.d.ts.map +1 -1
- package/dist/admin/pages/AdminLayout.js +1 -1
- package/dist/admin/pages/AdminLayout.js.map +1 -1
- package/dist/admin/pages/CollectionPage.d.ts +1 -1
- package/dist/admin/pages/CollectionPage.d.ts.map +1 -1
- package/dist/admin/pages/CollectionPage.js +22 -16
- package/dist/admin/pages/CollectionPage.js.map +1 -1
- package/dist/admin/pages/ContentModelPage.d.ts +1 -1
- package/dist/admin/pages/ContentModelPage.d.ts.map +1 -1
- package/dist/admin/pages/ContentModelPage.js +1 -5
- package/dist/admin/pages/ContentModelPage.js.map +1 -1
- package/dist/admin/pages/ContentPage.d.ts +2 -0
- package/dist/admin/pages/ContentPage.d.ts.map +1 -0
- package/dist/admin/pages/ContentPage.js +21 -0
- package/dist/admin/pages/ContentPage.js.map +1 -0
- package/dist/admin/pages/ContentTypePage.d.ts +1 -1
- package/dist/admin/pages/ContentTypePage.d.ts.map +1 -1
- package/dist/admin/pages/ContentTypePage.js +3 -6
- package/dist/admin/pages/ContentTypePage.js.map +1 -1
- package/dist/admin/pages/DashboardPage.d.ts +1 -1
- package/dist/admin/pages/DashboardPage.d.ts.map +1 -1
- package/dist/admin/pages/DashboardPage.js +5 -15
- package/dist/admin/pages/DashboardPage.js.map +1 -1
- package/dist/admin/pages/EntryPage.d.ts +1 -1
- package/dist/admin/pages/EntryPage.d.ts.map +1 -1
- package/dist/admin/pages/EntryPage.js +12 -16
- package/dist/admin/pages/EntryPage.js.map +1 -1
- package/dist/admin/pages/MediaAssetPage.d.ts +4 -0
- package/dist/admin/pages/MediaAssetPage.d.ts.map +1 -0
- package/dist/admin/pages/MediaAssetPage.js +21 -0
- package/dist/admin/pages/MediaAssetPage.js.map +1 -0
- package/dist/admin/pages/MediaPage.d.ts +1 -3
- package/dist/admin/pages/MediaPage.d.ts.map +1 -1
- package/dist/admin/pages/MediaPage.js +3 -6
- package/dist/admin/pages/MediaPage.js.map +1 -1
- package/dist/agent/index.cjs +1 -2
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/search.d.ts +1 -1
- package/dist/agent/search.js.map +1 -1
- package/dist/{agentDocs-YTR2WM5C.js → agentDocs-L4RLZCYK.js} +2 -2
- package/dist/{chunk-VTZ2KGUU.js → chunk-SJ3MPCWY.js} +24 -3
- package/dist/chunk-SJ3MPCWY.js.map +1 -0
- package/dist/cli/index.js +4 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/components/Chat/ChatPage.d.ts.map +1 -1
- package/dist/components/Chat/ChatPage.js +6 -6
- package/dist/components/Chat/ChatPage.js.map +1 -1
- package/dist/components/Chat/ChatPage.skeleton.d.ts +3 -0
- package/dist/components/Chat/ChatPage.skeleton.d.ts.map +1 -0
- package/dist/components/Chat/ChatPage.skeleton.js +22 -0
- package/dist/components/Chat/ChatPage.skeleton.js.map +1 -0
- package/dist/components/CommandK/CommandK.d.ts +12 -0
- package/dist/components/CommandK/CommandK.d.ts.map +1 -0
- package/dist/components/CommandK/CommandK.js +229 -0
- package/dist/components/CommandK/CommandK.js.map +1 -0
- package/dist/components/CommandK/parts.d.ts +20 -0
- package/dist/components/CommandK/parts.d.ts.map +1 -0
- package/dist/components/CommandK/parts.js +34 -0
- package/dist/components/CommandK/parts.js.map +1 -0
- package/dist/components/ContentModel/ContentModelList.d.ts.map +1 -1
- package/dist/components/ContentModel/ContentModelList.js +11 -19
- package/dist/components/ContentModel/ContentModelList.js.map +1 -1
- package/dist/components/ContentModel/ContentModelList.skeleton.d.ts +5 -0
- package/dist/components/ContentModel/ContentModelList.skeleton.d.ts.map +1 -0
- package/dist/components/ContentModel/ContentModelList.skeleton.js +16 -0
- package/dist/components/ContentModel/ContentModelList.skeleton.js.map +1 -0
- package/dist/components/ContentModel/ContentTypeDetail.js +2 -2
- package/dist/components/ContentModel/ContentTypeDetail.js.map +1 -1
- package/dist/components/ContentModel/ContentTypeDetail.skeleton.d.ts +5 -0
- package/dist/components/ContentModel/ContentTypeDetail.skeleton.d.ts.map +1 -0
- package/dist/components/ContentModel/ContentTypeDetail.skeleton.js +22 -0
- package/dist/components/ContentModel/ContentTypeDetail.skeleton.js.map +1 -0
- package/dist/components/ContentModel/CreateContentTypeDialog.js +1 -1
- package/dist/components/ContentModel/CreateContentTypeDialog.js.map +1 -1
- package/dist/components/ContentModel/DeleteContentTypeDialog.js +1 -1
- package/dist/components/ContentModel/DeleteContentTypeDialog.js.map +1 -1
- package/dist/components/ContentModel/EditContentTypeDialog.js +1 -1
- package/dist/components/ContentModel/EditContentTypeDialog.js.map +1 -1
- package/dist/components/ContentModel/SchemaImpactList.js +1 -1
- package/dist/components/ContentModel/SchemaImpactList.js.map +1 -1
- package/dist/components/ContentTypes.js +2 -2
- package/dist/components/ContentTypes.js.map +1 -1
- package/dist/components/Dashboard/DashboardContent.collection.skeleton.d.ts +3 -0
- package/dist/components/Dashboard/DashboardContent.collection.skeleton.d.ts.map +1 -0
- package/dist/components/Dashboard/DashboardContent.collection.skeleton.js +10 -0
- package/dist/components/Dashboard/DashboardContent.collection.skeleton.js.map +1 -0
- package/dist/components/Dashboard/DashboardContent.d.ts +3 -1
- package/dist/components/Dashboard/DashboardContent.d.ts.map +1 -1
- package/dist/components/Dashboard/DashboardContent.js +269 -109
- package/dist/components/Dashboard/DashboardContent.js.map +1 -1
- package/dist/components/Dashboard/DashboardContent.list.skeleton.d.ts +7 -0
- package/dist/components/Dashboard/DashboardContent.list.skeleton.d.ts.map +1 -0
- package/dist/components/Dashboard/DashboardContent.list.skeleton.js +22 -0
- package/dist/components/Dashboard/DashboardContent.list.skeleton.js.map +1 -0
- package/dist/components/Dashboard/DashboardContent.skeleton.d.ts +2 -0
- package/dist/components/Dashboard/DashboardContent.skeleton.d.ts.map +1 -0
- package/dist/components/Dashboard/DashboardContent.skeleton.js +13 -0
- package/dist/components/Dashboard/DashboardContent.skeleton.js.map +1 -0
- package/dist/components/EditPost/EditPost.d.ts.map +1 -1
- package/dist/components/EditPost/EditPost.js +3 -2
- package/dist/components/EditPost/EditPost.js.map +1 -1
- package/dist/components/EditPost/EditPost.skeleton.d.ts +5 -0
- package/dist/components/EditPost/EditPost.skeleton.d.ts.map +1 -0
- package/dist/components/EditPost/EditPost.skeleton.js +34 -0
- package/dist/components/EditPost/EditPost.skeleton.js.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +30 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.js +73 -0
- package/dist/components/ErrorBoundary.js.map +1 -0
- package/dist/components/FileExplorer/FileExplorer.d.ts.map +1 -1
- package/dist/components/FileExplorer/FileExplorer.js +2 -1
- package/dist/components/FileExplorer/FileExplorer.js.map +1 -1
- package/dist/components/FormFields.d.ts.map +1 -1
- package/dist/components/FormFields.js +4 -4
- package/dist/components/FormFields.js.map +1 -1
- package/dist/components/FormMarkdownField.d.ts.map +1 -1
- package/dist/components/FormMarkdownField.js +3 -2
- package/dist/components/FormMarkdownField.js.map +1 -1
- package/dist/components/Layout/Layout.d.ts.map +1 -1
- package/dist/components/Layout/Layout.js +8 -4
- package/dist/components/Layout/Layout.js.map +1 -1
- package/dist/components/Layout/LeftNavItem.d.ts +20 -0
- package/dist/components/Layout/LeftNavItem.d.ts.map +1 -0
- package/dist/components/Layout/LeftNavItem.js +24 -0
- package/dist/components/Layout/LeftNavItem.js.map +1 -0
- package/dist/components/Layout/PageBar.d.ts +10 -0
- package/dist/components/Layout/PageBar.d.ts.map +1 -0
- package/dist/components/Layout/PageBar.js +43 -0
- package/dist/components/Layout/PageBar.js.map +1 -0
- package/dist/components/Layout/PageShell.d.ts +30 -0
- package/dist/components/Layout/PageShell.d.ts.map +1 -0
- package/dist/components/Layout/PageShell.js +33 -0
- package/dist/components/Layout/PageShell.js.map +1 -0
- package/dist/components/Layout/TopHeader.d.ts +6 -0
- package/dist/components/Layout/TopHeader.d.ts.map +1 -0
- package/dist/components/Layout/TopHeader.js +291 -0
- package/dist/components/Layout/TopHeader.js.map +1 -0
- package/dist/components/MediaAsset/MediaAsset.d.ts +7 -0
- package/dist/components/MediaAsset/MediaAsset.d.ts.map +1 -0
- package/dist/components/MediaAsset/MediaAsset.js +236 -0
- package/dist/components/MediaAsset/MediaAsset.js.map +1 -0
- package/dist/components/MediaAsset/MediaAsset.skeleton.d.ts +3 -0
- package/dist/components/MediaAsset/MediaAsset.skeleton.d.ts.map +1 -0
- package/dist/components/MediaAsset/MediaAsset.skeleton.js +42 -0
- package/dist/components/MediaAsset/MediaAsset.skeleton.js.map +1 -0
- package/dist/components/MediaAsset/findMediaFileByRequestedId.d.ts +4 -0
- package/dist/components/MediaAsset/findMediaFileByRequestedId.d.ts.map +1 -0
- package/dist/components/MediaAsset/findMediaFileByRequestedId.js +15 -0
- package/dist/components/MediaAsset/findMediaFileByRequestedId.js.map +1 -0
- package/dist/components/MediaManager/CreateFolderDialog.d.ts +9 -0
- package/dist/components/MediaManager/CreateFolderDialog.d.ts.map +1 -0
- package/dist/components/MediaManager/CreateFolderDialog.js +68 -0
- package/dist/components/MediaManager/CreateFolderDialog.js.map +1 -0
- package/dist/components/MediaManager/DeleteFolderDialog.d.ts +8 -0
- package/dist/components/MediaManager/DeleteFolderDialog.d.ts.map +1 -0
- package/dist/components/MediaManager/DeleteFolderDialog.js +42 -0
- package/dist/components/MediaManager/DeleteFolderDialog.js.map +1 -0
- package/dist/components/MediaManager/MediaLeftPanel.d.ts +13 -0
- package/dist/components/MediaManager/MediaLeftPanel.d.ts.map +1 -0
- package/dist/components/MediaManager/MediaLeftPanel.js +93 -0
- package/dist/components/MediaManager/MediaLeftPanel.js.map +1 -0
- package/dist/components/MediaManager/MediaListTable.d.ts +6 -0
- package/dist/components/MediaManager/MediaListTable.d.ts.map +1 -0
- package/dist/components/MediaManager/MediaListTable.js +52 -0
- package/dist/components/MediaManager/MediaListTable.js.map +1 -0
- package/dist/components/MediaManager/MediaManager.d.ts +1 -3
- package/dist/components/MediaManager/MediaManager.d.ts.map +1 -1
- package/dist/components/MediaManager/MediaManager.js +239 -495
- package/dist/components/MediaManager/MediaManager.js.map +1 -1
- package/dist/components/MediaManager/MediaManager.skeleton.d.ts +3 -0
- package/dist/components/MediaManager/MediaManager.skeleton.d.ts.map +1 -0
- package/dist/components/MediaManager/MediaManager.skeleton.js +30 -0
- package/dist/components/MediaManager/MediaManager.skeleton.js.map +1 -0
- package/dist/components/MediaManager/MediaUploadBar.d.ts +7 -0
- package/dist/components/MediaManager/MediaUploadBar.d.ts.map +1 -0
- package/dist/components/MediaManager/MediaUploadBar.js +75 -0
- package/dist/components/MediaManager/MediaUploadBar.js.map +1 -0
- package/dist/components/StatusBadge.d.ts +1 -8
- package/dist/components/StatusBadge.d.ts.map +1 -1
- package/dist/components/StatusBadge.js +2 -49
- package/dist/components/StatusBadge.js.map +1 -1
- package/dist/components/skeletons/AdminGenericSkeleton.d.ts +7 -0
- package/dist/components/skeletons/AdminGenericSkeleton.d.ts.map +1 -0
- package/dist/components/skeletons/AdminGenericSkeleton.js +14 -0
- package/dist/components/skeletons/AdminGenericSkeleton.js.map +1 -0
- package/dist/components/skeletons/SectionSkeleton.d.ts +11 -0
- package/dist/components/skeletons/SectionSkeleton.d.ts.map +1 -0
- package/dist/components/skeletons/SectionSkeleton.js +26 -0
- package/dist/components/skeletons/SectionSkeleton.js.map +1 -0
- package/dist/components/skeletons/index.d.ts +11 -0
- package/dist/components/skeletons/index.d.ts.map +1 -0
- package/dist/components/skeletons/index.js +12 -0
- package/dist/components/skeletons/index.js.map +1 -0
- package/dist/components/skeletons/primitives.d.ts +17 -0
- package/dist/components/skeletons/primitives.d.ts.map +1 -0
- package/dist/components/skeletons/primitives.js +34 -0
- package/dist/components/skeletons/primitives.js.map +1 -0
- package/dist/components/ui/avatar-stack.d.ts +13 -0
- package/dist/components/ui/avatar-stack.d.ts.map +1 -0
- package/dist/components/ui/avatar-stack.js +27 -0
- package/dist/components/ui/avatar-stack.js.map +1 -0
- package/dist/components/ui/banner.d.ts +13 -0
- package/dist/components/ui/banner.d.ts.map +1 -0
- package/dist/components/ui/banner.js +24 -0
- package/dist/components/ui/banner.js.map +1 -0
- package/dist/components/ui/branch-chip.d.ts +7 -0
- package/dist/components/ui/branch-chip.d.ts.map +1 -0
- package/dist/components/ui/branch-chip.js +58 -0
- package/dist/components/ui/branch-chip.js.map +1 -0
- package/dist/components/ui/button.d.ts +4 -2
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/button.js +30 -12
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/chip.d.ts +7 -0
- package/dist/components/ui/chip.d.ts.map +1 -0
- package/dist/components/ui/chip.js +44 -0
- package/dist/components/ui/chip.js.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/components/ui/dropdown-menu.js +14 -8
- package/dist/components/ui/dropdown-menu.js.map +1 -1
- package/dist/components/ui/empty.d.ts +11 -0
- package/dist/components/ui/empty.d.ts.map +1 -0
- package/dist/components/ui/empty.js +24 -0
- package/dist/components/ui/empty.js.map +1 -0
- package/dist/components/ui/field.d.ts +17 -0
- package/dist/components/ui/field.d.ts.map +1 -0
- package/dist/components/ui/field.js +52 -0
- package/dist/components/ui/field.js.map +1 -0
- package/dist/components/ui/index.d.ts +16 -0
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +25 -0
- package/dist/components/ui/index.js.map +1 -1
- package/dist/components/ui/input.d.ts +5 -1
- package/dist/components/ui/input.d.ts.map +1 -1
- package/dist/components/ui/input.js +26 -3
- package/dist/components/ui/input.js.map +1 -1
- package/dist/components/ui/kbd.d.ts +3 -0
- package/dist/components/ui/kbd.d.ts.map +1 -0
- package/dist/components/ui/kbd.js +30 -0
- package/dist/components/ui/kbd.js.map +1 -0
- package/dist/components/ui/publish-button.d.ts +7 -0
- package/dist/components/ui/publish-button.d.ts.map +1 -0
- package/dist/components/ui/publish-button.js +50 -0
- package/dist/components/ui/publish-button.js.map +1 -0
- package/dist/components/ui/select.js +4 -4
- package/dist/components/ui/select.js.map +1 -1
- package/dist/components/ui/status-badge.d.ts +15 -0
- package/dist/components/ui/status-badge.d.ts.map +1 -0
- package/dist/components/ui/status-badge.js +60 -0
- package/dist/components/ui/status-badge.js.map +1 -0
- package/dist/components/ui/tabs-pill.d.ts +17 -0
- package/dist/components/ui/tabs-pill.d.ts.map +1 -0
- package/dist/components/ui/tabs-pill.js +67 -0
- package/dist/components/ui/tabs-pill.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +6 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/textarea.js +25 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/toast-card.d.ts +15 -0
- package/dist/components/ui/toast-card.d.ts.map +1 -0
- package/dist/components/ui/toast-card.js +90 -0
- package/dist/components/ui/toast-card.js.map +1 -0
- package/dist/components/ui/toast.js +1 -1
- package/dist/components/ui/toast.js.map +1 -1
- package/dist/globals.css +378 -131
- package/dist/hooks/useMediaCustomFolders.d.ts +13 -0
- package/dist/hooks/useMediaCustomFolders.d.ts.map +1 -0
- package/dist/hooks/useMediaCustomFolders.js +53 -0
- package/dist/hooks/useMediaCustomFolders.js.map +1 -0
- package/dist/{init-PSAF5XNZ.js → init-IKO4CU7H.js} +5 -2
- package/dist/init-IKO4CU7H.js.map +1 -0
- package/dist/lib/entryEditUrl.d.ts +10 -0
- package/dist/lib/entryEditUrl.d.ts.map +1 -0
- package/dist/lib/entryEditUrl.js +9 -0
- package/dist/lib/entryEditUrl.js.map +1 -0
- package/dist/lib/searchIndex.d.ts +13 -0
- package/dist/lib/searchIndex.d.ts.map +1 -1
- package/dist/lib/searchIndex.js +7 -2
- package/dist/lib/searchIndex.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/{update-B37MPMDP.js → update-GBKBWOJX.js} +72 -31
- package/dist/update-GBKBWOJX.js.map +1 -0
- package/dist/utils/formatUpdatedAt.d.ts +2 -0
- package/dist/utils/formatUpdatedAt.d.ts.map +1 -0
- package/dist/utils/formatUpdatedAt.js +16 -0
- package/dist/utils/formatUpdatedAt.js.map +1 -0
- package/docs/editing-schema.md +4 -4
- package/docs/overview.md +1 -1
- package/globals.css +378 -131
- package/package.json +6 -1
- package/dist/admin/pages/SearchPage.d.ts +0 -2
- package/dist/admin/pages/SearchPage.d.ts.map +0 -1
- package/dist/admin/pages/SearchPage.js +0 -20
- package/dist/admin/pages/SearchPage.js.map +0 -1
- package/dist/chunk-VTZ2KGUU.js.map +0 -1
- package/dist/components/CMSSidebar/CMSSidebar.d.ts +0 -2
- package/dist/components/CMSSidebar/CMSSidebar.d.ts.map +0 -1
- package/dist/components/CMSSidebar/CMSSidebar.js +0 -104
- package/dist/components/CMSSidebar/CMSSidebar.js.map +0 -1
- package/dist/components/Header/Header.d.ts +0 -6
- package/dist/components/Header/Header.d.ts.map +0 -1
- package/dist/components/Header/Header.js +0 -318
- package/dist/components/Header/Header.js.map +0 -1
- package/dist/components/SearchPage.d.ts +0 -2
- package/dist/components/SearchPage.d.ts.map +0 -1
- package/dist/components/SearchPage.js +0 -97
- package/dist/components/SearchPage.js.map +0 -1
- package/dist/init-PSAF5XNZ.js.map +0 -1
- package/dist/update-B37MPMDP.js.map +0 -1
- /package/dist/{agentDocs-YTR2WM5C.js.map → agentDocs-L4RLZCYK.js.map} +0 -0
package/dist/admin/AdminApp.d.ts
CHANGED
|
@@ -4,22 +4,26 @@ type AdminAppProps = {
|
|
|
4
4
|
}>;
|
|
5
5
|
};
|
|
6
6
|
/**
|
|
7
|
-
* Catch-all admin router
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* export { AdminApp as default } from 'octocms/admin/AdminApp';
|
|
7
|
+
* Catch-all admin router. Mounted via a single `src/app/cms/[[...path]]/page.tsx`
|
|
8
|
+
* file in the user app that re-exports this component as the default.
|
|
11
9
|
*
|
|
12
10
|
* Route segments map to admin pages:
|
|
13
|
-
* /cms
|
|
14
|
-
* /cms/
|
|
15
|
-
* /cms/
|
|
16
|
-
* /cms/
|
|
17
|
-
* /cms/
|
|
18
|
-
* /cms/
|
|
19
|
-
* /cms/
|
|
20
|
-
* /cms
|
|
21
|
-
* /cms/<type
|
|
11
|
+
* /cms → DashboardPage (empty home)
|
|
12
|
+
* /cms/content → ContentPage (all entries)
|
|
13
|
+
* /cms/content/<type> → CollectionPage
|
|
14
|
+
* /cms/content/<type>/<id> → EntryPage
|
|
15
|
+
* /cms/chat → ChatPage (gated on `isAgentEnabled(agentConfig)`)
|
|
16
|
+
* /cms/media → MediaPage (library — grid + folders)
|
|
17
|
+
* /cms/media/<id> → MediaAssetPage (full-page asset editor)
|
|
18
|
+
* /cms/model → ContentModelPage
|
|
19
|
+
* /cms/model/<type> → ContentTypePage
|
|
20
|
+
*
|
|
21
|
+
* Streaming model: each branch wraps its page in `<Suspense fallback={<MatchingSkeleton/>}>`.
|
|
22
|
+
* There is **no outer Suspense** around AdminApp itself — Next.js's
|
|
23
|
+
* navigation hold-over keeps the previous page rendered until the new one's
|
|
24
|
+
* `await params` resolves, so the user never sees a generic-shimmer flash
|
|
25
|
+
* between sub-routes. Only the inner per-page skeleton is ever visible.
|
|
22
26
|
*/
|
|
23
|
-
export declare function AdminApp({ params }: AdminAppProps): import("react/jsx-runtime").JSX.Element
|
|
27
|
+
export declare function AdminApp({ params }: AdminAppProps): Promise<import("react/jsx-runtime").JSX.Element>;
|
|
24
28
|
export {};
|
|
25
29
|
//# sourceMappingURL=AdminApp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminApp.d.ts","sourceRoot":"","sources":["../../admin/AdminApp.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AdminApp.d.ts","sourceRoot":"","sources":["../../admin/AdminApp.tsx"],"names":[],"mappings":"AAsBA,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACtC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,aAAa,oDAyEvD"}
|
package/dist/admin/AdminApp.js
CHANGED
|
@@ -1,46 +1,59 @@
|
|
|
1
1
|
import "../chunk-B5LE2OEC.js";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
import { Suspense } from "react";
|
|
4
|
+
import { ChatPageSkeleton } from "../components/Chat/ChatPage.skeleton";
|
|
5
|
+
import { ContentModelListSkeleton } from "../components/ContentModel/ContentModelList.skeleton";
|
|
6
|
+
import { ContentTypeDetailSkeleton } from "../components/ContentModel/ContentTypeDetail.skeleton";
|
|
7
|
+
import { DashboardCollectionSkeleton } from "../components/Dashboard/DashboardContent.collection.skeleton";
|
|
8
|
+
import { DashboardContentSkeleton } from "../components/Dashboard/DashboardContent.skeleton";
|
|
9
|
+
import { DashboardListSkeleton } from "../components/Dashboard/DashboardContent.list.skeleton";
|
|
10
|
+
import { EditPostSkeleton } from "../components/EditPost/EditPost.skeleton";
|
|
11
|
+
import { MediaAssetSkeleton } from "../components/MediaAsset/MediaAsset.skeleton";
|
|
12
|
+
import { MediaManagerSkeleton } from "../components/MediaManager/MediaManager.skeleton";
|
|
4
13
|
import { ChatPage } from "./pages/ChatPage";
|
|
5
14
|
import { CollectionPage } from "./pages/CollectionPage";
|
|
6
15
|
import { ContentModelPage } from "./pages/ContentModelPage";
|
|
16
|
+
import { ContentPage } from "./pages/ContentPage";
|
|
7
17
|
import { ContentTypePage } from "./pages/ContentTypePage";
|
|
8
18
|
import { DashboardPage } from "./pages/DashboardPage";
|
|
9
19
|
import { EntryPage } from "./pages/EntryPage";
|
|
20
|
+
import { MediaAssetPage } from "./pages/MediaAssetPage";
|
|
10
21
|
import { MediaPage } from "./pages/MediaPage";
|
|
11
|
-
|
|
12
|
-
function AdminApp({ params }) {
|
|
13
|
-
return /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(AdminAppRouter, { params }) });
|
|
14
|
-
}
|
|
15
|
-
async function AdminAppRouter({ params }) {
|
|
22
|
+
async function AdminApp({ params }) {
|
|
16
23
|
const { path } = await params;
|
|
17
24
|
const segments = path != null ? path : [];
|
|
18
25
|
if (segments.length === 0) {
|
|
19
26
|
return /* @__PURE__ */ jsx(DashboardPage, {});
|
|
20
27
|
}
|
|
21
|
-
if (segments[0] === "search") {
|
|
22
|
-
return /* @__PURE__ */ jsx(SearchPage, {});
|
|
23
|
-
}
|
|
24
28
|
if (segments[0] === "chat") {
|
|
25
|
-
return /* @__PURE__ */ jsx(ChatPage, {});
|
|
29
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ChatPageSkeleton, {}), children: /* @__PURE__ */ jsx(ChatPage, {}) });
|
|
26
30
|
}
|
|
27
31
|
if (segments[0] === "media") {
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
if (segments.length === 1) {
|
|
33
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(MediaManagerSkeleton, {}), children: /* @__PURE__ */ jsx(MediaPage, {}) });
|
|
34
|
+
}
|
|
35
|
+
const id = segments[1];
|
|
36
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(MediaAssetSkeleton, {}), children: /* @__PURE__ */ jsx(MediaAssetPage, { id }) }, id);
|
|
30
37
|
}
|
|
31
|
-
if (segments[0] === "
|
|
38
|
+
if (segments[0] === "model") {
|
|
32
39
|
if (segments.length === 1) {
|
|
33
|
-
return /* @__PURE__ */ jsx(ContentModelPage, {});
|
|
40
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ContentModelListSkeleton, {}), children: /* @__PURE__ */ jsx(ContentModelPage, {}) });
|
|
34
41
|
}
|
|
35
|
-
const [,
|
|
36
|
-
return /* @__PURE__ */ jsx(ContentTypePage, { type
|
|
42
|
+
const [, type] = segments;
|
|
43
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ContentTypeDetailSkeleton, {}), children: /* @__PURE__ */ jsx(ContentTypePage, { type }) }, type);
|
|
37
44
|
}
|
|
38
|
-
if (segments
|
|
39
|
-
|
|
40
|
-
|
|
45
|
+
if (segments[0] === "content") {
|
|
46
|
+
if (segments.length === 1) {
|
|
47
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(DashboardListSkeleton, {}), children: /* @__PURE__ */ jsx(ContentPage, {}) });
|
|
48
|
+
}
|
|
49
|
+
if (segments.length === 2) {
|
|
50
|
+
const [, type2] = segments;
|
|
51
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(DashboardCollectionSkeleton, {}), children: /* @__PURE__ */ jsx(CollectionPage, { params: Promise.resolve({ type: type2 }) }) }, type2);
|
|
52
|
+
}
|
|
53
|
+
const [, type, id] = segments;
|
|
54
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(EditPostSkeleton, {}), children: /* @__PURE__ */ jsx(EntryPage, { params: Promise.resolve({ type, id }) }) }, `${type}/${id}`);
|
|
41
55
|
}
|
|
42
|
-
|
|
43
|
-
return /* @__PURE__ */ jsx(EntryPage, { params: Promise.resolve({ type, id }) });
|
|
56
|
+
return /* @__PURE__ */ jsx(DashboardContentSkeleton, {});
|
|
44
57
|
}
|
|
45
58
|
export {
|
|
46
59
|
AdminApp
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../admin/AdminApp.tsx"],"sourcesContent":["import React, { Suspense } from 'react';\n\nimport { ChatPage } from './pages/ChatPage';\nimport { CollectionPage } from './pages/CollectionPage';\nimport { ContentModelPage } from './pages/ContentModelPage';\nimport { ContentTypePage } from './pages/ContentTypePage';\nimport { DashboardPage } from './pages/DashboardPage';\nimport { EntryPage } from './pages/EntryPage';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../admin/AdminApp.tsx"],"sourcesContent":["import React, { Suspense } from 'react';\n\nimport { ChatPageSkeleton } from '../components/Chat/ChatPage.skeleton';\nimport { ContentModelListSkeleton } from '../components/ContentModel/ContentModelList.skeleton';\nimport { ContentTypeDetailSkeleton } from '../components/ContentModel/ContentTypeDetail.skeleton';\nimport { DashboardCollectionSkeleton } from '../components/Dashboard/DashboardContent.collection.skeleton';\nimport { DashboardContentSkeleton } from '../components/Dashboard/DashboardContent.skeleton';\nimport { DashboardListSkeleton } from '../components/Dashboard/DashboardContent.list.skeleton';\nimport { EditPostSkeleton } from '../components/EditPost/EditPost.skeleton';\nimport { MediaAssetSkeleton } from '../components/MediaAsset/MediaAsset.skeleton';\nimport { MediaManagerSkeleton } from '../components/MediaManager/MediaManager.skeleton';\n\nimport { ChatPage } from './pages/ChatPage';\nimport { CollectionPage } from './pages/CollectionPage';\nimport { ContentModelPage } from './pages/ContentModelPage';\nimport { ContentPage } from './pages/ContentPage';\nimport { ContentTypePage } from './pages/ContentTypePage';\nimport { DashboardPage } from './pages/DashboardPage';\nimport { EntryPage } from './pages/EntryPage';\nimport { MediaAssetPage } from './pages/MediaAssetPage';\nimport { MediaPage } from './pages/MediaPage';\n\ntype AdminAppProps = {\n params: Promise<{ path?: string[] }>;\n};\n\n/**\n * Catch-all admin router. Mounted via a single `src/app/cms/[[...path]]/page.tsx`\n * file in the user app that re-exports this component as the default.\n *\n * Route segments map to admin pages:\n * /cms → DashboardPage (empty home)\n * /cms/content → ContentPage (all entries)\n * /cms/content/<type> → CollectionPage\n * /cms/content/<type>/<id> → EntryPage\n * /cms/chat → ChatPage (gated on `isAgentEnabled(agentConfig)`)\n * /cms/media → MediaPage (library — grid + folders)\n * /cms/media/<id> → MediaAssetPage (full-page asset editor)\n * /cms/model → ContentModelPage\n * /cms/model/<type> → ContentTypePage\n *\n * Streaming model: each branch wraps its page in `<Suspense fallback={<MatchingSkeleton/>}>`.\n * There is **no outer Suspense** around AdminApp itself — Next.js's\n * navigation hold-over keeps the previous page rendered until the new one's\n * `await params` resolves, so the user never sees a generic-shimmer flash\n * between sub-routes. Only the inner per-page skeleton is ever visible.\n */\nexport async function AdminApp({ params }: AdminAppProps) {\n const { path } = await params;\n const segments = path ?? [];\n\n if (segments.length === 0) {\n return <DashboardPage />;\n }\n\n if (segments[0] === 'chat') {\n return (\n <Suspense fallback={<ChatPageSkeleton />}>\n <ChatPage />\n </Suspense>\n );\n }\n\n if (segments[0] === 'media') {\n if (segments.length === 1) {\n return (\n <Suspense fallback={<MediaManagerSkeleton />}>\n <MediaPage />\n </Suspense>\n );\n }\n const id = segments[1];\n return (\n <Suspense fallback={<MediaAssetSkeleton />} key={id}>\n <MediaAssetPage id={id} />\n </Suspense>\n );\n }\n\n if (segments[0] === 'model') {\n if (segments.length === 1) {\n return (\n <Suspense fallback={<ContentModelListSkeleton />}>\n <ContentModelPage />\n </Suspense>\n );\n }\n const [, type] = segments;\n return (\n <Suspense fallback={<ContentTypeDetailSkeleton />} key={type}>\n <ContentTypePage type={type} />\n </Suspense>\n );\n }\n\n if (segments[0] === 'content') {\n if (segments.length === 1) {\n return (\n <Suspense fallback={<DashboardListSkeleton />}>\n <ContentPage />\n </Suspense>\n );\n }\n if (segments.length === 2) {\n const [, type] = segments;\n return (\n <Suspense fallback={<DashboardCollectionSkeleton />} key={type}>\n <CollectionPage params={Promise.resolve({ type })} />\n </Suspense>\n );\n }\n const [, type, id] = segments;\n return (\n <Suspense fallback={<EditPostSkeleton />} key={`${type}/${id}`}>\n <EntryPage params={Promise.resolve({ type, id })} />\n </Suspense>\n );\n }\n\n return <DashboardContentSkeleton />;\n}\n"],"mappings":";AAoDW;AApDX,SAAgB,gBAAgB;AAEhC,SAAS,wBAAwB;AACjC,SAAS,gCAAgC;AACzC,SAAS,iCAAiC;AAC1C,SAAS,mCAAmC;AAC5C,SAAS,gCAAgC;AACzC,SAAS,6BAA6B;AACtC,SAAS,wBAAwB;AACjC,SAAS,0BAA0B;AACnC,SAAS,4BAA4B;AAErC,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AA2B1B,eAAsB,SAAS,EAAE,OAAO,GAAkB;AACxD,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,WAAW,sBAAQ,CAAC;AAE1B,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,oBAAC,iBAAc;AAAA,EACxB;AAEA,MAAI,SAAS,CAAC,MAAM,QAAQ;AAC1B,WACE,oBAAC,YAAS,UAAU,oBAAC,oBAAiB,GACpC,8BAAC,YAAS,GACZ;AAAA,EAEJ;AAEA,MAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,QAAI,SAAS,WAAW,GAAG;AACzB,aACE,oBAAC,YAAS,UAAU,oBAAC,wBAAqB,GACxC,8BAAC,aAAU,GACb;AAAA,IAEJ;AACA,UAAM,KAAK,SAAS,CAAC;AACrB,WACE,oBAAC,YAAS,UAAU,oBAAC,sBAAmB,GACtC,8BAAC,kBAAe,IAAQ,KADuB,EAEjD;AAAA,EAEJ;AAEA,MAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,QAAI,SAAS,WAAW,GAAG;AACzB,aACE,oBAAC,YAAS,UAAU,oBAAC,4BAAyB,GAC5C,8BAAC,oBAAiB,GACpB;AAAA,IAEJ;AACA,UAAM,CAAC,EAAE,IAAI,IAAI;AACjB,WACE,oBAAC,YAAS,UAAU,oBAAC,6BAA0B,GAC7C,8BAAC,mBAAgB,MAAY,KADyB,IAExD;AAAA,EAEJ;AAEA,MAAI,SAAS,CAAC,MAAM,WAAW;AAC7B,QAAI,SAAS,WAAW,GAAG;AACzB,aACE,oBAAC,YAAS,UAAU,oBAAC,yBAAsB,GACzC,8BAAC,eAAY,GACf;AAAA,IAEJ;AACA,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,CAAC,EAAEA,KAAI,IAAI;AACjB,aACE,oBAAC,YAAS,UAAU,oBAAC,+BAA4B,GAC/C,8BAAC,kBAAe,QAAQ,QAAQ,QAAQ,EAAE,MAAAA,MAAK,CAAC,GAAG,KADKA,KAE1D;AAAA,IAEJ;AACA,UAAM,CAAC,EAAE,MAAM,EAAE,IAAI;AACrB,WACE,oBAAC,YAAS,UAAU,oBAAC,oBAAiB,GACpC,8BAAC,aAAU,QAAQ,QAAQ,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,KADL,GAAG,IAAI,IAAI,EAAE,EAE5D;AAAA,EAEJ;AAEA,SAAO,oBAAC,4BAAyB;AACnC;","names":["type"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../admin/actions/entries.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../admin/actions/entries.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAO9D,eAAO,MAAM,YAAY,GAAU,aAAY,MAAa,KAAG,OAAO,CAAC,aAAa,EAAE,CAsFrF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAU,oBAAoB,MAAM,KAAG,OAAO,CAAC,aAAa,EAAE,CAgE3F,CAAC"}
|
|
@@ -5,12 +5,31 @@ import path from "path";
|
|
|
5
5
|
import { getConfig } from "../../lib/configStore";
|
|
6
6
|
import { getContentFiles, getFile } from "./files";
|
|
7
7
|
import { isProductionMode } from "../github";
|
|
8
|
+
import { getMediaEntries } from "./media";
|
|
8
9
|
import { getEntryTitleField } from "./utils";
|
|
9
10
|
const getEntryList = async (collection = "**") => {
|
|
10
|
-
var _a, _b, _c;
|
|
11
|
+
var _a, _b, _c, _d, _e;
|
|
11
12
|
const config = getConfig();
|
|
12
13
|
const files = await getContentFiles(collection);
|
|
13
14
|
const entries = [];
|
|
15
|
+
const mediaList = await getMediaEntries().catch(() => []);
|
|
16
|
+
const mediaById = /* @__PURE__ */ new Map();
|
|
17
|
+
for (const m of mediaList) {
|
|
18
|
+
mediaById.set(m.id, { ext: m.extension, publicUrl: m.publicUrl });
|
|
19
|
+
}
|
|
20
|
+
const imageFieldKeyByType = /* @__PURE__ */ new Map();
|
|
21
|
+
function firstImageFieldKey(type) {
|
|
22
|
+
var _a2, _b2;
|
|
23
|
+
if (imageFieldKeyByType.has(type)) return (_a2 = imageFieldKeyByType.get(type)) != null ? _a2 : null;
|
|
24
|
+
const collection2 = config.collections[type];
|
|
25
|
+
if (!collection2) {
|
|
26
|
+
imageFieldKeyByType.set(type, null);
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const key = (_b2 = Object.keys(collection2.fields).find((k) => collection2.fields[k].format === "image")) != null ? _b2 : null;
|
|
30
|
+
imageFieldKeyByType.set(type, key);
|
|
31
|
+
return key;
|
|
32
|
+
}
|
|
14
33
|
for (const file of files) {
|
|
15
34
|
const nameWithoutFolder = file.replace(`${config.contentFolder}/`, "").replace(".json", "");
|
|
16
35
|
const parts = nameWithoutFolder.split("/");
|
|
@@ -20,6 +39,7 @@ const getEntryList = async (collection = "**") => {
|
|
|
20
39
|
let title = id;
|
|
21
40
|
let status = "merged";
|
|
22
41
|
let updatedAt;
|
|
42
|
+
let thumbnailUrl;
|
|
23
43
|
try {
|
|
24
44
|
const content = await getFile(file);
|
|
25
45
|
if (type === "media") {
|
|
@@ -31,13 +51,25 @@ const getEntryList = async (collection = "**") => {
|
|
|
31
51
|
if (typeof mediaTitle === "string" && mediaTitle.trim() !== "") {
|
|
32
52
|
title = mediaTitle.trim();
|
|
33
53
|
}
|
|
34
|
-
|
|
35
|
-
|
|
54
|
+
const ext = typeof ((_b = content == null ? void 0 : content.fields) == null ? void 0 : _b.extension) === "string" ? content.fields.extension : "";
|
|
55
|
+
if (ext) thumbnailUrl = `/media/${id}.${ext}`;
|
|
56
|
+
} else {
|
|
57
|
+
if (titleField && ((_c = content == null ? void 0 : content.fields) == null ? void 0 : _c[titleField])) {
|
|
58
|
+
title = content.fields[titleField];
|
|
59
|
+
}
|
|
60
|
+
const imgKey = firstImageFieldKey(type);
|
|
61
|
+
if (imgKey) {
|
|
62
|
+
const value = (_d = content == null ? void 0 : content.fields) == null ? void 0 : _d[imgKey];
|
|
63
|
+
if (typeof value === "string" && value.trim()) {
|
|
64
|
+
const hit = mediaById.get(value.trim());
|
|
65
|
+
if (hit) thumbnailUrl = hit.publicUrl;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
36
68
|
}
|
|
37
|
-
if ((
|
|
69
|
+
if ((_e = content == null ? void 0 : content.sys) == null ? void 0 : _e.status) {
|
|
38
70
|
status = content.sys.status;
|
|
39
71
|
}
|
|
40
|
-
} catch (
|
|
72
|
+
} catch (_e2) {
|
|
41
73
|
}
|
|
42
74
|
if (!isProductionMode()) {
|
|
43
75
|
try {
|
|
@@ -46,7 +78,7 @@ const getEntryList = async (collection = "**") => {
|
|
|
46
78
|
} catch (e) {
|
|
47
79
|
}
|
|
48
80
|
}
|
|
49
|
-
entries.push({ type, id, path: file, title, status, updatedAt });
|
|
81
|
+
entries.push({ type, id, path: file, title, status, updatedAt, thumbnailUrl });
|
|
50
82
|
}
|
|
51
83
|
entries.sort((a, b) => a.title.localeCompare(b.title));
|
|
52
84
|
return entries;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../admin/actions/entries.ts"],"sourcesContent":["'use server';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { getConfig } from '../../lib/configStore';\nimport type { Config } from '../types';\nimport type { EntryListItem, EntryStatus } from '../../types';\n\nimport { getContentFiles, getFile } from './files';\nimport { isProductionMode } from '../github';\nimport { getEntryTitleField } from './utils';\n\nexport const getEntryList = async (collection: string = '**'): Promise<EntryListItem[]> => {\n const config = getConfig();\n const files = await getContentFiles(collection);\n const entries: EntryListItem[] = [];\n\n for (const file of files) {\n const nameWithoutFolder = file.replace(`${config.contentFolder}/`, '').replace('.json', '');\n const parts = nameWithoutFolder.split('/');\n const type = parts[0];\n let id = parts[parts.length - 1];\n const titleField = getEntryTitleField(type);\n\n let title = id;\n let status: EntryStatus = 'merged';\n let updatedAt: string | undefined;\n\n try {\n const content = await getFile(file);\n\n if (type === 'media') {\n const sysId = content?.sys && typeof content.sys === 'object' && 'id' in content.sys ? content.sys.id : null;\n if (typeof sysId === 'string' && sysId !== '') {\n id = sysId;\n }\n const mediaTitle = content?.fields?.title;\n if (typeof mediaTitle === 'string' && mediaTitle.trim() !== '') {\n title = mediaTitle.trim();\n }\n } else if (titleField && content?.fields?.[titleField]) {\n
|
|
1
|
+
{"version":3,"sources":["../../../admin/actions/entries.ts"],"sourcesContent":["'use server';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { getConfig } from '../../lib/configStore';\nimport type { Config } from '../types';\nimport type { EntryListItem, EntryStatus } from '../../types';\n\nimport { getContentFiles, getFile } from './files';\nimport { isProductionMode } from '../github';\nimport { getMediaEntries } from './media';\nimport { getEntryTitleField } from './utils';\n\nexport const getEntryList = async (collection: string = '**'): Promise<EntryListItem[]> => {\n const config = getConfig();\n const files = await getContentFiles(collection);\n const entries: EntryListItem[] = [];\n\n // Build a media lookup so we can resolve thumbnail URLs for any entry that\n // has an `image` field. One batched call regardless of entry count.\n const mediaList = await getMediaEntries().catch(() => []);\n const mediaById = new Map<string, { ext: string; publicUrl: string }>();\n for (const m of mediaList) {\n mediaById.set(m.id, { ext: m.extension, publicUrl: m.publicUrl });\n }\n\n const imageFieldKeyByType = new Map<string, string | null>();\n function firstImageFieldKey(type: string): string | null {\n if (imageFieldKeyByType.has(type)) return imageFieldKeyByType.get(type) ?? null;\n const collection = (config as Config).collections[type as keyof Config['collections']];\n if (!collection) {\n imageFieldKeyByType.set(type, null);\n return null;\n }\n const key = Object.keys(collection.fields).find((k) => collection.fields[k].format === 'image') ?? null;\n imageFieldKeyByType.set(type, key);\n return key;\n }\n\n for (const file of files) {\n const nameWithoutFolder = file.replace(`${config.contentFolder}/`, '').replace('.json', '');\n const parts = nameWithoutFolder.split('/');\n const type = parts[0];\n let id = parts[parts.length - 1];\n const titleField = getEntryTitleField(type);\n\n let title = id;\n let status: EntryStatus = 'merged';\n let updatedAt: string | undefined;\n let thumbnailUrl: string | undefined;\n\n try {\n const content = await getFile(file);\n\n if (type === 'media') {\n const sysId = content?.sys && typeof content.sys === 'object' && 'id' in content.sys ? content.sys.id : null;\n if (typeof sysId === 'string' && sysId !== '') {\n id = sysId;\n }\n const mediaTitle = content?.fields?.title;\n if (typeof mediaTitle === 'string' && mediaTitle.trim() !== '') {\n title = mediaTitle.trim();\n }\n const ext = typeof content?.fields?.extension === 'string' ? content.fields.extension : '';\n if (ext) thumbnailUrl = `/media/${id}.${ext}`;\n } else {\n if (titleField && content?.fields?.[titleField]) {\n title = content.fields[titleField];\n }\n const imgKey = firstImageFieldKey(type);\n if (imgKey) {\n const value = content?.fields?.[imgKey];\n if (typeof value === 'string' && value.trim()) {\n const hit = mediaById.get(value.trim());\n if (hit) thumbnailUrl = hit.publicUrl;\n }\n }\n }\n if (content?.sys?.status) {\n status = content.sys.status;\n }\n } catch (_e) {\n // Fall back to id as title\n }\n\n if (!isProductionMode()) {\n try {\n const stat = await fsPromises.stat(path.join(process.cwd(), file));\n updatedAt = stat.mtime.toISOString();\n } catch {\n // ignore\n }\n }\n\n entries.push({ type, id, path: file, title, status, updatedAt, thumbnailUrl });\n }\n\n entries.sort((a, b) => a.title.localeCompare(b.title));\n return entries;\n};\n\n/**\n * Find all content entries that reference the given entry via reference fields.\n * Returns entries that contain `targetReferenceKey` in any reference field value.\n */\nexport const getEntryBacklinks = async (targetReferenceKey: string): Promise<EntryListItem[]> => {\n const config = getConfig();\n const allFiles = await getContentFiles('**');\n const backlinks: EntryListItem[] = [];\n\n for (const file of allFiles) {\n // Skip media entries\n if (file.includes('/media/')) continue;\n\n try {\n const content = await getFile(file);\n const type = content?.sys?.type;\n if (!type) continue;\n\n const collection = config.collections[type as keyof Config['collections']];\n if (!collection) continue;\n\n const referenceFieldKeys = Object.keys(collection.fields).filter(\n (k) => collection.fields[k].format === 'reference',\n );\n if (referenceFieldKeys.length === 0) continue;\n\n let found = false;\n for (const fieldKey of referenceFieldKeys) {\n const fieldValue = content?.fields?.[fieldKey];\n if (!fieldValue) continue;\n\n // Reference values can be a single string (cardinality 'one') or a JSON array string (cardinality 'many')\n let keys: string[] = [];\n if (typeof fieldValue === 'string') {\n try {\n const parsed = JSON.parse(fieldValue);\n keys = Array.isArray(parsed) ? parsed : [fieldValue];\n } catch {\n keys = [fieldValue];\n }\n } else if (Array.isArray(fieldValue)) {\n keys = fieldValue;\n }\n\n if (keys.includes(targetReferenceKey)) {\n found = true;\n break;\n }\n }\n\n if (found) {\n const nameWithoutFolder = file.replace(`${config.contentFolder}/`, '').replace('.json', '');\n const parts = nameWithoutFolder.split('/');\n const id = parts[parts.length - 1];\n const titleField = getEntryTitleField(type);\n let title = id;\n if (titleField && content?.fields?.[titleField]) {\n title = content.fields[titleField];\n }\n const status: EntryStatus = content?.sys?.status || 'merged';\n backlinks.push({ type, id, path: file, title, status });\n }\n } catch (_e) {\n // Skip files that can't be read\n }\n }\n\n return backlinks;\n};\n"],"mappings":"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","names":["_a","_b","collection","_e"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public admin barrel — the npm-style entry point that user apps import from.
|
|
3
|
+
*
|
|
4
|
+
* Wired in `src/app/cms/[[...path]]/page.tsx` (catch-all default export),
|
|
5
|
+
* `src/app/cms/layout.tsx` (default export + metadata), and
|
|
6
|
+
* `src/app/cms/error.tsx` (default export). The CLI scaffolds those three
|
|
7
|
+
* thin re-export files; everything else lives inside the package.
|
|
8
|
+
*/
|
|
9
|
+
export { AdminApp } from './AdminApp';
|
|
10
|
+
export { AdminLayout, metadata } from './pages/AdminLayout';
|
|
11
|
+
export { AdminError, AdminErrorView } from './pages/AdminErrorView';
|
|
12
|
+
export type { AdminErrorViewProps } from './pages/AdminErrorView';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACpE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import "../chunk-B5LE2OEC.js";
|
|
2
|
+
import { AdminApp } from "./AdminApp";
|
|
3
|
+
import { AdminLayout, metadata } from "./pages/AdminLayout";
|
|
4
|
+
import { AdminError, AdminErrorView } from "./pages/AdminErrorView";
|
|
5
|
+
export {
|
|
6
|
+
AdminApp,
|
|
7
|
+
AdminError,
|
|
8
|
+
AdminErrorView,
|
|
9
|
+
AdminLayout,
|
|
10
|
+
metadata
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../admin/index.ts"],"sourcesContent":["/**\n * Public admin barrel — the npm-style entry point that user apps import from.\n *\n * Wired in `src/app/cms/[[...path]]/page.tsx` (catch-all default export),\n * `src/app/cms/layout.tsx` (default export + metadata), and\n * `src/app/cms/error.tsx` (default export). The CLI scaffolds those three\n * thin re-export files; everything else lives inside the package.\n */\nexport { AdminApp } from './AdminApp';\nexport { AdminLayout, metadata } from './pages/AdminLayout';\nexport { AdminError, AdminErrorView } from './pages/AdminErrorView';\nexport type { AdminErrorViewProps } from './pages/AdminErrorView';\n"],"mappings":";AAQA,SAAS,gBAAgB;AACzB,SAAS,aAAa,gBAAgB;AACtC,SAAS,YAAY,sBAAsB;","names":[]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drop-in `error.tsx` body for the admin catch-all. Receives Next.js's
|
|
3
|
+
* standard `{ error, reset }` props and renders the shared `AdminErrorView`.
|
|
4
|
+
*
|
|
5
|
+
* Wired into the user app via a one-line re-export:
|
|
6
|
+
* `export { AdminError as default } from 'octocms/admin'`
|
|
7
|
+
*/
|
|
8
|
+
export declare function AdminError({ error, reset }: {
|
|
9
|
+
error: Error & {
|
|
10
|
+
digest?: string;
|
|
11
|
+
};
|
|
12
|
+
reset: () => void;
|
|
13
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export type AdminErrorViewProps = {
|
|
15
|
+
error: Error & {
|
|
16
|
+
digest?: string;
|
|
17
|
+
};
|
|
18
|
+
reset: () => void;
|
|
19
|
+
/** Section title shown above the message. Defaults to "Something went wrong". */
|
|
20
|
+
title?: string;
|
|
21
|
+
/** Optional href for the secondary "Back" button. Defaults to /cms. */
|
|
22
|
+
backHref?: string;
|
|
23
|
+
/** Optional label for the secondary button. Defaults to "Dashboard". */
|
|
24
|
+
backLabel?: string;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Shared admin error view used by every per-segment `error.tsx` file under
|
|
28
|
+
* `src/app/cms/`. Reuses the GitHub-aware copy logic from the existing root
|
|
29
|
+
* error boundary in `src/app/error.tsx`, but inside the admin chrome.
|
|
30
|
+
*/
|
|
31
|
+
export declare function AdminErrorView({ error, reset, title, backHref, backLabel, }: AdminErrorViewProps): import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
//# sourceMappingURL=AdminErrorView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminErrorView.d.ts","sourceRoot":"","sources":["../../../admin/pages/AdminErrorView.tsx"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,KAAK,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,2CAErG;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,KAAK,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,KAA8B,EAC9B,QAAiB,EACjB,SAAuB,GACxB,EAAE,mBAAmB,2CAmCrB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import "../../chunk-B5LE2OEC.js";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
import { Button } from "../../components/ui/button";
|
|
5
|
+
import { isContentSourceError, parseContentSourceFromMessage } from "../../lib/contentSourceError";
|
|
6
|
+
function AdminError({ error, reset }) {
|
|
7
|
+
return /* @__PURE__ */ jsx(AdminErrorView, { error, reset });
|
|
8
|
+
}
|
|
9
|
+
function AdminErrorView({
|
|
10
|
+
error,
|
|
11
|
+
reset,
|
|
12
|
+
title = "Something went wrong",
|
|
13
|
+
backHref = "/cms",
|
|
14
|
+
backLabel = "Dashboard"
|
|
15
|
+
}) {
|
|
16
|
+
var _a, _b;
|
|
17
|
+
const fromInstance = isContentSourceError(error) ? { userMessage: error.userMessage, code: error.code } : null;
|
|
18
|
+
const fromMessage = parseContentSourceFromMessage(error.message);
|
|
19
|
+
const userMessage = (_a = fromInstance == null ? void 0 : fromInstance.userMessage) != null ? _a : fromMessage == null ? void 0 : fromMessage.userMessage;
|
|
20
|
+
const code = (_b = fromInstance == null ? void 0 : fromInstance.code) != null ? _b : fromMessage == null ? void 0 : fromMessage.code;
|
|
21
|
+
const isAvailability = code === "github_unavailable" || code === "github_rate_limit";
|
|
22
|
+
return /* @__PURE__ */ jsx("div", { className: "flex flex-1 items-center justify-center bg-muted/20 p-6", children: /* @__PURE__ */ jsxs("div", { className: "w-full max-w-lg rounded-xl border border-border bg-background p-6 shadow-sm", children: [
|
|
23
|
+
/* @__PURE__ */ jsx("h2", { className: "text-base font-semibold tracking-tight text-foreground", children: title }),
|
|
24
|
+
userMessage ? /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm leading-6 text-muted-foreground", children: userMessage }) : /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm leading-6 text-muted-foreground", children: "An unexpected error occurred while loading this page." }),
|
|
25
|
+
isAvailability ? /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "You can try again in a few minutes." }) : null,
|
|
26
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-5 flex flex-wrap gap-2", children: [
|
|
27
|
+
/* @__PURE__ */ jsx(Button, { type: "button", size: "sm", onClick: () => reset(), children: "Try again" }),
|
|
28
|
+
/* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "outline", asChild: true, children: /* @__PURE__ */ jsx("a", { href: backHref, children: backLabel }) })
|
|
29
|
+
] }),
|
|
30
|
+
error.digest ? /* @__PURE__ */ jsxs("p", { className: "mt-6 text-[11px] uppercase tracking-wide text-muted-foreground", children: [
|
|
31
|
+
"Reference: ",
|
|
32
|
+
error.digest
|
|
33
|
+
] }) : null
|
|
34
|
+
] }) });
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
AdminError,
|
|
38
|
+
AdminErrorView
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=AdminErrorView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../admin/pages/AdminErrorView.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nimport { Button } from '../../components/ui/button';\nimport { isContentSourceError, parseContentSourceFromMessage } from '../../lib/contentSourceError';\n\n/**\n * Drop-in `error.tsx` body for the admin catch-all. Receives Next.js's\n * standard `{ error, reset }` props and renders the shared `AdminErrorView`.\n *\n * Wired into the user app via a one-line re-export:\n * `export { AdminError as default } from 'octocms/admin'`\n */\nexport function AdminError({ error, reset }: { error: Error & { digest?: string }; reset: () => void }) {\n return <AdminErrorView error={error} reset={reset} />;\n}\n\nexport type AdminErrorViewProps = {\n error: Error & { digest?: string };\n reset: () => void;\n /** Section title shown above the message. Defaults to \"Something went wrong\". */\n title?: string;\n /** Optional href for the secondary \"Back\" button. Defaults to /cms. */\n backHref?: string;\n /** Optional label for the secondary button. Defaults to \"Dashboard\". */\n backLabel?: string;\n};\n\n/**\n * Shared admin error view used by every per-segment `error.tsx` file under\n * `src/app/cms/`. Reuses the GitHub-aware copy logic from the existing root\n * error boundary in `src/app/error.tsx`, but inside the admin chrome.\n */\nexport function AdminErrorView({\n error,\n reset,\n title = 'Something went wrong',\n backHref = '/cms',\n backLabel = 'Dashboard',\n}: AdminErrorViewProps) {\n const fromInstance = isContentSourceError(error) ? { userMessage: error.userMessage, code: error.code } : null;\n const fromMessage = parseContentSourceFromMessage(error.message);\n const userMessage = fromInstance?.userMessage ?? fromMessage?.userMessage;\n const code = fromInstance?.code ?? fromMessage?.code;\n const isAvailability = code === 'github_unavailable' || code === 'github_rate_limit';\n\n return (\n <div className=\"flex flex-1 items-center justify-center bg-muted/20 p-6\">\n <div className=\"w-full max-w-lg rounded-xl border border-border bg-background p-6 shadow-sm\">\n <h2 className=\"text-base font-semibold tracking-tight text-foreground\">{title}</h2>\n {userMessage ? (\n <p className=\"mt-2 text-sm leading-6 text-muted-foreground\">{userMessage}</p>\n ) : (\n <p className=\"mt-2 text-sm leading-6 text-muted-foreground\">\n An unexpected error occurred while loading this page.\n </p>\n )}\n {isAvailability ? (\n <p className=\"mt-1 text-xs text-muted-foreground\">You can try again in a few minutes.</p>\n ) : null}\n <div className=\"mt-5 flex flex-wrap gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => reset()}>\n Try again\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" asChild>\n <a href={backHref}>{backLabel}</a>\n </Button>\n </div>\n {error.digest ? (\n <p className=\"mt-6 text-[11px] uppercase tracking-wide text-muted-foreground\">Reference: {error.digest}</p>\n ) : null}\n </div>\n </div>\n );\n}\n"],"mappings":";;AAeS,cA8CD,YA9CC;AAXT,SAAS,cAAc;AACvB,SAAS,sBAAsB,qCAAqC;AAS7D,SAAS,WAAW,EAAE,OAAO,MAAM,GAA8D;AACtG,SAAO,oBAAC,kBAAe,OAAc,OAAc;AACrD;AAkBO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,YAAY;AACd,GAAwB;AAxCxB;AAyCE,QAAM,eAAe,qBAAqB,KAAK,IAAI,EAAE,aAAa,MAAM,aAAa,MAAM,MAAM,KAAK,IAAI;AAC1G,QAAM,cAAc,8BAA8B,MAAM,OAAO;AAC/D,QAAM,eAAc,kDAAc,gBAAd,YAA6B,2CAAa;AAC9D,QAAM,QAAO,kDAAc,SAAd,YAAsB,2CAAa;AAChD,QAAM,iBAAiB,SAAS,wBAAwB,SAAS;AAEjE,SACE,oBAAC,SAAI,WAAU,2DACb,+BAAC,SAAI,WAAU,+EACb;AAAA,wBAAC,QAAG,WAAU,0DAA0D,iBAAM;AAAA,IAC7E,cACC,oBAAC,OAAE,WAAU,gDAAgD,uBAAY,IAEzE,oBAAC,OAAE,WAAU,gDAA+C,mEAE5D;AAAA,IAED,iBACC,oBAAC,OAAE,WAAU,sCAAqC,iDAAmC,IACnF;AAAA,IACJ,qBAAC,SAAI,WAAU,6BACb;AAAA,0BAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAS,MAAM,MAAM,GAAG,uBAExD;AAAA,MACA,oBAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAQ,WAAU,SAAO,MACvD,8BAAC,OAAE,MAAM,UAAW,qBAAU,GAChC;AAAA,OACF;AAAA,IACC,MAAM,SACL,qBAAC,OAAE,WAAU,kEAAiE;AAAA;AAAA,MAAY,MAAM;AAAA,OAAO,IACrG;AAAA,KACN,GACF;AAEJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../../admin/pages/AdminLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAC;AAC3B,OAAO,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,KAAmB,MAAM,OAAO,CAAC;AAQxC,eAAO,MAAM,QAAQ,EAAE,QAEtB,CAAC;
|
|
1
|
+
{"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../../admin/pages/AdminLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAC;AAC3B,OAAO,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,KAAmB,MAAM,OAAO,CAAC;AAQxC,eAAO,MAAM,QAAQ,EAAE,QAEtB,CAAC;AA6BF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,cAAc,QAAQ,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CAAC,4CAMhF,CAAC"}
|
|
@@ -15,7 +15,7 @@ async function AdminLayoutInner({ children }) {
|
|
|
15
15
|
const initialTheme = await getThemeCookie();
|
|
16
16
|
const config = getConfig();
|
|
17
17
|
return /* @__PURE__ */ jsxs(Provider, { initialTheme, config, children: [
|
|
18
|
-
/* @__PURE__ */ jsx(
|
|
18
|
+
/* @__PURE__ */ jsx(Layout, { children }),
|
|
19
19
|
/* @__PURE__ */ jsx(Toaster, {})
|
|
20
20
|
] });
|
|
21
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../admin/pages/AdminLayout.tsx"],"sourcesContent":["import '../../globals.css';\nimport '@mdxeditor/editor/style.css';\nimport type { Metadata } from 'next';\nimport React, { Suspense } from 'react';\n\nimport Provider from '../provider';\nimport { Toaster } from '../../components/ui/toaster';\nimport Layout from '../../components/Layout/Layout';\nimport { getThemeCookie } from '../actions/getThemeCookie';\nimport { getConfig } from '../../lib/configStore';\n\nexport const metadata: Metadata = {\n title: 'OctoCMS',\n};\n\n/**\n * Async inner component that reads the `cms-theme` cookie.\n *\n * Kept separate from `AdminLayout` so the `cookies()` call (uncached dynamic\n * data) happens inside a `<Suspense>` boundary. This satisfies the\n * `cacheComponents` experimental flag requirement: any uncached data access\n * must be wrapped in Suspense, and avoids the need for `force-dynamic` (which\n * is incompatible with `cacheComponents`).\n */\nasync function AdminLayoutInner({ children }: Readonly<{ children: React.ReactNode }>) {\n const initialTheme = await getThemeCookie();\n const config = getConfig();\n\n return (\n <Provider initialTheme={initialTheme} config={config}>\n <
|
|
1
|
+
{"version":3,"sources":["../../../admin/pages/AdminLayout.tsx"],"sourcesContent":["import '../../globals.css';\nimport '@mdxeditor/editor/style.css';\nimport type { Metadata } from 'next';\nimport React, { Suspense } from 'react';\n\nimport Provider from '../provider';\nimport { Toaster } from '../../components/ui/toaster';\nimport Layout from '../../components/Layout/Layout';\nimport { getThemeCookie } from '../actions/getThemeCookie';\nimport { getConfig } from '../../lib/configStore';\n\nexport const metadata: Metadata = {\n title: 'OctoCMS',\n};\n\n/**\n * Async inner component that reads the `cms-theme` cookie.\n *\n * Kept separate from `AdminLayout` so the `cookies()` call (uncached dynamic\n * data) happens inside a `<Suspense>` boundary. This satisfies the\n * `cacheComponents` experimental flag requirement: any uncached data access\n * must be wrapped in Suspense, and avoids the need for `force-dynamic` (which\n * is incompatible with `cacheComponents`).\n */\nasync function AdminLayoutInner({ children }: Readonly<{ children: React.ReactNode }>) {\n const initialTheme = await getThemeCookie();\n const config = getConfig();\n\n // No Suspense around `<Layout>{children}</Layout>` here on purpose: the\n // catch-all page (`AdminApp`) re-suspends on every back/forward navigation,\n // and a Suspense at this level would blank the entire layout chrome\n // (including the TopHeader). Layout itself owns the inner Suspense around\n // `{children}` so the chrome stays mounted and the generic admin skeleton\n // fills the main slot.\n return (\n <Provider initialTheme={initialTheme} config={config}>\n <Layout>{children}</Layout>\n <Toaster />\n </Provider>\n );\n}\n\n/**\n * Synchronous CMS layout shell.\n * Wraps `AdminLayoutInner` in `<Suspense>` so the async cookie read is\n * inside the boundary and does not block the rest of the page.\n */\nexport const AdminLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => {\n return (\n <Suspense fallback={null}>\n <AdminLayoutInner>{children}</AdminLayoutInner>\n </Suspense>\n );\n};\n"],"mappings":";AAmCI,SACE,KADF;AAnCJ,OAAO;AACP,OAAO;AAEP,SAAgB,gBAAgB;AAEhC,OAAO,cAAc;AACrB,SAAS,eAAe;AACxB,OAAO,YAAY;AACnB,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AAEnB,MAAM,WAAqB;AAAA,EAChC,OAAO;AACT;AAWA,eAAe,iBAAiB,EAAE,SAAS,GAA4C;AACrF,QAAM,eAAe,MAAM,eAAe;AAC1C,QAAM,SAAS,UAAU;AAQzB,SACE,qBAAC,YAAS,cAA4B,QACpC;AAAA,wBAAC,UAAQ,UAAS;AAAA,IAClB,oBAAC,WAAQ;AAAA,KACX;AAEJ;AAOO,MAAM,cAAc,CAAC,EAAE,SAAS,MAA+C;AACpF,SACE,oBAAC,YAAS,UAAU,MAClB,8BAAC,oBAAkB,UAAS,GAC9B;AAEJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/CollectionPage.tsx"],"names":[],"mappings":"AAUA,
|
|
1
|
+
{"version":3,"file":"CollectionPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/CollectionPage.tsx"],"names":[],"mappings":"AAUA,wBAAsB,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,2DA2BrF"}
|
|
@@ -1,30 +1,36 @@
|
|
|
1
1
|
import "../../chunk-B5LE2OEC.js";
|
|
2
|
-
import {
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
import { redirect } from "next/navigation";
|
|
4
4
|
import { getServerSession } from "next-auth";
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { getEntryList } from "../actions";
|
|
5
|
+
import DashboardContent from "../../components/Dashboard/DashboardContent";
|
|
6
|
+
import { getConfig } from "../../lib/configStore";
|
|
7
|
+
import { getEntryList, hasActiveBranch } from "../actions";
|
|
8
|
+
import { getBranch } from "../actions/git";
|
|
10
9
|
import { authOptions } from "../auth";
|
|
11
|
-
function CollectionPage({ params }) {
|
|
12
|
-
return /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(CollectionPageContent, { params }) });
|
|
13
|
-
}
|
|
14
|
-
async function CollectionPageContent({ params }) {
|
|
10
|
+
async function CollectionPage({ params }) {
|
|
15
11
|
const session = await getServerSession(authOptions);
|
|
16
12
|
if (!session) {
|
|
17
13
|
return null;
|
|
18
14
|
}
|
|
19
15
|
const { type } = await params;
|
|
20
|
-
const entries = await getEntryList();
|
|
16
|
+
const [entries, hasBranch, activeBranch] = await Promise.all([getEntryList(), hasActiveBranch(), getBranch()]);
|
|
17
|
+
const collections = Object.keys(getConfig().collections);
|
|
21
18
|
if (!type) {
|
|
22
|
-
redirect(
|
|
19
|
+
redirect(`/cms/content`);
|
|
20
|
+
}
|
|
21
|
+
if (!collections.includes(type)) {
|
|
22
|
+
redirect("/cms/content");
|
|
23
23
|
}
|
|
24
|
-
return /* @__PURE__ */
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
return /* @__PURE__ */ jsx(
|
|
25
|
+
DashboardContent,
|
|
26
|
+
{
|
|
27
|
+
entries,
|
|
28
|
+
collections,
|
|
29
|
+
hasBranch,
|
|
30
|
+
activeBranch,
|
|
31
|
+
selectedType: type
|
|
32
|
+
}
|
|
33
|
+
);
|
|
28
34
|
}
|
|
29
35
|
export {
|
|
30
36
|
CollectionPage
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../admin/pages/CollectionPage.tsx"],"sourcesContent":["import { redirect } from 'next/navigation';\nimport { getServerSession } from 'next-auth';\nimport React
|
|
1
|
+
{"version":3,"sources":["../../../admin/pages/CollectionPage.tsx"],"sourcesContent":["import { redirect } from 'next/navigation';\nimport { getServerSession } from 'next-auth';\nimport React from 'react';\n\nimport DashboardContent from '../../components/Dashboard/DashboardContent';\nimport { getConfig } from '../../lib/configStore';\nimport { getEntryList, hasActiveBranch } from '../actions';\nimport { getBranch } from '../actions/git';\nimport { authOptions } from '../auth';\n\nexport async function CollectionPage({ params }: { params: Promise<{ type: string }> }) {\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n const { type } = await params;\n const [entries, hasBranch, activeBranch] = await Promise.all([getEntryList(), hasActiveBranch(), getBranch()]);\n const collections = Object.keys(getConfig().collections);\n\n if (!type) {\n redirect(`/cms/content`);\n }\n if (!collections.includes(type)) {\n redirect('/cms/content');\n }\n\n return (\n <DashboardContent\n entries={entries}\n collections={collections}\n hasBranch={hasBranch}\n activeBranch={activeBranch}\n selectedType={type}\n />\n );\n}\n"],"mappings":";AA6BI;AA7BJ,SAAS,gBAAgB;AACzB,SAAS,wBAAwB;AAGjC,OAAO,sBAAsB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,cAAc,uBAAuB;AAC9C,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAE5B,eAAsB,eAAe,EAAE,OAAO,GAA0C;AACtF,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,CAAC,SAAS,WAAW,YAAY,IAAI,MAAM,QAAQ,IAAI,CAAC,aAAa,GAAG,gBAAgB,GAAG,UAAU,CAAC,CAAC;AAC7G,QAAM,cAAc,OAAO,KAAK,UAAU,EAAE,WAAW;AAEvD,MAAI,CAAC,MAAM;AACT,aAAS,cAAc;AAAA,EACzB;AACA,MAAI,CAAC,YAAY,SAAS,IAAI,GAAG;AAC/B,aAAS,cAAc;AAAA,EACzB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA;AAAA,EAChB;AAEJ;","names":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function ContentModelPage(): import("react/jsx-runtime").JSX.Element
|
|
1
|
+
export declare function ContentModelPage(): Promise<import("react/jsx-runtime").JSX.Element | null>;
|
|
2
2
|
//# sourceMappingURL=ContentModelPage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContentModelPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/ContentModelPage.tsx"],"names":[],"mappings":"AAQA,
|
|
1
|
+
{"version":3,"file":"ContentModelPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/ContentModelPage.tsx"],"names":[],"mappings":"AAQA,wBAAsB,gBAAgB,4DAUrC"}
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import "../../chunk-B5LE2OEC.js";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
import { Suspense } from "react";
|
|
4
3
|
import { getServerSession } from "next-auth";
|
|
5
4
|
import ContentModelList from "../../components/ContentModel/ContentModelList";
|
|
6
5
|
import { getEntryList } from "../actions";
|
|
7
6
|
import { getSchema } from "../actions/schema";
|
|
8
7
|
import { authOptions } from "../auth";
|
|
9
|
-
function ContentModelPage() {
|
|
10
|
-
return /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(ContentModelPageContent, {}) });
|
|
11
|
-
}
|
|
12
|
-
async function ContentModelPageContent() {
|
|
8
|
+
async function ContentModelPage() {
|
|
13
9
|
const session = await getServerSession(authOptions);
|
|
14
10
|
if (!session) {
|
|
15
11
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../admin/pages/ContentModelPage.tsx"],"sourcesContent":["import React
|
|
1
|
+
{"version":3,"sources":["../../../admin/pages/ContentModelPage.tsx"],"sourcesContent":["import React from 'react';\nimport { getServerSession } from 'next-auth';\n\nimport ContentModelList from '../../components/ContentModel/ContentModelList';\nimport { getEntryList } from '../actions';\nimport { getSchema } from '../actions/schema';\nimport { authOptions } from '../auth';\n\nexport async function ContentModelPage() {\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n const [schema, entries] = await Promise.all([getSchema(), getEntryList()]);\n\n return <ContentModelList schema={schema} entries={entries} />;\n}\n"],"mappings":";AAiBS;AAhBT,SAAS,wBAAwB;AAEjC,OAAO,sBAAsB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAE5B,eAAsB,mBAAmB;AACvC,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,QAAQ,OAAO,IAAI,MAAM,QAAQ,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,CAAC;AAEzE,SAAO,oBAAC,oBAAiB,QAAgB,SAAkB;AAC7D;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContentPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/ContentPage.tsx"],"names":[],"mappings":"AASA,wBAAsB,WAAW,4DAahC"}
|