@strapi/upload 5.51.0 → 5.51.1

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 (139) hide show
  1. package/dist/admin/future/pages/Assets/AssetsPage.js +198 -129
  2. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  3. package/dist/admin/future/pages/Assets/AssetsPage.mjs +199 -130
  4. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  5. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +158 -19
  6. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  7. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +159 -20
  8. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  9. package/dist/admin/future/pages/Assets/components/AssetsTable.js +212 -37
  10. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  11. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +213 -38
  12. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  13. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +252 -0
  14. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -0
  15. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +250 -0
  16. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -0
  17. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +209 -0
  18. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -0
  19. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +207 -0
  20. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -0
  21. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +111 -36
  22. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
  23. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +113 -38
  24. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
  25. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js +120 -13
  26. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js.map +1 -1
  27. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs +120 -13
  28. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs.map +1 -1
  29. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +71 -0
  30. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -0
  31. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +69 -0
  32. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -0
  33. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js +34 -0
  34. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js.map +1 -0
  35. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs +32 -0
  36. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs.map +1 -0
  37. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js +15 -0
  38. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js.map +1 -1
  39. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs +13 -1
  40. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
  41. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +19 -25
  42. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  43. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +19 -25
  44. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  45. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js +35 -0
  46. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js.map +1 -0
  47. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs +33 -0
  48. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs.map +1 -0
  49. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +120 -22
  50. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  51. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +121 -23
  52. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  53. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js +22 -0
  54. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js.map +1 -0
  55. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs +19 -0
  56. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs.map +1 -0
  57. package/dist/admin/future/pages/Assets/components/SortMenu.js +165 -0
  58. package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -0
  59. package/dist/admin/future/pages/Assets/components/SortMenu.mjs +163 -0
  60. package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -0
  61. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +59 -0
  62. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -0
  63. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +55 -0
  64. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -0
  65. package/dist/admin/future/pages/Assets/hooks/useListSort.js +124 -0
  66. package/dist/admin/future/pages/Assets/hooks/useListSort.js.map +1 -0
  67. package/dist/admin/future/pages/Assets/hooks/useListSort.mjs +120 -0
  68. package/dist/admin/future/pages/Assets/hooks/useListSort.mjs.map +1 -0
  69. package/dist/admin/future/pages/Assets/utils/listQueryKey.js +29 -0
  70. package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -0
  71. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +27 -0
  72. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -0
  73. package/dist/admin/future/pages/Assets/utils/mergeMixedList.js +84 -0
  74. package/dist/admin/future/pages/Assets/utils/mergeMixedList.js.map +1 -0
  75. package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs +81 -0
  76. package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs.map +1 -0
  77. package/dist/admin/future/pages/Assets/utils/selection.js +104 -0
  78. package/dist/admin/future/pages/Assets/utils/selection.js.map +1 -0
  79. package/dist/admin/future/pages/Assets/utils/selection.mjs +94 -0
  80. package/dist/admin/future/pages/Assets/utils/selection.mjs.map +1 -0
  81. package/dist/admin/future/services/assets.js +33 -1
  82. package/dist/admin/future/services/assets.js.map +1 -1
  83. package/dist/admin/future/services/assets.mjs +33 -2
  84. package/dist/admin/future/services/assets.mjs.map +1 -1
  85. package/dist/admin/future/services/folders.js +3 -3
  86. package/dist/admin/future/services/folders.js.map +1 -1
  87. package/dist/admin/future/services/folders.mjs +3 -3
  88. package/dist/admin/future/services/folders.mjs.map +1 -1
  89. package/dist/admin/future/utils/buildDragSetFromSelection.js +33 -0
  90. package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -0
  91. package/dist/admin/future/utils/buildDragSetFromSelection.mjs +31 -0
  92. package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -0
  93. package/dist/admin/future/utils/canDropItemOnFolder.js +4 -0
  94. package/dist/admin/future/utils/canDropItemOnFolder.js.map +1 -1
  95. package/dist/admin/future/utils/canDropItemOnFolder.mjs +4 -0
  96. package/dist/admin/future/utils/canDropItemOnFolder.mjs.map +1 -1
  97. package/dist/admin/future/utils/flattenFolderStructure.js +28 -0
  98. package/dist/admin/future/utils/flattenFolderStructure.js.map +1 -0
  99. package/dist/admin/future/utils/flattenFolderStructure.mjs +26 -0
  100. package/dist/admin/future/utils/flattenFolderStructure.mjs.map +1 -0
  101. package/dist/admin/future/utils/formatMoveSuccessMessage.js +19 -0
  102. package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -0
  103. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +17 -0
  104. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -0
  105. package/dist/admin/future/utils/getFolderLabel.js +31 -0
  106. package/dist/admin/future/utils/getFolderLabel.js.map +1 -0
  107. package/dist/admin/future/utils/getFolderLabel.mjs +29 -0
  108. package/dist/admin/future/utils/getFolderLabel.mjs.map +1 -0
  109. package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +7 -1
  110. package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +1 -0
  111. package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +13 -0
  112. package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +2 -0
  113. package/dist/admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.d.ts +2 -2
  114. package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +17 -0
  115. package/dist/admin/src/future/pages/Assets/components/Dnd/computeValidDropTargets.d.ts +7 -0
  116. package/dist/admin/src/future/pages/Assets/components/Dnd/dndIds.d.ts +3 -0
  117. package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +3 -1
  118. package/dist/admin/src/future/pages/Assets/components/Dnd/useFolderTreeDroppable.d.ts +19 -0
  119. package/dist/admin/src/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.d.ts +6 -0
  120. package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +17 -0
  121. package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +39 -0
  122. package/dist/admin/src/future/pages/Assets/hooks/useListSort.d.ts +47 -0
  123. package/dist/admin/src/future/pages/Assets/utils/listQueryKey.d.ts +30 -0
  124. package/dist/admin/src/future/pages/Assets/utils/mergeMixedList.d.ts +40 -0
  125. package/dist/admin/src/future/pages/Assets/utils/selection.d.ts +50 -0
  126. package/dist/admin/src/future/services/assets.d.ts +4 -1
  127. package/dist/admin/src/future/services/folders.d.ts +4 -1
  128. package/dist/admin/src/future/types/dnd.d.ts +5 -0
  129. package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +11 -0
  130. package/dist/admin/src/future/utils/canDropItemOnFolder.d.ts +1 -1
  131. package/dist/admin/src/future/utils/flattenFolderStructure.d.ts +18 -0
  132. package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +14 -0
  133. package/dist/admin/src/future/utils/getFolderLabel.d.ts +11 -0
  134. package/dist/admin/translations/en.json.js +33 -0
  135. package/dist/admin/translations/en.json.js.map +1 -1
  136. package/dist/admin/translations/en.json.mjs +33 -0
  137. package/dist/admin/translations/en.json.mjs.map +1 -1
  138. package/dist/shared/contracts/folders.d.ts +1 -1
  139. package/package.json +7 -7
