@questpie/admin 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +119 -122
- package/dist/augmentation.d.mts +110 -11
- package/dist/client/blocks/block-renderer.d.mts +5 -12
- package/dist/client/blocks/block-renderer.mjs +89 -55
- package/dist/client/blocks/index.d.mts +2 -4
- package/dist/client/blocks/types.d.mts +3 -4
- package/dist/client/blocks/types.mjs +1 -2
- package/dist/client/builder/admin-types.d.mts +11 -44
- package/dist/client/builder/admin.d.mts +34 -45
- package/dist/client/builder/admin.mjs +35 -44
- package/dist/client/builder/field/field.d.mts +27 -205
- package/dist/client/builder/field/field.mjs +22 -68
- package/dist/client/builder/index.d.mts +23 -28
- package/dist/client/builder/page/page.d.mts +15 -27
- package/dist/client/builder/page/page.mjs +21 -17
- package/dist/client/builder/registry.d.mts +14 -34
- package/dist/client/builder/types/action-registry.mjs +148 -14
- package/dist/client/builder/types/action-types.d.mts +8 -35
- package/dist/client/builder/types/collection-types.mjs +1 -2
- package/dist/client/builder/types/common.d.mts +6 -20
- package/dist/client/builder/types/field-types.d.mts +4 -5
- package/dist/client/builder/types/field-types.mjs +1 -2
- package/dist/client/builder/types/ui-config.d.mts +3 -5
- package/dist/client/builder/types/widget-types.d.mts +19 -20
- package/dist/client/builder/validation.d.mts +33 -3
- package/dist/client/builder/validation.mjs +169 -150
- package/dist/client/builder/view/view.d.mts +26 -106
- package/dist/client/builder/view/view.mjs +14 -96
- package/dist/client/builder/widget/widget.d.mts +16 -22
- package/dist/client/builder/widget/widget.mjs +11 -16
- package/dist/client/components/actions/action-button.mjs +207 -97
- package/dist/client/components/actions/action-dialog.mjs +471 -176
- package/dist/client/components/actions/confirmation-dialog.mjs +166 -47
- package/dist/client/components/actions/header-actions.mjs +164 -71
- package/dist/client/components/admin-link.d.mts +8 -9
- package/dist/client/components/admin-link.mjs +127 -48
- package/dist/client/components/auth/auth-guard.d.mts +6 -7
- package/dist/client/components/auth/auth-guard.mjs +9 -9
- package/dist/client/components/auth/auth-loading.d.mts +3 -4
- package/dist/client/components/auth/auth-loading.mjs +38 -10
- package/dist/client/components/blocks/block-canvas.mjs +111 -42
- package/dist/client/components/blocks/block-editor-context.mjs +90 -23
- package/dist/client/components/blocks/block-editor-layout.mjs +176 -59
- package/dist/client/components/blocks/block-editor-provider.mjs +219 -139
- package/dist/client/components/blocks/block-fields-renderer.mjs +212 -42
- package/dist/client/components/blocks/block-insert-button.mjs +168 -51
- package/dist/client/components/blocks/block-item-menu.mjs +312 -110
- package/dist/client/components/blocks/block-item.mjs +372 -125
- package/dist/client/components/blocks/block-library-sidebar.mjs +209 -114
- package/dist/client/components/blocks/block-tree.mjs +73 -15
- package/dist/client/components/blocks/block-type-icon.mjs +65 -20
- package/dist/client/components/blocks/utils/tree-utils.mjs +1 -2
- package/dist/client/components/component-renderer.d.mts +11 -22
- package/dist/client/components/component-renderer.mjs +151 -38
- package/dist/client/components/error-boundary.mjs +77 -25
- package/dist/client/components/fields/array-field.mjs +474 -199
- package/dist/client/components/fields/asset-preview-field.mjs +143 -44
- package/dist/client/components/fields/blocks-field/blocks-field.mjs +143 -35
- package/dist/client/components/fields/boolean-field.mjs +62 -32
- package/dist/client/components/fields/date-field.mjs +46 -12
- package/dist/client/components/fields/datetime-field.mjs +42 -11
- package/dist/client/components/fields/email-field.mjs +57 -28
- package/dist/client/components/fields/field-utils.mjs +1 -2
- package/dist/client/components/fields/field-wrapper.mjs +107 -32
- package/dist/client/components/fields/json-field.mjs +323 -110
- package/dist/client/components/fields/locale-badge.mjs +16 -8
- package/dist/client/components/fields/number-field.mjs +63 -30
- package/dist/client/components/fields/object-array-field.mjs +666 -272
- package/dist/client/components/fields/object-field.mjs +656 -98
- package/dist/client/components/fields/relation/displays/cards-display.mjs +225 -111
- package/dist/client/components/fields/relation/displays/chips-display.mjs +150 -77
- package/dist/client/components/fields/relation/displays/grid-display.mjs +186 -91
- package/dist/client/components/fields/relation/displays/list-display.mjs +230 -111
- package/dist/client/components/fields/relation/displays/table-display.mjs +241 -66
- package/dist/client/components/fields/relation/displays/types.mjs +2 -3
- package/dist/client/components/fields/relation/relation-items-display.mjs +131 -35
- package/dist/client/components/fields/relation-field.mjs +70 -15
- package/dist/client/components/fields/relation-picker.mjs +93 -98
- package/dist/client/components/fields/relation-select.mjs +42 -29
- package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +90 -41
- package/dist/client/components/fields/rich-text-editor/extensions.mjs +33 -7
- package/dist/client/components/fields/rich-text-editor/image-popover.mjs +48 -23
- package/dist/client/components/fields/rich-text-editor/index.mjs +491 -158
- package/dist/client/components/fields/rich-text-editor/link-popover.mjs +13 -14
- package/dist/client/components/fields/rich-text-editor/presets.mjs +1 -2
- package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +96 -53
- package/dist/client/components/fields/rich-text-editor/table-controls.mjs +416 -107
- package/dist/client/components/fields/rich-text-editor/toolbar.mjs +476 -215
- package/dist/client/components/fields/rich-text-editor/types.mjs +1 -2
- package/dist/client/components/fields/rich-text-editor/utils.mjs +1 -2
- package/dist/client/components/fields/rich-text-field.mjs +55 -17
- package/dist/client/components/fields/select-field.mjs +79 -44
- package/dist/client/components/fields/text-field.mjs +62 -29
- package/dist/client/components/fields/textarea-field.mjs +61 -29
- package/dist/client/components/fields/time-field.mjs +39 -11
- package/dist/client/components/fields/upload-field.mjs +253 -129
- package/dist/client/components/filter-builder/columns-tab.mjs +287 -93
- package/dist/client/components/filter-builder/filter-builder-sheet.mjs +437 -138
- package/dist/client/components/filter-builder/filters-tab.mjs +409 -126
- package/dist/client/components/filter-builder/saved-views-tab.mjs +259 -106
- package/dist/client/components/history-sidebar.mjs +496 -0
- package/dist/client/components/layout/field-layout-renderer.mjs +301 -0
- package/dist/client/components/locale-switcher.mjs +231 -108
- package/dist/client/components/media/media-grid.mjs +259 -84
- package/dist/client/components/media/media-picker-dialog.mjs +500 -192
- package/dist/client/components/preview/live-preview-mode.mjs +416 -124
- package/dist/client/components/preview/preview-pane.mjs +353 -144
- package/dist/client/components/primitives/asset-preview.mjs +665 -257
- package/dist/client/components/primitives/checkbox-input.mjs +37 -11
- package/dist/client/components/primitives/date-input.mjs +392 -149
- package/dist/client/components/primitives/dropzone.mjs +314 -185
- package/dist/client/components/primitives/number-input.mjs +14 -10
- package/dist/client/components/primitives/select-multi.mjs +519 -185
- package/dist/client/components/primitives/select-single.mjs +416 -126
- package/dist/client/components/primitives/text-input.mjs +10 -5
- package/dist/client/components/primitives/textarea-input.mjs +10 -5
- package/dist/client/components/primitives/time-input.mjs +118 -45
- package/dist/client/components/primitives/toggle-input.mjs +31 -11
- package/dist/client/components/primitives/types.mjs +1 -2
- package/dist/client/components/sheets/resource-sheet.mjs +72 -64
- package/dist/client/components/ui/accordion.mjs +156 -37
- package/dist/client/components/ui/alert.mjs +70 -17
- package/dist/client/components/ui/badge.mjs +57 -16
- package/dist/client/components/ui/button.mjs +49 -14
- package/dist/client/components/ui/card.mjs +194 -39
- package/dist/client/components/ui/checkbox.mjs +71 -16
- package/dist/client/components/ui/command.mjs +220 -50
- package/dist/client/components/ui/dialog.mjs +265 -52
- package/dist/client/components/ui/drawer.mjs +260 -57
- package/dist/client/components/ui/dropdown-menu.mjs +293 -67
- package/dist/client/components/ui/empty-state.mjs +72 -26
- package/dist/client/components/ui/field.mjs +332 -56
- package/dist/client/components/ui/input-group.mjs +174 -41
- package/dist/client/components/ui/input.mjs +38 -9
- package/dist/client/components/ui/kbd.mjs +37 -8
- package/dist/client/components/ui/label.mjs +38 -8
- package/dist/client/components/ui/popover.mjs +162 -35
- package/dist/client/components/ui/responsive-dialog.mjs +277 -71
- package/dist/client/components/ui/search-input.mjs +101 -36
- package/dist/client/components/ui/select.mjs +297 -57
- package/dist/client/components/ui/separator.mjs +39 -9
- package/dist/client/components/ui/sheet.mjs +253 -51
- package/dist/client/components/ui/sidebar.mjs +700 -182
- package/dist/client/components/ui/skeleton.mjs +33 -8
- package/dist/client/components/ui/sonner.d.mts +2 -3
- package/dist/client/components/ui/sonner.mjs +45 -15
- package/dist/client/components/ui/spinner.mjs +44 -10
- package/dist/client/components/ui/switch.mjs +47 -12
- package/dist/client/components/ui/table.mjs +260 -50
- package/dist/client/components/ui/tabs.mjs +140 -29
- package/dist/client/components/ui/textarea.mjs +33 -8
- package/dist/client/components/ui/toolbar.mjs +105 -23
- package/dist/client/components/ui/tooltip.mjs +130 -29
- package/dist/client/components/widgets/chart-widget.mjs +456 -156
- package/dist/client/components/widgets/progress-widget.mjs +150 -60
- package/dist/client/components/widgets/quick-actions-widget.mjs +175 -87
- package/dist/client/components/widgets/recent-items-widget.mjs +157 -62
- package/dist/client/components/widgets/stats-widget.mjs +153 -42
- package/dist/client/components/widgets/table-widget.mjs +198 -64
- package/dist/client/components/widgets/timeline-widget.mjs +193 -82
- package/dist/client/components/widgets/value-widget.mjs +257 -56
- package/dist/client/components/widgets/widget-skeletons.mjs +390 -108
- package/dist/client/contexts/breadcrumb-context.mjs +44 -16
- package/dist/client/{context → contexts}/focus-context.d.mts +6 -7
- package/dist/client/{context → contexts}/focus-context.mjs +134 -62
- package/dist/client/hooks/typed-hooks.d.mts +38 -12
- package/dist/client/hooks/typed-hooks.mjs +758 -142
- package/dist/client/hooks/use-action.mjs +197 -69
- package/dist/client/hooks/use-admin-config.mjs +39 -10
- package/dist/client/hooks/use-admin-preferences.mjs +118 -15
- package/dist/client/hooks/use-admin-routes.mjs +60 -27
- package/dist/client/hooks/use-audit-history.mjs +157 -0
- package/dist/client/hooks/use-auth.d.mts +14 -15
- package/dist/client/hooks/use-auth.mjs +8 -9
- package/dist/client/hooks/use-collection-fields.mjs +58 -19
- package/dist/client/hooks/use-collection-meta.mjs +45 -13
- package/dist/client/hooks/use-collection-schema.mjs +34 -11
- package/dist/client/hooks/use-collection-validation.mjs +39 -25
- package/dist/client/hooks/use-collection.d.mts +18 -8
- package/dist/client/hooks/use-collection.mjs +560 -101
- package/dist/client/hooks/use-current-user.d.mts +6 -3
- package/dist/client/hooks/use-current-user.mjs +2 -2
- package/dist/client/hooks/use-field-hooks.mjs +73 -65
- package/dist/client/hooks/use-field-options.d.mts +1 -34
- package/dist/client/hooks/use-field-options.mjs +233 -148
- package/dist/client/hooks/use-global-fields.mjs +47 -16
- package/dist/client/hooks/use-global-meta.mjs +57 -11
- package/dist/client/hooks/use-global-schema.mjs +31 -11
- package/dist/client/hooks/use-global.d.mts +13 -2
- package/dist/client/hooks/use-global.mjs +244 -34
- package/dist/client/hooks/use-locks.mjs +331 -124
- package/dist/client/hooks/use-media-query.d.mts +1 -2
- package/dist/client/hooks/use-media-query.mjs +38 -19
- package/dist/client/hooks/use-prefill-params.mjs +2 -2
- package/dist/client/hooks/use-questpie-query-options.mjs +33 -11
- package/dist/client/hooks/use-reactive-fields.d.mts +6 -3
- package/dist/client/hooks/use-reactive-fields.mjs +130 -93
- package/dist/client/hooks/use-realtime-highlight.mjs +115 -53
- package/dist/client/hooks/use-saved-views.mjs +109 -34
- package/dist/client/hooks/use-search-param-toggle.d.mts +12 -0
- package/dist/client/hooks/use-search-param-toggle.mjs +115 -0
- package/dist/client/hooks/use-search.mjs +147 -36
- package/dist/client/hooks/use-server-actions.mjs +191 -0
- package/dist/client/hooks/use-server-validation.mjs +164 -72
- package/dist/client/hooks/use-server-widget-data.d.mts +2 -3
- package/dist/client/hooks/use-server-widget-data.mjs +36 -11
- package/dist/client/hooks/use-setup-status.d.mts +3 -4
- package/dist/client/hooks/use-setup-status.mjs +28 -16
- package/dist/client/hooks/use-sidebar-search-param.d.mts +9 -0
- package/dist/client/hooks/use-sidebar-search-param.mjs +104 -0
- package/dist/client/hooks/use-transition-stage.mjs +125 -0
- package/dist/client/hooks/use-upload-collection.mjs +1 -2
- package/dist/client/hooks/use-upload.mjs +189 -125
- package/dist/client/hooks/use-validation-error-map.mjs +10 -6
- package/dist/client/hooks/use-view-state.mjs +380 -162
- package/dist/client/i18n/hooks.mjs +191 -67
- package/dist/client/i18n/intl-cache.mjs +1 -2
- package/dist/client/i18n/messages.mjs +1 -2
- package/dist/client/i18n/simple.d.mts +1 -2
- package/dist/client/i18n/simple.mjs +1 -2
- package/dist/client/i18n/types.d.mts +1 -2
- package/dist/client/lib/cookies.mjs +9 -0
- package/dist/client/lib/events.mjs +5 -0
- package/dist/client/lib/render-profiler.mjs +51 -0
- package/dist/client/lib/utils.mjs +1 -6
- package/dist/client/preview/block-scope-context.d.mts +5 -6
- package/dist/client/preview/block-scope-context.mjs +50 -27
- package/dist/client/preview/index.d.mts +2 -2
- package/dist/client/preview/preview-banner.d.mts +3 -4
- package/dist/client/preview/preview-banner.mjs +74 -35
- package/dist/client/preview/preview-field.d.mts +9 -10
- package/dist/client/preview/preview-field.mjs +163 -61
- package/dist/client/preview/types.d.mts +1 -2
- package/dist/client/preview/types.mjs +1 -2
- package/dist/client/preview/use-collection-preview.d.mts +1 -2
- package/dist/client/preview/use-collection-preview.mjs +105 -56
- package/dist/client/runtime/content-locales-provider.mjs +87 -36
- package/dist/client/runtime/index.d.mts +1 -3
- package/dist/client/runtime/index.mjs +1 -3
- package/dist/client/runtime/locale-scope.mjs +69 -29
- package/dist/client/runtime/provider.d.mts +18 -9922
- package/dist/client/runtime/provider.mjs +250 -86
- package/dist/client/runtime/routes.d.mts +7 -7
- package/dist/client/runtime/routes.mjs +4 -20
- package/dist/client/runtime/translations-provider.mjs +114 -53
- package/dist/client/scope/picker.d.mts +3 -4
- package/dist/client/scope/picker.mjs +324 -90
- package/dist/client/scope/provider.d.mts +4 -5
- package/dist/client/scope/provider.mjs +30 -22
- package/dist/client/scope/types.d.mts +1 -2
- package/dist/client/styles/index.css +301 -225
- package/dist/client/utils/auto-expand-fields.mjs +23 -5
- package/dist/client/utils/build-field-definitions-from-schema.mjs +10 -7
- package/dist/client/utils/dependency-tracker.mjs +61 -0
- package/dist/client/utils/detect-relations.mjs +1 -2
- package/dist/client/utils/locale-to-flag.d.mts +8 -7
- package/dist/client/utils/locale-to-flag.mjs +1 -2
- package/dist/client/utils/routes.mjs +1 -2
- package/dist/client/views/auth/accept-invite-form.d.mts +3 -4
- package/dist/client/views/auth/accept-invite-form.mjs +414 -121
- package/dist/client/views/auth/auth-layout.d.mts +7 -8
- package/dist/client/views/auth/auth-layout.mjs +93 -30
- package/dist/client/views/auth/forgot-password-form.d.mts +4 -5
- package/dist/client/views/auth/forgot-password-form.mjs +332 -100
- package/dist/client/views/auth/invite-form.mjs +447 -105
- package/dist/client/views/auth/login-form.d.mts +4 -5
- package/dist/client/views/auth/login-form.mjs +340 -120
- package/dist/client/views/auth/reset-password-form.d.mts +4 -5
- package/dist/client/views/auth/reset-password-form.mjs +458 -131
- package/dist/client/views/auth/setup-form.d.mts +4 -5
- package/dist/client/views/auth/setup-form.mjs +481 -141
- package/dist/client/views/collection/auto-form-fields.mjs +686 -266
- package/dist/client/views/collection/bulk-action-toolbar.mjs +392 -203
- package/dist/client/views/collection/cells/complex-cells.mjs +635 -216
- package/dist/client/views/collection/cells/primitive-cells.mjs +332 -102
- package/dist/client/views/collection/cells/relation-cells.mjs +227 -72
- package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +456 -136
- package/dist/client/views/collection/cells/shared/cell-helpers.mjs +49 -2
- package/dist/client/views/collection/cells/shared/relation-chip.mjs +109 -25
- package/dist/client/views/collection/cells/upload-cells.mjs +16 -8
- package/dist/client/views/collection/columns/build-columns.mjs +51 -12
- package/dist/client/views/collection/columns/column-defaults.mjs +17 -2
- package/dist/client/views/collection/field-context.mjs +10 -11
- package/dist/client/views/collection/field-renderer.mjs +237 -40
- package/dist/client/views/collection/form-view.mjs +1108 -445
- package/dist/client/views/collection/table-view.mjs +300 -163
- package/dist/client/views/collection/view-skeletons.mjs +181 -87
- package/dist/client/views/common/global-search.mjs +557 -233
- package/dist/client/views/dashboard/dashboard-grid.mjs +707 -211
- package/dist/client/views/dashboard/dashboard-widget.mjs +145 -58
- package/dist/client/views/dashboard/widget-card.mjs +315 -102
- package/dist/client/views/globals/global-form-view.mjs +1256 -131
- package/dist/client/views/layout/admin-layout-provider.d.mts +18 -21
- package/dist/client/views/layout/admin-layout-provider.mjs +135 -32
- package/dist/client/views/layout/admin-layout.d.mts +14 -32
- package/dist/client/views/layout/admin-layout.mjs +254 -96
- package/dist/client/views/layout/admin-router.d.mts +10 -42
- package/dist/client/views/layout/admin-router.mjs +1086 -426
- package/dist/client/views/layout/admin-sidebar.d.mts +10 -16
- package/dist/client/views/layout/admin-sidebar.mjs +1211 -382
- package/dist/client/views/layout/admin-topbar.mjs +220 -112
- package/dist/client/views/pages/accept-invite-page.d.mts +5 -6
- package/dist/client/views/pages/accept-invite-page.mjs +302 -96
- package/dist/client/views/pages/dashboard-page.d.mts +7 -16
- package/dist/client/views/pages/dashboard-page.mjs +62 -23
- package/dist/client/views/pages/forgot-password-page.d.mts +7 -10
- package/dist/client/views/pages/forgot-password-page.mjs +112 -40
- package/dist/client/views/pages/invite-page.d.mts +6 -7
- package/dist/client/views/pages/invite-page.mjs +121 -46
- package/dist/client/views/pages/login-page.d.mts +8 -15
- package/dist/client/views/pages/login-page.mjs +152 -57
- package/dist/client/views/pages/reset-password-page.d.mts +7 -10
- package/dist/client/views/pages/reset-password-page.mjs +209 -57
- package/dist/client/views/pages/setup-page.d.mts +7 -10
- package/dist/client/views/pages/setup-page.mjs +108 -43
- package/dist/client-module.d.mts +3 -0
- package/dist/client-module.mjs +3 -0
- package/dist/client.d.mts +55 -48
- package/dist/client.mjs +26 -28
- package/dist/components/rich-text/rich-text-renderer.d.mts +3 -4
- package/dist/components/rich-text/rich-text-renderer.mjs +97 -70
- package/dist/index.d.mts +36 -39
- package/dist/index.mjs +26 -28
- package/dist/plugin.d.mts +2 -0
- package/dist/plugin.mjs +3 -0
- package/dist/server/adapters/nextjs.d.mts +13 -14
- package/dist/server/adapters/nextjs.mjs +12 -13
- package/dist/server/adapters/tanstack.d.mts +10 -11
- package/dist/server/adapters/tanstack.mjs +11 -12
- package/dist/server/augmentation/actions.d.mts +279 -0
- package/dist/server/augmentation/common.d.mts +76 -0
- package/dist/server/augmentation/dashboard.d.mts +547 -0
- package/dist/server/augmentation/form-layout.d.mts +303 -0
- package/dist/server/augmentation/index.d.mts +44 -0
- package/dist/server/augmentation/index.mjs +10 -0
- package/dist/server/augmentation/sidebar.d.mts +181 -0
- package/dist/server/augmentation/views.d.mts +237 -0
- package/dist/server/augmentation.d.mts +7 -1523
- package/dist/server/block/index.d.mts +4 -3
- package/dist/server/codegen/admin-client-template.mjs +93 -0
- package/dist/server/codegen/projection-validator.mjs +67 -0
- package/dist/server/fields/blocks.d.mts +10 -78
- package/dist/server/fields/blocks.mjs +74 -115
- package/dist/server/fields/index.d.mts +6 -39
- package/dist/server/fields/index.mjs +6 -7
- package/dist/server/fields/rich-text.d.mts +10 -77
- package/dist/server/fields/rich-text.mjs +59 -100
- package/dist/server/i18n/index.mjs +8 -9
- package/dist/server/i18n/messages/cs.mjs +3 -3
- package/dist/server/i18n/messages/de.mjs +3 -3
- package/dist/server/i18n/messages/en.mjs +217 -3
- package/dist/server/i18n/messages/es.mjs +3 -3
- package/dist/server/i18n/messages/fr.mjs +3 -3
- package/dist/server/i18n/messages/index.mjs +1 -2
- package/dist/server/i18n/messages/pl.mjs +3 -3
- package/dist/server/i18n/messages/pt.mjs +3 -3
- package/dist/server/i18n/messages/sk.mjs +202 -3
- package/dist/server/modules/admin/.generated/module.d.mts +52 -0
- package/dist/server/modules/admin/.generated/module.mjs +78 -0
- package/dist/server/modules/admin/.generated/registries.d.mts +22 -0
- package/dist/server/{auth-helpers.d.mts → modules/admin/auth-helpers.d.mts} +13 -14
- package/dist/server/{auth-helpers.mjs → modules/admin/auth-helpers.mjs} +15 -16
- package/dist/server/{block → modules/admin/block}/block-builder.d.mts +96 -32
- package/dist/server/{block → modules/admin/block}/block-builder.mjs +113 -15
- package/dist/server/modules/admin/block/index.d.mts +3 -0
- package/dist/server/{block → modules/admin/block}/introspection.d.mts +10 -5
- package/dist/server/{block → modules/admin/block}/introspection.mjs +18 -7
- package/dist/server/{block → modules/admin/block}/prefetch.d.mts +17 -17
- package/dist/server/{block → modules/admin/block}/prefetch.mjs +17 -16
- package/dist/server/modules/admin/client/.generated/module.d.mts +94 -0
- package/dist/server/modules/admin/client/.generated/module.mjs +91 -0
- package/dist/server/modules/admin/client/components/badge.d.mts +1 -0
- package/dist/server/modules/admin/client/components/icon.d.mts +1 -0
- package/dist/server/modules/admin/client/fields/array.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/array.mjs +12 -0
- package/dist/server/modules/admin/client/fields/assetPreview.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/assetPreview.mjs +18 -0
- package/dist/server/modules/admin/client/fields/blocks.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/blocks.mjs +12 -0
- package/dist/server/modules/admin/client/fields/boolean.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/boolean.mjs +12 -0
- package/dist/server/modules/admin/client/fields/date.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/date.mjs +12 -0
- package/dist/server/modules/admin/client/fields/datetime.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/datetime.mjs +12 -0
- package/dist/server/modules/admin/client/fields/email.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/email.mjs +12 -0
- package/dist/server/modules/admin/client/fields/json.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/json.mjs +11 -0
- package/dist/server/modules/admin/client/fields/number.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/number.mjs +12 -0
- package/dist/server/modules/admin/client/fields/object.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/object.mjs +12 -0
- package/dist/server/modules/admin/client/fields/relation.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/relation.mjs +12 -0
- package/dist/server/modules/admin/client/fields/richText.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/richText.mjs +11 -0
- package/dist/server/modules/admin/client/fields/select.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/select.mjs +12 -0
- package/dist/server/modules/admin/client/fields/text.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/text.mjs +12 -0
- package/dist/server/modules/admin/client/fields/textarea.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/textarea.mjs +12 -0
- package/dist/server/modules/admin/client/fields/time.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/time.mjs +12 -0
- package/dist/server/modules/admin/client/fields/upload.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/upload.mjs +12 -0
- package/dist/server/modules/admin/client/fields/url.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/url.mjs +12 -0
- package/dist/server/modules/admin/client/index.d.mts +1 -0
- package/dist/server/modules/admin/client/pages/dashboard.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/dashboard.mjs +11 -0
- package/dist/server/modules/admin/client/pages/forgotPassword.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/forgotPassword.mjs +11 -0
- package/dist/server/modules/admin/client/pages/login.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/login.mjs +11 -0
- package/dist/server/modules/admin/client/pages/resetPassword.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/resetPassword.mjs +11 -0
- package/dist/server/modules/admin/client/pages/setup.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/setup.mjs +11 -0
- package/dist/server/modules/admin/client/views/collection-form.mjs +10 -0
- package/dist/server/modules/admin/client/views/collection-table.mjs +10 -0
- package/dist/server/modules/admin/client/views/global-form.mjs +10 -0
- package/dist/server/modules/admin/client/widgets/chart.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/chart.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/progress.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/progress.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/quickActions.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/quickActions.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/recentItems.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/recentItems.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/stats.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/stats.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/table.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/table.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/timeline.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/timeline.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/value.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/value.mjs +7 -0
- package/dist/server/modules/admin/collections/account.d.mts +77 -0
- package/dist/server/modules/admin/collections/account.mjs +23 -0
- package/dist/server/modules/admin/collections/admin-locks.d.mts +90 -0
- package/dist/server/modules/admin/collections/admin-locks.mjs +16 -0
- package/dist/server/modules/admin/collections/admin-preferences.d.mts +69 -0
- package/dist/server/modules/admin/collections/admin-preferences.mjs +16 -0
- package/dist/server/modules/admin/collections/admin-saved-views.d.mts +83 -0
- package/dist/server/modules/admin/collections/admin-saved-views.mjs +16 -0
- package/dist/server/modules/admin/collections/apikey.d.mts +99 -0
- package/dist/server/modules/admin/collections/apikey.mjs +15 -0
- package/dist/server/modules/admin/collections/assets.d.mts +72 -0
- package/dist/server/modules/admin/collections/assets.mjs +71 -0
- package/dist/server/modules/admin/collections/session.d.mts +69 -0
- package/dist/server/modules/admin/collections/session.mjs +15 -0
- package/dist/server/modules/admin/collections/user.d.mts +85 -0
- package/dist/server/modules/admin/collections/user.mjs +204 -0
- package/dist/server/modules/admin/collections/verification.d.mts +63 -0
- package/dist/server/modules/admin/collections/verification.mjs +15 -0
- package/dist/server/modules/admin/components/badge.d.mts +10 -0
- package/dist/server/modules/admin/components/badge.mjs +10 -0
- package/dist/server/modules/admin/components/icon.d.mts +9 -0
- package/dist/server/modules/admin/components/icon.mjs +11 -0
- package/dist/server/modules/admin/config/admin.mjs +34 -0
- package/dist/server/modules/admin/dto/admin-config.dto.mjs +102 -0
- package/dist/server/modules/admin/factories.mjs +172 -0
- package/dist/server/modules/admin/index.d.mts +1060 -16846
- package/dist/server/modules/admin/index.mjs +17 -240
- package/dist/server/modules/admin/modules.mjs +11 -0
- package/dist/server/modules/admin/plugin.mjs +13 -0
- package/dist/server/modules/admin/routes/admin-config.d.mts +28 -0
- package/dist/server/modules/admin/routes/admin-config.mjs +552 -0
- package/dist/server/modules/admin/{functions → routes}/execute-action.d.mts +17 -32
- package/dist/server/modules/admin/{functions → routes}/execute-action.mjs +146 -44
- package/dist/server/modules/admin/routes/locales.d.mts +18 -0
- package/dist/server/modules/admin/routes/locales.mjs +69 -0
- package/dist/server/modules/admin/{functions → routes}/preview.d.mts +25 -15
- package/dist/server/modules/admin/{functions → routes}/preview.mjs +84 -97
- package/dist/server/modules/admin/{functions → routes}/reactive.d.mts +19 -44
- package/dist/server/modules/admin/{functions → routes}/reactive.mjs +89 -117
- package/dist/server/modules/admin/routes/route-helpers.d.mts +23 -0
- package/dist/server/modules/admin/routes/route-helpers.mjs +76 -0
- package/dist/server/modules/admin/{functions → routes}/setup.d.mts +11 -32
- package/dist/server/modules/admin/routes/setup.mjs +114 -0
- package/dist/server/modules/admin/routes/translations.d.mts +26 -0
- package/dist/server/modules/admin/routes/translations.mjs +114 -0
- package/dist/server/modules/admin/routes/widget-data.d.mts +32 -0
- package/dist/server/modules/admin/routes/widget-data.mjs +62 -0
- package/dist/server/modules/admin/views/form.d.mts +8 -0
- package/dist/server/modules/admin/views/form.mjs +7 -0
- package/dist/server/modules/admin/views/global-form.d.mts +8 -0
- package/dist/server/modules/admin/views/global-form.mjs +7 -0
- package/dist/server/modules/admin/views/table.d.mts +8 -0
- package/dist/server/modules/admin/views/table.mjs +7 -0
- package/dist/server/modules/admin-preferences/collections/{admin-preferences.collection.mjs → admin-preferences.mjs} +13 -24
- package/dist/server/modules/admin-preferences/collections/locks.collection.mjs +18 -42
- package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +99 -0
- package/dist/server/modules/admin-preferences/collections/saved-views.mjs +38 -0
- package/dist/server/modules/audit/.generated/module.d.mts +60 -0
- package/dist/server/modules/audit/.generated/module.mjs +30 -0
- package/dist/server/modules/audit/collections/audit-log.d.mts +214 -0
- package/dist/server/modules/audit/collections/audit-log.mjs +107 -0
- package/dist/server/modules/audit/config/admin.mjs +21 -0
- package/dist/server/modules/audit/config/app.mjs +262 -0
- package/dist/server/modules/audit/index.d.mts +2 -0
- package/dist/server/modules/audit/jobs/audit-cleanup.d.mts +13 -0
- package/dist/server/modules/audit/jobs/audit-cleanup.mjs +28 -0
- package/dist/server/plugin.d.mts +26 -0
- package/dist/server/plugin.mjs +385 -0
- package/dist/server/proxy-factories.d.mts +85 -0
- package/dist/server/proxy-factories.mjs +302 -0
- package/dist/server/registry-helpers.d.mts +83 -0
- package/dist/server/registry-helpers.mjs +104 -0
- package/dist/server.d.mts +30 -18
- package/dist/server.mjs +19 -16
- package/dist/shared/preview-utils.d.mts +2 -3
- package/dist/shared/preview-utils.mjs +2 -3
- package/dist/shared/types/saved-views.types.d.mts +2 -2
- package/package.json +50 -40
- package/skills/questpie-admin/SKILL.md +397 -0
- package/skills/questpie-admin/blocks/SKILL.md +305 -0
- package/skills/questpie-admin/custom-ui/SKILL.md +307 -0
- package/skills/questpie-admin/views/SKILL.md +442 -0
- package/dist/_virtual/rolldown_runtime.mjs +0 -18
- package/dist/augmentation.d.mts.map +0 -1
- package/dist/client/blocks/block-registry.d.mts +0 -199
- package/dist/client/blocks/block-registry.d.mts.map +0 -1
- package/dist/client/blocks/block-registry.mjs +0 -88
- package/dist/client/blocks/block-registry.mjs.map +0 -1
- package/dist/client/blocks/block-renderer.d.mts.map +0 -1
- package/dist/client/blocks/block-renderer.mjs.map +0 -1
- package/dist/client/blocks/prefetch.d.mts +0 -45
- package/dist/client/blocks/prefetch.d.mts.map +0 -1
- package/dist/client/blocks/prefetch.mjs +0 -26
- package/dist/client/blocks/prefetch.mjs.map +0 -1
- package/dist/client/blocks/types.d.mts.map +0 -1
- package/dist/client/blocks/types.mjs.map +0 -1
- package/dist/client/builder/admin-builder.d.mts +0 -112
- package/dist/client/builder/admin-builder.d.mts.map +0 -1
- package/dist/client/builder/admin-builder.mjs +0 -185
- package/dist/client/builder/admin-builder.mjs.map +0 -1
- package/dist/client/builder/admin-types.d.mts.map +0 -1
- package/dist/client/builder/admin.d.mts.map +0 -1
- package/dist/client/builder/admin.mjs.map +0 -1
- package/dist/client/builder/defaults/components.mjs +0 -20
- package/dist/client/builder/defaults/components.mjs.map +0 -1
- package/dist/client/builder/defaults/core.d.mts +0 -354
- package/dist/client/builder/defaults/core.d.mts.map +0 -1
- package/dist/client/builder/defaults/core.mjs +0 -49
- package/dist/client/builder/defaults/core.mjs.map +0 -1
- package/dist/client/builder/defaults/fields.mjs +0 -328
- package/dist/client/builder/defaults/fields.mjs.map +0 -1
- package/dist/client/builder/defaults/pages.mjs +0 -58
- package/dist/client/builder/defaults/pages.mjs.map +0 -1
- package/dist/client/builder/defaults/starter.d.mts +0 -351
- package/dist/client/builder/defaults/starter.d.mts.map +0 -1
- package/dist/client/builder/defaults/starter.mjs +0 -28
- package/dist/client/builder/defaults/starter.mjs.map +0 -1
- package/dist/client/builder/defaults/views.mjs +0 -27
- package/dist/client/builder/defaults/views.mjs.map +0 -1
- package/dist/client/builder/defaults/widgets.mjs +0 -31
- package/dist/client/builder/defaults/widgets.mjs.map +0 -1
- package/dist/client/builder/field/field.d.mts.map +0 -1
- package/dist/client/builder/field/field.mjs.map +0 -1
- package/dist/client/builder/index.d.mts.map +0 -1
- package/dist/client/builder/page/page.d.mts.map +0 -1
- package/dist/client/builder/page/page.mjs.map +0 -1
- package/dist/client/builder/proxies.d.mts +0 -2
- package/dist/client/builder/proxies.mjs +0 -24
- package/dist/client/builder/proxies.mjs.map +0 -1
- package/dist/client/builder/qa.d.mts +0 -50
- package/dist/client/builder/qa.d.mts.map +0 -1
- package/dist/client/builder/qa.mjs +0 -42
- package/dist/client/builder/qa.mjs.map +0 -1
- package/dist/client/builder/registry.d.mts.map +0 -1
- package/dist/client/builder/types/action-registry.d.mts +0 -2
- package/dist/client/builder/types/action-registry.mjs.map +0 -1
- package/dist/client/builder/types/action-types.d.mts.map +0 -1
- package/dist/client/builder/types/collection-types.d.mts +0 -199
- package/dist/client/builder/types/collection-types.d.mts.map +0 -1
- package/dist/client/builder/types/collection-types.mjs.map +0 -1
- package/dist/client/builder/types/common.d.mts.map +0 -1
- package/dist/client/builder/types/field-types.d.mts.map +0 -1
- package/dist/client/builder/types/field-types.mjs.map +0 -1
- package/dist/client/builder/types/global-types.d.mts +0 -22
- package/dist/client/builder/types/global-types.d.mts.map +0 -1
- package/dist/client/builder/types/ui-config.d.mts.map +0 -1
- package/dist/client/builder/types/views.d.mts +0 -89
- package/dist/client/builder/types/views.d.mts.map +0 -1
- package/dist/client/builder/types/widget-types.d.mts.map +0 -1
- package/dist/client/builder/validation.mjs.map +0 -1
- package/dist/client/builder/view/view.d.mts.map +0 -1
- package/dist/client/builder/view/view.mjs.map +0 -1
- package/dist/client/builder/widget/widget.d.mts.map +0 -1
- package/dist/client/builder/widget/widget.mjs.map +0 -1
- package/dist/client/components/actions/action-button.d.mts +0 -2
- package/dist/client/components/actions/action-button.mjs.map +0 -1
- package/dist/client/components/actions/action-dialog.d.mts +0 -2
- package/dist/client/components/actions/action-dialog.mjs.map +0 -1
- package/dist/client/components/actions/confirmation-dialog.d.mts +0 -2
- package/dist/client/components/actions/confirmation-dialog.mjs.map +0 -1
- package/dist/client/components/actions/header-actions.d.mts +0 -2
- package/dist/client/components/actions/header-actions.mjs.map +0 -1
- package/dist/client/components/actions/index.d.mts +0 -4
- package/dist/client/components/admin-link.d.mts.map +0 -1
- package/dist/client/components/admin-link.mjs.map +0 -1
- package/dist/client/components/auth/auth-guard.d.mts.map +0 -1
- package/dist/client/components/auth/auth-guard.mjs.map +0 -1
- package/dist/client/components/auth/auth-loading.d.mts.map +0 -1
- package/dist/client/components/auth/auth-loading.mjs.map +0 -1
- package/dist/client/components/auth/index.d.mts +0 -2
- package/dist/client/components/blocks/block-canvas.mjs.map +0 -1
- package/dist/client/components/blocks/block-editor-context.mjs.map +0 -1
- package/dist/client/components/blocks/block-editor-layout.mjs.map +0 -1
- package/dist/client/components/blocks/block-editor-provider.mjs.map +0 -1
- package/dist/client/components/blocks/block-fields-renderer.mjs.map +0 -1
- package/dist/client/components/blocks/block-insert-button.mjs.map +0 -1
- package/dist/client/components/blocks/block-item-menu.mjs.map +0 -1
- package/dist/client/components/blocks/block-item.mjs.map +0 -1
- package/dist/client/components/blocks/block-library-sidebar.mjs.map +0 -1
- package/dist/client/components/blocks/block-tree.mjs.map +0 -1
- package/dist/client/components/blocks/block-type-icon.mjs.map +0 -1
- package/dist/client/components/blocks/utils/tree-utils.mjs.map +0 -1
- package/dist/client/components/component-renderer.d.mts.map +0 -1
- package/dist/client/components/component-renderer.mjs.map +0 -1
- package/dist/client/components/error-boundary.mjs.map +0 -1
- package/dist/client/components/fields/array-field.d.mts +0 -44
- package/dist/client/components/fields/array-field.d.mts.map +0 -1
- package/dist/client/components/fields/array-field.mjs.map +0 -1
- package/dist/client/components/fields/asset-preview-field.d.mts +0 -52
- package/dist/client/components/fields/asset-preview-field.d.mts.map +0 -1
- package/dist/client/components/fields/asset-preview-field.mjs.map +0 -1
- package/dist/client/components/fields/blocks-field/blocks-field.d.mts +0 -41
- package/dist/client/components/fields/blocks-field/blocks-field.d.mts.map +0 -1
- package/dist/client/components/fields/blocks-field/blocks-field.mjs.map +0 -1
- package/dist/client/components/fields/blocks-field/index.d.mts +0 -1
- package/dist/client/components/fields/boolean-field.d.mts +0 -30
- package/dist/client/components/fields/boolean-field.d.mts.map +0 -1
- package/dist/client/components/fields/boolean-field.mjs.map +0 -1
- package/dist/client/components/fields/custom-field.d.mts +0 -3
- package/dist/client/components/fields/date-field.d.mts +0 -22
- package/dist/client/components/fields/date-field.d.mts.map +0 -1
- package/dist/client/components/fields/date-field.mjs.map +0 -1
- package/dist/client/components/fields/datetime-field.d.mts +0 -23
- package/dist/client/components/fields/datetime-field.d.mts.map +0 -1
- package/dist/client/components/fields/datetime-field.mjs.map +0 -1
- package/dist/client/components/fields/email-field.d.mts +0 -19
- package/dist/client/components/fields/email-field.d.mts.map +0 -1
- package/dist/client/components/fields/email-field.mjs.map +0 -1
- package/dist/client/components/fields/embedded-collection.d.mts +0 -3
- package/dist/client/components/fields/field-types.d.mts +0 -571
- package/dist/client/components/fields/field-types.d.mts.map +0 -1
- package/dist/client/components/fields/field-utils.d.mts +0 -1
- package/dist/client/components/fields/field-utils.mjs.map +0 -1
- package/dist/client/components/fields/field-wrapper.d.mts +0 -3
- package/dist/client/components/fields/field-wrapper.mjs.map +0 -1
- package/dist/client/components/fields/index.d.mts +0 -33
- package/dist/client/components/fields/json-field.d.mts +0 -84
- package/dist/client/components/fields/json-field.d.mts.map +0 -1
- package/dist/client/components/fields/json-field.mjs.map +0 -1
- package/dist/client/components/fields/locale-badge.d.mts +0 -1
- package/dist/client/components/fields/locale-badge.mjs.map +0 -1
- package/dist/client/components/fields/number-field.d.mts +0 -23
- package/dist/client/components/fields/number-field.d.mts.map +0 -1
- package/dist/client/components/fields/number-field.mjs.map +0 -1
- package/dist/client/components/fields/object-array-field.d.mts +0 -2
- package/dist/client/components/fields/object-array-field.mjs.map +0 -1
- package/dist/client/components/fields/object-field.d.mts +0 -32
- package/dist/client/components/fields/object-field.d.mts.map +0 -1
- package/dist/client/components/fields/object-field.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/cards-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/cards-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/chips-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/chips-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/grid-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/grid-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/index.d.mts +0 -6
- package/dist/client/components/fields/relation/displays/list-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/list-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/table-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/table-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/types.d.mts +0 -22
- package/dist/client/components/fields/relation/displays/types.d.mts.map +0 -1
- package/dist/client/components/fields/relation/displays/types.mjs.map +0 -1
- package/dist/client/components/fields/relation/index.d.mts +0 -3
- package/dist/client/components/fields/relation/relation-items-display.d.mts +0 -5
- package/dist/client/components/fields/relation/relation-items-display.mjs.map +0 -1
- package/dist/client/components/fields/relation-field.d.mts +0 -134
- package/dist/client/components/fields/relation-field.d.mts.map +0 -1
- package/dist/client/components/fields/relation-field.mjs.map +0 -1
- package/dist/client/components/fields/relation-picker.d.mts +0 -4
- package/dist/client/components/fields/relation-picker.mjs.map +0 -1
- package/dist/client/components/fields/relation-select.d.mts +0 -3
- package/dist/client/components/fields/relation-select.mjs.map +0 -1
- package/dist/client/components/fields/reverse-relation-field.d.mts +0 -2
- package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/extensions.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/image-popover.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/index.d.mts +0 -4
- package/dist/client/components/fields/rich-text-editor/index.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/link-popover.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/presets.d.mts +0 -11
- package/dist/client/components/fields/rich-text-editor/presets.d.mts.map +0 -1
- package/dist/client/components/fields/rich-text-editor/presets.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/slash-commands.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/table-controls.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/toolbar.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/types.d.mts +0 -78
- package/dist/client/components/fields/rich-text-editor/types.d.mts.map +0 -1
- package/dist/client/components/fields/rich-text-editor/types.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/utils.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/variants.d.mts +0 -2
- package/dist/client/components/fields/rich-text-field.d.mts +0 -14
- package/dist/client/components/fields/rich-text-field.d.mts.map +0 -1
- package/dist/client/components/fields/rich-text-field.mjs.map +0 -1
- package/dist/client/components/fields/select-field.d.mts +0 -25
- package/dist/client/components/fields/select-field.d.mts.map +0 -1
- package/dist/client/components/fields/select-field.mjs.map +0 -1
- package/dist/client/components/fields/status-field.d.mts +0 -2
- package/dist/client/components/fields/text-field.d.mts +0 -22
- package/dist/client/components/fields/text-field.d.mts.map +0 -1
- package/dist/client/components/fields/text-field.mjs.map +0 -1
- package/dist/client/components/fields/textarea-field.d.mts +0 -22
- package/dist/client/components/fields/textarea-field.d.mts.map +0 -1
- package/dist/client/components/fields/textarea-field.mjs.map +0 -1
- package/dist/client/components/fields/time-field.d.mts +0 -20
- package/dist/client/components/fields/time-field.d.mts.map +0 -1
- package/dist/client/components/fields/time-field.mjs.map +0 -1
- package/dist/client/components/fields/upload-field.d.mts +0 -97
- package/dist/client/components/fields/upload-field.d.mts.map +0 -1
- package/dist/client/components/fields/upload-field.mjs.map +0 -1
- package/dist/client/components/filter-builder/columns-tab.d.mts +0 -1
- package/dist/client/components/filter-builder/columns-tab.mjs.map +0 -1
- package/dist/client/components/filter-builder/filter-builder-sheet.d.mts +0 -1
- package/dist/client/components/filter-builder/filter-builder-sheet.mjs.map +0 -1
- package/dist/client/components/filter-builder/filters-tab.d.mts +0 -1
- package/dist/client/components/filter-builder/filters-tab.mjs.map +0 -1
- package/dist/client/components/filter-builder/index.d.mts +0 -5
- package/dist/client/components/filter-builder/saved-views-tab.d.mts +0 -1
- package/dist/client/components/filter-builder/saved-views-tab.mjs.map +0 -1
- package/dist/client/components/index.d.mts +0 -80
- package/dist/client/components/locale-switcher.d.mts +0 -2
- package/dist/client/components/locale-switcher.mjs.map +0 -1
- package/dist/client/components/media/media-grid.mjs.map +0 -1
- package/dist/client/components/media/media-picker-dialog.mjs.map +0 -1
- package/dist/client/components/preview/live-preview-mode.mjs.map +0 -1
- package/dist/client/components/preview/preview-pane.mjs.map +0 -1
- package/dist/client/components/primitives/asset-preview.mjs.map +0 -1
- package/dist/client/components/primitives/checkbox-input.mjs.map +0 -1
- package/dist/client/components/primitives/date-input.mjs.map +0 -1
- package/dist/client/components/primitives/dropzone.mjs.map +0 -1
- package/dist/client/components/primitives/number-input.mjs.map +0 -1
- package/dist/client/components/primitives/select-multi.mjs.map +0 -1
- package/dist/client/components/primitives/select-single.mjs.map +0 -1
- package/dist/client/components/primitives/text-input.mjs.map +0 -1
- package/dist/client/components/primitives/textarea-input.mjs.map +0 -1
- package/dist/client/components/primitives/time-input.mjs.map +0 -1
- package/dist/client/components/primitives/toggle-input.mjs.map +0 -1
- package/dist/client/components/primitives/types.d.mts +0 -14
- package/dist/client/components/primitives/types.d.mts.map +0 -1
- package/dist/client/components/primitives/types.mjs.map +0 -1
- package/dist/client/components/sheets/index.d.mts +0 -1
- package/dist/client/components/sheets/resource-sheet.d.mts +0 -1
- package/dist/client/components/sheets/resource-sheet.mjs.map +0 -1
- package/dist/client/components/ui/accordion.d.mts +0 -2
- package/dist/client/components/ui/accordion.mjs.map +0 -1
- package/dist/client/components/ui/alert.mjs.map +0 -1
- package/dist/client/components/ui/avatar.d.mts +0 -3
- package/dist/client/components/ui/badge.d.mts +0 -3
- package/dist/client/components/ui/badge.mjs.map +0 -1
- package/dist/client/components/ui/button.d.mts +0 -3
- package/dist/client/components/ui/button.mjs.map +0 -1
- package/dist/client/components/ui/card.d.mts +0 -2
- package/dist/client/components/ui/card.mjs.map +0 -1
- package/dist/client/components/ui/checkbox.d.mts +0 -2
- package/dist/client/components/ui/checkbox.mjs.map +0 -1
- package/dist/client/components/ui/combobox.d.mts +0 -3
- package/dist/client/components/ui/command.mjs.map +0 -1
- package/dist/client/components/ui/dialog.d.mts +0 -3
- package/dist/client/components/ui/dialog.mjs.map +0 -1
- package/dist/client/components/ui/drawer.mjs.map +0 -1
- package/dist/client/components/ui/dropdown-menu.d.mts +0 -3
- package/dist/client/components/ui/dropdown-menu.mjs.map +0 -1
- package/dist/client/components/ui/empty-state.mjs.map +0 -1
- package/dist/client/components/ui/field.d.mts +0 -3
- package/dist/client/components/ui/field.mjs.map +0 -1
- package/dist/client/components/ui/input-group.d.mts +0 -4
- package/dist/client/components/ui/input-group.mjs.map +0 -1
- package/dist/client/components/ui/input.d.mts +0 -2
- package/dist/client/components/ui/input.mjs.map +0 -1
- package/dist/client/components/ui/kbd.mjs.map +0 -1
- package/dist/client/components/ui/label.d.mts +0 -2
- package/dist/client/components/ui/label.mjs.map +0 -1
- package/dist/client/components/ui/popover.d.mts +0 -3
- package/dist/client/components/ui/popover.mjs.map +0 -1
- package/dist/client/components/ui/responsive-dialog.mjs.map +0 -1
- package/dist/client/components/ui/scroll-area.d.mts +0 -2
- package/dist/client/components/ui/search-input.mjs.map +0 -1
- package/dist/client/components/ui/select.d.mts +0 -3
- package/dist/client/components/ui/select.mjs.map +0 -1
- package/dist/client/components/ui/separator.d.mts +0 -2
- package/dist/client/components/ui/separator.mjs.map +0 -1
- package/dist/client/components/ui/sheet.d.mts +0 -3
- package/dist/client/components/ui/sheet.mjs.map +0 -1
- package/dist/client/components/ui/sidebar.d.mts +0 -8
- package/dist/client/components/ui/sidebar.mjs.map +0 -1
- package/dist/client/components/ui/skeleton.d.mts +0 -1
- package/dist/client/components/ui/skeleton.mjs.map +0 -1
- package/dist/client/components/ui/sonner.d.mts.map +0 -1
- package/dist/client/components/ui/sonner.mjs.map +0 -1
- package/dist/client/components/ui/spinner.d.mts +0 -1
- package/dist/client/components/ui/spinner.mjs.map +0 -1
- package/dist/client/components/ui/switch.d.mts +0 -2
- package/dist/client/components/ui/switch.mjs.map +0 -1
- package/dist/client/components/ui/table.d.mts +0 -2
- package/dist/client/components/ui/table.mjs.map +0 -1
- package/dist/client/components/ui/tabs.d.mts +0 -3
- package/dist/client/components/ui/tabs.mjs.map +0 -1
- package/dist/client/components/ui/textarea.d.mts +0 -2
- package/dist/client/components/ui/textarea.mjs.map +0 -1
- package/dist/client/components/ui/toolbar.mjs.map +0 -1
- package/dist/client/components/ui/tooltip.d.mts +0 -2
- package/dist/client/components/ui/tooltip.mjs.map +0 -1
- package/dist/client/components/widgets/chart-widget.d.mts +0 -57
- package/dist/client/components/widgets/chart-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/chart-widget.mjs.map +0 -1
- package/dist/client/components/widgets/progress-widget.d.mts +0 -41
- package/dist/client/components/widgets/progress-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/progress-widget.mjs.map +0 -1
- package/dist/client/components/widgets/quick-actions-widget.d.mts +0 -29
- package/dist/client/components/widgets/quick-actions-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/quick-actions-widget.mjs.map +0 -1
- package/dist/client/components/widgets/recent-items-widget.d.mts +0 -51
- package/dist/client/components/widgets/recent-items-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/recent-items-widget.mjs.map +0 -1
- package/dist/client/components/widgets/stats-widget.d.mts +0 -55
- package/dist/client/components/widgets/stats-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/stats-widget.mjs.map +0 -1
- package/dist/client/components/widgets/table-widget.d.mts +0 -31
- package/dist/client/components/widgets/table-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/table-widget.mjs.map +0 -1
- package/dist/client/components/widgets/timeline-widget.d.mts +0 -51
- package/dist/client/components/widgets/timeline-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/timeline-widget.mjs.map +0 -1
- package/dist/client/components/widgets/value-widget.d.mts +0 -39
- package/dist/client/components/widgets/value-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/value-widget.mjs.map +0 -1
- package/dist/client/components/widgets/widget-skeletons.mjs.map +0 -1
- package/dist/client/context/focus-context.d.mts.map +0 -1
- package/dist/client/context/focus-context.mjs.map +0 -1
- package/dist/client/contexts/breadcrumb-context.mjs.map +0 -1
- package/dist/client/hooks/typed-hooks.d.mts.map +0 -1
- package/dist/client/hooks/typed-hooks.mjs.map +0 -1
- package/dist/client/hooks/use-action.mjs.map +0 -1
- package/dist/client/hooks/use-admin-config.mjs.map +0 -1
- package/dist/client/hooks/use-admin-preferences.mjs.map +0 -1
- package/dist/client/hooks/use-admin-routes.mjs.map +0 -1
- package/dist/client/hooks/use-auth.d.mts.map +0 -1
- package/dist/client/hooks/use-auth.mjs.map +0 -1
- package/dist/client/hooks/use-collection-fields.mjs.map +0 -1
- package/dist/client/hooks/use-collection-meta.mjs.map +0 -1
- package/dist/client/hooks/use-collection-schema.mjs.map +0 -1
- package/dist/client/hooks/use-collection-validation.mjs.map +0 -1
- package/dist/client/hooks/use-collection.d.mts.map +0 -1
- package/dist/client/hooks/use-collection.mjs.map +0 -1
- package/dist/client/hooks/use-current-user.d.mts.map +0 -1
- package/dist/client/hooks/use-current-user.mjs.map +0 -1
- package/dist/client/hooks/use-field-hooks.mjs.map +0 -1
- package/dist/client/hooks/use-field-options.d.mts.map +0 -1
- package/dist/client/hooks/use-field-options.mjs.map +0 -1
- package/dist/client/hooks/use-global-fields.mjs.map +0 -1
- package/dist/client/hooks/use-global-meta.mjs.map +0 -1
- package/dist/client/hooks/use-global-schema.mjs.map +0 -1
- package/dist/client/hooks/use-global.d.mts.map +0 -1
- package/dist/client/hooks/use-global.mjs.map +0 -1
- package/dist/client/hooks/use-locks.mjs.map +0 -1
- package/dist/client/hooks/use-media-query.d.mts.map +0 -1
- package/dist/client/hooks/use-media-query.mjs.map +0 -1
- package/dist/client/hooks/use-prefill-params.mjs.map +0 -1
- package/dist/client/hooks/use-questpie-query-options.mjs.map +0 -1
- package/dist/client/hooks/use-reactive-fields.d.mts.map +0 -1
- package/dist/client/hooks/use-reactive-fields.mjs.map +0 -1
- package/dist/client/hooks/use-realtime-highlight.mjs.map +0 -1
- package/dist/client/hooks/use-saved-views.mjs.map +0 -1
- package/dist/client/hooks/use-search.mjs.map +0 -1
- package/dist/client/hooks/use-server-validation.mjs.map +0 -1
- package/dist/client/hooks/use-server-widget-data.d.mts.map +0 -1
- package/dist/client/hooks/use-server-widget-data.mjs.map +0 -1
- package/dist/client/hooks/use-setup-status.d.mts.map +0 -1
- package/dist/client/hooks/use-setup-status.mjs.map +0 -1
- package/dist/client/hooks/use-upload-collection.mjs.map +0 -1
- package/dist/client/hooks/use-upload.d.mts +0 -23
- package/dist/client/hooks/use-upload.d.mts.map +0 -1
- package/dist/client/hooks/use-upload.mjs.map +0 -1
- package/dist/client/hooks/use-validation-error-map.mjs.map +0 -1
- package/dist/client/hooks/use-view-state.mjs.map +0 -1
- package/dist/client/i18n/hooks.mjs.map +0 -1
- package/dist/client/i18n/intl-cache.mjs.map +0 -1
- package/dist/client/i18n/messages.mjs.map +0 -1
- package/dist/client/i18n/simple.d.mts.map +0 -1
- package/dist/client/i18n/simple.mjs.map +0 -1
- package/dist/client/i18n/types.d.mts.map +0 -1
- package/dist/client/lib/utils.d.mts +0 -1
- package/dist/client/lib/utils.mjs.map +0 -1
- package/dist/client/preview/block-scope-context.d.mts.map +0 -1
- package/dist/client/preview/block-scope-context.mjs.map +0 -1
- package/dist/client/preview/preview-banner.d.mts.map +0 -1
- package/dist/client/preview/preview-banner.mjs.map +0 -1
- package/dist/client/preview/preview-field.d.mts.map +0 -1
- package/dist/client/preview/preview-field.mjs.map +0 -1
- package/dist/client/preview/types.d.mts.map +0 -1
- package/dist/client/preview/types.mjs.map +0 -1
- package/dist/client/preview/use-collection-preview.d.mts.map +0 -1
- package/dist/client/preview/use-collection-preview.mjs.map +0 -1
- package/dist/client/runtime/content-locales-provider.mjs.map +0 -1
- package/dist/client/runtime/locale-scope.mjs.map +0 -1
- package/dist/client/runtime/provider.d.mts.map +0 -1
- package/dist/client/runtime/provider.mjs.map +0 -1
- package/dist/client/runtime/routes.d.mts.map +0 -1
- package/dist/client/runtime/routes.mjs.map +0 -1
- package/dist/client/runtime/translations-provider.d.mts +0 -2
- package/dist/client/runtime/translations-provider.mjs.map +0 -1
- package/dist/client/scope/picker.d.mts.map +0 -1
- package/dist/client/scope/picker.mjs.map +0 -1
- package/dist/client/scope/provider.d.mts.map +0 -1
- package/dist/client/scope/provider.mjs.map +0 -1
- package/dist/client/scope/types.d.mts.map +0 -1
- package/dist/client/utils/auto-expand-fields.mjs.map +0 -1
- package/dist/client/utils/build-field-definitions-from-schema.mjs.map +0 -1
- package/dist/client/utils/detect-relations.mjs.map +0 -1
- package/dist/client/utils/locale-to-flag.d.mts.map +0 -1
- package/dist/client/utils/locale-to-flag.mjs.map +0 -1
- package/dist/client/utils/routes.mjs.map +0 -1
- package/dist/client/views/auth/accept-invite-form.d.mts.map +0 -1
- package/dist/client/views/auth/accept-invite-form.mjs.map +0 -1
- package/dist/client/views/auth/auth-layout.d.mts.map +0 -1
- package/dist/client/views/auth/auth-layout.mjs.map +0 -1
- package/dist/client/views/auth/forgot-password-form.d.mts.map +0 -1
- package/dist/client/views/auth/forgot-password-form.mjs.map +0 -1
- package/dist/client/views/auth/index.d.mts +0 -7
- package/dist/client/views/auth/invite-form.d.mts +0 -1
- package/dist/client/views/auth/invite-form.mjs.map +0 -1
- package/dist/client/views/auth/login-form.d.mts.map +0 -1
- package/dist/client/views/auth/login-form.mjs.map +0 -1
- package/dist/client/views/auth/reset-password-form.d.mts.map +0 -1
- package/dist/client/views/auth/reset-password-form.mjs.map +0 -1
- package/dist/client/views/auth/setup-form.d.mts.map +0 -1
- package/dist/client/views/auth/setup-form.mjs.map +0 -1
- package/dist/client/views/collection/auto-form-fields.d.mts +0 -4
- package/dist/client/views/collection/auto-form-fields.mjs.map +0 -1
- package/dist/client/views/collection/bulk-action-toolbar.mjs.map +0 -1
- package/dist/client/views/collection/cells/complex-cells.d.mts +0 -46
- package/dist/client/views/collection/cells/complex-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/complex-cells.mjs.map +0 -1
- package/dist/client/views/collection/cells/index.d.mts +0 -7
- package/dist/client/views/collection/cells/primitive-cells.d.mts +0 -76
- package/dist/client/views/collection/cells/primitive-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/primitive-cells.mjs.map +0 -1
- package/dist/client/views/collection/cells/relation-cells.d.mts +0 -21
- package/dist/client/views/collection/cells/relation-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/relation-cells.mjs.map +0 -1
- package/dist/client/views/collection/cells/shared/asset-thumbnail.d.mts +0 -1
- package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs.map +0 -1
- package/dist/client/views/collection/cells/shared/cell-helpers.d.mts +0 -2
- package/dist/client/views/collection/cells/shared/cell-helpers.mjs.map +0 -1
- package/dist/client/views/collection/cells/shared/relation-chip.d.mts +0 -1
- package/dist/client/views/collection/cells/shared/relation-chip.mjs.map +0 -1
- package/dist/client/views/collection/cells/upload-cells.d.mts +0 -25
- package/dist/client/views/collection/cells/upload-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/upload-cells.mjs.map +0 -1
- package/dist/client/views/collection/columns/build-columns.d.mts +0 -2
- package/dist/client/views/collection/columns/build-columns.mjs.map +0 -1
- package/dist/client/views/collection/columns/column-defaults.d.mts +0 -2
- package/dist/client/views/collection/columns/column-defaults.mjs.map +0 -1
- package/dist/client/views/collection/columns/index.d.mts +0 -3
- package/dist/client/views/collection/columns/types.d.mts +0 -2
- package/dist/client/views/collection/field-context.mjs.map +0 -1
- package/dist/client/views/collection/field-renderer.mjs.map +0 -1
- package/dist/client/views/collection/form-view.d.mts +0 -112
- package/dist/client/views/collection/form-view.d.mts.map +0 -1
- package/dist/client/views/collection/form-view.mjs.map +0 -1
- package/dist/client/views/collection/index.d.mts +0 -9
- package/dist/client/views/collection/table-view.d.mts +0 -102
- package/dist/client/views/collection/table-view.d.mts.map +0 -1
- package/dist/client/views/collection/table-view.mjs.map +0 -1
- package/dist/client/views/collection/view-skeletons.mjs.map +0 -1
- package/dist/client/views/common/global-search.d.mts +0 -1
- package/dist/client/views/common/global-search.mjs.map +0 -1
- package/dist/client/views/common/index.d.mts +0 -1
- package/dist/client/views/dashboard/dashboard-grid.mjs.map +0 -1
- package/dist/client/views/dashboard/dashboard-widget.mjs.map +0 -1
- package/dist/client/views/dashboard/widget-card.mjs.map +0 -1
- package/dist/client/views/globals/global-form-view.d.mts +0 -74
- package/dist/client/views/globals/global-form-view.d.mts.map +0 -1
- package/dist/client/views/globals/global-form-view.mjs.map +0 -1
- package/dist/client/views/index.d.mts +0 -28
- package/dist/client/views/layout/admin-layout-provider.d.mts.map +0 -1
- package/dist/client/views/layout/admin-layout-provider.mjs.map +0 -1
- package/dist/client/views/layout/admin-layout.d.mts.map +0 -1
- package/dist/client/views/layout/admin-layout.mjs.map +0 -1
- package/dist/client/views/layout/admin-root.d.mts +0 -7
- package/dist/client/views/layout/admin-router.d.mts.map +0 -1
- package/dist/client/views/layout/admin-router.mjs.map +0 -1
- package/dist/client/views/layout/admin-sidebar.d.mts.map +0 -1
- package/dist/client/views/layout/admin-sidebar.mjs.map +0 -1
- package/dist/client/views/layout/admin-topbar.mjs.map +0 -1
- package/dist/client/views/layout/index.d.mts +0 -5
- package/dist/client/views/pages/accept-invite-page.d.mts.map +0 -1
- package/dist/client/views/pages/accept-invite-page.mjs.map +0 -1
- package/dist/client/views/pages/dashboard-page.d.mts.map +0 -1
- package/dist/client/views/pages/dashboard-page.mjs.map +0 -1
- package/dist/client/views/pages/forgot-password-page.d.mts.map +0 -1
- package/dist/client/views/pages/forgot-password-page.mjs.map +0 -1
- package/dist/client/views/pages/index.d.mts +0 -7
- package/dist/client/views/pages/invite-page.d.mts.map +0 -1
- package/dist/client/views/pages/invite-page.mjs.map +0 -1
- package/dist/client/views/pages/login-page.d.mts.map +0 -1
- package/dist/client/views/pages/login-page.mjs.map +0 -1
- package/dist/client/views/pages/reset-password-page.d.mts.map +0 -1
- package/dist/client/views/pages/reset-password-page.mjs.map +0 -1
- package/dist/client/views/pages/setup-page.d.mts.map +0 -1
- package/dist/client/views/pages/setup-page.mjs.map +0 -1
- package/dist/client.d.mts.map +0 -1
- package/dist/components/rich-text/rich-text-renderer.d.mts.map +0 -1
- package/dist/components/rich-text/rich-text-renderer.mjs.map +0 -1
- package/dist/server/adapters/nextjs.d.mts.map +0 -1
- package/dist/server/adapters/nextjs.mjs.map +0 -1
- package/dist/server/adapters/tanstack.d.mts.map +0 -1
- package/dist/server/adapters/tanstack.mjs.map +0 -1
- package/dist/server/augmentation.d.mts.map +0 -1
- package/dist/server/auth-helpers.d.mts.map +0 -1
- package/dist/server/auth-helpers.mjs.map +0 -1
- package/dist/server/block/block-builder.d.mts.map +0 -1
- package/dist/server/block/block-builder.mjs.map +0 -1
- package/dist/server/block/introspection.d.mts.map +0 -1
- package/dist/server/block/introspection.mjs.map +0 -1
- package/dist/server/block/prefetch.d.mts.map +0 -1
- package/dist/server/block/prefetch.mjs.map +0 -1
- package/dist/server/fields/blocks.d.mts.map +0 -1
- package/dist/server/fields/blocks.mjs.map +0 -1
- package/dist/server/fields/index.d.mts.map +0 -1
- package/dist/server/fields/index.mjs.map +0 -1
- package/dist/server/fields/rich-text.d.mts.map +0 -1
- package/dist/server/fields/rich-text.mjs.map +0 -1
- package/dist/server/i18n/index.d.mts +0 -16
- package/dist/server/i18n/index.d.mts.map +0 -1
- package/dist/server/i18n/index.mjs.map +0 -1
- package/dist/server/i18n/messages/cs.mjs.map +0 -1
- package/dist/server/i18n/messages/de.mjs.map +0 -1
- package/dist/server/i18n/messages/en.mjs.map +0 -1
- package/dist/server/i18n/messages/es.mjs.map +0 -1
- package/dist/server/i18n/messages/fr.mjs.map +0 -1
- package/dist/server/i18n/messages/index.mjs.map +0 -1
- package/dist/server/i18n/messages/pl.mjs.map +0 -1
- package/dist/server/i18n/messages/pt.mjs.map +0 -1
- package/dist/server/i18n/messages/sk.mjs.map +0 -1
- package/dist/server/index.d.mts +0 -20
- package/dist/server/modules/admin/functions/admin-config.mjs +0 -348
- package/dist/server/modules/admin/functions/admin-config.mjs.map +0 -1
- package/dist/server/modules/admin/functions/execute-action.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/execute-action.mjs.map +0 -1
- package/dist/server/modules/admin/functions/locales.mjs +0 -80
- package/dist/server/modules/admin/functions/locales.mjs.map +0 -1
- package/dist/server/modules/admin/functions/preview.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/preview.mjs.map +0 -1
- package/dist/server/modules/admin/functions/reactive.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/reactive.mjs.map +0 -1
- package/dist/server/modules/admin/functions/setup.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/setup.mjs +0 -131
- package/dist/server/modules/admin/functions/setup.mjs.map +0 -1
- package/dist/server/modules/admin/functions/translations.mjs +0 -125
- package/dist/server/modules/admin/functions/translations.mjs.map +0 -1
- package/dist/server/modules/admin/functions/widget-data.d.mts +0 -33
- package/dist/server/modules/admin/functions/widget-data.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/widget-data.mjs +0 -70
- package/dist/server/modules/admin/functions/widget-data.mjs.map +0 -1
- package/dist/server/modules/admin/index.d.mts.map +0 -1
- package/dist/server/modules/admin/index.mjs.map +0 -1
- package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.d.mts +0 -3
- package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.mjs.map +0 -1
- package/dist/server/modules/admin-preferences/collections/locks.collection.d.mts +0 -3
- package/dist/server/modules/admin-preferences/collections/locks.collection.mjs.map +0 -1
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts +0 -1490
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts.map +0 -1
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs +0 -57
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs.map +0 -1
- package/dist/server/patch.d.mts +0 -100
- package/dist/server/patch.d.mts.map +0 -1
- package/dist/server/patch.mjs +0 -1062
- package/dist/server/patch.mjs.map +0 -1
- package/dist/shared/preview-utils.d.mts.map +0 -1
- package/dist/shared/preview-utils.mjs.map +0 -1
- package/dist/shared/types/saved-views.types.d.mts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auto-form-fields.mjs","names":["React","result: any"],"sources":["../../../../src/client/views/collection/auto-form-fields.tsx"],"sourcesContent":["/**\n * AutoFormFields Component\n *\n * Automatically generates form fields from CollectionBuilderState:\n * - Reads field definitions (FieldDefinition) from config.fields\n * - Reads form layout (FormViewConfig) from config.form\n * - Supports recursive tabs/sections nesting\n * - Auto-generates fields when no form config is defined\n */\n\nimport type { CollectionSchema, Questpie } from \"questpie\";\nimport * as React from \"react\";\nimport { useFormContext, useWatch } from \"react-hook-form\";\nimport type {\n\tComponentRegistry,\n\tFieldLayoutItem,\n\tFormSidebarConfig,\n\tFormViewConfig,\n\tSectionLayout,\n\tTabConfig,\n\tTabsLayout,\n} from \"../../builder\";\nimport type { FieldDefinition } from \"../../builder/field/field\";\nimport {\n\tgetFieldName,\n\tisFieldReference,\n} from \"../../builder/types/field-types\";\nimport { resolveIconElement } from \"../../components/component-renderer\";\nimport { getGridColumnsClass } from \"../../components/fields/field-utils\";\nimport {\n\tAccordion,\n\tAccordionContent,\n\tAccordionItem,\n\tAccordionTrigger,\n} from \"../../components/ui/accordion\";\nimport {\n\tTabs,\n\tTabsContent,\n\tTabsList,\n\tTabsTrigger,\n} from \"../../components/ui/tabs\";\nimport { useCollectionFields } from \"../../hooks/use-collection-fields\";\nimport { useGlobalFields } from \"../../hooks/use-global-fields\";\nimport { useResolveText } from \"../../i18n/hooks\";\nimport { cn } from \"../../utils\";\nimport { getFullFieldName, resolveValue } from \"./field-context\";\nimport { FieldRenderer } from \"./field-renderer\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Collection config as expected by AutoFormFields\n * This matches CollectionBuilderState structure\n */\ninterface CollectionConfig {\n\tname?: string;\n\tfields?: Record<string, FieldDefinition>;\n\tform?: FormViewConfig;\n}\n\ntype AdminFormSchema = CollectionSchema[\"admin\"] extends infer TAdmin\n\t? TAdmin extends { form?: infer TForm }\n\t\t? TForm\n\t\t: undefined\n\t: undefined;\n\nexport interface AutoFormFieldsProps<\n\tT extends Questpie<any> = Questpie<any>,\n\tK extends string = string,\n> {\n\t/**\n\t * CMS instance (for schema introspection) - optional\n\t */\n\tcms?: T;\n\n\t/**\n\t * Collection or global name\n\t */\n\tcollection: K;\n\n\t/**\n\t * Schema source mode.\n\t * - \"collection\": Fetch collection schema (default)\n\t * - \"global\": Fetch global schema\n\t * @default \"collection\"\n\t */\n\tmode?: \"collection\" | \"global\";\n\n\t/**\n\t * Collection config (CollectionBuilderState)\n\t */\n\tconfig?: CollectionConfig;\n\n\t/**\n\t * Component registry for custom field types\n\t */\n\tregistry?: ComponentRegistry;\n\n\t/**\n\t * Custom field renderer (fallback)\n\t */\n\trenderField?: (\n\t\tfieldName: string,\n\t\tfieldDef?: FieldDefinition,\n\t) => React.ReactNode;\n\n\t/**\n\t * Field name prefix for nested fields\n\t */\n\tfieldPrefix?: string;\n\n\t/**\n\t * All collection configs (for embedded collections)\n\t */\n\tallCollectionsConfig?: Record<string, CollectionConfig>;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Normalize FieldLayoutItem to field name\n * Only handles field references, returns null for layout containers\n */\nfunction normalizeFieldItem(item: FieldLayoutItem): {\n\tfield: string;\n\tclassName?: string;\n} | null {\n\tif (typeof item === \"string\") {\n\t\treturn { field: item };\n\t}\n\tif (\n\t\ttypeof item === \"object\" &&\n\t\titem !== null &&\n\t\t\"field\" in item &&\n\t\ttypeof item.field === \"string\"\n\t) {\n\t\treturn {\n\t\t\tfield: item.field,\n\t\t\tclassName: \"className\" in item ? item.className : undefined,\n\t\t};\n\t}\n\treturn null;\n}\n\n// ============================================================================\n// Layout Helpers\n// ============================================================================\n\nfunction getGapStyle(gap?: number) {\n\tif (gap === undefined) return undefined;\n\treturn `${gap * 0.25}rem`;\n}\n\n// ============================================================================\n// Schema Mapping Helpers\n// ============================================================================\n\nfunction formatTabId(label: unknown, index: number): string {\n\tif (typeof label === \"string\") {\n\t\tconst normalized = label\n\t\t\t.toLowerCase()\n\t\t\t.replace(/\\s+/g, \"-\")\n\t\t\t.replace(/[^a-z0-9-_]/g, \"\");\n\t\treturn normalized || `tab-${index}`;\n\t}\n\tif (label && typeof label === \"object\" && \"key\" in label) {\n\t\tconst key = (label as { key?: string }).key;\n\t\tif (key) return key;\n\t}\n\treturn `tab-${index}`;\n}\n\nfunction mapSectionsToLayout(\n\tsections: Array<{\n\t\tlabel?: any;\n\t\tdescription?: any;\n\t\tfields: FieldLayoutItem[];\n\t\tcollapsible?: boolean;\n\t\tdefaultCollapsed?: boolean;\n\t}>,\n): FieldLayoutItem[] {\n\treturn sections.map((section) => ({\n\t\ttype: \"section\",\n\t\tlabel: section.label,\n\t\tdescription: section.description,\n\t\tfields: section.fields,\n\t\twrapper: section.collapsible ? \"collapsible\" : \"flat\",\n\t\tdefaultCollapsed: section.defaultCollapsed,\n\t}));\n}\n\nfunction mapFormSchemaToConfig(\n\tform?: AdminFormSchema,\n): FormViewConfig | undefined {\n\tif (!form) return undefined;\n\n\t// New format: form already has the correct FormViewConfig structure\n\t// with fields array containing inline sections/tabs\n\tif (form.fields?.length) {\n\t\treturn {\n\t\t\tfields: form.fields as FieldLayoutItem[],\n\t\t\tsidebar: form.sidebar as FormSidebarConfig | undefined,\n\t\t};\n\t}\n\n\treturn undefined;\n}\n\n// ============================================================================\n// Field Layout Renderers (Recursive)\n// ============================================================================\n\ninterface FieldLayoutRendererProps {\n\tfieldItems: FieldLayoutItem[];\n\tfields: Record<string, FieldDefinition>;\n\tcollection: string;\n\tmode?: \"collection\" | \"global\";\n\tregistry?: ComponentRegistry;\n\tfieldPrefix?: string;\n\tallCollectionsConfig?: Record<string, CollectionConfig>;\n\texcludedFields?: Set<string>;\n\tformValues: any;\n\tresolveText: (\n\t\ttext: any,\n\t\tfallback?: string,\n\t\tcontextValues?: Record<string, any>,\n\t) => string;\n}\n\n/**\n * Render fields list\n */\nfunction renderFields({\n\tfieldItems,\n\tfields,\n\tcollection,\n\tmode = \"collection\",\n\tregistry,\n\tfieldPrefix,\n\tallCollectionsConfig,\n\texcludedFields,\n\tcolumns = 1,\n\tgap,\n\tclassName,\n}: {\n\tfieldItems: FieldLayoutItem[];\n\tfields: Record<string, FieldDefinition>;\n\tcollection: string;\n\tmode?: \"collection\" | \"global\";\n\tregistry?: ComponentRegistry;\n\tfieldPrefix?: string;\n\tallCollectionsConfig?: Record<string, CollectionConfig>;\n\texcludedFields?: Set<string>;\n\tcolumns?: number;\n\tgap?: number;\n\tclassName?: string;\n}) {\n\tconst visibleFields = fieldItems\n\t\t.map(normalizeFieldItem)\n\t\t.filter(\n\t\t\t(item): item is { field: string; className?: string } => item !== null,\n\t\t)\n\t\t.filter((item) => !excludedFields?.has(item.field));\n\n\tif (!visibleFields.length) return null;\n\n\tconst gridClass = columns > 1 ? getGridColumnsClass(columns, true) : \"\";\n\n\t// Calculate if last field should span full width\n\t// (when there's an odd number of fields in a multi-column grid)\n\tconst shouldLastFieldSpan =\n\t\tcolumns > 1 && visibleFields.length % columns !== 0;\n\n\tconst fieldElements = visibleFields.map((item, index) => {\n\t\tconst isLast = index === visibleFields.length - 1;\n\t\t// Use col-span-full for last item that would be alone in its row\n\t\tconst spanClass = isLast && shouldLastFieldSpan ? \"col-span-full\" : \"\";\n\n\t\treturn (\n\t\t\t<FieldRenderer\n\t\t\t\tkey={item.field}\n\t\t\t\tfieldName={item.field}\n\t\t\t\tfieldDef={fields[item.field]}\n\t\t\t\tcollection={collection}\n\t\t\t\tmode={mode}\n\t\t\t\tregistry={registry}\n\t\t\t\tfieldPrefix={fieldPrefix}\n\t\t\t\tallCollectionsConfig={allCollectionsConfig}\n\t\t\t\tclassName={cn(item.className, spanClass)}\n\t\t\t\trenderEmbeddedFields={({\n\t\t\t\t\tembeddedCollection,\n\t\t\t\t\tembeddedCollectionConfig,\n\t\t\t\t\tfullFieldName,\n\t\t\t\t\tindex: embeddedIndex,\n\t\t\t\t}) => (\n\t\t\t\t\t<AutoFormFields\n\t\t\t\t\t\tcollection={embeddedCollection}\n\t\t\t\t\t\tmode=\"collection\"\n\t\t\t\t\t\tconfig={embeddedCollectionConfig}\n\t\t\t\t\t\tregistry={registry}\n\t\t\t\t\t\tfieldPrefix={`${fullFieldName}.${embeddedIndex}`}\n\t\t\t\t\t\tallCollectionsConfig={allCollectionsConfig}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t);\n\t});\n\n\t// Grid uses container query breakpoints (@sm:, @md:, etc.)\n\t// These respond to the nearest @container ancestor (defined in AutoFormFields wrapper)\n\tif (columns > 1) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\"grid gap-4\", gridClass, className)}\n\t\t\t\tstyle={gap ? { gap: getGapStyle(gap) } : undefined}\n\t\t\t>\n\t\t\t\t{fieldElements}\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Single column - no grid needed\n\treturn <div className={cn(\"space-y-4\", className)}>{fieldElements}</div>;\n}\n\n/**\n * Render field layout items (fields, sections, tabs)\n *\n * NEW API: fields array can contain:\n * - Field references (string or {field, className})\n * - Section layouts ({ type: 'section', ... })\n * - Tabs layouts ({ type: 'tabs', ... })\n */\nfunction getLayoutKey(item: SectionLayout | TabsLayout): string {\n\tif (item.type === \"tabs\") {\n\t\tconst tabKey = item.tabs\n\t\t\t.map((tab: TabConfig) => tab.id)\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"-\");\n\t\treturn tabKey ? `tabs-${tabKey}` : \"tabs\";\n\t}\n\n\tconst fieldKey = item.fields\n\t\t.map((fieldItem: FieldLayoutItem) => {\n\t\t\tif (isFieldReference(fieldItem)) {\n\t\t\t\treturn getFieldName(fieldItem) ?? \"field\";\n\t\t\t}\n\t\t\tif (typeof fieldItem === \"object\" && \"type\" in fieldItem) {\n\t\t\t\treturn fieldItem.type;\n\t\t\t}\n\t\t\treturn \"item\";\n\t\t})\n\t\t.join(\"-\");\n\n\treturn fieldKey ? `section-${fieldKey}` : \"section\";\n}\n\nfunction renderFieldLayoutItems({\n\tfieldItems,\n\tfields,\n\tcollection,\n\tmode = \"collection\",\n\tregistry,\n\tfieldPrefix,\n\tallCollectionsConfig,\n\texcludedFields,\n\tformValues,\n\tresolveText,\n}: FieldLayoutRendererProps): React.ReactNode {\n\tif (!fieldItems?.length) return null;\n\n\tconst renderedItems = fieldItems.map((item, index) => {\n\t\t// Field reference (string or {field, className})\n\t\tif (isFieldReference(item)) {\n\t\t\tconst fieldName = getFieldName(item);\n\t\t\tif (!fieldName || !fields[fieldName]) return null;\n\n\t\t\t// Check if excluded\n\t\t\tif (excludedFields?.has(fieldName)) return null;\n\n\t\t\t// Check if hidden\n\t\t\tconst fieldDef = fields[fieldName];\n\t\t\tconst fieldOptions = (fieldDef as any)[\"~options\"] || {};\n\t\t\tconst isHidden =\n\t\t\t\ttypeof fieldOptions.hidden === \"function\"\n\t\t\t\t\t? fieldOptions.hidden(formValues)\n\t\t\t\t\t: fieldOptions.hidden === true;\n\t\t\tif (isHidden) return null;\n\n\t\t\treturn (\n\t\t\t\t<FieldRenderer\n\t\t\t\t\tkey={fieldName}\n\t\t\t\t\tfieldName={fieldName}\n\t\t\t\t\tfieldDef={fieldDef}\n\t\t\t\t\tcollection={collection}\n\t\t\t\t\tmode={mode}\n\t\t\t\t\tregistry={registry}\n\t\t\t\t\tfieldPrefix={fieldPrefix}\n\t\t\t\t\tallCollectionsConfig={allCollectionsConfig}\n\t\t\t\t\tclassName={\n\t\t\t\t\t\ttypeof item === \"object\" && \"className\" in item\n\t\t\t\t\t\t\t? item.className\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\trenderEmbeddedFields={({\n\t\t\t\t\t\tembeddedCollection,\n\t\t\t\t\t\tembeddedCollectionConfig,\n\t\t\t\t\t\tfullFieldName,\n\t\t\t\t\t\tindex: embeddedIndex,\n\t\t\t\t\t}) => (\n\t\t\t\t\t\t<AutoFormFields\n\t\t\t\t\t\t\tcollection={embeddedCollection}\n\t\t\t\t\t\t\tmode=\"collection\"\n\t\t\t\t\t\t\tconfig={embeddedCollectionConfig}\n\t\t\t\t\t\t\tregistry={registry}\n\t\t\t\t\t\t\tfieldPrefix={`${fullFieldName}.${embeddedIndex}`}\n\t\t\t\t\t\t\tallCollectionsConfig={allCollectionsConfig}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\t// Layout containers\n\t\tif (typeof item === \"object\" && \"type\" in item) {\n\t\t\tswitch (item.type) {\n\t\t\t\tcase \"tabs\":\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<React.Fragment key={getLayoutKey(item)}>\n\t\t\t\t\t\t\t{renderTabs({\n\t\t\t\t\t\t\t\ttabsLayout: item,\n\t\t\t\t\t\t\t\tfields,\n\t\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\t\tmode,\n\t\t\t\t\t\t\t\tregistry,\n\t\t\t\t\t\t\t\tfieldPrefix,\n\t\t\t\t\t\t\t\tallCollectionsConfig,\n\t\t\t\t\t\t\t\texcludedFields,\n\t\t\t\t\t\t\t\tformValues,\n\t\t\t\t\t\t\t\tresolveText,\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</React.Fragment>\n\t\t\t\t\t);\n\n\t\t\t\tcase \"section\":\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<React.Fragment key={getLayoutKey(item)}>\n\t\t\t\t\t\t\t{renderSection({\n\t\t\t\t\t\t\t\tsection: item,\n\t\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\t\tfields,\n\t\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\t\tmode,\n\t\t\t\t\t\t\t\tregistry,\n\t\t\t\t\t\t\t\tfieldPrefix,\n\t\t\t\t\t\t\t\tallCollectionsConfig,\n\t\t\t\t\t\t\t\texcludedFields,\n\t\t\t\t\t\t\t\tformValues,\n\t\t\t\t\t\t\t\tresolveText,\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</React.Fragment>\n\t\t\t\t\t);\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t});\n\n\tconst validItems = renderedItems.filter(Boolean);\n\n\treturn validItems.length === 1 ? (\n\t\tvalidItems[0]\n\t) : (\n\t\t<div className=\"space-y-6\">{validItems}</div>\n\t);\n}\n\n/**\n * Render a section layout\n * Mirrors object field: wrapper (flat|collapsible) + layout (stack|inline|grid)\n */\nfunction renderSection({\n\tsection,\n\tindex,\n\tfields,\n\tcollection,\n\tmode = \"collection\",\n\tregistry,\n\tfieldPrefix,\n\tallCollectionsConfig,\n\texcludedFields,\n\tformValues,\n\tresolveText,\n}: {\n\tsection: SectionLayout;\n\tindex: number;\n\tfields: Record<string, FieldDefinition>;\n\tcollection: string;\n\tmode?: \"collection\" | \"global\";\n\tregistry?: ComponentRegistry;\n\tfieldPrefix?: string;\n\tallCollectionsConfig?: Record<string, CollectionConfig>;\n\texcludedFields?: Set<string>;\n\tformValues: any;\n\tresolveText: (\n\t\ttext: any,\n\t\tfallback?: string,\n\t\tcontextValues?: Record<string, any>,\n\t) => string;\n}): React.ReactNode {\n\t// Check if hidden\n\tconst isHidden = resolveValue(section.hidden, formValues, false);\n\tif (isHidden) return null;\n\n\tconst wrapper = section.wrapper ?? \"flat\";\n\tconst layout = section.layout ?? \"stack\";\n\tconst columns = section.columns ?? 2;\n\tconst gap = section.gap;\n\n\t// Render section fields based on layout mode\n\tconst renderSectionFields = () => {\n\t\tif (layout === \"grid\") {\n\t\t\t// Grid layout - use renderFields with columns\n\t\t\treturn renderFields({\n\t\t\t\tfieldItems: section.fields,\n\t\t\t\tfields,\n\t\t\t\tcollection,\n\t\t\t\tmode,\n\t\t\t\tregistry,\n\t\t\t\tfieldPrefix,\n\t\t\t\tallCollectionsConfig,\n\t\t\t\texcludedFields,\n\t\t\t\tcolumns,\n\t\t\t\tgap,\n\t\t\t\tclassName: section.className,\n\t\t\t});\n\t\t}\n\n\t\tif (layout === \"inline\") {\n\t\t\t// Inline layout - horizontal flexbox\n\t\t\treturn (\n\t\t\t\t<div className={cn(\"flex flex-wrap gap-4\", section.className)}>\n\t\t\t\t\t{section.fields.map((item, _idx) => {\n\t\t\t\t\t\tconst fieldName = getFieldName(item);\n\t\t\t\t\t\tif (!fieldName || !fields[fieldName]) return null;\n\t\t\t\t\t\tif (excludedFields?.has(fieldName)) return null;\n\n\t\t\t\t\t\tconst fieldDef = fields[fieldName];\n\t\t\t\t\t\tconst fieldOptions = (fieldDef as any)[\"~options\"] || {};\n\t\t\t\t\t\tconst isVis =\n\t\t\t\t\t\t\ttypeof fieldOptions.visible === \"function\"\n\t\t\t\t\t\t\t\t? fieldOptions.visible(formValues)\n\t\t\t\t\t\t\t\t: fieldOptions.visible !== false;\n\t\t\t\t\t\tif (!isVis) return null;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<FieldRenderer\n\t\t\t\t\t\t\t\tkey={fieldName}\n\t\t\t\t\t\t\t\tfieldName={fieldName}\n\t\t\t\t\t\t\t\tfieldDef={fieldDef}\n\t\t\t\t\t\t\t\tcollection={collection}\n\t\t\t\t\t\t\t\tmode={mode}\n\t\t\t\t\t\t\t\tregistry={registry}\n\t\t\t\t\t\t\t\tfieldPrefix={fieldPrefix}\n\t\t\t\t\t\t\t\tallCollectionsConfig={allCollectionsConfig}\n\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\ttypeof item === \"object\" && \"className\" in item\n\t\t\t\t\t\t\t\t\t\t? item.className\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\trenderEmbeddedFields={({\n\t\t\t\t\t\t\t\t\tembeddedCollection,\n\t\t\t\t\t\t\t\t\tembeddedCollectionConfig,\n\t\t\t\t\t\t\t\t\tfullFieldName,\n\t\t\t\t\t\t\t\t\tindex: embeddedIndex,\n\t\t\t\t\t\t\t\t}) => (\n\t\t\t\t\t\t\t\t\t<AutoFormFields\n\t\t\t\t\t\t\t\t\t\tcollection={embeddedCollection}\n\t\t\t\t\t\t\t\t\t\tmode=\"collection\"\n\t\t\t\t\t\t\t\t\t\tconfig={embeddedCollectionConfig}\n\t\t\t\t\t\t\t\t\t\tregistry={registry}\n\t\t\t\t\t\t\t\t\t\tfieldPrefix={`${fullFieldName}.${embeddedIndex}`}\n\t\t\t\t\t\t\t\t\t\tallCollectionsConfig={allCollectionsConfig}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\t// Stack layout (default) - render using main function\n\t\treturn renderFieldLayoutItems({\n\t\t\tfieldItems: section.fields,\n\t\t\tfields,\n\t\t\tcollection,\n\t\t\tmode,\n\t\t\tregistry,\n\t\t\tfieldPrefix,\n\t\t\tallCollectionsConfig,\n\t\t\texcludedFields,\n\t\t\tformValues,\n\t\t\tresolveText,\n\t\t});\n\t};\n\n\tconst content = renderSectionFields();\n\tif (!content) return null;\n\n\t// Section header\n\tconst header =\n\t\tsection.label || section.description ? (\n\t\t\t<div className=\"mb-4\">\n\t\t\t\t{section.label && (\n\t\t\t\t\t<h3 className=\"text-lg font-semibold\">\n\t\t\t\t\t\t{resolveText(section.label, \"\", formValues)}\n\t\t\t\t\t</h3>\n\t\t\t\t)}\n\t\t\t\t{section.description && (\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground mt-1\">\n\t\t\t\t\t\t{resolveText(section.description, \"\", formValues)}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t) : null;\n\n\t// Collapsible wrapper\n\tif (wrapper === \"collapsible\") {\n\t\tconst value = `section-${index}`;\n\t\tconst defaultOpen = section.defaultCollapsed !== true;\n\n\t\treturn (\n\t\t\t<Accordion\n\t\t\t\tkey={value}\n\t\t\t\tdefaultValue={defaultOpen ? [value] : []}\n\t\t\t\tclassName=\"w-full\"\n\t\t\t>\n\t\t\t\t<AccordionItem value={value} className=\"border rounded-lg px-4\">\n\t\t\t\t\t<AccordionTrigger className=\"hover:no-underline\">\n\t\t\t\t\t\t<span className=\"font-semibold\">\n\t\t\t\t\t\t\t{resolveText(section.label, \"Section\", formValues)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</AccordionTrigger>\n\t\t\t\t\t<AccordionContent className=\"pt-2 pb-4\">\n\t\t\t\t\t\t{section.description && (\n\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground mb-4\">\n\t\t\t\t\t\t\t\t{resolveText(section.description, \"\", formValues)}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</AccordionContent>\n\t\t\t\t</AccordionItem>\n\t\t\t</Accordion>\n\t\t);\n\t}\n\n\t// Flat wrapper (no visual container)\n\treturn (\n\t\t<div className={cn(\"space-y-4\", section.className)}>\n\t\t\t{header}\n\t\t\t{content}\n\t\t</div>\n\t);\n}\n\n/**\n * Render tabs layout\n */\nfunction renderTabs({\n\ttabsLayout,\n\tfields,\n\tcollection,\n\tmode = \"collection\",\n\tregistry,\n\tfieldPrefix,\n\tallCollectionsConfig,\n\texcludedFields,\n\tformValues,\n\tresolveText,\n}: {\n\ttabsLayout: TabsLayout;\n\tfields: Record<string, FieldDefinition>;\n\tcollection: string;\n\tmode?: \"collection\" | \"global\";\n\tregistry?: ComponentRegistry;\n\tfieldPrefix?: string;\n\tallCollectionsConfig?: Record<string, CollectionConfig>;\n\texcludedFields?: Set<string>;\n\tformValues: any;\n\tresolveText: (\n\t\ttext: any,\n\t\tfallback?: string,\n\t\tcontextValues?: Record<string, any>,\n\t) => string;\n}): React.ReactNode {\n\tconst visibleTabs = tabsLayout.tabs.filter(\n\t\t(tab: TabConfig) => !resolveValue(tab.hidden, formValues, false),\n\t);\n\n\tif (!visibleTabs.length) return null;\n\n\tconst defaultTab = visibleTabs[0]?.id;\n\n\treturn (\n\t\t<Tabs defaultValue={defaultTab}>\n\t\t\t<TabsList variant=\"line\">\n\t\t\t\t{visibleTabs.map((tab: TabConfig) => (\n\t\t\t\t\t<TabsTrigger key={tab.id} value={tab.id}>\n\t\t\t\t\t\t{resolveIconElement(tab.icon, { className: \"mr-2 size-4\" })}\n\t\t\t\t\t\t{resolveText(tab.label, tab.id, formValues)}\n\t\t\t\t\t</TabsTrigger>\n\t\t\t\t))}\n\t\t\t</TabsList>\n\t\t\t{visibleTabs.map((tab: TabConfig) => (\n\t\t\t\t<TabsContent key={tab.id} value={tab.id} className=\"mt-4\">\n\t\t\t\t\t{renderFieldLayoutItems({\n\t\t\t\t\t\tfieldItems: tab.fields,\n\t\t\t\t\t\tfields,\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t\tmode,\n\t\t\t\t\t\tregistry,\n\t\t\t\t\t\tfieldPrefix,\n\t\t\t\t\t\tallCollectionsConfig,\n\t\t\t\t\t\texcludedFields,\n\t\t\t\t\t\tformValues,\n\t\t\t\t\t\tresolveText,\n\t\t\t\t\t})}\n\t\t\t\t</TabsContent>\n\t\t\t))}\n\t\t</Tabs>\n\t);\n}\n\n/**\n * Render sidebar content\n */\nfunction renderSidebar({\n\tsidebar,\n\tfields,\n\tcollection,\n\tmode = \"collection\",\n\tregistry,\n\tfieldPrefix,\n\tallCollectionsConfig,\n\tformValues,\n\tresolveText,\n}: {\n\tsidebar: FormSidebarConfig;\n\tfields: Record<string, FieldDefinition>;\n\tcollection: string;\n\tmode?: \"collection\" | \"global\";\n\tregistry?: ComponentRegistry;\n\tfieldPrefix?: string;\n\tallCollectionsConfig?: Record<string, CollectionConfig>;\n\tformValues: any;\n\tresolveText: (\n\t\ttext: any,\n\t\tfallback?: string,\n\t\tcontextValues?: Record<string, any>,\n\t) => string;\n}): React.ReactNode {\n\treturn renderFieldLayoutItems({\n\t\tfieldItems: sidebar.fields,\n\t\tfields,\n\t\tcollection,\n\t\tmode,\n\t\tregistry,\n\t\tfieldPrefix,\n\t\tallCollectionsConfig,\n\t\tformValues,\n\t\tresolveText,\n\t});\n}\n\n/**\n * Extract field names from field layout items recursively\n */\nfunction extractFieldNamesFromFieldItems(\n\tfieldItems?: FieldLayoutItem[],\n): Set<string> {\n\tconst fieldNames = new Set<string>();\n\n\tif (!fieldItems) return fieldNames;\n\n\tfor (const item of fieldItems) {\n\t\t// Field reference\n\t\tif (isFieldReference(item)) {\n\t\t\tconst fieldName = getFieldName(item);\n\t\t\tif (fieldName) fieldNames.add(fieldName);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Layout containers\n\t\tif (typeof item === \"object\" && \"type\" in item) {\n\t\t\tswitch (item.type) {\n\t\t\t\tcase \"tabs\":\n\t\t\t\t\tfor (const tab of item.tabs) {\n\t\t\t\t\t\tconst tabFields = extractFieldNamesFromFieldItems(tab.fields);\n\t\t\t\t\t\tfor (const f of tabFields) fieldNames.add(f);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"section\": {\n\t\t\t\t\tconst sectionFields = extractFieldNamesFromFieldItems(item.fields);\n\t\t\t\t\tfor (const f of sectionFields) fieldNames.add(f);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fieldNames;\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\n/**\n * AutoFormFields Component\n *\n * Renders form fields based on CollectionBuilderState config.\n * Supports recursive tabs/sections nesting and auto-generates\n * field list when no form config is defined.\n */\nexport function AutoFormFields<T extends Questpie<any>, K extends string>({\n\tcms: _cms,\n\tcollection,\n\tmode = \"collection\",\n\tconfig,\n\tregistry,\n\trenderField,\n\tfieldPrefix,\n\tallCollectionsConfig,\n}: AutoFormFieldsProps<T, K>): React.ReactElement {\n\t// Use the appropriate hook based on mode\n\tconst collectionResult = useCollectionFields(\n\t\tmode === \"collection\" ? collection : \"\",\n\t\t{\n\t\t\tfallbackFields: mode === \"collection\" ? config?.fields : undefined,\n\t\t\tschemaQueryOptions: { enabled: mode === \"collection\" },\n\t\t},\n\t);\n\tconst globalResult = useGlobalFields(mode === \"global\" ? collection : \"\", {\n\t\tschemaQueryOptions: { enabled: mode === \"global\" },\n\t});\n\n\tconst resolvedFields =\n\t\tmode === \"global\"\n\t\t\t? { ...globalResult.fields, ...config?.fields }\n\t\t\t: collectionResult.fields;\n\tconst schema =\n\t\tmode === \"global\" ? (globalResult.schema as any) : collectionResult.schema;\n\tconst form = useFormContext() as any;\n\t// Use useWatch hook (React pattern) instead of form.watch() method\n\t// Watch all form values - the fieldPrefix scoping is handled below\n\tconst watchedValues = useWatch({ control: form.control });\n\n\t// Extract the scoped values if fieldPrefix is provided\n\tconst formValues = React.useMemo(() => {\n\t\tif (!watchedValues) return {};\n\t\tif (!fieldPrefix) return watchedValues as Record<string, any>;\n\t\t// Navigate to the nested path\n\t\tconst parts = fieldPrefix.split(\".\");\n\t\tlet result: any = watchedValues;\n\t\tfor (const part of parts) {\n\t\t\tresult = result?.[part];\n\t\t\tif (result === undefined) return {};\n\t\t}\n\t\treturn (result ?? {}) as Record<string, any>;\n\t}, [watchedValues, fieldPrefix]);\n\n\tconst resolveText = useResolveText();\n\n\t// Get fields config\n\tconst fields = (resolvedFields || {}) as Record<string, FieldDefinition>;\n\n\t// Extract form config from view builder (~config property)\n\tconst schemaFormConfig = mapFormSchemaToConfig(schema?.admin?.form);\n\tconst formConfig =\n\t\t(config?.form as any)?.[\"~config\"] ?? config?.form ?? schemaFormConfig;\n\n\t// Get all field names for auto-generation\n\tconst allFieldNames = Object.keys(fields);\n\n\t// Collect sidebar field names to exclude from main content\n\tconst sidebarFieldNames = formConfig?.sidebar\n\t\t? extractFieldNamesFromFieldItems(formConfig.sidebar.fields)\n\t\t: new Set<string>();\n\n\t// Custom render function provided\n\tif (renderField) {\n\t\treturn (\n\t\t\t<div className=\"space-y-4\">\n\t\t\t\t{allFieldNames.map((fieldName) => {\n\t\t\t\t\tconst fullFieldName = getFullFieldName(fieldName, fieldPrefix);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<React.Fragment key={fullFieldName}>\n\t\t\t\t\t\t\t{renderField(fullFieldName, fields[fieldName])}\n\t\t\t\t\t\t</React.Fragment>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Render main content based on form config\n\tconst renderMainContent = () => {\n\t\t// If form config has fields, render them\n\t\tif (formConfig?.fields?.length) {\n\t\t\treturn renderFieldLayoutItems({\n\t\t\t\tfieldItems: formConfig.fields,\n\t\t\t\tfields,\n\t\t\t\tcollection,\n\t\t\t\tmode,\n\t\t\t\tregistry,\n\t\t\t\tfieldPrefix,\n\t\t\t\tallCollectionsConfig,\n\t\t\t\texcludedFields: sidebarFieldNames,\n\t\t\t\tformValues,\n\t\t\t\tresolveText,\n\t\t\t});\n\t\t}\n\n\t\t// Auto-generate: render all fields not in sidebar\n\t\tconst autoFields = allFieldNames.filter((f) => !sidebarFieldNames.has(f));\n\t\tif (autoFields.length) {\n\t\t\treturn renderFields({\n\t\t\t\tfieldItems: autoFields,\n\t\t\t\tfields,\n\t\t\t\tcollection,\n\t\t\t\tmode,\n\t\t\t\tregistry,\n\t\t\t\tfieldPrefix,\n\t\t\t\tallCollectionsConfig,\n\t\t\t});\n\t\t}\n\n\t\treturn null;\n\t};\n\n\tconst mainContent = renderMainContent();\n\n\t// Check if sidebar layout is needed\n\tconst hasSidebar = formConfig?.sidebar?.fields?.length;\n\n\tif (hasSidebar && formConfig?.sidebar) {\n\t\tconst sidebarContent = renderSidebar({\n\t\t\tsidebar: formConfig.sidebar,\n\t\t\tfields,\n\t\t\tcollection,\n\t\t\tmode,\n\t\t\tregistry,\n\t\t\tfieldPrefix,\n\t\t\tallCollectionsConfig,\n\t\t\tformValues,\n\t\t\tresolveText,\n\t\t});\n\n\t\tconst sidebarPosition = formConfig.sidebar.position || \"right\";\n\n\t\t// Single @container on outermost wrapper for all container queries\n\t\treturn (\n\t\t\t<div className=\"@container w-full\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex flex-col-reverse gap-6 @2xl:flex-row\",\n\t\t\t\t\t\tsidebarPosition === \"left\" && \"@2xl:flex-row-reverse\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"min-w-0 flex-1\">{mainContent}</div>\n\t\t\t\t\t{sidebarContent && (\n\t\t\t\t\t\t<aside\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"@2xl:border-l @max-2xl:border-b @max-2xl:pb-4 w-full border-border @2xl:pl-4\",\n\t\t\t\t\t\t\t\t\"w-full @2xl:max-w-xs\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"space-y-4 @2xl:sticky @2xl:h-auto @2xl:top-4\">\n\t\t\t\t\t\t\t\t{sidebarContent}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</aside>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn <div className=\"@container\">{mainContent}</div>;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bulk-action-toolbar.mjs","names":["React","actionQueryClient: ActionQueryClient","ctx: ActionContext<TItem[]>"],"sources":["../../../../src/client/views/collection/bulk-action-toolbar.tsx"],"sourcesContent":["/**\n * Floating Toolbar\n *\n * Unified floating toolbar that displays when:\n * - Rows are selected in a table view (bulk actions)\n * - Filters are active (filter indicator)\n *\n * Combines both functionalities into a single non-jumping UI element.\n */\n\n\"use client\";\n\nimport { Icon } from \"@iconify/react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport type { Table } from \"@tanstack/react-table\";\nimport * as React from \"react\";\nimport type {\n ActionContext,\n ActionDefinition,\n ActionHelpers,\n ActionQueryClient,\n} from \"../../builder/types/action-types\";\nimport { ConfirmationDialog } from \"../../components/actions/confirmation-dialog\";\nimport { resolveIconElement } from \"../../components/component-renderer\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../../components/ui/dropdown-menu\";\nimport { useResolveText, useTranslation } from \"../../i18n/hooks\";\nimport { selectAuthClient, useAdminStore } from \"../../runtime/provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface BulkActionToolbarProps<TItem = any> {\n /** TanStack Table instance */\n table: Table<TItem>;\n /** Bulk actions to display */\n actions: ActionDefinition<TItem>[];\n /** Collection name */\n collection: string;\n /** Action helpers */\n helpers: ActionHelpers;\n /** Total count of items matching current filter (for \"select all matching\") */\n totalCount?: number;\n /** Number of items on current page */\n pageCount?: number;\n /** Callback when action dialog should open */\n onOpenDialog?: (action: ActionDefinition<TItem>, items: TItem[]) => void;\n /** Callback to select all items matching current filter */\n onSelectAllMatching?: () => Promise<void>;\n /** Callback to execute bulk delete */\n onBulkDelete?: (ids: string[]) => Promise<void>;\n /** Number of active filters (for filter indicator segment) */\n filterCount?: number;\n /** Callback to clear all filters */\n onClearFilters?: () => void;\n /** Callback to open filter sheet */\n onOpenFilters?: () => void;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * BulkActionToolbar - Shows selection count and bulk actions\n *\n * @example\n * ```tsx\n * {selectedItems.length > 0 && (\n * <BulkActionToolbar\n * table={table}\n * actions={bulkActions}\n * collection=\"posts\"\n * helpers={actionHelpers}\n * totalCount={totalItems}\n * pageCount={items.length}\n * />\n * )}\n * ```\n */\nexport function BulkActionToolbar<TItem = any>({\n table,\n actions,\n collection,\n helpers,\n totalCount,\n pageCount,\n onOpenDialog,\n onSelectAllMatching,\n onBulkDelete,\n filterCount = 0,\n onClearFilters,\n onOpenFilters,\n}: BulkActionToolbarProps<TItem>): React.ReactElement | null {\n const { t } = useTranslation();\n const resolveText = useResolveText();\n const authClient = useAdminStore(selectAuthClient);\n const queryClient = useQueryClient();\n const [confirmAction, setConfirmAction] =\n React.useState<ActionDefinition<TItem> | null>(null);\n const [isLoading, setIsLoading] = React.useState(false);\n const [isSelectingAll, setIsSelectingAll] = React.useState(false);\n\n // Wrapped query client for action context\n const actionQueryClient: ActionQueryClient = React.useMemo(\n () => ({\n invalidateQueries: (filters) => queryClient.invalidateQueries(filters),\n refetchQueries: (filters) => queryClient.refetchQueries(filters),\n resetQueries: (filters) => queryClient.resetQueries(filters),\n }),\n [queryClient],\n );\n\n // Get selected items\n const selectedRows = table.getSelectedRowModel().rows;\n const selectedItems = React.useMemo(\n () => selectedRows.map((row) => row.original),\n [selectedRows],\n );\n const selectedCount = selectedItems.length;\n\n // Build action context for bulk operations\n const ctx: ActionContext<TItem[]> = React.useMemo(\n () => ({\n item: selectedItems,\n collection,\n helpers,\n queryClient: actionQueryClient,\n authClient,\n }),\n [selectedItems, collection, helpers, actionQueryClient, authClient],\n );\n\n // Filter visible actions\n const visibleActions = React.useMemo(() => {\n return actions.filter((action) => {\n if (action.visible === undefined) return true;\n if (typeof action.visible === \"function\") {\n // For bulk actions, pass the array of items\n return action.visible(ctx as any);\n }\n return action.visible;\n });\n }, [actions, ctx]);\n\n // Don't render if nothing selected AND no active filters (after all hooks)\n const hasFilters = filterCount > 0;\n const hasSelection = selectedCount > 0;\n if (!hasSelection && !hasFilters) return null;\n\n // Execute bulk action handler\n const executeBulkAction = async (action: ActionDefinition<TItem>) => {\n const { handler } = action;\n\n // Handle built-in deleteMany action\n if (action.id === \"deleteMany\" && onBulkDelete) {\n setIsLoading(true);\n try {\n const ids = selectedItems.map((item: any) => item?.id).filter(Boolean);\n await onBulkDelete(ids);\n table.resetRowSelection();\n } catch (_error) {\n helpers.toast.error(t(\"collection.bulkDeleteError\"));\n } finally {\n setIsLoading(false);\n }\n return;\n }\n\n switch (handler.type) {\n case \"api\": {\n setIsLoading(true);\n try {\n // For bulk API calls, would need to send all IDs\n const ids = selectedItems\n .map((item: any) => item?.id)\n .filter(Boolean);\n helpers.toast.info(\n `Bulk API call: ${handler.method || \"POST\"} ${handler.endpoint} (${ids.length} items)`,\n );\n helpers.refresh();\n table.resetRowSelection();\n } catch (_error) {\n helpers.toast.error(t(\"collection.bulkActionFailed\"));\n } finally {\n setIsLoading(false);\n }\n break;\n }\n\n case \"custom\": {\n setIsLoading(true);\n try {\n // Pass all items to the custom handler\n await handler.fn(ctx as any);\n table.resetRowSelection();\n } catch (_error) {\n helpers.toast.error(t(\"collection.bulkActionFailed\"));\n } finally {\n setIsLoading(false);\n }\n break;\n }\n\n case \"dialog\":\n case \"form\": {\n onOpenDialog?.(action, selectedItems);\n break;\n }\n\n case \"navigate\": {\n // Navigate doesn't make sense for bulk actions\n helpers.toast.error(\n \"Navigate action not supported for bulk operations\",\n );\n break;\n }\n\n case \"server\": {\n // Server actions with forms open dialog, otherwise execute\n onOpenDialog?.(action, selectedItems);\n break;\n }\n }\n };\n\n // Handle action click\n const handleActionClick = (action: ActionDefinition<TItem>) => {\n if (action.confirmation) {\n setConfirmAction(action);\n } else {\n executeBulkAction(action);\n }\n };\n\n // Handle confirmation\n const handleConfirm = async () => {\n if (confirmAction) {\n await executeBulkAction(confirmAction);\n setConfirmAction(null);\n }\n };\n\n // Handle select all matching\n const handleSelectAllMatching = async () => {\n if (!onSelectAllMatching) return;\n setIsSelectingAll(true);\n try {\n await onSelectAllMatching();\n } finally {\n setIsSelectingAll(false);\n }\n };\n\n // Check if action is disabled\n const isDisabled = (action: ActionDefinition<TItem>) => {\n if (action.disabled === undefined) return false;\n if (typeof action.disabled === \"function\") {\n return action.disabled(ctx as any);\n }\n return action.disabled;\n };\n\n // Group actions: regular and destructive\n const regularActions = visibleActions.filter(\n (a) => a.variant !== \"destructive\",\n );\n const destructiveActions = visibleActions.filter(\n (a) => a.variant === \"destructive\",\n );\n\n return (\n <>\n {/* Fixed toolbar at bottom of screen */}\n <div className=\"fixed bottom-6 left-1/2 -translate-x-1/2 z-50 animate-in slide-in-from-bottom-4 fade-in duration-200 max-w-[calc(100%-2rem)] sm:max-w-none\">\n <div className=\"flex items-center gap-2 sm:gap-3 px-3 sm:px-4 py-2 sm:py-2.5 bg-background/95 backdrop-blur-md border border-border shadow-lg rounded-full overflow-x-auto\">\n {/* Filter segment - shows when filters are active */}\n {hasFilters && (\n <>\n <div className=\"flex items-center gap-2 shrink-0\">\n {onOpenFilters ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onOpenFilters}\n className=\"h-6 px-2 text-xs gap-2\"\n >\n <Icon\n icon=\"ph:funnel-fill\"\n width={14}\n height={14}\n className=\"text-primary\"\n />\n {t(\"viewOptions.activeFilters\", { count: filterCount })}\n </Button>\n ) : (\n <>\n <Icon\n icon=\"ph:funnel-fill\"\n width={14}\n height={14}\n className=\"text-primary\"\n />\n <span className=\"text-sm font-medium whitespace-nowrap\">\n {t(\"viewOptions.activeFilters\", { count: filterCount })}\n </span>\n </>\n )}\n {onClearFilters && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClearFilters}\n className=\"h-6 px-2 text-xs\"\n >\n {t(\"viewOptions.clearFilters\")}\n </Button>\n )}\n </div>\n\n {/* Divider between filter and selection segments */}\n {hasSelection && <div className=\"h-4 w-px bg-border shrink-0\" />}\n </>\n )}\n\n {/* Selection segment - shows when rows are selected */}\n {hasSelection && (\n <>\n {/* Selection count */}\n <span className=\"text-sm font-medium whitespace-nowrap shrink-0\">\n {t(\"collection.selected\", { count: selectedCount })}\n </span>\n\n {/* Divider */}\n <div className=\"h-4 w-px bg-border shrink-0\" />\n\n {/* Select dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"gap-1 h-7 px-2 shrink-0\"\n />\n }\n disabled={isSelectingAll}\n >\n {t(\"common.selectAll\").split(\" \")[0]}\n <Icon icon=\"ph:caret-down\" className=\"size-3\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"center\" side=\"top\" sideOffset={8}>\n <DropdownMenuItem\n onClick={() => table.toggleAllPageRowsSelected(true)}\n >\n {t(\"collection.selectOnPage\")}\n {pageCount ? ` (${pageCount})` : \"\"}\n </DropdownMenuItem>\n {onSelectAllMatching &&\n totalCount &&\n totalCount > (pageCount ?? 0) && (\n <DropdownMenuItem onClick={handleSelectAllMatching}>\n {t(\"collection.selectAllMatching\", {\n count: totalCount,\n })}\n </DropdownMenuItem>\n )}\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => table.resetRowSelection()}>\n {t(\"collection.clearSelection\")}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Bulk actions dropdown */}\n {visibleActions.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger\n render={\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-1 h-7 px-2 shrink-0\"\n />\n }\n disabled={isLoading}\n >\n {t(\"common.actions\")}\n <Icon icon=\"ph:caret-down\" className=\"size-3\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"center\" side=\"top\" sideOffset={8}>\n {regularActions.map((action) => {\n const iconElement = resolveIconElement(action.icon, {\n className: \"mr-2 size-4\",\n });\n return (\n <DropdownMenuItem\n key={action.id}\n onClick={() => handleActionClick(action)}\n disabled={isDisabled(action) || isLoading}\n >\n {iconElement}\n {resolveText(action.label)}\n </DropdownMenuItem>\n );\n })}\n\n {regularActions.length > 0 &&\n destructiveActions.length > 0 && (\n <DropdownMenuSeparator />\n )}\n\n {destructiveActions.map((action) => {\n const iconElement = resolveIconElement(action.icon, {\n className: \"mr-2 size-4\",\n });\n return (\n <DropdownMenuItem\n key={action.id}\n variant=\"destructive\"\n onClick={() => handleActionClick(action)}\n disabled={isDisabled(action) || isLoading}\n >\n {iconElement}\n {resolveText(action.label)}\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {/* Clear selection button */}\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => table.resetRowSelection()}\n className=\"size-7 shrink-0\"\n >\n <Icon icon=\"ph:x\" className=\"size-4\" />\n <span className=\"sr-only\">\n {t(\"collection.clearSelection\")}\n </span>\n </Button>\n </>\n )}\n </div>\n </div>\n\n {/* Confirmation dialog */}\n {confirmAction?.confirmation && (\n <ConfirmationDialog\n open={!!confirmAction}\n onOpenChange={(open) => !open && setConfirmAction(null)}\n config={{\n ...confirmAction.confirmation,\n // Override description to include count\n description: confirmAction.confirmation.description\n ? `${confirmAction.confirmation.description} (${selectedCount} items)`\n : `This will affect ${selectedCount} items.`,\n }}\n onConfirm={handleConfirm}\n loading={isLoading}\n />\n )}\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { FieldDefinition } from "../../../builder/field/field.mjs";
|
|
2
|
-
import * as react_jsx_runtime183 from "react/jsx-runtime";
|
|
3
|
-
|
|
4
|
-
//#region src/client/views/collection/cells/complex-cells.d.ts
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* JSON cell - compact JSON display
|
|
8
|
-
*/
|
|
9
|
-
declare function JsonCell({
|
|
10
|
-
value
|
|
11
|
-
}: {
|
|
12
|
-
value: unknown;
|
|
13
|
-
}): react_jsx_runtime183.JSX.Element;
|
|
14
|
-
/**
|
|
15
|
-
* Object cell - displays nested object with hover tooltip preview
|
|
16
|
-
*/
|
|
17
|
-
declare function ObjectCell({
|
|
18
|
-
value,
|
|
19
|
-
fieldDef
|
|
20
|
-
}: {
|
|
21
|
-
value: unknown;
|
|
22
|
-
row?: unknown;
|
|
23
|
-
fieldDef?: FieldDefinition;
|
|
24
|
-
}): react_jsx_runtime183.JSX.Element;
|
|
25
|
-
/**
|
|
26
|
-
* Array cell - displays array items with hover tooltip preview
|
|
27
|
-
*/
|
|
28
|
-
declare function ArrayCell({
|
|
29
|
-
value,
|
|
30
|
-
fieldDef
|
|
31
|
-
}: {
|
|
32
|
-
value: unknown;
|
|
33
|
-
row?: unknown;
|
|
34
|
-
fieldDef?: FieldDefinition;
|
|
35
|
-
}): react_jsx_runtime183.JSX.Element;
|
|
36
|
-
/**
|
|
37
|
-
* Blocks cell - summarizes block tree content with type counts
|
|
38
|
-
*/
|
|
39
|
-
declare function BlocksCell({
|
|
40
|
-
value
|
|
41
|
-
}: {
|
|
42
|
-
value: unknown;
|
|
43
|
-
}): react_jsx_runtime183.JSX.Element;
|
|
44
|
-
//#endregion
|
|
45
|
-
export { ArrayCell, BlocksCell, JsonCell, ObjectCell };
|
|
46
|
-
//# sourceMappingURL=complex-cells.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"complex-cells.d.mts","names":[],"sources":["../../../../../src/client/views/collection/cells/complex-cells.tsx"],"sourcesContent":[],"mappings":";;;;;;AA2MA;;AAEC,iBArKe,QAAA,CAqKf;EAAA;CAAA,EAAA;EAIW,KAAA,EAAA,OAAA;CACX,CAAA,EA1KqD,oBAAA,CAAA,GAAA,CAAA,OA0KrD;;AAmMD;;iBAxVgB,UAAA;;;;;;aAMJ;IACX,oBAAA,CAAA,GAAA,CAAA;;;;iBAuIe,SAAA;;;;;;aAMJ;IACX,oBAAA,CAAA,GAAA,CAAA;;;;iBAmMe,UAAA;;;;IAAwC,oBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"complex-cells.mjs","names":["entries: BlockTypeStat[]"],"sources":["../../../../../src/client/views/collection/cells/complex-cells.tsx"],"sourcesContent":["/**\n * Complex Cell Components\n *\n * Cells for displaying complex data structures:\n * - JsonCell - simple JSON display\n * - ObjectCell - nested object with hover preview\n * - ArrayCell - array items with hover preview\n * - BlocksCell - block tree summary with tooltip\n */\n\nimport * as React from \"react\";\nimport type { BlockSchema } from \"#questpie/admin/server\";\nimport type { BlockContent, BlockNode } from \"../../../blocks/types\";\nimport { isBlockContent } from \"../../../blocks/types\";\nimport type { FieldDefinition } from \"../../../builder/field/field\";\nimport { Badge } from \"../../../components/ui/badge\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"../../../components/ui/tooltip\";\nimport { useAdminConfig } from \"../../../hooks/use-admin-config\";\nimport { useResolveText } from \"../../../i18n/hooks\";\nimport { cn } from \"../../../lib/utils\";\nimport { selectAdmin, useAdminStore } from \"../../../runtime\";\nimport {\n\tformatFieldLabel,\n\tformatPrimitiveValue,\n\tgetFieldLabel,\n\tgetItemLabel,\n\tsummarizeValue,\n} from \"./shared/cell-helpers\";\n\n// ============================================================================\n// JSON Cell\n// ============================================================================\n\n/**\n * JSON cell - compact JSON display\n */\nexport function JsonCell({ value }: { value: unknown }) {\n\tif (value === null || value === undefined) {\n\t\treturn <span className=\"text-muted-foreground\">-</span>;\n\t}\n\tconst json =\n\t\ttypeof value === \"string\" ? value : JSON.stringify(value, null, 0);\n\tconst truncated = json.length > 50 ? `${json.slice(0, 50)}...` : json;\n\treturn (\n\t\t<span className=\"font-mono text-xs text-muted-foreground\" title={json}>\n\t\t\t{truncated}\n\t\t</span>\n\t);\n}\n\n// ============================================================================\n// Object Cell\n// ============================================================================\n\n/**\n * Object cell - displays nested object with hover tooltip preview\n */\nexport function ObjectCell({\n\tvalue,\n\tfieldDef,\n}: {\n\tvalue: unknown;\n\trow?: unknown;\n\tfieldDef?: FieldDefinition;\n}) {\n\tconst resolveText = useResolveText();\n\tif (value === null || value === undefined) {\n\t\treturn <span className=\"text-muted-foreground\">-</span>;\n\t}\n\n\tif (typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn <span>{String(value)}</span>;\n\t}\n\n\tconst obj = value as Record<string, unknown>;\n\tconst entries = Object.entries(obj);\n\n\tif (entries.length === 0) {\n\t\treturn <span className=\"text-muted-foreground\">-</span>;\n\t}\n\n\t// Get nested field definitions for labels\n\tconst nestedFieldsOption = fieldDef?.[\"~options\"]?.fields;\n\tconst nestedFields =\n\t\ttypeof nestedFieldsOption === \"function\" ? undefined : nestedFieldsOption;\n\n\t// Build inline preview: \"Label: value, Label: value +N\"\n\tconst previewParts = entries.slice(0, 2).map(([key, val]) => {\n\t\tconst label = resolveText(getFieldLabel(key, nestedFields?.[key]));\n\t\treturn `${label}: ${summarizeValue(val)}`;\n\t});\n\tconst hasMore = entries.length > 2;\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t<TooltipTrigger>\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"inline-flex items-center gap-1 text-xs\",\n\t\t\t\t\t\t\"text-muted-foreground hover:text-foreground\",\n\t\t\t\t\t\t\"transition-colors cursor-default max-w-[220px]\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"truncate\">{previewParts.join(\", \")}</span>\n\t\t\t\t\t{hasMore && (\n\t\t\t\t\t\t<span className=\"text-muted-foreground/50 shrink-0\">\n\t\t\t\t\t\t\t+{entries.length - 2}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</span>\n\t\t\t</TooltipTrigger>\n\t\t\t<TooltipContent side=\"bottom\" align=\"start\" className={\"w-72 p-0 \"}>\n\t\t\t\t<div className=\"max-h-[300px] overflow-y-auto p-3 space-y-0.5\">\n\t\t\t\t\t{entries.slice(0, 12).map(([key, val]) => {\n\t\t\t\t\t\tconst nestedDef = nestedFields?.[key];\n\t\t\t\t\t\tconst label = resolveText(getFieldLabel(key, nestedDef));\n\n\t\t\t\t\t\t// Nested objects - show with bullet and sub-items\n\t\t\t\t\t\tif (val && typeof val === \"object\" && !Array.isArray(val)) {\n\t\t\t\t\t\t\tconst nestedObj = val as Record<string, unknown>;\n\t\t\t\t\t\t\tconst nestedEntries = Object.entries(nestedObj).slice(0, 4);\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div key={key} className=\"py-1\">\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1.5 text-xs font-medium\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"size-1 rounded-full bg-foreground/60\" />\n\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"ml-2.5 pl-2 border-l border-border/50 mt-0.5 space-y-0.5\">\n\t\t\t\t\t\t\t\t\t\t{nestedEntries.map(([k, v]) => (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tkey={k}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex justify-between gap-2 text-[11px]\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{formatFieldLabel(k)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"truncate max-w-[120px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{formatPrimitiveValue(v)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Arrays - bullet with count\n\t\t\t\t\t\tif (Array.isArray(val)) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-between gap-2 text-xs py-0.5\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-1.5\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"size-1 rounded-full bg-foreground/60\" />\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">{label}</span>\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<Badge variant=\"secondary\" className=\"h-4 px-1 text-[10px]\">\n\t\t\t\t\t\t\t\t\t\t{val.length}\n\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Primitives - bullet with value\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-between gap-2 text-xs py-0.5\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-1.5\">\n\t\t\t\t\t\t\t\t\t<span className=\"size-1 rounded-full bg-foreground/60\" />\n\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">{label}</span>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span className=\"font-medium truncate max-w-[140px]\">\n\t\t\t\t\t\t\t\t\t{formatPrimitiveValue(val)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t\t{entries.length > 12 && (\n\t\t\t\t\t<div className=\"text-[11px] text-muted-foreground text-center py-1.5 border-t border-border/50\">\n\t\t\t\t\t\t+{entries.length - 12} more\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</TooltipContent>\n\t\t</Tooltip>\n\t);\n}\n\n// ============================================================================\n// Array Cell\n// ============================================================================\n\n/**\n * Array cell - displays array items with hover tooltip preview\n */\nexport function ArrayCell({\n\tvalue,\n\tfieldDef,\n}: {\n\tvalue: unknown;\n\trow?: unknown;\n\tfieldDef?: FieldDefinition;\n}) {\n\tconst resolveText = useResolveText();\n\tif (value === null || value === undefined) {\n\t\treturn <span className=\"text-muted-foreground\">-</span>;\n\t}\n\n\tif (!Array.isArray(value)) {\n\t\treturn <span>{String(value)}</span>;\n\t}\n\n\tif (value.length === 0) {\n\t\treturn <span className=\"text-muted-foreground\">-</span>;\n\t}\n\n\tconst fieldOptions = fieldDef?.[\"~options\"] ?? {};\n\tconst itemLabelFn = fieldOptions.itemLabel as\n\t\t| ((item: unknown) => string)\n\t\t| undefined;\n\tconst itemFieldsOption = fieldOptions.item;\n\tconst itemFields =\n\t\ttypeof itemFieldsOption === \"function\" ? undefined : itemFieldsOption;\n\n\t// Get preview labels for first few items\n\tconst previewLabels = value\n\t\t.slice(0, 3)\n\t\t.map((item, idx) => getItemLabel(item, idx, itemLabelFn));\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t<TooltipTrigger\n\t\t\t\trender={\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"inline-flex items-center gap-1.5 text-xs\",\n\t\t\t\t\t\t\t\"text-muted-foreground hover:text-foreground\",\n\t\t\t\t\t\t\t\"transition-colors cursor-default max-w-[180px]\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\tclassName=\"h-4 min-w-4 px-1 text-[10px] shrink-0\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{value.length}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t<span className=\"truncate\">\n\t\t\t\t\t\t\t{previewLabels[0]}\n\t\t\t\t\t\t\t{value.length > 1 && ` +${value.length - 1}`}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</span>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<TooltipContent\n\t\t\t\tside=\"bottom\"\n\t\t\t\talign=\"start\"\n\t\t\t\tclassName=\"p-0 w-64 max-w-[90vw] bg-popover/95 backdrop-blur-xl border-border\"\n\t\t\t>\n\t\t\t\t<div className=\"max-h-[280px] overflow-y-auto p-2 space-y-0.5\">\n\t\t\t\t\t{value.slice(0, 10).map((item, idx) => {\n\t\t\t\t\t\tconst label = getItemLabel(item, idx, itemLabelFn);\n\n\t\t\t\t\t\tif (typeof item === \"object\" && item !== null) {\n\t\t\t\t\t\t\tconst obj = item as Record<string, unknown>;\n\t\t\t\t\t\t\tconst details = Object.entries(obj)\n\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t([k]) =>\n\t\t\t\t\t\t\t\t\t\t![\n\t\t\t\t\t\t\t\t\t\t\t\"id\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\",\n\t\t\t\t\t\t\t\t\t\t\t\"name\",\n\t\t\t\t\t\t\t\t\t\t\t\"title\",\n\t\t\t\t\t\t\t\t\t\t\t\"label\",\n\t\t\t\t\t\t\t\t\t\t\t\"platform\",\n\t\t\t\t\t\t\t\t\t\t\t\"type\",\n\t\t\t\t\t\t\t\t\t\t].includes(k),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.slice(0, 3);\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: stable array from backend\n\t\t\t\t\t\t\t\t<div key={idx} className=\"py-1\">\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1.5 text-xs font-medium\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"size-1 rounded-full bg-foreground/60\" />\n\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t{details.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"ml-2.5 pl-2 border-l border-border/50 mt-0.5 space-y-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t{details.map(([k, v]) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst itemFieldDef = itemFields?.[k];\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={k}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex justify-between gap-2 text-[11px]\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{resolveText(getFieldLabel(k, itemFieldDef))}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"truncate max-w-[100px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{formatPrimitiveValue(v)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: stable array from backend\n\t\t\t\t\t\t\t\tkey={idx}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 text-xs py-0.5\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"size-1 rounded-full bg-foreground/60\" />\n\t\t\t\t\t\t\t\t{formatPrimitiveValue(item)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t\t{value.length > 10 && (\n\t\t\t\t\t<div className=\"text-[11px] text-muted-foreground text-center py-1.5 border-t border-border/50\">\n\t\t\t\t\t\t+{value.length - 10} more\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</TooltipContent>\n\t\t</Tooltip>\n\t);\n}\n\n// ============================================================================\n// Blocks Cell\n// ============================================================================\n\ntype BlockTypeStat = {\n\ttype: string;\n\tlabel: string;\n\tcount: number;\n};\n\nfunction coerceBlockContent(value: unknown): BlockContent | null {\n\tif (isBlockContent(value)) return value;\n\tif (\n\t\tvalue &&\n\t\ttypeof value === \"object\" &&\n\t\t\"$i18n\" in value &&\n\t\tisBlockContent((value as { $i18n?: unknown }).$i18n)\n\t) {\n\t\treturn (value as { $i18n?: BlockContent }).$i18n ?? null;\n\t}\n\treturn null;\n}\n\nfunction formatBlockType(type: string): string {\n\treturn type\n\t\t.replace(/[-_]/g, \" \")\n\t\t.replace(/([a-z])([A-Z])/g, \"$1 $2\")\n\t\t.replace(/\\b\\w/g, (char) => char.toUpperCase())\n\t\t.trim();\n}\n\nfunction getBlockLabel(\n\ttype: string,\n\tblockDef: BlockSchema | undefined,\n\tresolveText: ReturnType<typeof useResolveText>,\n): string {\n\tif (!blockDef) return formatBlockType(type);\n\tconst fallback = blockDef.name || formatBlockType(type);\n\treturn resolveText(blockDef.admin?.label, fallback) || fallback;\n}\n\nfunction collectBlockStats(tree: BlockNode[]): {\n\ttotal: number;\n\tcounts: Map<string, number>;\n} {\n\tconst counts = new Map<string, number>();\n\tlet total = 0;\n\n\tconst visit = (nodes: BlockNode[]) => {\n\t\tfor (const node of nodes) {\n\t\t\ttotal += 1;\n\t\t\tcounts.set(node.type, (counts.get(node.type) ?? 0) + 1);\n\t\t\tif (node.children.length) {\n\t\t\t\tvisit(node.children);\n\t\t\t}\n\t\t}\n\t};\n\n\tvisit(tree);\n\treturn { total, counts };\n}\n\n/**\n * Blocks cell - summarizes block tree content with type counts\n */\nexport function BlocksCell({ value }: { value: unknown }) {\n\tconst resolveText = useResolveText();\n\tconst { data: adminConfig } = useAdminConfig();\n\n\tif (value === null || value === undefined) {\n\t\treturn <span className=\"text-muted-foreground\">-</span>;\n\t}\n\n\tconst content = coerceBlockContent(value);\n\tif (!content) {\n\t\treturn <JsonCell value={value} />;\n\t}\n\n\tif (!content._tree.length) {\n\t\treturn <span className=\"text-muted-foreground\">-</span>;\n\t}\n\n\tconst blockDefs = adminConfig?.blocks ?? {};\n\tconst { total, counts } = collectBlockStats(content._tree);\n\tif (total === 0) {\n\t\treturn <span className=\"text-muted-foreground\">-</span>;\n\t}\n\n\tconst entries: BlockTypeStat[] = Array.from(counts.entries()).map(\n\t\t([type, count]) => ({\n\t\t\ttype,\n\t\t\tcount,\n\t\t\tlabel: getBlockLabel(type, blockDefs?.[type], resolveText),\n\t\t}),\n\t);\n\n\tentries.sort((a, b) => {\n\t\tif (b.count !== a.count) return b.count - a.count;\n\t\treturn a.label.localeCompare(b.label);\n\t});\n\n\tconst preview = entries\n\t\t.slice(0, 2)\n\t\t.map((entry) =>\n\t\t\tentry.count > 1 ? `${entry.label} x${entry.count}` : entry.label,\n\t\t);\n\tconst extraTypes = entries.length - preview.length;\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t<TooltipTrigger\n\t\t\t\trender={\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"inline-flex items-center gap-1.5 text-xs\",\n\t\t\t\t\t\t\t\"text-muted-foreground hover:text-foreground\",\n\t\t\t\t\t\t\t\"transition-colors cursor-default max-w-[220px]\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\tclassName=\"h-4 min-w-4 px-1 text-[10px] shrink-0\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{total}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t<span className=\"truncate\">\n\t\t\t\t\t\t\t{preview.join(\", \")}\n\t\t\t\t\t\t\t{extraTypes > 0 && ` +${extraTypes}`}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</span>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<TooltipContent\n\t\t\t\tside=\"bottom\"\n\t\t\t\talign=\"start\"\n\t\t\t\tclassName=\"p-0 w-64 max-w-[90vw] bg-popover/95 backdrop-blur-xl border-border\"\n\t\t\t>\n\t\t\t\t<div className=\"flex items-center justify-between px-2 py-1.5 text-[11px] text-muted-foreground border-b border-border/50\">\n\t\t\t\t\t<span>Blocks</span>\n\t\t\t\t\t<Badge variant=\"secondary\" className=\"h-4 px-1 text-[10px]\">\n\t\t\t\t\t\t{total}\n\t\t\t\t\t</Badge>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"max-h-[280px] overflow-y-auto p-2 space-y-0.5\">\n\t\t\t\t\t{entries.slice(0, 10).map((entry) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={entry.type}\n\t\t\t\t\t\t\tclassName=\"flex items-center justify-between gap-2 text-xs py-0.5\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"truncate\">{entry.label}</span>\n\t\t\t\t\t\t\t<Badge variant=\"secondary\" className=\"h-4 px-1 text-[10px]\">\n\t\t\t\t\t\t\t\t{entry.count}\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t\t{entries.length > 10 && (\n\t\t\t\t\t<div className=\"text-[11px] text-muted-foreground text-center py-1.5 border-t border-border/50\">\n\t\t\t\t\t\t+{entries.length - 10} more\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</TooltipContent>\n\t\t</Tooltip>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { ArrayCell, BlocksCell, JsonCell, ObjectCell } from "./complex-cells.mjs";
|
|
2
|
-
import { BooleanCell, DateCell, DateTimeCell, EmailCell, NumberCell, RichTextCell, SelectCell, TextCell, TimeCell } from "./primitive-cells.mjs";
|
|
3
|
-
import { RelationCell } from "./relation-cells.mjs";
|
|
4
|
-
import "./shared/asset-thumbnail.mjs";
|
|
5
|
-
import "./shared/cell-helpers.mjs";
|
|
6
|
-
import "./shared/relation-chip.mjs";
|
|
7
|
-
import { UploadCell } from "./upload-cells.mjs";
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime187 from "react/jsx-runtime";
|
|
2
|
-
|
|
3
|
-
//#region src/client/views/collection/cells/primitive-cells.d.ts
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Text cell - simple text display with truncation
|
|
7
|
-
*/
|
|
8
|
-
declare function TextCell({
|
|
9
|
-
value
|
|
10
|
-
}: {
|
|
11
|
-
value: unknown;
|
|
12
|
-
}): react_jsx_runtime187.JSX.Element;
|
|
13
|
-
declare function RichTextCell({
|
|
14
|
-
value
|
|
15
|
-
}: {
|
|
16
|
-
value: unknown;
|
|
17
|
-
}): react_jsx_runtime187.JSX.Element;
|
|
18
|
-
/**
|
|
19
|
-
* Number cell - right-aligned number display
|
|
20
|
-
*/
|
|
21
|
-
declare function NumberCell({
|
|
22
|
-
value
|
|
23
|
-
}: {
|
|
24
|
-
value: unknown;
|
|
25
|
-
}): react_jsx_runtime187.JSX.Element;
|
|
26
|
-
/**
|
|
27
|
-
* Boolean cell - badge display
|
|
28
|
-
*/
|
|
29
|
-
declare function BooleanCell({
|
|
30
|
-
value
|
|
31
|
-
}: {
|
|
32
|
-
value: unknown;
|
|
33
|
-
}): react_jsx_runtime187.JSX.Element;
|
|
34
|
-
/**
|
|
35
|
-
* Date cell - formatted date display
|
|
36
|
-
*/
|
|
37
|
-
declare function DateCell({
|
|
38
|
-
value
|
|
39
|
-
}: {
|
|
40
|
-
value: unknown;
|
|
41
|
-
}): react_jsx_runtime187.JSX.Element;
|
|
42
|
-
/**
|
|
43
|
-
* DateTime cell - formatted date and time display
|
|
44
|
-
*/
|
|
45
|
-
declare function DateTimeCell({
|
|
46
|
-
value
|
|
47
|
-
}: {
|
|
48
|
-
value: unknown;
|
|
49
|
-
}): react_jsx_runtime187.JSX.Element;
|
|
50
|
-
/**
|
|
51
|
-
* Time cell - formatted time display (for time-only values stored as string)
|
|
52
|
-
*/
|
|
53
|
-
declare function TimeCell({
|
|
54
|
-
value
|
|
55
|
-
}: {
|
|
56
|
-
value: unknown;
|
|
57
|
-
}): react_jsx_runtime187.JSX.Element;
|
|
58
|
-
/**
|
|
59
|
-
* Email cell - displays email with mailto link styling
|
|
60
|
-
*/
|
|
61
|
-
declare function EmailCell({
|
|
62
|
-
value
|
|
63
|
-
}: {
|
|
64
|
-
value: unknown;
|
|
65
|
-
}): react_jsx_runtime187.JSX.Element;
|
|
66
|
-
/**
|
|
67
|
-
* Select/Status cell - badge display
|
|
68
|
-
*/
|
|
69
|
-
declare function SelectCell({
|
|
70
|
-
value
|
|
71
|
-
}: {
|
|
72
|
-
value: unknown;
|
|
73
|
-
}): react_jsx_runtime187.JSX.Element;
|
|
74
|
-
//#endregion
|
|
75
|
-
export { BooleanCell, DateCell, DateTimeCell, EmailCell, NumberCell, RichTextCell, SelectCell, TextCell, TimeCell };
|
|
76
|
-
//# sourceMappingURL=primitive-cells.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"primitive-cells.d.mts","names":[],"sources":["../../../../../src/client/views/collection/cells/primitive-cells.tsx"],"sourcesContent":[],"mappings":";;;;;;;iBAmCgB,QAAA;;;;IAAsC,oBAAA,CAAA,GAAA,CAAA;iBA4CtC,YAAA;;;;IAA0C,oBAAA,CAAA,GAAA,CAAA;;;;iBAmB1C,UAAA;;;;IAAwC,oBAAA,CAAA,GAAA,CAAA;;;;iBAmBxC,WAAA;;;;IAAyC,oBAAA,CAAA,GAAA,CAAA;;;;iBAezC,QAAA;;;;IAAsC,oBAAA,CAAA,GAAA,CAAA;;;;iBActC,YAAA;;;;IAA0C,oBAAA,CAAA,GAAA,CAAA;;;;iBAkB1C,QAAA;;;;IAAsC,oBAAA,CAAA,GAAA,CAAA;;;;iBAetC,SAAA;;;;IAAuC,oBAAA,CAAA,GAAA,CAAA;;;;iBAUvC,UAAA;;;;IAAwC,oBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"primitive-cells.mjs","names":[],"sources":["../../../../../src/client/views/collection/cells/primitive-cells.tsx"],"sourcesContent":["/**\n * Primitive Cell Components\n *\n * Simple cell renderers for basic data types:\n * - Text, Number, Boolean\n * - Date, DateTime, Time\n * - Email, Select\n * - DefaultCell (ultra-simple fallback)\n */\n\nimport * as React from \"react\";\nimport { Badge } from \"../../../components/ui/badge\";\n\n// ============================================================================\n// Default Cell (Ultra-Simple Fallback)\n// ============================================================================\n\n/**\n * Ultra-simple default cell renderer\n * Used as fallback when field has no .cell defined\n */\nexport function DefaultCell({ value }: { value: unknown }) {\n if (value === null || value === undefined) {\n return <span className=\"text-muted-foreground\">-</span>;\n }\n return <span>{String(value)}</span>;\n}\n\n// ============================================================================\n// Text Cells\n// ============================================================================\n\n/**\n * Text cell - simple text display with truncation\n */\nexport function TextCell({ value }: { value: unknown }) {\n if (value === null || value === undefined || value === \"\") {\n return <span className=\"text-muted-foreground\">-</span>;\n }\n const text = String(value);\n return (\n <span className=\"truncate max-w-[300px] block\" title={text}>\n {text}\n </span>\n );\n}\n\nfunction stripHtmlTags(value: string): string {\n return value\n .replace(/<[^>]*>/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction extractTextFromNode(node: any): string {\n if (!node) return \"\";\n if (Array.isArray(node)) {\n return node.map(extractTextFromNode).filter(Boolean).join(\" \");\n }\n if (typeof node.text === \"string\") return node.text;\n if (Array.isArray(node.content)) {\n return node.content.map(extractTextFromNode).filter(Boolean).join(\" \");\n }\n return \"\";\n}\n\nfunction getRichTextPreview(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"string\") {\n const hasHtml = /<\\/?[a-z][\\s\\S]*>/i.test(value);\n return hasHtml ? stripHtmlTags(value) : value.trim();\n }\n if (typeof value === \"object\") {\n const text = extractTextFromNode(value);\n return text.replace(/\\s+/g, \" \").trim();\n }\n return String(value);\n}\n\nexport function RichTextCell({ value }: { value: unknown }) {\n const text = getRichTextPreview(value);\n if (!text) {\n return <span className=\"text-muted-foreground\">-</span>;\n }\n return (\n <span className=\"truncate max-w-[300px] block\" title={text}>\n {text}\n </span>\n );\n}\n\n// ============================================================================\n// Number Cell\n// ============================================================================\n\n/**\n * Number cell - right-aligned number display\n */\nexport function NumberCell({ value }: { value: unknown }) {\n if (value === null || value === undefined) {\n return <span className=\"text-muted-foreground\">-</span>;\n }\n const num = Number(value);\n return (\n <span className=\"tabular-nums\">\n {Number.isNaN(num) ? String(value) : num.toLocaleString()}\n </span>\n );\n}\n\n// ============================================================================\n// Boolean Cell\n// ============================================================================\n\n/**\n * Boolean cell - badge display\n */\nexport function BooleanCell({ value }: { value: unknown }) {\n return (\n <Badge variant={value ? \"default\" : \"secondary\"}>\n {value ? \"Yes\" : \"No\"}\n </Badge>\n );\n}\n\n// ============================================================================\n// Date/Time Cells\n// ============================================================================\n\n/**\n * Date cell - formatted date display\n */\nexport function DateCell({ value }: { value: unknown }) {\n if (value === null || value === undefined) {\n return <span className=\"text-muted-foreground\">-</span>;\n }\n const date = value instanceof Date ? value : new Date(String(value));\n if (Number.isNaN(date.getTime())) {\n return <span className=\"text-muted-foreground\">{String(value)}</span>;\n }\n return <span className=\"tabular-nums\">{date.toLocaleDateString()}</span>;\n}\n\n/**\n * DateTime cell - formatted date and time display\n */\nexport function DateTimeCell({ value }: { value: unknown }) {\n if (value === null || value === undefined) {\n return <span className=\"text-muted-foreground\">-</span>;\n }\n const date = value instanceof Date ? value : new Date(String(value));\n if (Number.isNaN(date.getTime())) {\n return <span className=\"text-muted-foreground\">{String(value)}</span>;\n }\n return (\n <span className=\"tabular-nums\">\n {date.toLocaleDateString()} {date.toLocaleTimeString()}\n </span>\n );\n}\n\n/**\n * Time cell - formatted time display (for time-only values stored as string)\n */\nexport function TimeCell({ value }: { value: unknown }) {\n if (value === null || value === undefined || value === \"\") {\n return <span className=\"text-muted-foreground\">-</span>;\n }\n // Time values are stored as \"HH:mm\" or \"HH:mm:ss\" strings\n return <span className=\"tabular-nums\">{String(value)}</span>;\n}\n\n// ============================================================================\n// Special Text Cells\n// ============================================================================\n\n/**\n * Email cell - displays email with mailto link styling\n */\nexport function EmailCell({ value }: { value: unknown }) {\n if (value === null || value === undefined || value === \"\") {\n return <span className=\"text-muted-foreground\">-</span>;\n }\n return <span className=\"text-primary\">{String(value)}</span>;\n}\n\n/**\n * Select/Status cell - badge display\n */\nexport function SelectCell({ value }: { value: unknown }) {\n if (value === null || value === undefined || value === \"\") {\n return <span className=\"text-muted-foreground\">-</span>;\n }\n return <Badge variant=\"outline\">{String(value)}</Badge>;\n}\n"],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { FieldDefinition } from "../../../builder/field/field.mjs";
|
|
2
|
-
import * as react_jsx_runtime200 from "react/jsx-runtime";
|
|
3
|
-
|
|
4
|
-
//#region src/client/views/collection/cells/relation-cells.d.ts
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Relation cell - displays relation as clickable chips
|
|
8
|
-
* Supports both single relations and arrays
|
|
9
|
-
* Opens detail sheet on click
|
|
10
|
-
*/
|
|
11
|
-
declare function RelationCell({
|
|
12
|
-
value,
|
|
13
|
-
fieldDef
|
|
14
|
-
}: {
|
|
15
|
-
value: unknown;
|
|
16
|
-
row?: unknown;
|
|
17
|
-
fieldDef?: FieldDefinition;
|
|
18
|
-
}): react_jsx_runtime200.JSX.Element;
|
|
19
|
-
//#endregion
|
|
20
|
-
export { RelationCell };
|
|
21
|
-
//# sourceMappingURL=relation-cells.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relation-cells.d.mts","names":[],"sources":["../../../../../src/client/views/collection/cells/relation-cells.tsx"],"sourcesContent":[],"mappings":";;;;;;;;;;iBA+BgB,YAAA;;;;;;aAMJ;IACX,oBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relation-cells.mjs","names":["React"],"sources":["../../../../../src/client/views/collection/cells/relation-cells.tsx"],"sourcesContent":["/**\n * Relation Cell Components\n *\n * Cells for displaying relation fields:\n * - RelationCell - forward relations (belongs-to, has-one, has-many)\n * - ReverseRelationCell - reverse relations (computed from other collections)\n */\n\nimport * as React from \"react\";\nimport type { FieldDefinition } from \"../../../builder/field/field\";\nimport { ResourceSheet } from \"../../../components/sheets\";\nimport { Badge } from \"../../../components/ui/badge\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"../../../components/ui/tooltip\";\nimport { useResolveText } from \"../../../i18n/hooks\";\nimport { cn } from \"../../../lib/utils\";\nimport { getRelationItemId, getRelationItemLabel } from \"./shared/cell-helpers\";\nimport { RelationChip } from \"./shared/relation-chip\";\n\n// ============================================================================\n// Relation Cell\n// ============================================================================\n\n/**\n * Relation cell - displays relation as clickable chips\n * Supports both single relations and arrays\n * Opens detail sheet on click\n */\nexport function RelationCell({\n\tvalue,\n\tfieldDef,\n}: {\n\tvalue: unknown;\n\trow?: unknown;\n\tfieldDef?: FieldDefinition;\n}) {\n\tconst resolveText = useResolveText();\n\tconst targetCollection = fieldDef?.[\"~options\"]?.targetCollection as\n\t\t| string\n\t\t| undefined;\n\n\t// Sheet state\n\tconst [sheetOpen, setSheetOpen] = React.useState(false);\n\tconst [sheetItemId, setSheetItemId] = React.useState<string | undefined>();\n\tconst [sheetCollection, setSheetCollection] = React.useState<\n\t\tstring | undefined\n\t>();\n\n\tconst handleChipClick = React.useCallback(\n\t\t(itemId: string, collection: string) => {\n\t\t\tsetSheetItemId(itemId);\n\t\t\tsetSheetCollection(collection);\n\t\t\tsetSheetOpen(true);\n\t\t},\n\t\t[],\n\t);\n\n\tif (value === null || value === undefined) {\n\t\treturn <span className=\"text-muted-foreground\">-</span>;\n\t}\n\n\t// Handle array of relations (multiple)\n\tif (Array.isArray(value)) {\n\t\tif (value.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">-</span>;\n\t\t}\n\n\t\tconst visibleItems = value.slice(0, 3);\n\t\tconst remainingCount = value.length - 3;\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<Tooltip>\n\t\t\t\t\t<TooltipTrigger\n\t\t\t\t\t\trender={\n\t\t\t\t\t\t\t<span className=\"inline-flex items-center gap-1 max-w-[250px] overflow-hidden\">\n\t\t\t\t\t\t\t\t{visibleItems.map((item, idx) => (\n\t\t\t\t\t\t\t\t\t<RelationChip\n\t\t\t\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: stable array from backend\n\t\t\t\t\t\t\t\t\t\tkey={idx}\n\t\t\t\t\t\t\t\t\t\titem={item}\n\t\t\t\t\t\t\t\t\t\ttargetCollection={targetCollection}\n\t\t\t\t\t\t\t\t\t\tonClick={handleChipClick}\n\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t{remainingCount > 0 && (\n\t\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-5 px-1.5 text-[10px] shrink-0\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t+{remainingCount}\n\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t\t{value.length > 3 && (\n\t\t\t\t\t\t<TooltipContent side=\"bottom\" align=\"start\" className=\"p-0 w-56\">\n\t\t\t\t\t\t\t<div className=\"max-h-[200px] overflow-y-auto p-2 space-y-1\">\n\t\t\t\t\t\t\t\t{value.map((item, idx) => {\n\t\t\t\t\t\t\t\t\tconst label = resolveText(getRelationItemLabel(item));\n\t\t\t\t\t\t\t\t\tconst id = getRelationItemId(item);\n\t\t\t\t\t\t\t\t\tconst canNavigate = targetCollection && id;\n\t\t\t\t\t\t\t\t\tconst key = id ?? label ?? `item-${idx}`;\n\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 text-xs\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"size-1 rounded-full bg-foreground/60\" />\n\t\t\t\t\t\t\t\t\t\t\t{canNavigate ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleChipClick(id, targetCollection);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-primary hover:underline text-left\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{label}</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t)}\n\t\t\t\t</Tooltip>\n\n\t\t\t\t{/* Detail sheet */}\n\t\t\t\t{sheetCollection && sheetItemId && (\n\t\t\t\t\t<ResourceSheet\n\t\t\t\t\t\ttype=\"collection\"\n\t\t\t\t\t\tcollection={sheetCollection}\n\t\t\t\t\t\titemId={sheetItemId}\n\t\t\t\t\t\topen={sheetOpen}\n\t\t\t\t\t\tonOpenChange={setSheetOpen}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t}\n\n\t// Handle single relation\n\treturn (\n\t\t<>\n\t\t\t<RelationChip\n\t\t\t\titem={value}\n\t\t\t\ttargetCollection={targetCollection}\n\t\t\t\tonClick={handleChipClick}\n\t\t\t/>\n\t\t\t{/* Detail sheet */}\n\t\t\t{sheetCollection && sheetItemId && (\n\t\t\t\t<ResourceSheet\n\t\t\t\t\ttype=\"collection\"\n\t\t\t\t\tcollection={sheetCollection}\n\t\t\t\t\titemId={sheetItemId}\n\t\t\t\t\topen={sheetOpen}\n\t\t\t\t\tonOpenChange={setSheetOpen}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n}\n\n// ============================================================================\n// Reverse Relation Cell\n// ============================================================================\n\n/**\n * Reverse relation cell - displays related items as clickable chips\n * Shows count badge with tooltip listing all items for navigation\n * Opens detail sheet on click\n */\nexport function ReverseRelationCell({\n\tvalue,\n\tfieldDef,\n}: {\n\tvalue: unknown;\n\trow?: unknown;\n\tfieldDef?: FieldDefinition;\n}) {\n\tconst resolveText = useResolveText();\n\t// Get source collection from fieldDef (the collection that has the relation pointing here)\n\tconst sourceCollection = fieldDef?.[\"~options\"]?.sourceCollection as\n\t\t| string\n\t\t| undefined;\n\n\t// Sheet state\n\tconst [sheetOpen, setSheetOpen] = React.useState(false);\n\tconst [sheetItemId, setSheetItemId] = React.useState<string | undefined>();\n\tconst [sheetCollection, setSheetCollection] = React.useState<\n\t\tstring | undefined\n\t>();\n\n\tconst handleChipClick = React.useCallback(\n\t\t(itemId: string, collection: string) => {\n\t\t\tsetSheetItemId(itemId);\n\t\t\tsetSheetCollection(collection);\n\t\t\tsetSheetOpen(true);\n\t\t},\n\t\t[],\n\t);\n\n\tif (value === null || value === undefined) {\n\t\treturn <span className=\"text-muted-foreground\">-</span>;\n\t}\n\n\t// Handle count-only value (when items not fetched)\n\tif (typeof value === \"number\") {\n\t\treturn (\n\t\t\t<Badge variant=\"secondary\">\n\t\t\t\t{value} item{value !== 1 ? \"s\" : \"\"}\n\t\t\t</Badge>\n\t\t);\n\t}\n\n\t// Handle array of related items\n\tif (Array.isArray(value)) {\n\t\tif (value.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">-</span>;\n\t\t}\n\n\t\t// For small counts, show chips inline\n\t\tif (value.length <= 2) {\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t<span className=\"inline-flex flex-wrap items-center gap-1\">\n\t\t\t\t\t\t{value.map((item, idx) => (\n\t\t\t\t\t\t\t<RelationChip\n\t\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: stable array from backend\n\t\t\t\t\t\t\t\tkey={idx}\n\t\t\t\t\t\t\t\titem={item}\n\t\t\t\t\t\t\t\ttargetCollection={sourceCollection}\n\t\t\t\t\t\t\t\tonClick={handleChipClick}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</span>\n\t\t\t\t\t{/* Detail sheet */}\n\t\t\t\t\t{sheetCollection && sheetItemId && (\n\t\t\t\t\t\t<ResourceSheet\n\t\t\t\t\t\t\ttype=\"collection\"\n\t\t\t\t\t\t\tcollection={sheetCollection}\n\t\t\t\t\t\t\titemId={sheetItemId}\n\t\t\t\t\t\t\topen={sheetOpen}\n\t\t\t\t\t\t\tonOpenChange={setSheetOpen}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t);\n\t\t}\n\n\t\t// For larger counts, show count badge with tooltip\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<Tooltip>\n\t\t\t\t\t<TooltipTrigger\n\t\t\t\t\t\trender={\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"inline-flex items-center gap-1.5 cursor-default\",\n\t\t\t\t\t\t\t\t\t\"text-muted-foreground hover:text-foreground transition-colors\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Badge variant=\"secondary\" className=\"h-5 px-1.5 text-xs\">\n\t\t\t\t\t\t\t\t\t{value.length}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t<span className=\"text-xs\">\n\t\t\t\t\t\t\t\t\t{resolveText(getRelationItemLabel(value[0]))}\n\t\t\t\t\t\t\t\t\t{value.length > 1 && ` +${value.length - 1}`}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t\t<TooltipContent side=\"bottom\" align=\"start\" className=\"p-0 w-56\">\n\t\t\t\t\t\t<div className=\"max-h-[200px] overflow-y-auto p-2 space-y-1\">\n\t\t\t\t\t\t\t{value.slice(0, 15).map((item, idx) => {\n\t\t\t\t\t\t\t\tconst label = resolveText(getRelationItemLabel(item));\n\t\t\t\t\t\t\t\tconst id = getRelationItemId(item);\n\t\t\t\t\t\t\t\tconst canNavigate = sourceCollection && id;\n\t\t\t\t\t\t\t\tconst key = id ?? label ?? `item-${idx}`;\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<div key={key} className=\"flex items-center gap-1.5 text-xs\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"size-1 rounded-full bg-foreground/60\" />\n\t\t\t\t\t\t\t\t\t\t{canNavigate ? (\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleChipClick(id, sourceCollection);\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-primary hover:underline text-left truncate\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"truncate\">{label}</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t{value.length > 15 && (\n\t\t\t\t\t\t\t\t<div className=\"text-[11px] text-muted-foreground text-center pt-1 border-t border-border/50 mt-1\">\n\t\t\t\t\t\t\t\t\t+{value.length - 15} more\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</TooltipContent>\n\t\t\t\t</Tooltip>\n\n\t\t\t\t{/* Detail sheet */}\n\t\t\t\t{sheetCollection && sheetItemId && (\n\t\t\t\t\t<ResourceSheet\n\t\t\t\t\t\ttype=\"collection\"\n\t\t\t\t\t\tcollection={sheetCollection}\n\t\t\t\t\t\titemId={sheetItemId}\n\t\t\t\t\t\topen={sheetOpen}\n\t\t\t\t\t\tonOpenChange={setSheetOpen}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t}\n\n\treturn <span className=\"text-muted-foreground\">-</span>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA+BA,SAAgB,aAAa,EAC5B,OACA,YAKE;CACF,MAAM,cAAc,gBAAgB;CACpC,MAAM,mBAAmB,WAAW,aAAa;CAKjD,MAAM,CAAC,WAAW,gBAAgBA,QAAM,SAAS,MAAM;CACvD,MAAM,CAAC,aAAa,kBAAkBA,QAAM,UAA8B;CAC1E,MAAM,CAAC,iBAAiB,sBAAsBA,QAAM,UAEjD;CAEH,MAAM,kBAAkBA,QAAM,aAC5B,QAAgB,eAAuB;AACvC,iBAAe,OAAO;AACtB,qBAAmB,WAAW;AAC9B,eAAa,KAAK;IAEnB,EAAE,CACF;AAED,KAAI,UAAU,QAAQ,UAAU,OAC/B,QAAO,oBAAC;EAAK,WAAU;YAAwB;GAAQ;AAIxD,KAAI,MAAM,QAAQ,MAAM,EAAE;AACzB,MAAI,MAAM,WAAW,EACpB,QAAO,oBAAC;GAAK,WAAU;aAAwB;IAAQ;EAGxD,MAAM,eAAe,MAAM,MAAM,GAAG,EAAE;EACtC,MAAM,iBAAiB,MAAM,SAAS;AAEtC,SACC,4CACC,qBAAC,sBACA,oBAAC,kBACA,QACC,qBAAC;GAAK,WAAU;cACd,aAAa,KAAK,MAAM,QACxB,oBAAC;IAGM;IACY;IAClB,SAAS;IACT,WAAU;MAJL,IAKJ,CACD,EACD,iBAAiB,KACjB,qBAAC;IACA,SAAQ;IACR,WAAU;eACV,KACE;KACK;IAEH,GAEP,EACD,MAAM,SAAS,KACf,oBAAC;GAAe,MAAK;GAAS,OAAM;GAAQ,WAAU;aACrD,oBAAC;IAAI,WAAU;cACb,MAAM,KAAK,MAAM,QAAQ;KACzB,MAAM,QAAQ,YAAY,qBAAqB,KAAK,CAAC;KACrD,MAAM,KAAK,kBAAkB,KAAK;KAClC,MAAM,cAAc,oBAAoB;KACxC,MAAM,MAAM,MAAM,SAAS,QAAQ;AAEnC,YACC,qBAAC;MAEA,WAAU;iBAEV,oBAAC,UAAK,WAAU,yCAAyC,EACxD,cACA,oBAAC;OACA,MAAK;OACL,UAAU,MAAM;AACf,UAAE,iBAAiB;AACnB,wBAAgB,IAAI,iBAAiB;;OAEtC,WAAU;iBAET;QACO,GAET,oBAAC,oBAAM,QAAa;QAhBhB,IAkBA;MAEN;KACG;IACU,IAET,EAGT,mBAAmB,eACnB,oBAAC;GACA,MAAK;GACL,YAAY;GACZ,QAAQ;GACR,MAAM;GACN,cAAc;IACb,IAED;;AAKL,QACC,4CACC,oBAAC;EACA,MAAM;EACY;EAClB,SAAS;GACR,EAED,mBAAmB,eACnB,oBAAC;EACA,MAAK;EACL,YAAY;EACZ,QAAQ;EACR,MAAM;EACN,cAAc;GACb,IAED"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import "react/jsx-runtime";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"asset-thumbnail.mjs","names":[],"sources":["../../../../../../src/client/views/collection/cells/shared/asset-thumbnail.tsx"],"sourcesContent":["/**\n * AssetThumbnail Component\n *\n * Unified asset display component for all contexts.\n * Replaces 3 duplicate implementations:\n * - UploadCell (32px table)\n * - AssetPreviewCell (40px preview)\n * - AssetPreviewField (400px form preview)\n */\n\nimport * as React from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"../../../../components/ui/button\";\nimport { cn } from \"../../../../lib/utils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AssetThumbnailProps {\n /**\n * Asset object or ID\n */\n asset: unknown;\n\n /**\n * Size variant\n * - sm: 32px (table cells)\n * - md: 40px/64px (preview)\n * - lg: 400px (form preview with controls)\n */\n size?: \"sm\" | \"md\" | \"lg\";\n\n /**\n * Show filename next to thumbnail (sm/md sizes only)\n */\n showFilename?: boolean;\n\n /**\n * Show video/audio controls (lg size only)\n */\n showControls?: boolean;\n\n /**\n * Called when the thumbnail is clicked\n */\n onClick?: (id: string) => void;\n\n /**\n * Additional className\n */\n className?: string;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction getFileIcon(mimeType?: string): string {\n if (!mimeType) return \"ph:file\";\n\n const type = mimeType.toLowerCase();\n\n if (type.startsWith(\"image/\")) return \"ph:file-image\";\n if (type.startsWith(\"video/\")) return \"ph:file-video\";\n if (type.startsWith(\"audio/\")) return \"ph:file-audio\";\n if (type === \"application/pdf\") return \"ph:file-pdf\";\n if (\n type.includes(\"zip\") ||\n type.includes(\"compressed\") ||\n type.includes(\"archive\")\n )\n return \"ph:file-zip\";\n if (\n type.includes(\"word\") ||\n type.includes(\"document\") ||\n type === \"application/rtf\"\n )\n return \"ph:file-doc\";\n if (\n type.includes(\"json\") ||\n type.includes(\"javascript\") ||\n type.includes(\"typescript\") ||\n type.includes(\"xml\") ||\n type.includes(\"html\")\n )\n return \"ph:file-code\";\n\n return \"ph:file\";\n}\n\nfunction isImage(mimeType?: string): boolean {\n return !!mimeType?.toLowerCase().startsWith(\"image/\");\n}\n\nfunction isVideo(mimeType?: string): boolean {\n return !!mimeType?.toLowerCase().startsWith(\"video/\");\n}\n\nfunction isAudio(mimeType?: string): boolean {\n return !!mimeType?.toLowerCase().startsWith(\"audio/\");\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function AssetThumbnail({\n asset,\n size = \"sm\",\n showFilename = false,\n showControls = false,\n onClick,\n className,\n}: AssetThumbnailProps) {\n // Handle null/undefined\n if (asset === null || asset === undefined) {\n return <span className=\"text-muted-foreground\">-</span>;\n }\n\n // If asset is just an ID string\n if (typeof asset === \"string\") {\n return (\n <span\n className=\"font-mono text-xs text-muted-foreground truncate max-w-[100px]\"\n title={asset}\n >\n {asset.slice(0, 8)}...\n </span>\n );\n }\n\n // Extract asset properties\n const assetObj = asset as Record<string, unknown>;\n const url = assetObj.url as string | undefined;\n const filename = assetObj.filename as string | undefined;\n const mimeType = assetObj.mimeType as string | undefined;\n const alt = assetObj.alt as string | undefined;\n\n const isImageType = isImage(mimeType);\n const isVideoType = isVideo(mimeType);\n const isAudioType = isAudio(mimeType);\n const fileIcon = getFileIcon(mimeType);\n\n // No URL means no preview\n if (!url) {\n if (assetObj.id) {\n return (\n <span className=\"font-mono text-xs text-muted-foreground\">\n {String(assetObj.id).slice(0, 8)}...\n </span>\n );\n }\n return <span className=\"text-muted-foreground\">-</span>;\n }\n\n // ========== SM SIZE (32px) - Table cells ==========\n if (size === \"sm\") {\n const assetId = assetObj.id as string | undefined;\n const handleClick = onClick && assetId ? () => onClick(assetId) : undefined;\n\n if (isImageType) {\n return (\n <div\n className={cn(\n \"flex items-center gap-2\",\n onClick && \"cursor-pointer hover:opacity-80\",\n className,\n )}\n onClick={handleClick}\n >\n <img\n src={url}\n alt={filename || \"Asset\"}\n className=\"size-8 rounded object-cover border\"\n />\n {showFilename && filename && (\n <span className=\"text-xs truncate max-w-[100px]\" title={filename}>\n {filename}\n </span>\n )}\n </div>\n );\n }\n\n // Non-image files\n if (showFilename && filename) {\n return (\n <span className=\"text-sm truncate max-w-[150px]\" title={filename}>\n {filename}\n </span>\n );\n }\n\n return (\n <span className=\"font-mono text-xs text-muted-foreground\">\n {String(assetObj.id || \"\").slice(0, 8)}...\n </span>\n );\n }\n\n // ========== MD SIZE (40px) - Preview/Icon ==========\n if (size === \"md\") {\n const assetId = assetObj.id as string | undefined;\n const handleClick = onClick && assetId ? () => onClick(assetId) : undefined;\n\n if (isImageType) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center\",\n onClick && \"cursor-pointer hover:opacity-80\",\n className,\n )}\n onClick={handleClick}\n >\n <img\n src={url}\n alt={filename || \"Asset\"}\n className=\"size-10 rounded object-cover border\"\n />\n </div>\n );\n }\n\n // Show icon for non-images\n return (\n <div\n className={cn(\n \"flex items-center justify-center\",\n onClick && \"cursor-pointer hover:opacity-80\",\n className,\n )}\n onClick={handleClick}\n >\n <div className=\"size-10 rounded border bg-muted flex items-center justify-center\">\n <Icon icon={fileIcon} className=\"size-5 text-muted-foreground\" />\n </div>\n </div>\n );\n }\n\n // ========== LG SIZE (400px) - Full preview with controls ==========\n return (\n <div\n className={cn(\n \"relative overflow-hidden rounded-lg border bg-muted/30\",\n className,\n )}\n >\n {/* Image Preview */}\n {isImageType && (\n <div className=\"relative\">\n <img\n src={url}\n alt={alt || filename || \"Asset preview\"}\n className=\"max-h-[400px] w-full object-contain\"\n />\n </div>\n )}\n\n {/* Video Preview */}\n {isVideoType && (\n <div className=\"relative\">\n {showControls ? (\n <video\n src={url}\n controls\n className=\"max-h-[400px] w-full\"\n preload=\"metadata\"\n >\n <track kind=\"captions\" />\n Your browser does not support the video tag.\n </video>\n ) : (\n <div className=\"flex flex-col items-center justify-center gap-4 p-12\">\n <Icon icon={fileIcon} className=\"size-20 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n {filename || \"Video\"}\n </p>\n </div>\n )}\n </div>\n )}\n\n {/* Audio Preview */}\n {isAudioType && (\n <div className=\"flex flex-col items-center justify-center gap-4 p-8\">\n <Icon icon={fileIcon} className=\"size-16 text-muted-foreground\" />\n {showControls && (\n <audio\n src={url}\n controls\n className=\"w-full max-w-md\"\n preload=\"metadata\"\n >\n Your browser does not support the audio tag.\n </audio>\n )}\n {!showControls && (\n <p className=\"text-sm text-muted-foreground\">\n {filename || \"Audio\"}\n </p>\n )}\n </div>\n )}\n\n {/* Other File Types */}\n {!isImageType && !isVideoType && !isAudioType && (\n <div className=\"flex flex-col items-center justify-center gap-4 p-12\">\n <Icon icon={fileIcon} className=\"size-20 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">{filename || \"File\"}</p>\n </div>\n )}\n\n {/* Open in new tab button (lg size only) */}\n <div className=\"absolute right-2 top-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"icon-sm\"\n nativeButton={false}\n render={<a href={url} target=\"_blank\" rel=\"noopener noreferrer\" />}\n >\n <Icon icon=\"ph:arrow-square-out-bold\" />\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cell-helpers.mjs","names":[],"sources":["../../../../../../src/client/views/collection/cells/shared/cell-helpers.ts"],"sourcesContent":["/**\n * Shared helper functions for cell rendering\n * Extracted from build-columns.tsx to reduce duplication\n */\n\nimport type { FieldDefinition } from \"../../../../builder/field/field\";\nimport { formatLabel } from \"../../../../lib/utils\";\n\n/**\n * Get display label for a relation item\n * Prefers _title (backend computed), then common label fields, then id\n */\nexport function getRelationItemLabel(item: unknown): string {\n if (typeof item === \"object\" && item !== null) {\n const obj = item as Record<string, unknown>;\n // Prefer _title computed field from backend\n return String(obj._title || obj.name || obj.title || obj.id || \"-\");\n }\n return String(item);\n}\n\n/**\n * Get ID from a relation item\n */\nexport function getRelationItemId(item: unknown): string | null {\n if (typeof item === \"object\" && item !== null) {\n const obj = item as Record<string, unknown>;\n return obj.id ? String(obj.id) : null;\n }\n if (typeof item === \"string\" || typeof item === \"number\") {\n return String(item);\n }\n return null;\n}\n\n/**\n * Format a field key as a readable label (camelCase -> Title Case)\n * @deprecated Use `formatLabel` from `@/lib/utils` instead\n */\nexport const formatFieldLabel = formatLabel;\n\n/**\n * Get label for a field from field definition or format from key\n */\nexport function getFieldLabel(key: string, fieldDef?: FieldDefinition): string {\n if (fieldDef?.[\"~options\"]?.label) {\n return fieldDef[\"~options\"].label;\n }\n return formatFieldLabel(key);\n}\n\n/**\n * Format a primitive value for display\n */\nexport function formatPrimitiveValue(value: unknown): string {\n if (value === null || value === undefined) return \"-\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (value instanceof Date) return value.toLocaleDateString();\n if (typeof value === \"number\") return value.toLocaleString();\n return String(value);\n}\n\n/**\n * Summarize a value for inline preview\n */\nexport function summarizeValue(val: unknown): string {\n if (val === null || val === undefined) return \"-\";\n if (typeof val === \"boolean\") return val ? \"Yes\" : \"No\";\n if (typeof val === \"number\") return val.toLocaleString();\n if (typeof val === \"string\")\n return val.length > 25 ? `${val.slice(0, 25)}…` : val;\n if (Array.isArray(val)) return `${val.length} items`;\n if (typeof val === \"object\") return `${Object.keys(val).length} fields`;\n return String(val);\n}\n\n/**\n * Get item label from various sources (used in array cells)\n */\nexport function getItemLabel(\n item: unknown,\n idx: number,\n itemLabelFn?: (item: unknown) => string,\n): string {\n if (itemLabelFn) {\n try {\n return itemLabelFn(item) || `Item ${idx + 1}`;\n } catch {\n return `Item ${idx + 1}`;\n }\n }\n if (typeof item === \"object\" && item !== null) {\n const obj = item as Record<string, unknown>;\n return (\n String(\n obj.name || obj.title || obj.label || obj.platform || obj.type || \"\",\n ) || `Item ${idx + 1}`\n );\n }\n return formatPrimitiveValue(item);\n}\n"],"mappings":";;;;;;;AAYA,SAAgB,qBAAqB,MAAuB;AAC1D,KAAI,OAAO,SAAS,YAAY,SAAS,MAAM;EAC7C,MAAM,MAAM;AAEZ,SAAO,OAAO,IAAI,UAAU,IAAI,QAAQ,IAAI,SAAS,IAAI,MAAM,IAAI;;AAErE,QAAO,OAAO,KAAK;;;;;AAMrB,SAAgB,kBAAkB,MAA8B;AAC9D,KAAI,OAAO,SAAS,YAAY,SAAS,MAAM;EAC7C,MAAM,MAAM;AACZ,SAAO,IAAI,KAAK,OAAO,IAAI,GAAG,GAAG;;AAEnC,KAAI,OAAO,SAAS,YAAY,OAAO,SAAS,SAC9C,QAAO,OAAO,KAAK;AAErB,QAAO;;;;;;AAOT,MAAa,mBAAmB;;;;AAKhC,SAAgB,cAAc,KAAa,UAAoC;AAC7E,KAAI,WAAW,aAAa,MAC1B,QAAO,SAAS,YAAY;AAE9B,QAAO,iBAAiB,IAAI;;;;;AAM9B,SAAgB,qBAAqB,OAAwB;AAC3D,KAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,KAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,QAAQ;AACvD,KAAI,iBAAiB,KAAM,QAAO,MAAM,oBAAoB;AAC5D,KAAI,OAAO,UAAU,SAAU,QAAO,MAAM,gBAAgB;AAC5D,QAAO,OAAO,MAAM;;;;;AAMtB,SAAgB,eAAe,KAAsB;AACnD,KAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,KAAI,OAAO,QAAQ,UAAW,QAAO,MAAM,QAAQ;AACnD,KAAI,OAAO,QAAQ,SAAU,QAAO,IAAI,gBAAgB;AACxD,KAAI,OAAO,QAAQ,SACjB,QAAO,IAAI,SAAS,KAAK,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC,KAAK;AACpD,KAAI,MAAM,QAAQ,IAAI,CAAE,QAAO,GAAG,IAAI,OAAO;AAC7C,KAAI,OAAO,QAAQ,SAAU,QAAO,GAAG,OAAO,KAAK,IAAI,CAAC,OAAO;AAC/D,QAAO,OAAO,IAAI;;;;;AAMpB,SAAgB,aACd,MACA,KACA,aACQ;AACR,KAAI,YACF,KAAI;AACF,SAAO,YAAY,KAAK,IAAI,QAAQ,MAAM;SACpC;AACN,SAAO,QAAQ,MAAM;;AAGzB,KAAI,OAAO,SAAS,YAAY,SAAS,MAAM;EAC7C,MAAM,MAAM;AACZ,SACE,OACE,IAAI,QAAQ,IAAI,SAAS,IAAI,SAAS,IAAI,YAAY,IAAI,QAAQ,GACnE,IAAI,QAAQ,MAAM;;AAGvB,QAAO,qBAAqB,KAAK"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import "react/jsx-runtime";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relation-chip.mjs","names":[],"sources":["../../../../../../src/client/views/collection/cells/shared/relation-chip.tsx"],"sourcesContent":["/**\n * RelationChip Component\n *\n * Clickable chip for displaying relation items.\n * Extracted from RelationCell to eliminate duplication.\n * Used by RelationCell and ReverseRelationCell.\n */\n\nimport type * as React from \"react\";\nimport { useResolveText } from \"../../../../i18n/hooks\";\nimport { cn } from \"../../../../lib/utils\";\nimport { getRelationItemId, getRelationItemLabel } from \"./cell-helpers\";\n\nexport interface RelationChipProps {\n\t/**\n\t * Relation item (object with id, name, title, etc.)\n\t */\n\titem: unknown;\n\n\t/**\n\t * Target collection name for navigation\n\t */\n\ttargetCollection?: string;\n\n\t/**\n\t * Click handler (if provided, prevents default navigation)\n\t * Receives item ID and collection name\n\t */\n\tonClick?: (itemId: string, collection: string) => void;\n\n\t/**\n\t * Additional CSS classes\n\t */\n\tclassName?: string;\n}\n\n/**\n * Clickable relation chip component\n * Shows label and navigates to related item on click (or opens sheet if onClick provided)\n */\nexport function RelationChip({\n\titem,\n\ttargetCollection,\n\tonClick,\n\tclassName,\n}: RelationChipProps) {\n\tconst resolveText = useResolveText();\n\tconst label = resolveText(getRelationItemLabel(item));\n\tconst id = getRelationItemId(item);\n\tconst canInteract = targetCollection && id;\n\n\tconst handleClick = (e: React.MouseEvent) => {\n\t\te.stopPropagation();\n\t\tif (onClick && id && targetCollection) {\n\t\t\te.preventDefault();\n\t\t\tonClick(id, targetCollection);\n\t\t}\n\t};\n\n\tif (canInteract) {\n\t\tconst href = `/admin/collections/${targetCollection}/${id}`;\n\t\tconst chipClassName = cn(\n\t\t\t\"inline-flex items-center gap-1 px-2 py-0.5 rounded-md text-xs\",\n\t\t\t\"bg-primary/10 text-primary hover:bg-primary/20\",\n\t\t\t\"transition-colors cursor-pointer\",\n\t\t\t\"border border-primary/20 hover:border-primary/40\",\n\t\t\tclassName,\n\t\t);\n\n\t\t// If onClick provided, use button-like behavior but keep href for accessibility\n\t\treturn (\n\t\t\t<a\n\t\t\t\thref={href}\n\t\t\t\tonClick={handleClick}\n\t\t\t\tonPointerDown={(e) => e.stopPropagation()}\n\t\t\t\tclassName={chipClassName}\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t</a>\n\t\t);\n\t}\n\n\t// Non-clickable chip (no target collection or id)\n\treturn (\n\t\t<span\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex items-center gap-1 px-2 py-0.5 rounded-md text-xs\",\n\t\t\t\t\"bg-muted text-muted-foreground\",\n\t\t\t\t\"border border-border\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{label}\n\t\t</span>\n\t);\n}\n"],"mappings":";;;;;;;;;;AAwCA,SAAgB,aAAa,EAC5B,MACA,kBACA,SACA,aACqB;CAErB,MAAM,QADc,gBAAgB,CACV,qBAAqB,KAAK,CAAC;CACrD,MAAM,KAAK,kBAAkB,KAAK;CAClC,MAAM,cAAc,oBAAoB;CAExC,MAAM,eAAe,MAAwB;AAC5C,IAAE,iBAAiB;AACnB,MAAI,WAAW,MAAM,kBAAkB;AACtC,KAAE,gBAAgB;AAClB,WAAQ,IAAI,iBAAiB;;;AAI/B,KAAI,YAWH,QACC,oBAAC;EACA,MAZW,sBAAsB,iBAAiB,GAAG;EAarD,SAAS;EACT,gBAAgB,MAAM,EAAE,iBAAiB;EACzC,WAdoB,GACrB,iEACA,kDACA,oCACA,oDACA,UACA;YAUE;GACE;AAKN,QACC,oBAAC;EACA,WAAW,GACV,iEACA,kCACA,wBACA,UACA;YAEA;GACK"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime197 from "react/jsx-runtime";
|
|
2
|
-
|
|
3
|
-
//#region src/client/views/collection/cells/upload-cells.d.ts
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Upload Cell Components
|
|
7
|
-
*
|
|
8
|
-
* Cells for displaying asset/upload fields:
|
|
9
|
-
* - UploadCell - single asset
|
|
10
|
-
* - UploadManyCell - multiple assets
|
|
11
|
-
*
|
|
12
|
-
* Uses unified AssetThumbnail component
|
|
13
|
-
*/
|
|
14
|
-
/**
|
|
15
|
-
* Upload cell - displays single asset thumbnail or file info
|
|
16
|
-
* Uses AssetThumbnail with size="sm"
|
|
17
|
-
*/
|
|
18
|
-
declare function UploadCell({
|
|
19
|
-
value
|
|
20
|
-
}: {
|
|
21
|
-
value: unknown;
|
|
22
|
-
}): react_jsx_runtime197.JSX.Element;
|
|
23
|
-
//#endregion
|
|
24
|
-
export { UploadCell };
|
|
25
|
-
//# sourceMappingURL=upload-cells.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload-cells.d.mts","names":[],"sources":["../../../../../src/client/views/collection/cells/upload-cells.tsx"],"sourcesContent":[],"mappings":";;;;;;;AAsBA;;;;;;;;;;iBAAgB,UAAA;;;;IAAwC,oBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload-cells.mjs","names":[],"sources":["../../../../../src/client/views/collection/cells/upload-cells.tsx"],"sourcesContent":["/**\n * Upload Cell Components\n *\n * Cells for displaying asset/upload fields:\n * - UploadCell - single asset\n * - UploadManyCell - multiple assets\n *\n * Uses unified AssetThumbnail component\n */\n\nimport * as React from \"react\";\nimport { Badge } from \"../../../components/ui/badge\";\nimport { AssetThumbnail } from \"./shared/asset-thumbnail\";\n\n// ============================================================================\n// Upload Cell\n// ============================================================================\n\n/**\n * Upload cell - displays single asset thumbnail or file info\n * Uses AssetThumbnail with size=\"sm\"\n */\nexport function UploadCell({ value }: { value: unknown }) {\n return <AssetThumbnail asset={value} size=\"sm\" showFilename />;\n}\n\n// ============================================================================\n// Upload Many Cell\n// ============================================================================\n\n/**\n * Upload many cell - displays multiple assets count or thumbnails\n */\nexport function UploadManyCell({ value }: { value: unknown }) {\n if (value === null || value === undefined) {\n return <span className=\"text-muted-foreground\">-</span>;\n }\n\n if (!Array.isArray(value)) {\n return <span className=\"text-muted-foreground\">-</span>;\n }\n\n if (value.length === 0) {\n return <span className=\"text-muted-foreground\">-</span>;\n }\n\n // Get image assets for preview\n const imageAssets = value\n .filter((item): item is Record<string, unknown> => {\n if (typeof item !== \"object\" || item === null) return false;\n const mimeType = (item as Record<string, unknown>).mimeType;\n return typeof mimeType === \"string\" && mimeType.startsWith(\"image/\");\n })\n .slice(0, 3);\n\n // Show mini grid of thumbnails for images\n if (imageAssets.length > 0) {\n const remaining = value.length - imageAssets.length;\n return (\n <div className=\"flex items-center gap-1\">\n <div className=\"flex -space-x-2\">\n {imageAssets.map((asset, index) => (\n <img\n key={(asset.id as string) || index}\n src={asset.url as string}\n alt={(asset.filename as string) || \"Asset\"}\n className=\"size-6 rounded border bg-background object-cover\"\n />\n ))}\n </div>\n {remaining > 0 && (\n <span className=\"text-xs text-muted-foreground ml-1\">\n +{remaining}\n </span>\n )}\n </div>\n );\n }\n\n // Show count badge for non-images\n return (\n <Badge variant=\"secondary\">\n {value.length} file{value.length !== 1 ? \"s\" : \"\"}\n </Badge>\n );\n}\n"],"mappings":";;;;;;;;;AAsBA,SAAgB,WAAW,EAAE,SAA6B;AACxD,QAAO,oBAAC;EAAe,OAAO;EAAO,MAAK;EAAK;GAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build-columns.mjs","names":["columnConfigs: ColumnConfig<string>[]","titleLabel: I18nText","CellComponent: React.ComponentType<{\n value: unknown;\n row?: unknown;\n fieldDef?: FieldDefinition;\n }>","accessorKey: string","columnDef: ColumnDef<TData>"],"sources":["../../../../../src/client/views/collection/columns/build-columns.tsx"],"sourcesContent":["/**\n * Column Builder\n *\n * Generates TanStack Table column definitions from collection config.\n * Simplified version - uses field registry or DefaultCell fallback.\n */\n\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport type * as React from \"react\";\nimport {\n type ColumnConfig,\n normalizeColumnConfig,\n} from \"../../../builder/types/collection-types\";\nimport type { FieldDefinition } from \"../../../builder/field/field\";\nimport { LocaleSwitcher } from \"../../../components/locale-switcher\";\nimport { useResolveText } from \"../../../i18n/hooks\";\nimport type { I18nText } from \"../../../i18n/types\";\nimport { useSafeContentLocales, useScopedLocale } from \"../../../runtime\";\nimport { DefaultCell, TextCell } from \"../cells\";\nimport { computeDefaultColumns, formatHeader } from \"./column-defaults\";\nimport type { BuildColumnsOptions } from \"./types\";\n\n// ============================================================================\n// Header Component with I18nText Resolution\n// ============================================================================\n\n/**\n * Column header component that resolves I18nText labels\n */\nfunction ColumnHeader({\n label,\n fallback,\n localized,\n}: {\n label: I18nText | undefined;\n fallback: string;\n localized?: boolean;\n}) {\n const resolveText = useResolveText();\n const contentLocales = useSafeContentLocales();\n // Use scoped locale (from LocaleScopeProvider in ResourceSheet) or global locale\n const { locale: contentLocale, setLocale: setContentLocale } =\n useScopedLocale();\n const resolvedLocale =\n contentLocale ??\n contentLocales?.defaultLocale ??\n contentLocales?.locales[0]?.code;\n const localeOptions = contentLocales?.locales?.length\n ? contentLocales.locales\n : resolvedLocale\n ? [{ code: resolvedLocale }]\n : [];\n const showLocaleSwitcher = localized && localeOptions.length > 0;\n\n return (\n <span className=\"inline-flex items-center gap-1.5\">\n <span>{resolveText(label, fallback)}</span>\n {showLocaleSwitcher && (\n <LocaleSwitcher\n locales={localeOptions}\n value={resolvedLocale}\n onChange={setContentLocale}\n labelMode=\"code\"\n />\n )}\n </span>\n );\n}\n\n// ============================================================================\n// Field Types Needing fieldDef\n// ============================================================================\n\n/**\n * Field types that need fieldDef passed to their cell component\n * (for nested field definitions, labels, etc.)\n */\nconst FIELD_TYPES_NEEDING_FIELD_DEF = new Set([\n \"object\",\n \"array\",\n \"relation\",\n \"reverseRelation\",\n]);\n\n// ============================================================================\n// Column Builder\n// ============================================================================\n\n/**\n * Build column definitions from collection config\n *\n * Simplified cell resolution:\n * 1. Custom from .list() config\n * 2. From field registry (.cell)\n * 3. Ultra-simple DefaultCell fallback\n *\n * NO getCellForFieldType() switch statement needed!\n *\n * @param options - Build options with config and fallbacks\n * @returns Array of TanStack Table column definitions\n *\n * @example\n * ```tsx\n * const columns = buildColumns({\n * config: collectionsConfig.posts,\n * fallbackColumns: ['id', 'title', 'createdAt'],\n * meta: collectionMeta,\n * });\n *\n * <CollectionList collection=\"posts\" columns={columns} />\n * ```\n */\nexport function buildColumns<TData extends Record<string, unknown>>(\n options: BuildColumnsOptions,\n): ColumnDef<TData>[] {\n const {\n config,\n fallbackColumns = [\"id\"],\n buildAllColumns = false,\n meta,\n } = options;\n const fields = config?.fields ?? {};\n const listConfig = config?.list;\n\n const isLocalizedField = (\n field: string,\n definition?: FieldDefinition,\n ): boolean => {\n const fieldOptions = definition?.[\"~options\"] ?? {};\n return fieldOptions.localized !== undefined\n ? !!fieldOptions.localized\n : (meta?.localizedFields?.includes(field) ?? false);\n };\n\n // Determine title column based on meta\n // If meta says title is a real \"field\", use that field instead of _title\n const titleFieldName = meta?.title?.fieldName;\n const titleType = meta?.title?.type;\n const titleColumn =\n titleType === \"field\" && titleFieldName ? titleFieldName : \"_title\";\n\n // Determine which columns to build\n let columnConfigs: ColumnConfig<string>[];\n\n if (buildAllColumns) {\n // Build ALL columns for all fields (used when user can toggle visibility)\n // Include title column (real field or _title) first, then all other fields\n const allFields = Object.keys(fields);\n // If title is a real field, don't duplicate it\n const otherFields =\n titleColumn === \"_title\"\n ? allFields\n : allFields.filter((f) => f !== titleColumn);\n columnConfigs = [titleColumn, ...otherFields];\n } else if (listConfig?.columns && listConfig.columns.length > 0) {\n // Use explicitly defined columns\n columnConfigs = listConfig.columns;\n } else if (Object.keys(fields).length > 0) {\n // Use sane defaults - limited content fields + createdAt\n columnConfigs = computeDefaultColumns(fields, { meta });\n } else {\n // Use fallback - include title column first\n columnConfigs = [\n titleColumn,\n ...fallbackColumns.filter((c) => c !== titleColumn && c !== \"_title\"),\n ];\n }\n\n // Build column definitions\n return columnConfigs.map((colConfig) => {\n const normalized = normalizeColumnConfig(colConfig);\n const fieldName = normalized.field;\n const fieldDef = fields[fieldName];\n\n // Special handling for _title virtual field (computed by backend)\n if (fieldName === \"_title\") {\n const titleIsLocalized = titleFieldName\n ? isLocalizedField(titleFieldName, fields[titleFieldName])\n : false;\n // Determine the label for _title column\n // For virtual titles, use the virtual field's label instead of generic \"Title\"\n let titleLabel: I18nText = \"Title\";\n let titleFallback = \"Title\";\n if (titleType === \"virtual\" && titleFieldName && fields[titleFieldName]) {\n const virtualFieldDef = fields[titleFieldName];\n const virtualFieldOptions = virtualFieldDef?.[\"~options\"] ?? {};\n titleLabel = virtualFieldOptions.label;\n titleFallback = formatHeader(titleFieldName);\n }\n\n const columnDef: ColumnDef<TData> = {\n accessorKey: \"_title\",\n header: normalized.header\n ? () => <ColumnHeader label={normalized.header} fallback=\"Title\" />\n : () => <ColumnHeader label={titleLabel} fallback={titleFallback} />,\n cell: ({ row }) => {\n const value = row.getValue(\"_title\");\n return <TextCell value={value} />;\n },\n enableSorting: false, // _title is virtual, can't sort on it directly\n };\n return columnDef;\n }\n\n const fieldType = fieldDef?.name ?? \"text\";\n const fieldOptions = fieldDef?.[\"~options\"] ?? {};\n const isLocalized = isLocalizedField(fieldName, fieldDef);\n\n // ========== SIMPLIFIED CELL RESOLUTION ==========\n // Priority chain - just 3 lines!\n let CellComponent: React.ComponentType<{\n value: unknown;\n row?: unknown;\n fieldDef?: FieldDefinition;\n }>;\n\n if (normalized.cell) {\n // 1. Custom cell from .list() config\n CellComponent = normalized.cell as React.ComponentType<{\n value: unknown;\n row?: unknown;\n fieldDef?: FieldDefinition;\n }>;\n } else if (fieldDef?.cell?.component) {\n // 2. Cell from field registry (most common)\n CellComponent = fieldDef.cell.component as React.ComponentType<{\n value: unknown;\n row?: unknown;\n fieldDef?: FieldDefinition;\n }>;\n } else {\n // 3. Ultra-simple DefaultCell fallback\n CellComponent = DefaultCell;\n }\n\n // Check if this field type needs fieldDef passed to the cell\n const needsFieldDef = FIELD_TYPES_NEEDING_FIELD_DEF.has(fieldType);\n\n // For relation fields, use relationName as accessor if specified\n // This allows fetching expanded relation data (e.g., row.customer) instead of FK (row.customerId)\n // If relationName is not specified, we use the field name (which shows the raw FK value)\n const accessorKey: string =\n fieldType === \"relation\" && fieldOptions.relationName\n ? fieldOptions.relationName\n : fieldName;\n\n // Build column def\n // Use fieldName as id (for lookup in visibleColumns) and accessorKey for data access\n const headerLabel = normalized.header ?? fieldOptions.label;\n const headerFallback = formatHeader(fieldName);\n // Check if field is computed\n const computeFn = fieldOptions.compute as\n | ((values: Record<string, any>) => any)\n | undefined;\n const isComputed = typeof computeFn === \"function\";\n\n const columnDef: ColumnDef<TData> = {\n id: fieldName, // Always use field name as id for consistent lookup\n accessorKey: isComputed ? undefined : accessorKey, // Computed fields don't have accessor\n header: () => (\n <ColumnHeader label={headerLabel} fallback={headerFallback} />\n ),\n cell: ({ row, getValue }) => {\n // For computed fields, compute value from row data\n const value = isComputed\n ? computeFn(row.original as Record<string, any>)\n : getValue();\n // Pass fieldDef for object/array/relation types to enable advanced rendering\n return needsFieldDef ? (\n <CellComponent value={value} row={row} fieldDef={fieldDef} />\n ) : (\n <CellComponent value={value} row={row} />\n );\n },\n // Computed fields are not sortable (no DB column)\n enableSorting: isComputed ? false : normalized.sortable !== false,\n };\n\n // Add size config if specified\n if (normalized.width) {\n (columnDef as any).size =\n typeof normalized.width === \"number\"\n ? normalized.width\n : Number.parseInt(normalized.width, 10) || undefined;\n }\n if (normalized.minWidth) {\n (columnDef as any).minSize =\n typeof normalized.minWidth === \"number\"\n ? normalized.minWidth\n : Number.parseInt(normalized.minWidth, 10) || undefined;\n }\n if (normalized.maxWidth) {\n (columnDef as any).maxSize =\n typeof normalized.maxWidth === \"number\"\n ? normalized.maxWidth\n : Number.parseInt(normalized.maxWidth, 10) || undefined;\n }\n\n // Add meta for alignment/className\n if (normalized.align || normalized.className) {\n (columnDef as any).meta = {\n align: normalized.align,\n className: normalized.className,\n };\n }\n\n return columnDef;\n });\n}\n"],"mappings":"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"}
|