@strapi/content-manager 0.0.0-experimental.4ddd402c7194d1a969a797313bf007c93148d59a → 0.0.0-experimental.545ccead2ee1717bbc7ab950455dbb0ddb9924a3

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 (97) hide show
  1. package/LICENSE +18 -3
  2. package/dist/_chunks/{ComponentConfigurationPage-Cxz51Sve.mjs → ComponentConfigurationPage-B1bIXVuX.mjs} +3 -3
  3. package/dist/_chunks/{ComponentConfigurationPage-Cxz51Sve.mjs.map → ComponentConfigurationPage-B1bIXVuX.mjs.map} +1 -1
  4. package/dist/_chunks/{ComponentConfigurationPage-BZIaEffq.js → ComponentConfigurationPage-Bqgx7Mes.js} +3 -3
  5. package/dist/_chunks/{ComponentConfigurationPage-BZIaEffq.js.map → ComponentConfigurationPage-Bqgx7Mes.js.map} +1 -1
  6. package/dist/_chunks/{EditConfigurationPage-CM62NN0L.js → EditConfigurationPage-BFEwvdMW.js} +3 -3
  7. package/dist/_chunks/{EditConfigurationPage-CM62NN0L.js.map → EditConfigurationPage-BFEwvdMW.js.map} +1 -1
  8. package/dist/_chunks/{EditConfigurationPage-CZLbgfIp.mjs → EditConfigurationPage-ZO0vOO8q.mjs} +3 -3
  9. package/dist/_chunks/{EditConfigurationPage-CZLbgfIp.mjs.map → EditConfigurationPage-ZO0vOO8q.mjs.map} +1 -1
  10. package/dist/_chunks/{EditViewPage-CU7724gt.js → EditViewPage-DA95Ha6J.js} +45 -45
  11. package/dist/_chunks/EditViewPage-DA95Ha6J.js.map +1 -0
  12. package/dist/_chunks/{EditViewPage-CzuJgWWp.mjs → EditViewPage-DlLEyUL6.mjs} +46 -46
  13. package/dist/_chunks/EditViewPage-DlLEyUL6.mjs.map +1 -0
  14. package/dist/_chunks/{Field-Dh1yZyqy.js → Field-CnK8dO8N.js} +416 -136
  15. package/dist/_chunks/Field-CnK8dO8N.js.map +1 -0
  16. package/dist/_chunks/{Field-QtUSh5mU.mjs → Field-Dq7bDnuh.mjs} +417 -137
  17. package/dist/_chunks/Field-Dq7bDnuh.mjs.map +1 -0
  18. package/dist/_chunks/{Form-COLpvlnv.mjs → Form-B_JE0dbz.mjs} +27 -28
  19. package/dist/_chunks/Form-B_JE0dbz.mjs.map +1 -0
  20. package/dist/_chunks/{Form-BOR8NOe1.js → Form-BpiR4piS.js} +25 -26
  21. package/dist/_chunks/Form-BpiR4piS.js.map +1 -0
  22. package/dist/_chunks/{History-Bu53Yfw-.mjs → History-CBNGU7a-.mjs} +124 -30
  23. package/dist/_chunks/History-CBNGU7a-.mjs.map +1 -0
  24. package/dist/_chunks/{History-CW2akQ6h.js → History-DdIstl8b.js} +123 -29
  25. package/dist/_chunks/History-DdIstl8b.js.map +1 -0
  26. package/dist/_chunks/{ListConfigurationPage-TqrmwjPN.mjs → ListConfigurationPage-5dr4qpue.mjs} +49 -49
  27. package/dist/_chunks/ListConfigurationPage-5dr4qpue.mjs.map +1 -0
  28. package/dist/_chunks/{ListConfigurationPage-jzdhEk_u.js → ListConfigurationPage-DkKRparB.js} +48 -47
  29. package/dist/_chunks/ListConfigurationPage-DkKRparB.js.map +1 -0
  30. package/dist/_chunks/{ListViewPage-BO_mOXIl.mjs → ListViewPage-DecLrYV6.mjs} +60 -68
  31. package/dist/_chunks/ListViewPage-DecLrYV6.mjs.map +1 -0
  32. package/dist/_chunks/{ListViewPage-B3bMOrMv.js → ListViewPage-wE0lXqoD.js} +59 -67
  33. package/dist/_chunks/ListViewPage-wE0lXqoD.js.map +1 -0
  34. package/dist/_chunks/{NoContentTypePage-DqB0QV0k.mjs → NoContentTypePage-CiIcfYsd.mjs} +2 -2
  35. package/dist/_chunks/{NoContentTypePage-DqB0QV0k.mjs.map → NoContentTypePage-CiIcfYsd.mjs.map} +1 -1
  36. package/dist/_chunks/{NoContentTypePage-D77xsNHj.js → NoContentTypePage-DEKR6tf9.js} +2 -2
  37. package/dist/_chunks/{NoContentTypePage-D77xsNHj.js.map → NoContentTypePage-DEKR6tf9.js.map} +1 -1
  38. package/dist/_chunks/{NoPermissionsPage-DTXi042N.mjs → NoPermissionsPage-CM5UD8ee.mjs} +2 -2
  39. package/dist/_chunks/{NoPermissionsPage-DTXi042N.mjs.map → NoPermissionsPage-CM5UD8ee.mjs.map} +1 -1
  40. package/dist/_chunks/{NoPermissionsPage-C6qTGogm.js → NoPermissionsPage-DmNfF2Bb.js} +2 -2
  41. package/dist/_chunks/{NoPermissionsPage-C6qTGogm.js.map → NoPermissionsPage-DmNfF2Bb.js.map} +1 -1
  42. package/dist/_chunks/{Relations-CJ4qdkRo.mjs → Relations-Dqz0C1fz.mjs} +3 -3
  43. package/dist/_chunks/Relations-Dqz0C1fz.mjs.map +1 -0
  44. package/dist/_chunks/{Relations-B6fb2POW.js → Relations-L0xYRoSQ.js} +3 -3
  45. package/dist/_chunks/Relations-L0xYRoSQ.js.map +1 -0
  46. package/dist/_chunks/{en-9GwRW_ku.mjs → en-BrCTWlZv.mjs} +7 -4
  47. package/dist/_chunks/{en-9GwRW_ku.mjs.map → en-BrCTWlZv.mjs.map} +1 -1
  48. package/dist/_chunks/{en-DZXjRiWA.js → en-uOUIxfcQ.js} +7 -4
  49. package/dist/_chunks/{en-DZXjRiWA.js.map → en-uOUIxfcQ.js.map} +1 -1
  50. package/dist/_chunks/{index-Dahjdw4h.mjs → index-BSn97i8U.mjs} +355 -384
  51. package/dist/_chunks/index-BSn97i8U.mjs.map +1 -0
  52. package/dist/_chunks/{index-DcUu-_72.js → index-DyvUPg1a.js} +340 -369
  53. package/dist/_chunks/index-DyvUPg1a.js.map +1 -0
  54. package/dist/_chunks/{layout-omucV6TV.mjs → layout-DPaHUusj.mjs} +8 -8
  55. package/dist/_chunks/layout-DPaHUusj.mjs.map +1 -0
  56. package/dist/_chunks/{layout-jcY4dyUG.js → layout-TPqF2oJ5.js} +7 -7
  57. package/dist/_chunks/layout-TPqF2oJ5.js.map +1 -0
  58. package/dist/_chunks/{relations-DGzD7ORa.js → relations-BWYS9gkn.js} +2 -2
  59. package/dist/_chunks/{relations-DGzD7ORa.js.map → relations-BWYS9gkn.js.map} +1 -1
  60. package/dist/_chunks/{relations-CN0-aw6p.mjs → relations-Ck7-ecDT.mjs} +2 -2
  61. package/dist/_chunks/{relations-CN0-aw6p.mjs.map → relations-Ck7-ecDT.mjs.map} +1 -1
  62. package/dist/admin/index.js +1 -1
  63. package/dist/admin/index.mjs +4 -4
  64. package/dist/admin/src/history/components/VersionInputRenderer.d.ts +1 -1
  65. package/dist/admin/src/history/index.d.ts +3 -0
  66. package/dist/admin/src/index.d.ts +1 -0
  67. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +8 -3
  68. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +4 -0
  69. package/dist/admin/src/pages/EditView/components/FormInputs/Relations.d.ts +20 -0
  70. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +2 -10
  71. package/dist/admin/src/pages/ListView/components/BulkActions/Actions.d.ts +3 -30
  72. package/dist/admin/src/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.d.ts +2 -2
  73. package/dist/server/index.js +11 -6
  74. package/dist/server/index.js.map +1 -1
  75. package/dist/server/index.mjs +11 -6
  76. package/dist/server/index.mjs.map +1 -1
  77. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  78. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  79. package/package.json +8 -8
  80. package/dist/_chunks/EditViewPage-CU7724gt.js.map +0 -1
  81. package/dist/_chunks/EditViewPage-CzuJgWWp.mjs.map +0 -1
  82. package/dist/_chunks/Field-Dh1yZyqy.js.map +0 -1
  83. package/dist/_chunks/Field-QtUSh5mU.mjs.map +0 -1
  84. package/dist/_chunks/Form-BOR8NOe1.js.map +0 -1
  85. package/dist/_chunks/Form-COLpvlnv.mjs.map +0 -1
  86. package/dist/_chunks/History-Bu53Yfw-.mjs.map +0 -1
  87. package/dist/_chunks/History-CW2akQ6h.js.map +0 -1
  88. package/dist/_chunks/ListConfigurationPage-TqrmwjPN.mjs.map +0 -1
  89. package/dist/_chunks/ListConfigurationPage-jzdhEk_u.js.map +0 -1
  90. package/dist/_chunks/ListViewPage-B3bMOrMv.js.map +0 -1
  91. package/dist/_chunks/ListViewPage-BO_mOXIl.mjs.map +0 -1
  92. package/dist/_chunks/Relations-B6fb2POW.js.map +0 -1
  93. package/dist/_chunks/Relations-CJ4qdkRo.mjs.map +0 -1
  94. package/dist/_chunks/index-Dahjdw4h.mjs.map +0 -1
  95. package/dist/_chunks/index-DcUu-_72.js.map +0 -1
  96. package/dist/_chunks/layout-jcY4dyUG.js.map +0 -1
  97. package/dist/_chunks/layout-omucV6TV.mjs.map +0 -1
