@strapi/upload 5.34.0 → 5.36.0

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 (141) hide show
  1. package/dist/admin/components/EditAssetDialog/EditAssetContent.js +32 -3
  2. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  3. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +32 -3
  4. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  5. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
  6. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
  7. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js +57 -0
  8. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js.map +1 -0
  9. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs +55 -0
  10. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs.map +1 -0
  11. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +96 -20
  12. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
  13. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +98 -22
  14. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
  15. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.js +47 -0
  16. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.js.map +1 -1
  17. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.mjs +44 -1
  18. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.mjs.map +1 -1
  19. package/dist/admin/future/App.js +6 -11
  20. package/dist/admin/future/App.js.map +1 -1
  21. package/dist/admin/future/App.mjs +6 -11
  22. package/dist/admin/future/App.mjs.map +1 -1
  23. package/dist/admin/future/enums.js +12 -0
  24. package/dist/admin/future/enums.js.map +1 -0
  25. package/dist/admin/future/enums.mjs +10 -0
  26. package/dist/admin/future/enums.mjs.map +1 -0
  27. package/dist/admin/future/pages/Assets/AssetsPage.js +342 -0
  28. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -0
  29. package/dist/admin/future/pages/Assets/AssetsPage.mjs +321 -0
  30. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -0
  31. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +164 -0
  32. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -0
  33. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +162 -0
  34. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -0
  35. package/dist/admin/future/pages/Assets/components/AssetsTable.js +198 -0
  36. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -0
  37. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +196 -0
  38. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -0
  39. package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.js +33 -0
  40. package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.js.map +1 -0
  41. package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.mjs +31 -0
  42. package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.mjs.map +1 -0
  43. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js +107 -0
  44. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -0
  45. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +104 -0
  46. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -0
  47. package/dist/admin/future/pages/Assets/constants.js +54 -0
  48. package/dist/admin/future/pages/Assets/constants.js.map +1 -0
  49. package/dist/admin/future/pages/Assets/constants.mjs +50 -0
  50. package/dist/admin/future/pages/Assets/constants.mjs.map +1 -0
  51. package/dist/admin/future/services/api.js +28 -0
  52. package/dist/admin/future/services/api.js.map +1 -0
  53. package/dist/admin/future/services/api.mjs +25 -0
  54. package/dist/admin/future/services/api.mjs.map +1 -0
  55. package/dist/admin/future/services/assets.js +37 -0
  56. package/dist/admin/future/services/assets.js.map +1 -0
  57. package/dist/admin/future/services/assets.mjs +35 -0
  58. package/dist/admin/future/services/assets.mjs.map +1 -0
  59. package/dist/admin/future/utils/files.js +23 -0
  60. package/dist/admin/future/utils/files.js.map +1 -0
  61. package/dist/admin/future/utils/files.mjs +19 -0
  62. package/dist/admin/future/utils/files.mjs.map +1 -0
  63. package/dist/admin/future/utils/getAssetIcon.js +28 -0
  64. package/dist/admin/future/utils/getAssetIcon.js.map +1 -0
  65. package/dist/admin/future/utils/getAssetIcon.mjs +26 -0
  66. package/dist/admin/future/utils/getAssetIcon.mjs.map +1 -0
  67. package/dist/admin/future/utils/translations.js +8 -0
  68. package/dist/admin/future/utils/translations.js.map +1 -0
  69. package/dist/admin/future/utils/translations.mjs +6 -0
  70. package/dist/admin/future/utils/translations.mjs.map +1 -0
  71. package/dist/admin/hooks/useEditAsset.js +1 -0
  72. package/dist/admin/hooks/useEditAsset.js.map +1 -1
  73. package/dist/admin/hooks/useEditAsset.mjs +1 -0
  74. package/dist/admin/hooks/useEditAsset.mjs.map +1 -1
  75. package/dist/admin/index.js +1 -1
  76. package/dist/admin/index.js.map +1 -1
  77. package/dist/admin/index.mjs +1 -1
  78. package/dist/admin/index.mjs.map +1 -1
  79. package/dist/admin/package.json.js +7 -6
  80. package/dist/admin/package.json.js.map +1 -1
  81. package/dist/admin/package.json.mjs +7 -6
  82. package/dist/admin/package.json.mjs.map +1 -1
  83. package/dist/admin/src/components/EditAssetDialog/PreviewBox/AssetPreview.d.ts +1 -2
  84. package/dist/admin/src/components/EditAssetDialog/PreviewBox/FocalPointActions.d.ts +7 -0
  85. package/dist/admin/src/components/EditAssetDialog/PreviewBox/PreviewBox.d.ts +6 -2
  86. package/dist/admin/src/components/EditAssetDialog/PreviewBox/PreviewComponents.d.ts +13 -0
  87. package/dist/admin/src/future/App.d.ts +1 -1
  88. package/dist/admin/src/future/enums.d.ts +6 -0
  89. package/dist/admin/src/future/pages/Assets/AssetsPage.d.ts +1 -0
  90. package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +6 -0
  91. package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +6 -0
  92. package/dist/admin/src/future/pages/Assets/components/DropZone/DropZoneWithOverlay.d.ts +4 -0
  93. package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.d.ts +11 -0
  94. package/dist/admin/src/future/pages/Assets/constants.d.ts +17 -0
  95. package/dist/admin/src/future/services/api.d.ts +5 -1
  96. package/dist/admin/src/future/services/assets.d.ts +13 -0
  97. package/dist/admin/src/future/utils/files.d.ts +3 -0
  98. package/dist/admin/src/future/utils/getAssetIcon.d.ts +12 -0
  99. package/dist/admin/src/future/utils/translations.d.ts +1 -0
  100. package/dist/admin/translations/en.json.js +11 -0
  101. package/dist/admin/translations/en.json.js.map +1 -1
  102. package/dist/admin/translations/en.json.mjs +11 -0
  103. package/dist/admin/translations/en.json.mjs.map +1 -1
  104. package/dist/server/content-types/file.js +4 -0
  105. package/dist/server/content-types/file.js.map +1 -1
  106. package/dist/server/content-types/file.mjs +4 -0
  107. package/dist/server/content-types/file.mjs.map +1 -1
  108. package/dist/server/controllers/validation/admin/upload.js +5 -0
  109. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  110. package/dist/server/controllers/validation/admin/upload.mjs +5 -0
  111. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  112. package/dist/server/controllers/validation/content-api/upload.js +6 -1
  113. package/dist/server/controllers/validation/content-api/upload.js.map +1 -1
  114. package/dist/server/controllers/validation/content-api/upload.mjs +6 -1
  115. package/dist/server/controllers/validation/content-api/upload.mjs.map +1 -1
  116. package/dist/server/services/upload.js +3 -1
  117. package/dist/server/services/upload.js.map +1 -1
  118. package/dist/server/services/upload.mjs +3 -1
  119. package/dist/server/services/upload.mjs.map +1 -1
  120. package/dist/server/src/content-types/file.d.ts +4 -0
  121. package/dist/server/src/content-types/file.d.ts.map +1 -1
  122. package/dist/server/src/content-types/index.d.ts +4 -0
  123. package/dist/server/src/content-types/index.d.ts.map +1 -1
  124. package/dist/server/src/controllers/validation/admin/upload.d.ts +240 -0
  125. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
  126. package/dist/server/src/controllers/validation/content-api/upload.d.ts +180 -0
  127. package/dist/server/src/controllers/validation/content-api/upload.d.ts.map +1 -1
  128. package/dist/server/src/index.d.ts +5 -1
  129. package/dist/server/src/index.d.ts.map +1 -1
  130. package/dist/server/src/services/index.d.ts +1 -1
  131. package/dist/server/src/services/upload.d.ts +1 -1
  132. package/dist/server/src/services/upload.d.ts.map +1 -1
  133. package/dist/server/src/types.d.ts +6 -0
  134. package/dist/server/src/types.d.ts.map +1 -1
  135. package/dist/shared/contracts/files.d.ts +6 -0
  136. package/package.json +7 -6
  137. package/dist/admin/future/pages/MediaLibraryPage.js +0 -55
  138. package/dist/admin/future/pages/MediaLibraryPage.js.map +0 -1
  139. package/dist/admin/future/pages/MediaLibraryPage.mjs +0 -53
  140. package/dist/admin/future/pages/MediaLibraryPage.mjs.map +0 -1
  141. package/dist/admin/src/future/pages/MediaLibraryPage.d.ts +0 -1
