@strapi/upload 5.55.1 → 5.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/dist/admin/hooks/useAIMetadataAvailability.js +14 -0
  2. package/dist/admin/hooks/useAIMetadataAvailability.js.map +1 -0
  3. package/dist/admin/hooks/useAIMetadataAvailability.mjs +12 -0
  4. package/dist/admin/hooks/useAIMetadataAvailability.mjs.map +1 -0
  5. package/dist/admin/hooks/useAIMetadataEnabled.js +7 -5
  6. package/dist/admin/hooks/useAIMetadataEnabled.js.map +1 -1
  7. package/dist/admin/hooks/useAIMetadataEnabled.mjs +7 -5
  8. package/dist/admin/hooks/useAIMetadataEnabled.mjs.map +1 -1
  9. package/dist/admin/hooks/useTracking.js +4 -10
  10. package/dist/admin/hooks/useTracking.js.map +1 -1
  11. package/dist/admin/hooks/useTracking.mjs +5 -10
  12. package/dist/admin/hooks/useTracking.mjs.map +1 -1
  13. package/dist/admin/legacy/hooks/useAIMetadataAvailability.js +14 -0
  14. package/dist/admin/legacy/hooks/useAIMetadataAvailability.js.map +1 -0
  15. package/dist/admin/legacy/hooks/useAIMetadataAvailability.mjs +12 -0
  16. package/dist/admin/legacy/hooks/useAIMetadataAvailability.mjs.map +1 -0
  17. package/dist/admin/legacy/hooks/useAIMetadataEnabled.js +23 -0
  18. package/dist/admin/legacy/hooks/useAIMetadataEnabled.js.map +1 -0
  19. package/dist/admin/legacy/hooks/useAIMetadataEnabled.mjs +21 -0
  20. package/dist/admin/legacy/hooks/useAIMetadataEnabled.mjs.map +1 -0
  21. package/dist/admin/legacy/hooks/useTracking.js +5 -3
  22. package/dist/admin/legacy/hooks/useTracking.js.map +1 -1
  23. package/dist/admin/legacy/hooks/useTracking.mjs +5 -3
  24. package/dist/admin/legacy/hooks/useTracking.mjs.map +1 -1
  25. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js +2 -1
  26. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  27. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs +2 -1
  28. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  29. package/dist/admin/legacy/pages/App/MediaLibrary.js +6 -5
  30. package/dist/admin/legacy/pages/App/MediaLibrary.js.map +1 -1
  31. package/dist/admin/legacy/pages/App/MediaLibrary.mjs +6 -5
  32. package/dist/admin/legacy/pages/App/MediaLibrary.mjs.map +1 -1
  33. package/dist/admin/pages/Assets/AssetsPage.js +24 -12
  34. package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
  35. package/dist/admin/pages/Assets/AssetsPage.mjs +25 -13
  36. package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
  37. package/dist/admin/pages/Assets/components/AssetActions.js +326 -0
  38. package/dist/admin/pages/Assets/components/AssetActions.js.map +1 -0
  39. package/dist/admin/pages/Assets/components/AssetActions.mjs +324 -0
  40. package/dist/admin/pages/Assets/components/AssetActions.mjs.map +1 -0
  41. package/dist/admin/pages/Assets/components/AssetActionsMenu.js +28 -309
  42. package/dist/admin/pages/Assets/components/AssetActionsMenu.js.map +1 -1
  43. package/dist/admin/pages/Assets/components/AssetActionsMenu.mjs +31 -312
  44. package/dist/admin/pages/Assets/components/AssetActionsMenu.mjs.map +1 -1
  45. package/dist/admin/pages/Assets/components/AssetContextMenu.js +79 -0
  46. package/dist/admin/pages/Assets/components/AssetContextMenu.js.map +1 -0
  47. package/dist/admin/pages/Assets/components/AssetContextMenu.mjs +77 -0
  48. package/dist/admin/pages/Assets/components/AssetContextMenu.mjs.map +1 -0
  49. package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.js +87 -5
  50. package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
  51. package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +89 -7
  52. package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
  53. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +3 -3
  54. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  55. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +3 -3
  56. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  57. package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.js +62 -5
  58. package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.js.map +1 -1
  59. package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.mjs +60 -6
  60. package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.mjs.map +1 -1
  61. package/dist/admin/pages/Assets/components/AssetsGrid.js +27 -4
  62. package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
  63. package/dist/admin/pages/Assets/components/AssetsGrid.mjs +27 -4
  64. package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  65. package/dist/admin/pages/Assets/components/AssetsTable.js +27 -4
  66. package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
  67. package/dist/admin/pages/Assets/components/AssetsTable.mjs +27 -4
  68. package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
  69. package/dist/admin/pages/Assets/components/CursorAnchoredMenu.js +77 -0
  70. package/dist/admin/pages/Assets/components/CursorAnchoredMenu.js.map +1 -0
  71. package/dist/admin/pages/Assets/components/CursorAnchoredMenu.mjs +75 -0
  72. package/dist/admin/pages/Assets/components/CursorAnchoredMenu.mjs.map +1 -0
  73. package/dist/admin/pages/Assets/components/DeleteItemsDialog.js +4 -2
  74. package/dist/admin/pages/Assets/components/DeleteItemsDialog.js.map +1 -1
  75. package/dist/admin/pages/Assets/components/DeleteItemsDialog.mjs +4 -2
  76. package/dist/admin/pages/Assets/components/DeleteItemsDialog.mjs.map +1 -1
  77. package/dist/admin/pages/Assets/components/FolderActions.js +139 -0
  78. package/dist/admin/pages/Assets/components/FolderActions.js.map +1 -0
  79. package/dist/admin/pages/Assets/components/FolderActions.mjs +137 -0
  80. package/dist/admin/pages/Assets/components/FolderActions.mjs.map +1 -0
  81. package/dist/admin/pages/Assets/components/FolderActionsMenu.js +25 -119
  82. package/dist/admin/pages/Assets/components/FolderActionsMenu.js.map +1 -1
  83. package/dist/admin/pages/Assets/components/FolderActionsMenu.mjs +27 -121
  84. package/dist/admin/pages/Assets/components/FolderActionsMenu.mjs.map +1 -1
  85. package/dist/admin/pages/Assets/components/FolderContextMenu.js +67 -0
  86. package/dist/admin/pages/Assets/components/FolderContextMenu.js.map +1 -0
  87. package/dist/admin/pages/Assets/components/FolderContextMenu.mjs +65 -0
  88. package/dist/admin/pages/Assets/components/FolderContextMenu.mjs.map +1 -0
  89. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +139 -45
  90. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  91. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +140 -47
  92. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  93. package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.js +115 -0
  94. package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.js.map +1 -0
  95. package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.mjs +113 -0
  96. package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.mjs.map +1 -0
  97. package/dist/admin/pages/Assets/components/ItemContextMenu.js +125 -0
  98. package/dist/admin/pages/Assets/components/ItemContextMenu.js.map +1 -0
  99. package/dist/admin/pages/Assets/components/ItemContextMenu.mjs +122 -0
  100. package/dist/admin/pages/Assets/components/ItemContextMenu.mjs.map +1 -0
  101. package/dist/admin/pages/Assets/components/MainAreaContextMenu.js +88 -63
  102. package/dist/admin/pages/Assets/components/MainAreaContextMenu.js.map +1 -1
  103. package/dist/admin/pages/Assets/components/MainAreaContextMenu.mjs +88 -63
  104. package/dist/admin/pages/Assets/components/MainAreaContextMenu.mjs.map +1 -1
  105. package/dist/admin/pages/Assets/components/SelectionActions.js +111 -0
  106. package/dist/admin/pages/Assets/components/SelectionActions.js.map +1 -0
  107. package/dist/admin/pages/Assets/components/SelectionActions.mjs +109 -0
  108. package/dist/admin/pages/Assets/components/SelectionActions.mjs.map +1 -0
  109. package/dist/admin/pages/Assets/components/SelectionContextMenu.js +82 -0
  110. package/dist/admin/pages/Assets/components/SelectionContextMenu.js.map +1 -0
  111. package/dist/admin/pages/Assets/components/SelectionContextMenu.mjs +80 -0
  112. package/dist/admin/pages/Assets/components/SelectionContextMenu.mjs.map +1 -0
  113. package/dist/admin/pages/Assets/hooks/useAssetSelection.js +10 -0
  114. package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  115. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +10 -0
  116. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  117. package/dist/admin/pages/SettingsPage/SettingsPage.js +10 -3
  118. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  119. package/dist/admin/pages/SettingsPage/SettingsPage.mjs +10 -3
  120. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  121. package/dist/admin/services/api.js.map +1 -1
  122. package/dist/admin/services/api.mjs.map +1 -1
  123. package/dist/admin/src/hooks/useAIMetadataAvailability.d.ts +5 -0
  124. package/dist/admin/src/hooks/useAIMetadataEnabled.d.ts +5 -3
  125. package/dist/admin/src/hooks/useTracking.d.ts +0 -7
  126. package/dist/admin/src/legacy/components/EditAssetDialog/PreviewBox/PreviewComponents.d.ts +2 -2
  127. package/dist/admin/src/legacy/hooks/useAIMetadataAvailability.d.ts +5 -0
  128. package/dist/admin/src/legacy/hooks/useAIMetadataEnabled.d.ts +12 -0
  129. package/dist/admin/src/legacy/hooks/useSettings.d.ts +1 -0
  130. package/dist/admin/src/pages/Assets/components/ActionsMenuContent.d.ts +2 -2
  131. package/dist/admin/src/pages/Assets/components/AssetActions.d.ts +70 -0
  132. package/dist/admin/src/pages/Assets/components/AssetActionsMenu.d.ts +5 -14
  133. package/dist/admin/src/pages/Assets/components/AssetContextMenu.d.ts +27 -0
  134. package/dist/admin/src/pages/Assets/components/AssetDetails/useCropImg.d.ts +16 -0
  135. package/dist/admin/src/pages/Assets/components/CursorAnchoredMenu.d.ts +32 -0
  136. package/dist/admin/src/pages/Assets/components/FolderActions.d.ts +48 -0
  137. package/dist/admin/src/pages/Assets/components/FolderActionsMenu.d.ts +4 -8
  138. package/dist/admin/src/pages/Assets/components/FolderContextMenu.d.ts +21 -0
  139. package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +5 -1
  140. package/dist/admin/src/pages/Assets/components/FolderTree/FolderTreeRowMenu.d.ts +25 -0
  141. package/dist/admin/src/pages/Assets/components/ItemContextMenu.d.ts +53 -0
  142. package/dist/admin/src/pages/Assets/components/MainAreaContextMenu.d.ts +15 -1
  143. package/dist/admin/src/pages/Assets/components/SelectionActions.d.ts +40 -0
  144. package/dist/admin/src/pages/Assets/components/SelectionContextMenu.d.ts +25 -0
  145. package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +5 -0
  146. package/dist/admin/src/utils/mediaLibraryVersion.d.ts +18 -0
  147. package/dist/admin/translations/en.json.js +9 -3
  148. package/dist/admin/translations/en.json.js.map +1 -1
  149. package/dist/admin/translations/en.json.mjs +9 -3
  150. package/dist/admin/translations/en.json.mjs.map +1 -1
  151. package/dist/admin/utils/mediaLibraryVersion.js +24 -0
  152. package/dist/admin/utils/mediaLibraryVersion.js.map +1 -0
  153. package/dist/admin/utils/mediaLibraryVersion.mjs +20 -0
  154. package/dist/admin/utils/mediaLibraryVersion.mjs.map +1 -0
  155. package/dist/server/bootstrap.js +7 -0
  156. package/dist/server/bootstrap.js.map +1 -1
  157. package/dist/server/bootstrap.mjs +7 -0
  158. package/dist/server/bootstrap.mjs.map +1 -1
  159. package/dist/server/controllers/admin-file.js +2 -2
  160. package/dist/server/controllers/admin-file.js.map +1 -1
  161. package/dist/server/controllers/admin-file.mjs +2 -2
  162. package/dist/server/controllers/admin-file.mjs.map +1 -1
  163. package/dist/server/controllers/admin-folder-file.js +51 -4
  164. package/dist/server/controllers/admin-folder-file.js.map +1 -1
  165. package/dist/server/controllers/admin-folder-file.mjs +52 -5
  166. package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
  167. package/dist/server/controllers/admin-folder.js +5 -5
  168. package/dist/server/controllers/admin-folder.js.map +1 -1
  169. package/dist/server/controllers/admin-folder.mjs +5 -5
  170. package/dist/server/controllers/admin-folder.mjs.map +1 -1
  171. package/dist/server/controllers/admin-settings.js +2 -1
  172. package/dist/server/controllers/admin-settings.js.map +1 -1
  173. package/dist/server/controllers/admin-settings.mjs +2 -1
  174. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  175. package/dist/server/controllers/content-api.js +30 -7
  176. package/dist/server/controllers/content-api.js.map +1 -1
  177. package/dist/server/controllers/content-api.mjs +30 -7
  178. package/dist/server/controllers/content-api.mjs.map +1 -1
  179. package/dist/server/controllers/validation/admin/folder-file.js +4 -4
  180. package/dist/server/controllers/validation/admin/folder-file.js.map +1 -1
  181. package/dist/server/controllers/validation/admin/folder-file.mjs +2 -2
  182. package/dist/server/controllers/validation/admin/folder-file.mjs.map +1 -1
  183. package/dist/server/controllers/validation/admin/folder.js +3 -4
  184. package/dist/server/controllers/validation/admin/folder.js.map +1 -1
  185. package/dist/server/controllers/validation/admin/folder.mjs +3 -4
  186. package/dist/server/controllers/validation/admin/folder.mjs.map +1 -1
  187. package/dist/server/controllers/validation/admin/upload.js +1 -2
  188. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  189. package/dist/server/controllers/validation/admin/upload.mjs +1 -2
  190. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  191. package/dist/server/controllers/validation/admin/utils.js +1 -2
  192. package/dist/server/controllers/validation/admin/utils.js.map +1 -1
  193. package/dist/server/controllers/validation/admin/utils.mjs +1 -2
  194. package/dist/server/controllers/validation/admin/utils.mjs.map +1 -1
  195. package/dist/server/errors.js +12 -0
  196. package/dist/server/errors.js.map +1 -0
  197. package/dist/server/errors.mjs +10 -0
  198. package/dist/server/errors.mjs.map +1 -0
  199. package/dist/server/migrations/unsign-richtext-and-blocks-urls.js +2 -2
  200. package/dist/server/migrations/unsign-richtext-and-blocks-urls.js.map +1 -1
  201. package/dist/server/migrations/unsign-richtext-and-blocks-urls.mjs +1 -1
  202. package/dist/server/migrations/unsign-richtext-and-blocks-urls.mjs.map +1 -1
  203. package/dist/server/routes/content-api.js +3 -3
  204. package/dist/server/routes/content-api.js.map +1 -1
  205. package/dist/server/routes/content-api.mjs +3 -3
  206. package/dist/server/routes/content-api.mjs.map +1 -1
  207. package/dist/server/routes/validation/upload.js +8 -0
  208. package/dist/server/routes/validation/upload.js.map +1 -1
  209. package/dist/server/routes/validation/upload.mjs +8 -0
  210. package/dist/server/routes/validation/upload.mjs.map +1 -1
  211. package/dist/server/services/ai-metadata-provider.js +83 -0
  212. package/dist/server/services/ai-metadata-provider.js.map +1 -0
  213. package/dist/server/services/ai-metadata-provider.mjs +61 -0
  214. package/dist/server/services/ai-metadata-provider.mjs.map +1 -0
  215. package/dist/server/services/ai-metadata-strapi-managed.js +48 -0
  216. package/dist/server/services/ai-metadata-strapi-managed.js.map +1 -0
  217. package/dist/server/services/ai-metadata-strapi-managed.mjs +46 -0
  218. package/dist/server/services/ai-metadata-strapi-managed.mjs.map +1 -0
  219. package/dist/server/services/ai-metadata.js +5 -58
  220. package/dist/server/services/ai-metadata.js.map +1 -1
  221. package/dist/server/services/ai-metadata.mjs +6 -39
  222. package/dist/server/services/ai-metadata.mjs.map +1 -1
  223. package/dist/server/services/api-upload-folder.js +3 -3
  224. package/dist/server/services/api-upload-folder.js.map +1 -1
  225. package/dist/server/services/api-upload-folder.mjs +3 -3
  226. package/dist/server/services/api-upload-folder.mjs.map +1 -1
  227. package/dist/server/services/extensions/utils.js +19 -15
  228. package/dist/server/services/extensions/utils.js.map +1 -1
  229. package/dist/server/services/extensions/utils.mjs +19 -15
  230. package/dist/server/services/extensions/utils.mjs.map +1 -1
  231. package/dist/server/services/file.js +2 -2
  232. package/dist/server/services/file.js.map +1 -1
  233. package/dist/server/services/file.mjs +1 -1
  234. package/dist/server/services/file.mjs.map +1 -1
  235. package/dist/server/services/folder.js +9 -6
  236. package/dist/server/services/folder.js.map +1 -1
  237. package/dist/server/services/folder.mjs +9 -6
  238. package/dist/server/services/folder.mjs.map +1 -1
  239. package/dist/server/services/index.js +3 -1
  240. package/dist/server/services/index.js.map +1 -1
  241. package/dist/server/services/index.mjs +3 -1
  242. package/dist/server/services/index.mjs.map +1 -1
  243. package/dist/server/services/metrics.js +1 -1
  244. package/dist/server/services/metrics.js.map +1 -1
  245. package/dist/server/services/metrics.mjs +1 -1
  246. package/dist/server/services/metrics.mjs.map +1 -1
  247. package/dist/server/services/provider.js +3 -4
  248. package/dist/server/services/provider.js.map +1 -1
  249. package/dist/server/services/provider.mjs +3 -4
  250. package/dist/server/services/provider.mjs.map +1 -1
  251. package/dist/server/services/upload.js +5 -6
  252. package/dist/server/services/upload.js.map +1 -1
  253. package/dist/server/services/upload.mjs +4 -5
  254. package/dist/server/services/upload.mjs.map +1 -1
  255. package/dist/server/services/weekly-metrics.js +2 -2
  256. package/dist/server/services/weekly-metrics.js.map +1 -1
  257. package/dist/server/services/weekly-metrics.mjs +2 -2
  258. package/dist/server/services/weekly-metrics.mjs.map +1 -1
  259. package/dist/server/src/bootstrap.d.ts.map +1 -1
  260. package/dist/server/src/controllers/admin-folder-file.d.ts.map +1 -1
  261. package/dist/server/src/controllers/admin-folder.d.ts.map +1 -1
  262. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
  263. package/dist/server/src/controllers/content-api.d.ts.map +1 -1
  264. package/dist/server/src/controllers/validation/admin/folder.d.ts.map +1 -1
  265. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
  266. package/dist/server/src/controllers/validation/admin/utils.d.ts.map +1 -1
  267. package/dist/server/src/errors.d.ts +6 -0
  268. package/dist/server/src/errors.d.ts.map +1 -0
  269. package/dist/server/src/index.d.ts +6 -1
  270. package/dist/server/src/index.d.ts.map +1 -1
  271. package/dist/server/src/mcp/ambient-instance.d.ts +3 -1
  272. package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
  273. package/dist/server/src/routes/validation/upload.d.ts +4 -0
  274. package/dist/server/src/routes/validation/upload.d.ts.map +1 -1
  275. package/dist/server/src/services/ai-metadata-provider.d.ts +26 -0
  276. package/dist/server/src/services/ai-metadata-provider.d.ts.map +1 -0
  277. package/dist/server/src/services/ai-metadata-strapi-managed.d.ts +7 -0
  278. package/dist/server/src/services/ai-metadata-strapi-managed.d.ts.map +1 -0
  279. package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
  280. package/dist/server/src/services/extensions/utils.d.ts +33 -1
  281. package/dist/server/src/services/extensions/utils.d.ts.map +1 -1
  282. package/dist/server/src/services/folder.d.ts +5 -2
  283. package/dist/server/src/services/folder.d.ts.map +1 -1
  284. package/dist/server/src/services/index.d.ts +6 -1
  285. package/dist/server/src/services/index.d.ts.map +1 -1
  286. package/dist/server/src/services/provider.d.ts.map +1 -1
  287. package/dist/server/src/services/upload.d.ts.map +1 -1
  288. package/dist/server/src/utils/images.d.ts +2 -2
  289. package/dist/server/src/utils/images.d.ts.map +1 -1
  290. package/dist/server/src/utils/index.d.ts +2 -0
  291. package/dist/server/src/utils/index.d.ts.map +1 -1
  292. package/dist/server/utils/images.js +6 -7
  293. package/dist/server/utils/images.js.map +1 -1
  294. package/dist/server/utils/images.mjs +6 -7
  295. package/dist/server/utils/images.mjs.map +1 -1
  296. package/dist/server/utils/index.js.map +1 -1
  297. package/dist/server/utils/index.mjs.map +1 -1
  298. package/dist/shared/contracts/settings.d.ts +6 -0
  299. package/package.json +11 -11
  300. package/dist/admin/legacy/hooks/useAiAvailability.js +0 -22
  301. package/dist/admin/legacy/hooks/useAiAvailability.js.map +0 -1
  302. package/dist/admin/legacy/hooks/useAiAvailability.mjs +0 -20
  303. package/dist/admin/legacy/hooks/useAiAvailability.mjs.map +0 -1
  304. package/dist/admin/src/legacy/hooks/useAiAvailability.d.ts +0 -4
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { useState, useEffect, useCallback } from 'react';
2
+ import { useState, useEffect, useCallback, useRef } from 'react';
3
3
  import { SubNav } from '@strapi/admin/strapi-admin';
