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