@strapi/upload 0.0.0-experimental.145e7d7ddefd1aef71aaf3d9bb86440d013035bf

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 (210) hide show
  1. package/LICENSE +37 -0
  2. package/README.md +1 -0
  3. package/dist/_chunks/ca-B2_I-q1t.mjs +121 -0
  4. package/dist/_chunks/ca-B2_I-q1t.mjs.map +1 -0
  5. package/dist/_chunks/ca-BUpuZx8N.js +121 -0
  6. package/dist/_chunks/ca-BUpuZx8N.js.map +1 -0
  7. package/dist/_chunks/de-A7mEKx6c.mjs +107 -0
  8. package/dist/_chunks/de-A7mEKx6c.mjs.map +1 -0
  9. package/dist/_chunks/de-uGb_Pkq7.js +107 -0
  10. package/dist/_chunks/de-uGb_Pkq7.js.map +1 -0
  11. package/dist/_chunks/dk-BPfkJb9q.mjs +103 -0
  12. package/dist/_chunks/dk-BPfkJb9q.mjs.map +1 -0
  13. package/dist/_chunks/dk-Cd8oFO-O.js +103 -0
  14. package/dist/_chunks/dk-Cd8oFO-O.js.map +1 -0
  15. package/dist/_chunks/en-BcOqhiNe.js +144 -0
  16. package/dist/_chunks/en-BcOqhiNe.js.map +1 -0
  17. package/dist/_chunks/en-oDx2Gnre.mjs +144 -0
  18. package/dist/_chunks/en-oDx2Gnre.mjs.map +1 -0
  19. package/dist/_chunks/es-CuWi2pOn.mjs +120 -0
  20. package/dist/_chunks/es-CuWi2pOn.mjs.map +1 -0
  21. package/dist/_chunks/es-DWFtw_h4.js +120 -0
  22. package/dist/_chunks/es-DWFtw_h4.js.map +1 -0
  23. package/dist/_chunks/fr-BN6ndmWf.mjs +144 -0
  24. package/dist/_chunks/fr-BN6ndmWf.mjs.map +1 -0
  25. package/dist/_chunks/fr-D2bop66d.js +144 -0
  26. package/dist/_chunks/fr-D2bop66d.js.map +1 -0
  27. package/dist/_chunks/graphql-BjGMWMOu.js +71 -0
  28. package/dist/_chunks/graphql-BjGMWMOu.js.map +1 -0
  29. package/dist/_chunks/graphql-CNptEo9C.mjs +71 -0
  30. package/dist/_chunks/graphql-CNptEo9C.mjs.map +1 -0
  31. package/dist/_chunks/he-BpxHjaZg.js +76 -0
  32. package/dist/_chunks/he-BpxHjaZg.js.map +1 -0
  33. package/dist/_chunks/he-C9ZOXBB-.mjs +76 -0
  34. package/dist/_chunks/he-C9ZOXBB-.mjs.map +1 -0
  35. package/dist/_chunks/index-BCcXIErg.mjs +224 -0
  36. package/dist/_chunks/index-BCcXIErg.mjs.map +1 -0
  37. package/dist/_chunks/index-BDYIKKrJ.js +6651 -0
  38. package/dist/_chunks/index-BDYIKKrJ.js.map +1 -0
  39. package/dist/_chunks/index-CPo-QoT2.mjs +6625 -0
  40. package/dist/_chunks/index-CPo-QoT2.mjs.map +1 -0
  41. package/dist/_chunks/index-CZA6-NdH.js +2724 -0
  42. package/dist/_chunks/index-CZA6-NdH.js.map +1 -0
  43. package/dist/_chunks/index-CoTVL7lJ.mjs +2713 -0
  44. package/dist/_chunks/index-CoTVL7lJ.mjs.map +1 -0
  45. package/dist/_chunks/index-CzVTdszL.js +266 -0
  46. package/dist/_chunks/index-CzVTdszL.js.map +1 -0
  47. package/dist/_chunks/index-DS5ATP82.js +856 -0
  48. package/dist/_chunks/index-DS5ATP82.js.map +1 -0
  49. package/dist/_chunks/index-DlSTVFYd.js +229 -0
  50. package/dist/_chunks/index-DlSTVFYd.js.map +1 -0
  51. package/dist/_chunks/index-DoOeVmlB.mjs +835 -0
  52. package/dist/_chunks/index-DoOeVmlB.mjs.map +1 -0
  53. package/dist/_chunks/index-G4FtILKc.mjs +262 -0
  54. package/dist/_chunks/index-G4FtILKc.mjs.map +1 -0
  55. package/dist/_chunks/it-B7rmoZNx.mjs +76 -0
  56. package/dist/_chunks/it-B7rmoZNx.mjs.map +1 -0
  57. package/dist/_chunks/it-BKCWXl8t.js +76 -0
  58. package/dist/_chunks/it-BKCWXl8t.js.map +1 -0
  59. package/dist/_chunks/ja-DlaJTi_3.mjs +76 -0
  60. package/dist/_chunks/ja-DlaJTi_3.mjs.map +1 -0
  61. package/dist/_chunks/ja-ajHzIJz6.js +76 -0
  62. package/dist/_chunks/ja-ajHzIJz6.js.map +1 -0
  63. package/dist/_chunks/ko-Pzj-818C.js +106 -0
  64. package/dist/_chunks/ko-Pzj-818C.js.map +1 -0
  65. package/dist/_chunks/ko-vJl9kPpn.mjs +106 -0
  66. package/dist/_chunks/ko-vJl9kPpn.mjs.map +1 -0
  67. package/dist/_chunks/ms-CqwG8v8l.mjs +68 -0
  68. package/dist/_chunks/ms-CqwG8v8l.mjs.map +1 -0
  69. package/dist/_chunks/ms-h3gjldBy.js +68 -0
  70. package/dist/_chunks/ms-h3gjldBy.js.map +1 -0
  71. package/dist/_chunks/pl-Cj8jChOO.mjs +105 -0
  72. package/dist/_chunks/pl-Cj8jChOO.mjs.map +1 -0
  73. package/dist/_chunks/pl-esgZ7ltN.js +105 -0
  74. package/dist/_chunks/pl-esgZ7ltN.js.map +1 -0
  75. package/dist/_chunks/pt-BR-B4LJHJIp.mjs +76 -0
  76. package/dist/_chunks/pt-BR-B4LJHJIp.mjs.map +1 -0
  77. package/dist/_chunks/pt-BR-Cazr7Z5I.js +76 -0
  78. package/dist/_chunks/pt-BR-Cazr7Z5I.js.map +1 -0
  79. package/dist/_chunks/pt-CNOOM_7x.mjs +76 -0
  80. package/dist/_chunks/pt-CNOOM_7x.mjs.map +1 -0
  81. package/dist/_chunks/pt-cbUnkHM5.js +76 -0
  82. package/dist/_chunks/pt-cbUnkHM5.js.map +1 -0
  83. package/dist/_chunks/ru-DqglvSUC.mjs +76 -0
  84. package/dist/_chunks/ru-DqglvSUC.mjs.map +1 -0
  85. package/dist/_chunks/ru-H6MzFUxp.js +76 -0
  86. package/dist/_chunks/ru-H6MzFUxp.js.map +1 -0
  87. package/dist/_chunks/sk-CZxC4dFY.js +122 -0
  88. package/dist/_chunks/sk-CZxC4dFY.js.map +1 -0
  89. package/dist/_chunks/sk-Dgpb3lnz.mjs +122 -0
  90. package/dist/_chunks/sk-Dgpb3lnz.mjs.map +1 -0
  91. package/dist/_chunks/th-C6unJZ8j.js +76 -0
  92. package/dist/_chunks/th-C6unJZ8j.js.map +1 -0
  93. package/dist/_chunks/th-DRfzuiFf.mjs +76 -0
  94. package/dist/_chunks/th-DRfzuiFf.mjs.map +1 -0
  95. package/dist/_chunks/tr--GzWXE_A.mjs +122 -0
  96. package/dist/_chunks/tr--GzWXE_A.mjs.map +1 -0
  97. package/dist/_chunks/tr-CY6AwX50.js +122 -0
  98. package/dist/_chunks/tr-CY6AwX50.js.map +1 -0
  99. package/dist/_chunks/uk-BniyNsD4.js +73 -0
  100. package/dist/_chunks/uk-BniyNsD4.js.map +1 -0
  101. package/dist/_chunks/uk-DVMT2Piq.mjs +73 -0
  102. package/dist/_chunks/uk-DVMT2Piq.mjs.map +1 -0
  103. package/dist/_chunks/zh-CsZw0IpM.js +129 -0
  104. package/dist/_chunks/zh-CsZw0IpM.js.map +1 -0
  105. package/dist/_chunks/zh-HOnih0is.mjs +129 -0
  106. package/dist/_chunks/zh-HOnih0is.mjs.map +1 -0
  107. package/dist/_chunks/zh-Hans-Cpmhg8uH.mjs +152 -0
  108. package/dist/_chunks/zh-Hans-Cpmhg8uH.mjs.map +1 -0
  109. package/dist/_chunks/zh-Hans-k_xAc6nm.js +152 -0
  110. package/dist/_chunks/zh-Hans-k_xAc6nm.js.map +1 -0
  111. package/dist/admin/index.js +5 -0
  112. package/dist/admin/index.js.map +1 -0
  113. package/dist/admin/index.mjs +6 -0
  114. package/dist/admin/index.mjs.map +1 -0
  115. package/dist/server/index.js +4 -0
  116. package/dist/server/index.js.map +1 -0
  117. package/dist/server/index.mjs +5 -0
  118. package/dist/server/index.mjs.map +1 -0
  119. package/dist/server/src/bootstrap.d.ts +5 -0
  120. package/dist/server/src/bootstrap.d.ts.map +1 -0
  121. package/dist/server/src/config.d.ts +10 -0
  122. package/dist/server/src/config.d.ts.map +1 -0
  123. package/dist/server/src/constants.d.ts +20 -0
  124. package/dist/server/src/constants.d.ts.map +1 -0
  125. package/dist/server/src/content-types/file.d.ts +110 -0
  126. package/dist/server/src/content-types/file.d.ts.map +1 -0
  127. package/dist/server/src/content-types/folder.d.ts +61 -0
  128. package/dist/server/src/content-types/folder.d.ts.map +1 -0
  129. package/dist/server/src/content-types/index.d.ts +170 -0
  130. package/dist/server/src/content-types/index.d.ts.map +1 -0
  131. package/dist/server/src/controllers/admin-file.d.ts +16 -0
  132. package/dist/server/src/controllers/admin-file.d.ts.map +1 -0
  133. package/dist/server/src/controllers/admin-folder-file.d.ts +7 -0
  134. package/dist/server/src/controllers/admin-folder-file.d.ts.map +1 -0
  135. package/dist/server/src/controllers/admin-folder.d.ts +10 -0
  136. package/dist/server/src/controllers/admin-folder.d.ts.map +1 -0
  137. package/dist/server/src/controllers/admin-settings.d.ts +7 -0
  138. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -0
  139. package/dist/server/src/controllers/admin-upload.d.ts +9 -0
  140. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -0
  141. package/dist/server/src/controllers/content-api.d.ts +15 -0
  142. package/dist/server/src/controllers/content-api.d.ts.map +1 -0
  143. package/dist/server/src/controllers/index.d.ts +53 -0
  144. package/dist/server/src/controllers/index.d.ts.map +1 -0
  145. package/dist/server/src/controllers/utils/find-entity-and-check-permissions.d.ts +6 -0
  146. package/dist/server/src/controllers/utils/find-entity-and-check-permissions.d.ts.map +1 -0
  147. package/dist/server/src/controllers/utils/folders.d.ts +4 -0
  148. package/dist/server/src/controllers/utils/folders.d.ts.map +1 -0
  149. package/dist/server/src/controllers/validation/admin/configureView.d.ts +15 -0
  150. package/dist/server/src/controllers/validation/admin/configureView.d.ts.map +1 -0
  151. package/dist/server/src/controllers/validation/admin/folder-file.d.ts +3 -0
  152. package/dist/server/src/controllers/validation/admin/folder-file.d.ts.map +1 -0
  153. package/dist/server/src/controllers/validation/admin/folder.d.ts +3 -0
  154. package/dist/server/src/controllers/validation/admin/folder.d.ts.map +1 -0
  155. package/dist/server/src/controllers/validation/admin/settings.d.ts +18 -0
  156. package/dist/server/src/controllers/validation/admin/settings.d.ts.map +1 -0
  157. package/dist/server/src/controllers/validation/admin/upload.d.ts +109 -0
  158. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -0
  159. package/dist/server/src/controllers/validation/admin/utils.d.ts +3 -0
  160. package/dist/server/src/controllers/validation/admin/utils.d.ts.map +1 -0
  161. package/dist/server/src/controllers/validation/content-api/upload.d.ts +91 -0
  162. package/dist/server/src/controllers/validation/content-api/upload.d.ts.map +1 -0
  163. package/dist/server/src/controllers/view-configuration.d.ts +7 -0
  164. package/dist/server/src/controllers/view-configuration.d.ts.map +1 -0
  165. package/dist/server/src/graphql.d.ts +5 -0
  166. package/dist/server/src/graphql.d.ts.map +1 -0
  167. package/dist/server/src/index.d.ts +431 -0
  168. package/dist/server/src/index.d.ts.map +1 -0
  169. package/dist/server/src/middlewares/upload.d.ts +9 -0
  170. package/dist/server/src/middlewares/upload.d.ts.map +1 -0
  171. package/dist/server/src/register.d.ts +8 -0
  172. package/dist/server/src/register.d.ts.map +1 -0
  173. package/dist/server/src/routes/admin.d.ts +17 -0
  174. package/dist/server/src/routes/admin.d.ts.map +1 -0
  175. package/dist/server/src/routes/content-api.d.ts +9 -0
  176. package/dist/server/src/routes/content-api.d.ts.map +1 -0
  177. package/dist/server/src/routes/index.d.ts +43 -0
  178. package/dist/server/src/routes/index.d.ts.map +1 -0
  179. package/dist/server/src/routes/view-configuration.d.ts +17 -0
  180. package/dist/server/src/routes/view-configuration.d.ts.map +1 -0
  181. package/dist/server/src/services/api-upload-folder.d.ts +5 -0
  182. package/dist/server/src/services/api-upload-folder.d.ts.map +1 -0
  183. package/dist/server/src/services/extensions/index.d.ts +5 -0
  184. package/dist/server/src/services/extensions/index.d.ts.map +1 -0
  185. package/dist/server/src/services/extensions/utils.d.ts +14 -0
  186. package/dist/server/src/services/extensions/utils.d.ts.map +1 -0
  187. package/dist/server/src/services/file.d.ts +8 -0
  188. package/dist/server/src/services/file.d.ts.map +1 -0
  189. package/dist/server/src/services/folder.d.ts +32 -0
  190. package/dist/server/src/services/folder.d.ts.map +1 -0
  191. package/dist/server/src/services/image-manipulation.d.ts +20 -0
  192. package/dist/server/src/services/image-manipulation.d.ts.map +1 -0
  193. package/dist/server/src/services/index.d.ts +152 -0
  194. package/dist/server/src/services/index.d.ts.map +1 -0
  195. package/dist/server/src/services/metrics.d.ts +8 -0
  196. package/dist/server/src/services/metrics.d.ts.map +1 -0
  197. package/dist/server/src/services/provider.d.ts +10 -0
  198. package/dist/server/src/services/provider.d.ts.map +1 -0
  199. package/dist/server/src/services/upload.d.ts +67 -0
  200. package/dist/server/src/services/upload.d.ts.map +1 -0
  201. package/dist/server/src/services/weekly-metrics.d.ts +17 -0
  202. package/dist/server/src/services/weekly-metrics.d.ts.map +1 -0
  203. package/dist/server/src/types.d.ts +75 -0
  204. package/dist/server/src/types.d.ts.map +1 -0
  205. package/dist/server/src/utils/cron.d.ts +3 -0
  206. package/dist/server/src/utils/cron.d.ts.map +1 -0
  207. package/dist/server/src/utils/index.d.ts +23 -0
  208. package/dist/server/src/utils/index.d.ts.map +1 -0
  209. package/package.json +111 -0
  210. package/strapi-server.js +3 -0
