@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
@@ -0,0 +1,139 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
6
+ var designSystem = require('@strapi/design-system');
7
+ var icons = require('@strapi/icons');
8
+ var reactIntl = require('react-intl');
9
+ var translations = require('../../../utils/translations.js');
10
+ var useAssetSelection = require('../hooks/useAssetSelection.js');
11
+ var selection = require('../utils/selection.js');
12
+ var BulkMoveDialog = require('./BulkMoveDialog.js');
13
+ var DeleteItemsDialog = require('./DeleteItemsDialog.js');
14
+ var FolderFormDialog = require('./FolderFormDialog.js');
15
+
16
+ /**
17
+ * The folder actions themselves — items, dialogs and handlers — with no opinion
18
+ * about how the menu is opened, mirroring `AssetActions`.
19
+ *
20
+ * Both entry points (the row's `•••` trigger and the right-click menu anchored
21
+ * at the cursor) render what this gives them, so neither can drift from the
22
+ * other.
23
+ *
24
+ * A successful move or delete deselects this one folder and leaves the rest of
25
+ * the selection intact: they only invalidate RTK tags, so without it a
26
+ * `folder:<id>` key for a folder that no longer lives where the selection thinks
27
+ * it does would linger. A rename leaves the id valid and the folder in place, so
28
+ * it touches the selection not at all.
29
+ */ const FolderActions = ({ folder, dragData, showRename = true, children })=>{
30
+ const { formatMessage } = reactIntl.useIntl();
31
+ const { copy } = strapiAdmin.useClipboard();
32
+ const { toggleNotification } = strapiAdmin.useNotification();
33
+ // Optional: the folder tree renders these actions outside the list's
34
+ // selection, where there is nothing to deselect.
35
+ const deselect = useAssetSelection.useAssetSelectionOptional()?.deselect;
36
+ const [isRenameOpen, setIsRenameOpen] = React.useState(false);
37
+ const [isMoveOpen, setIsMoveOpen] = React.useState(false);
38
+ const [isDeleteOpen, setIsDeleteOpen] = React.useState(false);
39
+ // Stable identity: the move dialog memoizes its destination walk on it.
40
+ const moveItems = React.useMemo(()=>[
41
+ dragData
42
+ ], [
43
+ dragData
44
+ ]);
45
+ // Built from window.location so the link inherits whatever path the library is
46
+ // mounted at. Every other query param (search, sort, open drawer) is dropped —
47
+ // this is a clean deep-link to the folder.
48
+ const handleCopyLink = async ()=>{
49
+ const url = `${window.location.origin}${window.location.pathname}?folder=${folder.id}`;
50
+ const didCopy = await copy(url);
51
+ toggleNotification({
52
+ type: didCopy ? 'success' : 'danger',
53
+ message: formatMessage(didCopy ? {
54
+ id: translations.getTranslationKey('list.folder.actions.copy-link.success'),
55
+ defaultMessage: 'Folder link copied.'
56
+ } : {
57
+ id: translations.getTranslationKey('list.folder.actions.copy-link.error'),
58
+ defaultMessage: 'Failed to copy the folder link.'
59
+ })
60
+ });
61
+ };
62
+ const items = /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
63
+ children: [
64
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
65
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Link, {}),
66
+ onSelect: handleCopyLink,
67
+ children: formatMessage({
68
+ id: translations.getTranslationKey('list.folder.actions.copy-link'),
69
+ defaultMessage: 'Copy link to folder'
70
+ })
71
+ }),
72
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Separator, {}),
73
+ showRename && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
74
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Pencil, {}),
75
+ onSelect: ()=>setIsRenameOpen(true),
76
+ children: formatMessage({
77
+ id: translations.getTranslationKey('list.folder.actions.rename'),
78
+ defaultMessage: 'Rename folder'
79
+ })
80
+ }),
81
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
82
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.ArrowRight, {}),
83
+ onSelect: ()=>setIsMoveOpen(true),
84
+ children: formatMessage({
85
+ id: translations.getTranslationKey('list.folder.actions.move'),
86
+ defaultMessage: 'Move to folder'
87
+ })
88
+ }),
89
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
90
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Trash, {}),
91
+ variant: "danger",
92
+ onSelect: ()=>setIsDeleteOpen(true),
93
+ children: formatMessage({
94
+ id: translations.getTranslationKey('list.folder.actions.delete'),
95
+ defaultMessage: 'Delete folder'
96
+ })
97
+ })
98
+ ]
99
+ });
100
+ const dialogs = /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
101
+ children: [
102
+ showRename && isRenameOpen && /*#__PURE__*/ jsxRuntime.jsx(FolderFormDialog.FolderFormDialog, {
103
+ open: true,
104
+ mode: "rename",
105
+ folderId: folder.id,
106
+ initialName: folder.name,
107
+ parentFolderId: dragData.parentId,
108
+ onClose: ()=>setIsRenameOpen(false)
109
+ }),
110
+ isMoveOpen && /*#__PURE__*/ jsxRuntime.jsx(BulkMoveDialog.BulkMoveDialog, {
111
+ open: true,
112
+ onClose: ()=>setIsMoveOpen(false),
113
+ items: moveItems,
114
+ onSuccess: ()=>deselect?.(selection.folderKey(folder.id))
115
+ }),
116
+ isDeleteOpen && /*#__PURE__*/ jsxRuntime.jsx(DeleteItemsDialog.DeleteItemsDialog, {
117
+ open: true,
118
+ onClose: ()=>setIsDeleteOpen(false),
119
+ target: {
120
+ fileIds: [],
121
+ folderIds: [
122
+ folder.id
123
+ ]
124
+ },
125
+ onSuccess: ()=>deselect?.(selection.folderKey(folder.id))
126
+ })
127
+ ]
128
+ });
129
+ return /*#__PURE__*/ jsxRuntime.jsx(jsxRuntime.Fragment, {
130
+ children: children({
131
+ items,
132
+ dialogs,
133
+ isBusy: isRenameOpen || isMoveOpen || isDeleteOpen
134
+ })
135
+ });
136
+ };
137
+
138
+ exports.FolderActions = FolderActions;
139
+ //# sourceMappingURL=FolderActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderActions.js","sources":["../../../../../admin/src/pages/Assets/components/FolderActions.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from 'react';\n\nimport { useClipboard, useNotification } from '@strapi/admin/strapi-admin';\nimport { Menu } from '@strapi/design-system';\nimport { ArrowRight, Link, Pencil, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelectionOptional } from '../hooks/useAssetSelection';\nimport { folderKey } from '../utils/selection';\n\nimport { BulkMoveDialog } from './BulkMoveDialog';\nimport { DeleteItemsDialog } from './DeleteItemsDialog';\nimport { FolderFormDialog } from './FolderFormDialog';\n\nimport type { Folder } from '../../../../../shared/contracts/folders';\nimport type { DragFolderData } from '../../../types/dnd';\n\ninterface FolderActionsRender {\n /** The `Menu.Item`s, for whichever trigger is rendering them. */\n items: ReactNode;\n /**\n * The three dialogs. Rendered outside `Menu.Root` by every caller: Radix\n * unmounts menu content on close, and a dialog opened from a menu item has to\n * outlive the menu that opened it.\n */\n dialogs: ReactNode;\n /**\n * True while a dialog is open. A cursor-anchored caller is mounted only as\n * long as it has something on screen, so it needs this to know it must stay\n * around after the menu closes.\n */\n isBusy: boolean;\n}\n\ninterface FolderActionsProps {\n /** Only the id and name are read, so a tree node satisfies this too. */\n folder: Pick<Folder, 'id' | 'name'>;\n /** Drag data for this folder, so the move dialog validates against its real parent. */\n dragData: DragFolderData;\n /**\n * Renaming is a list affordance. The folder tree offers the same menu without\n * it, so the two entry points there stay identical to each other.\n */\n showRename?: boolean;\n /** Receives the items and dialogs to place around whichever trigger it owns. */\n children: (actions: FolderActionsRender) => ReactNode;\n}\n\n/**\n * The folder actions themselves — items, dialogs and handlers — with no opinion\n * about how the menu is opened, mirroring `AssetActions`.\n *\n * Both entry points (the row's `•••` trigger and the right-click menu anchored\n * at the cursor) render what this gives them, so neither can drift from the\n * other.\n *\n * A successful move or delete deselects this one folder and leaves the rest of\n * the selection intact: they only invalidate RTK tags, so without it a\n * `folder:<id>` key for a folder that no longer lives where the selection thinks\n * it does would linger. A rename leaves the id valid and the folder in place, so\n * it touches the selection not at all.\n */\nexport const FolderActions = ({\n folder,\n dragData,\n showRename = true,\n children,\n}: FolderActionsProps) => {\n const { formatMessage } = useIntl();\n const { copy } = useClipboard();\n const { toggleNotification } = useNotification();\n // Optional: the folder tree renders these actions outside the list's\n // selection, where there is nothing to deselect.\n const deselect = useAssetSelectionOptional()?.deselect;\n const [isRenameOpen, setIsRenameOpen] = useState(false);\n const [isMoveOpen, setIsMoveOpen] = useState(false);\n const [isDeleteOpen, setIsDeleteOpen] = useState(false);\n\n // Stable identity: the move dialog memoizes its destination walk on it.\n const moveItems = useMemo(() => [dragData], [dragData]);\n\n // Built from window.location so the link inherits whatever path the library is\n // mounted at. Every other query param (search, sort, open drawer) is dropped —\n // this is a clean deep-link to the folder.\n const handleCopyLink = async () => {\n const url = `${window.location.origin}${window.location.pathname}?folder=${folder.id}`;\n const didCopy = await copy(url);\n\n toggleNotification({\n type: didCopy ? 'success' : 'danger',\n message: formatMessage(\n didCopy\n ? {\n id: getTranslationKey('list.folder.actions.copy-link.success'),\n defaultMessage: 'Folder link copied.',\n }\n : {\n id: getTranslationKey('list.folder.actions.copy-link.error'),\n defaultMessage: 'Failed to copy the folder link.',\n }\n ),\n });\n };\n\n const items = (\n <>\n <Menu.Item startIcon={<Link />} onSelect={handleCopyLink}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.copy-link'),\n defaultMessage: 'Copy link to folder',\n })}\n </Menu.Item>\n <Menu.Separator />\n {/* TODO: gate Rename, Move and Delete on `assets.canUpdate` CMS-387 */}\n {showRename && (\n <Menu.Item startIcon={<Pencil />} onSelect={() => setIsRenameOpen(true)}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.rename'),\n defaultMessage: 'Rename folder',\n })}\n </Menu.Item>\n )}\n <Menu.Item startIcon={<ArrowRight />} onSelect={() => setIsMoveOpen(true)}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.move'),\n defaultMessage: 'Move to folder',\n })}\n </Menu.Item>\n <Menu.Item startIcon={<Trash />} variant=\"danger\" onSelect={() => setIsDeleteOpen(true)}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.delete'),\n defaultMessage: 'Delete folder',\n })}\n </Menu.Item>\n </>\n );\n\n const dialogs = (\n <>\n {/* These dialogs live inside the row, so a background refetch that drops\n the row would take an open dialog with it. Nothing invalidates until\n the mutation resolves, and the dialog closes in the same tick, so the\n flows themselves can't trigger it. */}\n {showRename && isRenameOpen && (\n <FolderFormDialog\n open\n mode=\"rename\"\n folderId={folder.id}\n initialName={folder.name}\n parentFolderId={dragData.parentId}\n onClose={() => setIsRenameOpen(false)}\n />\n )}\n {isMoveOpen && (\n <BulkMoveDialog\n open\n onClose={() => setIsMoveOpen(false)}\n items={moveItems}\n onSuccess={() => deselect?.(folderKey(folder.id))}\n />\n )}\n {isDeleteOpen && (\n <DeleteItemsDialog\n open\n onClose={() => setIsDeleteOpen(false)}\n target={{ fileIds: [], folderIds: [folder.id] }}\n onSuccess={() => deselect?.(folderKey(folder.id))}\n />\n )}\n </>\n );\n\n return <>{children({ items, dialogs, isBusy: isRenameOpen || isMoveOpen || isDeleteOpen })}</>;\n};\n"],"names":["FolderActions","folder","dragData","showRename","children","formatMessage","useIntl","copy","useClipboard","toggleNotification","useNotification","deselect","useAssetSelectionOptional","isRenameOpen","setIsRenameOpen","useState","isMoveOpen","setIsMoveOpen","isDeleteOpen","setIsDeleteOpen","moveItems","useMemo","handleCopyLink","url","window","location","origin","pathname","id","didCopy","type","message","getTranslationKey","defaultMessage","items","_jsxs","_Fragment","_jsx","Menu","Item","startIcon","Link","onSelect","Separator","Pencil","ArrowRight","Trash","variant","dialogs","FolderFormDialog","open","mode","folderId","initialName","name","parentFolderId","parentId","onClose","BulkMoveDialog","onSuccess","folderKey","DeleteItemsDialog","target","fileIds","folderIds","isBusy"],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { useState, useMemo } from 'react';
3
+ import { useClipboard, useNotification } from '@strapi/admin/strapi-admin';
4
+ import { Menu } from '@strapi/design-system';
5
+ import { Link, Pencil, ArrowRight, Trash } from '@strapi/icons';
6
+ import { useIntl } from 'react-intl';
7
+ import { getTranslationKey } from '../../../utils/translations.mjs';
8
+ import { useAssetSelectionOptional } from '../hooks/useAssetSelection.mjs';
9
+ import { folderKey } from '../utils/selection.mjs';
10
+ import { BulkMoveDialog } from './BulkMoveDialog.mjs';
11
+ import { DeleteItemsDialog } from './DeleteItemsDialog.mjs';
12
+ import { FolderFormDialog } from './FolderFormDialog.mjs';
13
+
14
+ /**
15
+ * The folder actions themselves — items, dialogs and handlers — with no opinion
16
+ * about how the menu is opened, mirroring `AssetActions`.
17
+ *
18
+ * Both entry points (the row's `•••` trigger and the right-click menu anchored
19
+ * at the cursor) render what this gives them, so neither can drift from the
20
+ * other.
21
+ *
22
+ * A successful move or delete deselects this one folder and leaves the rest of
23
+ * the selection intact: they only invalidate RTK tags, so without it a
24
+ * `folder:<id>` key for a folder that no longer lives where the selection thinks
25
+ * it does would linger. A rename leaves the id valid and the folder in place, so
26
+ * it touches the selection not at all.
27
+ */ const FolderActions = ({ folder, dragData, showRename = true, children })=>{
28
+ const { formatMessage } = useIntl();
29
+ const { copy } = useClipboard();
30
+ const { toggleNotification } = useNotification();
31
+ // Optional: the folder tree renders these actions outside the list's
32
+ // selection, where there is nothing to deselect.
33
+ const deselect = useAssetSelectionOptional()?.deselect;
34
+ const [isRenameOpen, setIsRenameOpen] = useState(false);
35
+ const [isMoveOpen, setIsMoveOpen] = useState(false);
36
+ const [isDeleteOpen, setIsDeleteOpen] = useState(false);
37
+ // Stable identity: the move dialog memoizes its destination walk on it.
38
+ const moveItems = useMemo(()=>[
39
+ dragData
40
+ ], [
41
+ dragData
42
+ ]);
43
+ // Built from window.location so the link inherits whatever path the library is
44
+ // mounted at. Every other query param (search, sort, open drawer) is dropped —
45
+ // this is a clean deep-link to the folder.
46
+ const handleCopyLink = async ()=>{
47
+ const url = `${window.location.origin}${window.location.pathname}?folder=${folder.id}`;
48
+ const didCopy = await copy(url);
49
+ toggleNotification({
50
+ type: didCopy ? 'success' : 'danger',
51
+ message: formatMessage(didCopy ? {
52
+ id: getTranslationKey('list.folder.actions.copy-link.success'),
53
+ defaultMessage: 'Folder link copied.'
54
+ } : {
55
+ id: getTranslationKey('list.folder.actions.copy-link.error'),
56
+ defaultMessage: 'Failed to copy the folder link.'
57
+ })
58
+ });
59
+ };
60
+ const items = /*#__PURE__*/ jsxs(Fragment, {
61
+ children: [
62
+ /*#__PURE__*/ jsx(Menu.Item, {
63
+ startIcon: /*#__PURE__*/ jsx(Link, {}),
64
+ onSelect: handleCopyLink,
65
+ children: formatMessage({
66
+ id: getTranslationKey('list.folder.actions.copy-link'),
67
+ defaultMessage: 'Copy link to folder'
68
+ })
69
+ }),
70
+ /*#__PURE__*/ jsx(Menu.Separator, {}),
71
+ showRename && /*#__PURE__*/ jsx(Menu.Item, {
72
+ startIcon: /*#__PURE__*/ jsx(Pencil, {}),
73
+ onSelect: ()=>setIsRenameOpen(true),
74
+ children: formatMessage({
75
+ id: getTranslationKey('list.folder.actions.rename'),
76
+ defaultMessage: 'Rename folder'
77
+ })
78
+ }),
79
+ /*#__PURE__*/ jsx(Menu.Item, {
80
+ startIcon: /*#__PURE__*/ jsx(ArrowRight, {}),
81
+ onSelect: ()=>setIsMoveOpen(true),
82
+ children: formatMessage({
83
+ id: getTranslationKey('list.folder.actions.move'),
84
+ defaultMessage: 'Move to folder'
85
+ })
86
+ }),
87
+ /*#__PURE__*/ jsx(Menu.Item, {
88
+ startIcon: /*#__PURE__*/ jsx(Trash, {}),
89
+ variant: "danger",
90
+ onSelect: ()=>setIsDeleteOpen(true),
91
+ children: formatMessage({
92
+ id: getTranslationKey('list.folder.actions.delete'),
93
+ defaultMessage: 'Delete folder'
94
+ })
95
+ })
96
+ ]
97
+ });
98
+ const dialogs = /*#__PURE__*/ jsxs(Fragment, {
99
+ children: [
100
+ showRename && isRenameOpen && /*#__PURE__*/ jsx(FolderFormDialog, {
101
+ open: true,
102
+ mode: "rename",
103
+ folderId: folder.id,
104
+ initialName: folder.name,
105
+ parentFolderId: dragData.parentId,
106
+ onClose: ()=>setIsRenameOpen(false)
107
+ }),
108
+ isMoveOpen && /*#__PURE__*/ jsx(BulkMoveDialog, {
109
+ open: true,
110
+ onClose: ()=>setIsMoveOpen(false),
111
+ items: moveItems,
112
+ onSuccess: ()=>deselect?.(folderKey(folder.id))
113
+ }),
114
+ isDeleteOpen && /*#__PURE__*/ jsx(DeleteItemsDialog, {
115
+ open: true,
116
+ onClose: ()=>setIsDeleteOpen(false),
117
+ target: {
118
+ fileIds: [],
119
+ folderIds: [
120
+ folder.id
121
+ ]
122
+ },
123
+ onSuccess: ()=>deselect?.(folderKey(folder.id))
124
+ })
125
+ ]
126
+ });
127
+ return /*#__PURE__*/ jsx(Fragment, {
128
+ children: children({
129
+ items,
130
+ dialogs,
131
+ isBusy: isRenameOpen || isMoveOpen || isDeleteOpen
132
+ })
133
+ });
134
+ };
135
+
136
+ export { FolderActions };
137
+ //# sourceMappingURL=FolderActions.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderActions.mjs","sources":["../../../../../admin/src/pages/Assets/components/FolderActions.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from 'react';\n\nimport { useClipboard, useNotification } from '@strapi/admin/strapi-admin';\nimport { Menu } from '@strapi/design-system';\nimport { ArrowRight, Link, Pencil, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelectionOptional } from '../hooks/useAssetSelection';\nimport { folderKey } from '../utils/selection';\n\nimport { BulkMoveDialog } from './BulkMoveDialog';\nimport { DeleteItemsDialog } from './DeleteItemsDialog';\nimport { FolderFormDialog } from './FolderFormDialog';\n\nimport type { Folder } from '../../../../../shared/contracts/folders';\nimport type { DragFolderData } from '../../../types/dnd';\n\ninterface FolderActionsRender {\n /** The `Menu.Item`s, for whichever trigger is rendering them. */\n items: ReactNode;\n /**\n * The three dialogs. Rendered outside `Menu.Root` by every caller: Radix\n * unmounts menu content on close, and a dialog opened from a menu item has to\n * outlive the menu that opened it.\n */\n dialogs: ReactNode;\n /**\n * True while a dialog is open. A cursor-anchored caller is mounted only as\n * long as it has something on screen, so it needs this to know it must stay\n * around after the menu closes.\n */\n isBusy: boolean;\n}\n\ninterface FolderActionsProps {\n /** Only the id and name are read, so a tree node satisfies this too. */\n folder: Pick<Folder, 'id' | 'name'>;\n /** Drag data for this folder, so the move dialog validates against its real parent. */\n dragData: DragFolderData;\n /**\n * Renaming is a list affordance. The folder tree offers the same menu without\n * it, so the two entry points there stay identical to each other.\n */\n showRename?: boolean;\n /** Receives the items and dialogs to place around whichever trigger it owns. */\n children: (actions: FolderActionsRender) => ReactNode;\n}\n\n/**\n * The folder actions themselves — items, dialogs and handlers — with no opinion\n * about how the menu is opened, mirroring `AssetActions`.\n *\n * Both entry points (the row's `•••` trigger and the right-click menu anchored\n * at the cursor) render what this gives them, so neither can drift from the\n * other.\n *\n * A successful move or delete deselects this one folder and leaves the rest of\n * the selection intact: they only invalidate RTK tags, so without it a\n * `folder:<id>` key for a folder that no longer lives where the selection thinks\n * it does would linger. A rename leaves the id valid and the folder in place, so\n * it touches the selection not at all.\n */\nexport const FolderActions = ({\n folder,\n dragData,\n showRename = true,\n children,\n}: FolderActionsProps) => {\n const { formatMessage } = useIntl();\n const { copy } = useClipboard();\n const { toggleNotification } = useNotification();\n // Optional: the folder tree renders these actions outside the list's\n // selection, where there is nothing to deselect.\n const deselect = useAssetSelectionOptional()?.deselect;\n const [isRenameOpen, setIsRenameOpen] = useState(false);\n const [isMoveOpen, setIsMoveOpen] = useState(false);\n const [isDeleteOpen, setIsDeleteOpen] = useState(false);\n\n // Stable identity: the move dialog memoizes its destination walk on it.\n const moveItems = useMemo(() => [dragData], [dragData]);\n\n // Built from window.location so the link inherits whatever path the library is\n // mounted at. Every other query param (search, sort, open drawer) is dropped —\n // this is a clean deep-link to the folder.\n const handleCopyLink = async () => {\n const url = `${window.location.origin}${window.location.pathname}?folder=${folder.id}`;\n const didCopy = await copy(url);\n\n toggleNotification({\n type: didCopy ? 'success' : 'danger',\n message: formatMessage(\n didCopy\n ? {\n id: getTranslationKey('list.folder.actions.copy-link.success'),\n defaultMessage: 'Folder link copied.',\n }\n : {\n id: getTranslationKey('list.folder.actions.copy-link.error'),\n defaultMessage: 'Failed to copy the folder link.',\n }\n ),\n });\n };\n\n const items = (\n <>\n <Menu.Item startIcon={<Link />} onSelect={handleCopyLink}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.copy-link'),\n defaultMessage: 'Copy link to folder',\n })}\n </Menu.Item>\n <Menu.Separator />\n {/* TODO: gate Rename, Move and Delete on `assets.canUpdate` CMS-387 */}\n {showRename && (\n <Menu.Item startIcon={<Pencil />} onSelect={() => setIsRenameOpen(true)}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.rename'),\n defaultMessage: 'Rename folder',\n })}\n </Menu.Item>\n )}\n <Menu.Item startIcon={<ArrowRight />} onSelect={() => setIsMoveOpen(true)}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.move'),\n defaultMessage: 'Move to folder',\n })}\n </Menu.Item>\n <Menu.Item startIcon={<Trash />} variant=\"danger\" onSelect={() => setIsDeleteOpen(true)}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.delete'),\n defaultMessage: 'Delete folder',\n })}\n </Menu.Item>\n </>\n );\n\n const dialogs = (\n <>\n {/* These dialogs live inside the row, so a background refetch that drops\n the row would take an open dialog with it. Nothing invalidates until\n the mutation resolves, and the dialog closes in the same tick, so the\n flows themselves can't trigger it. */}\n {showRename && isRenameOpen && (\n <FolderFormDialog\n open\n mode=\"rename\"\n folderId={folder.id}\n initialName={folder.name}\n parentFolderId={dragData.parentId}\n onClose={() => setIsRenameOpen(false)}\n />\n )}\n {isMoveOpen && (\n <BulkMoveDialog\n open\n onClose={() => setIsMoveOpen(false)}\n items={moveItems}\n onSuccess={() => deselect?.(folderKey(folder.id))}\n />\n )}\n {isDeleteOpen && (\n <DeleteItemsDialog\n open\n onClose={() => setIsDeleteOpen(false)}\n target={{ fileIds: [], folderIds: [folder.id] }}\n onSuccess={() => deselect?.(folderKey(folder.id))}\n />\n )}\n </>\n );\n\n return <>{children({ items, dialogs, isBusy: isRenameOpen || isMoveOpen || isDeleteOpen })}</>;\n};\n"],"names":["FolderActions","folder","dragData","showRename","children","formatMessage","useIntl","copy","useClipboard","toggleNotification","useNotification","deselect","useAssetSelectionOptional","isRenameOpen","setIsRenameOpen","useState","isMoveOpen","setIsMoveOpen","isDeleteOpen","setIsDeleteOpen","moveItems","useMemo","handleCopyLink","url","window","location","origin","pathname","id","didCopy","type","message","getTranslationKey","defaultMessage","items","_jsxs","_Fragment","_jsx","Menu","Item","startIcon","Link","onSelect","Separator","Pencil","ArrowRight","Trash","variant","dialogs","FolderFormDialog","open","mode","folderId","initialName","name","parentFolderId","parentId","onClose","BulkMoveDialog","onSuccess","folderKey","DeleteItemsDialog","target","fileIds","folderIds","isBusy"],"mappings":"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"}
@@ -1,144 +1,50 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
- var React = require('react');
5
- var strapiAdmin = require('@strapi/admin/strapi-admin');
6
4
  var designSystem = require('@strapi/design-system');
