@questpie/admin 3.0.3 → 3.0.4

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 (249) 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-fields-renderer.mjs +64 -28
  16. package/dist/client/components/blocks/block-insert-button.mjs +4 -4
  17. package/dist/client/components/blocks/block-item.mjs +2 -2
  18. package/dist/client/components/blocks/block-library-sidebar.mjs +2 -2
  19. package/dist/client/components/component-renderer.mjs +1 -1
  20. package/dist/client/components/fields/array-field.mjs +14 -14
  21. package/dist/client/components/fields/asset-preview-field.mjs +1 -1
  22. package/dist/client/components/fields/blocks-field/blocks-field.mjs +84 -104
  23. package/dist/client/components/fields/json-field.mjs +2 -2
  24. package/dist/client/components/fields/object-array-field.mjs +22 -22
  25. package/dist/client/components/fields/object-field.mjs +5 -5
  26. package/dist/client/components/fields/relation/displays/cards-display.mjs +16 -9
  27. package/dist/client/components/fields/relation/displays/chips-display.mjs +15 -12
  28. package/dist/client/components/fields/relation/displays/grid-display.mjs +15 -11
  29. package/dist/client/components/fields/relation/displays/list-display.mjs +33 -20
  30. package/dist/client/components/fields/relation/displays/table-display.mjs +62 -93
  31. package/dist/client/components/fields/relation/relation-items-display.mjs +1 -1
  32. package/dist/client/components/fields/relation-picker.mjs +7 -6
  33. package/dist/client/components/fields/relation-select.mjs +71 -47
  34. package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +392 -82
  35. package/dist/client/components/fields/rich-text-editor/extensions.mjs +54 -23
  36. package/dist/client/components/fields/rich-text-editor/image-popover.mjs +24 -50
  37. package/dist/client/components/fields/rich-text-editor/image-upload.mjs +66 -0
  38. package/dist/client/components/fields/rich-text-editor/index.d.mts +38 -0
  39. package/dist/client/components/fields/rich-text-editor/index.mjs +637 -376
  40. package/dist/client/components/fields/rich-text-editor/link-utils.mjs +26 -0
  41. package/dist/client/components/fields/rich-text-editor/presets.d.mts +10 -0
  42. package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +27 -6
  43. package/dist/client/components/fields/rich-text-editor/toolbar.mjs +464 -346
  44. package/dist/client/components/fields/rich-text-editor/types.d.mts +77 -0
  45. package/dist/client/components/fields/upload-field.mjs +45 -49
  46. package/dist/client/components/filter-builder/columns-tab.mjs +69 -62
  47. package/dist/client/components/filter-builder/filter-builder-sheet.mjs +473 -308
  48. package/dist/client/components/filter-builder/filters-tab.mjs +109 -82
  49. package/dist/client/components/filter-builder/saved-views-tab.mjs +300 -198
  50. package/dist/client/components/history-sidebar.mjs +850 -340
  51. package/dist/client/components/layout/field-layout-renderer.mjs +6 -5
  52. package/dist/client/components/locale-switcher.mjs +8 -8
  53. package/dist/client/components/media/media-grid.mjs +12 -9
  54. package/dist/client/components/media/media-picker-dialog.mjs +242 -230
  55. package/dist/client/components/preview/live-preview-mode.mjs +1 -1
  56. package/dist/client/components/primitives/asset-preview.mjs +37 -22
  57. package/dist/client/components/primitives/date-input.mjs +212 -249
  58. package/dist/client/components/primitives/dropzone.mjs +192 -159
  59. package/dist/client/components/primitives/field-select-control.mjs +93 -0
  60. package/dist/client/components/primitives/select-multi.mjs +251 -230
  61. package/dist/client/components/primitives/select-single.mjs +345 -290
  62. package/dist/client/components/primitives/time-input.mjs +2 -2
  63. package/dist/client/components/sheets/resource-sheet.mjs +2 -0
  64. package/dist/client/components/ui/accordion.mjs +4 -4
  65. package/dist/client/components/ui/alert.mjs +3 -3
  66. package/dist/client/components/ui/badge.mjs +4 -4
  67. package/dist/client/components/ui/button.mjs +47 -37
  68. package/dist/client/components/ui/card.mjs +2 -2
  69. package/dist/client/components/ui/checkbox.mjs +1 -1
  70. package/dist/client/components/ui/command.mjs +5 -5
  71. package/dist/client/components/ui/dialog.mjs +3 -3
  72. package/dist/client/components/ui/drawer.mjs +1 -1
  73. package/dist/client/components/ui/dropdown-menu.mjs +157 -15
  74. package/dist/client/components/ui/empty-state.mjs +88 -59
  75. package/dist/client/components/ui/field.mjs +2 -2
  76. package/dist/client/components/ui/input-group.mjs +3 -3
  77. package/dist/client/components/ui/input.mjs +1 -1
  78. package/dist/client/components/ui/kbd.mjs +1 -1
  79. package/dist/client/components/ui/label.mjs +1 -1
  80. package/dist/client/components/ui/popover.mjs +19 -11
  81. package/dist/client/components/ui/scroll-fade.mjs +170 -0
  82. package/dist/client/components/ui/search-input.mjs +1 -1
  83. package/dist/client/components/ui/select.mjs +129 -27
  84. package/dist/client/components/ui/sheet.mjs +54 -34
  85. package/dist/client/components/ui/sidebar.mjs +15 -14
  86. package/dist/client/components/ui/skeleton.mjs +28 -12
  87. package/dist/client/components/ui/switch.mjs +2 -2
  88. package/dist/client/components/ui/table.mjs +82 -74
  89. package/dist/client/components/ui/tabs.mjs +26 -31
  90. package/dist/client/components/ui/textarea.mjs +1 -1
  91. package/dist/client/components/ui/tooltip.mjs +1 -1
  92. package/dist/client/components/widgets/chart-widget.mjs +134 -96
  93. package/dist/client/components/widgets/progress-widget.mjs +59 -34
  94. package/dist/client/components/widgets/quick-actions-widget.mjs +184 -113
  95. package/dist/client/components/widgets/recent-items-widget.mjs +144 -102
  96. package/dist/client/components/widgets/stats-widget.mjs +91 -72
  97. package/dist/client/components/widgets/table-widget.mjs +159 -246
  98. package/dist/client/components/widgets/timeline-widget.mjs +66 -43
  99. package/dist/client/components/widgets/value-widget.mjs +261 -152
  100. package/dist/client/components/widgets/widget-empty-state.mjs +88 -0
  101. package/dist/client/components/widgets/widget-skeletons.mjs +53 -20
  102. package/dist/client/contexts/focus-context.d.mts +2 -2
  103. package/dist/client/hooks/use-action.mjs +63 -55
  104. package/dist/client/hooks/use-audit-history.mjs +1 -65
  105. package/dist/client/hooks/use-collection-validation.mjs +36 -23
  106. package/dist/client/hooks/use-collection.mjs +96 -1
  107. package/dist/client/hooks/use-saved-views.mjs +70 -49
  108. package/dist/client/hooks/use-server-actions.mjs +59 -40
  109. package/dist/client/hooks/use-server-validation.mjs +156 -41
  110. package/dist/client/hooks/use-server-widget-data.mjs +1 -1
  111. package/dist/client/hooks/use-setup-status.d.mts +3 -3
  112. package/dist/client/hooks/use-setup-status.mjs +2 -2
  113. package/dist/client/hooks/use-transition-stage.mjs +2 -10
  114. package/dist/client/hooks/use-validation-error-map.mjs +31 -13
  115. package/dist/client/hooks/use-view-state.mjs +238 -174
  116. package/dist/client/i18n/date-locale.mjs +33 -0
  117. package/dist/client/i18n/hooks.mjs +17 -1
  118. package/dist/client/lib/utils.mjs +3 -2
  119. package/dist/client/preview/block-scope-context.d.mts +2 -2
  120. package/dist/client/preview/preview-banner.d.mts +2 -2
  121. package/dist/client/preview/preview-field.d.mts +4 -4
  122. package/dist/client/preview/preview-field.mjs +2 -2
  123. package/dist/client/runtime/provider.mjs +8 -1
  124. package/dist/client/runtime/translations-provider.mjs +1 -1
  125. package/dist/client/scope/picker.d.mts +2 -2
  126. package/dist/client/scope/provider.d.mts +2 -2
  127. package/dist/client/styles/base.css +1022 -0
  128. package/dist/client/styles/index.css +3 -589
  129. package/dist/client/utils/auto-expand-fields.mjs +4 -2
  130. package/dist/client/utils/keyboard-shortcuts.mjs +26 -0
  131. package/dist/client/utils/use-lazy-component.mjs +80 -0
  132. package/dist/client/views/auth/auth-layout.d.mts +18 -11
  133. package/dist/client/views/auth/auth-layout.mjs +291 -80
  134. package/dist/client/views/auth/forgot-password-form.d.mts +2 -2
  135. package/dist/client/views/auth/forgot-password-form.mjs +2 -2
  136. package/dist/client/views/auth/login-form.d.mts +2 -2
  137. package/dist/client/views/auth/login-form.mjs +1 -1
  138. package/dist/client/views/auth/reset-password-form.d.mts +2 -2
  139. package/dist/client/views/auth/reset-password-form.mjs +2 -2
  140. package/dist/client/views/auth/setup-form.d.mts +2 -2
  141. package/dist/client/views/collection/auto-form-fields.mjs +11 -9
  142. package/dist/client/views/collection/bulk-action-toolbar.mjs +173 -138
  143. package/dist/client/views/collection/cells/complex-cells.mjs +22 -22
  144. package/dist/client/views/collection/cells/primitive-cells.mjs +1 -1
  145. package/dist/client/views/collection/cells/relation-cells.mjs +147 -129
  146. package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +224 -278
  147. package/dist/client/views/collection/cells/shared/relation-chip.mjs +64 -36
  148. package/dist/client/views/collection/cells/upload-cells.mjs +199 -9
  149. package/dist/client/views/collection/columns/build-columns.mjs +29 -9
  150. package/dist/client/views/collection/columns/column-defaults.mjs +2 -2
  151. package/dist/client/views/collection/field-renderer.mjs +50 -89
  152. package/dist/client/views/collection/form-view.mjs +237 -227
  153. package/dist/client/views/collection/table-view.mjs +1162 -229
  154. package/dist/client/views/collection/view-skeletons.mjs +222 -79
  155. package/dist/client/views/common/global-search.mjs +29 -18
  156. package/dist/client/views/dashboard/dashboard-grid.mjs +678 -501
  157. package/dist/client/views/dashboard/dashboard-widget.mjs +6 -3
  158. package/dist/client/views/dashboard/widget-card.mjs +23 -14
  159. package/dist/client/views/globals/global-form-view.mjs +634 -589
  160. package/dist/client/views/layout/admin-layout-provider.mjs +67 -70
  161. package/dist/client/views/layout/admin-layout.d.mts +3 -6
  162. package/dist/client/views/layout/admin-layout.mjs +149 -172
  163. package/dist/client/views/layout/admin-router.mjs +747 -544
  164. package/dist/client/views/layout/admin-sidebar.d.mts +38 -1
  165. package/dist/client/views/layout/admin-sidebar.mjs +751 -591
  166. package/dist/client/views/layout/admin-theme.d.mts +10 -0
  167. package/dist/client/views/layout/admin-theme.mjs +84 -0
  168. package/dist/client/views/layout/admin-view-layout.mjs +161 -0
  169. package/dist/client/views/pages/accept-invite-page.d.mts +2 -2
  170. package/dist/client/views/pages/accept-invite-page.mjs +49 -26
  171. package/dist/client/views/pages/dashboard-page.d.mts +2 -2
  172. package/dist/client/views/pages/forgot-password-page.d.mts +2 -2
  173. package/dist/client/views/pages/forgot-password-page.mjs +2 -19
  174. package/dist/client/views/pages/invite-page.d.mts +2 -2
  175. package/dist/client/views/pages/invite-page.mjs +2 -19
  176. package/dist/client/views/pages/login-page.d.mts +1 -1
  177. package/dist/client/views/pages/login-page.mjs +4 -21
  178. package/dist/client/views/pages/reset-password-page.d.mts +2 -2
  179. package/dist/client/views/pages/reset-password-page.mjs +3 -20
  180. package/dist/client/views/pages/setup-page.d.mts +2 -2
  181. package/dist/client/views/pages/setup-page.mjs +3 -20
  182. package/dist/client.d.mts +6 -2
  183. package/dist/client.mjs +2 -1
  184. package/dist/components/rich-text/rich-text-renderer.d.mts +2 -2
  185. package/dist/index.d.mts +6 -2
  186. package/dist/index.mjs +2 -1
  187. package/dist/server/augmentation/dashboard.d.mts +67 -3
  188. package/dist/server/augmentation/form-layout.d.mts +21 -0
  189. package/dist/server/augmentation/index.d.mts +1 -1
  190. package/dist/server/codegen/admin-client-template.mjs +4 -0
  191. package/dist/server/fields/blocks.d.mts +1 -1
  192. package/dist/server/fields/blocks.mjs +12 -0
  193. package/dist/server/fields/rich-text.d.mts +1 -1
  194. package/dist/server/fields/rich-text.mjs +8 -0
  195. package/dist/server/i18n/index.mjs +17 -1
  196. package/dist/server/i18n/messages/cs.mjs +23 -0
  197. package/dist/server/i18n/messages/de.mjs +23 -0
  198. package/dist/server/i18n/messages/en.mjs +64 -1
  199. package/dist/server/i18n/messages/es.mjs +23 -0
  200. package/dist/server/i18n/messages/fr.mjs +23 -0
  201. package/dist/server/i18n/messages/pl.mjs +23 -0
  202. package/dist/server/i18n/messages/pt.mjs +23 -0
  203. package/dist/server/i18n/messages/sk.mjs +83 -1
  204. package/dist/server/modules/admin/block/introspection.mjs +4 -1
  205. package/dist/server/modules/admin/block/prefetch.mjs +12 -2
  206. package/dist/server/modules/admin/collections/account.d.mts +50 -50
  207. package/dist/server/modules/admin/collections/admin-locks.d.mts +54 -54
  208. package/dist/server/modules/admin/collections/admin-preferences.d.mts +39 -39
  209. package/dist/server/modules/admin/collections/admin-saved-views.d.mts +47 -47
  210. package/dist/server/modules/admin/collections/apikey.d.mts +68 -68
  211. package/dist/server/modules/admin/collections/assets.d.mts +20 -20
  212. package/dist/server/modules/admin/collections/assets.mjs +0 -1
  213. package/dist/server/modules/admin/collections/session.d.mts +42 -42
  214. package/dist/server/modules/admin/collections/user.d.mts +12 -0
  215. package/dist/server/modules/admin/collections/user.mjs +40 -9
  216. package/dist/server/modules/admin/collections/verification.d.mts +2 -2
  217. package/dist/server/modules/admin/dto/admin-config.dto.mjs +2 -0
  218. package/dist/server/modules/admin/factories.mjs +7 -18
  219. package/dist/server/modules/admin/index.d.mts +1 -1
  220. package/dist/server/modules/admin/routes/admin-config.d.mts +2 -2
  221. package/dist/server/modules/admin/routes/admin-config.mjs +34 -16
  222. package/dist/server/modules/admin/routes/execute-action.d.mts +9 -9
  223. package/dist/server/modules/admin/routes/execute-action.mjs +33 -0
  224. package/dist/server/modules/admin/routes/locales.d.mts +2 -2
  225. package/dist/server/modules/admin/routes/preview.d.mts +11 -11
  226. package/dist/server/modules/admin/routes/reactive.d.mts +9 -9
  227. package/dist/server/modules/admin/routes/setup.d.mts +10 -10
  228. package/dist/server/modules/admin/routes/setup.mjs +7 -7
  229. package/dist/server/modules/admin/routes/translations.d.mts +4 -4
  230. package/dist/server/modules/admin/routes/translations.mjs +5 -1
  231. package/dist/server/modules/admin/routes/widget-data.d.mts +5 -5
  232. package/dist/server/modules/admin-preferences/collections/admin-preferences.mjs +1 -1
  233. package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +27 -27
  234. package/dist/server/modules/audit/.generated/module.d.mts +1 -1
  235. package/dist/server/modules/audit/.generated/module.mjs +1 -1
  236. package/dist/server/modules/audit/collections/audit-log.d.mts +2 -2
  237. package/dist/server/modules/audit/collections/audit-log.mjs +1 -1
  238. package/dist/server/modules/audit/config/app.mjs +99 -42
  239. package/dist/server/modules/audit/jobs/audit-cleanup.mjs +1 -1
  240. package/dist/server/plugin.mjs +4 -2
  241. package/dist/server/proxy-factories.d.mts +4 -3
  242. package/dist/server/proxy-factories.mjs +34 -8
  243. package/dist/shared/types/saved-views.types.d.mts +2 -0
  244. package/package.json +6 -4
  245. package/dist/client/components/fields/rich-text-editor/link-popover.mjs +0 -85
  246. package/dist/client/components/ui/spinner.mjs +0 -52
  247. package/dist/client/components/ui/toolbar.mjs +0 -136
  248. package/dist/client/contexts/breadcrumb-context.mjs +0 -60
  249. package/dist/client/views/layout/admin-topbar.mjs +0 -236
