@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,76 @@
|
|
|
1
|
+
//#region src/server/modules/admin/routes/route-helpers.ts
|
|
2
|
+
/**
|
|
3
|
+
* Get typed Questpie app instance from route handler context.
|
|
4
|
+
*/
|
|
5
|
+
function getApp(ctx) {
|
|
6
|
+
return ctx.app;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Get session from route handler context.
|
|
10
|
+
* Returns undefined if no session exists.
|
|
11
|
+
*/
|
|
12
|
+
function getSession(ctx) {
|
|
13
|
+
return ctx.session;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get database instance from route handler context.
|
|
17
|
+
*/
|
|
18
|
+
function getDb(ctx) {
|
|
19
|
+
return ctx.db;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get current locale from route handler context.
|
|
23
|
+
*/
|
|
24
|
+
function getLocale(ctx) {
|
|
25
|
+
return ctx.locale;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get the full access context needed by hasReadAccess and similar functions.
|
|
29
|
+
*/
|
|
30
|
+
function getAccessContext(ctx) {
|
|
31
|
+
return {
|
|
32
|
+
app: getApp(ctx),
|
|
33
|
+
session: getSession(ctx),
|
|
34
|
+
db: getDb(ctx),
|
|
35
|
+
locale: getLocale(ctx)
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get typed collection state.
|
|
40
|
+
*/
|
|
41
|
+
function getCollectionState(collection) {
|
|
42
|
+
return collection.state;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get typed global state.
|
|
46
|
+
*/
|
|
47
|
+
function getGlobalState(global) {
|
|
48
|
+
return global.state;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get typed app state from app instance.
|
|
52
|
+
*/
|
|
53
|
+
function getAppState(app) {
|
|
54
|
+
return app.state || {};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get admin config from app state.
|
|
58
|
+
*/
|
|
59
|
+
function getAdminConfig(app) {
|
|
60
|
+
return getAppState(app).config?.admin || {};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Build a ReactiveServerContext from route handler context.
|
|
64
|
+
*/
|
|
65
|
+
function buildServerContext(ctx) {
|
|
66
|
+
const session = getSession(ctx);
|
|
67
|
+
return {
|
|
68
|
+
db: getDb(ctx),
|
|
69
|
+
user: session?.user ?? null,
|
|
70
|
+
req: new Request("http://localhost"),
|
|
71
|
+
locale: getLocale(ctx) ?? "en"
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
//#endregion
|
|
76
|
+
export { buildServerContext, getAccessContext, getAdminConfig, getApp, getAppState, getCollectionState, getGlobalState, getSession };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as questpie114 from "questpie";
|
|
2
|
+
|
|
3
|
+
//#region src/server/modules/admin/routes/setup.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Setup Functions
|
|
7
|
+
*
|
|
8
|
+
* Built-in functions for bootstrapping the first admin user.
|
|
9
|
+
* Solves the chicken-and-egg problem where invitation-based systems
|
|
10
|
+
* need an existing admin to create the first invitation.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Check if setup is required (no users exist in the system).
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const result = await client.routes.isSetupRequired({});
|
|
18
|
+
* if (result.required) {
|
|
19
|
+
* // Redirect to setup page
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
declare const isSetupRequired: questpie114.JsonRouteDefinition<Record<string, never>, any>;
|
|
24
|
+
/**
|
|
25
|
+
* Create the first admin user in the system.
|
|
26
|
+
* This function only works when no users exist (setup mode).
|
|
27
|
+
*
|
|
28
|
+
* Security: Once any user exists, this function will refuse to create more users.
|
|
29
|
+
* This prevents unauthorized admin creation after initial setup.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const result = await client.routes.createFirstAdmin({
|
|
34
|
+
* email: "admin@example.com",
|
|
35
|
+
* password: "securepassword123",
|
|
36
|
+
* name: "Admin User",
|
|
37
|
+
* });
|
|
38
|
+
*
|
|
39
|
+
* if (result.success) {
|
|
40
|
+
* // Redirect to login page
|
|
41
|
+
* } else {
|
|
42
|
+
* console.error(result.error);
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
declare const createFirstAdmin: questpie114.JsonRouteDefinition<{
|
|
47
|
+
email: string;
|
|
48
|
+
password: string;
|
|
49
|
+
name: string;
|
|
50
|
+
}, any>;
|
|
51
|
+
/**
|
|
52
|
+
* Bundle of setup-related functions.
|
|
53
|
+
*/
|
|
54
|
+
declare const setupFunctions: {
|
|
55
|
+
readonly isSetupRequired: questpie114.JsonRouteDefinition<Record<string, never>, any>;
|
|
56
|
+
readonly createFirstAdmin: questpie114.JsonRouteDefinition<{
|
|
57
|
+
email: string;
|
|
58
|
+
password: string;
|
|
59
|
+
name: string;
|
|
60
|
+
}, any>;
|
|
61
|
+
};
|
|
62
|
+
//#endregion
|
|
63
|
+
export { createFirstAdmin, isSetupRequired, setupFunctions };
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { getApp } from "./route-helpers.mjs";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { route } from "questpie";
|
|
4
|
+
import { eq, sql as sql$1 } from "drizzle-orm";
|
|
5
|
+
|
|
6
|
+
//#region src/server/modules/admin/routes/setup.ts
|
|
7
|
+
/**
|
|
8
|
+
* Setup Functions
|
|
9
|
+
*
|
|
10
|
+
* Built-in functions for bootstrapping the first admin user.
|
|
11
|
+
* Solves the chicken-and-egg problem where invitation-based systems
|
|
12
|
+
* need an existing admin to create the first invitation.
|
|
13
|
+
*/
|
|
14
|
+
const isSetupRequiredSchema = z.object({});
|
|
15
|
+
const isSetupRequiredOutputSchema = z.object({ required: z.boolean() });
|
|
16
|
+
const createFirstAdminSchema = z.object({
|
|
17
|
+
email: z.string().email("Invalid email address"),
|
|
18
|
+
password: z.string().min(8, "Password must be at least 8 characters"),
|
|
19
|
+
name: z.string().min(2, "Name must be at least 2 characters")
|
|
20
|
+
});
|
|
21
|
+
const createFirstAdminOutputSchema = z.object({
|
|
22
|
+
success: z.boolean(),
|
|
23
|
+
user: z.object({
|
|
24
|
+
id: z.string(),
|
|
25
|
+
email: z.string(),
|
|
26
|
+
name: z.string()
|
|
27
|
+
}).optional(),
|
|
28
|
+
error: z.string().optional()
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* Check if setup is required (no users exist in the system).
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* const result = await client.routes.isSetupRequired({});
|
|
36
|
+
* if (result.required) {
|
|
37
|
+
* // Redirect to setup page
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
const isSetupRequired = route().post().schema(isSetupRequiredSchema).outputSchema(isSetupRequiredOutputSchema).handler(async (ctx) => {
|
|
42
|
+
const app = getApp(ctx);
|
|
43
|
+
const userCollection = app.getCollectionConfig("user");
|
|
44
|
+
return { required: (await app.db.select({ count: sql$1`count(*)::int` }).from(userCollection.table))[0].count === 0 };
|
|
45
|
+
});
|
|
46
|
+
/**
|
|
47
|
+
* Create the first admin user in the system.
|
|
48
|
+
* This function only works when no users exist (setup mode).
|
|
49
|
+
*
|
|
50
|
+
* Security: Once any user exists, this function will refuse to create more users.
|
|
51
|
+
* This prevents unauthorized admin creation after initial setup.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* const result = await client.routes.createFirstAdmin({
|
|
56
|
+
* email: "admin@example.com",
|
|
57
|
+
* password: "securepassword123",
|
|
58
|
+
* name: "Admin User",
|
|
59
|
+
* });
|
|
60
|
+
*
|
|
61
|
+
* if (result.success) {
|
|
62
|
+
* // Redirect to login page
|
|
63
|
+
* } else {
|
|
64
|
+
* console.error(result.error);
|
|
65
|
+
* }
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
const createFirstAdmin = route().post().schema(createFirstAdminSchema).outputSchema(createFirstAdminOutputSchema).handler(async (ctx) => {
|
|
69
|
+
const app = getApp(ctx);
|
|
70
|
+
const input = ctx.input;
|
|
71
|
+
const userCollection = app.getCollectionConfig("user");
|
|
72
|
+
if ((await app.db.select({ count: sql$1`count(*)::int` }).from(userCollection.table))[0].count > 0) return {
|
|
73
|
+
success: false,
|
|
74
|
+
error: "Setup already completed - users exist in the system"
|
|
75
|
+
};
|
|
76
|
+
try {
|
|
77
|
+
const signUpResult = await app.auth.api.signUpEmail({ body: {
|
|
78
|
+
email: input.email,
|
|
79
|
+
password: input.password,
|
|
80
|
+
name: input.name
|
|
81
|
+
} });
|
|
82
|
+
if (!signUpResult.user) return {
|
|
83
|
+
success: false,
|
|
84
|
+
error: "Failed to create user account"
|
|
85
|
+
};
|
|
86
|
+
await app.db.update(userCollection.table).set({
|
|
87
|
+
role: "admin",
|
|
88
|
+
emailVerified: true
|
|
89
|
+
}).where(eq(userCollection.table.id, signUpResult.user.id));
|
|
90
|
+
return {
|
|
91
|
+
success: true,
|
|
92
|
+
user: {
|
|
93
|
+
id: signUpResult.user.id,
|
|
94
|
+
email: signUpResult.user.email,
|
|
95
|
+
name: signUpResult.user.name
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
} catch (error) {
|
|
99
|
+
return {
|
|
100
|
+
success: false,
|
|
101
|
+
error: error instanceof Error ? error.message : "An unexpected error occurred"
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
/**
|
|
106
|
+
* Bundle of setup-related functions.
|
|
107
|
+
*/
|
|
108
|
+
const setupFunctions = {
|
|
109
|
+
isSetupRequired,
|
|
110
|
+
createFirstAdmin
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
//#endregion
|
|
114
|
+
export { createFirstAdmin, isSetupRequired, setupFunctions };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as questpie310 from "questpie";
|
|
2
|
+
|
|
3
|
+
//#region src/server/modules/admin/routes/translations.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Admin Translations Functions
|
|
7
|
+
*
|
|
8
|
+
* Functions for retrieving admin UI translations from the server.
|
|
9
|
+
* The client fetches translations for its current UI locale.
|
|
10
|
+
*
|
|
11
|
+
* This enables:
|
|
12
|
+
* - Single source of truth for all translations on server
|
|
13
|
+
* - Dynamic locale switching without bundling all languages
|
|
14
|
+
* - Custom messages via config translations
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Bundle of translation-related functions.
|
|
18
|
+
*/
|
|
19
|
+
declare const translationFunctions: {
|
|
20
|
+
readonly getAdminTranslations: questpie310.JsonRouteDefinition<{
|
|
21
|
+
locale: string;
|
|
22
|
+
}, any>;
|
|
23
|
+
readonly getAdminLocales: questpie310.JsonRouteDefinition<Record<string, never> | undefined, any>;
|
|
24
|
+
};
|
|
25
|
+
//#endregion
|
|
26
|
+
export { translationFunctions };
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { getAdminMessagesForLocale, getSupportedAdminLocales } from "../../../i18n/index.mjs";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { route } from "questpie";
|
|
4
|
+
|
|
5
|
+
//#region src/server/modules/admin/routes/translations.ts
|
|
6
|
+
/**
|
|
7
|
+
* Admin Translations Functions
|
|
8
|
+
*
|
|
9
|
+
* Functions for retrieving admin UI translations from the server.
|
|
10
|
+
* The client fetches translations for its current UI locale.
|
|
11
|
+
*
|
|
12
|
+
* This enables:
|
|
13
|
+
* - Single source of truth for all translations on server
|
|
14
|
+
* - Dynamic locale switching without bundling all languages
|
|
15
|
+
* - Custom messages via config translations
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Helper to get typed app from handler context.
|
|
19
|
+
*/
|
|
20
|
+
function getApp(ctx) {
|
|
21
|
+
return ctx.app;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get admin locale config from app state.
|
|
25
|
+
*/
|
|
26
|
+
function getAdminLocaleConfig(app) {
|
|
27
|
+
return app.state?.adminLocale;
|
|
28
|
+
}
|
|
29
|
+
const getAdminTranslationsSchema = z.object({ locale: z.string() });
|
|
30
|
+
const messageValueSchema = z.union([z.string(), z.object({
|
|
31
|
+
one: z.string(),
|
|
32
|
+
other: z.string()
|
|
33
|
+
})]);
|
|
34
|
+
const getAdminTranslationsOutputSchema = z.object({
|
|
35
|
+
locale: z.string(),
|
|
36
|
+
messages: z.record(z.string(), messageValueSchema),
|
|
37
|
+
fallbackLocale: z.string()
|
|
38
|
+
});
|
|
39
|
+
const getAdminLocalesSchema = z.object({}).optional();
|
|
40
|
+
const getAdminLocalesOutputSchema = z.object({
|
|
41
|
+
locales: z.array(z.string()),
|
|
42
|
+
defaultLocale: z.string()
|
|
43
|
+
});
|
|
44
|
+
/**
|
|
45
|
+
* Get admin UI translations for a specific locale.
|
|
46
|
+
*
|
|
47
|
+
* Merges:
|
|
48
|
+
* 1. Built-in admin messages for the locale
|
|
49
|
+
* 2. Custom messages from config translations
|
|
50
|
+
*
|
|
51
|
+
* Custom messages override built-in messages with the same key.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* // Client fetches translations
|
|
56
|
+
* const { messages, locale, fallbackLocale } = await client.routes.getAdminTranslations({
|
|
57
|
+
* locale: "sk",
|
|
58
|
+
* });
|
|
59
|
+
*
|
|
60
|
+
* // messages contains all admin UI strings in Slovak
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
const getAdminTranslations = route().post().schema(getAdminTranslationsSchema).outputSchema(getAdminTranslationsOutputSchema).handler(async (ctx) => {
|
|
64
|
+
const app = getApp(ctx);
|
|
65
|
+
const requestedLocale = ctx.input.locale;
|
|
66
|
+
const adminLocaleConfig = getAdminLocaleConfig(app);
|
|
67
|
+
const supportedLocales = adminLocaleConfig?.locales ?? getSupportedAdminLocales();
|
|
68
|
+
const defaultLocale = adminLocaleConfig?.defaultLocale ?? "en";
|
|
69
|
+
const locale = supportedLocales.includes(requestedLocale) ? requestedLocale : defaultLocale;
|
|
70
|
+
const builtInMessages = getAdminMessagesForLocale(locale);
|
|
71
|
+
const fallbackMessages = locale !== defaultLocale ? getAdminMessagesForLocale(defaultLocale) : {};
|
|
72
|
+
const customFallbackMessages = locale !== defaultLocale ? app.config.translations?.messages?.[defaultLocale] ?? {} : {};
|
|
73
|
+
const customMessages = app.config.translations?.messages?.[locale] ?? {};
|
|
74
|
+
return {
|
|
75
|
+
locale,
|
|
76
|
+
messages: {
|
|
77
|
+
...fallbackMessages,
|
|
78
|
+
...customFallbackMessages,
|
|
79
|
+
...builtInMessages,
|
|
80
|
+
...customMessages
|
|
81
|
+
},
|
|
82
|
+
fallbackLocale: defaultLocale
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
/**
|
|
86
|
+
* Get available admin UI locales.
|
|
87
|
+
*
|
|
88
|
+
* Returns locales configured via .adminLocale() or defaults to
|
|
89
|
+
* all locales that have built-in message files.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* const { locales, defaultLocale } = await client.routes.getAdminLocales({});
|
|
94
|
+
* // locales: ["en", "sk"]
|
|
95
|
+
* // defaultLocale: "en"
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
const getAdminLocales = route().post().schema(getAdminLocalesSchema).outputSchema(getAdminLocalesOutputSchema).handler(async (ctx) => {
|
|
99
|
+
const adminLocaleConfig = getAdminLocaleConfig(getApp(ctx));
|
|
100
|
+
return {
|
|
101
|
+
locales: adminLocaleConfig?.locales ?? getSupportedAdminLocales(),
|
|
102
|
+
defaultLocale: adminLocaleConfig?.defaultLocale ?? "en"
|
|
103
|
+
};
|
|
104
|
+
});
|
|
105
|
+
/**
|
|
106
|
+
* Bundle of translation-related functions.
|
|
107
|
+
*/
|
|
108
|
+
const translationFunctions = {
|
|
109
|
+
getAdminTranslations,
|
|
110
|
+
getAdminLocales
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
//#endregion
|
|
114
|
+
export { translationFunctions };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as questpie118 from "questpie";
|
|
2
|
+
|
|
3
|
+
//#region src/server/modules/admin/routes/widget-data.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Widget Data Functions
|
|
7
|
+
*
|
|
8
|
+
* Provides server-side data fetching for widgets that declare a loader.
|
|
9
|
+
* Called by the client when a widget has `hasLoader: true`.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Fetch data for a server-side widget by its ID.
|
|
13
|
+
*
|
|
14
|
+
* Looks up the widget in the dashboard config, evaluates its access rule,
|
|
15
|
+
* and executes its loader with server context.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* // Client usage (via useServerWidgetData hook)
|
|
20
|
+
* const data = await client.routes.fetchWidgetData({ widgetId: "my-widget" });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
declare const fetchWidgetData: questpie118.JsonRouteDefinition<{
|
|
24
|
+
widgetId: string;
|
|
25
|
+
}, any>;
|
|
26
|
+
declare const widgetDataFunctions: {
|
|
27
|
+
readonly fetchWidgetData: questpie118.JsonRouteDefinition<{
|
|
28
|
+
widgetId: string;
|
|
29
|
+
}, any>;
|
|
30
|
+
};
|
|
31
|
+
//#endregion
|
|
32
|
+
export { fetchWidgetData, widgetDataFunctions };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ApiError, route, tryGetContext } from "questpie";
|
|
3
|
+
|
|
4
|
+
//#region src/server/modules/admin/routes/widget-data.ts
|
|
5
|
+
/**
|
|
6
|
+
* Widget Data Functions
|
|
7
|
+
*
|
|
8
|
+
* Provides server-side data fetching for widgets that declare a loader.
|
|
9
|
+
* Called by the client when a widget has `hasLoader: true`.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Find a widget by ID in the dashboard tree (searches raw server config
|
|
13
|
+
* which still has loader attached).
|
|
14
|
+
*/
|
|
15
|
+
function findWidgetById(items, id) {
|
|
16
|
+
for (const item of items) {
|
|
17
|
+
const rec = item;
|
|
18
|
+
if (item.type === "section") {
|
|
19
|
+
const found = findWidgetById(rec.items || [], id);
|
|
20
|
+
if (found) return found;
|
|
21
|
+
} else if (item.type === "tabs") for (const tab of rec.tabs || []) {
|
|
22
|
+
const found = findWidgetById(tab.items || [], id);
|
|
23
|
+
if (found) return found;
|
|
24
|
+
}
|
|
25
|
+
else if (rec.id === id) return rec;
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const fetchWidgetDataSchema = z.object({ widgetId: z.string() });
|
|
30
|
+
/**
|
|
31
|
+
* Fetch data for a server-side widget by its ID.
|
|
32
|
+
*
|
|
33
|
+
* Looks up the widget in the dashboard config, evaluates its access rule,
|
|
34
|
+
* and executes its loader with server context.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* // Client usage (via useServerWidgetData hook)
|
|
39
|
+
* const data = await client.routes.fetchWidgetData({ widgetId: "my-widget" });
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
const fetchWidgetData = route().post().schema(fetchWidgetDataSchema).outputSchema(z.unknown()).handler(async (ctx) => {
|
|
43
|
+
const appState = (tryGetContext()?.app)?.state || {};
|
|
44
|
+
const dashboard = appState.config?.admin?.dashboard ?? appState.dashboard;
|
|
45
|
+
if (!dashboard?.items) throw ApiError.internal("No dashboard configured");
|
|
46
|
+
const widget = findWidgetById(dashboard.items, ctx.input.widgetId);
|
|
47
|
+
if (!widget) throw ApiError.notFound("Widget", ctx.input.widgetId);
|
|
48
|
+
if (!widget.loader) throw ApiError.badRequest(`Widget "${ctx.input.widgetId}" has no loader`);
|
|
49
|
+
const widgetCtx = ctx;
|
|
50
|
+
if (widget.access !== void 0) {
|
|
51
|
+
if ((typeof widget.access === "function" ? await widget.access(widgetCtx) : widget.access) === false) throw ApiError.forbidden({
|
|
52
|
+
operation: "read",
|
|
53
|
+
resource: "widget",
|
|
54
|
+
reason: "Access denied"
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return widget.loader(widgetCtx);
|
|
58
|
+
});
|
|
59
|
+
const widgetDataFunctions = { fetchWidgetData };
|
|
60
|
+
|
|
61
|
+
//#endregion
|
|
62
|
+
export { fetchWidgetData, widgetDataFunctions };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { FormViewConfig } from "../../../augmentation/form-layout.mjs";
|
|
2
|
+
import { ViewDefinition } from "../../../augmentation/views.mjs";
|
|
3
|
+
import "../../../augmentation.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/server/modules/admin/views/form.d.ts
|
|
6
|
+
declare const _default: ViewDefinition<"collection-form", "form", FormViewConfig>;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { _default };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { FormViewConfig } from "../../../augmentation/form-layout.mjs";
|
|
2
|
+
import { ViewDefinition } from "../../../augmentation/views.mjs";
|
|
3
|
+
import "../../../augmentation.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/server/modules/admin/views/global-form.d.ts
|
|
6
|
+
declare const _default: ViewDefinition<"global-form", "form", FormViewConfig>;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { _default };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ListViewConfig } from "../../../augmentation/form-layout.mjs";
|
|
2
|
+
import { ViewDefinition } from "../../../augmentation/views.mjs";
|
|
3
|
+
import "../../../augmentation.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/server/modules/admin/views/table.d.ts
|
|
6
|
+
declare const _default: ViewDefinition<"collection-table", "list", ListViewConfig>;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { _default };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { collection } from "questpie";
|
|
2
|
+
import { uniqueIndex } from "drizzle-orm/pg-core";
|
|
3
|
+
|
|
4
|
+
//#region src/server/modules/admin-preferences/collections/admin-preferences.ts
|
|
5
|
+
/**
|
|
6
|
+
* Admin Preferences Collection
|
|
7
|
+
*
|
|
8
|
+
* Stores user-specific preferences for admin UI state.
|
|
9
|
+
* This includes view configurations (columns, filters, sort)
|
|
10
|
+
* that persist across devices and sessions.
|
|
11
|
+
*
|
|
12
|
+
* Key format: "viewState:{collectionName}" for view state preferences
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { runtimeConfig } from "questpie";
|
|
17
|
+
* import { adminModule } from "@questpie/admin/server";
|
|
18
|
+
*
|
|
19
|
+
* export default runtimeConfig({
|
|
20
|
+
* modules: [adminModule],
|
|
21
|
+
* // ...
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // Access preferences
|
|
25
|
+
* const prefs = await app.collections.admin_preferences.findOne({
|
|
26
|
+
* where: { userId: currentUser.id, key: "viewState:posts" }
|
|
27
|
+
* });
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
const adminPreferencesCollection = collection("admin_preferences").fields(({ f }) => ({
|
|
31
|
+
userId: f.text(255).required().label("User ID"),
|
|
32
|
+
key: f.text(255).required().label("Key"),
|
|
33
|
+
value: f.json().required().label("Value")
|
|
34
|
+
})).options({ timestamps: true }).indexes(({ table }) => [uniqueIndex("admin_preferences_user_key_idx").on(table.userId, table.key)]);
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
export { adminPreferencesCollection };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { collection } from "questpie";
|
|
2
|
+
|
|
3
|
+
//#region src/server/modules/admin-preferences/collections/locks.collection.ts
|
|
4
|
+
/**
|
|
5
|
+
* Admin Locks Collection
|
|
6
|
+
*
|
|
7
|
+
* Stores document locks for collaborative editing awareness.
|
|
8
|
+
* When a user opens a document for editing, a lock is created.
|
|
9
|
+
* Other users see who is editing and the document becomes read-only for them.
|
|
10
|
+
*
|
|
11
|
+
* Lock behavior:
|
|
12
|
+
* - Locks expire after 60 seconds without heartbeat
|
|
13
|
+
* - Client sends heartbeat every 30 seconds to keep lock alive
|
|
14
|
+
* - On browser close/crash, lock expires automatically
|
|
15
|
+
* - Realtime subscription shows locks in table rows
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* // Acquire lock when opening document
|
|
20
|
+
* await app.collections.admin_locks.create({
|
|
21
|
+
* resourceType: "collection",
|
|
22
|
+
* resource: "posts",
|
|
23
|
+
* resourceId: "123",
|
|
24
|
+
* userId: currentUser.id,
|
|
25
|
+
* userName: currentUser.name,
|
|
26
|
+
* expiresAt: new Date(Date.now() + 60000),
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // Heartbeat to keep lock alive
|
|
30
|
+
* await app.collections.admin_locks.update({
|
|
31
|
+
* id: lockId,
|
|
32
|
+
* data: { expiresAt: new Date(Date.now() + 60000) },
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* // Release lock when closing document
|
|
36
|
+
* await app.collections.admin_locks.delete({ id: lockId });
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
const locksCollection = collection("admin_locks").fields(({ f }) => ({
|
|
40
|
+
resourceType: f.select([{
|
|
41
|
+
value: "collection",
|
|
42
|
+
label: "Collection"
|
|
43
|
+
}, {
|
|
44
|
+
value: "global",
|
|
45
|
+
label: "Global"
|
|
46
|
+
}]).required().label("Resource Type"),
|
|
47
|
+
resource: f.text(255).required().label("Resource"),
|
|
48
|
+
resourceId: f.text(255).required().label("Resource ID"),
|
|
49
|
+
user: f.relation("user").required().label("User"),
|
|
50
|
+
sessionId: f.text(64).required().label("Session ID"),
|
|
51
|
+
expiresAt: f.date().required().label("Expires At")
|
|
52
|
+
})).options({ timestamps: true });
|
|
53
|
+
|
|
54
|
+
//#endregion
|
|
55
|
+
export { locksCollection };
|