@@ -0,0 +1,835 @@
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, NavLink, useNavigate, Link as Link$1, Routes, Route } from "react-router-dom";
7
+ import { g as getTrad, a as getFolderURL, u as useFolderCard, A as AssetDefinition, F as FolderDefinition, b as useBulkRemove, p as pluginId, c as useFolderStructure, S as SelectTree, n as normalizeAPIError, E as EmptyAssets, d as FilterPopover, e as displayedFilters, f as FilterList, B as BreadcrumbsDefinition, h as Breadcrumbs, i as useMediaLibraryPermissions, j as usePersistentState, v as viewOptions, l as localStorageKeys, k as useAssets, m as useFolders, o as containsAssetFilter, q as useFolder, r as useSelectionState, s as SortPicker, T as TableList, t as FolderGridList, w as FolderCard, x as FolderCardBody, y as FolderCardBodyAction, z as AssetGridList, U as UploadAssetDialog, C as EditFolderDialog, D as EditAssetDialog, G as useConfig } from "./index-CPo-QoT2.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, direction: "column", alignItems: "stretch", 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
+ tag: NavLink,
360
+ startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}),
361
+ to: `${pathname}?${stringify(backQuery, { encode: false })}`,
362
+ children: formatMessage({
363
+ id: getTrad("header.actions.folder-level-up"),
364
+ defaultMessage: "Back"
365
+ })
366
+ }
367
+ ),
368
+ primaryAction: canCreate && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
369
+ /* @__PURE__ */ jsx(Button, { startIcon: /* @__PURE__ */ jsx(Plus, {}), variant: "secondary", onClick: onToggleEditFolderDialog, children: formatMessage({
370
+ id: getTrad("header.actions.add-folder"),
371
+ defaultMessage: "Add new folder"
372
+ }) }),
373
+ /* @__PURE__ */ jsx(Button, { startIcon: /* @__PURE__ */ jsx(Plus, {}), onClick: onToggleUploadAssetDialog, children: formatMessage({
374
+ id: getTrad("header.actions.add-assets"),
375
+ defaultMessage: "Add new assets"
376
+ }) })
377
+ ] })
378
+ }
379
+ );
380
+ };
381
+ Header.defaultProps = {
382
+ breadcrumbs: false,
383
+ folder: null
384
+ };
385
+ Header.propTypes = {
386
+ breadcrumbs: PropTypes.oneOfType([BreadcrumbsDefinition, PropTypes.bool]),
387
+ canCreate: PropTypes.bool.isRequired,
388
+ folder: FolderDefinition,
389
+ onToggleEditFolderDialog: PropTypes.func.isRequired,
390
+ onToggleUploadAssetDialog: PropTypes.func.isRequired
391
+ };
392
+ const BoxWithHeight = styled(Box)`
393
+ height: 3.2rem;
394
+ display: flex;
395
+ align-items: center;
396
+ `;
397
+ const TypographyMaxWidth = styled(Typography)`
398
+ max-width: 100%;
399
+ `;
400
+ const ActionContainer = styled(Box)`
401
+ svg {
402
+ path {
403
+ fill: ${({ theme }) => theme.colors.neutral500};
404
+ }
405
+ }
406
+ `;
407
+ const MediaLibrary = () => {
408
+ const navigate = useNavigate();
409
+ const {
410
+ canRead,
411
+ canCreate,
412
+ canUpdate,
413
+ canCopyLink,
414
+ canDownload,
415
+ canConfigureView,
416
+ isLoading: permissionsLoading
417
+ } = useMediaLibraryPermissions();
418
+ const currentFolderToEditRef = useRef();
419
+ const { formatMessage } = useIntl();
420
+ const { pathname } = useLocation();
421
+ const { trackUsage } = useTracking();
422
+ const [{ query }, setQuery] = useQueryParams();
423
+ const isFiltering = Boolean(query._q || query.filters);
424
+ const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);
425
+ const isGridView = view === viewOptions.GRID;
426
+ const {
427
+ data: assetsData,
428
+ isLoading: assetsLoading,
429
+ errors: assetsError
430
+ } = useAssets({
431
+ skipWhen: !canRead,
432
+ query
433
+ });
434
+ const {
435
+ data: foldersData,
436
+ isLoading: foldersLoading,
437
+ errors: foldersError
438
+ } = useFolders({
439
+ enabled: canRead && assetsData?.pagination?.page === 1 && !containsAssetFilter(query),
440
+ query
441
+ });
442
+ const {
443
+ data: currentFolder,
444
+ isLoading: isCurrentFolderLoading,
445
+ error: currentFolderError
446
+ } = useFolder(query?.folder, {
447
+ enabled: canRead && !!query?.folder
448
+ });
449
+ if (currentFolderError?.response?.status === 404) {
450
+ navigate(pathname);
451
+ }
452
+ const folders = foldersData?.map((folder) => ({
453
+ ...folder,
454
+ type: "folder",
455
+ folderURL: getFolderURL(pathname, query, folder.id),
456
+ isSelectable: canUpdate
457
+ })) ?? [];
458
+ const folderCount = folders?.length || 0;
459
+ const assets = assetsData?.results?.map((asset) => ({ ...asset, type: "asset", isSelectable: canUpdate })) || [];
460
+ const assetCount = assets?.length ?? 0;
461
+ const totalAssetCount = assetsData?.pagination?.total;
462
+ const isLoading = isCurrentFolderLoading || foldersLoading || permissionsLoading || assetsLoading;
463
+ const [showUploadAssetDialog, setShowUploadAssetDialog] = useState(false);
464
+ const [showEditFolderDialog, setShowEditFolderDialog] = useState(false);
465
+ const [assetToEdit, setAssetToEdit] = useState(void 0);
466
+ const [folderToEdit, setFolderToEdit] = useState(void 0);
467
+ const [selected, { selectOne, selectAll }] = useSelectionState(["type", "id"], []);
468
+ const indeterminateBulkSelect = selected?.length > 0 && selected?.length !== assetCount + folderCount;
469
+ const toggleUploadAssetDialog = () => setShowUploadAssetDialog((prev) => !prev);
470
+ const toggleEditFolderDialog = ({ created = false } = {}) => {
471
+ if (created && query?.page !== "1") {
472
+ setQuery({
473
+ ...query,
474
+ page: 1
475
+ });
476
+ }
477
+ setShowEditFolderDialog((prev) => !prev);
478
+ };
479
+ const handleBulkSelect = (checked, elements) => {
480
+ if (checked) {
481
+ trackUsage("didSelectAllMediaLibraryElements");
482
+ }
483
+ selectAll(elements);
484
+ };
485
+ const handleChangeSort = (value) => {
486
+ trackUsage("didSortMediaLibraryElements", {
487
+ location: "upload",
488
+ sort: value
489
+ });
490
+ setQuery({ sort: value });
491
+ };
492
+ const handleEditFolder = (folder) => {
493
+ setFolderToEdit(folder);
494
+ setShowEditFolderDialog(true);
495
+ };
496
+ const handleEditFolderClose = (payload) => {
497
+ setFolderToEdit(null);
498
+ toggleEditFolderDialog(payload);
499
+ if (currentFolderToEditRef.current) {
500
+ currentFolderToEditRef.current.focus();
501
+ }
502
+ };
503
+ const handleAssetDeleted = (numberOfAssets) => {
504
+ if (numberOfAssets === assetCount && assetsData.pagination.page === assetsData.pagination.pageCount && assetsData.pagination.page > 1) {
505
+ setQuery({
506
+ ...query,
507
+ page: assetsData.pagination.page - 1
508
+ });
509
+ }
510
+ };
511
+ const handleBulkActionSuccess = () => {
512
+ selectAll();
513
+ handleAssetDeleted(selected.length);
514
+ };
515
+ if (isLoading) {
516
+ return /* @__PURE__ */ jsx(Page.Loading, {});
517
+ }
518
+ if (assetsError || foldersError) {
519
+ return /* @__PURE__ */ jsx(Page.Error, {});
520
+ }
521
+ return /* @__PURE__ */ jsxs(Layouts.Root, { children: [
522
+ /* @__PURE__ */ jsxs(Page.Main, { children: [
523
+ /* @__PURE__ */ jsx(
524
+ Header,
525
+ {
526
+ breadcrumbs: !isCurrentFolderLoading && getBreadcrumbDataML(currentFolder, { pathname, query }),
527
+ canCreate,
528
+ onToggleEditFolderDialog: toggleEditFolderDialog,
529
+ onToggleUploadAssetDialog: toggleUploadAssetDialog,
530
+ folder: currentFolder
531
+ }
532
+ ),
533
+ /* @__PURE__ */ jsx(
534
+ Layouts.Action,
535
+ {
536
+ startActions: /* @__PURE__ */ jsxs(Fragment, { children: [
537
+ canUpdate && isGridView && (assetCount > 0 || folderCount > 0) && /* @__PURE__ */ jsx(
538
+ BoxWithHeight,
539
+ {
540
+ paddingLeft: 2,
541
+ paddingRight: 2,
542
+ background: "neutral0",
543
+ hasRadius: true,
544
+ borderColor: "neutral200",
545
+ children: /* @__PURE__ */ jsx(
546
+ Checkbox,
547
+ {
548
+ "aria-label": formatMessage({
549
+ id: getTrad("bulk.select.label"),
550
+ defaultMessage: "Select all folders & assets"
551
+ }),
552
+ checked: indeterminateBulkSelect ? "indeterminate" : (assetCount > 0 || folderCount > 0) && selected.length === assetCount + folderCount,
553
+ onCheckedChange: (e) => handleBulkSelect(e, [...assets, ...folders])
554
+ }
555
+ )
556
+ }
557
+ ),
558
+ canRead && isGridView && /* @__PURE__ */ jsx(SortPicker, { value: query?.sort, onChangeSort: handleChangeSort }),
559
+ canRead && /* @__PURE__ */ jsx(Filters, {})
560
+ ] }),
561
+ endActions: /* @__PURE__ */ jsxs(Fragment, { children: [
562
+ canConfigureView ? /* @__PURE__ */ jsx(ActionContainer, { paddingTop: 1, paddingBottom: 1, children: /* @__PURE__ */ jsx(
563
+ IconButton,
564
+ {
565
+ tag: Link$1,
566
+ to: {
567
+ pathname: `${pathname}/configuration`,
568
+ search: stringify(query, { encode: false })
569
+ },
570
+ label: formatMessage({
571
+ id: "app.links.configure-view",
572
+ defaultMessage: "Configure the view"
573
+ }),
574
+ children: /* @__PURE__ */ jsx(Cog, {})
575
+ }
576
+ ) }) : null,
577
+ /* @__PURE__ */ jsx(ActionContainer, { paddingTop: 1, paddingBottom: 1, children: /* @__PURE__ */ jsx(
578
+ IconButton,
579
+ {
580
+ label: isGridView ? formatMessage({
581
+ id: getTrad("view-switch.list"),
582
+ defaultMessage: "List View"
583
+ }) : formatMessage({
584
+ id: getTrad("view-switch.grid"),
585
+ defaultMessage: "Grid View"
586
+ }),
587
+ onClick: () => setView(isGridView ? viewOptions.LIST : viewOptions.GRID),
588
+ children: isGridView ? /* @__PURE__ */ jsx(List, {}) : /* @__PURE__ */ jsx(GridFour, {})
589
+ }
590
+ ) }),
591
+ /* @__PURE__ */ jsx(
592
+ SearchInput,
593
+ {
594
+ label: formatMessage({
595
+ id: getTrad("search.label"),
596
+ defaultMessage: "Search for an asset"
597
+ }),
598
+ trackedEvent: "didSearchMediaLibraryElements",
599
+ trackedEventDetails: { location: "upload" }
600
+ }
601
+ )
602
+ ] })
603
+ }
604
+ ),
605
+ /* @__PURE__ */ jsxs(Layouts.Content, { children: [
606
+ selected.length > 0 && /* @__PURE__ */ jsx(
607
+ BulkActions,
608
+ {
609
+ currentFolder,
610
+ selected,
611
+ onSuccess: handleBulkActionSuccess
612
+ }
613
+ ),
614
+ folderCount === 0 && assetCount === 0 && /* @__PURE__ */ jsx(
615
+ EmptyOrNoPermissions,
616
+ {
617
+ canCreate,
618
+ canRead,
619
+ isFiltering,
620
+ onActionClick: toggleUploadAssetDialog
621
+ }
622
+ ),
623
+ canRead && !isGridView && (assetCount > 0 || folderCount > 0) && /* @__PURE__ */ jsx(
624
+ TableList,
625
+ {
626
+ assetCount,
627
+ folderCount,
628
+ indeterminate: indeterminateBulkSelect,
629
+ onChangeSort: handleChangeSort,
630
+ onChangeFolder: (folderID, folderPath) => navigate(getFolderURL(pathname, query, { folder: folderID, folderPath })),
631
+ onEditAsset: setAssetToEdit,
632
+ onEditFolder: handleEditFolder,
633
+ onSelectOne: selectOne,
634
+ onSelectAll: handleBulkSelect,
635
+ rows: [...folders, ...assets],
636
+ selected,
637
+ shouldDisableBulkSelect: !canUpdate,
638
+ sortQuery: query?.sort ?? ""
639
+ }
640
+ ),
641
+ canRead && isGridView && /* @__PURE__ */ jsxs(Fragment, { children: [
642
+ folderCount > 0 && /* @__PURE__ */ jsx(
643
+ FolderGridList,
644
+ {
645
+ title: (
646
+ // Folders title should only appear if:
647
+ // user is filtering and there are assets to display, to divide both type of elements
648
+ // user is not filtering
649
+ (isFiltering && assetCount > 0 || !isFiltering) && formatMessage(
650
+ {
651
+ id: getTrad("list.folders.title"),
652
+ defaultMessage: "Folders ({count})"
653
+ },
654
+ { count: folderCount }
655
+ ) || ""
656
+ ),
657
+ children: folders.map((folder) => {
658
+ const selectedFolders = selected.filter(({ type }) => type === "folder");
659
+ const isSelected = !!selectedFolders.find(
660
+ (currentFolder2) => currentFolder2.id === folder.id
661
+ );
662
+ const url = getFolderURL(pathname, query, {
663
+ folder: folder?.id,
664
+ folderPath: folder?.path
665
+ });
666
+ return /* @__PURE__ */ jsx(
667
+ Grid.Item,
668
+ {
669
+ col: 3,
670
+ direction: "column",
671
+ alignItems: "stretch",
672
+ children: /* @__PURE__ */ jsx(
673
+ FolderCard,
674
+ {
675
+ ref: folderToEdit && folder.id === folderToEdit.id ? currentFolderToEditRef : void 0,
676
+ ariaLabel: folder.name,
677
+ id: `folder-${folder.id}`,
678
+ to: url,
679
+ startAction: selectOne && folder.isSelectable ? /* @__PURE__ */ jsx(
680
+ FolderCardCheckbox,
681
+ {
682
+ "data-testid": `folder-checkbox-${folder.id}`,
683
+ checked: isSelected,
684
+ onCheckedChange: () => selectOne(folder)
685
+ }
686
+ ) : null,
687
+ cardActions: /* @__PURE__ */ jsx(
688
+ IconButton,
689
+ {
690
+ "aria-label": formatMessage({
691
+ id: getTrad("list.folder.edit"),
692
+ defaultMessage: "Edit folder"
693
+ }),
694
+ onClick: () => handleEditFolder(folder),
695
+ children: /* @__PURE__ */ jsx(Pencil, {})
696
+ }
697
+ ),
698
+ children: /* @__PURE__ */ jsx(FolderCardBody, { children: /* @__PURE__ */ jsx(FolderCardBodyAction, { to: url, children: /* @__PURE__ */ jsxs(Flex, { tag: "h2", direction: "column", alignItems: "start", maxWidth: "100%", children: [
699
+ /* @__PURE__ */ jsxs(
700
+ TypographyMaxWidth,
701
+ {
702
+ fontWeight: "semiBold",
703
+ textColor: "neutral800",
704
+ ellipsis: true,
705
+ children: [
706
+ folder.name,
707
+ /* @__PURE__ */ jsx(VisuallyHidden, { children: ":" })
708
+ ]
709
+ }
710
+ ),
711
+ /* @__PURE__ */ jsx(
712
+ TypographyMaxWidth,
713
+ {
714
+ tag: "span",
715
+ textColor: "neutral600",
716
+ variant: "pi",
717
+ ellipsis: true,
718
+ children: formatMessage(
719
+ {
720
+ id: getTrad("list.folder.subtitle"),
721
+ defaultMessage: "{folderCount, plural, =0 {# folder} one {# folder} other {# folders}}, {filesCount, plural, =0 {# asset} one {# asset} other {# assets}}"
722
+ },
723
+ {
724
+ folderCount: folder.children.count,
725
+ filesCount: folder.files.count
726
+ }
727
+ )
728
+ }
729
+ )
730
+ ] }) }) })
731
+ }
732
+ )
733
+ },
734
+ `folder-${folder.id}`
735
+ );
736
+ })
737
+ }
738
+ ),
739
+ assetCount > 0 && folderCount > 0 && /* @__PURE__ */ jsx(Box, { paddingTop: 6, paddingBottom: 4, children: /* @__PURE__ */ jsx(Divider, {}) }),
740
+ assetCount > 0 && /* @__PURE__ */ jsx(
741
+ AssetGridList,
742
+ {
743
+ assets,
744
+ onEditAsset: setAssetToEdit,
745
+ onSelectAsset: selectOne,
746
+ selectedAssets: selected.filter(({ type }) => type === "asset"),
747
+ title: (
748
+ // Assets title should only appear if:
749
+ // - user is not filtering
750
+ // - user is filtering and there are folders to display, to separate them
751
+ // - user is on page 1 since folders won't appear on any other page than the first one (no need to visually separate them)
752
+ (!isFiltering || isFiltering && folderCount > 0) && assetsData?.pagination?.page === 1 && formatMessage(
753
+ {
754
+ id: getTrad("list.assets.title"),
755
+ defaultMessage: "Assets ({count})"
756
+ },
757
+ { count: totalAssetCount }
758
+ ) || ""
759
+ )
760
+ }
761
+ )
762
+ ] }),
763
+ /* @__PURE__ */ jsxs(Pagination.Root, { ...assetsData.pagination, children: [
764
+ /* @__PURE__ */ jsx(Pagination.PageSize, {}),
765
+ /* @__PURE__ */ jsx(Pagination.Links, {})
766
+ ] })
767
+ ] })
768
+ ] }),
769
+ showUploadAssetDialog && /* @__PURE__ */ jsx(
770
+ UploadAssetDialog,
771
+ {
772
+ open: showUploadAssetDialog,
773
+ onClose: toggleUploadAssetDialog,
774
+ trackedLocation: "upload",
775
+ folderId: query?.folder
776
+ }
777
+ ),
778
+ showEditFolderDialog && /* @__PURE__ */ jsx(
779
+ EditFolderDialog,
780
+ {
781
+ open: showEditFolderDialog,
782
+ onClose: handleEditFolderClose,
783
+ folder: folderToEdit,
784
+ parentFolderId: query?.folder,
785
+ location: "upload"
786
+ }
787
+ ),
788
+ assetToEdit && /* @__PURE__ */ jsx(
789
+ EditAssetDialog,
790
+ {
791
+ onClose: (editedAsset) => {
792
+ if (editedAsset === null) {
793
+ handleAssetDeleted(1);
794
+ }
795
+ setAssetToEdit(void 0);
796
+ },
797
+ open: !!assetToEdit,
798
+ asset: assetToEdit,
799
+ canUpdate,
800
+ canCopyLink,
801
+ canDownload,
802
+ trackedLocation: "upload"
803
+ }
804
+ )
805
+ ] });
806
+ };
807
+ const ConfigureTheView = lazy(() => import("./index-BCcXIErg.mjs"));
808
+ const Upload = () => {
809
+ const {
810
+ config: { isLoading, isError, data: config }
811
+ } = useConfig();
812
+ const [{ rawQuery }, setQuery] = useQueryParams();
813
+ const { formatMessage } = useIntl();
814
+ const title = formatMessage({ id: getTrad("plugin.name"), defaultMessage: "Media Library" });
815
+ useEffect(() => {
816
+ if (isLoading || isError || rawQuery) {
817
+ return;
818
+ }
819
+ setQuery({ sort: config.sort, page: 1, pageSize: config.pageSize });
820
+ }, [isLoading, isError, config, rawQuery, setQuery]);
821
+ if (isLoading) {
822
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
823
+ /* @__PURE__ */ jsx(Page.Title, { children: title }),
824
+ /* @__PURE__ */ jsx(Page.Loading, {})
825
+ ] });
826
+ }
827
+ return /* @__PURE__ */ jsx(Page.Main, { children: rawQuery ? /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(Page.Loading, {}), children: /* @__PURE__ */ jsxs(Routes, { children: [
828
+ /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(MediaLibrary, {}) }),
829
+ /* @__PURE__ */ jsx(Route, { path: "configuration", element: /* @__PURE__ */ jsx(ConfigureTheView, { config }) })
830
+ ] }) }) : null });
831
+ };
832
+ export {
833
+ Upload as default
834
+ };
835
+ //# sourceMappingURL=index-DoOeVmlB.mjs.map