@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
@@ -5,14 +5,13 @@ const React = require("react");
5
5
  const strapiAdmin = require("@strapi/admin/strapi-admin");
6
6
  const reactIntl = require("react-intl");
7
7
  const reactRouterDom = require("react-router-dom");
8
- const index = require("./index-BHcSb0I3.js");
8
+ const index = require("./index-B7NW5XiM.js");
9
9
  require("byte-size");
10
10
  require("date-fns");
11
11
  const qs = require("qs");
12
12
  const designSystem = require("@strapi/design-system");
13
13
  const icons = require("@strapi/icons");
14
14
  const styledComponents = require("styled-components");
15
- const PropTypes = require("prop-types");
16
15
  const formik = require("formik");
17
16
  const isEmpty = require("lodash/isEmpty");
18
17
  const reactQuery = require("react-query");
@@ -37,10 +36,9 @@ function _interopNamespace(e) {
37
36
  return Object.freeze(n);
38
37
  }
39
38
  const React__namespace = /* @__PURE__ */ _interopNamespace(React);
40
- const PropTypes__default = /* @__PURE__ */ _interopDefault(PropTypes);
41
39
  const isEmpty__default = /* @__PURE__ */ _interopDefault(isEmpty);
42
40
  const getBreadcrumbDataML = (folder, { pathname, query }) => {
43
- let data = [
41
+ const data = [
44
42
  {
45
43
  id: null,
46
44
  label: { id: index.getTrad("plugin.name"), defaultMessage: "Media Library" },
@@ -84,10 +82,6 @@ const BulkDeleteButton = ({ selected, onSuccess }) => {
84
82
  /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.ConfirmDialog, { onConfirm: handleConfirmRemove })
85
83
  ] });
86
84
  };
87
- BulkDeleteButton.propTypes = {
88
- selected: PropTypes__default.default.arrayOf(index.AssetDefinition, index.FolderDefinition).isRequired,
89
- onSuccess: PropTypes__default.default.func.isRequired
90
- };
91
85
  const useBulkMove = () => {
92
86
  const { formatMessage } = reactIntl.useIntl();
93
87
  const { toggleNotification } = strapiAdmin.useNotification();
@@ -127,7 +121,7 @@ const useBulkMove = () => {
127
121
  const move = (destinationFolderId, filesAndFolders) => mutation.mutateAsync({ destinationFolderId, filesAndFolders });
128
122
  return { ...mutation, move };
129
123
  };
130
- const BulkMoveDialog = ({ onClose, selected, currentFolder }) => {
124
+ const BulkMoveDialog = ({ onClose, selected = [], currentFolder }) => {
131
125
  const { formatMessage } = reactIntl.useIntl();
132
126
  const { data: folderStructure, isLoading } = index.useFolderStructure();
133
127
  const { move } = useBulkMove();
@@ -136,16 +130,24 @@ const BulkMoveDialog = ({ onClose, selected, currentFolder }) => {
136
130
  }
137
131
  const handleSubmit = async (values, { setErrors }) => {
138
132
  try {
139
- await move(values.destination.value, selected);
140
- onClose();
133
+ if (typeof values.destination !== "string") {
134
+ const destinationValue = values.destination.value;
135
+ await move(destinationValue, selected);
136
+ onClose();
137
+ }
141
138
  } catch (error) {
142
139
  const normalizedError = index.normalizeAPIError(error);
143
- const formikErrors = normalizedError.errors.reduce((acc, error2) => {
144
- acc[error2.values?.path?.length || "destination"] = error2.defaultMessage;
145
- return acc;
146
- }, {});
147
- if (!isEmpty__default.default(formikErrors)) {
148
- setErrors(formikErrors);
140
+ if (normalizedError && "errors" in normalizedError) {
141
+ const formikErrors = normalizedError.errors?.reduce(
142
+ (acc, error2) => {
143
+ acc[error2.values?.path?.length || "destination"] = error2.defaultMessage;
144
+ return acc;
145
+ },
146
+ {}
147
+ );
148
+ if (!isEmpty__default.default(formikErrors)) {
149
+ setErrors(formikErrors);
150
+ }
149
151
  }
150
152
  }
151
153
  };
@@ -178,7 +180,7 @@ const BulkMoveDialog = ({ onClose, selected, currentFolder }) => {
178
180
  onChange: (value) => {
179
181
  setFieldValue("destination", value);
180
182
  },
181
- defaultValue: values.destination,
183
+ defaultValue: typeof values.destination !== "string" ? values.destination : void 0,
182
184
  name: "destination",
183
185
  menuPortalTarget: document.querySelector("body"),
184
186
  inputId: "folder-destination",
@@ -194,18 +196,13 @@ const BulkMoveDialog = ({ onClose, selected, currentFolder }) => {
194
196
  ] })
195
197
  ] }) }) });