4
4
  import { Flex, Typography, Box, Loader, IconButton } from '@strapi/design-system';
5
5
  import { House, Folder, ChevronDown } from '@strapi/icons';
@@ -7,9 +7,11 @@ import { useIntl } from 'react-intl';
7
7
  import { css, styled } from 'styled-components';
8
8
  import { TruncatedText } from '../../../../components/TruncatedText.mjs';
9
9
  import { useGetFolderStructureQuery } from '../../../../services/folders.mjs';
10
+ import { isEventFromWithin } from '../../../../utils/isEventFromWithin.mjs';
10
11
  import { getTranslationKey } from '../../../../utils/translations.mjs';
11
12
  import { useAssetsDndOptional } from '../Dnd/AssetsDndProvider.mjs';
12
13
  import { useFolderTreeDroppable } from '../Dnd/useFolderTreeDroppable.mjs';
14
+ import { FolderTreeRowMenu } from './FolderTreeRowMenu.mjs';
13
15
  import { useSpringLoadedExpand } from './useSpringLoadedExpand.mjs';
14
16
 
15
17
  /* -------------------------------------------------------------------------------------------------
@@ -17,17 +19,19 @@ import { useSpringLoadedExpand } from './useSpringLoadedExpand.mjs';
17
19
  * -----------------------------------------------------------------------------------------------*/ const RowButton = styled.button`
18
20
  display: flex;
19
21
  align-items: center;
20
- gap: ${({ theme })=>theme.spaces[2]};
22
+ // Matches the row's own gap, so Home — the one row whose icon sits inside
23
+ // this button rather than beside it — puts its label on the same line as a
24
+ // folder's.
25
+ gap: ${({ theme })=>theme.spaces[1]};
21
26
  width: 100%;
22
27
  min-height: 3.2rem;
23
- padding: ${({ theme })=>`${theme.spaces[1]} ${theme.spaces[2]}`};
28
+ // No padding of its own: the row owns the inset, so the label lines up with
29
+ // the icon boxes instead of being pushed in by a second layer of spacing.
30
+ padding: 0;
24
31
  border: 0;
25
- background: ${({ $isActive, $isValidDropTarget, theme })=>{
26
- if ($isValidDropTarget) {
27
- return theme.colors.primary100;
28
- }
29
- return $isActive ? theme.colors.primary100 : 'transparent';
30
- }};
32
+ // The surface — hover, active, drop target — is painted by the row behind
33
+ // this, so it spans the chevron and the actions menu too, not just the label.
34
+ background: transparent;
31
35
  color: ${({ $isActive, theme })=>$isActive ? theme.colors.primary700 : theme.colors.neutral800};
32
36
  border-radius: ${({ theme })=>theme.borderRadius};
33
37
  cursor: ${({ $isMovePending, $isInvalidDropCursor })=>{
@@ -45,15 +49,6 @@ import { useSpringLoadedExpand } from './useSpringLoadedExpand.mjs';
45
49
  outline-offset: -1px;
46
50
  `}