7
5
  var icons = require('@strapi/icons');
8
6
  var reactIntl = require('react-intl');
9
7
  var translations = require('../../../utils/translations.js');
10
- var useAssetSelection = require('../hooks/useAssetSelection.js');
11
- var selection = require('../utils/selection.js');
12
8
  var ActionsMenuContent = require('./ActionsMenuContent.js');
13
- var BulkMoveDialog = require('./BulkMoveDialog.js');
14
- var DeleteItemsDialog = require('./DeleteItemsDialog.js');
15
- var FolderFormDialog = require('./FolderFormDialog.js');
9
+ var FolderActions = require('./FolderActions.js');
16
10
 
17
11
  /**
18
12
  * The "..." menu on a folder row/card. Always acts on that one folder, whatever
19
- * the current multi-selection is (the bulk actions bar is the selection-scoped
20
- * affordance). It reuses the shared move and delete dialogs, which mount only
21
- * while open.
13
+ * the current multi-selection is (the bulk actions bar and the right-click menu
14
+ * are the selection-scoped affordances).
22
15
  *
23
- * A successful move or delete deselects this one folder and leaves the rest of
24
- * the selection intact: they only invalidate RTK tags, so without it a
25
- * `folder:<id>` key for a folder that no longer lives where the selection thinks
26
- * it does would linger. A rename leaves the id valid and the folder in place, so
27
- * it touches the selection not at all.
16
+ * The actions themselves live in `FolderActions`, shared with
17
+ * `FolderContextMenu`. This component is only the trigger.
28
18
  */ const FolderActionsMenu = ({ folder, dragData })=>{
29
19
  const { formatMessage } = reactIntl.useIntl();
30
- const { copy } = strapiAdmin.useClipboard();
31
- const { toggleNotification } = strapiAdmin.useNotification();
32
- const { deselect } = useAssetSelection.useAssetSelection();
33
- const [isRenameOpen, setIsRenameOpen] = React.useState(false);
34
- const [isMoveOpen, setIsMoveOpen] = React.useState(false);
35
- const [isDeleteOpen, setIsDeleteOpen] = React.useState(false);
36
- // Stable identity: the move dialog memoizes its destination walk on it.
37
- const moveItems = React.useMemo(()=>[
38
- dragData
39
- ], [
40
- dragData
41
- ]);
42
- // Built from window.location so the link inherits whatever path the library is
43
- // mounted at. Every other query param (search, sort, open drawer) is dropped —
44
- // this is a clean deep-link to the folder.
45
- const handleCopyLink = async ()=>{
46
- const url = `${window.location.origin}${window.location.pathname}?folder=${folder.id}`;
47
- const didCopy = await copy(url);
48
- toggleNotification({
49
- type: didCopy ? 'success' : 'danger',
50
- message: formatMessage(didCopy ? {
51
- id: translations.getTranslationKey('list.folder.actions.copy-link.success'),
52
- defaultMessage: 'Folder link copied.'
53
- } : {
54
- id: translations.getTranslationKey('list.folder.actions.copy-link.error'),
55
- defaultMessage: 'Failed to copy the folder link.'
56
- })
57
- });
58
- };
59
- return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
60
- children: [
61
- /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Root, {
62
- modal: false,
20
+ return /*#__PURE__*/ jsxRuntime.jsx(FolderActions.FolderActions, {
21
+ folder: folder,
22
+ dragData: dragData,
23
+ children: ({ items, dialogs })=>/*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
63
24
  children: [
64
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Trigger, {
65
- tag: designSystem.IconButton,
66
- icon: /*#__PURE__*/ jsxRuntime.jsx(icons.More, {}),
67
- variant: "ghost",
68
- label: formatMessage({
69
- id: translations.getTranslationKey('control-card.more-actions'),
70
- defaultMessage: 'More actions'
71
- })
72
- }),
73
- /*#__PURE__*/ jsxRuntime.jsxs(ActionsMenuContent.ActionsMenuContent, {
74
- popoverPlacement: "bottom-end",
75
- zIndex: 2,
76
- minWidth: "22rem",
25
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Root, {
26
+ modal: false,
77
27
  children: [
78
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
79
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Link, {}),
80
- onSelect: handleCopyLink,
81
- children: formatMessage({
82
- id: translations.getTranslationKey('list.folder.actions.copy-link'),
83
- defaultMessage: 'Copy link to folder'
84
- })
85
- }),
86
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Separator, {}),
87
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
88
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Pencil, {}),
89
- onSelect: ()=>setIsRenameOpen(true),
90
- children: formatMessage({
91
- id: translations.getTranslationKey('list.folder.actions.rename'),
92
- defaultMessage: 'Rename folder'
28
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Trigger, {
29
+ tag: designSystem.IconButton,
30
+ icon: /*#__PURE__*/ jsxRuntime.jsx(icons.More, {}),
31
+ variant: "ghost",
32
+ label: formatMessage({
33
+ id: translations.getTranslationKey('control-card.more-actions'),
34
+ defaultMessage: 'More actions'
93
35
  })
94
36
  }),
95
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
96
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.ArrowRight, {}),
97
- onSelect: ()=>setIsMoveOpen(true),
98
- children: formatMessage({
99
- id: translations.getTranslationKey('list.folder.actions.move'),
100
- defaultMessage: 'Move to folder'
101
- })
102
- }),
103
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
104
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Trash, {}),
105
- variant: "danger",
106
- onSelect: ()=>setIsDeleteOpen(true),
107
- children: formatMessage({
108
- id: translations.getTranslationKey('list.folder.actions.delete'),
109
- defaultMessage: 'Delete folder'
110
- })
37
+ /*#__PURE__*/ jsxRuntime.jsx(ActionsMenuContent.ActionsMenuContent, {
38
+ popoverPlacement: "bottom-end",
39
+ zIndex: 2,
40
+ minWidth: "22rem",
41
+ children: items
111
42
  })
