@questpie/admin 3.0.3 → 3.0.5

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 (253) hide show
  1. package/README.md +34 -5
  2. package/dist/client/blocks/block-renderer.d.mts +2 -2
  3. package/dist/client/blocks/block-renderer.mjs +4 -1
  4. package/dist/client/builder/types/action-types.d.mts +31 -3
  5. package/dist/client/builder/types/collection-types.d.mts +140 -0
  6. package/dist/client/builder/types/ui-config.d.mts +16 -2
  7. package/dist/client/builder/types/views.d.mts +57 -0
  8. package/dist/client/builder/types/widget-types.d.mts +5 -0
  9. package/dist/client/components/actions/action-button.mjs +137 -199
  10. package/dist/client/components/actions/action-dialog.mjs +198 -156
  11. package/dist/client/components/actions/confirmation-dialog.mjs +2 -2
  12. package/dist/client/components/actions/header-actions.mjs +52 -53
  13. package/dist/client/components/admin-link.d.mts +2 -2
  14. package/dist/client/components/auth/auth-loading.mjs +41 -18
  15. package/dist/client/components/blocks/block-editor-layout.mjs +2 -2
  16. package/dist/client/components/blocks/block-fields-renderer.mjs +64 -28
  17. package/dist/client/components/blocks/block-insert-button.mjs +4 -4
  18. package/dist/client/components/blocks/block-item.mjs +2 -2
  19. package/dist/client/components/blocks/block-library-sidebar.mjs +91 -63
  20. package/dist/client/components/component-renderer.mjs +1 -1
  21. package/dist/client/components/fields/array-field.mjs +14 -14
  22. package/dist/client/components/fields/asset-preview-field.mjs +1 -1
  23. package/dist/client/components/fields/blocks-field/blocks-field.mjs +84 -104
  24. package/dist/client/components/fields/json-field.mjs +2 -2
  25. package/dist/client/components/fields/object-array-field.mjs +22 -22
  26. package/dist/client/components/fields/object-field.mjs +5 -5
  27. package/dist/client/components/fields/relation/displays/cards-display.mjs +16 -9
  28. package/dist/client/components/fields/relation/displays/chips-display.mjs +15 -12
  29. package/dist/client/components/fields/relation/displays/grid-display.mjs +15 -11
  30. package/dist/client/components/fields/relation/displays/list-display.mjs +33 -20
  31. package/dist/client/components/fields/relation/displays/table-display.mjs +62 -93
  32. package/dist/client/components/fields/relation/relation-items-display.mjs +1 -1
  33. package/dist/client/components/fields/relation-picker.mjs +7 -6
  34. package/dist/client/components/fields/relation-select.mjs +71 -47
  35. package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +392 -82
  36. package/dist/client/components/fields/rich-text-editor/extensions.mjs +54 -23
  37. package/dist/client/components/fields/rich-text-editor/image-popover.mjs +24 -50
  38. package/dist/client/components/fields/rich-text-editor/image-upload.mjs +66 -0
  39. package/dist/client/components/fields/rich-text-editor/index.d.mts +38 -0
  40. package/dist/client/components/fields/rich-text-editor/index.mjs +637 -376
  41. package/dist/client/components/fields/rich-text-editor/link-utils.mjs +26 -0
  42. package/dist/client/components/fields/rich-text-editor/presets.d.mts +10 -0
  43. package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +27 -6
  44. package/dist/client/components/fields/rich-text-editor/toolbar.mjs +464 -346
  45. package/dist/client/components/fields/rich-text-editor/types.d.mts +77 -0
  46. package/dist/client/components/fields/upload-field.mjs +45 -49
  47. package/dist/client/components/filter-builder/columns-tab.mjs +69 -62
  48. package/dist/client/components/filter-builder/filter-builder-sheet.mjs +473 -308
  49. package/dist/client/components/filter-builder/filters-tab.mjs +109 -82
  50. package/dist/client/components/filter-builder/saved-views-tab.mjs +300 -198
  51. package/dist/client/components/history-sidebar.mjs +850 -340
  52. package/dist/client/components/layout/field-layout-renderer.mjs +6 -5
  53. package/dist/client/components/locale-switcher.mjs +8 -8
  54. package/dist/client/components/media/media-grid.mjs +106 -86
  55. package/dist/client/components/media/media-picker-dialog.mjs +242 -230
  56. package/dist/client/components/preview/live-preview-mode.mjs +1 -1
  57. package/dist/client/components/primitives/asset-preview.mjs +37 -22
  58. package/dist/client/components/primitives/date-input.mjs +212 -249
  59. package/dist/client/components/primitives/dropzone.mjs +192 -159
  60. package/dist/client/components/primitives/field-select-control.mjs +93 -0
  61. package/dist/client/components/primitives/select-multi.mjs +406 -365
  62. package/dist/client/components/primitives/select-single.mjs +391 -323
  63. package/dist/client/components/primitives/time-input.mjs +2 -2
  64. package/dist/client/components/sheets/resource-sheet.mjs +2 -0
  65. package/dist/client/components/ui/accordion.mjs +4 -4
  66. package/dist/client/components/ui/alert.mjs +3 -3
  67. package/dist/client/components/ui/badge.mjs +4 -4
  68. package/dist/client/components/ui/button.mjs +47 -37
  69. package/dist/client/components/ui/card.mjs +2 -2
  70. package/dist/client/components/ui/checkbox.mjs +1 -1
  71. package/dist/client/components/ui/command.mjs +5 -5
  72. package/dist/client/components/ui/dialog.mjs +3 -3
  73. package/dist/client/components/ui/drawer.mjs +1 -1
  74. package/dist/client/components/ui/dropdown-menu.mjs +157 -15
  75. package/dist/client/components/ui/empty-state.mjs +88 -59
  76. package/dist/client/components/ui/field.mjs +2 -2
  77. package/dist/client/components/ui/input-group.mjs +3 -3
  78. package/dist/client/components/ui/input.mjs +1 -1
  79. package/dist/client/components/ui/kbd.mjs +1 -1
  80. package/dist/client/components/ui/label.mjs +1 -1
  81. package/dist/client/components/ui/popover.mjs +19 -11
  82. package/dist/client/components/ui/scroll-fade.mjs +170 -0
  83. package/dist/client/components/ui/search-input.mjs +1 -1
  84. package/dist/client/components/ui/select.mjs +129 -27
  85. package/dist/client/components/ui/sheet.mjs +54 -34
  86. package/dist/client/components/ui/sidebar.mjs +15 -14
  87. package/dist/client/components/ui/skeleton.mjs +28 -12
  88. package/dist/client/components/ui/switch.mjs +2 -2
  89. package/dist/client/components/ui/table.mjs +82 -74
  90. package/dist/client/components/ui/tabs.mjs +26 -31
  91. package/dist/client/components/ui/textarea.mjs +1 -1
  92. package/dist/client/components/ui/tooltip.mjs +1 -1
  93. package/dist/client/components/widgets/chart-widget.mjs +154 -100
  94. package/dist/client/components/widgets/progress-widget.mjs +63 -36
  95. package/dist/client/components/widgets/quick-actions-widget.mjs +207 -115
  96. package/dist/client/components/widgets/recent-items-widget.mjs +147 -103
  97. package/dist/client/components/widgets/stats-widget.mjs +91 -72
  98. package/dist/client/components/widgets/table-widget.mjs +161 -247
  99. package/dist/client/components/widgets/timeline-widget.mjs +119 -78
  100. package/dist/client/components/widgets/value-widget.mjs +286 -157
  101. package/dist/client/components/widgets/widget-empty-state.mjs +88 -0
  102. package/dist/client/components/widgets/widget-skeletons.mjs +53 -20
  103. package/dist/client/contexts/focus-context.d.mts +2 -2
  104. package/dist/client/hooks/use-action.mjs +63 -55
  105. package/dist/client/hooks/use-audit-history.mjs +1 -65
  106. package/dist/client/hooks/use-collection-validation.mjs +36 -23
  107. package/dist/client/hooks/use-collection.mjs +96 -1
  108. package/dist/client/hooks/use-saved-views.mjs +70 -49
  109. package/dist/client/hooks/use-server-actions.mjs +70 -46
  110. package/dist/client/hooks/use-server-validation.mjs +156 -41
  111. package/dist/client/hooks/use-server-widget-data.mjs +1 -1
  112. package/dist/client/hooks/use-setup-status.d.mts +3 -3
  113. package/dist/client/hooks/use-setup-status.mjs +2 -2
  114. package/dist/client/hooks/use-transition-stage.mjs +2 -10
  115. package/dist/client/hooks/use-validation-error-map.mjs +31 -13
  116. package/dist/client/hooks/use-view-state.mjs +238 -174
  117. package/dist/client/i18n/date-locale.mjs +33 -0
  118. package/dist/client/i18n/hooks.mjs +17 -1
  119. package/dist/client/lib/utils.mjs +3 -2
  120. package/dist/client/preview/block-scope-context.d.mts +2 -2
  121. package/dist/client/preview/preview-banner.d.mts +2 -2
  122. package/dist/client/preview/preview-banner.mjs +75 -46
  123. package/dist/client/preview/preview-field.d.mts +4 -4
  124. package/dist/client/preview/preview-field.mjs +2 -2
  125. package/dist/client/runtime/provider.mjs +8 -1
  126. package/dist/client/runtime/translations-provider.mjs +1 -1
  127. package/dist/client/scope/picker.d.mts +2 -2
  128. package/dist/client/scope/provider.d.mts +2 -2
  129. package/dist/client/styles/base.css +1022 -0
  130. package/dist/client/styles/index.css +3 -589
  131. package/dist/client/utils/auto-expand-fields.mjs +4 -2
  132. package/dist/client/utils/keyboard-shortcuts.mjs +26 -0
  133. package/dist/client/utils/use-lazy-component.mjs +80 -0
  134. package/dist/client/views/auth/accept-invite-form.d.mts +2 -2
  135. package/dist/client/views/auth/auth-layout.d.mts +17 -10
  136. package/dist/client/views/auth/auth-layout.mjs +291 -80
  137. package/dist/client/views/auth/forgot-password-form.d.mts +2 -2
  138. package/dist/client/views/auth/forgot-password-form.mjs +2 -2
  139. package/dist/client/views/auth/login-form.d.mts +2 -2
  140. package/dist/client/views/auth/login-form.mjs +1 -1
  141. package/dist/client/views/auth/reset-password-form.d.mts +2 -2
  142. package/dist/client/views/auth/reset-password-form.mjs +2 -2
  143. package/dist/client/views/auth/setup-form.d.mts +2 -2
  144. package/dist/client/views/collection/auto-form-fields.mjs +11 -9
  145. package/dist/client/views/collection/bulk-action-toolbar.mjs +173 -138
  146. package/dist/client/views/collection/cells/complex-cells.mjs +22 -22
  147. package/dist/client/views/collection/cells/primitive-cells.mjs +1 -1
  148. package/dist/client/views/collection/cells/relation-cells.mjs +147 -129
  149. package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +224 -278
  150. package/dist/client/views/collection/cells/shared/relation-chip.mjs +64 -36
  151. package/dist/client/views/collection/cells/upload-cells.mjs +199 -9
  152. package/dist/client/views/collection/columns/build-columns.mjs +29 -9
  153. package/dist/client/views/collection/columns/column-defaults.mjs +2 -2
  154. package/dist/client/views/collection/field-renderer.mjs +50 -89
  155. package/dist/client/views/collection/form-view.mjs +237 -227
  156. package/dist/client/views/collection/table-view.mjs +1167 -234
  157. package/dist/client/views/collection/view-skeletons.mjs +222 -79
  158. package/dist/client/views/common/global-search.mjs +29 -18
  159. package/dist/client/views/dashboard/dashboard-grid.mjs +678 -501
  160. package/dist/client/views/dashboard/dashboard-widget.mjs +6 -3
  161. package/dist/client/views/dashboard/widget-card.mjs +23 -14
  162. package/dist/client/views/globals/global-form-view.mjs +634 -589
  163. package/dist/client/views/layout/admin-layout-provider.mjs +67 -70
  164. package/dist/client/views/layout/admin-layout.d.mts +3 -6
  165. package/dist/client/views/layout/admin-layout.mjs +152 -155
  166. package/dist/client/views/layout/admin-router.mjs +936 -616
  167. package/dist/client/views/layout/admin-sidebar.d.mts +38 -1
  168. package/dist/client/views/layout/admin-sidebar.mjs +762 -592
  169. package/dist/client/views/layout/admin-theme.d.mts +10 -0
  170. package/dist/client/views/layout/admin-theme.mjs +84 -0
  171. package/dist/client/views/layout/admin-view-layout.mjs +161 -0
  172. package/dist/client/views/pages/accept-invite-page.d.mts +2 -2
  173. package/dist/client/views/pages/accept-invite-page.mjs +49 -26
  174. package/dist/client/views/pages/dashboard-page.d.mts +2 -2
  175. package/dist/client/views/pages/forgot-password-page.d.mts +2 -2
  176. package/dist/client/views/pages/forgot-password-page.mjs +2 -19
  177. package/dist/client/views/pages/invite-page.d.mts +2 -2
  178. package/dist/client/views/pages/invite-page.mjs +2 -19
  179. package/dist/client/views/pages/login-page.d.mts +3 -3
  180. package/dist/client/views/pages/login-page.mjs +4 -21
  181. package/dist/client/views/pages/reset-password-page.d.mts +2 -2
  182. package/dist/client/views/pages/reset-password-page.mjs +3 -20
  183. package/dist/client/views/pages/setup-page.d.mts +2 -2
  184. package/dist/client/views/pages/setup-page.mjs +70 -71
  185. package/dist/client.d.mts +6 -2
  186. package/dist/client.mjs +2 -1
  187. package/dist/components/rich-text/rich-text-renderer.d.mts +2 -2
  188. package/dist/index.d.mts +6 -2
  189. package/dist/index.mjs +2 -1
  190. package/dist/server/augmentation/dashboard.d.mts +67 -3
  191. package/dist/server/augmentation/form-layout.d.mts +21 -0
  192. package/dist/server/augmentation/index.d.mts +1 -1
  193. package/dist/server/codegen/admin-client-template.mjs +4 -0
  194. package/dist/server/fields/blocks.d.mts +1 -1
  195. package/dist/server/fields/blocks.mjs +12 -0
  196. package/dist/server/fields/rich-text.d.mts +1 -1
  197. package/dist/server/fields/rich-text.mjs +8 -0
  198. package/dist/server/i18n/index.mjs +29 -7
  199. package/dist/server/i18n/messages/cs.mjs +414 -1
  200. package/dist/server/i18n/messages/de.mjs +412 -1
  201. package/dist/server/i18n/messages/en.mjs +166 -1
  202. package/dist/server/i18n/messages/es.mjs +412 -1
  203. package/dist/server/i18n/messages/fr.mjs +412 -1
  204. package/dist/server/i18n/messages/pl.mjs +416 -1
  205. package/dist/server/i18n/messages/pt.mjs +409 -1
  206. package/dist/server/i18n/messages/sk.mjs +216 -2
  207. package/dist/server/modules/admin/block/introspection.mjs +4 -1
  208. package/dist/server/modules/admin/block/prefetch.mjs +12 -2
  209. package/dist/server/modules/admin/collections/account.d.mts +2 -2
  210. package/dist/server/modules/admin/collections/admin-locks.d.mts +2 -2
  211. package/dist/server/modules/admin/collections/admin-preferences.d.mts +39 -39
  212. package/dist/server/modules/admin/collections/admin-saved-views.d.mts +47 -47
  213. package/dist/server/modules/admin/collections/apikey.d.mts +42 -42
  214. package/dist/server/modules/admin/collections/assets.d.mts +20 -20
  215. package/dist/server/modules/admin/collections/assets.mjs +0 -1
  216. package/dist/server/modules/admin/collections/session.d.mts +42 -42
  217. package/dist/server/modules/admin/collections/user.d.mts +40 -28
  218. package/dist/server/modules/admin/collections/user.mjs +40 -9
  219. package/dist/server/modules/admin/collections/verification.d.mts +36 -36
  220. package/dist/server/modules/admin/dto/admin-config.dto.mjs +2 -0
  221. package/dist/server/modules/admin/factories.mjs +7 -18
  222. package/dist/server/modules/admin/index.d.mts +1 -1
  223. package/dist/server/modules/admin/routes/admin-config.d.mts +2 -2
  224. package/dist/server/modules/admin/routes/admin-config.mjs +34 -16
  225. package/dist/server/modules/admin/routes/execute-action.d.mts +9 -9
  226. package/dist/server/modules/admin/routes/execute-action.mjs +67 -28
  227. package/dist/server/modules/admin/routes/i18n-helpers.mjs +34 -0
  228. package/dist/server/modules/admin/routes/locales.d.mts +2 -2
  229. package/dist/server/modules/admin/routes/preview.mjs +25 -17
  230. package/dist/server/modules/admin/routes/reactive.d.mts +9 -9
  231. package/dist/server/modules/admin/routes/route-helpers.mjs +1 -1
  232. package/dist/server/modules/admin/routes/setup.d.mts +10 -10
  233. package/dist/server/modules/admin/routes/setup.mjs +16 -13
  234. package/dist/server/modules/admin/routes/translations.d.mts +4 -4
  235. package/dist/server/modules/admin/routes/translations.mjs +5 -1
  236. package/dist/server/modules/admin-preferences/collections/admin-preferences.mjs +1 -1
  237. package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +2 -2
  238. package/dist/server/modules/audit/.generated/module.d.mts +1 -1
  239. package/dist/server/modules/audit/.generated/module.mjs +1 -1
  240. package/dist/server/modules/audit/collections/audit-log.d.mts +2 -2
  241. package/dist/server/modules/audit/collections/audit-log.mjs +1 -1
  242. package/dist/server/modules/audit/config/app.mjs +99 -42
  243. package/dist/server/modules/audit/jobs/audit-cleanup.mjs +1 -1
  244. package/dist/server/plugin.mjs +4 -2
  245. package/dist/server/proxy-factories.d.mts +4 -3
  246. package/dist/server/proxy-factories.mjs +34 -8
  247. package/dist/shared/types/saved-views.types.d.mts +2 -0
  248. package/package.json +6 -4
  249. package/dist/client/components/fields/rich-text-editor/link-popover.mjs +0 -85
  250. package/dist/client/components/ui/spinner.mjs +0 -52
  251. package/dist/client/components/ui/toolbar.mjs +0 -136
  252. package/dist/client/contexts/breadcrumb-context.mjs +0 -60
  253. package/dist/client/views/layout/admin-topbar.mjs +0 -236
