@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.
Files changed (1091) hide show
  1. package/README.md +119 -122
  2. package/dist/augmentation.d.mts +110 -11
  3. package/dist/client/blocks/block-renderer.d.mts +5 -12
  4. package/dist/client/blocks/block-renderer.mjs +89 -55
  5. package/dist/client/blocks/index.d.mts +2 -4
  6. package/dist/client/blocks/types.d.mts +3 -4
  7. package/dist/client/blocks/types.mjs +1 -2
  8. package/dist/client/builder/admin-types.d.mts +11 -44
  9. package/dist/client/builder/admin.d.mts +34 -45
  10. package/dist/client/builder/admin.mjs +35 -44
  11. package/dist/client/builder/field/field.d.mts +27 -205
  12. package/dist/client/builder/field/field.mjs +22 -68
  13. package/dist/client/builder/index.d.mts +23 -28
  14. package/dist/client/builder/page/page.d.mts +15 -27
  15. package/dist/client/builder/page/page.mjs +21 -17
  16. package/dist/client/builder/registry.d.mts +14 -34
  17. package/dist/client/builder/types/action-registry.mjs +148 -14
  18. package/dist/client/builder/types/action-types.d.mts +8 -35
  19. package/dist/client/builder/types/collection-types.mjs +1 -2
  20. package/dist/client/builder/types/common.d.mts +6 -20
  21. package/dist/client/builder/types/field-types.d.mts +4 -5
  22. package/dist/client/builder/types/field-types.mjs +1 -2
  23. package/dist/client/builder/types/ui-config.d.mts +3 -5
  24. package/dist/client/builder/types/widget-types.d.mts +19 -20
  25. package/dist/client/builder/validation.d.mts +33 -3
  26. package/dist/client/builder/validation.mjs +169 -150
  27. package/dist/client/builder/view/view.d.mts +26 -106
  28. package/dist/client/builder/view/view.mjs +14 -96
  29. package/dist/client/builder/widget/widget.d.mts +16 -22
  30. package/dist/client/builder/widget/widget.mjs +11 -16
  31. package/dist/client/components/actions/action-button.mjs +207 -97
  32. package/dist/client/components/actions/action-dialog.mjs +471 -176
  33. package/dist/client/components/actions/confirmation-dialog.mjs +166 -47
  34. package/dist/client/components/actions/header-actions.mjs +164 -71
  35. package/dist/client/components/admin-link.d.mts +8 -9
  36. package/dist/client/components/admin-link.mjs +127 -48
  37. package/dist/client/components/auth/auth-guard.d.mts +6 -7
  38. package/dist/client/components/auth/auth-guard.mjs +9 -9
  39. package/dist/client/components/auth/auth-loading.d.mts +3 -4
  40. package/dist/client/components/auth/auth-loading.mjs +38 -10
  41. package/dist/client/components/blocks/block-canvas.mjs +111 -42
  42. package/dist/client/components/blocks/block-editor-context.mjs +90 -23
  43. package/dist/client/components/blocks/block-editor-layout.mjs +176 -59
  44. package/dist/client/components/blocks/block-editor-provider.mjs +219 -139
  45. package/dist/client/components/blocks/block-fields-renderer.mjs +212 -42
  46. package/dist/client/components/blocks/block-insert-button.mjs +168 -51
  47. package/dist/client/components/blocks/block-item-menu.mjs +312 -110
  48. package/dist/client/components/blocks/block-item.mjs +372 -125
  49. package/dist/client/components/blocks/block-library-sidebar.mjs +209 -114
  50. package/dist/client/components/blocks/block-tree.mjs +73 -15
  51. package/dist/client/components/blocks/block-type-icon.mjs +65 -20
  52. package/dist/client/components/blocks/utils/tree-utils.mjs +1 -2
  53. package/dist/client/components/component-renderer.d.mts +11 -22
  54. package/dist/client/components/component-renderer.mjs +151 -38
  55. package/dist/client/components/error-boundary.mjs +77 -25
  56. package/dist/client/components/fields/array-field.mjs +474 -199
  57. package/dist/client/components/fields/asset-preview-field.mjs +143 -44
  58. package/dist/client/components/fields/blocks-field/blocks-field.mjs +143 -35
  59. package/dist/client/components/fields/boolean-field.mjs +62 -32
  60. package/dist/client/components/fields/date-field.mjs +46 -12
  61. package/dist/client/components/fields/datetime-field.mjs +42 -11
  62. package/dist/client/components/fields/email-field.mjs +57 -28
  63. package/dist/client/components/fields/field-utils.mjs +1 -2
  64. package/dist/client/components/fields/field-wrapper.mjs +107 -32
  65. package/dist/client/components/fields/json-field.mjs +323 -110
  66. package/dist/client/components/fields/locale-badge.mjs +16 -8
  67. package/dist/client/components/fields/number-field.mjs +63 -30
  68. package/dist/client/components/fields/object-array-field.mjs +666 -272
  69. package/dist/client/components/fields/object-field.mjs +656 -98
  70. package/dist/client/components/fields/relation/displays/cards-display.mjs +225 -111
  71. package/dist/client/components/fields/relation/displays/chips-display.mjs +150 -77
  72. package/dist/client/components/fields/relation/displays/grid-display.mjs +186 -91
  73. package/dist/client/components/fields/relation/displays/list-display.mjs +230 -111
  74. package/dist/client/components/fields/relation/displays/table-display.mjs +241 -66
  75. package/dist/client/components/fields/relation/displays/types.mjs +2 -3
  76. package/dist/client/components/fields/relation/relation-items-display.mjs +131 -35
  77. package/dist/client/components/fields/relation-field.mjs +70 -15
  78. package/dist/client/components/fields/relation-picker.mjs +93 -98
  79. package/dist/client/components/fields/relation-select.mjs +42 -29
  80. package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +90 -41
  81. package/dist/client/components/fields/rich-text-editor/extensions.mjs +33 -7
  82. package/dist/client/components/fields/rich-text-editor/image-popover.mjs +48 -23
  83. package/dist/client/components/fields/rich-text-editor/index.mjs +491 -158
  84. package/dist/client/components/fields/rich-text-editor/link-popover.mjs +13 -14
  85. package/dist/client/components/fields/rich-text-editor/presets.mjs +1 -2
  86. package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +96 -53
  87. package/dist/client/components/fields/rich-text-editor/table-controls.mjs +416 -107
  88. package/dist/client/components/fields/rich-text-editor/toolbar.mjs +476 -215
  89. package/dist/client/components/fields/rich-text-editor/types.mjs +1 -2
  90. package/dist/client/components/fields/rich-text-editor/utils.mjs +1 -2
  91. package/dist/client/components/fields/rich-text-field.mjs +55 -17
  92. package/dist/client/components/fields/select-field.mjs +79 -44
  93. package/dist/client/components/fields/text-field.mjs +62 -29
  94. package/dist/client/components/fields/textarea-field.mjs +61 -29
  95. package/dist/client/components/fields/time-field.mjs +39 -11
  96. package/dist/client/components/fields/upload-field.mjs +253 -129
  97. package/dist/client/components/filter-builder/columns-tab.mjs +287 -93
  98. package/dist/client/components/filter-builder/filter-builder-sheet.mjs +437 -138
  99. package/dist/client/components/filter-builder/filters-tab.mjs +409 -126
  100. package/dist/client/components/filter-builder/saved-views-tab.mjs +259 -106
  101. package/dist/client/components/history-sidebar.mjs +496 -0
  102. package/dist/client/components/layout/field-layout-renderer.mjs +301 -0
  103. package/dist/client/components/locale-switcher.mjs +231 -108
  104. package/dist/client/components/media/media-grid.mjs +259 -84
  105. package/dist/client/components/media/media-picker-dialog.mjs +500 -192
  106. package/dist/client/components/preview/live-preview-mode.mjs +416 -124
  107. package/dist/client/components/preview/preview-pane.mjs +353 -144
  108. package/dist/client/components/primitives/asset-preview.mjs +665 -257
  109. package/dist/client/components/primitives/checkbox-input.mjs +37 -11
  110. package/dist/client/components/primitives/date-input.mjs +392 -149
  111. package/dist/client/components/primitives/dropzone.mjs +314 -185
  112. package/dist/client/components/primitives/number-input.mjs +14 -10
  113. package/dist/client/components/primitives/select-multi.mjs +519 -185
  114. package/dist/client/components/primitives/select-single.mjs +416 -126
  115. package/dist/client/components/primitives/text-input.mjs +10 -5
  116. package/dist/client/components/primitives/textarea-input.mjs +10 -5
  117. package/dist/client/components/primitives/time-input.mjs +118 -45
  118. package/dist/client/components/primitives/toggle-input.mjs +31 -11
  119. package/dist/client/components/primitives/types.mjs +1 -2
  120. package/dist/client/components/sheets/resource-sheet.mjs +72 -64
  121. package/dist/client/components/ui/accordion.mjs +156 -37
  122. package/dist/client/components/ui/alert.mjs +70 -17
  123. package/dist/client/components/ui/badge.mjs +57 -16
  124. package/dist/client/components/ui/button.mjs +49 -14
  125. package/dist/client/components/ui/card.mjs +194 -39
  126. package/dist/client/components/ui/checkbox.mjs +71 -16
  127. package/dist/client/components/ui/command.mjs +220 -50
  128. package/dist/client/components/ui/dialog.mjs +265 -52
  129. package/dist/client/components/ui/drawer.mjs +260 -57
  130. package/dist/client/components/ui/dropdown-menu.mjs +293 -67
  131. package/dist/client/components/ui/empty-state.mjs +72 -26
  132. package/dist/client/components/ui/field.mjs +332 -56
  133. package/dist/client/components/ui/input-group.mjs +174 -41
  134. package/dist/client/components/ui/input.mjs +38 -9
  135. package/dist/client/components/ui/kbd.mjs +37 -8
  136. package/dist/client/components/ui/label.mjs +38 -8
  137. package/dist/client/components/ui/popover.mjs +162 -35
  138. package/dist/client/components/ui/responsive-dialog.mjs +277 -71
  139. package/dist/client/components/ui/search-input.mjs +101 -36
  140. package/dist/client/components/ui/select.mjs +297 -57
  141. package/dist/client/components/ui/separator.mjs +39 -9
  142. package/dist/client/components/ui/sheet.mjs +253 -51
  143. package/dist/client/components/ui/sidebar.mjs +700 -182
  144. package/dist/client/components/ui/skeleton.mjs +33 -8
  145. package/dist/client/components/ui/sonner.d.mts +2 -3
  146. package/dist/client/components/ui/sonner.mjs +45 -15
  147. package/dist/client/components/ui/spinner.mjs +44 -10
  148. package/dist/client/components/ui/switch.mjs +47 -12
  149. package/dist/client/components/ui/table.mjs +260 -50
  150. package/dist/client/components/ui/tabs.mjs +140 -29
  151. package/dist/client/components/ui/textarea.mjs +33 -8
  152. package/dist/client/components/ui/toolbar.mjs +105 -23
  153. package/dist/client/components/ui/tooltip.mjs +130 -29
  154. package/dist/client/components/widgets/chart-widget.mjs +456 -156
  155. package/dist/client/components/widgets/progress-widget.mjs +150 -60
  156. package/dist/client/components/widgets/quick-actions-widget.mjs +175 -87
  157. package/dist/client/components/widgets/recent-items-widget.mjs +157 -62
  158. package/dist/client/components/widgets/stats-widget.mjs +153 -42
  159. package/dist/client/components/widgets/table-widget.mjs +198 -64
  160. package/dist/client/components/widgets/timeline-widget.mjs +193 -82
  161. package/dist/client/components/widgets/value-widget.mjs +257 -56
  162. package/dist/client/components/widgets/widget-skeletons.mjs +390 -108
  163. package/dist/client/contexts/breadcrumb-context.mjs +44 -16
  164. package/dist/client/{context → contexts}/focus-context.d.mts +6 -7
  165. package/dist/client/{context → contexts}/focus-context.mjs +134 -62
  166. package/dist/client/hooks/typed-hooks.d.mts +38 -12
  167. package/dist/client/hooks/typed-hooks.mjs +758 -142
  168. package/dist/client/hooks/use-action.mjs +197 -69
  169. package/dist/client/hooks/use-admin-config.mjs +39 -10
  170. package/dist/client/hooks/use-admin-preferences.mjs +118 -15
  171. package/dist/client/hooks/use-admin-routes.mjs +60 -27
  172. package/dist/client/hooks/use-audit-history.mjs +157 -0
  173. package/dist/client/hooks/use-auth.d.mts +14 -15
  174. package/dist/client/hooks/use-auth.mjs +8 -9
  175. package/dist/client/hooks/use-collection-fields.mjs +58 -19
  176. package/dist/client/hooks/use-collection-meta.mjs +45 -13
  177. package/dist/client/hooks/use-collection-schema.mjs +34 -11
  178. package/dist/client/hooks/use-collection-validation.mjs +39 -25
  179. package/dist/client/hooks/use-collection.d.mts +18 -8
  180. package/dist/client/hooks/use-collection.mjs +560 -101
  181. package/dist/client/hooks/use-current-user.d.mts +6 -3
  182. package/dist/client/hooks/use-current-user.mjs +2 -2
  183. package/dist/client/hooks/use-field-hooks.mjs +73 -65
  184. package/dist/client/hooks/use-field-options.d.mts +1 -34
  185. package/dist/client/hooks/use-field-options.mjs +233 -148
  186. package/dist/client/hooks/use-global-fields.mjs +47 -16
  187. package/dist/client/hooks/use-global-meta.mjs +57 -11
  188. package/dist/client/hooks/use-global-schema.mjs +31 -11
  189. package/dist/client/hooks/use-global.d.mts +13 -2
  190. package/dist/client/hooks/use-global.mjs +244 -34
  191. package/dist/client/hooks/use-locks.mjs +331 -124
  192. package/dist/client/hooks/use-media-query.d.mts +1 -2
  193. package/dist/client/hooks/use-media-query.mjs +38 -19
  194. package/dist/client/hooks/use-prefill-params.mjs +2 -2
  195. package/dist/client/hooks/use-questpie-query-options.mjs +33 -11
  196. package/dist/client/hooks/use-reactive-fields.d.mts +6 -3
  197. package/dist/client/hooks/use-reactive-fields.mjs +130 -93
  198. package/dist/client/hooks/use-realtime-highlight.mjs +115 -53
  199. package/dist/client/hooks/use-saved-views.mjs +109 -34
  200. package/dist/client/hooks/use-search-param-toggle.d.mts +12 -0
  201. package/dist/client/hooks/use-search-param-toggle.mjs +115 -0
  202. package/dist/client/hooks/use-search.mjs +147 -36
  203. package/dist/client/hooks/use-server-actions.mjs +191 -0
  204. package/dist/client/hooks/use-server-validation.mjs +164 -72
  205. package/dist/client/hooks/use-server-widget-data.d.mts +2 -3
  206. package/dist/client/hooks/use-server-widget-data.mjs +36 -11
  207. package/dist/client/hooks/use-setup-status.d.mts +3 -4
  208. package/dist/client/hooks/use-setup-status.mjs +28 -16
  209. package/dist/client/hooks/use-sidebar-search-param.d.mts +9 -0
  210. package/dist/client/hooks/use-sidebar-search-param.mjs +104 -0
  211. package/dist/client/hooks/use-transition-stage.mjs +125 -0
  212. package/dist/client/hooks/use-upload-collection.mjs +1 -2
  213. package/dist/client/hooks/use-upload.mjs +189 -125
  214. package/dist/client/hooks/use-validation-error-map.mjs +10 -6
  215. package/dist/client/hooks/use-view-state.mjs +380 -162
  216. package/dist/client/i18n/hooks.mjs +191 -67
  217. package/dist/client/i18n/intl-cache.mjs +1 -2
  218. package/dist/client/i18n/messages.mjs +1 -2
  219. package/dist/client/i18n/simple.d.mts +1 -2
  220. package/dist/client/i18n/simple.mjs +1 -2
  221. package/dist/client/i18n/types.d.mts +1 -2
  222. package/dist/client/lib/cookies.mjs +9 -0
  223. package/dist/client/lib/events.mjs +5 -0
  224. package/dist/client/lib/render-profiler.mjs +51 -0
  225. package/dist/client/lib/utils.mjs +1 -6
  226. package/dist/client/preview/block-scope-context.d.mts +5 -6
  227. package/dist/client/preview/block-scope-context.mjs +50 -27
  228. package/dist/client/preview/index.d.mts +2 -2
  229. package/dist/client/preview/preview-banner.d.mts +3 -4
  230. package/dist/client/preview/preview-banner.mjs +74 -35
  231. package/dist/client/preview/preview-field.d.mts +9 -10
  232. package/dist/client/preview/preview-field.mjs +163 -61
  233. package/dist/client/preview/types.d.mts +1 -2
  234. package/dist/client/preview/types.mjs +1 -2
  235. package/dist/client/preview/use-collection-preview.d.mts +1 -2
  236. package/dist/client/preview/use-collection-preview.mjs +105 -56
  237. package/dist/client/runtime/content-locales-provider.mjs +87 -36
  238. package/dist/client/runtime/index.d.mts +1 -3
  239. package/dist/client/runtime/index.mjs +1 -3
  240. package/dist/client/runtime/locale-scope.mjs +69 -29
  241. package/dist/client/runtime/provider.d.mts +18 -9922
  242. package/dist/client/runtime/provider.mjs +250 -86
  243. package/dist/client/runtime/routes.d.mts +7 -7
  244. package/dist/client/runtime/routes.mjs +4 -20
  245. package/dist/client/runtime/translations-provider.mjs +114 -53
  246. package/dist/client/scope/picker.d.mts +3 -4
  247. package/dist/client/scope/picker.mjs +324 -90
  248. package/dist/client/scope/provider.d.mts +4 -5
  249. package/dist/client/scope/provider.mjs +30 -22
  250. package/dist/client/scope/types.d.mts +1 -2
  251. package/dist/client/styles/index.css +301 -225
  252. package/dist/client/utils/auto-expand-fields.mjs +23 -5
  253. package/dist/client/utils/build-field-definitions-from-schema.mjs +10 -7
  254. package/dist/client/utils/dependency-tracker.mjs +61 -0
  255. package/dist/client/utils/detect-relations.mjs +1 -2
  256. package/dist/client/utils/locale-to-flag.d.mts +8 -7
  257. package/dist/client/utils/locale-to-flag.mjs +1 -2
  258. package/dist/client/utils/routes.mjs +1 -2
  259. package/dist/client/views/auth/accept-invite-form.d.mts +3 -4
  260. package/dist/client/views/auth/accept-invite-form.mjs +414 -121
  261. package/dist/client/views/auth/auth-layout.d.mts +7 -8
  262. package/dist/client/views/auth/auth-layout.mjs +93 -30
  263. package/dist/client/views/auth/forgot-password-form.d.mts +4 -5
  264. package/dist/client/views/auth/forgot-password-form.mjs +332 -100
  265. package/dist/client/views/auth/invite-form.mjs +447 -105
  266. package/dist/client/views/auth/login-form.d.mts +4 -5
  267. package/dist/client/views/auth/login-form.mjs +340 -120
  268. package/dist/client/views/auth/reset-password-form.d.mts +4 -5
  269. package/dist/client/views/auth/reset-password-form.mjs +458 -131
  270. package/dist/client/views/auth/setup-form.d.mts +4 -5
  271. package/dist/client/views/auth/setup-form.mjs +481 -141
  272. package/dist/client/views/collection/auto-form-fields.mjs +686 -266
  273. package/dist/client/views/collection/bulk-action-toolbar.mjs +392 -203
  274. package/dist/client/views/collection/cells/complex-cells.mjs +635 -216
  275. package/dist/client/views/collection/cells/primitive-cells.mjs +332 -102
  276. package/dist/client/views/collection/cells/relation-cells.mjs +227 -72
  277. package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +456 -136
  278. package/dist/client/views/collection/cells/shared/cell-helpers.mjs +49 -2
  279. package/dist/client/views/collection/cells/shared/relation-chip.mjs +109 -25
  280. package/dist/client/views/collection/cells/upload-cells.mjs +16 -8
  281. package/dist/client/views/collection/columns/build-columns.mjs +51 -12
  282. package/dist/client/views/collection/columns/column-defaults.mjs +17 -2
  283. package/dist/client/views/collection/field-context.mjs +10 -11
  284. package/dist/client/views/collection/field-renderer.mjs +237 -40
  285. package/dist/client/views/collection/form-view.mjs +1108 -445
  286. package/dist/client/views/collection/table-view.mjs +300 -163
  287. package/dist/client/views/collection/view-skeletons.mjs +181 -87
  288. package/dist/client/views/common/global-search.mjs +557 -233
  289. package/dist/client/views/dashboard/dashboard-grid.mjs +707 -211
  290. package/dist/client/views/dashboard/dashboard-widget.mjs +145 -58
  291. package/dist/client/views/dashboard/widget-card.mjs +315 -102
  292. package/dist/client/views/globals/global-form-view.mjs +1256 -131
  293. package/dist/client/views/layout/admin-layout-provider.d.mts +18 -21
  294. package/dist/client/views/layout/admin-layout-provider.mjs +135 -32
  295. package/dist/client/views/layout/admin-layout.d.mts +14 -32
  296. package/dist/client/views/layout/admin-layout.mjs +254 -96
  297. package/dist/client/views/layout/admin-router.d.mts +10 -42
  298. package/dist/client/views/layout/admin-router.mjs +1086 -426
  299. package/dist/client/views/layout/admin-sidebar.d.mts +10 -16
  300. package/dist/client/views/layout/admin-sidebar.mjs +1211 -382
  301. package/dist/client/views/layout/admin-topbar.mjs +220 -112
  302. package/dist/client/views/pages/accept-invite-page.d.mts +5 -6
  303. package/dist/client/views/pages/accept-invite-page.mjs +302 -96
  304. package/dist/client/views/pages/dashboard-page.d.mts +7 -16
  305. package/dist/client/views/pages/dashboard-page.mjs +62 -23
  306. package/dist/client/views/pages/forgot-password-page.d.mts +7 -10
  307. package/dist/client/views/pages/forgot-password-page.mjs +112 -40
  308. package/dist/client/views/pages/invite-page.d.mts +6 -7
  309. package/dist/client/views/pages/invite-page.mjs +121 -46
  310. package/dist/client/views/pages/login-page.d.mts +8 -15
  311. package/dist/client/views/pages/login-page.mjs +152 -57
  312. package/dist/client/views/pages/reset-password-page.d.mts +7 -10
  313. package/dist/client/views/pages/reset-password-page.mjs +209 -57
  314. package/dist/client/views/pages/setup-page.d.mts +7 -10
  315. package/dist/client/views/pages/setup-page.mjs +108 -43
  316. package/dist/client-module.d.mts +3 -0
  317. package/dist/client-module.mjs +3 -0
  318. package/dist/client.d.mts +55 -48
  319. package/dist/client.mjs +26 -28
  320. package/dist/components/rich-text/rich-text-renderer.d.mts +3 -4
  321. package/dist/components/rich-text/rich-text-renderer.mjs +97 -70
  322. package/dist/index.d.mts +36 -39
  323. package/dist/index.mjs +26 -28
  324. package/dist/plugin.d.mts +2 -0
  325. package/dist/plugin.mjs +3 -0
  326. package/dist/server/adapters/nextjs.d.mts +13 -14
  327. package/dist/server/adapters/nextjs.mjs +12 -13
  328. package/dist/server/adapters/tanstack.d.mts +10 -11
  329. package/dist/server/adapters/tanstack.mjs +11 -12
  330. package/dist/server/augmentation/actions.d.mts +279 -0
  331. package/dist/server/augmentation/common.d.mts +76 -0
  332. package/dist/server/augmentation/dashboard.d.mts +547 -0
  333. package/dist/server/augmentation/form-layout.d.mts +303 -0
  334. package/dist/server/augmentation/index.d.mts +44 -0
  335. package/dist/server/augmentation/index.mjs +10 -0
  336. package/dist/server/augmentation/sidebar.d.mts +181 -0
  337. package/dist/server/augmentation/views.d.mts +237 -0
  338. package/dist/server/augmentation.d.mts +7 -1523
  339. package/dist/server/block/index.d.mts +4 -3
  340. package/dist/server/codegen/admin-client-template.mjs +93 -0
  341. package/dist/server/codegen/projection-validator.mjs +67 -0
  342. package/dist/server/fields/blocks.d.mts +10 -78
  343. package/dist/server/fields/blocks.mjs +74 -115
  344. package/dist/server/fields/index.d.mts +6 -39
  345. package/dist/server/fields/index.mjs +6 -7
  346. package/dist/server/fields/rich-text.d.mts +10 -77
  347. package/dist/server/fields/rich-text.mjs +59 -100
  348. package/dist/server/i18n/index.mjs +8 -9
  349. package/dist/server/i18n/messages/cs.mjs +3 -3
  350. package/dist/server/i18n/messages/de.mjs +3 -3
  351. package/dist/server/i18n/messages/en.mjs +217 -3
  352. package/dist/server/i18n/messages/es.mjs +3 -3
  353. package/dist/server/i18n/messages/fr.mjs +3 -3
  354. package/dist/server/i18n/messages/index.mjs +1 -2
  355. package/dist/server/i18n/messages/pl.mjs +3 -3
  356. package/dist/server/i18n/messages/pt.mjs +3 -3
  357. package/dist/server/i18n/messages/sk.mjs +202 -3
  358. package/dist/server/modules/admin/.generated/module.d.mts +52 -0
  359. package/dist/server/modules/admin/.generated/module.mjs +78 -0
  360. package/dist/server/modules/admin/.generated/registries.d.mts +22 -0
  361. package/dist/server/{auth-helpers.d.mts → modules/admin/auth-helpers.d.mts} +13 -14
  362. package/dist/server/{auth-helpers.mjs → modules/admin/auth-helpers.mjs} +15 -16
  363. package/dist/server/{block → modules/admin/block}/block-builder.d.mts +96 -32
  364. package/dist/server/{block → modules/admin/block}/block-builder.mjs +113 -15
  365. package/dist/server/modules/admin/block/index.d.mts +3 -0
  366. package/dist/server/{block → modules/admin/block}/introspection.d.mts +10 -5
  367. package/dist/server/{block → modules/admin/block}/introspection.mjs +18 -7
  368. package/dist/server/{block → modules/admin/block}/prefetch.d.mts +17 -17
  369. package/dist/server/{block → modules/admin/block}/prefetch.mjs +17 -16
  370. package/dist/server/modules/admin/client/.generated/module.d.mts +94 -0
  371. package/dist/server/modules/admin/client/.generated/module.mjs +91 -0
  372. package/dist/server/modules/admin/client/components/badge.d.mts +1 -0
  373. package/dist/server/modules/admin/client/components/icon.d.mts +1 -0
  374. package/dist/server/modules/admin/client/fields/array.d.mts +6 -0
  375. package/dist/server/modules/admin/client/fields/array.mjs +12 -0
  376. package/dist/server/modules/admin/client/fields/assetPreview.d.mts +6 -0
  377. package/dist/server/modules/admin/client/fields/assetPreview.mjs +18 -0
  378. package/dist/server/modules/admin/client/fields/blocks.d.mts +6 -0
  379. package/dist/server/modules/admin/client/fields/blocks.mjs +12 -0
  380. package/dist/server/modules/admin/client/fields/boolean.d.mts +6 -0
  381. package/dist/server/modules/admin/client/fields/boolean.mjs +12 -0
  382. package/dist/server/modules/admin/client/fields/date.d.mts +6 -0
  383. package/dist/server/modules/admin/client/fields/date.mjs +12 -0
  384. package/dist/server/modules/admin/client/fields/datetime.d.mts +6 -0
  385. package/dist/server/modules/admin/client/fields/datetime.mjs +12 -0
  386. package/dist/server/modules/admin/client/fields/email.d.mts +6 -0
  387. package/dist/server/modules/admin/client/fields/email.mjs +12 -0
  388. package/dist/server/modules/admin/client/fields/json.d.mts +6 -0
  389. package/dist/server/modules/admin/client/fields/json.mjs +11 -0
  390. package/dist/server/modules/admin/client/fields/number.d.mts +6 -0
  391. package/dist/server/modules/admin/client/fields/number.mjs +12 -0
  392. package/dist/server/modules/admin/client/fields/object.d.mts +6 -0
  393. package/dist/server/modules/admin/client/fields/object.mjs +12 -0
  394. package/dist/server/modules/admin/client/fields/relation.d.mts +6 -0
  395. package/dist/server/modules/admin/client/fields/relation.mjs +12 -0
  396. package/dist/server/modules/admin/client/fields/richText.d.mts +6 -0
  397. package/dist/server/modules/admin/client/fields/richText.mjs +11 -0
  398. package/dist/server/modules/admin/client/fields/select.d.mts +6 -0
  399. package/dist/server/modules/admin/client/fields/select.mjs +12 -0
  400. package/dist/server/modules/admin/client/fields/text.d.mts +6 -0
  401. package/dist/server/modules/admin/client/fields/text.mjs +12 -0
  402. package/dist/server/modules/admin/client/fields/textarea.d.mts +6 -0
  403. package/dist/server/modules/admin/client/fields/textarea.mjs +12 -0
  404. package/dist/server/modules/admin/client/fields/time.d.mts +6 -0
  405. package/dist/server/modules/admin/client/fields/time.mjs +12 -0
  406. package/dist/server/modules/admin/client/fields/upload.d.mts +6 -0
  407. package/dist/server/modules/admin/client/fields/upload.mjs +12 -0
  408. package/dist/server/modules/admin/client/fields/url.d.mts +6 -0
  409. package/dist/server/modules/admin/client/fields/url.mjs +12 -0
  410. package/dist/server/modules/admin/client/index.d.mts +1 -0
  411. package/dist/server/modules/admin/client/pages/dashboard.d.mts +6 -0
  412. package/dist/server/modules/admin/client/pages/dashboard.mjs +11 -0
  413. package/dist/server/modules/admin/client/pages/forgotPassword.d.mts +6 -0
  414. package/dist/server/modules/admin/client/pages/forgotPassword.mjs +11 -0
  415. package/dist/server/modules/admin/client/pages/login.d.mts +6 -0
  416. package/dist/server/modules/admin/client/pages/login.mjs +11 -0
  417. package/dist/server/modules/admin/client/pages/resetPassword.d.mts +6 -0
  418. package/dist/server/modules/admin/client/pages/resetPassword.mjs +11 -0
  419. package/dist/server/modules/admin/client/pages/setup.d.mts +6 -0
  420. package/dist/server/modules/admin/client/pages/setup.mjs +11 -0
  421. package/dist/server/modules/admin/client/views/collection-form.mjs +10 -0
  422. package/dist/server/modules/admin/client/views/collection-table.mjs +10 -0
  423. package/dist/server/modules/admin/client/views/global-form.mjs +10 -0
  424. package/dist/server/modules/admin/client/widgets/chart.d.mts +6 -0
  425. package/dist/server/modules/admin/client/widgets/chart.mjs +7 -0
  426. package/dist/server/modules/admin/client/widgets/progress.d.mts +6 -0
  427. package/dist/server/modules/admin/client/widgets/progress.mjs +7 -0
  428. package/dist/server/modules/admin/client/widgets/quickActions.d.mts +6 -0
  429. package/dist/server/modules/admin/client/widgets/quickActions.mjs +7 -0
  430. package/dist/server/modules/admin/client/widgets/recentItems.d.mts +6 -0
  431. package/dist/server/modules/admin/client/widgets/recentItems.mjs +7 -0
  432. package/dist/server/modules/admin/client/widgets/stats.d.mts +6 -0
  433. package/dist/server/modules/admin/client/widgets/stats.mjs +7 -0
  434. package/dist/server/modules/admin/client/widgets/table.d.mts +6 -0
  435. package/dist/server/modules/admin/client/widgets/table.mjs +7 -0
  436. package/dist/server/modules/admin/client/widgets/timeline.d.mts +6 -0
  437. package/dist/server/modules/admin/client/widgets/timeline.mjs +7 -0
  438. package/dist/server/modules/admin/client/widgets/value.d.mts +6 -0
  439. package/dist/server/modules/admin/client/widgets/value.mjs +7 -0
  440. package/dist/server/modules/admin/collections/account.d.mts +77 -0
  441. package/dist/server/modules/admin/collections/account.mjs +23 -0
  442. package/dist/server/modules/admin/collections/admin-locks.d.mts +90 -0
  443. package/dist/server/modules/admin/collections/admin-locks.mjs +16 -0
  444. package/dist/server/modules/admin/collections/admin-preferences.d.mts +69 -0
  445. package/dist/server/modules/admin/collections/admin-preferences.mjs +16 -0
  446. package/dist/server/modules/admin/collections/admin-saved-views.d.mts +83 -0
  447. package/dist/server/modules/admin/collections/admin-saved-views.mjs +16 -0
  448. package/dist/server/modules/admin/collections/apikey.d.mts +99 -0
  449. package/dist/server/modules/admin/collections/apikey.mjs +15 -0
  450. package/dist/server/modules/admin/collections/assets.d.mts +72 -0
  451. package/dist/server/modules/admin/collections/assets.mjs +71 -0
  452. package/dist/server/modules/admin/collections/session.d.mts +69 -0
  453. package/dist/server/modules/admin/collections/session.mjs +15 -0
  454. package/dist/server/modules/admin/collections/user.d.mts +85 -0
  455. package/dist/server/modules/admin/collections/user.mjs +204 -0
  456. package/dist/server/modules/admin/collections/verification.d.mts +63 -0
  457. package/dist/server/modules/admin/collections/verification.mjs +15 -0
  458. package/dist/server/modules/admin/components/badge.d.mts +10 -0
  459. package/dist/server/modules/admin/components/badge.mjs +10 -0
  460. package/dist/server/modules/admin/components/icon.d.mts +9 -0
  461. package/dist/server/modules/admin/components/icon.mjs +11 -0
  462. package/dist/server/modules/admin/config/admin.mjs +34 -0
  463. package/dist/server/modules/admin/dto/admin-config.dto.mjs +102 -0
  464. package/dist/server/modules/admin/factories.mjs +172 -0
  465. package/dist/server/modules/admin/index.d.mts +1060 -16846
  466. package/dist/server/modules/admin/index.mjs +17 -240
  467. package/dist/server/modules/admin/modules.mjs +11 -0
  468. package/dist/server/modules/admin/plugin.mjs +13 -0
  469. package/dist/server/modules/admin/routes/admin-config.d.mts +28 -0
  470. package/dist/server/modules/admin/routes/admin-config.mjs +552 -0
  471. package/dist/server/modules/admin/{functions → routes}/execute-action.d.mts +17 -32
  472. package/dist/server/modules/admin/{functions → routes}/execute-action.mjs +146 -44
  473. package/dist/server/modules/admin/routes/locales.d.mts +18 -0
  474. package/dist/server/modules/admin/routes/locales.mjs +69 -0
  475. package/dist/server/modules/admin/{functions → routes}/preview.d.mts +25 -15
  476. package/dist/server/modules/admin/{functions → routes}/preview.mjs +84 -97
  477. package/dist/server/modules/admin/{functions → routes}/reactive.d.mts +19 -44
  478. package/dist/server/modules/admin/{functions → routes}/reactive.mjs +89 -117
  479. package/dist/server/modules/admin/routes/route-helpers.d.mts +23 -0
  480. package/dist/server/modules/admin/routes/route-helpers.mjs +76 -0
  481. package/dist/server/modules/admin/{functions → routes}/setup.d.mts +11 -32
  482. package/dist/server/modules/admin/routes/setup.mjs +114 -0
  483. package/dist/server/modules/admin/routes/translations.d.mts +26 -0
  484. package/dist/server/modules/admin/routes/translations.mjs +114 -0
  485. package/dist/server/modules/admin/routes/widget-data.d.mts +32 -0
  486. package/dist/server/modules/admin/routes/widget-data.mjs +62 -0
  487. package/dist/server/modules/admin/views/form.d.mts +8 -0
  488. package/dist/server/modules/admin/views/form.mjs +7 -0
  489. package/dist/server/modules/admin/views/global-form.d.mts +8 -0
  490. package/dist/server/modules/admin/views/global-form.mjs +7 -0
  491. package/dist/server/modules/admin/views/table.d.mts +8 -0
  492. package/dist/server/modules/admin/views/table.mjs +7 -0
  493. package/dist/server/modules/admin-preferences/collections/{admin-preferences.collection.mjs → admin-preferences.mjs} +13 -24
  494. package/dist/server/modules/admin-preferences/collections/locks.collection.mjs +18 -42
  495. package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +99 -0
  496. package/dist/server/modules/admin-preferences/collections/saved-views.mjs +38 -0
  497. package/dist/server/modules/audit/.generated/module.d.mts +60 -0
  498. package/dist/server/modules/audit/.generated/module.mjs +30 -0
  499. package/dist/server/modules/audit/collections/audit-log.d.mts +214 -0
  500. package/dist/server/modules/audit/collections/audit-log.mjs +107 -0
  501. package/dist/server/modules/audit/config/admin.mjs +21 -0
  502. package/dist/server/modules/audit/config/app.mjs +262 -0
  503. package/dist/server/modules/audit/index.d.mts +2 -0
  504. package/dist/server/modules/audit/jobs/audit-cleanup.d.mts +13 -0
  505. package/dist/server/modules/audit/jobs/audit-cleanup.mjs +28 -0
  506. package/dist/server/plugin.d.mts +26 -0
  507. package/dist/server/plugin.mjs +385 -0
  508. package/dist/server/proxy-factories.d.mts +85 -0
  509. package/dist/server/proxy-factories.mjs +302 -0
  510. package/dist/server/registry-helpers.d.mts +83 -0
  511. package/dist/server/registry-helpers.mjs +104 -0
  512. package/dist/server.d.mts +30 -18
  513. package/dist/server.mjs +19 -16
  514. package/dist/shared/preview-utils.d.mts +2 -3
  515. package/dist/shared/preview-utils.mjs +2 -3
  516. package/dist/shared/types/saved-views.types.d.mts +2 -2
  517. package/package.json +50 -40
  518. package/skills/questpie-admin/SKILL.md +397 -0
  519. package/skills/questpie-admin/blocks/SKILL.md +305 -0
  520. package/skills/questpie-admin/custom-ui/SKILL.md +307 -0
  521. package/skills/questpie-admin/views/SKILL.md +442 -0
  522. package/dist/_virtual/rolldown_runtime.mjs +0 -18
  523. package/dist/augmentation.d.mts.map +0 -1
  524. package/dist/client/blocks/block-registry.d.mts +0 -199
  525. package/dist/client/blocks/block-registry.d.mts.map +0 -1
  526. package/dist/client/blocks/block-registry.mjs +0 -88
  527. package/dist/client/blocks/block-registry.mjs.map +0 -1
  528. package/dist/client/blocks/block-renderer.d.mts.map +0 -1
  529. package/dist/client/blocks/block-renderer.mjs.map +0 -1
  530. package/dist/client/blocks/prefetch.d.mts +0 -45
  531. package/dist/client/blocks/prefetch.d.mts.map +0 -1
  532. package/dist/client/blocks/prefetch.mjs +0 -26
  533. package/dist/client/blocks/prefetch.mjs.map +0 -1
  534. package/dist/client/blocks/types.d.mts.map +0 -1
  535. package/dist/client/blocks/types.mjs.map +0 -1
  536. package/dist/client/builder/admin-builder.d.mts +0 -112
  537. package/dist/client/builder/admin-builder.d.mts.map +0 -1
  538. package/dist/client/builder/admin-builder.mjs +0 -185
  539. package/dist/client/builder/admin-builder.mjs.map +0 -1
  540. package/dist/client/builder/admin-types.d.mts.map +0 -1
  541. package/dist/client/builder/admin.d.mts.map +0 -1
  542. package/dist/client/builder/admin.mjs.map +0 -1
  543. package/dist/client/builder/defaults/components.mjs +0 -20
  544. package/dist/client/builder/defaults/components.mjs.map +0 -1
  545. package/dist/client/builder/defaults/core.d.mts +0 -354
  546. package/dist/client/builder/defaults/core.d.mts.map +0 -1
  547. package/dist/client/builder/defaults/core.mjs +0 -49
  548. package/dist/client/builder/defaults/core.mjs.map +0 -1
  549. package/dist/client/builder/defaults/fields.mjs +0 -328
  550. package/dist/client/builder/defaults/fields.mjs.map +0 -1
  551. package/dist/client/builder/defaults/pages.mjs +0 -58
  552. package/dist/client/builder/defaults/pages.mjs.map +0 -1
  553. package/dist/client/builder/defaults/starter.d.mts +0 -351
  554. package/dist/client/builder/defaults/starter.d.mts.map +0 -1
  555. package/dist/client/builder/defaults/starter.mjs +0 -28
  556. package/dist/client/builder/defaults/starter.mjs.map +0 -1
  557. package/dist/client/builder/defaults/views.mjs +0 -27
  558. package/dist/client/builder/defaults/views.mjs.map +0 -1
  559. package/dist/client/builder/defaults/widgets.mjs +0 -31
  560. package/dist/client/builder/defaults/widgets.mjs.map +0 -1
  561. package/dist/client/builder/field/field.d.mts.map +0 -1
  562. package/dist/client/builder/field/field.mjs.map +0 -1
  563. package/dist/client/builder/index.d.mts.map +0 -1
  564. package/dist/client/builder/page/page.d.mts.map +0 -1
  565. package/dist/client/builder/page/page.mjs.map +0 -1
  566. package/dist/client/builder/proxies.d.mts +0 -2
  567. package/dist/client/builder/proxies.mjs +0 -24
  568. package/dist/client/builder/proxies.mjs.map +0 -1
  569. package/dist/client/builder/qa.d.mts +0 -50
  570. package/dist/client/builder/qa.d.mts.map +0 -1
  571. package/dist/client/builder/qa.mjs +0 -42
  572. package/dist/client/builder/qa.mjs.map +0 -1
  573. package/dist/client/builder/registry.d.mts.map +0 -1
  574. package/dist/client/builder/types/action-registry.d.mts +0 -2
  575. package/dist/client/builder/types/action-registry.mjs.map +0 -1
  576. package/dist/client/builder/types/action-types.d.mts.map +0 -1
  577. package/dist/client/builder/types/collection-types.d.mts +0 -199
  578. package/dist/client/builder/types/collection-types.d.mts.map +0 -1
  579. package/dist/client/builder/types/collection-types.mjs.map +0 -1
  580. package/dist/client/builder/types/common.d.mts.map +0 -1
  581. package/dist/client/builder/types/field-types.d.mts.map +0 -1
  582. package/dist/client/builder/types/field-types.mjs.map +0 -1
  583. package/dist/client/builder/types/global-types.d.mts +0 -22
  584. package/dist/client/builder/types/global-types.d.mts.map +0 -1
  585. package/dist/client/builder/types/ui-config.d.mts.map +0 -1
  586. package/dist/client/builder/types/views.d.mts +0 -89
  587. package/dist/client/builder/types/views.d.mts.map +0 -1
  588. package/dist/client/builder/types/widget-types.d.mts.map +0 -1
  589. package/dist/client/builder/validation.mjs.map +0 -1
  590. package/dist/client/builder/view/view.d.mts.map +0 -1
  591. package/dist/client/builder/view/view.mjs.map +0 -1
  592. package/dist/client/builder/widget/widget.d.mts.map +0 -1
  593. package/dist/client/builder/widget/widget.mjs.map +0 -1
  594. package/dist/client/components/actions/action-button.d.mts +0 -2
  595. package/dist/client/components/actions/action-button.mjs.map +0 -1
  596. package/dist/client/components/actions/action-dialog.d.mts +0 -2
  597. package/dist/client/components/actions/action-dialog.mjs.map +0 -1
  598. package/dist/client/components/actions/confirmation-dialog.d.mts +0 -2
  599. package/dist/client/components/actions/confirmation-dialog.mjs.map +0 -1
  600. package/dist/client/components/actions/header-actions.d.mts +0 -2
  601. package/dist/client/components/actions/header-actions.mjs.map +0 -1
  602. package/dist/client/components/actions/index.d.mts +0 -4
  603. package/dist/client/components/admin-link.d.mts.map +0 -1
  604. package/dist/client/components/admin-link.mjs.map +0 -1
  605. package/dist/client/components/auth/auth-guard.d.mts.map +0 -1
  606. package/dist/client/components/auth/auth-guard.mjs.map +0 -1
  607. package/dist/client/components/auth/auth-loading.d.mts.map +0 -1
  608. package/dist/client/components/auth/auth-loading.mjs.map +0 -1
  609. package/dist/client/components/auth/index.d.mts +0 -2
  610. package/dist/client/components/blocks/block-canvas.mjs.map +0 -1
  611. package/dist/client/components/blocks/block-editor-context.mjs.map +0 -1
  612. package/dist/client/components/blocks/block-editor-layout.mjs.map +0 -1
  613. package/dist/client/components/blocks/block-editor-provider.mjs.map +0 -1
  614. package/dist/client/components/blocks/block-fields-renderer.mjs.map +0 -1
  615. package/dist/client/components/blocks/block-insert-button.mjs.map +0 -1
  616. package/dist/client/components/blocks/block-item-menu.mjs.map +0 -1
  617. package/dist/client/components/blocks/block-item.mjs.map +0 -1
  618. package/dist/client/components/blocks/block-library-sidebar.mjs.map +0 -1
  619. package/dist/client/components/blocks/block-tree.mjs.map +0 -1
  620. package/dist/client/components/blocks/block-type-icon.mjs.map +0 -1
  621. package/dist/client/components/blocks/utils/tree-utils.mjs.map +0 -1
  622. package/dist/client/components/component-renderer.d.mts.map +0 -1
  623. package/dist/client/components/component-renderer.mjs.map +0 -1
  624. package/dist/client/components/error-boundary.mjs.map +0 -1
  625. package/dist/client/components/fields/array-field.d.mts +0 -44
  626. package/dist/client/components/fields/array-field.d.mts.map +0 -1
  627. package/dist/client/components/fields/array-field.mjs.map +0 -1
  628. package/dist/client/components/fields/asset-preview-field.d.mts +0 -52
  629. package/dist/client/components/fields/asset-preview-field.d.mts.map +0 -1
  630. package/dist/client/components/fields/asset-preview-field.mjs.map +0 -1
  631. package/dist/client/components/fields/blocks-field/blocks-field.d.mts +0 -41
  632. package/dist/client/components/fields/blocks-field/blocks-field.d.mts.map +0 -1
  633. package/dist/client/components/fields/blocks-field/blocks-field.mjs.map +0 -1
  634. package/dist/client/components/fields/blocks-field/index.d.mts +0 -1
  635. package/dist/client/components/fields/boolean-field.d.mts +0 -30
  636. package/dist/client/components/fields/boolean-field.d.mts.map +0 -1
  637. package/dist/client/components/fields/boolean-field.mjs.map +0 -1
  638. package/dist/client/components/fields/custom-field.d.mts +0 -3
  639. package/dist/client/components/fields/date-field.d.mts +0 -22
  640. package/dist/client/components/fields/date-field.d.mts.map +0 -1
  641. package/dist/client/components/fields/date-field.mjs.map +0 -1
  642. package/dist/client/components/fields/datetime-field.d.mts +0 -23
  643. package/dist/client/components/fields/datetime-field.d.mts.map +0 -1
  644. package/dist/client/components/fields/datetime-field.mjs.map +0 -1
  645. package/dist/client/components/fields/email-field.d.mts +0 -19
  646. package/dist/client/components/fields/email-field.d.mts.map +0 -1
  647. package/dist/client/components/fields/email-field.mjs.map +0 -1
  648. package/dist/client/components/fields/embedded-collection.d.mts +0 -3
  649. package/dist/client/components/fields/field-types.d.mts +0 -571
  650. package/dist/client/components/fields/field-types.d.mts.map +0 -1
  651. package/dist/client/components/fields/field-utils.d.mts +0 -1
  652. package/dist/client/components/fields/field-utils.mjs.map +0 -1
  653. package/dist/client/components/fields/field-wrapper.d.mts +0 -3
  654. package/dist/client/components/fields/field-wrapper.mjs.map +0 -1
  655. package/dist/client/components/fields/index.d.mts +0 -33
  656. package/dist/client/components/fields/json-field.d.mts +0 -84
  657. package/dist/client/components/fields/json-field.d.mts.map +0 -1
  658. package/dist/client/components/fields/json-field.mjs.map +0 -1
  659. package/dist/client/components/fields/locale-badge.d.mts +0 -1
  660. package/dist/client/components/fields/locale-badge.mjs.map +0 -1
  661. package/dist/client/components/fields/number-field.d.mts +0 -23
  662. package/dist/client/components/fields/number-field.d.mts.map +0 -1
  663. package/dist/client/components/fields/number-field.mjs.map +0 -1
  664. package/dist/client/components/fields/object-array-field.d.mts +0 -2
  665. package/dist/client/components/fields/object-array-field.mjs.map +0 -1
  666. package/dist/client/components/fields/object-field.d.mts +0 -32
  667. package/dist/client/components/fields/object-field.d.mts.map +0 -1
  668. package/dist/client/components/fields/object-field.mjs.map +0 -1
  669. package/dist/client/components/fields/relation/displays/cards-display.d.mts +0 -2
  670. package/dist/client/components/fields/relation/displays/cards-display.mjs.map +0 -1
  671. package/dist/client/components/fields/relation/displays/chips-display.d.mts +0 -2
  672. package/dist/client/components/fields/relation/displays/chips-display.mjs.map +0 -1
  673. package/dist/client/components/fields/relation/displays/grid-display.d.mts +0 -2
  674. package/dist/client/components/fields/relation/displays/grid-display.mjs.map +0 -1
  675. package/dist/client/components/fields/relation/displays/index.d.mts +0 -6
  676. package/dist/client/components/fields/relation/displays/list-display.d.mts +0 -2
  677. package/dist/client/components/fields/relation/displays/list-display.mjs.map +0 -1
  678. package/dist/client/components/fields/relation/displays/table-display.d.mts +0 -2
  679. package/dist/client/components/fields/relation/displays/table-display.mjs.map +0 -1
  680. package/dist/client/components/fields/relation/displays/types.d.mts +0 -22
  681. package/dist/client/components/fields/relation/displays/types.d.mts.map +0 -1
  682. package/dist/client/components/fields/relation/displays/types.mjs.map +0 -1
  683. package/dist/client/components/fields/relation/index.d.mts +0 -3
  684. package/dist/client/components/fields/relation/relation-items-display.d.mts +0 -5
  685. package/dist/client/components/fields/relation/relation-items-display.mjs.map +0 -1
  686. package/dist/client/components/fields/relation-field.d.mts +0 -134
  687. package/dist/client/components/fields/relation-field.d.mts.map +0 -1
  688. package/dist/client/components/fields/relation-field.mjs.map +0 -1
  689. package/dist/client/components/fields/relation-picker.d.mts +0 -4
  690. package/dist/client/components/fields/relation-picker.mjs.map +0 -1
  691. package/dist/client/components/fields/relation-select.d.mts +0 -3
  692. package/dist/client/components/fields/relation-select.mjs.map +0 -1
  693. package/dist/client/components/fields/reverse-relation-field.d.mts +0 -2
  694. package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs.map +0 -1
  695. package/dist/client/components/fields/rich-text-editor/extensions.mjs.map +0 -1
  696. package/dist/client/components/fields/rich-text-editor/image-popover.mjs.map +0 -1
  697. package/dist/client/components/fields/rich-text-editor/index.d.mts +0 -4
  698. package/dist/client/components/fields/rich-text-editor/index.mjs.map +0 -1
  699. package/dist/client/components/fields/rich-text-editor/link-popover.mjs.map +0 -1
  700. package/dist/client/components/fields/rich-text-editor/presets.d.mts +0 -11
  701. package/dist/client/components/fields/rich-text-editor/presets.d.mts.map +0 -1
  702. package/dist/client/components/fields/rich-text-editor/presets.mjs.map +0 -1
  703. package/dist/client/components/fields/rich-text-editor/slash-commands.mjs.map +0 -1
  704. package/dist/client/components/fields/rich-text-editor/table-controls.mjs.map +0 -1
  705. package/dist/client/components/fields/rich-text-editor/toolbar.mjs.map +0 -1
  706. package/dist/client/components/fields/rich-text-editor/types.d.mts +0 -78
  707. package/dist/client/components/fields/rich-text-editor/types.d.mts.map +0 -1
  708. package/dist/client/components/fields/rich-text-editor/types.mjs.map +0 -1
  709. package/dist/client/components/fields/rich-text-editor/utils.mjs.map +0 -1
  710. package/dist/client/components/fields/rich-text-editor/variants.d.mts +0 -2
  711. package/dist/client/components/fields/rich-text-field.d.mts +0 -14
  712. package/dist/client/components/fields/rich-text-field.d.mts.map +0 -1
  713. package/dist/client/components/fields/rich-text-field.mjs.map +0 -1
  714. package/dist/client/components/fields/select-field.d.mts +0 -25
  715. package/dist/client/components/fields/select-field.d.mts.map +0 -1
  716. package/dist/client/components/fields/select-field.mjs.map +0 -1
  717. package/dist/client/components/fields/status-field.d.mts +0 -2
  718. package/dist/client/components/fields/text-field.d.mts +0 -22
  719. package/dist/client/components/fields/text-field.d.mts.map +0 -1
  720. package/dist/client/components/fields/text-field.mjs.map +0 -1
  721. package/dist/client/components/fields/textarea-field.d.mts +0 -22
  722. package/dist/client/components/fields/textarea-field.d.mts.map +0 -1
  723. package/dist/client/components/fields/textarea-field.mjs.map +0 -1
  724. package/dist/client/components/fields/time-field.d.mts +0 -20
  725. package/dist/client/components/fields/time-field.d.mts.map +0 -1
  726. package/dist/client/components/fields/time-field.mjs.map +0 -1
  727. package/dist/client/components/fields/upload-field.d.mts +0 -97
  728. package/dist/client/components/fields/upload-field.d.mts.map +0 -1
  729. package/dist/client/components/fields/upload-field.mjs.map +0 -1
  730. package/dist/client/components/filter-builder/columns-tab.d.mts +0 -1
  731. package/dist/client/components/filter-builder/columns-tab.mjs.map +0 -1
  732. package/dist/client/components/filter-builder/filter-builder-sheet.d.mts +0 -1
  733. package/dist/client/components/filter-builder/filter-builder-sheet.mjs.map +0 -1
  734. package/dist/client/components/filter-builder/filters-tab.d.mts +0 -1
  735. package/dist/client/components/filter-builder/filters-tab.mjs.map +0 -1
  736. package/dist/client/components/filter-builder/index.d.mts +0 -5
  737. package/dist/client/components/filter-builder/saved-views-tab.d.mts +0 -1
  738. package/dist/client/components/filter-builder/saved-views-tab.mjs.map +0 -1
  739. package/dist/client/components/index.d.mts +0 -80
  740. package/dist/client/components/locale-switcher.d.mts +0 -2
  741. package/dist/client/components/locale-switcher.mjs.map +0 -1
  742. package/dist/client/components/media/media-grid.mjs.map +0 -1
  743. package/dist/client/components/media/media-picker-dialog.mjs.map +0 -1
  744. package/dist/client/components/preview/live-preview-mode.mjs.map +0 -1
  745. package/dist/client/components/preview/preview-pane.mjs.map +0 -1
  746. package/dist/client/components/primitives/asset-preview.mjs.map +0 -1
  747. package/dist/client/components/primitives/checkbox-input.mjs.map +0 -1
  748. package/dist/client/components/primitives/date-input.mjs.map +0 -1
  749. package/dist/client/components/primitives/dropzone.mjs.map +0 -1
  750. package/dist/client/components/primitives/number-input.mjs.map +0 -1
  751. package/dist/client/components/primitives/select-multi.mjs.map +0 -1
  752. package/dist/client/components/primitives/select-single.mjs.map +0 -1
  753. package/dist/client/components/primitives/text-input.mjs.map +0 -1
  754. package/dist/client/components/primitives/textarea-input.mjs.map +0 -1
  755. package/dist/client/components/primitives/time-input.mjs.map +0 -1
  756. package/dist/client/components/primitives/toggle-input.mjs.map +0 -1
  757. package/dist/client/components/primitives/types.d.mts +0 -14
  758. package/dist/client/components/primitives/types.d.mts.map +0 -1
  759. package/dist/client/components/primitives/types.mjs.map +0 -1
  760. package/dist/client/components/sheets/index.d.mts +0 -1
  761. package/dist/client/components/sheets/resource-sheet.d.mts +0 -1
  762. package/dist/client/components/sheets/resource-sheet.mjs.map +0 -1
  763. package/dist/client/components/ui/accordion.d.mts +0 -2
  764. package/dist/client/components/ui/accordion.mjs.map +0 -1
  765. package/dist/client/components/ui/alert.mjs.map +0 -1
  766. package/dist/client/components/ui/avatar.d.mts +0 -3
  767. package/dist/client/components/ui/badge.d.mts +0 -3
  768. package/dist/client/components/ui/badge.mjs.map +0 -1
  769. package/dist/client/components/ui/button.d.mts +0 -3
  770. package/dist/client/components/ui/button.mjs.map +0 -1
  771. package/dist/client/components/ui/card.d.mts +0 -2
  772. package/dist/client/components/ui/card.mjs.map +0 -1
  773. package/dist/client/components/ui/checkbox.d.mts +0 -2
  774. package/dist/client/components/ui/checkbox.mjs.map +0 -1
  775. package/dist/client/components/ui/combobox.d.mts +0 -3
  776. package/dist/client/components/ui/command.mjs.map +0 -1
  777. package/dist/client/components/ui/dialog.d.mts +0 -3
  778. package/dist/client/components/ui/dialog.mjs.map +0 -1
  779. package/dist/client/components/ui/drawer.mjs.map +0 -1
  780. package/dist/client/components/ui/dropdown-menu.d.mts +0 -3
  781. package/dist/client/components/ui/dropdown-menu.mjs.map +0 -1
  782. package/dist/client/components/ui/empty-state.mjs.map +0 -1
  783. package/dist/client/components/ui/field.d.mts +0 -3
  784. package/dist/client/components/ui/field.mjs.map +0 -1
  785. package/dist/client/components/ui/input-group.d.mts +0 -4
  786. package/dist/client/components/ui/input-group.mjs.map +0 -1
  787. package/dist/client/components/ui/input.d.mts +0 -2
  788. package/dist/client/components/ui/input.mjs.map +0 -1
  789. package/dist/client/components/ui/kbd.mjs.map +0 -1
  790. package/dist/client/components/ui/label.d.mts +0 -2
  791. package/dist/client/components/ui/label.mjs.map +0 -1
  792. package/dist/client/components/ui/popover.d.mts +0 -3
  793. package/dist/client/components/ui/popover.mjs.map +0 -1
  794. package/dist/client/components/ui/responsive-dialog.mjs.map +0 -1
  795. package/dist/client/components/ui/scroll-area.d.mts +0 -2
  796. package/dist/client/components/ui/search-input.mjs.map +0 -1
  797. package/dist/client/components/ui/select.d.mts +0 -3
  798. package/dist/client/components/ui/select.mjs.map +0 -1
  799. package/dist/client/components/ui/separator.d.mts +0 -2
  800. package/dist/client/components/ui/separator.mjs.map +0 -1
  801. package/dist/client/components/ui/sheet.d.mts +0 -3
  802. package/dist/client/components/ui/sheet.mjs.map +0 -1
  803. package/dist/client/components/ui/sidebar.d.mts +0 -8
  804. package/dist/client/components/ui/sidebar.mjs.map +0 -1
  805. package/dist/client/components/ui/skeleton.d.mts +0 -1
  806. package/dist/client/components/ui/skeleton.mjs.map +0 -1
  807. package/dist/client/components/ui/sonner.d.mts.map +0 -1
  808. package/dist/client/components/ui/sonner.mjs.map +0 -1
  809. package/dist/client/components/ui/spinner.d.mts +0 -1
  810. package/dist/client/components/ui/spinner.mjs.map +0 -1
  811. package/dist/client/components/ui/switch.d.mts +0 -2
  812. package/dist/client/components/ui/switch.mjs.map +0 -1
  813. package/dist/client/components/ui/table.d.mts +0 -2
  814. package/dist/client/components/ui/table.mjs.map +0 -1
  815. package/dist/client/components/ui/tabs.d.mts +0 -3
  816. package/dist/client/components/ui/tabs.mjs.map +0 -1
  817. package/dist/client/components/ui/textarea.d.mts +0 -2
  818. package/dist/client/components/ui/textarea.mjs.map +0 -1
  819. package/dist/client/components/ui/toolbar.mjs.map +0 -1
  820. package/dist/client/components/ui/tooltip.d.mts +0 -2
  821. package/dist/client/components/ui/tooltip.mjs.map +0 -1
  822. package/dist/client/components/widgets/chart-widget.d.mts +0 -57
  823. package/dist/client/components/widgets/chart-widget.d.mts.map +0 -1
  824. package/dist/client/components/widgets/chart-widget.mjs.map +0 -1
  825. package/dist/client/components/widgets/progress-widget.d.mts +0 -41
  826. package/dist/client/components/widgets/progress-widget.d.mts.map +0 -1
  827. package/dist/client/components/widgets/progress-widget.mjs.map +0 -1
  828. package/dist/client/components/widgets/quick-actions-widget.d.mts +0 -29
  829. package/dist/client/components/widgets/quick-actions-widget.d.mts.map +0 -1
  830. package/dist/client/components/widgets/quick-actions-widget.mjs.map +0 -1
  831. package/dist/client/components/widgets/recent-items-widget.d.mts +0 -51
  832. package/dist/client/components/widgets/recent-items-widget.d.mts.map +0 -1
  833. package/dist/client/components/widgets/recent-items-widget.mjs.map +0 -1
  834. package/dist/client/components/widgets/stats-widget.d.mts +0 -55
  835. package/dist/client/components/widgets/stats-widget.d.mts.map +0 -1
  836. package/dist/client/components/widgets/stats-widget.mjs.map +0 -1
  837. package/dist/client/components/widgets/table-widget.d.mts +0 -31
  838. package/dist/client/components/widgets/table-widget.d.mts.map +0 -1
  839. package/dist/client/components/widgets/table-widget.mjs.map +0 -1
  840. package/dist/client/components/widgets/timeline-widget.d.mts +0 -51
  841. package/dist/client/components/widgets/timeline-widget.d.mts.map +0 -1
  842. package/dist/client/components/widgets/timeline-widget.mjs.map +0 -1
  843. package/dist/client/components/widgets/value-widget.d.mts +0 -39
  844. package/dist/client/components/widgets/value-widget.d.mts.map +0 -1
  845. package/dist/client/components/widgets/value-widget.mjs.map +0 -1
  846. package/dist/client/components/widgets/widget-skeletons.mjs.map +0 -1
  847. package/dist/client/context/focus-context.d.mts.map +0 -1
  848. package/dist/client/context/focus-context.mjs.map +0 -1
  849. package/dist/client/contexts/breadcrumb-context.mjs.map +0 -1
  850. package/dist/client/hooks/typed-hooks.d.mts.map +0 -1
  851. package/dist/client/hooks/typed-hooks.mjs.map +0 -1
  852. package/dist/client/hooks/use-action.mjs.map +0 -1
  853. package/dist/client/hooks/use-admin-config.mjs.map +0 -1
  854. package/dist/client/hooks/use-admin-preferences.mjs.map +0 -1
  855. package/dist/client/hooks/use-admin-routes.mjs.map +0 -1
  856. package/dist/client/hooks/use-auth.d.mts.map +0 -1
  857. package/dist/client/hooks/use-auth.mjs.map +0 -1
  858. package/dist/client/hooks/use-collection-fields.mjs.map +0 -1
  859. package/dist/client/hooks/use-collection-meta.mjs.map +0 -1
  860. package/dist/client/hooks/use-collection-schema.mjs.map +0 -1
  861. package/dist/client/hooks/use-collection-validation.mjs.map +0 -1
  862. package/dist/client/hooks/use-collection.d.mts.map +0 -1
  863. package/dist/client/hooks/use-collection.mjs.map +0 -1
  864. package/dist/client/hooks/use-current-user.d.mts.map +0 -1
  865. package/dist/client/hooks/use-current-user.mjs.map +0 -1
  866. package/dist/client/hooks/use-field-hooks.mjs.map +0 -1
  867. package/dist/client/hooks/use-field-options.d.mts.map +0 -1
  868. package/dist/client/hooks/use-field-options.mjs.map +0 -1
  869. package/dist/client/hooks/use-global-fields.mjs.map +0 -1
  870. package/dist/client/hooks/use-global-meta.mjs.map +0 -1
  871. package/dist/client/hooks/use-global-schema.mjs.map +0 -1
  872. package/dist/client/hooks/use-global.d.mts.map +0 -1
  873. package/dist/client/hooks/use-global.mjs.map +0 -1
  874. package/dist/client/hooks/use-locks.mjs.map +0 -1
  875. package/dist/client/hooks/use-media-query.d.mts.map +0 -1
  876. package/dist/client/hooks/use-media-query.mjs.map +0 -1
  877. package/dist/client/hooks/use-prefill-params.mjs.map +0 -1
  878. package/dist/client/hooks/use-questpie-query-options.mjs.map +0 -1
  879. package/dist/client/hooks/use-reactive-fields.d.mts.map +0 -1
  880. package/dist/client/hooks/use-reactive-fields.mjs.map +0 -1
  881. package/dist/client/hooks/use-realtime-highlight.mjs.map +0 -1
  882. package/dist/client/hooks/use-saved-views.mjs.map +0 -1
  883. package/dist/client/hooks/use-search.mjs.map +0 -1
  884. package/dist/client/hooks/use-server-validation.mjs.map +0 -1
  885. package/dist/client/hooks/use-server-widget-data.d.mts.map +0 -1
  886. package/dist/client/hooks/use-server-widget-data.mjs.map +0 -1
  887. package/dist/client/hooks/use-setup-status.d.mts.map +0 -1
  888. package/dist/client/hooks/use-setup-status.mjs.map +0 -1
  889. package/dist/client/hooks/use-upload-collection.mjs.map +0 -1
  890. package/dist/client/hooks/use-upload.d.mts +0 -23
  891. package/dist/client/hooks/use-upload.d.mts.map +0 -1
  892. package/dist/client/hooks/use-upload.mjs.map +0 -1
  893. package/dist/client/hooks/use-validation-error-map.mjs.map +0 -1
  894. package/dist/client/hooks/use-view-state.mjs.map +0 -1
  895. package/dist/client/i18n/hooks.mjs.map +0 -1
  896. package/dist/client/i18n/intl-cache.mjs.map +0 -1
  897. package/dist/client/i18n/messages.mjs.map +0 -1
  898. package/dist/client/i18n/simple.d.mts.map +0 -1
  899. package/dist/client/i18n/simple.mjs.map +0 -1
  900. package/dist/client/i18n/types.d.mts.map +0 -1
  901. package/dist/client/lib/utils.d.mts +0 -1
  902. package/dist/client/lib/utils.mjs.map +0 -1
  903. package/dist/client/preview/block-scope-context.d.mts.map +0 -1
  904. package/dist/client/preview/block-scope-context.mjs.map +0 -1
  905. package/dist/client/preview/preview-banner.d.mts.map +0 -1
  906. package/dist/client/preview/preview-banner.mjs.map +0 -1
  907. package/dist/client/preview/preview-field.d.mts.map +0 -1
  908. package/dist/client/preview/preview-field.mjs.map +0 -1
  909. package/dist/client/preview/types.d.mts.map +0 -1
  910. package/dist/client/preview/types.mjs.map +0 -1
  911. package/dist/client/preview/use-collection-preview.d.mts.map +0 -1
  912. package/dist/client/preview/use-collection-preview.mjs.map +0 -1
  913. package/dist/client/runtime/content-locales-provider.mjs.map +0 -1
  914. package/dist/client/runtime/locale-scope.mjs.map +0 -1
  915. package/dist/client/runtime/provider.d.mts.map +0 -1
  916. package/dist/client/runtime/provider.mjs.map +0 -1
  917. package/dist/client/runtime/routes.d.mts.map +0 -1
  918. package/dist/client/runtime/routes.mjs.map +0 -1
  919. package/dist/client/runtime/translations-provider.d.mts +0 -2
  920. package/dist/client/runtime/translations-provider.mjs.map +0 -1
  921. package/dist/client/scope/picker.d.mts.map +0 -1
  922. package/dist/client/scope/picker.mjs.map +0 -1
  923. package/dist/client/scope/provider.d.mts.map +0 -1
  924. package/dist/client/scope/provider.mjs.map +0 -1
  925. package/dist/client/scope/types.d.mts.map +0 -1
  926. package/dist/client/utils/auto-expand-fields.mjs.map +0 -1
  927. package/dist/client/utils/build-field-definitions-from-schema.mjs.map +0 -1
  928. package/dist/client/utils/detect-relations.mjs.map +0 -1
  929. package/dist/client/utils/locale-to-flag.d.mts.map +0 -1
  930. package/dist/client/utils/locale-to-flag.mjs.map +0 -1
  931. package/dist/client/utils/routes.mjs.map +0 -1
  932. package/dist/client/views/auth/accept-invite-form.d.mts.map +0 -1
  933. package/dist/client/views/auth/accept-invite-form.mjs.map +0 -1
  934. package/dist/client/views/auth/auth-layout.d.mts.map +0 -1
  935. package/dist/client/views/auth/auth-layout.mjs.map +0 -1
  936. package/dist/client/views/auth/forgot-password-form.d.mts.map +0 -1
  937. package/dist/client/views/auth/forgot-password-form.mjs.map +0 -1
  938. package/dist/client/views/auth/index.d.mts +0 -7
  939. package/dist/client/views/auth/invite-form.d.mts +0 -1
  940. package/dist/client/views/auth/invite-form.mjs.map +0 -1
  941. package/dist/client/views/auth/login-form.d.mts.map +0 -1
  942. package/dist/client/views/auth/login-form.mjs.map +0 -1
  943. package/dist/client/views/auth/reset-password-form.d.mts.map +0 -1
  944. package/dist/client/views/auth/reset-password-form.mjs.map +0 -1
  945. package/dist/client/views/auth/setup-form.d.mts.map +0 -1
  946. package/dist/client/views/auth/setup-form.mjs.map +0 -1
  947. package/dist/client/views/collection/auto-form-fields.d.mts +0 -4
  948. package/dist/client/views/collection/auto-form-fields.mjs.map +0 -1
  949. package/dist/client/views/collection/bulk-action-toolbar.mjs.map +0 -1
  950. package/dist/client/views/collection/cells/complex-cells.d.mts +0 -46
  951. package/dist/client/views/collection/cells/complex-cells.d.mts.map +0 -1
  952. package/dist/client/views/collection/cells/complex-cells.mjs.map +0 -1
  953. package/dist/client/views/collection/cells/index.d.mts +0 -7
  954. package/dist/client/views/collection/cells/primitive-cells.d.mts +0 -76
  955. package/dist/client/views/collection/cells/primitive-cells.d.mts.map +0 -1
  956. package/dist/client/views/collection/cells/primitive-cells.mjs.map +0 -1
  957. package/dist/client/views/collection/cells/relation-cells.d.mts +0 -21
  958. package/dist/client/views/collection/cells/relation-cells.d.mts.map +0 -1
  959. package/dist/client/views/collection/cells/relation-cells.mjs.map +0 -1
  960. package/dist/client/views/collection/cells/shared/asset-thumbnail.d.mts +0 -1
  961. package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs.map +0 -1
  962. package/dist/client/views/collection/cells/shared/cell-helpers.d.mts +0 -2
  963. package/dist/client/views/collection/cells/shared/cell-helpers.mjs.map +0 -1
  964. package/dist/client/views/collection/cells/shared/relation-chip.d.mts +0 -1
  965. package/dist/client/views/collection/cells/shared/relation-chip.mjs.map +0 -1
  966. package/dist/client/views/collection/cells/upload-cells.d.mts +0 -25
  967. package/dist/client/views/collection/cells/upload-cells.d.mts.map +0 -1
  968. package/dist/client/views/collection/cells/upload-cells.mjs.map +0 -1
  969. package/dist/client/views/collection/columns/build-columns.d.mts +0 -2
  970. package/dist/client/views/collection/columns/build-columns.mjs.map +0 -1
  971. package/dist/client/views/collection/columns/column-defaults.d.mts +0 -2
  972. package/dist/client/views/collection/columns/column-defaults.mjs.map +0 -1
  973. package/dist/client/views/collection/columns/index.d.mts +0 -3
  974. package/dist/client/views/collection/columns/types.d.mts +0 -2
  975. package/dist/client/views/collection/field-context.mjs.map +0 -1
  976. package/dist/client/views/collection/field-renderer.mjs.map +0 -1
  977. package/dist/client/views/collection/form-view.d.mts +0 -112
  978. package/dist/client/views/collection/form-view.d.mts.map +0 -1
  979. package/dist/client/views/collection/form-view.mjs.map +0 -1
  980. package/dist/client/views/collection/index.d.mts +0 -9
  981. package/dist/client/views/collection/table-view.d.mts +0 -102
  982. package/dist/client/views/collection/table-view.d.mts.map +0 -1
  983. package/dist/client/views/collection/table-view.mjs.map +0 -1
  984. package/dist/client/views/collection/view-skeletons.mjs.map +0 -1
  985. package/dist/client/views/common/global-search.d.mts +0 -1
  986. package/dist/client/views/common/global-search.mjs.map +0 -1
  987. package/dist/client/views/common/index.d.mts +0 -1
  988. package/dist/client/views/dashboard/dashboard-grid.mjs.map +0 -1
  989. package/dist/client/views/dashboard/dashboard-widget.mjs.map +0 -1
  990. package/dist/client/views/dashboard/widget-card.mjs.map +0 -1
  991. package/dist/client/views/globals/global-form-view.d.mts +0 -74
  992. package/dist/client/views/globals/global-form-view.d.mts.map +0 -1
  993. package/dist/client/views/globals/global-form-view.mjs.map +0 -1
  994. package/dist/client/views/index.d.mts +0 -28
  995. package/dist/client/views/layout/admin-layout-provider.d.mts.map +0 -1
  996. package/dist/client/views/layout/admin-layout-provider.mjs.map +0 -1
  997. package/dist/client/views/layout/admin-layout.d.mts.map +0 -1
  998. package/dist/client/views/layout/admin-layout.mjs.map +0 -1
  999. package/dist/client/views/layout/admin-root.d.mts +0 -7
  1000. package/dist/client/views/layout/admin-router.d.mts.map +0 -1
  1001. package/dist/client/views/layout/admin-router.mjs.map +0 -1
  1002. package/dist/client/views/layout/admin-sidebar.d.mts.map +0 -1
  1003. package/dist/client/views/layout/admin-sidebar.mjs.map +0 -1
  1004. package/dist/client/views/layout/admin-topbar.mjs.map +0 -1
  1005. package/dist/client/views/layout/index.d.mts +0 -5
  1006. package/dist/client/views/pages/accept-invite-page.d.mts.map +0 -1
  1007. package/dist/client/views/pages/accept-invite-page.mjs.map +0 -1
  1008. package/dist/client/views/pages/dashboard-page.d.mts.map +0 -1
  1009. package/dist/client/views/pages/dashboard-page.mjs.map +0 -1
  1010. package/dist/client/views/pages/forgot-password-page.d.mts.map +0 -1
  1011. package/dist/client/views/pages/forgot-password-page.mjs.map +0 -1
  1012. package/dist/client/views/pages/index.d.mts +0 -7
  1013. package/dist/client/views/pages/invite-page.d.mts.map +0 -1
  1014. package/dist/client/views/pages/invite-page.mjs.map +0 -1
  1015. package/dist/client/views/pages/login-page.d.mts.map +0 -1
  1016. package/dist/client/views/pages/login-page.mjs.map +0 -1
  1017. package/dist/client/views/pages/reset-password-page.d.mts.map +0 -1
  1018. package/dist/client/views/pages/reset-password-page.mjs.map +0 -1
  1019. package/dist/client/views/pages/setup-page.d.mts.map +0 -1
  1020. package/dist/client/views/pages/setup-page.mjs.map +0 -1
  1021. package/dist/client.d.mts.map +0 -1
  1022. package/dist/components/rich-text/rich-text-renderer.d.mts.map +0 -1
  1023. package/dist/components/rich-text/rich-text-renderer.mjs.map +0 -1
  1024. package/dist/server/adapters/nextjs.d.mts.map +0 -1
  1025. package/dist/server/adapters/nextjs.mjs.map +0 -1
  1026. package/dist/server/adapters/tanstack.d.mts.map +0 -1
  1027. package/dist/server/adapters/tanstack.mjs.map +0 -1
  1028. package/dist/server/augmentation.d.mts.map +0 -1
  1029. package/dist/server/auth-helpers.d.mts.map +0 -1
  1030. package/dist/server/auth-helpers.mjs.map +0 -1
  1031. package/dist/server/block/block-builder.d.mts.map +0 -1
  1032. package/dist/server/block/block-builder.mjs.map +0 -1
  1033. package/dist/server/block/introspection.d.mts.map +0 -1
  1034. package/dist/server/block/introspection.mjs.map +0 -1
  1035. package/dist/server/block/prefetch.d.mts.map +0 -1
  1036. package/dist/server/block/prefetch.mjs.map +0 -1
  1037. package/dist/server/fields/blocks.d.mts.map +0 -1
  1038. package/dist/server/fields/blocks.mjs.map +0 -1
  1039. package/dist/server/fields/index.d.mts.map +0 -1
  1040. package/dist/server/fields/index.mjs.map +0 -1
  1041. package/dist/server/fields/rich-text.d.mts.map +0 -1
  1042. package/dist/server/fields/rich-text.mjs.map +0 -1
  1043. package/dist/server/i18n/index.d.mts +0 -16
  1044. package/dist/server/i18n/index.d.mts.map +0 -1
  1045. package/dist/server/i18n/index.mjs.map +0 -1
  1046. package/dist/server/i18n/messages/cs.mjs.map +0 -1
  1047. package/dist/server/i18n/messages/de.mjs.map +0 -1
  1048. package/dist/server/i18n/messages/en.mjs.map +0 -1
  1049. package/dist/server/i18n/messages/es.mjs.map +0 -1
  1050. package/dist/server/i18n/messages/fr.mjs.map +0 -1
  1051. package/dist/server/i18n/messages/index.mjs.map +0 -1
  1052. package/dist/server/i18n/messages/pl.mjs.map +0 -1
  1053. package/dist/server/i18n/messages/pt.mjs.map +0 -1
  1054. package/dist/server/i18n/messages/sk.mjs.map +0 -1
  1055. package/dist/server/index.d.mts +0 -20
  1056. package/dist/server/modules/admin/functions/admin-config.mjs +0 -348
  1057. package/dist/server/modules/admin/functions/admin-config.mjs.map +0 -1
  1058. package/dist/server/modules/admin/functions/execute-action.d.mts.map +0 -1
  1059. package/dist/server/modules/admin/functions/execute-action.mjs.map +0 -1
  1060. package/dist/server/modules/admin/functions/locales.mjs +0 -80
  1061. package/dist/server/modules/admin/functions/locales.mjs.map +0 -1
  1062. package/dist/server/modules/admin/functions/preview.d.mts.map +0 -1
  1063. package/dist/server/modules/admin/functions/preview.mjs.map +0 -1
  1064. package/dist/server/modules/admin/functions/reactive.d.mts.map +0 -1
  1065. package/dist/server/modules/admin/functions/reactive.mjs.map +0 -1
  1066. package/dist/server/modules/admin/functions/setup.d.mts.map +0 -1
  1067. package/dist/server/modules/admin/functions/setup.mjs +0 -131
  1068. package/dist/server/modules/admin/functions/setup.mjs.map +0 -1
  1069. package/dist/server/modules/admin/functions/translations.mjs +0 -125
  1070. package/dist/server/modules/admin/functions/translations.mjs.map +0 -1
  1071. package/dist/server/modules/admin/functions/widget-data.d.mts +0 -33
  1072. package/dist/server/modules/admin/functions/widget-data.d.mts.map +0 -1
  1073. package/dist/server/modules/admin/functions/widget-data.mjs +0 -70
  1074. package/dist/server/modules/admin/functions/widget-data.mjs.map +0 -1
  1075. package/dist/server/modules/admin/index.d.mts.map +0 -1
  1076. package/dist/server/modules/admin/index.mjs.map +0 -1
  1077. package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.d.mts +0 -3
  1078. package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.mjs.map +0 -1
  1079. package/dist/server/modules/admin-preferences/collections/locks.collection.d.mts +0 -3
  1080. package/dist/server/modules/admin-preferences/collections/locks.collection.mjs.map +0 -1
  1081. package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts +0 -1490
  1082. package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts.map +0 -1
  1083. package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs +0 -57
  1084. package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs.map +0 -1
  1085. package/dist/server/patch.d.mts +0 -100
  1086. package/dist/server/patch.d.mts.map +0 -1
  1087. package/dist/server/patch.mjs +0 -1062
  1088. package/dist/server/patch.mjs.map +0 -1
  1089. package/dist/shared/preview-utils.d.mts.map +0 -1
  1090. package/dist/shared/preview-utils.mjs.map +0 -1
  1091. package/dist/shared/types/saved-views.types.d.mts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"column-defaults.mjs","names":["defaultCols: string[]","defaultCols","contentFields: string[]","systemFields: string[]","availableFields: ColumnField[]"],"sources":["../../../../../src/client/views/collection/columns/column-defaults.ts"],"sourcesContent":["/**\n * Column Defaults Computation\n *\n * Functions for computing default visible columns and available fields\n * Extracted from build-columns.tsx\n */\n\nimport type { FieldDefinition } from \"../../../builder/field/field\";\nimport { formatFieldLabel } from \"../cells/shared/cell-helpers\";\nimport type { ColumnField, ComputeDefaultColumnsOptions } from \"./types\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * System fields that are typically auto-generated and not user-editable\n */\nexport const SYSTEM_FIELDS = new Set([\n\t\"id\",\n\t\"createdAt\",\n\t\"updatedAt\",\n\t\"deletedAt\",\n\t\"createdBy\",\n\t\"updatedBy\",\n]);\n\n/**\n * Field types that are typically not shown by default in list view\n * (too complex or take up too much space)\n */\nexport const EXCLUDED_DEFAULT_FIELD_TYPES = new Set([\n\t\"relation\",\n\t\"reverseRelation\",\n\t\"upload\",\n\t\"uploadMany\",\n\t\"json\",\n\t\"object\",\n\t\"richText\",\n\t\"textarea\",\n]);\n\n/**\n * Maximum number of content fields to show by default\n */\nexport const MAX_DEFAULT_CONTENT_FIELDS = 4;\n\n// ============================================================================\n// Default Column Computation\n// ============================================================================\n\n/**\n * Compute sane default visible columns for a collection\n *\n * Default columns are selected with the following logic:\n * 1. If configuredColumns is provided (from .list()), use those + title\n * 2. Otherwise, auto-detect:\n * - Title field first\n * - Up to 4 content fields (non-system, non-relation, non-upload)\n * - `createdAt` at the end (if timestamps enabled)\n *\n * @param fields - Field definitions from collection config\n * @param options - Optional metadata and configured columns\n * @returns Array of field names for default visible columns\n */\nexport function computeDefaultColumns(\n\tfields?: Record<string, FieldDefinition>,\n\toptions?: ComputeDefaultColumnsOptions,\n): string[] {\n\t// Determine the title column to use\n\tconst titleFieldName = options?.meta?.title?.fieldName;\n\tconst titleType = options?.meta?.title?.type;\n\tconst useTitleField = titleType === \"field\" && titleFieldName;\n\tconst titleColumn = useTitleField ? titleFieldName : \"_title\";\n\n\t// If columns are explicitly configured in .list(), use those\n\tif (options?.configuredColumns && options.configuredColumns.length > 0) {\n\t\tconst configuredNames = options.configuredColumns.map((col) =>\n\t\t\ttypeof col === \"string\" ? col : col.field,\n\t\t);\n\n\t\t// Always include title column first, then configured columns (excluding title to avoid dupe)\n\t\tconst defaultCols: string[] = [titleColumn];\n\t\tfor (const colName of configuredNames) {\n\t\t\tif (colName !== titleColumn) {\n\t\t\t\tdefaultCols.push(colName);\n\t\t\t}\n\t\t}\n\t\treturn defaultCols;\n\t}\n\n\t// No configured columns - show ALL fields by default\n\t// This ensures users see everything when no explicit column config is provided\n\tconst defaultCols: string[] = [titleColumn];\n\n\tif (!fields || Object.keys(fields).length === 0) {\n\t\treturn defaultCols;\n\t}\n\n\t// Add all content fields (non-system fields first, then system fields)\n\tconst contentFields: string[] = [];\n\tconst systemFields: string[] = [];\n\n\tfor (const [key, fieldDef] of Object.entries(fields)) {\n\t\t// Skip the title field if we're already showing it\n\t\tif (useTitleField && key === titleFieldName) continue;\n\n\t\tif (SYSTEM_FIELDS.has(key)) {\n\t\t\tsystemFields.push(key);\n\t\t} else {\n\t\t\tcontentFields.push(key);\n\t\t}\n\t}\n\n\t// Add all content fields\n\tdefaultCols.push(...contentFields);\n\n\t// Add createdAt at the end if timestamps enabled (from meta or field existence)\n\tconst hasTimestamps = options?.meta?.timestamps ?? !!fields.createdAt;\n\tif (hasTimestamps && fields.createdAt && !defaultCols.includes(\"createdAt\")) {\n\t\tdefaultCols.push(\"createdAt\");\n\t}\n\n\treturn defaultCols;\n}\n\n// ============================================================================\n// Available Fields\n// ============================================================================\n\n/**\n * Get all available fields for the column picker\n *\n * Includes all fields (both content and system fields) so users can\n * choose to display any field in their view.\n *\n * @param fields - Field definitions from collection config\n * @param options - Optional metadata from backend\n * @returns Array of available field info for the column picker\n */\nexport function getAllAvailableFields(\n\tfields?: Record<string, FieldDefinition>,\n\toptions?: ComputeDefaultColumnsOptions,\n): ColumnField[] {\n\tconst availableFields: ColumnField[] = [];\n\n\t// Determine title field from meta\n\tconst titleFieldName = options?.meta?.title?.fieldName;\n\tconst titleType = options?.meta?.title?.type;\n\tconst useTitleField = titleType === \"field\" && titleFieldName;\n\n\t// Only add _title as an option if title is NOT a real field\n\t// (i.e., title is virtual/computed, so _title is the way to access it)\n\tif (!useTitleField) {\n\t\t// For virtual titles, show the virtual field's label instead of generic \"Title\"\n\t\tif (titleType === \"virtual\" && titleFieldName && fields?.[titleFieldName]) {\n\t\t\tconst titleFieldDef = fields[titleFieldName];\n\t\t\tconst titleFieldOptions = titleFieldDef?.[\"~options\"] ?? {};\n\t\t\tconst titleLabel =\n\t\t\t\ttitleFieldOptions.label ?? formatFieldLabel(titleFieldName);\n\t\t\tavailableFields.push({\n\t\t\t\tname: \"_title\",\n\t\t\t\tlabel: titleLabel,\n\t\t\t\ttype: \"text\",\n\t\t\t\tisSystem: false,\n\t\t\t\toptions: undefined,\n\t\t\t});\n\t\t} else {\n\t\t\t// Fallback to generic \"Title\" when no title defined or field not found\n\t\t\tavailableFields.push({\n\t\t\t\tname: \"_title\",\n\t\t\t\tlabel: \"Title\",\n\t\t\t\ttype: \"text\",\n\t\t\t\tisSystem: false,\n\t\t\t\toptions: undefined,\n\t\t\t});\n\t\t}\n\t}\n\n\tif (!fields) return availableFields;\n\n\t// Add all fields from config (except virtual title field to avoid duplication)\n\tfor (const [key, fieldDef] of Object.entries(fields)) {\n\t\t// Skip the virtual title field since we already added _title for it\n\t\tif (titleType === \"virtual\" && key === titleFieldName) continue;\n\n\t\tconst fieldType = fieldDef?.name ?? \"text\";\n\t\tconst fieldOptions = fieldDef?.[\"~options\"] ?? {};\n\t\tconst label = fieldOptions.label ?? formatFieldLabel(key);\n\t\tconst isSystem = SYSTEM_FIELDS.has(key);\n\n\t\tavailableFields.push({\n\t\t\tname: key,\n\t\t\tlabel,\n\t\t\ttype: fieldType,\n\t\t\tisSystem,\n\t\t\toptions: fieldOptions,\n\t\t});\n\t}\n\n\treturn availableFields;\n}\n\n/**\n * Format field name as header (camelCase to Title Case)\n */\nexport function formatHeader(fieldName: string): string {\n\treturn formatFieldLabel(fieldName);\n}\n"],"mappings":";;;;;;AAkBA,MAAa,gBAAgB,IAAI,IAAI;CACpC;CACA;CACA;CACA;CACA;CACA;CACA,CAAC;;;;;;;;;;;;;;;AAwCF,SAAgB,sBACf,QACA,SACW;CAEX,MAAM,iBAAiB,SAAS,MAAM,OAAO;CAE7C,MAAM,gBADY,SAAS,MAAM,OAAO,SACJ,WAAW;CAC/C,MAAM,cAAc,gBAAgB,iBAAiB;AAGrD,KAAI,SAAS,qBAAqB,QAAQ,kBAAkB,SAAS,GAAG;EACvE,MAAM,kBAAkB,QAAQ,kBAAkB,KAAK,QACtD,OAAO,QAAQ,WAAW,MAAM,IAAI,MACpC;EAGD,MAAMA,gBAAwB,CAAC,YAAY;AAC3C,OAAK,MAAM,WAAW,gBACrB,KAAI,YAAY,YACf,eAAY,KAAK,QAAQ;AAG3B,SAAOC;;CAKR,MAAMD,cAAwB,CAAC,YAAY;AAE3C,KAAI,CAAC,UAAU,OAAO,KAAK,OAAO,CAAC,WAAW,EAC7C,QAAO;CAIR,MAAME,gBAA0B,EAAE;CAClC,MAAMC,eAAyB,EAAE;AAEjC,MAAK,MAAM,CAAC,KAAK,aAAa,OAAO,QAAQ,OAAO,EAAE;AAErD,MAAI,iBAAiB,QAAQ,eAAgB;AAE7C,MAAI,cAAc,IAAI,IAAI,CACzB,cAAa,KAAK,IAAI;MAEtB,eAAc,KAAK,IAAI;;AAKzB,aAAY,KAAK,GAAG,cAAc;AAIlC,MADsB,SAAS,MAAM,cAAc,CAAC,CAAC,OAAO,cACvC,OAAO,aAAa,CAAC,YAAY,SAAS,YAAY,CAC1E,aAAY,KAAK,YAAY;AAG9B,QAAO;;;;;;;;;;;;AAiBR,SAAgB,sBACf,QACA,SACgB;CAChB,MAAMC,kBAAiC,EAAE;CAGzC,MAAM,iBAAiB,SAAS,MAAM,OAAO;CAC7C,MAAM,YAAY,SAAS,MAAM,OAAO;AAKxC,KAAI,EAJkB,cAAc,WAAW,gBAM9C,KAAI,cAAc,aAAa,kBAAkB,SAAS,iBAAiB;EAG1E,MAAM,cAFgB,OAAO,kBACa,eAAe,EAAE,EAExC,SAAS,iBAAiB,eAAe;AAC5D,kBAAgB,KAAK;GACpB,MAAM;GACN,OAAO;GACP,MAAM;GACN,UAAU;GACV,SAAS;GACT,CAAC;OAGF,iBAAgB,KAAK;EACpB,MAAM;EACN,OAAO;EACP,MAAM;EACN,UAAU;EACV,SAAS;EACT,CAAC;AAIJ,KAAI,CAAC,OAAQ,QAAO;AAGpB,MAAK,MAAM,CAAC,KAAK,aAAa,OAAO,QAAQ,OAAO,EAAE;AAErD,MAAI,cAAc,aAAa,QAAQ,eAAgB;EAEvD,MAAM,YAAY,UAAU,QAAQ;EACpC,MAAM,eAAe,WAAW,eAAe,EAAE;EACjD,MAAM,QAAQ,aAAa,SAAS,iBAAiB,IAAI;EACzD,MAAM,WAAW,cAAc,IAAI,IAAI;AAEvC,kBAAgB,KAAK;GACpB,MAAM;GACN;GACA,MAAM;GACN;GACA,SAAS;GACT,CAAC;;AAGH,QAAO;;;;;AAMR,SAAgB,aAAa,WAA2B;AACvD,QAAO,iBAAiB,UAAU"}