@@ -9,6 +9,8 @@ const EMPTY_CONFIG = {
9
9
  filters: [],
10
10
  sortConfig: null,
11
11
  visibleColumns: [],
12
+ groupBy: null,
13
+ collapsedGroups: [],
12
14
  realtime: void 0,
13
15
  includeDeleted: false,
14
16
  pagination: {
@@ -71,7 +73,7 @@ function mergeVisibleColumns(storedColumns, defaultColumns) {
71
73
  * ```
72
74
  */
73
75
  function useViewState(defaultColumns, initialConfig, collectionName, userId) {
74
- const $ = c(97);
76
+ const $ = c(114);
75
77
  const queryClient = useQueryClient();
76
78
  const client = useAdminStore(_temp);
77
79
  let preferenceKey;
@@ -131,94 +133,116 @@ function useViewState(defaultColumns, initialConfig, collectionName, userId) {
131
133
  $[14] = storedConfig.visibleColumns;
132
134
  $[15] = t6$2;
133
135
  } else t6$2 = $[15];
134
- const t7$2 = storedConfig.realtime !== void 0 ? storedConfig.realtime : initialConfig?.realtime;
135
- const t8$2 = storedConfig.includeDeleted !== void 0 ? storedConfig.includeDeleted : initialConfig?.includeDeleted ?? false;
136
- let t9$2;
137
- if ($[16] !== storedConfig.pagination) {
138
- t9$2 = storedConfig.pagination ?? {
136
+ const t7$2 = storedConfig.groupBy !== void 0 ? storedConfig.groupBy : initialConfig?.groupBy ?? null;
137
+ let t8$2;
138
+ if ($[16] !== storedConfig.collapsedGroups) {
139
+ t8$2 = storedConfig.collapsedGroups ?? [];
140
+ $[16] = storedConfig.collapsedGroups;
141
+ $[17] = t8$2;
142
+ } else t8$2 = $[17];
143
+ const t9$2 = storedConfig.realtime !== void 0 ? storedConfig.realtime : initialConfig?.realtime;
144
+ const t10$2 = storedConfig.includeDeleted !== void 0 ? storedConfig.includeDeleted : initialConfig?.includeDeleted ?? false;
145
+ let t11$2;
146
+ if ($[18] !== storedConfig.pagination) {
147
+ t11$2 = storedConfig.pagination ?? {
139
148
  page: 1,
140
149
  pageSize: 25
141
150
  };
142
- $[16] = storedConfig.pagination;
143
- $[17] = t9$2;
144
- } else t9$2 = $[17];
145
- let t10$1;
146
- if ($[18] !== t4$2 || $[19] !== t5$2 || $[20] !== t6$2 || $[21] !== t7$2 || $[22] !== t8$2 || $[23] !== t9$2) {
147
- t10$1 = {
151
+ $[18] = storedConfig.pagination;
152
+ $[19] = t11$2;
153
+ } else t11$2 = $[19];
154
+ let t12$1;
155
+ if ($[20] !== t10$2 || $[21] !== t11$2 || $[22] !== t4$2 || $[23] !== t5$2 || $[24] !== t6$2 || $[25] !== t7$2 || $[26] !== t8$2 || $[27] !== t9$2) {
156
+ t12$1 = {
148
157
  filters: t4$2,
149
158
  sortConfig: t5$2,
150
159
  visibleColumns: t6$2,
151
- realtime: t7$2,
152
- includeDeleted: t8$2,
153
- pagination: t9$2
160
+ groupBy: t7$2,
161
+ collapsedGroups: t8$2,
162
+ realtime: t9$2,
163
+ includeDeleted: t10$2,
164
+ pagination: t11$2
154
165
  };
155
- $[18] = t4$2;
156
- $[19] = t5$2;
157
- $[20] = t6$2;
158
- $[21] = t7$2;
159
- $[22] = t8$2;
160
- $[23] = t9$2;
161
- $[24] = t10$1;
162
- } else t10$1 = $[24];
163
- t3 = t10$1;
166
+ $[20] = t10$2;
167
+ $[21] = t11$2;
168
+ $[22] = t4$2;
169
+ $[23] = t5$2;
170
+ $[24] = t6$2;
171
+ $[25] = t7$2;
172
+ $[26] = t8$2;
173
+ $[27] = t9$2;
174
+ $[28] = t12$1;
175
+ } else t12$1 = $[28];
176
+ t3 = t12$1;
164
177
  break bb0;
165
178
  }
166
179
  let t4$1;
167
- if ($[25] !== initialConfig?.filters) {
180
+ if ($[29] !== initialConfig?.filters) {
168
181
  t4$1 = initialConfig?.filters ?? [];
169
- $[25] = initialConfig?.filters;
170
- $[26] = t4$1;
171
- } else t4$1 = $[26];
182
+ $[29] = initialConfig?.filters;
183
+ $[30] = t4$1;
184
+ } else t4$1 = $[30];
172
185
  const t5$1 = initialConfig?.sortConfig ?? null;
173
- const t6$1 = initialConfig?.realtime;
174
- const t7$1 = initialConfig?.includeDeleted ?? false;
175
- let t8$1;
176
- if ($[27] !== initialConfig?.pagination) {
177
- t8$1 = initialConfig?.pagination ?? {
186
+ const t6$1 = initialConfig?.groupBy ?? null;
187
+ let t7$1;
188
+ if ($[31] !== initialConfig?.collapsedGroups) {
189
+ t7$1 = initialConfig?.collapsedGroups ?? [];
190
+ $[31] = initialConfig?.collapsedGroups;
191
+ $[32] = t7$1;
192
+ } else t7$1 = $[32];
193
+ const t8$1 = initialConfig?.realtime;
194
+ const t9$1 = initialConfig?.includeDeleted ?? false;
195
+ let t10$1;
196
+ if ($[33] !== initialConfig?.pagination) {
197
+ t10$1 = initialConfig?.pagination ?? {
178
198
  page: 1,
179
199
  pageSize: 25
180
200
  };
181
- $[27] = initialConfig?.pagination;
182
- $[28] = t8$1;
183
- } else t8$1 = $[28];
184
- let t9$1;
185
- if ($[29] !== defaultColumns || $[30] !== t4$1 || $[31] !== t5$1 || $[32] !== t6$1 || $[33] !== t7$1 || $[34] !== t8$1) {
186
- t9$1 = {
201
+ $[33] = initialConfig?.pagination;
202
+ $[34] = t10$1;
203
+ } else t10$1 = $[34];
204
+ let t11$1;
205
+ if ($[35] !== defaultColumns || $[36] !== t10$1 || $[37] !== t4$1 || $[38] !== t5$1 || $[39] !== t6$1 || $[40] !== t7$1 || $[41] !== t8$1 || $[42] !== t9$1) {
206
+ t11$1 = {
187
207
  filters: t4$1,
188
208
  sortConfig: t5$1,
189
209
  visibleColumns: defaultColumns,
190
- realtime: t6$1,
191
- includeDeleted: t7$1,
192
- pagination: t8$1
210
+ groupBy: t6$1,
211
+ collapsedGroups: t7$1,
212
+ realtime: t8$1,
213
+ includeDeleted: t9$1,
214
+ pagination: t10$1
193
215
  };
194
- $[29] = defaultColumns;
195
- $[30] = t4$1;
196
- $[31] = t5$1;
197
- $[32] = t6$1;
198
- $[33] = t7$1;
199
- $[34] = t8$1;
200
- $[35] = t9$1;
201
- } else t9$1 = $[35];
202
- t3 = t9$1;
216
+ $[35] = defaultColumns;
217
+ $[36] = t10$1;
218
+ $[37] = t4$1;
219
+ $[38] = t5$1;
220
+ $[39] = t6$1;
221
+ $[40] = t7$1;
222
+ $[41] = t8$1;
223
+ $[42] = t9$1;
224
+ $[43] = t11$1;
225
+ } else t11$1 = $[43];
226
+ t3 = t11$1;
203
227
  }
204
228
  const config = t3;
205
229
  const saveTimeoutRef = useRef(null);
206
230
  let t4;
207
231
  let t5;
208
- if ($[36] === Symbol.for("react.memo_cache_sentinel")) {
232
+ if ($[44] === Symbol.for("react.memo_cache_sentinel")) {
209
233
  t4 = () => () => {
210
234
  if (saveTimeoutRef.current) clearTimeout(saveTimeoutRef.current);
211
235
  };
212
236
  t5 = [];
213
- $[36] = t4;
214
- $[37] = t5;
237
+ $[44] = t4;
238
+ $[45] = t5;
215
239
  } else {
216
- t4 = $[36];
217
- t5 = $[37];
240
+ t4 = $[44];
241
+ t5 = $[45];
218
242
  }
219
243
  useEffect(t4, t5);
220
244
  let t6;
221
- if ($[38] !== config || $[39] !== preferenceKey || $[40] !== queryClient || $[41] !== queryKey || $[42] !== savePreference || $[43] !== userId) {
245
+ if ($[46] !== config || $[47] !== preferenceKey || $[48] !== queryClient || $[49] !== queryKey || $[50] !== savePreference || $[51] !== userId) {
222
246
  t6 = (newConfig) => {
223
247
  const next = typeof newConfig === "function" ? newConfig(config) : newConfig;
224
248
  if (preferenceKey && userId) queryClient.setQueryData(queryKey, next);
@@ -227,41 +251,41 @@ function useViewState(defaultColumns, initialConfig, collectionName, userId) {
227
251
  if (preferenceKey) savePreference(next);
228
252
  }, 500);
229
253
  };
230
- $[38] = config;
231
- $[39] = preferenceKey;
232
- $[40] = queryClient;
233
- $[41] = queryKey;
234
- $[42] = savePreference;
235
- $[43] = userId;
236
- $[44] = t6;
237
- } else t6 = $[44];
254
+ $[46] = config;
255
+ $[47] = preferenceKey;
256
+ $[48] = queryClient;
257
+ $[49] = queryKey;
258
+ $[50] = savePreference;
259
+ $[51] = userId;
260
+ $[52] = t6;
261
+ } else t6 = $[52];
238
262
  const setConfig = t6;
239
263
  let t7;
240
- if ($[45] !== setConfig) {
264
+ if ($[53] !== setConfig) {
241
265
  t7 = (filter) => {
242
266
  setConfig((prev) => ({
243
267
  ...prev,
244
268
  filters: [...prev.filters, filter]
245
269
  }));
246
270
  };
247
- $[45] = setConfig;
248
- $[46] = t7;
249
- } else t7 = $[46];
271
+ $[53] = setConfig;
272
+ $[54] = t7;
273
+ } else t7 = $[54];
250
274
  const addFilter = t7;
251
275
  let t8;
252
- if ($[47] !== setConfig) {
276
+ if ($[55] !== setConfig) {
253
277
  t8 = (filterId) => {
254
278
  setConfig((prev_0) => ({
255
279
  ...prev_0,
256
280
  filters: prev_0.filters.filter((f) => f.id !== filterId)
257
281
  }));
258
282
  };
259
- $[47] = setConfig;
260
- $[48] = t8;
261
- } else t8 = $[48];
283
+ $[55] = setConfig;
284
+ $[56] = t8;
285
+ } else t8 = $[56];
262
286
  const removeFilter = t8;
263
287
  let t9;
264
- if ($[49] !== setConfig) {
288
+ if ($[57] !== setConfig) {
265
289
  t9 = (filterId_0, updates) => {
266
290
  setConfig((prev_1) => ({
267
291
  ...prev_1,
@@ -271,33 +295,33 @@ function useViewState(defaultColumns, initialConfig, collectionName, userId) {
271
295
  } : f_0)
272
296
  }));
273
297
  };
274
- $[49] = setConfig;
275
- $[50] = t9;
276
- } else t9 = $[50];
298
+ $[57] = setConfig;
299
+ $[58] = t9;
300
+ } else t9 = $[58];
277
301
  const updateFilter = t9;
278
302
  let t10;
279
- if ($[51] !== setConfig) {
303
+ if ($[59] !== setConfig) {
280
304
  t10 = () => {
281
305
  setConfig(_temp2);
282
306
  };
283
- $[51] = setConfig;
284
- $[52] = t10;
285
- } else t10 = $[52];
307
+ $[59] = setConfig;
308
+ $[60] = t10;
309
+ } else t10 = $[60];
286
310
  const clearFilters = t10;
287
311
  let t11;
288
- if ($[53] !== setConfig) {
312
+ if ($[61] !== setConfig) {
289
313
  t11 = (sortConfig) => {
290
314
  setConfig((prev_3) => ({
291
315
  ...prev_3,
292
316
  sortConfig
293
317
  }));
294
318
  };
295
- $[53] = setConfig;
296
- $[54] = t11;
297
- } else t11 = $[54];
319
+ $[61] = setConfig;
320
+ $[62] = t11;
321
+ } else t11 = $[62];
298
322
  const setSort = t11;
299
323
  let t12;
300
- if ($[55] !== setConfig) {
324
+ if ($[63] !== setConfig) {
301
325
  t12 = (field) => {
302
326
  setConfig((prev_4) => {
303
327
  if (prev_4.sortConfig?.field === field) {
@@ -322,113 +346,149 @@ function useViewState(defaultColumns, initialConfig, collectionName, userId) {
322
346
  };
323
347
  });
324
348
  };
325
- $[55] = setConfig;
326
- $[56] = t12;
327
- } else t12 = $[56];
349
+ $[63] = setConfig;
350
+ $[64] = t12;
351
+ } else t12 = $[64];
328
352
  const toggleSort = t12;
329
353
  let t13;
330
- if ($[57] !== setConfig) {
354
+ if ($[65] !== setConfig) {
331
355
  t13 = (columns) => {
332
356
  setConfig((prev_5) => ({
333
357
  ...prev_5,
334
358
  visibleColumns: columns
335
359
  }));
336
360
  };
337
- $[57] = setConfig;
338
- $[58] = t13;
339
- } else t13 = $[58];
361
+ $[65] = setConfig;
362
+ $[66] = t13;
363
+ } else t13 = $[66];
340
364
  const setVisibleColumns = t13;
341
365
  let t14;
342
- if ($[59] !== setConfig) {
343
- t14 = (page) => {
366
+ if ($[67] !== setConfig) {
367
+ t14 = (groupBy) => {
344
368
  setConfig((prev_6) => ({
345
369
  ...prev_6,
370
+ groupBy,
371
+ collapsedGroups: [],
346
372
  pagination: {
347
- ...prev_6.pagination,
348
- page
373
+ ...prev_6.pagination ?? { pageSize: 25 },
374
+ page: 1
349
375
  }
350
376
  }));
351
377
  };
352
- $[59] = setConfig;
353
- $[60] = t14;
354
- } else t14 = $[60];
355
- const setPage = t14;
378
+ $[67] = setConfig;
379
+ $[68] = t14;
380
+ } else t14 = $[68];
381
+ const setGroupBy = t14;
356
382
  let t15;
357
- if ($[61] !== setConfig) {
358
- t15 = (pageSize) => {
359
- setConfig((prev_7) => ({
360
- ...prev_7,
383
+ if ($[69] !== setConfig) {
384
+ t15 = (groupKey) => {
385
+ setConfig((prev_7) => {
386
+ const collapsedGroups = prev_7.collapsedGroups ?? [];
387
+ return {
388
+ ...prev_7,
389
+ collapsedGroups: collapsedGroups.includes(groupKey) ? collapsedGroups.filter((key) => key !== groupKey) : [...collapsedGroups, groupKey]
390
+ };
391
+ });
392
+ };
393
+ $[69] = setConfig;
394
+ $[70] = t15;
395
+ } else t15 = $[70];
396
+ const toggleCollapsedGroup = t15;
397
+ let t16;
398
+ if ($[71] !== setConfig) {
399
+ t16 = (page) => {
400
+ setConfig((prev_8) => ({
401
+ ...prev_8,
402
+ pagination: {
403
+ ...prev_8.pagination,
404
+ page
405
+ }
406
+ }));
407
+ };
408
+ $[71] = setConfig;
409
+ $[72] = t16;
410
+ } else t16 = $[72];
411
+ const setPage = t16;
412
+ let t17;
413
+ if ($[73] !== setConfig) {
414
+ t17 = (pageSize) => {
415
+ setConfig((prev_9) => ({
416
+ ...prev_9,
361
417
  pagination: {
362
418
  page: 1,
363
419
  pageSize
364
420
  }
365
421
  }));
366
422
  };
367
- $[61] = setConfig;
368
- $[62] = t15;
369
- } else t15 = $[62];
370
- const setPageSize = t15;
371
- let t16;
372
- if ($[63] !== setConfig) {
373
- t16 = (column) => {
374
- setConfig((prev_8) => {
375
- if (prev_8.visibleColumns.includes(column)) return {
376
- ...prev_8,
377
- visibleColumns: prev_8.visibleColumns.filter((c$1) => c$1 !== column)
423
+ $[73] = setConfig;
424
+ $[74] = t17;
425
+ } else t17 = $[74];
426
+ const setPageSize = t17;
427
+ let t18;
428
+ if ($[75] !== setConfig) {
429
+ t18 = (column) => {
430
+ setConfig((prev_10) => {
431
+ if (prev_10.visibleColumns.includes(column)) return {
432
+ ...prev_10,
433
+ visibleColumns: prev_10.visibleColumns.filter((c$1) => c$1 !== column)
378
434
  };
379
435
  return {
380
- ...prev_8,
381
- visibleColumns: [...prev_8.visibleColumns, column]
436
+ ...prev_10,
437
+ visibleColumns: [...prev_10.visibleColumns, column]
382
438
  };
383
439
  });
384
440
  };
385
- $[63] = setConfig;
386
- $[64] = t16;
387
- } else t16 = $[64];
388
- const toggleColumn = t16;
389
- let t17;
390
- if ($[65] !== setConfig) {
391
- t17 = (newConfig_0) => {
441
+ $[75] = setConfig;
442
+ $[76] = t18;
443
+ } else t18 = $[76];
444
+ const toggleColumn = t18;
445
+ let t19;
446
+ if ($[77] !== setConfig) {
447
+ t19 = (newConfig_0) => {
392
448
  setConfig(newConfig_0);
393
449
  };
394
- $[65] = setConfig;
395
- $[66] = t17;
396
- } else t17 = $[66];
397
- const loadConfig = t17;
398
- let t18;
399
- if ($[67] !== defaultColumns || $[68] !== setConfig) {
400
- t18 = () => {
450
+ $[77] = setConfig;
451
+ $[78] = t19;
452
+ } else t19 = $[78];
453
+ const loadConfig = t19;
454
+ let t20;
455
+ if ($[79] !== defaultColumns || $[80] !== setConfig) {
456
+ t20 = () => {
401
457
  setConfig({
402
458
  ...EMPTY_CONFIG,
403
459
  visibleColumns: defaultColumns
404
460
  });
405
461
  };
406
- $[67] = defaultColumns;
407
- $[68] = setConfig;
408
- $[69] = t18;
409
- } else t18 = $[69];
410
- const resetConfig = t18;
411
- let t19;
412
- if ($[70] !== config.filters.length || $[71] !== config.includeDeleted || $[72] !== config.pagination?.page || $[73] !== config.pagination?.pageSize || $[74] !== config.realtime || $[75] !== config.sortConfig || $[76] !== config.visibleColumns || $[77] !== defaultColumns || $[78] !== initialConfig?.includeDeleted || $[79] !== initialConfig?.realtime) {
413
- t19 = () => config.filters.length > 0 || config.sortConfig !== null || config.realtime !== initialConfig?.realtime || (config.includeDeleted ?? false) !== (initialConfig?.includeDeleted ?? false) || config.pagination?.page !== 1 || config.pagination?.pageSize !== 25 || JSON.stringify([...config.visibleColumns].sort()) !== JSON.stringify([...defaultColumns].sort());
414
- $[70] = config.filters.length;
415
- $[71] = config.includeDeleted;
416
- $[72] = config.pagination?.page;
417
- $[73] = config.pagination?.pageSize;
418
- $[74] = config.realtime;
419
- $[75] = config.sortConfig;
420
- $[76] = config.visibleColumns;
421
- $[77] = defaultColumns;
422
- $[78] = initialConfig?.includeDeleted;
423
- $[79] = initialConfig?.realtime;
424
- $[80] = t19;
425
- } else t19 = $[80];
462
+ $[79] = defaultColumns;
463
+ $[80] = setConfig;
464
+ $[81] = t20;
465
+ } else t20 = $[81];
466
+ const resetConfig = t20;
467
+ let t21;
468
+ if ($[82] !== config.collapsedGroups?.length || $[83] !== config.filters.length || $[84] !== config.groupBy || $[85] !== config.includeDeleted || $[86] !== config.pagination?.page || $[87] !== config.pagination?.pageSize || $[88] !== config.realtime || $[89] !== config.sortConfig || $[90] !== config.visibleColumns || $[91] !== defaultColumns || $[92] !== initialConfig?.groupBy || $[93] !== initialConfig?.includeDeleted || $[94] !== initialConfig?.realtime) {
469
+ t21 = () => config.filters.length > 0 || config.sortConfig !== null || (config.groupBy ?? null) !== (initialConfig?.groupBy ?? null) || (config.collapsedGroups?.length ?? 0) > 0 || config.realtime !== initialConfig?.realtime || (config.includeDeleted ?? false) !== (initialConfig?.includeDeleted ?? false) || config.pagination?.page !== 1 || config.pagination?.pageSize !== 25 || JSON.stringify([...config.visibleColumns].sort()) !== JSON.stringify([...defaultColumns].sort());
470
+ $[82] = config.collapsedGroups?.length;
471
+ $[83] = config.filters.length;
472
+ $[84] = config.groupBy;
473
+ $[85] = config.includeDeleted;
474
+ $[86] = config.pagination?.page;
475
+ $[87] = config.pagination?.pageSize;
476
+ $[88] = config.realtime;
477
+ $[89] = config.sortConfig;
478
+ $[90] = config.visibleColumns;
479
+ $[91] = defaultColumns;
480
+ $[92] = initialConfig?.groupBy;
481
+ $[93] = initialConfig?.includeDeleted;
482
+ $[94] = initialConfig?.realtime;
483
+ $[95] = t21;
484
+ } else t21 = $[95];
426
485
  initialConfig?.includeDeleted;
486
+ initialConfig?.groupBy;
427
487
  initialConfig?.realtime;
428
- const hasChanges = t19();
429
- let t20;
430
- if ($[81] !== addFilter || $[82] !== clearFilters || $[83] !== config || $[84] !== hasChanges || $[85] !== loadConfig || $[86] !== removeFilter || $[87] !== resetConfig || $[88] !== setConfig || $[89] !== setPage || $[90] !== setPageSize || $[91] !== setSort || $[92] !== setVisibleColumns || $[93] !== toggleColumn || $[94] !== toggleSort || $[95] !== updateFilter) {
431
- t20 = {
488
+ const hasChanges = t21();
489
+ let t22;
490
+ if ($[96] !== addFilter || $[97] !== clearFilters || $[98] !== config || $[99] !== hasChanges || $[100] !== loadConfig || $[101] !== removeFilter || $[102] !== resetConfig || $[103] !== setConfig || $[104] !== setGroupBy || $[105] !== setPage || $[106] !== setPageSize || $[107] !== setSort || $[108] !== setVisibleColumns || $[109] !== toggleCollapsedGroup || $[110] !== toggleColumn || $[111] !== toggleSort || $[112] !== updateFilter) {
491
+ t22 = {
432
492
  config,
433
493
  setConfig,
434
494
  addFilter,
@@ -438,6 +498,8 @@ function useViewState(defaultColumns, initialConfig, collectionName, userId) {
438
498
  setSort,
439
499
  toggleSort,
440
500
  setVisibleColumns,
501
+ setGroupBy,
502
+ toggleCollapsedGroup,
441
503
  toggleColumn,
442
504
  setPage,
443
505
  setPageSize,
@@ -446,24 +508,26 @@ function useViewState(defaultColumns, initialConfig, collectionName, userId) {
446
508
  hasChanges,
447
509
  isLoading: false
448
510
  };
449
- $[81] = addFilter;
450
- $[82] = clearFilters;
451
- $[83] = config;
452
- $[84] = hasChanges;
453
- $[85] = loadConfig;
454
- $[86] = removeFilter;
455
- $[87] = resetConfig;
456
- $[88] = setConfig;
457
- $[89] = setPage;
458
- $[90] = setPageSize;
459
- $[91] = setSort;
460
- $[92] = setVisibleColumns;
461
- $[93] = toggleColumn;
462
- $[94] = toggleSort;
463
- $[95] = updateFilter;
464
- $[96] = t20;
465
- } else t20 = $[96];
466
- return t20;
511
+ $[96] = addFilter;
512
+ $[97] = clearFilters;
513
+ $[98] = config;
514
+ $[99] = hasChanges;
515
+ $[100] = loadConfig;
516
+ $[101] = removeFilter;
517
+ $[102] = resetConfig;
518
+ $[103] = setConfig;
519
+ $[104] = setGroupBy;
520
+ $[105] = setPage;
521
+ $[106] = setPageSize;
522
+ $[107] = setSort;
523
+ $[108] = setVisibleColumns;
524
+ $[109] = toggleCollapsedGroup;
525
+ $[110] = toggleColumn;
526
+ $[111] = toggleSort;
527
+ $[112] = updateFilter;
528
+ $[113] = t22;
529
+ } else t22 = $[113];
530
+ return t22;
467
531
  }
468
532
  function _temp2(prev_2) {
469
533
  return {
@@ -0,0 +1,33 @@
1
+ import { enUS } from "date-fns/locale/en-US";
2
+
3
+ //#region src/client/i18n/date-locale.ts
4
+ /**
5
+ * date-fns locale resolver for DayPicker and date formatting.
6
+ *
7
+ * Only `enUS` is included by default to keep bundle size small.
8
+ * Register additional locales at admin setup time:
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { sk } from "date-fns/locale/sk";
13
+ * import { registerDateFnsLocale } from "@questpie/admin/client-module";
14
+ *
15
+ * registerDateFnsLocale("sk", sk);
16
+ * ```
17
+ */
18
+ const localeRegistry = new Map([["en", enUS], ["en-US", enUS]]);
19
+ /**
20
+ * Resolve a date-fns Locale from a BCP-47 locale code (e.g. "sk", "en-US").
21
+ * Falls back to `enUS` if the locale is not registered.
22
+ */
23
+ function resolveDateFnsLocale(localeCode) {
24
+ const exact = localeRegistry.get(localeCode);
25
+ if (exact) return exact;
26
+ const lang = localeCode.split("-")[0];
27
+ const byLang = localeRegistry.get(lang);
28
+ if (byLang) return byLang;
29
+ return enUS;
30
+ }
31
+
32
+ //#endregion
33
+ export { resolveDateFnsLocale };
@@ -1,3 +1,4 @@
1
+ import { resolveDateFnsLocale } from "./date-locale.mjs";
1
2
  import { c } from "react/compiler-runtime";
2
3
  import * as React from "react";
3
4
  import { createContext, useContext } from "react";
@@ -206,6 +207,21 @@ function useTranslation() {
206
207
  return t8;
207
208
  }
208
209
  /**
210
+ * Returns the date-fns `Locale` object matching the current admin UI locale.
211
+ * Only `enUS` is bundled by default — register others via `registerDateFnsLocale`.
212
+ */
213
+ function useDateFnsLocale() {
214
+ const $ = c(2);
215
+ const { locale } = useTranslation();
216
+ let t0;
217
+ if ($[0] !== locale) {
218
+ t0 = resolveDateFnsLocale(locale);
219
+ $[0] = locale;
220
+ $[1] = t0;
221
+ } else t0 = $[1];
222
+ return t0;
223
+ }
224
+ /**
209
225
  * Check if an object is a locale map (has locale codes as keys)
210
226
  */
211
227
  function isLocaleMap(obj) {
@@ -281,4 +297,4 @@ function useResolveText() {
281
297
  }
282
298
 
283
299
  //#endregion
284
- export { I18nProvider, useResolveText, useSafeI18n, useTranslation };
300
+ export { I18nProvider, useDateFnsLocale, useResolveText, useSafeI18n, useTranslation };
@@ -6,17 +6,18 @@ function cn(...inputs) {
6
6
  return twMerge(clsx(inputs));
7
7
  }
8
8
  /**
9
- * Format a string for display by converting camelCase/PascalCase to Title Case with spaces.
9
+ * Format a string for display by converting camelCase, snake_case, and kebab-case to Title Case.
10
10
  *
11
11
  * Use this for formatting field names, collection names, column headers, etc.
12
12
  *
13
13
  * @example
14
14
  * formatLabel("blogPosts") // "Blog Posts"
15
+ * formatLabel("blog_posts") // "Blog Posts"
15
16
  * formatLabel("userSettings") // "User Settings"
16
17
  * formatLabel("firstName") // "First Name"
17
18
  */
18
19
  function formatLabel(str) {
19
- return str.replace(/([A-Z])/g, " $1").replace(/^./, (s) => s.toUpperCase()).trim();
20
+ return str.replace(/[_-]+/g, " ").replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2").replace(/\s+/g, " ").trim().replace(/\b\w/g, (s) => s.toUpperCase());
20
21
  }
21
22
 
22
23
  //#endregion
@@ -1,5 +1,5 @@
1
1
  import * as React from "react";
2
- import * as react_jsx_runtime20 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime22 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/client/preview/block-scope-context.d.ts
5
5
 
@@ -35,7 +35,7 @@ declare function BlockScopeProvider({
35
35
  blockId,
36
36
  basePath,
37
37
  children
38
- }: BlockScopeProviderProps): react_jsx_runtime20.JSX.Element;
38
+ }: BlockScopeProviderProps): react_jsx_runtime22.JSX.Element;
39
39
  /**
40
40
  * Get current block scope context.
41
41
  *