@questpie/admin 3.0.4 → 3.0.6

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 (90) hide show
  1. package/README.md +99 -1
  2. package/dist/client/builder/types/field-types.d.mts +11 -0
  3. package/dist/client/components/blocks/block-editor-layout.mjs +2 -2
  4. package/dist/client/components/blocks/block-library-sidebar.mjs +89 -61
  5. package/dist/client/components/brand-logo.d.mts +25 -0
  6. package/dist/client/components/brand-logo.mjs +174 -0
  7. package/dist/client/components/media/media-grid.mjs +95 -78
  8. package/dist/client/components/primitives/select-multi.mjs +388 -368
  9. package/dist/client/components/primitives/select-single.mjs +344 -331
  10. package/dist/client/components/widgets/chart-widget.mjs +78 -62
  11. package/dist/client/components/widgets/progress-widget.mjs +39 -37
  12. package/dist/client/components/widgets/quick-actions-widget.mjs +111 -90
  13. package/dist/client/components/widgets/recent-items-widget.mjs +40 -38
  14. package/dist/client/components/widgets/table-widget.mjs +4 -3
  15. package/dist/client/components/widgets/timeline-widget.mjs +92 -74
  16. package/dist/client/components/widgets/value-widget.mjs +164 -144
  17. package/dist/client/create-admin-client.d.mts +7 -0
  18. package/dist/client/create-admin-client.mjs +25 -0
  19. package/dist/client/hooks/use-brand.d.mts +22 -0
  20. package/dist/client/hooks/use-brand.mjs +52 -0
  21. package/dist/client/hooks/use-server-actions.mjs +21 -16
  22. package/dist/client/preview/block-scope-context.d.mts +2 -2
  23. package/dist/client/preview/preview-banner.d.mts +2 -2
  24. package/dist/client/preview/preview-banner.mjs +75 -46
  25. package/dist/client/runtime/index.mjs +1 -1
  26. package/dist/client/runtime/provider.d.mts +4 -0
  27. package/dist/client/runtime/provider.mjs +38 -8
  28. package/dist/client/styles/base.css +4 -0
  29. package/dist/client/types/admin-config.d.mts +24 -0
  30. package/dist/client/views/auth/auth-layout.d.mts +6 -1
  31. package/dist/client/views/auth/auth-layout.mjs +116 -102
  32. package/dist/client/views/collection/auto-form-fields.mjs +2 -0
  33. package/dist/client/views/collection/field-renderer.mjs +3 -2
  34. package/dist/client/views/collection/table-view.mjs +26 -26
  35. package/dist/client/views/globals/global-form-view.mjs +908 -863
  36. package/dist/client/views/layout/admin-layout.mjs +151 -131
  37. package/dist/client/views/layout/admin-router.mjs +297 -180
  38. package/dist/client/views/layout/admin-sidebar.mjs +178 -156
  39. package/dist/client/views/pages/accept-invite-page.mjs +122 -144
  40. package/dist/client/views/pages/forgot-password-page.mjs +22 -30
  41. package/dist/client/views/pages/invite-page.mjs +24 -33
  42. package/dist/client/views/pages/login-page.mjs +24 -32
  43. package/dist/client/views/pages/reset-password-page.mjs +77 -92
  44. package/dist/client/views/pages/setup-page.mjs +73 -65
  45. package/dist/client.d.mts +6 -2
  46. package/dist/client.mjs +5 -2
  47. package/dist/index.d.mts +6 -2
  48. package/dist/index.mjs +5 -2
  49. package/dist/server/augmentation/dashboard.d.mts +23 -5
  50. package/dist/server/augmentation/form-layout.d.mts +10 -0
  51. package/dist/server/augmentation/index.d.mts +1 -1
  52. package/dist/server/augmentation.d.mts +1 -1
  53. package/dist/server/i18n/index.mjs +13 -7
  54. package/dist/server/i18n/messages/cs.mjs +391 -1
  55. package/dist/server/i18n/messages/de.mjs +389 -1
  56. package/dist/server/i18n/messages/en.mjs +102 -0
  57. package/dist/server/i18n/messages/es.mjs +389 -1
  58. package/dist/server/i18n/messages/fr.mjs +389 -1
  59. package/dist/server/i18n/messages/pl.mjs +393 -1
  60. package/dist/server/i18n/messages/pt.mjs +386 -1
  61. package/dist/server/i18n/messages/sk.mjs +133 -1
  62. package/dist/server/modules/admin/collections/account.d.mts +50 -50
  63. package/dist/server/modules/admin/collections/admin-locks.d.mts +53 -53
  64. package/dist/server/modules/admin/collections/admin-preferences.d.mts +39 -39
  65. package/dist/server/modules/admin/collections/admin-saved-views.d.mts +47 -47
  66. package/dist/server/modules/admin/collections/apikey.d.mts +68 -68
  67. package/dist/server/modules/admin/collections/assets.d.mts +20 -20
  68. package/dist/server/modules/admin/collections/session.d.mts +42 -42
  69. package/dist/server/modules/admin/collections/user.d.mts +32 -32
  70. package/dist/server/modules/admin/collections/verification.d.mts +36 -36
  71. package/dist/server/modules/admin/dto/admin-config.dto.mjs +19 -1
  72. package/dist/server/modules/admin/routes/admin-config.d.mts +2 -2
  73. package/dist/server/modules/admin/routes/execute-action.d.mts +9 -9
  74. package/dist/server/modules/admin/routes/execute-action.mjs +34 -28
  75. package/dist/server/modules/admin/routes/i18n-helpers.mjs +34 -0
  76. package/dist/server/modules/admin/routes/locales.d.mts +2 -2
  77. package/dist/server/modules/admin/routes/preview.d.mts +11 -11
  78. package/dist/server/modules/admin/routes/preview.mjs +25 -17
  79. package/dist/server/modules/admin/routes/reactive.d.mts +9 -9
  80. package/dist/server/modules/admin/routes/route-helpers.mjs +1 -1
  81. package/dist/server/modules/admin/routes/setup.mjs +10 -7
  82. package/dist/server/modules/admin/routes/translations.d.mts +4 -4
  83. package/dist/server/modules/admin/routes/widget-data.d.mts +5 -5
  84. package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +23 -23
  85. package/dist/server.d.mts +4 -4
  86. package/dist/shared/preview-utils.d.mts +34 -1
  87. package/dist/shared/preview-utils.mjs +79 -1
  88. package/dist/shared.d.mts +2 -2
  89. package/dist/shared.mjs +2 -2
  90. package/package.json +3 -3
