@strapi/content-manager 0.0.0-experimental.a53a4b1c8f7981a689823cdd719105671e1c6392 → 0.0.0-experimental.a6728ad43ac70ae19dabb624dbfca1f2d9610a86

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 (130) hide show
  1. package/LICENSE +18 -3
  2. package/dist/_chunks/{ComponentConfigurationPage-DmwmiFQy.mjs → ComponentConfigurationPage-DJ5voqEK.mjs} +3 -3
  3. package/dist/_chunks/{ComponentConfigurationPage-DmwmiFQy.mjs.map → ComponentConfigurationPage-DJ5voqEK.mjs.map} +1 -1
  4. package/dist/_chunks/{ComponentConfigurationPage-C-49MccQ.js → ComponentConfigurationPage-_6osrv39.js} +3 -3
  5. package/dist/_chunks/{ComponentConfigurationPage-C-49MccQ.js.map → ComponentConfigurationPage-_6osrv39.js.map} +1 -1
  6. package/dist/_chunks/{EditConfigurationPage-JT3E7NZy.mjs → EditConfigurationPage-CZofxSLy.mjs} +3 -3
  7. package/dist/_chunks/{EditConfigurationPage-JT3E7NZy.mjs.map → EditConfigurationPage-CZofxSLy.mjs.map} +1 -1
  8. package/dist/_chunks/{EditConfigurationPage-DjFJw56M.js → EditConfigurationPage-ZN3s568V.js} +3 -3
  9. package/dist/_chunks/{EditConfigurationPage-DjFJw56M.js.map → EditConfigurationPage-ZN3s568V.js.map} +1 -1
  10. package/dist/_chunks/{EditViewPage-zT3fBr4Y.js → EditViewPage-Co2IKQZH.js} +19 -8
  11. package/dist/_chunks/EditViewPage-Co2IKQZH.js.map +1 -0
  12. package/dist/_chunks/{EditViewPage-CPj61RMh.mjs → EditViewPage-HYljoEY7.mjs} +19 -8
  13. package/dist/_chunks/EditViewPage-HYljoEY7.mjs.map +1 -0
  14. package/dist/_chunks/{Field-dha5VnIQ.mjs → Field-BOPUMZ1u.mjs} +194 -141
  15. package/dist/_chunks/Field-BOPUMZ1u.mjs.map +1 -0
  16. package/dist/_chunks/{Field-Boxf9Ajp.js → Field-G9CkFUtP.js} +196 -143
  17. package/dist/_chunks/Field-G9CkFUtP.js.map +1 -0
  18. package/dist/_chunks/{Form-DHrru2AV.mjs → Form-CDwNp7pU.mjs} +35 -16
  19. package/dist/_chunks/Form-CDwNp7pU.mjs.map +1 -0
  20. package/dist/_chunks/{Form-y5g1SRsh.js → Form-crsbkGxI.js} +35 -16
  21. package/dist/_chunks/Form-crsbkGxI.js.map +1 -0
  22. package/dist/_chunks/{History-Bru_KoeP.mjs → History-BDZrgfZ3.mjs} +44 -19
  23. package/dist/_chunks/History-BDZrgfZ3.mjs.map +1 -0
  24. package/dist/_chunks/{History-CqN6K7SX.js → History-CWcM9HnW.js} +44 -19
  25. package/dist/_chunks/History-CWcM9HnW.js.map +1 -0
  26. package/dist/_chunks/{ListConfigurationPage-D8wGABj0.mjs → ListConfigurationPage-BZ3ScUna.mjs} +20 -8
  27. package/dist/_chunks/ListConfigurationPage-BZ3ScUna.mjs.map +1 -0
  28. package/dist/_chunks/{ListConfigurationPage-R_p-SbHZ.js → ListConfigurationPage-DGzoQD_I.js} +20 -8
  29. package/dist/_chunks/ListConfigurationPage-DGzoQD_I.js.map +1 -0
  30. package/dist/_chunks/{ListViewPage-pEw_zug9.js → ListViewPage-BBAC9aPu.js} +60 -42
  31. package/dist/_chunks/ListViewPage-BBAC9aPu.js.map +1 -0
  32. package/dist/_chunks/{ListViewPage-SID6TRb9.mjs → ListViewPage-CsX7tWx-.mjs} +58 -40
  33. package/dist/_chunks/ListViewPage-CsX7tWx-.mjs.map +1 -0
  34. package/dist/_chunks/{NoContentTypePage-C5dcQojD.js → NoContentTypePage-CwVDx_YC.js} +2 -2
  35. package/dist/_chunks/{NoContentTypePage-C5dcQojD.js.map → NoContentTypePage-CwVDx_YC.js.map} +1 -1
  36. package/dist/_chunks/{NoContentTypePage-CJ7UXwrQ.mjs → NoContentTypePage-LClTUPWs.mjs} +2 -2
  37. package/dist/_chunks/{NoContentTypePage-CJ7UXwrQ.mjs.map → NoContentTypePage-LClTUPWs.mjs.map} +1 -1
  38. package/dist/_chunks/{NoPermissionsPage-BtPrImPP.js → NoPermissionsPage-D2iWw-sn.js} +2 -2
  39. package/dist/_chunks/{NoPermissionsPage-BtPrImPP.js.map → NoPermissionsPage-D2iWw-sn.js.map} +1 -1
  40. package/dist/_chunks/{NoPermissionsPage-B7syEq5E.mjs → NoPermissionsPage-S4Re3FwO.mjs} +2 -2
  41. package/dist/_chunks/{NoPermissionsPage-B7syEq5E.mjs.map → NoPermissionsPage-S4Re3FwO.mjs.map} +1 -1
  42. package/dist/_chunks/{Relations-B9Crnhnn.mjs → Relations-Dmv0Tpe5.mjs} +4 -4
  43. package/dist/_chunks/Relations-Dmv0Tpe5.mjs.map +1 -0
  44. package/dist/_chunks/{Relations-DjTQ5kGB.js → Relations-jwuTFGOV.js} +4 -4
  45. package/dist/_chunks/Relations-jwuTFGOV.js.map +1 -0
  46. package/dist/_chunks/{en-fbKQxLGn.js → en-BlhnxQfj.js} +11 -9
  47. package/dist/_chunks/{en-fbKQxLGn.js.map → en-BlhnxQfj.js.map} +1 -1
  48. package/dist/_chunks/{en-Ux26r5pl.mjs → en-C8YBvRrK.mjs} +11 -9
  49. package/dist/_chunks/{en-Ux26r5pl.mjs.map → en-C8YBvRrK.mjs.map} +1 -1
  50. package/dist/_chunks/{index-DJXJw9V5.mjs → index-BmUAydCA.mjs} +977 -680
  51. package/dist/_chunks/index-BmUAydCA.mjs.map +1 -0
  52. package/dist/_chunks/{index-DVPWZkbS.js → index-CBX6KyXv.js} +958 -661
  53. package/dist/_chunks/index-CBX6KyXv.js.map +1 -0
  54. package/dist/_chunks/{layout-Bau7ZfLV.mjs → layout-ClP-DC72.mjs} +25 -12
  55. package/dist/_chunks/layout-ClP-DC72.mjs.map +1 -0
  56. package/dist/_chunks/{layout-Dm6fbiQj.js → layout-CxxkX9jY.js} +24 -11
  57. package/dist/_chunks/layout-CxxkX9jY.js.map +1 -0
  58. package/dist/_chunks/{relations-CKnpRgrN.js → relations-DIjTADIu.js} +2 -2
  59. package/dist/_chunks/{relations-CKnpRgrN.js.map → relations-DIjTADIu.js.map} +1 -1
  60. package/dist/_chunks/{relations-BH_kBSJ0.mjs → relations-op89RClB.mjs} +2 -2
  61. package/dist/_chunks/{relations-BH_kBSJ0.mjs.map → relations-op89RClB.mjs.map} +1 -1
  62. package/dist/_chunks/{usePrev-B9w_-eYc.js → useDebounce-CtcjDB3L.js} +14 -1
  63. package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -0
  64. package/dist/_chunks/useDebounce-DmuSJIF3.mjs +29 -0
  65. package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -0
  66. package/dist/admin/index.js +2 -1
  67. package/dist/admin/index.js.map +1 -1
  68. package/dist/admin/index.mjs +5 -4
  69. package/dist/admin/src/exports.d.ts +1 -1
  70. package/dist/admin/src/history/index.d.ts +3 -0
  71. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  72. package/dist/admin/src/hooks/useDocument.d.ts +30 -1
  73. package/dist/admin/src/index.d.ts +1 -0
  74. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -0
  75. package/dist/admin/src/pages/EditView/components/FormInputs/Relations.d.ts +20 -0
  76. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
  77. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.d.ts +2 -2
  78. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +4 -48
  79. package/dist/admin/src/pages/EditView/components/Header.d.ts +10 -11
  80. package/dist/admin/src/services/api.d.ts +1 -1
  81. package/dist/admin/src/services/components.d.ts +2 -2
  82. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  83. package/dist/admin/src/services/documents.d.ts +19 -17
  84. package/dist/admin/src/services/init.d.ts +1 -1
  85. package/dist/admin/src/services/relations.d.ts +2 -2
  86. package/dist/admin/src/services/uid.d.ts +3 -3
  87. package/dist/admin/src/utils/validation.d.ts +4 -1
  88. package/dist/server/index.js +181 -107
  89. package/dist/server/index.js.map +1 -1
  90. package/dist/server/index.mjs +182 -108
  91. package/dist/server/index.mjs.map +1 -1
  92. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  93. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  94. package/dist/server/src/controllers/uid.d.ts.map +1 -1
  95. package/dist/server/src/controllers/validation/dimensions.d.ts +4 -2
  96. package/dist/server/src/controllers/validation/dimensions.d.ts.map +1 -1
  97. package/dist/server/src/history/services/history.d.ts.map +1 -1
  98. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  99. package/dist/server/src/history/services/utils.d.ts +2 -1
  100. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  101. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  102. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  103. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  104. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  105. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  106. package/dist/shared/contracts/collection-types.d.ts +3 -1
  107. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  108. package/package.json +11 -11
  109. package/dist/_chunks/EditViewPage-CPj61RMh.mjs.map +0 -1
  110. package/dist/_chunks/EditViewPage-zT3fBr4Y.js.map +0 -1
  111. package/dist/_chunks/Field-Boxf9Ajp.js.map +0 -1
  112. package/dist/_chunks/Field-dha5VnIQ.mjs.map +0 -1
  113. package/dist/_chunks/Form-DHrru2AV.mjs.map +0 -1
  114. package/dist/_chunks/Form-y5g1SRsh.js.map +0 -1
  115. package/dist/_chunks/History-Bru_KoeP.mjs.map +0 -1
  116. package/dist/_chunks/History-CqN6K7SX.js.map +0 -1
  117. package/dist/_chunks/ListConfigurationPage-D8wGABj0.mjs.map +0 -1
  118. package/dist/_chunks/ListConfigurationPage-R_p-SbHZ.js.map +0 -1
  119. package/dist/_chunks/ListViewPage-SID6TRb9.mjs.map +0 -1
  120. package/dist/_chunks/ListViewPage-pEw_zug9.js.map +0 -1
  121. package/dist/_chunks/Relations-B9Crnhnn.mjs.map +0 -1
  122. package/dist/_chunks/Relations-DjTQ5kGB.js.map +0 -1
  123. package/dist/_chunks/index-DJXJw9V5.mjs.map +0 -1
  124. package/dist/_chunks/index-DVPWZkbS.js.map +0 -1
  125. package/dist/_chunks/layout-Bau7ZfLV.mjs.map +0 -1
  126. package/dist/_chunks/layout-Dm6fbiQj.js.map +0 -1
  127. package/dist/_chunks/usePrev-B9w_-eYc.js.map +0 -1
  128. package/dist/_chunks/usePrev-DH6iah0A.mjs +0 -16
  129. package/dist/_chunks/usePrev-DH6iah0A.mjs.map +0 -1
  130. package/strapi-server.js +0 -3
