@strapi/upload 5.2.0 → 5.4.0

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 (147) hide show
  1. package/dist/_chunks/{index-Bi33Km2i.mjs → App-D1ayH-QS.mjs} +112 -106
  2. package/dist/_chunks/App-D1ayH-QS.mjs.map +1 -0
  3. package/dist/_chunks/{index-DlRn6eNH.js → App-Dqqn78jO.js} +112 -106
  4. package/dist/_chunks/App-Dqqn78jO.js.map +1 -0
  5. package/dist/_chunks/{index-KSVkjErL.mjs → ConfigureTheView-B2Syy3q5.mjs} +24 -23
  6. package/dist/_chunks/ConfigureTheView-B2Syy3q5.mjs.map +1 -0
  7. package/dist/_chunks/{index-l4hbqJYu.js → ConfigureTheView-fwDgErsi.js} +42 -23
  8. package/dist/_chunks/ConfigureTheView-fwDgErsi.js.map +1 -0
  9. package/dist/_chunks/{index-GpFGwMho.mjs → SettingsPage-BYC3ism8.mjs} +45 -43
  10. package/dist/_chunks/SettingsPage-BYC3ism8.mjs.map +1 -0
  11. package/dist/_chunks/{index-D7YMYvKK.js → SettingsPage-oDEVs3XV.js} +61 -41
  12. package/dist/_chunks/SettingsPage-oDEVs3XV.js.map +1 -0
  13. package/dist/_chunks/{index-BHcSb0I3.js → index-B7NW5XiM.js} +1065 -1677
  14. package/dist/_chunks/index-B7NW5XiM.js.map +1 -0
  15. package/dist/_chunks/{index-BjvAmZvH.mjs → index-Clesg6BA.mjs} +1108 -1719
  16. package/dist/_chunks/index-Clesg6BA.mjs.map +1 -0
  17. package/dist/admin/index.js +2 -2
  18. package/dist/admin/index.mjs +2 -2
  19. package/dist/admin/src/components/AssetCard/AssetCard.d.ts +18 -0
  20. package/dist/admin/src/components/AssetCard/AssetCardBase.d.ts +14 -0
  21. package/dist/admin/src/components/AssetCard/AudioAssetCard.d.ts +7 -0
  22. package/dist/admin/src/components/AssetCard/AudioPreview.d.ts +6 -0
  23. package/dist/admin/src/components/AssetCard/DocAssetCard.d.ts +7 -0
  24. package/dist/admin/src/components/AssetCard/ImageAssetCard.d.ts +12 -0
  25. package/dist/admin/src/components/AssetCard/UploadingAssetCard.d.ts +17 -0
  26. package/dist/admin/src/components/AssetCard/VideoAssetCard.d.ts +8 -0
  27. package/dist/admin/src/components/AssetCard/VideoPreview.d.ts +9 -0
  28. package/dist/admin/src/components/AssetDialog/AssetDialog.d.ts +39 -0
  29. package/dist/admin/src/components/AssetDialog/BrowseStep/BrowseStep.d.ts +63 -0
  30. package/dist/admin/src/components/AssetDialog/BrowseStep/Filters.d.ts +23 -0
  31. package/dist/admin/src/components/AssetDialog/BrowseStep/PageSize.d.ts +6 -0
  32. package/dist/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.d.ts +13 -0
  33. package/dist/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.d.ts +9 -0
  34. package/dist/admin/src/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.d.ts +7 -0
  35. package/dist/admin/src/components/AssetDialog/BrowseStep/utils/isSelectable.d.ts +1 -0
  36. package/dist/admin/src/components/AssetDialog/DialogFooter.d.ts +6 -0
  37. package/dist/admin/src/components/AssetDialog/SelectedStep/SelectedStep.d.ts +8 -0
  38. package/dist/admin/src/components/AssetGridList/AssetGridList.d.ts +13 -0
  39. package/dist/admin/src/components/AssetGridList/Draggable.d.ts +9 -0
  40. package/dist/admin/src/components/Breadcrumbs/Breadcrumbs.d.ts +14 -0
  41. package/dist/admin/src/components/Breadcrumbs/CrumbSimpleMenuAsync.d.ts +7 -0
  42. package/dist/admin/src/components/BulkMoveDialog/BulkMoveDialog.d.ts +15 -0
  43. package/dist/admin/src/components/ContextInfo/ContextInfo.d.ts +8 -0
  44. package/dist/admin/src/components/CopyLinkButton/CopyLinkButton.d.ts +3 -0
  45. package/dist/admin/src/components/EditAssetDialog/DialogHeader.d.ts +1 -0
  46. package/dist/admin/src/components/EditAssetDialog/EditAssetContent.d.ts +28 -0
  47. package/dist/admin/src/components/EditAssetDialog/PreviewBox/AssetPreview.d.ts +9 -0
  48. package/dist/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.d.ts +7 -0
  49. package/dist/admin/src/components/EditAssetDialog/PreviewBox/PreviewBox.d.ts +23 -0
  50. package/dist/admin/src/components/EditAssetDialog/PreviewBox/PreviewComponents.d.ts +17 -0
  51. package/dist/admin/src/components/EditAssetDialog/RemoveAssetDialog.d.ts +8 -0
  52. package/dist/admin/src/components/EditAssetDialog/ReplaceMediaButton.d.ts +8 -0
  53. package/dist/admin/src/components/EditFolderDialog/EditFolderDialog.d.ts +12 -0
  54. package/dist/admin/src/components/EditFolderDialog/ModalHeader/ModalHeader.d.ts +5 -0
  55. package/dist/admin/src/components/EditFolderDialog/RemoveFolderDialog.d.ts +7 -0
  56. package/dist/admin/src/components/EmptyAssets/EmptyAssetGrid.d.ts +6 -0
  57. package/dist/admin/src/components/EmptyAssets/EmptyAssets.d.ts +10 -0
  58. package/dist/admin/src/components/FilterList/FilterList.d.ts +33 -0
  59. package/dist/admin/src/components/FilterList/FilterTag.d.ts +23 -0
  60. package/dist/admin/src/components/FilterPopover/FilterPopover.d.ts +31 -0
  61. package/dist/admin/src/components/FilterPopover/FilterValueInput.d.ts +12 -0
  62. package/dist/admin/src/components/FilterPopover/utils/getFilterList.d.ts +21 -0
  63. package/dist/admin/src/components/FolderCard/FolderCard/FolderCard.d.ts +13 -0
  64. package/dist/admin/src/components/FolderCard/FolderCardBody/FolderCardBody.d.ts +2 -0
  65. package/dist/admin/src/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.d.ts +7 -0
  66. package/dist/admin/src/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.d.ts +2 -0
  67. package/dist/admin/src/components/FolderCard/contexts/FolderCard.d.ts +7 -0
  68. package/dist/admin/src/components/FolderGridList/FolderGridList.d.ts +6 -0
  69. package/dist/admin/src/components/MediaLibraryDialog/MediaLibraryDialog.d.ts +8 -0
  70. package/dist/admin/src/components/MediaLibraryInput/Carousel/CarouselAsset.d.ts +4 -0
  71. package/dist/admin/src/components/MediaLibraryInput/Carousel/CarouselAssetActions.d.ts +9 -0
  72. package/dist/admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.d.ts +22 -0
  73. package/dist/admin/src/components/MediaLibraryInput/Carousel/EmptyStateAsset.d.ts +10 -0
  74. package/dist/admin/src/components/MediaLibraryInput/MediaLibraryInput.d.ts +17 -0
  75. package/dist/admin/src/components/SelectTree/Option.d.ts +16 -0
  76. package/dist/admin/src/components/SelectTree/SelectTree.d.ts +22 -0
  77. package/dist/admin/src/components/SelectTree/utils/flattenTree.d.ts +1 -1
  78. package/dist/admin/src/components/SelectTree/utils/getOpenValues.d.ts +9 -0
  79. package/dist/admin/src/components/SelectTree/utils/getValuesToClose.d.ts +6 -0
  80. package/dist/admin/src/components/SortPicker/SortPicker.d.ts +7 -0
  81. package/dist/admin/src/components/TableList/CellContent.d.ts +8 -0
  82. package/dist/admin/src/components/TableList/PreviewCell.d.ts +7 -0
  83. package/dist/admin/src/components/TableList/TableList.d.ts +31 -0
  84. package/dist/admin/src/components/TableList/TableRows.d.ts +22 -0
  85. package/dist/admin/src/components/UploadAssetDialog/AddAssetStep/AddAssetStep.d.ts +13 -0
  86. package/dist/admin/src/components/UploadAssetDialog/AddAssetStep/FromComputerForm.d.ts +8 -0
  87. package/dist/admin/src/components/UploadAssetDialog/AddAssetStep/FromUrlForm.d.ts +8 -0
  88. package/dist/admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.d.ts +22 -0
  89. package/dist/admin/src/components/UploadAssetDialog/UploadAssetDialog.d.ts +21 -0
  90. package/dist/admin/src/components/UploadProgress/UploadProgress.d.ts +7 -0
  91. package/dist/admin/src/{newConstants.d.ts → constants.d.ts} +25 -0
  92. package/dist/admin/src/hooks/useBulkMove.d.ts +5 -5
  93. package/dist/admin/src/hooks/useBulkRemove.d.ts +17 -20
  94. package/dist/admin/src/hooks/useFolder.d.ts +1 -1
  95. package/dist/admin/src/hooks/useFolderStructure.d.ts +7 -1
  96. package/dist/admin/src/hooks/useMediaLibraryPermissions.d.ts +5 -1
  97. package/dist/admin/src/hooks/useModalQueryParams.d.ts +2 -3
  98. package/dist/admin/src/hooks/useSelectionState.d.ts +1 -1
  99. package/dist/admin/src/hooks/useUpload.d.ts +6 -3
  100. package/dist/admin/src/index.d.ts +3 -0
  101. package/dist/admin/src/pages/App/App.d.ts +1 -0
  102. package/dist/admin/src/pages/App/ConfigureTheView/ConfigureTheView.d.ts +6 -0
  103. package/dist/admin/src/pages/App/ConfigureTheView/components/Settings.d.ts +13 -0
  104. package/dist/admin/src/pages/App/ConfigureTheView/state/actionTypes.d.ts +2 -0
  105. package/dist/admin/src/pages/App/ConfigureTheView/state/actions.d.ts +12 -0
  106. package/dist/admin/src/pages/App/ConfigureTheView/state/init.d.ts +8 -0
  107. package/dist/admin/src/pages/App/ConfigureTheView/state/reducer.d.ts +15 -0
  108. package/dist/admin/src/pages/App/MediaLibrary/MediaLibrary.d.ts +1 -0
  109. package/dist/admin/src/pages/App/MediaLibrary/components/BulkActions.d.ts +15 -0
  110. package/dist/admin/src/pages/App/MediaLibrary/components/BulkDeleteButton.d.ts +7 -0
  111. package/dist/admin/src/pages/App/MediaLibrary/components/BulkMoveButton.d.ts +15 -0
  112. package/dist/admin/src/pages/App/MediaLibrary/components/EmptyOrNoPermissions.d.ts +7 -0
  113. package/dist/admin/src/pages/App/MediaLibrary/components/Filters.d.ts +1 -0
  114. package/dist/admin/src/pages/App/MediaLibrary/components/Header.d.ts +22 -0
  115. package/dist/admin/src/pages/App/components/BulkActions.d.ts +15 -0
  116. package/dist/admin/src/pages/App/components/BulkDeleteButton.d.ts +10 -0
  117. package/dist/admin/src/pages/App/components/BulkMoveButton.d.ts +15 -0
  118. package/dist/admin/src/pages/App/components/EmptyOrNoPermissions.d.ts +8 -0
  119. package/dist/admin/src/pages/App/components/Filters.d.ts +1 -0
  120. package/dist/admin/src/pages/App/components/Header.d.ts +13 -0
  121. package/dist/admin/src/pages/SettingsPage/SettingsPage.d.ts +2 -0
  122. package/dist/admin/src/pages/SettingsPage/init.d.ts +2 -0
  123. package/dist/admin/src/pages/SettingsPage/reducer.d.ts +27 -0
  124. package/dist/admin/src/pluginId.d.ts +0 -1
  125. package/dist/admin/src/utils/findRecursiveFolderByValue.d.ts +3 -2
  126. package/dist/admin/src/utils/getAllowedFiles.d.ts +1 -2
  127. package/dist/admin/src/utils/getBreadcrumbDataCM.d.ts +1 -1
  128. package/dist/admin/src/utils/getBreadcrumbDataML.d.ts +1 -1
  129. package/dist/admin/src/utils/getFolderParents.d.ts +4 -3
  130. package/dist/admin/src/utils/moveElement.d.ts +1 -1
  131. package/dist/admin/src/utils/rawFileToAsset.d.ts +2 -2
  132. package/dist/admin/src/utils/toSingularTypes.d.ts +0 -1
  133. package/dist/admin/src/utils/typeFromMime.d.ts +1 -1
  134. package/dist/admin/src/utils/urlsToAssets.d.ts +3 -3
  135. package/dist/shared/contracts/files.d.ts +10 -6
  136. package/dist/shared/contracts/folders.d.ts +23 -2
  137. package/dist/shared/contracts/settings.d.ts +3 -2
  138. package/package.json +10 -10
  139. package/dist/_chunks/index-BHcSb0I3.js.map +0 -1
  140. package/dist/_chunks/index-Bi33Km2i.mjs.map +0 -1
  141. package/dist/_chunks/index-BjvAmZvH.mjs.map +0 -1
  142. package/dist/_chunks/index-D7YMYvKK.js.map +0 -1
  143. package/dist/_chunks/index-DlRn6eNH.js.map +0 -1
  144. package/dist/_chunks/index-GpFGwMho.mjs.map +0 -1
  145. package/dist/_chunks/index-KSVkjErL.mjs.map +0 -1
  146. package/dist/_chunks/index-l4hbqJYu.js.map +0 -1
  147. /package/dist/admin/src/hooks/utils/{rename-keys.d.ts → renameKeys.d.ts} +0 -0
