@strapi/upload 5.0.0-beta.8 → 5.0.0-rc.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 (51) hide show
  1. package/LICENSE +18 -3
  2. package/dist/_chunks/{graphql-Beol7Y3b.js → graphql-DnH9sdRy.js} +2 -2
  3. package/dist/_chunks/{graphql-Beol7Y3b.js.map → graphql-DnH9sdRy.js.map} +1 -1
  4. package/dist/_chunks/{graphql-BVCZSNa2.mjs → graphql-_gnSn8ak.mjs} +2 -2
  5. package/dist/_chunks/{graphql-BVCZSNa2.mjs.map → graphql-_gnSn8ak.mjs.map} +1 -1
  6. package/dist/_chunks/{index-CpIJ-CJ3.mjs → index-B2H0mT-4.mjs} +7 -7
  7. package/dist/_chunks/index-B2H0mT-4.mjs.map +1 -0
  8. package/dist/_chunks/{index-B96Z3Gq6.js → index-B31omlmq.js} +10 -19
  9. package/dist/_chunks/index-B31omlmq.js.map +1 -0
  10. package/dist/_chunks/{index-TnbVQ0RI.mjs → index-BCY68yPX.mjs} +11 -20
  11. package/dist/_chunks/index-BCY68yPX.mjs.map +1 -0
  12. package/dist/_chunks/{index-C7nlFYgw.js → index-By7J3KhK.js} +414 -359
  13. package/dist/_chunks/index-By7J3KhK.js.map +1 -0
  14. package/dist/_chunks/{index-De1W-cb7.js → index-CMAvhamB.js} +6 -6
  15. package/dist/_chunks/index-CMAvhamB.js.map +1 -0
  16. package/dist/_chunks/{index-CjolPMop.mjs → index-DF-F15Un.mjs} +415 -360
  17. package/dist/_chunks/index-DF-F15Un.mjs.map +1 -0
  18. package/dist/_chunks/{index-CRhNpXFr.js → index-DNIvA1Nj.js} +85 -32
  19. package/dist/_chunks/index-DNIvA1Nj.js.map +1 -0
  20. package/dist/_chunks/{index-DwWG14v6.js → index-Dfhzzni3.js} +73 -85
  21. package/dist/_chunks/index-Dfhzzni3.js.map +1 -0
  22. package/dist/_chunks/{index-Bvg2llNU.mjs → index-REz0rm2a.mjs} +57 -87
  23. package/dist/_chunks/index-REz0rm2a.mjs.map +1 -0
  24. package/dist/_chunks/{index-VKvfSVC7.mjs → index-aW1eiyyQ.mjs} +85 -32
  25. package/dist/_chunks/index-aW1eiyyQ.mjs.map +1 -0
  26. package/dist/admin/index.js +1 -1
  27. package/dist/admin/index.mjs +1 -1
  28. package/dist/server/index.js +1 -1
  29. package/dist/server/index.mjs +1 -1
  30. package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
  31. package/dist/server/src/index.d.ts +1 -43
  32. package/dist/server/src/index.d.ts.map +1 -1
  33. package/dist/server/src/services/image-manipulation.d.ts +1 -43
  34. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  35. package/dist/server/src/services/index.d.ts +1 -43
  36. package/dist/server/src/services/index.d.ts.map +1 -1
  37. package/dist/server/src/services/provider.d.ts.map +1 -1
  38. package/dist/server/src/services/upload.d.ts.map +1 -1
  39. package/dist/server/src/types.d.ts +2 -0
  40. package/dist/server/src/types.d.ts.map +1 -1
  41. package/package.json +8 -8
  42. package/dist/_chunks/index-B96Z3Gq6.js.map +0 -1
  43. package/dist/_chunks/index-Bvg2llNU.mjs.map +0 -1
  44. package/dist/_chunks/index-C7nlFYgw.js.map +0 -1
  45. package/dist/_chunks/index-CRhNpXFr.js.map +0 -1
  46. package/dist/_chunks/index-CjolPMop.mjs.map +0 -1
  47. package/dist/_chunks/index-CpIJ-CJ3.mjs.map +0 -1
  48. package/dist/_chunks/index-De1W-cb7.js.map +0 -1
  49. package/dist/_chunks/index-DwWG14v6.js.map +0 -1
  50. package/dist/_chunks/index-TnbVQ0RI.mjs.map +0 -1
  51. package/dist/_chunks/index-VKvfSVC7.mjs.map +0 -1
@@ -1,13 +1,14 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import * as React from "react";
2
3
  import { useState, useRef, lazy, useEffect, Suspense } from "react";
3
4
  import { ConfirmDialog, useNotification, useFetchClient, useTracking, useQueryParams, Layouts, Page, SearchInput, Pagination } from "@strapi/admin/strapi-admin";
