@strapi/upload 5.3.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 (118) hide show
  1. package/dist/_chunks/{index-DCAQ4hHN.mjs → App-D1ayH-QS.mjs} +94 -87
  2. package/dist/_chunks/App-D1ayH-QS.mjs.map +1 -0
  3. package/dist/_chunks/{index-Bl2-6oC8.js → App-Dqqn78jO.js} +94 -87
  4. package/dist/_chunks/App-Dqqn78jO.js.map +1 -0
  5. package/dist/_chunks/{index-C_cWV2yS.mjs → ConfigureTheView-B2Syy3q5.mjs} +24 -23
  6. package/dist/_chunks/ConfigureTheView-B2Syy3q5.mjs.map +1 -0
  7. package/dist/_chunks/{index-BM9Ayh_r.js → ConfigureTheView-fwDgErsi.js} +42 -23
  8. package/dist/_chunks/ConfigureTheView-fwDgErsi.js.map +1 -0
  9. package/dist/_chunks/{index-BWIqjWzC.mjs → SettingsPage-BYC3ism8.mjs} +45 -43
  10. package/dist/_chunks/SettingsPage-BYC3ism8.mjs.map +1 -0
  11. package/dist/_chunks/{index-C1MSWEyZ.js → SettingsPage-oDEVs3XV.js} +61 -41
  12. package/dist/_chunks/SettingsPage-oDEVs3XV.js.map +1 -0
  13. package/dist/_chunks/{index-YwynuEzj.js → index-B7NW5XiM.js} +115 -211
  14. package/dist/_chunks/index-B7NW5XiM.js.map +1 -0
  15. package/dist/_chunks/{index-BwEfHu6y.mjs → index-Clesg6BA.mjs} +138 -233
  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/AssetCardBase.d.ts +1 -1
  20. package/dist/admin/src/components/AssetCard/UploadingAssetCard.d.ts +1 -1
  21. package/dist/admin/src/components/AssetCard/VideoPreview.d.ts +1 -1
  22. package/dist/admin/src/components/AssetDialog/BrowseStep/{index.d.ts → BrowseStep.d.ts} +1 -1
  23. package/dist/admin/src/components/AssetDialog/BrowseStep/PageSize.d.ts +2 -2
  24. package/dist/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.d.ts +4 -0
  25. package/dist/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.d.ts +9 -0
  26. package/dist/admin/src/components/AssetDialog/BrowseStep/SearchAsset/{index.d.ts → SearchAsset.d.ts} +2 -2
  27. package/dist/admin/src/components/AssetGridList/{index.d.ts → AssetGridList.d.ts} +1 -2
  28. package/dist/admin/src/components/Breadcrumbs/Breadcrumbs.d.ts +1 -2
  29. package/dist/admin/src/components/EditFolderDialog/EditFolderDialog.d.ts +3 -1
  30. package/dist/admin/src/components/EditFolderDialog/RemoveFolderDialog.d.ts +1 -1
  31. package/dist/admin/src/components/FilterList/{index.d.ts → FilterList.d.ts} +3 -3
  32. package/dist/admin/src/components/FilterList/FilterTag.d.ts +3 -3
  33. package/dist/admin/src/components/FilterPopover/{index.d.ts → FilterPopover.d.ts} +3 -3
  34. package/dist/admin/src/components/FilterPopover/FilterValueInput.d.ts +2 -2
  35. package/dist/admin/src/components/FilterPopover/utils/getFilterList.d.ts +2 -2
  36. package/dist/admin/src/components/FolderGridList/FolderGridList.d.ts +1 -2
  37. package/dist/admin/src/components/MediaLibraryDialog/{index.d.ts → MediaLibraryDialog.d.ts} +1 -2
  38. package/dist/admin/src/components/MediaLibraryInput/{index.d.ts → MediaLibraryInput.d.ts} +2 -2
  39. package/dist/admin/src/components/SelectTree/Option.d.ts +2 -2
  40. package/dist/admin/src/components/SelectTree/SelectTree.d.ts +2 -3
  41. package/dist/admin/src/components/SelectTree/utils/flattenTree.d.ts +1 -1
  42. package/dist/admin/src/components/SelectTree/utils/getOpenValues.d.ts +2 -2
  43. package/dist/admin/src/components/SelectTree/utils/getValuesToClose.d.ts +2 -2
  44. package/dist/admin/src/components/SortPicker/{index.d.ts → SortPicker.d.ts} +2 -2
  45. package/dist/admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.d.ts +1 -1
  46. package/dist/admin/src/components/UploadAssetDialog/UploadAssetDialog.d.ts +1 -1
  47. package/dist/admin/src/{newConstants.d.ts → constants.d.ts} +1 -0
  48. package/dist/admin/src/hooks/useEditAsset.d.ts +4 -4
  49. package/dist/admin/src/hooks/useEditFolder.d.ts +4 -4
  50. package/dist/admin/src/hooks/useFolderStructure.d.ts +1 -1
  51. package/dist/admin/src/hooks/useModalQueryParams.d.ts +1 -2
  52. package/dist/admin/src/hooks/useSelectionState.d.ts +1 -1
  53. package/dist/admin/src/hooks/useUpload.d.ts +1 -1
  54. package/dist/admin/src/index.d.ts +3 -0
  55. package/dist/admin/src/pages/App/App.d.ts +1 -0
  56. package/dist/admin/src/pages/App/ConfigureTheView/ConfigureTheView.d.ts +6 -0
  57. package/dist/admin/src/pages/App/ConfigureTheView/components/Settings.d.ts +13 -0
  58. package/dist/admin/src/pages/App/ConfigureTheView/state/actionTypes.d.ts +2 -0
  59. package/dist/admin/src/pages/App/ConfigureTheView/state/actions.d.ts +12 -0
  60. package/dist/admin/src/pages/App/ConfigureTheView/state/init.d.ts +8 -0
  61. package/dist/admin/src/pages/App/ConfigureTheView/state/reducer.d.ts +15 -0
  62. package/dist/admin/src/pages/App/MediaLibrary/MediaLibrary.d.ts +1 -0
  63. package/dist/admin/src/pages/App/MediaLibrary/components/BulkActions.d.ts +15 -0
  64. package/dist/admin/src/pages/App/MediaLibrary/components/BulkDeleteButton.d.ts +7 -0
  65. package/dist/admin/src/pages/App/MediaLibrary/components/BulkMoveButton.d.ts +15 -0
  66. package/dist/admin/src/pages/App/MediaLibrary/components/EmptyOrNoPermissions.d.ts +7 -0
  67. package/dist/admin/src/pages/App/MediaLibrary/components/Filters.d.ts +1 -0
  68. package/dist/admin/src/pages/App/MediaLibrary/components/Header.d.ts +22 -0
  69. package/dist/admin/src/pages/App/components/BulkActions.d.ts +15 -0
  70. package/dist/admin/src/pages/App/components/BulkDeleteButton.d.ts +10 -0
  71. package/dist/admin/src/pages/App/components/BulkMoveButton.d.ts +15 -0
  72. package/dist/admin/src/pages/App/components/EmptyOrNoPermissions.d.ts +8 -0
  73. package/dist/admin/src/pages/App/components/Filters.d.ts +1 -0
  74. package/dist/admin/src/pages/App/components/Header.d.ts +13 -0
  75. package/dist/admin/src/pages/SettingsPage/SettingsPage.d.ts +2 -0
  76. package/dist/admin/src/pages/SettingsPage/init.d.ts +2 -0
  77. package/dist/admin/src/pages/SettingsPage/reducer.d.ts +27 -0
  78. package/dist/admin/src/pluginId.d.ts +0 -1
  79. package/dist/admin/src/utils/getBreadcrumbDataML.d.ts +1 -1
  80. package/dist/admin/src/utils/rawFileToAsset.d.ts +2 -2
  81. package/dist/admin/src/utils/toSingularTypes.d.ts +0 -1
  82. package/dist/admin/src/utils/typeFromMime.d.ts +1 -1
  83. package/dist/admin/src/utils/urlsToAssets.d.ts +2 -2
  84. package/dist/shared/contracts/settings.d.ts +3 -2
  85. package/package.json +8 -8
  86. package/dist/_chunks/index-BM9Ayh_r.js.map +0 -1
  87. package/dist/_chunks/index-BWIqjWzC.mjs.map +0 -1
  88. package/dist/_chunks/index-Bl2-6oC8.js.map +0 -1
  89. package/dist/_chunks/index-BwEfHu6y.mjs.map +0 -1
  90. package/dist/_chunks/index-C1MSWEyZ.js.map +0 -1
  91. package/dist/_chunks/index-C_cWV2yS.mjs.map +0 -1
  92. package/dist/_chunks/index-DCAQ4hHN.mjs.map +0 -1
  93. package/dist/_chunks/index-YwynuEzj.js.map +0 -1
  94. package/dist/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/PaginationContext.d.ts +0 -9
  95. package/dist/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/components.d.ts +0 -15
  96. package/dist/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/index.d.ts +0 -9
  97. package/dist/admin/src/components/Breadcrumbs/index.d.ts +0 -1
  98. package/dist/admin/src/components/BulkMoveDialog/index.d.ts +0 -1
  99. package/dist/admin/src/components/ContextInfo/index.d.ts +0 -1
  100. package/dist/admin/src/components/EditFolderDialog/ModalHeader/index.d.ts +0 -2
  101. package/dist/admin/src/components/EditFolderDialog/index.d.ts +0 -1
  102. package/dist/admin/src/components/FolderCard/FolderCard/index.d.ts +0 -1
  103. package/dist/admin/src/components/FolderCard/FolderCardBody/index.d.ts +0 -1
  104. package/dist/admin/src/components/FolderCard/FolderCardCheckbox/index.d.ts +0 -1
  105. package/dist/admin/src/components/FolderCard/index.d.ts +0 -4
  106. package/dist/admin/src/components/FolderGridList/index.d.ts +0 -1
  107. package/dist/admin/src/components/SelectTree/index.d.ts +0 -2
  108. /package/dist/admin/src/components/AssetDialog/{index.d.ts → AssetDialog.d.ts} +0 -0
  109. /package/dist/admin/src/components/AssetDialog/SelectedStep/{index.d.ts → SelectedStep.d.ts} +0 -0
  110. /package/dist/admin/src/components/CopyLinkButton/{index.d.ts → CopyLinkButton.d.ts} +0 -0
  111. /package/dist/admin/src/components/EditAssetDialog/{index.d.ts → EditAssetContent.d.ts} +0 -0
  112. /package/dist/admin/src/components/EditAssetDialog/PreviewBox/{index.d.ts → PreviewBox.d.ts} +0 -0
  113. /package/dist/admin/src/components/EditAssetDialog/PreviewBox/{components.d.ts → PreviewComponents.d.ts} +0 -0
  114. /package/dist/admin/src/components/EmptyAssets/{index.d.ts → EmptyAssets.d.ts} +0 -0
  115. /package/dist/admin/src/components/FolderCard/FolderCardBodyAction/{index.d.ts → FolderCardBodyAction.d.ts} +0 -0
  116. /package/dist/admin/src/components/TableList/{index.d.ts → TableList.d.ts} +0 -0
  117. /package/dist/admin/src/components/UploadProgress/{index.d.ts → UploadProgress.d.ts} +0 -0
  118. /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-YwynuEzj.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();