@@ -14,6 +14,7 @@ var translations = require('../../utils/translations.js');
14
14
  var AssetDetailsDrawer = require('./components/AssetDetails/AssetDetailsDrawer.js');
15
15
  var AssetsGrid = require('./components/AssetsGrid.js');
16
16
  var AssetsTable = require('./components/AssetsTable.js');
17
+ var BulkActionsBar = require('./components/BulkActionsBar.js');
17
18
  var CreateFolderDialog = require('./components/CreateFolderDialog.js');
18
19
  var AssetsDndProvider = require('./components/Dnd/AssetsDndProvider.js');
19
20
  var UploadDropZone = require('./components/DropZone/UploadDropZone.js');
@@ -21,10 +22,15 @@ var UploadDropZoneContext = require('./components/DropZone/UploadDropZoneContext
21
22
  var EmptyState = require('./components/EmptyState.js');
22
23
  var FolderTree = require('./components/FolderTree/FolderTree.js');
23
24
  var ImportFromUrlDialog = require('./components/ImportFromUrlDialog.js');
25
+ var SortMenu = require('./components/SortMenu.js');
24
26
  var constants = require('./constants.js');
27
+ var useAssetSelection = require('./hooks/useAssetSelection.js');
25
28
  var useFolderInfo = require('./hooks/useFolderInfo.js');
26
29
  var useFolderNavigation = require('./hooks/useFolderNavigation.js');
27
30
  var useInfiniteAssets = require('./hooks/useInfiniteAssets.js');
31
+ var useListSort = require('./hooks/useListSort.js');
32
+ var listQueryKey = require('./utils/listQueryKey.js');
33
+ var mergeMixedList = require('./utils/mergeMixedList.js');
28
34
 
29
35
  function _interopNamespace(e) {
30
36
  if (e && e.__esModule) return e;
@@ -49,16 +55,34 @@ var ToggleGroup__namespace = /*#__PURE__*/_interopNamespace(ToggleGroup);
49
55
  const INTERSECTION_OPTIONS = {
50
56
  threshold: 0.1
51
57
  };
52
- const AssetsView = ({ view, folderId, onAssetItemClick, onAddAssets })=>{
58
+ const AssetsView = ({ view, folderId, assetsSort, foldersSort, foldersPosition, onAssetItemClick, onAddAssets })=>{
53
59
  const { formatMessage } = reactIntl.useIntl();
54
60
  const { assets, isLoading: isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error } = useInfiniteAssets.useInfiniteAssets({
55
- folder: folderId
61
+ folder: folderId,
62
+ sort: assetsSort
56
63
  });
57
64
  const { data: folders$1 = [], isLoading: isLoadingFolders } = folders.useGetFoldersQuery({
58
- parentId: folderId
65
+ parentId: folderId,
66
+ sort: foldersSort
59
67
  });
60
68
  const isGridView = view === constants.viewOptions.GRID;
61
69
  const isLoading = isLoadingAssets || isLoadingFolders;
70
+ // "Folders: Mixed with files" — interleave the complete folder list into the
71
+ // loaded asset stream client-side, following the active sort. Table view
72
+ // only: the grid always keeps folders in their own band on top.
73
+ const mixedItems = React.useMemo(()=>foldersPosition === 'mixed' && !isGridView ? mergeMixedList.mergeMixedList({
74
+ folders: folders$1,
75
+ assets,
76
+ sort: assetsSort,
77
+ hasNextPage
78
+ }) : null, [
79
+ foldersPosition,
80
+ isGridView,
81
+ folders$1,
82
+ assets,
83
+ assetsSort,
84
+ hasNextPage
85
+ ]);
62
86
  const loadMoreRef = strapiAdmin.useElementOnScreen(React.useCallback((isVisible)=>{
63
87
  if (isVisible && hasNextPage && !isFetchingMore) {
64
88
  fetchNextPage();
@@ -106,6 +130,7 @@ const AssetsView = ({ view, folderId, onAssetItemClick, onAddAssets })=>{
106
130
  }) : /*#__PURE__*/ jsxRuntime.jsx(AssetsTable.AssetsTable, {
107
131
  assets: assets,
108
132
  folders: folders$1,
133
+ mixedItems: mixedItems,
109
134
  onAssetItemClick: onAssetItemClick
110
135
  }),
111
136
  /*#__PURE__*/ jsxRuntime.jsx("div", {
@@ -127,32 +152,54 @@ const AssetsView = ({ view, folderId, onAssetItemClick, onAddAssets })=>{
127
152
  ]
128
153
  });
129
154
  };
155
+ const ClearSelectionOnChange = ({ listQueryKey })=>{
156
+ const { clear } = useAssetSelection.useAssetSelection();
157
+ React.useEffect(()=>{
158
+ clear();
159
+ }, [
160
+ listQueryKey,
161
+ clear
162
+ ]);
163
+ return null;
164
+ };
130
165
  /* -------------------------------------------------------------------------------------------------
131
166
  * AssetsPage
132
- * -----------------------------------------------------------------------------------------------*/ const StyledToggleGroup = styledComponents.styled(ToggleGroup__namespace.Root)`
167
+ * -----------------------------------------------------------------------------------------------*/ /**
168
+ * Mirrors the design-system Toggle look (grey track, white active segment
169
+ * card) — reproduced locally because the DS component is a labels-only
170
+ * boolean input (no icons) and paints its left segment in danger red. Here
171
+ * both segments use the primary blue when active.
172
+ */ const StyledToggleGroup = styledComponents.styled(ToggleGroup__namespace.Root)`
133
173
  display: flex;
174
+ padding: ${({ theme })=>theme.spaces[1]};
175
+ background: ${({ theme })=>theme.colors.neutral100};
134
176
  border: 1px solid ${({ theme })=>theme.colors.neutral200};
135
177
  border-radius: ${({ theme })=>theme.borderRadius};
136
- overflow: hidden;
137
178
  `;
138
179
  const StyledToggleItem = styledComponents.styled(ToggleGroup__namespace.Item)`
139
180
  display: flex;
181
+ flex: 1 1 50%;
140
182
  align-items: center;
183
+ justify-content: center;
141
184
  gap: ${({ theme })=>theme.spaces[2]};
142
- padding: ${({ theme })=>`${theme.spaces[2]} ${theme.spaces[4]}`};
143
- border: none;
144
- background: ${({ theme })=>theme.colors.neutral0};
145
- color: ${({ theme })=>theme.colors.neutral800};
185
+ padding: 0.6rem ${({ theme })=>theme.spaces[3]};
186
+ border: 1px solid transparent;
187
+ border-radius: ${({ theme })=>theme.borderRadius};
188
+ background: transparent;
189
+ color: ${({ theme })=>theme.colors.neutral600};
146
190
  cursor: pointer;
147
191
  font-size: ${({ theme })=>theme.fontSizes[1]};
148
192
  font-weight: ${({ theme })=>theme.fontWeights.semiBold};
193
+ white-space: nowrap;
149
194
 
150
195
  &:hover {
151
- background: ${({ theme })=>theme.colors.primary100};
196
+ color: ${({ theme })=>theme.colors.neutral700};
152
197
  }
153
198
 
154
199
  &[data-state='on'] {
155
- background: ${({ theme })=>theme.colors.neutral150};
200
+ background: ${({ theme })=>theme.colors.neutral0};
201
+ border-color: ${({ theme })=>theme.colors.neutral200};
202
+ color: ${({ theme })=>theme.colors.primary600};
156
203
  }
157
204
 
158
205
  svg {
@@ -257,119 +304,137 @@ const AssetsPage = ()=>{
257
304
  // Error is already dispatched to store from the API queryFn
258
305
  }
259
306
  };
307
+ const listSort = useListSort.useListSort();
308
+ // The view is deliberately absent: table and grid render the same list, so
309
+ // toggling views keeps the selection.
310
+ const listQueryKey$1 = listQueryKey.getListQueryKey({
311
+ folderId: currentFolderId,
312
+ search: '',
313
+ // Folder position changes the render order too — selection must reset.
314
+ sort: `${listSort.assetsSort};folders=${listSort.foldersPosition}`,
315
+ filter: null
316
+ });
260
317
  return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
261
318
  children: [
262
319
  /*#__PURE__*/ jsxRuntime.jsx(UploadDropZoneContext.UploadDropZoneProvider, {
263
320
  onDrop: handleDrop,
264
- children: /*#__PURE__*/ jsxRuntime.jsx(AssetsDndProvider.AssetsDndProvider, {
265
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
266
- ref: uploadDropZoneRef,
267
- children: /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Layouts.Root, {
268
- minHeight: "100vh",
269
- background: "neutral0",
270
- sideNav: /*#__PURE__*/ jsxRuntime.jsx(FolderTree.FolderTree, {
271
- currentFolderId: currentFolderId,
272
- onSelectFolder: navigateToFolderId
321
+ children: /*#__PURE__*/ jsxRuntime.jsx(useAssetSelection.AssetSelectionProvider, {
322
+ children: /*#__PURE__*/ jsxRuntime.jsxs(AssetsDndProvider.AssetsDndProvider, {
323
+ children: [
324
+ /*#__PURE__*/ jsxRuntime.jsx(ClearSelectionOnChange, {
325
+ listQueryKey: listQueryKey$1
273
326
  }),
274
- children: [
275
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
276
- children: /*#__PURE__*/ jsxRuntime.jsx("input", {
277
- type: "file",
278
- ref: fileInputRef,
279
- onChange: handleFileChange,
280
- multiple: true
281
- })
282
- }),
283
- /*#__PURE__*/ jsxRuntime.jsx(HeaderWrapper, {
284
- children: /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Header, {
285
- title: pageHeaderTitle,
286
- primaryAction: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.SimpleMenu, {
287
- popoverPlacement: "bottom-end",
288
- variant: "default",
289
- endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronDown, {}),
290
- label: formatMessage({
291
- id: translations.getTranslationKey('new'),
292
- defaultMessage: 'New'
293
- }),
294
- children: [
295
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
296
- onSelect: ()=>setIsCreateFolderDialogOpen(true),
297
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Folder, {}),
298
- children: formatMessage({
299
- id: translations.getTranslationKey('folder.create.title'),
300
- defaultMessage: 'New folder'
301
- })
302
- }),
303
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
304
- onSelect: handleFileSelect,
305
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Files, {}),
306
- children: formatMessage({
307
- id: translations.getTranslationKey('import-files'),
308
- defaultMessage: 'Import files'
309
- })
310
- }),
311
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
312
- onSelect: ()=>setIsUrlDialogOpen(true),
313
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Link, {}),
314
- children: formatMessage({
315
- id: translations.getTranslationKey('import-from-url'),
316
- defaultMessage: 'Import from URL'
317
- })
318
- })
319
- ]
327
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
328
+ ref: uploadDropZoneRef,
329
+ children: /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Layouts.Root, {
330
+ minHeight: "100vh",
331
+ background: "neutral0",
332
+ sideNav: /*#__PURE__*/ jsxRuntime.jsx(FolderTree.FolderTree, {
333
+ currentFolderId: currentFolderId,
334
+ onSelectFolder: navigateToFolderId
335
+ }),
336
+ children: [
337
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
338
+ children: /*#__PURE__*/ jsxRuntime.jsx("input", {
339
+ type: "file",
340
+ ref: fileInputRef,
341
+ onChange: handleFileChange,
342
+ multiple: true
343
+ })
320
344
  }),
321
- subtitle: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
322
- justifyContent: "space-between",
323
- alignItems: "center",
324
- gap: 4,
325
- width: "100%",
326
- children: [
327
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
328
- gap: 4,
329
- alignItems: "center",
330
- children: "TODO: Filters and search"
345
+ /*#__PURE__*/ jsxRuntime.jsx(HeaderWrapper, {
346
+ children: /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Header, {
347
+ title: pageHeaderTitle,
348
+ primaryAction: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.SimpleMenu, {
349
+ popoverPlacement: "bottom-end",
350
+ variant: "default",
351
+ endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronDown, {}),
352
+ label: formatMessage({
353
+ id: translations.getTranslationKey('new'),
354
+ defaultMessage: 'New'
355
+ }),
356
+ children: [
357
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
358
+ onSelect: ()=>setIsCreateFolderDialogOpen(true),
359
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Folder, {}),
360
+ children: formatMessage({
361
+ id: translations.getTranslationKey('folder.create.title'),
362
+ defaultMessage: 'New folder'
363
+ })
364
+ }),
365
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
366
+ onSelect: handleFileSelect,
367
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Files, {}),
368
+ children: formatMessage({
369
+ id: translations.getTranslationKey('import-files'),
370
+ defaultMessage: 'Import files'
371
+ })
372
+ }),
373
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
374
+ onSelect: ()=>setIsUrlDialogOpen(true),
375
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Link, {}),
376
+ children: formatMessage({
377
+ id: translations.getTranslationKey('import-from-url'),
378
+ defaultMessage: 'Import from URL'
379
+ })
380
+ })
381
+ ]
331
382
  }),
332
- /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
333
- gap: 4,
383
+ subtitle: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
384
+ justifyContent: "space-between",
334
385
  alignItems: "center",
386
+ gap: 4,
387
+ width: "100%",
335
388
  children: [
336
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
337
- children: "TODO: Sort"
389
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
390
+ gap: 4,
391
+ alignItems: "center",
392
+ children: "TODO: Filters and search"
338
393
  }),
339
- /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleGroup, {
340
- type: "single",
341
- value: isGridView ? 'grid' : 'table',
342
- onValueChange: (value)=>value && setView(value === 'grid' ? constants.viewOptions.GRID : constants.viewOptions.TABLE),
343
- "aria-label": formatMessage({
344
- id: translations.getTranslationKey('view.switch.label'),
345
- defaultMessage: 'View options'
346
- }),
394
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
395
+ gap: 4,
396
+ alignItems: "stretch",
347
397
  children: [
348
- /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
349
- value: "table",
350
- "aria-label": formatMessage({
351
- id: translations.getTranslationKey('view.table'),
352
- defaultMessage: 'Table view'
353
- }),
354
- children: [
355
- /*#__PURE__*/ jsxRuntime.jsx(icons.List, {}),
356
- formatMessage({
357
- id: translations.getTranslationKey('view.table'),
358
- defaultMessage: 'Table view'
359
- })
360
- ]
398
+ /*#__PURE__*/ jsxRuntime.jsx(SortMenu.SortMenu, {
399
+ sort: listSort,
400
+ showFoldersGroup: !isGridView
361
401
  }),
362
- /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
363
- value: "grid",
402
+ /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleGroup, {
403
+ type: "single",
404
+ value: isGridView ? 'grid' : 'table',
405
+ onValueChange: (value)=>value && setView(value === 'grid' ? constants.viewOptions.GRID : constants.viewOptions.TABLE),
364
406
  "aria-label": formatMessage({
365
- id: translations.getTranslationKey('view.grid'),
366
- defaultMessage: 'Grid view'
407
+ id: translations.getTranslationKey('view.switch.label'),
408
+ defaultMessage: 'View options'
367
409
  }),
368
410
  children: [
369
- /*#__PURE__*/ jsxRuntime.jsx(icons.GridFour, {}),
370
- formatMessage({
371
- id: translations.getTranslationKey('view.grid'),
372
- defaultMessage: 'Grid view'
411
+ /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
412
+ value: "table",
413
+ "aria-label": formatMessage({
414
+ id: translations.getTranslationKey('view.table'),
415
+ defaultMessage: 'Table view'
416
+ }),
417
+ children: [
418
+ /*#__PURE__*/ jsxRuntime.jsx(icons.List, {}),
419
+ formatMessage({
420
+ id: translations.getTranslationKey('view.table'),
421
+ defaultMessage: 'Table view'
422
+ })
423
+ ]
424
+ }),
425
+ /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
426
+ value: "grid",
427
+ "aria-label": formatMessage({
428
+ id: translations.getTranslationKey('view.grid'),
429
+ defaultMessage: 'Grid view'
430
+ }),
431
+ children: [
432
+ /*#__PURE__*/ jsxRuntime.jsx(icons.GridFour, {}),
433
+ formatMessage({
434
+ id: translations.getTranslationKey('view.grid'),
435
+ defaultMessage: 'Grid view'
436
+ })
437
+ ]
373
438
  })
374
439
  ]
375
440
  })
@@ -377,28 +442,32 @@ const AssetsPage = ()=>{
377
442
  })
378
443
  ]
379
444
  })