4
5
  import { useIntl } from "react-intl";
5
- import { useLocation, useNavigate, Link as Link$1, Routes, Route } from "react-router-dom";
6
- import { g as getTrad, a as getFolderURL, u as useFolderCard, A as AssetDefinition, F as FolderDefinition, b as useBulkRemove, p as pluginId, c as useFolderStructure, S as SelectTree, n as normalizeAPIError, E as EmptyAssets, d as FilterPopover, e as displayedFilters, f as FilterList, B as BreadcrumbsDefinition, h as Breadcrumbs, i as useMediaLibraryPermissions, j as usePersistentState, v as viewOptions, l as localStorageKeys, k as useAssets, m as useFolders, o as containsAssetFilter, q as useFolder, r as useSelectionState, s as SortPicker, T as TableList, t as FolderGridList, w as FolderCard, x as FolderCardBody, y as FolderCardBodyAction, z as AssetGridList, U as UploadAssetDialog, C as EditFolderDialog, D as EditAssetDialog, G as useConfig } from "./index-CjolPMop.mjs";
6
+ import { useLocation, NavLink, useNavigate, Link as Link$1, Routes, Route } from "react-router-dom";
7
+ import { g as getTrad, a as getFolderURL, u as useFolderCard, A as AssetDefinition, F as FolderDefinition, b as useBulkRemove, p as pluginId, c as useFolderStructure, S as SelectTree, n as normalizeAPIError, E as EmptyAssets, d as FilterPopover, e as displayedFilters, f as FilterList, B as BreadcrumbsDefinition, h as Breadcrumbs, i as useMediaLibraryPermissions, j as usePersistentState, v as viewOptions, l as localStorageKeys, k as useAssets, m as useFolders, o as containsAssetFilter, q as useFolder, r as useSelectionState, s as SortPicker, T as TableList, t as FolderGridList, w as FolderCard, x as FolderCardBody, y as FolderCardBodyAction, z as AssetGridList, U as UploadAssetDialog, C as EditFolderDialog, D as EditAssetDialog, G as useConfig } from "./index-DF-F15Un.mjs";
7
8
  import "byte-size";
8
9
  import "date-fns";
9
10
  import { stringify } from "qs";
10
- import { Box, BaseCheckbox, Button, ModalLayout, ModalBody, Flex, Loader, ModalHeader, Typography, Grid, GridItem, Field, ModalFooter, Link, IconButton, VisuallyHidden, Divider } from "@strapi/design-system";
11
+ import { Box, Checkbox, Dialog, Button, Modal, Flex, Loader, Grid, Field, Typography, Popover, Link, IconButton, VisuallyHidden, Divider } from "@strapi/design-system";
11
12
  import { Trash, Folder, Plus, Filter, ArrowLeft, Cog, List, GridFour, Pencil } from "@strapi/icons";
12
13
  import { styled } from "styled-components";
13
14
  import PropTypes from "prop-types";
@@ -46,35 +47,18 @@ const getBreadcrumbDataML = (folder, { pathname, query }) => {
46
47
  };
47
48
  const FolderCardCheckbox = (props) => {
48
49
  const { id } = useFolderCard();
49
- return /* @__PURE__ */ jsx(Box, { position: "relative", zIndex: 2, children: /* @__PURE__ */ jsx(BaseCheckbox, { "aria-labelledby": `${id}-title`, ...props }) });
50
+ return /* @__PURE__ */ jsx(Box, { position: "relative", zIndex: 2, children: /* @__PURE__ */ jsx(Checkbox, { "aria-labelledby": `${id}-title`, ...props }) });
50
51
  };
51
52
  const BulkDeleteButton = ({ selected, onSuccess }) => {
52
53
  const { formatMessage } = useIntl();
53
- const [showConfirmDialog, setShowConfirmDialog] = useState(false);
54
54
  const { remove } = useBulkRemove();
55
55
  const handleConfirmRemove = async () => {
56
56
  await remove(selected);
57
57
  onSuccess();
58
58
  };
59
- return /* @__PURE__ */ jsxs(Fragment, { children: [
60
- /* @__PURE__ */ jsx(
61
- Button,
62
- {
63
- variant: "danger-light",
64
- size: "S",
65
- startIcon: /* @__PURE__ */ jsx(Trash, {}),
66
- onClick: () => setShowConfirmDialog(true),
67
- children: formatMessage({ id: "global.delete", defaultMessage: "Delete" })
68
- }
69
- ),
70
- /* @__PURE__ */ jsx(
71
- ConfirmDialog,
72
- {
73
- isOpen: showConfirmDialog,
74
- onClose: () => setShowConfirmDialog(false),
75
- onConfirm: handleConfirmRemove
76
- }
77
- )
59
+ return /* @__PURE__ */ jsxs(Dialog.Root, { children: [
60
+ /* @__PURE__ */ jsx(Dialog.Trigger, { children: /* @__PURE__ */ jsx(Button, { variant: "danger-light", size: "S", startIcon: /* @__PURE__ */ jsx(Trash, {}), children: formatMessage({ id: "global.delete", defaultMessage: "Delete" }) }) }),
61
+ /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleConfirmRemove })
78
62
  ] });
79
63
  };
80
64
  BulkDeleteButton.propTypes = {
@@ -142,11 +126,8 @@ const BulkMoveDialog = ({ onClose, selected, currentFolder }) => {
142
126
  }
143
127
  }
144
128
  };