112
43
  ]
113
- })
44
+ }),
45
+ dialogs
114
46
  ]
115
- }),
116
- isRenameOpen && /*#__PURE__*/ jsxRuntime.jsx(FolderFormDialog.FolderFormDialog, {
117
- open: true,
118
- mode: "rename",
119
- folderId: folder.id,
120
- initialName: folder.name,
121
- parentFolderId: dragData.parentId,
122
- onClose: ()=>setIsRenameOpen(false)
123
- }),
124
- isMoveOpen && /*#__PURE__*/ jsxRuntime.jsx(BulkMoveDialog.BulkMoveDialog, {
125
- open: true,
126
- onClose: ()=>setIsMoveOpen(false),
127
- items: moveItems,
128
- onSuccess: ()=>deselect(selection.folderKey(folder.id))
129
- }),
130
- isDeleteOpen && /*#__PURE__*/ jsxRuntime.jsx(DeleteItemsDialog.DeleteItemsDialog, {
131
- open: true,
132
- onClose: ()=>setIsDeleteOpen(false),
133
- target: {
134
- fileIds: [],
135
- folderIds: [
136
- folder.id
137
- ]
138
- },
139
- onSuccess: ()=>deselect(selection.folderKey(folder.id))
140
47
  })
141
- ]
142
48
  });
