@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
@@ -1,97 +1,57 @@
1
- import { useResolveText } from "../../i18n/hooks.mjs";
1
+ import { useResolveText, useTranslation } from "../../i18n/hooks.mjs";
2
2
  import { cn, formatLabel } from "../../lib/utils.mjs";
3
- import { DefaultCell } from "../../views/collection/cells/primitive-cells.mjs";
3
+ import { useCollectionFields } from "../../hooks/use-collection-fields.mjs";
4
+ import { useCollectionMeta } from "../../hooks/use-collection-meta.mjs";
4
5
  import { useCollectionList } from "../../hooks/use-collection.mjs";
6
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "../ui/table.mjs";
5
7
  import { WidgetCard } from "../../views/dashboard/widget-card.mjs";
8
+ import { useServerWidgetData } from "../../hooks/use-server-widget-data.mjs";
9
+ import { WidgetEmptyState } from "./widget-empty-state.mjs";
6
10
  import { TableWidgetSkeleton } from "./widget-skeletons.mjs";
7
- import { c } from "react/compiler-runtime";
11
+ import { autoExpandFields, hasFieldsToExpand } from "../../utils/auto-expand-fields.mjs";
12
+ import { buildColumns } from "../../views/collection/columns/build-columns.mjs";
13
+ import * as React from "react";
8
14
  import { jsx, jsxs } from "react/jsx-runtime";
15
+ import { flexRender, getCoreRowModel, useReactTable } from "@tanstack/react-table";
9
16
 
10
17
  //#region src/client/components/widgets/table-widget.tsx
11
18
  /**
12
- * Field types that need fieldDef passed to their cell component
13
- */
14
- const FIELD_TYPES_NEEDING_FIELD_DEF = new Set([
15
- "object",
16
- "array",
17
- "relation",
18
- "reverseRelation"
19
- ]);
20
- /**
21
- * Normalize column config - converts string to object format
19
+ * Table Widget
20
+ *
21
+ * Displays a mini table with collection data.
22
+ * Automatically uses field definitions from collection config for:
23
+ * - Column labels (from field.label)
24
+ * - Cell rendering (from field.cell)
25
+ *
26
+ * Columns can be simple field keys or objects with overrides.
22
27
  */