@@ -1,3 +0,0 @@
1
- import "./types.mjs";
2
- import "./build-columns.mjs";
3
- import "./column-defaults.mjs";
@@ -1,2 +0,0 @@
1
- import "../../../builder/field/field.mjs";
2
- import "../../../builder/types/collection-types.mjs";
@@ -1 +0,0 @@
1
- {"version":3,"file":"field-context.mjs","names":[],"sources":["../../../../src/client/views/collection/field-context.ts"],"sourcesContent":["/**\n * Field Context\n *\n * Provides context and utilities for rendering form fields.\n * Extracted from auto-form-fields.tsx for better modularity.\n */\n\nimport type React from \"react\";\nimport type { FieldDefinition } from \"../../builder/field/field\";\nimport type { DynamicI18nText } from \"../../builder/types/common\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Context object containing all information needed to render a field.\n * Note: label, description, placeholder can be I18nText - resolve them before passing to components.\n */\nexport type FieldContext = {\n\tfieldName: string;\n\tfullFieldName: string;\n\tcollection: string;\n\tfieldDef?: FieldDefinition;\n\tfieldValue: any;\n\t/** Can be I18nText - must be resolved before passing to component */\n\tlabel?: DynamicI18nText;\n\t/** Can be I18nText - must be resolved before passing to component */\n\tdescription?: DynamicI18nText;\n\t/** Can be I18nText - must be resolved before passing to component */\n\tplaceholder?: DynamicI18nText;\n\toptions?: Array<{ label: string; value: any }>;\n\t/** Whether field is hidden (not rendered). Default false. */\n\tisHidden: boolean;\n\t/** Whether field is read-only (normal look, not editable). Computed fields are always readonly. */\n\tisReadOnly: boolean;\n\t/** Whether field is disabled (grayed out). */\n\tisDisabled: boolean;\n\tisRequired: boolean;\n\tisLocalized: boolean;\n\t/** Whether field has a compute function */\n\tisComputed: boolean;\n\tlocale?: string;\n\tfieldError?: string;\n\tupdateValue: (nextValue: any) => void;\n\ttype?: string;\n\tcomponent?: React.ComponentType<any>;\n\t/** Compute function if field is computed */\n\tcompute?: (values: Record<string, any>) => any;\n};\n\n// ============================================================================\n// Helper Functions - Field Definition Access\n// ============================================================================\n\n/**\n * Get field type from FieldDefinition\n * FieldDefinition.name contains the type name (e.g., \"text\", \"relation\")\n */\nexport function getFieldType(\n\tfieldDef: FieldDefinition | undefined,\n): string | undefined {\n\tif (!fieldDef) return undefined;\n\t// FieldDefinition stores the field type in 'name' property\n\t// This comes from field(\"text\", ...) where \"text\" is the type\n\treturn fieldDef.name;\n}\n\n/**\n * Get field options from FieldDefinition\n * Options are stored in \"~options\" property\n */\nexport function getFieldOptions(\n\tfieldDef: FieldDefinition | undefined,\n): Record<string, any> {\n\tif (!fieldDef) return {};\n\treturn (fieldDef as any)[\"~options\"] || {};\n}\n\n/**\n * Get field component from FieldDefinition\n * Component is stored in field.component\n */\nexport function getFieldComponent(\n\tfieldDef: FieldDefinition | undefined,\n): React.ComponentType<any> | undefined {\n\tif (!fieldDef?.field?.component) return undefined;\n\treturn fieldDef.field.component as React.ComponentType<any>;\n}\n\n// ============================================================================\n// Helper Functions - Value Resolution\n// ============================================================================\n\ntype ValueResolver<T> = T | ((values: any) => T);\n\nexport function resolveValue<T>(\n\tvalue: ValueResolver<T> | undefined,\n\tformValues: any,\n\tdefaultValue: T,\n): T {\n\tif (value === undefined) return defaultValue;\n\tif (typeof value === \"function\") {\n\t\treturn (value as (values: any) => T)(formValues);\n\t}\n\treturn value;\n}\n\n/**\n * Get form values for conditional field logic.\n *\n * @deprecated This is a legacy fallback. All callers should now use useWatch()\n * hook in their component and pass the watched values to getFieldContext via\n * the `formValues` parameter. This function uses form.watch() which doesn't\n * properly integrate with React's render cycle.\n *\n * Best practice pattern:\n * ```tsx\n * const watchedValues = useWatch({ control: form.control });\n * const context = getFieldContext({ ..., formValues: watchedValues });\n * ```\n */\nexport function getFormValues(form: any, fieldPrefix?: string) {\n\tif (!form?.watch) return {};\n\tconst values = fieldPrefix ? form.watch(fieldPrefix) : form.watch();\n\treturn values ?? {};\n}\n\nexport function getFullFieldName(fieldName: string, fieldPrefix?: string) {\n\treturn fieldPrefix ? `${fieldPrefix}.${fieldName}` : fieldName;\n}\n\n// ============================================================================\n// Field Context Factory\n// ============================================================================\n\nexport interface GetFieldContextParams {\n\tfieldName: string;\n\tfieldDef?: FieldDefinition;\n\tcollection: string;\n\tform: any;\n\tfieldPrefix?: string;\n\tlocale?: string;\n\t/** Entity metadata from backend (for inferring localized fields) */\n\tentityMeta?: { localizedFields?: string[] };\n\t/**\n\t * Pre-watched form values from useWatch hook.\n\t * If provided, avoids calling form.watch() internally.\n\t * This is the preferred pattern for better React integration.\n\t */\n\tformValues?: Record<string, any>;\n}\n\n/**\n * Create a FieldContext object from field definition and form context.\n * Contains all information needed to render a field component.\n */\nexport function getFieldContext({\n\tfieldName,\n\tfieldDef,\n\tcollection,\n\tform,\n\tfieldPrefix,\n\tlocale,\n\tformValues: formValuesProp,\n\tentityMeta,\n}: GetFieldContextParams): FieldContext {\n\t// Use pre-watched values if provided (preferred), otherwise fall back to form.watch()\n\tconst formValues = formValuesProp ?? getFormValues(form, fieldPrefix);\n\tconst fullFieldName = getFullFieldName(fieldName, fieldPrefix);\n\tconst fieldState = form?.getFieldState\n\t\t? form.getFieldState(fullFieldName)\n\t\t: undefined;\n\tconst fieldError = fieldState?.error?.message;\n\tconst fieldValue = formValues[fieldName];\n\n\t// Get options from FieldDefinition\n\tconst options = getFieldOptions(fieldDef);\n\tconst type = getFieldType(fieldDef);\n\tconst component = getFieldComponent(fieldDef);\n\n\tconst label = options.label;\n\tconst description = options.description;\n\tconst placeholder = options.placeholder;\n\n\t// hidden: false/undefined = visible, true = hidden\n\tconst isHidden = resolveValue(options.hidden, formValues, false);\n\t// compute implies readonly\n\tconst isComputed = typeof options.compute === \"function\";\n\tconst isReadOnly =\n\t\tisComputed || resolveValue(options.readOnly, formValues, false);\n\tconst isDisabled = resolveValue(options.disabled, formValues, false);\n\tconst isRequired = resolveValue(options.required, formValues, false);\n\n\t// Check if field is localized: explicit config takes priority, fallback to BE metadata\n\tconst isLocalized =\n\t\toptions.localized !== undefined\n\t\t\t? !!options.localized\n\t\t\t: (entityMeta?.localizedFields?.includes(fieldName) ?? false);\n\n\t// Resolve dynamic options for select fields\n\tconst selectOptions = options.options\n\t\t? typeof options.options === \"function\"\n\t\t\t? options.options(formValues)\n\t\t\t: options.options\n\t\t: undefined;\n\n\tconst updateValue = (nextValue: any) => {\n\t\tif (form?.setValue) {\n\t\t\tform.setValue(fullFieldName, nextValue, {\n\t\t\t\tshouldDirty: true,\n\t\t\t\tshouldTouch: true,\n\t\t\t});\n\t\t}\n\t};\n\n\treturn {\n\t\tfieldName,\n\t\tfullFieldName,\n\t\tcollection,\n\t\tfieldDef,\n\t\tfieldValue,\n\t\tlabel,\n\t\tdescription,\n\t\tplaceholder,\n\t\toptions: selectOptions,\n\t\tisHidden,\n\t\tisReadOnly,\n\t\tisDisabled,\n\t\tisRequired,\n\t\tisLocalized,\n\t\tisComputed,\n\t\tlocale,\n\t\tfieldError,\n\t\tupdateValue,\n\t\ttype,\n\t\tcomponent,\n\t\tcompute: options.compute,\n\t};\n}\n\n// ============================================================================\n// Component Props Builders\n// ============================================================================\n\n/**\n * Raw component props with I18nText (needs resolution before passing to components)\n */\nexport type RawComponentProps = {\n\tname: string;\n\tvalue: any;\n\tonChange: (value: any) => void;\n\tlabel?: DynamicI18nText;\n\tdescription?: DynamicI18nText;\n\tplaceholder?: DynamicI18nText;\n\trequired: boolean;\n\tdisabled: boolean;\n\treadOnly: boolean;\n\terror?: string;\n\tlocalized: boolean;\n\tlocale?: string;\n};\n\n/**\n * Build props for a FieldDefinition component (field.component).\n * Returns raw props with I18nText - resolve before passing to component.\n */\nexport function buildComponentProps(context: FieldContext): RawComponentProps {\n\treturn {\n\t\tname: context.fullFieldName,\n\t\tvalue: context.fieldValue,\n\t\tonChange: context.updateValue,\n\t\tlabel: context.label,\n\t\tdescription: context.description,\n\t\tplaceholder: context.placeholder,\n\t\trequired: context.isRequired,\n\t\tdisabled: context.isDisabled,\n\t\treadOnly: context.isReadOnly,\n\t\terror: context.fieldError,\n\t\tlocalized: context.isLocalized,\n\t\tlocale: context.locale,\n\t};\n}\n"],"mappings":";;;;;AA2DA,SAAgB,aACf,UACqB;AACrB,KAAI,CAAC,SAAU,QAAO;AAGtB,QAAO,SAAS;;;;;;AAOjB,SAAgB,gBACf,UACsB;AACtB,KAAI,CAAC,SAAU,QAAO,EAAE;AACxB,QAAQ,SAAiB,eAAe,EAAE;;;;;;AAO3C,SAAgB,kBACf,UACuC;AACvC,KAAI,CAAC,UAAU,OAAO,UAAW,QAAO;AACxC,QAAO,SAAS,MAAM;;AASvB,SAAgB,aACf,OACA,YACA,cACI;AACJ,KAAI,UAAU,OAAW,QAAO;AAChC,KAAI,OAAO,UAAU,WACpB,QAAQ,MAA6B,WAAW;AAEjD,QAAO;;;;;;;;;;;;;;;;AAiBR,SAAgB,cAAc,MAAW,aAAsB;AAC9D,KAAI,CAAC,MAAM,MAAO,QAAO,EAAE;AAE3B,SADe,cAAc,KAAK,MAAM,YAAY,GAAG,KAAK,OAAO,KAClD,EAAE;;AAGpB,SAAgB,iBAAiB,WAAmB,aAAsB;AACzE,QAAO,cAAc,GAAG,YAAY,GAAG,cAAc;;;;;;AA4BtD,SAAgB,gBAAgB,EAC/B,WACA,UACA,YACA,MACA,aACA,QACA,YAAY,gBACZ,cACuC;CAEvC,MAAM,aAAa,kBAAkB,cAAc,MAAM,YAAY;CACrE,MAAM,gBAAgB,iBAAiB,WAAW,YAAY;CAI9D,MAAM,cAHa,MAAM,gBACtB,KAAK,cAAc,cAAc,GACjC,SAC4B,OAAO;CACtC,MAAM,aAAa,WAAW;CAG9B,MAAM,UAAU,gBAAgB,SAAS;CACzC,MAAM,OAAO,aAAa,SAAS;CACnC,MAAM,YAAY,kBAAkB,SAAS;CAE7C,MAAM,QAAQ,QAAQ;CACtB,MAAM,cAAc,QAAQ;CAC5B,MAAM,cAAc,QAAQ;CAG5B,MAAM,WAAW,aAAa,QAAQ,QAAQ,YAAY,MAAM;CAEhE,MAAM,aAAa,OAAO,QAAQ,YAAY;CAC9C,MAAM,aACL,cAAc,aAAa,QAAQ,UAAU,YAAY,MAAM;CAChE,MAAM,aAAa,aAAa,QAAQ,UAAU,YAAY,MAAM;CACpE,MAAM,aAAa,aAAa,QAAQ,UAAU,YAAY,MAAM;CAGpE,MAAM,cACL,QAAQ,cAAc,SACnB,CAAC,CAAC,QAAQ,YACT,YAAY,iBAAiB,SAAS,UAAU,IAAI;CAGzD,MAAM,gBAAgB,QAAQ,UAC3B,OAAO,QAAQ,YAAY,aAC1B,QAAQ,QAAQ,WAAW,GAC3B,QAAQ,UACT;CAEH,MAAM,eAAe,cAAmB;AACvC,MAAI,MAAM,SACT,MAAK,SAAS,eAAe,WAAW;GACvC,aAAa;GACb,aAAa;GACb,CAAC;;AAIJ,QAAO;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,SAAS;EACT;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,SAAS,QAAQ;EACjB;;;;;;AA6BF,SAAgB,oBAAoB,SAA0C;AAC7E,QAAO;EACN,MAAM,QAAQ;EACd,OAAO,QAAQ;EACf,UAAU,QAAQ;EAClB,OAAO,QAAQ;EACf,aAAa,QAAQ;EACrB,aAAa,QAAQ;EACrB,UAAU,QAAQ;EAClB,UAAU,QAAQ;EAClB,UAAU,QAAQ;EAClB,OAAO,QAAQ;EACf,WAAW,QAAQ;EACnB,QAAQ,QAAQ;EAChB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"field-renderer.mjs","names":["React","result: any","content: React.ReactNode"],"sources":["../../../../src/client/views/collection/field-renderer.tsx"],"sourcesContent":["/**\n * FieldRenderer Component\n *\n * Renders a single form field using FieldDefinition.\n * Shared between AutoFormFields and BlockEditor.\n */\n\nimport * as React from \"react\";\nimport { useFormContext, useWatch } from \"react-hook-form\";\nimport type { ComponentRegistry } from \"../../builder\";\nimport type { FieldDefinition } from \"../../builder/field/field\";\nimport { useAdminConfig } from \"../../hooks/use-admin-config\";\nimport { useCollectionMeta } from \"../../hooks/use-collection-meta\";\nimport { useFieldHooks } from \"../../hooks/use-field-hooks\";\nimport { useGlobalMeta } from \"../../hooks/use-global-meta\";\nimport { useResolveText } from \"../../i18n/hooks\";\nimport { useScopedLocale } from \"../../runtime\";\nimport {\n\tbuildComponentProps,\n\ttype FieldContext,\n\tgetFieldContext,\n\tgetFieldOptions,\n\tgetFullFieldName,\n} from \"./field-context\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FieldRendererProps {\n\tfieldName: string;\n\tfieldDef?: FieldDefinition;\n\tcollection: string;\n\t/** Entity type - determines which meta hook to use */\n\tmode?: \"collection\" | \"global\";\n\tregistry?: ComponentRegistry;\n\tfieldPrefix?: string;\n\tclassName?: string;\n\t/**\n\t * Callback to render embedded collection fields.\n\t * Required for embedded fields to work (handles recursive AutoFormFields).\n\t */\n\trenderEmbeddedFields?: (params: {\n\t\tembeddedCollection: string;\n\t\tembeddedCollectionConfig: any;\n\t\tfullFieldName: string;\n\t\tindex: number;\n\t}) => React.ReactNode;\n\t/**\n\t * All collection configs (for embedded collections)\n\t */\n\tallCollectionsConfig?: Record<string, any>;\n\t/**\n\t * Entity metadata from backend (for inferring localized fields)\n\t */\n\tentityMeta?: { localizedFields?: string[] };\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction renderConfigError(message: string) {\n\treturn (\n\t\t<div className=\"border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive rounded\">\n\t\t\t{message}\n\t\t</div>\n\t);\n}\n\nfunction stripFieldUiOptions(options: Record<string, any>) {\n\tconst {\n\t\tlabel,\n\t\tdescription,\n\t\tplaceholder,\n\t\trequired,\n\t\tdisabled,\n\t\treadOnly,\n\t\tvisible,\n\t\tlocalized,\n\t\tlocale,\n\t\t...rest\n\t} = options;\n\n\treturn rest;\n}\n\n/**\n * Render field using FieldDefinition.field.component\n *\n * This is the primary rendering method. Field components receive:\n * - Base props (name, value, onChange, label, etc.) from componentProps\n * - Field-specific options from FieldDefinition[\"~options\"]\n */\nfunction renderDefinitionComponent({\n\tcontext,\n\tcomponentProps,\n\tblocks,\n}: {\n\tcontext: FieldContext;\n\tcomponentProps: ReturnType<typeof buildComponentProps>;\n\tblocks?: Record<string, any>;\n}) {\n\tconst Component = context.component;\n\tif (!Component) return null;\n\n\t// Get field-specific options from FieldDefinition\n\tconst options = stripFieldUiOptions(getFieldOptions(context.fieldDef));\n\n\t// For blocks field, inject the blocks registry from admin state\n\tif (context.type === \"blocks\" && blocks) {\n\t\treturn <Component {...componentProps} {...options} blocks={blocks} />;\n\t}\n\n\treturn <Component {...componentProps} {...options} />;\n}\n\n/**\n * Render embedded collection field\n *\n * Embedded fields need special handling because they require:\n * 1. Access to allCollectionsConfig for the embedded collection's config\n * 2. A renderFields callback that recursively renders AutoFormFields\n */\nfunction renderEmbeddedField({\n\tcontext,\n\tregistry,\n\tallCollectionsConfig,\n\tcomponentProps,\n\trenderEmbeddedFields,\n}: {\n\tcontext: FieldContext;\n\tregistry?: ComponentRegistry;\n\tallCollectionsConfig?: Record<string, any>;\n\tcomponentProps: ReturnType<typeof buildComponentProps>;\n\trenderEmbeddedFields?: FieldRendererProps[\"renderEmbeddedFields\"];\n}) {\n\tif (context.type !== \"embedded\") return null;\n\n\tconst options = stripFieldUiOptions(getFieldOptions(context.fieldDef));\n\tconst embeddedCollection = options.collection;\n\n\tif (!embeddedCollection) {\n\t\treturn renderConfigError(\n\t\t\t`Missing collection for embedded field \"${context.fieldName}\".`,\n\t\t);\n\t}\n\n\tconst embeddedCollectionConfig = allCollectionsConfig?.[embeddedCollection];\n\n\t// Use the component from FieldDefinition, or fall back to registry/default\n\tconst EmbeddedComponent =\n\t\tcontext.component ||\n\t\t(registry?.fields?.embedded as React.ComponentType<any>);\n\n\tif (!EmbeddedComponent) {\n\t\treturn renderConfigError(\n\t\t\t`No component found for embedded field \"${context.fieldName}\".`,\n\t\t);\n\t}\n\n\treturn (\n\t\t<EmbeddedComponent\n\t\t\t{...componentProps}\n\t\t\t{...options}\n\t\t\tvalue={context.fieldValue || []}\n\t\t\tcollection={embeddedCollection}\n\t\t\trenderFields={(index: number) =>\n\t\t\t\trenderEmbeddedFields?.({\n\t\t\t\t\tembeddedCollection,\n\t\t\t\t\tembeddedCollectionConfig,\n\t\t\t\t\tfullFieldName: context.fullFieldName,\n\t\t\t\t\tindex,\n\t\t\t\t})\n\t\t\t}\n\t\t/>\n\t);\n}\n\n// ============================================================================\n// FieldRenderer Component\n// ============================================================================\n\n/**\n * Render a single field with conditional logic\n *\n * Rendering priority:\n * 1. Embedded fields (need special handling for recursive AutoFormFields)\n * 2. FieldDefinition.field.component (registry-first approach)\n * 3. Error message if no component registered\n */\nexport function FieldRenderer({\n\tfieldName,\n\tfieldDef,\n\tcollection,\n\tmode = \"collection\",\n\tregistry,\n\tfieldPrefix,\n\tallCollectionsConfig,\n\trenderEmbeddedFields,\n\tclassName,\n\tentityMeta: entityMetaProp,\n}: FieldRendererProps) {\n\tconst form = useFormContext() as any;\n\t// Use scoped locale (from LocaleScopeProvider in ResourceSheet) or global locale\n\tconst { locale } = useScopedLocale();\n\tconst resolveText = useResolveText();\n\tconst { data: adminConfig } = useAdminConfig();\n\n\t// Use useWatch hook (React pattern) instead of form.getValues() method\n\t// This ensures reactive updates when form values change\n\t// Watch all form values - the fieldPrefix scoping is handled by getFieldContext\n\tconst watchedValues = useWatch({ control: form.control });\n\tconst fullFieldName = getFullFieldName(fieldName, fieldPrefix);\n\tconst watchedFieldValue = useWatch({\n\t\tcontrol: form.control,\n\t\tname: fullFieldName,\n\t} as any);\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\t// Fetch entity metadata for inferring localized fields\n\t// Use prop if provided, otherwise fetch from backend based on mode\n\tconst { data: fetchedCollectionMeta } = useCollectionMeta(collection, {\n\t\tenabled: !entityMetaProp && mode === \"collection\",\n\t});\n\tconst { data: fetchedGlobalMeta } = useGlobalMeta(collection, {\n\t\tenabled: !entityMetaProp && mode === \"global\",\n\t});\n\n\tconst entityMeta =\n\t\tentityMetaProp ??\n\t\t(mode === \"global\" ? fetchedGlobalMeta : fetchedCollectionMeta);\n\n\tconst context = getFieldContext({\n\t\tfieldName,\n\t\tfieldDef,\n\t\tcollection,\n\t\tform,\n\t\tfieldPrefix,\n\t\tlocale,\n\t\tentityMeta,\n\t\tformValues, // Pass pre-watched values to avoid calling form.watch() internally\n\t});\n\n\t// Get field options for hooks\n\tconst fieldOptions = getFieldOptions(fieldDef);\n\n\t// Check if compute is client-side (function) vs server-side (object with handler)\n\t// Server-side compute is handled by useReactiveFields in form-view.tsx\n\tconst clientSideCompute =\n\t\ttypeof fieldOptions.compute === \"function\"\n\t\t\t? fieldOptions.compute\n\t\t\t: undefined;\n\n\t// Use field hooks for compute, onChange, loadOptions\n\tconst {\n\t\thandleChange,\n\t\tcomputedValue,\n\t\tisComputed,\n\t\toptions: hookOptions,\n\t\toptionsLoading,\n\t} = useFieldHooks({\n\t\tfieldName,\n\t\tfullFieldName: context.fullFieldName,\n\t\tlocale,\n\t\tcompute: clientSideCompute,\n\t\tonChange: fieldOptions.onChange,\n\t\tdefaultValue: fieldOptions.defaultValue,\n\t\tloadOptions: fieldOptions.loadOptions,\n\t\tstaticOptions: context.options,\n\t});\n\n\t// Hidden fields are not rendered\n\tif (context.isHidden) return null;\n\n\t// Field not found in config\n\tif (!fieldDef) {\n\t\tconst entityType = mode === \"global\" ? \"global\" : \"collection\";\n\t\treturn renderConfigError(\n\t\t\t`Field \"${fieldName}\" not found in ${entityType} \"${collection}\" config.`,\n\t\t);\n\t}\n\n\t// Use hook options if available, otherwise use context options\n\tconst resolvedOptions = hookOptions ?? context.options;\n\n\t// Build props and resolve I18nText labels to strings\n\tconst rawComponentProps = buildComponentProps(context);\n\n\t// For computed fields, use computed value instead of form value\n\tconst fieldValue = isComputed\n\t\t? computedValue\n\t\t: watchedFieldValue === undefined\n\t\t\t? rawComponentProps.value\n\t\t\t: watchedFieldValue;\n\n\tconst componentProps = {\n\t\t...rawComponentProps,\n\t\t// Use computed value if field is computed\n\t\tvalue: fieldValue,\n\t\t// Use handleChange from hooks instead of context.updateValue\n\t\tonChange: handleChange,\n\t\t// Use resolved options\n\t\toptions: resolvedOptions,\n\t\t// Pass loading state for async options\n\t\toptionsLoading,\n\t\t// Computed fields are always readonly\n\t\treadOnly: rawComponentProps.readOnly || isComputed,\n\t\tlabel: resolveText(rawComponentProps.label, \"\", formValues),\n\t\tdescription: resolveText(rawComponentProps.description, \"\", formValues),\n\t\tplaceholder: resolveText(rawComponentProps.placeholder, \"\", formValues),\n\t};\n\n\t// Render content based on priority\n\tlet content: React.ReactNode = null;\n\n\t// 1. Embedded fields need special handling for recursive rendering\n\tif (context.type === \"embedded\") {\n\t\tcontent = renderEmbeddedField({\n\t\t\tcontext,\n\t\t\tregistry,\n\t\t\tallCollectionsConfig,\n\t\t\tcomponentProps,\n\t\t\trenderEmbeddedFields,\n\t\t});\n\t}\n\n\t// 2. Use FieldDefinition.field.component (registry-first approach)\n\tif (!content && context.component) {\n\t\tcontent = renderDefinitionComponent({\n\t\t\tcontext,\n\t\t\tcomponentProps,\n\t\t\tblocks: adminConfig?.blocks,\n\t\t});\n\t}\n\n\t// 3. No component found - show error (all fields should have registered components)\n\tif (!content) {\n\t\tcontent = renderConfigError(\n\t\t\t`No component registered for field type \"${context.type}\" (field: \"${context.fieldName}\").`,\n\t\t);\n\t}\n\n\t// Wrap with className if provided\n\tif (className) {\n\t\treturn <div className={className}>{content}</div>;\n\t}\n\n\treturn <>{content}</>;\n}\n"],"mappings":"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"}
@@ -1,112 +0,0 @@
1
- import { ComponentRegistry, FormViewConfig } from "../../builder/types/field-types.mjs";
2
- import { CollectionBuilderState } from "../../builder/types/collection-types.mjs";
3
- import * as React$1 from "react";
4
-
5
- //#region src/client/views/collection/form-view.d.ts
6
-
7
- /**
8
- * Form view configuration from registry.
9
- *
10
- * Re-exports FormViewConfig for type consistency between builder and component.
11
- */
12
- type FormViewRegistryConfig = FormViewConfig;
13
- /**
14
- * Props for FormView component
15
- */
16
- interface FormViewProps {
17
- /**
18
- * Collection name
19
- */
20
- collection: string;
21
- /**
22
- * Item ID (undefined for create, string for edit)
23
- */
24
- id?: string;
25
- /**
26
- * Collection configuration from admin builder
27
- * Accepts CollectionBuilderState or any compatible config object
28
- */
29
- config?: Partial<CollectionBuilderState> | Record<string, any>;
30
- /**
31
- * View-specific configuration from registry
32
- */
33
- viewConfig?: FormViewRegistryConfig;
34
- /**
35
- * Navigate function for routing
36
- */
37
- navigate: (path: string) => void;
38
- /**
39
- * Base path for admin routes (e.g., "/admin")
40
- */
41
- basePath?: string;
42
- /**
43
- * Default values for create mode (from URL prefill params)
44
- */
45
- defaultValues?: Record<string, any>;
46
- /**
47
- * Component registry for custom field types
48
- */
49
- registry?: ComponentRegistry;
50
- /**
51
- * All collections config (for embedded collections)
52
- */
53
- allCollectionsConfig?: Record<string, Partial<CollectionBuilderState> | Record<string, any>>;
54
- /**
55
- * Show metadata (ID, created/updated dates)
56
- * @default true
57
- */
58
- showMeta?: boolean;
59
- /**
60
- * Custom header actions (in addition to default Save button)
61
- */
62
- headerActions?: React$1.ReactNode;
63
- /**
64
- * Callback on successful save
65
- */
66
- onSuccess?: (data: any) => void;
67
- /**
68
- * Callback on error
69
- */
70
- onError?: (error: Error) => void;
71
- }
72
- /**
73
- * FormView - Default form-based edit/create view for collections
74
- *
75
- * Features:
76
- * - Auto-generates form fields from collection config
77
- * - Supports tabs, sections, and sidebar layout
78
- * - Auto-detects M:N relations
79
- * - Keyboard shortcut (Cmd+S) to save
80
- * - Field-level validation errors from API
81
- *
82
- * @example
83
- * ```tsx
84
- * // Used automatically via registry when navigating to /admin/collections/:name/:id
85
- * // Can also be used directly:
86
- * <FormView
87
- * collection="posts"
88
- * id="123"
89
- * config={postsConfig}
90
- * navigate={navigate}
91
- * basePath="/admin"
92
- * />
93
- * ```
94
- */
95
- declare function FormView({
96
- collection,
97
- id,
98
- config,
99
- viewConfig,
100
- navigate,
101
- basePath,
102
- defaultValues: defaultValuesProp,
103
- registry,
104
- allCollectionsConfig,
105
- showMeta,
106
- headerActions,
107
- onSuccess,
108
- onError
109
- }: FormViewProps): React$1.ReactElement;
110
- //#endregion
111
- export { FormView, FormViewProps, FormViewRegistryConfig };
112
- //# sourceMappingURL=form-view.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"form-view.d.mts","names":[],"sources":["../../../../src/client/views/collection/form-view.tsx"],"sourcesContent":[],"mappings":";;;;;;;;;;;AAmNE,KApDU,sBAAA,GAAyB,cAoDnC;;;;AAsBiB,UArEF,aAAA,CAqEE;EAAK;AACvB;;EA+BA,UAAA,EAAA,MAAA;EACA;;;EAGA,EAAA,CAAA,EAAA,MAAA;EACe;;;;EAIf,MAAA,CAAA,EA/FS,OA+FT,CA/FiB,sBA+FjB,CAAA,GA/F2C,MA+F3C,CAAA,MAAA,EAAA,GAAA,CAAA;EACA;;;EAEkB,UAAM,CAAA,EA7FX,sBA6FW;EAAY;;;;;;;;;;;kBA9EpB;;;;aAKL;;;;yBAKY,eAEtB,QAAQ,0BAA0B;;;;;;;;;kBAYnB,OAAA,CAAM;;;;;;;;oBAUJ;;;;;;;;;;;;;;;;;;;;;;;;;iBA8BK,QAAA;;;;;;;iBAOR;;;;;;;GAOb,gBAAgB,OAAA,CAAM"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"form-view.mjs","names":["configs: Record<string, FieldReactiveSchema>","React","configFormActions: FormViewActionsConfig | undefined","formActions: FormViewActionsConfig | undefined","actionQueryClient: ActionQueryClient","actionHelpers: ActionHelpers","actionContext: ActionContext"],"sources":["../../../../src/client/views/collection/form-view.tsx"],"sourcesContent":["/**\n * Form View - Default edit view component\n *\n * Renders collection item edit/create form with sections, tabs, validation.\n * This is the default edit view registered in the admin view registry.\n */\n\nimport { Icon } from \"@iconify/react\";\nimport { createQuestpieQueryOptions } from \"@questpie/tanstack-query\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport type { CollectionSchema, FieldReactiveSchema } from \"questpie/client\";\nimport { QuestpieClientError } from \"questpie/client\";\nimport * as React from \"react\";\nimport { FormProvider, useForm, useWatch } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { getDefaultFormActions } from \"../../builder/types/action-registry\";\nimport type {\n\tActionContext,\n\tActionDefinition,\n\tActionHelpers,\n\tActionQueryClient,\n} from \"../../builder/types/action-types\";\nimport type {\n\tCollectionBuilderState,\n\tPreviewConfig,\n} from \"../../builder/types/collection-types\";\nimport type {\n\tComponentRegistry,\n\tFormViewActionsConfig,\n\tFormViewConfig,\n} from \"../../builder/types/field-types\";\nimport { ActionButton } from \"../../components/actions/action-button\";\nimport { ActionDialog } from \"../../components/actions/action-dialog\";\nimport { ConfirmationDialog } from \"../../components/actions/confirmation-dialog\";\nimport { resolveIconElement } from \"../../components/component-renderer\";\nimport { LocaleSwitcher } from \"../../components/locale-switcher\";\nimport {\n\tLivePreviewMode,\n\tuseLivePreviewContext,\n} from \"../../components/preview/live-preview-mode\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from \"../../components/ui/dialog\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuSeparator,\n\tDropdownMenuTrigger,\n} from \"../../components/ui/dropdown-menu\";\nimport {\n\tuseAdminConfig,\n\tuseCollectionValidation,\n\tusePreferServerValidation,\n} from \"../../hooks\";\nimport {\n\tuseCollectionCreate,\n\tuseCollectionDelete,\n\tuseCollectionItem,\n\tuseCollectionUpdate,\n} from \"../../hooks/use-collection\";\nimport { useCollectionFields } from \"../../hooks/use-collection-fields\";\nimport { getLockUser, LOCK_DURATION_MS, useLock } from \"../../hooks/use-locks\";\nimport { useReactiveFields } from \"../../hooks/use-reactive-fields\";\nimport { useResolveText, useTranslation } from \"../../i18n/hooks\";\nimport {\n\tselectAdmin,\n\tselectBasePath,\n\tselectClient,\n\tselectNavigate,\n\tuseAdminStore,\n\tuseSafeContentLocales,\n\tuseScopedLocale,\n} from \"../../runtime\";\nimport {\n\tdetectManyToManyRelations,\n\thasManyToManyRelations,\n} from \"../../utils/detect-relations\";\n\nimport { AutoFormFields } from \"./auto-form-fields\";\nimport { FormViewSkeleton } from \"./view-skeletons\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Query key prefix for CMS queries (used for cache invalidation) */\nconst QUERY_KEY_PREFIX = [\"questpie\", \"collections\"] as const;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Extract reactive configs from collection schema fields.\n * Used to determine which fields have server-side reactive behaviors.\n */\nfunction extractReactiveConfigs(\n\tschema: CollectionSchema | undefined,\n): Record<string, FieldReactiveSchema> {\n\tif (!schema?.fields) return {};\n\n\tconst configs: Record<string, FieldReactiveSchema> = {};\n\n\tfor (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\n\t\tif (fieldDef.reactive) {\n\t\t\tconfigs[fieldName] = fieldDef.reactive;\n\t\t}\n\t}\n\n\treturn configs;\n}\n\n/**\n * Component that manages reactive field states.\n * Must be rendered inside FormProvider to access form context.\n */\nfunction ReactiveFieldsManager({\n\tcollection,\n\tmode = \"collection\",\n\treactiveConfigs,\n\tenabled,\n}: {\n\tcollection: string;\n\tmode?: \"collection\" | \"global\";\n\treactiveConfigs: Record<string, FieldReactiveSchema>;\n\tenabled: boolean;\n}) {\n\t// This hook handles:\n\t// 1. Watching form values for changes to reactive dependencies\n\t// 2. Calling server /reactive endpoint to execute handlers\n\t// 3. Setting computed values via form.setValue\n\tuseReactiveFields({\n\t\tcollection,\n\t\tmode,\n\t\treactiveConfigs,\n\t\tenabled: enabled && Object.keys(reactiveConfigs).length > 0,\n\t\tdebounce: 300,\n\t});\n\n\treturn null;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Form view configuration from registry.\n *\n * Re-exports FormViewConfig for type consistency between builder and component.\n */\nexport type FormViewRegistryConfig = FormViewConfig;\n\n/**\n * Props for FormView component\n */\nexport interface FormViewProps {\n\t/**\n\t * Collection name\n\t */\n\tcollection: string;\n\n\t/**\n\t * Item ID (undefined for create, string for edit)\n\t */\n\tid?: string;\n\n\t/**\n\t * Collection configuration from admin builder\n\t * Accepts CollectionBuilderState or any compatible config object\n\t */\n\tconfig?: Partial<CollectionBuilderState> | Record<string, any>;\n\n\t/**\n\t * View-specific configuration from registry\n\t */\n\tviewConfig?: FormViewRegistryConfig;\n\n\t/**\n\t * Navigate function for routing\n\t */\n\tnavigate: (path: string) => void;\n\n\t/**\n\t * Base path for admin routes (e.g., \"/admin\")\n\t */\n\tbasePath?: string;\n\n\t/**\n\t * Default values for create mode (from URL prefill params)\n\t */\n\tdefaultValues?: Record<string, any>;\n\n\t/**\n\t * Component registry for custom field types\n\t */\n\tregistry?: ComponentRegistry;\n\n\t/**\n\t * All collections config (for embedded collections)\n\t */\n\tallCollectionsConfig?: Record<\n\t\tstring,\n\t\tPartial<CollectionBuilderState> | Record<string, any>\n\t>;\n\n\t/**\n\t * Show metadata (ID, created/updated dates)\n\t * @default true\n\t */\n\tshowMeta?: boolean;\n\n\t/**\n\t * Custom header actions (in addition to default Save button)\n\t */\n\theaderActions?: React.ReactNode;\n\n\t/**\n\t * Callback on successful save\n\t */\n\tonSuccess?: (data: any) => void;\n\n\t/**\n\t * Callback on error\n\t */\n\tonError?: (error: Error) => void;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * FormView - Default form-based edit/create view for collections\n *\n * Features:\n * - Auto-generates form fields from collection config\n * - Supports tabs, sections, and sidebar layout\n * - Auto-detects M:N relations\n * - Keyboard shortcut (Cmd+S) to save\n * - Field-level validation errors from API\n *\n * @example\n * ```tsx\n * // Used automatically via registry when navigating to /admin/collections/:name/:id\n * // Can also be used directly:\n * <FormView\n * collection=\"posts\"\n * id=\"123\"\n * config={postsConfig}\n * navigate={navigate}\n * basePath=\"/admin\"\n * />\n * ```\n */\nexport default function FormView({\n\tcollection,\n\tid,\n\tconfig,\n\tviewConfig,\n\tnavigate,\n\tbasePath = \"/admin\",\n\tdefaultValues: defaultValuesProp,\n\tregistry,\n\tallCollectionsConfig,\n\tshowMeta = true,\n\theaderActions,\n\tonSuccess,\n\tonError,\n}: FormViewProps): React.ReactElement {\n\tconst { t } = useTranslation();\n\tconst resolveText = useResolveText();\n\tconst admin = useAdminStore(selectAdmin);\n\tconst { data: adminConfig } = useAdminConfig();\n\tconst isEditMode = !!id;\n\tconst { fields: resolvedFields, schema } = useCollectionFields(collection, {\n\t\tfallbackFields: (config as any)?.fields,\n\t});\n\tconst resolvedFormConfig = React.useMemo(\n\t\t() =>\n\t\t\tviewConfig ??\n\t\t\t(config?.form as any)?.[\"~config\"] ??\n\t\t\t(config?.form as any) ??\n\t\t\t(schema?.admin?.form as any),\n\t\t[viewConfig, config?.form, schema?.admin?.form],\n\t);\n\tconst formConfigBridge = React.useMemo(() => {\n\t\tif (!resolvedFormConfig) return config;\n\n\t\treturn {\n\t\t\t...(config ?? {}),\n\t\t\tform: resolvedFormConfig,\n\t\t};\n\t}, [config, resolvedFormConfig]);\n\n\t// Extract reactive configs from schema for server-side reactive handlers\n\tconst reactiveConfigs = React.useMemo(\n\t\t() => extractReactiveConfigs(schema),\n\t\t[schema],\n\t);\n\n\t// Try to get preview context (will be null if not in LivePreviewMode)\n\tconst previewContext = useLivePreviewContext();\n\n\t// Preview configuration from introspected schema (server-side .preview() config)\n\t// Note: url function cannot be serialized, so we use hasUrlBuilder flag + RPC\n\tconst schemaPreview = schema?.admin?.preview;\n\tconst hasPreview =\n\t\t!!schemaPreview?.hasUrlBuilder && schemaPreview?.enabled !== false;\n\n\t// Check URL for ?preview=true on mount\n\tconst [isLivePreviewOpen, setIsLivePreviewOpen] = React.useState(() => {\n\t\tif (typeof window === \"undefined\") return false;\n\t\tconst params = new URLSearchParams(window.location.search);\n\t\treturn params.get(\"preview\") === \"true\" && hasPreview;\n\t});\n\n\t// Sync preview state with URL\n\tReact.useEffect(() => {\n\t\tif (typeof window === \"undefined\") return;\n\n\t\tconst url = new URL(window.location.href);\n\t\tif (isLivePreviewOpen) {\n\t\t\turl.searchParams.set(\"preview\", \"true\");\n\t\t} else {\n\t\t\turl.searchParams.delete(\"preview\");\n\t\t}\n\n\t\t// Update URL without navigation\n\t\twindow.history.replaceState({}, \"\", url.toString());\n\t}, [isLivePreviewOpen]);\n\n\t// Auto-detect M:N relations that need to be included when fetching\n\tconst withRelations = React.useMemo(\n\t\t() => detectManyToManyRelations({ fields: resolvedFields, schema }),\n\t\t[resolvedFields, schema],\n\t);\n\n\t// Fetch item if in edit mode (include relations if specified)\n\tconst { data: item, isLoading } = useCollectionItem(\n\t\tcollection as any,\n\t\tid ?? \"\",\n\t\thasManyToManyRelations(withRelations)\n\t\t\t? { with: withRelations, localeFallback: false }\n\t\t\t: { localeFallback: false },\n\t\t{ enabled: isEditMode },\n\t);\n\n\t// Document locking - acquire lock when editing, show blocked state if someone else is editing\n\tconst {\n\t\tisBlocked,\n\t\tblockedBy,\n\t\tisOpenElsewhere,\n\t\trefresh: refreshLock,\n\t} = useLock({\n\t\tresourceType: \"collection\",\n\t\tresource: collection,\n\t\tresourceId: id ?? \"\",\n\t\tautoAcquire: isEditMode,\n\t});\n\tconst blockedByUser = blockedBy ? getLockUser(blockedBy) : null;\n\n\t// Transform loaded item - convert relation arrays of objects to arrays of IDs\n\t// Backend returns: { services: [{ id: \"...\", name: \"...\" }] }\n\t// Form needs: { services: [\"id1\", \"id2\"] }\n\tconst transformedItem = React.useMemo(() => {\n\t\tif (!item || !hasManyToManyRelations(withRelations)) return item;\n\n\t\tconst result = { ...item } as any;\n\t\tfor (const key of Object.keys(withRelations)) {\n\t\t\tconst value = result[key];\n\t\t\tif (\n\t\t\t\tArray.isArray(value) &&\n\t\t\t\tvalue.length > 0 &&\n\t\t\t\ttypeof value[0] === \"object\" &&\n\t\t\t\tvalue[0]?.id\n\t\t\t) {\n\t\t\t\t// Transform array of objects to array of IDs\n\t\t\t\tresult[key] = value.map((v: any) => v.id);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}, [item, withRelations]);\n\n\t// Mutations\n\tconst createMutation = useCollectionCreate(collection as any);\n\tconst updateMutation = useCollectionUpdate(collection as any);\n\tconst deleteMutation = useCollectionDelete(collection as any);\n\n\t// Get validation resolver - prefer server validation (AJV with JSON Schema) over client validation\n\tconst clientResolver = useCollectionValidation(collection);\n\tconst resolver = usePreferServerValidation(\n\t\tcollection,\n\t\t{ mode: isEditMode ? \"update\" : \"create\" },\n\t\tclientResolver,\n\t);\n\n\tconst form = useForm({\n\t\tdefaultValues: (transformedItem ?? defaultValuesProp ?? {}) as any,\n\t\tresolver,\n\t});\n\n\t// Autosave state\n\tconst [isSaving, setIsSaving] = React.useState(false);\n\tconst [lastSaved, setLastSaved] = React.useState<Date | null>(null);\n\tconst autoSaveTimerRef = React.useRef<NodeJS.Timeout | null>(null);\n\n\t// Get autosave config from collection config\n\tconst autoSaveConfig = React.useMemo(() => {\n\t\tconst cfg = (config as any)?.autoSave;\n\t\tif (!cfg) return { enabled: false, debounce: 500 };\n\t\treturn {\n\t\t\tenabled: cfg.enabled !== false,\n\t\t\tdebounce: cfg.debounce ?? 500,\n\t\t\tindicator: cfg.indicator !== false,\n\t\t\tpreventNavigation: cfg.preventNavigation !== false,\n\t\t};\n\t}, [config]);\n\n\t// Track content locale changes to warn about unsaved changes\n\t// Uses scoped locale (isolated in ResourceSheet) or global locale\n\tconst {\n\t\tlocale: contentLocale,\n\t\tsetLocale: setContentLocale,\n\t\tisScoped,\n\t} = useScopedLocale();\n\tconst contentLocales = useSafeContentLocales();\n\tconst localeOptions = contentLocales?.locales ?? [];\n\tconst prevLocaleRef = React.useRef(contentLocale);\n\tconst [localeChangeDialog, setLocaleChangeDialog] = React.useState<{\n\t\topen: boolean;\n\t\tpendingLocale: string | null;\n\t}>({ open: false, pendingLocale: null });\n\tconst localeChangeSnapshotRef = React.useRef<Record<string, any> | null>(\n\t\tnull,\n\t);\n\tconst skipItemResetRef = React.useRef(false);\n\n\t// Detect locale change and show confirmation dialog if form is dirty\n\tReact.useEffect(() => {\n\t\tif (!isEditMode) {\n\t\t\tprevLocaleRef.current = contentLocale;\n\t\t\treturn;\n\t\t}\n\t\tif (prevLocaleRef.current !== contentLocale) {\n\t\t\tif (form.formState.isDirty && !localeChangeDialog.open) {\n\t\t\t\t// Store the new locale and revert to previous locale\n\t\t\t\t// The dialog will decide whether to apply or discard\n\t\t\t\tskipItemResetRef.current = true;\n\t\t\t\tlocaleChangeSnapshotRef.current = form.getValues();\n\t\t\t\tsetLocaleChangeDialog({ open: true, pendingLocale: contentLocale });\n\t\t\t\tsetContentLocale(prevLocaleRef.current);\n\t\t\t} else {\n\t\t\t\t// No dirty form, allow locale change\n\t\t\t\tprevLocaleRef.current = contentLocale;\n\t\t\t\tskipItemResetRef.current = false;\n\t\t\t}\n\t\t}\n\t}, [\n\t\tcontentLocale,\n\t\tform.formState.isDirty,\n\t\tform.getValues,\n\t\tsetContentLocale,\n\t\tlocaleChangeDialog.open,\n\t\tisEditMode,\n\t]);\n\n\t// Reset form when item loads\n\tReact.useEffect(() => {\n\t\tif (skipItemResetRef.current) return;\n\t\tif (transformedItem) {\n\t\t\tform.reset(transformedItem as any);\n\t\t} else if (defaultValuesProp) {\n\t\t\tform.reset(defaultValuesProp as any);\n\t\t}\n\t}, [form, transformedItem, defaultValuesProp]);\n\n\t// Handle locale change confirmation\n\tconst handleLocaleChangeConfirm = React.useCallback(() => {\n\t\tskipItemResetRef.current = false;\n\t\tlocaleChangeSnapshotRef.current = null;\n\t\tif (localeChangeDialog.pendingLocale) {\n\t\t\tprevLocaleRef.current = localeChangeDialog.pendingLocale;\n\t\t\tsetContentLocale(localeChangeDialog.pendingLocale);\n\t\t}\n\t\tsetLocaleChangeDialog({ open: false, pendingLocale: null });\n\t}, [localeChangeDialog.pendingLocale, setContentLocale]);\n\n\tconst handleLocaleChangeCancel = React.useCallback(() => {\n\t\tskipItemResetRef.current = false;\n\t\tif (localeChangeSnapshotRef.current) {\n\t\t\tform.reset(localeChangeSnapshotRef.current, {\n\t\t\t\tkeepDirty: true,\n\t\t\t\tkeepDirtyValues: true,\n\t\t\t\tkeepErrors: true,\n\t\t\t\tkeepTouched: true,\n\t\t\t});\n\t\t}\n\t\tlocaleChangeSnapshotRef.current = null;\n\t\tsetLocaleChangeDialog({ open: false, pendingLocale: null });\n\t}, [form]);\n\n\tconst onSubmit = React.useEffectEvent(async (data: any) => {\n\t\tconst savePromise = async () => {\n\t\t\tif (isEditMode) {\n\t\t\t\treturn await updateMutation.mutateAsync({\n\t\t\t\t\tid: id!,\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn await createMutation.mutateAsync(data);\n\t\t\t}\n\t\t};\n\n\t\ttoast.promise(savePromise(), {\n\t\t\tloading: isEditMode ? t(\"toast.saving\") : t(\"toast.creating\"),\n\t\t\tsuccess: (result) => {\n\t\t\t\t// Call onSuccess callback if provided\n\t\t\t\tif (onSuccess) {\n\t\t\t\t\tonSuccess(result);\n\t\t\t\t} else {\n\t\t\t\t\tif (isEditMode) {\n\t\t\t\t\t\tform.reset(result as any);\n\n\t\t\t\t\t\t// Trigger preview refresh after successful save\n\t\t\t\t\t\tif (previewContext) {\n\t\t\t\t\t\t\tpreviewContext.triggerPreviewRefresh();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (result?.id) {\n\t\t\t\t\t\tnavigate(`${basePath}/collections/${collection}/${result.id}`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnavigate(`${basePath}/collections/${collection}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn isEditMode ? t(\"toast.saveSuccess\") : t(\"toast.createSuccess\");\n\t\t\t},\n\t\t\terror: (error) => {\n\t\t\t\t// Handle field-level validation errors from the API\n\t\t\t\tif (\n\t\t\t\t\terror instanceof QuestpieClientError &&\n\t\t\t\t\terror.fieldErrors &&\n\t\t\t\t\terror.fieldErrors.length > 0\n\t\t\t\t) {\n\t\t\t\t\tfor (const fieldError of error.fieldErrors) {\n\t\t\t\t\t\tform.setError(fieldError.path as any, {\n\t\t\t\t\t\t\ttype: \"server\",\n\t\t\t\t\t\t\tmessage: fieldError.message,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn t(\"toast.validationFailed\");\n\t\t\t\t}\n\n\t\t\t\t// Handle generic errors\n\t\t\t\tconst message =\n\t\t\t\t\terror instanceof Error ? error.message : t(\"error.unknown\");\n\t\t\t\tonError?.(error instanceof Error ? error : new Error(message));\n\t\t\t\treturn `${t(\"toast.saveFailed\")}: ${message}`;\n\t\t\t},\n\t\t});\n\t});\n\n\t// Autosave logic - debounced save on form changes\n\tReact.useEffect(() => {\n\t\t// Clear existing timer\n\t\tif (autoSaveTimerRef.current) {\n\t\t\tclearTimeout(autoSaveTimerRef.current);\n\t\t}\n\n\t\t// Don't autosave if:\n\t\t// - Autosave is disabled\n\t\t// - Form is not dirty\n\t\t// - Form is already submitting\n\t\t// - Not in edit mode (don't autosave on create)\n\t\tif (\n\t\t\t!autoSaveConfig.enabled ||\n\t\t\t!form.formState.isDirty ||\n\t\t\tform.formState.isSubmitting ||\n\t\t\t!isEditMode\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Start debounce timer\n\t\tautoSaveTimerRef.current = setTimeout(async () => {\n\t\t\ttry {\n\t\t\t\tsetIsSaving(true);\n\t\t\t\tawait form.handleSubmit(async (data) => {\n\t\t\t\t\t// Silent save (no toast)\n\t\t\t\t\tconst result = await updateMutation.mutateAsync({\n\t\t\t\t\t\tid: id!,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Reset form to mark as not dirty\n\t\t\t\t\tform.reset(result as any);\n\n\t\t\t\t\t// Trigger preview refresh after successful save\n\t\t\t\t\tif (previewContext) {\n\t\t\t\t\t\tpreviewContext.triggerPreviewRefresh();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update last saved timestamp\n\t\t\t\t\tsetLastSaved(new Date());\n\t\t\t\t\tsetIsSaving(false);\n\t\t\t\t})();\n\t\t\t} catch (error) {\n\t\t\t\tsetIsSaving(false);\n\t\t\t\t// Silently fail autosave (user can still manually save)\n\t\t\t\tconsole.error(\"Autosave failed:\", error);\n\t\t\t}\n\t\t}, autoSaveConfig.debounce);\n\n\t\treturn () => {\n\t\t\tif (autoSaveTimerRef.current) {\n\t\t\t\tclearTimeout(autoSaveTimerRef.current);\n\t\t\t}\n\t\t};\n\t}, [\n\t\tform.formState.isDirty,\n\t\tform.formState.isSubmitting,\n\t\tform,\n\t\tautoSaveConfig.enabled,\n\t\tautoSaveConfig.debounce,\n\t\tisEditMode,\n\t\tupdateMutation,\n\t\tresolvedFields,\n\t\tadminConfig?.blocks,\n\t\tid,\n\t\tpreviewContext,\n\t\tadmin,\n\t]);\n\n\t// Prevent navigation when there are unsaved changes\n\tReact.useEffect(() => {\n\t\tif (!autoSaveConfig.preventNavigation || !autoSaveConfig.enabled) return;\n\n\t\tconst handleBeforeUnload = (e: BeforeUnloadEvent) => {\n\t\t\tif (form.formState.isDirty) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.returnValue = \"\";\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener(\"beforeunload\", handleBeforeUnload);\n\t\treturn () => window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n\t}, [\n\t\tform.formState.isDirty,\n\t\tautoSaveConfig.preventNavigation,\n\t\tautoSaveConfig.enabled,\n\t]);\n\n\t// Keyboard shortcut: Cmd+S to save\n\tReact.useEffect(() => {\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif ((e.metaKey || e.ctrlKey) && e.key === \"s\") {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tform.handleSubmit(onSubmit, (errors) => {\n\t\t\t\t\tconsole.warn(\"[FormView] Validation errors:\", errors);\n\t\t\t\t\ttoast.error(t(\"toast.validationFailed\"));\n\t\t\t\t})();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\treturn () => document.removeEventListener(\"keydown\", handleKeyDown);\n\t}, [form, onSubmit]);\n\n\tconst isSubmitting =\n\t\tcreateMutation.isPending ||\n\t\tupdateMutation.isPending ||\n\t\tform.formState.isSubmitting;\n\n\t// ========================================================================\n\t// Form Actions\n\t// ========================================================================\n\n\t// Get form actions from config or use defaults (only for edit mode)\n\tconst configFormActions: FormViewActionsConfig | undefined = (\n\t\tresolvedFormConfig as any\n\t)?.actions;\n\n\t// Use defaults if no actions defined and in edit mode\n\t// In create mode, we don't show duplicate/delete actions\n\tconst formActions: FormViewActionsConfig | undefined = React.useMemo(() => {\n\t\tif (configFormActions) return configFormActions;\n\t\tif (!isEditMode) return { primary: [], secondary: [] };\n\t\treturn getDefaultFormActions();\n\t}, [configFormActions, isEditMode]);\n\n\t// Dialog state for form actions\n\tconst [dialogAction, setDialogAction] =\n\t\tReact.useState<ActionDefinition | null>(null);\n\tconst [confirmAction, setConfirmAction] =\n\t\tReact.useState<ActionDefinition | null>(null);\n\tconst [actionLoading, setActionLoading] = React.useState(false);\n\n\t// Navigation and query client from store/hooks\n\tconst storeNavigate = useAdminStore(selectNavigate);\n\tconst storeBasePath = useAdminStore(selectBasePath);\n\tconst client = useAdminStore(selectClient);\n\tconst queryClient = useQueryClient();\n\n\t// Create query options proxy for key building (same as use-collection hooks)\n\tconst queryOpts = React.useMemo(\n\t\t() =>\n\t\t\tcreateQuestpieQueryOptions(client as any, {\n\t\t\t\tkeyPrefix: QUERY_KEY_PREFIX,\n\t\t\t\tlocale: contentLocale,\n\t\t\t}),\n\t\t[client, contentLocale],\n\t);\n\n\t// Wrapped query client for action context\n\tconst actionQueryClient: ActionQueryClient = React.useMemo(\n\t\t() => ({\n\t\t\tinvalidateQueries: (filters) => queryClient.invalidateQueries(filters),\n\t\t\trefetchQueries: (filters) => queryClient.refetchQueries(filters),\n\t\t\tresetQueries: (filters) => queryClient.resetQueries(filters),\n\t\t}),\n\t\t[queryClient],\n\t);\n\n\t// Action helpers\n\tconst actionHelpers: ActionHelpers = React.useMemo(\n\t\t() => ({\n\t\t\tnavigate: storeNavigate,\n\t\t\ttoast: {\n\t\t\t\tsuccess: toast.success,\n\t\t\t\terror: toast.error,\n\t\t\t\tinfo: toast.info,\n\t\t\t\twarning: toast.warning,\n\t\t\t},\n\t\t\tt,\n\t\t\tinvalidateCollection: async (targetCollection?: string) => {\n\t\t\t\tconst col = targetCollection || collection;\n\t\t\t\t// Invalidate list and count queries for the collection\n\t\t\t\tawait queryClient.invalidateQueries({\n\t\t\t\t\tqueryKey: queryOpts.key([\"collections\", col, \"find\", contentLocale]),\n\t\t\t\t});\n\t\t\t\tawait queryClient.invalidateQueries({\n\t\t\t\t\tqueryKey: queryOpts.key([\"collections\", col, \"count\", contentLocale]),\n\t\t\t\t});\n\t\t\t},\n\t\t\tinvalidateItem: async (itemId: string, targetCollection?: string) => {\n\t\t\t\tconst col = targetCollection || collection;\n\t\t\t\t// Invalidate findOne query for specific item\n\t\t\t\tawait queryClient.invalidateQueries({\n\t\t\t\t\tqueryKey: queryOpts.key([\n\t\t\t\t\t\t\"collections\",\n\t\t\t\t\t\tcol,\n\t\t\t\t\t\t\"findOne\",\n\t\t\t\t\t\tcontentLocale,\n\t\t\t\t\t\t{ id: itemId },\n\t\t\t\t\t]),\n\t\t\t\t});\n\t\t\t\t// Also invalidate list queries since item data changed\n\t\t\t\tawait queryClient.invalidateQueries({\n\t\t\t\t\tqueryKey: queryOpts.key([\"collections\", col, \"find\", contentLocale]),\n\t\t\t\t});\n\t\t\t},\n\t\t\tinvalidateAll: async () => {\n\t\t\t\t// Invalidate all CMS queries\n\t\t\t\tawait queryClient.invalidateQueries({\n\t\t\t\t\tqueryKey: [...QUERY_KEY_PREFIX],\n\t\t\t\t});\n\t\t\t},\n\t\t\trefresh: () => {\n\t\t\t\t// Invalidate current collection queries (better than page reload)\n\t\t\t\tqueryClient.invalidateQueries({\n\t\t\t\t\tqueryKey: queryOpts.key([\n\t\t\t\t\t\t\"collections\",\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\"find\",\n\t\t\t\t\t\tcontentLocale,\n\t\t\t\t\t]),\n\t\t\t\t});\n\t\t\t\tqueryClient.invalidateQueries({\n\t\t\t\t\tqueryKey: queryOpts.key([\n\t\t\t\t\t\t\"collections\",\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\"count\",\n\t\t\t\t\t\tcontentLocale,\n\t\t\t\t\t]),\n\t\t\t\t});\n\t\t\t},\n\t\t\tcloseDialog: () => {\n\t\t\t\tsetDialogAction(null);\n\t\t\t\tsetConfirmAction(null);\n\t\t\t},\n\t\t\tbasePath: storeBasePath || basePath,\n\t\t}),\n\t\t[\n\t\t\tstoreNavigate,\n\t\t\tstoreBasePath,\n\t\t\tbasePath,\n\t\t\tqueryClient,\n\t\t\tqueryOpts,\n\t\t\tcollection,\n\t\t\tcontentLocale,\n\t\t\tt,\n\t\t],\n\t);\n\n\t// Action context for visibility/disabled checks\n\tconst actionContext: ActionContext = React.useMemo(\n\t\t() => ({\n\t\t\titem: transformedItem,\n\t\t\tcollection,\n\t\t\thelpers: actionHelpers,\n\t\t\tqueryClient: actionQueryClient,\n\t\t}),\n\t\t[transformedItem, collection, actionHelpers, actionQueryClient],\n\t);\n\n\t// Filter visible actions\n\tconst filterVisibleActions = React.useCallback(\n\t\t(actions: ActionDefinition[] | undefined) => {\n\t\t\tif (!actions) return [];\n\t\t\treturn actions.filter((action) => {\n\t\t\t\tif (action.visible === undefined) return true;\n\t\t\t\tif (typeof action.visible === \"function\") {\n\t\t\t\t\treturn action.visible(actionContext);\n\t\t\t\t}\n\t\t\t\treturn action.visible;\n\t\t\t});\n\t\t},\n\t\t[actionContext],\n\t);\n\n\tconst visiblePrimaryActions = React.useMemo(\n\t\t() => filterVisibleActions(formActions?.primary),\n\t\t[formActions?.primary, filterVisibleActions],\n\t);\n\n\tconst visibleSecondaryActions = React.useMemo(\n\t\t() => filterVisibleActions(formActions?.secondary),\n\t\t[formActions?.secondary, filterVisibleActions],\n\t);\n\n\t// Group secondary by variant\n\tconst regularSecondary = visibleSecondaryActions.filter(\n\t\t(a) => a.variant !== \"destructive\",\n\t);\n\tconst destructiveSecondary = visibleSecondaryActions.filter(\n\t\t(a) => a.variant === \"destructive\",\n\t);\n\n\t// Execute action\n\tconst executeAction = React.useCallback(\n\t\tasync (action: ActionDefinition) => {\n\t\t\tconst { handler } = action;\n\t\t\tconst actionLabel = resolveText(action.label, action.id);\n\n\t\t\tswitch (handler.type) {\n\t\t\t\tcase \"navigate\": {\n\t\t\t\t\tconst path =\n\t\t\t\t\t\ttypeof handler.path === \"function\"\n\t\t\t\t\t\t\t? handler.path(transformedItem)\n\t\t\t\t\t\t\t: handler.path;\n\t\t\t\t\tstoreNavigate(path);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"api\": {\n\t\t\t\t\t// For DELETE operations, use the deleteMutation hook\n\t\t\t\t\tif (handler.method === \"DELETE\") {\n\t\t\t\t\t\tconst itemId = transformedItem?.id || id;\n\t\t\t\t\t\tif (!itemId) {\n\t\t\t\t\t\t\ttoast.error(t(\"toast.deleteFailed\"));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetActionLoading(true);\n\t\t\t\t\t\ttoast.promise(\n\t\t\t\t\t\t\tdeleteMutation.mutateAsync(itemId).finally(() => {\n\t\t\t\t\t\t\t\tsetActionLoading(false);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tloading: t(\"toast.deleting\"),\n\t\t\t\t\t\t\t\tsuccess: () => {\n\t\t\t\t\t\t\t\t\t// Navigate back to list on delete\n\t\t\t\t\t\t\t\t\tnavigate(`${basePath}/collections/${collection}`);\n\t\t\t\t\t\t\t\t\treturn t(\"toast.deleteSuccess\");\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\terror: (err) => err.message || t(\"toast.deleteFailed\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// For other API operations, make a fetch request\n\t\t\t\t\t\t// (This is a fallback - most actions should use custom handlers)\n\t\t\t\t\t\tconst endpoint = handler.endpoint.replace(\n\t\t\t\t\t\t\t\"{id}\",\n\t\t\t\t\t\t\tString(transformedItem?.id || id),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetActionLoading(true);\n\t\t\t\t\t\tconst apiPromise = async () => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t// Build the URL using CMS API path\n\t\t\t\t\t\t\t\tconst url = `${storeBasePath}/${collection}/${endpoint}`;\n\t\t\t\t\t\t\t\tconst response = await fetch(url, {\n\t\t\t\t\t\t\t\t\tmethod: handler.method || \"POST\",\n\t\t\t\t\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t\t\t\t\t\tbody: handler.body\n\t\t\t\t\t\t\t\t\t\t? JSON.stringify(handler.body(actionContext))\n\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\t\t\t\tconst error = await response.json().catch(() => ({}));\n\t\t\t\t\t\t\t\t\tthrow new Error(error.message || t(\"toast.actionFailed\"));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn response.json();\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tsetActionLoading(false);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\ttoast.promise(apiPromise(), {\n\t\t\t\t\t\t\tloading: `${actionLabel}...`,\n\t\t\t\t\t\t\tsuccess: t(\"toast.actionSuccess\"),\n\t\t\t\t\t\t\terror: (err) => err.message || t(\"toast.actionFailed\"),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"custom\": {\n\t\t\t\t\tconst customPromise = handler.fn(actionContext);\n\t\t\t\t\t// Only use toast.promise if it returns a promise\n\t\t\t\t\tif (customPromise instanceof Promise) {\n\t\t\t\t\t\tsetActionLoading(true);\n\t\t\t\t\t\ttoast.promise(\n\t\t\t\t\t\t\tcustomPromise.finally(() => setActionLoading(false)),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tloading: `${actionLabel}...`,\n\t\t\t\t\t\t\t\tsuccess: t(\"toast.actionSuccess\"),\n\t\t\t\t\t\t\t\terror: (err) => err.message || t(\"toast.actionFailed\"),\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\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetConfirmAction(null);\n\t\t},\n\t\t[\n\t\t\ttransformedItem,\n\t\t\tid,\n\t\t\tactionContext,\n\t\t\tstoreNavigate,\n\t\t\tstoreBasePath,\n\t\t\tdeleteMutation,\n\t\t\tcollection,\n\t\t\tbasePath,\n\t\t\tnavigate,\n\t\t\tt,\n\t\t\tresolveText,\n\t\t],\n\t);\n\n\t// Handle action click\n\tconst handleActionClick = React.useCallback(\n\t\t(action: ActionDefinition) => {\n\t\t\tif (action.confirmation) {\n\t\t\t\tsetConfirmAction(action);\n\t\t\t} else if (\n\t\t\t\taction.handler.type === \"dialog\" ||\n\t\t\t\taction.handler.type === \"form\"\n\t\t\t) {\n\t\t\t\tsetDialogAction(action);\n\t\t\t} else {\n\t\t\t\t// Execute immediately\n\t\t\t\texecuteAction(action);\n\t\t\t}\n\t\t},\n\t\t[executeAction],\n\t);\n\n\t// Handle confirmation\n\tconst handleConfirm = React.useCallback(async () => {\n\t\tif (confirmAction) {\n\t\t\tawait executeAction(confirmAction);\n\t\t}\n\t}, [confirmAction, executeAction]);\n\n\t// Format date helper\n\tconst formatDate = (date: string | Date) => {\n\t\treturn new Date(date).toLocaleDateString(undefined, {\n\t\t\tyear: \"numeric\",\n\t\t\tmonth: \"short\",\n\t\t\tday: \"numeric\",\n\t\t\thour: \"2-digit\",\n\t\t\tminute: \"2-digit\",\n\t\t});\n\t};\n\n\t// Format time ago helper\n\tconst formatTimeAgo = (date: Date) => {\n\t\tconst seconds = Math.floor((Date.now() - date.getTime()) / 1000);\n\t\tif (seconds < 10) return t(\"autosave.justNow\");\n\t\tif (seconds < 60) return t(\"autosave.secondsAgo\", { count: seconds });\n\t\tconst minutes = Math.floor(seconds / 60);\n\t\tif (minutes < 60) return t(\"autosave.minutesAgo\", { count: minutes });\n\t\tconst hours = Math.floor(minutes / 60);\n\t\treturn t(\"autosave.hoursAgo\", { count: hours });\n\t};\n\n\t// Re-render every 10 seconds to update \"time ago\" display\n\tconst [, forceUpdate] = React.useReducer((x) => x + 1, 0);\n\tReact.useEffect(() => {\n\t\tif (!lastSaved || !autoSaveConfig.indicator) return;\n\t\tconst interval = setInterval(forceUpdate, 10000);\n\t\treturn () => clearInterval(interval);\n\t}, [lastSaved, autoSaveConfig.indicator]);\n\n\t// Watch form values for preview updates\n\t// Using useWatch hook (React way) instead of form.watch() method\n\t// This is more performant as it's a proper React subscription\n\tconst watchedValues = useWatch({ control: form.control });\n\n\t// Refresh lock on form activity (debounced) - keeps lock alive while user is editing\n\tconst lockRefreshTimerRef = React.useRef<NodeJS.Timeout | null>(null);\n\tReact.useEffect(() => {\n\t\tif (!isEditMode || isBlocked) return;\n\n\t\t// Debounce lock refresh - only refresh after user stops typing for 1s\n\t\tif (lockRefreshTimerRef.current) {\n\t\t\tclearTimeout(lockRefreshTimerRef.current);\n\t\t}\n\t\tlockRefreshTimerRef.current = setTimeout(() => {\n\t\t\trefreshLock();\n\t\t}, 1000);\n\n\t\treturn () => {\n\t\t\tif (lockRefreshTimerRef.current) {\n\t\t\t\tclearTimeout(lockRefreshTimerRef.current);\n\t\t\t}\n\t\t};\n\t}, [watchedValues, isEditMode, isBlocked, refreshLock]);\n\n\t// Generate preview URL via server RPC (url function runs server-side)\n\t// Must be after useWatch for reactive updates to form values\n\tconst [previewUrl, setPreviewUrl] = React.useState<string | null>(null);\n\n\tReact.useEffect(() => {\n\t\tif (!hasPreview || !client) {\n\t\t\tsetPreviewUrl(null);\n\t\t\treturn;\n\t\t}\n\n\t\t// Debounce the RPC call to avoid too many requests\n\t\tconst timeoutId = setTimeout(async () => {\n\t\t\ttry {\n\t\t\t\tconst formValues = (watchedValues ?? {}) as Record<string, unknown>;\n\t\t\t\t// Type assertion needed - getPreviewUrl is dynamically registered via adminModule\n\t\t\t\tconst rpc = (client as any).rpc;\n\t\t\t\tconst result = await rpc.getPreviewUrl({\n\t\t\t\t\tcollection,\n\t\t\t\t\trecord: formValues,\n\t\t\t\t\tlocale: contentLocale,\n\t\t\t\t});\n\t\t\t\tsetPreviewUrl(result?.url ?? null);\n\t\t\t} catch {\n\t\t\t\tsetPreviewUrl(null);\n\t\t\t}\n\t\t}, 300);\n\n\t\treturn () => clearTimeout(timeoutId);\n\t}, [hasPreview, client, collection, watchedValues, contentLocale]);\n\n\t// Show skeleton until form data is ready (edit mode only)\n\t// This prevents race conditions where form fields render before data is loaded\n\tif (isEditMode && isLoading) {\n\t\treturn <FormViewSkeleton />;\n\t}\n\n\tconst collectionLabel = resolveText(\n\t\t(config as any)?.label ?? schema?.admin?.config?.label,\n\t\tcollection,\n\t);\n\t// In edit mode, show item's _title; in new mode, show \"New {collection}\"\n\tconst title = isEditMode\n\t\t? (item as any)?._title ||\n\t\t\titem?.id ||\n\t\t\tt(\"collection.edit\", { name: collectionLabel })\n\t\t: t(\"collection.new\", { name: collectionLabel });\n\n\t// Form content - extracted for reuse in both layouts\n\tconst formContent = (\n\t\t<>\n\t\t\t{/* Lock banner - show when someone else is editing */}\n\t\t\t{isBlocked && blockedByUser && (\n\t\t\t\t<div className=\"flex items-center gap-3 p-3 mb-4 rounded-lg bg-warning/10 border border-warning/30\">\n\t\t\t\t\t{blockedByUser.image ? (\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={blockedByUser.image}\n\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\tclassName=\"size-8 rounded-full\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"size-8 rounded-full bg-warning/20 flex items-center justify-center\">\n\t\t\t\t\t\t\t<Icon icon=\"ph:user\" className=\"size-4 text-warning\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t\t\t\t<p className=\"text-sm font-medium text-warning\">\n\t\t\t\t\t\t\t{t(\"lock.blockedTitle\", {\n\t\t\t\t\t\t\t\tname: blockedByUser.name ?? blockedByUser.email,\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p className=\"text-xs text-warning/80\">\n\t\t\t\t\t\t\t{t(\"lock.blockedDescription\")}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Icon icon=\"ph:lock-simple\" className=\"size-5 text-warning\" />\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Warning banner - show when same user has document open elsewhere */}\n\t\t\t{isOpenElsewhere && (\n\t\t\t\t<div className=\"flex items-center gap-3 p-3 mb-4 rounded-lg bg-info/10 border border-info/30\">\n\t\t\t\t\t<Icon icon=\"ph:browser\" className=\"size-5 text-info\" />\n\t\t\t\t\t<p className=\"text-sm text-info\">{t(\"lock.openElsewhere\")}</p>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<FormProvider {...form}>\n\t\t\t\t{/* Manage server-side reactive field behaviors (compute, hidden, etc.) */}\n\t\t\t\t<ReactiveFieldsManager\n\t\t\t\t\tcollection={collection}\n\t\t\t\t\treactiveConfigs={reactiveConfigs}\n\t\t\t\t\tenabled={!isBlocked && !isSubmitting}\n\t\t\t\t/>\n\t\t\t\t<form\n\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tif (isBlocked) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\ttoast.error(t(\"lock.cannotSave\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tform.handleSubmit(onSubmit, (errors) => {\n\t\t\t\t\t\t\tconsole.warn(\"[FormView] Validation errors:\", errors);\n\t\t\t\t\t\t\ttoast.error(t(\"toast.validationFailed\"), {\n\t\t\t\t\t\t\t\tdescription: t(\"toast.validationDescription\"),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})(e);\n\t\t\t\t\t}}\n\t\t\t\t\tclassName=\"space-y-4\"\n\t\t\t\t>\n\t\t\t\t\t{/* Header - Title, Meta & Actions */}\n\t\t\t\t\t<div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n\t\t\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-3 flex-wrap\">\n\t\t\t\t\t\t\t\t<h1 className=\"text-2xl md:text-3xl font-extrabold tracking-tight truncate\">\n\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t</h1>\n\t\t\t\t\t\t\t\t{localeOptions.length > 0 && (\n\t\t\t\t\t\t\t\t\t<LocaleSwitcher\n\t\t\t\t\t\t\t\t\t\tlocales={localeOptions}\n\t\t\t\t\t\t\t\t\t\tvalue={contentLocale}\n\t\t\t\t\t\t\t\t\t\tonChange={setContentLocale}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{/* Autosave status indicator */}\n\t\t\t\t\t\t\t\t{autoSaveConfig.indicator &&\n\t\t\t\t\t\t\t\t\tautoSaveConfig.enabled &&\n\t\t\t\t\t\t\t\t\tisEditMode && (\n\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t{isSaving && (\n\t\t\t\t\t\t\t\t\t\t\t\t<Badge variant=\"secondary\" className=\"gap-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ticon=\"ph:spinner-gap\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-3 animate-spin\"\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(\"autosave.saving\")}\n\t\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t{!isSaving && form.formState.isDirty && (\n\t\t\t\t\t\t\t\t\t\t\t\t<Badge variant=\"outline\" className=\"gap-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ticon=\"ph:clock-counter-clockwise\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-3\"\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(\"autosave.unsavedChanges\")}\n\t\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t{!isSaving && !form.formState.isDirty && lastSaved && (\n\t\t\t\t\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"gap-1.5 text-muted-foreground\"\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<Icon icon=\"ph:check\" className=\"size-3\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t{t(\"autosave.saved\")} {formatTimeAgo(lastSaved)}\n\t\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/* Metadata - horizontal scroll on mobile */}\n\t\t\t\t\t\t\t{showMeta && item && (\n\t\t\t\t\t\t\t\t<div className=\"mt-1 overflow-x-auto no-scrollbar\">\n\t\t\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground font-mono flex items-center gap-2 whitespace-nowrap\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"opacity-60\">{t(\"form.id\")}:</span>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"hover:text-foreground transition-colors cursor-pointer\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tnavigator.clipboard.writeText(String(item.id)).then(\n\t\t\t\t\t\t\t\t\t\t\t\t\t() => toast.success(t(\"toast.idCopied\")),\n\t\t\t\t\t\t\t\t\t\t\t\t\t() => toast.error(t(\"toast.copyFailed\")),\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\ttitle={t(\"common.copy\")}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{item.id}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t{item.createdAt && (\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=\"opacity-40\">·</span>\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\t<span className=\"opacity-60\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{t(\"form.created\")}{\" \"}\n\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{formatDate(item.createdAt)}\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</>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{item.updatedAt && (\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=\"opacity-40\">·</span>\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\t<span className=\"opacity-60\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{t(\"form.updated\")}{\" \"}\n\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{formatDate(item.updatedAt)}\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</>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</p>\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\n\t\t\t\t\t\t<div className=\"flex items-center gap-2 shrink-0 w-auto\">\n\t\t\t\t\t\t\t{headerActions}\n\n\t\t\t\t\t\t\t{/* Live Preview button */}\n\t\t\t\t\t\t\t{hasPreview && (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\t\tclassName=\"size-9\"\n\t\t\t\t\t\t\t\t\tonClick={() => setIsLivePreviewOpen(true)}\n\t\t\t\t\t\t\t\t\ttitle={t(\"preview.livePreview\")}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon icon=\"ph:eye\" className=\"size-4\" />\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">{t(\"preview.livePreview\")}</span>\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{/* Primary form actions as buttons */}\n\t\t\t\t\t\t\t{visiblePrimaryActions.map((action) => (\n\t\t\t\t\t\t\t\t<ActionButton\n\t\t\t\t\t\t\t\t\tkey={action.id}\n\t\t\t\t\t\t\t\t\taction={action}\n\t\t\t\t\t\t\t\t\tcollection={collection}\n\t\t\t\t\t\t\t\t\thelpers={actionHelpers}\n\t\t\t\t\t\t\t\t\tonOpenDialog={(a) => setDialogAction(a)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\n\t\t\t\t\t\t\t{/* Save button */}\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\t\tdisabled={isSubmitting || !form.formState.isDirty}\n\t\t\t\t\t\t\t\tclassName=\"gap-2\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isSubmitting ? (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\ticon=\"ph:spinner-gap\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-4 animate-spin\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t{t(\"common.loading\")}\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\t<>\n\t\t\t\t\t\t\t\t\t\t<Icon icon=\"ph:check\" width={16} height={16} />\n\t\t\t\t\t\t\t\t\t\t{t(\"common.save\")}\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</Button>\n\n\t\t\t\t\t\t\t{/* Secondary form actions in dropdown */}\n\t\t\t\t\t\t\t{visibleSecondaryActions.length > 0 && (\n\t\t\t\t\t\t\t\t<DropdownMenu>\n\t\t\t\t\t\t\t\t\t<DropdownMenuTrigger\n\t\t\t\t\t\t\t\t\t\trender={\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\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-9\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Icon icon=\"ph:dots-three-vertical\" className=\"size-4\" />\n\t\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">{t(\"common.moreActions\")}</span>\n\t\t\t\t\t\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t\t\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t\t\t\t\t\t{regularSecondary.map((action) => {\n\t\t\t\t\t\t\t\t\t\t\tconst iconElement = resolveIconElement(action.icon, {\n\t\t\t\t\t\t\t\t\t\t\t\tclassName: \"mr-2 size-4\",\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={action.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleActionClick(action)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={actionLoading}\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{iconElement}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{resolveText(action.label)}\n\t\t\t\t\t\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t})}\n\n\t\t\t\t\t\t\t\t\t\t{regularSecondary.length > 0 &&\n\t\t\t\t\t\t\t\t\t\t\tdestructiveSecondary.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t\t<DropdownMenuSeparator />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t\t{destructiveSecondary.map((action) => {\n\t\t\t\t\t\t\t\t\t\t\tconst iconElement = resolveIconElement(action.icon, {\n\t\t\t\t\t\t\t\t\t\t\t\tclassName: \"mr-2 size-4\",\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={action.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"destructive\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleActionClick(action)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={actionLoading}\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{iconElement}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{resolveText(action.label)}\n\t\t\t\t\t\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t</DropdownMenuContent>\n\t\t\t\t\t\t\t\t</DropdownMenu>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Main Content - Form Fields */}\n\t\t\t\t\t<AutoFormFields\n\t\t\t\t\t\tcollection={collection as any}\n\t\t\t\t\t\tconfig={formConfigBridge}\n\t\t\t\t\t\tregistry={registry}\n\t\t\t\t\t\tallCollectionsConfig={allCollectionsConfig}\n\t\t\t\t\t/>\n\t\t\t\t</form>\n\t\t\t</FormProvider>\n\n\t\t\t{/* Locale Change Confirmation Dialog */}\n\t\t\t<Dialog\n\t\t\t\topen={localeChangeDialog.open}\n\t\t\t\tonOpenChange={(open) => {\n\t\t\t\t\tif (!open) handleLocaleChangeCancel();\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<DialogContent showCloseButton={false}>\n\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t<DialogTitle className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<Icon icon=\"ph:warning-fill\" className=\"size-5 text-warning\" />\n\t\t\t\t\t\t\t{t(\"confirm.localeChange\")}\n\t\t\t\t\t\t</DialogTitle>\n\t\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\t\t{t(\"confirm.localeChangeDescription\")}\n\t\t\t\t\t\t</DialogDescription>\n\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t<DialogFooter>\n\t\t\t\t\t\t<Button variant=\"outline\" onClick={handleLocaleChangeCancel}>\n\t\t\t\t\t\t\t{t(\"confirm.localeChangeStay\")}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button variant=\"destructive\" onClick={handleLocaleChangeConfirm}>\n\t\t\t\t\t\t\t{t(\"confirm.localeChangeDiscard\")}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</DialogFooter>\n\t\t\t\t</DialogContent>\n\t\t\t</Dialog>\n\n\t\t\t{/* Action Confirmation Dialog */}\n\t\t\t{confirmAction?.confirmation && (\n\t\t\t\t<ConfirmationDialog\n\t\t\t\t\topen={!!confirmAction}\n\t\t\t\t\tonOpenChange={(open) => !open && setConfirmAction(null)}\n\t\t\t\t\tconfig={confirmAction.confirmation}\n\t\t\t\t\tonConfirm={handleConfirm}\n\t\t\t\t\tloading={actionLoading}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{/* Action Dialog (for form/dialog handlers) */}\n\t\t\t{dialogAction && (\n\t\t\t\t<ActionDialog\n\t\t\t\t\topen={!!dialogAction}\n\t\t\t\t\tonOpenChange={(open) => !open && setDialogAction(null)}\n\t\t\t\t\taction={dialogAction}\n\t\t\t\t\tcollection={collection}\n\t\t\t\t\titem={transformedItem}\n\t\t\t\t\thelpers={actionHelpers}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"w-full\">{formContent}</div>\n\n\t\t\t{/* Live Preview Mode */}\n\t\t\t{hasPreview && previewUrl && (\n\t\t\t\t<LivePreviewMode\n\t\t\t\t\topen={isLivePreviewOpen}\n\t\t\t\t\tonClose={() => setIsLivePreviewOpen(false)}\n\t\t\t\t\tcollection={collection}\n\t\t\t\t\titemId={id}\n\t\t\t\t\tconfig={config}\n\t\t\t\t\tallCollectionsConfig={allCollectionsConfig}\n\t\t\t\t\tregistry={registry}\n\t\t\t\t\tpreviewUrl={previewUrl}\n\t\t\t\t\tonSuccess={onSuccess}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n}\n"],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import "./auto-form-fields.mjs";
2
- import { ArrayCell, JsonCell, ObjectCell } from "./cells/complex-cells.mjs";
3
- import { BooleanCell, DateCell, DateTimeCell, EmailCell, NumberCell, RichTextCell, SelectCell, TextCell, TimeCell } from "./cells/primitive-cells.mjs";
4
- import { RelationCell } from "./cells/relation-cells.mjs";
5
- import { UploadCell } from "./cells/upload-cells.mjs";
6
- import "./cells/index.mjs";
7
- import "./columns/index.mjs";
8
- import { FormView, FormViewProps, FormViewRegistryConfig } from "./form-view.mjs";
9
- import { TableView, TableViewConfig, TableViewProps } from "./table-view.mjs";
@@ -1,102 +0,0 @@
1
- import { ActionsConfig } from "../../builder/types/action-types.mjs";
2
- import { CollectionBuilderState, ListViewConfig } from "../../builder/types/collection-types.mjs";
3
- import * as React$1 from "react";
4
-
5
- //#region src/client/views/collection/table-view.d.ts
6
-
7
- /**
8
- * Table view configuration from registry.
9
- *
10
- * Re-exports ListViewConfig for type consistency between builder and component.
11
- */
12
- type TableViewConfig = ListViewConfig;
13
- /**
14
- * Props for TableView component
15
- */
16
- interface TableViewProps {
17
- /**
18
- * Collection name
19
- */
20
- collection: string;
21
- /**
22
- * Collection configuration from admin builder
23
- * Accepts CollectionBuilderState or any compatible config object
24
- */
25
- config?: Partial<CollectionBuilderState> | Record<string, any>;
26
- /**
27
- * View-specific configuration from registry
28
- */
29
- viewConfig?: TableViewConfig;
30
- /**
31
- * Navigate function for routing
32
- */
33
- navigate: (path: string) => void;
34
- /**
35
- * Base path for admin routes (e.g., "/admin")
36
- */
37
- basePath?: string;
38
- /**
39
- * Show search functionality
40
- * @default true
41
- */
42
- showSearch?: boolean;
43
- /**
44
- * Show filter functionality
45
- * @default true
46
- */
47
- showFilters?: boolean;
48
- /**
49
- * Show toolbar
50
- * @default true
51
- */
52
- showToolbar?: boolean;
53
- /**
54
- * Enable realtime invalidation for this table.
55
- * Falls back to AdminProvider realtime config when undefined.
56
- */
57
- realtime?: boolean;
58
- /**
59
- * Custom header actions (in addition to configured actions)
60
- * @deprecated Use actions config instead
61
- */
62
- headerActions?: React$1.ReactNode;
63
- /**
64
- * Custom empty state
65
- */
66
- emptyState?: React$1.ReactNode;
67
- /**
68
- * Actions configuration (header, row, bulk)
69
- * If not provided, defaults will be used
70
- */
71
- actionsConfig?: ActionsConfig;
72
- }
73
- /**
74
- * TableView - Default table-based list view for collections
75
- *
76
- * Uses Suspense for data loading to eliminate race conditions.
77
- * Critical data (collectionMeta, user session, preferences) is loaded
78
- * before rendering, ensuring stable initial state.
79
- *
80
- * Features:
81
- * - Auto-generates columns from collection config
82
- * - Search and filter functionality
83
- * - Sortable columns
84
- * - Saved views support
85
- * - Auto-expands upload/relation fields
86
- *
87
- * @example
88
- * ```tsx
89
- * // Used automatically via registry when navigating to /admin/collections/:name
90
- * // Can also be used directly:
91
- * <TableView
92
- * collection="posts"
93
- * config={postsConfig}
94
- * navigate={navigate}
95
- * basePath="/admin"
96
- * />
97
- * ```
98
- */
99
- declare function TableView(props: TableViewProps): React$1.ReactElement;
100
- //#endregion
101
- export { TableView, TableViewConfig, TableViewProps };
102
- //# sourceMappingURL=table-view.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"table-view.d.mts","names":[],"sources":["../../../../src/client/views/collection/table-view.tsx"],"sourcesContent":[],"mappings":";;;;;;;;;;;AAoM8B,KA5FlB,eAAA,GAAkB,cA4FA;AAC7B;;;UAnEgB,cAAA;;;;;;;;;WAUP,QAAQ,0BAA0B;;;;eAK9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAwCG,OAAA,CAAM;;;;eAKT,OAAA,CAAM;;;;;kBAMH;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiCO,SAAA,QAAiB,iBAAiB,OAAA,CAAM"}