47
51
 
48
- &:hover {
49
- background: ${({ $isActive, $isValidDropTarget, theme })=>{
50
- if ($isValidDropTarget) {
51
- return theme.colors.primary100;
52
- }
53
- return $isActive ? theme.colors.primary100 : theme.colors.neutral100;
54
- }};
55
- }
56
-
57
52
  &:focus-visible {
58
53
  outline: 2px solid ${({ theme })=>theme.colors.primary600};
59
54
  outline-offset: -2px;
@@ -68,11 +63,22 @@ const TreeRow = styled(Flex)`
68
63
  }};
69
64
  pointer-events: ${({ $isMovePending })=>$isMovePending ? 'none' : 'auto'};
70
65
  border-radius: ${({ theme })=>theme.borderRadius};
66
+ background: ${({ $isActive, theme })=>$isActive ? theme.colors.primary100 : 'transparent'};
67
+
68
+ // The whole row lights up, so pointing anywhere along it — chevron, label or
69
+ // the actions trigger — reads as one target.
70
+ &:hover {
71
+ background: ${({ $isActive, theme })=>$isActive ? theme.colors.primary100 : theme.colors.neutral100};
72
+ }
71
73
 
72
74
  ${({ $isValidDropTarget, theme })=>$isValidDropTarget && css`
73
75
  background: ${theme.colors.primary100};
74
76
  outline: 1px dashed ${theme.colors.primary600};
75
77
  outline-offset: -1px;
78
+
79
+ &:hover {
80
+ background: ${theme.colors.primary100};
81
+ }
76
82
  `}
77
83
  `;
78
84
  /* -------------------------------------------------------------------------------------------------
@@ -176,12 +182,46 @@ const useExpandedFolders = (folderStructure, currentFolderId)=>{
176
182
  /* -------------------------------------------------------------------------------------------------
177
183
  * FolderTreeItem — single tree row (internal)
178
184
  * -----------------------------------------------------------------------------------------------*/ const INDENT_PER_LEVEL_REM = 1.6;
185
+ /**
186
+ * Breathing room between the row's highlight and the controls at either end.
187
+ * Asymmetric on purpose: the chevron reads as part of the indent, while the
188
+ * actions trigger sits closer to the edge so it stays out of the name's way.
189
+ */ const ROW_INSET_LEFT_REM = 0.8;
190
+ const ROW_INSET_RIGHT_REM = 0.4;
191
+ /**
192
+ * Every icon in the rail occupies the same 24px box, whether or not it is a
193
+ * control: the chevron and the actions trigger are buttons, the home and folder
194
+ * marks are not. Sizing the box rather than the glyph is what keeps the labels
195
+ * on one vertical line across rows that mix the two.
196
+ */ const IconSlot = styled(Flex)`
197
+ width: 2.4rem;
198
+ height: 2.4rem;
199
+ min-width: 2.4rem;
200
+ flex-shrink: 0;
201
+ align-items: center;
202
+ justify-content: center;
203
+ `;
179
204
  /**
180
205
  * A leaf's chevron is present only to keep the folder names aligned, so it
181
206
  * should read as absent. The design system's disabled state is built for real
182
207
  * controls — a filled, bordered pill — which draws more attention than the
183
208
  * enabled chevron next to it. Doubled selector to outrank that rule.
184
209
  */ const ChevronButton = styled(IconButton)`
210
+ // Square, so it and the actions trigger read as one pair of controls.
211
+ && {
212
+ width: 2.4rem;
213
+ height: 2.4rem;
214
+ min-width: 2.4rem;
215
+ min-height: 2.4rem;
216
+ padding: 0.4rem;
217
+ }
218
+
219
+ // The row paints its own hover, so the control needs a stronger one of its own
220
+ // to read as a separate target sitting on top of it.
221
+ &&:hover:not([aria-disabled='true']) {
222
+ background: ${({ theme })=>theme.colors.primary200};
223
+ }
224
+
185
225
  &&[aria-disabled='true'] {
186
226
  background: transparent;
187
227
  border-color: transparent;
@@ -192,10 +232,13 @@ const RotatingChevron = styled(ChevronDown)`
192
232
  transform: rotate(${({ $expanded })=>$expanded ? '0deg' : '-90deg'});
193
233
  transition: transform 0.2s ease;
194
234
  `;
195
- const FolderTreeItemInner = ({ id, name, folderChildren, level, currentFolderId, showActiveFolder, isExpanded, onToggle, onExpand, onSelect, isMovePending })=>{
235
+ const FolderTreeItemInner = ({ id, name, parentId, folderChildren, level, currentFolderId, showActiveFolder, isExpanded, onToggle, onExpand, onSelect, isMovePending })=>{
196
236
  const { formatMessage } = useIntl();
197
237
  const hasChildren = folderChildren.length > 0;
198
- const isFolderExpanded = isExpanded(id);
238
+ // A folder keeps its entry in the expanded set after its last subfolder is
239
+ // moved away, so "expanded" has to mean "expanded *and* still has something to
240
+ // show" — otherwise the chevron stays rotated on what is now a leaf.
241
+ const isFolderExpanded = isExpanded(id) && hasChildren;
199
242
  const isActive = showActiveFolder && currentFolderId === id;
200
243
  const { droppable: { setNodeRef }, isOver, showValidDropHighlight, showInvalidDropCursor } = useFolderTreeDroppable({
201
244
  id,
@@ -205,6 +248,10 @@ const FolderTreeItemInner = ({ id, name, folderChildren, level, currentFolderId,
205
248
  id,
206
249
  onExpand
207
250
  ]);
251
+ // Tree rows carry no selection, so a right-click always means "this folder" —
252
+ // none of the list's selection rules apply here.
253
+ const [menuPosition, setMenuPosition] = useState(null);
254
+ const rowButtonRef = useRef(null);
208
255
  useSpringLoadedExpand({
209
256
  isOver,
210
257
  canExpand: hasChildren && !isFolderExpanded,
@@ -216,12 +263,27 @@ const FolderTreeItemInner = ({ id, name, folderChildren, level, currentFolderId,
216
263
  children: [
217
264
  /*#__PURE__*/ jsxs(TreeRow, {
218
265
  ref: setNodeRef,
266
+ "data-native-context-menu": true,
219
267
  alignItems: "center",
220
- paddingLeft: `${level * INDENT_PER_LEVEL_REM}rem`,
268
+ // Indent plus the row's own inset, so the chevron never sits flush
269
+ // against the edge of the highlight at any depth.
270
+ paddingLeft: `${level * INDENT_PER_LEVEL_REM + ROW_INSET_LEFT_REM}rem`,
271
+ paddingRight: `${ROW_INSET_RIGHT_REM}rem`,
221
272
  gap: 1,
273
+ $isActive: isActive,
222
274
  $isValidDropTarget: showValidDropHighlight,
223
275
  $isInvalidDropCursor: showInvalidDropCursor,
224
276
  $isMovePending: isMovePending,
277
+ onContextMenu: (event)=>{
278
+ if (!isEventFromWithin(event)) {
279
+ return;
280
+ }
281
+ event.preventDefault();
282
+ setMenuPosition({
283
+ x: event.clientX,
284
+ y: event.clientY
285
+ });
286
+ },
225
287
  children: [
226
288
  /*#__PURE__*/ jsx(ChevronButton, {
227
289
  label: hasChildren ? formatMessage({
@@ -252,6 +314,7 @@ const FolderTreeItemInner = ({ id, name, folderChildren, level, currentFolderId,
252
314
  flex: "1",
253
315
  minWidth: 0,
254
316
  children: /*#__PURE__*/ jsx(RowButton, {
317
+ ref: rowButtonRef,
255
318
  type: "button",
256
319
  $isActive: isActive,
257
320
  $isValidDropTarget: showValidDropHighlight,
@@ -267,12 +330,23 @@ const FolderTreeItemInner = ({ id, name, folderChildren, level, currentFolderId,
267
330
  children: name
268
331
  })
269
332
  })
333
+ }),
334
+ /*#__PURE__*/ jsx(FolderTreeRowMenu, {
335
+ folder: {
336
+ id,
337
+ name
338
+ },
339
+ parentId: parentId,
340
+ menuPosition: menuPosition,
341
+ returnFocusTo: rowButtonRef.current,
342
+ onCloseMenu: ()=>setMenuPosition(null)
270
343
  })
271
344
  ]
272
345
  }),
273
346
  hasChildren && isFolderExpanded && /*#__PURE__*/ jsx(NavList, {
274
347
  children: folderChildren.map((child)=>/*#__PURE__*/ jsx(FolderTreeItem, {
275
348
  node: child,
349
+ parentId: id,
276
350
  level: level + 1,
277
351
  currentFolderId: currentFolderId,
278
352
  showActiveFolder: showActiveFolder,
@@ -297,6 +371,7 @@ const FolderTreeItem = ({ node, ...props })=>{
297
371
  folderChildren: node.children ?? []
298
372
  });
299
373
  };
374
+ const FOLDER_TREE_ROOT_SELECTOR = '[data-folder-tree-root]';
300
375
  /**
301
376
  * Left-rail navigation for the Media Library. Fetches folder structure internally
302
377
  * and renders:
@@ -313,7 +388,7 @@ const FolderTreeItem = ({ node, ...props })=>{
313
388
  * Presentational with respect to routing — navigation is delegated to the parent
314
389
  * via `onSelectFolder` so the URL stays the single source of truth (see
315
390
  * `useFolderNavigation`).
316
- */ const FolderTree = ({ currentFolderId, showActiveFolder = true, onSelectFolder })=>{
391
+ */ const FolderTree = ({ currentFolderId, showActiveFolder = true, onSelectFolder, backgroundContextMenu })=>{
317
392
  const { formatMessage } = useIntl();
318
393
  const { data: folderStructure = [], isLoading, isError } = useGetFolderStructureQuery();
319
394
  const { isExpanded, toggleExpanded, expandFolder } = useExpandedFolders(folderStructure, currentFolderId);
@@ -330,11 +405,13 @@ const FolderTreeItem = ({ node, ...props })=>{
330
405
  name: homeLabel
331
406
  });
332
407
  return /*#__PURE__*/ jsxs(SubNav.Main, {
408
+ "data-folder-tree-root": true,
333
409
  "aria-label": formatMessage({
334
410
  id: getTranslationKey('sidebar.tree.aria-label'),
335
411
  defaultMessage: 'Media library folders'
336
412
  }),
337
413
  children: [
414
+ backgroundContextMenu,
338
415
  /*#__PURE__*/ jsx(SubNav.Header, {
339
416
  label: formatMessage({
340
417
  id: getTranslationKey('sidebar.title'),
@@ -345,31 +422,44 @@ const FolderTreeItem = ({ node, ...props })=>{
345
422
  children: /*#__PURE__*/ jsxs(Flex, {
346
423
  direction: "column",
347
424
  alignItems: "stretch",
348
- gap: 1,
349
425
  padding: 3,
350
426
  children: [
351
- /*#__PURE__*/ jsxs(RowButton, {
427
+ /*#__PURE__*/ jsx(TreeRow, {
352
428
  ref: setHomeDropRef,
353
- type: "button",
429
+ "data-native-context-menu": true,
430
+ alignItems: "center",
431
+ // Level 0, so the indent contributes nothing — but the row's own
432
+ // inset still applies, exactly as it does for a top-level folder.
433
+ paddingLeft: `${ROW_INSET_LEFT_REM}rem`,
434
+ paddingRight: `${ROW_INSET_RIGHT_REM}rem`,
354
435
  $isActive: isHomeActive,
355
436
  $isValidDropTarget: showHomeValidDropHighlight,
356
437
  $isInvalidDropCursor: showHomeInvalidDropCursor,
357
438
  $isMovePending: isMovePending,
358
- "aria-current": isHomeActive ? 'page' : undefined,
359
- onClick: ()=>onSelectFolder(null),
360
- "data-testid": "folder-tree-home",
361
- children: [
362
- /*#__PURE__*/ jsx(House, {
363
- "aria-hidden": true,
364
- width: "1.6rem",
365
- height: "1.6rem"
366
- }),
367
- /*#__PURE__*/ jsx(Typography, {
368
- variant: "omega",
369
- fontWeight: isHomeActive ? 'semiBold' : 'regular',
370
- children: homeLabel
371
- })
372
- ]
439
+ children: /*#__PURE__*/ jsxs(RowButton, {
440
+ type: "button",
441
+ $isActive: isHomeActive,
442
+ $isValidDropTarget: showHomeValidDropHighlight,
443
+ $isInvalidDropCursor: showHomeInvalidDropCursor,
444
+ $isMovePending: isMovePending,
445
+ "aria-current": isHomeActive ? 'page' : undefined,
446
+ onClick: ()=>onSelectFolder(null),
447
+ "data-testid": "folder-tree-home",
448
+ children: [
449
+ /*#__PURE__*/ jsx(IconSlot, {
450
+ children: /*#__PURE__*/ jsx(House, {
451
+ "aria-hidden": true,
452
+ width: "1.6rem",
453
+ height: "1.6rem"
454
+ })
455
+ }),
456
+ /*#__PURE__*/ jsx(Typography, {
457
+ variant: "omega",
458
+ fontWeight: isHomeActive ? 'semiBold' : 'regular',
459
+ children: homeLabel
460
+ })
461
+ ]
462
+ })
373
463
  }),
374
464
  /*#__PURE__*/ jsxs(Box, {
375
465
  marginTop: 4,
@@ -381,13 +471,14 @@ const FolderTreeItem = ({ node, ...props })=>{
381
471
  paddingBottom: 1,
382
472
  paddingLeft: 2,
383
473
  paddingRight: 2,
384
- marginBottom: 2,
385
474
  children: [
386
- /*#__PURE__*/ jsx(Folder, {
387
- "aria-hidden": true,
388
- width: "1.6rem",
389
- height: "1.6rem",
390
- fill: "neutral500"
475
+ /*#__PURE__*/ jsx(IconSlot, {
476
+ children: /*#__PURE__*/ jsx(Folder, {
477
+ "aria-hidden": true,
478
+ width: "1.6rem",
479
+ height: "1.6rem",
480
+ fill: "neutral500"
481
+ })
391
482
  }),
392
483
  /*#__PURE__*/ jsx(Typography, {
393
484
  variant: "sigma",
@@ -440,6 +531,8 @@ const FolderTreeItem = ({ node, ...props })=>{
440
531
  }) : /*#__PURE__*/ jsx(NavList, {
441
532
  children: folderStructure.map((node)=>/*#__PURE__*/ jsx(FolderTreeItem, {
442
533
  node: node,
534
+ // Top of the tree — these sit at the library root.
535
+ parentId: null,
443
536
  level: 0,
444
537
  currentFolderId: currentFolderId,
445
538
  showActiveFolder: showActiveFolder,
@@ -459,5 +552,5 @@ const FolderTreeItem = ({ node, ...props })=>{
459
552
  });
460
553
  };
461
554
 
462
- export { FolderTree };
555
+ export { FOLDER_TREE_ROOT_SELECTOR, FolderTree };
463
556
  //# sourceMappingURL=FolderTree.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"FolderTree.mjs","sources":["../../../../../../admin/src/pages/Assets/components/FolderTree/FolderTree.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\n\nimport { SubNav } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, IconButton, Loader, 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 { TruncatedText } from '../../../../components/TruncatedText';\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 * NavList — unstyled list for tree rows\n * -----------------------------------------------------------------------------------------------*/\n\nconst NavList = styled.ul`\n list-style: none;\n margin: 0;\n padding: 0;\n\n /* Grid rather than block, and load-bearing despite rendering a single column:\n a minmax(0, 1fr) track contributes a minimum of 0, which is what stops each\n row propagating the min-content width of its own label.\n\n Folder names ellipsize, and text-overflow needs white-space: nowrap — so a\n label's min-content width is the entire name, and no box lays out narrower\n than its min-content. In block flow that floor travels up to the SubNav\n ScrollArea, which widens the rail and shows a horizontal scrollbar instead of\n truncating the name. Nesting makes it worse: the indent is spent before the\n label is measured, so shorter names trigger it the deeper you go.\n\n Measured in Chromium — dropping either declaration brings the scrollbar\n back, and neither min-width nor overflow on the row is a substitute. */\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderTreeItem — single tree row (internal)\n * -----------------------------------------------------------------------------------------------*/\n\nconst INDENT_PER_LEVEL_REM = 1.6;\n\n/**\n * A leaf's chevron is present only to keep the folder names aligned, so it\n * should read as absent. The design system's disabled state is built for real\n * controls — a filled, bordered pill — which draws more attention than the\n * enabled chevron next to it. Doubled selector to outrank that rule.\n */\nconst ChevronButton = styled(IconButton)`\n &&[aria-disabled='true'] {\n background: transparent;\n border-color: transparent;\n opacity: 0.3;\n }\n`;\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 showActiveFolder: boolean;\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 showActiveFolder,\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 = showActiveFolder && 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 <ChevronButton\n label={\n hasChildren\n ? 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 : formatMessage(\n {\n id: getTranslationKey('sidebar.tree.no-subfolders'),\n defaultMessage: 'The folder {name} has no subfolders',\n },\n { name }\n )\n }\n disabled={!hasChildren}\n onClick={(event: React.MouseEvent) => {\n event.stopPropagation();\n onToggle(id);\n }}\n variant=\"ghost\"\n withTooltip={false}\n aria-expanded={hasChildren ? isFolderExpanded : undefined}\n >\n <RotatingChevron $expanded={isFolderExpanded} fill=\"neutral500\" />\n </ChevronButton>\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 <TruncatedText variant=\"omega\" fontWeight={isActive ? 'semiBold' : 'regular'}>\n {name}\n </TruncatedText>\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 showActiveFolder={showActiveFolder}\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\ninterface FolderTreeProps {\n currentFolderId: number | null;\n /**\n * Set to `false` while a global asset search is active: the results span the\n * whole library, so highlighting one folder would misrepresent them.\n * */\n showActiveFolder?: boolean;\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 filter input that prunes the tree to matching destinations\n * 3. A \"Home\" entry that clears the folder query param\n * 4. A \"FOLDERS\" section header\n * 5. The folder tree itself\n *\n * The filter is purely local: it never touches the URL and never affects the\n * asset list, which has its own independent search in the content toolbar.\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 = ({\n currentFolderId,\n showActiveFolder = true,\n onSelectFolder,\n}: 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 = showActiveFolder && 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 <SubNav.Main\n aria-label={formatMessage({\n id: getTranslationKey('sidebar.tree.aria-label'),\n defaultMessage: 'Media library folders',\n })}\n >\n <SubNav.Header\n label={formatMessage({\n id: getTranslationKey('sidebar.title'),\n defaultMessage: 'Media library',\n })}\n />\n\n <SubNav.Content>\n <Flex 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 showActiveFolder={showActiveFolder}\n isExpanded={isExpanded}\n onToggle={toggleExpanded}\n onExpand={expandFolder}\n onSelect={onSelectFolder}\n isMovePending={isMovePending}\n />\n ))}\n </NavList>\n )}\n </Box>\n </Flex>\n </SubNav.Content>\n </SubNav.Main>\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","NavList","ul","INDENT_PER_LEVEL_REM","ChevronButton","IconButton","RotatingChevron","ChevronDown","$expanded","FolderTreeItemInner","name","folderChildren","level","showActiveFolder","onToggle","onExpand","onSelect","isMovePending","formatMessage","useIntl","hasChildren","isFolderExpanded","isActive","droppable","setNodeRef","isOver","showValidDropHighlight","showInvalidDropCursor","useFolderTreeDroppable","handleExpand","useSpringLoadedExpand","canExpand","_jsxs","li","ref","alignItems","paddingLeft","gap","_jsx","label","getTranslationKey","defaultMessage","disabled","onClick","event","stopPropagation","variant","withTooltip","aria-expanded","undefined","fill","Box","flex","minWidth","type","aria-current","data-testid","data-folder-id","TruncatedText","fontWeight","map","child","FolderTreeItem","props","FolderTree","onSelectFolder","data","isLoading","isError","useGetFolderStructureQuery","useAssetsDndOptional","isHomeActive","homeLabel","setHomeDropRef","showHomeValidDropHighlight","showHomeInvalidDropCursor","SubNav","Main","aria-label","Header","Content","direction","padding","House","aria-hidden","width","height","Typography","marginTop","paddingTop","paddingBottom","paddingRight","marginBottom","FolderIcon","textColor","style","textTransform","justifyContent","Loader"],"mappings":"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"}