380
- ]
381
- })
382
- })
383
- }),
384
- /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Content, {
385
- children: /*#__PURE__*/ jsxRuntime.jsxs(UploadDropZone.DropZoneWithOverlay, {
386
- children: [
387
- /*#__PURE__*/ jsxRuntime.jsx(UploadDropZone.DropFilesMessage, {
388
- uploadDropZoneRef: uploadDropZoneRef,
389
- folderName: title
390
- }),
391
- /*#__PURE__*/ jsxRuntime.jsx(AssetsView, {
392
- view: view,
393
- folderId: currentFolderId,
394
- onAssetItemClick: openDetails,
395
- onAddAssets: handleFileSelect
396
445
  })
397
- ]
398
- })
446
+ }),
447
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Content, {
448
+ children: /*#__PURE__*/ jsxRuntime.jsxs(UploadDropZone.DropZoneWithOverlay, {
449
+ children: [
450
+ /*#__PURE__*/ jsxRuntime.jsx(UploadDropZone.DropFilesMessage, {
451
+ uploadDropZoneRef: uploadDropZoneRef,
452
+ folderName: title
453
+ }),
454
+ /*#__PURE__*/ jsxRuntime.jsx(AssetsView, {
455
+ view: view,
456
+ folderId: currentFolderId,
457
+ assetsSort: listSort.assetsSort,
458
+ foldersSort: listSort.foldersSort,
459
+ foldersPosition: listSort.foldersPosition,
460
+ onAssetItemClick: openDetails,
461
+ onAddAssets: handleFileSelect
462
+ })
463
+ ]
464
+ })
465
+ })
466
+ ]
399
467
  })