145
- const handleClose = () => {
146
- onClose();
147
- };
148
129
  if (isLoading) {
149
- return /* @__PURE__ */ jsx(ModalLayout, { onClose: handleClose, labelledBy: "title", children: /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "center", paddingTop: 4, paddingBottom: 4, children: /* @__PURE__ */ jsx(Loader, { children: formatMessage({
130
+ return /* @__PURE__ */ jsx(Modal.Content, { children: /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "center", paddingTop: 4, paddingBottom: 4, children: /* @__PURE__ */ jsx(Loader, { children: formatMessage({
150
131
  id: getTrad("content.isLoading"),
151
132
  defaultMessage: "Content is loading."
152
133
  }) }) }) }) });
@@ -157,12 +138,12 @@ const BulkMoveDialog = ({ onClose, selected, currentFolder }) => {
157
138
  label: currentFolder?.name || folderStructure[0].label
158
139
  }
159
140
  };
160
- return /* @__PURE__ */ jsx(ModalLayout, { onClose: handleClose, labelledBy: "title", children: /* @__PURE__ */ jsx(Formik, { validateOnChange: false, onSubmit: handleSubmit, initialValues: initialFormData, children: ({ values, errors, setFieldValue }) => /* @__PURE__ */ jsxs(Form, { noValidate: true, children: [
161
- /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", textColor: "neutral800", tag: "h2", id: "title", children: formatMessage({
141
+ return /* @__PURE__ */ jsx(Modal.Content, { children: /* @__PURE__ */ jsx(Formik, { validateOnChange: false, onSubmit: handleSubmit, initialValues: initialFormData, children: ({ values, errors, setFieldValue }) => /* @__PURE__ */ jsxs(Form, { noValidate: true, children: [
142
+ /* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Modal.Title, { children: formatMessage({
162
143
  id: getTrad("modal.folder.move.title"),
163
144
  defaultMessage: "Move elements to"
164
145
  }) }) }),
165
- /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsx(Grid, { gap: 4, children: /* @__PURE__ */ jsx(GridItem, { xs: 12, col: 12, children: /* @__PURE__ */ jsxs(Field.Root, { id: "folder-destination", children: [
146
+ /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: /* @__PURE__ */ jsx(Grid.Item, { xs: 12, col: 12, children: /* @__PURE__ */ jsxs(Field.Root, { id: "folder-destination", children: [
166
147
  /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
167
148
  id: getTrad("form.input.label.folder-location"),
168
149
  defaultMessage: "Location"
@@ -184,22 +165,20 @@ const BulkMoveDialog = ({ onClose, selected, currentFolder }) => {
184
165
  ),
185
166
  errors.destination && /* @__PURE__ */ jsx(Typography, { variant: "pi", tag: "p", textColor: "danger600", children: errors.destination })
186
167
  ] }) }) }) }),
187
- /* @__PURE__ */ jsx(
188
- ModalFooter,
189
- {
190
- startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }),
191
- endActions: /* @__PURE__ */ jsx(Button, { type: "submit", loading: isLoading, children: formatMessage({ id: "modal.folder.move.submit", defaultMessage: "Move" }) })
192
- }
193
- )
168
+ /* @__PURE__ */ jsxs(Modal.Footer, { children: [
169
+ /* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }) }),
170
+ /* @__PURE__ */ jsx(Button, { type: "submit", loading: isLoading, children: formatMessage({ id: "modal.folder.move.submit", defaultMessage: "Move" }) })
171
+ ] })
194
172
  ] }) }) });
195
173
  };
196
174
  BulkMoveDialog.defaultProps = {
197
- currentFolder: void 0
175
+ currentFolder: void 0,
176
+ selected: []
198
177
  };
199
178
  BulkMoveDialog.propTypes = {
200
179
  onClose: PropTypes.func.isRequired,
201
180
  currentFolder: FolderDefinition,
202
- selected: PropTypes.arrayOf(FolderDefinition, AssetDefinition).isRequired
181
+ selected: PropTypes.arrayOf(FolderDefinition, AssetDefinition)
203
182
  };
204
183
  const BulkMoveButton = ({ selected, onSuccess, currentFolder }) => {
205
184
  const { formatMessage } = useIntl();
@@ -208,18 +187,9 @@ const BulkMoveButton = ({ selected, onSuccess, currentFolder }) => {
208
187
  setShowConfirmDialog(false);
209
188
  onSuccess();
210
189
  };
211
- return /* @__PURE__ */ jsxs(Fragment, { children: [
190
+ return /* @__PURE__ */ jsxs(Modal.Root, { open: showConfirmDialog, onOpenChange: setShowConfirmDialog, children: [
191
+ /* @__PURE__ */ jsx(Modal.Trigger, { children: /* @__PURE__ */ jsx(Button, { variant: "secondary", size: "S", startIcon: /* @__PURE__ */ jsx(Folder, {}), children: formatMessage({ id: "global.move", defaultMessage: "Move" }) }) }),
212
192
  /* @__PURE__ */ jsx(
213
- Button,
214
- {
215
- variant: "secondary",
216
- size: "S",
217
- startIcon: /* @__PURE__ */ jsx(Folder, {}),
218
- onClick: () => setShowConfirmDialog(true),
219
- children: formatMessage({ id: "global.move", defaultMessage: "Move" })
220
- }
221
- ),
222
- showConfirmDialog && /* @__PURE__ */ jsx(
223
193
  BulkMoveDialog,
224
194
  {
225
195
  currentFolder,
@@ -230,12 +200,13 @@ const BulkMoveButton = ({ selected, onSuccess, currentFolder }) => {
230
200
  ] });
231
201
  };
232
202
  BulkMoveButton.defaultProps = {
233
- currentFolder: void 0
203
+ currentFolder: void 0,
204
+ selected: []
234
205
  };
235
206
  BulkMoveButton.propTypes = {
236
207
  onSuccess: PropTypes.func.isRequired,
237
208
  currentFolder: FolderDefinition,
238
- selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition).isRequired
209
+ selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition)
239
210
  };
240
211
  const BulkActions = ({ selected, onSuccess, currentFolder }) => {
241
212
  const { formatMessage } = useIntl();
@@ -255,12 +226,13 @@ const BulkActions = ({ selected, onSuccess, currentFolder }) => {
255
226
  ] });
256
227
  };
257
228
  BulkActions.defaultProps = {
258
- currentFolder: void 0
229
+ currentFolder: void 0,
230
+ selected: []
259
231
  };
260
232
  BulkActions.propTypes = {
261
233
  onSuccess: PropTypes.func.isRequired,
262
234
  currentFolder: FolderDefinition,
263
- selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition).isRequired
235
+ selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition)
264
236
  };
265
237
  const getContentIntlMessage = ({ isFiltering, canCreate, canRead }) => {
266
238
  if (isFiltering) {
@@ -311,13 +283,11 @@ EmptyOrNoPermissions.propTypes = {
311
283
  onActionClick: PropTypes.func.isRequired
312
284
  };
313
285
  const Filters = () => {
314
- const buttonRef = useRef(null);
315
- const [isVisible, setVisible] = useState(false);
286
+ const [open, setOpen] = React.useState(false);
316
287
  const { formatMessage } = useIntl();
317
288
  const { trackUsage } = useTracking();
318
289
  const [{ query }, setQuery] = useQueryParams();
319
290
  const filters = query?.filters?.$and || [];
320
- const toggleFilter = () => setVisible((prev) => !prev);
321
291
  const handleRemoveFilter = (nextFilters) => {
322
292
  setQuery({ filters: { $and: nextFilters }, page: 1 });
323
293
  };
@@ -328,26 +298,15 @@ const Filters = () => {
328
298
  });
329
299
  setQuery({ filters: { $and: filters2 }, page: 1 });
330
300
  };
331
- return /* @__PURE__ */ jsxs(Fragment, { children: [
301
+ return /* @__PURE__ */ jsxs(Popover.Root, { open, onOpenChange: setOpen, children: [
302
+ /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", startIcon: /* @__PURE__ */ jsx(Filter, {}), size: "S", children: formatMessage({ id: "app.utils.filters", defaultMessage: "Filters" }) }) }),
332
303
  /* @__PURE__ */ jsx(
333
- Button,
334
- {
335
- variant: "tertiary",
336
- ref: buttonRef,
337
- startIcon: /* @__PURE__ */ jsx(Filter, {}),
338
- onClick: toggleFilter,
339
- size: "S",
340
- children: formatMessage({ id: "app.utils.filters", defaultMessage: "Filters" })
341
- }
342
- ),
343
- isVisible && /* @__PURE__ */ jsx(
344
304
  FilterPopover,
345
305
  {
346
306
  displayedFilters,
347
307
  filters,
348
308
  onSubmit: handleSubmit,
349
- onToggle: toggleFilter,
350
- source: buttonRef
309
+ onToggle: setOpen
351
310
  }
352
311
  ),
353
312
  /* @__PURE__ */ jsx(
@@ -397,6 +356,7 @@ const Header = ({
397
356
  navigationAction: folder && /* @__PURE__ */ jsx(
398
357
  Link,
399
358
  {
359
+ tag: NavLink,
400
360
  startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}),
401
361
  to: `${pathname}?${stringify(backQuery, { encode: false })}`,
402
362
  children: formatMessage({
@@ -516,8 +476,8 @@ const MediaLibrary = () => {
516
476
  }
517
477
  setShowEditFolderDialog((prev) => !prev);
518
478
  };
519
- const handleBulkSelect = (event, elements) => {
520
- if (event.target.checked) {
479
+ const handleBulkSelect = (checked, elements) => {
480
+ if (checked) {
521
481
  trackUsage("didSelectAllMediaLibraryElements");
522
482
  }
523
483
  selectAll(elements);
@@ -583,15 +543,14 @@ const MediaLibrary = () => {
583
543
  hasRadius: true,
584
544
  borderColor: "neutral200",
585
545
  children: /* @__PURE__ */ jsx(
586
- BaseCheckbox,
546
+ Checkbox,
587
547
  {
588
548
  "aria-label": formatMessage({
589
549
  id: getTrad("bulk.select.label"),
590
550
  defaultMessage: "Select all folders & assets"
591
551
  }),
592
- indeterminate: indeterminateBulkSelect,
593
- value: (assetCount > 0 || folderCount > 0) && selected.length === assetCount + folderCount,
594
- onChange: (e) => handleBulkSelect(e, [...assets, ...folders])
552
+ checked: indeterminateBulkSelect ? "indeterminate" : (assetCount > 0 || folderCount > 0) && selected.length === assetCount + folderCount,
553
+ onCheckedChange: (e) => handleBulkSelect(e, [...assets, ...folders])
595
554
  }
596
555
  )
597
556
  }
@@ -704,7 +663,7 @@ const MediaLibrary = () => {
704
663
  folder: folder?.id,
705
664
  folderPath: folder?.path
706
665
  });
707
- return /* @__PURE__ */ jsx(GridItem, { col: 3, children: /* @__PURE__ */ jsx(
666
+ return /* @__PURE__ */ jsx(Grid.Item, { col: 3, children: /* @__PURE__ */ jsx(
708
667
  FolderCard,
709
668
  {
710
669
  ref: folderToEdit && folder.id === folderToEdit.id ? currentFolderToEditRef : void 0,
@@ -715,8 +674,8 @@ const MediaLibrary = () => {
715
674
  FolderCardCheckbox,
716
675
  {
717
676
  "data-testid": `folder-checkbox-${folder.id}`,
718
- value: isSelected,
719
- onChange: () => selectOne(folder)
677
+ checked: isSelected,
678
+ onCheckedChange: () => selectOne(folder)
720
679
  }
721
680
  ) : null,
722
681
  cardActions: /* @__PURE__ */ jsx(
@@ -731,10 +690,18 @@ const MediaLibrary = () => {
731
690
  }
732
691
  ),
733
692
  children: /* @__PURE__ */ jsx(FolderCardBody, { children: /* @__PURE__ */ jsx(FolderCardBodyAction, { to: url, children: /* @__PURE__ */ jsxs(Flex, { tag: "h2", direction: "column", alignItems: "start", maxWidth: "100%", children: [
734
- /* @__PURE__ */ jsxs(TypographyMaxWidth, { fontWeight: "semiBold", ellipsis: true, children: [
735
- folder.name,
736
- /* @__PURE__ */ jsx(VisuallyHidden, { children: ":" })
737
- ] }),
693
+ /* @__PURE__ */ jsxs(
694
+ TypographyMaxWidth,
695
+ {
696
+ fontWeight: "semiBold",
697
+ textColor: "neutral800",
698
+ ellipsis: true,
699
+ children: [
700
+ folder.name,
701
+ /* @__PURE__ */ jsx(VisuallyHidden, { children: ":" })
702
+ ]
703
+ }
704
+ ),
738
705
  /* @__PURE__ */ jsx(
739
706
  TypographyMaxWidth,
740
707
  {
@@ -793,6 +760,7 @@ const MediaLibrary = () => {
793
760
  showUploadAssetDialog && /* @__PURE__ */ jsx(
794
761
  UploadAssetDialog,
795
762
  {
763
+ open: showUploadAssetDialog,
796
764
  onClose: toggleUploadAssetDialog,
797
765
  trackedLocation: "upload",
798
766
  folderId: query?.folder
@@ -801,6 +769,7 @@ const MediaLibrary = () => {
801
769
  showEditFolderDialog && /* @__PURE__ */ jsx(
802
770
  EditFolderDialog,
803
771
  {
772
+ open: showEditFolderDialog,
804
773
  onClose: handleEditFolderClose,
805
774
  folder: folderToEdit,
806
775
  parentFolderId: query?.folder,
@@ -816,6 +785,7 @@ const MediaLibrary = () => {
816
785
  }
817
786
  setAssetToEdit(void 0);
818
787
  },
788
+ open: !!assetToEdit,
819
789
  asset: assetToEdit,
820
790
  canUpdate,
821
791
  canCopyLink,
@@ -825,7 +795,7 @@ const MediaLibrary = () => {
825
795
  )
826
796
  ] });
827
797
  };
828
- const ConfigureTheView = lazy(() => import("./index-TnbVQ0RI.mjs"));
798
+ const ConfigureTheView = lazy(() => import("./index-BCY68yPX.mjs"));
829
799
  const Upload = () => {
830
800
  const {
831
801
  config: { isLoading, isError, data: config }
@@ -853,4 +823,4 @@ const Upload = () => {
853
823
  export {
854
824
  Upload as default
855
825
  };
856
- //# sourceMappingURL=index-Bvg2llNU.mjs.map
826
+ //# sourceMappingURL=index-REz0rm2a.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-REz0rm2a.mjs","sources":["../../admin/src/utils/getBreadcrumbDataML.js","../../admin/src/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.jsx","../../admin/src/pages/App/MediaLibrary/components/BulkDeleteButton.jsx","../../admin/src/hooks/useBulkMove.js","../../admin/src/components/BulkMoveDialog/BulkMoveDialog.jsx","../../admin/src/pages/App/MediaLibrary/components/BulkMoveButton.jsx","../../admin/src/pages/App/MediaLibrary/components/BulkActions.jsx","../../admin/src/pages/App/MediaLibrary/components/EmptyOrNoPermissions.jsx","../../admin/src/pages/App/MediaLibrary/components/Filters.jsx","../../admin/src/pages/App/MediaLibrary/components/Header.jsx","../../admin/src/pages/App/MediaLibrary/index.jsx","../../admin/src/pages/App/index.jsx"],"sourcesContent":["import getFolderURL from './getFolderURL';\nimport getTrad from './getTrad';\n\nconst getBreadcrumbDataML = (folder, { pathname, query }) => {\n let data = [\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?.parent) {\n data.push([]);\n }\n\n if (folder?.parent) {\n data.push({\n id: folder.parent.id,\n label: folder.parent.name,\n href: getFolderURL(pathname, query, {\n folder: folder.parent.id,\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\nexport default getBreadcrumbDataML;\n","import React from 'react';\n\nimport { Checkbox, Box } from '@strapi/design-system';\n\nimport { useFolderCard } from '../contexts/FolderCard';\n\nexport const FolderCardCheckbox = (props) => {\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 * as React from 'react';\n\nimport { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport { Button, Dialog } from '@strapi/design-system';\nimport { Trash } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { AssetDefinition, FolderDefinition } from '../../../../constants';\nimport { useBulkRemove } from '../../../../hooks/useBulkRemove';\n\nexport const BulkDeleteButton = ({ selected, onSuccess }) => {\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\nBulkDeleteButton.propTypes = {\n selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition).isRequired,\n onSuccess: PropTypes.func.isRequired,\n};\n","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport pluginId from '../pluginId';\nimport { getTrad } from '../utils';\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 }) => {\n const payload = filesAndFolders.reduce((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(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 = (destinationFolderId, filesAndFolders) =>\n mutation.mutateAsync({ destinationFolderId, filesAndFolders });\n\n return { ...mutation, move };\n};\n","import React from 'react';\n\nimport { Button, Flex, Grid, Field, Loader, Modal, Typography } from '@strapi/design-system';\nimport { Form, Formik } from 'formik';\nimport isEmpty from 'lodash/isEmpty';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { AssetDefinition, FolderDefinition } from '../../constants';\nimport { useBulkMove } from '../../hooks/useBulkMove';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getTrad } from '../../utils';\nimport { normalizeAPIError } from '../../utils/normalizeAPIError';\nimport SelectTree from '../SelectTree';\n\nexport const BulkMoveDialog = ({ onClose, selected, currentFolder }) => {\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 (values, { setErrors }) => {\n try {\n await move(values.destination.value, selected);\n onClose();\n } catch (error) {\n const normalizedError = normalizeAPIError(error);\n\n const formikErrors = normalizedError.errors.reduce((acc, error) => {\n acc[error.values?.path?.length || 'destination'] = error.defaultMessage;\n\n return acc;\n }, {});\n\n if (!isEmpty(formikErrors)) {\n setErrors(formikErrors);\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 = {\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}>\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}\n onChange={(value) => {\n setFieldValue('destination', value);\n }}\n defaultValue={values.destination}\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\nBulkMoveDialog.defaultProps = {\n currentFolder: undefined,\n selected: [],\n};\n\nBulkMoveDialog.propTypes = {\n onClose: PropTypes.func.isRequired,\n currentFolder: FolderDefinition,\n selected: PropTypes.arrayOf(FolderDefinition, AssetDefinition),\n};\n","import React, { useState } from 'react';\n\nimport { Button, Modal } from '@strapi/design-system';\nimport { Folder } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { BulkMoveDialog } from '../../../../components/BulkMoveDialog';\nimport { AssetDefinition, FolderDefinition } from '../../../../constants';\n\nexport const BulkMoveButton = ({ selected, onSuccess, currentFolder }) => {\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = 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\nBulkMoveButton.defaultProps = {\n currentFolder: undefined,\n selected: [],\n};\n\nBulkMoveButton.propTypes = {\n onSuccess: PropTypes.func.isRequired,\n currentFolder: FolderDefinition,\n selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition),\n};\n","import React from 'react';\n\nimport { Flex, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { AssetDefinition, FolderDefinition } from '../../../../constants';\nimport getTrad from '../../../../utils/getTrad';\n\nimport { BulkDeleteButton } from './BulkDeleteButton';\nimport { BulkMoveButton } from './BulkMoveButton';\n\nexport const BulkActions = ({ selected, onSuccess, currentFolder }) => {\n const { formatMessage } = useIntl();\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: selected.filter(({ type }) => type === 'asset').length,\n }\n )}\n </Typography>\n\n <BulkDeleteButton selected={selected} onSuccess={onSuccess} />\n <BulkMoveButton currentFolder={currentFolder} selected={selected} onSuccess={onSuccess} />\n </Flex>\n );\n};\n\nBulkActions.defaultProps = {\n currentFolder: undefined,\n selected: [],\n};\n\nBulkActions.propTypes = {\n onSuccess: PropTypes.func.isRequired,\n currentFolder: FolderDefinition,\n selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition),\n};\n","import React from 'react';\n\nimport { Button } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyPermissions } from '@strapi/icons/symbols';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { EmptyAssets } from '../../../../components/EmptyAssets';\nimport { getTrad } from '../../../../utils';\n\nconst getContentIntlMessage = ({ isFiltering, canCreate, canRead }) => {\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 = ({ canCreate, isFiltering, canRead, onActionClick }) => {\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\nEmptyOrNoPermissions.propTypes = {\n canCreate: PropTypes.bool.isRequired,\n canRead: PropTypes.bool.isRequired,\n isFiltering: PropTypes.bool.isRequired,\n onActionClick: PropTypes.func.isRequired,\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';\nimport FilterPopover from '../../../../components/FilterPopover';\nimport displayedFilters from '../../../../utils/displayedFilters';\n\nexport const Filters = () => {\n const [open, setOpen] = React.useState(false);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams();\n const filters = query?.filters?.$and || [];\n\n const handleRemoveFilter = (nextFilters) => {\n setQuery({ filters: { $and: nextFilters }, page: 1 });\n };\n\n const handleSubmit = (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 });\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}\n />\n <FilterList\n appliedFilters={filters}\n filtersSchema={displayedFilters}\n onRemoveFilter={handleRemoveFilter}\n />\n </Popover.Root>\n );\n};\n","import React from 'react';\n\nimport { useQueryParams, Layouts } from '@strapi/admin/strapi-admin';\nimport { Button, Flex, Link } from '@strapi/design-system';\nimport { ArrowLeft, Plus } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useLocation, NavLink } from 'react-router-dom';\n\nimport { Breadcrumbs } from '../../../../components/Breadcrumbs';\nimport { BreadcrumbsDefinition, FolderDefinition } from '../../../../constants';\nimport { getTrad } from '../../../../utils';\n\nexport const Header = ({\n breadcrumbs,\n canCreate,\n folder,\n onToggleEditFolderDialog,\n onToggleUploadAssetDialog,\n}) => {\n const { formatMessage } = useIntl();\n const { pathname } = useLocation();\n const [{ query }] = useQueryParams();\n const backQuery = {\n ...query,\n folder: folder?.parent?.id ?? undefined,\n folderPath: folder?.parent?.path ?? 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 folder && (\n <Breadcrumbs\n tag=\"nav\"\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\nHeader.defaultProps = {\n breadcrumbs: false,\n folder: null,\n};\n\nHeader.propTypes = {\n breadcrumbs: PropTypes.oneOfType([BreadcrumbsDefinition, PropTypes.bool]),\n canCreate: PropTypes.bool.isRequired,\n folder: FolderDefinition,\n onToggleEditFolderDialog: PropTypes.func.isRequired,\n onToggleUploadAssetDialog: PropTypes.func.isRequired,\n};\n","import React, { useRef, useState } 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';\nimport { EditAssetDialog } from '../../../components/EditAssetDialog';\nimport { EditFolderDialog } from '../../../components/EditFolderDialog';\nimport {\n FolderCard,\n FolderCardBody,\n FolderCardBodyAction,\n FolderCardCheckbox,\n} from '../../../components/FolderCard';\nimport { FolderGridList } from '../../../components/FolderGridList';\nimport SortPicker from '../../../components/SortPicker';\nimport { TableList } from '../../../components/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\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 = useRef();\n const { formatMessage } = useIntl();\n const { pathname } = useLocation();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams();\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 errors: assetsError,\n } = useAssets({\n skipWhen: !canRead,\n query,\n });\n\n const {\n data: foldersData,\n isLoading: foldersLoading,\n errors: 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, {\n enabled: canRead && !!query?.folder,\n });\n\n // Folder was not found: redirect to the media library root\n if (currentFolderError?.response?.status === 404) {\n navigate(pathname);\n }\n\n const folders =\n foldersData?.map((folder) => ({\n ...folder,\n type: 'folder',\n folderURL: getFolderURL(pathname, query, folder.id),\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] = useState(false);\n const [showEditFolderDialog, setShowEditFolderDialog] = useState(false);\n const [assetToEdit, setAssetToEdit] = useState(undefined);\n const [folderToEdit, setFolderToEdit] = useState(undefined);\n const [selected, { selectOne, selectAll }] = useSelectionState(['type', 'id'], []);\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 = (checked, elements) => {\n if (checked) {\n trackUsage('didSelectAllMediaLibraryElements');\n }\n\n selectAll(elements);\n };\n\n const handleChangeSort = (value) => {\n trackUsage('didSortMediaLibraryElements', {\n location: 'upload',\n sort: value,\n });\n setQuery({ sort: value });\n };\n\n const handleEditFolder = (folder) => {\n setFolderToEdit(folder);\n setShowEditFolderDialog(true);\n };\n\n const handleEditFolderClose = (payload) => {\n setFolderToEdit(null);\n toggleEditFolderDialog(payload);\n\n if (currentFolderToEditRef.current) {\n currentFolderToEditRef.current.focus();\n }\n };\n\n const handleAssetDeleted = (numberOfAssets) => {\n if (\n numberOfAssets === assetCount &&\n assetsData.pagination.page === assetsData.pagination.pageCount &&\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 && getBreadcrumbDataML(currentFolder, { pathname, query })\n }\n canCreate={canCreate}\n onToggleEditFolderDialog={toggleEditFolderDialog}\n onToggleUploadAssetDialog={toggleUploadAssetDialog}\n folder={currentFolder}\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) => handleBulkSelect(e, [...assets, ...folders])}\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}\n selected={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, folderPath }))\n }\n onEditAsset={setAssetToEdit}\n onEditFolder={handleEditFolder}\n onSelectOne={selectOne}\n onSelectAll={handleBulkSelect}\n rows={[...folders, ...assets]}\n selected={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,\n folderPath: folder?.path,\n });\n\n return (\n <Grid.Item col={3} key={`folder-${folder.id}`}>\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 selectOne && 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 aria-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.children.count,\n filesCount: folder.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}\n onSelectAsset={selectOne}\n selectedAssets={selected.filter(({ type }) => type === 'asset')}\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}\n />\n )}\n {showEditFolderDialog && (\n <EditFolderDialog\n open={showEditFolderDialog}\n onClose={handleEditFolderClose}\n folder={folderToEdit}\n parentFolderId={query?.folder}\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","import React, { lazy, Suspense, useEffect } 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';\n\nconst ConfigureTheView = lazy(() => import('./ConfigureTheView'));\n\nconst Upload = () => {\n const {\n config: { isLoading, isError, data: config },\n } = useConfig();\n\n const [{ rawQuery }, setQuery] = useQueryParams();\n const { formatMessage } = useIntl();\n const title = formatMessage({ id: getTrad('plugin.name'), defaultMessage: 'Media Library' });\n\n useEffect(() => {\n if (isLoading || isError || rawQuery) {\n return;\n }\n setQuery({ sort: config.sort, page: 1, pageSize: config.pageSize });\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 <Suspense fallback={<Page.Loading />}>\n <Routes>\n <Route index element={<MediaLibrary />} />\n <Route path=\"configuration\" element={<ConfigureTheView config={config} />} />\n </Routes>\n </Suspense>\n ) : null}\n </Page.Main>\n );\n};\n\nexport default Upload;\n"],"names":["error","filters","ReactRouterLink","GridIcon","currentFolder"],"mappings":"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"}