@questpie/admin 1.1.0 → 2.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 +245 -474
- package/dist/_virtual/rolldown_runtime.mjs +18 -0
- package/dist/augmentation.d.mts +315 -0
- package/dist/augmentation.d.mts.map +1 -0
- package/dist/client/blocks/block-registry.d.mts +199 -0
- package/dist/client/blocks/block-registry.d.mts.map +1 -0
- package/dist/client/blocks/block-registry.mjs +88 -0
- package/dist/client/blocks/block-registry.mjs.map +1 -0
- package/dist/client/blocks/block-renderer.d.mts +52 -0
- package/dist/client/blocks/block-renderer.d.mts.map +1 -0
- package/dist/client/blocks/block-renderer.mjs +71 -0
- package/dist/client/blocks/block-renderer.mjs.map +1 -0
- package/dist/client/blocks/index.d.mts +4 -0
- package/dist/client/blocks/prefetch.d.mts +45 -0
- package/dist/client/blocks/prefetch.d.mts.map +1 -0
- package/dist/client/blocks/prefetch.mjs +26 -0
- package/dist/client/blocks/prefetch.mjs.map +1 -0
- package/dist/client/blocks/types.d.mts +69 -0
- package/dist/client/blocks/types.d.mts.map +1 -0
- package/dist/client/blocks/types.mjs +20 -0
- package/dist/client/blocks/types.mjs.map +1 -0
- package/dist/client/builder/admin-builder.d.mts +112 -0
- package/dist/client/builder/admin-builder.d.mts.map +1 -0
- package/dist/client/builder/admin-builder.mjs +185 -0
- package/dist/client/builder/admin-builder.mjs.map +1 -0
- package/dist/client/builder/admin-types.d.mts +73 -0
- package/dist/client/builder/admin-types.d.mts.map +1 -0
- package/dist/client/builder/admin.d.mts +121 -0
- package/dist/client/builder/admin.d.mts.map +1 -0
- package/dist/client/builder/admin.mjs +160 -0
- package/dist/client/builder/admin.mjs.map +1 -0
- package/dist/client/builder/defaults/components.mjs +20 -0
- package/dist/client/builder/defaults/components.mjs.map +1 -0
- package/dist/client/builder/defaults/core.d.mts +354 -0
- package/dist/client/builder/defaults/core.d.mts.map +1 -0
- package/dist/client/builder/defaults/core.mjs +49 -0
- package/dist/client/builder/defaults/core.mjs.map +1 -0
- package/dist/client/builder/defaults/fields.mjs +328 -0
- package/dist/client/builder/defaults/fields.mjs.map +1 -0
- package/dist/client/builder/defaults/pages.mjs +58 -0
- package/dist/client/builder/defaults/pages.mjs.map +1 -0
- package/dist/client/builder/defaults/starter.d.mts +351 -0
- package/dist/client/builder/defaults/starter.d.mts.map +1 -0
- package/dist/client/builder/defaults/starter.mjs +28 -0
- package/dist/client/builder/defaults/starter.mjs.map +1 -0
- package/dist/client/builder/defaults/views.mjs +27 -0
- package/dist/client/builder/defaults/views.mjs.map +1 -0
- package/dist/client/builder/defaults/widgets.mjs +31 -0
- package/dist/client/builder/defaults/widgets.mjs.map +1 -0
- package/dist/client/builder/field/field.d.mts +229 -0
- package/dist/client/builder/field/field.d.mts.map +1 -0
- package/dist/client/builder/field/field.mjs +83 -0
- package/dist/client/builder/field/field.mjs.map +1 -0
- package/dist/client/builder/index.d.mts +36 -0
- package/dist/client/builder/index.d.mts.map +1 -0
- package/dist/client/builder/page/page.d.mts +36 -0
- package/dist/client/builder/page/page.d.mts.map +1 -0
- package/dist/client/builder/page/page.mjs +27 -0
- package/dist/client/builder/page/page.mjs.map +1 -0
- package/dist/client/builder/proxies.d.mts +2 -0
- package/dist/client/builder/proxies.mjs +24 -0
- package/dist/client/builder/proxies.mjs.map +1 -0
- package/dist/client/builder/qa.d.mts +50 -0
- package/dist/client/builder/qa.d.mts.map +1 -0
- package/dist/client/builder/qa.mjs +42 -0
- package/dist/client/builder/qa.mjs.map +1 -0
- package/dist/client/builder/registry.d.mts +70 -0
- package/dist/client/builder/registry.d.mts.map +1 -0
- package/dist/client/builder/types/action-registry.d.mts +2 -0
- package/dist/client/builder/types/action-registry.mjs +142 -0
- package/dist/client/builder/types/action-registry.mjs.map +1 -0
- package/dist/client/builder/types/action-types.d.mts +253 -0
- package/dist/client/builder/types/action-types.d.mts.map +1 -0
- package/dist/client/builder/types/collection-types.d.mts +199 -0
- package/dist/client/builder/types/collection-types.d.mts.map +1 -0
- package/dist/client/builder/types/collection-types.mjs +11 -0
- package/dist/client/builder/types/collection-types.mjs.map +1 -0
- package/dist/client/builder/types/common.d.mts +60 -0
- package/dist/client/builder/types/common.d.mts.map +1 -0
- package/dist/client/builder/types/field-types.d.mts +593 -0
- package/dist/client/builder/types/field-types.d.mts.map +1 -0
- package/dist/client/builder/types/field-types.mjs +19 -0
- package/dist/client/builder/types/field-types.mjs.map +1 -0
- package/dist/client/builder/types/global-types.d.mts +22 -0
- package/dist/client/builder/types/global-types.d.mts.map +1 -0
- package/dist/client/builder/types/ui-config.d.mts +160 -0
- package/dist/client/builder/types/ui-config.d.mts.map +1 -0
- package/dist/client/builder/types/views.d.mts +89 -0
- package/dist/client/builder/types/views.d.mts.map +1 -0
- package/dist/client/builder/types/widget-types.d.mts +563 -0
- package/dist/client/builder/types/widget-types.d.mts.map +1 -0
- package/dist/client/builder/validation.d.mts +3 -0
- package/dist/client/builder/validation.mjs +208 -0
- package/dist/client/builder/validation.mjs.map +1 -0
- package/dist/client/builder/view/view.d.mts +129 -0
- package/dist/client/builder/view/view.d.mts.map +1 -0
- package/dist/client/builder/view/view.mjs +109 -0
- package/dist/client/builder/view/view.mjs.map +1 -0
- package/dist/client/builder/widget/widget.d.mts +33 -0
- package/dist/client/builder/widget/widget.d.mts.map +1 -0
- package/dist/client/builder/widget/widget.mjs +26 -0
- package/dist/client/builder/widget/widget.mjs.map +1 -0
- package/dist/client/components/actions/action-button.d.mts +2 -0
- package/dist/client/components/actions/action-button.mjs +135 -0
- package/dist/client/components/actions/action-button.mjs.map +1 -0
- package/dist/client/components/actions/action-dialog.d.mts +2 -0
- package/dist/client/components/actions/action-dialog.mjs +264 -0
- package/dist/client/components/actions/action-dialog.mjs.map +1 -0
- package/dist/client/components/actions/confirmation-dialog.d.mts +2 -0
- package/dist/client/components/actions/confirmation-dialog.mjs +82 -0
- package/dist/client/components/actions/confirmation-dialog.mjs.map +1 -0
- package/dist/client/components/actions/header-actions.d.mts +2 -0
- package/dist/client/components/actions/header-actions.mjs +117 -0
- package/dist/client/components/actions/header-actions.mjs.map +1 -0
- package/dist/client/components/actions/index.d.mts +4 -0
- package/dist/client/components/admin-link.d.mts +67 -0
- package/dist/client/components/admin-link.d.mts.map +1 -0
- package/dist/client/components/admin-link.mjs +92 -0
- package/dist/client/components/admin-link.mjs.map +1 -0
- package/dist/client/components/auth/auth-guard.d.mts +51 -0
- package/dist/client/components/auth/auth-guard.d.mts.map +1 -0
- package/dist/client/components/auth/auth-guard.mjs +60 -0
- package/dist/client/components/auth/auth-guard.mjs.map +1 -0
- package/dist/client/components/auth/auth-loading.d.mts +36 -0
- package/dist/client/components/auth/auth-loading.d.mts.map +1 -0
- package/dist/client/components/auth/auth-loading.mjs +27 -0
- package/dist/client/components/auth/auth-loading.mjs.map +1 -0
- package/dist/client/components/auth/index.d.mts +2 -0
- package/dist/client/components/blocks/block-canvas.mjs +90 -0
- package/dist/client/components/blocks/block-canvas.mjs.map +1 -0
- package/dist/client/components/blocks/block-editor-context.mjs +58 -0
- package/dist/client/components/blocks/block-editor-context.mjs.map +1 -0
- package/dist/client/components/blocks/block-editor-layout.mjs +82 -0
- package/dist/client/components/blocks/block-editor-layout.mjs.map +1 -0
- package/dist/client/components/blocks/block-editor-provider.mjs +155 -0
- package/dist/client/components/blocks/block-editor-provider.mjs.map +1 -0
- package/dist/client/components/blocks/block-fields-renderer.mjs +70 -0
- package/dist/client/components/blocks/block-fields-renderer.mjs.map +1 -0
- package/dist/client/components/blocks/block-insert-button.mjs +72 -0
- package/dist/client/components/blocks/block-insert-button.mjs.map +1 -0
- package/dist/client/components/blocks/block-item-menu.mjs +161 -0
- package/dist/client/components/blocks/block-item-menu.mjs.map +1 -0
- package/dist/client/components/blocks/block-item.mjs +187 -0
- package/dist/client/components/blocks/block-item.mjs.map +1 -0
- package/dist/client/components/blocks/block-library-sidebar.mjs +190 -0
- package/dist/client/components/blocks/block-library-sidebar.mjs.map +1 -0
- package/dist/client/components/blocks/block-tree.mjs +45 -0
- package/dist/client/components/blocks/block-tree.mjs.map +1 -0
- package/dist/client/components/blocks/block-type-icon.mjs +50 -0
- package/dist/client/components/blocks/block-type-icon.mjs.map +1 -0
- package/dist/client/components/blocks/utils/tree-utils.mjs +186 -0
- package/dist/client/components/blocks/utils/tree-utils.mjs.map +1 -0
- package/dist/client/components/component-renderer.d.mts +125 -0
- package/dist/client/components/component-renderer.d.mts.map +1 -0
- package/dist/client/components/component-renderer.mjs +145 -0
- package/dist/client/components/component-renderer.mjs.map +1 -0
- package/dist/client/components/error-boundary.mjs +92 -0
- package/dist/client/components/error-boundary.mjs.map +1 -0
- package/dist/client/components/fields/array-field.d.mts +44 -0
- package/dist/client/components/fields/array-field.d.mts.map +1 -0
- package/dist/client/components/fields/array-field.mjs +231 -0
- package/dist/client/components/fields/array-field.mjs.map +1 -0
- package/dist/client/components/fields/asset-preview-field.d.mts +52 -0
- package/dist/client/components/fields/asset-preview-field.d.mts.map +1 -0
- package/dist/client/components/fields/asset-preview-field.mjs +60 -0
- package/dist/client/components/fields/asset-preview-field.mjs.map +1 -0
- package/dist/client/components/fields/blocks-field/blocks-field.d.mts +41 -0
- package/dist/client/components/fields/blocks-field/blocks-field.d.mts.map +1 -0
- package/dist/client/components/fields/blocks-field/blocks-field.mjs +101 -0
- package/dist/client/components/fields/blocks-field/blocks-field.mjs.map +1 -0
- package/dist/client/components/fields/blocks-field/index.d.mts +1 -0
- package/dist/client/components/fields/boolean-field.d.mts +30 -0
- package/dist/client/components/fields/boolean-field.d.mts.map +1 -0
- package/dist/client/components/fields/boolean-field.mjs +47 -0
- package/dist/client/components/fields/boolean-field.mjs.map +1 -0
- package/dist/client/components/fields/custom-field.d.mts +3 -0
- package/dist/client/components/fields/date-field.d.mts +22 -0
- package/dist/client/components/fields/date-field.d.mts.map +1 -0
- package/dist/client/components/fields/date-field.mjs +42 -0
- package/dist/client/components/fields/date-field.mjs.map +1 -0
- package/dist/client/components/fields/datetime-field.d.mts +23 -0
- package/dist/client/components/fields/datetime-field.d.mts.map +1 -0
- package/dist/client/components/fields/datetime-field.mjs +43 -0
- package/dist/client/components/fields/datetime-field.mjs.map +1 -0
- package/dist/client/components/fields/email-field.d.mts +19 -0
- package/dist/client/components/fields/email-field.d.mts.map +1 -0
- package/dist/client/components/fields/email-field.mjs +38 -0
- package/dist/client/components/fields/email-field.mjs.map +1 -0
- package/dist/client/components/fields/embedded-collection.d.mts +3 -0
- package/dist/client/components/fields/field-types.d.mts +571 -0
- package/dist/client/components/fields/field-types.d.mts.map +1 -0
- package/dist/client/components/fields/field-utils.d.mts +1 -0
- package/dist/client/components/fields/field-utils.mjs +65 -0
- package/dist/client/components/fields/field-utils.mjs.map +1 -0
- package/dist/client/components/fields/field-wrapper.d.mts +3 -0
- package/dist/client/components/fields/field-wrapper.mjs +49 -0
- package/dist/client/components/fields/field-wrapper.mjs.map +1 -0
- package/dist/client/components/fields/index.d.mts +33 -0
- package/dist/client/components/fields/json-field.d.mts +84 -0
- package/dist/client/components/fields/json-field.d.mts.map +1 -0
- package/dist/client/components/fields/json-field.mjs +248 -0
- package/dist/client/components/fields/json-field.mjs.map +1 -0
- package/dist/client/components/fields/locale-badge.d.mts +1 -0
- package/dist/client/components/fields/locale-badge.mjs +17 -0
- package/dist/client/components/fields/locale-badge.mjs.map +1 -0
- package/dist/client/components/fields/number-field.d.mts +23 -0
- package/dist/client/components/fields/number-field.d.mts.map +1 -0
- package/dist/client/components/fields/number-field.mjs +40 -0
- package/dist/client/components/fields/number-field.mjs.map +1 -0
- package/dist/client/components/fields/object-array-field.d.mts +2 -0
- package/dist/client/components/fields/object-array-field.mjs +313 -0
- package/dist/client/components/fields/object-array-field.mjs.map +1 -0
- package/dist/client/components/fields/object-field.d.mts +32 -0
- package/dist/client/components/fields/object-field.d.mts.map +1 -0
- package/dist/client/components/fields/object-field.mjs +128 -0
- package/dist/client/components/fields/object-field.mjs.map +1 -0
- package/dist/client/components/fields/relation/displays/cards-display.d.mts +2 -0
- package/dist/client/components/fields/relation/displays/cards-display.mjs +140 -0
- package/dist/client/components/fields/relation/displays/cards-display.mjs.map +1 -0
- package/dist/client/components/fields/relation/displays/chips-display.d.mts +2 -0
- package/dist/client/components/fields/relation/displays/chips-display.mjs +100 -0
- package/dist/client/components/fields/relation/displays/chips-display.mjs.map +1 -0
- package/dist/client/components/fields/relation/displays/grid-display.d.mts +2 -0
- package/dist/client/components/fields/relation/displays/grid-display.mjs +114 -0
- package/dist/client/components/fields/relation/displays/grid-display.mjs.map +1 -0
- package/dist/client/components/fields/relation/displays/index.d.mts +6 -0
- package/dist/client/components/fields/relation/displays/list-display.d.mts +2 -0
- package/dist/client/components/fields/relation/displays/list-display.mjs +128 -0
- package/dist/client/components/fields/relation/displays/list-display.mjs.map +1 -0
- package/dist/client/components/fields/relation/displays/table-display.d.mts +2 -0
- package/dist/client/components/fields/relation/displays/table-display.mjs +134 -0
- package/dist/client/components/fields/relation/displays/table-display.mjs.map +1 -0
- package/dist/client/components/fields/relation/displays/types.d.mts +22 -0
- package/dist/client/components/fields/relation/displays/types.d.mts.map +1 -0
- package/dist/client/components/fields/relation/displays/types.mjs +73 -0
- package/dist/client/components/fields/relation/displays/types.mjs.map +1 -0
- package/dist/client/components/fields/relation/index.d.mts +3 -0
- package/dist/client/components/fields/relation/relation-items-display.d.mts +5 -0
- package/dist/client/components/fields/relation/relation-items-display.mjs +47 -0
- package/dist/client/components/fields/relation/relation-items-display.mjs.map +1 -0
- package/dist/client/components/fields/relation-field.d.mts +134 -0
- package/dist/client/components/fields/relation-field.d.mts.map +1 -0
- package/dist/client/components/fields/relation-field.mjs +106 -0
- package/dist/client/components/fields/relation-field.mjs.map +1 -0
- package/dist/client/components/fields/relation-picker.d.mts +4 -0
- package/dist/client/components/fields/relation-picker.mjs +301 -0
- package/dist/client/components/fields/relation-picker.mjs.map +1 -0
- package/dist/client/components/fields/relation-select.d.mts +3 -0
- package/dist/client/components/fields/relation-select.mjs +219 -0
- package/dist/client/components/fields/relation-select.mjs.map +1 -0
- package/dist/client/components/fields/reverse-relation-field.d.mts +2 -0
- package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +56 -0
- package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/extensions.mjs +118 -0
- package/dist/client/components/fields/rich-text-editor/extensions.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/image-popover.mjs +196 -0
- package/dist/client/components/fields/rich-text-editor/image-popover.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/index.d.mts +4 -0
- package/dist/client/components/fields/rich-text-editor/index.mjs +187 -0
- package/dist/client/components/fields/rich-text-editor/index.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/link-popover.mjs +86 -0
- package/dist/client/components/fields/rich-text-editor/link-popover.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/presets.d.mts +11 -0
- package/dist/client/components/fields/rich-text-editor/presets.d.mts.map +1 -0
- package/dist/client/components/fields/rich-text-editor/presets.mjs +124 -0
- package/dist/client/components/fields/rich-text-editor/presets.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +145 -0
- package/dist/client/components/fields/rich-text-editor/slash-commands.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/table-controls.mjs +124 -0
- package/dist/client/components/fields/rich-text-editor/table-controls.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/toolbar.mjs +280 -0
- package/dist/client/components/fields/rich-text-editor/toolbar.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/types.d.mts +78 -0
- package/dist/client/components/fields/rich-text-editor/types.d.mts.map +1 -0
- package/dist/client/components/fields/rich-text-editor/types.mjs +31 -0
- package/dist/client/components/fields/rich-text-editor/types.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/utils.mjs +51 -0
- package/dist/client/components/fields/rich-text-editor/utils.mjs.map +1 -0
- package/dist/client/components/fields/rich-text-editor/variants.d.mts +2 -0
- package/dist/client/components/fields/rich-text-field.d.mts +14 -0
- package/dist/client/components/fields/rich-text-field.d.mts.map +1 -0
- package/dist/client/components/fields/rich-text-field.mjs +26 -0
- package/dist/client/components/fields/rich-text-field.mjs.map +1 -0
- package/dist/client/components/fields/select-field.d.mts +25 -0
- package/dist/client/components/fields/select-field.d.mts.map +1 -0
- package/dist/client/components/fields/select-field.mjs +53 -0
- package/dist/client/components/fields/select-field.mjs.map +1 -0
- package/dist/client/components/fields/status-field.d.mts +2 -0
- package/dist/client/components/fields/text-field.d.mts +22 -0
- package/dist/client/components/fields/text-field.d.mts.map +1 -0
- package/dist/client/components/fields/text-field.mjs +39 -0
- package/dist/client/components/fields/text-field.mjs.map +1 -0
- package/dist/client/components/fields/textarea-field.d.mts +22 -0
- package/dist/client/components/fields/textarea-field.d.mts.map +1 -0
- package/dist/client/components/fields/textarea-field.mjs +39 -0
- package/dist/client/components/fields/textarea-field.mjs.map +1 -0
- package/dist/client/components/fields/time-field.d.mts +20 -0
- package/dist/client/components/fields/time-field.d.mts.map +1 -0
- package/dist/client/components/fields/time-field.mjs +39 -0
- package/dist/client/components/fields/time-field.mjs.map +1 -0
- package/dist/client/components/fields/upload-field.d.mts +97 -0
- package/dist/client/components/fields/upload-field.d.mts.map +1 -0
- package/dist/client/components/fields/upload-field.mjs +497 -0
- package/dist/client/components/fields/upload-field.mjs.map +1 -0
- package/dist/client/components/filter-builder/columns-tab.d.mts +1 -0
- package/dist/client/components/filter-builder/columns-tab.mjs +131 -0
- package/dist/client/components/filter-builder/columns-tab.mjs.map +1 -0
- package/dist/client/components/filter-builder/filter-builder-sheet.d.mts +1 -0
- package/dist/client/components/filter-builder/filter-builder-sheet.mjs +157 -0
- package/dist/client/components/filter-builder/filter-builder-sheet.mjs.map +1 -0
- package/dist/client/components/filter-builder/filters-tab.d.mts +1 -0
- package/dist/client/components/filter-builder/filters-tab.mjs +380 -0
- package/dist/client/components/filter-builder/filters-tab.mjs.map +1 -0
- package/dist/client/components/filter-builder/index.d.mts +5 -0
- package/dist/client/components/filter-builder/saved-views-tab.d.mts +1 -0
- package/dist/client/components/filter-builder/saved-views-tab.mjs +125 -0
- package/dist/client/components/filter-builder/saved-views-tab.mjs.map +1 -0
- package/dist/client/components/index.d.mts +80 -0
- package/dist/client/components/locale-switcher.d.mts +2 -0
- package/dist/client/components/locale-switcher.mjs +128 -0
- package/dist/client/components/locale-switcher.mjs.map +1 -0
- package/dist/client/components/media/media-grid.mjs +139 -0
- package/dist/client/components/media/media-grid.mjs.map +1 -0
- package/dist/client/components/media/media-picker-dialog.mjs +255 -0
- package/dist/client/components/media/media-picker-dialog.mjs.map +1 -0
- package/dist/client/components/preview/live-preview-mode.mjs +211 -0
- package/dist/client/components/preview/live-preview-mode.mjs.map +1 -0
- package/dist/client/components/preview/preview-pane.mjs +179 -0
- package/dist/client/components/preview/preview-pane.mjs.map +1 -0
- package/dist/client/components/primitives/asset-preview.mjs +363 -0
- package/dist/client/components/primitives/asset-preview.mjs.map +1 -0
- package/dist/client/components/primitives/checkbox-input.mjs +33 -0
- package/dist/client/components/primitives/checkbox-input.mjs.map +1 -0
- package/dist/client/components/primitives/date-input.mjs +218 -0
- package/dist/client/components/primitives/date-input.mjs.map +1 -0
- package/dist/client/components/primitives/dropzone.mjs +239 -0
- package/dist/client/components/primitives/dropzone.mjs.map +1 -0
- package/dist/client/components/primitives/number-input.mjs +113 -0
- package/dist/client/components/primitives/number-input.mjs.map +1 -0
- package/dist/client/components/primitives/select-multi.mjs +256 -0
- package/dist/client/components/primitives/select-multi.mjs.map +1 -0
- package/dist/client/components/primitives/select-single.mjs +183 -0
- package/dist/client/components/primitives/select-single.mjs.map +1 -0
- package/dist/client/components/primitives/text-input.mjs +40 -0
- package/dist/client/components/primitives/text-input.mjs.map +1 -0
- package/dist/client/components/primitives/textarea-input.mjs +38 -0
- package/dist/client/components/primitives/textarea-input.mjs.map +1 -0
- package/dist/client/components/primitives/time-input.mjs +72 -0
- package/dist/client/components/primitives/time-input.mjs.map +1 -0
- package/dist/client/components/primitives/toggle-input.mjs +31 -0
- package/dist/client/components/primitives/toggle-input.mjs.map +1 -0
- package/dist/client/components/primitives/types.d.mts +14 -0
- package/dist/client/components/primitives/types.d.mts.map +1 -0
- package/dist/client/components/primitives/types.mjs +13 -0
- package/dist/client/components/primitives/types.mjs.map +1 -0
- package/dist/client/components/sheets/index.d.mts +1 -0
- package/dist/client/components/sheets/resource-sheet.d.mts +1 -0
- package/dist/client/components/sheets/resource-sheet.mjs +78 -0
- package/dist/client/components/sheets/resource-sheet.mjs.map +1 -0
- package/dist/client/components/ui/accordion.d.mts +2 -0
- package/dist/client/components/ui/accordion.mjs +50 -0
- package/dist/client/components/ui/accordion.mjs.map +1 -0
- package/dist/client/components/ui/alert.mjs +32 -0
- package/dist/client/components/ui/alert.mjs.map +1 -0
- package/dist/client/components/ui/avatar.d.mts +3 -0
- package/dist/client/components/ui/badge.d.mts +3 -0
- package/dist/client/components/ui/badge.mjs +35 -0
- package/dist/client/components/ui/badge.mjs.map +1 -0
- package/dist/client/components/ui/button.d.mts +3 -0
- package/dist/client/components/ui/button.mjs +49 -0
- package/dist/client/components/ui/button.mjs.map +1 -0
- package/dist/client/components/ui/card.d.mts +2 -0
- package/dist/{card-BKHjBQfw.mjs → client/components/ui/card.mjs} +3 -10
- package/dist/{card-BKHjBQfw.mjs.map → client/components/ui/card.mjs.map} +1 -1
- package/dist/client/components/ui/checkbox.d.mts +2 -0
- package/dist/client/components/ui/checkbox.mjs +27 -0
- package/dist/client/components/ui/checkbox.mjs.map +1 -0
- package/dist/client/components/ui/combobox.d.mts +3 -0
- package/dist/client/components/ui/command.mjs +69 -0
- package/dist/client/components/ui/command.mjs.map +1 -0
- package/dist/client/components/ui/dialog.d.mts +3 -0
- package/dist/client/components/ui/dialog.mjs +83 -0
- package/dist/client/components/ui/dialog.mjs.map +1 -0
- package/dist/client/components/ui/drawer.mjs +75 -0
- package/dist/client/components/ui/drawer.mjs.map +1 -0
- package/dist/client/components/ui/dropdown-menu.d.mts +3 -0
- package/dist/client/components/ui/dropdown-menu.mjs +89 -0
- package/dist/client/components/ui/dropdown-menu.mjs.map +1 -0
- package/dist/client/components/ui/empty-state.mjs +53 -0
- package/dist/client/components/ui/empty-state.mjs.map +1 -0
- package/dist/client/components/ui/field.d.mts +3 -0
- package/dist/client/components/ui/field.mjs +78 -0
- package/dist/client/components/ui/field.mjs.map +1 -0
- package/dist/client/components/ui/input-group.d.mts +4 -0
- package/dist/client/components/ui/input-group.mjs +68 -0
- package/dist/client/components/ui/input-group.mjs.map +1 -0
- package/dist/client/components/ui/input.d.mts +2 -0
- package/dist/client/components/ui/input.mjs +17 -0
- package/dist/client/components/ui/input.mjs.map +1 -0
- package/dist/client/components/ui/kbd.mjs +24 -0
- package/dist/client/components/ui/kbd.mjs.map +1 -0
- package/dist/client/components/ui/label.d.mts +2 -0
- package/dist/client/components/ui/label.mjs +15 -0
- package/dist/client/components/ui/label.mjs.map +1 -0
- package/dist/client/components/ui/popover.d.mts +3 -0
- package/dist/client/components/ui/popover.mjs +49 -0
- package/dist/client/components/ui/popover.mjs.map +1 -0
- package/dist/client/components/ui/responsive-dialog.mjs +102 -0
- package/dist/client/components/ui/responsive-dialog.mjs.map +1 -0
- package/dist/client/components/ui/scroll-area.d.mts +2 -0
- package/dist/client/components/ui/search-input.mjs +74 -0
- package/dist/client/components/ui/search-input.mjs.map +1 -0
- package/dist/client/components/ui/select.d.mts +3 -0
- package/dist/client/components/ui/select.mjs +85 -0
- package/dist/client/components/ui/select.mjs.map +1 -0
- package/dist/client/components/ui/separator.d.mts +2 -0
- package/dist/client/components/ui/separator.mjs +17 -0
- package/dist/client/components/ui/separator.mjs.map +1 -0
- package/dist/client/components/ui/sheet.d.mts +3 -0
- package/dist/client/components/ui/sheet.mjs +78 -0
- package/dist/client/components/ui/sheet.mjs.map +1 -0
- package/dist/client/components/ui/sidebar.d.mts +8 -0
- package/dist/client/components/ui/sidebar.mjs +256 -0
- package/dist/client/components/ui/sidebar.mjs.map +1 -0
- package/dist/client/components/ui/skeleton.d.mts +1 -0
- package/dist/client/components/ui/skeleton.mjs +15 -0
- package/dist/client/components/ui/skeleton.mjs.map +1 -0
- package/dist/client/components/ui/sonner.d.mts +14 -0
- package/dist/client/components/ui/sonner.d.mts.map +1 -0
- package/dist/client/components/ui/sonner.mjs +55 -0
- package/dist/client/components/ui/sonner.mjs.map +1 -0
- package/dist/client/components/ui/spinner.d.mts +1 -0
- package/dist/client/components/ui/spinner.mjs +18 -0
- package/dist/client/components/ui/spinner.mjs.map +1 -0
- package/dist/client/components/ui/switch.d.mts +2 -0
- package/dist/client/components/ui/switch.mjs +23 -0
- package/dist/client/components/ui/switch.mjs.map +1 -0
- package/dist/client/components/ui/table.d.mts +2 -0
- package/dist/client/components/ui/table.mjs +66 -0
- package/dist/client/components/ui/table.mjs.map +1 -0
- package/dist/client/components/ui/tabs.d.mts +3 -0
- package/dist/client/components/ui/tabs.mjs +49 -0
- package/dist/client/components/ui/tabs.mjs.map +1 -0
- package/dist/client/components/ui/textarea.d.mts +2 -0
- package/dist/client/components/ui/textarea.mjs +15 -0
- package/dist/client/components/ui/textarea.mjs.map +1 -0
- package/dist/client/components/ui/toolbar.mjs +54 -0
- package/dist/client/components/ui/toolbar.mjs.map +1 -0
- package/dist/client/components/ui/tooltip.d.mts +2 -0
- package/dist/client/components/ui/tooltip.mjs +45 -0
- package/dist/client/components/ui/tooltip.mjs.map +1 -0
- package/dist/client/components/widgets/chart-widget.d.mts +57 -0
- package/dist/client/components/widgets/chart-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/chart-widget.mjs +282 -0
- package/dist/client/components/widgets/chart-widget.mjs.map +1 -0
- package/dist/client/components/widgets/progress-widget.d.mts +41 -0
- package/dist/client/components/widgets/progress-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/progress-widget.mjs +110 -0
- package/dist/client/components/widgets/progress-widget.mjs.map +1 -0
- package/dist/client/components/widgets/quick-actions-widget.d.mts +29 -0
- package/dist/client/components/widgets/quick-actions-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/quick-actions-widget.mjs +121 -0
- package/dist/client/components/widgets/quick-actions-widget.mjs.map +1 -0
- package/dist/client/components/widgets/recent-items-widget.d.mts +51 -0
- package/dist/client/components/widgets/recent-items-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/recent-items-widget.mjs +101 -0
- package/dist/client/components/widgets/recent-items-widget.mjs.map +1 -0
- package/dist/client/components/widgets/stats-widget.d.mts +55 -0
- package/dist/client/components/widgets/stats-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/stats-widget.mjs +150 -0
- package/dist/client/components/widgets/stats-widget.mjs.map +1 -0
- package/dist/client/components/widgets/table-widget.d.mts +31 -0
- package/dist/client/components/widgets/table-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/table-widget.mjs +139 -0
- package/dist/client/components/widgets/table-widget.mjs.map +1 -0
- package/dist/client/components/widgets/timeline-widget.d.mts +51 -0
- package/dist/client/components/widgets/timeline-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/timeline-widget.mjs +168 -0
- package/dist/client/components/widgets/timeline-widget.mjs.map +1 -0
- package/dist/client/components/widgets/value-widget.d.mts +39 -0
- package/dist/client/components/widgets/value-widget.d.mts.map +1 -0
- package/dist/client/components/widgets/value-widget.mjs +111 -0
- package/dist/client/components/widgets/value-widget.mjs.map +1 -0
- package/dist/client/components/widgets/widget-skeletons.mjs +145 -0
- package/dist/client/components/widgets/widget-skeletons.mjs.map +1 -0
- package/dist/client/context/focus-context.d.mts +88 -0
- package/dist/client/context/focus-context.d.mts.map +1 -0
- package/dist/client/context/focus-context.mjs +178 -0
- package/dist/client/context/focus-context.mjs.map +1 -0
- package/dist/client/contexts/breadcrumb-context.mjs +32 -0
- package/dist/client/contexts/breadcrumb-context.mjs.map +1 -0
- package/dist/client/hooks/typed-hooks.d.mts +84 -0
- package/dist/client/hooks/typed-hooks.d.mts.map +1 -0
- package/dist/client/hooks/typed-hooks.mjs +272 -0
- package/dist/client/hooks/typed-hooks.mjs.map +1 -0
- package/dist/client/hooks/use-action.mjs +201 -0
- package/dist/client/hooks/use-action.mjs.map +1 -0
- package/dist/client/hooks/use-admin-config.mjs +40 -0
- package/dist/client/hooks/use-admin-config.mjs.map +1 -0
- package/dist/client/hooks/use-admin-preferences.mjs +68 -0
- package/dist/client/hooks/use-admin-preferences.mjs.map +1 -0
- package/dist/client/hooks/use-admin-routes.mjs +97 -0
- package/dist/client/hooks/use-admin-routes.mjs.map +1 -0
- package/dist/client/hooks/use-auth.d.mts +98 -0
- package/dist/client/hooks/use-auth.d.mts.map +1 -0
- package/dist/{use-auth-BoLmWtmU.mjs → client/hooks/use-auth.mjs} +3 -3
- package/dist/client/hooks/use-auth.mjs.map +1 -0
- package/dist/client/hooks/use-collection-fields.mjs +32 -0
- package/dist/client/hooks/use-collection-fields.mjs.map +1 -0
- package/dist/client/hooks/use-collection-meta.mjs +121 -0
- package/dist/client/hooks/use-collection-meta.mjs.map +1 -0
- package/dist/client/hooks/use-collection-schema.mjs +67 -0
- package/dist/client/hooks/use-collection-schema.mjs.map +1 -0
- package/dist/client/hooks/use-collection-validation.mjs +74 -0
- package/dist/client/hooks/use-collection-validation.mjs.map +1 -0
- package/dist/client/hooks/use-collection.d.mts +86 -0
- package/dist/client/hooks/use-collection.d.mts.map +1 -0
- package/dist/client/hooks/use-collection.mjs +214 -0
- package/dist/client/hooks/use-collection.mjs.map +1 -0
- package/dist/client/hooks/use-current-user.d.mts +57 -0
- package/dist/client/hooks/use-current-user.d.mts.map +1 -0
- package/dist/client/hooks/use-current-user.mjs +79 -0
- package/dist/client/hooks/use-current-user.mjs.map +1 -0
- package/dist/client/hooks/use-field-hooks.mjs +191 -0
- package/dist/client/hooks/use-field-hooks.mjs.map +1 -0
- package/dist/client/hooks/use-field-options.d.mts +90 -0
- package/dist/client/hooks/use-field-options.d.mts.map +1 -0
- package/dist/client/hooks/use-field-options.mjs +184 -0
- package/dist/client/hooks/use-field-options.mjs.map +1 -0
- package/dist/client/hooks/use-global-fields.mjs +27 -0
- package/dist/client/hooks/use-global-fields.mjs.map +1 -0
- package/dist/client/hooks/use-global-meta.mjs +59 -0
- package/dist/client/hooks/use-global-meta.mjs.map +1 -0
- package/dist/client/hooks/use-global-schema.mjs +33 -0
- package/dist/client/hooks/use-global-schema.mjs.map +1 -0
- package/dist/client/hooks/use-global.d.mts +40 -0
- package/dist/client/hooks/use-global.d.mts.map +1 -0
- package/dist/client/hooks/use-global.mjs +74 -0
- package/dist/client/hooks/use-global.mjs.map +1 -0
- package/dist/client/hooks/use-locks.mjs +245 -0
- package/dist/client/hooks/use-locks.mjs.map +1 -0
- package/dist/client/hooks/use-media-query.d.mts +23 -0
- package/dist/client/hooks/use-media-query.d.mts.map +1 -0
- package/dist/client/hooks/use-media-query.mjs +62 -0
- package/dist/client/hooks/use-media-query.mjs.map +1 -0
- package/dist/client/hooks/use-prefill-params.mjs +47 -0
- package/dist/client/hooks/use-prefill-params.mjs.map +1 -0
- package/dist/client/hooks/use-questpie-query-options.mjs +28 -0
- package/dist/client/hooks/use-questpie-query-options.mjs.map +1 -0
- package/dist/client/hooks/use-reactive-fields.d.mts +75 -0
- package/dist/client/hooks/use-reactive-fields.d.mts.map +1 -0
- package/dist/client/hooks/use-reactive-fields.mjs +164 -0
- package/dist/client/hooks/use-reactive-fields.mjs.map +1 -0
- package/dist/client/hooks/use-realtime-highlight.mjs +96 -0
- package/dist/client/hooks/use-realtime-highlight.mjs.map +1 -0
- package/dist/client/hooks/use-saved-views.mjs +65 -0
- package/dist/client/hooks/use-saved-views.mjs.map +1 -0
- package/dist/client/hooks/use-search.mjs +147 -0
- package/dist/client/hooks/use-search.mjs.map +1 -0
- package/dist/client/hooks/use-server-validation.mjs +199 -0
- package/dist/client/hooks/use-server-validation.mjs.map +1 -0
- package/dist/client/hooks/use-server-widget-data.d.mts +26 -0
- package/dist/client/hooks/use-server-widget-data.d.mts.map +1 -0
- package/dist/client/hooks/use-server-widget-data.mjs +40 -0
- package/dist/client/hooks/use-server-widget-data.mjs.map +1 -0
- package/dist/client/hooks/use-setup-status.d.mts +39 -0
- package/dist/client/hooks/use-setup-status.d.mts.map +1 -0
- package/dist/client/hooks/use-setup-status.mjs +50 -0
- package/dist/client/hooks/use-setup-status.mjs.map +1 -0
- package/dist/client/hooks/use-upload-collection.mjs +32 -0
- package/dist/client/hooks/use-upload-collection.mjs.map +1 -0
- package/dist/client/hooks/use-upload.d.mts +23 -0
- package/dist/client/hooks/use-upload.d.mts.map +1 -0
- package/dist/client/hooks/use-upload.mjs +145 -0
- package/dist/client/hooks/use-upload.mjs.map +1 -0
- package/dist/client/hooks/use-validation-error-map.mjs +53 -0
- package/dist/client/hooks/use-validation-error-map.mjs.map +1 -0
- package/dist/client/hooks/use-view-state.mjs +261 -0
- package/dist/client/hooks/use-view-state.mjs.map +1 -0
- package/dist/client/i18n/hooks.mjs +160 -0
- package/dist/client/i18n/hooks.mjs.map +1 -0
- package/dist/client/i18n/intl-cache.mjs +65 -0
- package/dist/client/i18n/intl-cache.mjs.map +1 -0
- package/dist/client/i18n/messages.mjs +7 -0
- package/dist/client/i18n/messages.mjs.map +1 -0
- package/dist/client/i18n/simple.d.mts +22 -0
- package/dist/client/i18n/simple.d.mts.map +1 -0
- package/dist/client/i18n/simple.mjs +157 -0
- package/dist/client/i18n/simple.mjs.map +1 -0
- package/dist/client/i18n/types.d.mts +110 -0
- package/dist/client/i18n/types.d.mts.map +1 -0
- package/dist/client/lib/utils.d.mts +1 -0
- package/dist/client/lib/utils.mjs +28 -0
- package/dist/client/lib/utils.mjs.map +1 -0
- package/dist/client/preview/block-scope-context.d.mts +74 -0
- package/dist/client/preview/block-scope-context.d.mts.map +1 -0
- package/dist/client/preview/block-scope-context.mjs +93 -0
- package/dist/client/preview/block-scope-context.mjs.map +1 -0
- package/dist/client/preview/index.d.mts +5 -0
- package/dist/client/preview/preview-banner.d.mts +46 -0
- package/dist/client/preview/preview-banner.d.mts.map +1 -0
- package/dist/client/preview/preview-banner.mjs +95 -0
- package/dist/client/preview/preview-banner.mjs.map +1 -0
- package/dist/client/preview/preview-field.d.mts +108 -0
- package/dist/client/preview/preview-field.d.mts.map +1 -0
- package/dist/client/preview/preview-field.mjs +125 -0
- package/dist/client/preview/preview-field.mjs.map +1 -0
- package/dist/client/preview/types.d.mts +115 -0
- package/dist/client/preview/types.d.mts.map +1 -0
- package/dist/client/preview/types.mjs +21 -0
- package/dist/client/preview/types.mjs.map +1 -0
- package/dist/client/preview/use-collection-preview.d.mts +71 -0
- package/dist/client/preview/use-collection-preview.d.mts.map +1 -0
- package/dist/client/preview/use-collection-preview.mjs +114 -0
- package/dist/client/preview/use-collection-preview.mjs.map +1 -0
- package/dist/client/runtime/content-locales-provider.d.mts +1 -0
- package/dist/client/runtime/content-locales-provider.mjs +85 -0
- package/dist/client/runtime/content-locales-provider.mjs.map +1 -0
- package/dist/client/runtime/index.d.mts +7 -0
- package/dist/client/runtime/index.mjs +8 -0
- package/dist/client/runtime/locale-scope.d.mts +2 -0
- package/dist/{runtime-6VZM878K.mjs → client/runtime/locale-scope.mjs} +3 -4
- package/dist/client/runtime/locale-scope.mjs.map +1 -0
- package/dist/client/runtime/provider.d.mts +10107 -0
- package/dist/client/runtime/provider.d.mts.map +1 -0
- package/dist/client/runtime/provider.mjs +229 -0
- package/dist/client/runtime/provider.mjs.map +1 -0
- package/dist/client/runtime/routes.d.mts +49 -0
- package/dist/client/runtime/routes.d.mts.map +1 -0
- package/dist/client/runtime/routes.mjs +107 -0
- package/dist/client/runtime/routes.mjs.map +1 -0
- package/dist/client/runtime/translations-provider.d.mts +2 -0
- package/dist/client/runtime/translations-provider.mjs +181 -0
- package/dist/client/runtime/translations-provider.mjs.map +1 -0
- package/dist/client/scope/index.d.mts +3 -0
- package/dist/client/scope/picker.d.mts +54 -0
- package/dist/client/scope/picker.d.mts.map +1 -0
- package/dist/client/scope/picker.mjs +161 -0
- package/dist/client/scope/picker.mjs.map +1 -0
- package/dist/client/scope/provider.d.mts +104 -0
- package/dist/client/scope/provider.d.mts.map +1 -0
- package/dist/client/scope/provider.mjs +159 -0
- package/dist/client/scope/provider.mjs.map +1 -0
- package/dist/client/scope/types.d.mts +112 -0
- package/dist/client/scope/types.d.mts.map +1 -0
- package/dist/client/styles/index.css +80 -0
- package/dist/client/utils/auto-expand-fields.mjs +65 -0
- package/dist/client/utils/auto-expand-fields.mjs.map +1 -0
- package/dist/client/utils/build-field-definitions-from-schema.mjs +256 -0
- package/dist/client/utils/build-field-definitions-from-schema.mjs.map +1 -0
- package/dist/client/utils/detect-relations.mjs +46 -0
- package/dist/client/utils/detect-relations.mjs.map +1 -0
- package/dist/client/utils/locale-to-flag.d.mts +118 -0
- package/dist/client/utils/locale-to-flag.d.mts.map +1 -0
- package/dist/client/utils/locale-to-flag.mjs +130 -0
- package/dist/client/utils/locale-to-flag.mjs.map +1 -0
- package/dist/client/utils/routes.mjs +196 -0
- package/dist/client/utils/routes.mjs.map +1 -0
- package/dist/client/views/auth/accept-invite-form.d.mts +73 -0
- package/dist/client/views/auth/accept-invite-form.d.mts.map +1 -0
- package/dist/client/views/auth/accept-invite-form.mjs +180 -0
- package/dist/client/views/auth/accept-invite-form.mjs.map +1 -0
- package/dist/client/views/auth/auth-layout.d.mts +44 -0
- package/dist/client/views/auth/auth-layout.d.mts.map +1 -0
- package/dist/client/views/auth/auth-layout.mjs +53 -0
- package/dist/client/views/auth/auth-layout.mjs.map +1 -0
- package/dist/client/views/auth/forgot-password-form.d.mts +59 -0
- package/dist/client/views/auth/forgot-password-form.d.mts.map +1 -0
- package/dist/{forgot-password-page-Bcp-An4Y.mjs → client/views/auth/forgot-password-form.mjs} +22 -89
- package/dist/client/views/auth/forgot-password-form.mjs.map +1 -0
- package/dist/client/views/auth/index.d.mts +7 -0
- package/dist/client/views/auth/invite-form.d.mts +1 -0
- package/dist/client/views/auth/invite-form.mjs +155 -0
- package/dist/client/views/auth/invite-form.mjs.map +1 -0
- package/dist/client/views/auth/login-form.d.mts +76 -0
- package/dist/client/views/auth/login-form.d.mts.map +1 -0
- package/dist/client/views/auth/login-form.mjs +167 -0
- package/dist/client/views/auth/login-form.mjs.map +1 -0
- package/dist/client/views/auth/reset-password-form.d.mts +66 -0
- package/dist/client/views/auth/reset-password-form.d.mts.map +1 -0
- package/dist/client/views/auth/reset-password-form.mjs +188 -0
- package/dist/client/views/auth/reset-password-form.mjs.map +1 -0
- package/dist/client/views/auth/setup-form.d.mts +61 -0
- package/dist/client/views/auth/setup-form.d.mts.map +1 -0
- package/dist/{setup-page-YAP_fzqh.mjs → client/views/auth/setup-form.mjs} +46 -124
- package/dist/client/views/auth/setup-form.mjs.map +1 -0
- package/dist/client/views/collection/auto-form-fields.d.mts +4 -0
- package/dist/client/views/collection/auto-form-fields.mjs +453 -0
- package/dist/client/views/collection/auto-form-fields.mjs.map +1 -0
- package/dist/client/views/collection/bulk-action-toolbar.mjs +291 -0
- package/dist/client/views/collection/bulk-action-toolbar.mjs.map +1 -0
- package/dist/client/views/collection/cells/complex-cells.d.mts +46 -0
- package/dist/client/views/collection/cells/complex-cells.d.mts.map +1 -0
- package/dist/client/views/collection/cells/complex-cells.mjs +327 -0
- package/dist/client/views/collection/cells/complex-cells.mjs.map +1 -0
- package/dist/client/views/collection/cells/index.d.mts +7 -0
- package/dist/client/views/collection/cells/primitive-cells.d.mts +76 -0
- package/dist/client/views/collection/cells/primitive-cells.d.mts.map +1 -0
- package/dist/client/views/collection/cells/primitive-cells.mjs +165 -0
- package/dist/client/views/collection/cells/primitive-cells.mjs.map +1 -0
- package/dist/client/views/collection/cells/relation-cells.d.mts +21 -0
- package/dist/client/views/collection/cells/relation-cells.d.mts.map +1 -0
- package/dist/client/views/collection/cells/relation-cells.mjs +105 -0
- package/dist/client/views/collection/cells/relation-cells.mjs.map +1 -0
- package/dist/client/views/collection/cells/shared/asset-thumbnail.d.mts +1 -0
- package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +189 -0
- package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs.map +1 -0
- package/dist/client/views/collection/cells/shared/cell-helpers.d.mts +2 -0
- package/dist/client/views/collection/cells/shared/cell-helpers.mjs +78 -0
- package/dist/client/views/collection/cells/shared/cell-helpers.mjs.map +1 -0
- package/dist/client/views/collection/cells/shared/relation-chip.d.mts +1 -0
- package/dist/client/views/collection/cells/shared/relation-chip.mjs +37 -0
- package/dist/client/views/collection/cells/shared/relation-chip.mjs.map +1 -0
- package/dist/client/views/collection/cells/upload-cells.d.mts +25 -0
- package/dist/client/views/collection/cells/upload-cells.d.mts.map +1 -0
- package/dist/client/views/collection/cells/upload-cells.mjs +20 -0
- package/dist/client/views/collection/cells/upload-cells.mjs.map +1 -0
- package/dist/client/views/collection/columns/build-columns.d.mts +2 -0
- package/dist/client/views/collection/columns/build-columns.mjs +156 -0
- package/dist/client/views/collection/columns/build-columns.mjs.map +1 -0
- package/dist/client/views/collection/columns/column-defaults.d.mts +2 -0
- package/dist/client/views/collection/columns/column-defaults.mjs +108 -0
- package/dist/client/views/collection/columns/column-defaults.mjs.map +1 -0
- package/dist/client/views/collection/columns/index.d.mts +3 -0
- package/dist/client/views/collection/columns/types.d.mts +2 -0
- package/dist/client/views/collection/field-context.mjs +127 -0
- package/dist/client/views/collection/field-context.mjs.map +1 -0
- package/dist/client/views/collection/field-renderer.mjs +171 -0
- package/dist/client/views/collection/field-renderer.mjs.map +1 -0
- package/dist/client/views/collection/form-view.d.mts +112 -0
- package/dist/client/views/collection/form-view.d.mts.map +1 -0
- package/dist/client/views/collection/form-view.mjs +903 -0
- package/dist/client/views/collection/form-view.mjs.map +1 -0
- package/dist/client/views/collection/index.d.mts +9 -0
- package/dist/client/views/collection/table-view.d.mts +102 -0
- package/dist/client/views/collection/table-view.d.mts.map +1 -0
- package/dist/client/views/collection/table-view.mjs +695 -0
- package/dist/client/views/collection/table-view.mjs.map +1 -0
- package/dist/client/views/collection/view-skeletons.mjs +121 -0
- package/dist/client/views/collection/view-skeletons.mjs.map +1 -0
- package/dist/client/views/common/global-search.d.mts +1 -0
- package/dist/client/views/common/global-search.mjs +376 -0
- package/dist/client/views/common/global-search.mjs.map +1 -0
- package/dist/client/views/common/index.d.mts +1 -0
- package/dist/client/views/dashboard/dashboard-grid.mjs +385 -0
- package/dist/client/views/dashboard/dashboard-grid.mjs.map +1 -0
- package/dist/client/views/dashboard/dashboard-widget.mjs +178 -0
- package/dist/client/views/dashboard/dashboard-widget.mjs.map +1 -0
- package/dist/client/views/dashboard/widget-card.mjs +159 -0
- package/dist/client/views/dashboard/widget-card.mjs.map +1 -0
- package/dist/client/views/globals/global-form-view.d.mts +74 -0
- package/dist/client/views/globals/global-form-view.d.mts.map +1 -0
- package/dist/client/views/globals/global-form-view.mjs +181 -0
- package/dist/client/views/globals/global-form-view.mjs.map +1 -0
- package/dist/client/views/index.d.mts +28 -0
- package/dist/client/views/layout/admin-layout-provider.d.mts +140 -0
- package/dist/client/views/layout/admin-layout-provider.d.mts.map +1 -0
- package/dist/client/views/layout/admin-layout-provider.mjs +90 -0
- package/dist/client/views/layout/admin-layout-provider.mjs.map +1 -0
- package/dist/client/views/layout/admin-layout.d.mts +151 -0
- package/dist/client/views/layout/admin-layout.d.mts.map +1 -0
- package/dist/client/views/layout/admin-layout.mjs +144 -0
- package/dist/client/views/layout/admin-layout.mjs.map +1 -0
- package/dist/client/views/layout/admin-root.d.mts +7 -0
- package/dist/client/views/layout/admin-router.d.mts +125 -0
- package/dist/client/views/layout/admin-router.d.mts.map +1 -0
- package/dist/client/views/layout/admin-router.mjs +594 -0
- package/dist/client/views/layout/admin-router.mjs.map +1 -0
- package/dist/client/views/layout/admin-sidebar.d.mts +105 -0
- package/dist/client/views/layout/admin-sidebar.d.mts.map +1 -0
- package/dist/client/views/layout/admin-sidebar.mjs +550 -0
- package/dist/client/views/layout/admin-sidebar.mjs.map +1 -0
- package/dist/client/views/layout/admin-topbar.mjs +128 -0
- package/dist/client/views/layout/admin-topbar.mjs.map +1 -0
- package/dist/client/views/layout/index.d.mts +5 -0
- package/dist/client/views/pages/accept-invite-page.d.mts +67 -0
- package/dist/client/views/pages/accept-invite-page.d.mts.map +1 -0
- package/dist/client/views/pages/accept-invite-page.mjs +143 -0
- package/dist/client/views/pages/accept-invite-page.mjs.map +1 -0
- package/dist/client/views/pages/dashboard-page.d.mts +52 -0
- package/dist/client/views/pages/dashboard-page.d.mts.map +1 -0
- package/dist/client/views/pages/dashboard-page.mjs +45 -0
- package/dist/client/views/pages/dashboard-page.mjs.map +1 -0
- package/dist/client/views/pages/forgot-password-page.d.mts +59 -0
- package/dist/client/views/pages/forgot-password-page.d.mts.map +1 -0
- package/dist/client/views/pages/forgot-password-page.mjs +80 -0
- package/dist/client/views/pages/forgot-password-page.mjs.map +1 -0
- package/dist/client/views/pages/index.d.mts +7 -0
- package/dist/client/views/pages/invite-page.d.mts +71 -0
- package/dist/client/views/pages/invite-page.d.mts.map +1 -0
- package/dist/client/views/pages/invite-page.mjs +86 -0
- package/dist/client/views/pages/invite-page.mjs.map +1 -0
- package/dist/client/views/pages/login-page.d.mts +76 -0
- package/dist/client/views/pages/login-page.d.mts.map +1 -0
- package/dist/client/views/pages/login-page.mjs +98 -0
- package/dist/client/views/pages/login-page.mjs.map +1 -0
- package/dist/client/views/pages/reset-password-page.d.mts +66 -0
- package/dist/client/views/pages/reset-password-page.d.mts.map +1 -0
- package/dist/client/views/pages/reset-password-page.mjs +105 -0
- package/dist/client/views/pages/reset-password-page.mjs.map +1 -0
- package/dist/client/views/pages/setup-page.d.mts +64 -0
- package/dist/client/views/pages/setup-page.d.mts.map +1 -0
- package/dist/client/views/pages/setup-page.mjs +91 -0
- package/dist/client/views/pages/setup-page.mjs.map +1 -0
- package/dist/client.d.mts +92 -3
- package/dist/client.d.mts.map +1 -0
- package/dist/client.mjs +54 -12
- package/dist/components/rich-text/index.d.mts +1 -0
- package/dist/components/rich-text/rich-text-renderer.d.mts +104 -0
- package/dist/components/rich-text/rich-text-renderer.d.mts.map +1 -0
- package/dist/components/rich-text/rich-text-renderer.mjs +210 -0
- package/dist/components/rich-text/rich-text-renderer.mjs.map +1 -0
- package/dist/index.d.mts +62 -3
- package/dist/index.mjs +54 -12
- package/dist/server/adapters/nextjs.d.mts +121 -0
- package/dist/server/adapters/nextjs.d.mts.map +1 -0
- package/dist/server/adapters/nextjs.mjs +111 -0
- package/dist/server/adapters/nextjs.mjs.map +1 -0
- package/dist/server/adapters/tanstack.d.mts +133 -0
- package/dist/server/adapters/tanstack.d.mts.map +1 -0
- package/dist/server/adapters/tanstack.mjs +90 -0
- package/dist/server/adapters/tanstack.mjs.map +1 -0
- package/dist/server/augmentation.d.mts +1523 -0
- package/dist/server/augmentation.d.mts.map +1 -0
- package/dist/server/auth-helpers.d.mts +143 -0
- package/dist/server/auth-helpers.d.mts.map +1 -0
- package/dist/server/auth-helpers.mjs +108 -0
- package/dist/server/auth-helpers.mjs.map +1 -0
- package/dist/server/block/block-builder.d.mts +319 -0
- package/dist/server/block/block-builder.d.mts.map +1 -0
- package/dist/server/block/block-builder.mjs +217 -0
- package/dist/server/block/block-builder.mjs.map +1 -0
- package/dist/server/block/index.d.mts +3 -0
- package/dist/server/block/introspection.d.mts +84 -0
- package/dist/server/block/introspection.d.mts.map +1 -0
- package/dist/server/block/introspection.mjs +89 -0
- package/dist/server/block/introspection.mjs.map +1 -0
- package/dist/server/block/prefetch.d.mts +78 -0
- package/dist/server/block/prefetch.d.mts.map +1 -0
- package/dist/server/block/prefetch.mjs +240 -0
- package/dist/server/block/prefetch.mjs.map +1 -0
- package/dist/server/fields/blocks.d.mts +139 -0
- package/dist/server/fields/blocks.d.mts.map +1 -0
- package/dist/server/fields/blocks.mjs +192 -0
- package/dist/server/fields/blocks.mjs.map +1 -0
- package/dist/server/fields/index.d.mts +48 -0
- package/dist/server/fields/index.d.mts.map +1 -0
- package/dist/server/fields/index.mjs +16 -0
- package/dist/server/fields/index.mjs.map +1 -0
- package/dist/server/fields/rich-text.d.mts +135 -0
- package/dist/server/fields/rich-text.d.mts.map +1 -0
- package/dist/server/fields/rich-text.mjs +188 -0
- package/dist/server/fields/rich-text.mjs.map +1 -0
- package/dist/server/i18n/index.d.mts +16 -0
- package/dist/server/i18n/index.d.mts.map +1 -0
- package/dist/server/i18n/index.mjs +44 -0
- package/dist/server/i18n/index.mjs.map +1 -0
- package/dist/server/i18n/messages/cs.mjs +461 -0
- package/dist/server/i18n/messages/cs.mjs.map +1 -0
- package/dist/server/i18n/messages/de.mjs +461 -0
- package/dist/server/i18n/messages/de.mjs.map +1 -0
- package/dist/server/i18n/messages/en.mjs +493 -0
- package/dist/server/i18n/messages/en.mjs.map +1 -0
- package/dist/server/i18n/messages/es.mjs +461 -0
- package/dist/server/i18n/messages/es.mjs.map +1 -0
- package/dist/server/i18n/messages/fr.mjs +461 -0
- package/dist/server/i18n/messages/fr.mjs.map +1 -0
- package/dist/server/i18n/messages/index.mjs +24 -0
- package/dist/server/i18n/messages/index.mjs.map +1 -0
- package/dist/server/i18n/messages/pl.mjs +461 -0
- package/dist/server/i18n/messages/pl.mjs.map +1 -0
- package/dist/server/i18n/messages/pt.mjs +464 -0
- package/dist/server/i18n/messages/pt.mjs.map +1 -0
- package/dist/server/i18n/messages/sk.mjs +490 -0
- package/dist/server/i18n/messages/sk.mjs.map +1 -0
- package/dist/server/index.d.mts +20 -0
- package/dist/server/modules/admin/functions/admin-config.mjs +348 -0
- package/dist/server/modules/admin/functions/admin-config.mjs.map +1 -0
- package/dist/server/modules/admin/functions/execute-action.d.mts +107 -0
- package/dist/server/modules/admin/functions/execute-action.d.mts.map +1 -0
- package/dist/server/modules/admin/functions/execute-action.mjs +331 -0
- package/dist/server/modules/admin/functions/execute-action.mjs.map +1 -0
- package/dist/server/modules/admin/functions/locales.mjs +80 -0
- package/dist/server/modules/admin/functions/locales.mjs.map +1 -0
- package/dist/server/modules/admin/functions/preview.d.mts +70 -0
- package/dist/server/modules/admin/functions/preview.d.mts.map +1 -0
- package/dist/server/modules/admin/functions/preview.mjs +243 -0
- package/dist/server/modules/admin/functions/preview.mjs.map +1 -0
- package/dist/server/modules/admin/functions/reactive.d.mts +99 -0
- package/dist/server/modules/admin/functions/reactive.d.mts.map +1 -0
- package/dist/server/modules/admin/functions/reactive.mjs +378 -0
- package/dist/server/modules/admin/functions/reactive.mjs.map +1 -0
- package/dist/server/modules/admin/functions/setup.d.mts +84 -0
- package/dist/server/modules/admin/functions/setup.d.mts.map +1 -0
- package/dist/server/modules/admin/functions/setup.mjs +131 -0
- package/dist/server/modules/admin/functions/setup.mjs.map +1 -0
- package/dist/server/modules/admin/functions/translations.mjs +125 -0
- package/dist/server/modules/admin/functions/translations.mjs.map +1 -0
- package/dist/server/modules/admin/functions/widget-data.d.mts +33 -0
- package/dist/server/modules/admin/functions/widget-data.d.mts.map +1 -0
- package/dist/server/modules/admin/functions/widget-data.mjs +70 -0
- package/dist/server/modules/admin/functions/widget-data.mjs.map +1 -0
- package/dist/server/modules/admin/index.d.mts +16879 -0
- package/dist/server/modules/admin/index.d.mts.map +1 -0
- package/dist/server/modules/admin/index.mjs +249 -0
- package/dist/server/modules/admin/index.mjs.map +1 -0
- package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.d.mts +3 -0
- package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.mjs +48 -0
- package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.mjs.map +1 -0
- package/dist/server/modules/admin-preferences/collections/locks.collection.d.mts +3 -0
- package/dist/server/modules/admin-preferences/collections/locks.collection.mjs +79 -0
- package/dist/server/modules/admin-preferences/collections/locks.collection.mjs.map +1 -0
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts +1490 -0
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts.map +1 -0
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs +57 -0
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs.map +1 -0
- package/dist/server/patch.d.mts +100 -0
- package/dist/server/patch.d.mts.map +1 -0
- package/dist/server/patch.mjs +1062 -0
- package/dist/server/patch.mjs.map +1 -0
- package/dist/server.d.mts +21 -250
- package/dist/server.mjs +19 -832
- package/dist/shared/preview-utils.d.mts +54 -0
- package/dist/shared/preview-utils.d.mts.map +1 -0
- package/dist/{preview-utils-BKQ9-TMa.mjs → shared/preview-utils.mjs} +2 -2
- package/dist/shared/preview-utils.mjs.map +1 -0
- package/dist/{saved-views.types-BMsz5mCy.d.mts → shared/types/saved-views.types.d.mts} +7 -2
- package/dist/shared/types/saved-views.types.d.mts.map +1 -0
- package/dist/shared.d.mts +3 -57
- package/dist/shared.mjs +1 -1
- package/package.json +12 -17
- 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/client-B7r47hEd.d.mts +0 -13403
- package/dist/client-B7r47hEd.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.map +0 -1
- package/dist/forgot-password-page-CEwsdLwn.mjs +0 -3
- package/dist/index-BYyqkWtn.d.mts +0 -2753
- package/dist/index-BYyqkWtn.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.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.map +0 -1
- package/dist/shared.d.mts.map +0 -1
- package/dist/use-auth-BoLmWtmU.mjs.map +0 -1
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { selectClient, useAdminStore } from "../runtime/provider.mjs";
|
|
2
|
+
import { useQuery, useSuspenseQuery } from "@tanstack/react-query";
|
|
3
|
+
|
|
4
|
+
//#region src/client/hooks/use-admin-config.ts
|
|
5
|
+
/**
|
|
6
|
+
* Hook for fetching server-side admin config
|
|
7
|
+
*/
|
|
8
|
+
/** Query key for admin config */
|
|
9
|
+
const adminConfigQueryKey = [
|
|
10
|
+
"questpie",
|
|
11
|
+
"admin",
|
|
12
|
+
"config"
|
|
13
|
+
];
|
|
14
|
+
/** Query options factory for admin config */
|
|
15
|
+
function getAdminConfigQueryOptions(client) {
|
|
16
|
+
return {
|
|
17
|
+
queryKey: adminConfigQueryKey,
|
|
18
|
+
queryFn: async () => {
|
|
19
|
+
if (!client || !client.rpc) return {};
|
|
20
|
+
return client.rpc.getAdminConfig();
|
|
21
|
+
},
|
|
22
|
+
staleTime: 300 * 1e3,
|
|
23
|
+
gcTime: 1800 * 1e3
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/** Standard query hook - returns loading/error states */
|
|
27
|
+
function useAdminConfig(queryOptions) {
|
|
28
|
+
return useQuery({
|
|
29
|
+
...getAdminConfigQueryOptions(useAdminStore(selectClient)),
|
|
30
|
+
...queryOptions
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/** Suspense query hook - suspends until data is ready, no loading checks needed */
|
|
34
|
+
function useSuspenseAdminConfig() {
|
|
35
|
+
return useSuspenseQuery({ ...getAdminConfigQueryOptions(useAdminStore(selectClient)) });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//#endregion
|
|
39
|
+
export { useAdminConfig, useSuspenseAdminConfig };
|
|
40
|
+
//# sourceMappingURL=use-admin-config.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-admin-config.mjs","names":[],"sources":["../../../src/client/hooks/use-admin-config.ts"],"sourcesContent":["/**\n * Hook for fetching server-side admin config\n */\n\nimport {\n\ttype UseQueryOptions,\n\tuseQuery,\n\tuseSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport { selectClient, useAdminStore } from \"../runtime\";\nimport type { AdminConfigResponse } from \"../types/admin-config\";\n\n/** Query key for admin config */\nexport const adminConfigQueryKey = [\"questpie\", \"admin\", \"config\"] as const;\n\n/** Query options factory for admin config */\nexport function getAdminConfigQueryOptions(client: unknown) {\n\treturn {\n\t\tqueryKey: adminConfigQueryKey,\n\t\tqueryFn: async (): Promise<AdminConfigResponse> => {\n\t\t\tif (!client || !(client as any).rpc) {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t\treturn (client as any).rpc.getAdminConfig();\n\t\t},\n\t\tstaleTime: 5 * 60 * 1000,\n\t\tgcTime: 30 * 60 * 1000,\n\t};\n}\n\n/** Standard query hook - returns loading/error states */\nexport function useAdminConfig(\n\tqueryOptions?: Omit<\n\t\tUseQueryOptions<AdminConfigResponse>,\n\t\t\"queryKey\" | \"queryFn\"\n\t>,\n) {\n\tconst client = useAdminStore(selectClient);\n\n\treturn useQuery<AdminConfigResponse>({\n\t\t...getAdminConfigQueryOptions(client),\n\t\t...queryOptions,\n\t});\n}\n\n/** Suspense query hook - suspends until data is ready, no loading checks needed */\nexport function useSuspenseAdminConfig() {\n\tconst client = useAdminStore(selectClient);\n\n\treturn useSuspenseQuery<AdminConfigResponse>({\n\t\t...getAdminConfigQueryOptions(client),\n\t});\n}\n"],"mappings":";;;;;;;;AAaA,MAAa,sBAAsB;CAAC;CAAY;CAAS;CAAS;;AAGlE,SAAgB,2BAA2B,QAAiB;AAC3D,QAAO;EACN,UAAU;EACV,SAAS,YAA0C;AAClD,OAAI,CAAC,UAAU,CAAE,OAAe,IAC/B,QAAO,EAAE;AAEV,UAAQ,OAAe,IAAI,gBAAgB;;EAE5C,WAAW,MAAS;EACpB,QAAQ,OAAU;EAClB;;;AAIF,SAAgB,eACf,cAIC;AAGD,QAAO,SAA8B;EACpC,GAAG,2BAHW,cAAc,aAAa,CAGJ;EACrC,GAAG;EACH,CAAC;;;AAIH,SAAgB,yBAAyB;AAGxC,QAAO,iBAAsC,EAC5C,GAAG,2BAHW,cAAc,aAAa,CAGJ,EACrC,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { useAdminStore } from "../runtime/provider.mjs";
|
|
2
|
+
import { useCurrentUser } from "./use-current-user.mjs";
|
|
3
|
+
import { useMutation, useQuery, useQueryClient, useSuspenseQuery } from "@tanstack/react-query";
|
|
4
|
+
|
|
5
|
+
//#region src/client/hooks/use-admin-preferences.ts
|
|
6
|
+
/**
|
|
7
|
+
* Get query key for admin preference
|
|
8
|
+
*/
|
|
9
|
+
function getAdminPreferenceQueryKey(userId, key) {
|
|
10
|
+
return [
|
|
11
|
+
"adminPreferences",
|
|
12
|
+
userId,
|
|
13
|
+
key
|
|
14
|
+
];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Hook to set an admin preference
|
|
18
|
+
*
|
|
19
|
+
* Creates or updates the preference for the current user.
|
|
20
|
+
*
|
|
21
|
+
* @param key - Preference key (e.g., "viewState:posts")
|
|
22
|
+
* @returns Mutation for setting the preference
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* const { mutate: setPreference, isPending } = useSetAdminPreference<ViewConfiguration>("viewState:posts");
|
|
27
|
+
*
|
|
28
|
+
* const handleSave = () => {
|
|
29
|
+
* setPreference(viewConfig);
|
|
30
|
+
* };
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
function useSetAdminPreference(key) {
|
|
34
|
+
const client = useAdminStore((s) => s.client);
|
|
35
|
+
const user = useCurrentUser();
|
|
36
|
+
const queryClient = useQueryClient();
|
|
37
|
+
return useMutation({
|
|
38
|
+
mutationFn: async (value) => {
|
|
39
|
+
if (!user?.id) throw new Error("User must be logged in to save preferences");
|
|
40
|
+
const collections = client?.collections;
|
|
41
|
+
if (!collections?.adminPreferences) throw new Error("adminPreferences collection not available. Make sure to use adminModule in your CMS setup.");
|
|
42
|
+
const existing = await collections.adminPreferences.findOne({ where: {
|
|
43
|
+
userId: user.id,
|
|
44
|
+
key
|
|
45
|
+
} });
|
|
46
|
+
if (existing) return collections.adminPreferences.update({
|
|
47
|
+
id: existing.id,
|
|
48
|
+
data: { value }
|
|
49
|
+
});
|
|
50
|
+
return collections.adminPreferences.create({
|
|
51
|
+
userId: user.id,
|
|
52
|
+
key,
|
|
53
|
+
value
|
|
54
|
+
});
|
|
55
|
+
},
|
|
56
|
+
onSuccess: () => {
|
|
57
|
+
queryClient.invalidateQueries({ queryKey: [
|
|
58
|
+
"adminPreferences",
|
|
59
|
+
user?.id,
|
|
60
|
+
key
|
|
61
|
+
] });
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
//#endregion
|
|
67
|
+
export { getAdminPreferenceQueryKey, useSetAdminPreference };
|
|
68
|
+
//# sourceMappingURL=use-admin-preferences.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-admin-preferences.mjs","names":[],"sources":["../../../src/client/hooks/use-admin-preferences.ts"],"sourcesContent":["import {\n\tuseMutation,\n\tuseQuery,\n\tuseQueryClient,\n\tuseSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport { useAdminStore } from \"../runtime/provider.js\";\nimport { useCurrentUser } from \"./use-current-user.js\";\n\n// ============================================================================\n// Query Keys & Options\n// ============================================================================\n\n/**\n * Get query key for admin preference\n */\nexport function getAdminPreferenceQueryKey(\n\tuserId: string | undefined,\n\tkey: string,\n) {\n\treturn [\"adminPreferences\", userId, key] as const;\n}\n\n/**\n * Query options factory for admin preference.\n * Can be used with TanStack Query's prefetching or with useSuspenseQuery.\n *\n * @param client - CMS client instance\n * @param userId - User ID (required for query to work)\n * @param key - Preference key\n *\n * @example\n * ```ts\n * // Prefetch in loader\n * await queryClient.ensureQueryData(\n * getAdminPreferenceQueryOptions(client, userId, \"viewState:posts\")\n * );\n * ```\n */\nexport function getAdminPreferenceQueryOptions<T>(\n\tclient: any,\n\tuserId: string | undefined,\n\tkey: string,\n) {\n\treturn {\n\t\tqueryKey: getAdminPreferenceQueryKey(userId, key),\n\t\tqueryFn: async (): Promise<T | null> => {\n\t\t\tif (!userId) return null;\n\n\t\t\tconst result = await client.collections.adminPreferences.findOne({\n\t\t\t\twhere: { userId, key },\n\t\t\t});\n\n\t\t\treturn (result?.value as T) ?? null;\n\t\t},\n\t\tenabled: !!client && !!userId,\n\t\tstaleTime: 30 * 1000, // 30 seconds\n\t};\n}\n\n/**\n * Admin Preference entity from the database\n */\nexport interface AdminPreference<T = unknown> {\n\tid: string;\n\tuserId: string;\n\tkey: string;\n\tvalue: T;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\n/**\n * Hook to fetch a single admin preference by key\n *\n * @param key - Preference key (e.g., \"viewState:posts\")\n * @returns Query result with preference data or null if not found\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useAdminPreference<ViewConfiguration>(\"viewState:posts\");\n * if (isLoading) return <Loading />;\n * const viewConfig = data ?? defaultConfig;\n * ```\n */\nexport function useAdminPreference<T = unknown>(key: string) {\n\tconst client = useAdminStore((s) => s.client);\n\tconst user = useCurrentUser();\n\n\treturn useQuery({\n\t\tqueryKey: [\"adminPreferences\", user?.id, key],\n\t\tqueryFn: async (): Promise<T | null> => {\n\t\t\tif (!user?.id) return null;\n\n\t\t\tconst result = await client.collections.adminPreferences.findOne({\n\t\t\t\twhere: { userId: user.id, key },\n\t\t\t});\n\n\t\t\treturn (result?.value as T) ?? null;\n\t\t},\n\t\tenabled: !!client && !!user?.id,\n\t});\n}\n\n/**\n * Hook to set an admin preference\n *\n * Creates or updates the preference for the current user.\n *\n * @param key - Preference key (e.g., \"viewState:posts\")\n * @returns Mutation for setting the preference\n *\n * @example\n * ```tsx\n * const { mutate: setPreference, isPending } = useSetAdminPreference<ViewConfiguration>(\"viewState:posts\");\n *\n * const handleSave = () => {\n * setPreference(viewConfig);\n * };\n * ```\n */\nexport function useSetAdminPreference<T = unknown>(key: string) {\n\tconst client = useAdminStore((s) => s.client);\n\tconst user = useCurrentUser();\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: async (value: T) => {\n\t\t\tif (!user?.id) {\n\t\t\t\tthrow new Error(\"User must be logged in to save preferences\");\n\t\t\t}\n\n\t\t\tconst collections = client?.collections as\n\t\t\t\t| Record<string, any>\n\t\t\t\t| undefined;\n\t\t\tif (!collections?.adminPreferences) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"adminPreferences collection not available. Make sure to use adminModule in your CMS setup.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Try to find existing preference\n\t\t\tconst existing = await collections.adminPreferences.findOne({\n\t\t\t\twhere: { userId: user.id, key },\n\t\t\t});\n\n\t\t\tif (existing) {\n\t\t\t\t// Update existing\n\t\t\t\treturn collections.adminPreferences.update({\n\t\t\t\t\tid: existing.id,\n\t\t\t\t\tdata: { value },\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Create new\n\t\t\treturn collections.adminPreferences.create({\n\t\t\t\tuserId: user.id,\n\t\t\t\tkey,\n\t\t\t\tvalue,\n\t\t\t});\n\t\t},\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({\n\t\t\t\tqueryKey: [\"adminPreferences\", user?.id, key],\n\t\t\t});\n\t\t},\n\t});\n}\n\n/**\n * Hook to delete an admin preference\n *\n * @param key - Preference key (e.g., \"viewState:posts\")\n * @returns Mutation for deleting the preference\n *\n * @example\n * ```tsx\n * const { mutate: deletePreference } = useDeleteAdminPreference(\"viewState:posts\");\n *\n * const handleReset = () => {\n * deletePreference();\n * };\n * ```\n */\nexport function useDeleteAdminPreference(key: string) {\n\tconst client = useAdminStore((s) => s.client);\n\tconst user = useCurrentUser();\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: async () => {\n\t\t\tif (!user?.id) {\n\t\t\t\tthrow new Error(\"User must be logged in to delete preferences\");\n\t\t\t}\n\n\t\t\tconst collections = client?.collections as\n\t\t\t\t| Record<string, any>\n\t\t\t\t| undefined;\n\t\t\tif (!collections?.adminPreferences) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"adminPreferences collection not available. Make sure to use adminModule in your CMS setup.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Find existing preference\n\t\t\tconst existing = await collections.adminPreferences.findOne({\n\t\t\t\twhere: { userId: user.id, key },\n\t\t\t});\n\n\t\t\tif (existing) {\n\t\t\t\treturn collections.adminPreferences.delete({ id: existing.id });\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({\n\t\t\t\tqueryKey: [\"adminPreferences\", user?.id, key],\n\t\t\t});\n\t\t},\n\t});\n}\n\n// ============================================================================\n// Suspense Hook\n// ============================================================================\n\n/**\n * Suspense-enabled hook to fetch admin preference.\n *\n * Uses useSuspenseQuery so the component will suspend until data is loaded.\n * Must be used within a Suspense boundary and requires userId to be known.\n *\n * @param key - Preference key (e.g., \"viewState:posts\")\n * @param userId - User ID (must be available - use after session is loaded)\n *\n * @example\n * ```tsx\n * function ViewStateInner({ collection, userId }: Props) {\n * // This will suspend until preference is loaded\n * const { data: storedConfig } = useSuspenseAdminPreference<ViewConfiguration>(\n * `viewState:${collection}`,\n * userId\n * );\n *\n * // storedConfig is guaranteed to be loaded (may be null if not found)\n * }\n *\n * // Wrap with Suspense\n * <Suspense fallback={<Loading />}>\n * <ViewStateInner collection=\"posts\" userId={user.id} />\n * </Suspense>\n * ```\n */\nexport function useSuspenseAdminPreference<T = unknown>(\n\tkey: string,\n\tuserId: string,\n) {\n\tconst client = useAdminStore((s) => s.client);\n\n\treturn useSuspenseQuery<T | null>({\n\t\tqueryKey: getAdminPreferenceQueryKey(userId, key),\n\t\tqueryFn: async () => {\n\t\t\tconst result = await client.collections.adminPreferences.findOne({\n\t\t\t\twhere: { userId, key },\n\t\t\t});\n\n\t\t\treturn (result?.value as T) ?? null;\n\t\t},\n\t});\n}\n"],"mappings":";;;;;;;;AAgBA,SAAgB,2BACf,QACA,KACC;AACD,QAAO;EAAC;EAAoB;EAAQ;EAAI;;;;;;;;;;;;;;;;;;;AAqGzC,SAAgB,sBAAmC,KAAa;CAC/D,MAAM,SAAS,eAAe,MAAM,EAAE,OAAO;CAC7C,MAAM,OAAO,gBAAgB;CAC7B,MAAM,cAAc,gBAAgB;AAEpC,QAAO,YAAY;EAClB,YAAY,OAAO,UAAa;AAC/B,OAAI,CAAC,MAAM,GACV,OAAM,IAAI,MAAM,6CAA6C;GAG9D,MAAM,cAAc,QAAQ;AAG5B,OAAI,CAAC,aAAa,iBACjB,OAAM,IAAI,MACT,6FACA;GAIF,MAAM,WAAW,MAAM,YAAY,iBAAiB,QAAQ,EAC3D,OAAO;IAAE,QAAQ,KAAK;IAAI;IAAK,EAC/B,CAAC;AAEF,OAAI,SAEH,QAAO,YAAY,iBAAiB,OAAO;IAC1C,IAAI,SAAS;IACb,MAAM,EAAE,OAAO;IACf,CAAC;AAGH,UAAO,YAAY,iBAAiB,OAAO;IAC1C,QAAQ,KAAK;IACb;IACA;IACA,CAAC;;EAEH,iBAAiB;AAChB,eAAY,kBAAkB,EAC7B,UAAU;IAAC;IAAoB,MAAM;IAAI;IAAI,EAC7C,CAAC;;EAEH,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { selectAdmin, selectBasePath, selectNavigate, useAdminStore } from "../runtime/provider.mjs";
|
|
2
|
+
import { createAdminRoutes, createNavigator } from "../utils/routes.mjs";
|
|
3
|
+
import * as React$1 from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/client/hooks/use-admin-routes.ts
|
|
6
|
+
/**
|
|
7
|
+
* Hook for type-safe admin route navigation
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* function MyComponent() {
|
|
12
|
+
* const { toDashboard, toCollection, toCollectionEdit } = useAdminRoutes<AppCMS>()
|
|
13
|
+
*
|
|
14
|
+
* return (
|
|
15
|
+
* <div>
|
|
16
|
+
* <button onClick={toDashboard}>Dashboard</button>
|
|
17
|
+
* <button onClick={() => toCollection('posts')}>View Posts</button>
|
|
18
|
+
* <button onClick={() => toCollectionEdit('posts', '123')}>Edit Post</button>
|
|
19
|
+
* </div>
|
|
20
|
+
* )
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* // Get URLs without navigating
|
|
27
|
+
* function LinkList() {
|
|
28
|
+
* const { collectionUrl, globalUrl, pageUrl } = useAdminRoutes<AppCMS>()
|
|
29
|
+
*
|
|
30
|
+
* return (
|
|
31
|
+
* <nav>
|
|
32
|
+
* <a href={collectionUrl('posts')}>Posts</a>
|
|
33
|
+
* <a href={collectionUrl('users')}>Users</a>
|
|
34
|
+
* <a href={globalUrl('siteSettings')}>Settings</a>
|
|
35
|
+
* <a href={pageUrl('analytics') ?? '#'}>Analytics</a>
|
|
36
|
+
* </nav>
|
|
37
|
+
* )
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
function useAdminRoutes(options = {}) {
|
|
42
|
+
const admin = useAdminStore(selectAdmin);
|
|
43
|
+
const storeBasePath = useAdminStore(selectBasePath);
|
|
44
|
+
const storeNavigate = useAdminStore(selectNavigate);
|
|
45
|
+
const basePath = options.basePath ?? storeBasePath;
|
|
46
|
+
const routes = React$1.useMemo(() => createAdminRoutes(admin, { basePath }), [admin, basePath]);
|
|
47
|
+
const navigate = storeNavigate;
|
|
48
|
+
const nav = React$1.useMemo(() => createNavigator(routes, navigate), [routes, navigate]);
|
|
49
|
+
return {
|
|
50
|
+
routes,
|
|
51
|
+
toDashboard: nav.dashboard,
|
|
52
|
+
toCollection: nav.collection,
|
|
53
|
+
toCollectionCreate: nav.collectionCreate,
|
|
54
|
+
toCollectionEdit: nav.collectionEdit,
|
|
55
|
+
toGlobal: nav.global,
|
|
56
|
+
toPage: nav.page,
|
|
57
|
+
dashboardUrl: routes.dashboard,
|
|
58
|
+
collectionUrl: routes.collections.list,
|
|
59
|
+
collectionCreateUrl: routes.collections.create,
|
|
60
|
+
collectionEditUrl: routes.collections.edit,
|
|
61
|
+
globalUrl: routes.globals.edit,
|
|
62
|
+
pageUrl: routes.pages.byId,
|
|
63
|
+
allPageUrls: routes.pages.all,
|
|
64
|
+
parse: routes.parse,
|
|
65
|
+
matches: routes.matches
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get href for admin link props
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```tsx
|
|
73
|
+
* function AdminLink<TApp extends Questpie<any>>(
|
|
74
|
+
* props: AdminLinkProps<TApp> & { children: React.ReactNode }
|
|
75
|
+
* ) {
|
|
76
|
+
* const { routes } = useAdminRoutes<TApp>()
|
|
77
|
+
* const href = getAdminLinkHref(routes, props)
|
|
78
|
+
* return <a href={href}>{props.children}</a>
|
|
79
|
+
* }
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
function getAdminLinkHref(routes, props) {
|
|
83
|
+
if (props.to === "dashboard") return routes.dashboard();
|
|
84
|
+
if (props.collection) {
|
|
85
|
+
const action = props.action ?? "list";
|
|
86
|
+
if (action === "create") return routes.collections.create(props.collection);
|
|
87
|
+
if (action === "edit" && props.id) return routes.collections.edit(props.collection, props.id);
|
|
88
|
+
return routes.collections.list(props.collection);
|
|
89
|
+
}
|
|
90
|
+
if (props.global) return routes.globals.edit(props.global);
|
|
91
|
+
if (props.pageId) return routes.pages.byId(props.pageId) ?? routes.dashboard();
|
|
92
|
+
return routes.dashboard();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
//#endregion
|
|
96
|
+
export { getAdminLinkHref, useAdminRoutes };
|
|
97
|
+
//# sourceMappingURL=use-admin-routes.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-admin-routes.mjs","names":["React"],"sources":["../../../src/client/hooks/use-admin-routes.ts"],"sourcesContent":["/**\n * useAdminRoutes Hook\n *\n * React hook for type-safe admin route navigation.\n * Uses the AdminProvider context to get the current admin configuration.\n */\n\nimport type { Questpie } from \"questpie\";\nimport * as React from \"react\";\nimport {\n selectAdmin,\n selectBasePath,\n selectNavigate,\n useAdminStore,\n} from \"../runtime\";\nimport {\n type AdminRoutes,\n type CollectionNames,\n createAdminRoutes,\n createNavigator,\n type GlobalNames,\n} from \"../utils/routes\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UseAdminRoutesOptions {\n /** Override the base path (default: from context or \"/admin\") */\n basePath?: string;\n}\n\nexport interface UseAdminRoutesResult<TApp extends Questpie<any>> {\n /** Routes builder */\n routes: AdminRoutes<TApp>;\n\n /** Navigate to dashboard */\n toDashboard: () => void;\n\n /** Navigate to collection list */\n toCollection: <K extends CollectionNames<TApp>>(collection: K) => void;\n\n /** Navigate to collection create */\n toCollectionCreate: <K extends CollectionNames<TApp>>(collection: K) => void;\n\n /** Navigate to collection edit */\n toCollectionEdit: <K extends CollectionNames<TApp>>(\n collection: K,\n id: string,\n ) => void;\n\n /** Navigate to global edit */\n toGlobal: <K extends GlobalNames<TApp>>(global: K) => void;\n\n /** Navigate to custom page */\n toPage: (pageId: string) => void;\n\n /** Get dashboard URL */\n dashboardUrl: () => string;\n\n /** Get collection list URL */\n collectionUrl: <K extends CollectionNames<TApp>>(collection: K) => string;\n\n /** Get collection create URL */\n collectionCreateUrl: <K extends CollectionNames<TApp>>(\n collection: K,\n ) => string;\n\n /** Get collection edit URL */\n collectionEditUrl: <K extends CollectionNames<TApp>>(\n collection: K,\n id: string,\n ) => string;\n\n /** Get global edit URL */\n globalUrl: <K extends GlobalNames<TApp>>(global: K) => string;\n\n /** Get custom page URL */\n pageUrl: (pageId: string) => string | null;\n\n /** Get all page URLs */\n allPageUrls: () => Record<string, string>;\n\n /** Parse current pathname */\n parse: AdminRoutes<TApp>[\"parse\"];\n\n /** Check if pathname matches */\n matches: AdminRoutes<TApp>[\"matches\"];\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for type-safe admin route navigation\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { toDashboard, toCollection, toCollectionEdit } = useAdminRoutes<AppCMS>()\n *\n * return (\n * <div>\n * <button onClick={toDashboard}>Dashboard</button>\n * <button onClick={() => toCollection('posts')}>View Posts</button>\n * <button onClick={() => toCollectionEdit('posts', '123')}>Edit Post</button>\n * </div>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Get URLs without navigating\n * function LinkList() {\n * const { collectionUrl, globalUrl, pageUrl } = useAdminRoutes<AppCMS>()\n *\n * return (\n * <nav>\n * <a href={collectionUrl('posts')}>Posts</a>\n * <a href={collectionUrl('users')}>Users</a>\n * <a href={globalUrl('siteSettings')}>Settings</a>\n * <a href={pageUrl('analytics') ?? '#'}>Analytics</a>\n * </nav>\n * )\n * }\n * ```\n */\nexport function useAdminRoutes<TApp extends Questpie<any>>(\n options: UseAdminRoutesOptions = {},\n): UseAdminRoutesResult<TApp> {\n const admin = useAdminStore(selectAdmin);\n const storeBasePath = useAdminStore(selectBasePath);\n const storeNavigate = useAdminStore(selectNavigate);\n\n const basePath = options.basePath ?? storeBasePath;\n\n // Create routes builder (memoized)\n const routes = React.useMemo(\n () => createAdminRoutes<TApp>(admin, { basePath }),\n [admin, basePath],\n );\n\n // Get navigate function from store\n const navigate = storeNavigate;\n\n // Create navigator (memoized)\n const nav = React.useMemo(\n () => createNavigator(routes, navigate),\n [routes, navigate],\n );\n\n return {\n routes,\n\n // Navigation functions\n toDashboard: nav.dashboard,\n toCollection: nav.collection,\n toCollectionCreate: nav.collectionCreate,\n toCollectionEdit: nav.collectionEdit,\n toGlobal: nav.global,\n toPage: nav.page,\n\n // URL getters\n dashboardUrl: routes.dashboard,\n collectionUrl: routes.collections.list,\n collectionCreateUrl: routes.collections.create,\n collectionEditUrl: routes.collections.edit,\n globalUrl: routes.globals.edit,\n pageUrl: routes.pages.byId,\n allPageUrls: routes.pages.all,\n\n // Parsing & matching\n parse: routes.parse,\n matches: routes.matches,\n };\n}\n\n// ============================================================================\n// Standalone Hook (no context required)\n// ============================================================================\n\n/**\n * Hook for type-safe admin routes without requiring AdminProvider context\n *\n * @example\n * ```tsx\n * import { barbershopAdmin } from './configs/admin'\n *\n * function MyComponent() {\n * const navigate = useNavigate() // from your router\n * const { routes, go } = useAdminRoutesStandalone({\n * admin: barbershopAdmin,\n * basePath: '/admin',\n * navigate,\n * })\n *\n * return <button onClick={go.dashboard}>Dashboard</button>\n * }\n * ```\n */\nexport function useAdminRoutesStandalone<TApp extends Questpie<any>>(options: {\n admin: import(\"../builder/admin\").Admin;\n basePath?: string;\n navigate: (path: string) => void;\n}) {\n const { admin, basePath = \"/admin\", navigate } = options;\n\n const routes = React.useMemo(\n () => createAdminRoutes<TApp>(admin, { basePath }),\n [admin, basePath],\n );\n\n const go = React.useMemo(\n () => createNavigator(routes, navigate),\n [routes, navigate],\n );\n\n return { routes, go };\n}\n\n// ============================================================================\n// Link Component Helper\n// ============================================================================\n\n/**\n * Props for admin link components\n */\nexport interface AdminLinkProps<TApp extends Questpie<any>> {\n /** Link to dashboard */\n to?: \"dashboard\";\n /** Link to collection */\n collection?: CollectionNames<TApp>;\n /** Collection action */\n action?: \"list\" | \"create\" | \"edit\";\n /** Item ID for edit action */\n id?: string;\n /** Link to global */\n global?: GlobalNames<TApp>;\n /** Link to custom page by ID */\n pageId?: string;\n}\n\n/**\n * Get href for admin link props\n *\n * @example\n * ```tsx\n * function AdminLink<TApp extends Questpie<any>>(\n * props: AdminLinkProps<TApp> & { children: React.ReactNode }\n * ) {\n * const { routes } = useAdminRoutes<TApp>()\n * const href = getAdminLinkHref(routes, props)\n * return <a href={href}>{props.children}</a>\n * }\n * ```\n */\nexport function getAdminLinkHref<TApp extends Questpie<any>>(\n routes: AdminRoutes<TApp>,\n props: AdminLinkProps<TApp>,\n): string {\n if (props.to === \"dashboard\") {\n return routes.dashboard();\n }\n\n if (props.collection) {\n const action = props.action ?? \"list\";\n if (action === \"create\") {\n return routes.collections.create(props.collection);\n }\n if (action === \"edit\" && props.id) {\n return routes.collections.edit(props.collection, props.id);\n }\n return routes.collections.list(props.collection);\n }\n\n if (props.global) {\n return routes.globals.edit(props.global);\n }\n\n if (props.pageId) {\n return routes.pages.byId(props.pageId) ?? routes.dashboard();\n }\n\n return routes.dashboard();\n}\n\nexport default useAdminRoutes;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiIA,SAAgB,eACd,UAAiC,EAAE,EACP;CAC5B,MAAM,QAAQ,cAAc,YAAY;CACxC,MAAM,gBAAgB,cAAc,eAAe;CACnD,MAAM,gBAAgB,cAAc,eAAe;CAEnD,MAAM,WAAW,QAAQ,YAAY;CAGrC,MAAM,SAASA,QAAM,cACb,kBAAwB,OAAO,EAAE,UAAU,CAAC,EAClD,CAAC,OAAO,SAAS,CAClB;CAGD,MAAM,WAAW;CAGjB,MAAM,MAAMA,QAAM,cACV,gBAAgB,QAAQ,SAAS,EACvC,CAAC,QAAQ,SAAS,CACnB;AAED,QAAO;EACL;EAGA,aAAa,IAAI;EACjB,cAAc,IAAI;EAClB,oBAAoB,IAAI;EACxB,kBAAkB,IAAI;EACtB,UAAU,IAAI;EACd,QAAQ,IAAI;EAGZ,cAAc,OAAO;EACrB,eAAe,OAAO,YAAY;EAClC,qBAAqB,OAAO,YAAY;EACxC,mBAAmB,OAAO,YAAY;EACtC,WAAW,OAAO,QAAQ;EAC1B,SAAS,OAAO,MAAM;EACtB,aAAa,OAAO,MAAM;EAG1B,OAAO,OAAO;EACd,SAAS,OAAO;EACjB;;;;;;;;;;;;;;;;AAkFH,SAAgB,iBACd,QACA,OACQ;AACR,KAAI,MAAM,OAAO,YACf,QAAO,OAAO,WAAW;AAG3B,KAAI,MAAM,YAAY;EACpB,MAAM,SAAS,MAAM,UAAU;AAC/B,MAAI,WAAW,SACb,QAAO,OAAO,YAAY,OAAO,MAAM,WAAW;AAEpD,MAAI,WAAW,UAAU,MAAM,GAC7B,QAAO,OAAO,YAAY,KAAK,MAAM,YAAY,MAAM,GAAG;AAE5D,SAAO,OAAO,YAAY,KAAK,MAAM,WAAW;;AAGlD,KAAI,MAAM,OACR,QAAO,OAAO,QAAQ,KAAK,MAAM,OAAO;AAG1C,KAAI,MAAM,OACR,QAAO,OAAO,MAAM,KAAK,MAAM,OAAO,IAAI,OAAO,WAAW;AAG9D,QAAO,OAAO,WAAW"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { createAuthClient } from "better-auth/react";
|
|
2
|
+
import { Questpie } from "questpie";
|
|
3
|
+
import { BetterAuthOptions } from "better-auth";
|
|
4
|
+
|
|
5
|
+
//#region src/client/hooks/use-auth.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Extract auth options type from Questpie instance
|
|
9
|
+
*/
|
|
10
|
+
type ExtractAuthOptions<T extends Questpie<any>> = T extends Questpie<infer TConfig> ? TConfig["auth"] extends BetterAuthOptions ? TConfig["auth"] : BetterAuthOptions : BetterAuthOptions;
|
|
11
|
+
/**
|
|
12
|
+
* Options for creating admin auth client
|
|
13
|
+
*/
|
|
14
|
+
type AdminAuthClientOptions = {
|
|
15
|
+
/**
|
|
16
|
+
* Base URL of the CMS API
|
|
17
|
+
* @example 'http://localhost:3000'
|
|
18
|
+
*/
|
|
19
|
+
baseURL: string;
|
|
20
|
+
/**
|
|
21
|
+
* Base path for auth routes
|
|
22
|
+
* @default '/cms/auth'
|
|
23
|
+
*/
|
|
24
|
+
basePath?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Custom fetch implementation
|
|
27
|
+
*/
|
|
28
|
+
fetchOptions?: {
|
|
29
|
+
credentials?: RequestCredentials;
|
|
30
|
+
headers?: Record<string, string>;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Internal client options type that includes $InferAuth
|
|
35
|
+
*/
|
|
36
|
+
type InternalClientOptions<T extends Questpie<any>> = {
|
|
37
|
+
baseURL: string;
|
|
38
|
+
fetchOptions?: {
|
|
39
|
+
credentials?: RequestCredentials;
|
|
40
|
+
headers?: Record<string, string>;
|
|
41
|
+
};
|
|
42
|
+
$InferAuth: ExtractAuthOptions<T>;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Create a type-safe Better Auth client for the admin UI
|
|
46
|
+
*
|
|
47
|
+
* The returned client includes full type inference from your CMS auth configuration:
|
|
48
|
+
* - `useSession()` - React hook for session state (typed based on your user/session schema)
|
|
49
|
+
* - `signIn` methods (email, social providers configured in CMS)
|
|
50
|
+
* - `signOut` - Sign out the current user
|
|
51
|
+
* - `signUp` - Register new users
|
|
52
|
+
* - Plugin-specific hooks (e.g., `useListAccounts` for admin plugin)
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```tsx
|
|
56
|
+
* import { createAdminAuthClient } from '@questpie/admin/hooks'
|
|
57
|
+
* import type { cms } from './server/cms'
|
|
58
|
+
*
|
|
59
|
+
* // Create client with type inference from your CMS
|
|
60
|
+
* export const authClient = createAdminAuthClient<typeof cms>({
|
|
61
|
+
* baseURL: 'http://localhost:3000'
|
|
62
|
+
* })
|
|
63
|
+
*
|
|
64
|
+
* // Session data is fully typed based on your CMS auth config
|
|
65
|
+
* function App() {
|
|
66
|
+
* const { data: session, isPending } = authClient.useSession()
|
|
67
|
+
*
|
|
68
|
+
* if (isPending) return <Loading />
|
|
69
|
+
* if (!session) return <LoginPage authClient={authClient} />
|
|
70
|
+
*
|
|
71
|
+
* // session.user has all fields from your user schema
|
|
72
|
+
* return <AdminDashboard user={session.user} />
|
|
73
|
+
* }
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
declare function createAdminAuthClient<T extends Questpie<any>>(options: AdminAuthClientOptions): ReturnType<typeof createAuthClient<InternalClientOptions<T>>>;
|
|
77
|
+
/**
|
|
78
|
+
* Hook to access the auth client from AdminProvider context.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```tsx
|
|
82
|
+
* import { useAuthClient } from '@questpie/admin/hooks'
|
|
83
|
+
*
|
|
84
|
+
* function LoginPage() {
|
|
85
|
+
* const authClient = useAuthClient()
|
|
86
|
+
*
|
|
87
|
+
* const handleLogin = async (email: string, password: string) => {
|
|
88
|
+
* await authClient.signIn.email({ email, password })
|
|
89
|
+
* }
|
|
90
|
+
*
|
|
91
|
+
* return <LoginForm onSubmit={handleLogin} />
|
|
92
|
+
* }
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
declare function useAuthClient<T = any>(): T;
|
|
96
|
+
//#endregion
|
|
97
|
+
export { createAdminAuthClient, useAuthClient };
|
|
98
|
+
//# sourceMappingURL=use-auth.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-auth.d.mts","names":[],"sources":["../../../src/client/hooks/use-auth.ts"],"sourcesContent":[],"mappings":";;;;;;AAiMA;;;KA7JK,6BAA6B,iBAChC,UAAU,0BACN,wBAAwB,oBACtB,kBACA,oBACF;;;;KAKM,sBAAA;;;;;;;;;;;;;;;kBAiBM;cACJ;;;;;;KAOT,gCAAgC;;;kBAGnB;cACJ;;cAEA,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmCjB,gCAAgC,wBACrC,yBACR,kBAAkB,iBAAiB,sBAAsB;;;;;;;;;;;;;;;;;;;iBA+E5C,0BAA0B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { selectAuthClient, useAdminStore } from "../runtime/provider.mjs";
|
|
2
2
|
import { createAuthClient } from "better-auth/react";
|
|
3
3
|
|
|
4
4
|
//#region src/client/hooks/use-auth.ts
|
|
@@ -84,5 +84,5 @@ function useAuthClientSafe() {
|
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
//#endregion
|
|
87
|
-
export { useAuthClient
|
|
88
|
-
//# sourceMappingURL=use-auth
|
|
87
|
+
export { createAdminAuthClient, useAuthClient, useAuthClientSafe };
|
|
88
|
+
//# sourceMappingURL=use-auth.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-auth.mjs","names":[],"sources":["../../../src/client/hooks/use-auth.ts"],"sourcesContent":["/**\n * Auth client utilities for admin package\n *\n * Better Auth handles all auth state management internally.\n * This module provides type-safe client creation helpers with\n * full type inference from your CMS auth configuration.\n *\n * @example\n * ```tsx\n * // In your app, create the auth client once:\n * import { createAdminAuthClient } from '@questpie/admin/hooks'\n * import type { cms } from './server/cms'\n *\n * export const authClient = createAdminAuthClient<typeof cms>({\n * baseURL: 'http://localhost:3000'\n * })\n *\n * // Then use the built-in hooks:\n * function MyComponent() {\n * const { data: session, isPending, error } = authClient.useSession()\n *\n * if (isPending) return <div>Loading...</div>\n * if (!session) return <LoginForm />\n *\n * return <div>Welcome {session.user.name}</div>\n * }\n * ```\n */\n\nimport type { BetterAuthOptions } from \"better-auth\";\nimport { createAuthClient } from \"better-auth/react\";\nimport type { Questpie } from \"questpie\";\n\n/**\n * Extract auth options type from Questpie instance\n */\ntype ExtractAuthOptions<T extends Questpie<any>> =\n T extends Questpie<infer TConfig>\n ? TConfig[\"auth\"] extends BetterAuthOptions\n ? TConfig[\"auth\"]\n : BetterAuthOptions\n : BetterAuthOptions;\n\n/**\n * Options for creating admin auth client\n */\nexport type AdminAuthClientOptions = {\n /**\n * Base URL of the CMS API\n * @example 'http://localhost:3000'\n */\n baseURL: string;\n\n /**\n * Base path for auth routes\n * @default '/cms/auth'\n */\n basePath?: string;\n\n /**\n * Custom fetch implementation\n */\n fetchOptions?: {\n credentials?: RequestCredentials;\n headers?: Record<string, string>;\n };\n};\n\n/**\n * Internal client options type that includes $InferAuth\n */\ntype InternalClientOptions<T extends Questpie<any>> = {\n baseURL: string;\n fetchOptions?: {\n credentials?: RequestCredentials;\n headers?: Record<string, string>;\n };\n $InferAuth: ExtractAuthOptions<T>;\n};\n\n/**\n * Create a type-safe Better Auth client for the admin UI\n *\n * The returned client includes full type inference from your CMS auth configuration:\n * - `useSession()` - React hook for session state (typed based on your user/session schema)\n * - `signIn` methods (email, social providers configured in CMS)\n * - `signOut` - Sign out the current user\n * - `signUp` - Register new users\n * - Plugin-specific hooks (e.g., `useListAccounts` for admin plugin)\n *\n * @example\n * ```tsx\n * import { createAdminAuthClient } from '@questpie/admin/hooks'\n * import type { cms } from './server/cms'\n *\n * // Create client with type inference from your CMS\n * export const authClient = createAdminAuthClient<typeof cms>({\n * baseURL: 'http://localhost:3000'\n * })\n *\n * // Session data is fully typed based on your CMS auth config\n * function App() {\n * const { data: session, isPending } = authClient.useSession()\n *\n * if (isPending) return <Loading />\n * if (!session) return <LoginPage authClient={authClient} />\n *\n * // session.user has all fields from your user schema\n * return <AdminDashboard user={session.user} />\n * }\n * ```\n */\nexport function createAdminAuthClient<T extends Questpie<any>>(\n options: AdminAuthClientOptions,\n): ReturnType<typeof createAuthClient<InternalClientOptions<T>>> {\n const basePath = options.basePath ?? \"/cms/auth\";\n\n return createAuthClient<InternalClientOptions<T>>({\n baseURL: `${options.baseURL}${basePath}`,\n fetchOptions: {\n credentials: options.fetchOptions?.credentials ?? \"include\",\n headers: options.fetchOptions?.headers,\n },\n } as InternalClientOptions<T>);\n}\n\n/**\n * Type helper to extract auth client type from CMS instance\n *\n * @example\n * ```tsx\n * import type { AdminAuthClient } from '@questpie/admin/hooks'\n * import type { cms } from './server/cms'\n *\n * type MyAuthClient = AdminAuthClient<typeof cms>\n * ```\n */\nexport type AdminAuthClient<T extends Questpie<any>> = ReturnType<\n typeof createAdminAuthClient<T>\n>;\n\n/**\n * Type helper to extract session type from auth client\n *\n * @example\n * ```tsx\n * import type { AdminSession } from '@questpie/admin/hooks'\n * import type { cms } from './server/cms'\n *\n * type MySession = AdminSession<typeof cms>\n * // Includes: { user: { id, email, name, role, ... }, session: { ... } }\n * ```\n */\nexport type AdminSession<T extends Questpie<any>> =\n AdminAuthClient<T>[\"$Infer\"][\"Session\"];\n\n/**\n * Type helper to extract user type from CMS auth configuration\n *\n * @example\n * ```tsx\n * import type { AdminUser } from '@questpie/admin/hooks'\n * import type { cms } from './server/cms'\n *\n * type MyUser = AdminUser<typeof cms>\n * ```\n */\nexport type AdminUser<T extends Questpie<any>> = AdminSession<T>[\"user\"];\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nimport { selectAuthClient, useAdminStore } from \"../runtime/provider\";\n\n/**\n * Hook to access the auth client from AdminProvider context.\n *\n * @example\n * ```tsx\n * import { useAuthClient } from '@questpie/admin/hooks'\n *\n * function LoginPage() {\n * const authClient = useAuthClient()\n *\n * const handleLogin = async (email: string, password: string) => {\n * await authClient.signIn.email({ email, password })\n * }\n *\n * return <LoginForm onSubmit={handleLogin} />\n * }\n * ```\n */\nexport function useAuthClient<T = any>(): T {\n const authClient = useAdminStore(selectAuthClient);\n if (!authClient) {\n throw new Error(\n \"useAuthClient: authClient is not provided. \" +\n \"Make sure to pass authClient to AdminProvider.\",\n );\n }\n return authClient as T;\n}\n\n/**\n * Hook to access the auth client from AdminProvider context.\n * Returns null if authClient is not provided (safe version).\n *\n * @example\n * ```tsx\n * const authClient = useAuthClientSafe()\n * if (!authClient) {\n * return <div>Auth not configured</div>\n * }\n * ```\n */\nexport function useAuthClientSafe<T = any>(): T | null {\n return useAdminStore(selectAuthClient) as T | null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgHA,SAAgB,sBACd,SAC+D;CAC/D,MAAM,WAAW,QAAQ,YAAY;AAErC,QAAO,iBAA2C;EAChD,SAAS,GAAG,QAAQ,UAAU;EAC9B,cAAc;GACZ,aAAa,QAAQ,cAAc,eAAe;GAClD,SAAS,QAAQ,cAAc;GAChC;EACF,CAA6B;;;;;;;;;;;;;;;;;;;;AAsEhC,SAAgB,gBAA4B;CAC1C,MAAM,aAAa,cAAc,iBAAiB;AAClD,KAAI,CAAC,WACH,OAAM,IAAI,MACR,4FAED;AAEH,QAAO;;;;;;;;;;;;;;AAeT,SAAgB,oBAAuC;AACrD,QAAO,cAAc,iBAAiB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { selectAdmin, useAdminStore } from "../runtime/provider.mjs";
|
|
2
|
+
import { buildFieldDefinitionsFromSchema } from "../utils/build-field-definitions-from-schema.mjs";
|
|
3
|
+
import { useCollectionSchema } from "./use-collection-schema.mjs";
|
|
4
|
+
import { useMemo } from "react";
|
|
5
|
+
|
|
6
|
+
//#region src/client/hooks/use-collection-fields.ts
|
|
7
|
+
function useCollectionFields(collection, options = {}) {
|
|
8
|
+
const admin = useAdminStore(selectAdmin);
|
|
9
|
+
const { data: schema, isLoading, error } = useCollectionSchema(collection, options.schemaQueryOptions);
|
|
10
|
+
return {
|
|
11
|
+
fields: useMemo(() => {
|
|
12
|
+
const fallback = options.fallbackFields ?? {};
|
|
13
|
+
if (!schema || !admin) return fallback;
|
|
14
|
+
return {
|
|
15
|
+
...buildFieldDefinitionsFromSchema(schema, admin.getFields(), options.buildOptions),
|
|
16
|
+
...fallback
|
|
17
|
+
};
|
|
18
|
+
}, [
|
|
19
|
+
schema,
|
|
20
|
+
admin,
|
|
21
|
+
options.buildOptions,
|
|
22
|
+
options.fallbackFields
|
|
23
|
+
]),
|
|
24
|
+
schema,
|
|
25
|
+
isLoading,
|
|
26
|
+
error
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//#endregion
|
|
31
|
+
export { useCollectionFields };
|
|
32
|
+
//# sourceMappingURL=use-collection-fields.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-collection-fields.mjs","names":[],"sources":["../../../src/client/hooks/use-collection-fields.ts"],"sourcesContent":["/**\n * Hook for resolving field definitions from collection schema\n *\n * Builds FieldDefinition objects from server introspection schema\n * and merges with any local overrides.\n */\n\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { CollectionSchema } from \"questpie\";\nimport { useMemo } from \"react\";\nimport type { FieldDefinition } from \"../builder/field/field\";\nimport { selectAdmin, useAdminStore } from \"../runtime\";\nimport {\n type BuildFieldDefinitionsOptions,\n buildFieldDefinitionsFromSchema,\n} from \"../utils/build-field-definitions-from-schema\";\nimport { useCollectionSchema } from \"./use-collection-schema\";\n\nexport interface UseCollectionFieldsOptions {\n /**\n * React Query options for schema fetching\n */\n schemaQueryOptions?: Omit<\n UseQueryOptions<CollectionSchema>,\n \"queryKey\" | \"queryFn\"\n >;\n /**\n * Options for building field definitions from schema\n */\n buildOptions?: BuildFieldDefinitionsOptions;\n /**\n * Local field definitions to merge as overrides\n */\n fallbackFields?: Record<string, FieldDefinition>;\n}\n\nexport function useCollectionFields(\n collection: string,\n options: UseCollectionFieldsOptions = {},\n) {\n const admin = useAdminStore(selectAdmin);\n const {\n data: schema,\n isLoading,\n error,\n } = useCollectionSchema(collection, options.schemaQueryOptions);\n\n const fields = useMemo(() => {\n const fallback = options.fallbackFields ?? {};\n if (!schema || !admin) {\n return fallback;\n }\n\n const registry = admin.getFields() as Record<string, any>;\n const schemaFields = buildFieldDefinitionsFromSchema(\n schema,\n registry,\n options.buildOptions,\n );\n\n return {\n ...schemaFields,\n ...fallback,\n };\n }, [schema, admin, options.buildOptions, options.fallbackFields]);\n\n return { fields, schema, isLoading, error };\n}\n"],"mappings":";;;;;;AAoCA,SAAgB,oBACd,YACA,UAAsC,EAAE,EACxC;CACA,MAAM,QAAQ,cAAc,YAAY;CACxC,MAAM,EACJ,MAAM,QACN,WACA,UACE,oBAAoB,YAAY,QAAQ,mBAAmB;AAqB/D,QAAO;EAAE,QAnBM,cAAc;GAC3B,MAAM,WAAW,QAAQ,kBAAkB,EAAE;AAC7C,OAAI,CAAC,UAAU,CAAC,MACd,QAAO;AAUT,UAAO;IACL,GAPmB,gCACnB,QAFe,MAAM,WAAW,EAIhC,QAAQ,aACT;IAIC,GAAG;IACJ;KACA;GAAC;GAAQ;GAAO,QAAQ;GAAc,QAAQ;GAAe,CAAC;EAEhD;EAAQ;EAAW;EAAO"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { selectClient, useAdminStore } from "../runtime/provider.mjs";
|
|
2
|
+
import { useQuery, useSuspenseQuery } from "@tanstack/react-query";
|
|
3
|
+
|
|
4
|
+
//#region src/client/hooks/use-collection-meta.ts
|
|
5
|
+
/**
|
|
6
|
+
* Hook for fetching collection metadata from the backend
|
|
7
|
+
*
|
|
8
|
+
* Used to get introspection info about collections like:
|
|
9
|
+
* - Title field configuration (which field to display first)
|
|
10
|
+
* - Whether timestamps are enabled
|
|
11
|
+
* - Whether soft delete is enabled
|
|
12
|
+
* - Localized fields
|
|
13
|
+
* - Virtual fields
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Hook to fetch collection metadata from the backend
|
|
17
|
+
*
|
|
18
|
+
* Returns introspection info useful for building dynamic UIs:
|
|
19
|
+
* - title.fieldName: The field to use as display title (instead of _title)
|
|
20
|
+
* - title.type: "field" (sortable) or "virtual" (computed)
|
|
21
|
+
* - timestamps: Whether createdAt/updatedAt are enabled
|
|
22
|
+
* - softDelete: Whether soft delete is enabled
|
|
23
|
+
* - localizedFields: Fields that support i18n
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* const { data: meta } = useCollectionMeta("posts");
|
|
28
|
+
*
|
|
29
|
+
* // Use title.fieldName instead of _title for first column
|
|
30
|
+
* const firstColumn = meta?.title.fieldName || "_title";
|
|
31
|
+
*
|
|
32
|
+
* // Only show timestamps columns if enabled
|
|
33
|
+
* if (meta?.timestamps) {
|
|
34
|
+
* columns.push("createdAt", "updatedAt");
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
function useCollectionMeta(collection, queryOptions) {
|
|
39
|
+
const client = useAdminStore(selectClient);
|
|
40
|
+
return useQuery({
|
|
41
|
+
queryKey: [
|
|
42
|
+
"questpie",
|
|
43
|
+
"collections",
|
|
44
|
+
collection,
|
|
45
|
+
"meta"
|
|
46
|
+
],
|
|
47
|
+
queryFn: async () => {
|
|
48
|
+
return client.collections[collection].meta();
|
|
49
|
+
},
|
|
50
|
+
staleTime: 300 * 1e3,
|
|
51
|
+
gcTime: 1800 * 1e3,
|
|
52
|
+
...queryOptions
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Query key for collection meta
|
|
57
|
+
* Useful for prefetching or invalidation
|
|
58
|
+
*/
|
|
59
|
+
function getCollectionMetaQueryKey(collection) {
|
|
60
|
+
return [
|
|
61
|
+
"questpie",
|
|
62
|
+
"collections",
|
|
63
|
+
collection,
|
|
64
|
+
"meta"
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Query options factory for collection metadata.
|
|
69
|
+
* Can be used with TanStack Query's prefetching in loaders or with useSuspenseQuery.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* // In TanStack Start loader
|
|
74
|
+
* export const Route = createFileRoute("/admin/collections/:name")({
|
|
75
|
+
* loader: async ({ context, params }) => {
|
|
76
|
+
* await context.queryClient.ensureQueryData(
|
|
77
|
+
* getCollectionMetaQueryOptions(params.name, context.client)
|
|
78
|
+
* );
|
|
79
|
+
* },
|
|
80
|
+
* });
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
function getCollectionMetaQueryOptions(collection, client) {
|
|
84
|
+
return {
|
|
85
|
+
queryKey: getCollectionMetaQueryKey(collection),
|
|
86
|
+
queryFn: async () => {
|
|
87
|
+
return client.collections[collection].meta();
|
|
88
|
+
},
|
|
89
|
+
staleTime: 300 * 1e3,
|
|
90
|
+
gcTime: 1800 * 1e3
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Suspense-enabled hook to fetch collection metadata.
|
|
95
|
+
*
|
|
96
|
+
* Uses useSuspenseQuery so the component will suspend until data is loaded.
|
|
97
|
+
* Must be used within a Suspense boundary.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```tsx
|
|
101
|
+
* function TableViewInner({ collection }: Props) {
|
|
102
|
+
* // This will suspend until meta is loaded
|
|
103
|
+
* const { data: meta } = useSuspenseCollectionMeta(collection);
|
|
104
|
+
*
|
|
105
|
+
* // meta is guaranteed to be defined here
|
|
106
|
+
* const titleField = meta.title.fieldName;
|
|
107
|
+
* }
|
|
108
|
+
*
|
|
109
|
+
* // Wrap with Suspense
|
|
110
|
+
* <Suspense fallback={<Loading />}>
|
|
111
|
+
* <TableViewInner collection="posts" />
|
|
112
|
+
* </Suspense>
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
function useSuspenseCollectionMeta(collection) {
|
|
116
|
+
return useSuspenseQuery(getCollectionMetaQueryOptions(collection, useAdminStore(selectClient)));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
//#endregion
|
|
120
|
+
export { useCollectionMeta, useSuspenseCollectionMeta };
|
|
121
|
+
//# sourceMappingURL=use-collection-meta.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-collection-meta.mjs","names":[],"sources":["../../../src/client/hooks/use-collection-meta.ts"],"sourcesContent":["/**\n * Hook for fetching collection metadata from the backend\n *\n * Used to get introspection info about collections like:\n * - Title field configuration (which field to display first)\n * - Whether timestamps are enabled\n * - Whether soft delete is enabled\n * - Localized fields\n * - Virtual fields\n */\n\nimport {\n\ttype UseQueryOptions,\n\tuseQuery,\n\tuseSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport type { Questpie } from \"questpie\";\nimport type { CollectionMeta } from \"questpie/client\";\nimport type {\n\tRegisteredCMS,\n\tRegisteredCollectionNames,\n} from \"../builder/registry\";\nimport { selectClient, useAdminStore } from \"../runtime\";\n\n// ============================================================================\n// Type Helpers\n// ============================================================================\n\n/**\n * Resolved collection names (string if not registered)\n */\ntype ResolvedCollectionNames =\n\tRegisteredCMS extends Questpie<any> ? RegisteredCollectionNames : string;\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to fetch collection metadata from the backend\n *\n * Returns introspection info useful for building dynamic UIs:\n * - title.fieldName: The field to use as display title (instead of _title)\n * - title.type: \"field\" (sortable) or \"virtual\" (computed)\n * - timestamps: Whether createdAt/updatedAt are enabled\n * - softDelete: Whether soft delete is enabled\n * - localizedFields: Fields that support i18n\n *\n * @example\n * ```tsx\n * const { data: meta } = useCollectionMeta(\"posts\");\n *\n * // Use title.fieldName instead of _title for first column\n * const firstColumn = meta?.title.fieldName || \"_title\";\n *\n * // Only show timestamps columns if enabled\n * if (meta?.timestamps) {\n * columns.push(\"createdAt\", \"updatedAt\");\n * }\n * ```\n */\nexport function useCollectionMeta<K extends ResolvedCollectionNames>(\n\tcollection: K,\n\tqueryOptions?: Omit<UseQueryOptions<CollectionMeta>, \"queryKey\" | \"queryFn\">,\n) {\n\tconst client = useAdminStore(selectClient);\n\n\treturn useQuery<CollectionMeta>({\n\t\tqueryKey: [\"questpie\", \"collections\", collection, \"meta\"],\n\t\tqueryFn: async () => {\n\t\t\treturn (client as any).collections[collection].meta();\n\t\t},\n\t\t// Meta rarely changes, cache aggressively\n\t\tstaleTime: 5 * 60 * 1000, // 5 minutes\n\t\tgcTime: 30 * 60 * 1000, // 30 minutes (formerly cacheTime)\n\t\t...queryOptions,\n\t});\n}\n\n/**\n * Query key for collection meta\n * Useful for prefetching or invalidation\n */\nexport function getCollectionMetaQueryKey(collection: string) {\n\treturn [\"questpie\", \"collections\", collection, \"meta\"] as const;\n}\n\n// ============================================================================\n// Query Options Factory\n// ============================================================================\n\n/**\n * Query options factory for collection metadata.\n * Can be used with TanStack Query's prefetching in loaders or with useSuspenseQuery.\n *\n * @example\n * ```ts\n * // In TanStack Start loader\n * export const Route = createFileRoute(\"/admin/collections/:name\")({\n * loader: async ({ context, params }) => {\n * await context.queryClient.ensureQueryData(\n * getCollectionMetaQueryOptions(params.name, context.client)\n * );\n * },\n * });\n * ```\n */\nexport function getCollectionMetaQueryOptions(collection: string, client: any) {\n\treturn {\n\t\tqueryKey: getCollectionMetaQueryKey(collection),\n\t\tqueryFn: async (): Promise<CollectionMeta> => {\n\t\t\treturn client.collections[collection].meta();\n\t\t},\n\t\tstaleTime: 5 * 60 * 1000, // 5 minutes\n\t\tgcTime: 30 * 60 * 1000, // 30 minutes\n\t};\n}\n\n// ============================================================================\n// Suspense Hook\n// ============================================================================\n\n/**\n * Suspense-enabled hook to fetch collection metadata.\n *\n * Uses useSuspenseQuery so the component will suspend until data is loaded.\n * Must be used within a Suspense boundary.\n *\n * @example\n * ```tsx\n * function TableViewInner({ collection }: Props) {\n * // This will suspend until meta is loaded\n * const { data: meta } = useSuspenseCollectionMeta(collection);\n *\n * // meta is guaranteed to be defined here\n * const titleField = meta.title.fieldName;\n * }\n *\n * // Wrap with Suspense\n * <Suspense fallback={<Loading />}>\n * <TableViewInner collection=\"posts\" />\n * </Suspense>\n * ```\n */\nexport function useSuspenseCollectionMeta<K extends ResolvedCollectionNames>(\n\tcollection: K,\n) {\n\tconst client = useAdminStore(selectClient);\n\n\treturn useSuspenseQuery<CollectionMeta>(\n\t\tgetCollectionMetaQueryOptions(collection, client),\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DA,SAAgB,kBACf,YACA,cACC;CACD,MAAM,SAAS,cAAc,aAAa;AAE1C,QAAO,SAAyB;EAC/B,UAAU;GAAC;GAAY;GAAe;GAAY;GAAO;EACzD,SAAS,YAAY;AACpB,UAAQ,OAAe,YAAY,YAAY,MAAM;;EAGtD,WAAW,MAAS;EACpB,QAAQ,OAAU;EAClB,GAAG;EACH,CAAC;;;;;;AAOH,SAAgB,0BAA0B,YAAoB;AAC7D,QAAO;EAAC;EAAY;EAAe;EAAY;EAAO;;;;;;;;;;;;;;;;;;AAuBvD,SAAgB,8BAA8B,YAAoB,QAAa;AAC9E,QAAO;EACN,UAAU,0BAA0B,WAAW;EAC/C,SAAS,YAAqC;AAC7C,UAAO,OAAO,YAAY,YAAY,MAAM;;EAE7C,WAAW,MAAS;EACpB,QAAQ,OAAU;EAClB;;;;;;;;;;;;;;;;;;;;;;;;AA6BF,SAAgB,0BACf,YACC;AAGD,QAAO,iBACN,8BAA8B,YAHhB,cAAc,aAAa,CAGQ,CACjD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { selectClient, useAdminStore } from "../runtime/provider.mjs";
|
|
2
|
+
import { useQuery } from "@tanstack/react-query";
|
|
3
|
+
|
|
4
|
+
//#region src/client/hooks/use-collection-schema.ts
|
|
5
|
+
/**
|
|
6
|
+
* Hook for fetching collection schema from the backend
|
|
7
|
+
*
|
|
8
|
+
* Returns full introspection data including:
|
|
9
|
+
* - Field schemas with metadata and validation
|
|
10
|
+
* - Relations metadata
|
|
11
|
+
* - Access control information for current user
|
|
12
|
+
* - JSON Schema for client-side validation
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Hook to fetch collection schema from the backend
|
|
16
|
+
*
|
|
17
|
+
* Returns full introspection data useful for building dynamic forms and UIs:
|
|
18
|
+
* - fields: Complete field metadata including type, label, validation, admin config
|
|
19
|
+
* - relations: Relation metadata with type, target collection(s), and keys
|
|
20
|
+
* - access: Evaluated access control for the current user
|
|
21
|
+
* - validation: JSON Schema for client-side validation
|
|
22
|
+
* - options: Collection options (timestamps, softDelete, versioning)
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* const { data: schema } = useCollectionSchema("posts");
|
|
27
|
+
*
|
|
28
|
+
* // Build fields dynamically from schema
|
|
29
|
+
* for (const [name, field] of Object.entries(schema?.fields ?? {})) {
|
|
30
|
+
* const FieldComponent = getFieldComponent(field.metadata.type);
|
|
31
|
+
* // Use field.metadata for rendering configuration
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* // Check user access
|
|
35
|
+
* if (schema?.access.operations.create.allowed) {
|
|
36
|
+
* // Show create button
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
function useCollectionSchema(collection, queryOptions) {
|
|
41
|
+
const client = useAdminStore(selectClient);
|
|
42
|
+
return useQuery({
|
|
43
|
+
queryKey: getCollectionSchemaQueryKey(collection),
|
|
44
|
+
queryFn: async () => {
|
|
45
|
+
return client.collections[collection].schema();
|
|
46
|
+
},
|
|
47
|
+
staleTime: 300 * 1e3,
|
|
48
|
+
gcTime: 1800 * 1e3,
|
|
49
|
+
...queryOptions
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Query key for collection schema
|
|
54
|
+
* Useful for prefetching or invalidation
|
|
55
|
+
*/
|
|
56
|
+
function getCollectionSchemaQueryKey(collection) {
|
|
57
|
+
return [
|
|
58
|
+
"questpie",
|
|
59
|
+
"collections",
|
|
60
|
+
collection,
|
|
61
|
+
"schema"
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
//#endregion
|
|
66
|
+
export { useCollectionSchema };
|
|
67
|
+
//# sourceMappingURL=use-collection-schema.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-collection-schema.mjs","names":[],"sources":["../../../src/client/hooks/use-collection-schema.ts"],"sourcesContent":["/**\n * Hook for fetching collection schema from the backend\n *\n * Returns full introspection data including:\n * - Field schemas with metadata and validation\n * - Relations metadata\n * - Access control information for current user\n * - JSON Schema for client-side validation\n */\n\nimport { type UseQueryOptions, useQuery } from \"@tanstack/react-query\";\nimport type { Questpie } from \"questpie\";\nimport type { CollectionSchema } from \"questpie/client\";\nimport type {\n RegisteredCMS,\n RegisteredCollectionNames,\n} from \"../builder/registry\";\nimport { selectClient, useAdminStore } from \"../runtime\";\n\n// ============================================================================\n// Type Helpers\n// ============================================================================\n\n/**\n * Resolved collection names (string if not registered)\n */\ntype ResolvedCollectionNames =\n RegisteredCMS extends Questpie<any> ? RegisteredCollectionNames : string;\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to fetch collection schema from the backend\n *\n * Returns full introspection data useful for building dynamic forms and UIs:\n * - fields: Complete field metadata including type, label, validation, admin config\n * - relations: Relation metadata with type, target collection(s), and keys\n * - access: Evaluated access control for the current user\n * - validation: JSON Schema for client-side validation\n * - options: Collection options (timestamps, softDelete, versioning)\n *\n * @example\n * ```tsx\n * const { data: schema } = useCollectionSchema(\"posts\");\n *\n * // Build fields dynamically from schema\n * for (const [name, field] of Object.entries(schema?.fields ?? {})) {\n * const FieldComponent = getFieldComponent(field.metadata.type);\n * // Use field.metadata for rendering configuration\n * }\n *\n * // Check user access\n * if (schema?.access.operations.create.allowed) {\n * // Show create button\n * }\n * ```\n */\nexport function useCollectionSchema<K extends ResolvedCollectionNames>(\n collection: K,\n queryOptions?: Omit<\n UseQueryOptions<CollectionSchema>,\n \"queryKey\" | \"queryFn\"\n >,\n) {\n const client = useAdminStore(selectClient);\n\n return useQuery<CollectionSchema>({\n queryKey: getCollectionSchemaQueryKey(collection),\n queryFn: async () => {\n return (client as any).collections[collection].schema();\n },\n // Schema rarely changes, cache aggressively\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes\n ...queryOptions,\n });\n}\n\n/**\n * Query key for collection schema\n * Useful for prefetching or invalidation\n */\nexport function getCollectionSchemaQueryKey(collection: string) {\n return [\"questpie\", \"collections\", collection, \"schema\"] as const;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DA,SAAgB,oBACd,YACA,cAIA;CACA,MAAM,SAAS,cAAc,aAAa;AAE1C,QAAO,SAA2B;EAChC,UAAU,4BAA4B,WAAW;EACjD,SAAS,YAAY;AACnB,UAAQ,OAAe,YAAY,YAAY,QAAQ;;EAGzD,WAAW,MAAS;EACpB,QAAQ,OAAU;EAClB,GAAG;EACJ,CAAC;;;;;;AAOJ,SAAgB,4BAA4B,YAAoB;AAC9D,QAAO;EAAC;EAAY;EAAe;EAAY;EAAS"}
|