@strapi/upload 0.0.0 → 5.0.0-beta.10

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