@strapi/upload 0.0.0 → 5.0.0-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/README.md +1 -1
  2. package/dist/_chunks/ca-B2_I-q1t.mjs +121 -0
  3. package/dist/_chunks/ca-B2_I-q1t.mjs.map +1 -0
  4. package/dist/_chunks/ca-BUpuZx8N.js +121 -0
  5. package/dist/_chunks/ca-BUpuZx8N.js.map +1 -0
  6. package/dist/_chunks/de-A7mEKx6c.mjs +107 -0
  7. package/dist/_chunks/de-A7mEKx6c.mjs.map +1 -0
  8. package/dist/_chunks/de-uGb_Pkq7.js +107 -0
  9. package/dist/_chunks/de-uGb_Pkq7.js.map +1 -0
  10. package/dist/_chunks/dk-BPfkJb9q.mjs +103 -0
  11. package/dist/_chunks/dk-BPfkJb9q.mjs.map +1 -0
  12. package/dist/_chunks/dk-Cd8oFO-O.js +103 -0
  13. package/dist/_chunks/dk-Cd8oFO-O.js.map +1 -0
  14. package/dist/_chunks/en-BcOqhiNe.js +144 -0
  15. package/dist/_chunks/en-BcOqhiNe.js.map +1 -0
  16. package/dist/_chunks/en-oDx2Gnre.mjs +144 -0
  17. package/dist/_chunks/en-oDx2Gnre.mjs.map +1 -0
  18. package/dist/_chunks/es-CuWi2pOn.mjs +120 -0
  19. package/dist/_chunks/es-CuWi2pOn.mjs.map +1 -0
  20. package/dist/_chunks/es-DWFtw_h4.js +120 -0
  21. package/dist/_chunks/es-DWFtw_h4.js.map +1 -0
  22. package/dist/_chunks/fr-BN6ndmWf.mjs +144 -0
  23. package/dist/_chunks/fr-BN6ndmWf.mjs.map +1 -0
  24. package/dist/_chunks/fr-D2bop66d.js +144 -0
  25. package/dist/_chunks/fr-D2bop66d.js.map +1 -0
  26. package/dist/_chunks/graphql-BVCZSNa2.mjs +71 -0
  27. package/dist/_chunks/graphql-BVCZSNa2.mjs.map +1 -0
  28. package/dist/_chunks/graphql-Beol7Y3b.js +71 -0
  29. package/dist/_chunks/graphql-Beol7Y3b.js.map +1 -0
  30. package/dist/_chunks/he-BpxHjaZg.js +76 -0
  31. package/dist/_chunks/he-BpxHjaZg.js.map +1 -0
  32. package/dist/_chunks/he-C9ZOXBB-.mjs +76 -0
  33. package/dist/_chunks/he-C9ZOXBB-.mjs.map +1 -0
  34. package/dist/_chunks/index-BI7qD8h6.mjs +865 -0
  35. package/dist/_chunks/index-BI7qD8h6.mjs.map +1 -0
  36. package/dist/_chunks/index-BL34bU2o.mjs +241 -0
  37. package/dist/_chunks/index-BL34bU2o.mjs.map +1 -0
  38. package/dist/_chunks/index-BNV9vUuq.js +869 -0
  39. package/dist/_chunks/index-BNV9vUuq.js.map +1 -0
  40. package/dist/_chunks/index-CRhNpXFr.js +2632 -0
  41. package/dist/_chunks/index-CRhNpXFr.js.map +1 -0
  42. package/dist/_chunks/index-CWDl5PEs.mjs +208 -0
  43. package/dist/_chunks/index-CWDl5PEs.mjs.map +1 -0
  44. package/dist/_chunks/index-CtyJq8P-.js +6562 -0
  45. package/dist/_chunks/index-CtyJq8P-.js.map +1 -0
  46. package/dist/_chunks/index-DU4hcIHO.js +245 -0
  47. package/dist/_chunks/index-DU4hcIHO.js.map +1 -0
  48. package/dist/_chunks/index-VKvfSVC7.mjs +2622 -0
  49. package/dist/_chunks/index-VKvfSVC7.mjs.map +1 -0
  50. package/dist/_chunks/index-ZXpABToX.mjs +6534 -0
  51. package/dist/_chunks/index-ZXpABToX.mjs.map +1 -0
  52. package/dist/_chunks/index-jJSqYu6S.js +213 -0
  53. package/dist/_chunks/index-jJSqYu6S.js.map +1 -0
  54. package/dist/_chunks/it-B7rmoZNx.mjs +76 -0
  55. package/dist/_chunks/it-B7rmoZNx.mjs.map +1 -0
  56. package/dist/_chunks/it-BKCWXl8t.js +76 -0
  57. package/dist/_chunks/it-BKCWXl8t.js.map +1 -0
  58. package/dist/_chunks/ja-DlaJTi_3.mjs +76 -0
  59. package/dist/_chunks/ja-DlaJTi_3.mjs.map +1 -0
  60. package/dist/_chunks/ja-ajHzIJz6.js +76 -0
  61. package/dist/_chunks/ja-ajHzIJz6.js.map +1 -0
  62. package/dist/_chunks/ko-Pzj-818C.js +106 -0
  63. package/dist/_chunks/ko-Pzj-818C.js.map +1 -0
  64. package/dist/_chunks/ko-vJl9kPpn.mjs +106 -0
  65. package/dist/_chunks/ko-vJl9kPpn.mjs.map +1 -0
  66. package/dist/_chunks/ms-CqwG8v8l.mjs +68 -0
  67. package/dist/_chunks/ms-CqwG8v8l.mjs.map +1 -0
  68. package/dist/_chunks/ms-h3gjldBy.js +68 -0
  69. package/dist/_chunks/ms-h3gjldBy.js.map +1 -0
  70. package/dist/_chunks/pl-Cj8jChOO.mjs +105 -0
  71. package/dist/_chunks/pl-Cj8jChOO.mjs.map +1 -0
  72. package/dist/_chunks/pl-esgZ7ltN.js +105 -0
  73. package/dist/_chunks/pl-esgZ7ltN.js.map +1 -0
  74. package/dist/_chunks/pt-BR-B4LJHJIp.mjs +76 -0
  75. package/dist/_chunks/pt-BR-B4LJHJIp.mjs.map +1 -0
  76. package/dist/_chunks/pt-BR-Cazr7Z5I.js +76 -0
  77. package/dist/_chunks/pt-BR-Cazr7Z5I.js.map +1 -0
  78. package/dist/_chunks/pt-CNOOM_7x.mjs +76 -0
  79. package/dist/_chunks/pt-CNOOM_7x.mjs.map +1 -0
  80. package/dist/_chunks/pt-cbUnkHM5.js +76 -0
  81. package/dist/_chunks/pt-cbUnkHM5.js.map +1 -0
  82. package/dist/_chunks/ru-DqglvSUC.mjs +76 -0
  83. package/dist/_chunks/ru-DqglvSUC.mjs.map +1 -0
  84. package/dist/_chunks/ru-H6MzFUxp.js +76 -0
  85. package/dist/_chunks/ru-H6MzFUxp.js.map +1 -0
  86. package/dist/_chunks/sk-CZxC4dFY.js +122 -0
  87. package/dist/_chunks/sk-CZxC4dFY.js.map +1 -0
  88. package/dist/_chunks/sk-Dgpb3lnz.mjs +122 -0
  89. package/dist/_chunks/sk-Dgpb3lnz.mjs.map +1 -0
  90. package/dist/_chunks/th-C6unJZ8j.js +76 -0
  91. package/dist/_chunks/th-C6unJZ8j.js.map +1 -0
  92. package/dist/_chunks/th-DRfzuiFf.mjs +76 -0
  93. package/dist/_chunks/th-DRfzuiFf.mjs.map +1 -0
  94. package/dist/_chunks/tr--GzWXE_A.mjs +122 -0
  95. package/dist/_chunks/tr--GzWXE_A.mjs.map +1 -0
  96. package/dist/_chunks/tr-CY6AwX50.js +122 -0
  97. package/dist/_chunks/tr-CY6AwX50.js.map +1 -0
  98. package/dist/_chunks/uk-BniyNsD4.js +73 -0
  99. package/dist/_chunks/uk-BniyNsD4.js.map +1 -0
  100. package/dist/_chunks/uk-DVMT2Piq.mjs +73 -0
  101. package/dist/_chunks/uk-DVMT2Piq.mjs.map +1 -0
  102. package/dist/_chunks/zh-CsZw0IpM.js +129 -0
  103. package/dist/_chunks/zh-CsZw0IpM.js.map +1 -0
  104. package/dist/_chunks/zh-HOnih0is.mjs +129 -0
  105. package/dist/_chunks/zh-HOnih0is.mjs.map +1 -0
  106. package/dist/_chunks/zh-Hans-Cpmhg8uH.mjs +152 -0
  107. package/dist/_chunks/zh-Hans-Cpmhg8uH.mjs.map +1 -0
  108. package/dist/_chunks/zh-Hans-k_xAc6nm.js +152 -0
  109. package/dist/_chunks/zh-Hans-k_xAc6nm.js.map +1 -0
  110. package/dist/admin/index.js +4 -0
  111. package/dist/admin/index.js.map +1 -0
  112. package/dist/admin/index.mjs +5 -0
  113. package/dist/admin/index.mjs.map +1 -0
  114. package/dist/server/index.js +4 -0
  115. package/dist/server/index.js.map +1 -0
  116. package/dist/server/index.mjs +5 -0
  117. package/dist/server/index.mjs.map +1 -0
  118. package/dist/server/src/bootstrap.d.ts +5 -0
  119. package/dist/server/src/bootstrap.d.ts.map +1 -0
  120. package/dist/server/src/config.d.ts +10 -0
  121. package/dist/server/src/config.d.ts.map +1 -0
  122. package/dist/server/src/constants.d.ts +20 -0
  123. package/dist/server/src/constants.d.ts.map +1 -0
  124. package/dist/server/src/content-types/file.d.ts +110 -0
  125. package/dist/server/src/content-types/file.d.ts.map +1 -0
  126. package/dist/server/src/content-types/folder.d.ts +61 -0
  127. package/dist/server/src/content-types/folder.d.ts.map +1 -0
  128. package/dist/server/src/content-types/index.d.ts +170 -0
  129. package/dist/server/src/content-types/index.d.ts.map +1 -0
  130. package/dist/server/src/controllers/admin-file.d.ts +16 -0
  131. package/dist/server/src/controllers/admin-file.d.ts.map +1 -0
  132. package/dist/server/src/controllers/admin-folder-file.d.ts +7 -0
  133. package/dist/server/src/controllers/admin-folder-file.d.ts.map +1 -0
  134. package/dist/server/src/controllers/admin-folder.d.ts +10 -0
  135. package/dist/server/src/controllers/admin-folder.d.ts.map +1 -0
  136. package/dist/server/src/controllers/admin-settings.d.ts +7 -0
  137. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -0
  138. package/dist/server/src/controllers/admin-upload.d.ts +9 -0
  139. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -0
  140. package/dist/server/src/controllers/content-api.d.ts +15 -0
  141. package/dist/server/src/controllers/content-api.d.ts.map +1 -0
  142. package/dist/server/src/controllers/index.d.ts +53 -0
  143. package/dist/server/src/controllers/index.d.ts.map +1 -0
  144. package/dist/server/src/controllers/utils/find-entity-and-check-permissions.d.ts +6 -0
  145. package/dist/server/src/controllers/utils/find-entity-and-check-permissions.d.ts.map +1 -0
  146. package/dist/server/src/controllers/utils/folders.d.ts +4 -0
  147. package/dist/server/src/controllers/utils/folders.d.ts.map +1 -0
  148. package/dist/server/src/controllers/validation/admin/configureView.d.ts +15 -0
  149. package/dist/server/src/controllers/validation/admin/configureView.d.ts.map +1 -0
  150. package/dist/server/src/controllers/validation/admin/folder-file.d.ts +3 -0
  151. package/dist/server/src/controllers/validation/admin/folder-file.d.ts.map +1 -0
  152. package/dist/server/src/controllers/validation/admin/folder.d.ts +3 -0
  153. package/dist/server/src/controllers/validation/admin/folder.d.ts.map +1 -0
  154. package/dist/server/src/controllers/validation/admin/settings.d.ts +18 -0
  155. package/dist/server/src/controllers/validation/admin/settings.d.ts.map +1 -0
  156. package/dist/server/src/controllers/validation/admin/upload.d.ts +109 -0
  157. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -0
  158. package/dist/server/src/controllers/validation/admin/utils.d.ts +3 -0
  159. package/dist/server/src/controllers/validation/admin/utils.d.ts.map +1 -0
  160. package/dist/server/src/controllers/validation/content-api/upload.d.ts +91 -0
  161. package/dist/server/src/controllers/validation/content-api/upload.d.ts.map +1 -0
  162. package/dist/server/src/controllers/view-configuration.d.ts +7 -0
  163. package/dist/server/src/controllers/view-configuration.d.ts.map +1 -0
  164. package/dist/server/src/graphql.d.ts +5 -0
  165. package/dist/server/src/graphql.d.ts.map +1 -0
  166. package/dist/server/src/index.d.ts +475 -0
  167. package/dist/server/src/index.d.ts.map +1 -0
  168. package/dist/server/src/middlewares/upload.d.ts +9 -0
  169. package/dist/server/src/middlewares/upload.d.ts.map +1 -0
  170. package/dist/server/src/register.d.ts +8 -0
  171. package/dist/server/src/register.d.ts.map +1 -0
  172. package/dist/server/src/routes/admin.d.ts +17 -0
  173. package/dist/server/src/routes/admin.d.ts.map +1 -0
  174. package/dist/server/src/routes/content-api.d.ts +9 -0
  175. package/dist/server/src/routes/content-api.d.ts.map +1 -0
  176. package/dist/server/src/routes/index.d.ts +43 -0
  177. package/dist/server/src/routes/index.d.ts.map +1 -0
  178. package/dist/server/src/routes/view-configuration.d.ts +17 -0
  179. package/dist/server/src/routes/view-configuration.d.ts.map +1 -0
  180. package/dist/server/src/services/api-upload-folder.d.ts +5 -0
  181. package/dist/server/src/services/api-upload-folder.d.ts.map +1 -0
  182. package/dist/server/src/services/extensions/content-manager/entity-manager.d.ts +15 -0
  183. package/dist/server/src/services/extensions/content-manager/entity-manager.d.ts.map +1 -0
  184. package/dist/server/src/services/extensions/content-manager/index.d.ts +4 -0
  185. package/dist/server/src/services/extensions/content-manager/index.d.ts.map +1 -0
  186. package/dist/server/src/services/extensions/core/entity-service.d.ts +4 -0
  187. package/dist/server/src/services/extensions/core/entity-service.d.ts.map +1 -0
  188. package/dist/server/src/services/extensions/core/index.d.ts +4 -0
  189. package/dist/server/src/services/extensions/core/index.d.ts.map +1 -0
  190. package/dist/server/src/services/extensions/index.d.ts +8 -0
  191. package/dist/server/src/services/extensions/index.d.ts.map +1 -0
  192. package/dist/server/src/services/extensions/utils.d.ts +14 -0
  193. package/dist/server/src/services/extensions/utils.d.ts.map +1 -0
  194. package/dist/server/src/services/file.d.ts +8 -0
  195. package/dist/server/src/services/file.d.ts.map +1 -0
  196. package/dist/server/src/services/folder.d.ts +32 -0
  197. package/dist/server/src/services/folder.d.ts.map +1 -0
  198. package/dist/server/src/services/image-manipulation.d.ts +63 -0
  199. package/dist/server/src/services/image-manipulation.d.ts.map +1 -0
  200. package/dist/server/src/services/index.d.ts +196 -0
  201. package/dist/server/src/services/index.d.ts.map +1 -0
  202. package/dist/server/src/services/metrics.d.ts +8 -0
  203. package/dist/server/src/services/metrics.d.ts.map +1 -0
  204. package/dist/server/src/services/provider.d.ts +10 -0
  205. package/dist/server/src/services/provider.d.ts.map +1 -0
  206. package/dist/server/src/services/upload.d.ts +67 -0
  207. package/dist/server/src/services/upload.d.ts.map +1 -0
  208. package/dist/server/src/services/weekly-metrics.d.ts +17 -0
  209. package/dist/server/src/services/weekly-metrics.d.ts.map +1 -0
  210. package/dist/server/src/types.d.ts +74 -0
  211. package/dist/server/src/types.d.ts.map +1 -0
  212. package/dist/server/src/utils/cron.d.ts +3 -0
  213. package/dist/server/src/utils/cron.d.ts.map +1 -0
  214. package/dist/server/src/utils/index.d.ts +23 -0
  215. package/dist/server/src/utils/index.d.ts.map +1 -0
  216. package/package.json +100 -7
  217. package/strapi-server.js +3 -0