23
- function normalizeColumn(column) {
24
- if (typeof column === "string") return { key: column };
25
- return column;
28
+ function normalizeWidgetColumn(column) {
29
+ return typeof column === "string" ? { key: column } : column;
26
30
  }
27
- /**
28
- * Get column label from field definition or column config
29
- */
30
- function getColumnLabel(column, fieldDef) {
31
- if (column.label) return column.label;
32
- const fieldOptions = fieldDef?.["~options"];
33
- if (fieldOptions?.label) return fieldOptions.label;
34
- return formatLabel(column.key);
31
+ function toListColumnConfig(column) {
32
+ const normalized = normalizeWidgetColumn(column);
33
+ const CustomCell = normalized.render ? function TableWidgetCustomCell({ value, row }) {
34
+ return normalized.render?.(value, row?.original ?? row);
35
+ } : void 0;
36
+ return {
37
+ field: normalized.key,
38
+ header: normalized.label,
39
+ width: normalized.width,
40
+ align: normalized.align,
41
+ cell: CustomCell
42
+ };
35
43
  }
36
- /**
37
- * Resolve cell component from field definition
38
- */
39
- function resolveCellComponent(fieldDef) {
40
- if (fieldDef?.cell) return fieldDef.cell;
41
- return DefaultCell;
44
+ function getColumnSizeStyle(column) {
45
+ const size = typeof column?.getSize === "function" ? column.getSize() : 120;
46
+ return {
47
+ width: size,
48
+ minWidth: size,
49
+ maxWidth: size
50
+ };
42
51
  }
43
- /**
44
- * Renders a single table cell value using field definitions or custom renderers
45
- */
46
- function TableCellRenderer(t0) {
47
- const $ = c(14);
48
- const { item, column, fields } = t0;
49
- const value = item[column.key];
50
- if (column.render) {
51
- let t1$1;
52
- if ($[0] !== column || $[1] !== item || $[2] !== value) {
53
- t1$1 = column.render(value, item);
54
- $[0] = column;
55
- $[1] = item;
56
- $[2] = value;
57
- $[3] = t1$1;
58
- } else t1$1 = $[3];
59
- return t1$1;
60
- }
61
- const fieldDef = fields?.[column.key];
62
- let t1;
63
- if ($[4] !== fieldDef) {
64
- t1 = resolveCellComponent(fieldDef);
65
- $[4] = fieldDef;
66
- $[5] = t1;
67
- } else t1 = $[5];
68
- const CellComponent = t1;
69
- const fieldType = fieldDef?.name ?? "text";
70
- let t2;
71
- if ($[6] !== fieldType) {
72
- t2 = FIELD_TYPES_NEEDING_FIELD_DEF.has(fieldType);
73
- $[6] = fieldType;
74
- $[7] = t2;
75
- } else t2 = $[7];
76
- const needsFieldDef = t2;
77
- let t3;
78
- if ($[8] !== CellComponent || $[9] !== fieldDef || $[10] !== item || $[11] !== needsFieldDef || $[12] !== value) {
79
- t3 = needsFieldDef ? /* @__PURE__ */ jsx(CellComponent, {
80
- value,
81
- row: item,
82
- fieldDef
83
- }) : /* @__PURE__ */ jsx(CellComponent, {
84
- value,
85
- row: item
86
- });
87
- $[8] = CellComponent;
88
- $[9] = fieldDef;
89
- $[10] = item;
90
- $[11] = needsFieldDef;
91
- $[12] = value;
92
- $[13] = t3;
93
- } else t3 = $[13];
94
- return t3;
52
+ function getAlignClass(align) {
53
+ if (align === "center") return "text-center";
54
+ if (align === "right") return "text-right";
95
55
  }
96
56
  /**
97
57
  * Table Widget Component
@@ -99,174 +59,128 @@ function TableCellRenderer(t0) {
99
59
  * Displays a mini table of collection items.
100
60
  * Uses field definitions from admin config for labels and cell rendering.
101
61
  */
102
- function TableWidget(t0) {
103
- const $ = c(37);
104
- const { config, basePath: t1, navigate } = t0;
105
- const basePath = t1 === void 0 ? "/admin" : t1;
62
+ function TableWidget({ config, basePath = "/admin", navigate }) {
106
63
  const resolveText = useResolveText();
107
- const { collection, columns: rawColumns, limit: t2, sortBy, sortOrder: t3, filter, linkToDetail, emptyMessage, realtime } = config;
108
- const limit = t2 === void 0 ? 5 : t2;
109
- const sortOrder = t3 === void 0 ? "desc" : t3;
110
- const columns = rawColumns.map(normalizeColumn);
111
- const fields = void 0;
112
- let queryOptions;
113
- if ($[0] !== filter || $[1] !== limit || $[2] !== sortBy || $[3] !== sortOrder) {
114
- queryOptions = { limit };
115
- if (sortBy) {
116
- let t4$1;
117
- if ($[5] !== sortBy || $[6] !== sortOrder) {
118
- t4$1 = { [sortBy]: sortOrder };
119
- $[5] = sortBy;
120
- $[6] = sortOrder;
121
- $[7] = t4$1;
122
- } else t4$1 = $[7];
123
- queryOptions.orderBy = t4$1;
124
- }
125
- if (filter) queryOptions.where = filter;
126
- $[0] = filter;
127
- $[1] = limit;
128
- $[2] = sortBy;
129
- $[3] = sortOrder;
130
- $[4] = queryOptions;
131
- } else queryOptions = $[4];
132
- let t4;
133
- if ($[8] !== realtime) {
134
- t4 = { realtime };
135
- $[8] = realtime;
136
- $[9] = t4;
137
- } else t4 = $[9];
138
- const { data, isLoading, error, refetch } = useCollectionList(collection, queryOptions, void 0, t4);
139
- const items = Array.isArray(data?.docs) ? data.docs : [];
140
- let t5;
141
- if ($[10] !== config.title || $[11] !== resolveText) {
142
- t5 = config.title ? resolveText(config.title) : void 0;
143
- $[10] = config.title;
144
- $[11] = resolveText;
145
- $[12] = t5;
146
- } else t5 = $[12];
147
- const title = t5;
148
- let t6;
149
- if ($[13] !== basePath || $[14] !== collection || $[15] !== linkToDetail || $[16] !== navigate) {
150
- t6 = (item) => {
151
- if (linkToDetail && navigate) navigate(`${basePath}/collections/${collection}/${item.id}`);
152
- };
153
- $[13] = basePath;
154
- $[14] = collection;
155
- $[15] = linkToDetail;
156
- $[16] = navigate;
157
- $[17] = t6;
158
- } else t6 = $[17];
159
- const handleRowClick = t6;
160
- let t7;
161
- if ($[18] !== emptyMessage || $[19] !== resolveText) {
162
- t7 = emptyMessage ? resolveText(emptyMessage) : "No data available";
163
- $[18] = emptyMessage;
164
- $[19] = resolveText;
165
- $[20] = t7;
166
- } else t7 = $[20];
167
- let t8;
168
- if ($[21] !== t7) {
169
- t8 = /* @__PURE__ */ jsx("div", {
170
- className: "text-muted-foreground flex h-24 items-center justify-center",
171
- children: /* @__PURE__ */ jsx("p", {
172
- className: "text-sm",
173
- children: t7
174
- })
175
- });
176
- $[21] = t7;
177
- $[22] = t8;
178
- } else t8 = $[22];
179
- const emptyContent = t8;
180
- const tableContent = items.length === 0 ? emptyContent : /* @__PURE__ */ jsxs("div", {
181
- className: "-mx-5 -mb-1",
182
- children: [/* @__PURE__ */ jsx("div", {
183
- className: "border-border text-muted-foreground bg-muted flex items-center gap-2 border-b px-5 py-2 text-[10px] font-medium tracking-wider uppercase",
184
- children: columns.map((column) => {
185
- const fieldDef = fields?.[column.key];
186
- const label = getColumnLabel(column, fieldDef);
187
- return /* @__PURE__ */ jsx("div", {
188
- className: cn("min-w-0 flex-1", column.align === "center" && "text-center", column.align === "right" && "text-right"),
189
- style: column.width ? {
190
- width: column.width,
191
- flex: "none"
192
- } : void 0,
193
- children: resolveText(label)
194
- }, column.key);
195
- })
196
- }), items.map((item_0) => linkToDetail ? /* @__PURE__ */ jsx("button", {
197
- type: "button",
198
- className: "border-border hover:bg-muted flex w-full cursor-pointer items-center gap-2 border-b px-5 py-2.5 text-left transition-all last:border-0",
199
- onClick: () => handleRowClick(item_0),
200
- children: columns.map((column_0) => /* @__PURE__ */ jsx("div", {
201
- className: cn("min-w-0 flex-1 truncate text-sm", column_0.align === "center" && "text-center", column_0.align === "right" && "text-right"),
202
- style: column_0.width ? {
203
- width: column_0.width,
204
- flex: "none"
205
- } : void 0,
206
- children: /* @__PURE__ */ jsx(TableCellRenderer, {
207
- item: item_0,
208
- column: column_0,
209
- fields
210
- })
211
- }, column_0.key))
212
- }, item_0.id) : /* @__PURE__ */ jsx("div", {
213
- className: "border-border flex items-center gap-2 border-b px-5 py-2.5 last:border-0",
214
- children: columns.map((column_1) => /* @__PURE__ */ jsx("div", {
215
- className: cn("min-w-0 flex-1 truncate text-sm", column_1.align === "center" && "text-center", column_1.align === "right" && "text-right"),
216
- style: column_1.width ? {
217
- width: column_1.width,
218
- flex: "none"
219
- } : void 0,
220
- children: /* @__PURE__ */ jsx(TableCellRenderer, {
221
- item: item_0,
222
- column: column_1,
223
- fields
224
- })
225
- }, column_1.key))
226
- }, item_0.id))]
64
+ const { t } = useTranslation();
65
+ const { collection, columns: rawColumns, limit = 5, sortBy, sortOrder = "desc", filter, linkToDetail, emptyMessage, realtime } = config;
66
+ const useServerData = !!config.hasLoader;
67
+ const serverQuery = useServerWidgetData(config.id, {
68
+ enabled: useServerData,
69
+ refreshInterval: config.refreshInterval
70
+ });
71
+ const listColumns = React.useMemo(() => rawColumns.map(toListColumnConfig), [rawColumns]);
72
+ const listConfig = React.useMemo(() => ({ columns: listColumns }), [listColumns]);
73
+ const { fields, isLoading: fieldsLoading, error: fieldsError } = useCollectionFields(collection, { schemaQueryOptions: { enabled: !!collection } });
74
+ const { data: collectionMeta, isLoading: metaLoading, error: metaError } = useCollectionMeta(collection, { enabled: !!collection });
75
+ const expandedFields = React.useMemo(() => autoExpandFields({
76
+ fields,
77
+ list: listConfig,
78
+ relations: collectionMeta?.relations
79
+ }), [
80
+ fields,
81
+ listConfig,
82
+ collectionMeta?.relations
83
+ ]);
84
+ const queryOptions = { limit };
85
+ if (sortBy) queryOptions.orderBy = { [sortBy]: sortOrder };
86
+ if (filter) queryOptions.where = filter;
87
+ if (hasFieldsToExpand(expandedFields)) queryOptions.with = expandedFields;
88
+ const collectionQuery = useCollectionList(collection, queryOptions, { enabled: !useServerData }, { realtime });
89
+ const { data, isLoading, error, refetch, isFetching } = useServerData ? serverQuery : collectionQuery;
90
+ const items = Array.isArray(data) ? data : Array.isArray(data?.docs) ? data.docs : [];
91
+ const title = config.title ? resolveText(config.title) : void 0;
92
+ const table = useReactTable({
93
+ data: items,
94
+ columns: React.useMemo(() => buildColumns({
95
+ config: {
96
+ fields,
97
+ list: listConfig
98
+ },
99
+ fallbackColumns: listColumns.map((column) => typeof column === "string" ? column : column.field),
100
+ meta: collectionMeta
101
+ }), [
102
+ fields,
103
+ listConfig,
104
+ listColumns,
105
+ collectionMeta
106
+ ]),
107
+ getCoreRowModel: getCoreRowModel(),
108
+ getRowId: (row, index) => String(row.id ?? row._id ?? index)
227
109
  });
228
- let t9;
229
- if ($[23] !== columns.length || $[24] !== limit) {
230
- t9 = /* @__PURE__ */ jsx(TableWidgetSkeleton, {
110
+ const visibleColumns = table.getVisibleLeafColumns();
111
+ const rows = table.getRowModel().rows;
112
+ const isWidgetLoading = isLoading || fieldsLoading && !fieldsError || metaLoading && !metaError;
113
+ const handleRowClick = (item) => {
114
+ if (linkToDetail && navigate) navigate(`${basePath}/collections/${collection}/${item.id}`);
115
+ };
116
+ const resolvedEmptyMessage = emptyMessage ? resolveText(emptyMessage) : void 0;
117
+ const emptyContent = /* @__PURE__ */ jsx(WidgetEmptyState, {
118
+ iconName: "ph:table",
119
+ title: resolvedEmptyMessage ?? t("widget.table.emptyTitle"),
120
+ description: resolvedEmptyMessage ? void 0 : t("widget.table.emptyDescription"),
121
+ className: "min-h-32"
122
+ });
123
+ const tableContent = items.length === 0 ? emptyContent : /* @__PURE__ */ jsx("div", {
124
+ className: "qa-table-widget__table -mx-4 -mb-4 min-h-0 min-w-0",
125
+ children: /* @__PURE__ */ jsxs(Table, {
126
+ "aria-label": title ?? `${formatLabel(collection)} table`,
127
+ className: "min-w-full table-fixed",
128
+ style: { minWidth: table.getTotalSize() },
129
+ children: [
130
+ /* @__PURE__ */ jsx("colgroup", { children: visibleColumns.map((column_0) => /* @__PURE__ */ jsx("col", { style: { width: column_0.getSize() } }, column_0.id)) }),
131
+ /* @__PURE__ */ jsx(TableHeader, { children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsx(TableRow, {
132
+ className: "hover:bg-transparent",
133
+ children: headerGroup.headers.map((header) => {
134
+ const meta = header.column.columnDef.meta;
135
+ return /* @__PURE__ */ jsx(TableHead, {
136
+ className: getAlignClass(meta?.align),
137
+ style: getColumnSizeStyle(header.column),
138
+ children: header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())
139
+ }, header.id);
140
+ })
141
+ }, headerGroup.id)) }),
142
+ /* @__PURE__ */ jsx(TableBody, { children: rows.map((row_0) => {
143
+ const canNavigate = !!linkToDetail && !!navigate && !!row_0.original?.id;
144
+ return /* @__PURE__ */ jsx(TableRow, {
145
+ role: canNavigate ? "link" : void 0,
146
+ tabIndex: canNavigate ? 0 : void 0,
147
+ className: cn(canNavigate && "cursor-pointer"),
148
+ onClick: canNavigate ? () => handleRowClick(row_0.original) : void 0,
149
+ onKeyDown: canNavigate ? (event) => {
150
+ if (event.key === "Enter" || event.key === " ") {
151
+ event.preventDefault();
152
+ handleRowClick(row_0.original);
153
+ }
154
+ } : void 0,
155
+ children: row_0.getVisibleCells().map((cell) => {
156
+ const meta_0 = cell.column.columnDef.meta;
157
+ return /* @__PURE__ */ jsx(TableCell, {
158
+ className: cn(getAlignClass(meta_0?.align), meta_0?.className),
159
+ style: getColumnSizeStyle(cell.column),
160
+ children: flexRender(cell.column.columnDef.cell, cell.getContext())
161
+ }, cell.id);
162
+ })
163
+ }, row_0.id);
164
+ }) })
165
+ ]
166
+ })
167
+ });
168
+ return /* @__PURE__ */ jsx(WidgetCard, {
169
+ title,
170
+ description: config.description ? resolveText(config.description) : void 0,
171
+ variant: config.cardVariant,
172
+ isLoading: isWidgetLoading,
173
+ isRefreshing: isFetching && !isWidgetLoading,
174
+ className: cn("qa-table-widget", config.className),
175
+ loadingSkeleton: /* @__PURE__ */ jsx(TableWidgetSkeleton, {
231
176
  rows: limit,
232
- columns: columns.length
233
- });
234
- $[23] = columns.length;
235
- $[24] = limit;
236
- $[25] = t9;
237
- } else t9 = $[25];
238
- let t10;
239
- if ($[26] !== error) {
240
- t10 = error instanceof Error ? error : error ? new Error(String(error)) : null;
241
- $[26] = error;
242
- $[27] = t10;
243
- } else t10 = $[27];
244
- let t11;
245
- if ($[28] !== refetch) {
246
- t11 = () => refetch();
247
- $[28] = refetch;
248
- $[29] = t11;
249
- } else t11 = $[29];
250
- let t12;
251
- if ($[30] !== isLoading || $[31] !== t10 || $[32] !== t11 || $[33] !== t9 || $[34] !== tableContent || $[35] !== title) {
252
- t12 = /* @__PURE__ */ jsx(WidgetCard, {
253
- title,
254
- isLoading,
255
- className: "qa-table-widget",
256
- loadingSkeleton: t9,
257
- error: t10,
258
- onRefresh: t11,
259
- children: tableContent
260
- });
261
- $[30] = isLoading;
262
- $[31] = t10;
263
- $[32] = t11;
264
- $[33] = t9;
265
- $[34] = tableContent;
266
- $[35] = title;
267
- $[36] = t12;
268
- } else t12 = $[36];
269
- return t12;
177
+ columns: rawColumns.length
178
+ }),
179
+ error: error instanceof Error ? error : error ? new Error(String(error)) : null,
180
+ onRefresh: () => refetch(),
181
+ actions: config.actions,
182
+ children: tableContent
183
+ });
270
184
  }
271
185
 
272
186
  //#endregion