@@ -9,39 +9,49 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
9
9
  * Note: This hook requires the `adminModule` to be used in your app setup.
10
10
  * If admin_saved_views collection is not available, returns empty array.
11
11
  */
12
- function useSavedViews(collectionName) {
13
- const $ = c(9);
12
+ function useSavedViews(collectionName, userId) {
13
+ const $ = c(11);
14
14
  const client = useAdminStore(_temp);
15
15
  let t0;
16
- if ($[0] !== collectionName) {
17
- t0 = ["admin_saved_views", collectionName];
16
+ if ($[0] !== collectionName || $[1] !== userId) {
17
+ t0 = [
18
+ "admin_saved_views",
19
+ collectionName,
20
+ userId
21
+ ];
18
22
  $[0] = collectionName;
19
- $[1] = t0;
20
- } else t0 = $[1];
23
+ $[1] = userId;
24
+ $[2] = t0;
25
+ } else t0 = $[2];
21
26
  let t1;
22
- if ($[2] !== client?.collections || $[3] !== collectionName) {
27
+ if ($[3] !== client?.collections || $[4] !== collectionName || $[5] !== userId) {
23
28
  t1 = async () => {
24
29
  const collections = client?.collections;
25
30
  if (!collections?.admin_saved_views) return { docs: [] };
26
- return { docs: (await collections.admin_saved_views.find({ where: { collectionName } }))?.docs ?? [] };
31
+ const where = userId ? {
32
+ collectionName,
33
+ userId
34
+ } : { collectionName };
35
+ return { docs: (await collections.admin_saved_views.find({ where }))?.docs ?? [] };
27
36
  };
28
- $[2] = client?.collections;
29
- $[3] = collectionName;
30
- $[4] = t1;
31
- } else t1 = $[4];
37
+ $[3] = client?.collections;
38
+ $[4] = collectionName;
39
+ $[5] = userId;
40
+ $[6] = t1;
41
+ } else t1 = $[6];
32
42
  const t2 = !!client;
33
43
  let t3;
34
- if ($[5] !== t0 || $[6] !== t1 || $[7] !== t2) {
44
+ if ($[7] !== t0 || $[8] !== t1 || $[9] !== t2) {
35
45
  t3 = {
36
46
  queryKey: t0,
37
47
  queryFn: t1,
38
48
  enabled: t2
39
49
  };
40
- $[5] = t0;
41
- $[6] = t1;
42
- $[7] = t2;
43
- $[8] = t3;
44
- } else t3 = $[8];
50
+ $[7] = t0;
51
+ $[8] = t1;
52
+ $[9] = t2;
53
+ $[10] = t3;
54
+ } else t3 = $[10];
45
55
  return useQuery(t3);
46
56
  }
47
57
  /**
@@ -50,56 +60,62 @@ function useSavedViews(collectionName) {
50
60
  function _temp(s) {
51
61
  return s.client;
52
62
  }
53
- function useSaveView(collectionName) {
54
- const $ = c(9);
63
+ function useSaveView(collectionName, userId) {
64
+ const $ = c(11);
55
65
  const client = useAdminStore(_temp2);
56
66
  const queryClient = useQueryClient();
57
67
  let t0;
58
- if ($[0] !== client?.collections || $[1] !== collectionName) {
68
+ if ($[0] !== client?.collections || $[1] !== collectionName || $[2] !== userId) {
59
69
  t0 = async (data) => {
60
70
  const collections = client?.collections;
61
71
  if (!collections?.admin_saved_views) throw new Error("admin_saved_views collection not available. Make sure to use the adminModule in your app setup.");
62
72
  return collections.admin_saved_views.create({
63
73
  ...data,
64
74
  collectionName,
65
- userId: data.userId || "anonymous",
75
+ userId: data.userId || userId || "anonymous",
66
76
  isDefault: false
67
77
  });
68
78
  };
69
79
  $[0] = client?.collections;
70
80
  $[1] = collectionName;
71
- $[2] = t0;
72
- } else t0 = $[2];
81
+ $[2] = userId;
82
+ $[3] = t0;
83
+ } else t0 = $[3];
73
84
  let t1;
74
- if ($[3] !== collectionName || $[4] !== queryClient) {
85
+ if ($[4] !== collectionName || $[5] !== queryClient || $[6] !== userId) {
75
86
  t1 = () => {
76
- queryClient.invalidateQueries({ queryKey: ["admin_saved_views", collectionName] });
87
+ queryClient.invalidateQueries({ queryKey: [
88
+ "admin_saved_views",
89
+ collectionName,
90
+ userId
91
+ ] });
77
92
  };
78
- $[3] = collectionName;
79
- $[4] = queryClient;
80
- $[5] = t1;
81
- } else t1 = $[5];
93
+ $[4] = collectionName;
94
+ $[5] = queryClient;
95
+ $[6] = userId;
96
+ $[7] = t1;
97
+ } else t1 = $[7];
82
98
  let t2;
83
- if ($[6] !== t0 || $[7] !== t1) {
99
+ if ($[8] !== t0 || $[9] !== t1) {
84
100
  t2 = {
85
101
  mutationFn: t0,
86
102
  onSuccess: t1
87
103
  };
88
- $[6] = t0;
89
- $[7] = t1;
90
- $[8] = t2;
91
- } else t2 = $[8];
104
+ $[8] = t0;
105
+ $[9] = t1;
106
+ $[10] = t2;
107
+ } else t2 = $[10];
92
108
  return useMutation(t2);
93
109
  }
94
110
  /**
95
- * Hook to update an existing view
111
+ * Hook to delete a view
96
112
  */
97
113
  function _temp2(s) {
98
114
  return s.client;
99
115
  }
100
- function useDeleteSavedView(collectionName) {
101
- const $ = c(8);
102
- const client = useAdminStore(_temp4);
116
+ function useDeleteSavedView(collectionName, userId) {
117
+ const $ = c(9);
118
+ const client = useAdminStore(_temp3);
103
119
  const queryClient = useQueryClient();
104
120
  let t0;
105
121
  if ($[0] !== client?.collections) {
@@ -112,27 +128,32 @@ function useDeleteSavedView(collectionName) {
112
128
  $[1] = t0;
113
129
  } else t0 = $[1];
114
130
  let t1;
115
- if ($[2] !== collectionName || $[3] !== queryClient) {
131
+ if ($[2] !== collectionName || $[3] !== queryClient || $[4] !== userId) {
116
132
  t1 = () => {
117
- queryClient.invalidateQueries({ queryKey: ["admin_saved_views", collectionName] });
133
+ queryClient.invalidateQueries({ queryKey: [
134
+ "admin_saved_views",
135
+ collectionName,
136
+ userId
137
+ ] });
118
138
  };
119
139
  $[2] = collectionName;
120
140
  $[3] = queryClient;
121
- $[4] = t1;
122
- } else t1 = $[4];
141
+ $[4] = userId;
142
+ $[5] = t1;
143
+ } else t1 = $[5];
123
144
  let t2;
124
- if ($[5] !== t0 || $[6] !== t1) {
145
+ if ($[6] !== t0 || $[7] !== t1) {
125
146
  t2 = {
126
147
  mutationFn: t0,
127
148
  onSuccess: t1
128
149
  };
129
- $[5] = t0;
130
- $[6] = t1;
131
- $[7] = t2;
132
- } else t2 = $[7];
150
+ $[6] = t0;
151
+ $[7] = t1;
152
+ $[8] = t2;
153
+ } else t2 = $[8];
133
154
  return useMutation(t2);
134
155
  }
135
- function _temp4(s) {
156
+ function _temp3(s) {
136
157
  return s.client;
137
158
  }
138
159
 
@@ -1,6 +1,8 @@
1
1
  "use client";
2
2
 
3
+ import { useTranslation } from "../i18n/hooks.mjs";
3
4
  import { selectAdmin, selectClient, useAdminStore } from "../runtime/provider.mjs";
5
+ import { configureField } from "../builder/field/field.mjs";
4
6
  import { useCollectionSchema } from "./use-collection-schema.mjs";
5
7
  import { c } from "react/compiler-runtime";
6
8
 
@@ -12,10 +14,10 @@ import { c } from "react/compiler-runtime";
12
14
  * Server actions have their handlers stripped during serialization; this hook
13
15
  * creates client-side wrappers that execute actions via the server API.
14
16
  */
15
- function getActionErrorMessage(response) {
17
+ function getActionErrorMessage(response, t) {
16
18
  if (response.error) return response.error;
17
19
  if (response.result?.toast?.message) return response.result.toast.message;
18
- return "Action execution failed";
20
+ return t("action.executionFailed");
19
21
  }
20
22
  async function applyServerActionEffects(result, ctx) {
21
23
  if (!result) return;
@@ -28,28 +30,32 @@ function buildServerFormFields(rawFields, fieldRegistry) {
28
30
  if (!rawFields || !fieldRegistry) return {};
29
31
  const result = {};
30
32
  for (const [fieldName, fieldConfig] of Object.entries(rawFields)) {
31
- const fc = fieldConfig;
32
- if (fieldConfig && typeof fieldConfig === "object" && "name" in fieldConfig && "field" in fieldConfig && "~options" in fieldConfig) {
33
+ if (!fieldConfig || typeof fieldConfig !== "object") continue;
34
+ if ("name" in fieldConfig && "component" in fieldConfig && "~options" in fieldConfig) {
33
35
  result[fieldName] = fieldConfig;
34
36
  continue;
35
37
  }
38
+ const fc = fieldConfig;
36
39
  const fieldBuilder = fieldRegistry[typeof fc.type === "string" && fc.type.length > 0 ? fc.type : "text"] ?? fieldRegistry.text ?? null;
37
- if (!fieldBuilder || typeof fieldBuilder.$options !== "function") continue;
38
- const options = {
39
- label: fc.label,
40
- description: fc.description,
41
- required: fc.required,
42
- defaultValue: fc.default
43
- };
44
- if (fc.options && typeof fc.options === "object") Object.assign(options, fc.options);
45
- result[fieldName] = fieldBuilder.$options(options);
40
+ if (!fieldBuilder) continue;
41
+ const options = { ...fc };
42
+ delete options.type;
43
+ delete options.options;
44
+ delete options.admin;
45
+ delete options.default;
46
+ if (fc.default !== void 0) options.defaultValue = fc.default;
47
+ else if (fc.defaultValue !== void 0) options.defaultValue = fc.defaultValue;
48
+ if (Array.isArray(fc.options)) options.options = fc.options;
49
+ else if (fc.options && typeof fc.options === "object") Object.assign(options, fc.options);
50
+ if (fc.admin && typeof fc.admin === "object") Object.assign(options, fc.admin);
51
+ result[fieldName] = configureField(fieldBuilder, options);
46
52
  }
47
53
  return result;
48
54
  }
49
55
  /**
50
56
  * Map a server action definition (from collection schema) to a client ActionDefinition
51
57
  */
52
- function mapServerAction(serverAction, collection, fieldRegistry, client) {
58
+ function mapServerAction(serverAction, collection, fieldRegistry, client, locale, t) {
53
59
  const action = {
54
60
  id: serverAction.id,
55
61
  label: serverAction.label,
@@ -86,7 +92,7 @@ function mapServerAction(serverAction, collection, fieldRegistry, client) {
86
92
  width: form.width,
87
93
  onSubmit: async (data, ctx) => {
88
94
  const routes = client?.routes;
89
- if (!routes?.executeAction) throw new Error("executeAction route is not available");
95
+ if (!routes?.executeAction) throw new Error(t("error.serverActionFailed"));
90
96
  const itemId = ctx.item && !Array.isArray(ctx.item) ? ctx.item.id : void 0;
91
97
  const idsFromItems = Array.isArray(ctx.items) ? ctx.items.map((it) => it?.id).filter(Boolean) : [];
92
98
  const idsFromItemArray = Array.isArray(ctx.item) ? ctx.item.map((it) => it?.id).filter(Boolean) : [];
@@ -96,9 +102,10 @@ function mapServerAction(serverAction, collection, fieldRegistry, client) {
96
102
  actionId: serverAction.id,
97
103
  itemId,
98
104
  itemIds,
99
- data
105
+ data,
106
+ locale
100
107
  });
101
- if (!response.success || response.result?.type === "error") throw new Error(getActionErrorMessage(response));
108
+ if (!response.success || response.result?.type === "error") throw new Error(getActionErrorMessage(response, t));
102
109
  await applyServerActionEffects(response.result, ctx);
103
110
  }
104
111
  }
@@ -117,48 +124,60 @@ function mapServerAction(serverAction, collection, fieldRegistry, client) {
117
124
  * ```
118
125
  */
119
126
  function useServerActions(t0) {
120
- const $ = c(9);
121
- const { collection } = t0;
127
+ const $ = c(13);
128
+ const { collection, schema: schemaOverride } = t0;
122
129
  const admin = useAdminStore(selectAdmin);
123
130
  const client = useAdminStore(selectClient);
124
- const { data: schema, isPending } = useCollectionSchema(collection);
131
+ const { t, locale } = useTranslation();
132
+ const t1 = !schemaOverride;
133
+ let t2;
134
+ if ($[0] !== t1) {
135
+ t2 = { enabled: t1 };
136
+ $[0] = t1;
137
+ $[1] = t2;
138
+ } else t2 = $[1];
139
+ const { data: queriedSchema, isPending: isSchemaPending } = useCollectionSchema(collection, t2);
140
+ const schema = schemaOverride ?? queriedSchema;
141
+ const isPending = schemaOverride ? false : isSchemaPending;
125
142
  schema?.admin?.actions;
126
- let t1;
143
+ let t3;
127
144
  bb0: {
128
145
  const actionsConfig = schema?.admin?.actions;
129
146
  if (!actionsConfig?.custom?.length) {
130
- let t2$2;
131
- if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
132
- t2$2 = [];
133
- $[0] = t2$2;
134
- } else t2$2 = $[0];
135
- t1 = t2$2;
147
+ let t4$2;
148
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
149
+ t4$2 = [];
150
+ $[2] = t4$2;
151
+ } else t4$2 = $[2];
152
+ t3 = t4$2;
136
153
  break bb0;
137
154
  }
138
- let t2$1;
139
- if ($[1] !== actionsConfig.custom || $[2] !== admin || $[3] !== client || $[4] !== collection) {
155
+ let t4$1;
156
+ if ($[3] !== actionsConfig.custom || $[4] !== admin || $[5] !== client || $[6] !== collection || $[7] !== locale || $[8] !== t) {
140
157
  const fieldRegistry = admin?.getFields?.() ?? null;
141
- t2$1 = actionsConfig.custom.map((serverAction) => mapServerAction(serverAction, collection, fieldRegistry, client));
142
- $[1] = actionsConfig.custom;
143
- $[2] = admin;
144
- $[3] = client;
145
- $[4] = collection;
146
- $[5] = t2$1;
147
- } else t2$1 = $[5];
148
- t1 = t2$1;
158
+ t4$1 = actionsConfig.custom.map((serverAction) => mapServerAction(serverAction, collection, fieldRegistry, client, locale, t));
159
+ $[3] = actionsConfig.custom;
160
+ $[4] = admin;
161
+ $[5] = client;
162
+ $[6] = collection;
163
+ $[7] = locale;
164
+ $[8] = t;
165
+ $[9] = t4$1;
166
+ } else t4$1 = $[9];
167
+ t3 = t4$1;
149
168
  }
150
- const serverActions = t1;
151
- let t2;
152
- if ($[6] !== isPending || $[7] !== serverActions) {
153
- t2 = {
169
+ const serverActions = t3;
170
+ let t4;
171
+ if ($[10] !== isPending || $[11] !== serverActions) {
172
+ t4 = {
154
173
  serverActions,
155
174
  isLoading: isPending
156
175
  };
157
- $[6] = isPending;
158
- $[7] = serverActions;
159
- $[8] = t2;
160
- } else t2 = $[8];
161
- return t2;
176
+ $[10] = isPending;
177
+ $[11] = serverActions;
178
+ $[12] = t4;
179
+ } else t4 = $[12];
180
+ return t4;
162
181
  }
163
182
  /**
164
183
  * Merge server actions with local actions config.
@@ -168,11 +187,15 @@ function mergeServerActions(localActions, serverActions) {
168
187
  if (!serverActions.length) return localActions;
169
188
  const headerActions = [...localActions.header?.primary ?? []];
170
189
  const headerSecondary = [...localActions.header?.secondary ?? []];
190
+ const rowActions = [...localActions.row ?? []];
171
191
  const bulkActions = [...localActions.bulk ?? []];
172
192
  for (const action of serverActions) switch (action.scope) {
173
193
  case "bulk":
174
194
  bulkActions.push(action);
175
195
  break;
196
+ case "row":
197
+ rowActions.push(action);
198
+ break;
176
199
  case "header":
177
200
  headerActions.push(action);
178
201
  break;
@@ -183,6 +206,7 @@ function mergeServerActions(localActions, serverActions) {
183
206
  primary: headerActions,
184
207
  secondary: headerSecondary
185
208
  },
209
+ row: rowActions,
186
210
  bulk: bulkActions
187
211
  };
188
212
  }