@@ -0,0 +1,865 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { useState, useRef, lazy, useEffect, Suspense } from "react";
3
+ import { ConfirmDialog, useNotification, useFetchClient, useTracking, useQueryParams, Page, SearchInput, Pagination } from "@strapi/admin/strapi-admin";
4
+ import { useIntl } from "react-intl";
5
+ import { useLocation, useNavigate, Link as Link$1, Routes, Route } from "react-router-dom";
6
+ import { g as getTrad, a as getFolderURL, u as useFolderCard, A as AssetDefinition, F as FolderDefinition, b as useBulkRemove, p as pluginId, c as useFolderStructure, S as SelectTree, n as normalizeAPIError, E as EmptyAssets, d as FilterPopover, e as displayedFilters, f as FilterList, B as BreadcrumbsDefinition, h as Breadcrumbs, i as useMediaLibraryPermissions, j as usePersistentState, v as viewOptions, l as localStorageKeys, k as useAssets, m as useFolders, o as containsAssetFilter, q as useFolder, r as useSelectionState, s as SortPicker, T as TableList, t as FolderGridList, w as FolderCard, x as FolderCardBody, y as FolderCardBodyAction, z as AssetGridList, U as UploadAssetDialog, C as EditFolderDialog, D as EditAssetDialog, G as useConfig } from "./index-ZXpABToX.mjs";
7
+ import "byte-size";
8
+ import "date-fns";
9
+ import { stringify } from "qs";
10
+ import { Box, BaseCheckbox, Button, ModalLayout, ModalBody, Flex, Loader, ModalHeader, Typography, Grid, GridItem, FieldLabel, ModalFooter, HeaderLayout, Link, Layout, ActionLayout, IconButton, ContentLayout, VisuallyHidden, Divider } from "@strapi/design-system";
11
+ import { Trash, Folder, Plus, Filter, ArrowLeft, Cog, List, GridFour, Pencil } from "@strapi/icons";
12
+ import styled from "styled-components";
13
+ import PropTypes from "prop-types";
14
+ import { Formik, Form } from "formik";
15
+ import isEmpty from "lodash/isEmpty";
16
+ import { useQueryClient, useMutation } from "react-query";
17
+ import { EmptyPermissions } from "@strapi/icons/symbols";
18
+ const getBreadcrumbDataML = (folder, { pathname, query }) => {
19
+ let data = [
20
+ {
21
+ id: null,
22
+ label: { id: getTrad("plugin.name"), defaultMessage: "Media Library" },
23
+ href: folder ? getFolderURL(pathname, query) : void 0
24
+ }
25
+ ];
26
+ if (folder?.parent?.parent) {
27
+ data.push([]);
28
+ }
29
+ if (folder?.parent) {
30
+ data.push({
31
+ id: folder.parent.id,
32
+ label: folder.parent.name,
33
+ href: getFolderURL(pathname, query, {
34
+ folder: folder.parent.id,
35
+ folderPath: folder.parent.path
36
+ })
37
+ });
38
+ }
39
+ if (folder) {
40
+ data.push({
41
+ id: folder.id,
42
+ label: folder.name
43
+ });
44
+ }
45
+ return data;
46
+ };
47
+ const FolderCardCheckbox = (props) => {
48
+ const { id } = useFolderCard();
49
+ return /* @__PURE__ */ jsx(Box, { position: "relative", zIndex: 2, children: /* @__PURE__ */ jsx(BaseCheckbox, { "aria-labelledby": `${id}-title`, ...props }) });
50
+ };
51
+ const BulkDeleteButton = ({ selected, onSuccess }) => {
52
+ const { formatMessage } = useIntl();
53
+ const [showConfirmDialog, setShowConfirmDialog] = useState(false);
54
+ const { remove } = useBulkRemove();
55
+ const handleConfirmRemove = async () => {
56
+ await remove(selected);
57
+ onSuccess();
58
+ };
59
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
60
+ /* @__PURE__ */ jsx(
61
+ Button,
62
+ {
63
+ variant: "danger-light",
64
+ size: "S",
65
+ startIcon: /* @__PURE__ */ jsx(Trash, {}),
66
+ onClick: () => setShowConfirmDialog(true),
67
+ children: formatMessage({ id: "global.delete", defaultMessage: "Delete" })
68
+ }
69
+ ),
70
+ /* @__PURE__ */ jsx(
71
+ ConfirmDialog,
72
+ {
73
+ isOpen: showConfirmDialog,
74
+ onClose: () => setShowConfirmDialog(false),
75
+ onConfirm: handleConfirmRemove
76
+ }
77
+ )
78
+ ] });
79
+ };
80
+ BulkDeleteButton.propTypes = {
81
+ selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition).isRequired,
82
+ onSuccess: PropTypes.func.isRequired
83
+ };
84
+ const useBulkMove = () => {
85
+ const { formatMessage } = useIntl();
86
+ const { toggleNotification } = useNotification();
87
+ const queryClient = useQueryClient();
88
+ const { post } = useFetchClient();
89
+ const bulkMoveQuery = ({ destinationFolderId, filesAndFolders }) => {
90
+ const payload = filesAndFolders.reduce((acc, selected) => {
91
+ const { id, type } = selected;
92
+ const key = type === "asset" ? "fileIds" : "folderIds";
93
+ if (!acc[key]) {
94
+ acc[key] = [];
95
+ }
96
+ acc[key].push(id);
97
+ return acc;
98
+ }, {});
99
+ return post("/upload/actions/bulk-move", { ...payload, destinationFolderId });
100
+ };
101
+ const mutation = useMutation(bulkMoveQuery, {
102
+ onSuccess(res) {
103
+ const {
104
+ data: { data }
105
+ } = res;
106
+ if (data?.files?.length > 0) {
107
+ queryClient.refetchQueries([pluginId, "assets"], { active: true });
108
+ queryClient.refetchQueries([pluginId, "asset-count"], { active: true });
109
+ }
110
+ queryClient.refetchQueries([pluginId, "folders"], { active: true });
111
+ toggleNotification({
112
+ type: "success",
113
+ message: formatMessage({
114
+ id: getTrad("modal.move.success-label"),
115
+ defaultMessage: "Elements have been moved successfully."
116
+ })
117
+ });
118
+ }
119
+ });
120
+ const move = (destinationFolderId, filesAndFolders) => mutation.mutateAsync({ destinationFolderId, filesAndFolders });
121
+ return { ...mutation, move };
122
+ };
123
+ const BulkMoveDialog = ({ onClose, selected, currentFolder }) => {
124
+ const { formatMessage } = useIntl();
125
+ const { data: folderStructure, isLoading } = useFolderStructure();
126
+ const { move } = useBulkMove();
127
+ if (!folderStructure) {
128
+ return null;
129
+ }
130
+ const handleSubmit = async (values, { setErrors }) => {
131
+ try {
132
+ await move(values.destination.value, selected);
133
+ onClose();
134
+ } catch (error) {
135
+ const normalizedError = normalizeAPIError(error);
136
+ const formikErrors = normalizedError.errors.reduce((acc, error2) => {
137
+ acc[error2.values?.path?.length || "destination"] = error2.defaultMessage;
138
+ return acc;
139
+ }, {});
140
+ if (!isEmpty(formikErrors)) {
141
+ setErrors(formikErrors);
142
+ }
143
+ }
144
+ };
145
+ const handleClose = () => {
146
+ onClose();
147
+ };
148
+ if (isLoading) {
149
+ return /* @__PURE__ */ jsx(ModalLayout, { onClose: handleClose, labelledBy: "title", children: /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "center", paddingTop: 4, paddingBottom: 4, children: /* @__PURE__ */ jsx(Loader, { children: formatMessage({
150
+ id: getTrad("content.isLoading"),
151
+ defaultMessage: "Content is loading."
152
+ }) }) }) }) });
153
+ }
154
+ const initialFormData = {
155
+ destination: {
156
+ value: currentFolder?.id || "",
157
+ label: currentFolder?.name || folderStructure[0].label
158
+ }
159
+ };
160
+ return /* @__PURE__ */ jsx(ModalLayout, { onClose: handleClose, labelledBy: "title", children: /* @__PURE__ */ jsx(Formik, { validateOnChange: false, onSubmit: handleSubmit, initialValues: initialFormData, children: ({ values, errors, setFieldValue }) => /* @__PURE__ */ jsxs(Form, { noValidate: true, children: [
161
+ /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", textColor: "neutral800", as: "h2", id: "title", children: formatMessage({
162
+ id: getTrad("modal.folder.move.title"),
163
+ defaultMessage: "Move elements to"
164
+ }) }) }),
165
+ /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsx(Grid, { gap: 4, children: /* @__PURE__ */ jsx(GridItem, { xs: 12, col: 12, children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 1, children: [
166
+ /* @__PURE__ */ jsx(FieldLabel, { htmlFor: "folder-destination", children: formatMessage({
167
+ id: getTrad("form.input.label.folder-location"),
168
+ defaultMessage: "Location"
169
+ }) }),
170
+ /* @__PURE__ */ jsx(
171
+ SelectTree,
172
+ {
173
+ options: folderStructure,
174
+ onChange: (value) => {
175
+ setFieldValue("destination", value);
176
+ },
177
+ defaultValue: values.destination,
178
+ name: "destination",
179
+ menuPortalTarget: document.querySelector("body"),
180
+ inputId: "folder-destination",
181
+ error: errors?.destination,
182
+ ariaErrorMessage: "destination-error"
183
+ }
184
+ ),
185
+ errors.destination && /* @__PURE__ */ jsx(
186
+ Typography,
187
+ {
188
+ variant: "pi",
189
+ as: "p",
190
+ id: "folder-destination-error",
191
+ textColor: "danger600",
192
+ children: errors.destination
193
+ }
194
+ )
195
+ ] }) }) }) }),
196
+ /* @__PURE__ */ jsx(
197
+ ModalFooter,
198
+ {
199
+ startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }),
200
+ endActions: /* @__PURE__ */ jsx(Button, { type: "submit", loading: isLoading, children: formatMessage({ id: "modal.folder.move.submit", defaultMessage: "Move" }) })
201
+ }
202
+ )
203
+ ] }) }) });
204
+ };
205
+ BulkMoveDialog.defaultProps = {
206
+ currentFolder: void 0
207
+ };
208
+ BulkMoveDialog.propTypes = {
209
+ onClose: PropTypes.func.isRequired,
210
+ currentFolder: FolderDefinition,
211
+ selected: PropTypes.arrayOf(FolderDefinition, AssetDefinition).isRequired
212
+ };
213
+ const BulkMoveButton = ({ selected, onSuccess, currentFolder }) => {
214
+ const { formatMessage } = useIntl();
215
+ const [showConfirmDialog, setShowConfirmDialog] = useState(false);
216
+ const handleConfirmMove = () => {
217
+ setShowConfirmDialog(false);
218
+ onSuccess();
219
+ };
220
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
221
+ /* @__PURE__ */ jsx(
222
+ Button,
223
+ {
224
+ variant: "secondary",
225
+ size: "S",
226
+ startIcon: /* @__PURE__ */ jsx(Folder, {}),
227
+ onClick: () => setShowConfirmDialog(true),
228
+ children: formatMessage({ id: "global.move", defaultMessage: "Move" })
229
+ }
230
+ ),
231
+ showConfirmDialog && /* @__PURE__ */ jsx(
232
+ BulkMoveDialog,
233
+ {
234
+ currentFolder,
235
+ onClose: handleConfirmMove,
236
+ selected
237
+ }
238
+ )
239
+ ] });
240
+ };
241
+ BulkMoveButton.defaultProps = {
242
+ currentFolder: void 0
243
+ };
244
+ BulkMoveButton.propTypes = {
245
+ onSuccess: PropTypes.func.isRequired,
246
+ currentFolder: FolderDefinition,
247
+ selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition).isRequired
248
+ };
249
+ const BulkActions = ({ selected, onSuccess, currentFolder }) => {
250
+ const { formatMessage } = useIntl();
251
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, paddingBottom: 5, children: [
252
+ /* @__PURE__ */ jsx(Typography, { variant: "epsilon", textColor: "neutral600", children: formatMessage(
253
+ {
254
+ id: getTrad("list.assets.selected"),
255
+ defaultMessage: "{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}} selected"
256
+ },
257
+ {
258
+ numberFolders: selected.filter(({ type }) => type === "folder").length,
259
+ numberAssets: selected.filter(({ type }) => type === "asset").length
260
+ }
261
+ ) }),
262
+ /* @__PURE__ */ jsx(BulkDeleteButton, { selected, onSuccess }),
263
+ /* @__PURE__ */ jsx(BulkMoveButton, { currentFolder, selected, onSuccess })
264
+ ] });
265
+ };
266
+ BulkActions.defaultProps = {
267
+ currentFolder: void 0
268
+ };
269
+ BulkActions.propTypes = {
270
+ onSuccess: PropTypes.func.isRequired,
271
+ currentFolder: FolderDefinition,
272
+ selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition).isRequired
273
+ };
274
+ const getContentIntlMessage = ({ isFiltering, canCreate, canRead }) => {
275
+ if (isFiltering) {
276
+ return {
277
+ id: "list.assets-empty.title-withSearch",
278
+ defaultMessage: "There are no elements with the applied filters"
279
+ };
280
+ }
281
+ if (canRead) {
282
+ if (canCreate) {
283
+ return {
284
+ id: "list.assets.empty-upload",
285
+ defaultMessage: "Upload your first assets..."
286
+ };
287
+ }
288
+ return {
289
+ id: "list.assets.empty",
290
+ defaultMessage: "Media Library is empty"
291
+ };
292
+ }
293
+ return {
294
+ id: "header.actions.no-permissions",
295
+ defaultMessage: "No permissions to view"
296
+ };
297
+ };
298
+ const EmptyOrNoPermissions = ({ canCreate, isFiltering, canRead, onActionClick }) => {
299
+ const { formatMessage } = useIntl();
300
+ const content = getContentIntlMessage({ isFiltering, canCreate, canRead });
301
+ return /* @__PURE__ */ jsx(
302
+ EmptyAssets,
303
+ {
304
+ icon: !canRead ? EmptyPermissions : void 0,
305
+ action: canCreate && !isFiltering && /* @__PURE__ */ jsx(Button, { variant: "secondary", startIcon: /* @__PURE__ */ jsx(Plus, {}), onClick: onActionClick, children: formatMessage({
306
+ id: getTrad("header.actions.add-assets"),
307
+ defaultMessage: "Add new assets"
308
+ }) }),
309
+ content: formatMessage({
310
+ ...content,
311
+ id: getTrad(content.id)
312
+ })
313
+ }
314
+ );
315
+ };
316
+ EmptyOrNoPermissions.propTypes = {
317
+ canCreate: PropTypes.bool.isRequired,
318
+ canRead: PropTypes.bool.isRequired,
319
+ isFiltering: PropTypes.bool.isRequired,
320
+ onActionClick: PropTypes.func.isRequired
321
+ };
322
+ const Filters = () => {
323
+ const buttonRef = useRef(null);
324
+ const [isVisible, setVisible] = useState(false);
325
+ const { formatMessage } = useIntl();
326
+ const { trackUsage } = useTracking();
327
+ const [{ query }, setQuery] = useQueryParams();
328
+ const filters = query?.filters?.$and || [];
329
+ const toggleFilter = () => setVisible((prev) => !prev);
330
+ const handleRemoveFilter = (nextFilters) => {
331
+ setQuery({ filters: { $and: nextFilters }, page: 1 });
332
+ };
333
+ const handleSubmit = (filters2) => {
334
+ trackUsage("didFilterMediaLibraryElements", {
335
+ location: "content-manager",
336
+ filter: Object.keys(filters2[filters2.length - 1])[0]
337
+ });
338
+ setQuery({ filters: { $and: filters2 }, page: 1 });
339
+ };
340
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
341
+ /* @__PURE__ */ jsx(
342
+ Button,
343
+ {
344
+ variant: "tertiary",
345
+ ref: buttonRef,
346
+ startIcon: /* @__PURE__ */ jsx(Filter, {}),
347
+ onClick: toggleFilter,
348
+ size: "S",
349
+ children: formatMessage({ id: "app.utils.filters", defaultMessage: "Filters" })
350
+ }
351
+ ),
352
+ isVisible && /* @__PURE__ */ jsx(
353
+ FilterPopover,
354
+ {
355
+ displayedFilters,
356
+ filters,
357
+ onSubmit: handleSubmit,
358
+ onToggle: toggleFilter,
359
+ source: buttonRef
360
+ }
361
+ ),
362
+ /* @__PURE__ */ jsx(
363
+ FilterList,
364
+ {
365
+ appliedFilters: filters,
366
+ filtersSchema: displayedFilters,
367
+ onRemoveFilter: handleRemoveFilter
368
+ }
369
+ )
370
+ ] });
371
+ };
372
+ const Header = ({
373
+ breadcrumbs,
374
+ canCreate,
375
+ folder,
376
+ onToggleEditFolderDialog,
377
+ onToggleUploadAssetDialog
378
+ }) => {
379
+ const { formatMessage } = useIntl();
380
+ const { pathname } = useLocation();
381
+ const [{ query }] = useQueryParams();
382
+ const backQuery = {
383
+ ...query,
384
+ folder: folder?.parent?.id ?? void 0,
385
+ folderPath: folder?.parent?.path ?? void 0
386
+ };
387
+ return /* @__PURE__ */ jsx(
388
+ HeaderLayout,
389
+ {
390
+ title: formatMessage({
391
+ id: getTrad("plugin.name"),
392
+ defaultMessage: `Media Library`
393
+ }),
394
+ subtitle: breadcrumbs && folder && /* @__PURE__ */ jsx(
395
+ Breadcrumbs,
396
+ {
397
+ as: "nav",
398
+ label: formatMessage({
399
+ id: getTrad("header.breadcrumbs.nav.label"),
400
+ defaultMessage: "Folders navigation"
401
+ }),
402
+ breadcrumbs,
403
+ currentFolderId: folder?.id
404
+ }
405
+ ),
406
+ navigationAction: folder && /* @__PURE__ */ jsx(
407
+ Link,
408
+ {
409
+ startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}),
410
+ to: `${pathname}?${stringify(backQuery, { encode: false })}`,
411
+ children: formatMessage({
412
+ id: getTrad("header.actions.folder-level-up"),
413
+ defaultMessage: "Back"
414
+ })
415
+ }
416
+ ),
417
+ primaryAction: canCreate && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
418
+ /* @__PURE__ */ jsx(Button, { startIcon: /* @__PURE__ */ jsx(Plus, {}), variant: "secondary", onClick: onToggleEditFolderDialog, children: formatMessage({
419
+ id: getTrad("header.actions.add-folder"),
420
+ defaultMessage: "Add new folder"
421
+ }) }),
422
+ /* @__PURE__ */ jsx(Button, { startIcon: /* @__PURE__ */ jsx(Plus, {}), onClick: onToggleUploadAssetDialog, children: formatMessage({
423
+ id: getTrad("header.actions.add-assets"),
424
+ defaultMessage: "Add new assets"
425
+ }) })
426
+ ] })
427
+ }
428
+ );
429
+ };
430
+ Header.defaultProps = {
431
+ breadcrumbs: false,
432
+ folder: null
433
+ };
434
+ Header.propTypes = {
435
+ breadcrumbs: PropTypes.oneOfType([BreadcrumbsDefinition, PropTypes.bool]),
436
+ canCreate: PropTypes.bool.isRequired,
437
+ folder: FolderDefinition,
438
+ onToggleEditFolderDialog: PropTypes.func.isRequired,
439
+ onToggleUploadAssetDialog: PropTypes.func.isRequired
440
+ };
441
+ const BoxWithHeight = styled(Box)`
442
+ height: 3.2rem;
443
+ display: flex;
444
+ align-items: center;
445
+ `;
446
+ const TypographyMaxWidth = styled(Typography)`
447
+ max-width: 100%;
448
+ `;
449
+ const ActionContainer = styled(Box)`
450
+ svg {
451
+ path {
452
+ fill: ${({ theme }) => theme.colors.neutral500};
453
+ }
454
+ }
455
+ `;
456
+ const MediaLibrary = () => {
457
+ const navigate = useNavigate();
458
+ const {
459
+ canRead,
460
+ canCreate,
461
+ canUpdate,
462
+ canCopyLink,
463
+ canDownload,
464
+ canConfigureView,
465
+ isLoading: permissionsLoading
466
+ } = useMediaLibraryPermissions();
467
+ const currentFolderToEditRef = useRef();
468
+ const { formatMessage } = useIntl();
469
+ const { pathname } = useLocation();
470
+ const { trackUsage } = useTracking();
471
+ const [{ query }, setQuery] = useQueryParams();
472
+ const isFiltering = Boolean(query._q || query.filters);
473
+ const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);
474
+ const isGridView = view === viewOptions.GRID;
475
+ const {
476
+ data: assetsData,
477
+ isLoading: assetsLoading,
478
+ errors: assetsError
479
+ } = useAssets({
480
+ skipWhen: !canRead,
481
+ query
482
+ });
483
+ const {
484
+ data: foldersData,
485
+ isLoading: foldersLoading,
486
+ errors: foldersError
487
+ } = useFolders({
488
+ enabled: canRead && assetsData?.pagination?.page === 1 && !containsAssetFilter(query),
489
+ query
490
+ });
491
+ const {
492
+ data: currentFolder,
493
+ isLoading: isCurrentFolderLoading,
494
+ error: currentFolderError
495
+ } = useFolder(query?.folder, {
496
+ enabled: canRead && !!query?.folder
497
+ });
498
+ if (currentFolderError?.response?.status === 404) {
499
+ navigate(pathname);
500
+ }
501
+ const folders = foldersData?.map((folder) => ({
502
+ ...folder,
503
+ type: "folder",
504
+ folderURL: getFolderURL(pathname, query, folder.id),
505
+ isSelectable: canUpdate
506
+ })) ?? [];
507
+ const folderCount = folders?.length || 0;
508
+ const assets = assetsData?.results?.map((asset) => ({ ...asset, type: "asset", isSelectable: canUpdate })) || [];
509
+ const assetCount = assets?.length ?? 0;
510
+ const totalAssetCount = assetsData?.pagination?.total;
511
+ const isLoading = isCurrentFolderLoading || foldersLoading || permissionsLoading || assetsLoading;
512
+ const [showUploadAssetDialog, setShowUploadAssetDialog] = useState(false);
513
+ const [showEditFolderDialog, setShowEditFolderDialog] = useState(false);
514
+ const [assetToEdit, setAssetToEdit] = useState(void 0);
515
+ const [folderToEdit, setFolderToEdit] = useState(void 0);
516
+ const [selected, { selectOne, selectAll }] = useSelectionState(["type", "id"], []);
517
+ const indeterminateBulkSelect = selected?.length > 0 && selected?.length !== assetCount + folderCount;
518
+ const toggleUploadAssetDialog = () => setShowUploadAssetDialog((prev) => !prev);
519
+ const toggleEditFolderDialog = ({ created = false } = {}) => {
520
+ if (created && query?.page !== "1") {
521
+ setQuery({
522
+ ...query,
523
+ page: 1
524
+ });
525
+ }
526
+ setShowEditFolderDialog((prev) => !prev);
527
+ };
528
+ const handleBulkSelect = (event, elements) => {
529
+ if (event.target.checked) {
530
+ trackUsage("didSelectAllMediaLibraryElements");
531
+ }
532
+ selectAll(elements);
533
+ };
534
+ const handleChangeSort = (value) => {
535
+ trackUsage("didSortMediaLibraryElements", {
536
+ location: "upload",
537
+ sort: value
538
+ });
539
+ setQuery({ sort: value });
540
+ };
541
+ const handleEditFolder = (folder) => {
542
+ setFolderToEdit(folder);
543
+ setShowEditFolderDialog(true);
544
+ };
545
+ const handleEditFolderClose = (payload) => {
546
+ setFolderToEdit(null);
547
+ toggleEditFolderDialog(payload);
548
+ if (currentFolderToEditRef.current) {
549
+ currentFolderToEditRef.current.focus();
550
+ }
551
+ };
552
+ const handleAssetDeleted = (numberOfAssets) => {
553
+ if (numberOfAssets === assetCount && assetsData.pagination.page === assetsData.pagination.pageCount && assetsData.pagination.page > 1) {
554
+ setQuery({
555
+ ...query,
556
+ page: assetsData.pagination.page - 1
557
+ });
558
+ }
559
+ };
560
+ const handleBulkActionSuccess = () => {
561
+ selectAll();
562
+ handleAssetDeleted(selected.length);
563
+ };
564
+ if (isLoading) {
565
+ return /* @__PURE__ */ jsx(Page.Loading, {});
566
+ }
567
+ if (assetsError || foldersError) {
568
+ return /* @__PURE__ */ jsx(Page.Error, {});
569
+ }
570
+ return /* @__PURE__ */ jsxs(Layout, { children: [
571
+ /* @__PURE__ */ jsxs(Page.Main, { children: [
572
+ /* @__PURE__ */ jsx(
573
+ Header,
574
+ {
575
+ breadcrumbs: !isCurrentFolderLoading && getBreadcrumbDataML(currentFolder, { pathname, query }),
576
+ canCreate,
577
+ onToggleEditFolderDialog: toggleEditFolderDialog,
578
+ onToggleUploadAssetDialog: toggleUploadAssetDialog,
579
+ folder: currentFolder
580
+ }
581
+ ),
582
+ /* @__PURE__ */ jsx(
583
+ ActionLayout,
584
+ {
585
+ startActions: /* @__PURE__ */ jsxs(Fragment, { children: [
586
+ canUpdate && isGridView && (assetCount > 0 || folderCount > 0) && /* @__PURE__ */ jsx(
587
+ BoxWithHeight,
588
+ {
589
+ paddingLeft: 2,
590
+ paddingRight: 2,
591
+ background: "neutral0",
592
+ hasRadius: true,
593
+ borderColor: "neutral200",
594
+ children: /* @__PURE__ */ jsx(
595
+ BaseCheckbox,
596
+ {
597
+ "aria-label": formatMessage({
598
+ id: getTrad("bulk.select.label"),
599
+ defaultMessage: "Select all folders & assets"
600
+ }),
601
+ indeterminate: indeterminateBulkSelect,
602
+ value: (assetCount > 0 || folderCount > 0) && selected.length === assetCount + folderCount,
603
+ onChange: (e) => handleBulkSelect(e, [...assets, ...folders])
604
+ }
605
+ )
606
+ }
607
+ ),
608
+ canRead && isGridView && /* @__PURE__ */ jsx(SortPicker, { value: query?.sort, onChangeSort: handleChangeSort }),
609
+ canRead && /* @__PURE__ */ jsx(Filters, {})
610
+ ] }),
611
+ endActions: /* @__PURE__ */ jsxs(Fragment, { children: [
612
+ canConfigureView ? /* @__PURE__ */ jsx(ActionContainer, { paddingTop: 1, paddingBottom: 1, children: /* @__PURE__ */ jsx(
613
+ IconButton,
614
+ {
615
+ forwardedAs: Link$1,
616
+ to: {
617
+ pathname: `${pathname}/configuration`,
618
+ search: stringify(query, { encode: false })
619
+ },
620
+ icon: /* @__PURE__ */ jsx(Cog, {}),
621
+ label: formatMessage({
622
+ id: "app.links.configure-view",
623
+ defaultMessage: "Configure the view"
624
+ })
625
+ }
626
+ ) }) : null,
627
+ /* @__PURE__ */ jsx(ActionContainer, { paddingTop: 1, paddingBottom: 1, children: /* @__PURE__ */ jsx(
628
+ IconButton,
629
+ {
630
+ icon: isGridView ? /* @__PURE__ */ jsx(List, {}) : /* @__PURE__ */ jsx(GridFour, {}),
631
+ label: isGridView ? formatMessage({
632
+ id: getTrad("view-switch.list"),
633
+ defaultMessage: "List View"
634
+ }) : formatMessage({
635
+ id: getTrad("view-switch.grid"),
636
+ defaultMessage: "Grid View"
637
+ }),
638
+ onClick: () => setView(isGridView ? viewOptions.LIST : viewOptions.GRID)
639
+ }
640
+ ) }),
641
+ /* @__PURE__ */ jsx(
642
+ SearchInput,
643
+ {
644
+ label: formatMessage({
645
+ id: getTrad("search.label"),
646
+ defaultMessage: "Search for an asset"
647
+ }),
648
+ trackedEvent: "didSearchMediaLibraryElements",
649
+ trackedEventDetails: { location: "upload" }
650
+ }
651
+ )
652
+ ] })
653
+ }
654
+ ),
655
+ /* @__PURE__ */ jsxs(ContentLayout, { children: [
656
+ selected.length > 0 && /* @__PURE__ */ jsx(
657
+ BulkActions,
658
+ {
659
+ currentFolder,
660
+ selected,
661
+ onSuccess: handleBulkActionSuccess
662
+ }
663
+ ),
664
+ folderCount === 0 && assetCount === 0 && /* @__PURE__ */ jsx(
665
+ EmptyOrNoPermissions,
666
+ {
667
+ canCreate,
668
+ canRead,
669
+ isFiltering,
670
+ onActionClick: toggleUploadAssetDialog
671
+ }
672
+ ),
673
+ canRead && !isGridView && (assetCount > 0 || folderCount > 0) && /* @__PURE__ */ jsx(
674
+ TableList,
675
+ {
676
+ assetCount,
677
+ folderCount,
678
+ indeterminate: indeterminateBulkSelect,
679
+ onChangeSort: handleChangeSort,
680
+ onChangeFolder: (folderID, folderPath) => navigate(getFolderURL(pathname, query, { folder: folderID, folderPath })),
681
+ onEditAsset: setAssetToEdit,
682
+ onEditFolder: handleEditFolder,
683
+ onSelectOne: selectOne,
684
+ onSelectAll: handleBulkSelect,
685
+ rows: [...folders, ...assets],
686
+ selected,
687
+ shouldDisableBulkSelect: !canUpdate,
688
+ sortQuery: query?.sort ?? ""
689
+ }
690
+ ),
691
+ canRead && isGridView && /* @__PURE__ */ jsxs(Fragment, { children: [
692
+ folderCount > 0 && /* @__PURE__ */ jsx(
693
+ FolderGridList,
694
+ {
695
+ title: (
696
+ // Folders title should only appear if:
697
+ // user is filtering and there are assets to display, to divide both type of elements
698
+ // user is not filtering
699
+ (isFiltering && assetCount > 0 || !isFiltering) && formatMessage(
700
+ {
701
+ id: getTrad("list.folders.title"),
702
+ defaultMessage: "Folders ({count})"
703
+ },
704
+ { count: folderCount }
705
+ ) || ""
706
+ ),
707
+ children: folders.map((folder) => {
708
+ const selectedFolders = selected.filter(({ type }) => type === "folder");
709
+ const isSelected = !!selectedFolders.find(
710
+ (currentFolder2) => currentFolder2.id === folder.id
711
+ );
712
+ const url = getFolderURL(pathname, query, {
713
+ folder: folder?.id,
714
+ folderPath: folder?.path
715
+ });
716
+ return /* @__PURE__ */ jsx(GridItem, { col: 3, children: /* @__PURE__ */ jsx(
717
+ FolderCard,
718
+ {
719
+ ref: folderToEdit && folder.id === folderToEdit.id ? currentFolderToEditRef : void 0,
720
+ ariaLabel: folder.name,
721
+ id: `folder-${folder.id}`,
722
+ to: url,
723
+ startAction: selectOne && folder.isSelectable ? /* @__PURE__ */ jsx(
724
+ FolderCardCheckbox,
725
+ {
726
+ "data-testid": `folder-checkbox-${folder.id}`,
727
+ value: isSelected,
728
+ onChange: () => selectOne(folder)
729
+ }
730
+ ) : null,
731
+ cardActions: /* @__PURE__ */ jsx(
732
+ IconButton,
733
+ {
734
+ icon: /* @__PURE__ */ jsx(Pencil, {}),
735
+ "aria-label": formatMessage({
736
+ id: getTrad("list.folder.edit"),
737
+ defaultMessage: "Edit folder"
738
+ }),
739
+ onClick: () => handleEditFolder(folder)
740
+ }
741
+ ),
742
+ children: /* @__PURE__ */ jsx(FolderCardBody, { children: /* @__PURE__ */ jsx(FolderCardBodyAction, { to: url, children: /* @__PURE__ */ jsxs(Flex, { as: "h2", direction: "column", alignItems: "start", maxWidth: "100%", children: [
743
+ /* @__PURE__ */ jsxs(TypographyMaxWidth, { fontWeight: "semiBold", ellipsis: true, children: [
744
+ folder.name,
745
+ /* @__PURE__ */ jsx(VisuallyHidden, { children: ":" })
746
+ ] }),
747
+ /* @__PURE__ */ jsx(
748
+ TypographyMaxWidth,
749
+ {
750
+ as: "span",
751
+ textColor: "neutral600",
752
+ variant: "pi",
753
+ ellipsis: true,
754
+ children: formatMessage(
755
+ {
756
+ id: getTrad("list.folder.subtitle"),
757
+ defaultMessage: "{folderCount, plural, =0 {# folder} one {# folder} other {# folders}}, {filesCount, plural, =0 {# asset} one {# asset} other {# assets}}"
758
+ },
759
+ {
760
+ folderCount: folder.children.count,
761
+ filesCount: folder.files.count
762
+ }
763
+ )
764
+ }
765
+ )
766
+ ] }) }) })
767
+ }
768
+ ) }, `folder-${folder.id}`);
769
+ })
770
+ }
771
+ ),
772
+ assetCount > 0 && folderCount > 0 && /* @__PURE__ */ jsx(Box, { paddingTop: 6, paddingBottom: 4, children: /* @__PURE__ */ jsx(Divider, {}) }),
773
+ assetCount > 0 && /* @__PURE__ */ jsx(
774
+ AssetGridList,
775
+ {
776
+ assets,
777
+ onEditAsset: setAssetToEdit,
778
+ onSelectAsset: selectOne,
779
+ selectedAssets: selected.filter(({ type }) => type === "asset"),
780
+ title: (
781
+ // Assets title should only appear if:
782
+ // - user is not filtering
783
+ // - user is filtering and there are folders to display, to separate them
784
+ // - user is on page 1 since folders won't appear on any other page than the first one (no need to visually separate them)
785
+ (!isFiltering || isFiltering && folderCount > 0) && assetsData?.pagination?.page === 1 && formatMessage(
786
+ {
787
+ id: getTrad("list.assets.title"),
788
+ defaultMessage: "Assets ({count})"
789
+ },
790
+ { count: totalAssetCount }
791
+ ) || ""
792
+ )
793
+ }
794
+ )
795
+ ] }),
796
+ /* @__PURE__ */ jsxs(Pagination.Root, { ...assetsData.pagination, children: [
797
+ /* @__PURE__ */ jsx(Pagination.PageSize, {}),
798
+ /* @__PURE__ */ jsx(Pagination.Links, {})
799
+ ] })
800
+ ] })
801
+ ] }),
802
+ showUploadAssetDialog && /* @__PURE__ */ jsx(
803
+ UploadAssetDialog,
804
+ {
805
+ onClose: toggleUploadAssetDialog,
806
+ trackedLocation: "upload",
807
+ folderId: query?.folder
808
+ }
809
+ ),
810
+ showEditFolderDialog && /* @__PURE__ */ jsx(
811
+ EditFolderDialog,
812
+ {
813
+ onClose: handleEditFolderClose,
814
+ folder: folderToEdit,
815
+ parentFolderId: query?.folder,
816
+ location: "upload"
817
+ }
818
+ ),
819
+ assetToEdit && /* @__PURE__ */ jsx(
820
+ EditAssetDialog,
821
+ {
822
+ onClose: (editedAsset) => {
823
+ if (editedAsset === null) {
824
+ handleAssetDeleted(1);
825
+ }
826
+ setAssetToEdit(void 0);
827
+ },
828
+ asset: assetToEdit,
829
+ canUpdate,
830
+ canCopyLink,
831
+ canDownload,
832
+ trackedLocation: "upload"
833
+ }
834
+ )
835
+ ] });
836
+ };
837
+ const ConfigureTheView = lazy(() => import("./index-CWDl5PEs.mjs"));
838
+ const Upload = () => {
839
+ const {
840
+ config: { isLoading, isError, data: config }
841
+ } = useConfig();
842
+ const [{ rawQuery }, setQuery] = useQueryParams();
843
+ const { formatMessage } = useIntl();
844
+ const title = formatMessage({ id: getTrad("plugin.name"), defaultMessage: "Media Library" });
845
+ useEffect(() => {
846
+ if (isLoading || isError || rawQuery) {
847
+ return;
848
+ }
849
+ setQuery({ sort: config.sort, page: 1, pageSize: config.pageSize });
850
+ }, [isLoading, isError, config, rawQuery, setQuery]);
851
+ if (isLoading) {
852
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
853
+ /* @__PURE__ */ jsx(Page.Title, { children: title }),
854
+ /* @__PURE__ */ jsx(Page.Loading, {})
855
+ ] });
856
+ }
857
+ return /* @__PURE__ */ jsx(Page.Main, { children: rawQuery ? /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(Page.Loading, {}), children: /* @__PURE__ */ jsxs(Routes, { children: [
858
+ /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(MediaLibrary, {}) }),
859
+ /* @__PURE__ */ jsx(Route, { path: "configuration", element: /* @__PURE__ */ jsx(ConfigureTheView, { config }) })
860
+ ] }) }) : null });
861
+ };
862
+ export {
863
+ Upload as default
864
+ };
865
+ //# sourceMappingURL=index-BI7qD8h6.mjs.map