196
198
  };
197
- BulkMoveDialog.defaultProps = {
198
- currentFolder: void 0,
199
- selected: []
200
- };
201
- BulkMoveDialog.propTypes = {
202
- onClose: PropTypes__default.default.func.isRequired,
203
- currentFolder: index.FolderDefinition,
204
- selected: PropTypes__default.default.arrayOf(index.FolderDefinition, index.AssetDefinition)
205
- };
206
- const BulkMoveButton = ({ selected, onSuccess, currentFolder }) => {
199
+ const BulkMoveButton = ({
200
+ selected = [],
201
+ onSuccess,
202
+ currentFolder
203
+ }) => {
207
204
  const { formatMessage } = reactIntl.useIntl();
208
- const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);
205
+ const [showConfirmDialog, setShowConfirmDialog] = React__namespace.useState(false);
209
206
  const handleConfirmMove = () => {
210
207
  setShowConfirmDialog(false);
211
208
  onSuccess();
@@ -222,19 +219,10 @@ const BulkMoveButton = ({ selected, onSuccess, currentFolder }) => {
222
219
  )
223
220
  ] });
224
221
  };
225
- BulkMoveButton.defaultProps = {
226
- currentFolder: void 0,
227
- selected: []
228
- };
229
- BulkMoveButton.propTypes = {
230
- onSuccess: PropTypes__default.default.func.isRequired,
231
- currentFolder: index.FolderDefinition,
232
- selected: PropTypes__default.default.arrayOf(index.AssetDefinition, index.FolderDefinition)
233
- };
234
- const BulkActions = ({ selected, onSuccess, currentFolder }) => {
222
+ const BulkActions = ({ selected = [], onSuccess, currentFolder }) => {
235
223
  const { formatMessage } = reactIntl.useIntl();
236
- const numberAssets = selected.reduce(function(_this, val) {
237
- return val?.type === "folder" ? _this + val.files.count : _this + 1;
224
+ const numberAssets = selected?.reduce(function(_this, val) {
225
+ return val?.type === "folder" && "files" in val && val?.files && "count" in val.files ? _this + val?.files?.count : _this + 1;
238
226
  }, 0);
239
227
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, paddingBottom: 5, children: [
240
228
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "epsilon", textColor: "neutral600", children: formatMessage(
@@ -243,24 +231,32 @@ const BulkActions = ({ selected, onSuccess, currentFolder }) => {
243
231
  defaultMessage: "{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}} selected"
244
232
  },
245
233
  {
246
- numberFolders: selected.filter(({ type }) => type === "folder").length,
234
+ numberFolders: selected?.filter(({ type }) => type === "folder").length,
247
235
  numberAssets
248
236
  }
249
237
  ) }),
250
- /* @__PURE__ */ jsxRuntime.jsx(BulkDeleteButton, { selected, onSuccess }),
251
- /* @__PURE__ */ jsxRuntime.jsx(BulkMoveButton, { currentFolder, selected, onSuccess })
238
+ /* @__PURE__ */ jsxRuntime.jsx(
239
+ BulkDeleteButton,
240
+ {
241
+ selected,
242
+ onSuccess
243
+ }
244
+ ),
245
+ /* @__PURE__ */ jsxRuntime.jsx(
246
+ BulkMoveButton,
247
+ {
248
+ currentFolder,
249
+ selected,
250
+ onSuccess
251
+ }
252
+ )
252
253
  ] });
253
254
  };