1
+ {"version":3,"file":"FolderTree.mjs","sources":["../../../../../../admin/src/pages/Assets/components/FolderTree/FolderTree.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState, type ReactNode } from 'react';\n\nimport { SubNav } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, IconButton, Loader, 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 { TruncatedText } from '../../../../components/TruncatedText';\nimport { useGetFolderStructureQuery } from '../../../../services/folders';\nimport { isEventFromWithin } from '../../../../utils/isEventFromWithin';\nimport { getTranslationKey } from '../../../../utils/translations';\nimport { useAssetsDndOptional } from '../Dnd/AssetsDndProvider';\nimport { useFolderTreeDroppable } from '../Dnd/useFolderTreeDroppable';\n\nimport { FolderTreeRowMenu } from './FolderTreeRowMenu';\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 // Matches the row's own gap, so Home — the one row whose icon sits inside\n // this button rather than beside it — puts its label on the same line as a\n // folder's.\n gap: ${({ theme }) => theme.spaces[1]};\n width: 100%;\n min-height: 3.2rem;\n // No padding of its own: the row owns the inset, so the label lines up with\n // the icon boxes instead of being pushed in by a second layer of spacing.\n padding: 0;\n border: 0;\n // The surface — hover, active, drop target — is painted by the row behind\n // this, so it spans the chevron and the actions menu too, not just the label.\n background: transparent;\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 &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n`;\n\nconst TreeRow = styled(Flex)<{\n $isActive?: boolean;\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 background: ${({ $isActive, theme }) => ($isActive ? theme.colors.primary100 : 'transparent')};\n\n // The whole row lights up, so pointing anywhere along it — chevron, label or\n // the actions trigger — reads as one target.\n &:hover {\n background: ${({ $isActive, theme }) =>\n $isActive ? theme.colors.primary100 : theme.colors.neutral100};\n }\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 &:hover {\n background: ${theme.colors.primary100};\n }\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 * NavList — unstyled list for tree rows\n * -----------------------------------------------------------------------------------------------*/\n\nconst NavList = styled.ul`\n list-style: none;\n margin: 0;\n padding: 0;\n\n /* Grid rather than block, and load-bearing despite rendering a single column:\n a minmax(0, 1fr) track contributes a minimum of 0, which is what stops each\n row propagating the min-content width of its own label.\n\n Folder names ellipsize, and text-overflow needs white-space: nowrap — so a\n label's min-content width is the entire name, and no box lays out narrower\n than its min-content. In block flow that floor travels up to the SubNav\n ScrollArea, which widens the rail and shows a horizontal scrollbar instead of\n truncating the name. Nesting makes it worse: the indent is spent before the\n label is measured, so shorter names trigger it the deeper you go.\n\n Measured in Chromium — dropping either declaration brings the scrollbar\n back, and neither min-width nor overflow on the row is a substitute. */\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderTreeItem — single tree row (internal)\n * -----------------------------------------------------------------------------------------------*/\n\nconst INDENT_PER_LEVEL_REM = 1.6;\n\n/**\n * Breathing room between the row's highlight and the controls at either end.\n * Asymmetric on purpose: the chevron reads as part of the indent, while the\n * actions trigger sits closer to the edge so it stays out of the name's way.\n */\nconst ROW_INSET_LEFT_REM = 0.8;\nconst ROW_INSET_RIGHT_REM = 0.4;\n\n/**\n * Every icon in the rail occupies the same 24px box, whether or not it is a\n * control: the chevron and the actions trigger are buttons, the home and folder\n * marks are not. Sizing the box rather than the glyph is what keeps the labels\n * on one vertical line across rows that mix the two.\n */\nconst IconSlot = styled(Flex)`\n width: 2.4rem;\n height: 2.4rem;\n min-width: 2.4rem;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n`;\n\n/**\n * A leaf's chevron is present only to keep the folder names aligned, so it\n * should read as absent. The design system's disabled state is built for real\n * controls — a filled, bordered pill — which draws more attention than the\n * enabled chevron next to it. Doubled selector to outrank that rule.\n */\nconst ChevronButton = styled(IconButton)`\n // Square, so it and the actions trigger read as one pair of controls.\n && {\n width: 2.4rem;\n height: 2.4rem;\n min-width: 2.4rem;\n min-height: 2.4rem;\n padding: 0.4rem;\n }\n\n // The row paints its own hover, so the control needs a stronger one of its own\n // to read as a separate target sitting on top of it.\n &&:hover:not([aria-disabled='true']) {\n background: ${({ theme }) => theme.colors.primary200};\n }\n\n &&[aria-disabled='true'] {\n background: transparent;\n border-color: transparent;\n opacity: 0.3;\n }\n`;\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 /** Its parent's id, so the actions can validate a move against the real parent. */\n parentId: number | null;\n level: number;\n currentFolderId: number | null;\n showActiveFolder: boolean;\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 parentId,\n folderChildren,\n level,\n currentFolderId,\n showActiveFolder,\n isExpanded,\n onToggle,\n onExpand,\n onSelect,\n isMovePending,\n}: FolderTreeItemInnerProps) => {\n const { formatMessage } = useIntl();\n const hasChildren = folderChildren.length > 0;\n // A folder keeps its entry in the expanded set after its last subfolder is\n // moved away, so \"expanded\" has to mean \"expanded *and* still has something to\n // show\" — otherwise the chevron stays rotated on what is now a leaf.\n const isFolderExpanded = isExpanded(id) && hasChildren;\n const isActive = showActiveFolder && 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 // Tree rows carry no selection, so a right-click always means \"this folder\" —\n // none of the list's selection rules apply here.\n const [menuPosition, setMenuPosition] = useState<{ x: number; y: number } | null>(null);\n const rowButtonRef = useRef<HTMLButtonElement>(null);\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 data-native-context-menu\n alignItems=\"center\"\n // Indent plus the row's own inset, so the chevron never sits flush\n // against the edge of the highlight at any depth.\n paddingLeft={`${level * INDENT_PER_LEVEL_REM + ROW_INSET_LEFT_REM}rem`}\n paddingRight={`${ROW_INSET_RIGHT_REM}rem`}\n gap={1}\n $isActive={isActive}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropCursor={showInvalidDropCursor}\n $isMovePending={isMovePending}\n onContextMenu={(event: React.MouseEvent) => {\n if (!isEventFromWithin(event)) {\n return;\n }\n\n event.preventDefault();\n setMenuPosition({ x: event.clientX, y: event.clientY });\n }}\n >\n <ChevronButton\n label={\n hasChildren\n ? 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 : formatMessage(\n {\n id: getTranslationKey('sidebar.tree.no-subfolders'),\n defaultMessage: 'The folder {name} has no subfolders',\n },\n { name }\n )\n }\n disabled={!hasChildren}\n onClick={(event: React.MouseEvent) => {\n event.stopPropagation();\n onToggle(id);\n }}\n variant=\"ghost\"\n withTooltip={false}\n aria-expanded={hasChildren ? isFolderExpanded : undefined}\n >\n <RotatingChevron $expanded={isFolderExpanded} fill=\"neutral500\" />\n </ChevronButton>\n\n <Box flex=\"1\" minWidth={0}>\n <RowButton\n ref={rowButtonRef}\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 <TruncatedText variant=\"omega\" fontWeight={isActive ? 'semiBold' : 'regular'}>\n {name}\n </TruncatedText>\n </RowButton>\n </Box>\n\n <FolderTreeRowMenu\n folder={{ id, name }}\n parentId={parentId}\n menuPosition={menuPosition}\n returnFocusTo={rowButtonRef.current}\n onCloseMenu={() => setMenuPosition(null)}\n />\n </TreeRow>\n\n {hasChildren && isFolderExpanded && (\n <NavList>\n {folderChildren.map((child) => (\n <FolderTreeItem\n key={child.id ?? child.name}\n node={child}\n parentId={id}\n level={level + 1}\n currentFolderId={currentFolderId}\n showActiveFolder={showActiveFolder}\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\ninterface FolderTreeProps {\n currentFolderId: number | null;\n /**\n * Set to `false` while a global asset search is active: the results span the\n * whole library, so highlighting one folder would misrepresent them.\n * */\n showActiveFolder?: boolean;\n onSelectFolder: (folderId: number | null) => void;\n /** Rendered inside the sidebar, which it can listen on through `FOLDER_TREE_ROOT_SELECTOR`. */\n backgroundContextMenu?: ReactNode;\n}\n\nexport const FOLDER_TREE_ROOT_SELECTOR = '[data-folder-tree-root]';\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 filter input that prunes the tree to matching destinations\n * 3. A \"Home\" entry that clears the folder query param\n * 4. A \"FOLDERS\" section header\n * 5. The folder tree itself\n *\n * The filter is purely local: it never touches the URL and never affects the\n * asset list, which has its own independent search in the content toolbar.\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 = ({\n currentFolderId,\n showActiveFolder = true,\n onSelectFolder,\n backgroundContextMenu,\n}: 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 = showActiveFolder && 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 <SubNav.Main\n data-folder-tree-root\n aria-label={formatMessage({\n id: getTranslationKey('sidebar.tree.aria-label'),\n defaultMessage: 'Media library folders',\n })}\n >\n {backgroundContextMenu}\n <SubNav.Header\n label={formatMessage({\n id: getTranslationKey('sidebar.title'),\n defaultMessage: 'Media library',\n })}\n />\n\n <SubNav.Content>\n <Flex direction=\"column\" alignItems=\"stretch\" padding={3}>\n {/* Same row wrapper as a folder, so Home highlights across its whole\n width rather than only behind the label. */}\n <TreeRow\n ref={setHomeDropRef}\n data-native-context-menu\n alignItems=\"center\"\n // Level 0, so the indent contributes nothing — but the row's own\n // inset still applies, exactly as it does for a top-level folder.\n paddingLeft={`${ROW_INSET_LEFT_REM}rem`}\n paddingRight={`${ROW_INSET_RIGHT_REM}rem`}\n $isActive={isHomeActive}\n $isValidDropTarget={showHomeValidDropHighlight}\n $isInvalidDropCursor={showHomeInvalidDropCursor}\n $isMovePending={isMovePending}\n >\n <RowButton\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 <IconSlot>\n <House aria-hidden width=\"1.6rem\" height=\"1.6rem\" />\n </IconSlot>\n <Typography variant=\"omega\" fontWeight={isHomeActive ? 'semiBold' : 'regular'}>\n {homeLabel}\n </Typography>\n </RowButton>\n </TreeRow>\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 >\n <IconSlot>\n <FolderIcon aria-hidden width=\"1.6rem\" height=\"1.6rem\" fill=\"neutral500\" />\n </IconSlot>\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 // Top of the tree — these sit at the library root.\n parentId={null}\n level={0}\n currentFolderId={currentFolderId}\n showActiveFolder={showActiveFolder}\n isExpanded={isExpanded}\n onToggle={toggleExpanded}\n onExpand={expandFolder}\n onSelect={onSelectFolder}\n isMovePending={isMovePending}\n />\n ))}\n </NavList>\n )}\n </Box>\n </Flex>\n </SubNav.Content>\n </SubNav.Main>\n );\n};\n"],"names":["RowButton","styled","button","theme","spaces","$isActive","colors","primary700","neutral800","borderRadius","$isMovePending","$isInvalidDropCursor","$isValidDropTarget","css","primary600","TreeRow","Flex","primary100","neutral100","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","NavList","ul","INDENT_PER_LEVEL_REM","ROW_INSET_LEFT_REM","ROW_INSET_RIGHT_REM","IconSlot","ChevronButton","IconButton","primary200","RotatingChevron","ChevronDown","$expanded","FolderTreeItemInner","name","parentId","folderChildren","level","showActiveFolder","onToggle","onExpand","onSelect","isMovePending","formatMessage","useIntl","hasChildren","isFolderExpanded","isActive","droppable","setNodeRef","isOver","showValidDropHighlight","showInvalidDropCursor","useFolderTreeDroppable","handleExpand","menuPosition","setMenuPosition","rowButtonRef","useRef","useSpringLoadedExpand","canExpand","_jsxs","li","ref","data-native-context-menu","alignItems","paddingLeft","paddingRight","gap","onContextMenu","event","isEventFromWithin","preventDefault","x","clientX","y","clientY","_jsx","label","getTranslationKey","defaultMessage","disabled","onClick","stopPropagation","variant","withTooltip","aria-expanded","undefined","fill","Box","flex","minWidth","type","aria-current","data-testid","data-folder-id","TruncatedText","fontWeight","FolderTreeRowMenu","folder","returnFocusTo","current","onCloseMenu","map","child","FolderTreeItem","props","FOLDER_TREE_ROOT_SELECTOR","FolderTree","onSelectFolder","backgroundContextMenu","data","isLoading","isError","useGetFolderStructureQuery","useAssetsDndOptional","isHomeActive","homeLabel","setHomeDropRef","showHomeValidDropHighlight","showHomeInvalidDropCursor","SubNav","Main","data-folder-tree-root","aria-label","Header","Content","direction","padding","House","aria-hidden","width","height","Typography","marginTop","paddingTop","paddingBottom","FolderIcon","textColor","style","textTransform","justifyContent","Loader"],"mappings":"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"}
@@ -0,0 +1,115 @@
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
+ var ActionsMenuContent = require('../ActionsMenuContent.js');
10
+ var CursorAnchoredMenu = require('../CursorAnchoredMenu.js');
11
+ var FolderActions = require('../FolderActions.js');
12
+
13
+ /**
14
+ * Hidden until the row is hovered or something inside it has focus, so the tree
15
+ * stays quiet at rest. Wraps the trigger rather than styling it: `Menu.Trigger`
16
+ * types its `tag` against the design system's own component, which a styled
17
+ * wrapper of it no longer satisfies.
18
+ *
19
+ * `:focus-within` keeps it on screen while its own menu is open, since the
20
+ * trigger holds focus for as long as the menu does.
21
+ */ const MenuSlot = styledComponents.styled.div`
22
+ opacity: 0;
23
+
24
+ li:hover > div > &,
25
+ &:focus-within,
26
+ &:has([data-state='open']) {
27
+ opacity: 1;
28
+ }
29
+
30
+ // Square, matching the chevron at the other end of the row. Descendant rather
31
+ // than child: Menu.Root renders no element today, but that is Radix's
32
+ // business, not something to depend on.
33
+ && button {
34
+ width: 2.4rem;
35
+ height: 2.4rem;
36
+ min-width: 2.4rem;
37
+ min-height: 2.4rem;
38
+ padding: 0.4rem;
39
+ }
40
+
41
+ // The row paints its own hover, so the trigger needs a stronger one of its own
42
+ // to read as a separate target sitting on top of it.
43
+ && button:hover,
44
+ && button[data-state='open'] {
45
+ background: ${({ theme })=>theme.colors.primary200};
46
+ }
47
+ `;
48
+ /**
49
+ * Folder actions on a tree row, from either the `•••` or a right-click.
50
+ *
51
+ * Both render the same `FolderActions`, minus Rename — renaming is a list
52
+ * affordance and the tree does not offer it. Unlike the list, a tree row has no
53
+ * selection, so a right-click always means the row it landed on.
54
+ *
55
+ * One `FolderActions` serves both triggers here rather than two instances, so
56
+ * the dialogs it owns are not duplicated per row.
57
+ */ const FolderTreeRowMenu = ({ folder, parentId, menuPosition, returnFocusTo, onCloseMenu })=>{
58
+ const { formatMessage } = reactIntl.useIntl();
59
+ return /*#__PURE__*/ jsxRuntime.jsx(FolderActions.FolderActions, {
60
+ folder: folder,
61
+ dragData: {
62
+ kind: 'folder',
63
+ id: folder.id,
64
+ name: folder.name,
65
+ parentId
66
+ },
67
+ showRename: false,
68
+ children: ({ items, dialogs })=>/*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
69
+ children: [
70
+ /*#__PURE__*/ jsxRuntime.jsx(MenuSlot, {
71
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Root, {
72
+ modal: false,
73
+ children: [
74
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Trigger, {
75
+ tag: designSystem.IconButton,
76
+ icon: /*#__PURE__*/ jsxRuntime.jsx(icons.More, {}),
77
+ variant: "ghost",
78
+ size: "S",
79
+ // The row itself is a button; keep the trigger's click off it.
80
+ onClick: (event)=>event.stopPropagation(),
81
+ label: formatMessage({
82
+ id: translations.getTranslationKey('sidebar.tree.actions'),
83
+ defaultMessage: 'Actions for {name}'
84
+ }, {
85
+ name: folder.name
86
+ })
87
+ }),
88
+ /*#__PURE__*/ jsxRuntime.jsx(ActionsMenuContent.ActionsMenuContent, {
89
+ popoverPlacement: "bottom-end",
90
+ zIndex: 2,
91
+ minWidth: "22rem",
92
+ children: items
93
+ })
94
+ ]
95
+ })
96
+ }),
97
+ menuPosition !== null && /*#__PURE__*/ jsxRuntime.jsx(CursorAnchoredMenu.CursorAnchoredMenu, {
98
+ position: menuPosition,
99
+ open: true,
100
+ label: formatMessage({
101
+ id: translations.getTranslationKey('list.folder.context-menu.label'),
102
+ defaultMessage: 'Folder actions'
103
+ }),
104
+ returnFocusTo: returnFocusTo,
105
+ onClose: onCloseMenu,
106
+ children: items
107
+ }),
108
+ dialogs
109
+ ]
110
+ })
111
+ });
112
+ };
113
+
114
+ exports.FolderTreeRowMenu = FolderTreeRowMenu;
115
+ //# sourceMappingURL=FolderTreeRowMenu.js.map