143
49
  };
144
50
 
@@ -1 +1 @@
1
- {"version":3,"file":"FolderActionsMenu.js","sources":["../../../../../admin/src/pages/Assets/components/FolderActionsMenu.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\n\nimport { useClipboard, useNotification } from '@strapi/admin/strapi-admin';\nimport { IconButton, Menu } from '@strapi/design-system';\nimport { ArrowRight, Link, More, Pencil, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { folderKey } from '../utils/selection';\n\nimport { ActionsMenuContent } from './ActionsMenuContent';\nimport { BulkMoveDialog } from './BulkMoveDialog';\nimport { DeleteItemsDialog } from './DeleteItemsDialog';\nimport { FolderFormDialog } from './FolderFormDialog';\n\nimport type { Folder } from '../../../../../shared/contracts/folders';\nimport type { DragFolderData } from '../../../types/dnd';\n\ninterface FolderActionsMenuProps {\n folder: Folder;\n /** Drag data for this folder, so the move dialog validates against its real parent. */\n dragData: DragFolderData;\n}\n\n/**\n * The \"...\" menu on a folder row/card. Always acts on that one folder, whatever\n * the current multi-selection is (the bulk actions bar is the selection-scoped\n * affordance). It reuses the shared move and delete dialogs, which mount only\n * while open.\n *\n * A successful move or delete deselects this one folder and leaves the rest of\n * the selection intact: they only invalidate RTK tags, so without it a\n * `folder:<id>` key for a folder that no longer lives where the selection thinks\n * it does would linger. A rename leaves the id valid and the folder in place, so\n * it touches the selection not at all.\n */\nexport const FolderActionsMenu = ({ folder, dragData }: FolderActionsMenuProps) => {\n const { formatMessage } = useIntl();\n const { copy } = useClipboard();\n const { toggleNotification } = useNotification();\n const { deselect } = useAssetSelection();\n const [isRenameOpen, setIsRenameOpen] = useState(false);\n const [isMoveOpen, setIsMoveOpen] = useState(false);\n const [isDeleteOpen, setIsDeleteOpen] = useState(false);\n\n // Stable identity: the move dialog memoizes its destination walk on it.\n const moveItems = useMemo(() => [dragData], [dragData]);\n\n // Built from window.location so the link inherits whatever path the library is\n // mounted at. Every other query param (search, sort, open drawer) is dropped —\n // this is a clean deep-link to the folder.\n const handleCopyLink = async () => {\n const url = `${window.location.origin}${window.location.pathname}?folder=${folder.id}`;\n const didCopy = await copy(url);\n\n toggleNotification({\n type: didCopy ? 'success' : 'danger',\n message: formatMessage(\n didCopy\n ? {\n id: getTranslationKey('list.folder.actions.copy-link.success'),\n defaultMessage: 'Folder link copied.',\n }\n : {\n id: getTranslationKey('list.folder.actions.copy-link.error'),\n defaultMessage: 'Failed to copy the folder link.',\n }\n ),\n });\n };\n\n return (\n <>\n {/* See AssetActionsMenu: non-modal so clicking another row's trigger\n closes this menu and opens that one in a single click. */}\n <Menu.Root modal={false}>\n <Menu.Trigger\n tag={IconButton}\n icon={<More />}\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n />\n {/* See ActionsMenuContent: the design system's 15rem default clamps the\n menu against a hidden scrollbar, so items can be silently cut off\n near the viewport edge. This one is shorter, but kept in sync. */}\n <ActionsMenuContent popoverPlacement=\"bottom-end\" zIndex={2} minWidth=\"22rem\">\n <Menu.Item startIcon={<Link />} onSelect={handleCopyLink}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.copy-link'),\n defaultMessage: 'Copy link to folder',\n })}\n </Menu.Item>\n <Menu.Separator />\n {/* TODO: gate Rename, Move and Delete on `assets.canUpdate` CMS-387 */}\n <Menu.Item startIcon={<Pencil />} onSelect={() => setIsRenameOpen(true)}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.rename'),\n defaultMessage: 'Rename folder',\n })}\n </Menu.Item>\n <Menu.Item startIcon={<ArrowRight />} onSelect={() => setIsMoveOpen(true)}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.move'),\n defaultMessage: 'Move to folder',\n })}\n </Menu.Item>\n <Menu.Item startIcon={<Trash />} variant=\"danger\" onSelect={() => setIsDeleteOpen(true)}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.delete'),\n defaultMessage: 'Delete folder',\n })}\n </Menu.Item>\n </ActionsMenuContent>\n </Menu.Root>\n {/* These dialogs live inside the row, so a background refetch that drops\n the row would take an open dialog with it. Nothing invalidates until\n the mutation resolves, and the dialog closes in the same tick, so the\n flows themselves can't trigger it. */}\n {isRenameOpen && (\n <FolderFormDialog\n open\n mode=\"rename\"\n folderId={folder.id}\n initialName={folder.name}\n parentFolderId={dragData.parentId}\n onClose={() => setIsRenameOpen(false)}\n />\n )}\n {isMoveOpen && (\n <BulkMoveDialog\n open\n onClose={() => setIsMoveOpen(false)}\n items={moveItems}\n onSuccess={() => deselect(folderKey(folder.id))}\n />\n )}\n {isDeleteOpen && (\n <DeleteItemsDialog\n open\n onClose={() => setIsDeleteOpen(false)}\n target={{ fileIds: [], folderIds: [folder.id] }}\n onSuccess={() => deselect(folderKey(folder.id))}\n />\n )}\n </>\n );\n};\n"],"names":["FolderActionsMenu","folder","dragData","formatMessage","useIntl","copy","useClipboard","toggleNotification","useNotification","deselect","useAssetSelection","isRenameOpen","setIsRenameOpen","useState","isMoveOpen","setIsMoveOpen","isDeleteOpen","setIsDeleteOpen","moveItems","useMemo","handleCopyLink","url","window","location","origin","pathname","id","didCopy","type","message","getTranslationKey","defaultMessage","_jsxs","_Fragment","Menu","Root","modal","_jsx","Trigger","tag","IconButton","icon","More","variant","label","ActionsMenuContent","popoverPlacement","zIndex","minWidth","Item","startIcon","Link","onSelect","Separator","Pencil","ArrowRight","Trash","FolderFormDialog","open","mode","folderId","initialName","name","parentFolderId","parentId","onClose","BulkMoveDialog","items","onSuccess","folderKey","DeleteItemsDialog","target","fileIds","folderIds"],"mappings":"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"}
1
+ {"version":3,"file":"FolderActionsMenu.js","sources":["../../../../../admin/src/pages/Assets/components/FolderActionsMenu.tsx"],"sourcesContent":["import { IconButton, Menu } from '@strapi/design-system';\nimport { More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslationKey } from '../../../utils/translations';\n\nimport { ActionsMenuContent } from './ActionsMenuContent';\nimport { FolderActions } from './FolderActions';\n\nimport type { Folder } from '../../../../../shared/contracts/folders';\nimport type { DragFolderData } from '../../../types/dnd';\n\ninterface FolderActionsMenuProps {\n folder: Folder;\n /** Drag data for this folder, so the move dialog validates against its real parent. */\n dragData: DragFolderData;\n}\n\n/**\n * The \"...\" menu on a folder row/card. Always acts on that one folder, whatever\n * the current multi-selection is (the bulk actions bar and the right-click menu\n * are the selection-scoped affordances).\n *\n * The actions themselves live in `FolderActions`, shared with\n * `FolderContextMenu`. This component is only the trigger.\n */\nexport const FolderActionsMenu = ({ folder, dragData }: FolderActionsMenuProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <FolderActions folder={folder} dragData={dragData}>\n {({ items, dialogs }) => (\n <>\n {/* See AssetActionsMenu: non-modal so clicking another row's trigger\n closes this menu and opens that one in a single click. */}\n <Menu.Root modal={false}>\n <Menu.Trigger\n tag={IconButton}\n icon={<More />}\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n />\n {/* See ActionsMenuContent: the design system's 15rem default clamps the\n menu against a hidden scrollbar, so items can be silently cut off\n near the viewport edge. This one is shorter, but kept in sync. */}\n <ActionsMenuContent popoverPlacement=\"bottom-end\" zIndex={2} minWidth=\"22rem\">\n {items}\n </ActionsMenuContent>\n </Menu.Root>\n {dialogs}\n </>\n )}\n </FolderActions>\n );\n};\n"],"names":["FolderActionsMenu","folder","dragData","formatMessage","useIntl","_jsx","FolderActions","items","dialogs","_jsxs","_Fragment","Menu","Root","modal","Trigger","tag","IconButton","icon","More","variant","label","id","getTranslationKey","defaultMessage","ActionsMenuContent","popoverPlacement","zIndex","minWidth"],"mappings":";;;;;;;;;;AAkBA;;;;;;;UAQaA,iBAAAA,GAAoB,CAAC,EAAEC,MAAM,EAAEC,QAAQ,EAA0B,GAAA;IAC5E,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAE1B,IAAA,qBACEC,cAAA,CAACC,2BAAAA,EAAAA;QAAcL,MAAAA,EAAQA,MAAAA;QAAQC,QAAAA,EAAUA,QAAAA;AACtC,QAAA,QAAA,EAAA,CAAC,EAAEK,KAAK,EAAEC,OAAO,EAAE,iBAClBC,eAAA,CAAAC,mBAAA,EAAA;;AAGE,kCAAAD,eAAA,CAACE,kBAAKC,IAAI,EAAA;wBAACC,KAAAA,EAAO,KAAA;;AAChB,0CAAAR,cAAA,CAACM,kBAAKG,OAAO,EAAA;gCACXC,GAAAA,EAAKC,uBAAAA;AACLC,gCAAAA,IAAAA,gBAAMZ,cAAA,CAACa,UAAAA,EAAAA,EAAAA,CAAAA;gCACPC,OAAAA,EAAQ,OAAA;AACRC,gCAAAA,KAAAA,EAAOjB,aAAAA,CAAc;AACnBkB,oCAAAA,EAAAA,EAAIC,8BAAAA,CAAkB,2BAAA,CAAA;oCACtBC,cAAAA,EAAgB;AAClB,iCAAA;;0CAKFlB,cAAA,CAACmB,qCAAAA,EAAAA;gCAAmBC,gBAAAA,EAAiB,YAAA;gCAAaC,MAAAA,EAAQ,CAAA;gCAAGC,QAAAA,EAAS,OAAA;AACnEpB,gCAAAA,QAAAA,EAAAA;;;;AAGJC,oBAAAA;;;;AAKX;;;;"}