@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
@@ -3,9 +3,12 @@ import { useState, useEffect, useCallback, useRef, useLayoutEffect } from 'react
3
3
  import { Typography, Box, Flex, Loader, IconButton, Tooltip } from '@strapi/design-system';
4
4
  import { House, Folder, ChevronDown } from '@strapi/icons';
5
5
  import { useIntl } from 'react-intl';
6
- import { styled } from 'styled-components';
6
+ import { styled, css } from 'styled-components';
7
7
  import { useGetFolderStructureQuery } from '../../../../services/folders.mjs';
8
8
  import { getTranslationKey } from '../../../../utils/translations.mjs';
9
+ import { useAssetsDndOptional } from '../Dnd/AssetsDndProvider.mjs';
10
+ import { useFolderTreeDroppable } from '../Dnd/useFolderTreeDroppable.mjs';
11
+ import { useSpringLoadedExpand } from './useSpringLoadedExpand.mjs';
9
12
 
10
13
  /* -------------------------------------------------------------------------------------------------
11
14
  * RowButton — shared row styling aligned with admin SubNav.Link
@@ -17,15 +20,36 @@ import { getTranslationKey } from '../../../../utils/translations.mjs';
17
20
  min-height: 3.2rem;
18
21
  padding: ${({ theme })=>`${theme.spaces[1]} ${theme.spaces[2]}`};
19
22
  border: 0;
20
- background: ${({ $isActive, theme })=>$isActive ? theme.colors.primary100 : 'transparent'};
23
+ background: ${({ $isActive, $isValidDropTarget, theme })=>{
24
+ if ($isValidDropTarget) {
25
+ return theme.colors.primary100;
26
+ }
27
+ return $isActive ? theme.colors.primary100 : 'transparent';
28
+ }};
21
29
  color: ${({ $isActive, theme })=>$isActive ? theme.colors.primary700 : theme.colors.neutral800};
22
30
  border-radius: ${({ theme })=>theme.borderRadius};
23
- cursor: pointer;
31
+ cursor: ${({ $isMovePending, $isInvalidDropCursor })=>{
32
+ if ($isMovePending) {
33
+ return 'wait';
34
+ }
35
+ return $isInvalidDropCursor ? 'not-allowed' : 'pointer';
36
+ }};
24
37
  text-align: left;
25
38
  font: inherit;
39
+ pointer-events: ${({ $isMovePending })=>$isMovePending ? 'none' : 'auto'};
40
+
41
+ ${({ $isValidDropTarget, theme })=>$isValidDropTarget && css`
42
+ outline: 1px dashed ${theme.colors.primary600};
43
+ outline-offset: -1px;
44
+ `}
26
45
 
27
46
  &:hover {
28
- background: ${({ $isActive, theme })=>$isActive ? theme.colors.primary100 : theme.colors.neutral100};
47
+ background: ${({ $isActive, $isValidDropTarget, theme })=>{
48
+ if ($isValidDropTarget) {
49
+ return theme.colors.primary100;
50
+ }
51
+ return $isActive ? theme.colors.primary100 : theme.colors.neutral100;
52
+ }};
29
53
  }
30
54
 
31
55
  &:focus-visible {
@@ -33,6 +57,22 @@ import { getTranslationKey } from '../../../../utils/translations.mjs';
33
57
  outline-offset: -2px;
34
58
  }
35
59
  `;
60
+ const TreeRow = styled(Flex)`
61
+ cursor: ${({ $isMovePending, $isInvalidDropCursor })=>{
62
+ if ($isMovePending) {
63
+ return 'wait';
64
+ }
65
+ return $isInvalidDropCursor ? 'not-allowed' : 'default';
66
+ }};
67
+ pointer-events: ${({ $isMovePending })=>$isMovePending ? 'none' : 'auto'};
68
+ border-radius: ${({ theme })=>theme.borderRadius};
69
+
70
+ ${({ $isValidDropTarget, theme })=>$isValidDropTarget && css`
71
+ background: ${theme.colors.primary100};
72
+ outline: 1px dashed ${theme.colors.primary600};
73
+ outline-offset: -1px;
74
+ `}
75
+ `;
36
76
  /* -------------------------------------------------------------------------------------------------
37
77
  * useExpandedFolders — local expand/collapse state
38
78
  * -----------------------------------------------------------------------------------------------*/ const findAncestorIds = (nodes, targetId, trail = [])=>{
@@ -89,12 +129,23 @@ const useExpandedFolders = (folderStructure, currentFolderId)=>{
89
129
  return next;
90
130
  });
91
131
  }, []);
132
+ const expandFolder = useCallback((id)=>{
133
+ setExpandedIds((prev)=>{
134
+ if (prev.has(id)) {
135
+ return prev;
136
+ }
137
+ const next = new Set(prev);
138
+ next.add(id);
139
+ return next;
140
+ });
141
+ }, []);
92
142
  const isExpanded = useCallback((id)=>expandedIds.has(id), [
93
143
  expandedIds
94
144
  ]);
95
145
  return {
96
146
  isExpanded,
97
- toggleExpanded
147
+ toggleExpanded,
148
+ expandFolder
98
149
  };
99
150
  };