254
- BulkActions.defaultProps = {
255
- currentFolder: void 0,
256
- selected: []
257
- };
258
- BulkActions.propTypes = {
259
- onSuccess: PropTypes__default.default.func.isRequired,
260
- currentFolder: index.FolderDefinition,
261
- selected: PropTypes__default.default.arrayOf(index.AssetDefinition, index.FolderDefinition)
262
- };
263
- const getContentIntlMessage = ({ isFiltering, canCreate, canRead }) => {
255
+ const getContentIntlMessage = ({
256
+ isFiltering,
257
+ canCreate,
258
+ canRead
259
+ }) => {
264
260
  if (isFiltering) {
265
261
  return {
266
262
  id: "list.assets-empty.title-withSearch",
@@ -284,7 +280,12 @@ const getContentIntlMessage = ({ isFiltering, canCreate, canRead }) => {
284
280
  defaultMessage: "No permissions to view"
285
281
  };
286
282
  };
287
- const EmptyOrNoPermissions = ({ canCreate, isFiltering, canRead, onActionClick }) => {
283
+ const EmptyOrNoPermissions = ({
284
+ canCreate,
285
+ isFiltering,
286
+ canRead,
287
+ onActionClick
288
+ }) => {
288
289
  const { formatMessage } = reactIntl.useIntl();
289
290
  const content = getContentIntlMessage({ isFiltering, canCreate, canRead });
290
291
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -302,12 +303,6 @@ const EmptyOrNoPermissions = ({ canCreate, isFiltering, canRead, onActionClick }
302
303
  }
303
304
  );
304
305
  };
305
- EmptyOrNoPermissions.propTypes = {
306
- canCreate: PropTypes__default.default.bool.isRequired,
307
- canRead: PropTypes__default.default.bool.isRequired,
308
- isFiltering: PropTypes__default.default.bool.isRequired,
309
- onActionClick: PropTypes__default.default.func.isRequired
310
- };
311
306
  const Filters = () => {
312
307
  const [open, setOpen] = React__namespace.useState(false);
313
308
  const { formatMessage } = reactIntl.useIntl();
@@ -346,9 +341,9 @@ const Filters = () => {
346
341
  ] });
347
342
  };
348
343
  const Header = ({
349
- breadcrumbs,
344
+ breadcrumbs = null,
350
345
  canCreate,
351
- folder,
346
+ folder = null,
352
347
  onToggleEditFolderDialog,
353
348
  onToggleUploadAssetDialog
354
349
  }) => {
@@ -357,8 +352,8 @@ const Header = ({
357
352
  const [{ query }] = strapiAdmin.useQueryParams();
358
353
  const backQuery = {
359
354
  ...query,
360
- folder: folder?.parent?.id ?? void 0,
361
- folderPath: folder?.parent?.path ?? void 0
355
+ folder: folder?.parent && typeof folder.parent !== "number" && folder.parent.id ? folder.parent.id : void 0,
356
+ folderPath: folder?.parent && typeof folder.parent !== "number" && folder.parent.path ? folder.parent.path : void 0
362
357
  };
363
358
  return /* @__PURE__ */ jsxRuntime.jsx(
364
359
  strapiAdmin.Layouts.Header,
@@ -367,10 +362,9 @@ const Header = ({
367
362
  id: index.getTrad("plugin.name"),
368
363
  defaultMessage: `Media Library`
369
364
  }),
370
- subtitle: breadcrumbs && folder && /* @__PURE__ */ jsxRuntime.jsx(
365
+ subtitle: breadcrumbs && typeof breadcrumbs !== "boolean" && folder && /* @__PURE__ */ jsxRuntime.jsx(
371
366
  index.Breadcrumbs,
372
367
  {
373
- tag: "nav",
374
368
  label: formatMessage({
375
369
  id: index.getTrad("header.breadcrumbs.nav.label"),
376
370
  defaultMessage: "Folders navigation"
@@ -404,17 +398,6 @@ const Header = ({
404
398
  }
405
399
  );
406
400
  };
407
- Header.defaultProps = {
408
- breadcrumbs: false,
409
- folder: null
410
- };
411
- Header.propTypes = {
412
- breadcrumbs: PropTypes__default.default.oneOfType([index.BreadcrumbsDefinition, PropTypes__default.default.bool]),
413
- canCreate: PropTypes__default.default.bool.isRequired,
414
- folder: index.FolderDefinition,
415
- onToggleEditFolderDialog: PropTypes__default.default.func.isRequired,
416
- onToggleUploadAssetDialog: PropTypes__default.default.func.isRequired
417
- };
418
401
  const BoxWithHeight = styledComponents.styled(designSystem.Box)`
419
402
  height: 3.2rem;
420
403
  display: flex;
@@ -441,7 +424,7 @@ const MediaLibrary = () => {
441
424
  canConfigureView,
442
425
  isLoading: permissionsLoading
443
426
  } = index.useMediaLibraryPermissions();
444
- const currentFolderToEditRef = React.useRef();
427
+ const currentFolderToEditRef = React__namespace.useRef();
445
428
  const { formatMessage } = reactIntl.useIntl();
446
429
  const { pathname } = reactRouterDom.useLocation();
447
430
  const { trackUsage } = strapiAdmin.useTracking();
@@ -452,7 +435,7 @@ const MediaLibrary = () => {
452
435
  const {
453
436
  data: assetsData,
454
437
  isLoading: assetsLoading,
455
- errors: assetsError
438
+ error: assetsError
456
439
  } = index.useAssets({
457
440
  skipWhen: !canRead,
458
441
  query
@@ -460,7 +443,7 @@ const MediaLibrary = () => {
460
443
  const {
461
444
  data: foldersData,
462
445
  isLoading: foldersLoading,
463
- errors: foldersError
446
+ error: foldersError
464
447
  } = index.useFolders({
465
448
  enabled: canRead && assetsData?.pagination?.page === 1 && !index.containsAssetFilter(query),
466
449
  query
@@ -472,13 +455,16 @@ const MediaLibrary = () => {
472
455
  } = index.useFolder(query?.folder, {
473
456
  enabled: canRead && !!query?.folder
474
457
  });
475
- if (currentFolderError?.response?.status === 404) {
458
+ if (currentFolderError?.name === "NotFoundError") {
476
459
  navigate(pathname);
477
460
  }
478
461
  const folders = foldersData?.map((folder) => ({
479
462
  ...folder,
480
463
  type: "folder",
481
- folderURL: index.getFolderURL(pathname, query, folder.id),
464
+ folderURL: index.getFolderURL(pathname, query, {
465
+ folder: folder.id.toString(),
466
+ folderPath: folder.path
467
+ }),
482
468
  isSelectable: canUpdate
483
469
  })) ?? [];
484
470
  const folderCount = folders?.length || 0;
@@ -486,11 +472,14 @@ const MediaLibrary = () => {
486
472
  const assetCount = assets?.length ?? 0;
487
473
  const totalAssetCount = assetsData?.pagination?.total;
488
474
  const isLoading = isCurrentFolderLoading || foldersLoading || permissionsLoading || assetsLoading;
489
- const [showUploadAssetDialog, setShowUploadAssetDialog] = React.useState(false);
490
- const [showEditFolderDialog, setShowEditFolderDialog] = React.useState(false);
491
- const [assetToEdit, setAssetToEdit] = React.useState(void 0);
492
- const [folderToEdit, setFolderToEdit] = React.useState(void 0);
493
- const [selected, { selectOne, selectAll }] = index.useSelectionState(["type", "id"], []);
475
+ const [showUploadAssetDialog, setShowUploadAssetDialog] = React__namespace.useState(false);
476
+ const [showEditFolderDialog, setShowEditFolderDialog] = React__namespace.useState(false);
477
+ const [assetToEdit, setAssetToEdit] = React__namespace.useState(void 0);
478
+ const [folderToEdit, setFolderToEdit] = React__namespace.useState(void 0);
479
+ const [selected, { selectOne, selectAll }] = index.useSelectionState(
480
+ ["type", "id"],
481
+ []
482
+ );
494
483
  const indeterminateBulkSelect = selected?.length > 0 && selected?.length !== assetCount + folderCount;
495
484
  const toggleUploadAssetDialog = () => setShowUploadAssetDialog((prev) => !prev);
496
485
  const toggleEditFolderDialog = ({ created = false } = {}) => {
@@ -527,7 +516,7 @@ const MediaLibrary = () => {
527
516
  }
528
517
  };
529
518
  const handleAssetDeleted = (numberOfAssets) => {
530
- if (numberOfAssets === assetCount && assetsData.pagination.page === assetsData.pagination.pageCount && assetsData.pagination.page > 1) {
519
+ if (numberOfAssets === assetCount && assetsData?.pagination?.page === assetsData?.pagination?.pageCount && assetsData?.pagination?.page && assetsData.pagination.page > 1) {
531
520
  setQuery({
532
521
  ...query,
533
522
  page: assetsData.pagination.page - 1
@@ -549,7 +538,10 @@ const MediaLibrary = () => {
549
538
  /* @__PURE__ */ jsxRuntime.jsx(
550
539
  Header,
551
540
  {
552
- breadcrumbs: !isCurrentFolderLoading && getBreadcrumbDataML(currentFolder, { pathname, query }),
541
+ breadcrumbs: !isCurrentFolderLoading ? getBreadcrumbDataML(currentFolder, {
542
+ pathname,
543
+ query
544
+ }) : null,
553
545
  canCreate,
554
546
  onToggleEditFolderDialog: toggleEditFolderDialog,
555
547
  onToggleUploadAssetDialog: toggleUploadAssetDialog,
@@ -653,7 +645,7 @@ const MediaLibrary = () => {
653
645
  folderCount,
654
646
  indeterminate: indeterminateBulkSelect,
655
647
  onChangeSort: handleChangeSort,
656
- onChangeFolder: (folderID, folderPath) => navigate(index.getFolderURL(pathname, query, { folder: folderID, folderPath })),
648
+ onChangeFolder: (folderID, folderPath) => navigate(index.getFolderURL(pathname, query, { folder: folderID.toString(), folderPath })),
657
649
  onEditAsset: setAssetToEdit,
658
650
  onEditFolder: handleEditFolder,
659
651
  onSelectOne: selectOne,
@@ -686,7 +678,7 @@ const MediaLibrary = () => {
686
678
  (currentFolder2) => currentFolder2.id === folder.id
687
679
  );
688
680
  const url = index.getFolderURL(pathname, query, {
689
- folder: folder?.id,
681
+ folder: folder?.id.toString(),
690
682
  folderPath: folder?.path
691
683
  });
692
684
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -702,7 +694,7 @@ const MediaLibrary = () => {
702
694
  ariaLabel: folder.name,
703
695
  id: `folder-${folder.id}`,
704
696
  to: url,
705
- startAction: selectOne && folder.isSelectable ? /* @__PURE__ */ jsxRuntime.jsx(
697
+ startAction: folder.isSelectable ? /* @__PURE__ */ jsxRuntime.jsx(
706
698
  FolderCardCheckbox,
707
699
  {
708
700
  "data-testid": `folder-checkbox-${folder.id}`,
@@ -713,7 +705,7 @@ const MediaLibrary = () => {
713
705
  cardActions: /* @__PURE__ */ jsxRuntime.jsx(
714
706
  designSystem.IconButton,
715
707
  {
716
- "aria-label": formatMessage({
708
+ label: formatMessage({
717
709
  id: index.getTrad("list.folder.edit"),
718
710
  defaultMessage: "Edit folder"
719
711
  }),
@@ -747,8 +739,8 @@ const MediaLibrary = () => {
747
739
  defaultMessage: "{folderCount, plural, =0 {# folder} one {# folder} other {# folders}}, {filesCount, plural, =0 {# asset} one {# asset} other {# assets}}"
748
740
  },
749
741
  {
750
- folderCount: folder.children.count,
751
- filesCount: folder.files.count
742
+ folderCount: folder.children?.count,
743
+ filesCount: folder.files?.count
752
744
  }
753
745
  )
754
746
  }
@@ -769,7 +761,9 @@ const MediaLibrary = () => {
769
761
  assets,
770
762
  onEditAsset: setAssetToEdit,
771
763
  onSelectAsset: selectOne,
772
- selectedAssets: selected.filter(({ type }) => type === "asset"),
764
+ selectedAssets: selected.filter(
765
+ ({ type }) => type === "asset"
766
+ ),
773
767
  title: (
774
768
  // Assets title should only appear if:
775
769
  // - user is not filtering
@@ -786,7 +780,7 @@ const MediaLibrary = () => {
786
780
  }
787
781
  )
788
782
  ] }),
789
- /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Pagination.Root, { ...assetsData.pagination, children: [
783
+ /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Pagination.Root, { ...assetsData?.pagination, children: [
790
784
  /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Pagination.PageSize, {}),
791
785
  /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Pagination.Links, {})
792
786
  ] })
@@ -805,7 +799,7 @@ const MediaLibrary = () => {
805
799
  index.EditFolderDialog,
806
800
  {
807
801
  open: showEditFolderDialog,
808
- onClose: handleEditFolderClose,
802
+ onClose: () => handleEditFolderClose(),
809
803
  folder: folderToEdit,
810
804
  parentFolderId: query?.folder,
811
805
  location: "upload"
@@ -830,7 +824,9 @@ const MediaLibrary = () => {
830
824
  )
831
825
  ] });
832
826
  };
833
- const ConfigureTheView = React.lazy(() => Promise.resolve().then(() => require("./index-l4hbqJYu.js")));
827
+ const ConfigureTheView = React__namespace.lazy(
828
+ async () => Promise.resolve().then(() => require("./ConfigureTheView-fwDgErsi.js")).then((mod) => ({ default: mod.ConfigureTheView }))
829
+ );
834
830
  const Upload = () => {
835
831
  const {
836
832
  config: { isLoading, isError, data: config }
@@ -838,11 +834,15 @@ const Upload = () => {
838
834
  const [{ rawQuery }, setQuery] = strapiAdmin.useQueryParams();
839
835
  const { formatMessage } = reactIntl.useIntl();
840
836
  const title = formatMessage({ id: index.getTrad("plugin.name"), defaultMessage: "Media Library" });
841
- React.useEffect(() => {
837
+ React__namespace.useEffect(() => {
842
838
  if (isLoading || isError || rawQuery) {
843
839
  return;
844
840
  }
845
- setQuery({ sort: config.sort, page: 1, pageSize: config.pageSize });
841
+ setQuery({
842
+ sort: config.sort,
843
+ page: 1,
844
+ pageSize: config.pageSize
845
+ });
846
846
  }, [isLoading, isError, config, rawQuery, setQuery]);
847
847
  if (isLoading) {
848
848
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -850,10 +850,16 @@ const Upload = () => {
850
850
  /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Loading, {})
851
851
  ] });
852
852
  }
853
- return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Main, { children: rawQuery ? /* @__PURE__ */ jsxRuntime.jsx(React.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Loading, {}), children: /* @__PURE__ */ jsxRuntime.jsxs(reactRouterDom.Routes, { children: [
853
+ return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Main, { children: rawQuery ? /* @__PURE__ */ jsxRuntime.jsx(React__namespace.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Loading, {}), children: /* @__PURE__ */ jsxRuntime.jsxs(reactRouterDom.Routes, { children: [
854
854
  /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Route, { index: true, element: /* @__PURE__ */ jsxRuntime.jsx(MediaLibrary, {}) }),
855
- /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Route, { path: "configuration", element: /* @__PURE__ */ jsxRuntime.jsx(ConfigureTheView, { config }) })
855
+ /* @__PURE__ */ jsxRuntime.jsx(
856
+ reactRouterDom.Route,
857
+ {
858
+ path: "configuration",
859
+ element: /* @__PURE__ */ jsxRuntime.jsx(ConfigureTheView, { config })
860
+ }
861
+ )
856
862
  ] }) }) : null });
857
863
  };
858
- exports.default = Upload;
859
- //# sourceMappingURL=index-DlRn6eNH.js.map
864
+ exports.Upload = Upload;
865
+ //# sourceMappingURL=App-Dqqn78jO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App-Dqqn78jO.js","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":["getTrad","getFolderURL","useFolderCard","jsx","Box","Checkbox","useIntl","useBulkRemove","jsxs","Dialog","Button","Trash","ConfirmDialog","useNotification","useQueryClient","useFetchClient","useMutation","pluginId","useFolderStructure","normalizeAPIError","error","isEmpty","Modal","Flex","Loader","Formik","Form","Grid","Field","SelectTree","Typography","React","Folder","EmptyAssets","EmptyPermissions","Plus","useTracking","useQueryParams","filters","Popover","Filter","FilterPopover","displayedFilters","FilterList","useLocation","Layouts","Breadcrumbs","Link","NavLink","ArrowLeft","stringify","styled","useNavigate","useMediaLibraryPermissions","usePersistentState","localStorageKeys","viewOptions","useAssets","useFolders","containsAssetFilter","useFolder","useSelectionState","Page","Fragment","SortPicker","IconButton","ReactRouterLink","Cog","List","GridIcon","SearchInput","TableList","FolderGridList","currentFolder","FolderCard","Pencil","FolderCardBody","FolderCardBodyAction","VisuallyHidden","Divider","AssetGridList","Pagination","UploadAssetDialog","EditFolderDialog","EditAssetDialog","useConfig","Routes","Route"],"mappings":"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"}