@@ -10,12 +10,12 @@ const qs = require("qs");
10
10
  const reactIntl = require("react-intl");
11
11
  const reactRouterDom = require("react-router-dom");
12
12
  const styledComponents = require("styled-components");
13
- const index = require("./index-DVPWZkbS.js");
14
- const usePrev = require("./usePrev-B9w_-eYc.js");
13
+ const index = require("./index-CBX6KyXv.js");
14
+ const useDebounce = require("./useDebounce-CtcjDB3L.js");
15
15
  const isEmpty = require("lodash/isEmpty");
16
16
  const parseISO = require("date-fns/parseISO");
17
17
  const toString = require("lodash/toString");
18
- const relations = require("./relations-CKnpRgrN.js");
18
+ const relations = require("./relations-DIjTADIu.js");
19
19
  const hooks = require("./hooks-BAaaKPS_.js");
20
20
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
21
21
  function _interopNamespace(e) {
@@ -147,6 +147,15 @@ const FiltersImpl = ({ disabled, schema }) => {
147
147
  }
148
148
  };
149
149
  }
150
+ if (attribute.type === "enumeration") {
151
+ filter = {
152
+ ...filter,
153
+ options: attribute.enum.map((value) => ({
154
+ label: value,
155
+ value
156
+ }))
157
+ };
158
+ }
150
159
  return filter;
151
160
  }).filter(Boolean).toSorted((a, b) => formatter.compare(a.label, b.label));
152
161
  }, [
@@ -189,18 +198,22 @@ const FiltersImpl = ({ disabled, schema }) => {
189
198
  );
190
199
  };