@@ -202,9 +196,13 @@ const BulkMoveDialog = ({ onClose, selected = [], currentFolder }) => {
202
196
  ] })
203
197
  ] }) }) });
204
198
  };
205
- const BulkMoveButton = ({ selected, onSuccess, currentFolder }) => {
199
+ const BulkMoveButton = ({
200
+ selected = [],
201
+ onSuccess,
202
+ currentFolder
203
+ }) => {
206
204
  const { formatMessage } = reactIntl.useIntl();
207
- const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);
205
+ const [showConfirmDialog, setShowConfirmDialog] = React__namespace.useState(false);
208
206
  const handleConfirmMove = () => {
209
207
  setShowConfirmDialog(false);
210
208
  onSuccess();
@@ -221,19 +219,10 @@ const BulkMoveButton = ({ selected, onSuccess, currentFolder }) => {
221
219
  )
222
220
  ] });
223
221
  };
224
- BulkMoveButton.defaultProps = {
225
- currentFolder: void 0,
226
- selected: []
227
- };
228
- BulkMoveButton.propTypes = {
229
- onSuccess: PropTypes__default.default.func.isRequired,
230
- currentFolder: index.FolderDefinition,
231
- selected: PropTypes__default.default.arrayOf(index.AssetDefinition, index.FolderDefinition)
232
- };
233
- const BulkActions = ({ selected, onSuccess, currentFolder }) => {
222
+ const BulkActions = ({ selected = [], onSuccess, currentFolder }) => {
234
223
  const { formatMessage } = reactIntl.useIntl();
235
- const numberAssets = selected.reduce(function(_this, val) {
236
- 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;
237
226
  }, 0);
238
227
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, paddingBottom: 5, children: [
239
228
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "epsilon", textColor: "neutral600", children: formatMessage(
@@ -242,24 +231,32 @@ const BulkActions = ({ selected, onSuccess, currentFolder }) => {
242
231
  defaultMessage: "{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}} selected"
243
232
  },
244
233
  {
245
- numberFolders: selected.filter(({ type }) => type === "folder").length,
234
+ numberFolders: selected?.filter(({ type }) => type === "folder").length,
246
235
  numberAssets
247
236
  }
248
237
  ) }),
249
- /* @__PURE__ */ jsxRuntime.jsx(BulkDeleteButton, { selected, onSuccess }),
250
- /* @__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
+ )
251
253
  ] });
252
254
  };
253
- BulkActions.defaultProps = {
254
- currentFolder: void 0,
255
- selected: []
256
- };
257
- BulkActions.propTypes = {
258
- onSuccess: PropTypes__default.default.func.isRequired,
259
- currentFolder: index.FolderDefinition,
260
- selected: PropTypes__default.default.arrayOf(index.AssetDefinition, index.FolderDefinition)
261
- };
262
- const getContentIntlMessage = ({ isFiltering, canCreate, canRead }) => {
255
+ const getContentIntlMessage = ({
256
+ isFiltering,
257
+ canCreate,
258
+ canRead
259
+ }) => {
263
260
  if (isFiltering) {
264
261
  return {
265
262
  id: "list.assets-empty.title-withSearch",
@@ -283,7 +280,12 @@ const getContentIntlMessage = ({ isFiltering, canCreate, canRead }) => {
283
280
  defaultMessage: "No permissions to view"
284
281
  };
285
282
  };
286
- const EmptyOrNoPermissions = ({ canCreate, isFiltering, canRead, onActionClick }) => {
283
+ const EmptyOrNoPermissions = ({
284
+ canCreate,
285
+ isFiltering,
286
+ canRead,
287
+ onActionClick
288
+ }) => {
287
289
  const { formatMessage } = reactIntl.useIntl();
288
290
  const content = getContentIntlMessage({ isFiltering, canCreate, canRead });
289
291
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -301,12 +303,6 @@ const EmptyOrNoPermissions = ({ canCreate, isFiltering, canRead, onActionClick }
301
303
  }
302
304
  );
303
305
  };
304
- EmptyOrNoPermissions.propTypes = {
305
- canCreate: PropTypes__default.default.bool.isRequired,
306
- canRead: PropTypes__default.default.bool.isRequired,
307
- isFiltering: PropTypes__default.default.bool.isRequired,
308
- onActionClick: PropTypes__default.default.func.isRequired
309
- };
310
306
  const Filters = () => {
311
307
  const [open, setOpen] = React__namespace.useState(false);
312
308
  const { formatMessage } = reactIntl.useIntl();
@@ -345,9 +341,9 @@ const Filters = () => {
345
341
  ] });
346
342
  };
347
343
  const Header = ({
348
- breadcrumbs,
344
+ breadcrumbs = null,
349
345
  canCreate,
350
- folder,
346
+ folder = null,
351
347
  onToggleEditFolderDialog,
352
348
  onToggleUploadAssetDialog
353
349
  }) => {
@@ -356,8 +352,8 @@ const Header = ({
356
352
  const [{ query }] = strapiAdmin.useQueryParams();
357
353
  const backQuery = {
358
354
  ...query,
359
- folder: folder?.parent?.id ?? void 0,
360
- 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
361
357
  };
362
358
  return /* @__PURE__ */ jsxRuntime.jsx(
363
359
  strapiAdmin.Layouts.Header,
@@ -366,10 +362,9 @@ const Header = ({
366
362
  id: index.getTrad("plugin.name"),
367
363
  defaultMessage: `Media Library`
368
364
  }),
369
- subtitle: breadcrumbs && folder && /* @__PURE__ */ jsxRuntime.jsx(
365
+ subtitle: breadcrumbs && typeof breadcrumbs !== "boolean" && folder && /* @__PURE__ */ jsxRuntime.jsx(
370
366
  index.Breadcrumbs,
371
367
  {
372
- tag: "nav",
373
368
  label: formatMessage({
374
369
  id: index.getTrad("header.breadcrumbs.nav.label"),
375
370
  defaultMessage: "Folders navigation"
@@ -403,17 +398,6 @@ const Header = ({
403
398
  }
404
399
  );
405
400
  };
406
- Header.defaultProps = {
407
- breadcrumbs: false,
408
- folder: null
409
- };
410
- Header.propTypes = {
411
- breadcrumbs: PropTypes__default.default.oneOfType([index.BreadcrumbsDefinition, PropTypes__default.default.bool]),
412
- canCreate: PropTypes__default.default.bool.isRequired,
413
- folder: index.FolderDefinition,
414
- onToggleEditFolderDialog: PropTypes__default.default.func.isRequired,
415
- onToggleUploadAssetDialog: PropTypes__default.default.func.isRequired
416
- };
417
401
  const BoxWithHeight = styledComponents.styled(designSystem.Box)`
418
402
  height: 3.2rem;
419
403
  display: flex;
@@ -440,7 +424,7 @@ const MediaLibrary = () => {
440
424
  canConfigureView,
441
425
  isLoading: permissionsLoading
442
426
  } = index.useMediaLibraryPermissions();
443
- const currentFolderToEditRef = React.useRef();
427
+ const currentFolderToEditRef = React__namespace.useRef();
444
428
  const { formatMessage } = reactIntl.useIntl();
445
429
  const { pathname } = reactRouterDom.useLocation();
446
430
  const { trackUsage } = strapiAdmin.useTracking();
@@ -451,7 +435,7 @@ const MediaLibrary = () => {
451
435
  const {
452
436
  data: assetsData,
453
437
  isLoading: assetsLoading,
454
- errors: assetsError
438
+ error: assetsError
455
439
  } = index.useAssets({
456
440
  skipWhen: !canRead,
457
441
  query
@@ -459,7 +443,7 @@ const MediaLibrary = () => {
459
443
  const {
460
444
  data: foldersData,
461
445
  isLoading: foldersLoading,
462
- errors: foldersError
446
+ error: foldersError
463
447
  } = index.useFolders({
464
448
  enabled: canRead && assetsData?.pagination?.page === 1 && !index.containsAssetFilter(query),
465
449
  query
@@ -471,13 +455,16 @@ const MediaLibrary = () => {
471
455
  } = index.useFolder(query?.folder, {
472
456
  enabled: canRead && !!query?.folder
473
457
  });
474
- if (currentFolderError?.response?.status === 404) {
458
+ if (currentFolderError?.name === "NotFoundError") {
475
459
  navigate(pathname);
476
460
  }
477
461
  const folders = foldersData?.map((folder) => ({
478
462
  ...folder,
479
463
  type: "folder",
480
- folderURL: index.getFolderURL(pathname, query, folder.id),
464
+ folderURL: index.getFolderURL(pathname, query, {
465
+ folder: folder.id.toString(),
466
+ folderPath: folder.path
467
+ }),
481
468
  isSelectable: canUpdate
482
469
  })) ?? [];
483
470
  const folderCount = folders?.length || 0;
@@ -485,11 +472,14 @@ const MediaLibrary = () => {
485
472
  const assetCount = assets?.length ?? 0;
486
473
  const totalAssetCount = assetsData?.pagination?.total;
487
474
  const isLoading = isCurrentFolderLoading || foldersLoading || permissionsLoading || assetsLoading;
488
- const [showUploadAssetDialog, setShowUploadAssetDialog] = React.useState(false);
489
- const [showEditFolderDialog, setShowEditFolderDialog] = React.useState(false);
490
- const [assetToEdit, setAssetToEdit] = React.useState(void 0);
491
- const [folderToEdit, setFolderToEdit] = React.useState(void 0);
492
- 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
+ );
493
483
  const indeterminateBulkSelect = selected?.length > 0 && selected?.length !== assetCount + folderCount;
494
484
  const toggleUploadAssetDialog = () => setShowUploadAssetDialog((prev) => !prev);
495
485
  const toggleEditFolderDialog = ({ created = false } = {}) => {
@@ -526,7 +516,7 @@ const MediaLibrary = () => {
526
516
  }
527
517
  };
528
518
  const handleAssetDeleted = (numberOfAssets) => {
529
- 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) {
530
520
  setQuery({
531
521
  ...query,
532
522
  page: assetsData.pagination.page - 1
@@ -548,7 +538,10 @@ const MediaLibrary = () => {
548
538
  /* @__PURE__ */ jsxRuntime.jsx(
549
539
  Header,
550
540
  {
551
- breadcrumbs: !isCurrentFolderLoading && getBreadcrumbDataML(currentFolder, { pathname, query }),
541
+ breadcrumbs: !isCurrentFolderLoading ? getBreadcrumbDataML(currentFolder, {
542
+ pathname,
543
+ query
544
+ }) : null,
552
545
  canCreate,
553
546
  onToggleEditFolderDialog: toggleEditFolderDialog,
554
547
  onToggleUploadAssetDialog: toggleUploadAssetDialog,
@@ -652,7 +645,7 @@ const MediaLibrary = () => {
652
645
  folderCount,
653
646
  indeterminate: indeterminateBulkSelect,
654
647
  onChangeSort: handleChangeSort,
655
- onChangeFolder: (folderID, folderPath) => navigate(index.getFolderURL(pathname, query, { folder: folderID, folderPath })),
648
+ onChangeFolder: (folderID, folderPath) => navigate(index.getFolderURL(pathname, query, { folder: folderID.toString(), folderPath })),
656
649
  onEditAsset: setAssetToEdit,
657
650
  onEditFolder: handleEditFolder,
658
651
  onSelectOne: selectOne,
@@ -685,7 +678,7 @@ const MediaLibrary = () => {
685
678
  (currentFolder2) => currentFolder2.id === folder.id
686
679
  );
687
680
  const url = index.getFolderURL(pathname, query, {
688
- folder: folder?.id,
681
+ folder: folder?.id.toString(),
689
682
  folderPath: folder?.path
690
683
  });
691
684
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -701,7 +694,7 @@ const MediaLibrary = () => {
701
694
  ariaLabel: folder.name,
702
695
  id: `folder-${folder.id}`,
703
696
  to: url,
704
- startAction: selectOne && folder.isSelectable ? /* @__PURE__ */ jsxRuntime.jsx(
697
+ startAction: folder.isSelectable ? /* @__PURE__ */ jsxRuntime.jsx(
705
698
  FolderCardCheckbox,
706
699
  {
707
700
  "data-testid": `folder-checkbox-${folder.id}`,
@@ -712,7 +705,7 @@ const MediaLibrary = () => {
712
705
  cardActions: /* @__PURE__ */ jsxRuntime.jsx(
713
706
  designSystem.IconButton,
714
707
  {
715
- "aria-label": formatMessage({
708
+ label: formatMessage({
716
709
  id: index.getTrad("list.folder.edit"),
717
710
  defaultMessage: "Edit folder"
718
711
  }),
@@ -746,8 +739,8 @@ const MediaLibrary = () => {
746
739
  defaultMessage: "{folderCount, plural, =0 {# folder} one {# folder} other {# folders}}, {filesCount, plural, =0 {# asset} one {# asset} other {# assets}}"
747
740
  },
748
741
  {
749
- folderCount: folder.children.count,
750
- filesCount: folder.files.count
742
+ folderCount: folder.children?.count,
743
+ filesCount: folder.files?.count
751
744
  }
752
745
  )
753
746
  }
@@ -768,7 +761,9 @@ const MediaLibrary = () => {
768
761
  assets,
769
762
  onEditAsset: setAssetToEdit,
770
763
  onSelectAsset: selectOne,
771
- selectedAssets: selected.filter(({ type }) => type === "asset"),
764
+ selectedAssets: selected.filter(
765
+ ({ type }) => type === "asset"
766
+ ),
772
767
  title: (
773
768
  // Assets title should only appear if:
774
769
  // - user is not filtering
@@ -785,7 +780,7 @@ const MediaLibrary = () => {
785
780
  }
786
781
  )
787
782
  ] }),
788
- /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Pagination.Root, { ...assetsData.pagination, children: [
783
+ /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Pagination.Root, { ...assetsData?.pagination, children: [
789
784
  /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Pagination.PageSize, {}),
790
785
  /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Pagination.Links, {})
791
786
  ] })
@@ -804,7 +799,7 @@ const MediaLibrary = () => {
804
799
  index.EditFolderDialog,
805
800
  {
806
801
  open: showEditFolderDialog,
807
- onClose: handleEditFolderClose,
802
+ onClose: () => handleEditFolderClose(),
808
803
  folder: folderToEdit,
809
804
  parentFolderId: query?.folder,
810
805
  location: "upload"
@@ -829,7 +824,9 @@ const MediaLibrary = () => {
829
824
  )
830
825
  ] });
831
826
  };
832
- const ConfigureTheView = React.lazy(() => Promise.resolve().then(() => require("./index-BM9Ayh_r.js")));
827
+ const ConfigureTheView = React__namespace.lazy(
828
+ async () => Promise.resolve().then(() => require("./ConfigureTheView-fwDgErsi.js")).then((mod) => ({ default: mod.ConfigureTheView }))
829
+ );
833
830
  const Upload = () => {
834
831
  const {
835
832
  config: { isLoading, isError, data: config }
@@ -837,11 +834,15 @@ const Upload = () => {
837
834
  const [{ rawQuery }, setQuery] = strapiAdmin.useQueryParams();
838
835
  const { formatMessage } = reactIntl.useIntl();
839
836
  const title = formatMessage({ id: index.getTrad("plugin.name"), defaultMessage: "Media Library" });
840
- React.useEffect(() => {
837
+ React__namespace.useEffect(() => {
841
838
  if (isLoading || isError || rawQuery) {
842
839
  return;
843
840
  }
844
- setQuery({ sort: config.sort, page: 1, pageSize: config.pageSize });
841
+ setQuery({
842
+ sort: config.sort,
843
+ page: 1,
844
+ pageSize: config.pageSize
845
+ });
845
846
  }, [isLoading, isError, config, rawQuery, setQuery]);
846
847
  if (isLoading) {
847
848
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -849,10 +850,16 @@ const Upload = () => {
849
850
  /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Loading, {})
850
851
  ] });
851
852
  }
852
- 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: [
853
854
  /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Route, { index: true, element: /* @__PURE__ */ jsxRuntime.jsx(MediaLibrary, {}) }),
854
- /* @__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
+ )
855
862
  ] }) }) : null });
856
863
  };
857
- exports.default = Upload;
858
- //# sourceMappingURL=index-Bl2-6oC8.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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"}