@@ -1,19 +1,19 @@
1
1
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
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, AvatarGroup, useNotifyAT, Loader, IconButton, Popover, LinkButton, TextButton, BaseCheckbox, Button } from "@strapi/design-system";
4
+ import { useCollator, Combobox, ComboboxOption, Menu, Tooltip, Typography, 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, 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-Dahjdw4h.mjs";
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-BSn97i8U.mjs";
12
12
  import { p as prefixFileUrlWithBackendUrl, u as usePrev } from "./usePrev-DH6iah0A.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-CN0-aw6p.mjs";
16
+ import { g as getRelationLabel, u as useGetRelationsQuery } from "./relations-Ck7-ecDT.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
  }, [
@@ -262,7 +271,15 @@ const MediaSingle = ({ url, mime, alternativeText, name, ext, formats }) => {
262
271
  if (mime.includes("image")) {
263
272
  const thumbnail = formats?.thumbnail?.url;
264
273
  const mediaURL = prefixFileUrlWithBackendUrl(thumbnail) || fileURL;
265
- return /* @__PURE__ */ jsx(Avatar, { src: mediaURL, alt: alternativeText || name, preview: true });
274
+ return /* @__PURE__ */ jsx(
275
+ Avatar.Item,
276
+ {
277
+ src: mediaURL,
278
+ alt: alternativeText || name,
279
+ fallback: alternativeText || name,
280
+ preview: true
281
+ }
282
+ );
266
283
  }
267
284
  const fileExtension = getFileExtension(ext);
268
285
  const fileName = name.length > 100 ? `${name.substring(0, 100)}...` : name;
@@ -291,7 +308,7 @@ const FileTypography = styled(Typography)`
291
308
  line-height: 0.9rem;
292
309
  `;
293
310
  const MediaMultiple = ({ content }) => {
294
- return /* @__PURE__ */ jsx(AvatarGroup, { children: content.map((file, index) => {
311
+ return /* @__PURE__ */ jsx(Avatar.Group, { children: content.map((file, index) => {
295
312
  const key = `${file.id}${index}`;
296
313
  if (index === 3) {
297
314
  const remainingFiles = `+${content.length - 3}`;
@@ -426,8 +443,6 @@ const hasContent = (content, mainField, attribute) => {
426
443
  };
427
444
  const isSingleRelation = (type) => ["oneToOne", "manyToOne", "oneToOneMorph"].includes(type);
428
445
  const ViewSettingsMenu = (props) => {
429
- const [isVisible, setIsVisible] = React.useState(false);
430
- const cogButtonRef = React.useRef(null);
431
446
  const permissions = useTypedSelector(
432
447
  (state) => state.admin_app.permissions.contentManager?.collectionTypesConfigurations ?? []
433
448
  );
@@ -436,52 +451,37 @@ const ViewSettingsMenu = (props) => {
436
451
  const {
437
452
  allowedActions: { canConfigureView }
438
453
  } = useRBAC(permissions);
439
- const handleToggle = () => {
440
- setIsVisible((prev) => !prev);
441
- };
442
- return /* @__PURE__ */ jsxs(Fragment, { children: [
443
- /* @__PURE__ */ jsx(
454
+ return /* @__PURE__ */ jsxs(Popover.Root, { children: [
455
+ /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
444
456
  IconButton,
445
457
  {
446
458
  label: formatMessage({
447
459
  id: "components.ViewSettings.tooltip",
448
460
  defaultMessage: "View Settings"
449
461
  }),
450
- ref: cogButtonRef,
451
- onClick: handleToggle,
452
462
  children: /* @__PURE__ */ jsx(Cog, {})
453
463
  }
454
- ),
455
- isVisible && /* @__PURE__ */ jsx(
456
- Popover,
457
- {
458
- placement: "bottom-end",
459
- source: cogButtonRef,
460
- onDismiss: handleToggle,
461
- spacing: 4,
462
- padding: 3,
463
- children: /* @__PURE__ */ jsxs(Flex, { alignItems: "stretch", direction: "column", gap: 3, children: [
464
- canConfigureView ? /* @__PURE__ */ jsx(
465
- LinkButton,
466
- {
467
- size: "S",
468
- startIcon: /* @__PURE__ */ jsx(ListPlus, {}),
469
- variant: "secondary",
470
- tag: NavLink,
471
- to: {
472
- pathname: "configurations/list",
473
- search: query.plugins ? stringify({ plugins: query.plugins }, { encode: false }) : ""
474
- },
475
- children: formatMessage({
476
- id: "app.links.configure-view",
477
- defaultMessage: "Configure the view"
478
- })
479
- }
480
- ) : null,
481
- /* @__PURE__ */ jsx(FieldPicker, { ...props })
482
- ] })
483
- }
484
- )
464
+ ) }),
465
+ /* @__PURE__ */ jsx(Popover.Content, { side: "bottom", align: "end", sideOffset: 4, children: /* @__PURE__ */ jsxs(Flex, { alignItems: "stretch", direction: "column", padding: 3, gap: 3, children: [
466
+ canConfigureView ? /* @__PURE__ */ jsx(
467
+ LinkButton,
468
+ {
469
+ size: "S",
470
+ startIcon: /* @__PURE__ */ jsx(ListPlus, {}),
471
+ variant: "secondary",
472
+ tag: NavLink,
473
+ to: {
474
+ pathname: "configurations/list",
475
+ search: query.plugins ? stringify({ plugins: query.plugins }, { encode: false }) : ""
476
+ },
477
+ children: formatMessage({
478
+ id: "app.links.configure-view",
479
+ defaultMessage: "Configure the view"
480
+ })
481
+ }
482
+ ) : null,
483
+ /* @__PURE__ */ jsx(FieldPicker, { ...props })
484
+ ] }) })
485
485
  ] });
486
486
  };
487
487
  const FieldPicker = ({ headers = [], resetHeaders, setHeaders }) => {
@@ -518,37 +518,29 @@ const FieldPicker = ({ headers = [], resetHeaders, setHeaders }) => {
518
518
  ] }),
519
519
  /* @__PURE__ */ jsx(Flex, { direction: "column", alignItems: "stretch", children: columns.map((header) => {
520
520
  const isActive = headers.includes(header.name);
521
- return /* @__PURE__ */ jsxs(
522
- ChackboxWrapper,
521
+ return /* @__PURE__ */ jsx(
522
+ Flex,
523
523
  {
524
524
  wrap: "wrap",
525
525
  gap: 2,
526
- tag: "label",
527
526
  background: isActive ? "primary100" : "transparent",
528
527
  hasRadius: true,
529
528
  padding: 2,
530
- children: [
531
- /* @__PURE__ */ jsx(
532
- BaseCheckbox,
533
- {
534
- onChange: () => handleChange(header.name),
535
- value: isActive,
536
- name: header.name
537
- }
538
- ),
539
- /* @__PURE__ */ jsx(Typography, { fontSize: 1, children: header.label })
540
- ]
529
+ children: /* @__PURE__ */ jsx(
530
+ Checkbox,
531
+ {
532
+ onCheckedChange: () => handleChange(header.name),
533
+ checked: isActive,
534
+ name: header.name,
535
+ children: /* @__PURE__ */ jsx(Typography, { fontSize: 1, children: header.label })
536
+ }
537
+ )
541
538
  },
542
539
  header.name
543
540
  );
544
541
  }) })
545
542
  ] });
546
543
  };
547
- const ChackboxWrapper = styled(Flex)`
548
- :hover {
549
- background-color: ${(props) => props.theme.colors.primary100};
550
- }
551
- `;
552
544
  const { INJECT_COLUMN_IN_TABLE } = HOOKS;
553
545
  const ListViewPage = () => {
554
546
  const { trackUsage } = useTracking();
@@ -576,7 +568,7 @@ const ListViewPage = () => {
576
568
  sort: list.settings.defaultSortBy ? `${list.settings.defaultSortBy}:${list.settings.defaultSortOrder}` : ""
577
569
  });
578
570
  const params = React.useMemo(() => buildValidParams(query), [query]);
579
- const { data, error, isLoading } = useGetAllDocumentsQuery({
571
+ const { data, error, isFetching } = useGetAllDocumentsQuery({
580
572
  model,
581
573
  params
582
574
  });
@@ -634,7 +626,7 @@ const ListViewPage = () => {
634
626
  }
635
627
  return formattedHeaders;
636
628
  }, [displayedHeaders, formatMessage, list, runHookWaterfall, schema?.options?.draftAndPublish]);
637
- if (isLoading) {
629
+ if (isFetching) {
638
630
  return /* @__PURE__ */ jsx(Page.Loading, {});
639
631
  }
640
632
  if (error) {
@@ -700,7 +692,7 @@ const ListViewPage = () => {
700
692
  }
701
693
  ),
702
694
  /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
703
- /* @__PURE__ */ jsxs(Table.Root, { rows: results, headers: tableHeaders, isLoading, children: [
695
+ /* @__PURE__ */ jsxs(Table.Root, { rows: results, headers: tableHeaders, isLoading: isFetching, children: [
704
696
  /* @__PURE__ */ jsx(TableActionsBar, {}),
705
697
  /* @__PURE__ */ jsxs(Table.Content, { children: [
706
698
  /* @__PURE__ */ jsxs(Table.Head, { children: [
@@ -824,4 +816,4 @@ export {
824
816
  ListViewPage,
825
817
  ProtectedListViewPage
826
818
  };
827
- //# sourceMappingURL=ListViewPage-BO_mOXIl.mjs.map
819
+ //# sourceMappingURL=ListViewPage-DecLrYV6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListViewPage-DecLrYV6.mjs","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 { 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 [page, setPage] = React.useState(1);\n const { formatMessage } = useIntl();\n const { data, isLoading } = useAdminUsers({\n page,\n });\n const field = useField(name);\n\n const handleOpenChange = (isOpen?: boolean) => {\n if (!isOpen) {\n setPage(1);\n }\n };\n\n const users = data?.users || [];\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={() => setPage((prev) => prev + 1)}\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 <MenuTrigger 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 </MenuTrigger>\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\n/**\n * TODO: this needs to be solved in the Design-System\n */\nconst MenuTrigger = styled(Menu.Trigger)`\n svg {\n width: 0.6rem;\n height: 0.4rem;\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, Badge, Flex, Loader, useNotifyAT, Menu } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\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 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 <MenuTrigger onClick={(e) => e.stopPropagation()}>\n <Flex gap={1} wrap=\"nowrap\">\n <Badge>{content.count}</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.count }\n )}\n </Flex>\n </MenuTrigger>\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\n/**\n * TODO: this needs to be solved in the Design-System\n */\nconst MenuTrigger = styled(Menu.Trigger)`\n svg {\n width: 0.6rem;\n height: 0.4rem;\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 <Typography textColor=\"neutral800\">-</Typography>;\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 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 * -----------------------------------------------------------------------------------------------*/\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 <Layouts.Header\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 >\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":["MenuTrigger","isOpen","canCreate","runHookWaterfall","Filters","ReactRouterLink","permissions"],"mappings":"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"}
@@ -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-DcUu-_72.js");
13
+ const index = require("./index-DyvUPg1a.js");
14
14
  const usePrev = require("./usePrev-B9w_-eYc.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-DGzD7ORa.js");
18
+ const relations = require("./relations-BWYS9gkn.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
  }, [
@@ -288,7 +297,15 @@ const MediaSingle = ({ url, mime, alternativeText, name, ext, formats }) => {
288
297
  if (mime.includes("image")) {
289
298
  const thumbnail = formats?.thumbnail?.url;
290
299
  const mediaURL = usePrev.prefixFileUrlWithBackendUrl(thumbnail) || fileURL;
291
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Avatar, { src: mediaURL, alt: alternativeText || name, preview: true });
300
+ return /* @__PURE__ */ jsxRuntime.jsx(
301
+ designSystem.Avatar.Item,
302
+ {
303
+ src: mediaURL,
304
+ alt: alternativeText || name,
305
+ fallback: alternativeText || name,
306
+ preview: true
307
+ }
308
+ );
292
309
  }
293
310
  const fileExtension = getFileExtension(ext);
294
311
  const fileName = name.length > 100 ? `${name.substring(0, 100)}...` : name;
@@ -317,7 +334,7 @@ const FileTypography = styledComponents.styled(designSystem.Typography)`
317
334
  line-height: 0.9rem;
318
335
  `;
319
336
  const MediaMultiple = ({ content }) => {
320
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.AvatarGroup, { children: content.map((file, index2) => {
337
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Avatar.Group, { children: content.map((file, index2) => {
321
338
  const key = `${file.id}${index2}`;
322
339
  if (index2 === 3) {
323
340
  const remainingFiles = `+${content.length - 3}`;
@@ -452,8 +469,6 @@ const hasContent = (content, mainField, attribute) => {
452
469
  };
453
470
  const isSingleRelation = (type) => ["oneToOne", "manyToOne", "oneToOneMorph"].includes(type);
454
471
  const ViewSettingsMenu = (props) => {
455
- const [isVisible, setIsVisible] = React__namespace.useState(false);
456
- const cogButtonRef = React__namespace.useRef(null);
457
472
  const permissions = hooks.useTypedSelector(
458
473
  (state) => state.admin_app.permissions.contentManager?.collectionTypesConfigurations ?? []
459
474
  );
@@ -462,52 +477,37 @@ const ViewSettingsMenu = (props) => {
462
477
  const {
463
478
  allowedActions: { canConfigureView }
464
479
  } = strapiAdmin.useRBAC(permissions);
465
- const handleToggle = () => {
466
- setIsVisible((prev) => !prev);
467
- };
468
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
469
- /* @__PURE__ */ jsxRuntime.jsx(
480
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Popover.Root, { children: [
481
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(
470
482
  designSystem.IconButton,
471
483
  {
472
484
  label: formatMessage({
473
485
  id: "components.ViewSettings.tooltip",
474
486
  defaultMessage: "View Settings"
475
487
  }),
476
- ref: cogButtonRef,
477
- onClick: handleToggle,
478
488
  children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Cog, {})
479
489
  }
480
- ),
481
- isVisible && /* @__PURE__ */ jsxRuntime.jsx(
482
- designSystem.Popover,
483
- {
484
- placement: "bottom-end",
485
- source: cogButtonRef,
486
- onDismiss: handleToggle,
487
- spacing: 4,
488
- padding: 3,
489
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { alignItems: "stretch", direction: "column", gap: 3, children: [
490
- canConfigureView ? /* @__PURE__ */ jsxRuntime.jsx(
491
- designSystem.LinkButton,
492
- {
493
- size: "S",
494
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(Icons.ListPlus, {}),
495
- variant: "secondary",
496
- tag: reactRouterDom.NavLink,
497
- to: {
498
- pathname: "configurations/list",
499
- search: query.plugins ? qs.stringify({ plugins: query.plugins }, { encode: false }) : ""
500
- },
501
- children: formatMessage({
502
- id: "app.links.configure-view",
503
- defaultMessage: "Configure the view"
504
- })
505
- }
506
- ) : null,
507
- /* @__PURE__ */ jsxRuntime.jsx(FieldPicker, { ...props })
508
- ] })
509
- }
510
- )
490
+ ) }),
491
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Content, { side: "bottom", align: "end", sideOffset: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { alignItems: "stretch", direction: "column", padding: 3, gap: 3, children: [
492
+ canConfigureView ? /* @__PURE__ */ jsxRuntime.jsx(
493
+ designSystem.LinkButton,
494
+ {
495
+ size: "S",
496
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(Icons.ListPlus, {}),
497
+ variant: "secondary",
498
+ tag: reactRouterDom.NavLink,
499
+ to: {
500
+ pathname: "configurations/list",
501
+ search: query.plugins ? qs.stringify({ plugins: query.plugins }, { encode: false }) : ""
502
+ },
503
+ children: formatMessage({
504
+ id: "app.links.configure-view",
505
+ defaultMessage: "Configure the view"
506
+ })
507
+ }
508
+ ) : null,
509
+ /* @__PURE__ */ jsxRuntime.jsx(FieldPicker, { ...props })
510
+ ] }) })
511
511
  ] });
512
512
  };
513
513
  const FieldPicker = ({ headers = [], resetHeaders, setHeaders }) => {
@@ -544,37 +544,29 @@ const FieldPicker = ({ headers = [], resetHeaders, setHeaders }) => {
544
544
  ] }),
545
545
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", children: columns.map((header) => {
546
546
  const isActive = headers.includes(header.name);
547
- return /* @__PURE__ */ jsxRuntime.jsxs(
548
- ChackboxWrapper,
547
+ return /* @__PURE__ */ jsxRuntime.jsx(
548
+ designSystem.Flex,
549
549
  {
550
550
  wrap: "wrap",
551
551
  gap: 2,
552
- tag: "label",
553
552
  background: isActive ? "primary100" : "transparent",
554
553
  hasRadius: true,
555
554
  padding: 2,
556
- children: [
557
- /* @__PURE__ */ jsxRuntime.jsx(
558
- designSystem.BaseCheckbox,
559
- {
560
- onChange: () => handleChange(header.name),
561
- value: isActive,
562
- name: header.name
563
- }
564
- ),
565
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontSize: 1, children: header.label })
566
- ]
555
+ children: /* @__PURE__ */ jsxRuntime.jsx(
556
+ designSystem.Checkbox,
557
+ {
558
+ onCheckedChange: () => handleChange(header.name),
559
+ checked: isActive,
560
+ name: header.name,
561
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontSize: 1, children: header.label })
562
+ }
563
+ )
567
564
  },
568
565
  header.name
569
566
  );
570
567
  }) })
571
568
  ] });
572
569
  };
573
- const ChackboxWrapper = styledComponents.styled(designSystem.Flex)`
574
- :hover {
575
- background-color: ${(props) => props.theme.colors.primary100};
576
- }
577
- `;
578
570
  const { INJECT_COLUMN_IN_TABLE } = index.HOOKS;
579
571
  const ListViewPage = () => {
580
572
  const { trackUsage } = strapiAdmin.useTracking();
@@ -602,7 +594,7 @@ const ListViewPage = () => {
602
594
  sort: list.settings.defaultSortBy ? `${list.settings.defaultSortBy}:${list.settings.defaultSortOrder}` : ""
603
595
  });
604
596
  const params = React__namespace.useMemo(() => index.buildValidParams(query), [query]);
605
- const { data, error, isLoading } = index.useGetAllDocumentsQuery({
597
+ const { data, error, isFetching } = index.useGetAllDocumentsQuery({
606
598
  model,
607
599
  params
608
600
  });
@@ -660,7 +652,7 @@ const ListViewPage = () => {
660
652
  }
661
653
  return formattedHeaders;
662
654
  }, [displayedHeaders, formatMessage, list, runHookWaterfall, schema?.options?.draftAndPublish]);
663
- if (isLoading) {
655
+ if (isFetching) {
664
656
  return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Loading, {});
665
657
  }
666
658
  if (error) {
@@ -726,7 +718,7 @@ const ListViewPage = () => {
726
718
  }
727
719
  ),
728
720
  /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Layouts.Content, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
729
- /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Root, { rows: results, headers: tableHeaders, isLoading, children: [
721
+ /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Root, { rows: results, headers: tableHeaders, isLoading: isFetching, children: [
730
722
  /* @__PURE__ */ jsxRuntime.jsx(TableActionsBar, {}),
731
723
  /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Content, { children: [
732
724
  /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Head, { children: [
@@ -848,4 +840,4 @@ const ProtectedListViewPage = () => {
848
840
  };
849
841
  exports.ListViewPage = ListViewPage;
850
842
  exports.ProtectedListViewPage = ProtectedListViewPage;
851
- //# sourceMappingURL=ListViewPage-B3bMOrMv.js.map
843
+ //# sourceMappingURL=ListViewPage-wE0lXqoD.js.map