@questpie/admin 1.1.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +256 -488
- package/dist/augmentation.d.mts +414 -0
- package/dist/client/blocks/block-renderer.d.mts +45 -0
- package/dist/client/blocks/block-renderer.mjs +105 -0
- package/dist/client/blocks/index.d.mts +2 -0
- package/dist/client/blocks/types.d.mts +68 -0
- package/dist/client/blocks/types.mjs +19 -0
- package/dist/client/builder/admin-types.d.mts +40 -0
- package/dist/client/builder/admin.d.mts +110 -0
- package/dist/client/builder/admin.mjs +151 -0
- package/dist/client/builder/field/field.d.mts +51 -0
- package/dist/client/builder/field/field.mjs +37 -0
- package/dist/client/builder/index.d.mts +31 -0
- package/dist/client/builder/page/page.d.mts +24 -0
- package/dist/client/builder/page/page.mjs +31 -0
- package/dist/client/builder/registry.d.mts +50 -0
- package/dist/client/builder/types/action-registry.mjs +276 -0
- package/dist/client/builder/types/action-types.d.mts +226 -0
- package/dist/client/builder/types/collection-types.mjs +10 -0
- package/dist/client/builder/types/common.d.mts +46 -0
- package/dist/client/builder/types/field-types.d.mts +592 -0
- package/dist/client/builder/types/field-types.mjs +18 -0
- package/dist/client/builder/types/ui-config.d.mts +158 -0
- package/dist/client/builder/types/widget-types.d.mts +562 -0
- package/dist/client/builder/validation.d.mts +33 -0
- package/dist/client/builder/validation.mjs +227 -0
- package/dist/client/builder/view/view.d.mts +49 -0
- package/dist/client/builder/view/view.mjs +27 -0
- package/dist/client/builder/widget/widget.d.mts +27 -0
- package/dist/client/builder/widget/widget.mjs +21 -0
- package/dist/client/components/actions/action-button.mjs +245 -0
- package/dist/client/components/actions/action-dialog.mjs +559 -0
- package/dist/client/components/actions/confirmation-dialog.mjs +201 -0
- package/dist/client/components/actions/header-actions.mjs +210 -0
- package/dist/client/components/admin-link.d.mts +66 -0
- package/dist/client/components/admin-link.mjs +171 -0
- package/dist/client/components/auth/auth-guard.d.mts +50 -0
- package/dist/client/components/auth/auth-guard.mjs +60 -0
- package/dist/client/components/auth/auth-loading.d.mts +35 -0
- package/dist/client/components/auth/auth-loading.mjs +55 -0
- package/dist/client/components/blocks/block-canvas.mjs +159 -0
- package/dist/client/components/blocks/block-editor-context.mjs +125 -0
- package/dist/client/components/blocks/block-editor-layout.mjs +199 -0
- package/dist/client/components/blocks/block-editor-provider.mjs +235 -0
- package/dist/client/components/blocks/block-fields-renderer.mjs +240 -0
- package/dist/client/components/blocks/block-insert-button.mjs +189 -0
- package/dist/client/components/blocks/block-item-menu.mjs +363 -0
- package/dist/client/components/blocks/block-item.mjs +434 -0
- package/dist/client/components/blocks/block-library-sidebar.mjs +285 -0
- package/dist/client/components/blocks/block-tree.mjs +103 -0
- package/dist/client/components/blocks/block-type-icon.mjs +95 -0
- package/dist/client/components/blocks/utils/tree-utils.mjs +185 -0
- package/dist/client/components/component-renderer.d.mts +114 -0
- package/dist/client/components/component-renderer.mjs +258 -0
- package/dist/client/components/error-boundary.mjs +144 -0
- package/dist/client/components/fields/array-field.mjs +506 -0
- package/dist/client/components/fields/asset-preview-field.mjs +159 -0
- package/dist/client/components/fields/blocks-field/blocks-field.mjs +209 -0
- package/dist/client/components/fields/boolean-field.mjs +77 -0
- package/dist/client/components/fields/date-field.mjs +76 -0
- package/dist/client/components/fields/datetime-field.mjs +74 -0
- package/dist/client/components/fields/email-field.mjs +67 -0
- package/dist/client/components/fields/field-utils.mjs +64 -0
- package/dist/client/components/fields/field-wrapper.mjs +124 -0
- package/dist/client/components/fields/json-field.mjs +461 -0
- package/dist/client/components/fields/locale-badge.mjs +25 -0
- package/dist/client/components/fields/number-field.mjs +73 -0
- package/dist/client/components/fields/object-array-field.mjs +707 -0
- package/dist/client/components/fields/object-field.mjs +686 -0
- package/dist/client/components/fields/relation/displays/cards-display.mjs +254 -0
- package/dist/client/components/fields/relation/displays/chips-display.mjs +173 -0
- package/dist/client/components/fields/relation/displays/grid-display.mjs +209 -0
- package/dist/client/components/fields/relation/displays/list-display.mjs +247 -0
- package/dist/client/components/fields/relation/displays/table-display.mjs +309 -0
- package/dist/client/components/fields/relation/displays/types.mjs +72 -0
- package/dist/client/components/fields/relation/relation-items-display.mjs +143 -0
- package/dist/client/components/fields/relation-field.mjs +161 -0
- package/dist/client/components/fields/relation-picker.mjs +296 -0
- package/dist/client/components/fields/relation-select.mjs +232 -0
- package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +105 -0
- package/dist/client/components/fields/rich-text-editor/extensions.mjs +144 -0
- package/dist/client/components/fields/rich-text-editor/image-popover.mjs +221 -0
- package/dist/client/components/fields/rich-text-editor/index.mjs +520 -0
- package/dist/client/components/fields/rich-text-editor/link-popover.mjs +85 -0
- package/dist/client/components/fields/rich-text-editor/presets.mjs +123 -0
- package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +188 -0
- package/dist/client/components/fields/rich-text-editor/table-controls.mjs +433 -0
- package/dist/client/components/fields/rich-text-editor/toolbar.mjs +541 -0
- package/dist/client/components/fields/rich-text-editor/types.mjs +30 -0
- package/dist/client/components/fields/rich-text-editor/utils.mjs +50 -0
- package/dist/client/components/fields/rich-text-field.mjs +64 -0
- package/dist/client/components/fields/select-field.mjs +88 -0
- package/dist/client/components/fields/text-field.mjs +72 -0
- package/dist/client/components/fields/textarea-field.mjs +71 -0
- package/dist/client/components/fields/time-field.mjs +67 -0
- package/dist/client/components/fields/upload-field.mjs +621 -0
- package/dist/client/components/filter-builder/columns-tab.mjs +325 -0
- package/dist/client/components/filter-builder/filter-builder-sheet.mjs +456 -0
- package/dist/client/components/filter-builder/filters-tab.mjs +663 -0
- package/dist/client/components/filter-builder/saved-views-tab.mjs +278 -0
- package/dist/client/components/history-sidebar.mjs +496 -0
- package/dist/client/components/layout/field-layout-renderer.mjs +301 -0
- package/dist/client/components/locale-switcher.mjs +251 -0
- package/dist/client/components/media/media-grid.mjs +314 -0
- package/dist/client/components/media/media-picker-dialog.mjs +563 -0
- package/dist/client/components/preview/live-preview-mode.mjs +503 -0
- package/dist/client/components/preview/preview-pane.mjs +388 -0
- package/dist/client/components/primitives/asset-preview.mjs +771 -0
- package/dist/client/components/primitives/checkbox-input.mjs +59 -0
- package/dist/client/components/primitives/date-input.mjs +461 -0
- package/dist/client/components/primitives/dropzone.mjs +368 -0
- package/dist/client/components/primitives/number-input.mjs +117 -0
- package/dist/client/components/primitives/select-multi.mjs +590 -0
- package/dist/client/components/primitives/select-single.mjs +473 -0
- package/dist/client/components/primitives/text-input.mjs +45 -0
- package/dist/client/components/primitives/textarea-input.mjs +43 -0
- package/dist/client/components/primitives/time-input.mjs +145 -0
- package/dist/client/components/primitives/toggle-input.mjs +51 -0
- package/dist/client/components/primitives/types.mjs +12 -0
- package/dist/client/components/sheets/resource-sheet.mjs +86 -0
- package/dist/client/components/ui/accordion.mjs +169 -0
- package/dist/client/components/ui/alert.mjs +85 -0
- package/dist/client/components/ui/badge.mjs +76 -0
- package/dist/client/components/ui/button.mjs +84 -0
- package/dist/client/components/ui/card.mjs +206 -0
- package/dist/client/components/ui/checkbox.mjs +82 -0
- package/dist/client/components/ui/command.mjs +239 -0
- package/dist/client/components/ui/dialog.mjs +296 -0
- package/dist/client/components/ui/drawer.mjs +278 -0
- package/dist/client/components/ui/dropdown-menu.mjs +315 -0
- package/dist/client/components/ui/empty-state.mjs +99 -0
- package/dist/client/components/ui/field.mjs +354 -0
- package/dist/client/components/ui/input-group.mjs +201 -0
- package/dist/client/components/ui/input.mjs +46 -0
- package/dist/client/components/ui/kbd.mjs +53 -0
- package/dist/client/components/ui/label.mjs +45 -0
- package/dist/client/components/ui/popover.mjs +176 -0
- package/dist/client/components/ui/responsive-dialog.mjs +308 -0
- package/dist/client/components/ui/search-input.mjs +139 -0
- package/dist/client/components/ui/select.mjs +325 -0
- package/dist/client/components/ui/separator.mjs +47 -0
- package/dist/client/components/ui/sheet.mjs +280 -0
- package/dist/client/components/ui/sidebar.mjs +774 -0
- package/dist/client/components/ui/skeleton.mjs +40 -0
- package/dist/client/components/ui/sonner.d.mts +13 -0
- package/dist/client/components/ui/sonner.mjs +85 -0
- package/dist/client/components/ui/spinner.mjs +52 -0
- package/dist/client/components/ui/switch.mjs +58 -0
- package/dist/client/components/ui/table.mjs +276 -0
- package/dist/client/components/ui/tabs.mjs +160 -0
- package/dist/client/components/ui/textarea.mjs +40 -0
- package/dist/client/components/ui/toolbar.mjs +136 -0
- package/dist/client/components/ui/tooltip.mjs +146 -0
- package/dist/client/components/widgets/chart-widget.mjs +582 -0
- package/dist/client/components/widgets/progress-widget.mjs +200 -0
- package/dist/client/components/widgets/quick-actions-widget.mjs +209 -0
- package/dist/client/components/widgets/recent-items-widget.mjs +196 -0
- package/dist/client/components/widgets/stats-widget.mjs +261 -0
- package/dist/client/components/widgets/table-widget.mjs +273 -0
- package/dist/client/components/widgets/timeline-widget.mjs +279 -0
- package/dist/client/components/widgets/value-widget.mjs +312 -0
- package/dist/client/components/widgets/widget-skeletons.mjs +427 -0
- package/dist/client/contexts/breadcrumb-context.mjs +60 -0
- package/dist/client/contexts/focus-context.d.mts +87 -0
- package/dist/client/contexts/focus-context.mjs +250 -0
- package/dist/client/hooks/typed-hooks.d.mts +110 -0
- package/dist/client/hooks/typed-hooks.mjs +888 -0
- package/dist/client/hooks/use-action.mjs +329 -0
- package/dist/client/hooks/use-admin-config.mjs +69 -0
- package/dist/client/hooks/use-admin-preferences.mjs +171 -0
- package/dist/client/hooks/use-admin-routes.mjs +130 -0
- package/dist/client/hooks/use-audit-history.mjs +157 -0
- package/dist/client/hooks/use-auth.d.mts +97 -0
- package/dist/{use-auth-BoLmWtmU.mjs → client/hooks/use-auth.mjs} +9 -10
- package/dist/client/hooks/use-collection-fields.mjs +71 -0
- package/dist/client/hooks/use-collection-meta.mjs +153 -0
- package/dist/client/hooks/use-collection-schema.mjs +90 -0
- package/dist/client/hooks/use-collection-validation.mjs +88 -0
- package/dist/client/hooks/use-collection.d.mts +96 -0
- package/dist/client/hooks/use-collection.mjs +673 -0
- package/dist/client/hooks/use-current-user.d.mts +60 -0
- package/dist/client/hooks/use-current-user.mjs +79 -0
- package/dist/client/hooks/use-field-hooks.mjs +199 -0
- package/dist/client/hooks/use-field-options.d.mts +57 -0
- package/dist/client/hooks/use-field-options.mjs +269 -0
- package/dist/client/hooks/use-global-fields.mjs +58 -0
- package/dist/client/hooks/use-global-meta.mjs +105 -0
- package/dist/client/hooks/use-global-schema.mjs +53 -0
- package/dist/client/hooks/use-global.d.mts +51 -0
- package/dist/client/hooks/use-global.mjs +284 -0
- package/dist/client/hooks/use-locks.mjs +452 -0
- package/dist/client/hooks/use-media-query.d.mts +22 -0
- package/dist/client/hooks/use-media-query.mjs +81 -0
- package/dist/client/hooks/use-prefill-params.mjs +47 -0
- package/dist/client/hooks/use-questpie-query-options.mjs +50 -0
- package/dist/client/hooks/use-reactive-fields.d.mts +78 -0
- package/dist/client/hooks/use-reactive-fields.mjs +201 -0
- package/dist/client/hooks/use-realtime-highlight.mjs +158 -0
- package/dist/client/hooks/use-saved-views.mjs +140 -0
- package/dist/client/hooks/use-search-param-toggle.d.mts +12 -0
- package/dist/client/hooks/use-search-param-toggle.mjs +115 -0
- package/dist/client/hooks/use-search.mjs +258 -0
- package/dist/client/hooks/use-server-actions.mjs +191 -0
- package/dist/client/hooks/use-server-validation.mjs +291 -0
- package/dist/client/hooks/use-server-widget-data.d.mts +25 -0
- package/dist/client/hooks/use-server-widget-data.mjs +65 -0
- package/dist/client/hooks/use-setup-status.d.mts +38 -0
- package/dist/client/hooks/use-setup-status.mjs +62 -0
- package/dist/client/hooks/use-sidebar-search-param.d.mts +9 -0
- package/dist/client/hooks/use-sidebar-search-param.mjs +104 -0
- package/dist/client/hooks/use-transition-stage.mjs +125 -0
- package/dist/client/hooks/use-upload-collection.mjs +31 -0
- package/dist/client/hooks/use-upload.mjs +209 -0
- package/dist/client/hooks/use-validation-error-map.mjs +57 -0
- package/dist/client/hooks/use-view-state.mjs +479 -0
- package/dist/client/i18n/hooks.mjs +284 -0
- package/dist/client/i18n/intl-cache.mjs +64 -0
- package/dist/client/i18n/messages.mjs +6 -0
- package/dist/client/i18n/simple.d.mts +21 -0
- package/dist/client/i18n/simple.mjs +156 -0
- package/dist/client/i18n/types.d.mts +109 -0
- package/dist/client/lib/cookies.mjs +9 -0
- package/dist/client/lib/events.mjs +5 -0
- package/dist/client/lib/render-profiler.mjs +51 -0
- package/dist/client/lib/utils.mjs +23 -0
- package/dist/client/preview/block-scope-context.d.mts +73 -0
- package/dist/client/preview/block-scope-context.mjs +116 -0
- package/dist/client/preview/index.d.mts +5 -0
- package/dist/client/preview/preview-banner.d.mts +45 -0
- package/dist/client/preview/preview-banner.mjs +134 -0
- package/dist/client/preview/preview-field.d.mts +107 -0
- package/dist/client/preview/preview-field.mjs +227 -0
- package/dist/client/preview/types.d.mts +114 -0
- package/dist/client/preview/types.mjs +20 -0
- package/dist/client/preview/use-collection-preview.d.mts +70 -0
- package/dist/client/preview/use-collection-preview.mjs +163 -0
- package/dist/client/runtime/content-locales-provider.d.mts +1 -0
- package/dist/client/runtime/content-locales-provider.mjs +136 -0
- package/dist/client/runtime/index.d.mts +5 -0
- package/dist/client/runtime/index.mjs +6 -0
- package/dist/client/runtime/locale-scope.d.mts +2 -0
- package/dist/client/runtime/locale-scope.mjs +108 -0
- package/dist/client/runtime/provider.d.mts +203 -0
- package/dist/client/runtime/provider.mjs +393 -0
- package/dist/client/runtime/routes.d.mts +49 -0
- package/dist/client/runtime/routes.mjs +91 -0
- package/dist/client/runtime/translations-provider.mjs +242 -0
- package/dist/client/scope/index.d.mts +3 -0
- package/dist/client/scope/picker.d.mts +53 -0
- package/dist/client/scope/picker.mjs +395 -0
- package/dist/client/scope/provider.d.mts +103 -0
- package/dist/client/scope/provider.mjs +167 -0
- package/dist/client/scope/types.d.mts +111 -0
- package/dist/client/styles/index.css +344 -188
- package/dist/client/utils/auto-expand-fields.mjs +83 -0
- package/dist/client/utils/build-field-definitions-from-schema.mjs +259 -0
- package/dist/client/utils/dependency-tracker.mjs +61 -0
- package/dist/client/utils/detect-relations.mjs +45 -0
- package/dist/client/utils/locale-to-flag.d.mts +119 -0
- package/dist/client/utils/locale-to-flag.mjs +129 -0
- package/dist/client/utils/routes.mjs +195 -0
- package/dist/client/views/auth/accept-invite-form.d.mts +72 -0
- package/dist/client/views/auth/accept-invite-form.mjs +473 -0
- package/dist/client/views/auth/auth-layout.d.mts +43 -0
- package/dist/client/views/auth/auth-layout.mjs +116 -0
- package/dist/client/views/auth/forgot-password-form.d.mts +58 -0
- package/dist/client/views/auth/forgot-password-form.mjs +386 -0
- package/dist/client/views/auth/invite-form.mjs +497 -0
- package/dist/client/views/auth/login-form.d.mts +75 -0
- package/dist/client/views/auth/login-form.mjs +387 -0
- package/dist/client/views/auth/reset-password-form.d.mts +65 -0
- package/dist/client/views/auth/reset-password-form.mjs +515 -0
- package/dist/client/views/auth/setup-form.d.mts +60 -0
- package/dist/client/views/auth/setup-form.mjs +526 -0
- package/dist/client/views/collection/auto-form-fields.mjs +873 -0
- package/dist/client/views/collection/bulk-action-toolbar.mjs +480 -0
- package/dist/client/views/collection/cells/complex-cells.mjs +746 -0
- package/dist/client/views/collection/cells/primitive-cells.mjs +395 -0
- package/dist/client/views/collection/cells/relation-cells.mjs +260 -0
- package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +509 -0
- package/dist/client/views/collection/cells/shared/cell-helpers.mjs +125 -0
- package/dist/client/views/collection/cells/shared/relation-chip.mjs +121 -0
- package/dist/client/views/collection/cells/upload-cells.mjs +28 -0
- package/dist/client/views/collection/columns/build-columns.mjs +195 -0
- package/dist/client/views/collection/columns/column-defaults.mjs +123 -0
- package/dist/client/views/collection/field-context.mjs +126 -0
- package/dist/client/views/collection/field-renderer.mjs +368 -0
- package/dist/client/views/collection/form-view.mjs +1566 -0
- package/dist/client/views/collection/table-view.mjs +832 -0
- package/dist/client/views/collection/view-skeletons.mjs +215 -0
- package/dist/client/views/common/global-search.mjs +700 -0
- package/dist/client/views/dashboard/dashboard-grid.mjs +881 -0
- package/dist/client/views/dashboard/dashboard-widget.mjs +265 -0
- package/dist/client/views/dashboard/widget-card.mjs +372 -0
- package/dist/client/views/globals/global-form-view.mjs +1306 -0
- package/dist/client/views/layout/admin-layout-provider.d.mts +137 -0
- package/dist/client/views/layout/admin-layout-provider.mjs +193 -0
- package/dist/client/views/layout/admin-layout.d.mts +133 -0
- package/dist/client/views/layout/admin-layout.mjs +302 -0
- package/dist/client/views/layout/admin-router.d.mts +93 -0
- package/dist/client/views/layout/admin-router.mjs +1254 -0
- package/dist/client/views/layout/admin-sidebar.d.mts +99 -0
- package/dist/client/views/layout/admin-sidebar.mjs +1379 -0
- package/dist/client/views/layout/admin-topbar.mjs +236 -0
- package/dist/client/views/pages/accept-invite-page.d.mts +66 -0
- package/dist/client/views/pages/accept-invite-page.mjs +349 -0
- package/dist/client/views/pages/dashboard-page.d.mts +43 -0
- package/dist/client/views/pages/dashboard-page.mjs +84 -0
- package/dist/client/views/pages/forgot-password-page.d.mts +56 -0
- package/dist/client/views/pages/forgot-password-page.mjs +152 -0
- package/dist/client/views/pages/invite-page.d.mts +70 -0
- package/dist/client/views/pages/invite-page.mjs +161 -0
- package/dist/client/views/pages/login-page.d.mts +69 -0
- package/dist/client/views/pages/login-page.mjs +193 -0
- package/dist/client/views/pages/reset-password-page.d.mts +63 -0
- package/dist/client/views/pages/reset-password-page.mjs +257 -0
- package/dist/client/views/pages/setup-page.d.mts +61 -0
- package/dist/client/views/pages/setup-page.mjs +156 -0
- package/dist/client-module.d.mts +3 -0
- package/dist/client-module.mjs +3 -0
- package/dist/client.d.mts +99 -3
- package/dist/client.mjs +52 -12
- package/dist/components/rich-text/index.d.mts +1 -0
- package/dist/components/rich-text/rich-text-renderer.d.mts +103 -0
- package/dist/components/rich-text/rich-text-renderer.mjs +237 -0
- package/dist/index.d.mts +59 -3
- package/dist/index.mjs +52 -12
- package/dist/plugin.d.mts +2 -0
- package/dist/plugin.mjs +3 -0
- package/dist/server/adapters/nextjs.d.mts +120 -0
- package/dist/server/adapters/nextjs.mjs +110 -0
- package/dist/server/adapters/tanstack.d.mts +132 -0
- package/dist/server/adapters/tanstack.mjs +89 -0
- package/dist/server/augmentation/actions.d.mts +279 -0
- package/dist/server/augmentation/common.d.mts +76 -0
- package/dist/server/augmentation/dashboard.d.mts +547 -0
- package/dist/server/augmentation/form-layout.d.mts +303 -0
- package/dist/server/augmentation/index.d.mts +44 -0
- package/dist/server/augmentation/index.mjs +10 -0
- package/dist/server/augmentation/sidebar.d.mts +181 -0
- package/dist/server/augmentation/views.d.mts +237 -0
- package/dist/server/augmentation.d.mts +7 -0
- package/dist/server/block/index.d.mts +4 -0
- package/dist/server/codegen/admin-client-template.mjs +93 -0
- package/dist/server/codegen/projection-validator.mjs +67 -0
- package/dist/server/fields/blocks.d.mts +71 -0
- package/dist/server/fields/blocks.mjs +151 -0
- package/dist/server/fields/index.d.mts +15 -0
- package/dist/server/fields/index.mjs +15 -0
- package/dist/server/fields/rich-text.d.mts +68 -0
- package/dist/server/fields/rich-text.mjs +147 -0
- package/dist/server/i18n/index.mjs +43 -0
- package/dist/server/i18n/messages/cs.mjs +461 -0
- package/dist/server/i18n/messages/de.mjs +461 -0
- package/dist/server/i18n/messages/en.mjs +707 -0
- package/dist/server/i18n/messages/es.mjs +461 -0
- package/dist/server/i18n/messages/fr.mjs +461 -0
- package/dist/server/i18n/messages/index.mjs +23 -0
- package/dist/server/i18n/messages/pl.mjs +461 -0
- package/dist/server/i18n/messages/pt.mjs +464 -0
- package/dist/server/i18n/messages/sk.mjs +689 -0
- package/dist/server/modules/admin/.generated/module.d.mts +52 -0
- package/dist/server/modules/admin/.generated/module.mjs +78 -0
- package/dist/server/modules/admin/.generated/registries.d.mts +22 -0
- package/dist/server/modules/admin/auth-helpers.d.mts +142 -0
- package/dist/server/modules/admin/auth-helpers.mjs +107 -0
- package/dist/server/modules/admin/block/block-builder.d.mts +383 -0
- package/dist/server/modules/admin/block/block-builder.mjs +315 -0
- package/dist/server/modules/admin/block/index.d.mts +3 -0
- package/dist/server/modules/admin/block/introspection.d.mts +89 -0
- package/dist/server/modules/admin/block/introspection.mjs +100 -0
- package/dist/server/modules/admin/block/prefetch.d.mts +78 -0
- package/dist/server/modules/admin/block/prefetch.mjs +241 -0
- package/dist/server/modules/admin/client/.generated/module.d.mts +94 -0
- package/dist/server/modules/admin/client/.generated/module.mjs +91 -0
- package/dist/server/modules/admin/client/components/badge.d.mts +1 -0
- package/dist/server/modules/admin/client/components/icon.d.mts +1 -0
- package/dist/server/modules/admin/client/fields/array.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/array.mjs +12 -0
- package/dist/server/modules/admin/client/fields/assetPreview.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/assetPreview.mjs +18 -0
- package/dist/server/modules/admin/client/fields/blocks.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/blocks.mjs +12 -0
- package/dist/server/modules/admin/client/fields/boolean.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/boolean.mjs +12 -0
- package/dist/server/modules/admin/client/fields/date.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/date.mjs +12 -0
- package/dist/server/modules/admin/client/fields/datetime.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/datetime.mjs +12 -0
- package/dist/server/modules/admin/client/fields/email.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/email.mjs +12 -0
- package/dist/server/modules/admin/client/fields/json.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/json.mjs +11 -0
- package/dist/server/modules/admin/client/fields/number.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/number.mjs +12 -0
- package/dist/server/modules/admin/client/fields/object.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/object.mjs +12 -0
- package/dist/server/modules/admin/client/fields/relation.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/relation.mjs +12 -0
- package/dist/server/modules/admin/client/fields/richText.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/richText.mjs +11 -0
- package/dist/server/modules/admin/client/fields/select.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/select.mjs +12 -0
- package/dist/server/modules/admin/client/fields/text.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/text.mjs +12 -0
- package/dist/server/modules/admin/client/fields/textarea.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/textarea.mjs +12 -0
- package/dist/server/modules/admin/client/fields/time.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/time.mjs +12 -0
- package/dist/server/modules/admin/client/fields/upload.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/upload.mjs +12 -0
- package/dist/server/modules/admin/client/fields/url.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/url.mjs +12 -0
- package/dist/server/modules/admin/client/index.d.mts +1 -0
- package/dist/server/modules/admin/client/pages/dashboard.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/dashboard.mjs +11 -0
- package/dist/server/modules/admin/client/pages/forgotPassword.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/forgotPassword.mjs +11 -0
- package/dist/server/modules/admin/client/pages/login.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/login.mjs +11 -0
- package/dist/server/modules/admin/client/pages/resetPassword.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/resetPassword.mjs +11 -0
- package/dist/server/modules/admin/client/pages/setup.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/setup.mjs +11 -0
- package/dist/server/modules/admin/client/views/collection-form.mjs +10 -0
- package/dist/server/modules/admin/client/views/collection-table.mjs +10 -0
- package/dist/server/modules/admin/client/views/global-form.mjs +10 -0
- package/dist/server/modules/admin/client/widgets/chart.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/chart.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/progress.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/progress.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/quickActions.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/quickActions.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/recentItems.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/recentItems.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/stats.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/stats.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/table.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/table.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/timeline.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/timeline.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/value.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/value.mjs +7 -0
- package/dist/server/modules/admin/collections/account.d.mts +77 -0
- package/dist/server/modules/admin/collections/account.mjs +23 -0
- package/dist/server/modules/admin/collections/admin-locks.d.mts +90 -0
- package/dist/server/modules/admin/collections/admin-locks.mjs +16 -0
- package/dist/server/modules/admin/collections/admin-preferences.d.mts +69 -0
- package/dist/server/modules/admin/collections/admin-preferences.mjs +16 -0
- package/dist/server/modules/admin/collections/admin-saved-views.d.mts +83 -0
- package/dist/server/modules/admin/collections/admin-saved-views.mjs +16 -0
- package/dist/server/modules/admin/collections/apikey.d.mts +99 -0
- package/dist/server/modules/admin/collections/apikey.mjs +15 -0
- package/dist/server/modules/admin/collections/assets.d.mts +72 -0
- package/dist/server/modules/admin/collections/assets.mjs +71 -0
- package/dist/server/modules/admin/collections/session.d.mts +69 -0
- package/dist/server/modules/admin/collections/session.mjs +15 -0
- package/dist/server/modules/admin/collections/user.d.mts +85 -0
- package/dist/server/modules/admin/collections/user.mjs +204 -0
- package/dist/server/modules/admin/collections/verification.d.mts +63 -0
- package/dist/server/modules/admin/collections/verification.mjs +15 -0
- package/dist/server/modules/admin/components/badge.d.mts +10 -0
- package/dist/server/modules/admin/components/badge.mjs +10 -0
- package/dist/server/modules/admin/components/icon.d.mts +9 -0
- package/dist/server/modules/admin/components/icon.mjs +11 -0
- package/dist/server/modules/admin/config/admin.mjs +34 -0
- package/dist/server/modules/admin/dto/admin-config.dto.mjs +102 -0
- package/dist/server/modules/admin/factories.mjs +172 -0
- package/dist/server/modules/admin/index.d.mts +1093 -0
- package/dist/server/modules/admin/index.mjs +26 -0
- package/dist/server/modules/admin/modules.mjs +11 -0
- package/dist/server/modules/admin/plugin.mjs +13 -0
- package/dist/server/modules/admin/routes/admin-config.d.mts +28 -0
- package/dist/server/modules/admin/routes/admin-config.mjs +552 -0
- package/dist/server/modules/admin/routes/execute-action.d.mts +92 -0
- package/dist/server/modules/admin/routes/execute-action.mjs +433 -0
- package/dist/server/modules/admin/routes/locales.d.mts +18 -0
- package/dist/server/modules/admin/routes/locales.mjs +69 -0
- package/dist/server/modules/admin/routes/preview.d.mts +80 -0
- package/dist/server/modules/admin/routes/preview.mjs +230 -0
- package/dist/server/modules/admin/routes/reactive.d.mts +74 -0
- package/dist/server/modules/admin/routes/reactive.mjs +350 -0
- package/dist/server/modules/admin/routes/route-helpers.d.mts +23 -0
- package/dist/server/modules/admin/routes/route-helpers.mjs +76 -0
- package/dist/server/modules/admin/routes/setup.d.mts +63 -0
- package/dist/server/modules/admin/routes/setup.mjs +114 -0
- package/dist/server/modules/admin/routes/translations.d.mts +26 -0
- package/dist/server/modules/admin/routes/translations.mjs +114 -0
- package/dist/server/modules/admin/routes/widget-data.d.mts +32 -0
- package/dist/server/modules/admin/routes/widget-data.mjs +62 -0
- package/dist/server/modules/admin/views/form.d.mts +8 -0
- package/dist/server/modules/admin/views/form.mjs +7 -0
- package/dist/server/modules/admin/views/global-form.d.mts +8 -0
- package/dist/server/modules/admin/views/global-form.mjs +7 -0
- package/dist/server/modules/admin/views/table.d.mts +8 -0
- package/dist/server/modules/admin/views/table.mjs +7 -0
- package/dist/server/modules/admin-preferences/collections/admin-preferences.mjs +37 -0
- package/dist/server/modules/admin-preferences/collections/locks.collection.mjs +55 -0
- package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +99 -0
- package/dist/server/modules/admin-preferences/collections/saved-views.mjs +38 -0
- package/dist/server/modules/audit/.generated/module.d.mts +60 -0
- package/dist/server/modules/audit/.generated/module.mjs +30 -0
- package/dist/server/modules/audit/collections/audit-log.d.mts +214 -0
- package/dist/server/modules/audit/collections/audit-log.mjs +107 -0
- package/dist/server/modules/audit/config/admin.mjs +21 -0
- package/dist/server/modules/audit/config/app.mjs +262 -0
- package/dist/server/modules/audit/index.d.mts +2 -0
- package/dist/server/modules/audit/jobs/audit-cleanup.d.mts +13 -0
- package/dist/server/modules/audit/jobs/audit-cleanup.mjs +28 -0
- package/dist/server/plugin.d.mts +26 -0
- package/dist/server/plugin.mjs +385 -0
- package/dist/server/proxy-factories.d.mts +85 -0
- package/dist/server/proxy-factories.mjs +302 -0
- package/dist/server/registry-helpers.d.mts +83 -0
- package/dist/server/registry-helpers.mjs +104 -0
- package/dist/server.d.mts +33 -250
- package/dist/server.mjs +22 -832
- package/dist/shared/preview-utils.d.mts +53 -0
- package/dist/{preview-utils-BKQ9-TMa.mjs → shared/preview-utils.mjs} +2 -3
- package/dist/{saved-views.types-BMsz5mCy.d.mts → shared/types/saved-views.types.d.mts} +7 -2
- package/dist/shared.d.mts +3 -57
- package/dist/shared.mjs +1 -1
- package/package.json +56 -51
- package/skills/questpie-admin/SKILL.md +397 -0
- package/skills/questpie-admin/blocks/SKILL.md +305 -0
- package/skills/questpie-admin/custom-ui/SKILL.md +307 -0
- package/skills/questpie-admin/views/SKILL.md +442 -0
- package/dist/auth-layout-M8K8_q5R.mjs +0 -181
- package/dist/auth-layout-M8K8_q5R.mjs.map +0 -1
- package/dist/bulk-upload-dialog-D7w7W1Hl.mjs +0 -273
- package/dist/bulk-upload-dialog-D7w7W1Hl.mjs.map +0 -1
- package/dist/card-BKHjBQfw.mjs +0 -58
- package/dist/card-BKHjBQfw.mjs.map +0 -1
- package/dist/client-D1DqawtP.d.mts +0 -13403
- package/dist/client-D1DqawtP.d.mts.map +0 -1
- package/dist/client-njX1rZmi.mjs +0 -22612
- package/dist/client-njX1rZmi.mjs.map +0 -1
- package/dist/content-locales-provider-BXvuIgfg.mjs +0 -1650
- package/dist/content-locales-provider-BXvuIgfg.mjs.map +0 -1
- package/dist/dashboard-page-B4PGEdc2.mjs +0 -2500
- package/dist/dashboard-page-B4PGEdc2.mjs.map +0 -1
- package/dist/dashboard-page-mCY0pgZv.mjs +0 -3
- package/dist/dropzone-Do3awXKd.mjs +0 -634
- package/dist/dropzone-Do3awXKd.mjs.map +0 -1
- package/dist/forgot-password-page-Bcp-An4Y.mjs +0 -221
- package/dist/forgot-password-page-Bcp-An4Y.mjs.map +0 -1
- package/dist/forgot-password-page-CEwsdLwn.mjs +0 -3
- package/dist/index-B4H3amCD.d.mts +0 -2753
- package/dist/index-B4H3amCD.d.mts.map +0 -1
- package/dist/login-page-BUnpCbCa.mjs +0 -3
- package/dist/login-page-CP4gA-dl.mjs +0 -298
- package/dist/login-page-CP4gA-dl.mjs.map +0 -1
- package/dist/preview-utils-BKQ9-TMa.mjs.map +0 -1
- package/dist/reset-password-page-BqfDmLxA.mjs +0 -281
- package/dist/reset-password-page-BqfDmLxA.mjs.map +0 -1
- package/dist/reset-password-page-CufHz3h3.mjs +0 -3
- package/dist/runtime-6VZM878K.mjs +0 -69
- package/dist/runtime-6VZM878K.mjs.map +0 -1
- package/dist/saved-views.types-BMsz5mCy.d.mts.map +0 -1
- package/dist/server.d.mts.map +0 -1
- package/dist/server.mjs.map +0 -1
- package/dist/setup-page-BNNzt_Z6.mjs +0 -3
- package/dist/setup-page-YAP_fzqh.mjs +0 -264
- package/dist/setup-page-YAP_fzqh.mjs.map +0 -1
- package/dist/shared.d.mts.map +0 -1
- package/dist/use-auth-BoLmWtmU.mjs.map +0 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { adminPlugin } from "../../plugin.mjs";
|
|
2
|
+
import { savedViewsCollection } from "../admin-preferences/collections/saved-views.mjs";
|
|
3
|
+
import { actionFunctions, executeAction, executeActionFn, getActionsConfig, getActionsConfigFn } from "./routes/execute-action.mjs";
|
|
4
|
+
import { createPreviewFunctions, createPreviewTokenVerifier, verifyPreviewTokenDirect } from "./routes/preview.mjs";
|
|
5
|
+
import { batchReactive, fieldOptions, reactiveFunctions } from "./routes/reactive.mjs";
|
|
6
|
+
import { createFirstAdmin, isSetupRequired, setupFunctions } from "./routes/setup.mjs";
|
|
7
|
+
import { fetchWidgetData, widgetDataFunctions } from "./routes/widget-data.mjs";
|
|
8
|
+
import module_default from "./.generated/module.mjs";
|
|
9
|
+
|
|
10
|
+
//#region src/server/modules/admin/index.ts
|
|
11
|
+
/**
|
|
12
|
+
* Admin module with codegen plugin attached.
|
|
13
|
+
*
|
|
14
|
+
* The `plugin` field lets `extractPluginsFromModules` auto-discover the admin
|
|
15
|
+
* codegen plugin from modules.ts, eliminating the need for users to manually
|
|
16
|
+
* add `plugins: [adminPlugin()]` in their questpie.config.ts.
|
|
17
|
+
*/
|
|
18
|
+
const adminModule = Object.assign(module_default, { plugin: adminPlugin() });
|
|
19
|
+
/**
|
|
20
|
+
* Admin routes — flat spread of all admin route definitions.
|
|
21
|
+
* Automatically registered when adminModule is included in your app modules.
|
|
22
|
+
*/
|
|
23
|
+
const adminRoutes = adminModule.routes;
|
|
24
|
+
|
|
25
|
+
//#endregion
|
|
26
|
+
export { adminModule, adminRoutes };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { starterModule } from "questpie";
|
|
2
|
+
|
|
3
|
+
//#region src/server/modules/admin/modules.ts
|
|
4
|
+
/**
|
|
5
|
+
* Admin module dependencies.
|
|
6
|
+
* The admin module depends on the starter module for auth collections and assets.
|
|
7
|
+
*/
|
|
8
|
+
var modules_default = [starterModule];
|
|
9
|
+
|
|
10
|
+
//#endregion
|
|
11
|
+
export { modules_default as default };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { adminPlugin } from "../../plugin.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/server/modules/admin/plugin.ts
|
|
4
|
+
/**
|
|
5
|
+
* Admin module plugin — re-exports the admin codegen plugin so that
|
|
6
|
+
* module codegen discovers it and embeds it in the generated module
|
|
7
|
+
* definition. This allows `extractPluginsFromModules` to pick it up
|
|
8
|
+
* automatically at root-app codegen time.
|
|
9
|
+
*/
|
|
10
|
+
var plugin_default = adminPlugin();
|
|
11
|
+
|
|
12
|
+
//#endregion
|
|
13
|
+
export { plugin_default as default };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as questpie405 from "questpie";
|
|
2
|
+
|
|
3
|
+
//#region src/server/modules/admin/routes/admin-config.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Admin Config Functions
|
|
7
|
+
*
|
|
8
|
+
* Provides server-defined admin configuration (dashboard, sidebar,
|
|
9
|
+
* collection/global metadata) to the client via RPC.
|
|
10
|
+
*
|
|
11
|
+
* Filters results by the current user's read access.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* // Client usage
|
|
16
|
+
* const config = await client.routes.getAdminConfig({});
|
|
17
|
+
* // { dashboard: {...}, sidebar: {...}, collections: {...}, globals: {...} }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Admin config route handlers.
|
|
22
|
+
* Registered via module routes and exposed through the fetch handler.
|
|
23
|
+
*/
|
|
24
|
+
declare const adminConfigFunctions: {
|
|
25
|
+
readonly getAdminConfig: questpie405.JsonRouteDefinition<Record<string, never> | undefined, any>;
|
|
26
|
+
};
|
|
27
|
+
//#endregion
|
|
28
|
+
export { adminConfigFunctions };
|
|
@@ -0,0 +1,552 @@
|
|
|
1
|
+
import { introspectBlocks } from "../block/introspection.mjs";
|
|
2
|
+
import { resolveDashboardCallback, resolveSidebarCallback } from "../../../proxy-factories.mjs";
|
|
3
|
+
import { adminConfigDTOSchema } from "../dto/admin-config.dto.mjs";
|
|
4
|
+
import { getAccessContext, getAdminConfig as getAdminConfig$1, getApp, getAppState, getCollectionState, getGlobalState } from "./route-helpers.mjs";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { executeAccessRule, route } from "questpie";
|
|
7
|
+
|
|
8
|
+
//#region src/server/modules/admin/routes/admin-config.ts
|
|
9
|
+
/**
|
|
10
|
+
* Admin Config Functions
|
|
11
|
+
*
|
|
12
|
+
* Provides server-defined admin configuration (dashboard, sidebar,
|
|
13
|
+
* collection/global metadata) to the client via RPC.
|
|
14
|
+
*
|
|
15
|
+
* Filters results by the current user's read access.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* // Client usage
|
|
20
|
+
* const config = await client.routes.getAdminConfig({});
|
|
21
|
+
* // { dashboard: {...}, sidebar: {...}, collections: {...}, globals: {...} }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Check if the current user has read access to a collection or global.
|
|
26
|
+
* Returns true if accessible, false if denied.
|
|
27
|
+
*
|
|
28
|
+
* Falls back to app `defaultAccess.read` when no explicit read rule is defined.
|
|
29
|
+
* If neither exists, requires session (secure by default).
|
|
30
|
+
*
|
|
31
|
+
* Fail-open on errors: returns true to avoid hiding content due to rule bugs.
|
|
32
|
+
*/
|
|
33
|
+
async function hasReadAccess(readRule, ctx) {
|
|
34
|
+
const effectiveRule = readRule ?? ctx.app?.defaultAccess?.read;
|
|
35
|
+
if (effectiveRule === true) return true;
|
|
36
|
+
if (effectiveRule === false) return false;
|
|
37
|
+
if (effectiveRule === void 0) return !!ctx.session;
|
|
38
|
+
try {
|
|
39
|
+
return await executeAccessRule(effectiveRule, {
|
|
40
|
+
app: ctx.app,
|
|
41
|
+
db: ctx.db,
|
|
42
|
+
session: ctx.session,
|
|
43
|
+
locale: ctx.locale
|
|
44
|
+
}) !== false;
|
|
45
|
+
} catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Extract workflow metadata from a collection/global state.
|
|
51
|
+
*/
|
|
52
|
+
function extractWorkflowMeta(state) {
|
|
53
|
+
const versioning = state?.options?.versioning;
|
|
54
|
+
const workflow = versioning && typeof versioning === "object" ? versioning.workflow : void 0;
|
|
55
|
+
if (!workflow) return void 0;
|
|
56
|
+
const opts = workflow === true ? {} : workflow;
|
|
57
|
+
const rawStages = opts.stages;
|
|
58
|
+
let stages;
|
|
59
|
+
if (!rawStages) stages = [{ name: "draft" }, { name: "published" }];
|
|
60
|
+
else if (Array.isArray(rawStages)) stages = rawStages.map((name) => ({ name }));
|
|
61
|
+
else stages = Object.entries(rawStages).map(([name, options]) => ({
|
|
62
|
+
name,
|
|
63
|
+
label: options?.label,
|
|
64
|
+
description: options?.description,
|
|
65
|
+
transitions: options?.transitions
|
|
66
|
+
}));
|
|
67
|
+
return {
|
|
68
|
+
enabled: true,
|
|
69
|
+
initialStage: opts.initialStage ?? stages[0]?.name ?? "draft",
|
|
70
|
+
stages
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Extract admin metadata from all registered collections.
|
|
75
|
+
*/
|
|
76
|
+
function extractCollectionsMeta(app) {
|
|
77
|
+
const result = {};
|
|
78
|
+
const collections = app.getCollections();
|
|
79
|
+
for (const [name, collection$1] of Object.entries(collections)) {
|
|
80
|
+
const state = getCollectionState(collection$1);
|
|
81
|
+
const admin = state?.admin;
|
|
82
|
+
const workflow = extractWorkflowMeta(state);
|
|
83
|
+
if (admin) result[name] = {
|
|
84
|
+
label: admin.label,
|
|
85
|
+
description: admin.description,
|
|
86
|
+
icon: admin.icon,
|
|
87
|
+
hidden: admin.hidden,
|
|
88
|
+
group: admin.group,
|
|
89
|
+
order: admin.order,
|
|
90
|
+
...workflow ? { workflow } : {}
|
|
91
|
+
};
|
|
92
|
+
else result[name] = workflow ? { workflow } : {};
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Extract admin metadata from all registered globals.
|
|
98
|
+
*/
|
|
99
|
+
function extractGlobalsMeta(app) {
|
|
100
|
+
const result = {};
|
|
101
|
+
const globals = app.getGlobals();
|
|
102
|
+
for (const [name, global] of Object.entries(globals)) {
|
|
103
|
+
const state = getGlobalState(global);
|
|
104
|
+
const admin = state?.admin;
|
|
105
|
+
const workflow = extractWorkflowMeta(state);
|
|
106
|
+
if (admin) result[name] = {
|
|
107
|
+
label: admin.label,
|
|
108
|
+
description: admin.description,
|
|
109
|
+
icon: admin.icon,
|
|
110
|
+
hidden: admin.hidden,
|
|
111
|
+
group: admin.group,
|
|
112
|
+
order: admin.order,
|
|
113
|
+
...workflow ? { workflow } : {}
|
|
114
|
+
};
|
|
115
|
+
else result[name] = workflow ? { workflow } : {};
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Auto-generate a sidebar config from pre-filtered collection and global metadata.
|
|
121
|
+
* Used when no explicit `.sidebar()` is configured.
|
|
122
|
+
*/
|
|
123
|
+
function buildAutoSidebar(collectionsMeta, globalsMeta) {
|
|
124
|
+
const ungrouped = [];
|
|
125
|
+
const grouped = {};
|
|
126
|
+
for (const [name, meta] of Object.entries(collectionsMeta)) {
|
|
127
|
+
if (meta.hidden) continue;
|
|
128
|
+
if (meta.group) {
|
|
129
|
+
if (!grouped[meta.group]) grouped[meta.group] = [];
|
|
130
|
+
grouped[meta.group].push({
|
|
131
|
+
name,
|
|
132
|
+
meta
|
|
133
|
+
});
|
|
134
|
+
} else ungrouped.push({
|
|
135
|
+
name,
|
|
136
|
+
meta
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
const sortByOrder = (a, b) => (a.meta.order ?? 0) - (b.meta.order ?? 0);
|
|
140
|
+
ungrouped.sort(sortByOrder);
|
|
141
|
+
for (const items of Object.values(grouped)) items.sort(sortByOrder);
|
|
142
|
+
const sections = [];
|
|
143
|
+
if (ungrouped.length > 0) sections.push({
|
|
144
|
+
id: "content",
|
|
145
|
+
title: { en: "Content" },
|
|
146
|
+
items: ungrouped.map(({ name, meta }) => ({
|
|
147
|
+
type: "collection",
|
|
148
|
+
collection: name,
|
|
149
|
+
label: meta.label,
|
|
150
|
+
icon: meta.icon
|
|
151
|
+
}))
|
|
152
|
+
});
|
|
153
|
+
const sortedGroupNames = Object.keys(grouped).sort();
|
|
154
|
+
for (const groupName of sortedGroupNames) {
|
|
155
|
+
const items = grouped[groupName];
|
|
156
|
+
sections.push({
|
|
157
|
+
id: `group:${groupName}`,
|
|
158
|
+
title: { en: groupName.charAt(0).toUpperCase() + groupName.slice(1) },
|
|
159
|
+
items: items.map(({ name, meta }) => ({
|
|
160
|
+
type: "collection",
|
|
161
|
+
collection: name,
|
|
162
|
+
label: meta.label,
|
|
163
|
+
icon: meta.icon
|
|
164
|
+
}))
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
const visibleGlobals = Object.entries(globalsMeta).filter(([, meta]) => !meta.hidden);
|
|
168
|
+
if (visibleGlobals.length > 0) {
|
|
169
|
+
visibleGlobals.sort(([, a], [, b]) => (a.order ?? 0) - (b.order ?? 0));
|
|
170
|
+
sections.push({
|
|
171
|
+
id: "globals",
|
|
172
|
+
title: { en: "Globals" },
|
|
173
|
+
items: visibleGlobals.map(([name, meta]) => ({
|
|
174
|
+
type: "global",
|
|
175
|
+
global: name,
|
|
176
|
+
label: meta.label,
|
|
177
|
+
icon: meta.icon
|
|
178
|
+
}))
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return { sections };
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Filter an explicit sidebar config by accessible collections and globals.
|
|
185
|
+
* Removes items referencing inaccessible collections/globals.
|
|
186
|
+
* Removes empty sections after filtering.
|
|
187
|
+
*/
|
|
188
|
+
function filterSidebarConfig(config, accessibleCollections, accessibleGlobals) {
|
|
189
|
+
return { sections: config.sections.map((s) => ({
|
|
190
|
+
...s,
|
|
191
|
+
items: (s.items ?? []).filter((item) => {
|
|
192
|
+
const rec = item;
|
|
193
|
+
if (item.type === "collection") return accessibleCollections.has(rec.collection);
|
|
194
|
+
if (item.type === "global") return accessibleGlobals.has(rec.global);
|
|
195
|
+
return true;
|
|
196
|
+
})
|
|
197
|
+
})).filter((s) => (s.items?.length ?? 0) > 0 || (s.sections?.length ?? 0) > 0) };
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Collect all collection and global names referenced in a sidebar config.
|
|
201
|
+
*/
|
|
202
|
+
function collectSidebarReferences(config) {
|
|
203
|
+
const collections = /* @__PURE__ */ new Set();
|
|
204
|
+
const globals = /* @__PURE__ */ new Set();
|
|
205
|
+
function collectFromSection(section) {
|
|
206
|
+
for (const item of section.items ?? []) {
|
|
207
|
+
const rec = item;
|
|
208
|
+
if (item.type === "collection") collections.add(rec.collection);
|
|
209
|
+
else if (item.type === "global") globals.add(rec.global);
|
|
210
|
+
}
|
|
211
|
+
for (const subSection of section.sections ?? []) collectFromSection(subSection);
|
|
212
|
+
}
|
|
213
|
+
for (const section of config.sections) collectFromSection(section);
|
|
214
|
+
return {
|
|
215
|
+
collections,
|
|
216
|
+
globals
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Normalize sidebar/dashboard state from instance.state.
|
|
221
|
+
* The state can be:
|
|
222
|
+
* - An array of SidebarContribution[] (new composable pattern)
|
|
223
|
+
* - A single SidebarContribution or SidebarCallback (legacy or config-level)
|
|
224
|
+
* - A ServerSidebarConfig (old builder pattern from .sidebar() method)
|
|
225
|
+
*
|
|
226
|
+
* Returns a normalized array of contributions.
|
|
227
|
+
*/
|
|
228
|
+
function normalizeSidebarContributions(raw) {
|
|
229
|
+
if (!raw) return [];
|
|
230
|
+
if (Array.isArray(raw)) {
|
|
231
|
+
const result = [];
|
|
232
|
+
for (const item of raw) {
|
|
233
|
+
const resolved$1 = resolveSidebarCallback(item);
|
|
234
|
+
if (resolved$1) result.push(resolved$1);
|
|
235
|
+
}
|
|
236
|
+
return result;
|
|
237
|
+
}
|
|
238
|
+
const resolved = resolveSidebarCallback(raw);
|
|
239
|
+
return resolved ? [resolved] : [];
|
|
240
|
+
}
|
|
241
|
+
function normalizeDashboardContributions(raw) {
|
|
242
|
+
if (!raw) return [];
|
|
243
|
+
if (Array.isArray(raw)) {
|
|
244
|
+
const result = [];
|
|
245
|
+
for (const item of raw) {
|
|
246
|
+
const resolved$1 = resolveDashboardCallback(item);
|
|
247
|
+
if (resolved$1) result.push(resolved$1);
|
|
248
|
+
}
|
|
249
|
+
return result;
|
|
250
|
+
}
|
|
251
|
+
const resolved = resolveDashboardCallback(raw);
|
|
252
|
+
return resolved ? [resolved] : [];
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Merge SidebarContribution[] into a ServerSidebarConfig.
|
|
256
|
+
*
|
|
257
|
+
* Rules (§5.8.3):
|
|
258
|
+
* - Sections: deduplicated by id. Later contribution wins for title/icon/collapsible.
|
|
259
|
+
* - Items: grouped by sectionId. Appended in module resolution order.
|
|
260
|
+
* Items with `position: "start"` are prepended to the section.
|
|
261
|
+
* - Sections appear in the order they were first defined.
|
|
262
|
+
*/
|
|
263
|
+
function mergeSidebarContributions(contributions) {
|
|
264
|
+
const sectionOrder = [];
|
|
265
|
+
const sectionDefs = /* @__PURE__ */ new Map();
|
|
266
|
+
const sectionItems = /* @__PURE__ */ new Map();
|
|
267
|
+
for (const contrib of contributions) {
|
|
268
|
+
if (contrib.sections) for (const sec of contrib.sections) {
|
|
269
|
+
const existingIdx = sectionOrder.indexOf(sec.id);
|
|
270
|
+
if (existingIdx !== -1) sectionOrder.splice(existingIdx, 1);
|
|
271
|
+
sectionOrder.push(sec.id);
|
|
272
|
+
sectionDefs.set(sec.id, {
|
|
273
|
+
title: sec.title ?? sectionDefs.get(sec.id)?.title,
|
|
274
|
+
icon: sec.icon ?? sectionDefs.get(sec.id)?.icon,
|
|
275
|
+
collapsible: sec.collapsible ?? sectionDefs.get(sec.id)?.collapsible
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
if (contrib.items) for (const item of contrib.items) {
|
|
279
|
+
const sid = item.sectionId;
|
|
280
|
+
if (!sectionItems.has(sid)) sectionItems.set(sid, []);
|
|
281
|
+
const items = sectionItems.get(sid) ?? [];
|
|
282
|
+
if (item.position === "start") items.unshift(item);
|
|
283
|
+
else items.push(item);
|
|
284
|
+
sectionItems.set(sid, items);
|
|
285
|
+
if (!sectionDefs.has(sid)) {
|
|
286
|
+
sectionOrder.push(sid);
|
|
287
|
+
sectionDefs.set(sid, {});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
const sections = [];
|
|
292
|
+
for (const sectionId of sectionOrder) {
|
|
293
|
+
const def = sectionDefs.get(sectionId);
|
|
294
|
+
const items = sectionItems.get(sectionId) ?? [];
|
|
295
|
+
sections.push({
|
|
296
|
+
id: sectionId,
|
|
297
|
+
title: def?.title,
|
|
298
|
+
icon: def?.icon,
|
|
299
|
+
collapsible: def?.collapsible,
|
|
300
|
+
items: items.map(({ sectionId: _sid, position: _pos, ...rest }) => rest)
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
return { sections };
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Merge DashboardContribution[] into a ServerDashboardConfig.
|
|
307
|
+
*
|
|
308
|
+
* Rules (§5.8.3):
|
|
309
|
+
* - Metadata (title, description, columns, realtime): last non-undefined wins.
|
|
310
|
+
* - Actions: concatenated from all contributions.
|
|
311
|
+
* - Sections: deduplicated by id. Later wins for label/layout/columns.
|
|
312
|
+
* - Items: grouped by sectionId. Appended in module resolution order.
|
|
313
|
+
* Items with `position: "start"` are prepended.
|
|
314
|
+
*/
|
|
315
|
+
function mergeDashboardContributions(contributions) {
|
|
316
|
+
let title;
|
|
317
|
+
let description;
|
|
318
|
+
let columns;
|
|
319
|
+
let realtime;
|
|
320
|
+
const allActions = [];
|
|
321
|
+
const sectionOrder = [];
|
|
322
|
+
const sectionDefs = /* @__PURE__ */ new Map();
|
|
323
|
+
const sectionItems = /* @__PURE__ */ new Map();
|
|
324
|
+
for (const contrib of contributions) {
|
|
325
|
+
if (contrib.title !== void 0) title = contrib.title;
|
|
326
|
+
if (contrib.description !== void 0) description = contrib.description;
|
|
327
|
+
if (contrib.columns !== void 0) columns = contrib.columns;
|
|
328
|
+
if (contrib.realtime !== void 0) realtime = contrib.realtime;
|
|
329
|
+
if (contrib.actions) allActions.push(...contrib.actions);
|
|
330
|
+
if (contrib.sections) for (const sec of contrib.sections) {
|
|
331
|
+
const existingIdx = sectionOrder.indexOf(sec.id);
|
|
332
|
+
if (existingIdx !== -1) sectionOrder.splice(existingIdx, 1);
|
|
333
|
+
sectionOrder.push(sec.id);
|
|
334
|
+
sectionDefs.set(sec.id, {
|
|
335
|
+
label: sec.label ?? sectionDefs.get(sec.id)?.label,
|
|
336
|
+
layout: sec.layout ?? sectionDefs.get(sec.id)?.layout,
|
|
337
|
+
columns: sec.columns ?? sectionDefs.get(sec.id)?.columns
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
if (contrib.items) for (const item of contrib.items) {
|
|
341
|
+
const sid = item.sectionId;
|
|
342
|
+
if (!sectionItems.has(sid)) sectionItems.set(sid, []);
|
|
343
|
+
const items = sectionItems.get(sid) ?? [];
|
|
344
|
+
if (item.position === "start") items.unshift(item);
|
|
345
|
+
else items.push(item);
|
|
346
|
+
sectionItems.set(sid, items);
|
|
347
|
+
if (!sectionDefs.has(sid)) {
|
|
348
|
+
sectionOrder.push(sid);
|
|
349
|
+
sectionDefs.set(sid, {});
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
const dashboardItems = [];
|
|
354
|
+
for (const sectionId of sectionOrder) {
|
|
355
|
+
const def = sectionDefs.get(sectionId);
|
|
356
|
+
const items = sectionItems.get(sectionId) ?? [];
|
|
357
|
+
if (items.length > 0 || def?.label) dashboardItems.push({
|
|
358
|
+
type: "section",
|
|
359
|
+
label: def?.label,
|
|
360
|
+
layout: def?.layout ?? "grid",
|
|
361
|
+
columns: def?.columns,
|
|
362
|
+
items: items.map(({ sectionId: _sid, position: _pos, ...rest }) => rest)
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
return {
|
|
366
|
+
title,
|
|
367
|
+
description,
|
|
368
|
+
columns,
|
|
369
|
+
realtime,
|
|
370
|
+
actions: allActions.length > 0 ? allActions : void 0,
|
|
371
|
+
items: dashboardItems.length > 0 ? dashboardItems : void 0
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Check whether a state value looks like legacy ServerSidebarConfig
|
|
376
|
+
* (has .sections array directly) vs contribution-based (array of contributions).
|
|
377
|
+
*/
|
|
378
|
+
function isLegacySidebarConfig(value) {
|
|
379
|
+
if (value == null || typeof value !== "object" || Array.isArray(value)) return false;
|
|
380
|
+
const obj = value;
|
|
381
|
+
if (Array.isArray(obj.sections) && Array.isArray(obj.items)) return false;
|
|
382
|
+
return Array.isArray(obj.sections);
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Check whether a state value looks like legacy ServerDashboardConfig
|
|
386
|
+
* (has .items or .title directly) vs contribution-based.
|
|
387
|
+
*/
|
|
388
|
+
function isLegacyDashboardConfig(value) {
|
|
389
|
+
if (value == null || typeof value !== "object" || Array.isArray(value)) return false;
|
|
390
|
+
const obj = value;
|
|
391
|
+
if (Array.isArray(obj.sections) && Array.isArray(obj.items)) return false;
|
|
392
|
+
return "items" in obj || "title" in obj;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Auto-assign IDs to widgets that don't have one.
|
|
396
|
+
* Needed for fetchWidgetData lookup by widget ID.
|
|
397
|
+
*/
|
|
398
|
+
function assignWidgetIds(items) {
|
|
399
|
+
let counter = 0;
|
|
400
|
+
function walk(items$1) {
|
|
401
|
+
for (const item of items$1) {
|
|
402
|
+
const rec = item;
|
|
403
|
+
if (item.type === "section") walk(rec.items || []);
|
|
404
|
+
else if (item.type === "tabs") for (const tab of rec.tabs || []) walk(tab.items || []);
|
|
405
|
+
else if (!rec.id) rec.id = `__auto_${item.type}_${counter++}`;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
walk(items);
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Process dashboard items: evaluate access, strip non-serializable props,
|
|
412
|
+
* mark hasLoader, and filter by collection access.
|
|
413
|
+
*/
|
|
414
|
+
async function processDashboardItems(items, accessibleCollections, accessCtx) {
|
|
415
|
+
const result = [];
|
|
416
|
+
for (const item of items) {
|
|
417
|
+
const rec = item;
|
|
418
|
+
if (item.type === "section") {
|
|
419
|
+
const filtered = await processDashboardItems(rec.items || [], accessibleCollections, accessCtx);
|
|
420
|
+
if (filtered.length > 0) result.push({
|
|
421
|
+
...item,
|
|
422
|
+
items: filtered
|
|
423
|
+
});
|
|
424
|
+
continue;
|
|
425
|
+
}
|
|
426
|
+
if (item.type === "tabs") {
|
|
427
|
+
const rawTabs = rec.tabs || [];
|
|
428
|
+
const tabs = await Promise.all(rawTabs.map(async (tab) => {
|
|
429
|
+
const filtered = await processDashboardItems(tab.items || [], accessibleCollections, accessCtx);
|
|
430
|
+
return {
|
|
431
|
+
...tab,
|
|
432
|
+
items: filtered
|
|
433
|
+
};
|
|
434
|
+
}));
|
|
435
|
+
result.push({
|
|
436
|
+
...item,
|
|
437
|
+
tabs
|
|
438
|
+
});
|
|
439
|
+
continue;
|
|
440
|
+
}
|
|
441
|
+
const widget = rec;
|
|
442
|
+
if (widget.access !== void 0) {
|
|
443
|
+
if ((typeof widget.access === "function" ? await widget.access({
|
|
444
|
+
app: accessCtx.app,
|
|
445
|
+
db: accessCtx.db,
|
|
446
|
+
session: accessCtx.session,
|
|
447
|
+
locale: accessCtx.locale
|
|
448
|
+
}) : widget.access) === false) continue;
|
|
449
|
+
}
|
|
450
|
+
if (widget.collection && !accessibleCollections.has(widget.collection)) continue;
|
|
451
|
+
if (widget.type === "quickActions") {
|
|
452
|
+
const actions = (widget.actions || []).filter((action) => {
|
|
453
|
+
if (action.action?.type === "create") return accessibleCollections.has(action.action.collection);
|
|
454
|
+
return true;
|
|
455
|
+
});
|
|
456
|
+
const { loader: loader$1, access: access$1, ...serializable$1 } = widget;
|
|
457
|
+
result.push({
|
|
458
|
+
...serializable$1,
|
|
459
|
+
actions
|
|
460
|
+
});
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
const { loader, access, filterFn, ...serializable } = widget;
|
|
464
|
+
if (loader) serializable.hasLoader = true;
|
|
465
|
+
if (serializable.label && !serializable.title) serializable.title = serializable.label;
|
|
466
|
+
result.push(serializable);
|
|
467
|
+
}
|
|
468
|
+
return result;
|
|
469
|
+
}
|
|
470
|
+
const getAdminConfigSchema = z.object({}).optional();
|
|
471
|
+
const getAdminConfigOutputSchema = adminConfigDTOSchema;
|
|
472
|
+
/**
|
|
473
|
+
* Get admin configuration including dashboard, sidebar, blocks,
|
|
474
|
+
* and collection/global metadata.
|
|
475
|
+
*
|
|
476
|
+
* Filters all results by the current user's read access rules.
|
|
477
|
+
*
|
|
478
|
+
* @example
|
|
479
|
+
* ```ts
|
|
480
|
+
* // In your app
|
|
481
|
+
* const app = runtimeConfig({
|
|
482
|
+
* modules: [adminModule],
|
|
483
|
+
* dashboard: ({ d }) => d.dashboard({
|
|
484
|
+
* title: { en: "Dashboard" },
|
|
485
|
+
* items: [...],
|
|
486
|
+
* }))
|
|
487
|
+
* .sidebar(({ s }) => s.sidebar({
|
|
488
|
+
* sections: [...],
|
|
489
|
+
* }))
|
|
490
|
+
* .build({ ... });
|
|
491
|
+
*
|
|
492
|
+
* // Client fetches config
|
|
493
|
+
* const config = await client.routes.getAdminConfig({});
|
|
494
|
+
* ```
|
|
495
|
+
*/
|
|
496
|
+
const getAdminConfig = route().post().schema(getAdminConfigSchema).outputSchema(getAdminConfigOutputSchema).handler(async (ctx) => {
|
|
497
|
+
const app = getApp(ctx);
|
|
498
|
+
const appState = getAppState(app);
|
|
499
|
+
const adminCfg = getAdminConfig$1(app);
|
|
500
|
+
const accessCtx = getAccessContext(ctx);
|
|
501
|
+
const collections = app.getCollections();
|
|
502
|
+
const globals = app.getGlobals();
|
|
503
|
+
const [accessibleCollections, accessibleGlobals] = await Promise.all([Promise.all(Object.entries(collections).map(async ([name, col]) => await hasReadAccess(getCollectionState(col).access?.read, accessCtx) ? name : null)).then((names) => new Set(names.filter(Boolean))), Promise.all(Object.entries(globals).map(async ([name, g]) => await hasReadAccess(getGlobalState(g).access?.read, accessCtx) ? name : null)).then((names) => new Set(names.filter(Boolean)))]);
|
|
504
|
+
const allCollectionsMeta = extractCollectionsMeta(app);
|
|
505
|
+
const allGlobalsMeta = extractGlobalsMeta(app);
|
|
506
|
+
const filteredCollectionsMeta = Object.fromEntries(Object.entries(allCollectionsMeta).filter(([n]) => accessibleCollections.has(n)));
|
|
507
|
+
const filteredGlobalsMeta = Object.fromEntries(Object.entries(allGlobalsMeta).filter(([n]) => accessibleGlobals.has(n)));
|
|
508
|
+
const response = {};
|
|
509
|
+
const uploadCollections = Object.entries(collections).filter(([name, collection$1]) => accessibleCollections.has(name) && Boolean(getCollectionState(collection$1).upload)).map(([name]) => name);
|
|
510
|
+
response.uploads = {
|
|
511
|
+
collections: uploadCollections,
|
|
512
|
+
defaultCollection: uploadCollections.length === 1 ? uploadCollections[0] : void 0
|
|
513
|
+
};
|
|
514
|
+
if (adminCfg.branding) response.branding = adminCfg.branding;
|
|
515
|
+
if (adminCfg.dashboard) {
|
|
516
|
+
let dashboard;
|
|
517
|
+
if (isLegacyDashboardConfig(adminCfg.dashboard)) dashboard = adminCfg.dashboard;
|
|
518
|
+
else dashboard = mergeDashboardContributions(normalizeDashboardContributions(adminCfg.dashboard));
|
|
519
|
+
if (dashboard.items) assignWidgetIds(dashboard.items);
|
|
520
|
+
response.dashboard = {
|
|
521
|
+
...dashboard,
|
|
522
|
+
items: dashboard.items ? await processDashboardItems(dashboard.items, accessibleCollections, accessCtx) : void 0
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
if (adminCfg.sidebar) {
|
|
526
|
+
let sidebarConfig;
|
|
527
|
+
if (isLegacySidebarConfig(adminCfg.sidebar)) sidebarConfig = adminCfg.sidebar;
|
|
528
|
+
else sidebarConfig = mergeSidebarContributions(normalizeSidebarContributions(adminCfg.sidebar));
|
|
529
|
+
const filteredSidebar = filterSidebarConfig(sidebarConfig, accessibleCollections, accessibleGlobals);
|
|
530
|
+
const referenced = collectSidebarReferences(sidebarConfig);
|
|
531
|
+
const unlistedSidebar = buildAutoSidebar(Object.fromEntries(Object.entries(filteredCollectionsMeta).filter(([name, meta]) => !referenced.collections.has(name) && !meta.hidden)), Object.fromEntries(Object.entries(filteredGlobalsMeta).filter(([name, meta]) => !referenced.globals.has(name) && !meta.hidden)));
|
|
532
|
+
const mergedSections = [...filteredSidebar.sections];
|
|
533
|
+
for (const unlistedSection of unlistedSidebar.sections) {
|
|
534
|
+
const existing = mergedSections.find((s) => s.id === unlistedSection.id);
|
|
535
|
+
if (existing) existing.items = [...existing.items ?? [], ...unlistedSection.items ?? []];
|
|
536
|
+
else mergedSections.push(unlistedSection);
|
|
537
|
+
}
|
|
538
|
+
response.sidebar = { sections: mergedSections };
|
|
539
|
+
} else response.sidebar = buildAutoSidebar(filteredCollectionsMeta, filteredGlobalsMeta);
|
|
540
|
+
if (appState.blocks && Object.keys(appState.blocks).length > 0) response.blocks = introspectBlocks(appState.blocks);
|
|
541
|
+
response.collections = filteredCollectionsMeta;
|
|
542
|
+
response.globals = filteredGlobalsMeta;
|
|
543
|
+
return response;
|
|
544
|
+
});
|
|
545
|
+
/**
|
|
546
|
+
* Admin config route handlers.
|
|
547
|
+
* Registered via module routes and exposed through the fetch handler.
|
|
548
|
+
*/
|
|
549
|
+
const adminConfigFunctions = { getAdminConfig };
|
|
550
|
+
|
|
551
|
+
//#endregion
|
|
552
|
+
export { adminConfigFunctions };
|