@@ -1,23 +1,21 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
- import { useState, useRef, lazy, useEffect, Suspense } from "react";
4
3
  import { ConfirmDialog, useNotification, useFetchClient, useTracking, useQueryParams, Layouts, Page, SearchInput, Pagination } from "@strapi/admin/strapi-admin";
5
4
  import { useIntl } from "react-intl";
6
5
  import { useLocation, NavLink, useNavigate, Link as Link$1, Routes, Route } from "react-router-dom";
7
- import { g as getTrad, a as getFolderURL, u as useFolderCard, A as AssetDefinition, F as FolderDefinition, b as useBulkRemove, p as pluginId, c as useFolderStructure, S as SelectTree, n as normalizeAPIError, E as EmptyAssets, d as FilterPopover, e as displayedFilters, f as FilterList, B as BreadcrumbsDefinition, h as Breadcrumbs, i as useMediaLibraryPermissions, j as usePersistentState, v as viewOptions, l as localStorageKeys, k as useAssets, m as useFolders, o as containsAssetFilter, q as useFolder, r as useSelectionState, s as SortPicker, T as TableList, t as FolderGridList, w as FolderCard, x as FolderCardBody, y as FolderCardBodyAction, z as AssetGridList, U as UploadAssetDialog, C as EditFolderDialog, D as EditAssetDialog, G as useConfig } from "./index-BjvAmZvH.mjs";
6
+ import { g as getTrad, a as getFolderURL, u as useFolderCard, b as useBulkRemove, p as pluginId, c as useFolderStructure, S as SelectTree, n as normalizeAPIError, E as EmptyAssets, F as FilterPopover, d as displayedFilters, e as FilterList, B as Breadcrumbs, f as useMediaLibraryPermissions, h as usePersistentState, v as viewOptions, l as localStorageKeys, i as useAssets, j as useFolders, k as containsAssetFilter, m as useFolder, o as useSelectionState, q as SortPicker, T as TableList, r as FolderGridList, s as FolderCard, t as FolderCardBody, w as FolderCardBodyAction, A as AssetGridList, U as UploadAssetDialog, x as EditFolderDialog, y as EditAssetDialog, z as useConfig } from "./index-Clesg6BA.mjs";
8
7
  import "byte-size";
9
8
  import "date-fns";
10
9
  import { stringify } from "qs";
11
10
  import { Box, Checkbox, Dialog, Button, Modal, Flex, Loader, Grid, Field, Typography, Popover, Link, IconButton, VisuallyHidden, Divider } from "@strapi/design-system";
12
11
  import { Trash, Folder, Plus, Filter, ArrowLeft, Cog, List, GridFour, Pencil } from "@strapi/icons";
13
12
  import { styled } from "styled-components";
14
- import PropTypes from "prop-types";
15
13
  import { Formik, Form } from "formik";
16
14
  import isEmpty from "lodash/isEmpty";
17
15
  import { useQueryClient, useMutation } from "react-query";
18
16
  import { EmptyPermissions } from "@strapi/icons/symbols";
19
17
  const getBreadcrumbDataML = (folder, { pathname, query }) => {
20
- let data = [
18
+ const data = [
21
19
  {
22
20
  id: null,
23
21
  label: { id: getTrad("plugin.name"), defaultMessage: "Media Library" },
@@ -61,10 +59,6 @@ const BulkDeleteButton = ({ selected, onSuccess }) => {
61
59
  /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleConfirmRemove })
62
60
  ] });
63
61
  };
64
- BulkDeleteButton.propTypes = {
65
- selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition).isRequired,
66
- onSuccess: PropTypes.func.isRequired
67
- };
68
62
  const useBulkMove = () => {
69
63
  const { formatMessage } = useIntl();
70
64
  const { toggleNotification } = useNotification();
@@ -104,7 +98,7 @@ const useBulkMove = () => {
104
98
  const move = (destinationFolderId, filesAndFolders) => mutation.mutateAsync({ destinationFolderId, filesAndFolders });
105
99
  return { ...mutation, move };
106
100
  };
107
- const BulkMoveDialog = ({ onClose, selected, currentFolder }) => {
101
+ const BulkMoveDialog = ({ onClose, selected = [], currentFolder }) => {
108
102
  const { formatMessage } = useIntl();
109
103
  const { data: folderStructure, isLoading } = useFolderStructure();
110
104
  const { move } = useBulkMove();
@@ -113,16 +107,24 @@ const BulkMoveDialog = ({ onClose, selected, currentFolder }) => {
113
107
  }
114
108
  const handleSubmit = async (values, { setErrors }) => {
115
109
  try {
116
- await move(values.destination.value, selected);
117
- onClose();
110
+ if (typeof values.destination !== "string") {
111
+ const destinationValue = values.destination.value;
112
+ await move(destinationValue, selected);
113
+ onClose();
114
+ }
118
115
  } catch (error) {
119
116
  const normalizedError = normalizeAPIError(error);
120
- const formikErrors = normalizedError.errors.reduce((acc, error2) => {
121
- acc[error2.values?.path?.length || "destination"] = error2.defaultMessage;
122
- return acc;
123
- }, {});
124
- if (!isEmpty(formikErrors)) {
125
- setErrors(formikErrors);
117
+ if (normalizedError && "errors" in normalizedError) {
118
+ const formikErrors = normalizedError.errors?.reduce(
119
+ (acc, error2) => {
120
+ acc[error2.values?.path?.length || "destination"] = error2.defaultMessage;
121
+ return acc;
122
+ },
123
+ {}
124
+ );
125
+ if (!isEmpty(formikErrors)) {
126
+ setErrors(formikErrors);
127
+ }
126
128
  }
127
129
  }
128
130
  };
@@ -155,7 +157,7 @@ const BulkMoveDialog = ({ onClose, selected, currentFolder }) => {
155
157
  onChange: (value) => {
156
158
  setFieldValue("destination", value);
157
159
  },
158
- defaultValue: values.destination,
160
+ defaultValue: typeof values.destination !== "string" ? values.destination : void 0,
159
161
  name: "destination",
160
162
  menuPortalTarget: document.querySelector("body"),
161
163
  inputId: "folder-destination",
@@ -171,18 +173,13 @@ const BulkMoveDialog = ({ onClose, selected, currentFolder }) => {
171
173
  ] })
172
174
  ] }) }) });