@@ -84,6 +84,7 @@ function renderFields({ fieldItems, fields, collection, mode = "collection", reg
84
84
  allCollectionsConfig,
85
85
  entityMeta,
86
86
  className: cn(item.className, spanClass),
87
+ extraProps: item.props,
87
88
  renderEmbeddedFields: ({ embeddedCollection, embeddedCollectionConfig, fullFieldName, index: embeddedIndex }) => /* @__PURE__ */ jsx(AutoFormFields, {
88
89
  collection: embeddedCollection,
89
90
  mode: "collection",
@@ -149,6 +150,7 @@ function FieldLayoutItems(t0) {
149
150
  allCollectionsConfig,
150
151
  entityMeta,
151
152
  className: typeof item === "object" && "className" in item ? item.className : void 0,
153
+ extraProps: typeof item === "object" && "props" in item ? item.props : void 0,
152
154
  renderEmbeddedFields: (t4) => {
153
155
  const { embeddedCollection, embeddedCollectionConfig, fullFieldName, index: embeddedIndex } = t4;
154
156
  return /* @__PURE__ */ jsx(AutoFormFields, {
@@ -144,7 +144,7 @@ function renderEmbeddedField({ context, registry, allCollectionsConfig, componen
144
144
  */
145
145
  function FieldRenderer(t0) {
146
146
  const $ = c(31);
147
- const { fieldName, fieldDef, collection, mode: t1, registry, fieldPrefix, allCollectionsConfig, renderEmbeddedFields, className, entityMeta: entityMetaProp } = t0;
147
+ const { fieldName, fieldDef, collection, mode: t1, registry, fieldPrefix, allCollectionsConfig, renderEmbeddedFields, className, entityMeta: entityMetaProp, extraProps } = t0;
148
148
  const mode = t1 === void 0 ? "collection" : t1;
149
149
  const form = useFormContext();
150
150
  const { locale } = useScopedLocale();
@@ -271,7 +271,8 @@ function FieldRenderer(t0) {
271
271
  readOnly: rawComponentProps.readOnly || isComputed,
272
272
  label: resolveText(rawComponentProps.label, "", formValues),
273
273
  description: resolveText(rawComponentProps.description, "", formValues),
274
- placeholder: resolveText(rawComponentProps.placeholder, "", formValues)
274
+ placeholder: resolveText(rawComponentProps.placeholder, "", formValues),
275
+ ...extraProps ?? {}
275
276
  };
276
277
  let content = null;
277
278
  if (context.type === "embedded") content = renderEmbeddedField({
@@ -298,9 +298,9 @@ function mapListSchemaToConfig(list) {
298
298
  config.actions = mapListActionsToDefinitions(list.actions);
299
299
  return config;
300
300
  }
301
- function stringifyGroupValue(value, field, resolveText) {
302
- if (value === null || value === void 0 || value === "") return "No value";
303
- if (Array.isArray(value)) return value.length > 0 ? value.map((item) => stringifyGroupValue(item, field, resolveText)).join(", ") : "No value";
301
+ function stringifyGroupValue(value, field, resolveText, noValueLabel = "No value") {
302
+ if (value === null || value === void 0 || value === "") return noValueLabel;
303
+ if (Array.isArray(value)) return value.length > 0 ? value.map((item) => stringifyGroupValue(item, field, resolveText, noValueLabel)).join(", ") : noValueLabel;
304
304
  const options = field?.options?.options;
305
305
  if (options) {
306
306
  const option = flattenOptions(options).find((item) => String(item.value) === String(value));
@@ -1061,9 +1061,9 @@ function TableViewInner({ collection, config, viewConfig, navigate, basePath = "
1061
1061
  const hasActiveFilters = viewState.config.filters.length > 0;
1062
1062
  const isOrderSortActive = canUseOrderableSort && effectiveSort?.field === orderField && (effectiveSort.direction ?? "asc") === orderDirection;
1063
1063
  const hasMultiplePages = !isSearching && (listData?.totalPages ?? 1) > 1;
1064
- const reorderHardBlocker = !isOrderableEnabled ? "Enable orderable before reordering" : !hasOrderField ? "Add a numeric order field before reordering" : isSearching ? "Clear search to reorder" : viewState.config.groupBy ? "Remove grouping to reorder" : hasActiveFilters ? "Clear filters to reorder" : hasMultiplePages ? "Show one page of items to reorder" : null;
1065
- const reorderTooltip = reorderHardBlocker ?? (isOrderSortActive ? isReorderMode ? "Exit reorder mode" : "Reorder items" : `Switch to ${orderField} sort and reorder`);
1066
- const reorderAriaLabel = reorderHardBlocker ? `Reorder unavailable: ${reorderHardBlocker}` : isReorderMode ? "Exit reorder mode" : "Enter reorder mode";
1064
+ const reorderHardBlocker = !isOrderableEnabled ? t("collection.reorderEnableOrderable") : !hasOrderField ? t("collection.reorderAddOrderField") : isSearching ? t("collection.reorderClearSearch") : viewState.config.groupBy ? t("collection.reorderRemoveGrouping") : hasActiveFilters ? t("collection.reorderClearFilters") : hasMultiplePages ? t("collection.reorderShowOnePage") : null;
1065
+ const reorderTooltip = reorderHardBlocker ?? (isOrderSortActive ? isReorderMode ? t("collection.reorderExitMode") : t("collection.reorderItems") : t("collection.reorderSwitchSort", { field: orderField }));
1066
+ const reorderAriaLabel = reorderHardBlocker ? t("collection.reorderUnavailable", { reason: reorderHardBlocker }) : isReorderMode ? t("collection.reorderExitMode") : t("collection.reorderEnterMode");
1067
1067
  const canReorder = isOrderableEnabled && !reorderHardBlocker;
1068
1068
  const handleReorderToggle = React.useCallback(() => {
1069
1069
  if (!canReorder) return;
@@ -1170,11 +1170,11 @@ function TableViewInner({ collection, config, viewConfig, navigate, basePath = "
1170
1170
  id: String(row_6.id),
1171
1171
  data: { [orderField]: (index + 1) * orderStep }
1172
1172
  })) });
1173
- actionHelpers.toast.success("Order saved");
1173
+ actionHelpers.toast.success(t("collection.orderSaved"));
1174
1174
  } catch (error) {
1175
1175
  clearReorderOverlay();
1176
1176
  setOptimisticOrderIds(previousOrderIds);
1177
- actionHelpers.toast.error(error instanceof Error ? error.message : "Could not save order");
1177
+ actionHelpers.toast.error(error instanceof Error ? error.message : t("collection.orderSaveFailed"));
1178
1178
  }
1179
1179
  }, [
1180
1180
  sortableRowIds,
@@ -1182,6 +1182,7 @@ function TableViewInner({ collection, config, viewConfig, navigate, basePath = "
1182
1182
  updateBatchMutation,
1183
1183
  orderField,
1184
1184
  orderStep,
1185
+ t,
1185
1186
  actionHelpers.toast,
1186
1187
  clearReorderOverlay
1187
1188
  ]);
@@ -1198,7 +1199,7 @@ function TableViewInner({ collection, config, viewConfig, navigate, basePath = "
1198
1199
  if (serverGroups?.length) {
1199
1200
  const rowsById_0 = new Map(rows.map((row_8) => [row_8.id, row_8]));
1200
1201
  return serverGroups.flatMap((group) => {
1201
- const label = stringifyGroupValue(group.value, groupField, resolveText);
1202
+ const label = stringifyGroupValue(group.value, groupField, resolveText, t("common.noValue"));
1202
1203
  const groupKey = `${groupBy_0}:${label}`;
1203
1204
  const collapsed = collapsedGroups.has(groupKey);
1204
1205
  const groupRows = (group.docs ?? []).map((doc) => rowsById_0.get(String(doc.id))).filter(Boolean);
@@ -1216,7 +1217,7 @@ function TableViewInner({ collection, config, viewConfig, navigate, basePath = "
1216
1217
  }
1217
1218
  const groups = /* @__PURE__ */ new Map();
1218
1219
  for (const row_10 of rows) {
1219
- const valueLabel = stringifyGroupValue(row_10.original?.[groupBy_0], groupField, resolveText);
1220
+ const valueLabel = stringifyGroupValue(row_10.original?.[groupBy_0], groupField, resolveText, t("common.noValue"));
1220
1221
  const groupKey_0 = `${groupBy_0}:${valueLabel}`;
1221
1222
  const group_0 = groups.get(groupKey_0);
1222
1223
  if (group_0) {
@@ -1249,7 +1250,8 @@ function TableViewInner({ collection, config, viewConfig, navigate, basePath = "
1249
1250
  groupableFields,
1250
1251
  isSearching,
1251
1252
  listData?.groups,
1252
- resolveText
1253
+ resolveText,
1254
+ t
1253
1255
  ]);
1254
1256
  const handleSaveView = (name, config_0) => {
1255
1257
  saveViewMutation.mutate({
@@ -1427,24 +1429,21 @@ function TableViewInner({ collection, config, viewConfig, navigate, basePath = "
1427
1429
  }),
1428
1430
  /* @__PURE__ */ jsx("span", {
1429
1431
  className: "text-foreground font-medium",
1430
- children: "Reorder mode"
1432
+ children: t("collection.reorderMode")
1431
1433
  }),
1432
- /* @__PURE__ */ jsxs("span", {
1434
+ /* @__PURE__ */ jsx("span", {
1433
1435
  className: "hidden sm:inline",
1434
- children: [
1435
- "Sorted by ",
1436
- orderField,
1437
- " ",
1438
- orderDirection,
1439
- "."
1440
- ]
1436
+ children: t("collection.sortedByField", {
1437
+ field: orderField,
1438
+ direction: orderDirection
1439
+ })
1441
1440
  })
1442
1441
  ]
1443
1442
  }), /* @__PURE__ */ jsx(Button, {
1444
1443
  variant: "ghost",
1445
1444
  size: "xs",
1446
1445
  onClick: () => setIsReorderMode(false),
1447
- children: "Done"
1446
+ children: t("common.done")
1448
1447
  })]
1449
1448
  }),
1450
1449
  /* @__PURE__ */ jsx(BulkActionToolbar, {
@@ -1635,13 +1634,14 @@ function TableViewInner({ collection, config, viewConfig, navigate, basePath = "
1635
1634
  children: [/* @__PURE__ */ jsxs("span", { children: [
1636
1635
  filteredItems.length > 0 ? `${((viewState.config.pagination?.page ?? 1) - 1) * (viewState.config.pagination?.pageSize ?? 25) + 1}-${Math.min(((viewState.config.pagination?.page ?? 1) - 1) * (viewState.config.pagination?.pageSize ?? 25) + (viewState.config.pagination?.pageSize ?? 25), listData?.totalDocs ?? filteredItems.length)}` : "0",
1637
1636
  " ",
1638
- "of ",
1637
+ t("table.of"),
1638
+ " ",
1639
1639
  listData?.totalDocs ?? 0
1640
1640
  ] }), /* @__PURE__ */ jsxs("div", {
1641
1641
  className: "flex items-center gap-2",
1642
1642
  children: [/* @__PURE__ */ jsx("span", {
1643
1643
  className: "text-muted-foreground",
1644
- children: "Show"
1644
+ children: t("table.show")
1645
1645
  }), /* @__PURE__ */ jsxs(Select, {
1646
1646
  value: String(viewState.config.pagination?.pageSize ?? 25),
1647
1647
  onValueChange: (value_0) => viewState.setPageSize(Number(value_0)),
@@ -1671,7 +1671,7 @@ function TableViewInner({ collection, config, viewConfig, navigate, basePath = "
1671
1671
  className: "size-8 p-0",
1672
1672
  disabled: (viewState.config.pagination?.page ?? 1) <= 1,
1673
1673
  onClick: () => viewState.setPage((viewState.config.pagination?.page ?? 1) - 1),
1674
- "aria-label": "Previous page",
1674
+ "aria-label": t("table.previousPage"),
1675
1675
  children: /* @__PURE__ */ jsx(Icon, {
1676
1676
  icon: "ph:caret-left",
1677
1677
  className: "size-4"
@@ -1690,7 +1690,7 @@ function TableViewInner({ collection, config, viewConfig, navigate, basePath = "
1690
1690
  size: "sm",
1691
1691
  className: "size-8 min-w-[32px] p-0 tabular-nums",
1692
1692
  onClick: () => viewState.setPage(pageNum),
1693
- "aria-label": `Page ${pageNum}`,
1693
+ "aria-label": t("table.page", { page: pageNum }),
1694
1694
  "aria-current": currentPage === pageNum ? "page" : void 0,
1695
1695
  children: pageNum
1696
1696
  }, pageNum);
@@ -1701,7 +1701,7 @@ function TableViewInner({ collection, config, viewConfig, navigate, basePath = "
1701
1701
  className: "size-8 p-0",
1702
1702
  disabled: (viewState.config.pagination?.page ?? 1) >= (listData?.totalPages ?? 1),
1703
1703
  onClick: () => viewState.setPage((viewState.config.pagination?.page ?? 1) + 1),
1704
- "aria-label": "Next page",
1704
+ "aria-label": t("table.nextPage"),
1705
1705
  children: /* @__PURE__ */ jsx(Icon, {
1706
1706
  icon: "ph:caret-right",
1707
1707
  className: "size-4"