100
151
  /* -------------------------------------------------------------------------------------------------
@@ -146,24 +197,36 @@ const RotatingChevron = styled(ChevronDown)`
146
197
  transform: rotate(${({ $expanded })=>$expanded ? '0deg' : '-90deg'});
147
198
  transition: transform 0.2s ease;
148
199
  `;
149
- const FolderTreeItem = ({ node, level, currentFolderId, isExpanded, onToggle, onSelect })=>{
200
+ const FolderTreeItemInner = ({ id, name, folderChildren, level, currentFolderId, isExpanded, onToggle, onExpand, onSelect, isMovePending })=>{
150
201
  const { formatMessage } = useIntl();
151
- if (node.id == null) {
152
- return null;
153
- }
154
- const id = node.id;
155
- const name = node.name ?? '';
156
- const hasChildren = (node.children?.length ?? 0) > 0;
202
+ const hasChildren = folderChildren.length > 0;
157
203
  const isFolderExpanded = isExpanded(id);
158
204
  const isActive = currentFolderId === id;
205
+ const { droppable: { setNodeRef }, isOver, showValidDropHighlight, showInvalidDropCursor } = useFolderTreeDroppable({
206
+ id,
207
+ name
208
+ });
209
+ const handleExpand = useCallback(()=>onExpand(id), [
210
+ id,
211
+ onExpand
212
+ ]);
213
+ useSpringLoadedExpand({
214
+ isOver,
215
+ canExpand: hasChildren && !isFolderExpanded,
216
+ onExpand: handleExpand
217
+ });
159
218
  // TODO: full `role="tree"` + arrow-key treeview navigation before revamp GA
160
- // if an accessibility audit requires it (CMS-133 v1 is button rows only).
219
+ // if an accessibility audit requires it (v1 is button rows only).
161
220
  return /*#__PURE__*/ jsxs("li", {
162
221
  children: [
163
- /*#__PURE__*/ jsxs(Flex, {
222
+ /*#__PURE__*/ jsxs(TreeRow, {
223
+ ref: setNodeRef,
164
224
  alignItems: "center",
165
225
  paddingLeft: `${level * INDENT_PER_LEVEL_REM}rem`,
166
226
  gap: 1,
227
+ $isValidDropTarget: showValidDropHighlight,
228
+ $isInvalidDropCursor: showInvalidDropCursor,
229
+ $isMovePending: isMovePending,
167
230
  children: [
168
231
  /*#__PURE__*/ jsx(IconButton, {
169
232
  label: formatMessage({
@@ -190,6 +253,9 @@ const FolderTreeItem = ({ node, level, currentFolderId, isExpanded, onToggle, on
190
253
  children: /*#__PURE__*/ jsx(RowButton, {
191
254
  type: "button",
192
255
  $isActive: isActive,
256
+ $isValidDropTarget: showValidDropHighlight,
257
+ $isInvalidDropCursor: showInvalidDropCursor,
258
+ $isMovePending: isMovePending,
193
259
  "aria-current": isActive ? 'page' : undefined,
194
260
  onClick: ()=>onSelect(id),
195
261
  "data-testid": `folder-tree-node-${id}`,
@@ -203,18 +269,31 @@ const FolderTreeItem = ({ node, level, currentFolderId, isExpanded, onToggle, on
203
269
  ]
204
270
  }),
205
271
  hasChildren && isFolderExpanded && /*#__PURE__*/ jsx(NavList, {
206
- children: node.children.map((child)=>/*#__PURE__*/ jsx(FolderTreeItem, {
272
+ children: folderChildren.map((child)=>/*#__PURE__*/ jsx(FolderTreeItem, {
207
273
  node: child,
208
274
  level: level + 1,
209
275
  currentFolderId: currentFolderId,
210
276
  isExpanded: isExpanded,
211
277
  onToggle: onToggle,
212
- onSelect: onSelect
278
+ onExpand: onExpand,
279
+ onSelect: onSelect,
280
+ isMovePending: isMovePending
213
281
  }, child.id ?? child.name))
214
282
  })
215
283
  ]
216
284
  });
217
285
  };
286
+ const FolderTreeItem = ({ node, ...props })=>{
287
+ if (node.id == null) {
288
+ return null;
289
+ }
290
+ return /*#__PURE__*/ jsx(FolderTreeItemInner, {
291
+ ...props,
292
+ id: node.id,
293
+ name: node.name ?? '',
294
+ folderChildren: node.children ?? []
295
+ });
296
+ };
218
297
  /* -------------------------------------------------------------------------------------------------
219
298
  * FolderTree — public sidebar component
220
299
  * -----------------------------------------------------------------------------------------------*/ const SidebarNav = styled(Flex)`
@@ -251,8 +330,19 @@ const SidebarBody = styled(Flex)`
251
330
  */ const FolderTree = ({ currentFolderId, onSelectFolder })=>{
252
331
  const { formatMessage } = useIntl();
253
332
  const { data: folderStructure = [], isLoading, isError } = useGetFolderStructureQuery();
254
- const { isExpanded, toggleExpanded } = useExpandedFolders(folderStructure, currentFolderId);
333
+ const { isExpanded, toggleExpanded, expandFolder } = useExpandedFolders(folderStructure, currentFolderId);
334
+ const { isMovePending } = useAssetsDndOptional() ?? {
335
+ isMovePending: false
336
+ };
255
337
  const isHomeActive = currentFolderId == null;
338
+ const homeLabel = formatMessage({
339
+ id: getTranslationKey('sidebar.home'),
340
+ defaultMessage: 'Home'
341
+ });
342
+ const { droppable: { setNodeRef: setHomeDropRef }, showValidDropHighlight: showHomeValidDropHighlight, showInvalidDropCursor: showHomeInvalidDropCursor } = useFolderTreeDroppable({
343
+ id: null,
344
+ name: homeLabel
345
+ });
256
346
  return /*#__PURE__*/ jsxs(SidebarNav, {
257
347
  direction: "column",
258
348
  alignItems: "stretch",
@@ -283,8 +373,12 @@ const SidebarBody = styled(Flex)`
283
373
  padding: 3,
284
374
  children: [
285
375
  /*#__PURE__*/ jsxs(RowButton, {
376
+ ref: setHomeDropRef,
286
377
  type: "button",
287
378
  $isActive: isHomeActive,
379
+ $isValidDropTarget: showHomeValidDropHighlight,
380
+ $isInvalidDropCursor: showHomeInvalidDropCursor,
381
+ $isMovePending: isMovePending,
288
382
  "aria-current": isHomeActive ? 'page' : undefined,
289
383
  onClick: ()=>onSelectFolder(null),
290
384
  "data-testid": "folder-tree-home",
@@ -297,19 +391,21 @@ const SidebarBody = styled(Flex)`
297
391
  /*#__PURE__*/ jsx(Typography, {
298
392
  variant: "omega",
299
393
  fontWeight: isHomeActive ? 'semiBold' : 'regular',
300
- children: formatMessage({
301
- id: getTranslationKey('sidebar.home'),
302
- defaultMessage: 'Home'
303
- })
394
+ children: homeLabel
304
395
  })
305
396
  ]
306
397
  }),
307
398
  /*#__PURE__*/ jsxs(Box, {
399
+ marginTop: 4,
308
400
  children: [
309
401
  /*#__PURE__*/ jsxs(Flex, {
310
402
  alignItems: "center",
311
403
  gap: 1,
312
- padding: 1,
404
+ paddingTop: 1,
405
+ paddingBottom: 1,
406
+ paddingLeft: 2,
407
+ paddingRight: 2,
408
+ marginBottom: 2,
313
409
  children: [
314
410
  /*#__PURE__*/ jsx(Folder, {
315
411
  "aria-hidden": true,
@@ -372,7 +468,9 @@ const SidebarBody = styled(Flex)`
372
468
  currentFolderId: currentFolderId,
373
469
  isExpanded: isExpanded,
374
470
  onToggle: toggleExpanded,
375
- onSelect: onSelectFolder
471
+ onExpand: expandFolder,
472
+ onSelect: onSelectFolder,
473
+ isMovePending: isMovePending
376
474
  }, node.id ?? node.name))
377
475
  })
378
476
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"FolderTree.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/FolderTree/FolderTree.tsx"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nimport { Box, Flex, IconButton, Loader, Tooltip, Typography } from '@strapi/design-system';\nimport { ChevronDown, Folder as FolderIcon, House } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useGetFolderStructureQuery } from '../../../../services/folders';\nimport { getTranslationKey } from '../../../../utils/translations';\n\nimport type { FolderNode } from '../../../../../../../shared/contracts/folders';\n\n/* -------------------------------------------------------------------------------------------------\n * RowButton — shared row styling aligned with admin SubNav.Link\n * -----------------------------------------------------------------------------------------------*/\n\nconst RowButton = styled.button<{ $isActive: boolean }>`\n display: flex;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n width: 100%;\n min-height: 3.2rem;\n padding: ${({ theme }) => `${theme.spaces[1]} ${theme.spaces[2]}`};\n border: 0;\n background: ${({ $isActive, theme }) => ($isActive ? theme.colors.primary100 : 'transparent')};\n color: ${({ $isActive, theme }) =>\n $isActive ? theme.colors.primary700 : theme.colors.neutral800};\n border-radius: ${({ theme }) => theme.borderRadius};\n cursor: pointer;\n text-align: left;\n font: inherit;\n\n &:hover {\n background: ${({ $isActive, theme }) =>\n $isActive ? theme.colors.primary100 : theme.colors.neutral100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * useExpandedFolders — local expand/collapse state\n * -----------------------------------------------------------------------------------------------*/\n\nconst findAncestorIds = (\n nodes: FolderNode[],\n targetId: number,\n trail: number[] = []\n): number[] | null => {\n for (const node of nodes) {\n if (node.id === targetId) {\n return trail;\n }\n\n if (node.children?.length) {\n const nextTrail = node.id != null ? [...trail, node.id] : trail;\n const found = findAncestorIds(node.children, targetId, nextTrail);\n if (found !== null) {\n return found;\n }\n }\n }\n\n return null;\n};\n\nconst useExpandedFolders = (folderStructure: FolderNode[], currentFolderId: number | null) => {\n const [expandedIds, setExpandedIds] = useState<Set<number>>(() => new Set());\n\n useEffect(() => {\n if (currentFolderId == null) {\n return;\n }\n\n const ancestors = findAncestorIds(folderStructure, currentFolderId);\n if (!ancestors || ancestors.length === 0) {\n return;\n }\n\n setExpandedIds((prev) => {\n const next = new Set(prev);\n let changed = false;\n for (const id of ancestors) {\n if (!next.has(id)) {\n next.add(id);\n changed = true;\n }\n }\n return changed ? next : prev;\n });\n }, [folderStructure, currentFolderId]);\n\n const toggleExpanded = useCallback((id: number) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const isExpanded = useCallback((id: number) => expandedIds.has(id), [expandedIds]);\n\n return { isExpanded, toggleExpanded };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * TruncatedFolderName — tooltip when the label is ellipsized\n * -----------------------------------------------------------------------------------------------*/\n\nconst TruncatedFolderName = ({ name, isActive }: { name: string; isActive: boolean }) => {\n const textRef = useRef<HTMLSpanElement>(null);\n const [isTruncated, setIsTruncated] = useState(false);\n\n useLayoutEffect(() => {\n const el = textRef.current;\n if (!el) {\n return;\n }\n\n const checkTruncation = () => {\n setIsTruncated(el.scrollWidth > el.clientWidth);\n };\n\n checkTruncation();\n\n const observer = new ResizeObserver(checkTruncation);\n observer.observe(el);\n\n return () => observer.disconnect();\n }, [name]);\n\n const label = (\n <Typography\n ref={textRef}\n variant=\"omega\"\n fontWeight={isActive ? 'semiBold' : 'regular'}\n ellipsis\n >\n {name}\n </Typography>\n );\n\n if (isTruncated) {\n return <Tooltip label={name}>{label}</Tooltip>;\n }\n\n return label;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NavList — unstyled list for tree rows\n * -----------------------------------------------------------------------------------------------*/\n\nconst NavList = styled.ul`\n list-style: none;\n margin: 0;\n padding: 0;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderTreeItem — single tree row (internal)\n * -----------------------------------------------------------------------------------------------*/\n\nconst INDENT_PER_LEVEL_REM = 1.6;\n\nconst RotatingChevron = styled(ChevronDown)<{ $expanded: boolean }>`\n transform: rotate(${({ $expanded }) => ($expanded ? '0deg' : '-90deg')});\n transition: transform 0.2s ease;\n`;\n\ninterface FolderTreeItemProps {\n node: FolderNode;\n level: number;\n currentFolderId: number | null;\n isExpanded: (id: number) => boolean;\n onToggle: (id: number) => void;\n onSelect: (folderId: number) => void;\n}\n\nconst FolderTreeItem = ({\n node,\n level,\n currentFolderId,\n isExpanded,\n onToggle,\n onSelect,\n}: FolderTreeItemProps) => {\n const { formatMessage } = useIntl();\n\n if (node.id == null) {\n return null;\n }\n\n const id = node.id;\n const name = node.name ?? '';\n const hasChildren = (node.children?.length ?? 0) > 0;\n const isFolderExpanded = isExpanded(id);\n const isActive = currentFolderId === id;\n\n // TODO: full `role=\"tree\"` + arrow-key treeview navigation before revamp GA\n // if an accessibility audit requires it (CMS-133 v1 is button rows only).\n return (\n <li>\n <Flex alignItems=\"center\" paddingLeft={`${level * INDENT_PER_LEVEL_REM}rem`} gap={1}>\n <IconButton\n label={formatMessage(\n {\n id: getTranslationKey(\n isFolderExpanded ? 'sidebar.tree.collapse' : 'sidebar.tree.expand'\n ),\n defaultMessage: isFolderExpanded ? 'Collapse {name}' : 'Expand {name}',\n },\n { name }\n )}\n onClick={(event: React.MouseEvent) => {\n event.stopPropagation();\n onToggle(id);\n }}\n variant=\"ghost\"\n withTooltip={false}\n aria-expanded={isFolderExpanded}\n >\n <RotatingChevron $expanded={isFolderExpanded} fill=\"neutral500\" />\n </IconButton>\n\n <Box flex=\"1\" minWidth={0}>\n <RowButton\n type=\"button\"\n $isActive={isActive}\n aria-current={isActive ? 'page' : undefined}\n onClick={() => onSelect(id)}\n data-testid={`folder-tree-node-${id}`}\n data-folder-id={id}\n >\n <TruncatedFolderName name={name} isActive={isActive} />\n </RowButton>\n </Box>\n </Flex>\n\n {hasChildren && isFolderExpanded && (\n <NavList>\n {node.children.map((child) => (\n <FolderTreeItem\n key={child.id ?? child.name}\n node={child}\n level={level + 1}\n currentFolderId={currentFolderId}\n isExpanded={isExpanded}\n onToggle={onToggle}\n onSelect={onSelect}\n />\n ))}\n </NavList>\n )}\n </li>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * FolderTree — public sidebar component\n * -----------------------------------------------------------------------------------------------*/\n\nconst SidebarNav = styled(Flex)`\n /* TODO: reconcile 25.6rem (Figma) with admin WIDTH_SIDE_NAVIGATION (23.2rem) */\n width: 25.6rem;\n height: 100%;\n min-height: 100%;\n background: ${({ theme }) => theme.colors.neutral0};\n flex-shrink: 0;\n flex-direction: column;\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst SidebarHeader = styled(Box)`\n flex-shrink: 0;\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst SidebarBody = styled(Flex)`\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n`;\n\ninterface FolderTreeProps {\n currentFolderId: number | null;\n onSelectFolder: (folderId: number | null) => void;\n}\n\n/**\n * Left-rail navigation for the Media Library. Fetches folder structure internally\n * and renders:\n *\n * 1. A \"Media library\" title\n * 2. A \"Home\" entry that clears the folder query param\n * 3. A \"FOLDERS\" section header\n * 4. The folder tree itself\n *\n * Presentational with respect to routing — navigation is delegated to the parent\n * via `onSelectFolder` so the URL stays the single source of truth (see\n * `useFolderNavigation`).\n */\nexport const FolderTree = ({ currentFolderId, onSelectFolder }: FolderTreeProps) => {\n const { formatMessage } = useIntl();\n const { data: folderStructure = [], isLoading, isError } = useGetFolderStructureQuery();\n const { isExpanded, toggleExpanded } = useExpandedFolders(folderStructure, currentFolderId);\n\n const isHomeActive = currentFolderId == null;\n\n return (\n <SidebarNav\n direction=\"column\"\n alignItems=\"stretch\"\n tag=\"nav\"\n aria-label={formatMessage({\n id: getTranslationKey('sidebar.tree.aria-label'),\n defaultMessage: 'Media library folders',\n })}\n >\n <SidebarHeader paddingTop={4} paddingBottom={4} paddingLeft={5} paddingRight={5}>\n <Typography variant=\"beta\" tag=\"h2\">\n {formatMessage({\n id: getTranslationKey('sidebar.title'),\n defaultMessage: 'Media library',\n })}\n </Typography>\n </SidebarHeader>\n\n <SidebarBody direction=\"column\" alignItems=\"stretch\" gap={1} padding={3}>\n <RowButton\n type=\"button\"\n $isActive={isHomeActive}\n aria-current={isHomeActive ? 'page' : undefined}\n onClick={() => onSelectFolder(null)}\n data-testid=\"folder-tree-home\"\n >\n <House aria-hidden width=\"1.6rem\" height=\"1.6rem\" />\n <Typography variant=\"omega\" fontWeight={isHomeActive ? 'semiBold' : 'regular'}>\n {formatMessage({\n id: getTranslationKey('sidebar.home'),\n defaultMessage: 'Home',\n })}\n </Typography>\n </RowButton>\n\n <Box>\n <Flex alignItems=\"center\" gap={1} padding={1}>\n <FolderIcon aria-hidden width=\"1.6rem\" height=\"1.6rem\" fill=\"neutral500\" />\n <Typography\n variant=\"sigma\"\n textColor=\"neutral600\"\n style={{ textTransform: 'uppercase' }}\n >\n {formatMessage({\n id: getTranslationKey('sidebar.folders'),\n defaultMessage: 'Folders',\n })}\n </Typography>\n </Flex>\n\n {isLoading ? (\n // TODO: revisit loading state before revamp GA\n <Flex justifyContent=\"center\" padding={1} paddingTop={2}>\n <Loader>\n {formatMessage({\n id: getTranslationKey('sidebar.tree.loading'),\n defaultMessage: 'Loading folders...',\n })}\n </Loader>\n </Flex>\n ) : isError ? (\n // TODO: revisit error state before revamp GA\n <Box padding={1} paddingTop={2}>\n <Typography variant=\"pi\" textColor=\"danger600\">\n {formatMessage({\n id: getTranslationKey('sidebar.tree.error'),\n defaultMessage: 'Could not load folders.',\n })}\n </Typography>\n </Box>\n ) : folderStructure.length === 0 ? (\n // TODO: revisit empty state before revamp GA\n <Box padding={1} paddingTop={2}>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {formatMessage({\n id: getTranslationKey('sidebar.tree.empty'),\n defaultMessage: 'No folders yet',\n })}\n </Typography>\n </Box>\n ) : (\n <NavList>\n {folderStructure.map((node) => (\n <FolderTreeItem\n key={node.id ?? node.name}\n node={node}\n level={0}\n currentFolderId={currentFolderId}\n isExpanded={isExpanded}\n onToggle={toggleExpanded}\n onSelect={onSelectFolder}\n />\n ))}\n </NavList>\n )}\n </Box>\n </SidebarBody>\n </SidebarNav>\n );\n};\n"],"names":["RowButton","styled","button","theme","spaces","$isActive","colors","primary100","primary700","neutral800","borderRadius","neutral100","primary600","findAncestorIds","nodes","targetId","trail","node","id","children","length","nextTrail","found","useExpandedFolders","folderStructure","currentFolderId","expandedIds","setExpandedIds","useState","Set","useEffect","ancestors","prev","next","changed","has","add","toggleExpanded","useCallback","delete","isExpanded","TruncatedFolderName","name","isActive","textRef","useRef","isTruncated","setIsTruncated","useLayoutEffect","el","current","checkTruncation","scrollWidth","clientWidth","observer","ResizeObserver","observe","disconnect","label","_jsx","Typography","ref","variant","fontWeight","ellipsis","Tooltip","NavList","ul","INDENT_PER_LEVEL_REM","RotatingChevron","ChevronDown","$expanded","FolderTreeItem","level","onToggle","onSelect","formatMessage","useIntl","hasChildren","isFolderExpanded","_jsxs","li","Flex","alignItems","paddingLeft","gap","IconButton","getTranslationKey","defaultMessage","onClick","event","stopPropagation","withTooltip","aria-expanded","fill","Box","flex","minWidth","type","aria-current","undefined","data-testid","data-folder-id","map","child","SidebarNav","neutral0","neutral150","SidebarHeader","SidebarBody","FolderTree","onSelectFolder","data","isLoading","isError","useGetFolderStructureQuery","isHomeActive","direction","tag","aria-label","paddingTop","paddingBottom","paddingRight","padding","House","aria-hidden","width","height","FolderIcon","textColor","style","textTransform","justifyContent","Loader"],"mappings":"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"}
1
+ {"version":3,"file":"FolderTree.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/FolderTree/FolderTree.tsx"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nimport { Box, Flex, IconButton, Loader, Tooltip, Typography } from '@strapi/design-system';\nimport { ChevronDown, Folder as FolderIcon, House } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { css, styled } from 'styled-components';\n\nimport { useGetFolderStructureQuery } from '../../../../services/folders';\nimport { getTranslationKey } from '../../../../utils/translations';\nimport { useAssetsDndOptional } from '../Dnd/AssetsDndProvider';\nimport { useFolderTreeDroppable } from '../Dnd/useFolderTreeDroppable';\n\nimport { useSpringLoadedExpand } from './useSpringLoadedExpand';\n\nimport type { FolderNode } from '../../../../../../../shared/contracts/folders';\n\n/* -------------------------------------------------------------------------------------------------\n * RowButton — shared row styling aligned with admin SubNav.Link\n * -----------------------------------------------------------------------------------------------*/\n\nconst RowButton = styled.button<{\n $isActive: boolean;\n $isValidDropTarget?: boolean;\n $isInvalidDropCursor?: boolean;\n $isMovePending?: boolean;\n}>`\n display: flex;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n width: 100%;\n min-height: 3.2rem;\n padding: ${({ theme }) => `${theme.spaces[1]} ${theme.spaces[2]}`};\n border: 0;\n background: ${({ $isActive, $isValidDropTarget, theme }) => {\n if ($isValidDropTarget) {\n return theme.colors.primary100;\n }\n\n return $isActive ? theme.colors.primary100 : 'transparent';\n }};\n color: ${({ $isActive, theme }) =>\n $isActive ? theme.colors.primary700 : theme.colors.neutral800};\n border-radius: ${({ theme }) => theme.borderRadius};\n cursor: ${({ $isMovePending, $isInvalidDropCursor }) => {\n if ($isMovePending) {\n return 'wait';\n }\n\n return $isInvalidDropCursor ? 'not-allowed' : 'pointer';\n }};\n text-align: left;\n font: inherit;\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n outline: 1px dashed ${theme.colors.primary600};\n outline-offset: -1px;\n `}\n\n &:hover {\n background: ${({ $isActive, $isValidDropTarget, theme }) => {\n if ($isValidDropTarget) {\n return theme.colors.primary100;\n }\n\n return $isActive ? theme.colors.primary100 : theme.colors.neutral100;\n }};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n`;\n\nconst TreeRow = styled(Flex)<{\n $isValidDropTarget?: boolean;\n $isInvalidDropCursor?: boolean;\n $isMovePending?: boolean;\n}>`\n cursor: ${({ $isMovePending, $isInvalidDropCursor }) => {\n if ($isMovePending) {\n return 'wait';\n }\n\n return $isInvalidDropCursor ? 'not-allowed' : 'default';\n }};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n border-radius: ${({ theme }) => theme.borderRadius};\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n background: ${theme.colors.primary100};\n outline: 1px dashed ${theme.colors.primary600};\n outline-offset: -1px;\n `}\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * useExpandedFolders — local expand/collapse state\n * -----------------------------------------------------------------------------------------------*/\n\nconst findAncestorIds = (\n nodes: FolderNode[],\n targetId: number,\n trail: number[] = []\n): number[] | null => {\n for (const node of nodes) {\n if (node.id === targetId) {\n return trail;\n }\n\n if (node.children?.length) {\n const nextTrail = node.id != null ? [...trail, node.id] : trail;\n const found = findAncestorIds(node.children, targetId, nextTrail);\n if (found !== null) {\n return found;\n }\n }\n }\n\n return null;\n};\n\nconst useExpandedFolders = (folderStructure: FolderNode[], currentFolderId: number | null) => {\n const [expandedIds, setExpandedIds] = useState<Set<number>>(() => new Set());\n\n useEffect(() => {\n if (currentFolderId == null) {\n return;\n }\n\n const ancestors = findAncestorIds(folderStructure, currentFolderId);\n if (!ancestors || ancestors.length === 0) {\n return;\n }\n\n setExpandedIds((prev) => {\n const next = new Set(prev);\n let changed = false;\n for (const id of ancestors) {\n if (!next.has(id)) {\n next.add(id);\n changed = true;\n }\n }\n return changed ? next : prev;\n });\n }, [folderStructure, currentFolderId]);\n\n const toggleExpanded = useCallback((id: number) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const expandFolder = useCallback((id: number) => {\n setExpandedIds((prev) => {\n if (prev.has(id)) {\n return prev;\n }\n\n const next = new Set(prev);\n next.add(id);\n return next;\n });\n }, []);\n\n const isExpanded = useCallback((id: number) => expandedIds.has(id), [expandedIds]);\n\n return { isExpanded, toggleExpanded, expandFolder };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * TruncatedFolderName — tooltip when the label is ellipsized\n * -----------------------------------------------------------------------------------------------*/\n\nconst TruncatedFolderName = ({ name, isActive }: { name: string; isActive: boolean }) => {\n const textRef = useRef<HTMLSpanElement>(null);\n const [isTruncated, setIsTruncated] = useState(false);\n\n useLayoutEffect(() => {\n const el = textRef.current;\n if (!el) {\n return;\n }\n\n const checkTruncation = () => {\n setIsTruncated(el.scrollWidth > el.clientWidth);\n };\n\n checkTruncation();\n\n const observer = new ResizeObserver(checkTruncation);\n observer.observe(el);\n\n return () => observer.disconnect();\n }, [name]);\n\n const label = (\n <Typography\n ref={textRef}\n variant=\"omega\"\n fontWeight={isActive ? 'semiBold' : 'regular'}\n ellipsis\n >\n {name}\n </Typography>\n );\n\n if (isTruncated) {\n return <Tooltip label={name}>{label}</Tooltip>;\n }\n\n return label;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NavList — unstyled list for tree rows\n * -----------------------------------------------------------------------------------------------*/\n\nconst NavList = styled.ul`\n list-style: none;\n margin: 0;\n padding: 0;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderTreeItem — single tree row (internal)\n * -----------------------------------------------------------------------------------------------*/\n\nconst INDENT_PER_LEVEL_REM = 1.6;\n\nconst RotatingChevron = styled(ChevronDown)<{ $expanded: boolean }>`\n transform: rotate(${({ $expanded }) => ($expanded ? '0deg' : '-90deg')});\n transition: transform 0.2s ease;\n`;\n\ninterface FolderTreeItemProps {\n node: FolderNode;\n level: number;\n currentFolderId: number | null;\n isExpanded: (id: number) => boolean;\n onToggle: (id: number) => void;\n onExpand: (id: number) => void;\n onSelect: (folderId: number) => void;\n isMovePending: boolean;\n}\n\ninterface FolderTreeItemInnerProps extends Omit<FolderTreeItemProps, 'node'> {\n id: number;\n name: string;\n folderChildren: FolderNode[];\n}\n\nconst FolderTreeItemInner = ({\n id,\n name,\n folderChildren,\n level,\n currentFolderId,\n isExpanded,\n onToggle,\n onExpand,\n onSelect,\n isMovePending,\n}: FolderTreeItemInnerProps) => {\n const { formatMessage } = useIntl();\n const hasChildren = folderChildren.length > 0;\n const isFolderExpanded = isExpanded(id);\n const isActive = currentFolderId === id;\n\n const {\n droppable: { setNodeRef },\n isOver,\n showValidDropHighlight,\n showInvalidDropCursor,\n } = useFolderTreeDroppable({ id, name });\n\n const handleExpand = useCallback(() => onExpand(id), [id, onExpand]);\n\n useSpringLoadedExpand({\n isOver,\n canExpand: hasChildren && !isFolderExpanded,\n onExpand: handleExpand,\n });\n\n // TODO: full `role=\"tree\"` + arrow-key treeview navigation before revamp GA\n // if an accessibility audit requires it (v1 is button rows only).\n return (\n <li>\n <TreeRow\n ref={setNodeRef}\n alignItems=\"center\"\n paddingLeft={`${level * INDENT_PER_LEVEL_REM}rem`}\n gap={1}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropCursor={showInvalidDropCursor}\n $isMovePending={isMovePending}\n >\n <IconButton\n label={formatMessage(\n {\n id: getTranslationKey(\n isFolderExpanded ? 'sidebar.tree.collapse' : 'sidebar.tree.expand'\n ),\n defaultMessage: isFolderExpanded ? 'Collapse {name}' : 'Expand {name}',\n },\n { name }\n )}\n onClick={(event: React.MouseEvent) => {\n event.stopPropagation();\n onToggle(id);\n }}\n variant=\"ghost\"\n withTooltip={false}\n aria-expanded={isFolderExpanded}\n >\n <RotatingChevron $expanded={isFolderExpanded} fill=\"neutral500\" />\n </IconButton>\n\n <Box flex=\"1\" minWidth={0}>\n <RowButton\n type=\"button\"\n $isActive={isActive}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropCursor={showInvalidDropCursor}\n $isMovePending={isMovePending}\n aria-current={isActive ? 'page' : undefined}\n onClick={() => onSelect(id)}\n data-testid={`folder-tree-node-${id}`}\n data-folder-id={id}\n >\n <TruncatedFolderName name={name} isActive={isActive} />\n </RowButton>\n </Box>\n </TreeRow>\n\n {hasChildren && isFolderExpanded && (\n <NavList>\n {folderChildren.map((child) => (\n <FolderTreeItem\n key={child.id ?? child.name}\n node={child}\n level={level + 1}\n currentFolderId={currentFolderId}\n isExpanded={isExpanded}\n onToggle={onToggle}\n onExpand={onExpand}\n onSelect={onSelect}\n isMovePending={isMovePending}\n />\n ))}\n </NavList>\n )}\n </li>\n );\n};\n\nconst FolderTreeItem = ({ node, ...props }: FolderTreeItemProps) => {\n if (node.id == null) {\n return null;\n }\n\n return (\n <FolderTreeItemInner\n {...props}\n id={node.id}\n name={node.name ?? ''}\n folderChildren={node.children ?? []}\n />\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * FolderTree — public sidebar component\n * -----------------------------------------------------------------------------------------------*/\n\nconst SidebarNav = styled(Flex)`\n /* TODO: reconcile 25.6rem (Figma) with admin WIDTH_SIDE_NAVIGATION (23.2rem) */\n width: 25.6rem;\n height: 100%;\n min-height: 100%;\n background: ${({ theme }) => theme.colors.neutral0};\n flex-shrink: 0;\n flex-direction: column;\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst SidebarHeader = styled(Box)`\n flex-shrink: 0;\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst SidebarBody = styled(Flex)`\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n`;\n\ninterface FolderTreeProps {\n currentFolderId: number | null;\n onSelectFolder: (folderId: number | null) => void;\n}\n\n/**\n * Left-rail navigation for the Media Library. Fetches folder structure internally\n * and renders:\n *\n * 1. A \"Media library\" title\n * 2. A \"Home\" entry that clears the folder query param\n * 3. A \"FOLDERS\" section header\n * 4. The folder tree itself\n *\n * Presentational with respect to routing — navigation is delegated to the parent\n * via `onSelectFolder` so the URL stays the single source of truth (see\n * `useFolderNavigation`).\n */\nexport const FolderTree = ({ currentFolderId, onSelectFolder }: FolderTreeProps) => {\n const { formatMessage } = useIntl();\n const { data: folderStructure = [], isLoading, isError } = useGetFolderStructureQuery();\n const { isExpanded, toggleExpanded, expandFolder } = useExpandedFolders(\n folderStructure,\n currentFolderId\n );\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n\n const isHomeActive = currentFolderId == null;\n const homeLabel = formatMessage({\n id: getTranslationKey('sidebar.home'),\n defaultMessage: 'Home',\n });\n\n const {\n droppable: { setNodeRef: setHomeDropRef },\n showValidDropHighlight: showHomeValidDropHighlight,\n showInvalidDropCursor: showHomeInvalidDropCursor,\n } = useFolderTreeDroppable({ id: null, name: homeLabel });\n\n return (\n <SidebarNav\n direction=\"column\"\n alignItems=\"stretch\"\n tag=\"nav\"\n aria-label={formatMessage({\n id: getTranslationKey('sidebar.tree.aria-label'),\n defaultMessage: 'Media library folders',\n })}\n >\n <SidebarHeader paddingTop={4} paddingBottom={4} paddingLeft={5} paddingRight={5}>\n <Typography variant=\"beta\" tag=\"h2\">\n {formatMessage({\n id: getTranslationKey('sidebar.title'),\n defaultMessage: 'Media library',\n })}\n </Typography>\n </SidebarHeader>\n\n <SidebarBody direction=\"column\" alignItems=\"stretch\" gap={1} padding={3}>\n <RowButton\n ref={setHomeDropRef}\n type=\"button\"\n $isActive={isHomeActive}\n $isValidDropTarget={showHomeValidDropHighlight}\n $isInvalidDropCursor={showHomeInvalidDropCursor}\n $isMovePending={isMovePending}\n aria-current={isHomeActive ? 'page' : undefined}\n onClick={() => onSelectFolder(null)}\n data-testid=\"folder-tree-home\"\n >\n <House aria-hidden width=\"1.6rem\" height=\"1.6rem\" />\n <Typography variant=\"omega\" fontWeight={isHomeActive ? 'semiBold' : 'regular'}>\n {homeLabel}\n </Typography>\n </RowButton>\n\n <Box marginTop={4}>\n <Flex\n alignItems=\"center\"\n gap={1}\n paddingTop={1}\n paddingBottom={1}\n paddingLeft={2}\n paddingRight={2}\n marginBottom={2}\n >\n <FolderIcon aria-hidden width=\"1.6rem\" height=\"1.6rem\" fill=\"neutral500\" />\n <Typography\n variant=\"sigma\"\n textColor=\"neutral600\"\n style={{ textTransform: 'uppercase' }}\n >\n {formatMessage({\n id: getTranslationKey('sidebar.folders'),\n defaultMessage: 'Folders',\n })}\n </Typography>\n </Flex>\n\n {isLoading ? (\n // TODO: revisit loading state before revamp GA\n <Flex justifyContent=\"center\" padding={1} paddingTop={2}>\n <Loader>\n {formatMessage({\n id: getTranslationKey('sidebar.tree.loading'),\n defaultMessage: 'Loading folders...',\n })}\n </Loader>\n </Flex>\n ) : isError ? (\n // TODO: revisit error state before revamp GA\n <Box padding={1} paddingTop={2}>\n <Typography variant=\"pi\" textColor=\"danger600\">\n {formatMessage({\n id: getTranslationKey('sidebar.tree.error'),\n defaultMessage: 'Could not load folders.',\n })}\n </Typography>\n </Box>\n ) : folderStructure.length === 0 ? (\n // TODO: revisit empty state before revamp GA\n <Box padding={1} paddingTop={2}>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {formatMessage({\n id: getTranslationKey('sidebar.tree.empty'),\n defaultMessage: 'No folders yet',\n })}\n </Typography>\n </Box>\n ) : (\n <NavList>\n {folderStructure.map((node) => (\n <FolderTreeItem\n key={node.id ?? node.name}\n node={node}\n level={0}\n currentFolderId={currentFolderId}\n isExpanded={isExpanded}\n onToggle={toggleExpanded}\n onExpand={expandFolder}\n onSelect={onSelectFolder}\n isMovePending={isMovePending}\n />\n ))}\n </NavList>\n )}\n </Box>\n </SidebarBody>\n </SidebarNav>\n );\n};\n"],"names":["RowButton","styled","button","theme","spaces","$isActive","$isValidDropTarget","colors","primary100","primary700","neutral800","borderRadius","$isMovePending","$isInvalidDropCursor","css","primary600","neutral100","TreeRow","Flex","findAncestorIds","nodes","targetId","trail","node","id","children","length","nextTrail","found","useExpandedFolders","folderStructure","currentFolderId","expandedIds","setExpandedIds","useState","Set","useEffect","ancestors","prev","next","changed","has","add","toggleExpanded","useCallback","delete","expandFolder","isExpanded","TruncatedFolderName","name","isActive","textRef","useRef","isTruncated","setIsTruncated","useLayoutEffect","el","current","checkTruncation","scrollWidth","clientWidth","observer","ResizeObserver","observe","disconnect","label","_jsx","Typography","ref","variant","fontWeight","ellipsis","Tooltip","NavList","ul","INDENT_PER_LEVEL_REM","RotatingChevron","ChevronDown","$expanded","FolderTreeItemInner","folderChildren","level","onToggle","onExpand","onSelect","isMovePending","formatMessage","useIntl","hasChildren","isFolderExpanded","droppable","setNodeRef","isOver","showValidDropHighlight","showInvalidDropCursor","useFolderTreeDroppable","handleExpand","useSpringLoadedExpand","canExpand","_jsxs","li","alignItems","paddingLeft","gap","IconButton","getTranslationKey","defaultMessage","onClick","event","stopPropagation","withTooltip","aria-expanded","fill","Box","flex","minWidth","type","aria-current","undefined","data-testid","data-folder-id","map","child","FolderTreeItem","props","SidebarNav","neutral0","neutral150","SidebarHeader","SidebarBody","FolderTree","onSelectFolder","data","isLoading","isError","useGetFolderStructureQuery","useAssetsDndOptional","isHomeActive","homeLabel","setHomeDropRef","showHomeValidDropHighlight","showHomeInvalidDropCursor","direction","tag","aria-label","paddingTop","paddingBottom","paddingRight","padding","House","aria-hidden","width","height","marginTop","marginBottom","FolderIcon","textColor","style","textTransform","justifyContent","Loader"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ const SPRING_LOAD_DELAY_MS = 600;
6
+ const useSpringLoadedExpand = ({ isOver, canExpand, onExpand })=>{
7
+ React.useEffect(()=>{
8
+ if (!isOver || !canExpand) {
9
+ return;
10
+ }
11
+ const timer = setTimeout(onExpand, SPRING_LOAD_DELAY_MS);
12
+ return ()=>clearTimeout(timer);
13
+ }, [
14
+ isOver,
15
+ canExpand,
16
+ onExpand
17
+ ]);
18
+ };
19
+
20
+ exports.SPRING_LOAD_DELAY_MS = SPRING_LOAD_DELAY_MS;
21
+ exports.useSpringLoadedExpand = useSpringLoadedExpand;
22
+ //# sourceMappingURL=useSpringLoadedExpand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSpringLoadedExpand.js","sources":["../../../../../../../admin/src/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.ts"],"sourcesContent":["import { useEffect } from 'react';\n\nexport const SPRING_LOAD_DELAY_MS = 600;\n\nexport const useSpringLoadedExpand = ({\n isOver,\n canExpand,\n onExpand,\n}: {\n isOver: boolean;\n canExpand: boolean;\n onExpand: () => void;\n}) => {\n useEffect(() => {\n if (!isOver || !canExpand) {\n return;\n }\n\n const timer = setTimeout(onExpand, SPRING_LOAD_DELAY_MS);\n\n return () => clearTimeout(timer);\n }, [isOver, canExpand, onExpand]);\n};\n"],"names":["SPRING_LOAD_DELAY_MS","useSpringLoadedExpand","isOver","canExpand","onExpand","useEffect","timer","setTimeout","clearTimeout"],"mappings":";;;;AAEO,MAAMA,uBAAuB;AAE7B,MAAMC,wBAAwB,CAAC,EACpCC,MAAM,EACNC,SAAS,EACTC,QAAQ,EAKT,GAAA;IACCC,eAAAA,CAAU,IAAA;QACR,IAAI,CAACH,MAAAA,IAAU,CAACC,SAAAA,EAAW;AACzB,YAAA;AACF,QAAA;QAEA,MAAMG,KAAAA,GAAQC,WAAWH,QAAAA,EAAUJ,oBAAAA,CAAAA;AAEnC,QAAA,OAAO,IAAMQ,YAAAA,CAAaF,KAAAA,CAAAA;IAC5B,CAAA,EAAG;AAACJ,QAAAA,MAAAA;AAAQC,QAAAA,SAAAA;AAAWC,QAAAA;AAAS,KAAA,CAAA;AAClC;;;;;"}
@@ -0,0 +1,19 @@
1
+ import { useEffect } from 'react';
2
+
3
+ const SPRING_LOAD_DELAY_MS = 600;
4
+ const useSpringLoadedExpand = ({ isOver, canExpand, onExpand })=>{
5
+ useEffect(()=>{
6
+ if (!isOver || !canExpand) {
7
+ return;
8
+ }
9
+ const timer = setTimeout(onExpand, SPRING_LOAD_DELAY_MS);
10
+ return ()=>clearTimeout(timer);
11
+ }, [
12
+ isOver,
13
+ canExpand,
14
+ onExpand
15
+ ]);
16
+ };
17
+
18
+ export { SPRING_LOAD_DELAY_MS, useSpringLoadedExpand };
19
+ //# sourceMappingURL=useSpringLoadedExpand.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSpringLoadedExpand.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.ts"],"sourcesContent":["import { useEffect } from 'react';\n\nexport const SPRING_LOAD_DELAY_MS = 600;\n\nexport const useSpringLoadedExpand = ({\n isOver,\n canExpand,\n onExpand,\n}: {\n isOver: boolean;\n canExpand: boolean;\n onExpand: () => void;\n}) => {\n useEffect(() => {\n if (!isOver || !canExpand) {\n return;\n }\n\n const timer = setTimeout(onExpand, SPRING_LOAD_DELAY_MS);\n\n return () => clearTimeout(timer);\n }, [isOver, canExpand, onExpand]);\n};\n"],"names":["SPRING_LOAD_DELAY_MS","useSpringLoadedExpand","isOver","canExpand","onExpand","useEffect","timer","setTimeout","clearTimeout"],"mappings":";;AAEO,MAAMA,uBAAuB;AAE7B,MAAMC,wBAAwB,CAAC,EACpCC,MAAM,EACNC,SAAS,EACTC,QAAQ,EAKT,GAAA;IACCC,SAAAA,CAAU,IAAA;QACR,IAAI,CAACH,MAAAA,IAAU,CAACC,SAAAA,EAAW;AACzB,YAAA;AACF,QAAA;QAEA,MAAMG,KAAAA,GAAQC,WAAWH,QAAAA,EAAUJ,oBAAAA,CAAAA;AAEnC,QAAA,OAAO,IAAMQ,YAAAA,CAAaF,KAAAA,CAAAA;IAC5B,CAAA,EAAG;AAACJ,QAAAA,MAAAA;AAAQC,QAAAA,SAAAA;AAAWC,QAAAA;AAAS,KAAA,CAAA;AAClC;;;;"}
@@ -0,0 +1,165 @@
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 translations = require('../../../utils/translations.js');
9
+
10
+ const SORT_BY_LABELS = {
11
+ oldestUploads: {
12
+ id: translations.getTranslationKey('list.sort.oldest-uploads'),
13
+ defaultMessage: 'Oldest uploads'
14
+ },
15
+ mostRecentUpdates: {
16
+ id: translations.getTranslationKey('list.sort.most-recent-updates'),
17
+ defaultMessage: 'Most recent updates'
18
+ }
19
+ };
20
+ const SORT_DIRECTION_LABELS = {
21
+ nameAsc: {
22
+ id: translations.getTranslationKey('list.sort.name-asc'),
23
+ defaultMessage: 'A to Z'
24
+ },
25
+ nameDesc: {
26
+ id: translations.getTranslationKey('list.sort.name-desc'),
27
+ defaultMessage: 'Z to A'
28
+ },
29
+ sizeAsc: {
30
+ id: translations.getTranslationKey('list.sort.size-asc'),
31
+ defaultMessage: 'File size ascending'
32
+ },
33
+ sizeDesc: {
34
+ id: translations.getTranslationKey('list.sort.size-desc'),
35
+ defaultMessage: 'File size descending'
36
+ }
37
+ };
38
+ const FOLDERS_LABELS = {
39
+ top: {
40
+ id: translations.getTranslationKey('list.sort.folders-on-top'),
41
+ defaultMessage: 'On top'
42
+ },
43
+ mixed: {
44
+ id: translations.getTranslationKey('list.sort.folders-mixed'),
45
+ defaultMessage: 'Mixed with files'
46
+ }
47
+ };
48
+ // Stretch to the toolbar row height so the trigger matches the view toggle
49
+ // (the parent Flex uses alignItems="stretch").
50
+ const SortTrigger = styledComponents.styled(designSystem.Menu.Trigger)`
51
+ height: auto;
52
+ `;
53
+ // Full-width section band, like the design mock (sits inside the Menu.Content
54
+ // padding, so the band stops short of the panel edges).
55
+ const GroupLabel = styledComponents.styled(designSystem.Menu.Label)`
56
+ width: 100%;
57
+ display: block;
58
+ background: ${({ theme })=>theme.colorScheme === 'dark' ? theme.colors.neutral150 : theme.colors.neutral100};
59
+ padding-inline: ${({ theme })=>theme.spaces[3]};
60
+ border-radius: ${({ theme })=>theme.borderRadius};
61
+ `;
62
+ /**
63
+ * Toolbar "Sort" dropdown: single-select sections (Sort / Folders). Picking an
64
+ * option keeps the menu open (`onSelect` preventDefault) so several facets can
65
+ * be tuned in one visit; clicking a checked facet clears it (the hook
66
+ * guarantees at least one sort rule stays active).
67
+ */ const SortMenu = ({ sort, showFoldersGroup = true })=>{
68
+ const { formatMessage } = reactIntl.useIntl();
69
+ const triggerLabel = formatMessage({
70
+ id: translations.getTranslationKey('list.sort.trigger'),
71
+ defaultMessage: 'Sort: {active}'
72
+ }, {
73
+ active: sort.sortBy ? formatMessage(SORT_BY_LABELS[sort.sortBy]) : formatMessage(SORT_DIRECTION_LABELS[sort.direction])
74
+ });
75
+ const checkmark = /*#__PURE__*/ jsxRuntime.jsx(icons.Check, {
76
+ "aria-hidden": true,
77
+ width: "1.6rem",
78
+ height: "1.6rem",
79
+ fill: "primary600"
80
+ });
81
+ // The checkmark icon is aria-hidden, so the active option carries a
82
+ // visually-hidden suffix for screen readers instead (menuitem does not
83
+ // allow aria-checked).
84
+ const activeMark = /*#__PURE__*/ jsxRuntime.jsxs(designSystem.VisuallyHidden, {
85
+ children: [
86
+ ' ',
87
+ formatMessage({
88
+ id: translations.getTranslationKey('list.sort.active'),
89
+ defaultMessage: '(active)'
90
+ })
91
+ ]
92
+ });
93
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Root, {
94
+ children: [
95
+ /*#__PURE__*/ jsxRuntime.jsx(SortTrigger, {
96
+ variant: "tertiary",
97
+ endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronDown, {
98
+ "aria-hidden": true
99
+ }),
100
+ children: triggerLabel
101
+ }),
102
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Content, {
103
+ popoverPlacement: "bottom-end",
104
+ zIndex: 2,
105
+ maxHeight: "70vh",
106
+ width: "25rem",
107
+ children: [
108
+ /*#__PURE__*/ jsxRuntime.jsx(GroupLabel, {
109
+ children: formatMessage({
110
+ id: translations.getTranslationKey('list.sort.section'),
111
+ defaultMessage: 'Sort'
112
+ })
113
+ }),
114
+ Object.keys(SORT_BY_LABELS).map((key)=>/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Item, {
115
+ onSelect: (e)=>{
116
+ e.preventDefault();
117
+ sort.setSortBy(sort.sortBy === key ? null : key);
118
+ },
119
+ endIcon: sort.sortBy === key ? checkmark : null,
120
+ children: [
121
+ formatMessage(SORT_BY_LABELS[key]),
122
+ sort.sortBy === key && activeMark
123
+ ]
124
+ }, key)),
125
+ Object.keys(SORT_DIRECTION_LABELS).map((key)=>/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Item, {
126
+ onSelect: (e)=>{
127
+ e.preventDefault();
128
+ sort.setDirection(sort.direction === key ? null : key);
129
+ },
130
+ endIcon: sort.direction === key ? checkmark : null,
131
+ children: [
132
+ formatMessage(SORT_DIRECTION_LABELS[key]),
133
+ sort.direction === key && activeMark
134
+ ]
135
+ }, key)),
136
+ showFoldersGroup && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
137
+ children: [
138
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Separator, {}),
139
+ /*#__PURE__*/ jsxRuntime.jsx(GroupLabel, {
140
+ children: formatMessage({
141
+ id: translations.getTranslationKey('list.sort.folders'),
142
+ defaultMessage: 'Folders'
143
+ })
144
+ }),
145
+ Object.keys(FOLDERS_LABELS).map((position)=>/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Item, {
146
+ onSelect: (e)=>{
147
+ e.preventDefault();
148
+ sort.setFoldersPosition(position);
149
+ },
150
+ endIcon: sort.foldersPosition === position ? checkmark : null,
151
+ children: [
152
+ formatMessage(FOLDERS_LABELS[position]),
153
+ sort.foldersPosition === position && activeMark
154
+ ]
155
+ }, position))
156
+ ]
157
+ })
158
+ ]
159
+ })
160
+ ]
161
+ });
162
+ };
163
+
164
+ exports.SortMenu = SortMenu;
165
+ //# sourceMappingURL=SortMenu.js.map