173
175
  };
174
- BulkMoveDialog.defaultProps = {
175
- currentFolder: void 0,
176
- selected: []
177
- };
178
- BulkMoveDialog.propTypes = {
179
- onClose: PropTypes.func.isRequired,
180
- currentFolder: FolderDefinition,
181
- selected: PropTypes.arrayOf(FolderDefinition, AssetDefinition)
182
- };
183
- const BulkMoveButton = ({ selected, onSuccess, currentFolder }) => {
176
+ const BulkMoveButton = ({
177
+ selected = [],
178
+ onSuccess,
179
+ currentFolder
180
+ }) => {
184
181
  const { formatMessage } = useIntl();
185
- const [showConfirmDialog, setShowConfirmDialog] = useState(false);
182
+ const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);
186
183
  const handleConfirmMove = () => {
187
184
  setShowConfirmDialog(false);
188
185
  onSuccess();
@@ -199,19 +196,10 @@ const BulkMoveButton = ({ selected, onSuccess, currentFolder }) => {
199
196
  )
200
197
  ] });
201
198
  };
202
- BulkMoveButton.defaultProps = {
203
- currentFolder: void 0,
204
- selected: []
205
- };
206
- BulkMoveButton.propTypes = {
207
- onSuccess: PropTypes.func.isRequired,
208
- currentFolder: FolderDefinition,
209
- selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition)
210
- };
211
- const BulkActions = ({ selected, onSuccess, currentFolder }) => {
199
+ const BulkActions = ({ selected = [], onSuccess, currentFolder }) => {
212
200
  const { formatMessage } = useIntl();
213
- const numberAssets = selected.reduce(function(_this, val) {
214
- return val?.type === "folder" ? _this + val.files.count : _this + 1;
201
+ const numberAssets = selected?.reduce(function(_this, val) {
202
+ return val?.type === "folder" && "files" in val && val?.files && "count" in val.files ? _this + val?.files?.count : _this + 1;
215
203
  }, 0);
216
204
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, paddingBottom: 5, children: [
217
205
  /* @__PURE__ */ jsx(Typography, { variant: "epsilon", textColor: "neutral600", children: formatMessage(
@@ -220,24 +208,32 @@ const BulkActions = ({ selected, onSuccess, currentFolder }) => {
220
208
  defaultMessage: "{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}} selected"
221
209
  },
222
210
  {
223
- numberFolders: selected.filter(({ type }) => type === "folder").length,
211
+ numberFolders: selected?.filter(({ type }) => type === "folder").length,
224
212
  numberAssets
225
213
  }
226
214
  ) }),
227
- /* @__PURE__ */ jsx(BulkDeleteButton, { selected, onSuccess }),
228
- /* @__PURE__ */ jsx(BulkMoveButton, { currentFolder, selected, onSuccess })
215
+ /* @__PURE__ */ jsx(
216
+ BulkDeleteButton,
217
+ {
218
+ selected,
219
+ onSuccess
220
+ }
221
+ ),
222
+ /* @__PURE__ */ jsx(
223
+ BulkMoveButton,
224
+ {
225
+ currentFolder,
226
+ selected,
227
+ onSuccess
228
+ }
229
+ )
229
230
  ] });
230
231
  };
231
- BulkActions.defaultProps = {
232
- currentFolder: void 0,
233
- selected: []
234
- };
235
- BulkActions.propTypes = {
236
- onSuccess: PropTypes.func.isRequired,
237
- currentFolder: FolderDefinition,
238
- selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition)
239
- };
240
- const getContentIntlMessage = ({ isFiltering, canCreate, canRead }) => {
232
+ const getContentIntlMessage = ({
233
+ isFiltering,
234
+ canCreate,
235
+ canRead
236
+ }) => {
241
237
  if (isFiltering) {
242
238
  return {
243
239
  id: "list.assets-empty.title-withSearch",
@@ -261,7 +257,12 @@ const getContentIntlMessage = ({ isFiltering, canCreate, canRead }) => {
261
257
  defaultMessage: "No permissions to view"
262
258
  };
263
259
  };
264
- const EmptyOrNoPermissions = ({ canCreate, isFiltering, canRead, onActionClick }) => {
260
+ const EmptyOrNoPermissions = ({
261
+ canCreate,
262
+ isFiltering,
263
+ canRead,
264
+ onActionClick
265
+ }) => {
265
266
  const { formatMessage } = useIntl();
266
267
  const content = getContentIntlMessage({ isFiltering, canCreate, canRead });
267
268
  return /* @__PURE__ */ jsx(
@@ -279,12 +280,6 @@ const EmptyOrNoPermissions = ({ canCreate, isFiltering, canRead, onActionClick }
279
280
  }
280
281
  );
281
282
  };
282
- EmptyOrNoPermissions.propTypes = {
283
- canCreate: PropTypes.bool.isRequired,
284
- canRead: PropTypes.bool.isRequired,
285
- isFiltering: PropTypes.bool.isRequired,
286
- onActionClick: PropTypes.func.isRequired
287
- };
288
283
  const Filters = () => {
289
284
  const [open, setOpen] = React.useState(false);
290
285
  const { formatMessage } = useIntl();
@@ -323,9 +318,9 @@ const Filters = () => {
323
318
  ] });
324
319
  };
325
320
  const Header = ({
326
- breadcrumbs,
321
+ breadcrumbs = null,
327
322
  canCreate,
328
- folder,
323
+ folder = null,
329
324
  onToggleEditFolderDialog,
330
325
  onToggleUploadAssetDialog
331
326
  }) => {
@@ -334,8 +329,8 @@ const Header = ({
334
329
  const [{ query }] = useQueryParams();
335
330
  const backQuery = {
336
331
  ...query,
337
- folder: folder?.parent?.id ?? void 0,
338
- folderPath: folder?.parent?.path ?? void 0
332
+ folder: folder?.parent && typeof folder.parent !== "number" && folder.parent.id ? folder.parent.id : void 0,
333
+ folderPath: folder?.parent && typeof folder.parent !== "number" && folder.parent.path ? folder.parent.path : void 0
339
334
  };
340
335
  return /* @__PURE__ */ jsx(
341
336
  Layouts.Header,
@@ -344,10 +339,9 @@ const Header = ({
344
339
  id: getTrad("plugin.name"),
345
340
  defaultMessage: `Media Library`
346
341
  }),
347
- subtitle: breadcrumbs && folder && /* @__PURE__ */ jsx(
342
+ subtitle: breadcrumbs && typeof breadcrumbs !== "boolean" && folder && /* @__PURE__ */ jsx(
348
343
  Breadcrumbs,
349
344
  {
350
- tag: "nav",
351
345
  label: formatMessage({
352
346
  id: getTrad("header.breadcrumbs.nav.label"),
353
347
  defaultMessage: "Folders navigation"
@@ -381,17 +375,6 @@ const Header = ({
381
375
  }
382
376
  );
383
377
  };
384
- Header.defaultProps = {
385
- breadcrumbs: false,
386
- folder: null
387
- };
388
- Header.propTypes = {
389
- breadcrumbs: PropTypes.oneOfType([BreadcrumbsDefinition, PropTypes.bool]),
390
- canCreate: PropTypes.bool.isRequired,
391
- folder: FolderDefinition,
392
- onToggleEditFolderDialog: PropTypes.func.isRequired,
393
- onToggleUploadAssetDialog: PropTypes.func.isRequired
394
- };
395
378
  const BoxWithHeight = styled(Box)`
396
379
  height: 3.2rem;
397
380
  display: flex;
@@ -418,7 +401,7 @@ const MediaLibrary = () => {
418
401
  canConfigureView,
419
402
  isLoading: permissionsLoading
420
403
  } = useMediaLibraryPermissions();
421
- const currentFolderToEditRef = useRef();
404
+ const currentFolderToEditRef = React.useRef();
422
405
  const { formatMessage } = useIntl();
423
406
  const { pathname } = useLocation();
424
407
  const { trackUsage } = useTracking();
@@ -429,7 +412,7 @@ const MediaLibrary = () => {
429
412
  const {
430
413
  data: assetsData,
431
414
  isLoading: assetsLoading,
432
- errors: assetsError
415
+ error: assetsError
433
416
  } = useAssets({
434
417
  skipWhen: !canRead,
435
418
  query
@@ -437,7 +420,7 @@ const MediaLibrary = () => {
437
420
  const {
438
421
  data: foldersData,
439
422
  isLoading: foldersLoading,
440
- errors: foldersError
423
+ error: foldersError
441
424
  } = useFolders({
442
425
  enabled: canRead && assetsData?.pagination?.page === 1 && !containsAssetFilter(query),
443
426
  query
@@ -449,13 +432,16 @@ const MediaLibrary = () => {
449
432
  } = useFolder(query?.folder, {
450
433
  enabled: canRead && !!query?.folder
451
434
  });
452
- if (currentFolderError?.response?.status === 404) {
435
+ if (currentFolderError?.name === "NotFoundError") {
453
436
  navigate(pathname);
454
437
  }
455
438
  const folders = foldersData?.map((folder) => ({
456
439
  ...folder,
457
440
  type: "folder",
458
- folderURL: getFolderURL(pathname, query, folder.id),
441
+ folderURL: getFolderURL(pathname, query, {
442
+ folder: folder.id.toString(),
443
+ folderPath: folder.path
444
+ }),
459
445
  isSelectable: canUpdate
460
446
  })) ?? [];
461
447
  const folderCount = folders?.length || 0;
@@ -463,11 +449,14 @@ const MediaLibrary = () => {
463
449
  const assetCount = assets?.length ?? 0;
464
450
  const totalAssetCount = assetsData?.pagination?.total;
465
451
  const isLoading = isCurrentFolderLoading || foldersLoading || permissionsLoading || assetsLoading;
466
- const [showUploadAssetDialog, setShowUploadAssetDialog] = useState(false);
467
- const [showEditFolderDialog, setShowEditFolderDialog] = useState(false);
468
- const [assetToEdit, setAssetToEdit] = useState(void 0);
469
- const [folderToEdit, setFolderToEdit] = useState(void 0);
470
- const [selected, { selectOne, selectAll }] = useSelectionState(["type", "id"], []);
452
+ const [showUploadAssetDialog, setShowUploadAssetDialog] = React.useState(false);
453
+ const [showEditFolderDialog, setShowEditFolderDialog] = React.useState(false);
454
+ const [assetToEdit, setAssetToEdit] = React.useState(void 0);
455
+ const [folderToEdit, setFolderToEdit] = React.useState(void 0);
456
+ const [selected, { selectOne, selectAll }] = useSelectionState(
457
+ ["type", "id"],
458
+ []
459
+ );
471
460
  const indeterminateBulkSelect = selected?.length > 0 && selected?.length !== assetCount + folderCount;
472
461
  const toggleUploadAssetDialog = () => setShowUploadAssetDialog((prev) => !prev);
473
462
  const toggleEditFolderDialog = ({ created = false } = {}) => {
@@ -504,7 +493,7 @@ const MediaLibrary = () => {
504
493
  }
505
494
  };
506
495
  const handleAssetDeleted = (numberOfAssets) => {
507
- if (numberOfAssets === assetCount && assetsData.pagination.page === assetsData.pagination.pageCount && assetsData.pagination.page > 1) {
496
+ if (numberOfAssets === assetCount && assetsData?.pagination?.page === assetsData?.pagination?.pageCount && assetsData?.pagination?.page && assetsData.pagination.page > 1) {
508
497
  setQuery({
509
498
  ...query,
510
499
  page: assetsData.pagination.page - 1
@@ -526,7 +515,10 @@ const MediaLibrary = () => {
526
515
  /* @__PURE__ */ jsx(
527
516
  Header,
528
517
  {
529
- breadcrumbs: !isCurrentFolderLoading && getBreadcrumbDataML(currentFolder, { pathname, query }),
518
+ breadcrumbs: !isCurrentFolderLoading ? getBreadcrumbDataML(currentFolder, {
519
+ pathname,
520
+ query
521
+ }) : null,
530
522
  canCreate,
531
523
  onToggleEditFolderDialog: toggleEditFolderDialog,
532
524
  onToggleUploadAssetDialog: toggleUploadAssetDialog,
@@ -630,7 +622,7 @@ const MediaLibrary = () => {
630
622
  folderCount,
631
623
  indeterminate: indeterminateBulkSelect,
632
624
  onChangeSort: handleChangeSort,
633
- onChangeFolder: (folderID, folderPath) => navigate(getFolderURL(pathname, query, { folder: folderID, folderPath })),
625
+ onChangeFolder: (folderID, folderPath) => navigate(getFolderURL(pathname, query, { folder: folderID.toString(), folderPath })),
634
626
  onEditAsset: setAssetToEdit,
635
627
  onEditFolder: handleEditFolder,
636
628
  onSelectOne: selectOne,
@@ -663,7 +655,7 @@ const MediaLibrary = () => {
663
655
  (currentFolder2) => currentFolder2.id === folder.id
664
656
  );
665
657
  const url = getFolderURL(pathname, query, {
666
- folder: folder?.id,
658
+ folder: folder?.id.toString(),
667
659
  folderPath: folder?.path
668
660
  });
669
661
  return /* @__PURE__ */ jsx(
@@ -679,7 +671,7 @@ const MediaLibrary = () => {
679
671
  ariaLabel: folder.name,
680
672
  id: `folder-${folder.id}`,
681
673
  to: url,
682
- startAction: selectOne && folder.isSelectable ? /* @__PURE__ */ jsx(
674
+ startAction: folder.isSelectable ? /* @__PURE__ */ jsx(
683
675
  FolderCardCheckbox,
684
676
  {
685
677
  "data-testid": `folder-checkbox-${folder.id}`,
@@ -690,7 +682,7 @@ const MediaLibrary = () => {
690
682
  cardActions: /* @__PURE__ */ jsx(
691
683
  IconButton,
692
684
  {
693
- "aria-label": formatMessage({
685
+ label: formatMessage({
694
686
  id: getTrad("list.folder.edit"),
695
687
  defaultMessage: "Edit folder"
696
688
  }),
@@ -724,8 +716,8 @@ const MediaLibrary = () => {
724
716
  defaultMessage: "{folderCount, plural, =0 {# folder} one {# folder} other {# folders}}, {filesCount, plural, =0 {# asset} one {# asset} other {# assets}}"
725
717
  },
726
718
  {
727
- folderCount: folder.children.count,
728
- filesCount: folder.files.count
719
+ folderCount: folder.children?.count,
720
+ filesCount: folder.files?.count
729
721
  }
730
722
  )
731
723
  }
@@ -746,7 +738,9 @@ const MediaLibrary = () => {
746
738
  assets,
747
739
  onEditAsset: setAssetToEdit,
748
740
  onSelectAsset: selectOne,
749
- selectedAssets: selected.filter(({ type }) => type === "asset"),
741
+ selectedAssets: selected.filter(
742
+ ({ type }) => type === "asset"
743
+ ),
750
744
  title: (
751
745
  // Assets title should only appear if:
752
746
  // - user is not filtering
@@ -763,7 +757,7 @@ const MediaLibrary = () => {
763
757
  }
764
758
  )
765
759
  ] }),
766
- /* @__PURE__ */ jsxs(Pagination.Root, { ...assetsData.pagination, children: [
760
+ /* @__PURE__ */ jsxs(Pagination.Root, { ...assetsData?.pagination, children: [
767
761
  /* @__PURE__ */ jsx(Pagination.PageSize, {}),
768
762
  /* @__PURE__ */ jsx(Pagination.Links, {})
769
763
  ] })
@@ -782,7 +776,7 @@ const MediaLibrary = () => {
782
776
  EditFolderDialog,
783
777
  {
784
778
  open: showEditFolderDialog,
785
- onClose: handleEditFolderClose,
779
+ onClose: () => handleEditFolderClose(),
786
780
  folder: folderToEdit,
787
781
  parentFolderId: query?.folder,
788
782
  location: "upload"
@@ -807,7 +801,9 @@ const MediaLibrary = () => {
807
801
  )
808
802
  ] });
809
803
  };
810
- const ConfigureTheView = lazy(() => import("./index-KSVkjErL.mjs"));
804
+ const ConfigureTheView = React.lazy(
805
+ async () => import("./ConfigureTheView-B2Syy3q5.mjs").then((mod) => ({ default: mod.ConfigureTheView }))
806
+ );
811
807
  const Upload = () => {
812
808
  const {
813
809
  config: { isLoading, isError, data: config }
@@ -815,11 +811,15 @@ const Upload = () => {
815
811
  const [{ rawQuery }, setQuery] = useQueryParams();
816
812
  const { formatMessage } = useIntl();
817
813
  const title = formatMessage({ id: getTrad("plugin.name"), defaultMessage: "Media Library" });
818
- useEffect(() => {
814
+ React.useEffect(() => {
819
815
  if (isLoading || isError || rawQuery) {
820
816
  return;
821
817
  }
822
- setQuery({ sort: config.sort, page: 1, pageSize: config.pageSize });
818
+ setQuery({
819
+ sort: config.sort,
820
+ page: 1,
821
+ pageSize: config.pageSize
822
+ });
823
823
  }, [isLoading, isError, config, rawQuery, setQuery]);
824
824
  if (isLoading) {
825
825
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -827,12 +827,18 @@ const Upload = () => {
827
827
  /* @__PURE__ */ jsx(Page.Loading, {})
828
828
  ] });
829
829
  }
830
- return /* @__PURE__ */ jsx(Page.Main, { children: rawQuery ? /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(Page.Loading, {}), children: /* @__PURE__ */ jsxs(Routes, { children: [
830
+ return /* @__PURE__ */ jsx(Page.Main, { children: rawQuery ? /* @__PURE__ */ jsx(React.Suspense, { fallback: /* @__PURE__ */ jsx(Page.Loading, {}), children: /* @__PURE__ */ jsxs(Routes, { children: [
831
831
  /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(MediaLibrary, {}) }),
832
- /* @__PURE__ */ jsx(Route, { path: "configuration", element: /* @__PURE__ */ jsx(ConfigureTheView, { config }) })
832
+ /* @__PURE__ */ jsx(
833
+ Route,
834
+ {
835
+ path: "configuration",
836
+ element: /* @__PURE__ */ jsx(ConfigureTheView, { config })
837
+ }
838
+ )
833
839
  ] }) }) : null });
834
840
  };
835
841
  export {
836
- Upload as default
842
+ Upload
837
843
  };
838
- //# sourceMappingURL=index-Bi33Km2i.mjs.map
844
+ //# sourceMappingURL=App-D1ayH-QS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App-D1ayH-QS.mjs","sources":["../../admin/src/utils/getBreadcrumbDataML.ts","../../admin/src/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.tsx","../../admin/src/pages/App/MediaLibrary/components/BulkDeleteButton.tsx","../../admin/src/hooks/useBulkMove.ts","../../admin/src/components/BulkMoveDialog/BulkMoveDialog.tsx","../../admin/src/pages/App/MediaLibrary/components/BulkMoveButton.tsx","../../admin/src/pages/App/MediaLibrary/components/BulkActions.tsx","../../admin/src/pages/App/MediaLibrary/components/EmptyOrNoPermissions.tsx","../../admin/src/pages/App/MediaLibrary/components/Filters.tsx","../../admin/src/pages/App/MediaLibrary/components/Header.tsx","../../admin/src/pages/App/MediaLibrary/MediaLibrary.tsx","../../admin/src/pages/App/App.tsx"],"sourcesContent":["import { getFolderURL } from './getFolderURL';\nimport { getTrad } from './getTrad';\n\nimport type { Query } from '../../../shared/contracts/files';\nimport type { Folder } from '../../../shared/contracts/folders';\nimport type { MessageDescriptor } from 'react-intl';\n\ninterface GetBreadcrumbDataMLProps {\n folder: Folder;\n options: {\n pathname: string;\n query?: Query;\n };\n}\n\ninterface GetBreadcrumbDataMLReturn {\n id: number | null;\n label: string | MessageDescriptor;\n href?: string;\n}\n\ntype BreadcrumbData = GetBreadcrumbDataMLReturn | [];\n\nexport const getBreadcrumbDataML = (\n folder: GetBreadcrumbDataMLProps['folder'] | null,\n { pathname, query }: GetBreadcrumbDataMLProps['options']\n) => {\n const data: BreadcrumbData[] = [\n {\n id: null,\n label: { id: getTrad('plugin.name'), defaultMessage: 'Media Library' },\n href: folder ? getFolderURL(pathname, query || {}) : undefined,\n },\n ];\n\n if (folder?.parent && typeof folder?.parent !== 'number' && folder?.parent?.parent) {\n data.push([]);\n }\n\n if (folder?.parent && typeof folder.parent !== 'number') {\n data.push({\n id: folder.parent.id,\n label: folder.parent.name,\n href: getFolderURL(pathname, query || {}, {\n folder: folder.parent.id?.toString(),\n folderPath: folder.parent.path,\n }),\n });\n }\n\n if (folder) {\n data.push({\n id: folder.id,\n label: folder.name,\n });\n }\n\n return data;\n};\n","import { Checkbox, Box, CheckboxProps } from '@strapi/design-system';\n\nimport { useFolderCard } from '../contexts/FolderCard';\n\nexport const FolderCardCheckbox = (props: CheckboxProps) => {\n const { id } = useFolderCard();\n\n return (\n <Box position=\"relative\" zIndex={2}>\n <Checkbox aria-labelledby={`${id}-title`} {...props} />\n </Box>\n );\n};\n","import { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport { Button, Dialog } from '@strapi/design-system';\nimport { Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useBulkRemove } from '../../../../hooks/useBulkRemove';\n\nimport type { FolderDefinition } from '../../../../../../shared/contracts/folders';\nimport type { FileWithType } from '../../../../hooks/useBulkRemove';\n\nexport interface BulkDeleteButtonProps {\n selected: Array<FileWithType | FolderDefinition>;\n onSuccess: () => void;\n}\n\nexport const BulkDeleteButton = ({ selected, onSuccess }: BulkDeleteButtonProps) => {\n const { formatMessage } = useIntl();\n const { remove } = useBulkRemove();\n\n const handleConfirmRemove = async () => {\n await remove(selected);\n onSuccess();\n };\n\n return (\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"danger-light\" size=\"S\" startIcon={<Trash />}>\n {formatMessage({ id: 'global.delete', defaultMessage: 'Delete' })}\n </Button>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleConfirmRemove} />\n </Dialog.Root>\n );\n};\n","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { File, BulkMoveFiles } from '../../../shared/contracts/files';\nimport { Folder, BulkMoveFolders } from '../../../shared/contracts/folders';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\nexport interface FolderWithType extends Folder {\n type: string;\n}\n\nexport interface FileWithType extends File {\n type: string;\n}\n\ninterface BulkMoveParams {\n destinationFolderId: number | string;\n filesAndFolders: Array<FolderWithType | FileWithType>;\n}\n\n// Define the shape of the accumulator object\ntype Payload = {\n fileIds?: number[];\n folderIds?: number[];\n};\n\nexport const useBulkMove = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const queryClient = useQueryClient();\n const { post } = useFetchClient();\n\n const bulkMoveQuery = ({ destinationFolderId, filesAndFolders }: BulkMoveParams) => {\n const payload = filesAndFolders.reduce<Payload>((acc, selected) => {\n const { id, type } = selected;\n const key = type === 'asset' ? 'fileIds' : 'folderIds';\n\n if (!acc[key]) {\n acc[key] = [];\n }\n\n acc[key]!.push(id);\n\n return acc;\n }, {});\n\n return post('/upload/actions/bulk-move', { ...payload, destinationFolderId });\n };\n\n const mutation = useMutation<\n BulkMoveFolders.Response | BulkMoveFiles.Response,\n BulkMoveFolders.Response['error'] | BulkMoveFiles.Response['error'],\n BulkMoveParams\n >(bulkMoveQuery, {\n onSuccess(res) {\n const {\n data: { data },\n } = res;\n\n if (data?.files?.length > 0) {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n }\n\n // folders need to be re-fetched in any case, because assets might have been\n // moved into a sub-folder and therefore the count needs to be updated\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('modal.move.success-label'),\n defaultMessage: 'Elements have been moved successfully.',\n }),\n });\n },\n });\n\n const move = (\n destinationFolderId: number | string,\n filesAndFolders: Array<FolderWithType | FileWithType>\n ) => mutation.mutateAsync({ destinationFolderId, filesAndFolders });\n\n return { ...mutation, move };\n};\n","import { Button, Flex, Grid, Field, Loader, Modal, Typography } from '@strapi/design-system';\nimport { Form, Formik, FormikErrors } from 'formik';\nimport isEmpty from 'lodash/isEmpty';\nimport { useIntl } from 'react-intl';\n\nimport { File } from '../../../../shared/contracts/files';\nimport { useBulkMove } from '../../hooks/useBulkMove';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getTrad, normalizeAPIError } from '../../utils';\nimport { SelectTree } from '../SelectTree/SelectTree';\n\nimport type { Folder } from '../../../../shared/contracts/folders';\nimport type { OptionSelectTree } from '../SelectTree/SelectTree';\nimport type { FetchError } from '@strapi/admin/strapi-admin';\n\ntype InitialFormData = {\n destination:\n | {\n value: string | number;\n label: string;\n }\n | string;\n};\n\ninterface FolderWithType extends Folder {\n type: string;\n}\n\ninterface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkMoveDialogProps {\n onClose: () => void;\n selected?: Array<FolderWithType | FileWithType>;\n currentFolder?: FolderWithType;\n}\n\nexport const BulkMoveDialog = ({ onClose, selected = [], currentFolder }: BulkMoveDialogProps) => {\n const { formatMessage } = useIntl();\n const { data: folderStructure, isLoading } = useFolderStructure();\n const { move } = useBulkMove();\n\n if (!folderStructure) {\n return null;\n }\n\n const handleSubmit = async (\n values: InitialFormData,\n { setErrors }: { setErrors: (errors: FormikErrors<InitialFormData>) => void }\n ) => {\n try {\n if (typeof values.destination !== 'string') {\n const destinationValue = values.destination.value;\n await move(destinationValue, selected);\n onClose();\n }\n } catch (error) {\n const normalizedError = normalizeAPIError(error as FetchError)!;\n\n if (normalizedError && 'errors' in normalizedError) {\n const formikErrors = normalizedError.errors?.reduce<Record<string, string>>(\n (acc, error) => {\n acc[error.values?.path?.length || 'destination'] = error.defaultMessage;\n\n return acc;\n },\n {}\n );\n\n if (!isEmpty(formikErrors)) {\n setErrors(formikErrors);\n }\n }\n }\n };\n\n if (isLoading) {\n return (\n <Modal.Content>\n <Modal.Body>\n <Flex justifyContent=\"center\" paddingTop={4} paddingBottom={4}>\n <Loader>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </Flex>\n </Modal.Body>\n </Modal.Content>\n );\n }\n\n const initialFormData: InitialFormData = {\n destination: {\n value: currentFolder?.id || '',\n label: currentFolder?.name || folderStructure[0].label,\n },\n };\n\n return (\n <Modal.Content>\n <Formik validateOnChange={false} onSubmit={handleSubmit} initialValues={initialFormData}>\n {({ values, errors, setFieldValue }) => (\n <Form noValidate>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('modal.folder.move.title'),\n defaultMessage: 'Move elements to',\n })}\n </Modal.Title>\n </Modal.Header>\n\n <Modal.Body>\n <Grid.Root gap={4}>\n <Grid.Item xs={12} col={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root id=\"folder-destination\">\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.folder-location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n\n <SelectTree\n options={folderStructure as OptionSelectTree[]}\n onChange={(value: Record<string, string | number>) => {\n setFieldValue('destination', value);\n }}\n defaultValue={\n typeof values.destination !== 'string' ? values.destination : undefined\n }\n name=\"destination\"\n menuPortalTarget={document.querySelector('body')}\n inputId=\"folder-destination\"\n error={errors?.destination}\n ariaErrorMessage=\"destination-error\"\n />\n\n {errors.destination && (\n <Typography variant=\"pi\" tag=\"p\" textColor=\"danger600\">\n {errors.destination}\n </Typography>\n )}\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Modal.Body>\n\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" name=\"cancel\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Modal.Close>\n <Button type=\"submit\" loading={isLoading}>\n {formatMessage({ id: 'modal.folder.move.submit', defaultMessage: 'Move' })}\n </Button>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n </Modal.Content>\n );\n};\n","import * as React from 'react';\n\nimport { Button, Modal } from '@strapi/design-system';\nimport { Folder } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { BulkMoveDialog } from '../../../../components/BulkMoveDialog/BulkMoveDialog';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder as FolderDefinition } from '../../../../../../shared/contracts/folders';\n\ninterface FolderWithType extends FolderDefinition {\n type: string;\n}\n\ninterface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkMoveButtonProps {\n onSuccess: () => void;\n currentFolder?: FolderWithType;\n selected?: Array<FolderWithType | FileWithType>;\n}\n\nexport const BulkMoveButton = ({\n selected = [],\n onSuccess,\n currentFolder,\n}: BulkMoveButtonProps) => {\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n\n const handleConfirmMove = () => {\n setShowConfirmDialog(false);\n onSuccess();\n };\n\n return (\n <Modal.Root open={showConfirmDialog} onOpenChange={setShowConfirmDialog}>\n <Modal.Trigger>\n <Button variant=\"secondary\" size=\"S\" startIcon={<Folder />}>\n {formatMessage({ id: 'global.move', defaultMessage: 'Move' })}\n </Button>\n </Modal.Trigger>\n <BulkMoveDialog\n currentFolder={currentFolder}\n onClose={handleConfirmMove}\n selected={selected}\n />\n </Modal.Root>\n );\n};\n","import { Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../../utils';\n\nimport { BulkDeleteButton } from './BulkDeleteButton';\nimport { BulkMoveButton } from './BulkMoveButton';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type {\n FolderDefinition,\n Folder as FolderInitial,\n} from '../../../../../../shared/contracts/folders';\n\ninterface FolderWithType extends FolderInitial {\n type: string;\n}\n\nexport interface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkActionsProps {\n selected: Array<FileWithType | FolderDefinition> | Array<FolderWithType | FileWithType>;\n onSuccess: () => void;\n currentFolder?: FolderWithType;\n}\n\nexport const BulkActions = ({ selected = [], onSuccess, currentFolder }: BulkActionsProps) => {\n const { formatMessage } = useIntl();\n const numberAssets = selected?.reduce(function (_this, val) {\n return val?.type === 'folder' && 'files' in val && val?.files && 'count' in val.files\n ? _this + val?.files?.count\n : _this + 1;\n }, 0);\n\n return (\n <Flex gap={2} paddingBottom={5}>\n <Typography variant=\"epsilon\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: getTrad('list.assets.selected'),\n defaultMessage:\n '{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}} selected',\n },\n {\n numberFolders: selected?.filter(({ type }) => type === 'folder').length,\n numberAssets,\n }\n )}\n </Typography>\n\n <BulkDeleteButton\n selected={selected as Array<FileWithType | FolderDefinition>}\n onSuccess={onSuccess}\n />\n <BulkMoveButton\n currentFolder={currentFolder}\n selected={selected as Array<FolderWithType | FileWithType>}\n onSuccess={onSuccess}\n />\n </Flex>\n );\n};\n","import { Button } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyPermissions } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { EmptyAssets } from '../../../../components/EmptyAssets/EmptyAssets';\nimport { getTrad } from '../../../../utils';\n\nexport interface EmptyOrNoPermissionsProps {\n canCreate: boolean;\n canRead: boolean;\n isFiltering: boolean;\n onActionClick: () => void;\n}\n\nconst getContentIntlMessage = ({\n isFiltering,\n canCreate,\n canRead,\n}: Omit<EmptyOrNoPermissionsProps, 'onActionClick'>) => {\n if (isFiltering) {\n return {\n id: 'list.assets-empty.title-withSearch',\n defaultMessage: 'There are no elements with the applied filters',\n };\n }\n\n if (canRead) {\n if (canCreate) {\n return {\n id: 'list.assets.empty-upload',\n defaultMessage: 'Upload your first assets...',\n };\n }\n\n return {\n id: 'list.assets.empty',\n defaultMessage: 'Media Library is empty',\n };\n }\n\n return {\n id: 'header.actions.no-permissions',\n defaultMessage: 'No permissions to view',\n };\n};\n\nexport const EmptyOrNoPermissions = ({\n canCreate,\n isFiltering,\n canRead,\n onActionClick,\n}: EmptyOrNoPermissionsProps) => {\n const { formatMessage } = useIntl();\n const content = getContentIntlMessage({ isFiltering, canCreate, canRead });\n\n return (\n <EmptyAssets\n icon={!canRead ? EmptyPermissions : undefined}\n action={\n canCreate &&\n !isFiltering && (\n <Button variant=\"secondary\" startIcon={<Plus />} onClick={onActionClick}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n )\n }\n content={formatMessage({\n ...content,\n id: getTrad(content.id),\n })}\n />\n );\n};\n","import * as React from 'react';\n\nimport { useTracking, useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Button, Popover } from '@strapi/design-system';\nimport { Filter } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { FilterList } from '../../../../components/FilterList/FilterList';\nimport { FilterPopover } from '../../../../components/FilterPopover/FilterPopover';\nimport { displayedFilters } from '../../../../utils';\n\nimport type { Query } from '../../../../../../shared/contracts/files';\nimport type { FilterListProps } from '../../../../components/FilterList/FilterList';\nimport type { FilterPopoverProps } from '../../../../components/FilterPopover/FilterPopover';\n\nexport const Filters = () => {\n const [open, setOpen] = React.useState(false);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams<Query>();\n const filters = query?.filters?.$and || [];\n\n const handleRemoveFilter: FilterListProps['onRemoveFilter'] = (nextFilters) => {\n setQuery({ filters: { $and: nextFilters }, page: 1 } as Query);\n };\n\n const handleSubmit: FilterPopoverProps['onSubmit'] = (filters) => {\n trackUsage('didFilterMediaLibraryElements', {\n location: 'content-manager',\n filter: Object.keys(filters[filters.length - 1])[0],\n });\n setQuery({ filters: { $and: filters }, page: 1 } as Query);\n };\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger>\n <Button variant=\"tertiary\" startIcon={<Filter />} size=\"S\">\n {formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n <FilterPopover\n displayedFilters={displayedFilters}\n filters={filters}\n onSubmit={handleSubmit}\n onToggle={setOpen as FilterPopoverProps['onToggle']}\n />\n <FilterList\n appliedFilters={filters as FilterListProps['appliedFilters']}\n filtersSchema={displayedFilters}\n onRemoveFilter={handleRemoveFilter}\n />\n </Popover.Root>\n );\n};\n","import { useQueryParams, Layouts } from '@strapi/admin/strapi-admin';\nimport { Button, Flex, Link } from '@strapi/design-system';\nimport { ArrowLeft, Plus } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useLocation, NavLink } from 'react-router-dom';\n\nimport { Breadcrumbs } from '../../../../components/Breadcrumbs/Breadcrumbs';\nimport { getTrad } from '../../../../utils';\n\nimport type { Folder } from '../../../../../../shared/contracts/folders';\nimport type { CrumbDefinition } from '../../../../components/Breadcrumbs/Breadcrumbs';\n\ninterface FolderDefinition extends Omit<Folder, 'children' | 'files' | 'parent'> {\n children: {\n count: number;\n };\n files: {\n count: number;\n };\n parent?: FolderDefinition;\n}\n\nexport interface HeaderProps {\n breadcrumbs?: Array<CrumbDefinition> | null;\n canCreate: boolean;\n folder?: FolderDefinition | null;\n onToggleEditFolderDialog: ({ created }?: { created?: boolean }) => void;\n onToggleUploadAssetDialog: () => void;\n}\n\nexport const Header = ({\n breadcrumbs = null,\n canCreate,\n folder = null,\n onToggleEditFolderDialog,\n onToggleUploadAssetDialog,\n}: HeaderProps) => {\n const { formatMessage } = useIntl();\n const { pathname } = useLocation();\n const [{ query }] = useQueryParams();\n const backQuery = {\n ...query,\n folder:\n folder?.parent && typeof folder.parent !== 'number' && folder.parent.id\n ? folder.parent.id\n : undefined,\n folderPath:\n folder?.parent && typeof folder.parent !== 'number' && folder.parent.path\n ? folder.parent.path\n : undefined,\n };\n\n return (\n <Layouts.Header\n title={formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: `Media Library`,\n })}\n subtitle={\n breadcrumbs &&\n typeof breadcrumbs !== 'boolean' &&\n folder && (\n <Breadcrumbs\n label={formatMessage({\n id: getTrad('header.breadcrumbs.nav.label'),\n defaultMessage: 'Folders navigation',\n })}\n breadcrumbs={breadcrumbs}\n currentFolderId={folder?.id}\n />\n )\n }\n navigationAction={\n folder && (\n <Link\n tag={NavLink}\n startIcon={<ArrowLeft />}\n to={`${pathname}?${stringify(backQuery, { encode: false })}`}\n >\n {formatMessage({\n id: getTrad('header.actions.folder-level-up'),\n defaultMessage: 'Back',\n })}\n </Link>\n )\n }\n primaryAction={\n canCreate && (\n <Flex gap={2}>\n <Button startIcon={<Plus />} variant=\"secondary\" onClick={onToggleEditFolderDialog}>\n {formatMessage({\n id: getTrad('header.actions.add-folder'),\n defaultMessage: 'Add new folder',\n })}\n </Button>\n\n <Button startIcon={<Plus />} onClick={onToggleUploadAssetDialog}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n </Flex>\n )\n }\n />\n );\n};\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport {\n Page,\n SearchInput,\n Pagination,\n useTracking,\n useQueryParams,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport {\n Checkbox,\n Box,\n Divider,\n Flex,\n IconButton,\n Typography,\n VisuallyHidden,\n Grid,\n} from '@strapi/design-system';\nimport { Cog, GridFour as GridIcon, List, Pencil } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link as ReactRouterLink, useNavigate, useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { AssetGridList } from '../../../components/AssetGridList/AssetGridList';\nimport { EditAssetDialog } from '../../../components/EditAssetDialog/EditAssetContent';\nimport { EditFolderDialog } from '../../../components/EditFolderDialog/EditFolderDialog';\nimport { FolderCard } from '../../../components/FolderCard/FolderCard/FolderCard';\nimport { FolderCardBody } from '../../../components/FolderCard/FolderCardBody/FolderCardBody';\nimport { FolderCardBodyAction } from '../../../components/FolderCard/FolderCardBodyAction/FolderCardBodyAction';\nimport { FolderCardCheckbox } from '../../../components/FolderCard/FolderCardCheckbox/FolderCardCheckbox';\nimport { FolderGridList } from '../../../components/FolderGridList/FolderGridList';\nimport { SortPicker } from '../../../components/SortPicker/SortPicker';\nimport { TableList } from '../../../components/TableList/TableList';\nimport { UploadAssetDialog } from '../../../components/UploadAssetDialog/UploadAssetDialog';\nimport { localStorageKeys, viewOptions } from '../../../constants';\nimport { useAssets } from '../../../hooks/useAssets';\nimport { useFolder } from '../../../hooks/useFolder';\nimport { useFolders } from '../../../hooks/useFolders';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { usePersistentState } from '../../../hooks/usePersistentState';\nimport { useSelectionState } from '../../../hooks/useSelectionState';\nimport { containsAssetFilter, getBreadcrumbDataML, getFolderURL, getTrad } from '../../../utils';\n\nimport { BulkActions } from './components/BulkActions';\nimport { EmptyOrNoPermissions } from './components/EmptyOrNoPermissions';\nimport { Filters } from './components/Filters';\nimport { Header } from './components/Header';\n\nimport type { BulkActionsProps } from './components/BulkActions';\nimport type { HeaderProps } from './components/Header';\nimport type { Query } from '../../../../../shared/contracts/files';\nimport type { FolderDefinition } from '../../../../../shared/contracts/folders';\nimport type { AssetGridListProps } from '../../../components/AssetGridList/AssetGridList';\nimport type { Asset } from '../../../components/EditAssetDialog/EditAssetContent';\nimport type { FolderRow, FileRow, TableListProps } from '../../../components/TableList/TableList';\n\nconst BoxWithHeight = styled(Box)`\n height: 3.2rem;\n display: flex;\n align-items: center;\n`;\n\nconst TypographyMaxWidth = styled(Typography)`\n max-width: 100%;\n`;\n\nconst ActionContainer = styled(Box)`\n svg {\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\nexport const MediaLibrary = () => {\n const navigate = useNavigate();\n const {\n canRead,\n canCreate,\n canUpdate,\n canCopyLink,\n canDownload,\n canConfigureView,\n isLoading: permissionsLoading,\n } = useMediaLibraryPermissions();\n const currentFolderToEditRef = React.useRef<HTMLDivElement>();\n const { formatMessage } = useIntl();\n const { pathname } = useLocation();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams<Query>();\n const isFiltering = Boolean(query._q || query.filters);\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n const {\n data: assetsData,\n isLoading: assetsLoading,\n error: assetsError,\n } = useAssets({\n skipWhen: !canRead,\n query,\n });\n\n const {\n data: foldersData,\n isLoading: foldersLoading,\n error: foldersError,\n } = useFolders({\n enabled: canRead && assetsData?.pagination?.page === 1 && !containsAssetFilter(query),\n query,\n });\n\n const {\n data: currentFolder,\n isLoading: isCurrentFolderLoading,\n error: currentFolderError,\n } = useFolder(query?.folder as number | null | undefined, {\n enabled: canRead && !!query?.folder,\n });\n\n // Folder was not found: redirect to the media library root\n if (currentFolderError?.name === 'NotFoundError') {\n navigate(pathname);\n }\n\n const folders =\n foldersData?.map((folder) => ({\n ...folder,\n type: 'folder',\n folderURL: getFolderURL(pathname, query, {\n folder: folder.id.toString(),\n folderPath: folder.path,\n }),\n isSelectable: canUpdate,\n })) ?? [];\n const folderCount = folders?.length || 0;\n const assets =\n assetsData?.results?.map((asset) => ({ ...asset, type: 'asset', isSelectable: canUpdate })) ||\n [];\n const assetCount = assets?.length ?? 0;\n const totalAssetCount = assetsData?.pagination?.total;\n\n const isLoading = isCurrentFolderLoading || foldersLoading || permissionsLoading || assetsLoading;\n const [showUploadAssetDialog, setShowUploadAssetDialog] = React.useState(false);\n const [showEditFolderDialog, setShowEditFolderDialog] = React.useState(false);\n const [assetToEdit, setAssetToEdit] = React.useState<Asset | undefined>(undefined);\n const [folderToEdit, setFolderToEdit] = React.useState<FolderRow | undefined | null>(undefined);\n const [selected, { selectOne, selectAll }] = useSelectionState<FolderRow | FileRow>(\n ['type', 'id'],\n []\n );\n const indeterminateBulkSelect =\n selected?.length > 0 && selected?.length !== assetCount + folderCount;\n const toggleUploadAssetDialog = () => setShowUploadAssetDialog((prev) => !prev);\n const toggleEditFolderDialog = ({ created = false } = {}) => {\n // folders are only displayed on the first page, therefore\n // we have to navigate the user to that page, in case a folder\n // was created successfully in order for them to see it\n if (created && query?.page !== '1') {\n setQuery({\n ...query,\n page: 1,\n });\n }\n\n setShowEditFolderDialog((prev) => !prev);\n };\n\n const handleBulkSelect = (\n checked: boolean | 'indeterminate',\n elements?: FolderRow[] | FileRow[]\n ) => {\n if (checked) {\n trackUsage('didSelectAllMediaLibraryElements');\n }\n\n selectAll(elements as (FolderRow | FileRow)[]);\n };\n\n const handleChangeSort = (value: Query['sort'] | string) => {\n trackUsage('didSortMediaLibraryElements', {\n location: 'upload',\n sort: value,\n });\n setQuery({ sort: value as Query['sort'] });\n };\n\n const handleEditFolder = (folder: FolderRow) => {\n setFolderToEdit(folder);\n setShowEditFolderDialog(true);\n };\n\n const handleEditFolderClose = (payload?: { created?: boolean | undefined }) => {\n setFolderToEdit(null);\n toggleEditFolderDialog(payload);\n\n if (currentFolderToEditRef.current) {\n currentFolderToEditRef.current.focus();\n }\n };\n\n const handleAssetDeleted = (numberOfAssets: number) => {\n if (\n numberOfAssets === assetCount &&\n assetsData?.pagination?.page === assetsData?.pagination?.pageCount &&\n assetsData?.pagination?.page &&\n assetsData.pagination.page > 1\n ) {\n setQuery({\n ...query,\n page: assetsData.pagination.page - 1,\n });\n }\n };\n\n const handleBulkActionSuccess = () => {\n selectAll();\n\n handleAssetDeleted(selected.length);\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (assetsError || foldersError) {\n return <Page.Error />;\n }\n\n return (\n <Layouts.Root>\n <Page.Main>\n <Header\n breadcrumbs={\n !isCurrentFolderLoading\n ? (getBreadcrumbDataML(currentFolder!, {\n pathname,\n query,\n }) as HeaderProps['breadcrumbs'])\n : null\n }\n canCreate={canCreate}\n onToggleEditFolderDialog={toggleEditFolderDialog}\n onToggleUploadAssetDialog={toggleUploadAssetDialog}\n folder={currentFolder as HeaderProps['folder']}\n />\n <Layouts.Action\n startActions={\n <>\n {canUpdate && isGridView && (assetCount > 0 || folderCount > 0) && (\n <BoxWithHeight\n paddingLeft={2}\n paddingRight={2}\n background=\"neutral0\"\n hasRadius\n borderColor=\"neutral200\"\n >\n <Checkbox\n aria-label={formatMessage({\n id: getTrad('bulk.select.label'),\n defaultMessage: 'Select all folders & assets',\n })}\n checked={\n indeterminateBulkSelect\n ? 'indeterminate'\n : (assetCount > 0 || folderCount > 0) &&\n selected.length === assetCount + folderCount\n }\n onCheckedChange={(e) =>\n handleBulkSelect(e, [...assets, ...folders] as FolderRow[] | FileRow[])\n }\n />\n </BoxWithHeight>\n )}\n {canRead && isGridView && (\n <SortPicker value={query?.sort} onChangeSort={handleChangeSort} />\n )}\n {canRead && <Filters />}\n </>\n }\n endActions={\n <>\n {canConfigureView ? (\n <ActionContainer paddingTop={1} paddingBottom={1}>\n <IconButton\n tag={ReactRouterLink}\n to={{\n pathname: `${pathname}/configuration`,\n search: stringify(query, { encode: false }),\n }}\n label={formatMessage({\n id: 'app.links.configure-view',\n defaultMessage: 'Configure the view',\n })}\n >\n <Cog />\n </IconButton>\n </ActionContainer>\n ) : null}\n <ActionContainer paddingTop={1} paddingBottom={1}>\n <IconButton\n label={\n isGridView\n ? formatMessage({\n id: getTrad('view-switch.list'),\n defaultMessage: 'List View',\n })\n : formatMessage({\n id: getTrad('view-switch.grid'),\n defaultMessage: 'Grid View',\n })\n }\n onClick={() => setView(isGridView ? viewOptions.LIST : viewOptions.GRID)}\n >\n {isGridView ? <List /> : <GridIcon />}\n </IconButton>\n </ActionContainer>\n <SearchInput\n label={formatMessage({\n id: getTrad('search.label'),\n defaultMessage: 'Search for an asset',\n })}\n trackedEvent=\"didSearchMediaLibraryElements\"\n trackedEventDetails={{ location: 'upload' }}\n />\n </>\n }\n />\n\n <Layouts.Content>\n {selected.length > 0 && (\n <BulkActions\n currentFolder={currentFolder as BulkActionsProps['currentFolder']}\n selected={selected as BulkActionsProps['selected']}\n onSuccess={handleBulkActionSuccess}\n />\n )}\n\n {folderCount === 0 && assetCount === 0 && (\n <EmptyOrNoPermissions\n canCreate={canCreate}\n canRead={canRead}\n isFiltering={isFiltering}\n onActionClick={toggleUploadAssetDialog}\n />\n )}\n\n {/* TODO: fix AssetListTable should handle no assets views (loading) */}\n {canRead && !isGridView && (assetCount > 0 || folderCount > 0) && (\n <TableList\n assetCount={assetCount}\n folderCount={folderCount}\n indeterminate={indeterminateBulkSelect}\n onChangeSort={handleChangeSort}\n onChangeFolder={(folderID, folderPath) =>\n navigate(getFolderURL(pathname, query, { folder: folderID.toString(), folderPath }))\n }\n onEditAsset={setAssetToEdit as TableListProps['onEditAsset']}\n onEditFolder={handleEditFolder}\n onSelectOne={selectOne}\n onSelectAll={handleBulkSelect as TableListProps['onSelectAll']}\n rows={[...folders, ...assets] as TableListProps['rows']}\n selected={selected as TableListProps['selected']}\n shouldDisableBulkSelect={!canUpdate}\n sortQuery={query?.sort ?? ''}\n />\n )}\n\n {canRead && isGridView && (\n <>\n {folderCount > 0 && (\n <FolderGridList\n title={\n // Folders title should only appear if:\n // user is filtering and there are assets to display, to divide both type of elements\n // user is not filtering\n (((isFiltering && assetCount > 0) || !isFiltering) &&\n formatMessage(\n {\n id: getTrad('list.folders.title'),\n defaultMessage: 'Folders ({count})',\n },\n { count: folderCount }\n )) ||\n ''\n }\n >\n {folders.map((folder) => {\n const selectedFolders = selected.filter(({ type }) => type === 'folder');\n const isSelected = !!selectedFolders.find(\n (currentFolder) => currentFolder.id === folder.id\n );\n\n const url = getFolderURL(pathname, query, {\n folder: folder?.id.toString(),\n folderPath: folder?.path,\n });\n\n return (\n <Grid.Item\n col={3}\n key={`folder-${folder.id}`}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <FolderCard\n ref={\n folderToEdit && folder.id === folderToEdit.id\n ? currentFolderToEditRef\n : undefined\n }\n ariaLabel={folder.name}\n id={`folder-${folder.id}`}\n to={url}\n startAction={\n folder.isSelectable ? (\n <FolderCardCheckbox\n data-testid={`folder-checkbox-${folder.id}`}\n checked={isSelected}\n onCheckedChange={() => selectOne(folder)}\n />\n ) : null\n }\n cardActions={\n <IconButton\n label={formatMessage({\n id: getTrad('list.folder.edit'),\n defaultMessage: 'Edit folder',\n })}\n onClick={() => handleEditFolder(folder)}\n >\n <Pencil />\n </IconButton>\n }\n >\n <FolderCardBody>\n <FolderCardBodyAction to={url}>\n <Flex tag=\"h2\" direction=\"column\" alignItems=\"start\" maxWidth=\"100%\">\n <TypographyMaxWidth\n fontWeight=\"semiBold\"\n textColor=\"neutral800\"\n ellipsis\n >\n {folder.name}\n <VisuallyHidden>:</VisuallyHidden>\n </TypographyMaxWidth>\n\n <TypographyMaxWidth\n tag=\"span\"\n textColor=\"neutral600\"\n variant=\"pi\"\n ellipsis\n >\n {formatMessage(\n {\n id: getTrad('list.folder.subtitle'),\n defaultMessage:\n '{folderCount, plural, =0 {# folder} one {# folder} other {# folders}}, {filesCount, plural, =0 {# asset} one {# asset} other {# assets}}',\n },\n {\n folderCount: (folder as FolderDefinition).children?.count,\n filesCount: (folder as FolderDefinition).files?.count,\n }\n )}\n </TypographyMaxWidth>\n </Flex>\n </FolderCardBodyAction>\n </FolderCardBody>\n </FolderCard>\n </Grid.Item>\n );\n })}\n </FolderGridList>\n )}\n\n {assetCount > 0 && folderCount > 0 && (\n <Box paddingTop={6} paddingBottom={4}>\n <Divider />\n </Box>\n )}\n\n {assetCount > 0 && (\n <AssetGridList\n assets={assets}\n onEditAsset={setAssetToEdit as AssetGridListProps['onEditAsset']}\n onSelectAsset={selectOne}\n selectedAssets={\n selected.filter(\n ({ type }) => type === 'asset'\n ) as AssetGridListProps['selectedAssets']\n }\n title={\n // Assets title should only appear if:\n // - user is not filtering\n // - user is filtering and there are folders to display, to separate them\n // - user is on page 1 since folders won't appear on any other page than the first one (no need to visually separate them)\n ((!isFiltering || (isFiltering && folderCount > 0)) &&\n assetsData?.pagination?.page === 1 &&\n formatMessage(\n {\n id: getTrad('list.assets.title'),\n defaultMessage: 'Assets ({count})',\n },\n { count: totalAssetCount }\n )) ||\n ''\n }\n />\n )}\n </>\n )}\n <Pagination.Root {...assetsData?.pagination}>\n <Pagination.PageSize />\n <Pagination.Links />\n </Pagination.Root>\n </Layouts.Content>\n </Page.Main>\n {showUploadAssetDialog && (\n <UploadAssetDialog\n open={showUploadAssetDialog}\n onClose={toggleUploadAssetDialog}\n trackedLocation=\"upload\"\n folderId={query?.folder as string | number | null | undefined}\n />\n )}\n {showEditFolderDialog && (\n <EditFolderDialog\n open={showEditFolderDialog}\n onClose={() => handleEditFolderClose()}\n folder={folderToEdit as FolderDefinition}\n parentFolderId={query?.folder as string | number | null | undefined}\n location=\"upload\"\n />\n )}\n {assetToEdit && (\n <EditAssetDialog\n onClose={(editedAsset) => {\n // The asset has been deleted\n if (editedAsset === null) {\n handleAssetDeleted(1);\n }\n\n setAssetToEdit(undefined);\n }}\n open={!!assetToEdit}\n asset={assetToEdit}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n trackedLocation=\"upload\"\n />\n )}\n </Layouts.Root>\n );\n};\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { Page, useQueryParams } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { Route, Routes } from 'react-router-dom';\n\nimport { useConfig } from '../../hooks/useConfig';\nimport { getTrad } from '../../utils';\n\nimport { MediaLibrary } from './MediaLibrary/MediaLibrary';\n\nimport type { Configuration } from '../../../../shared/contracts/configuration';\n\nconst ConfigureTheView = React.lazy(async () =>\n import('./ConfigureTheView/ConfigureTheView').then((mod) => ({ default: mod.ConfigureTheView }))\n);\n\nexport const Upload = () => {\n const {\n config: { isLoading, isError, data: config },\n } = useConfig() as { config: { isLoading: boolean; isError: boolean; data: Configuration } };\n\n const [{ rawQuery }, setQuery] = useQueryParams();\n const { formatMessage } = useIntl();\n const title = formatMessage({ id: getTrad('plugin.name'), defaultMessage: 'Media Library' });\n\n React.useEffect(() => {\n if (isLoading || isError || rawQuery) {\n return;\n }\n setQuery({\n sort: config.sort,\n page: 1,\n pageSize: config.pageSize,\n });\n }, [isLoading, isError, config, rawQuery, setQuery]);\n\n if (isLoading) {\n return (\n <>\n <Page.Title>{title}</Page.Title>\n <Page.Loading />\n </>\n );\n }\n\n return (\n <Page.Main>\n {rawQuery ? (\n <React.Suspense fallback={<Page.Loading />}>\n <Routes>\n <Route index element={<MediaLibrary />} />\n <Route\n path=\"configuration\"\n element={<ConfigureTheView config={config as Configuration} />}\n />\n </Routes>\n </React.Suspense>\n ) : null}\n </Page.Main>\n );\n};\n"],"names":["error","filters","ReactRouterLink","GridIcon","currentFolder"],"mappings":"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"}