@strapi/upload 0.0.0 → 5.0.0-beta.6

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