@strapi/upload 5.3.0 → 5.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{index-DCAQ4hHN.mjs → App-D1ayH-QS.mjs} +94 -87
- package/dist/_chunks/App-D1ayH-QS.mjs.map +1 -0
- package/dist/_chunks/{index-Bl2-6oC8.js → App-Dqqn78jO.js} +94 -87
- package/dist/_chunks/App-Dqqn78jO.js.map +1 -0
- package/dist/_chunks/{index-C_cWV2yS.mjs → ConfigureTheView-B2Syy3q5.mjs} +24 -23
- package/dist/_chunks/ConfigureTheView-B2Syy3q5.mjs.map +1 -0
- package/dist/_chunks/{index-BM9Ayh_r.js → ConfigureTheView-fwDgErsi.js} +42 -23
- package/dist/_chunks/ConfigureTheView-fwDgErsi.js.map +1 -0
- package/dist/_chunks/{index-BWIqjWzC.mjs → SettingsPage-BYC3ism8.mjs} +45 -43
- package/dist/_chunks/SettingsPage-BYC3ism8.mjs.map +1 -0
- package/dist/_chunks/{index-C1MSWEyZ.js → SettingsPage-oDEVs3XV.js} +61 -41
- package/dist/_chunks/SettingsPage-oDEVs3XV.js.map +1 -0
- package/dist/_chunks/{index-YwynuEzj.js → index-B7NW5XiM.js} +115 -211
- package/dist/_chunks/index-B7NW5XiM.js.map +1 -0
- package/dist/_chunks/{index-BwEfHu6y.mjs → index-Clesg6BA.mjs} +138 -233
- 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/AssetCardBase.d.ts +1 -1
- package/dist/admin/src/components/AssetCard/UploadingAssetCard.d.ts +1 -1
- package/dist/admin/src/components/AssetCard/VideoPreview.d.ts +1 -1
- package/dist/admin/src/components/AssetDialog/BrowseStep/{index.d.ts → BrowseStep.d.ts} +1 -1
- package/dist/admin/src/components/AssetDialog/BrowseStep/PageSize.d.ts +2 -2
- package/dist/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.d.ts +4 -0
- package/dist/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.d.ts +9 -0
- package/dist/admin/src/components/AssetDialog/BrowseStep/SearchAsset/{index.d.ts → SearchAsset.d.ts} +2 -2
- package/dist/admin/src/components/AssetGridList/{index.d.ts → AssetGridList.d.ts} +1 -2
- package/dist/admin/src/components/Breadcrumbs/Breadcrumbs.d.ts +1 -2
- package/dist/admin/src/components/EditFolderDialog/EditFolderDialog.d.ts +3 -1
- package/dist/admin/src/components/EditFolderDialog/RemoveFolderDialog.d.ts +1 -1
- package/dist/admin/src/components/FilterList/{index.d.ts → FilterList.d.ts} +3 -3
- package/dist/admin/src/components/FilterList/FilterTag.d.ts +3 -3
- package/dist/admin/src/components/FilterPopover/{index.d.ts → FilterPopover.d.ts} +3 -3
- package/dist/admin/src/components/FilterPopover/FilterValueInput.d.ts +2 -2
- package/dist/admin/src/components/FilterPopover/utils/getFilterList.d.ts +2 -2
- package/dist/admin/src/components/FolderGridList/FolderGridList.d.ts +1 -2
- package/dist/admin/src/components/MediaLibraryDialog/{index.d.ts → MediaLibraryDialog.d.ts} +1 -2
- package/dist/admin/src/components/MediaLibraryInput/{index.d.ts → MediaLibraryInput.d.ts} +2 -2
- package/dist/admin/src/components/SelectTree/Option.d.ts +2 -2
- package/dist/admin/src/components/SelectTree/SelectTree.d.ts +2 -3
- package/dist/admin/src/components/SelectTree/utils/flattenTree.d.ts +1 -1
- package/dist/admin/src/components/SelectTree/utils/getOpenValues.d.ts +2 -2
- package/dist/admin/src/components/SelectTree/utils/getValuesToClose.d.ts +2 -2
- package/dist/admin/src/components/SortPicker/{index.d.ts → SortPicker.d.ts} +2 -2
- package/dist/admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.d.ts +1 -1
- package/dist/admin/src/components/UploadAssetDialog/UploadAssetDialog.d.ts +1 -1
- package/dist/admin/src/{newConstants.d.ts → constants.d.ts} +1 -0
- package/dist/admin/src/hooks/useEditAsset.d.ts +4 -4
- package/dist/admin/src/hooks/useEditFolder.d.ts +4 -4
- package/dist/admin/src/hooks/useFolderStructure.d.ts +1 -1
- package/dist/admin/src/hooks/useModalQueryParams.d.ts +1 -2
- package/dist/admin/src/hooks/useSelectionState.d.ts +1 -1
- package/dist/admin/src/hooks/useUpload.d.ts +1 -1
- 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/getBreadcrumbDataML.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 +2 -2
- package/dist/shared/contracts/settings.d.ts +3 -2
- package/package.json +8 -8
- package/dist/_chunks/index-BM9Ayh_r.js.map +0 -1
- package/dist/_chunks/index-BWIqjWzC.mjs.map +0 -1
- package/dist/_chunks/index-Bl2-6oC8.js.map +0 -1
- package/dist/_chunks/index-BwEfHu6y.mjs.map +0 -1
- package/dist/_chunks/index-C1MSWEyZ.js.map +0 -1
- package/dist/_chunks/index-C_cWV2yS.mjs.map +0 -1
- package/dist/_chunks/index-DCAQ4hHN.mjs.map +0 -1
- package/dist/_chunks/index-YwynuEzj.js.map +0 -1
- package/dist/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/PaginationContext.d.ts +0 -9
- package/dist/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/components.d.ts +0 -15
- package/dist/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/index.d.ts +0 -9
- package/dist/admin/src/components/Breadcrumbs/index.d.ts +0 -1
- package/dist/admin/src/components/BulkMoveDialog/index.d.ts +0 -1
- package/dist/admin/src/components/ContextInfo/index.d.ts +0 -1
- package/dist/admin/src/components/EditFolderDialog/ModalHeader/index.d.ts +0 -2
- package/dist/admin/src/components/EditFolderDialog/index.d.ts +0 -1
- package/dist/admin/src/components/FolderCard/FolderCard/index.d.ts +0 -1
- package/dist/admin/src/components/FolderCard/FolderCardBody/index.d.ts +0 -1
- package/dist/admin/src/components/FolderCard/FolderCardCheckbox/index.d.ts +0 -1
- package/dist/admin/src/components/FolderCard/index.d.ts +0 -4
- package/dist/admin/src/components/FolderGridList/index.d.ts +0 -1
- package/dist/admin/src/components/SelectTree/index.d.ts +0 -2
- /package/dist/admin/src/components/AssetDialog/{index.d.ts → AssetDialog.d.ts} +0 -0
- /package/dist/admin/src/components/AssetDialog/SelectedStep/{index.d.ts → SelectedStep.d.ts} +0 -0
- /package/dist/admin/src/components/CopyLinkButton/{index.d.ts → CopyLinkButton.d.ts} +0 -0
- /package/dist/admin/src/components/EditAssetDialog/{index.d.ts → EditAssetContent.d.ts} +0 -0
- /package/dist/admin/src/components/EditAssetDialog/PreviewBox/{index.d.ts → PreviewBox.d.ts} +0 -0
- /package/dist/admin/src/components/EditAssetDialog/PreviewBox/{components.d.ts → PreviewComponents.d.ts} +0 -0
- /package/dist/admin/src/components/EmptyAssets/{index.d.ts → EmptyAssets.d.ts} +0 -0
- /package/dist/admin/src/components/FolderCard/FolderCardBodyAction/{index.d.ts → FolderCardBodyAction.d.ts} +0 -0
- /package/dist/admin/src/components/TableList/{index.d.ts → TableList.d.ts} +0 -0
- /package/dist/admin/src/components/UploadProgress/{index.d.ts → UploadProgress.d.ts} +0 -0
- /package/dist/admin/src/hooks/utils/{rename-keys.d.ts → renameKeys.d.ts} +0 -0
|
@@ -5,14 +5,13 @@ const React = require("react");
|
|
|
5
5
|
const strapiAdmin = require("@strapi/admin/strapi-admin");
|
|
6
6
|
const reactIntl = require("react-intl");
|
|
7
7
|
const reactRouterDom = require("react-router-dom");
|
|
8
|
-
const index = require("./index-
|
|
8
|
+
const index = require("./index-B7NW5XiM.js");
|
|
9
9
|
require("byte-size");
|
|
10
10
|
require("date-fns");
|
|
11
11
|
const qs = require("qs");
|
|
12
12
|
const designSystem = require("@strapi/design-system");
|
|
13
13
|
const icons = require("@strapi/icons");
|
|
14
14
|
const styledComponents = require("styled-components");
|
|
15
|
-
const PropTypes = require("prop-types");
|
|
16
15
|
const formik = require("formik");
|
|
17
16
|
const isEmpty = require("lodash/isEmpty");
|
|
18
17
|
const reactQuery = require("react-query");
|
|
@@ -37,10 +36,9 @@ function _interopNamespace(e) {
|
|
|
37
36
|
return Object.freeze(n);
|
|
38
37
|
}
|
|
39
38
|
const React__namespace = /* @__PURE__ */ _interopNamespace(React);
|
|
40
|
-
const PropTypes__default = /* @__PURE__ */ _interopDefault(PropTypes);
|
|
41
39
|
const isEmpty__default = /* @__PURE__ */ _interopDefault(isEmpty);
|
|
42
40
|
const getBreadcrumbDataML = (folder, { pathname, query }) => {
|
|
43
|
-
|
|
41
|
+
const data = [
|
|
44
42
|
{
|
|
45
43
|
id: null,
|
|
46
44
|
label: { id: index.getTrad("plugin.name"), defaultMessage: "Media Library" },
|
|
@@ -84,10 +82,6 @@ const BulkDeleteButton = ({ selected, onSuccess }) => {
|
|
|
84
82
|
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.ConfirmDialog, { onConfirm: handleConfirmRemove })
|
|
85
83
|
] });
|
|
86
84
|
};
|
|
87
|
-
BulkDeleteButton.propTypes = {
|
|
88
|
-
selected: PropTypes__default.default.arrayOf(index.AssetDefinition, index.FolderDefinition).isRequired,
|
|
89
|
-
onSuccess: PropTypes__default.default.func.isRequired
|
|
90
|
-
};
|
|
91
85
|
const useBulkMove = () => {
|
|
92
86
|
const { formatMessage } = reactIntl.useIntl();
|
|
93
87
|
const { toggleNotification } = strapiAdmin.useNotification();
|
|
@@ -202,9 +196,13 @@ const BulkMoveDialog = ({ onClose, selected = [], currentFolder }) => {
|
|
|
202
196
|
] })
|
|
203
197
|
] }) }) });
|
|
204
198
|
};
|
|
205
|
-
const BulkMoveButton = ({
|
|
199
|
+
const BulkMoveButton = ({
|
|
200
|
+
selected = [],
|
|
201
|
+
onSuccess,
|
|
202
|
+
currentFolder
|
|
203
|
+
}) => {
|
|
206
204
|
const { formatMessage } = reactIntl.useIntl();
|
|
207
|
-
const [showConfirmDialog, setShowConfirmDialog] =
|
|
205
|
+
const [showConfirmDialog, setShowConfirmDialog] = React__namespace.useState(false);
|
|
208
206
|
const handleConfirmMove = () => {
|
|
209
207
|
setShowConfirmDialog(false);
|
|
210
208
|
onSuccess();
|
|
@@ -221,19 +219,10 @@ const BulkMoveButton = ({ selected, onSuccess, currentFolder }) => {
|
|
|
221
219
|
)
|
|
222
220
|
] });
|
|
223
221
|
};
|
|
224
|
-
|
|
225
|
-
currentFolder: void 0,
|
|
226
|
-
selected: []
|
|
227
|
-
};
|
|
228
|
-
BulkMoveButton.propTypes = {
|
|
229
|
-
onSuccess: PropTypes__default.default.func.isRequired,
|
|
230
|
-
currentFolder: index.FolderDefinition,
|
|
231
|
-
selected: PropTypes__default.default.arrayOf(index.AssetDefinition, index.FolderDefinition)
|
|
232
|
-
};
|
|
233
|
-
const BulkActions = ({ selected, onSuccess, currentFolder }) => {
|
|
222
|
+
const BulkActions = ({ selected = [], onSuccess, currentFolder }) => {
|
|
234
223
|
const { formatMessage } = reactIntl.useIntl();
|
|
235
|
-
const numberAssets = selected
|
|
236
|
-
return val?.type === "folder" ? _this + val
|
|
224
|
+
const numberAssets = selected?.reduce(function(_this, val) {
|
|
225
|
+
return val?.type === "folder" && "files" in val && val?.files && "count" in val.files ? _this + val?.files?.count : _this + 1;
|
|
237
226
|
}, 0);
|
|
238
227
|
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, paddingBottom: 5, children: [
|
|
239
228
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "epsilon", textColor: "neutral600", children: formatMessage(
|
|
@@ -242,24 +231,32 @@ const BulkActions = ({ selected, onSuccess, currentFolder }) => {
|
|
|
242
231
|
defaultMessage: "{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}} selected"
|
|
243
232
|
},
|
|
244
233
|
{
|
|
245
|
-
numberFolders: selected
|
|
234
|
+
numberFolders: selected?.filter(({ type }) => type === "folder").length,
|
|
246
235
|
numberAssets
|
|
247
236
|
}
|
|
248
237
|
) }),
|
|
249
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
250
|
-
|
|
238
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
239
|
+
BulkDeleteButton,
|
|
240
|
+
{
|
|
241
|
+
selected,
|
|
242
|
+
onSuccess
|
|
243
|
+
}
|
|
244
|
+
),
|
|
245
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
246
|
+
BulkMoveButton,
|
|
247
|
+
{
|
|
248
|
+
currentFolder,
|
|
249
|
+
selected,
|
|
250
|
+
onSuccess
|
|
251
|
+
}
|
|
252
|
+
)
|
|
251
253
|
] });
|
|
252
254
|
};
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
onSuccess: PropTypes__default.default.func.isRequired,
|
|
259
|
-
currentFolder: index.FolderDefinition,
|
|
260
|
-
selected: PropTypes__default.default.arrayOf(index.AssetDefinition, index.FolderDefinition)
|
|
261
|
-
};
|
|
262
|
-
const getContentIntlMessage = ({ isFiltering, canCreate, canRead }) => {
|
|
255
|
+
const getContentIntlMessage = ({
|
|
256
|
+
isFiltering,
|
|
257
|
+
canCreate,
|
|
258
|
+
canRead
|
|
259
|
+
}) => {
|
|
263
260
|
if (isFiltering) {
|
|
264
261
|
return {
|
|
265
262
|
id: "list.assets-empty.title-withSearch",
|
|
@@ -283,7 +280,12 @@ const getContentIntlMessage = ({ isFiltering, canCreate, canRead }) => {
|
|
|
283
280
|
defaultMessage: "No permissions to view"
|
|
284
281
|
};
|
|
285
282
|
};
|
|
286
|
-
const EmptyOrNoPermissions = ({
|
|
283
|
+
const EmptyOrNoPermissions = ({
|
|
284
|
+
canCreate,
|
|
285
|
+
isFiltering,
|
|
286
|
+
canRead,
|
|
287
|
+
onActionClick
|
|
288
|
+
}) => {
|
|
287
289
|
const { formatMessage } = reactIntl.useIntl();
|
|
288
290
|
const content = getContentIntlMessage({ isFiltering, canCreate, canRead });
|
|
289
291
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -301,12 +303,6 @@ const EmptyOrNoPermissions = ({ canCreate, isFiltering, canRead, onActionClick }
|
|
|
301
303
|
}
|
|
302
304
|
);
|
|
303
305
|
};
|
|
304
|
-
EmptyOrNoPermissions.propTypes = {
|
|
305
|
-
canCreate: PropTypes__default.default.bool.isRequired,
|
|
306
|
-
canRead: PropTypes__default.default.bool.isRequired,
|
|
307
|
-
isFiltering: PropTypes__default.default.bool.isRequired,
|
|
308
|
-
onActionClick: PropTypes__default.default.func.isRequired
|
|
309
|
-
};
|
|
310
306
|
const Filters = () => {
|
|
311
307
|
const [open, setOpen] = React__namespace.useState(false);
|
|
312
308
|
const { formatMessage } = reactIntl.useIntl();
|
|
@@ -345,9 +341,9 @@ const Filters = () => {
|
|
|
345
341
|
] });
|
|
346
342
|
};
|
|
347
343
|
const Header = ({
|
|
348
|
-
breadcrumbs,
|
|
344
|
+
breadcrumbs = null,
|
|
349
345
|
canCreate,
|
|
350
|
-
folder,
|
|
346
|
+
folder = null,
|
|
351
347
|
onToggleEditFolderDialog,
|
|
352
348
|
onToggleUploadAssetDialog
|
|
353
349
|
}) => {
|
|
@@ -356,8 +352,8 @@ const Header = ({
|
|
|
356
352
|
const [{ query }] = strapiAdmin.useQueryParams();
|
|
357
353
|
const backQuery = {
|
|
358
354
|
...query,
|
|
359
|
-
folder: folder?.parent
|
|
360
|
-
folderPath: folder?.parent
|
|
355
|
+
folder: folder?.parent && typeof folder.parent !== "number" && folder.parent.id ? folder.parent.id : void 0,
|
|
356
|
+
folderPath: folder?.parent && typeof folder.parent !== "number" && folder.parent.path ? folder.parent.path : void 0
|
|
361
357
|
};
|
|
362
358
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
363
359
|
strapiAdmin.Layouts.Header,
|
|
@@ -366,10 +362,9 @@ const Header = ({
|
|
|
366
362
|
id: index.getTrad("plugin.name"),
|
|
367
363
|
defaultMessage: `Media Library`
|
|
368
364
|
}),
|
|
369
|
-
subtitle: breadcrumbs && folder && /* @__PURE__ */ jsxRuntime.jsx(
|
|
365
|
+
subtitle: breadcrumbs && typeof breadcrumbs !== "boolean" && folder && /* @__PURE__ */ jsxRuntime.jsx(
|
|
370
366
|
index.Breadcrumbs,
|
|
371
367
|
{
|
|
372
|
-
tag: "nav",
|
|
373
368
|
label: formatMessage({
|
|
374
369
|
id: index.getTrad("header.breadcrumbs.nav.label"),
|
|
375
370
|
defaultMessage: "Folders navigation"
|
|
@@ -403,17 +398,6 @@ const Header = ({
|
|
|
403
398
|
}
|
|
404
399
|
);
|
|
405
400
|
};
|
|
406
|
-
Header.defaultProps = {
|
|
407
|
-
breadcrumbs: false,
|
|
408
|
-
folder: null
|
|
409
|
-
};
|
|
410
|
-
Header.propTypes = {
|
|
411
|
-
breadcrumbs: PropTypes__default.default.oneOfType([index.BreadcrumbsDefinition, PropTypes__default.default.bool]),
|
|
412
|
-
canCreate: PropTypes__default.default.bool.isRequired,
|
|
413
|
-
folder: index.FolderDefinition,
|
|
414
|
-
onToggleEditFolderDialog: PropTypes__default.default.func.isRequired,
|
|
415
|
-
onToggleUploadAssetDialog: PropTypes__default.default.func.isRequired
|
|
416
|
-
};
|
|
417
401
|
const BoxWithHeight = styledComponents.styled(designSystem.Box)`
|
|
418
402
|
height: 3.2rem;
|
|
419
403
|
display: flex;
|
|
@@ -440,7 +424,7 @@ const MediaLibrary = () => {
|
|
|
440
424
|
canConfigureView,
|
|
441
425
|
isLoading: permissionsLoading
|
|
442
426
|
} = index.useMediaLibraryPermissions();
|
|
443
|
-
const currentFolderToEditRef =
|
|
427
|
+
const currentFolderToEditRef = React__namespace.useRef();
|
|
444
428
|
const { formatMessage } = reactIntl.useIntl();
|
|
445
429
|
const { pathname } = reactRouterDom.useLocation();
|
|
446
430
|
const { trackUsage } = strapiAdmin.useTracking();
|
|
@@ -451,7 +435,7 @@ const MediaLibrary = () => {
|
|
|
451
435
|
const {
|
|
452
436
|
data: assetsData,
|
|
453
437
|
isLoading: assetsLoading,
|
|
454
|
-
|
|
438
|
+
error: assetsError
|
|
455
439
|
} = index.useAssets({
|
|
456
440
|
skipWhen: !canRead,
|
|
457
441
|
query
|
|
@@ -459,7 +443,7 @@ const MediaLibrary = () => {
|
|
|
459
443
|
const {
|
|
460
444
|
data: foldersData,
|
|
461
445
|
isLoading: foldersLoading,
|
|
462
|
-
|
|
446
|
+
error: foldersError
|
|
463
447
|
} = index.useFolders({
|
|
464
448
|
enabled: canRead && assetsData?.pagination?.page === 1 && !index.containsAssetFilter(query),
|
|
465
449
|
query
|
|
@@ -471,13 +455,16 @@ const MediaLibrary = () => {
|
|
|
471
455
|
} = index.useFolder(query?.folder, {
|
|
472
456
|
enabled: canRead && !!query?.folder
|
|
473
457
|
});
|
|
474
|
-
if (currentFolderError?.
|
|
458
|
+
if (currentFolderError?.name === "NotFoundError") {
|
|
475
459
|
navigate(pathname);
|
|
476
460
|
}
|
|
477
461
|
const folders = foldersData?.map((folder) => ({
|
|
478
462
|
...folder,
|
|
479
463
|
type: "folder",
|
|
480
|
-
folderURL: index.getFolderURL(pathname, query,
|
|
464
|
+
folderURL: index.getFolderURL(pathname, query, {
|
|
465
|
+
folder: folder.id.toString(),
|
|
466
|
+
folderPath: folder.path
|
|
467
|
+
}),
|
|
481
468
|
isSelectable: canUpdate
|
|
482
469
|
})) ?? [];
|
|
483
470
|
const folderCount = folders?.length || 0;
|
|
@@ -485,11 +472,14 @@ const MediaLibrary = () => {
|
|
|
485
472
|
const assetCount = assets?.length ?? 0;
|
|
486
473
|
const totalAssetCount = assetsData?.pagination?.total;
|
|
487
474
|
const isLoading = isCurrentFolderLoading || foldersLoading || permissionsLoading || assetsLoading;
|
|
488
|
-
const [showUploadAssetDialog, setShowUploadAssetDialog] =
|
|
489
|
-
const [showEditFolderDialog, setShowEditFolderDialog] =
|
|
490
|
-
const [assetToEdit, setAssetToEdit] =
|
|
491
|
-
const [folderToEdit, setFolderToEdit] =
|
|
492
|
-
const [selected, { selectOne, selectAll }] = index.useSelectionState(
|
|
475
|
+
const [showUploadAssetDialog, setShowUploadAssetDialog] = React__namespace.useState(false);
|
|
476
|
+
const [showEditFolderDialog, setShowEditFolderDialog] = React__namespace.useState(false);
|
|
477
|
+
const [assetToEdit, setAssetToEdit] = React__namespace.useState(void 0);
|
|
478
|
+
const [folderToEdit, setFolderToEdit] = React__namespace.useState(void 0);
|
|
479
|
+
const [selected, { selectOne, selectAll }] = index.useSelectionState(
|
|
480
|
+
["type", "id"],
|
|
481
|
+
[]
|
|
482
|
+
);
|
|
493
483
|
const indeterminateBulkSelect = selected?.length > 0 && selected?.length !== assetCount + folderCount;
|
|
494
484
|
const toggleUploadAssetDialog = () => setShowUploadAssetDialog((prev) => !prev);
|
|
495
485
|
const toggleEditFolderDialog = ({ created = false } = {}) => {
|
|
@@ -526,7 +516,7 @@ const MediaLibrary = () => {
|
|
|
526
516
|
}
|
|
527
517
|
};
|
|
528
518
|
const handleAssetDeleted = (numberOfAssets) => {
|
|
529
|
-
if (numberOfAssets === assetCount && assetsData
|
|
519
|
+
if (numberOfAssets === assetCount && assetsData?.pagination?.page === assetsData?.pagination?.pageCount && assetsData?.pagination?.page && assetsData.pagination.page > 1) {
|
|
530
520
|
setQuery({
|
|
531
521
|
...query,
|
|
532
522
|
page: assetsData.pagination.page - 1
|
|
@@ -548,7 +538,10 @@ const MediaLibrary = () => {
|
|
|
548
538
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
549
539
|
Header,
|
|
550
540
|
{
|
|
551
|
-
breadcrumbs: !isCurrentFolderLoading
|
|
541
|
+
breadcrumbs: !isCurrentFolderLoading ? getBreadcrumbDataML(currentFolder, {
|
|
542
|
+
pathname,
|
|
543
|
+
query
|
|
544
|
+
}) : null,
|
|
552
545
|
canCreate,
|
|
553
546
|
onToggleEditFolderDialog: toggleEditFolderDialog,
|
|
554
547
|
onToggleUploadAssetDialog: toggleUploadAssetDialog,
|
|
@@ -652,7 +645,7 @@ const MediaLibrary = () => {
|
|
|
652
645
|
folderCount,
|
|
653
646
|
indeterminate: indeterminateBulkSelect,
|
|
654
647
|
onChangeSort: handleChangeSort,
|
|
655
|
-
onChangeFolder: (folderID, folderPath) => navigate(index.getFolderURL(pathname, query, { folder: folderID, folderPath })),
|
|
648
|
+
onChangeFolder: (folderID, folderPath) => navigate(index.getFolderURL(pathname, query, { folder: folderID.toString(), folderPath })),
|
|
656
649
|
onEditAsset: setAssetToEdit,
|
|
657
650
|
onEditFolder: handleEditFolder,
|
|
658
651
|
onSelectOne: selectOne,
|
|
@@ -685,7 +678,7 @@ const MediaLibrary = () => {
|
|
|
685
678
|
(currentFolder2) => currentFolder2.id === folder.id
|
|
686
679
|
);
|
|
687
680
|
const url = index.getFolderURL(pathname, query, {
|
|
688
|
-
folder: folder?.id,
|
|
681
|
+
folder: folder?.id.toString(),
|
|
689
682
|
folderPath: folder?.path
|
|
690
683
|
});
|
|
691
684
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -701,7 +694,7 @@ const MediaLibrary = () => {
|
|
|
701
694
|
ariaLabel: folder.name,
|
|
702
695
|
id: `folder-${folder.id}`,
|
|
703
696
|
to: url,
|
|
704
|
-
startAction:
|
|
697
|
+
startAction: folder.isSelectable ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
705
698
|
FolderCardCheckbox,
|
|
706
699
|
{
|
|
707
700
|
"data-testid": `folder-checkbox-${folder.id}`,
|
|
@@ -712,7 +705,7 @@ const MediaLibrary = () => {
|
|
|
712
705
|
cardActions: /* @__PURE__ */ jsxRuntime.jsx(
|
|
713
706
|
designSystem.IconButton,
|
|
714
707
|
{
|
|
715
|
-
|
|
708
|
+
label: formatMessage({
|
|
716
709
|
id: index.getTrad("list.folder.edit"),
|
|
717
710
|
defaultMessage: "Edit folder"
|
|
718
711
|
}),
|
|
@@ -746,8 +739,8 @@ const MediaLibrary = () => {
|
|
|
746
739
|
defaultMessage: "{folderCount, plural, =0 {# folder} one {# folder} other {# folders}}, {filesCount, plural, =0 {# asset} one {# asset} other {# assets}}"
|
|
747
740
|
},
|
|
748
741
|
{
|
|
749
|
-
folderCount: folder.children
|
|
750
|
-
filesCount: folder.files
|
|
742
|
+
folderCount: folder.children?.count,
|
|
743
|
+
filesCount: folder.files?.count
|
|
751
744
|
}
|
|
752
745
|
)
|
|
753
746
|
}
|
|
@@ -768,7 +761,9 @@ const MediaLibrary = () => {
|
|
|
768
761
|
assets,
|
|
769
762
|
onEditAsset: setAssetToEdit,
|
|
770
763
|
onSelectAsset: selectOne,
|
|
771
|
-
selectedAssets: selected.filter(
|
|
764
|
+
selectedAssets: selected.filter(
|
|
765
|
+
({ type }) => type === "asset"
|
|
766
|
+
),
|
|
772
767
|
title: (
|
|
773
768
|
// Assets title should only appear if:
|
|
774
769
|
// - user is not filtering
|
|
@@ -785,7 +780,7 @@ const MediaLibrary = () => {
|
|
|
785
780
|
}
|
|
786
781
|
)
|
|
787
782
|
] }),
|
|
788
|
-
/* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Pagination.Root, { ...assetsData
|
|
783
|
+
/* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Pagination.Root, { ...assetsData?.pagination, children: [
|
|
789
784
|
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Pagination.PageSize, {}),
|
|
790
785
|
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Pagination.Links, {})
|
|
791
786
|
] })
|
|
@@ -804,7 +799,7 @@ const MediaLibrary = () => {
|
|
|
804
799
|
index.EditFolderDialog,
|
|
805
800
|
{
|
|
806
801
|
open: showEditFolderDialog,
|
|
807
|
-
onClose: handleEditFolderClose,
|
|
802
|
+
onClose: () => handleEditFolderClose(),
|
|
808
803
|
folder: folderToEdit,
|
|
809
804
|
parentFolderId: query?.folder,
|
|
810
805
|
location: "upload"
|
|
@@ -829,7 +824,9 @@ const MediaLibrary = () => {
|
|
|
829
824
|
)
|
|
830
825
|
] });
|
|
831
826
|
};
|
|
832
|
-
const ConfigureTheView =
|
|
827
|
+
const ConfigureTheView = React__namespace.lazy(
|
|
828
|
+
async () => Promise.resolve().then(() => require("./ConfigureTheView-fwDgErsi.js")).then((mod) => ({ default: mod.ConfigureTheView }))
|
|
829
|
+
);
|
|
833
830
|
const Upload = () => {
|
|
834
831
|
const {
|
|
835
832
|
config: { isLoading, isError, data: config }
|
|
@@ -837,11 +834,15 @@ const Upload = () => {
|
|
|
837
834
|
const [{ rawQuery }, setQuery] = strapiAdmin.useQueryParams();
|
|
838
835
|
const { formatMessage } = reactIntl.useIntl();
|
|
839
836
|
const title = formatMessage({ id: index.getTrad("plugin.name"), defaultMessage: "Media Library" });
|
|
840
|
-
|
|
837
|
+
React__namespace.useEffect(() => {
|
|
841
838
|
if (isLoading || isError || rawQuery) {
|
|
842
839
|
return;
|
|
843
840
|
}
|
|
844
|
-
setQuery({
|
|
841
|
+
setQuery({
|
|
842
|
+
sort: config.sort,
|
|
843
|
+
page: 1,
|
|
844
|
+
pageSize: config.pageSize
|
|
845
|
+
});
|
|
845
846
|
}, [isLoading, isError, config, rawQuery, setQuery]);
|
|
846
847
|
if (isLoading) {
|
|
847
848
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -849,10 +850,16 @@ const Upload = () => {
|
|
|
849
850
|
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Loading, {})
|
|
850
851
|
] });
|
|
851
852
|
}
|
|
852
|
-
return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Main, { children: rawQuery ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
853
|
+
return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Main, { children: rawQuery ? /* @__PURE__ */ jsxRuntime.jsx(React__namespace.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Loading, {}), children: /* @__PURE__ */ jsxRuntime.jsxs(reactRouterDom.Routes, { children: [
|
|
853
854
|
/* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Route, { index: true, element: /* @__PURE__ */ jsxRuntime.jsx(MediaLibrary, {}) }),
|
|
854
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
855
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
856
|
+
reactRouterDom.Route,
|
|
857
|
+
{
|
|
858
|
+
path: "configuration",
|
|
859
|
+
element: /* @__PURE__ */ jsxRuntime.jsx(ConfigureTheView, { config })
|
|
860
|
+
}
|
|
861
|
+
)
|
|
855
862
|
] }) }) : null });
|
|
856
863
|
};
|
|
857
|
-
exports.
|
|
858
|
-
//# sourceMappingURL=
|
|
864
|
+
exports.Upload = Upload;
|
|
865
|
+
//# sourceMappingURL=App-Dqqn78jO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App-Dqqn78jO.js","sources":["../../admin/src/utils/getBreadcrumbDataML.ts","../../admin/src/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.tsx","../../admin/src/pages/App/MediaLibrary/components/BulkDeleteButton.tsx","../../admin/src/hooks/useBulkMove.ts","../../admin/src/components/BulkMoveDialog/BulkMoveDialog.tsx","../../admin/src/pages/App/MediaLibrary/components/BulkMoveButton.tsx","../../admin/src/pages/App/MediaLibrary/components/BulkActions.tsx","../../admin/src/pages/App/MediaLibrary/components/EmptyOrNoPermissions.tsx","../../admin/src/pages/App/MediaLibrary/components/Filters.tsx","../../admin/src/pages/App/MediaLibrary/components/Header.tsx","../../admin/src/pages/App/MediaLibrary/MediaLibrary.tsx","../../admin/src/pages/App/App.tsx"],"sourcesContent":["import { getFolderURL } from './getFolderURL';\nimport { getTrad } from './getTrad';\n\nimport type { Query } from '../../../shared/contracts/files';\nimport type { Folder } from '../../../shared/contracts/folders';\nimport type { MessageDescriptor } from 'react-intl';\n\ninterface GetBreadcrumbDataMLProps {\n folder: Folder;\n options: {\n pathname: string;\n query?: Query;\n };\n}\n\ninterface GetBreadcrumbDataMLReturn {\n id: number | null;\n label: string | MessageDescriptor;\n href?: string;\n}\n\ntype BreadcrumbData = GetBreadcrumbDataMLReturn | [];\n\nexport const getBreadcrumbDataML = (\n folder: GetBreadcrumbDataMLProps['folder'] | null,\n { pathname, query }: GetBreadcrumbDataMLProps['options']\n) => {\n const data: BreadcrumbData[] = [\n {\n id: null,\n label: { id: getTrad('plugin.name'), defaultMessage: 'Media Library' },\n href: folder ? getFolderURL(pathname, query || {}) : undefined,\n },\n ];\n\n if (folder?.parent && typeof folder?.parent !== 'number' && folder?.parent?.parent) {\n data.push([]);\n }\n\n if (folder?.parent && typeof folder.parent !== 'number') {\n data.push({\n id: folder.parent.id,\n label: folder.parent.name,\n href: getFolderURL(pathname, query || {}, {\n folder: folder.parent.id?.toString(),\n folderPath: folder.parent.path,\n }),\n });\n }\n\n if (folder) {\n data.push({\n id: folder.id,\n label: folder.name,\n });\n }\n\n return data;\n};\n","import { Checkbox, Box, CheckboxProps } from '@strapi/design-system';\n\nimport { useFolderCard } from '../contexts/FolderCard';\n\nexport const FolderCardCheckbox = (props: CheckboxProps) => {\n const { id } = useFolderCard();\n\n return (\n <Box position=\"relative\" zIndex={2}>\n <Checkbox aria-labelledby={`${id}-title`} {...props} />\n </Box>\n );\n};\n","import { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport { Button, Dialog } from '@strapi/design-system';\nimport { Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useBulkRemove } from '../../../../hooks/useBulkRemove';\n\nimport type { FolderDefinition } from '../../../../../../shared/contracts/folders';\nimport type { FileWithType } from '../../../../hooks/useBulkRemove';\n\nexport interface BulkDeleteButtonProps {\n selected: Array<FileWithType | FolderDefinition>;\n onSuccess: () => void;\n}\n\nexport const BulkDeleteButton = ({ selected, onSuccess }: BulkDeleteButtonProps) => {\n const { formatMessage } = useIntl();\n const { remove } = useBulkRemove();\n\n const handleConfirmRemove = async () => {\n await remove(selected);\n onSuccess();\n };\n\n return (\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"danger-light\" size=\"S\" startIcon={<Trash />}>\n {formatMessage({ id: 'global.delete', defaultMessage: 'Delete' })}\n </Button>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleConfirmRemove} />\n </Dialog.Root>\n );\n};\n","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { File, BulkMoveFiles } from '../../../shared/contracts/files';\nimport { Folder, BulkMoveFolders } from '../../../shared/contracts/folders';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\nexport interface FolderWithType extends Folder {\n type: string;\n}\n\nexport interface FileWithType extends File {\n type: string;\n}\n\ninterface BulkMoveParams {\n destinationFolderId: number | string;\n filesAndFolders: Array<FolderWithType | FileWithType>;\n}\n\n// Define the shape of the accumulator object\ntype Payload = {\n fileIds?: number[];\n folderIds?: number[];\n};\n\nexport const useBulkMove = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const queryClient = useQueryClient();\n const { post } = useFetchClient();\n\n const bulkMoveQuery = ({ destinationFolderId, filesAndFolders }: BulkMoveParams) => {\n const payload = filesAndFolders.reduce<Payload>((acc, selected) => {\n const { id, type } = selected;\n const key = type === 'asset' ? 'fileIds' : 'folderIds';\n\n if (!acc[key]) {\n acc[key] = [];\n }\n\n acc[key]!.push(id);\n\n return acc;\n }, {});\n\n return post('/upload/actions/bulk-move', { ...payload, destinationFolderId });\n };\n\n const mutation = useMutation<\n BulkMoveFolders.Response | BulkMoveFiles.Response,\n BulkMoveFolders.Response['error'] | BulkMoveFiles.Response['error'],\n BulkMoveParams\n >(bulkMoveQuery, {\n onSuccess(res) {\n const {\n data: { data },\n } = res;\n\n if (data?.files?.length > 0) {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n }\n\n // folders need to be re-fetched in any case, because assets might have been\n // moved into a sub-folder and therefore the count needs to be updated\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('modal.move.success-label'),\n defaultMessage: 'Elements have been moved successfully.',\n }),\n });\n },\n });\n\n const move = (\n destinationFolderId: number | string,\n filesAndFolders: Array<FolderWithType | FileWithType>\n ) => mutation.mutateAsync({ destinationFolderId, filesAndFolders });\n\n return { ...mutation, move };\n};\n","import { Button, Flex, Grid, Field, Loader, Modal, Typography } from '@strapi/design-system';\nimport { Form, Formik, FormikErrors } from 'formik';\nimport isEmpty from 'lodash/isEmpty';\nimport { useIntl } from 'react-intl';\n\nimport { File } from '../../../../shared/contracts/files';\nimport { useBulkMove } from '../../hooks/useBulkMove';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getTrad, normalizeAPIError } from '../../utils';\nimport { SelectTree } from '../SelectTree/SelectTree';\n\nimport type { Folder } from '../../../../shared/contracts/folders';\nimport type { OptionSelectTree } from '../SelectTree/SelectTree';\nimport type { FetchError } from '@strapi/admin/strapi-admin';\n\ntype InitialFormData = {\n destination:\n | {\n value: string | number;\n label: string;\n }\n | string;\n};\n\ninterface FolderWithType extends Folder {\n type: string;\n}\n\ninterface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkMoveDialogProps {\n onClose: () => void;\n selected?: Array<FolderWithType | FileWithType>;\n currentFolder?: FolderWithType;\n}\n\nexport const BulkMoveDialog = ({ onClose, selected = [], currentFolder }: BulkMoveDialogProps) => {\n const { formatMessage } = useIntl();\n const { data: folderStructure, isLoading } = useFolderStructure();\n const { move } = useBulkMove();\n\n if (!folderStructure) {\n return null;\n }\n\n const handleSubmit = async (\n values: InitialFormData,\n { setErrors }: { setErrors: (errors: FormikErrors<InitialFormData>) => void }\n ) => {\n try {\n if (typeof values.destination !== 'string') {\n const destinationValue = values.destination.value;\n await move(destinationValue, selected);\n onClose();\n }\n } catch (error) {\n const normalizedError = normalizeAPIError(error as FetchError)!;\n\n if (normalizedError && 'errors' in normalizedError) {\n const formikErrors = normalizedError.errors?.reduce<Record<string, string>>(\n (acc, error) => {\n acc[error.values?.path?.length || 'destination'] = error.defaultMessage;\n\n return acc;\n },\n {}\n );\n\n if (!isEmpty(formikErrors)) {\n setErrors(formikErrors);\n }\n }\n }\n };\n\n if (isLoading) {\n return (\n <Modal.Content>\n <Modal.Body>\n <Flex justifyContent=\"center\" paddingTop={4} paddingBottom={4}>\n <Loader>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </Flex>\n </Modal.Body>\n </Modal.Content>\n );\n }\n\n const initialFormData: InitialFormData = {\n destination: {\n value: currentFolder?.id || '',\n label: currentFolder?.name || folderStructure[0].label,\n },\n };\n\n return (\n <Modal.Content>\n <Formik validateOnChange={false} onSubmit={handleSubmit} initialValues={initialFormData}>\n {({ values, errors, setFieldValue }) => (\n <Form noValidate>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('modal.folder.move.title'),\n defaultMessage: 'Move elements to',\n })}\n </Modal.Title>\n </Modal.Header>\n\n <Modal.Body>\n <Grid.Root gap={4}>\n <Grid.Item xs={12} col={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root id=\"folder-destination\">\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.folder-location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n\n <SelectTree\n options={folderStructure as OptionSelectTree[]}\n onChange={(value: Record<string, string | number>) => {\n setFieldValue('destination', value);\n }}\n defaultValue={\n typeof values.destination !== 'string' ? values.destination : undefined\n }\n name=\"destination\"\n menuPortalTarget={document.querySelector('body')}\n inputId=\"folder-destination\"\n error={errors?.destination}\n ariaErrorMessage=\"destination-error\"\n />\n\n {errors.destination && (\n <Typography variant=\"pi\" tag=\"p\" textColor=\"danger600\">\n {errors.destination}\n </Typography>\n )}\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Modal.Body>\n\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" name=\"cancel\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Modal.Close>\n <Button type=\"submit\" loading={isLoading}>\n {formatMessage({ id: 'modal.folder.move.submit', defaultMessage: 'Move' })}\n </Button>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n </Modal.Content>\n );\n};\n","import * as React from 'react';\n\nimport { Button, Modal } from '@strapi/design-system';\nimport { Folder } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { BulkMoveDialog } from '../../../../components/BulkMoveDialog/BulkMoveDialog';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder as FolderDefinition } from '../../../../../../shared/contracts/folders';\n\ninterface FolderWithType extends FolderDefinition {\n type: string;\n}\n\ninterface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkMoveButtonProps {\n onSuccess: () => void;\n currentFolder?: FolderWithType;\n selected?: Array<FolderWithType | FileWithType>;\n}\n\nexport const BulkMoveButton = ({\n selected = [],\n onSuccess,\n currentFolder,\n}: BulkMoveButtonProps) => {\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n\n const handleConfirmMove = () => {\n setShowConfirmDialog(false);\n onSuccess();\n };\n\n return (\n <Modal.Root open={showConfirmDialog} onOpenChange={setShowConfirmDialog}>\n <Modal.Trigger>\n <Button variant=\"secondary\" size=\"S\" startIcon={<Folder />}>\n {formatMessage({ id: 'global.move', defaultMessage: 'Move' })}\n </Button>\n </Modal.Trigger>\n <BulkMoveDialog\n currentFolder={currentFolder}\n onClose={handleConfirmMove}\n selected={selected}\n />\n </Modal.Root>\n );\n};\n","import { Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../../utils';\n\nimport { BulkDeleteButton } from './BulkDeleteButton';\nimport { BulkMoveButton } from './BulkMoveButton';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type {\n FolderDefinition,\n Folder as FolderInitial,\n} from '../../../../../../shared/contracts/folders';\n\ninterface FolderWithType extends FolderInitial {\n type: string;\n}\n\nexport interface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkActionsProps {\n selected: Array<FileWithType | FolderDefinition> | Array<FolderWithType | FileWithType>;\n onSuccess: () => void;\n currentFolder?: FolderWithType;\n}\n\nexport const BulkActions = ({ selected = [], onSuccess, currentFolder }: BulkActionsProps) => {\n const { formatMessage } = useIntl();\n const numberAssets = selected?.reduce(function (_this, val) {\n return val?.type === 'folder' && 'files' in val && val?.files && 'count' in val.files\n ? _this + val?.files?.count\n : _this + 1;\n }, 0);\n\n return (\n <Flex gap={2} paddingBottom={5}>\n <Typography variant=\"epsilon\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: getTrad('list.assets.selected'),\n defaultMessage:\n '{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}} selected',\n },\n {\n numberFolders: selected?.filter(({ type }) => type === 'folder').length,\n numberAssets,\n }\n )}\n </Typography>\n\n <BulkDeleteButton\n selected={selected as Array<FileWithType | FolderDefinition>}\n onSuccess={onSuccess}\n />\n <BulkMoveButton\n currentFolder={currentFolder}\n selected={selected as Array<FolderWithType | FileWithType>}\n onSuccess={onSuccess}\n />\n </Flex>\n );\n};\n","import { Button } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyPermissions } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { EmptyAssets } from '../../../../components/EmptyAssets/EmptyAssets';\nimport { getTrad } from '../../../../utils';\n\nexport interface EmptyOrNoPermissionsProps {\n canCreate: boolean;\n canRead: boolean;\n isFiltering: boolean;\n onActionClick: () => void;\n}\n\nconst getContentIntlMessage = ({\n isFiltering,\n canCreate,\n canRead,\n}: Omit<EmptyOrNoPermissionsProps, 'onActionClick'>) => {\n if (isFiltering) {\n return {\n id: 'list.assets-empty.title-withSearch',\n defaultMessage: 'There are no elements with the applied filters',\n };\n }\n\n if (canRead) {\n if (canCreate) {\n return {\n id: 'list.assets.empty-upload',\n defaultMessage: 'Upload your first assets...',\n };\n }\n\n return {\n id: 'list.assets.empty',\n defaultMessage: 'Media Library is empty',\n };\n }\n\n return {\n id: 'header.actions.no-permissions',\n defaultMessage: 'No permissions to view',\n };\n};\n\nexport const EmptyOrNoPermissions = ({\n canCreate,\n isFiltering,\n canRead,\n onActionClick,\n}: EmptyOrNoPermissionsProps) => {\n const { formatMessage } = useIntl();\n const content = getContentIntlMessage({ isFiltering, canCreate, canRead });\n\n return (\n <EmptyAssets\n icon={!canRead ? EmptyPermissions : undefined}\n action={\n canCreate &&\n !isFiltering && (\n <Button variant=\"secondary\" startIcon={<Plus />} onClick={onActionClick}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n )\n }\n content={formatMessage({\n ...content,\n id: getTrad(content.id),\n })}\n />\n );\n};\n","import * as React from 'react';\n\nimport { useTracking, useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Button, Popover } from '@strapi/design-system';\nimport { Filter } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { FilterList } from '../../../../components/FilterList/FilterList';\nimport { FilterPopover } from '../../../../components/FilterPopover/FilterPopover';\nimport { displayedFilters } from '../../../../utils';\n\nimport type { Query } from '../../../../../../shared/contracts/files';\nimport type { FilterListProps } from '../../../../components/FilterList/FilterList';\nimport type { FilterPopoverProps } from '../../../../components/FilterPopover/FilterPopover';\n\nexport const Filters = () => {\n const [open, setOpen] = React.useState(false);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams<Query>();\n const filters = query?.filters?.$and || [];\n\n const handleRemoveFilter: FilterListProps['onRemoveFilter'] = (nextFilters) => {\n setQuery({ filters: { $and: nextFilters }, page: 1 } as Query);\n };\n\n const handleSubmit: FilterPopoverProps['onSubmit'] = (filters) => {\n trackUsage('didFilterMediaLibraryElements', {\n location: 'content-manager',\n filter: Object.keys(filters[filters.length - 1])[0],\n });\n setQuery({ filters: { $and: filters }, page: 1 } as Query);\n };\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger>\n <Button variant=\"tertiary\" startIcon={<Filter />} size=\"S\">\n {formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n <FilterPopover\n displayedFilters={displayedFilters}\n filters={filters}\n onSubmit={handleSubmit}\n onToggle={setOpen as FilterPopoverProps['onToggle']}\n />\n <FilterList\n appliedFilters={filters as FilterListProps['appliedFilters']}\n filtersSchema={displayedFilters}\n onRemoveFilter={handleRemoveFilter}\n />\n </Popover.Root>\n );\n};\n","import { useQueryParams, Layouts } from '@strapi/admin/strapi-admin';\nimport { Button, Flex, Link } from '@strapi/design-system';\nimport { ArrowLeft, Plus } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useLocation, NavLink } from 'react-router-dom';\n\nimport { Breadcrumbs } from '../../../../components/Breadcrumbs/Breadcrumbs';\nimport { getTrad } from '../../../../utils';\n\nimport type { Folder } from '../../../../../../shared/contracts/folders';\nimport type { CrumbDefinition } from '../../../../components/Breadcrumbs/Breadcrumbs';\n\ninterface FolderDefinition extends Omit<Folder, 'children' | 'files' | 'parent'> {\n children: {\n count: number;\n };\n files: {\n count: number;\n };\n parent?: FolderDefinition;\n}\n\nexport interface HeaderProps {\n breadcrumbs?: Array<CrumbDefinition> | null;\n canCreate: boolean;\n folder?: FolderDefinition | null;\n onToggleEditFolderDialog: ({ created }?: { created?: boolean }) => void;\n onToggleUploadAssetDialog: () => void;\n}\n\nexport const Header = ({\n breadcrumbs = null,\n canCreate,\n folder = null,\n onToggleEditFolderDialog,\n onToggleUploadAssetDialog,\n}: HeaderProps) => {\n const { formatMessage } = useIntl();\n const { pathname } = useLocation();\n const [{ query }] = useQueryParams();\n const backQuery = {\n ...query,\n folder:\n folder?.parent && typeof folder.parent !== 'number' && folder.parent.id\n ? folder.parent.id\n : undefined,\n folderPath:\n folder?.parent && typeof folder.parent !== 'number' && folder.parent.path\n ? folder.parent.path\n : undefined,\n };\n\n return (\n <Layouts.Header\n title={formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: `Media Library`,\n })}\n subtitle={\n breadcrumbs &&\n typeof breadcrumbs !== 'boolean' &&\n folder && (\n <Breadcrumbs\n label={formatMessage({\n id: getTrad('header.breadcrumbs.nav.label'),\n defaultMessage: 'Folders navigation',\n })}\n breadcrumbs={breadcrumbs}\n currentFolderId={folder?.id}\n />\n )\n }\n navigationAction={\n folder && (\n <Link\n tag={NavLink}\n startIcon={<ArrowLeft />}\n to={`${pathname}?${stringify(backQuery, { encode: false })}`}\n >\n {formatMessage({\n id: getTrad('header.actions.folder-level-up'),\n defaultMessage: 'Back',\n })}\n </Link>\n )\n }\n primaryAction={\n canCreate && (\n <Flex gap={2}>\n <Button startIcon={<Plus />} variant=\"secondary\" onClick={onToggleEditFolderDialog}>\n {formatMessage({\n id: getTrad('header.actions.add-folder'),\n defaultMessage: 'Add new folder',\n })}\n </Button>\n\n <Button startIcon={<Plus />} onClick={onToggleUploadAssetDialog}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n </Flex>\n )\n }\n />\n );\n};\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport {\n Page,\n SearchInput,\n Pagination,\n useTracking,\n useQueryParams,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport {\n Checkbox,\n Box,\n Divider,\n Flex,\n IconButton,\n Typography,\n VisuallyHidden,\n Grid,\n} from '@strapi/design-system';\nimport { Cog, GridFour as GridIcon, List, Pencil } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link as ReactRouterLink, useNavigate, useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { AssetGridList } from '../../../components/AssetGridList/AssetGridList';\nimport { EditAssetDialog } from '../../../components/EditAssetDialog/EditAssetContent';\nimport { EditFolderDialog } from '../../../components/EditFolderDialog/EditFolderDialog';\nimport { FolderCard } from '../../../components/FolderCard/FolderCard/FolderCard';\nimport { FolderCardBody } from '../../../components/FolderCard/FolderCardBody/FolderCardBody';\nimport { FolderCardBodyAction } from '../../../components/FolderCard/FolderCardBodyAction/FolderCardBodyAction';\nimport { FolderCardCheckbox } from '../../../components/FolderCard/FolderCardCheckbox/FolderCardCheckbox';\nimport { FolderGridList } from '../../../components/FolderGridList/FolderGridList';\nimport { SortPicker } from '../../../components/SortPicker/SortPicker';\nimport { TableList } from '../../../components/TableList/TableList';\nimport { UploadAssetDialog } from '../../../components/UploadAssetDialog/UploadAssetDialog';\nimport { localStorageKeys, viewOptions } from '../../../constants';\nimport { useAssets } from '../../../hooks/useAssets';\nimport { useFolder } from '../../../hooks/useFolder';\nimport { useFolders } from '../../../hooks/useFolders';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { usePersistentState } from '../../../hooks/usePersistentState';\nimport { useSelectionState } from '../../../hooks/useSelectionState';\nimport { containsAssetFilter, getBreadcrumbDataML, getFolderURL, getTrad } from '../../../utils';\n\nimport { BulkActions } from './components/BulkActions';\nimport { EmptyOrNoPermissions } from './components/EmptyOrNoPermissions';\nimport { Filters } from './components/Filters';\nimport { Header } from './components/Header';\n\nimport type { BulkActionsProps } from './components/BulkActions';\nimport type { HeaderProps } from './components/Header';\nimport type { Query } from '../../../../../shared/contracts/files';\nimport type { FolderDefinition } from '../../../../../shared/contracts/folders';\nimport type { AssetGridListProps } from '../../../components/AssetGridList/AssetGridList';\nimport type { Asset } from '../../../components/EditAssetDialog/EditAssetContent';\nimport type { FolderRow, FileRow, TableListProps } from '../../../components/TableList/TableList';\n\nconst BoxWithHeight = styled(Box)`\n height: 3.2rem;\n display: flex;\n align-items: center;\n`;\n\nconst TypographyMaxWidth = styled(Typography)`\n max-width: 100%;\n`;\n\nconst ActionContainer = styled(Box)`\n svg {\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\nexport const MediaLibrary = () => {\n const navigate = useNavigate();\n const {\n canRead,\n canCreate,\n canUpdate,\n canCopyLink,\n canDownload,\n canConfigureView,\n isLoading: permissionsLoading,\n } = useMediaLibraryPermissions();\n const currentFolderToEditRef = React.useRef<HTMLDivElement>();\n const { formatMessage } = useIntl();\n const { pathname } = useLocation();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams<Query>();\n const isFiltering = Boolean(query._q || query.filters);\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n const {\n data: assetsData,\n isLoading: assetsLoading,\n error: assetsError,\n } = useAssets({\n skipWhen: !canRead,\n query,\n });\n\n const {\n data: foldersData,\n isLoading: foldersLoading,\n error: foldersError,\n } = useFolders({\n enabled: canRead && assetsData?.pagination?.page === 1 && !containsAssetFilter(query),\n query,\n });\n\n const {\n data: currentFolder,\n isLoading: isCurrentFolderLoading,\n error: currentFolderError,\n } = useFolder(query?.folder as number | null | undefined, {\n enabled: canRead && !!query?.folder,\n });\n\n // Folder was not found: redirect to the media library root\n if (currentFolderError?.name === 'NotFoundError') {\n navigate(pathname);\n }\n\n const folders =\n foldersData?.map((folder) => ({\n ...folder,\n type: 'folder',\n folderURL: getFolderURL(pathname, query, {\n folder: folder.id.toString(),\n folderPath: folder.path,\n }),\n isSelectable: canUpdate,\n })) ?? [];\n const folderCount = folders?.length || 0;\n const assets =\n assetsData?.results?.map((asset) => ({ ...asset, type: 'asset', isSelectable: canUpdate })) ||\n [];\n const assetCount = assets?.length ?? 0;\n const totalAssetCount = assetsData?.pagination?.total;\n\n const isLoading = isCurrentFolderLoading || foldersLoading || permissionsLoading || assetsLoading;\n const [showUploadAssetDialog, setShowUploadAssetDialog] = React.useState(false);\n const [showEditFolderDialog, setShowEditFolderDialog] = React.useState(false);\n const [assetToEdit, setAssetToEdit] = React.useState<Asset | undefined>(undefined);\n const [folderToEdit, setFolderToEdit] = React.useState<FolderRow | undefined | null>(undefined);\n const [selected, { selectOne, selectAll }] = useSelectionState<FolderRow | FileRow>(\n ['type', 'id'],\n []\n );\n const indeterminateBulkSelect =\n selected?.length > 0 && selected?.length !== assetCount + folderCount;\n const toggleUploadAssetDialog = () => setShowUploadAssetDialog((prev) => !prev);\n const toggleEditFolderDialog = ({ created = false } = {}) => {\n // folders are only displayed on the first page, therefore\n // we have to navigate the user to that page, in case a folder\n // was created successfully in order for them to see it\n if (created && query?.page !== '1') {\n setQuery({\n ...query,\n page: 1,\n });\n }\n\n setShowEditFolderDialog((prev) => !prev);\n };\n\n const handleBulkSelect = (\n checked: boolean | 'indeterminate',\n elements?: FolderRow[] | FileRow[]\n ) => {\n if (checked) {\n trackUsage('didSelectAllMediaLibraryElements');\n }\n\n selectAll(elements as (FolderRow | FileRow)[]);\n };\n\n const handleChangeSort = (value: Query['sort'] | string) => {\n trackUsage('didSortMediaLibraryElements', {\n location: 'upload',\n sort: value,\n });\n setQuery({ sort: value as Query['sort'] });\n };\n\n const handleEditFolder = (folder: FolderRow) => {\n setFolderToEdit(folder);\n setShowEditFolderDialog(true);\n };\n\n const handleEditFolderClose = (payload?: { created?: boolean | undefined }) => {\n setFolderToEdit(null);\n toggleEditFolderDialog(payload);\n\n if (currentFolderToEditRef.current) {\n currentFolderToEditRef.current.focus();\n }\n };\n\n const handleAssetDeleted = (numberOfAssets: number) => {\n if (\n numberOfAssets === assetCount &&\n assetsData?.pagination?.page === assetsData?.pagination?.pageCount &&\n assetsData?.pagination?.page &&\n assetsData.pagination.page > 1\n ) {\n setQuery({\n ...query,\n page: assetsData.pagination.page - 1,\n });\n }\n };\n\n const handleBulkActionSuccess = () => {\n selectAll();\n\n handleAssetDeleted(selected.length);\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (assetsError || foldersError) {\n return <Page.Error />;\n }\n\n return (\n <Layouts.Root>\n <Page.Main>\n <Header\n breadcrumbs={\n !isCurrentFolderLoading\n ? (getBreadcrumbDataML(currentFolder!, {\n pathname,\n query,\n }) as HeaderProps['breadcrumbs'])\n : null\n }\n canCreate={canCreate}\n onToggleEditFolderDialog={toggleEditFolderDialog}\n onToggleUploadAssetDialog={toggleUploadAssetDialog}\n folder={currentFolder as HeaderProps['folder']}\n />\n <Layouts.Action\n startActions={\n <>\n {canUpdate && isGridView && (assetCount > 0 || folderCount > 0) && (\n <BoxWithHeight\n paddingLeft={2}\n paddingRight={2}\n background=\"neutral0\"\n hasRadius\n borderColor=\"neutral200\"\n >\n <Checkbox\n aria-label={formatMessage({\n id: getTrad('bulk.select.label'),\n defaultMessage: 'Select all folders & assets',\n })}\n checked={\n indeterminateBulkSelect\n ? 'indeterminate'\n : (assetCount > 0 || folderCount > 0) &&\n selected.length === assetCount + folderCount\n }\n onCheckedChange={(e) =>\n handleBulkSelect(e, [...assets, ...folders] as FolderRow[] | FileRow[])\n }\n />\n </BoxWithHeight>\n )}\n {canRead && isGridView && (\n <SortPicker value={query?.sort} onChangeSort={handleChangeSort} />\n )}\n {canRead && <Filters />}\n </>\n }\n endActions={\n <>\n {canConfigureView ? (\n <ActionContainer paddingTop={1} paddingBottom={1}>\n <IconButton\n tag={ReactRouterLink}\n to={{\n pathname: `${pathname}/configuration`,\n search: stringify(query, { encode: false }),\n }}\n label={formatMessage({\n id: 'app.links.configure-view',\n defaultMessage: 'Configure the view',\n })}\n >\n <Cog />\n </IconButton>\n </ActionContainer>\n ) : null}\n <ActionContainer paddingTop={1} paddingBottom={1}>\n <IconButton\n label={\n isGridView\n ? formatMessage({\n id: getTrad('view-switch.list'),\n defaultMessage: 'List View',\n })\n : formatMessage({\n id: getTrad('view-switch.grid'),\n defaultMessage: 'Grid View',\n })\n }\n onClick={() => setView(isGridView ? viewOptions.LIST : viewOptions.GRID)}\n >\n {isGridView ? <List /> : <GridIcon />}\n </IconButton>\n </ActionContainer>\n <SearchInput\n label={formatMessage({\n id: getTrad('search.label'),\n defaultMessage: 'Search for an asset',\n })}\n trackedEvent=\"didSearchMediaLibraryElements\"\n trackedEventDetails={{ location: 'upload' }}\n />\n </>\n }\n />\n\n <Layouts.Content>\n {selected.length > 0 && (\n <BulkActions\n currentFolder={currentFolder as BulkActionsProps['currentFolder']}\n selected={selected as BulkActionsProps['selected']}\n onSuccess={handleBulkActionSuccess}\n />\n )}\n\n {folderCount === 0 && assetCount === 0 && (\n <EmptyOrNoPermissions\n canCreate={canCreate}\n canRead={canRead}\n isFiltering={isFiltering}\n onActionClick={toggleUploadAssetDialog}\n />\n )}\n\n {/* TODO: fix AssetListTable should handle no assets views (loading) */}\n {canRead && !isGridView && (assetCount > 0 || folderCount > 0) && (\n <TableList\n assetCount={assetCount}\n folderCount={folderCount}\n indeterminate={indeterminateBulkSelect}\n onChangeSort={handleChangeSort}\n onChangeFolder={(folderID, folderPath) =>\n navigate(getFolderURL(pathname, query, { folder: folderID.toString(), folderPath }))\n }\n onEditAsset={setAssetToEdit as TableListProps['onEditAsset']}\n onEditFolder={handleEditFolder}\n onSelectOne={selectOne}\n onSelectAll={handleBulkSelect as TableListProps['onSelectAll']}\n rows={[...folders, ...assets] as TableListProps['rows']}\n selected={selected as TableListProps['selected']}\n shouldDisableBulkSelect={!canUpdate}\n sortQuery={query?.sort ?? ''}\n />\n )}\n\n {canRead && isGridView && (\n <>\n {folderCount > 0 && (\n <FolderGridList\n title={\n // Folders title should only appear if:\n // user is filtering and there are assets to display, to divide both type of elements\n // user is not filtering\n (((isFiltering && assetCount > 0) || !isFiltering) &&\n formatMessage(\n {\n id: getTrad('list.folders.title'),\n defaultMessage: 'Folders ({count})',\n },\n { count: folderCount }\n )) ||\n ''\n }\n >\n {folders.map((folder) => {\n const selectedFolders = selected.filter(({ type }) => type === 'folder');\n const isSelected = !!selectedFolders.find(\n (currentFolder) => currentFolder.id === folder.id\n );\n\n const url = getFolderURL(pathname, query, {\n folder: folder?.id.toString(),\n folderPath: folder?.path,\n });\n\n return (\n <Grid.Item\n col={3}\n key={`folder-${folder.id}`}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <FolderCard\n ref={\n folderToEdit && folder.id === folderToEdit.id\n ? currentFolderToEditRef\n : undefined\n }\n ariaLabel={folder.name}\n id={`folder-${folder.id}`}\n to={url}\n startAction={\n folder.isSelectable ? (\n <FolderCardCheckbox\n data-testid={`folder-checkbox-${folder.id}`}\n checked={isSelected}\n onCheckedChange={() => selectOne(folder)}\n />\n ) : null\n }\n cardActions={\n <IconButton\n label={formatMessage({\n id: getTrad('list.folder.edit'),\n defaultMessage: 'Edit folder',\n })}\n onClick={() => handleEditFolder(folder)}\n >\n <Pencil />\n </IconButton>\n }\n >\n <FolderCardBody>\n <FolderCardBodyAction to={url}>\n <Flex tag=\"h2\" direction=\"column\" alignItems=\"start\" maxWidth=\"100%\">\n <TypographyMaxWidth\n fontWeight=\"semiBold\"\n textColor=\"neutral800\"\n ellipsis\n >\n {folder.name}\n <VisuallyHidden>:</VisuallyHidden>\n </TypographyMaxWidth>\n\n <TypographyMaxWidth\n tag=\"span\"\n textColor=\"neutral600\"\n variant=\"pi\"\n ellipsis\n >\n {formatMessage(\n {\n id: getTrad('list.folder.subtitle'),\n defaultMessage:\n '{folderCount, plural, =0 {# folder} one {# folder} other {# folders}}, {filesCount, plural, =0 {# asset} one {# asset} other {# assets}}',\n },\n {\n folderCount: (folder as FolderDefinition).children?.count,\n filesCount: (folder as FolderDefinition).files?.count,\n }\n )}\n </TypographyMaxWidth>\n </Flex>\n </FolderCardBodyAction>\n </FolderCardBody>\n </FolderCard>\n </Grid.Item>\n );\n })}\n </FolderGridList>\n )}\n\n {assetCount > 0 && folderCount > 0 && (\n <Box paddingTop={6} paddingBottom={4}>\n <Divider />\n </Box>\n )}\n\n {assetCount > 0 && (\n <AssetGridList\n assets={assets}\n onEditAsset={setAssetToEdit as AssetGridListProps['onEditAsset']}\n onSelectAsset={selectOne}\n selectedAssets={\n selected.filter(\n ({ type }) => type === 'asset'\n ) as AssetGridListProps['selectedAssets']\n }\n title={\n // Assets title should only appear if:\n // - user is not filtering\n // - user is filtering and there are folders to display, to separate them\n // - user is on page 1 since folders won't appear on any other page than the first one (no need to visually separate them)\n ((!isFiltering || (isFiltering && folderCount > 0)) &&\n assetsData?.pagination?.page === 1 &&\n formatMessage(\n {\n id: getTrad('list.assets.title'),\n defaultMessage: 'Assets ({count})',\n },\n { count: totalAssetCount }\n )) ||\n ''\n }\n />\n )}\n </>\n )}\n <Pagination.Root {...assetsData?.pagination}>\n <Pagination.PageSize />\n <Pagination.Links />\n </Pagination.Root>\n </Layouts.Content>\n </Page.Main>\n {showUploadAssetDialog && (\n <UploadAssetDialog\n open={showUploadAssetDialog}\n onClose={toggleUploadAssetDialog}\n trackedLocation=\"upload\"\n folderId={query?.folder as string | number | null | undefined}\n />\n )}\n {showEditFolderDialog && (\n <EditFolderDialog\n open={showEditFolderDialog}\n onClose={() => handleEditFolderClose()}\n folder={folderToEdit as FolderDefinition}\n parentFolderId={query?.folder as string | number | null | undefined}\n location=\"upload\"\n />\n )}\n {assetToEdit && (\n <EditAssetDialog\n onClose={(editedAsset) => {\n // The asset has been deleted\n if (editedAsset === null) {\n handleAssetDeleted(1);\n }\n\n setAssetToEdit(undefined);\n }}\n open={!!assetToEdit}\n asset={assetToEdit}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n trackedLocation=\"upload\"\n />\n )}\n </Layouts.Root>\n );\n};\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { Page, useQueryParams } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { Route, Routes } from 'react-router-dom';\n\nimport { useConfig } from '../../hooks/useConfig';\nimport { getTrad } from '../../utils';\n\nimport { MediaLibrary } from './MediaLibrary/MediaLibrary';\n\nimport type { Configuration } from '../../../../shared/contracts/configuration';\n\nconst ConfigureTheView = React.lazy(async () =>\n import('./ConfigureTheView/ConfigureTheView').then((mod) => ({ default: mod.ConfigureTheView }))\n);\n\nexport const Upload = () => {\n const {\n config: { isLoading, isError, data: config },\n } = useConfig() as { config: { isLoading: boolean; isError: boolean; data: Configuration } };\n\n const [{ rawQuery }, setQuery] = useQueryParams();\n const { formatMessage } = useIntl();\n const title = formatMessage({ id: getTrad('plugin.name'), defaultMessage: 'Media Library' });\n\n React.useEffect(() => {\n if (isLoading || isError || rawQuery) {\n return;\n }\n setQuery({\n sort: config.sort,\n page: 1,\n pageSize: config.pageSize,\n });\n }, [isLoading, isError, config, rawQuery, setQuery]);\n\n if (isLoading) {\n return (\n <>\n <Page.Title>{title}</Page.Title>\n <Page.Loading />\n </>\n );\n }\n\n return (\n <Page.Main>\n {rawQuery ? (\n <React.Suspense fallback={<Page.Loading />}>\n <Routes>\n <Route index element={<MediaLibrary />} />\n <Route\n path=\"configuration\"\n element={<ConfigureTheView config={config as Configuration} />}\n />\n </Routes>\n </React.Suspense>\n ) : null}\n </Page.Main>\n );\n};\n"],"names":["getTrad","getFolderURL","useFolderCard","jsx","Box","Checkbox","useIntl","useBulkRemove","jsxs","Dialog","Button","Trash","ConfirmDialog","useNotification","useQueryClient","useFetchClient","useMutation","pluginId","useFolderStructure","normalizeAPIError","error","isEmpty","Modal","Flex","Loader","Formik","Form","Grid","Field","SelectTree","Typography","React","Folder","EmptyAssets","EmptyPermissions","Plus","useTracking","useQueryParams","filters","Popover","Filter","FilterPopover","displayedFilters","FilterList","useLocation","Layouts","Breadcrumbs","Link","NavLink","ArrowLeft","stringify","styled","useNavigate","useMediaLibraryPermissions","usePersistentState","localStorageKeys","viewOptions","useAssets","useFolders","containsAssetFilter","useFolder","useSelectionState","Page","Fragment","SortPicker","IconButton","ReactRouterLink","Cog","List","GridIcon","SearchInput","TableList","FolderGridList","currentFolder","FolderCard","Pencil","FolderCardBody","FolderCardBodyAction","VisuallyHidden","Divider","AssetGridList","Pagination","UploadAssetDialog","EditFolderDialog","EditAssetDialog","useConfig","Routes","Route"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBO,MAAM,sBAAsB,CACjC,QACA,EAAE,UAAU,YACT;AACH,QAAM,OAAyB;AAAA,IAC7B;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,IAAIA,MAAAA,QAAQ,aAAa,GAAG,gBAAgB,gBAAgB;AAAA,MACrE,MAAM,SAASC,mBAAa,UAAU,SAAS,CAAA,CAAE,IAAI;AAAA,IACvD;AAAA,EAAA;AAGE,MAAA,QAAQ,UAAU,OAAO,QAAQ,WAAW,YAAY,QAAQ,QAAQ,QAAQ;AAC7E,SAAA,KAAK,CAAA,CAAE;AAAA,EACd;AAEA,MAAI,QAAQ,UAAU,OAAO,OAAO,WAAW,UAAU;AACvD,SAAK,KAAK;AAAA,MACR,IAAI,OAAO,OAAO;AAAA,MAClB,OAAO,OAAO,OAAO;AAAA,MACrB,MAAMA,MAAA,aAAa,UAAU,SAAS,CAAA,GAAI;AAAA,QACxC,QAAQ,OAAO,OAAO,IAAI,SAAS;AAAA,QACnC,YAAY,OAAO,OAAO;AAAA,MAAA,CAC3B;AAAA,IAAA,CACF;AAAA,EACH;AAEA,MAAI,QAAQ;AACV,SAAK,KAAK;AAAA,MACR,IAAI,OAAO;AAAA,MACX,OAAO,OAAO;AAAA,IAAA,CACf;AAAA,EACH;AAEO,SAAA;AACT;ACtDa,MAAA,qBAAqB,CAAC,UAAyB;AACpD,QAAA,EAAE,OAAOC,MAAAA;AAEf,SACGC,2BAAA,IAAAC,aAAA,KAAA,EAAI,UAAS,YAAW,QAAQ,GAC/B,UAAAD,2BAAA,IAACE,aAAS,UAAA,EAAA,mBAAiB,GAAG,EAAE,UAAW,GAAG,OAAO,EACvD,CAAA;AAEJ;ACGO,MAAM,mBAAmB,CAAC,EAAE,UAAU,gBAAuC;AAC5E,QAAA,EAAE,kBAAkBC,UAAAA;AACpB,QAAA,EAAE,WAAWC,MAAAA;AAEnB,QAAM,sBAAsB,YAAY;AACtC,UAAM,OAAO,QAAQ;AACX;EAAA;AAIV,SAAAC,gCAACC,aAAAA,OAAO,MAAP,EACC,UAAA;AAAA,IAACN,2BAAAA,IAAAM,aAAA,OAAO,SAAP,EACC,UAAAN,2BAAA,IAACO,uBAAO,SAAQ,gBAAe,MAAK,KAAI,0CAAYC,MAAAA,OAAM,CAAA,CAAA,GACvD,wBAAc,EAAE,IAAI,iBAAiB,gBAAgB,UAAU,EAAA,CAClE,EACF,CAAA;AAAA,IACAR,2BAAAA,IAACS,YAAc,eAAA,EAAA,WAAW,oBAAqB,CAAA;AAAA,EACjD,EAAA,CAAA;AAEJ;ACNO,MAAM,cAAc,MAAM;AACzB,QAAA,EAAE,kBAAkBN,UAAAA;AACpB,QAAA,EAAE,uBAAuBO,YAAAA;AAC/B,QAAM,cAAcC,WAAAA;AACd,QAAA,EAAE,SAASC,YAAAA;AAEjB,QAAM,gBAAgB,CAAC,EAAE,qBAAqB,sBAAsC;AAClF,UAAM,UAAU,gBAAgB,OAAgB,CAAC,KAAK,aAAa;AAC3D,YAAA,EAAE,IAAI,KAAS,IAAA;AACf,YAAA,MAAM,SAAS,UAAU,YAAY;AAEvC,UAAA,CAAC,IAAI,GAAG,GAAG;AACT,YAAA,GAAG,IAAI;MACb;AAEI,UAAA,GAAG,EAAG,KAAK,EAAE;AAEV,aAAA;AAAA,IACT,GAAG,CAAE,CAAA;AAEL,WAAO,KAAK,6BAA6B,EAAE,GAAG,SAAS,oBAAqB,CAAA;AAAA,EAAA;AAGxE,QAAA,WAAWC,uBAIf,eAAe;AAAA,IACf,UAAU,KAAK;AACP,YAAA;AAAA,QACJ,MAAM,EAAE,KAAK;AAAA,MACX,IAAA;AAEA,UAAA,MAAM,OAAO,SAAS,GAAG;AACf,oBAAA,eAAe,CAACC,gBAAU,QAAQ,GAAG,EAAE,QAAQ,MAAM;AACrD,oBAAA,eAAe,CAACA,gBAAU,aAAa,GAAG,EAAE,QAAQ,MAAM;AAAA,MACxE;AAIY,kBAAA,eAAe,CAACA,gBAAU,SAAS,GAAG,EAAE,QAAQ,MAAM;AAE/C,yBAAA;AAAA,QACjB,MAAM;AAAA,QACN,SAAS,cAAc;AAAA,UACrB,IAAIjB,cAAQ,0BAA0B;AAAA,UACtC,gBAAgB;AAAA,QAAA,CACjB;AAAA,MAAA,CACF;AAAA,IACH;AAAA,EAAA,CACD;AAEK,QAAA,OAAO,CACX,qBACA,oBACG,SAAS,YAAY,EAAE,qBAAqB,gBAAA,CAAiB;AAE3D,SAAA,EAAE,GAAG,UAAU;AACxB;AChDa,MAAA,iBAAiB,CAAC,EAAE,SAAS,WAAW,CAAC,GAAG,oBAAyC;AAC1F,QAAA,EAAE,kBAAkBM,UAAAA;AAC1B,QAAM,EAAE,MAAM,iBAAiB,cAAcY,MAAmB,mBAAA;AAC1D,QAAA,EAAE,SAAS;AAEjB,MAAI,CAAC,iBAAiB;AACb,WAAA;AAAA,EACT;AAEA,QAAM,eAAe,OACnB,QACA,EAAE,gBACC;AACC,QAAA;AACE,UAAA,OAAO,OAAO,gBAAgB,UAAU;AACpC,cAAA,mBAAmB,OAAO,YAAY;AACtC,cAAA,KAAK,kBAAkB,QAAQ;AAC7B;MACV;AAAA,aACO,OAAO;AACR,YAAA,kBAAkBC,wBAAkB,KAAmB;AAEzD,UAAA,mBAAmB,YAAY,iBAAiB;AAC5C,cAAA,eAAe,gBAAgB,QAAQ;AAAA,UAC3C,CAAC,KAAKC,WAAU;AACd,gBAAIA,OAAM,QAAQ,MAAM,UAAU,aAAa,IAAIA,OAAM;AAElD,mBAAA;AAAA,UACT;AAAA,UACA,CAAC;AAAA,QAAA;AAGC,YAAA,CAACC,iBAAAA,QAAQ,YAAY,GAAG;AAC1B,oBAAU,YAAY;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EAAA;AAGF,MAAI,WAAW;AACb,0CACGC,aAAAA,MAAM,SAAN,EACC,UAACnB,+BAAAmB,aAAAA,MAAM,MAAN,EACC,UAAAnB,2BAAA,IAACoB,aAAK,MAAA,EAAA,gBAAe,UAAS,YAAY,GAAG,eAAe,GAC1D,UAAApB,+BAACqB,aAAAA,UACE,UAAc,cAAA;AAAA,MACb,IAAIxB,cAAQ,mBAAmB;AAAA,MAC/B,gBAAgB;AAAA,IACjB,CAAA,GACH,EACF,CAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,QAAM,kBAAmC;AAAA,IACvC,aAAa;AAAA,MACX,OAAO,eAAe,MAAM;AAAA,MAC5B,OAAO,eAAe,QAAQ,gBAAgB,CAAC,EAAE;AAAA,IACnD;AAAA,EAAA;AAIA,SAAAG,+BAACmB,aAAAA,MAAM,SAAN,EACC,yCAACG,OAAO,QAAA,EAAA,kBAAkB,OAAO,UAAU,cAAc,eAAe,iBACrE,UAAA,CAAC,EAAE,QAAQ,QAAQ,oBAClBjB,2BAAA,KAACkB,aAAK,EAAA,YAAU,MACd,UAAA;AAAA,IAAAvB,+BAACmB,aAAAA,MAAM,QAAN,EACC,yCAACA,aAAAA,MAAM,OAAN,EACE,UAAc,cAAA;AAAA,MACb,IAAItB,cAAQ,yBAAyB;AAAA,MACrC,gBAAgB;AAAA,IAAA,CACjB,GACH,EACF,CAAA;AAAA,IAEAG,2BAAAA,IAACmB,aAAAA,MAAM,MAAN,EACC,UAAAnB,2BAAA,IAACwB,aAAK,KAAA,MAAL,EAAU,KAAK,GACd,UAAAxB,2BAAAA,IAACwB,aAAAA,KAAK,MAAL,EAAU,IAAI,IAAI,KAAK,IAAI,WAAU,UAAS,YAAW,WACxD,UAAAnB,2BAAA,KAACoB,aAAM,MAAA,MAAN,EAAW,IAAG,sBACb,UAAA;AAAA,MAACzB,2BAAAA,IAAAyB,aAAAA,MAAM,OAAN,EACE,UAAc,cAAA;AAAA,QACb,IAAI5B,cAAQ,kCAAkC;AAAA,QAC9C,gBAAgB;AAAA,MACjB,CAAA,GACH;AAAA,MAEAG,2BAAA;AAAA,QAAC0B,MAAA;AAAA,QAAA;AAAA,UACC,SAAS;AAAA,UACT,UAAU,CAAC,UAA2C;AACpD,0BAAc,eAAe,KAAK;AAAA,UACpC;AAAA,UACA,cACE,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc;AAAA,UAEhE,MAAK;AAAA,UACL,kBAAkB,SAAS,cAAc,MAAM;AAAA,UAC/C,SAAQ;AAAA,UACR,OAAO,QAAQ;AAAA,UACf,kBAAiB;AAAA,QAAA;AAAA,MACnB;AAAA,MAEC,OAAO,eACN1B,2BAAAA,IAAC2B,aAAAA,YAAW,EAAA,SAAQ,MAAK,KAAI,KAAI,WAAU,aACxC,UAAA,OAAO,YACV,CAAA;AAAA,IAAA,GAEJ,EAAA,CACF,EACF,CAAA,GACF;AAAA,IAEAtB,2BAAAA,KAACc,aAAM,MAAA,QAAN,EACC,UAAA;AAAA,MAAAnB,+BAACmB,aAAAA,MAAM,OAAN,EACC,UAACnB,2BAAAA,IAAAO,aAAA,QAAA,EAAO,SAAQ,YAAW,MAAK,UAC7B,UAAA,cAAc,EAAE,IAAI,UAAU,gBAAgB,SAAS,CAAC,EAC3D,CAAA,GACF;AAAA,MACCP,2BAAA,IAAAO,aAAA,QAAA,EAAO,MAAK,UAAS,SAAS,WAC5B,UAAc,cAAA,EAAE,IAAI,4BAA4B,gBAAgB,OAAA,CAAQ,EAC3E,CAAA;AAAA,IAAA,GACF;AAAA,EAAA,GACF,GAEJ,EACF,CAAA;AAEJ;AC7IO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,WAAW,CAAC;AAAA,EACZ;AAAA,EACA;AACF,MAA2B;AACnB,QAAA,EAAE,kBAAkBJ,UAAAA;AAC1B,QAAM,CAAC,mBAAmB,oBAAoB,IAAIyB,iBAAM,SAAS,KAAK;AAEtE,QAAM,oBAAoB,MAAM;AAC9B,yBAAqB,KAAK;AAChB;EAAA;AAGZ,yCACGT,aAAM,MAAA,MAAN,EAAW,MAAM,mBAAmB,cAAc,sBACjD,UAAA;AAAA,IAACnB,2BAAAA,IAAAmB,aAAA,MAAM,SAAN,EACC,UAAAnB,2BAAA,IAACO,uBAAO,SAAQ,aAAY,MAAK,KAAI,0CAAYsB,MAAAA,QAAO,CAAA,CAAA,GACrD,wBAAc,EAAE,IAAI,eAAe,gBAAgB,QAAQ,EAAA,CAC9D,EACF,CAAA;AAAA,IACA7B,2BAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,SAAS;AAAA,QACT;AAAA,MAAA;AAAA,IACF;AAAA,EACF,EAAA,CAAA;AAEJ;ACxBa,MAAA,cAAc,CAAC,EAAE,WAAW,CAAI,GAAA,WAAW,oBAAsC;AACtF,QAAA,EAAE,kBAAkBG,UAAAA;AAC1B,QAAM,eAAe,UAAU,OAAO,SAAU,OAAO,KAAK;AAC1D,WAAO,KAAK,SAAS,YAAY,WAAW,OAAO,KAAK,SAAS,WAAW,IAAI,QAC5E,QAAQ,KAAK,OAAO,QACpB,QAAQ;AAAA,KACX,CAAC;AAEJ,SACGE,2BAAAA,KAAAe,aAAAA,MAAA,EAAK,KAAK,GAAG,eAAe,GAC3B,UAAA;AAAA,IAAApB,2BAAA,IAAC2B,aAAW,YAAA,EAAA,SAAQ,WAAU,WAAU,cACrC,UAAA;AAAA,MACC;AAAA,QACE,IAAI9B,cAAQ,sBAAsB;AAAA,QAClC,gBACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,eAAe,UAAU,OAAO,CAAC,EAAE,KAAK,MAAM,SAAS,QAAQ,EAAE;AAAA,QACjE;AAAA,MACF;AAAA,IAAA,GAEJ;AAAA,IAEAG,2BAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,IACAA,2BAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EACF,EAAA,CAAA;AAEJ;AChDA,MAAM,wBAAwB,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,MAAwD;AACtD,MAAI,aAAa;AACR,WAAA;AAAA,MACL,IAAI;AAAA,MACJ,gBAAgB;AAAA,IAAA;AAAA,EAEpB;AAEA,MAAI,SAAS;AACX,QAAI,WAAW;AACN,aAAA;AAAA,QACL,IAAI;AAAA,QACJ,gBAAgB;AAAA,MAAA;AAAA,IAEpB;AAEO,WAAA;AAAA,MACL,IAAI;AAAA,MACJ,gBAAgB;AAAA,IAAA;AAAA,EAEpB;AAEO,SAAA;AAAA,IACL,IAAI;AAAA,IACJ,gBAAgB;AAAA,EAAA;AAEpB;AAEO,MAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAiC;AACzB,QAAA,EAAE,kBAAkBG,UAAAA;AAC1B,QAAM,UAAU,sBAAsB,EAAE,aAAa,WAAW,SAAS;AAGvE,SAAAH,2BAAA;AAAA,IAAC8B,MAAA;AAAA,IAAA;AAAA,MACC,MAAM,CAAC,UAAUC,QAAmB,mBAAA;AAAA,MACpC,QACE,aACA,CAAC,8CACExB,aAAO,QAAA,EAAA,SAAQ,aAAY,WAAYP,2BAAA,IAAAgC,MAAA,MAAA,EAAK,GAAI,SAAS,eACvD,UAAc,cAAA;AAAA,QACb,IAAInC,cAAQ,2BAA2B;AAAA,QACvC,gBAAgB;AAAA,MACjB,CAAA,GACH;AAAA,MAGJ,SAAS,cAAc;AAAA,QACrB,GAAG;AAAA,QACH,IAAIA,MAAAA,QAAQ,QAAQ,EAAE;AAAA,MAAA,CACvB;AAAA,IAAA;AAAA,EAAA;AAGP;AC7DO,MAAM,UAAU,MAAM;AAC3B,QAAM,CAAC,MAAM,OAAO,IAAI+B,iBAAM,SAAS,KAAK;AACtC,QAAA,EAAE,kBAAkBzB,UAAAA;AACpB,QAAA,EAAE,eAAe8B,YAAAA;AACvB,QAAM,CAAC,EAAE,MAAA,GAAS,QAAQ,IAAIC,YAAsB,eAAA;AACpD,QAAM,UAAU,OAAO,SAAS,QAAQ,CAAA;AAElC,QAAA,qBAAwD,CAAC,gBAAgB;AACpE,aAAA,EAAE,SAAS,EAAE,MAAM,eAAe,MAAM,GAAY;AAAA,EAAA;AAGzD,QAAA,eAA+C,CAACC,aAAY;AAChE,eAAW,iCAAiC;AAAA,MAC1C,UAAU;AAAA,MACV,QAAQ,OAAO,KAAKA,SAAQA,SAAQ,SAAS,CAAC,CAAC,EAAE,CAAC;AAAA,IAAA,CACnD;AACQ,aAAA,EAAE,SAAS,EAAE,MAAMA,YAAW,MAAM,GAAY;AAAA,EAAA;AAG3D,yCACGC,aAAAA,QAAQ,MAAR,EAAa,MAAY,cAAc,SACtC,UAAA;AAAA,IAACpC,2BAAAA,IAAAoC,aAAA,QAAQ,SAAR,EACC,UAAApC,2BAAA,IAACO,uBAAO,SAAQ,YAAW,WAAYP,2BAAA,IAAAqC,MAAA,QAAA,EAAO,GAAI,MAAK,KACpD,wBAAc,EAAE,IAAI,qBAAqB,gBAAgB,WAAW,EAAA,CACvE,EACF,CAAA;AAAA,IACArC,2BAAA;AAAA,MAACsC,MAAA;AAAA,MAAA;AAAA,QAAA,kBACCC,MAAA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,IACAvC,2BAAA;AAAA,MAACwC,MAAA;AAAA,MAAA;AAAA,QACC,gBAAgB;AAAA,QAChB,eAAeD,MAAA;AAAA,QACf,gBAAgB;AAAA,MAAA;AAAA,IAClB;AAAA,EACF,EAAA,CAAA;AAEJ;ACvBO,MAAM,SAAS,CAAC;AAAA,EACrB,cAAc;AAAA,EACd;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AACF,MAAmB;AACX,QAAA,EAAE,kBAAkBpC,UAAAA;AACpB,QAAA,EAAE,aAAasC,eAAAA;AACrB,QAAM,CAAC,EAAE,OAAO,IAAIP,YAAe,eAAA;AACnC,QAAM,YAAY;AAAA,IAChB,GAAG;AAAA,IACH,QACE,QAAQ,UAAU,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,KACjE,OAAO,OAAO,KACd;AAAA,IACN,YACE,QAAQ,UAAU,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,OACjE,OAAO,OAAO,OACd;AAAA,EAAA;AAIN,SAAAlC,2BAAA;AAAA,IAAC0C,YAAAA,QAAQ;AAAA,IAAR;AAAA,MACC,OAAO,cAAc;AAAA,QACnB,IAAI7C,cAAQ,aAAa;AAAA,QACzB,gBAAgB;AAAA,MAAA,CACjB;AAAA,MACD,UACE,eACA,OAAO,gBAAgB,aACvB,UACEG,2BAAA;AAAA,QAAC2C,MAAA;AAAA,QAAA;AAAA,UACC,OAAO,cAAc;AAAA,YACnB,IAAI9C,cAAQ,8BAA8B;AAAA,YAC1C,gBAAgB;AAAA,UAAA,CACjB;AAAA,UACD;AAAA,UACA,iBAAiB,QAAQ;AAAA,QAAA;AAAA,MAC3B;AAAA,MAGJ,kBACE,UACEG,2BAAA;AAAA,QAAC4C,aAAA;AAAA,QAAA;AAAA,UACC,KAAKC,eAAA;AAAA,UACL,0CAAYC,MAAU,WAAA,EAAA;AAAA,UACtB,IAAI,GAAG,QAAQ,IAAIC,GAAAA,UAAU,WAAW,EAAE,QAAQ,MAAO,CAAA,CAAC;AAAA,UAEzD,UAAc,cAAA;AAAA,YACb,IAAIlD,cAAQ,gCAAgC;AAAA,YAC5C,gBAAgB;AAAA,UAAA,CACjB;AAAA,QAAA;AAAA,MACH;AAAA,MAGJ,eACE,aACGQ,gCAAAe,aAAAA,MAAA,EAAK,KAAK,GACT,UAAA;AAAA,QAACpB,2BAAAA,IAAAO,aAAAA,QAAA,EAAO,WAAYP,2BAAAA,IAAAgC,MAAAA,MAAA,CAAA,CAAK,GAAI,SAAQ,aAAY,SAAS,0BACvD,UAAc,cAAA;AAAA,UACb,IAAInC,cAAQ,2BAA2B;AAAA,UACvC,gBAAgB;AAAA,QACjB,CAAA,GACH;AAAA,QAEAG,2BAAAA,IAACO,uBAAO,WAAWP,+BAACgC,MAAAA,OAAK,CAAA,GAAI,SAAS,2BACnC,UAAc,cAAA;AAAA,UACb,IAAInC,cAAQ,2BAA2B;AAAA,UACvC,gBAAgB;AAAA,QACjB,CAAA,GACH;AAAA,MAAA,GACF;AAAA,IAAA;AAAA,EAAA;AAKV;AChDA,MAAM,gBAAgBmD,iBAAAA,OAAO/C,aAAAA,GAAG;AAAA;AAAA;AAAA;AAAA;AAMhC,MAAM,qBAAqB+C,iBAAAA,OAAOrB,aAAAA,UAAU;AAAA;AAAA;AAI5C,MAAM,kBAAkBqB,iBAAAA,OAAO/C,aAAAA,GAAG;AAAA;AAAA;AAAA,cAGpB,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAAA;AAK7C,MAAM,eAAe,MAAM;AAChC,QAAM,WAAWgD,eAAAA;AACX,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACTC,MAA2B,2BAAA;AACzB,QAAA,yBAAyBtB,iBAAM;AAC/B,QAAA,EAAE,kBAAkBzB,UAAAA;AACpB,QAAA,EAAE,aAAasC,eAAAA;AACf,QAAA,EAAE,eAAeR,YAAAA;AACvB,QAAM,CAAC,EAAE,MAAA,GAAS,QAAQ,IAAIC,YAAsB,eAAA;AACpD,QAAM,cAAc,QAAQ,MAAM,MAAM,MAAM,OAAO;AAC/C,QAAA,CAAC,MAAM,OAAO,IAAIiB,MAAAA,mBAAmBC,MAAAA,iBAAiB,MAAMC,kBAAY,IAAI;AAC5E,QAAA,aAAa,SAASA,MAAY,YAAA;AAElC,QAAA;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,IACX,OAAO;AAAA,MACLC,gBAAU;AAAA,IACZ,UAAU,CAAC;AAAA,IACX;AAAA,EAAA,CACD;AAEK,QAAA;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,IACX,OAAO;AAAA,MACLC,iBAAW;AAAA,IACb,SAAS,WAAW,YAAY,YAAY,SAAS,KAAK,CAACC,0BAAoB,KAAK;AAAA,IACpF;AAAA,EAAA,CACD;AAEK,QAAA;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,IACX,OAAO;AAAA,EAAA,IACLC,MAAU,UAAA,OAAO,QAAqC;AAAA,IACxD,SAAS,WAAW,CAAC,CAAC,OAAO;AAAA,EAAA,CAC9B;AAGG,MAAA,oBAAoB,SAAS,iBAAiB;AAChD,aAAS,QAAQ;AAAA,EACnB;AAEA,QAAM,UACJ,aAAa,IAAI,CAAC,YAAY;AAAA,IAC5B,GAAG;AAAA,IACH,MAAM;AAAA,IACN,WAAW3D,MAAAA,aAAa,UAAU,OAAO;AAAA,MACvC,QAAQ,OAAO,GAAG,SAAS;AAAA,MAC3B,YAAY,OAAO;AAAA,IAAA,CACpB;AAAA,IACD,cAAc;AAAA,EAAA,EACd,KAAK,CAAA;AACH,QAAA,cAAc,SAAS,UAAU;AACvC,QAAM,SACJ,YAAY,SAAS,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,MAAM,SAAS,cAAc,UAAU,EAAE,KAC1F,CAAA;AACI,QAAA,aAAa,QAAQ,UAAU;AAC/B,QAAA,kBAAkB,YAAY,YAAY;AAE1C,QAAA,YAAY,0BAA0B,kBAAkB,sBAAsB;AACpF,QAAM,CAAC,uBAAuB,wBAAwB,IAAI8B,iBAAM,SAAS,KAAK;AAC9E,QAAM,CAAC,sBAAsB,uBAAuB,IAAIA,iBAAM,SAAS,KAAK;AAC5E,QAAM,CAAC,aAAa,cAAc,IAAIA,iBAAM,SAA4B,MAAS;AACjF,QAAM,CAAC,cAAc,eAAe,IAAIA,iBAAM,SAAuC,MAAS;AAC9F,QAAM,CAAC,UAAU,EAAE,WAAW,UAAA,CAAW,IAAI8B,MAAA;AAAA,IAC3C,CAAC,QAAQ,IAAI;AAAA,IACb,CAAC;AAAA,EAAA;AAEH,QAAM,0BACJ,UAAU,SAAS,KAAK,UAAU,WAAW,aAAa;AAC5D,QAAM,0BAA0B,MAAM,yBAAyB,CAAC,SAAS,CAAC,IAAI;AAC9E,QAAM,yBAAyB,CAAC,EAAE,UAAU,MAAM,IAAI,CAAA,MAAO;AAIvD,QAAA,WAAW,OAAO,SAAS,KAAK;AACzB,eAAA;AAAA,QACP,GAAG;AAAA,QACH,MAAM;AAAA,MAAA,CACP;AAAA,IACH;AAEwB,4BAAA,CAAC,SAAS,CAAC,IAAI;AAAA,EAAA;AAGnC,QAAA,mBAAmB,CACvB,SACA,aACG;AACH,QAAI,SAAS;AACX,iBAAW,kCAAkC;AAAA,IAC/C;AAEA,cAAU,QAAmC;AAAA,EAAA;AAGzC,QAAA,mBAAmB,CAAC,UAAkC;AAC1D,eAAW,+BAA+B;AAAA,MACxC,UAAU;AAAA,MACV,MAAM;AAAA,IAAA,CACP;AACQ,aAAA,EAAE,MAAM,MAAA,CAAwB;AAAA,EAAA;AAGrC,QAAA,mBAAmB,CAAC,WAAsB;AAC9C,oBAAgB,MAAM;AACtB,4BAAwB,IAAI;AAAA,EAAA;AAGxB,QAAA,wBAAwB,CAAC,YAAgD;AAC7E,oBAAgB,IAAI;AACpB,2BAAuB,OAAO;AAE9B,QAAI,uBAAuB,SAAS;AAClC,6BAAuB,QAAQ;IACjC;AAAA,EAAA;AAGI,QAAA,qBAAqB,CAAC,mBAA2B;AACrD,QACE,mBAAmB,cACnB,YAAY,YAAY,SAAS,YAAY,YAAY,aACzD,YAAY,YAAY,QACxB,WAAW,WAAW,OAAO,GAC7B;AACS,eAAA;AAAA,QACP,GAAG;AAAA,QACH,MAAM,WAAW,WAAW,OAAO;AAAA,MAAA,CACpC;AAAA,IACH;AAAA,EAAA;AAGF,QAAM,0BAA0B,MAAM;AAC1B;AAEV,uBAAmB,SAAS,MAAM;AAAA,EAAA;AAGpC,MAAI,WAAW;AACN,WAAA1D,+BAAC2D,YAAAA,KAAK,SAAL,CAAa,CAAA;AAAA,EACvB;AAEA,MAAI,eAAe,cAAc;AACxB,WAAA3D,+BAAC2D,YAAAA,KAAK,OAAL,CAAW,CAAA;AAAA,EACrB;AAGE,SAAAtD,gCAACqC,YAAAA,QAAQ,MAAR,EACC,UAAA;AAAA,IAACrC,2BAAAA,KAAAsD,YAAA,KAAK,MAAL,EACC,UAAA;AAAA,MAAA3D,2BAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,aACE,CAAC,yBACI,oBAAoB,eAAgB;AAAA,YACnC;AAAA,YACA;AAAA,UACD,CAAA,IACD;AAAA,UAEN;AAAA,UACA,0BAA0B;AAAA,UAC1B,2BAA2B;AAAA,UAC3B,QAAQ;AAAA,QAAA;AAAA,MACV;AAAA,MACAA,2BAAA;AAAA,QAAC0C,YAAAA,QAAQ;AAAA,QAAR;AAAA,UACC,cAEKrC,2BAAA,KAAAuD,qBAAA,EAAA,UAAA;AAAA,YAAA,aAAa,eAAe,aAAa,KAAK,cAAc,MAC3D5D,2BAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,aAAa;AAAA,gBACb,cAAc;AAAA,gBACd,YAAW;AAAA,gBACX,WAAS;AAAA,gBACT,aAAY;AAAA,gBAEZ,UAAAA,2BAAA;AAAA,kBAACE,aAAA;AAAA,kBAAA;AAAA,oBACC,cAAY,cAAc;AAAA,sBACxB,IAAIL,cAAQ,mBAAmB;AAAA,sBAC/B,gBAAgB;AAAA,oBAAA,CACjB;AAAA,oBACD,SACE,0BACI,mBACC,aAAa,KAAK,cAAc,MACjC,SAAS,WAAW,aAAa;AAAA,oBAEvC,iBAAiB,CAAC,MAChB,iBAAiB,GAAG,CAAC,GAAG,QAAQ,GAAG,OAAO,CAA4B;AAAA,kBAAA;AAAA,gBAE1E;AAAA,cAAA;AAAA,YACF;AAAA,YAED,WAAW,cACTG,2BAAA,IAAA6D,kBAAA,EAAW,OAAO,OAAO,MAAM,cAAc,kBAAkB;AAAA,YAEjE,0CAAY,SAAQ,EAAA;AAAA,UAAA,GACvB;AAAA,UAEF,YAEKxD,2BAAA,KAAAuD,qBAAA,EAAA,UAAA;AAAA,YAAA,mBACE5D,2BAAAA,IAAA,iBAAA,EAAgB,YAAY,GAAG,eAAe,GAC7C,UAAAA,2BAAA;AAAA,cAAC8D,aAAA;AAAA,cAAA;AAAA,gBACC,KAAKC,eAAA;AAAA,gBACL,IAAI;AAAA,kBACF,UAAU,GAAG,QAAQ;AAAA,kBACrB,QAAQhB,GAAAA,UAAU,OAAO,EAAE,QAAQ,OAAO;AAAA,gBAC5C;AAAA,gBACA,OAAO,cAAc;AAAA,kBACnB,IAAI;AAAA,kBACJ,gBAAgB;AAAA,gBAAA,CACjB;AAAA,gBAED,yCAACiB,MAAI,KAAA,EAAA;AAAA,cAAA;AAAA,eAET,IACE;AAAA,YACHhE,2BAAA,IAAA,iBAAA,EAAgB,YAAY,GAAG,eAAe,GAC7C,UAAAA,2BAAA;AAAA,cAAC8D,aAAA;AAAA,cAAA;AAAA,gBACC,OACE,aACI,cAAc;AAAA,kBACZ,IAAIjE,cAAQ,kBAAkB;AAAA,kBAC9B,gBAAgB;AAAA,gBACjB,CAAA,IACD,cAAc;AAAA,kBACZ,IAAIA,cAAQ,kBAAkB;AAAA,kBAC9B,gBAAgB;AAAA,gBAAA,CACjB;AAAA,gBAEP,SAAS,MAAM,QAAQ,aAAawD,MAAY,YAAA,OAAOA,kBAAY,IAAI;AAAA,gBAEtE,UAAa,aAAArD,2BAAAA,IAACiE,MAAK,MAAA,CAAA,CAAA,mCAAMC,MAAS,UAAA,EAAA;AAAA,cAAA;AAAA,YAAA,GAEvC;AAAA,YACAlE,2BAAA;AAAA,cAACmE,YAAA;AAAA,cAAA;AAAA,gBACC,OAAO,cAAc;AAAA,kBACnB,IAAItE,cAAQ,cAAc;AAAA,kBAC1B,gBAAgB;AAAA,gBAAA,CACjB;AAAA,gBACD,cAAa;AAAA,gBACb,qBAAqB,EAAE,UAAU,SAAS;AAAA,cAAA;AAAA,YAC5C;AAAA,UAAA,GACF;AAAA,QAAA;AAAA,MAEJ;AAAA,MAEAQ,2BAAAA,KAACqC,YAAQ,QAAA,SAAR,EACE,UAAA;AAAA,QAAA,SAAS,SAAS,KACjB1C,2BAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,WAAW;AAAA,UAAA;AAAA,QACb;AAAA,QAGD,gBAAgB,KAAK,eAAe,KACnCA,2BAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA,eAAe;AAAA,UAAA;AAAA,QACjB;AAAA,QAID,WAAW,CAAC,eAAe,aAAa,KAAK,cAAc,MAC1DA,2BAAA;AAAA,UAACoE,MAAA;AAAA,UAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,eAAe;AAAA,YACf,cAAc;AAAA,YACd,gBAAgB,CAAC,UAAU,eACzB,SAAStE,MAAa,aAAA,UAAU,OAAO,EAAE,QAAQ,SAAS,SAAA,GAAY,WAAY,CAAA,CAAC;AAAA,YAErF,aAAa;AAAA,YACb,cAAc;AAAA,YACd,aAAa;AAAA,YACb,aAAa;AAAA,YACb,MAAM,CAAC,GAAG,SAAS,GAAG,MAAM;AAAA,YAC5B;AAAA,YACA,yBAAyB,CAAC;AAAA,YAC1B,WAAW,OAAO,QAAQ;AAAA,UAAA;AAAA,QAC5B;AAAA,QAGD,WAAW,cAEPO,2BAAAA,KAAAuD,WAAA,UAAA,EAAA,UAAA;AAAA,UAAA,cAAc,KACb5D,2BAAA;AAAA,YAACqE,MAAA;AAAA,YAAA;AAAA,cACC;AAAA;AAAA;AAAA;AAAA,iBAIK,eAAe,aAAa,KAAM,CAAC,gBACpC;AAAA,kBACE;AAAA,oBACE,IAAIxE,cAAQ,oBAAoB;AAAA,oBAChC,gBAAgB;AAAA,kBAClB;AAAA,kBACA,EAAE,OAAO,YAAY;AAAA,gBAAA,KAEzB;AAAA;AAAA,cAGD,UAAA,QAAQ,IAAI,CAAC,WAAW;AACjB,sBAAA,kBAAkB,SAAS,OAAO,CAAC,EAAE,WAAW,SAAS,QAAQ;AACjE,sBAAA,aAAa,CAAC,CAAC,gBAAgB;AAAA,kBACnC,CAACyE,mBAAkBA,eAAc,OAAO,OAAO;AAAA,gBAAA;AAG3C,sBAAA,MAAMxE,MAAAA,aAAa,UAAU,OAAO;AAAA,kBACxC,QAAQ,QAAQ,GAAG,SAAS;AAAA,kBAC5B,YAAY,QAAQ;AAAA,gBAAA,CACrB;AAGC,uBAAAE,2BAAA;AAAA,kBAACwB,aAAAA,KAAK;AAAA,kBAAL;AAAA,oBACC,KAAK;AAAA,oBAEL,WAAU;AAAA,oBACV,YAAW;AAAA,oBAEX,UAAAxB,2BAAA;AAAA,sBAACuE,MAAA;AAAA,sBAAA;AAAA,wBACC,KACE,gBAAgB,OAAO,OAAO,aAAa,KACvC,yBACA;AAAA,wBAEN,WAAW,OAAO;AAAA,wBAClB,IAAI,UAAU,OAAO,EAAE;AAAA,wBACvB,IAAI;AAAA,wBACJ,aACE,OAAO,eACLvE,2BAAA;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,eAAa,mBAAmB,OAAO,EAAE;AAAA,4BACzC,SAAS;AAAA,4BACT,iBAAiB,MAAM,UAAU,MAAM;AAAA,0BAAA;AAAA,wBAAA,IAEvC;AAAA,wBAEN,aACEA,2BAAA;AAAA,0BAAC8D,aAAA;AAAA,0BAAA;AAAA,4BACC,OAAO,cAAc;AAAA,8BACnB,IAAIjE,cAAQ,kBAAkB;AAAA,8BAC9B,gBAAgB;AAAA,4BAAA,CACjB;AAAA,4BACD,SAAS,MAAM,iBAAiB,MAAM;AAAA,4BAEtC,yCAAC2E,MAAO,QAAA,EAAA;AAAA,0BAAA;AAAA,wBACV;AAAA,wBAGF,UAACxE,2BAAAA,IAAAyE,MAAA,gBAAA,EACC,UAACzE,+BAAA0E,MAAAA,sBAAA,EAAqB,IAAI,KACxB,UAAArE,2BAAAA,KAACe,aAAAA,MAAK,EAAA,KAAI,MAAK,WAAU,UAAS,YAAW,SAAQ,UAAS,QAC5D,UAAA;AAAA,0BAAAf,2BAAA;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,YAAW;AAAA,8BACX,WAAU;AAAA,8BACV,UAAQ;AAAA,8BAEP,UAAA;AAAA,gCAAO,OAAA;AAAA,gCACRL,2BAAAA,IAAC2E,+BAAe,UAAC,IAAA,CAAA;AAAA,8BAAA;AAAA,4BAAA;AAAA,0BACnB;AAAA,0BAEA3E,2BAAA;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,KAAI;AAAA,8BACJ,WAAU;AAAA,8BACV,SAAQ;AAAA,8BACR,UAAQ;AAAA,8BAEP,UAAA;AAAA,gCACC;AAAA,kCACE,IAAIH,cAAQ,sBAAsB;AAAA,kCAClC,gBACE;AAAA,gCACJ;AAAA,gCACA;AAAA,kCACE,aAAc,OAA4B,UAAU;AAAA,kCACpD,YAAa,OAA4B,OAAO;AAAA,gCAClD;AAAA,8BACF;AAAA,4BAAA;AAAA,0BACF;AAAA,wBAAA,EACF,CAAA,EACF,CAAA,GACF;AAAA,sBAAA;AAAA,oBACF;AAAA,kBAAA;AAAA,kBAnEK,UAAU,OAAO,EAAE;AAAA,gBAAA;AAAA,cAoE1B,CAEH;AAAA,YAAA;AAAA,UACH;AAAA,UAGD,aAAa,KAAK,cAAc,KAC9BG,2BAAA,IAAAC,aAAA,KAAA,EAAI,YAAY,GAAG,eAAe,GACjC,UAACD,2BAAA,IAAA4E,aAAA,SAAA,CAAQ,CAAA,GACX;AAAA,UAGD,aAAa,KACZ5E,2BAAA;AAAA,YAAC6E,MAAA;AAAA,YAAA;AAAA,cACC;AAAA,cACA,aAAa;AAAA,cACb,eAAe;AAAA,cACf,gBACE,SAAS;AAAA,gBACP,CAAC,EAAE,WAAW,SAAS;AAAA,cACzB;AAAA,cAEF;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKI,CAAC,eAAgB,eAAe,cAAc,MAC9C,YAAY,YAAY,SAAS,KACjC;AAAA,kBACE;AAAA,oBACE,IAAIhF,cAAQ,mBAAmB;AAAA,oBAC/B,gBAAgB;AAAA,kBAClB;AAAA,kBACA,EAAE,OAAO,gBAAgB;AAAA,gBAAA,KAE7B;AAAA;AAAA,YAAA;AAAA,UAEJ;AAAA,QAAA,GAEJ;AAAA,wCAEDiF,YAAW,WAAA,MAAX,EAAiB,GAAG,YAAY,YAC/B,UAAA;AAAA,UAAC9E,+BAAA8E,YAAAA,WAAW,UAAX,EAAoB;AAAA,UACrB9E,+BAAC8E,YAAAA,WAAW,OAAX,EAAiB;AAAA,QAAA,GACpB;AAAA,MAAA,GACF;AAAA,IAAA,GACF;AAAA,IACC,yBACC9E,2BAAA;AAAA,MAAC+E,MAAA;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAS;AAAA,QACT,iBAAgB;AAAA,QAChB,UAAU,OAAO;AAAA,MAAA;AAAA,IACnB;AAAA,IAED,wBACC/E,2BAAA;AAAA,MAACgF,MAAA;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAS,MAAM,sBAAsB;AAAA,QACrC,QAAQ;AAAA,QACR,gBAAgB,OAAO;AAAA,QACvB,UAAS;AAAA,MAAA;AAAA,IACX;AAAA,IAED,eACChF,2BAAA;AAAA,MAACiF,MAAA;AAAA,MAAA;AAAA,QACC,SAAS,CAAC,gBAAgB;AAExB,cAAI,gBAAgB,MAAM;AACxB,+BAAmB,CAAC;AAAA,UACtB;AAEA,yBAAe,MAAS;AAAA,QAC1B;AAAA,QACA,MAAM,CAAC,CAAC;AAAA,QACR,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA,iBAAgB;AAAA,MAAA;AAAA,IAClB;AAAA,EAEJ,EAAA,CAAA;AAEJ;AChiBA,MAAM,mBAAmBrD,iBAAM;AAAA,EAAK,YAClC,QAAO,QAAA,EAAA,KAAA,MAAA,QAAA,gCAAqC,GAAE,KAAK,CAAC,SAAS,EAAE,SAAS,IAAI,iBAAA,EAAmB;AACjG;AAEO,MAAM,SAAS,MAAM;AACpB,QAAA;AAAA,IACJ,QAAQ,EAAE,WAAW,SAAS,MAAM,OAAO;AAAA,MACzCsD,MAAU,UAAA;AAEd,QAAM,CAAC,EAAE,SAAA,GAAY,QAAQ,IAAIhD,YAAe,eAAA;AAC1C,QAAA,EAAE,kBAAkB/B,UAAAA;AACpB,QAAA,QAAQ,cAAc,EAAE,IAAIN,MAAAA,QAAQ,aAAa,GAAG,gBAAgB,gBAAA,CAAiB;AAE3F+B,mBAAM,UAAU,MAAM;AAChB,QAAA,aAAa,WAAW,UAAU;AACpC;AAAA,IACF;AACS,aAAA;AAAA,MACP,MAAM,OAAO;AAAA,MACb,MAAM;AAAA,MACN,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA,GACA,CAAC,WAAW,SAAS,QAAQ,UAAU,QAAQ,CAAC;AAEnD,MAAI,WAAW;AACb,WAEIvB,2BAAA,KAAAuD,qBAAA,EAAA,UAAA;AAAA,MAAC5D,2BAAAA,IAAA2D,YAAAA,KAAK,OAAL,EAAY,UAAM,MAAA,CAAA;AAAA,MACnB3D,+BAAC2D,YAAAA,KAAK,SAAL,EAAa;AAAA,IAChB,EAAA,CAAA;AAAA,EAEJ;AAEA,wCACGA,YAAK,KAAA,MAAL,EACE,UAAA,0CACE/B,iBAAM,UAAN,EAAe,yCAAW+B,YAAAA,KAAK,SAAL,CAAa,CAAA,GACtC,0CAACwB,uBACC,EAAA,UAAA;AAAA,IAAAnF,+BAACoF,eAAAA,SAAM,OAAK,MAAC,SAASpF,+BAAC,eAAa,CAAA,GAAI;AAAA,IACxCA,2BAAA;AAAA,MAACoF,eAAA;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAUpF,2BAAA,IAAA,kBAAA,EAAiB,OAAiC,CAAA;AAAA,MAAA;AAAA,IAC9D;AAAA,EACF,EAAA,CAAA,EACF,CAAA,IACE,KACN,CAAA;AAEJ;;"}
|