400
- ]
401
- })
468
+ }),
469
+ /*#__PURE__*/ jsxRuntime.jsx(BulkActionsBar.BulkActionsBar, {})
470
+ ]
402
471
  })
403
472
  })
404
473
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsPage.js","sources":["../../../../../admin/src/future/pages/Assets/AssetsPage.tsx"],"sourcesContent":["import { useRef, useCallback, useState, useEffect, type ChangeEvent } from 'react';\n\nimport * as ToggleGroup from '@radix-ui/react-toggle-group';\nimport { Layouts, useElementOnScreen, usePersistentState } 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, Link, List } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useUploadFromUrlsMutation, useUploadFilesMutation } from '../../services/api';\nimport { useGetFolderQuery, useGetFoldersQuery } from '../../services/folders';\nimport { getTranslationKey } from '../../utils/translations';\n\nimport {\n AssetDetailsDrawer,\n useAssetDetailsParam,\n} from './components/AssetDetails/AssetDetailsDrawer';\nimport { AssetsGrid } from './components/AssetsGrid';\nimport { AssetsTable } from './components/AssetsTable';\nimport { CreateFolderDialog } from './components/CreateFolderDialog';\nimport { AssetsDndProvider } from './components/Dnd/AssetsDndProvider';\nimport { DropFilesMessage, DropZoneWithOverlay } from './components/DropZone/UploadDropZone';\nimport { UploadDropZoneProvider } from './components/DropZone/UploadDropZoneContext';\nimport { EmptyState } from './components/EmptyState';\nimport { FolderTree } from './components/FolderTree/FolderTree';\nimport { ImportFromUrlDialog } from './components/ImportFromUrlDialog';\nimport { localStorageKeys, viewOptions } from './constants';\nimport { useFolderInfo } from './hooks/useFolderInfo';\nimport { useFolderNavigation } from './hooks/useFolderNavigation';\nimport { useInfiniteAssets } from './hooks/useInfiniteAssets';\n\nimport type { UploadFileInfo } from '../../../../../shared/contracts/files';\n\nconst INTERSECTION_OPTIONS: IntersectionObserverInit = { threshold: 0.1 };\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsView\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsViewProps {\n view: number;\n folderId: number | null;\n onAssetItemClick: (assetId: number) => void;\n onAddAssets: () => void;\n}\n\nconst AssetsView = ({ view, folderId, onAssetItemClick, onAddAssets }: AssetsViewProps) => {\n const { formatMessage } = useIntl();\n const {\n assets,\n isLoading: isLoadingAssets,\n isFetchingMore,\n hasNextPage,\n fetchNextPage,\n error,\n } = useInfiniteAssets({ folder: folderId });\n const { data: folders = [], isLoading: isLoadingFolders } = useGetFoldersQuery({\n parentId: folderId,\n });\n\n const isGridView = view === viewOptions.GRID;\n const isLoading = isLoadingAssets || isLoadingFolders;\n\n const loadMoreRef = useElementOnScreen<HTMLDivElement>(\n useCallback(\n (isVisible) => {\n if (isVisible && hasNextPage && !isFetchingMore) {\n fetchNextPage();\n }\n },\n [hasNextPage, isFetchingMore, fetchNextPage]\n ),\n INTERSECTION_OPTIONS\n );\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 (folders.length === 0 && assets.length === 0) {\n return <EmptyState onAddAssets={onAddAssets} />;\n }\n return (\n <>\n {isGridView ? (\n <AssetsGrid folders={folders} assets={assets} onAssetItemClick={onAssetItemClick} />\n ) : (\n <AssetsTable assets={assets} folders={folders} onAssetItemClick={onAssetItemClick} />\n )}\n <div ref={loadMoreRef} style={{ height: 1 }} />\n {isFetchingMore && (\n <Flex justifyContent=\"center\" padding={4}>\n <Loader>\n {formatMessage({\n id: getTranslationKey('list.assets.loading-more'),\n defaultMessage: 'Loading more assets...',\n })}\n </Loader>\n </Flex>\n )}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsPage\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.primary100};\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\nconst HeaderWrapper = styled(Box)`\n [data-strapi-header] {\n background: ${({ theme }) => theme.colors.neutral0};\n\n h1 {\n font-size: 1.8rem;\n }\n }\n`;\n\nexport const AssetsPage = () => {\n const { formatMessage } = useIntl();\n const { openDetails } = useAssetDetailsParam();\n\n const { currentFolderId, navigateToFolderId, navigateToRoot } = useFolderNavigation();\n // Deleted or missing folders (404) need a fetch — handled here, not in\n // `useFolderNavigation` (which only strips malformed ?folder= values).\n const { error: currentFolderError } = useGetFolderQuery(\n { id: currentFolderId! },\n { skip: currentFolderId === null }\n );\n\n useEffect(() => {\n if (currentFolderError?.name === 'NotFoundError') {\n navigateToRoot();\n }\n }, [currentFolderError, navigateToRoot]);\n const { title, itemCount } = useFolderInfo(currentFolderId);\n const itemCountLabel = formatMessage(\n {\n id: getTranslationKey('header.content.item-count'),\n defaultMessage: '{count, plural, =1 {# item} other {# items}}',\n },\n { count: itemCount }\n );\n const pageHeaderTitle = title\n ? `${title} (${itemCountLabel})`\n : formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' });\n\n const [isCreateFolderDialogOpen, setIsCreateFolderDialogOpen] = useState(false);\n\n // View state\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n // Dialog state\n const [isUrlDialogOpen, setIsUrlDialogOpen] = useState(false);\n\n // Refs\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadDropZoneRef = useRef<HTMLDivElement>(null);\n\n // Upload handlers\n const [uploadFiles] = useUploadFilesMutation();\n const [uploadFromUrls] = useUploadFromUrlsMutation();\n\n const uploadFilesToFolder = async (files: globalThis.File[], folderId: number | null) => {\n if (files.length === 0) return;\n\n const formData = new FormData();\n const fileInfoArray: UploadFileInfo[] = [];\n\n files.forEach((file) => {\n formData.append('files', file);\n fileInfoArray.push({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: folderId,\n });\n });\n\n formData.append('fileInfo', JSON.stringify(fileInfoArray));\n try {\n await uploadFiles({ formData, totalFiles: files.length }).unwrap();\n } catch (error) {\n // Error is already dispatched to store from the API queryFn\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), currentFolderId);\n }\n e.target.value = '';\n };\n\n const handleDrop = async (files: globalThis.File[]) => {\n await uploadFilesToFolder(files, currentFolderId);\n };\n\n const handleUrlUpload = async (urls: string[]) => {\n try {\n await uploadFromUrls({ urls, folderId: currentFolderId }).unwrap();\n } catch (error) {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n return (\n <>\n <UploadDropZoneProvider onDrop={handleDrop}>\n <AssetsDndProvider>\n <Box ref={uploadDropZoneRef}>\n <Layouts.Root\n minHeight=\"100vh\"\n background=\"neutral0\"\n sideNav={\n <FolderTree currentFolderId={currentFolderId} onSelectFolder={navigateToFolderId} />\n }\n >\n <VisuallyHidden>\n <input type=\"file\" ref={fileInputRef} onChange={handleFileChange} multiple />\n </VisuallyHidden>\n\n <HeaderWrapper>\n <Layouts.Header\n title={pageHeaderTitle}\n primaryAction={\n <SimpleMenu\n popoverPlacement=\"bottom-end\"\n variant=\"default\"\n endIcon={<ChevronDown />}\n label={formatMessage({ id: getTranslationKey('new'), defaultMessage: 'New' })}\n >\n <MenuItem\n onSelect={() => setIsCreateFolderDialogOpen(true)}\n startIcon={<Folder />}\n >\n {formatMessage({\n id: getTranslationKey('folder.create.title'),\n defaultMessage: 'New folder',\n })}\n </MenuItem>\n <MenuItem onSelect={handleFileSelect} startIcon={<Files />}>\n {formatMessage({\n id: getTranslationKey('import-files'),\n defaultMessage: 'Import files',\n })}\n </MenuItem>\n <MenuItem onSelect={() => setIsUrlDialogOpen(true)} startIcon={<Link />}>\n {formatMessage({\n id: getTranslationKey('import-from-url'),\n defaultMessage: 'Import from URL',\n })}\n </MenuItem>\n </SimpleMenu>\n }\n subtitle={\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={4} width=\"100%\">\n <Flex gap={4} alignItems=\"center\">\n TODO: Filters and search\n </Flex>\n\n <Flex gap={4} alignItems=\"center\">\n <Box>TODO: Sort</Box>\n <StyledToggleGroup\n type=\"single\"\n value={isGridView ? 'grid' : 'table'}\n onValueChange={(value) =>\n value &&\n 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 </Flex>\n }\n />\n </HeaderWrapper>\n\n <Layouts.Content>\n <DropZoneWithOverlay>\n <DropFilesMessage uploadDropZoneRef={uploadDropZoneRef} folderName={title} />\n <AssetsView\n view={view}\n folderId={currentFolderId}\n onAssetItemClick={openDetails}\n onAddAssets={handleFileSelect}\n />\n </DropZoneWithOverlay>\n </Layouts.Content>\n </Layouts.Root>\n </Box>\n </AssetsDndProvider>\n </UploadDropZoneProvider>\n <CreateFolderDialog\n open={isCreateFolderDialogOpen}\n folderName={title}\n parentFolderId={currentFolderId}\n onClose={() => setIsCreateFolderDialogOpen(false)}\n />\n <ImportFromUrlDialog\n open={isUrlDialogOpen}\n onClose={() => setIsUrlDialogOpen(false)}\n onUpload={handleUrlUpload}\n />\n <AssetDetailsDrawer />\n </>\n );\n};\n"],"names":["INTERSECTION_OPTIONS","threshold","AssetsView","view","folderId","onAssetItemClick","onAddAssets","formatMessage","useIntl","assets","isLoading","isLoadingAssets","isFetchingMore","hasNextPage","fetchNextPage","error","useInfiniteAssets","folder","data","folders","isLoadingFolders","useGetFoldersQuery","parentId","isGridView","viewOptions","GRID","loadMoreRef","useElementOnScreen","useCallback","isVisible","_jsx","Flex","justifyContent","padding","Loader","id","defaultMessage","Box","Typography","textColor","getTranslationKey","length","EmptyState","_jsxs","_Fragment","AssetsGrid","AssetsTable","div","ref","style","height","StyledToggleGroup","styled","ToggleGroup","Root","theme","colors","neutral200","borderRadius","StyledToggleItem","Item","spaces","neutral0","neutral800","fontSizes","fontWeights","semiBold","primary100","neutral150","HeaderWrapper","AssetsPage","openDetails","useAssetDetailsParam","currentFolderId","navigateToFolderId","navigateToRoot","useFolderNavigation","currentFolderError","useGetFolderQuery","skip","useEffect","name","title","itemCount","useFolderInfo","itemCountLabel","count","pageHeaderTitle","isCreateFolderDialogOpen","setIsCreateFolderDialogOpen","useState","setView","usePersistentState","localStorageKeys","isUrlDialogOpen","setIsUrlDialogOpen","fileInputRef","useRef","uploadDropZoneRef","uploadFiles","useUploadFilesMutation","uploadFromUrls","useUploadFromUrlsMutation","uploadFilesToFolder","files","formData","FormData","fileInfoArray","forEach","file","append","push","caption","alternativeText","JSON","stringify","totalFiles","unwrap","handleFileSelect","current","click","handleFileChange","e","target","Array","from","value","handleDrop","handleUrlUpload","urls","UploadDropZoneProvider","onDrop","AssetsDndProvider","Layouts","minHeight","background","sideNav","FolderTree","onSelectFolder","VisuallyHidden","input","type","onChange","multiple","Header","primaryAction","SimpleMenu","popoverPlacement","variant","endIcon","ChevronDown","label","MenuItem","onSelect","startIcon","Folder","Files","Link","subtitle","alignItems","gap","width","onValueChange","TABLE","aria-label","List","GridIcon","Content","DropZoneWithOverlay","DropFilesMessage","folderName","CreateFolderDialog","open","parentFolderId","onClose","ImportFromUrlDialog","onUpload","AssetDetailsDrawer"],"mappings":"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"}
1
+ {"version":3,"file":"AssetsPage.js","sources":["../../../../../admin/src/future/pages/Assets/AssetsPage.tsx"],"sourcesContent":["import { useRef, useCallback, useMemo, useState, useEffect, type ChangeEvent } from 'react';\n\nimport * as ToggleGroup from '@radix-ui/react-toggle-group';\nimport { Layouts, useElementOnScreen, usePersistentState } 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, Link, List } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useUploadFromUrlsMutation, useUploadFilesMutation } from '../../services/api';\nimport { useGetFolderQuery, useGetFoldersQuery } from '../../services/folders';\nimport { getTranslationKey } from '../../utils/translations';\n\nimport {\n AssetDetailsDrawer,\n useAssetDetailsParam,\n} from './components/AssetDetails/AssetDetailsDrawer';\nimport { AssetsGrid } from './components/AssetsGrid';\nimport { AssetsTable } from './components/AssetsTable';\nimport { BulkActionsBar } from './components/BulkActionsBar';\nimport { CreateFolderDialog } from './components/CreateFolderDialog';\nimport { AssetsDndProvider } from './components/Dnd/AssetsDndProvider';\nimport { DropFilesMessage, DropZoneWithOverlay } from './components/DropZone/UploadDropZone';\nimport { UploadDropZoneProvider } from './components/DropZone/UploadDropZoneContext';\nimport { EmptyState } from './components/EmptyState';\nimport { FolderTree } from './components/FolderTree/FolderTree';\nimport { ImportFromUrlDialog } from './components/ImportFromUrlDialog';\nimport { SortMenu } from './components/SortMenu';\nimport { localStorageKeys, viewOptions } from './constants';\nimport { AssetSelectionProvider, useAssetSelection } from './hooks/useAssetSelection';\nimport { useFolderInfo } from './hooks/useFolderInfo';\nimport { useFolderNavigation } from './hooks/useFolderNavigation';\nimport { useInfiniteAssets } from './hooks/useInfiniteAssets';\nimport { useListSort, type FoldersPosition } from './hooks/useListSort';\nimport { getListQueryKey } from './utils/listQueryKey';\nimport { mergeMixedList } from './utils/mergeMixedList';\n\nimport type { UploadFileInfo } from '../../../../../shared/contracts/files';\n\nconst INTERSECTION_OPTIONS: IntersectionObserverInit = { threshold: 0.1 };\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsView\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsViewProps {\n view: number;\n folderId: number | null;\n assetsSort: string;\n foldersSort: string;\n foldersPosition: FoldersPosition;\n onAssetItemClick: (assetId: number) => void;\n onAddAssets: () => void;\n}\n\nconst AssetsView = ({\n view,\n folderId,\n assetsSort,\n foldersSort,\n foldersPosition,\n onAssetItemClick,\n onAddAssets,\n}: AssetsViewProps) => {\n const { formatMessage } = useIntl();\n const {\n assets,\n isLoading: isLoadingAssets,\n isFetchingMore,\n hasNextPage,\n fetchNextPage,\n error,\n } = useInfiniteAssets({ folder: folderId, sort: assetsSort });\n const { data: folders = [], isLoading: isLoadingFolders } = useGetFoldersQuery({\n parentId: folderId,\n sort: foldersSort,\n });\n\n const isGridView = view === viewOptions.GRID;\n const isLoading = isLoadingAssets || isLoadingFolders;\n\n // \"Folders: Mixed with files\" — interleave the complete folder list into the\n // loaded asset stream client-side, following the active sort. Table view\n // only: the grid always keeps folders in their own band on top.\n const mixedItems = useMemo(\n () =>\n foldersPosition === 'mixed' && !isGridView\n ? mergeMixedList({ folders, assets, sort: assetsSort, hasNextPage })\n : null,\n [foldersPosition, isGridView, folders, assets, assetsSort, hasNextPage]\n );\n\n const loadMoreRef = useElementOnScreen<HTMLDivElement>(\n useCallback(\n (isVisible) => {\n if (isVisible && hasNextPage && !isFetchingMore) {\n fetchNextPage();\n }\n },\n [hasNextPage, isFetchingMore, fetchNextPage]\n ),\n INTERSECTION_OPTIONS\n );\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 (folders.length === 0 && assets.length === 0) {\n return <EmptyState onAddAssets={onAddAssets} />;\n }\n return (\n <>\n {isGridView ? (\n <AssetsGrid folders={folders} assets={assets} onAssetItemClick={onAssetItemClick} />\n ) : (\n <AssetsTable\n assets={assets}\n folders={folders}\n mixedItems={mixedItems}\n onAssetItemClick={onAssetItemClick}\n />\n )}\n <div ref={loadMoreRef} style={{ height: 1 }} />\n {isFetchingMore && (\n <Flex justifyContent=\"center\" padding={4}>\n <Loader>\n {formatMessage({\n id: getTranslationKey('list.assets.loading-more'),\n defaultMessage: 'Loading more assets...',\n })}\n </Loader>\n </Flex>\n )}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ClearSelectionOnChange\n *\n * Selection is list-scoped: it resets when the user is looking at a different list.\n * The list fingerprint is getListQueryKey() — folder, search, sort, filter.\n *\n * Hybrid rule: infinite scroll does not change the key (selection persists).\n * Search/sort/filter changes do (selection clears) — same mental model as folder nav.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ClearSelectionOnChangeProps {\n listQueryKey: string;\n}\n\nconst ClearSelectionOnChange = ({ listQueryKey }: ClearSelectionOnChangeProps) => {\n const { clear } = useAssetSelection();\n\n useEffect(() => {\n clear();\n }, [listQueryKey, clear]);\n\n return null;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsPage\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Mirrors the design-system Toggle look (grey track, white active segment\n * card) — reproduced locally because the DS component is a labels-only\n * boolean input (no icons) and paints its left segment in danger red. Here\n * both segments use the primary blue when active.\n */\nconst StyledToggleGroup = styled(ToggleGroup.Root)`\n display: flex;\n padding: ${({ theme }) => theme.spaces[1]};\n background: ${({ theme }) => theme.colors.neutral100};\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n`;\n\nconst StyledToggleItem = styled(ToggleGroup.Item)`\n display: flex;\n flex: 1 1 50%;\n align-items: center;\n justify-content: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: 0.6rem ${({ theme }) => theme.spaces[3]};\n border: 1px solid transparent;\n border-radius: ${({ theme }) => theme.borderRadius};\n background: transparent;\n color: ${({ theme }) => theme.colors.neutral600};\n cursor: pointer;\n font-size: ${({ theme }) => theme.fontSizes[1]};\n font-weight: ${({ theme }) => theme.fontWeights.semiBold};\n white-space: nowrap;\n\n &:hover {\n color: ${({ theme }) => theme.colors.neutral700};\n }\n\n &[data-state='on'] {\n background: ${({ theme }) => theme.colors.neutral0};\n border-color: ${({ theme }) => theme.colors.neutral200};\n color: ${({ theme }) => theme.colors.primary600};\n }\n\n svg {\n width: 1.6rem;\n height: 1.6rem;\n }\n`;\n\nconst HeaderWrapper = styled(Box)`\n [data-strapi-header] {\n background: ${({ theme }) => theme.colors.neutral0};\n\n h1 {\n font-size: 1.8rem;\n }\n }\n`;\n\nexport const AssetsPage = () => {\n const { formatMessage } = useIntl();\n const { openDetails } = useAssetDetailsParam();\n\n const { currentFolderId, navigateToFolderId, navigateToRoot } = useFolderNavigation();\n // Deleted or missing folders (404) need a fetch — handled here, not in\n // `useFolderNavigation` (which only strips malformed ?folder= values).\n const { error: currentFolderError } = useGetFolderQuery(\n { id: currentFolderId! },\n { skip: currentFolderId === null }\n );\n\n useEffect(() => {\n if (currentFolderError?.name === 'NotFoundError') {\n navigateToRoot();\n }\n }, [currentFolderError, navigateToRoot]);\n const { title, itemCount } = useFolderInfo(currentFolderId);\n const itemCountLabel = formatMessage(\n {\n id: getTranslationKey('header.content.item-count'),\n defaultMessage: '{count, plural, =1 {# item} other {# items}}',\n },\n { count: itemCount }\n );\n const pageHeaderTitle = title\n ? `${title} (${itemCountLabel})`\n : formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' });\n\n const [isCreateFolderDialogOpen, setIsCreateFolderDialogOpen] = useState(false);\n\n // View state\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n // Dialog state\n const [isUrlDialogOpen, setIsUrlDialogOpen] = useState(false);\n\n // Refs\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadDropZoneRef = useRef<HTMLDivElement>(null);\n\n // Upload handlers\n const [uploadFiles] = useUploadFilesMutation();\n const [uploadFromUrls] = useUploadFromUrlsMutation();\n\n const uploadFilesToFolder = async (files: globalThis.File[], folderId: number | null) => {\n if (files.length === 0) return;\n\n const formData = new FormData();\n const fileInfoArray: UploadFileInfo[] = [];\n\n files.forEach((file) => {\n formData.append('files', file);\n fileInfoArray.push({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: folderId,\n });\n });\n\n formData.append('fileInfo', JSON.stringify(fileInfoArray));\n try {\n await uploadFiles({ formData, totalFiles: files.length }).unwrap();\n } catch (error) {\n // Error is already dispatched to store from the API queryFn\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), currentFolderId);\n }\n e.target.value = '';\n };\n\n const handleDrop = async (files: globalThis.File[]) => {\n await uploadFilesToFolder(files, currentFolderId);\n };\n\n const handleUrlUpload = async (urls: string[]) => {\n try {\n await uploadFromUrls({ urls, folderId: currentFolderId }).unwrap();\n } catch (error) {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n const listSort = useListSort();\n\n // The view is deliberately absent: table and grid render the same list, so\n // toggling views keeps the selection.\n const listQueryKey = getListQueryKey({\n folderId: currentFolderId,\n search: '', // TODO: wire when building header search\n // Folder position changes the render order too — selection must reset.\n sort: `${listSort.assetsSort};folders=${listSort.foldersPosition}`,\n filter: null, // TODO: wire when building header filters\n });\n\n return (\n <>\n <UploadDropZoneProvider onDrop={handleDrop}>\n <AssetSelectionProvider>\n <AssetsDndProvider>\n <ClearSelectionOnChange listQueryKey={listQueryKey} />\n <Box ref={uploadDropZoneRef}>\n <Layouts.Root\n minHeight=\"100vh\"\n background=\"neutral0\"\n sideNav={\n <FolderTree\n currentFolderId={currentFolderId}\n onSelectFolder={navigateToFolderId}\n />\n }\n >\n <VisuallyHidden>\n <input type=\"file\" ref={fileInputRef} onChange={handleFileChange} multiple />\n </VisuallyHidden>\n\n <HeaderWrapper>\n <Layouts.Header\n title={pageHeaderTitle}\n primaryAction={\n <SimpleMenu\n popoverPlacement=\"bottom-end\"\n variant=\"default\"\n endIcon={<ChevronDown />}\n label={formatMessage({\n id: getTranslationKey('new'),\n defaultMessage: 'New',\n })}\n >\n <MenuItem\n onSelect={() => setIsCreateFolderDialogOpen(true)}\n startIcon={<Folder />}\n >\n {formatMessage({\n id: getTranslationKey('folder.create.title'),\n defaultMessage: 'New folder',\n })}\n </MenuItem>\n <MenuItem onSelect={handleFileSelect} startIcon={<Files />}>\n {formatMessage({\n id: getTranslationKey('import-files'),\n defaultMessage: 'Import files',\n })}\n </MenuItem>\n <MenuItem onSelect={() => setIsUrlDialogOpen(true)} startIcon={<Link />}>\n {formatMessage({\n id: getTranslationKey('import-from-url'),\n defaultMessage: 'Import from URL',\n })}\n </MenuItem>\n </SimpleMenu>\n }\n subtitle={\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={4} width=\"100%\">\n <Flex gap={4} alignItems=\"center\">\n TODO: Filters and search\n </Flex>\n\n <Flex gap={4} alignItems=\"stretch\">\n <SortMenu sort={listSort} showFoldersGroup={!isGridView} />\n <StyledToggleGroup\n type=\"single\"\n value={isGridView ? 'grid' : 'table'}\n onValueChange={(value) =>\n value &&\n 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 </Flex>\n }\n />\n </HeaderWrapper>\n\n <Layouts.Content>\n <DropZoneWithOverlay>\n <DropFilesMessage uploadDropZoneRef={uploadDropZoneRef} folderName={title} />\n <AssetsView\n view={view}\n folderId={currentFolderId}\n assetsSort={listSort.assetsSort}\n foldersSort={listSort.foldersSort}\n foldersPosition={listSort.foldersPosition}\n onAssetItemClick={openDetails}\n onAddAssets={handleFileSelect}\n />\n </DropZoneWithOverlay>\n </Layouts.Content>\n </Layouts.Root>\n </Box>\n <BulkActionsBar />\n </AssetsDndProvider>\n </AssetSelectionProvider>\n </UploadDropZoneProvider>\n <CreateFolderDialog\n open={isCreateFolderDialogOpen}\n folderName={title}\n parentFolderId={currentFolderId}\n onClose={() => setIsCreateFolderDialogOpen(false)}\n />\n <ImportFromUrlDialog\n open={isUrlDialogOpen}\n onClose={() => setIsUrlDialogOpen(false)}\n onUpload={handleUrlUpload}\n />\n <AssetDetailsDrawer />\n </>\n );\n};\n"],"names":["INTERSECTION_OPTIONS","threshold","AssetsView","view","folderId","assetsSort","foldersSort","foldersPosition","onAssetItemClick","onAddAssets","formatMessage","useIntl","assets","isLoading","isLoadingAssets","isFetchingMore","hasNextPage","fetchNextPage","error","useInfiniteAssets","folder","sort","data","folders","isLoadingFolders","useGetFoldersQuery","parentId","isGridView","viewOptions","GRID","mixedItems","useMemo","mergeMixedList","loadMoreRef","useElementOnScreen","useCallback","isVisible","_jsx","Flex","justifyContent","padding","Loader","id","defaultMessage","Box","Typography","textColor","getTranslationKey","length","EmptyState","_jsxs","_Fragment","AssetsGrid","AssetsTable","div","ref","style","height","ClearSelectionOnChange","listQueryKey","clear","useAssetSelection","useEffect","StyledToggleGroup","styled","ToggleGroup","Root","theme","spaces","colors","neutral100","neutral200","borderRadius","StyledToggleItem","Item","neutral600","fontSizes","fontWeights","semiBold","neutral700","neutral0","primary600","HeaderWrapper","AssetsPage","openDetails","useAssetDetailsParam","currentFolderId","navigateToFolderId","navigateToRoot","useFolderNavigation","currentFolderError","useGetFolderQuery","skip","name","title","itemCount","useFolderInfo","itemCountLabel","count","pageHeaderTitle","isCreateFolderDialogOpen","setIsCreateFolderDialogOpen","useState","setView","usePersistentState","localStorageKeys","isUrlDialogOpen","setIsUrlDialogOpen","fileInputRef","useRef","uploadDropZoneRef","uploadFiles","useUploadFilesMutation","uploadFromUrls","useUploadFromUrlsMutation","uploadFilesToFolder","files","formData","FormData","fileInfoArray","forEach","file","append","push","caption","alternativeText","JSON","stringify","totalFiles","unwrap","handleFileSelect","current","click","handleFileChange","e","target","Array","from","value","handleDrop","handleUrlUpload","urls","listSort","useListSort","getListQueryKey","search","filter","UploadDropZoneProvider","onDrop","AssetSelectionProvider","AssetsDndProvider","Layouts","minHeight","background","sideNav","FolderTree","onSelectFolder","VisuallyHidden","input","type","onChange","multiple","Header","primaryAction","SimpleMenu","popoverPlacement","variant","endIcon","ChevronDown","label","MenuItem","onSelect","startIcon","Folder","Files","Link","subtitle","alignItems","gap","width","SortMenu","showFoldersGroup","onValueChange","TABLE","aria-label","List","GridIcon","Content","DropZoneWithOverlay","DropFilesMessage","folderName","BulkActionsBar","CreateFolderDialog","open","parentFolderId","onClose","ImportFromUrlDialog","onUpload","AssetDetailsDrawer"],"mappings":"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"}