@@ -0,0 +1,321 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useRef, useState, useEffect } from 'react';
3
+ import * as ToggleGroup from '@radix-ui/react-toggle-group';
4
+ import { useNotification, useAPIErrorHandler, Layouts, SearchInput } from '@strapi/admin/strapi-admin';
5
+ import { Box, VisuallyHidden, Flex, SimpleMenu, MenuItem, Loader, Typography } from '@strapi/design-system';
6
+ import { ChevronDown, Files, List, GridFour, Folder } from '@strapi/icons';
7
+ import { useIntl } from 'react-intl';
8
+ import { styled } from 'styled-components';
9
+ import { usePersistentState } from '../../../hooks/usePersistentState.mjs';
10
+ import { useUploadFilesMutation } from '../../services/api.mjs';
11
+ import { useGetAssetsQuery } from '../../services/assets.mjs';
12
+ import { getTranslationKey } from '../../utils/translations.mjs';
13
+ import { AssetsGrid } from './components/AssetsGrid.mjs';
14
+ import { AssetsTable } from './components/AssetsTable.mjs';
15
+ import { DropZoneWithOverlay } from './components/DropZone/DropZoneWithOverlay.mjs';
16
+ import { UploadDropZoneProvider, useUploadDropZone } from './components/DropZone/UploadDropZoneContext.mjs';
17
+ import { viewOptions, localStorageKeys } from './constants.mjs';
18
+
19
+ const AssetsView = ({ view })=>{
20
+ const { formatMessage } = useIntl();
21
+ const { data, isLoading, error } = useGetAssetsQuery({
22
+ folder: null
23
+ });
24
+ const isGridView = view === viewOptions.GRID;
25
+ const assets = data?.results ?? [];
26
+ if (isLoading) {
27
+ return /*#__PURE__*/ jsx(Flex, {
28
+ justifyContent: "center",
29
+ padding: 8,
30
+ children: /*#__PURE__*/ jsx(Loader, {
31
+ children: formatMessage({
32
+ id: 'app.loading',
33
+ defaultMessage: 'Loading...'
34
+ })
35
+ })
36
+ });
37
+ }
38
+ if (error) {
39
+ return /*#__PURE__*/ jsx(Box, {
40
+ padding: 8,
41
+ children: /*#__PURE__*/ jsx(Typography, {
42
+ textColor: "danger600",
43
+ children: formatMessage({
44
+ id: getTranslationKey('list.assets.error'),
45
+ defaultMessage: 'An error occurred while fetching assets.'
46
+ })
47
+ })
48
+ });
49
+ }
50
+ if (isGridView) {
51
+ return /*#__PURE__*/ jsx(AssetsGrid, {
52
+ assets: assets
53
+ });
54
+ }
55
+ return /*#__PURE__*/ jsx(AssetsTable, {
56
+ assets: assets
57
+ });
58
+ };
59
+ const StyledToggleGroup = styled(ToggleGroup.Root)`
60
+ display: flex;
61
+ border: 1px solid ${({ theme })=>theme.colors.neutral200};
62
+ border-radius: ${({ theme })=>theme.borderRadius};
63
+ overflow: hidden;
64
+ `;
65
+ const StyledToggleItem = styled(ToggleGroup.Item)`
66
+ display: flex;
67
+ align-items: center;
68
+ gap: ${({ theme })=>theme.spaces[2]};
69
+ padding: ${({ theme })=>`${theme.spaces[2]} ${theme.spaces[4]}`};
70
+ border: none;
71
+ background: ${({ theme })=>theme.colors.neutral0};
72
+ color: ${({ theme })=>theme.colors.neutral800};
73
+ cursor: pointer;
74
+ font-size: ${({ theme })=>theme.fontSizes[1]};
75
+ font-weight: ${({ theme })=>theme.fontWeights.semiBold};
76
+
77
+ &:hover {
78
+ background: ${({ theme })=>theme.colors.neutral100};
79
+ }
80
+
81
+ &[data-state='on'] {
82
+ background: ${({ theme })=>theme.colors.neutral150};
83
+ }
84
+
85
+ svg {
86
+ width: 1.6rem;
87
+ height: 1.6rem;
88
+ }
89
+ `;
90
+ const DropFilesMessage = ({ uploadDropZoneRef })=>{
91
+ const { formatMessage } = useIntl();
92
+ const { isDragging } = useUploadDropZone();
93
+ // Dropzone message position (relative to main content)
94
+ const [leftContentWidth, setLeftContentWidth] = useState(0);
95
+ // Calculate the left content width to position the dropzone message correctly
96
+ useEffect(()=>{
97
+ if (!uploadDropZoneRef?.current) return;
98
+ const updateRect = ()=>{
99
+ const rect = uploadDropZoneRef.current?.getBoundingClientRect();
100
+ if (rect) {
101
+ setLeftContentWidth((prev)=>prev !== rect.left ? rect.left : prev);
102
+ }
103
+ };
104
+ updateRect();
105
+ const resizeObserver = new ResizeObserver(updateRect);
106
+ resizeObserver.observe(uploadDropZoneRef.current);
107
+ return ()=>resizeObserver.disconnect();
108
+ }, [
109
+ uploadDropZoneRef
110
+ ]);
111
+ if (!isDragging) return null;
112
+ return /*#__PURE__*/ jsxs(DropFilesMessageImpl, {
113
+ $leftContentWidth: leftContentWidth,
114
+ children: [
115
+ /*#__PURE__*/ jsx(Typography, {
116
+ textColor: "neutral0",
117
+ children: formatMessage({
118
+ id: getTranslationKey('dropzone.upload.message'),
119
+ defaultMessage: 'Drop here to upload to'
120
+ })
121
+ }),
122
+ /*#__PURE__*/ jsxs(Flex, {
123
+ gap: 2,
124
+ alignItems: "center",
125
+ children: [
126
+ /*#__PURE__*/ jsx(Folder, {
127
+ width: 20,
128
+ height: 20,
129
+ fill: "neutral0"
130
+ }),
131
+ /*#__PURE__*/ jsx(Typography, {
132
+ textColor: "neutral0",
133
+ fontWeight: "semiBold",
134
+ children: "Current folder"
135
+ })
136
+ ]
137
+ })
138
+ ]
139
+ });
140
+ };
141
+ const DropFilesMessageImpl = styled(Box)`
142
+ position: fixed;
143
+ bottom: ${({ theme })=>theme.spaces[8]};
144
+ left: 50%;
145
+ transform: translateX(calc(-50% + ${({ $leftContentWidth })=>$leftContentWidth / 2}px));
146
+ display: flex;
147
+ flex-direction: column;
148
+ align-items: center;
149
+ justify-content: center;
150
+ gap: ${({ theme })=>theme.spaces[2]};
151
+ background: ${({ theme })=>theme.colors.primary600};
152
+ padding: ${({ theme })=>theme.spaces[4]} ${({ theme })=>theme.spaces[6]};
153
+ border-radius: ${({ theme })=>theme.borderRadius};
154
+ z-index: 2;
155
+ `;
156
+ const AssetsPage = ()=>{
157
+ const { formatMessage } = useIntl();
158
+ // View state
159
+ const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);
160
+ const isGridView = view === viewOptions.GRID;
161
+ // Refs
162
+ const fileInputRef = useRef(null);
163
+ const uploadDropZoneRef = useRef(null);
164
+ // Upload handlers
165
+ const { toggleNotification } = useNotification();
166
+ const { _unstableFormatAPIError } = useAPIErrorHandler();
167
+ const [uploadFiles] = useUploadFilesMutation();
168
+ const uploadFilesToFolder = async (files, folderId)=>{
169
+ if (files.length === 0) return;
170
+ const formData = new FormData();
171
+ files.forEach((file)=>{
172
+ formData.append('files', file);
173
+ formData.append('fileInfo', JSON.stringify({
174
+ name: file.name,
175
+ caption: null,
176
+ alternativeText: null,
177
+ folder: folderId
178
+ }));
179
+ });
180
+ try {
181
+ await uploadFiles(formData).unwrap();
182
+ toggleNotification({
183
+ type: 'success',
184
+ message: formatMessage({
185
+ id: getTranslationKey('assets.uploaded'),
186
+ defaultMessage: '{number, plural, one {# asset} other {# assets}} uploaded successfully'
187
+ }, {
188
+ number: files.length
189
+ })
190
+ });
191
+ } catch (error) {
192
+ const errorMessage = _unstableFormatAPIError(error);
193
+ toggleNotification({
194
+ type: 'danger',
195
+ message: errorMessage
196
+ });
197
+ }
198
+ };
199
+ const handleFileSelect = ()=>{
200
+ fileInputRef.current?.click();
201
+ };
202
+ const handleFileChange = async (e)=>{
203
+ const files = e.target.files;
204
+ if (files && files.length > 0) {
205
+ await uploadFilesToFolder(Array.from(files), null);
206
+ }
207
+ e.target.value = '';
208
+ };
209
+ const handleDrop = async (files)=>{
210
+ await uploadFilesToFolder(files, null);
211
+ };
212
+ return /*#__PURE__*/ jsx(UploadDropZoneProvider, {
213
+ onDrop: handleDrop,
214
+ children: /*#__PURE__*/ jsx(Box, {
215
+ ref: uploadDropZoneRef,
216
+ children: /*#__PURE__*/ jsxs(Layouts.Root, {
217
+ minHeight: "100vh",
218
+ children: [
219
+ /*#__PURE__*/ jsx(VisuallyHidden, {
220
+ children: /*#__PURE__*/ jsx("input", {
221
+ type: "file",
222
+ ref: fileInputRef,
223
+ onChange: handleFileChange,
224
+ multiple: true
225
+ })
226
+ }),
227
+ /*#__PURE__*/ jsx(DropFilesMessage, {
228
+ uploadDropZoneRef: uploadDropZoneRef
229
+ }),
230
+ /*#__PURE__*/ jsx(Layouts.Header, {
231
+ navigationAction: /*#__PURE__*/ jsx(Box, {
232
+ children: "TODO: Breadcrumbs"
233
+ }),
234
+ title: "TODO: Folder location",
235
+ primaryAction: /*#__PURE__*/ jsxs(Flex, {
236
+ gap: 2,
237
+ children: [
238
+ /*#__PURE__*/ jsx(SimpleMenu, {
239
+ popoverPlacement: "bottom-end",
240
+ variant: "default",
241
+ endIcon: /*#__PURE__*/ jsx(ChevronDown, {}),
242
+ label: formatMessage({
243
+ id: getTranslationKey('new'),
244
+ defaultMessage: 'New'
245
+ }),
246
+ children: /*#__PURE__*/ jsx(MenuItem, {
247
+ onSelect: handleFileSelect,
248
+ startIcon: /*#__PURE__*/ jsx(Files, {}),
249
+ children: formatMessage({
250
+ id: getTranslationKey('import-files'),
251
+ defaultMessage: 'Import files'
252
+ })
253
+ })
254
+ }),
255
+ /*#__PURE__*/ jsx(SearchInput, {
256
+ label: formatMessage({
257
+ id: getTranslationKey('search.label'),
258
+ defaultMessage: 'Search for an asset'
259
+ }),
260
+ trackedEvent: "didSearchMediaLibraryElements",
261
+ trackedEventDetails: {
262
+ location: 'upload'
263
+ }
264
+ }),
265
+ /*#__PURE__*/ jsxs(StyledToggleGroup, {
266
+ type: "single",
267
+ value: isGridView ? 'grid' : 'table',
268
+ onValueChange: (value)=>value && setView(value === 'grid' ? viewOptions.GRID : viewOptions.TABLE),
269
+ "aria-label": formatMessage({
270
+ id: getTranslationKey('view.switch.label'),
271
+ defaultMessage: 'View options'
272
+ }),
273
+ children: [
274
+ /*#__PURE__*/ jsxs(StyledToggleItem, {
275
+ value: "table",
276
+ "aria-label": formatMessage({
277
+ id: getTranslationKey('view.table'),
278
+ defaultMessage: 'Table view'
279
+ }),
280
+ children: [
281
+ /*#__PURE__*/ jsx(List, {}),
282
+ formatMessage({
283
+ id: getTranslationKey('view.table'),
284
+ defaultMessage: 'Table view'
285
+ })
286
+ ]
287
+ }),
288
+ /*#__PURE__*/ jsxs(StyledToggleItem, {
289
+ value: "grid",
290
+ "aria-label": formatMessage({
291
+ id: getTranslationKey('view.grid'),
292
+ defaultMessage: 'Grid view'
293
+ }),
294
+ children: [
295
+ /*#__PURE__*/ jsx(GridFour, {}),
296
+ formatMessage({
297
+ id: getTranslationKey('view.grid'),
298
+ defaultMessage: 'Grid view'
299
+ })
300
+ ]
301
+ })
302
+ ]
303
+ })
304
+ ]
305
+ })
306
+ }),
307
+ /*#__PURE__*/ jsx(Layouts.Content, {
308
+ children: /*#__PURE__*/ jsx(DropZoneWithOverlay, {
309
+ children: /*#__PURE__*/ jsx(AssetsView, {
310
+ view: view
311
+ })
312
+ })
313
+ })
314
+ ]
315
+ })
316
+ })
317
+ });
318
+ };
319
+
320
+ export { AssetsPage };
321
+ //# sourceMappingURL=AssetsPage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetsPage.mjs","sources":["../../../../../admin/src/future/pages/Assets/AssetsPage.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type ChangeEvent } from 'react';\n\nimport * as ToggleGroup from '@radix-ui/react-toggle-group';\nimport {\n Layouts,\n SearchInput,\n useNotification,\n useAPIErrorHandler,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n Loader,\n MenuItem,\n SimpleMenu,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { ChevronDown, Files, Folder, GridFour as GridIcon, List } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { usePersistentState } from '../../../hooks/usePersistentState';\nimport { useUploadFilesMutation } from '../../services/api';\nimport { useGetAssetsQuery } from '../../services/assets';\nimport { getTranslationKey } from '../../utils/translations';\n\nimport { AssetsGrid } from './components/AssetsGrid';\nimport { AssetsTable } from './components/AssetsTable';\nimport { DropZoneWithOverlay } from './components/DropZone/DropZoneWithOverlay';\nimport {\n UploadDropZoneProvider,\n useUploadDropZone,\n} from './components/DropZone/UploadDropZoneContext';\nimport { localStorageKeys, viewOptions } from './constants';\n\ninterface AssetsViewProps {\n view: number;\n}\n\nconst AssetsView = ({ view }: AssetsViewProps) => {\n const { formatMessage } = useIntl();\n const { data, isLoading, error } = useGetAssetsQuery({ folder: null });\n\n const isGridView = view === viewOptions.GRID;\n const assets = data?.results ?? [];\n\n if (isLoading) {\n return (\n <Flex justifyContent=\"center\" padding={8}>\n <Loader>{formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' })}</Loader>\n </Flex>\n );\n }\n\n if (error) {\n return (\n <Box padding={8}>\n <Typography textColor=\"danger600\">\n {formatMessage({\n id: getTranslationKey('list.assets.error'),\n defaultMessage: 'An error occurred while fetching assets.',\n })}\n </Typography>\n </Box>\n );\n }\n\n if (isGridView) {\n return <AssetsGrid assets={assets} />;\n }\n\n return <AssetsTable assets={assets} />;\n};\n\nconst StyledToggleGroup = styled(ToggleGroup.Root)`\n display: flex;\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n overflow: hidden;\n`;\n\nconst StyledToggleItem = styled(ToggleGroup.Item)`\n display: flex;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[4]}`};\n border: none;\n background: ${({ theme }) => theme.colors.neutral0};\n color: ${({ theme }) => theme.colors.neutral800};\n cursor: pointer;\n font-size: ${({ theme }) => theme.fontSizes[1]};\n font-weight: ${({ theme }) => theme.fontWeights.semiBold};\n\n &:hover {\n background: ${({ theme }) => theme.colors.neutral100};\n }\n\n &[data-state='on'] {\n background: ${({ theme }) => theme.colors.neutral150};\n }\n\n svg {\n width: 1.6rem;\n height: 1.6rem;\n }\n`;\n\n/**\n * Dropzone items\n */\n\ninterface DropFilesMessageProps {\n uploadDropZoneRef?: React.RefObject<HTMLDivElement>;\n}\n\nconst DropFilesMessage = ({ uploadDropZoneRef }: DropFilesMessageProps) => {\n const { formatMessage } = useIntl();\n const { isDragging } = useUploadDropZone();\n\n // Dropzone message position (relative to main content)\n const [leftContentWidth, setLeftContentWidth] = useState(0);\n\n // Calculate the left content width to position the dropzone message correctly\n useEffect(() => {\n if (!uploadDropZoneRef?.current) return;\n\n const updateRect = () => {\n const rect = uploadDropZoneRef.current?.getBoundingClientRect();\n if (rect) {\n setLeftContentWidth((prev) => (prev !== rect.left ? rect.left : prev));\n }\n };\n\n updateRect();\n const resizeObserver = new ResizeObserver(updateRect);\n resizeObserver.observe(uploadDropZoneRef.current);\n return () => resizeObserver.disconnect();\n }, [uploadDropZoneRef]);\n\n if (!isDragging) return null;\n\n return (\n <DropFilesMessageImpl $leftContentWidth={leftContentWidth}>\n <Typography textColor=\"neutral0\">\n {formatMessage({\n id: getTranslationKey('dropzone.upload.message'),\n defaultMessage: 'Drop here to upload to',\n })}\n </Typography>\n <Flex gap={2} alignItems=\"center\">\n <Folder width={20} height={20} fill=\"neutral0\" />\n <Typography textColor=\"neutral0\" fontWeight=\"semiBold\">\n Current folder{/* TODO: Replace this later with the current folder name */}\n </Typography>\n </Flex>\n </DropFilesMessageImpl>\n );\n};\n\nconst DropFilesMessageImpl = styled(Box)<{ $leftContentWidth: number }>`\n position: fixed;\n bottom: ${({ theme }) => theme.spaces[8]};\n left: 50%;\n transform: translateX(calc(-50% + ${({ $leftContentWidth }) => $leftContentWidth / 2}px));\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: ${({ theme }) => theme.spaces[2]};\n background: ${({ theme }) => theme.colors.primary600};\n padding: ${({ theme }) => theme.spaces[4]} ${({ theme }) => theme.spaces[6]};\n border-radius: ${({ theme }) => theme.borderRadius};\n z-index: 2;\n`;\n\nexport const AssetsPage = () => {\n const { formatMessage } = useIntl();\n\n // View state\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n // Refs\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadDropZoneRef = useRef<HTMLDivElement>(null);\n\n // Upload handlers\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError } = useAPIErrorHandler();\n const [uploadFiles] = useUploadFilesMutation();\n\n const uploadFilesToFolder = async (files: globalThis.File[], folderId: number | null) => {\n if (files.length === 0) return;\n const formData = new FormData();\n files.forEach((file) => {\n formData.append('files', file);\n formData.append(\n 'fileInfo',\n JSON.stringify({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: folderId,\n })\n );\n });\n try {\n await uploadFiles(formData).unwrap();\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('assets.uploaded'),\n defaultMessage:\n '{number, plural, one {# asset} other {# assets}} uploaded successfully',\n },\n { number: files.length }\n ),\n });\n } catch (error) {\n const errorMessage = _unstableFormatAPIError(error as Error);\n toggleNotification({\n type: 'danger',\n message: errorMessage,\n });\n }\n };\n\n const handleFileSelect = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (e: ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0) {\n await uploadFilesToFolder(Array.from(files), null);\n }\n e.target.value = '';\n };\n\n const handleDrop = async (files: globalThis.File[]) => {\n await uploadFilesToFolder(files, null);\n };\n\n return (\n <UploadDropZoneProvider onDrop={handleDrop}>\n <Box ref={uploadDropZoneRef}>\n <Layouts.Root minHeight=\"100vh\">\n <VisuallyHidden>\n <input type=\"file\" ref={fileInputRef} onChange={handleFileChange} multiple />\n </VisuallyHidden>\n\n <DropFilesMessage uploadDropZoneRef={uploadDropZoneRef} />\n\n <Layouts.Header\n navigationAction={<Box>TODO: Breadcrumbs</Box>}\n title=\"TODO: Folder location\"\n primaryAction={\n <Flex gap={2}>\n <SimpleMenu\n popoverPlacement=\"bottom-end\"\n variant=\"default\"\n endIcon={<ChevronDown />}\n label={formatMessage({ id: getTranslationKey('new'), defaultMessage: 'New' })}\n >\n <MenuItem onSelect={handleFileSelect} startIcon={<Files />}>\n {formatMessage({\n id: getTranslationKey('import-files'),\n defaultMessage: 'Import files',\n })}\n </MenuItem>\n </SimpleMenu>\n <SearchInput\n label={formatMessage({\n id: getTranslationKey('search.label'),\n defaultMessage: 'Search for an asset',\n })}\n trackedEvent=\"didSearchMediaLibraryElements\"\n trackedEventDetails={{ location: 'upload' }}\n />\n <StyledToggleGroup\n type=\"single\"\n value={isGridView ? 'grid' : 'table'}\n onValueChange={(value) =>\n value && setView(value === 'grid' ? viewOptions.GRID : viewOptions.TABLE)\n }\n aria-label={formatMessage({\n id: getTranslationKey('view.switch.label'),\n defaultMessage: 'View options',\n })}\n >\n <StyledToggleItem\n value=\"table\"\n aria-label={formatMessage({\n id: getTranslationKey('view.table'),\n defaultMessage: 'Table view',\n })}\n >\n <List />\n {formatMessage({\n id: getTranslationKey('view.table'),\n defaultMessage: 'Table view',\n })}\n </StyledToggleItem>\n <StyledToggleItem\n value=\"grid\"\n aria-label={formatMessage({\n id: getTranslationKey('view.grid'),\n defaultMessage: 'Grid view',\n })}\n >\n <GridIcon />\n {formatMessage({\n id: getTranslationKey('view.grid'),\n defaultMessage: 'Grid view',\n })}\n </StyledToggleItem>\n </StyledToggleGroup>\n </Flex>\n }\n />\n\n <Layouts.Content>\n <DropZoneWithOverlay>\n <AssetsView view={view} />\n </DropZoneWithOverlay>\n </Layouts.Content>\n </Layouts.Root>\n </Box>\n </UploadDropZoneProvider>\n );\n};\n"],"names":["AssetsView","view","formatMessage","useIntl","data","isLoading","error","useGetAssetsQuery","folder","isGridView","viewOptions","GRID","assets","results","_jsx","Flex","justifyContent","padding","Loader","id","defaultMessage","Box","Typography","textColor","getTranslationKey","AssetsGrid","AssetsTable","StyledToggleGroup","styled","ToggleGroup","Root","theme","colors","neutral200","borderRadius","StyledToggleItem","Item","spaces","neutral0","neutral800","fontSizes","fontWeights","semiBold","neutral100","neutral150","DropFilesMessage","uploadDropZoneRef","isDragging","useUploadDropZone","leftContentWidth","setLeftContentWidth","useState","useEffect","current","updateRect","rect","getBoundingClientRect","prev","left","resizeObserver","ResizeObserver","observe","disconnect","_jsxs","DropFilesMessageImpl","$leftContentWidth","gap","alignItems","Folder","width","height","fill","fontWeight","primary600","AssetsPage","setView","usePersistentState","localStorageKeys","fileInputRef","useRef","toggleNotification","useNotification","_unstableFormatAPIError","useAPIErrorHandler","uploadFiles","useUploadFilesMutation","uploadFilesToFolder","files","folderId","length","formData","FormData","forEach","file","append","JSON","stringify","name","caption","alternativeText","unwrap","type","message","number","errorMessage","handleFileSelect","click","handleFileChange","e","target","Array","from","value","handleDrop","UploadDropZoneProvider","onDrop","ref","Layouts","minHeight","VisuallyHidden","input","onChange","multiple","Header","navigationAction","title","primaryAction","SimpleMenu","popoverPlacement","variant","endIcon","ChevronDown","label","MenuItem","onSelect","startIcon","Files","SearchInput","trackedEvent","trackedEventDetails","location","onValueChange","TABLE","aria-label","List","GridIcon","Content","DropZoneWithOverlay"],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var designSystem = require('@strapi/design-system');
5
+ var icons = require('@strapi/icons');
6
+ var reactIntl = require('react-intl');
7
+ var styledComponents = require('styled-components');
8
+ var enums = require('../../../enums.js');
9
+ var files = require('../../../utils/files.js');
10
+ var getAssetIcon = require('../../../utils/getAssetIcon.js');
11
+ var translations = require('../../../utils/translations.js');
12
+
13
+ /* -------------------------------------------------------------------------------------------------
14
+ * AssetsGrid
15
+ * -----------------------------------------------------------------------------------------------*/ const StyledCard = styledComponents.styled(designSystem.Card)`
16
+ border: 1px solid ${({ theme })=>theme.colors.neutral200};
17
+ border-radius: 8px;
18
+ overflow: hidden;
19
+ `;
20
+ /* -------------------------------------------------------------------------------------------------
21
+ * AssetPreview
22
+ * -----------------------------------------------------------------------------------------------*/ const PreviewContainer = styledComponents.styled(designSystem.Box)`
23
+ position: relative;
24
+ width: 100%;
25
+ padding-bottom: 62.5%;
26
+ height: 0;
27
+ overflow: hidden;
28
+ background: repeating-conic-gradient(
29
+ ${({ theme })=>theme.colors.neutral100} 0% 25%,
30
+ transparent 0% 50%
31
+ )
32
+ 50% / 20px 20px;
33
+ `;
34
+ const StyledImage = styledComponents.styled.img`
35
+ position: absolute;
36
+ top: 0;
37
+ left: 0;
38
+ width: 100%;
39
+ height: 100%;
40
+ object-fit: cover;
41
+ `;
42
+ const IconPreview = styledComponents.styled(designSystem.Flex)`
43
+ position: absolute;
44
+ top: 0;
45
+ left: 0;
46
+ width: 100%;
47
+ height: 100%;
48
+ color: ${({ theme })=>theme.colors.neutral500};
49
+ background: ${({ theme })=>theme.colors.neutral100};
50
+ `;
51
+ const AssetPreview = ({ asset })=>{
52
+ const { alternativeText, ext, formats, mime, url } = asset;
53
+ if (mime?.includes(enums.AssetType.Image)) {
54
+ const mediaURL = files.prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? files.prefixFileUrlWithBackendUrl(url);
55
+ if (mediaURL) {
56
+ return /*#__PURE__*/ jsxRuntime.jsx(PreviewContainer, {
57
+ children: /*#__PURE__*/ jsxRuntime.jsx(StyledImage, {
58
+ src: mediaURL,
59
+ alt: alternativeText || ''
60
+ })
61
+ });
62
+ }
63
+ }
64
+ const DocIcon = getAssetIcon.getAssetIcon(mime, ext);
65
+ return /*#__PURE__*/ jsxRuntime.jsx(PreviewContainer, {
66
+ children: /*#__PURE__*/ jsxRuntime.jsx(IconPreview, {
67
+ justifyContent: "center",
68
+ alignItems: "center",
69
+ children: /*#__PURE__*/ jsxRuntime.jsx(DocIcon, {
70
+ width: 48,
71
+ height: 48
72
+ })
73
+ })
74
+ });
75
+ };
76
+ /* -------------------------------------------------------------------------------------------------
77
+ * AssetCard
78
+ * -----------------------------------------------------------------------------------------------*/ const StyledCardHeader = styledComponents.styled(designSystem.CardHeader)`
79
+ border-bottom: none;
80
+ `;
81
+ const CardFooter = styledComponents.styled(designSystem.Flex)`
82
+ min-width: 0;
83
+ `;
84
+ const FileTypeIcon = styledComponents.styled(designSystem.Flex)`
85
+ color: ${({ theme })=>theme.colors.neutral600};
86
+ flex-shrink: 0;
87
+ `;
88
+ const FileName = styledComponents.styled(designSystem.Typography)`
89
+ flex: 1;
90
+ min-width: 0;
91
+ `;
92
+ const AssetCard = ({ asset })=>{
93
+ const { formatMessage } = reactIntl.useIntl();
94
+ const TypeIcon = getAssetIcon.getAssetIcon(asset.mime, asset.ext);
95
+ return /*#__PURE__*/ jsxRuntime.jsxs(StyledCard, {
96
+ children: [
97
+ /*#__PURE__*/ jsxRuntime.jsx(StyledCardHeader, {
98
+ children: /*#__PURE__*/ jsxRuntime.jsx(AssetPreview, {
99
+ asset: asset
100
+ })
101
+ }),
102
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.CardBody, {
103
+ children: /*#__PURE__*/ jsxRuntime.jsxs(CardFooter, {
104
+ alignItems: "center",
105
+ gap: 2,
106
+ paddingTop: 2,
107
+ children: [
108
+ /*#__PURE__*/ jsxRuntime.jsx(FileTypeIcon, {
109
+ children: /*#__PURE__*/ jsxRuntime.jsx(TypeIcon, {
110
+ width: 16,
111
+ height: 16
112
+ })
113
+ }),
114
+ /*#__PURE__*/ jsxRuntime.jsx(FileName, {
115
+ textColor: "primary800",
116
+ ellipsis: true,
117
+ children: asset.name
118
+ }),
119
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
120
+ label: formatMessage({
121
+ id: translations.getTranslationKey('control-card.more-actions'),
122
+ defaultMessage: 'More actions'
123
+ }),
124
+ variant: "ghost",
125
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.More, {})
126
+ })
127
+ ]
128
+ })
129
+ })
130
+ ]
131
+ });
132
+ };
133
+ const AssetsGrid = ({ assets })=>{
134
+ const { formatMessage } = reactIntl.useIntl();
135
+ if (assets.length === 0) {
136
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
137
+ padding: 8,
138
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
139
+ textColor: "neutral600",
140
+ children: formatMessage({
141
+ id: 'app.components.EmptyStateLayout.content-document',
142
+ defaultMessage: 'No content found'
143
+ })
144
+ })
145
+ });
146
+ }
147
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Root, {
148
+ gap: 4,
149
+ children: assets.map((asset)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
150
+ col: 3,
151
+ m: 4,
152
+ s: 6,
153
+ xs: 12,
154
+ direction: "column",
155
+ alignItems: "stretch",
156
+ children: /*#__PURE__*/ jsxRuntime.jsx(AssetCard, {
157
+ asset: asset
158
+ })
159
+ }, asset.id))
160
+ });
161
+ };
162
+
163
+ exports.AssetsGrid = AssetsGrid;
164
+ //# sourceMappingURL=AssetsGrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetsGrid.js","sources":["../../../../../../admin/src/future/pages/Assets/components/AssetsGrid.tsx"],"sourcesContent":["import {\n Box,\n Card,\n CardBody,\n CardHeader,\n Flex,\n Grid,\n IconButton,\n Typography,\n} from '@strapi/design-system';\nimport { More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../utils/translations';\n\nimport type { File } from '../../../../../../shared/contracts/files';\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCard = styled(Card)`\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: 8px;\n overflow: hidden;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPreview\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n width: 100%;\n padding-bottom: 62.5%;\n height: 0;\n overflow: hidden;\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n`;\n\nconst StyledImage = styled.img`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\nconst IconPreview = styled(Flex)`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral100};\n`;\n\ninterface AssetPreviewProps {\n asset: File;\n}\n\nconst AssetPreview = ({ asset }: AssetPreviewProps) => {\n const { alternativeText, ext, formats, mime, url } = asset;\n\n if (mime?.includes(AssetType.Image)) {\n const mediaURL =\n prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);\n\n if (mediaURL) {\n return (\n <PreviewContainer>\n <StyledImage src={mediaURL} alt={alternativeText || ''} />\n </PreviewContainer>\n );\n }\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <PreviewContainer>\n <IconPreview justifyContent=\"center\" alignItems=\"center\">\n <DocIcon width={48} height={48} />\n </IconPreview>\n </PreviewContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCardHeader = styled(CardHeader)`\n border-bottom: none;\n`;\n\nconst CardFooter = styled(Flex)`\n min-width: 0;\n`;\n\nconst FileTypeIcon = styled(Flex)`\n color: ${({ theme }) => theme.colors.neutral600};\n flex-shrink: 0;\n`;\n\nconst FileName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface AssetCardProps {\n asset: File;\n}\n\nconst AssetCard = ({ asset }: AssetCardProps) => {\n const { formatMessage } = useIntl();\n const TypeIcon = getAssetIcon(asset.mime, asset.ext);\n\n return (\n <StyledCard>\n <StyledCardHeader>\n <AssetPreview asset={asset} />\n </StyledCardHeader>\n <CardBody>\n <CardFooter alignItems=\"center\" gap={2} paddingTop={2}>\n <FileTypeIcon>\n <TypeIcon width={16} height={16} />\n </FileTypeIcon>\n <FileName textColor=\"primary800\" ellipsis>\n {asset.name}\n </FileName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n >\n <More />\n </IconButton>\n </CardFooter>\n </CardBody>\n </StyledCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsGridProps {\n assets: File[];\n}\n\nexport const AssetsGrid = ({ assets }: AssetsGridProps) => {\n const { formatMessage } = useIntl();\n\n if (assets.length === 0) {\n return (\n <Box padding={8}>\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Grid.Root gap={4}>\n {assets.map((asset) => (\n <Grid.Item\n col={3}\n m={4}\n s={6}\n xs={12}\n key={asset.id}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <AssetCard asset={asset} />\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n"],"names":["StyledCard","styled","Card","theme","colors","neutral200","PreviewContainer","Box","neutral100","StyledImage","img","IconPreview","Flex","neutral500","AssetPreview","asset","alternativeText","ext","formats","mime","url","includes","AssetType","Image","mediaURL","prefixFileUrlWithBackendUrl","thumbnail","_jsx","src","alt","DocIcon","getAssetIcon","justifyContent","alignItems","width","height","StyledCardHeader","CardHeader","CardFooter","FileTypeIcon","neutral600","FileName","Typography","AssetCard","formatMessage","useIntl","TypeIcon","_jsxs","CardBody","gap","paddingTop","textColor","ellipsis","name","IconButton","label","id","getTranslationKey","defaultMessage","variant","More","AssetsGrid","assets","length","padding","Grid","Root","map","Item","col","m","s","xs","direction"],"mappings":"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"}