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