191
200
  const AdminUsersFilter = ({ name }) => {
192
- const [page, setPage] = React__namespace.useState(1);
201
+ const [pageSize, setPageSize] = React__namespace.useState(10);
202
+ const [search, setSearch] = React__namespace.useState("");
193
203
  const { formatMessage } = reactIntl.useIntl();
204
+ const debouncedSearch = useDebounce.useDebounce(search, 300);
194
205
  const { data, isLoading } = strapiAdmin.useAdminUsers({
195
- page
206
+ pageSize,
207
+ _q: debouncedSearch
196
208
  });
197
209
  const field = strapiAdmin.useField(name);
198
210
  const handleOpenChange = (isOpen) => {
199
211
  if (!isOpen) {
200
- setPage(1);
212
+ setPageSize(10);
201
213
  }
202
214
  };
203
- const users = data?.users || [];
215
+ const { users = [], pagination } = data ?? {};
216
+ const { pageCount = 1, page = 1 } = pagination ?? {};
204
217
  return /* @__PURE__ */ jsxRuntime.jsx(
205
218
  designSystem.Combobox,
206
219
  {
@@ -212,7 +225,11 @@ const AdminUsersFilter = ({ name }) => {
212
225
  onOpenChange: handleOpenChange,
213
226
  onChange: (value) => field.onChange(name, value),
214
227
  loading: isLoading,
215
- onLoadMore: () => setPage((prev) => prev + 1),
228
+ onLoadMore: () => setPageSize(pageSize + 10),
229
+ hasMoreItems: page < pageCount,
230
+ onInputChange: (e) => {
231
+ setSearch(e.currentTarget.value);
232
+ },
216
233
  children: users.map((user) => {
217
234
  return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ComboboxOption, { value: user.id.toString(), children: index.getDisplayName(user) }, user.id);
218
235
  })
@@ -262,9 +279,8 @@ const RepeatableComponent = ({ content, mainField }) => {
262
279
  return null;
263
280
  }
264
281
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Root, { children: [
265
- /* @__PURE__ */ jsxRuntime.jsxs(MenuTrigger$1, { onClick: (e) => e.stopPropagation(), children: [
282
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Trigger, { onClick: (e) => e.stopPropagation(), children: [
266
283
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Badge, { children: content.length }),
267
- " ",
268
284
  formatMessage(
269
285
  {
270
286
  id: "content-manager.containers.list.items",
@@ -276,18 +292,12 @@ const RepeatableComponent = ({ content, mainField }) => {
276
292
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Content, { children: content.map((item) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Item, { disabled: true, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { maxWidth: "50rem", ellipsis: true, children: /* @__PURE__ */ jsxRuntime.jsx(CellValue, { type: mainField.type, value: item[mainField.name] }) }) }, item.id)) })
277
293
  ] });
278
294
  };
279
- const MenuTrigger$1 = styledComponents.styled(designSystem.Menu.Trigger)`
280
- svg {
281
- width: 0.6rem;
282
- height: 0.4rem;
283
- }
284
- `;
285
295
  const getFileExtension = (ext) => ext && ext[0] === "." ? ext.substring(1) : ext;
286
296
  const MediaSingle = ({ url, mime, alternativeText, name, ext, formats }) => {
287
- const fileURL = usePrev.prefixFileUrlWithBackendUrl(url);
297
+ const fileURL = useDebounce.prefixFileUrlWithBackendUrl(url);
288
298
  if (mime.includes("image")) {
289
299
  const thumbnail = formats?.thumbnail?.url;
290
- const mediaURL = usePrev.prefixFileUrlWithBackendUrl(thumbnail) || fileURL;
300
+ const mediaURL = useDebounce.prefixFileUrlWithBackendUrl(thumbnail) || fileURL;
291
301
  return /* @__PURE__ */ jsxRuntime.jsx(
292
302
  designSystem.Avatar.Item,
293
303
  {
@@ -357,6 +367,7 @@ const RelationMultiple = ({ mainField, content, rowId, name }) => {
357
367
  refetchOnMountOrArgChange: true
358
368
  }
359
369
  );
370
+ const contentCount = Array.isArray(content) ? content.length : content.count;
360
371
  React__namespace.useEffect(() => {
361
372
  if (data) {
362
373
  notifyStatus(
@@ -368,16 +379,13 @@ const RelationMultiple = ({ mainField, content, rowId, name }) => {
368
379
  }
369
380
  }, [data, formatMessage, notifyStatus]);
370
381
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Root, { onOpenChange: (isOpen2) => setIsOpen(isOpen2), children: [
371
- /* @__PURE__ */ jsxRuntime.jsx(MenuTrigger, { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 1, wrap: "nowrap", children: [
372
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Badge, { children: content.count }),
373
- formatMessage(
374
- {
375
- id: "content-manager.containers.list.items",
376
- defaultMessage: "{number, plural, =0 {items} one {item} other {items}}"
377
- },
378
- { number: content.count }
379
- )
380
- ] }) }),
382
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Trigger, { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { style: { cursor: "pointer" }, textColor: "neutral800", fontWeight: "regular", children: contentCount > 0 ? formatMessage(
383
+ {
384
+ id: "content-manager.containers.list.items",
385
+ defaultMessage: "{number} {number, plural, =0 {items} one {item} other {items}}"
386
+ },
387
+ { number: contentCount }
388
+ ) : "-" }) }),
381
389
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Content, { children: [
382
390
  isLoading && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Item, { disabled: true, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Loader, { small: true, children: formatMessage({
383
391
  id: index.getTranslation("ListViewTable.relation-loading"),
@@ -400,15 +408,17 @@ const RelationMultiple = ({ mainField, content, rowId, name }) => {
400
408
  ] })
401
409
  ] });
402
410
  };
403
- const MenuTrigger = styledComponents.styled(designSystem.Menu.Trigger)`
404
- svg {
405
- width: 0.6rem;
406
- height: 0.4rem;
407
- }
408
- `;
409
411
  const CellContent = ({ content, mainField, attribute, rowId, name }) => {
410
412
  if (!hasContent(content, mainField, attribute)) {
411
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: "-" });
413
+ return /* @__PURE__ */ jsxRuntime.jsx(
414
+ designSystem.Typography,
415
+ {
416
+ textColor: "neutral800",
417
+ paddingLeft: attribute.type === "relation" ? "1.6rem" : 0,
418
+ paddingRight: attribute.type === "relation" ? "1.6rem" : 0,
419
+ children: "-"
420
+ }
421
+ );
412
422
  }
413
423
  switch (attribute.type) {
414
424
  case "media":
@@ -448,6 +458,9 @@ const hasContent = (content, mainField, attribute) => {
448
458
  if (isSingleRelation(attribute.relation)) {
449
459
  return !isEmpty__default.default(content);
450
460
  }
461
+ if (Array.isArray(content)) {
462
+ return content.length > 0;
463
+ }
451
464
  return content?.count > 0;
452
465
  }
453
466
  if (["integer", "decimal", "float", "number"].includes(attribute.type)) {
@@ -559,6 +572,9 @@ const FieldPicker = ({ headers = [], resetHeaders, setHeaders }) => {
559
572
  ] });
560
573
  };
561
574
  const { INJECT_COLUMN_IN_TABLE } = index.HOOKS;
575
+ const LayoutsHeaderCustom = styledComponents.styled(strapiAdmin.Layouts.Header)`
576
+ overflow-wrap: anywhere;
577
+ `;
562
578
  const ListViewPage = () => {
563
579
  const { trackUsage } = strapiAdmin.useTracking();
564
580
  const navigate = reactRouterDom.useNavigate();
@@ -568,7 +584,7 @@ const ListViewPage = () => {
568
584
  const { collectionType, model, schema } = index.useDoc();
569
585
  const { list } = index.useDocumentLayout(model);
570
586
  const [displayedHeaders, setDisplayedHeaders] = React__namespace.useState([]);
571
- const listLayout = usePrev.usePrev(list.layout);
587
+ const listLayout = useDebounce.usePrev(list.layout);
572
588
  React__namespace.useEffect(() => {
573
589
  if (!isEqual__default.default(listLayout, list.layout)) {
574
590
  setDisplayedHeaders(list.layout);
@@ -585,7 +601,7 @@ const ListViewPage = () => {
585
601
  sort: list.settings.defaultSortBy ? `${list.settings.defaultSortBy}:${list.settings.defaultSortOrder}` : ""
586
602
  });
587
603
  const params = React__namespace.useMemo(() => index.buildValidParams(query), [query]);
588
- const { data, error, isLoading } = index.useGetAllDocumentsQuery({
604
+ const { data, error, isFetching } = index.useGetAllDocumentsQuery({
589
605
  model,
590
606
  params
591
607
  });
@@ -643,7 +659,7 @@ const ListViewPage = () => {
643
659
  }
644
660
  return formattedHeaders;
645
661
  }, [displayedHeaders, formatMessage, list, runHookWaterfall, schema?.options?.draftAndPublish]);
646
- if (isLoading) {
662
+ if (isFetching) {
647
663
  return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Loading, {});
648
664
  }
649
665
  if (error) {
@@ -660,7 +676,7 @@ const ListViewPage = () => {
660
676
  return /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Page.Main, { children: [
661
677
  /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Title, { children: `${contentTypeTitle}` }),
662
678
  /* @__PURE__ */ jsxRuntime.jsx(
663
- strapiAdmin.Layouts.Header,
679
+ LayoutsHeaderCustom,
664
680
  {
665
681
  primaryAction: canCreate ? /* @__PURE__ */ jsxRuntime.jsx(CreateButton, {}) : null,
666
682
  subtitle: formatMessage(
@@ -709,7 +725,7 @@ const ListViewPage = () => {
709
725
  }
710
726
  ),
711
727
  /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Layouts.Content, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
712
- /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Root, { rows: results, headers: tableHeaders, isLoading, children: [
728
+ /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Root, { rows: results, headers: tableHeaders, isLoading: isFetching, children: [
713
729
  /* @__PURE__ */ jsxRuntime.jsx(TableActionsBar, {}),
714
730
  /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Content, { children: [
715
731
  /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Head, { children: [
@@ -776,7 +792,7 @@ const TableActionsBar = () => {
776
792
  const selectRow = strapiAdmin.useTable("TableActionsBar", (state) => state.selectRow);
777
793
  const [{ query }] = strapiAdmin.useQueryParams();
778
794
  const locale = query?.plugins?.i18n?.locale;
779
- const prevLocale = usePrev.usePrev(locale);
795
+ const prevLocale = useDebounce.usePrev(locale);
780
796
  React__namespace.useEffect(() => {
781
797
  if (prevLocale !== locale) {
782
798
  selectRow([]);
@@ -802,6 +818,8 @@ const CreateButton = ({ variant }) => {
802
818
  pathname: "create",
803
819
  search: qs.stringify({ plugins: query.plugins })
804
820
  },
821
+ minWidth: "max-content",
822
+ marginLeft: 2,
805
823
  children: formatMessage({
806
824
  id: index.getTranslation("HeaderLayout.button.label-add-entry"),
807
825
  defaultMessage: "Create new entry"
@@ -831,4 +849,4 @@ const ProtectedListViewPage = () => {
831
849
  };
832
850
  exports.ListViewPage = ListViewPage;
833
851
  exports.ProtectedListViewPage = ProtectedListViewPage;
834
- //# sourceMappingURL=ListViewPage-pEw_zug9.js.map
852
+ //# sourceMappingURL=ListViewPage-BBAC9aPu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListViewPage-BBAC9aPu.js","sources":["../../admin/src/pages/ListView/components/Filters.tsx","../../admin/src/pages/ListView/components/TableCells/CellValue.tsx","../../admin/src/pages/ListView/components/TableCells/Components.tsx","../../admin/src/pages/ListView/components/TableCells/Media.tsx","../../admin/src/pages/ListView/components/TableCells/Relations.tsx","../../admin/src/pages/ListView/components/TableCells/CellContent.tsx","../../admin/src/pages/ListView/components/ViewSettingsMenu.tsx","../../admin/src/pages/ListView/ListViewPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Filters,\n useField,\n useAuth,\n useTracking,\n useQueryParams,\n useAdminUsers,\n} from '@strapi/admin/strapi-admin';\nimport { Combobox, ComboboxOption, useCollator } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { CREATOR_FIELDS } from '../../../constants/attributes';\nimport { useContentTypeSchema } from '../../../hooks/useContentTypeSchema';\nimport { useDebounce } from '../../../hooks/useDebounce';\nimport { Schema } from '../../../hooks/useDocument';\nimport { useGetContentTypeConfigurationQuery } from '../../../services/contentTypes';\nimport { getMainField } from '../../../utils/attributes';\nimport { getDisplayName } from '../../../utils/users';\n\n/**\n * If new attributes are added, this list needs to be updated.\n */\nconst NOT_ALLOWED_FILTERS = [\n 'json',\n 'component',\n 'media',\n 'richtext',\n 'dynamiczone',\n 'password',\n 'blocks',\n];\nconst DEFAULT_ALLOWED_FILTERS = ['createdAt', 'updatedAt'];\nconst USER_FILTER_ATTRIBUTES = [...CREATOR_FIELDS, 'strapi_assignee'];\n\n/* -------------------------------------------------------------------------------------------------\n * Filters\n * -----------------------------------------------------------------------------------------------*/\ninterface FiltersProps {\n disabled?: boolean;\n schema: Schema;\n}\n\nconst FiltersImpl = ({ disabled, schema }: FiltersProps) => {\n const { attributes, uid: model, options } = schema;\n const { formatMessage, locale } = useIntl();\n const { trackUsage } = useTracking();\n const allPermissions = useAuth('FiltersImpl', (state) => state.permissions);\n const [{ query }] = useQueryParams<Filters.Query>();\n const { schemas } = useContentTypeSchema();\n\n const canReadAdminUsers = React.useMemo(\n () =>\n allPermissions.filter(\n (permission) => permission.action === 'admin::users.read' && permission.subject === null\n ).length > 0,\n [allPermissions]\n );\n\n const selectedUserIds = (query?.filters?.$and ?? []).reduce<string[]>((acc, filter) => {\n const [key, value] = Object.entries(filter)[0];\n if (typeof value.id !== 'object') {\n return acc;\n }\n\n const id = value.id.$eq || value.id.$ne;\n\n if (id && USER_FILTER_ATTRIBUTES.includes(key) && !acc.includes(id)) {\n acc.push(id);\n }\n\n return acc;\n }, []);\n\n const { data: userData, isLoading: isLoadingAdminUsers } = useAdminUsers(\n { filters: { id: { $in: selectedUserIds } } },\n {\n // fetch the list of admin users only if the filter contains users and the\n // current user has permissions to display users\n skip: selectedUserIds.length === 0 || !canReadAdminUsers,\n }\n );\n\n const { users = [] } = userData ?? {};\n\n const { metadata } = useGetContentTypeConfigurationQuery(model, {\n selectFromResult: ({ data }) => ({ metadata: data?.contentType.metadatas ?? {} }),\n });\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const displayedFilters = React.useMemo(() => {\n const [{ properties: { fields = [] } = { fields: [] } }] = allPermissions.filter(\n (permission) =>\n permission.action === 'plugin::content-manager.explorer.read' &&\n permission.subject === model\n );\n\n const allowedFields = fields.filter((field) => {\n const attribute = attributes[field] ?? {};\n\n return attribute.type && !NOT_ALLOWED_FILTERS.includes(attribute.type);\n });\n\n return (\n [\n 'id',\n ...allowedFields,\n ...DEFAULT_ALLOWED_FILTERS,\n ...(canReadAdminUsers ? CREATOR_FIELDS : []),\n ]\n .map((name) => {\n const attribute = attributes[name];\n\n if (NOT_ALLOWED_FILTERS.includes(attribute.type)) {\n return null;\n }\n\n const { mainField: mainFieldName = '', label } = metadata[name].list;\n\n let filter: Filters.Filter = {\n name,\n label: label ?? '',\n mainField: getMainField(attribute, mainFieldName, { schemas, components: {} }),\n // @ts-expect-error – TODO: this is filtered out above in the `allowedFields` call but TS complains, is there a better way to solve this?\n type: attribute.type,\n };\n\n if (\n attribute.type === 'relation' &&\n 'target' in attribute &&\n attribute.target === 'admin::user'\n ) {\n filter = {\n ...filter,\n input: AdminUsersFilter,\n options: users.map((user) => ({\n label: getDisplayName(user),\n value: user.id.toString(),\n })),\n operators: [\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n }),\n value: '$eq',\n },\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$ne',\n defaultMessage: 'is not',\n }),\n value: '$ne',\n },\n ],\n mainField: {\n name: 'id',\n type: 'integer',\n },\n };\n }\n\n if (attribute.type === 'enumeration') {\n filter = {\n ...filter,\n options: attribute.enum.map((value) => ({\n label: value,\n value,\n })),\n };\n }\n\n return filter;\n })\n .filter(Boolean) as Filters.Filter[]\n ).toSorted((a, b) => formatter.compare(a.label, b.label));\n }, [\n allPermissions,\n canReadAdminUsers,\n model,\n attributes,\n metadata,\n schemas,\n users,\n formatMessage,\n formatter,\n ]);\n\n const onOpenChange = (isOpen: boolean) => {\n if (isOpen) {\n trackUsage('willFilterEntries');\n }\n };\n\n const handleFilterChange: Filters.Props['onChange'] = (data) => {\n const attribute = attributes[data.name];\n\n if (attribute) {\n trackUsage('didFilterEntries', {\n useRelation: attribute.type === 'relation',\n });\n }\n };\n\n return (\n <Filters.Root\n disabled={disabled}\n options={displayedFilters}\n onOpenChange={onOpenChange}\n onChange={handleFilterChange}\n >\n <Filters.Trigger />\n <Filters.Popover />\n <Filters.List />\n </Filters.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AdminUsersFilter\n * -----------------------------------------------------------------------------------------------*/\n\nconst AdminUsersFilter = ({ name }: Filters.ValueInputProps) => {\n const [pageSize, setPageSize] = React.useState(10);\n const [search, setSearch] = React.useState('');\n const { formatMessage } = useIntl();\n\n const debouncedSearch = useDebounce(search, 300);\n\n const { data, isLoading } = useAdminUsers({\n pageSize,\n _q: debouncedSearch,\n });\n const field = useField(name);\n\n const handleOpenChange = (isOpen?: boolean) => {\n if (!isOpen) {\n setPageSize(10);\n }\n };\n\n const { users = [], pagination } = data ?? {};\n const { pageCount = 1, page = 1 } = pagination ?? {};\n\n return (\n <Combobox\n value={field.value}\n aria-label={formatMessage({\n id: 'content-manager.components.Filters.usersSelect.label',\n defaultMessage: 'Search and select a user to filter',\n })}\n onOpenChange={handleOpenChange}\n onChange={(value) => field.onChange(name, value)}\n loading={isLoading}\n onLoadMore={() => setPageSize(pageSize + 10)}\n hasMoreItems={page < pageCount}\n onInputChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setSearch(e.currentTarget.value);\n }}\n >\n {users.map((user) => {\n return (\n <ComboboxOption key={user.id} value={user.id.toString()}>\n {getDisplayName(user)}\n </ComboboxOption>\n );\n })}\n </Combobox>\n );\n};\n\nexport { FiltersImpl as Filters };\nexport type { FiltersProps };\n","import parseISO from 'date-fns/parseISO';\nimport toString from 'lodash/toString';\nimport { useIntl } from 'react-intl';\n\nimport type { Schema } from '@strapi/types';\n\ninterface CellValueProps {\n type: Schema.Attribute.Kind | 'custom';\n value: any;\n}\n\nconst CellValue = ({ type, value }: CellValueProps) => {\n const { formatDate, formatTime, formatNumber } = useIntl();\n let formattedValue = value;\n\n if (type === 'date') {\n formattedValue = formatDate(parseISO(value), { dateStyle: 'full' });\n }\n\n if (type === 'datetime') {\n formattedValue = formatDate(value, { dateStyle: 'full', timeStyle: 'short' });\n }\n\n if (type === 'time') {\n const [hour, minute, second] = value.split(':');\n const date = new Date();\n date.setHours(hour);\n date.setMinutes(minute);\n date.setSeconds(second);\n\n formattedValue = formatTime(date, {\n timeStyle: 'short',\n });\n }\n\n if (['float', 'decimal'].includes(type)) {\n formattedValue = formatNumber(value, {\n // Should be kept in sync with the corresponding value\n // in the design-system/NumberInput: https://github.com/strapi/design-system/blob/main/packages/strapi-design-system/src/NumberInput/NumberInput.js#L53\n maximumFractionDigits: 20,\n });\n }\n\n if (['integer', 'biginteger'].includes(type)) {\n formattedValue = formatNumber(value, { maximumFractionDigits: 0 });\n }\n\n return toString(formattedValue);\n};\n\nexport { CellValue };\nexport type { CellValueProps };\n","import { Badge, Tooltip, Typography, Menu } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { CellContentProps } from './CellContent';\nimport { CellValue } from './CellValue';\n\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * SingleComponent\n * -----------------------------------------------------------------------------------------------*/\n\ninterface SingleComponentProps extends Pick<CellContentProps, 'mainField'> {\n content: Schema.Attribute.Value<Schema.Attribute.Component<`${string}.${string}`, false>>;\n}\n\nconst SingleComponent = ({ content, mainField }: SingleComponentProps) => {\n if (!mainField) {\n return null;\n }\n\n return (\n <Tooltip label={content[mainField.name]}>\n <Typography maxWidth=\"25rem\" textColor=\"neutral800\" ellipsis>\n <CellValue type={mainField.type} value={content[mainField.name]} />\n </Typography>\n </Tooltip>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * RepeatableComponent\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RepeatableComponentProps extends Pick<CellContentProps, 'mainField'> {\n content: Schema.Attribute.Value<Schema.Attribute.Component<`${string}.${string}`, true>>;\n}\n\nconst RepeatableComponent = ({ content, mainField }: RepeatableComponentProps) => {\n const { formatMessage } = useIntl();\n\n if (!mainField) {\n return null;\n }\n\n return (\n <Menu.Root>\n <Menu.Trigger onClick={(e) => e.stopPropagation()}>\n <Badge>{content.length}</Badge>\n {formatMessage(\n {\n id: 'content-manager.containers.list.items',\n defaultMessage: '{number, plural, =0 {items} one {item} other {items}}',\n },\n { number: content.length }\n )}\n </Menu.Trigger>\n <Menu.Content>\n {content.map((item) => (\n <Menu.Item key={item.id} disabled>\n <Typography maxWidth=\"50rem\" ellipsis>\n <CellValue type={mainField.type} value={item[mainField.name]} />\n </Typography>\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Root>\n );\n};\n\nexport { SingleComponent, RepeatableComponent };\nexport type { SingleComponentProps, RepeatableComponentProps };\n","import * as React from 'react';\n\nimport { Avatar, Flex, Tooltip, Typography, TypographyComponent } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { prefixFileUrlWithBackendUrl } from '../../../../utils/urls';\n\nimport type { Data } from '@strapi/types';\n\ninterface MediaFile {\n id?: Data.ID;\n alternativeText?: string;\n ext: string;\n formats: {\n thumbnail?: {\n url?: string;\n };\n };\n mime: string;\n name: string;\n url: string;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Media\n * -----------------------------------------------------------------------------------------------*/\n\ninterface MediaSingleProps extends MediaFile {}\n\nconst getFileExtension = (ext: string) => (ext && ext[0] === '.' ? ext.substring(1) : ext);\n\nconst MediaSingle = ({ url, mime, alternativeText, name, ext, formats }: MediaSingleProps) => {\n const fileURL = prefixFileUrlWithBackendUrl(url)!;\n\n if (mime.includes('image')) {\n const thumbnail = formats?.thumbnail?.url;\n const mediaURL = prefixFileUrlWithBackendUrl(thumbnail) || fileURL;\n\n return (\n <Avatar.Item\n src={mediaURL}\n alt={alternativeText || name}\n fallback={alternativeText || name}\n preview\n />\n );\n }\n\n const fileExtension = getFileExtension(ext);\n const fileName = name.length > 100 ? `${name.substring(0, 100)}...` : name;\n\n return (\n <Tooltip description={fileName}>\n <FileWrapper>{fileExtension}</FileWrapper>\n </Tooltip>\n );\n};\n\nconst FileWrapper = ({ children }: { children: React.ReactNode }) => {\n return (\n <Flex\n tag=\"span\"\n position=\"relative\"\n borderRadius=\"50%\"\n width=\"26px\"\n height=\"26px\"\n borderColor=\"neutral200\"\n background=\"neutral150\"\n paddingLeft=\"1px\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <FileTypography variant=\"sigma\" textColor=\"neutral600\">\n {children}\n </FileTypography>\n </Flex>\n );\n};\n\nconst FileTypography = styled<TypographyComponent>(Typography)`\n font-size: 0.9rem;\n line-height: 0.9rem;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * MediaMultiple\n * -----------------------------------------------------------------------------------------------*/\n\ninterface MediaMultipleProps {\n content: MediaFile[];\n}\n\nconst MediaMultiple = ({ content }: MediaMultipleProps) => {\n return (\n <Avatar.Group>\n {content.map((file, index) => {\n const key = `${file.id}${index}`;\n\n if (index === 3) {\n const remainingFiles = `+${content.length - 3}`;\n\n return <FileWrapper key={key}>{remainingFiles}</FileWrapper>;\n }\n\n if (index > 3) {\n return null;\n }\n\n return <MediaSingle key={key} {...file} />;\n })}\n </Avatar.Group>\n );\n};\n\nexport { MediaMultiple, MediaSingle };\nexport type { MediaMultipleProps, MediaSingleProps };\n","import * as React from 'react';\n\nimport { Typography, Loader, useNotifyAT, Menu } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../../../hooks/useDocument';\nimport { useGetRelationsQuery } from '../../../../services/relations';\nimport { getRelationLabel } from '../../../../utils/relations';\nimport { getTranslation } from '../../../../utils/translations';\n\nimport type { CellContentProps } from './CellContent';\n\n/* -------------------------------------------------------------------------------------------------\n * RelationSingle\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RelationSingleProps extends Pick<CellContentProps, 'mainField' | 'content'> {}\n\nconst RelationSingle = ({ mainField, content }: RelationSingleProps) => {\n return (\n <Typography maxWidth=\"50rem\" textColor=\"neutral800\" ellipsis>\n {getRelationLabel(content, mainField)}\n </Typography>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * RelationMultiple\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RelationMultipleProps\n extends Pick<CellContentProps, 'mainField' | 'content' | 'name' | 'rowId'> {}\n\n/**\n * TODO: fix this component – tracking issue https://strapi-inc.atlassian.net/browse/CONTENT-2184\n */\nconst RelationMultiple = ({ mainField, content, rowId, name }: RelationMultipleProps) => {\n const { model } = useDoc();\n const { formatMessage } = useIntl();\n const { notifyStatus } = useNotifyAT();\n const [isOpen, setIsOpen] = React.useState(false);\n\n const [targetField] = name.split('.');\n\n const { data, isLoading } = useGetRelationsQuery(\n {\n model,\n id: rowId,\n targetField,\n },\n {\n skip: !isOpen,\n refetchOnMountOrArgChange: true,\n }\n );\n\n const contentCount = Array.isArray(content) ? content.length : content.count;\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('DynamicTable.relation-loaded'),\n defaultMessage: 'Relations have been loaded',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n return (\n <Menu.Root onOpenChange={(isOpen) => setIsOpen(isOpen)}>\n <Menu.Trigger onClick={(e) => e.stopPropagation()}>\n <Typography style={{ cursor: 'pointer' }} textColor=\"neutral800\" fontWeight=\"regular\">\n {contentCount > 0\n ? formatMessage(\n {\n id: 'content-manager.containers.list.items',\n defaultMessage: '{number} {number, plural, =0 {items} one {item} other {items}}',\n },\n { number: contentCount }\n )\n : '-'}\n </Typography>\n </Menu.Trigger>\n <Menu.Content>\n {isLoading && (\n <Menu.Item disabled>\n <Loader small>\n {formatMessage({\n id: getTranslation('ListViewTable.relation-loading'),\n defaultMessage: 'Relations are loading',\n })}\n </Loader>\n </Menu.Item>\n )}\n {data?.results && (\n <>\n {data.results.map((entry) => (\n <Menu.Item key={entry.documentId} disabled>\n <Typography maxWidth=\"50rem\" ellipsis>\n {getRelationLabel(entry, mainField)}\n </Typography>\n </Menu.Item>\n ))}\n\n {data?.pagination && data?.pagination.total > 10 && (\n <Menu.Item\n aria-disabled\n aria-label={formatMessage({\n id: getTranslation('ListViewTable.relation-more'),\n defaultMessage: 'This relation contains more entities than displayed',\n })}\n >\n <Typography>…</Typography>\n </Menu.Item>\n )}\n </>\n )}\n </Menu.Content>\n </Menu.Root>\n );\n};\n\nexport { RelationSingle, RelationMultiple };\nexport type { RelationSingleProps, RelationMultipleProps };\n","import { Tooltip, Typography } from '@strapi/design-system';\nimport isEmpty from 'lodash/isEmpty';\n\nimport { CellValue } from './CellValue';\nimport { SingleComponent, RepeatableComponent } from './Components';\nimport { MediaSingle, MediaMultiple } from './Media';\nimport { RelationMultiple, RelationSingle } from './Relations';\n\nimport type { ListFieldLayout } from '../../../../hooks/useDocumentLayout';\nimport type { Schema, Data } from '@strapi/types';\n\ninterface CellContentProps extends Omit<ListFieldLayout, 'cellFormatter'> {\n content: Schema.Attribute.Value<Schema.Attribute.AnyAttribute>;\n rowId: Data.ID;\n}\n\nconst CellContent = ({ content, mainField, attribute, rowId, name }: CellContentProps) => {\n if (!hasContent(content, mainField, attribute)) {\n return (\n <Typography\n textColor=\"neutral800\"\n paddingLeft={attribute.type === ('relation' || 'component') ? '1.6rem' : 0}\n paddingRight={attribute.type === ('relation' || 'component') ? '1.6rem' : 0}\n >\n -\n </Typography>\n );\n }\n\n switch (attribute.type) {\n case 'media':\n if (!attribute.multiple) {\n return <MediaSingle {...content} />;\n }\n\n return <MediaMultiple content={content} />;\n\n case 'relation': {\n if (isSingleRelation(attribute.relation)) {\n return <RelationSingle mainField={mainField} content={content} />;\n }\n\n return <RelationMultiple rowId={rowId} mainField={mainField} content={content} name={name} />;\n }\n\n case 'component':\n if (attribute.repeatable) {\n return <RepeatableComponent mainField={mainField} content={content} />;\n }\n\n return <SingleComponent mainField={mainField} content={content} />;\n\n case 'string':\n return (\n <Tooltip description={content}>\n <Typography maxWidth=\"30rem\" ellipsis textColor=\"neutral800\">\n <CellValue type={attribute.type} value={content} />\n </Typography>\n </Tooltip>\n );\n\n default:\n return (\n <Typography maxWidth=\"30rem\" ellipsis textColor=\"neutral800\">\n <CellValue type={attribute.type} value={content} />\n </Typography>\n );\n }\n};\n\nconst hasContent = (\n content: CellContentProps['content'],\n mainField: CellContentProps['mainField'],\n attribute: CellContentProps['attribute']\n) => {\n if (attribute.type === 'component') {\n // Repeatable fields show the ID as fallback, in case the mainField\n // doesn't have any content\n if (attribute.repeatable || !mainField) {\n return content?.length > 0;\n }\n\n const value = content?.[mainField.name];\n\n // relations, media ... show the id as fallback\n if (mainField.name === 'id' && ![undefined, null].includes(value)) {\n return true;\n }\n\n return !isEmpty(value);\n }\n\n if (attribute.type === 'relation') {\n if (isSingleRelation(attribute.relation)) {\n return !isEmpty(content);\n }\n\n if (Array.isArray(content)) {\n return content.length > 0;\n }\n\n return content?.count > 0;\n }\n\n /*\n Biginteger fields need to be treated as strings, as `isNumber`\n doesn't deal with them.\n */\n if (['integer', 'decimal', 'float', 'number'].includes(attribute.type)) {\n return typeof content === 'number';\n }\n\n if (attribute.type === 'boolean') {\n return content !== null;\n }\n\n return !isEmpty(content);\n};\n\nconst isSingleRelation = (\n type: Extract<CellContentProps['attribute'], { type: 'relation' }>['relation']\n) => ['oneToOne', 'manyToOne', 'oneToOneMorph'].includes(type);\n\nexport { CellContent };\nexport type { CellContentProps };\n","import * as React from 'react';\n\nimport { useTracking, useRBAC, useQueryParams } from '@strapi/admin/strapi-admin';\nimport {\n Flex,\n IconButton,\n Popover,\n Checkbox,\n TextButton,\n Typography,\n useCollator,\n LinkButton,\n} from '@strapi/design-system';\nimport { Cog, ListPlus } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\n\nimport { useDoc } from '../../../hooks/useDocument';\nimport { useDocumentLayout } from '../../../hooks/useDocumentLayout';\nimport { useTypedSelector } from '../../../modules/hooks';\nimport { checkIfAttributeIsDisplayable } from '../../../utils/attributes';\n\ninterface ViewSettingsMenuProps extends FieldPickerProps {}\n\nconst ViewSettingsMenu = (props: ViewSettingsMenuProps) => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.contentManager?.collectionTypesConfigurations ?? []\n );\n const [{ query }] = useQueryParams<{ plugins?: Record<string, unknown> }>();\n const { formatMessage } = useIntl();\n const {\n allowedActions: { canConfigureView },\n } = useRBAC(permissions);\n\n return (\n <Popover.Root>\n <Popover.Trigger>\n <IconButton\n label={formatMessage({\n id: 'components.ViewSettings.tooltip',\n defaultMessage: 'View Settings',\n })}\n >\n <Cog />\n </IconButton>\n </Popover.Trigger>\n <Popover.Content side=\"bottom\" align=\"end\" sideOffset={4}>\n <Flex alignItems=\"stretch\" direction=\"column\" padding={3} gap={3}>\n {canConfigureView ? (\n <LinkButton\n size=\"S\"\n startIcon={<ListPlus />}\n variant=\"secondary\"\n tag={NavLink}\n to={{\n pathname: 'configurations/list',\n search: query.plugins\n ? stringify({ plugins: query.plugins }, { encode: false })\n : '',\n }}\n >\n {formatMessage({\n id: 'app.links.configure-view',\n defaultMessage: 'Configure the view',\n })}\n </LinkButton>\n ) : null}\n <FieldPicker {...props} />\n </Flex>\n </Popover.Content>\n </Popover.Root>\n );\n};\n\ninterface FieldPickerProps {\n headers?: string[];\n setHeaders: (headers: string[]) => void;\n resetHeaders: () => void;\n}\n\nconst FieldPicker = ({ headers = [], resetHeaders, setHeaders }: FieldPickerProps) => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n\n const { schema, model } = useDoc();\n const { list } = useDocumentLayout(model);\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const attributes = schema?.attributes ?? {};\n\n const columns = Object.keys(attributes)\n .filter((name) => checkIfAttributeIsDisplayable(attributes[name]))\n .map((name) => ({\n name,\n label: list.metadatas[name]?.label ?? '',\n }))\n .sort((a, b) => formatter.compare(a.label, b.label));\n\n const handleChange = (name: string) => {\n trackUsage('didChangeDisplayedFields');\n\n /**\n * create an array of the new headers, if the new name exists it should be removed,\n * otherwise it should be added\n */\n const newHeaders = headers.includes(name)\n ? headers.filter((header) => header !== name)\n : [...headers, name];\n\n setHeaders(newHeaders);\n };\n\n const handleReset = () => {\n resetHeaders();\n };\n\n return (\n <Flex tag=\"fieldset\" direction=\"column\" alignItems=\"stretch\" gap={3} borderWidth={0}>\n <Flex justifyContent=\"space-between\">\n <Typography tag=\"legend\" variant=\"pi\" fontWeight=\"bold\">\n {formatMessage({\n id: 'containers.list.displayedFields',\n defaultMessage: 'Displayed fields',\n })}\n </Typography>\n\n <TextButton onClick={handleReset}>\n {formatMessage({\n id: 'app.components.Button.reset',\n defaultMessage: 'Reset',\n })}\n </TextButton>\n </Flex>\n\n <Flex direction=\"column\" alignItems=\"stretch\">\n {columns.map((header) => {\n const isActive = headers.includes(header.name);\n\n return (\n <Flex\n wrap=\"wrap\"\n gap={2}\n background={isActive ? 'primary100' : 'transparent'}\n hasRadius\n padding={2}\n key={header.name}\n >\n <Checkbox\n onCheckedChange={() => handleChange(header.name)}\n checked={isActive}\n name={header.name}\n >\n <Typography fontSize={1}>{header.label}</Typography>\n </Checkbox>\n </Flex>\n );\n })}\n </Flex>\n </Flex>\n );\n};\n\nexport { ViewSettingsMenu };\nexport type { ViewSettingsMenuProps, FieldPickerProps };\n","import * as React from 'react';\n\nimport {\n Page,\n Pagination,\n SearchInput,\n Table,\n BackButton,\n useNotification,\n useStrapiApp,\n useTracking,\n useAPIErrorHandler,\n useQueryParams,\n useRBAC,\n Layouts,\n useTable,\n} from '@strapi/admin/strapi-admin';\nimport { Button, Flex, Typography, ButtonProps } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport isEqual from 'lodash/isEqual';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useNavigate, Link as ReactRouterLink, useParams } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { InjectionZone } from '../../components/InjectionZone';\nimport { HOOKS } from '../../constants/hooks';\nimport { PERMISSIONS } from '../../constants/plugin';\nimport { DocumentRBAC, useDocumentRBAC } from '../../features/DocumentRBAC';\nimport { useDoc } from '../../hooks/useDocument';\nimport {\n ListFieldLayout,\n convertListLayoutToFieldLayouts,\n useDocumentLayout,\n} from '../../hooks/useDocumentLayout';\nimport { usePrev } from '../../hooks/usePrev';\nimport { useGetAllDocumentsQuery } from '../../services/documents';\nimport { buildValidParams } from '../../utils/api';\nimport { getTranslation } from '../../utils/translations';\nimport { getDisplayName } from '../../utils/users';\nimport { DocumentStatus } from '../EditView/components/DocumentStatus';\n\nimport { BulkActionsRenderer } from './components/BulkActions/Actions';\nimport { Filters } from './components/Filters';\nimport { TableActions } from './components/TableActions';\nimport { CellContent } from './components/TableCells/CellContent';\nimport { ViewSettingsMenu } from './components/ViewSettingsMenu';\n\nimport type { Modules } from '@strapi/types';\n\nconst { INJECT_COLUMN_IN_TABLE } = HOOKS;\n\n/* -------------------------------------------------------------------------------------------------\n * ListViewPage\n * -----------------------------------------------------------------------------------------------*/\nconst LayoutsHeaderCustom = styled(Layouts.Header)`\n overflow-wrap: anywhere;\n`;\n\nconst ListViewPage = () => {\n const { trackUsage } = useTracking();\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n\n const { collectionType, model, schema } = useDoc();\n const { list } = useDocumentLayout(model);\n\n const [displayedHeaders, setDisplayedHeaders] = React.useState<ListFieldLayout[]>([]);\n\n const listLayout = usePrev(list.layout);\n React.useEffect(() => {\n /**\n * ONLY update the displayedHeaders if the document\n * layout has actually changed in value.\n */\n if (!isEqual(listLayout, list.layout)) {\n setDisplayedHeaders(list.layout);\n }\n }, [list.layout, listLayout]);\n\n const handleSetHeaders = (headers: string[]) => {\n setDisplayedHeaders(\n convertListLayoutToFieldLayouts(headers, schema!.attributes, list.metadatas)\n );\n };\n\n const [{ query }] = useQueryParams<{\n plugins?: Record<string, unknown>;\n page?: string;\n pageSize?: string;\n sort?: string;\n }>({\n page: '1',\n pageSize: list.settings.pageSize.toString(),\n sort: list.settings.defaultSortBy\n ? `${list.settings.defaultSortBy}:${list.settings.defaultSortOrder}`\n : '',\n });\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n const { data, error, isFetching } = useGetAllDocumentsQuery({\n model,\n params,\n });\n\n /**\n * If the API returns an error, display a notification\n */\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n const { results = [], pagination } = data ?? {};\n\n React.useEffect(() => {\n if (pagination && pagination.pageCount > 0 && pagination.page > pagination.pageCount) {\n navigate(\n {\n search: stringify({\n ...query,\n page: pagination.pageCount,\n }),\n },\n { replace: true }\n );\n }\n }, [pagination, formatMessage, query, navigate]);\n\n const { canCreate } = useDocumentRBAC('ListViewPage', ({ canCreate }) => ({\n canCreate,\n }));\n\n const runHookWaterfall = useStrapiApp('ListViewPage', ({ runHookWaterfall }) => runHookWaterfall);\n /**\n * Run the waterfall and then inject our additional table headers.\n */\n const tableHeaders = React.useMemo(() => {\n const headers = runHookWaterfall(INJECT_COLUMN_IN_TABLE, {\n displayedHeaders,\n layout: list,\n });\n\n const formattedHeaders = headers.displayedHeaders.map<ListFieldLayout>((header) => {\n return {\n ...header,\n label: typeof header.label === 'string' ? header.label : formatMessage(header.label),\n name: `${header.name}${header.mainField ? `.${header.mainField}` : ''}`,\n };\n });\n\n if (schema?.options?.draftAndPublish) {\n formattedHeaders.push({\n attribute: {\n type: 'custom',\n },\n name: 'status',\n label: formatMessage({\n id: getTranslation(`containers.list.table-headers.status`),\n defaultMessage: 'status',\n }),\n searchable: false,\n sortable: false,\n } satisfies ListFieldLayout);\n }\n\n return formattedHeaders;\n }, [displayedHeaders, formatMessage, list, runHookWaterfall, schema?.options?.draftAndPublish]);\n\n if (isFetching) {\n return <Page.Loading />;\n }\n\n if (error) {\n return <Page.Error />;\n }\n\n const contentTypeTitle = schema?.info.displayName ?? 'Untitled';\n\n const handleRowClick = (id: Modules.Documents.ID) => () => {\n trackUsage('willEditEntryFromList');\n navigate({\n pathname: id.toString(),\n search: stringify({ plugins: query.plugins }),\n });\n };\n\n return (\n <Page.Main>\n <Page.Title>{`${contentTypeTitle}`}</Page.Title>\n <LayoutsHeaderCustom\n primaryAction={canCreate ? <CreateButton /> : null}\n subtitle={formatMessage(\n {\n id: getTranslation('pages.ListView.header-subtitle'),\n defaultMessage:\n '{number, plural, =0 {# entries} one {# entry} other {# entries}} found',\n },\n { number: pagination?.total }\n )}\n title={contentTypeTitle}\n navigationAction={<BackButton />}\n />\n <Layouts.Action\n endActions={\n <>\n <InjectionZone area=\"listView.actions\" />\n <ViewSettingsMenu\n setHeaders={handleSetHeaders}\n resetHeaders={() => setDisplayedHeaders(list.layout)}\n headers={displayedHeaders.map((header) => header.name)}\n />\n </>\n }\n startActions={\n <>\n {list.settings.searchable && (\n <SearchInput\n disabled={results.length === 0}\n label={formatMessage(\n { id: 'app.component.search.label', defaultMessage: 'Search for {target}' },\n { target: contentTypeTitle }\n )}\n placeholder={formatMessage({\n id: 'global.search',\n defaultMessage: 'Search',\n })}\n trackedEvent=\"didSearch\"\n />\n )}\n {list.settings.filterable && schema ? (\n <Filters disabled={results.length === 0} schema={schema} />\n ) : null}\n </>\n }\n />\n <Layouts.Content>\n <Flex gap={4} direction=\"column\" alignItems=\"stretch\">\n <Table.Root rows={results} headers={tableHeaders} isLoading={isFetching}>\n <TableActionsBar />\n <Table.Content>\n <Table.Head>\n <Table.HeaderCheckboxCell />\n {tableHeaders.map((header: ListFieldLayout) => (\n <Table.HeaderCell key={header.name} {...header} />\n ))}\n </Table.Head>\n <Table.Loading />\n <Table.Empty action={canCreate ? <CreateButton variant=\"secondary\" /> : null} />\n <Table.Body>\n {results.map((row) => {\n return (\n <Table.Row\n cursor=\"pointer\"\n key={row.id}\n onClick={handleRowClick(row.documentId)}\n >\n <Table.CheckboxCell id={row.id} />\n {tableHeaders.map(({ cellFormatter, ...header }) => {\n if (header.name === 'status') {\n const { status } = row;\n\n return (\n <Table.Cell key={header.name}>\n <DocumentStatus status={status} maxWidth={'min-content'} />\n </Table.Cell>\n );\n }\n if (['createdBy', 'updatedBy'].includes(header.name.split('.')[0])) {\n // Display the users full name\n // Some entries doesn't have a user assigned as creator/updater (ex: entries created through content API)\n // In this case, we display a dash\n return (\n <Table.Cell key={header.name}>\n <Typography textColor=\"neutral800\">\n {row[header.name.split('.')[0]]\n ? getDisplayName(row[header.name.split('.')[0]])\n : '-'}\n </Typography>\n </Table.Cell>\n );\n }\n if (typeof cellFormatter === 'function') {\n return (\n <Table.Cell key={header.name}>\n {/* @ts-expect-error – TODO: fix this TS error */}\n {cellFormatter(row, header, { collectionType, model })}\n </Table.Cell>\n );\n }\n return (\n <Table.Cell key={header.name}>\n <CellContent\n content={row[header.name.split('.')[0]]}\n rowId={row.documentId}\n {...header}\n />\n </Table.Cell>\n );\n })}\n {/* we stop propogation here to allow the menu to trigger it's events without triggering the row redirect */}\n <ActionsCell onClick={(e) => e.stopPropagation()}>\n <TableActions document={row} />\n </ActionsCell>\n </Table.Row>\n );\n })}\n </Table.Body>\n </Table.Content>\n </Table.Root>\n <Pagination.Root\n {...pagination}\n onPageSizeChange={() => trackUsage('willChangeNumberOfEntriesPerPage')}\n >\n <Pagination.PageSize />\n <Pagination.Links />\n </Pagination.Root>\n </Flex>\n </Layouts.Content>\n </Page.Main>\n );\n};\n\nconst ActionsCell = styled(Table.Cell)`\n display: flex;\n justify-content: flex-end;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * TableActionsBar\n * -----------------------------------------------------------------------------------------------*/\n\nconst TableActionsBar = () => {\n const selectRow = useTable('TableActionsBar', (state) => state.selectRow);\n const [{ query }] = useQueryParams<{ plugins: { i18n: { locale: string } } }>();\n const locale = query?.plugins?.i18n?.locale;\n const prevLocale = usePrev(locale);\n\n // TODO: find a better way to reset the selected rows when the locale changes across all the app\n React.useEffect(() => {\n if (prevLocale !== locale) {\n selectRow([]);\n }\n }, [selectRow, prevLocale, locale]);\n\n return (\n <Table.ActionBar>\n <BulkActionsRenderer />\n </Table.ActionBar>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CreateButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface CreateButtonProps extends Pick<ButtonProps, 'variant'> {}\n\nconst CreateButton = ({ variant }: CreateButtonProps) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [{ query }] = useQueryParams<{ plugins: object }>();\n\n return (\n <Button\n variant={variant}\n tag={ReactRouterLink}\n onClick={() => {\n trackUsage('willCreateEntry', { status: 'draft' });\n }}\n startIcon={<Plus />}\n style={{ textDecoration: 'none' }}\n to={{\n pathname: 'create',\n search: stringify({ plugins: query.plugins }),\n }}\n minWidth=\"max-content\"\n marginLeft={2}\n >\n {formatMessage({\n id: getTranslation('HeaderLayout.button.label-add-entry'),\n defaultMessage: 'Create new entry',\n })}\n </Button>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedListViewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedListViewPage = () => {\n const { slug = '' } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC(\n PERMISSIONS.map((action) => ({\n action,\n subject: slug,\n }))\n );\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !slug) {\n return <Page.Error />;\n }\n\n return (\n <Page.Protect permissions={permissions}>\n {({ permissions }) => (\n <DocumentRBAC permissions={permissions}>\n <ListViewPage />\n </DocumentRBAC>\n )}\n </Page.Protect>\n );\n};\n\nexport { ListViewPage, ProtectedListViewPage };\n"],"names":["CREATOR_FIELDS","useIntl","useTracking","useAuth","useQueryParams","useContentTypeSchema","React","useAdminUsers","useGetContentTypeConfigurationQuery","useCollator","getMainField","getDisplayName","jsxs","Filters","jsx","useDebounce","useField","Combobox","ComboboxOption","parseISO","toString","Tooltip","Typography","Menu","Badge","prefixFileUrlWithBackendUrl","Avatar","Flex","styled","index","getRelationLabel","useDoc","useNotifyAT","useGetRelationsQuery","getTranslation","isOpen","Loader","Fragment","isEmpty","useTypedSelector","useRBAC","Popover","IconButton","Cog","LinkButton","ListPlus","NavLink","stringify","useDocumentLayout","checkIfAttributeIsDisplayable","TextButton","Checkbox","HOOKS","Layouts","useNavigate","useNotification","useAPIErrorHandler","usePrev","isEqual","convertListLayoutToFieldLayouts","buildValidParams","useGetAllDocumentsQuery","useDocumentRBAC","canCreate","useStrapiApp","runHookWaterfall","Page","BackButton","InjectionZone","SearchInput","Table","DocumentStatus","TableActions","Pagination","useTable","BulkActionsRenderer","Button","ReactRouterLink","Plus","useParams","PERMISSIONS","permissions","DocumentRBAC"],"mappings":"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"}
@@ -1,19 +1,19 @@
1
1
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
- import { useTracking, useAuth, useQueryParams, useAdminUsers, Filters, useField, useRBAC, useNotification, useAPIErrorHandler, useStrapiApp, Page, Layouts, BackButton, SearchInput, Table, Pagination, useTable } from "@strapi/admin/strapi-admin";
4
- import { useCollator, Combobox, ComboboxOption, Menu, Tooltip, Typography, Badge, Avatar, Flex, useNotifyAT, Loader, Popover, IconButton, LinkButton, TextButton, Checkbox, Button } from "@strapi/design-system";
3
+ import { useTracking, useAuth, useQueryParams, useAdminUsers, Filters, useField, useRBAC, Layouts, useNotification, useAPIErrorHandler, useStrapiApp, Page, BackButton, SearchInput, Table, Pagination, useTable } from "@strapi/admin/strapi-admin";
4
+ import { useCollator, Combobox, ComboboxOption, Tooltip, Typography, Menu, Badge, Avatar, Flex, useNotifyAT, Loader, Popover, IconButton, LinkButton, TextButton, Checkbox, Button } from "@strapi/design-system";
5
5
  import { Cog, ListPlus, Plus } from "@strapi/icons";
6
6
  import isEqual from "lodash/isEqual";
7
7
  import { stringify } from "qs";
8
8
  import { useIntl } from "react-intl";
9
9
  import { NavLink, useNavigate, Link, useParams } from "react-router-dom";
10
10
  import { styled } from "styled-components";
11
- import { u as useContentTypeSchema, o as useGetContentTypeConfigurationQuery, p as CREATOR_FIELDS, q as getMainField, r as getDisplayName, c as useDoc, g as getTranslation, h as useDocumentLayout, t as checkIfAttributeIsDisplayable, d as buildValidParams, v as useGetAllDocumentsQuery, f as useDocumentRBAC, I as InjectionZone, D as DocumentStatus, T as TableActions, B as BulkActionsRenderer, k as PERMISSIONS, l as DocumentRBAC, H as HOOKS, w as convertListLayoutToFieldLayouts } from "./index-DJXJw9V5.mjs";
12
- import { p as prefixFileUrlWithBackendUrl, u as usePrev } from "./usePrev-DH6iah0A.mjs";
11
+ import { u as useContentTypeSchema, p as useGetContentTypeConfigurationQuery, q as CREATOR_FIELDS, r as getMainField, t as getDisplayName, c as useDoc, g as getTranslation, h as useDocumentLayout, v as checkIfAttributeIsDisplayable, d as buildValidParams, w as useGetAllDocumentsQuery, f as useDocumentRBAC, I as InjectionZone, D as DocumentStatus, T as TableActions, B as BulkActionsRenderer, k as PERMISSIONS, l as DocumentRBAC, H as HOOKS, x as convertListLayoutToFieldLayouts } from "./index-BmUAydCA.mjs";
12
+ import { a as useDebounce, p as prefixFileUrlWithBackendUrl, u as usePrev } from "./useDebounce-DmuSJIF3.mjs";
13
13
  import isEmpty from "lodash/isEmpty";
14
14
  import parseISO from "date-fns/parseISO";
15
15
  import toString from "lodash/toString";
16
- import { g as getRelationLabel, u as useGetRelationsQuery } from "./relations-BH_kBSJ0.mjs";
16
+ import { g as getRelationLabel, u as useGetRelationsQuery } from "./relations-op89RClB.mjs";
17
17
  import { u as useTypedSelector } from "./hooks-E5u1mcgM.mjs";
18
18
  const NOT_ALLOWED_FILTERS = [
19
19
  "json",
@@ -121,6 +121,15 @@ const FiltersImpl = ({ disabled, schema }) => {
121
121
  }
122
122
  };
123
123
  }
124
+ if (attribute.type === "enumeration") {
125
+ filter = {
126
+ ...filter,
127
+ options: attribute.enum.map((value) => ({
128
+ label: value,
129
+ value
130
+ }))
131
+ };
132
+ }
124
133
  return filter;
125
134
  }).filter(Boolean).toSorted((a, b) => formatter.compare(a.label, b.label));
126
135
  }, [
@@ -163,18 +172,22 @@ const FiltersImpl = ({ disabled, schema }) => {
163
172
  );
164
173
  };
165
174
  const AdminUsersFilter = ({ name }) => {
166
- const [page, setPage] = React.useState(1);
175
+ const [pageSize, setPageSize] = React.useState(10);
176
+ const [search, setSearch] = React.useState("");
167
177
  const { formatMessage } = useIntl();
178
+ const debouncedSearch = useDebounce(search, 300);
168
179
  const { data, isLoading } = useAdminUsers({
169
- page
180
+ pageSize,
181
+ _q: debouncedSearch
170
182
  });
171
183
  const field = useField(name);
172
184
  const handleOpenChange = (isOpen) => {
173
185
  if (!isOpen) {
174
- setPage(1);
186
+ setPageSize(10);
175
187
  }
176
188
  };
177
- const users = data?.users || [];
189
+ const { users = [], pagination } = data ?? {};
190
+ const { pageCount = 1, page = 1 } = pagination ?? {};
178
191
  return /* @__PURE__ */ jsx(
179
192
  Combobox,
180
193
  {
@@ -186,7 +199,11 @@ const AdminUsersFilter = ({ name }) => {
186
199
  onOpenChange: handleOpenChange,
187
200
  onChange: (value) => field.onChange(name, value),
188
201
  loading: isLoading,
189
- onLoadMore: () => setPage((prev) => prev + 1),
202
+ onLoadMore: () => setPageSize(pageSize + 10),
203
+ hasMoreItems: page < pageCount,
204
+ onInputChange: (e) => {
205
+ setSearch(e.currentTarget.value);
206
+ },
190
207
  children: users.map((user) => {
191
208
  return /* @__PURE__ */ jsx(ComboboxOption, { value: user.id.toString(), children: getDisplayName(user) }, user.id);
192
209
  })
@@ -236,9 +253,8 @@ const RepeatableComponent = ({ content, mainField }) => {
236
253
  return null;
237
254
  }
238
255
  return /* @__PURE__ */ jsxs(Menu.Root, { children: [
239
- /* @__PURE__ */ jsxs(MenuTrigger$1, { onClick: (e) => e.stopPropagation(), children: [
256
+ /* @__PURE__ */ jsxs(Menu.Trigger, { onClick: (e) => e.stopPropagation(), children: [
240
257
  /* @__PURE__ */ jsx(Badge, { children: content.length }),
241
- " ",
242
258
  formatMessage(
243
259
  {
244
260
  id: "content-manager.containers.list.items",
@@ -250,12 +266,6 @@ const RepeatableComponent = ({ content, mainField }) => {
250
266
  /* @__PURE__ */ jsx(Menu.Content, { children: content.map((item) => /* @__PURE__ */ jsx(Menu.Item, { disabled: true, children: /* @__PURE__ */ jsx(Typography, { maxWidth: "50rem", ellipsis: true, children: /* @__PURE__ */ jsx(CellValue, { type: mainField.type, value: item[mainField.name] }) }) }, item.id)) })
251
267
  ] });
252
268
  };
253
- const MenuTrigger$1 = styled(Menu.Trigger)`
254
- svg {
255
- width: 0.6rem;
256
- height: 0.4rem;
257
- }
258
- `;
259
269
  const getFileExtension = (ext) => ext && ext[0] === "." ? ext.substring(1) : ext;
260
270
  const MediaSingle = ({ url, mime, alternativeText, name, ext, formats }) => {
261
271
  const fileURL = prefixFileUrlWithBackendUrl(url);
@@ -331,6 +341,7 @@ const RelationMultiple = ({ mainField, content, rowId, name }) => {
331
341
  refetchOnMountOrArgChange: true
332
342
  }
333
343
  );
344
+ const contentCount = Array.isArray(content) ? content.length : content.count;
334
345
  React.useEffect(() => {
335
346
  if (data) {
336
347
  notifyStatus(
@@ -342,16 +353,13 @@ const RelationMultiple = ({ mainField, content, rowId, name }) => {
342
353
  }
343
354
  }, [data, formatMessage, notifyStatus]);
344
355
  return /* @__PURE__ */ jsxs(Menu.Root, { onOpenChange: (isOpen2) => setIsOpen(isOpen2), children: [
345
- /* @__PURE__ */ jsx(MenuTrigger, { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxs(Flex, { gap: 1, wrap: "nowrap", children: [
346
- /* @__PURE__ */ jsx(Badge, { children: content.count }),
347
- formatMessage(
348
- {
349
- id: "content-manager.containers.list.items",
350
- defaultMessage: "{number, plural, =0 {items} one {item} other {items}}"
351
- },
352
- { number: content.count }
353
- )
354
- ] }) }),
356
+ /* @__PURE__ */ jsx(Menu.Trigger, { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx(Typography, { style: { cursor: "pointer" }, textColor: "neutral800", fontWeight: "regular", children: contentCount > 0 ? formatMessage(
357
+ {
358
+ id: "content-manager.containers.list.items",
359
+ defaultMessage: "{number} {number, plural, =0 {items} one {item} other {items}}"
360
+ },
361
+ { number: contentCount }
362
+ ) : "-" }) }),
355
363
  /* @__PURE__ */ jsxs(Menu.Content, { children: [
356
364
  isLoading && /* @__PURE__ */ jsx(Menu.Item, { disabled: true, children: /* @__PURE__ */ jsx(Loader, { small: true, children: formatMessage({
357
365
  id: getTranslation("ListViewTable.relation-loading"),
@@ -374,15 +382,17 @@ const RelationMultiple = ({ mainField, content, rowId, name }) => {
374
382
  ] })
375
383
  ] });
376
384
  };
377
- const MenuTrigger = styled(Menu.Trigger)`
378
- svg {
379
- width: 0.6rem;
380
- height: 0.4rem;
381
- }
382
- `;
383
385
  const CellContent = ({ content, mainField, attribute, rowId, name }) => {
384
386
  if (!hasContent(content, mainField, attribute)) {
385
- return /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", children: "-" });
387
+ return /* @__PURE__ */ jsx(
388
+ Typography,
389
+ {
390
+ textColor: "neutral800",
391
+ paddingLeft: attribute.type === "relation" ? "1.6rem" : 0,
392
+ paddingRight: attribute.type === "relation" ? "1.6rem" : 0,
393
+ children: "-"
394
+ }
395
+ );
386
396
  }
387
397
  switch (attribute.type) {
388
398
  case "media":
@@ -422,6 +432,9 @@ const hasContent = (content, mainField, attribute) => {
422
432
  if (isSingleRelation(attribute.relation)) {
423
433
  return !isEmpty(content);
424
434
  }
435
+ if (Array.isArray(content)) {
436
+ return content.length > 0;
437
+ }
425
438
  return content?.count > 0;
426
439
  }
427
440
  if (["integer", "decimal", "float", "number"].includes(attribute.type)) {
@@ -533,6 +546,9 @@ const FieldPicker = ({ headers = [], resetHeaders, setHeaders }) => {
533
546
  ] });
534
547
  };
535
548
  const { INJECT_COLUMN_IN_TABLE } = HOOKS;
549
+ const LayoutsHeaderCustom = styled(Layouts.Header)`
550
+ overflow-wrap: anywhere;
551
+ `;
536
552
  const ListViewPage = () => {
537
553
  const { trackUsage } = useTracking();
538
554
  const navigate = useNavigate();
@@ -559,7 +575,7 @@ const ListViewPage = () => {
559
575
  sort: list.settings.defaultSortBy ? `${list.settings.defaultSortBy}:${list.settings.defaultSortOrder}` : ""
560
576
  });
561
577
  const params = React.useMemo(() => buildValidParams(query), [query]);
562
- const { data, error, isLoading } = useGetAllDocumentsQuery({
578
+ const { data, error, isFetching } = useGetAllDocumentsQuery({
563
579
  model,
564
580
  params
565
581
  });
@@ -617,7 +633,7 @@ const ListViewPage = () => {
617
633
  }
618
634
  return formattedHeaders;
619
635
  }, [displayedHeaders, formatMessage, list, runHookWaterfall, schema?.options?.draftAndPublish]);
620
- if (isLoading) {
636
+ if (isFetching) {
621
637
  return /* @__PURE__ */ jsx(Page.Loading, {});
622
638
  }
623
639
  if (error) {
@@ -634,7 +650,7 @@ const ListViewPage = () => {
634
650
  return /* @__PURE__ */ jsxs(Page.Main, { children: [
635
651
  /* @__PURE__ */ jsx(Page.Title, { children: `${contentTypeTitle}` }),
636
652
  /* @__PURE__ */ jsx(
637
- Layouts.Header,
653
+ LayoutsHeaderCustom,
638
654
  {
639
655
  primaryAction: canCreate ? /* @__PURE__ */ jsx(CreateButton, {}) : null,
640
656
  subtitle: formatMessage(
@@ -683,7 +699,7 @@ const ListViewPage = () => {
683
699
  }
684
700
  ),
685
701
  /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
686
- /* @__PURE__ */ jsxs(Table.Root, { rows: results, headers: tableHeaders, isLoading, children: [
702
+ /* @__PURE__ */ jsxs(Table.Root, { rows: results, headers: tableHeaders, isLoading: isFetching, children: [
687
703
  /* @__PURE__ */ jsx(TableActionsBar, {}),
688
704
  /* @__PURE__ */ jsxs(Table.Content, { children: [
689
705
  /* @__PURE__ */ jsxs(Table.Head, { children: [
@@ -776,6 +792,8 @@ const CreateButton = ({ variant }) => {
776
792
  pathname: "create",
777
793
  search: stringify({ plugins: query.plugins })
778
794
  },
795
+ minWidth: "max-content",
796
+ marginLeft: 2,
779
797
  children: formatMessage({
780
798
  id: getTranslation("HeaderLayout.button.label-add-entry"),
781
799
  defaultMessage: "Create new entry"
@@ -807,4 +825,4 @@ export {
807
825
  ListViewPage,
808
826
  ProtectedListViewPage
809
827
  };
810
- //# sourceMappingURL=ListViewPage-SID6TRb9.mjs.map
828
+ //# sourceMappingURL=ListViewPage-CsX7tWx-.mjs.map