@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,82 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var reactIntl = require('react-intl');
6
+ var translations = require('../../../utils/translations.js');
7
+ var CursorAnchoredMenu = require('./CursorAnchoredMenu.js');
8
+ var SelectionActions = require('./SelectionActions.js');
9
+
10
+ /**
11
+ * Right-clicking one of several selected items acts on the selection, the way a
12
+ * file manager does.
13
+ *
14
+ * The count leads, so what the menu is about to act on is stated before the
15
+ * actions are. Right-clicking an item that is *not* in the selection replaces
16
+ * the selection with it first, and `AssetContextMenu` handles it instead.
17
+ *
18
+ * Right-clicking the background with a selection live is a different menu:
19
+ * `MainAreaContextMenu` shows these same actions above its creation ones.
20
+ */ const SelectionContextMenu = ({ position, returnFocusTo, locations, onClose })=>{
21
+ const { formatMessage } = reactIntl.useIntl();
22
+ return /*#__PURE__*/ jsxRuntime.jsx(SelectionActions.SelectionActions, {
23
+ locations: locations,
24
+ children: ({ hasActions, items, dialogs, isBusy })=>/*#__PURE__*/ jsxRuntime.jsx(SelectionContextMenuBody, {
25
+ hasActions: hasActions,
26
+ isBusy: isBusy,
27
+ position: position,
28
+ returnFocusTo: returnFocusTo,
29
+ label: formatMessage({
30
+ id: translations.getTranslationKey('list.selection.context-menu.label'),
31
+ defaultMessage: 'Selection actions'
32
+ }),
33
+ items: items,
34
+ dialogs: dialogs,
35
+ onClose: onClose
36
+ })
37
+ });
38
+ };
39
+ /**
40
+ * Split out because the "nothing left on screen" effects can't run inside the
41
+ * render prop above — hooks don't belong in a callback.
42
+ */ const SelectionContextMenuBody = ({ hasActions, isBusy, position, returnFocusTo, label, items, dialogs, onClose })=>{
43
+ const [isMenuOpen, setIsMenuOpen] = React.useState(true);
44
+ // Nothing left on screen — the menu is shut and no dialog took its place.
45
+ React.useEffect(()=>{
46
+ if (!isMenuOpen && !isBusy) {
47
+ onClose();
48
+ }
49
+ }, [
50
+ isMenuOpen,
51
+ isBusy,
52
+ onClose
53
+ ]);
54
+ // A role that can read but not update has nothing to offer for a selection.
55
+ React.useEffect(()=>{
56
+ if (!hasActions) {
57
+ onClose();
58
+ }
59
+ }, [
60
+ hasActions,
61
+ onClose
62
+ ]);
63
+ if (!hasActions) {
64
+ return null;
65
+ }
66
+ return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
67
+ children: [
68
+ /*#__PURE__*/ jsxRuntime.jsx(CursorAnchoredMenu.CursorAnchoredMenu, {
69
+ position: position,
70
+ open: isMenuOpen,
71
+ label: label,
72
+ returnFocusTo: returnFocusTo,
73
+ onClose: ()=>setIsMenuOpen(false),
74
+ children: items
75
+ }),
76
+ dialogs
77
+ ]
78
+ });
79
+ };
80
+
81
+ exports.SelectionContextMenu = SelectionContextMenu;
82
+ //# sourceMappingURL=SelectionContextMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionContextMenu.js","sources":["../../../../../admin/src/pages/Assets/components/SelectionContextMenu.tsx"],"sourcesContent":["import { useEffect, useState, type ReactNode } from 'react';\n\nimport { useIntl } from 'react-intl';\n\nimport { getTranslationKey } from '../../../utils/translations';\n\nimport { CursorAnchoredMenu, type CursorPosition } from './CursorAnchoredMenu';\nimport { SelectionActions } from './SelectionActions';\n\nimport type { ItemLocations } from '../../../utils/itemLocations';\n\ninterface SelectionContextMenuProps {\n position: CursorPosition;\n returnFocusTo: HTMLElement | null;\n /**\n * Real location of every loaded row, so the move dialog validates each\n * selected item against its own parent — same input the bulk bar takes.\n */\n locations: ItemLocations;\n onClose: () => void;\n}\n\n/**\n * Right-clicking one of several selected items acts on the selection, the way a\n * file manager does.\n *\n * The count leads, so what the menu is about to act on is stated before the\n * actions are. Right-clicking an item that is *not* in the selection replaces\n * the selection with it first, and `AssetContextMenu` handles it instead.\n *\n * Right-clicking the background with a selection live is a different menu:\n * `MainAreaContextMenu` shows these same actions above its creation ones.\n */\nexport const SelectionContextMenu = ({\n position,\n returnFocusTo,\n locations,\n onClose,\n}: SelectionContextMenuProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <SelectionActions locations={locations}>\n {({ hasActions, items, dialogs, isBusy }) => (\n <SelectionContextMenuBody\n hasActions={hasActions}\n isBusy={isBusy}\n position={position}\n returnFocusTo={returnFocusTo}\n label={formatMessage({\n id: getTranslationKey('list.selection.context-menu.label'),\n defaultMessage: 'Selection actions',\n })}\n items={items}\n dialogs={dialogs}\n onClose={onClose}\n />\n )}\n </SelectionActions>\n );\n};\n\ninterface SelectionContextMenuBodyProps {\n hasActions: boolean;\n isBusy: boolean;\n position: CursorPosition;\n returnFocusTo: HTMLElement | null;\n label: string;\n items: ReactNode;\n dialogs: ReactNode;\n onClose: () => void;\n}\n\n/**\n * Split out because the \"nothing left on screen\" effects can't run inside the\n * render prop above — hooks don't belong in a callback.\n */\nconst SelectionContextMenuBody = ({\n hasActions,\n isBusy,\n position,\n returnFocusTo,\n label,\n items,\n dialogs,\n onClose,\n}: SelectionContextMenuBodyProps) => {\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n\n // Nothing left on screen — the menu is shut and no dialog took its place.\n useEffect(() => {\n if (!isMenuOpen && !isBusy) {\n onClose();\n }\n }, [isMenuOpen, isBusy, onClose]);\n\n // A role that can read but not update has nothing to offer for a selection.\n useEffect(() => {\n if (!hasActions) {\n onClose();\n }\n }, [hasActions, onClose]);\n\n if (!hasActions) {\n return null;\n }\n\n return (\n <>\n <CursorAnchoredMenu\n position={position}\n open={isMenuOpen}\n label={label}\n returnFocusTo={returnFocusTo}\n onClose={() => setIsMenuOpen(false)}\n >\n {items}\n </CursorAnchoredMenu>\n {dialogs}\n </>\n );\n};\n"],"names":["SelectionContextMenu","position","returnFocusTo","locations","onClose","formatMessage","useIntl","_jsx","SelectionActions","hasActions","items","dialogs","isBusy","SelectionContextMenuBody","label","id","getTranslationKey","defaultMessage","isMenuOpen","setIsMenuOpen","useState","useEffect","_jsxs","_Fragment","CursorAnchoredMenu","open"],"mappings":";;;;;;;;;AAsBA;;;;;;;;;;AAUC,IACM,MAAMA,oBAAAA,GAAuB,CAAC,EACnCC,QAAQ,EACRC,aAAa,EACbC,SAAS,EACTC,OAAO,EACmB,GAAA;IAC1B,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAE1B,IAAA,qBACEC,cAAA,CAACC,iCAAAA,EAAAA;QAAiBL,SAAAA,EAAWA,SAAAA;kBAC1B,CAAC,EAAEM,UAAU,EAAEC,KAAK,EAAEC,OAAO,EAAEC,MAAM,EAAE,iBACtCL,cAAA,CAACM,wBAAAA,EAAAA;gBACCJ,UAAAA,EAAYA,UAAAA;gBACZG,MAAAA,EAAQA,MAAAA;gBACRX,QAAAA,EAAUA,QAAAA;gBACVC,aAAAA,EAAeA,aAAAA;AACfY,gBAAAA,KAAAA,EAAOT,aAAAA,CAAc;AACnBU,oBAAAA,EAAAA,EAAIC,8BAAAA,CAAkB,mCAAA,CAAA;oBACtBC,cAAAA,EAAgB;AAClB,iBAAA,CAAA;gBACAP,KAAAA,EAAOA,KAAAA;gBACPC,OAAAA,EAASA,OAAAA;gBACTP,OAAAA,EAASA;;;AAKnB;AAaA;;;AAGC,IACD,MAAMS,wBAAAA,GAA2B,CAAC,EAChCJ,UAAU,EACVG,MAAM,EACNX,QAAQ,EACRC,aAAa,EACbY,KAAK,EACLJ,KAAK,EACLC,OAAO,EACPP,OAAO,EACuB,GAAA;AAC9B,IAAA,MAAM,CAACc,UAAAA,EAAYC,aAAAA,CAAc,GAAGC,cAAAA,CAAS,IAAA,CAAA;;IAG7CC,eAAAA,CAAU,IAAA;QACR,IAAI,CAACH,UAAAA,IAAc,CAACN,MAAAA,EAAQ;AAC1BR,YAAAA,OAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACc,QAAAA,UAAAA;AAAYN,QAAAA,MAAAA;AAAQR,QAAAA;AAAQ,KAAA,CAAA;;IAGhCiB,eAAAA,CAAU,IAAA;AACR,QAAA,IAAI,CAACZ,UAAAA,EAAY;AACfL,YAAAA,OAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACK,QAAAA,UAAAA;AAAYL,QAAAA;AAAQ,KAAA,CAAA;AAExB,IAAA,IAAI,CAACK,UAAAA,EAAY;QACf,OAAO,IAAA;AACT,IAAA;IAEA,qBACEa,eAAA,CAAAC,mBAAA,EAAA;;0BACEhB,cAAA,CAACiB,qCAAAA,EAAAA;gBACCvB,QAAAA,EAAUA,QAAAA;gBACVwB,IAAAA,EAAMP,UAAAA;gBACNJ,KAAAA,EAAOA,KAAAA;gBACPZ,aAAAA,EAAeA,aAAAA;AACfE,gBAAAA,OAAAA,EAAS,IAAMe,aAAAA,CAAc,KAAA,CAAA;AAE5BT,gBAAAA,QAAAA,EAAAA;;AAEFC,YAAAA;;;AAGP,CAAA;;;;"}
@@ -0,0 +1,80 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { useState, useEffect } from 'react';
3
+ import { useIntl } from 'react-intl';
4
+ import { getTranslationKey } from '../../../utils/translations.mjs';
5
+ import { CursorAnchoredMenu } from './CursorAnchoredMenu.mjs';
6
+ import { SelectionActions } from './SelectionActions.mjs';
7
+
8
+ /**
9
+ * Right-clicking one of several selected items acts on the selection, the way a
10
+ * file manager does.
11
+ *
12
+ * The count leads, so what the menu is about to act on is stated before the
13
+ * actions are. Right-clicking an item that is *not* in the selection replaces
14
+ * the selection with it first, and `AssetContextMenu` handles it instead.
15
+ *
16
+ * Right-clicking the background with a selection live is a different menu:
17
+ * `MainAreaContextMenu` shows these same actions above its creation ones.
18
+ */ const SelectionContextMenu = ({ position, returnFocusTo, locations, onClose })=>{
19
+ const { formatMessage } = useIntl();
20
+ return /*#__PURE__*/ jsx(SelectionActions, {
21
+ locations: locations,
22
+ children: ({ hasActions, items, dialogs, isBusy })=>/*#__PURE__*/ jsx(SelectionContextMenuBody, {
23
+ hasActions: hasActions,
24
+ isBusy: isBusy,
25
+ position: position,
26
+ returnFocusTo: returnFocusTo,
27
+ label: formatMessage({
28
+ id: getTranslationKey('list.selection.context-menu.label'),
29
+ defaultMessage: 'Selection actions'
30
+ }),
31
+ items: items,
32
+ dialogs: dialogs,
33
+ onClose: onClose
34
+ })
35
+ });
36
+ };
37
+ /**
38
+ * Split out because the "nothing left on screen" effects can't run inside the
39
+ * render prop above — hooks don't belong in a callback.
40
+ */ const SelectionContextMenuBody = ({ hasActions, isBusy, position, returnFocusTo, label, items, dialogs, onClose })=>{
41
+ const [isMenuOpen, setIsMenuOpen] = useState(true);
42
+ // Nothing left on screen — the menu is shut and no dialog took its place.
43
+ useEffect(()=>{
44
+ if (!isMenuOpen && !isBusy) {
45
+ onClose();
46
+ }
47
+ }, [
48
+ isMenuOpen,
49
+ isBusy,
50
+ onClose
51
+ ]);
52
+ // A role that can read but not update has nothing to offer for a selection.
53
+ useEffect(()=>{
54
+ if (!hasActions) {
55
+ onClose();
56
+ }
57
+ }, [
58
+ hasActions,
59
+ onClose
60
+ ]);
61
+ if (!hasActions) {
62
+ return null;
63
+ }
64
+ return /*#__PURE__*/ jsxs(Fragment, {
65
+ children: [
66
+ /*#__PURE__*/ jsx(CursorAnchoredMenu, {
67
+ position: position,
68
+ open: isMenuOpen,
69
+ label: label,
70
+ returnFocusTo: returnFocusTo,
71
+ onClose: ()=>setIsMenuOpen(false),
72
+ children: items
73
+ }),
74
+ dialogs
75
+ ]
76
+ });
77
+ };
78
+
79
+ export { SelectionContextMenu };
80
+ //# sourceMappingURL=SelectionContextMenu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionContextMenu.mjs","sources":["../../../../../admin/src/pages/Assets/components/SelectionContextMenu.tsx"],"sourcesContent":["import { useEffect, useState, type ReactNode } from 'react';\n\nimport { useIntl } from 'react-intl';\n\nimport { getTranslationKey } from '../../../utils/translations';\n\nimport { CursorAnchoredMenu, type CursorPosition } from './CursorAnchoredMenu';\nimport { SelectionActions } from './SelectionActions';\n\nimport type { ItemLocations } from '../../../utils/itemLocations';\n\ninterface SelectionContextMenuProps {\n position: CursorPosition;\n returnFocusTo: HTMLElement | null;\n /**\n * Real location of every loaded row, so the move dialog validates each\n * selected item against its own parent — same input the bulk bar takes.\n */\n locations: ItemLocations;\n onClose: () => void;\n}\n\n/**\n * Right-clicking one of several selected items acts on the selection, the way a\n * file manager does.\n *\n * The count leads, so what the menu is about to act on is stated before the\n * actions are. Right-clicking an item that is *not* in the selection replaces\n * the selection with it first, and `AssetContextMenu` handles it instead.\n *\n * Right-clicking the background with a selection live is a different menu:\n * `MainAreaContextMenu` shows these same actions above its creation ones.\n */\nexport const SelectionContextMenu = ({\n position,\n returnFocusTo,\n locations,\n onClose,\n}: SelectionContextMenuProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <SelectionActions locations={locations}>\n {({ hasActions, items, dialogs, isBusy }) => (\n <SelectionContextMenuBody\n hasActions={hasActions}\n isBusy={isBusy}\n position={position}\n returnFocusTo={returnFocusTo}\n label={formatMessage({\n id: getTranslationKey('list.selection.context-menu.label'),\n defaultMessage: 'Selection actions',\n })}\n items={items}\n dialogs={dialogs}\n onClose={onClose}\n />\n )}\n </SelectionActions>\n );\n};\n\ninterface SelectionContextMenuBodyProps {\n hasActions: boolean;\n isBusy: boolean;\n position: CursorPosition;\n returnFocusTo: HTMLElement | null;\n label: string;\n items: ReactNode;\n dialogs: ReactNode;\n onClose: () => void;\n}\n\n/**\n * Split out because the \"nothing left on screen\" effects can't run inside the\n * render prop above — hooks don't belong in a callback.\n */\nconst SelectionContextMenuBody = ({\n hasActions,\n isBusy,\n position,\n returnFocusTo,\n label,\n items,\n dialogs,\n onClose,\n}: SelectionContextMenuBodyProps) => {\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n\n // Nothing left on screen — the menu is shut and no dialog took its place.\n useEffect(() => {\n if (!isMenuOpen && !isBusy) {\n onClose();\n }\n }, [isMenuOpen, isBusy, onClose]);\n\n // A role that can read but not update has nothing to offer for a selection.\n useEffect(() => {\n if (!hasActions) {\n onClose();\n }\n }, [hasActions, onClose]);\n\n if (!hasActions) {\n return null;\n }\n\n return (\n <>\n <CursorAnchoredMenu\n position={position}\n open={isMenuOpen}\n label={label}\n returnFocusTo={returnFocusTo}\n onClose={() => setIsMenuOpen(false)}\n >\n {items}\n </CursorAnchoredMenu>\n {dialogs}\n </>\n );\n};\n"],"names":["SelectionContextMenu","position","returnFocusTo","locations","onClose","formatMessage","useIntl","_jsx","SelectionActions","hasActions","items","dialogs","isBusy","SelectionContextMenuBody","label","id","getTranslationKey","defaultMessage","isMenuOpen","setIsMenuOpen","useState","useEffect","_jsxs","_Fragment","CursorAnchoredMenu","open"],"mappings":";;;;;;;AAsBA;;;;;;;;;;AAUC,IACM,MAAMA,oBAAAA,GAAuB,CAAC,EACnCC,QAAQ,EACRC,aAAa,EACbC,SAAS,EACTC,OAAO,EACmB,GAAA;IAC1B,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAE1B,IAAA,qBACEC,GAAA,CAACC,gBAAAA,EAAAA;QAAiBL,SAAAA,EAAWA,SAAAA;kBAC1B,CAAC,EAAEM,UAAU,EAAEC,KAAK,EAAEC,OAAO,EAAEC,MAAM,EAAE,iBACtCL,GAAA,CAACM,wBAAAA,EAAAA;gBACCJ,UAAAA,EAAYA,UAAAA;gBACZG,MAAAA,EAAQA,MAAAA;gBACRX,QAAAA,EAAUA,QAAAA;gBACVC,aAAAA,EAAeA,aAAAA;AACfY,gBAAAA,KAAAA,EAAOT,aAAAA,CAAc;AACnBU,oBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,mCAAA,CAAA;oBACtBC,cAAAA,EAAgB;AAClB,iBAAA,CAAA;gBACAP,KAAAA,EAAOA,KAAAA;gBACPC,OAAAA,EAASA,OAAAA;gBACTP,OAAAA,EAASA;;;AAKnB;AAaA;;;AAGC,IACD,MAAMS,wBAAAA,GAA2B,CAAC,EAChCJ,UAAU,EACVG,MAAM,EACNX,QAAQ,EACRC,aAAa,EACbY,KAAK,EACLJ,KAAK,EACLC,OAAO,EACPP,OAAO,EACuB,GAAA;AAC9B,IAAA,MAAM,CAACc,UAAAA,EAAYC,aAAAA,CAAc,GAAGC,QAAAA,CAAS,IAAA,CAAA;;IAG7CC,SAAAA,CAAU,IAAA;QACR,IAAI,CAACH,UAAAA,IAAc,CAACN,MAAAA,EAAQ;AAC1BR,YAAAA,OAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACc,QAAAA,UAAAA;AAAYN,QAAAA,MAAAA;AAAQR,QAAAA;AAAQ,KAAA,CAAA;;IAGhCiB,SAAAA,CAAU,IAAA;AACR,QAAA,IAAI,CAACZ,UAAAA,EAAY;AACfL,YAAAA,OAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACK,QAAAA,UAAAA;AAAYL,QAAAA;AAAQ,KAAA,CAAA;AAExB,IAAA,IAAI,CAACK,UAAAA,EAAY;QACf,OAAO,IAAA;AACT,IAAA;IAEA,qBACEa,IAAA,CAAAC,QAAA,EAAA;;0BACEhB,GAAA,CAACiB,kBAAAA,EAAAA;gBACCvB,QAAAA,EAAUA,QAAAA;gBACVwB,IAAAA,EAAMP,UAAAA;gBACNJ,KAAAA,EAAOA,KAAAA;gBACPZ,aAAAA,EAAeA,aAAAA;AACfE,gBAAAA,OAAAA,EAAS,IAAMe,aAAAA,CAAc,KAAA,CAAA;AAE5BT,gBAAAA,QAAAA,EAAAA;;AAEFC,YAAAA;;;AAGP,CAAA;;;;"}
@@ -28,6 +28,14 @@ const AssetSelectionProvider = ({ children, disabled = false })=>{
28
28
  }, [
29
29
  disabled
30
30
  ]);
31
+ const selectOnly = React.useCallback((key)=>{
32
+ if (disabled) return;
33
+ setState(selection.selectAll([
34
+ key
35
+ ]));
36
+ }, [
37
+ disabled
38
+ ]);
31
39
  // No `disabled` guard, like `clear`: this only ever shrinks the selection, and a
32
40
  // disabled provider has nothing in it (every additive path is guarded).
33
41
  const deselect = React.useCallback((key)=>setState((prev)=>selection.deselect(prev, key)), []);
@@ -47,6 +55,7 @@ const AssetSelectionProvider = ({ children, disabled = false })=>{
47
55
  toggle,
48
56
  selectRange,
49
57
  selectAll,
58
+ selectOnly,
50
59
  deselect,
51
60
  clear
52
61
  }), [
@@ -58,6 +67,7 @@ const AssetSelectionProvider = ({ children, disabled = false })=>{
58
67
  toggle,
59
68
  selectRange,
60
69
  selectAll,
70
+ selectOnly,
61
71
  deselect,
62
72
  clear
63
73
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"useAssetSelection.js","sources":["../../../../../admin/src/pages/Assets/hooks/useAssetSelection.ts"],"sourcesContent":["import {\n createContext,\n createElement,\n useCallback,\n useContext,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\n\nimport {\n clearSelection,\n createEmptySelection,\n deselect as deselectState,\n getIdsOfKind,\n selectAll as selectAllState,\n selectRange as selectRangeState,\n toggleSelection,\n type ItemKey,\n type SelectionState,\n} from '../utils/selection';\n\n/**\n * Ephemeral, view-state-only multi-select for the future Media Library. Selection\n * is page-scoped and reset on folder navigation or sort/filter changes (the\n * table/grid toggle keeps it — same list, different presentation).\n *\n * The actual computation lives in `../utils/selection.ts` (pure + unit-tested);\n * this hook is a thin React wrapper. Assets and folders share one mechanism —\n * items are tracked as namespaced keys (`asset:1` / `folder:1`) so toggle, range\n * and select-all behave the same for both. Range / select-all receive the\n * ordered key array from the caller (the view owns the rendered order), keeping\n * the context data-source-agnostic.\n */\nexport interface AssetSelection {\n /** Every selected item key (assets and folders), render-order agnostic. */\n selectedKeys: Set<ItemKey>;\n /** Selected asset ids, derived from {@link selectedKeys}. */\n selectedIds: Set<number>;\n /** Selected folder ids, derived from {@link selectedKeys}. */\n selectedFolderIds: Set<number>;\n anchorKey: ItemKey | null;\n isSelected: (key: ItemKey) => boolean;\n /** Additive toggle (Cmd/Ctrl+click, item checkbox). */\n toggle: (key: ItemKey) => void;\n /** Shift+click — selects the contiguous range from the anchor to the target. */\n selectRange: (orderedKeys: ItemKey[], targetKey: ItemKey) => void;\n /** Header checkbox — selects every rendered item (folders and assets). */\n selectAll: (orderedKeys: ItemKey[]) => void;\n /** Row-level \"...\" menu — drops one key when its item leaves the list (move, delete). */\n deselect: (key: ItemKey) => void;\n /** Close button / folder navigation / list-identity changes. */\n clear: () => void;\n}\n\nconst AssetSelectionContext = createContext<AssetSelection | null>(null);\n\ninterface AssetSelectionProviderProps {\n children: ReactNode;\n /**\n * When true, selection is inert: every mutator is a no-op and nothing ever\n * reads as selected. Every bulk action is gated on `assets.update`, so a user\n * without it has nothing to select for — the views also hide the checkboxes,\n * and this makes the remaining paths (click-to-select, Space key) do nothing.\n */\n disabled?: boolean;\n}\n\nexport const AssetSelectionProvider = ({\n children,\n disabled = false,\n}: AssetSelectionProviderProps) => {\n const [state, setState] = useState<SelectionState>(createEmptySelection);\n\n const isSelected = useCallback(\n (key: ItemKey) => !disabled && state.selectedKeys.has(key),\n [disabled, state.selectedKeys]\n );\n\n const toggle = useCallback(\n (key: ItemKey) => {\n if (disabled) return;\n setState((prev) => toggleSelection(prev, key));\n },\n [disabled]\n );\n\n const selectRange = useCallback(\n (orderedKeys: ItemKey[], targetKey: ItemKey) => {\n if (disabled) return;\n setState((prev) => selectRangeState(prev, orderedKeys, targetKey));\n },\n [disabled]\n );\n\n const selectAll = useCallback(\n (orderedKeys: ItemKey[]) => {\n if (disabled) return;\n setState(selectAllState(orderedKeys));\n },\n [disabled]\n );\n\n // No `disabled` guard, like `clear`: this only ever shrinks the selection, and a\n // disabled provider has nothing in it (every additive path is guarded).\n const deselect = useCallback((key: ItemKey) => setState((prev) => deselectState(prev, key)), []);\n\n const clear = useCallback(() => setState(clearSelection()), []);\n\n const selectedIds = useMemo(\n () => getIdsOfKind(state.selectedKeys, 'asset'),\n [state.selectedKeys]\n );\n const selectedFolderIds = useMemo(\n () => getIdsOfKind(state.selectedKeys, 'folder'),\n [state.selectedKeys]\n );\n\n const value = useMemo<AssetSelection>(\n () => ({\n selectedKeys: state.selectedKeys,\n selectedIds,\n selectedFolderIds,\n anchorKey: state.anchorKey,\n isSelected,\n toggle,\n selectRange,\n selectAll,\n deselect,\n clear,\n }),\n [\n state.selectedKeys,\n selectedIds,\n selectedFolderIds,\n state.anchorKey,\n isSelected,\n toggle,\n selectRange,\n selectAll,\n deselect,\n clear,\n ]\n );\n\n return createElement(AssetSelectionContext.Provider, { value }, children);\n};\n\nexport const useAssetSelection = () => {\n const context = useContext(AssetSelectionContext);\n\n if (!context) {\n throw new Error('useAssetSelection must be used within an AssetSelectionProvider');\n }\n\n return context;\n};\n\nexport const useAssetSelectionOptional = () => useContext(AssetSelectionContext);\n"],"names":["AssetSelectionContext","createContext","AssetSelectionProvider","children","disabled","state","setState","useState","createEmptySelection","isSelected","useCallback","key","selectedKeys","has","toggle","prev","toggleSelection","selectRange","orderedKeys","targetKey","selectRangeState","selectAll","selectAllState","deselect","deselectState","clear","clearSelection","selectedIds","useMemo","getIdsOfKind","selectedFolderIds","value","anchorKey","createElement","Provider","useAssetSelection","context","useContext","Error","useAssetSelectionOptional"],"mappings":"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"}
1
+ {"version":3,"file":"useAssetSelection.js","sources":["../../../../../admin/src/pages/Assets/hooks/useAssetSelection.ts"],"sourcesContent":["import {\n createContext,\n createElement,\n useCallback,\n useContext,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\n\nimport {\n clearSelection,\n createEmptySelection,\n deselect as deselectState,\n getIdsOfKind,\n selectAll as selectAllState,\n selectRange as selectRangeState,\n toggleSelection,\n type ItemKey,\n type SelectionState,\n} from '../utils/selection';\n\n/**\n * Ephemeral, view-state-only multi-select for the future Media Library. Selection\n * is page-scoped and reset on folder navigation or sort/filter changes (the\n * table/grid toggle keeps it — same list, different presentation).\n *\n * The actual computation lives in `../utils/selection.ts` (pure + unit-tested);\n * this hook is a thin React wrapper. Assets and folders share one mechanism —\n * items are tracked as namespaced keys (`asset:1` / `folder:1`) so toggle, range\n * and select-all behave the same for both. Range / select-all receive the\n * ordered key array from the caller (the view owns the rendered order), keeping\n * the context data-source-agnostic.\n */\nexport interface AssetSelection {\n /** Every selected item key (assets and folders), render-order agnostic. */\n selectedKeys: Set<ItemKey>;\n /** Selected asset ids, derived from {@link selectedKeys}. */\n selectedIds: Set<number>;\n /** Selected folder ids, derived from {@link selectedKeys}. */\n selectedFolderIds: Set<number>;\n anchorKey: ItemKey | null;\n isSelected: (key: ItemKey) => boolean;\n /** Additive toggle (Cmd/Ctrl+click, item checkbox). */\n toggle: (key: ItemKey) => void;\n /** Shift+click — selects the contiguous range from the anchor to the target. */\n selectRange: (orderedKeys: ItemKey[], targetKey: ItemKey) => void;\n /** Header checkbox — selects every rendered item (folders and assets). */\n selectAll: (orderedKeys: ItemKey[]) => void;\n /**\n * Replaces the selection with this one key, as a right-click on an unselected\n * item does: what the menu then acts on is what the user can see is selected.\n */\n selectOnly: (key: ItemKey) => void;\n /** Row-level \"...\" menu — drops one key when its item leaves the list (move, delete). */\n deselect: (key: ItemKey) => void;\n /** Close button / folder navigation / list-identity changes. */\n clear: () => void;\n}\n\nconst AssetSelectionContext = createContext<AssetSelection | null>(null);\n\ninterface AssetSelectionProviderProps {\n children: ReactNode;\n /**\n * When true, selection is inert: every mutator is a no-op and nothing ever\n * reads as selected. Every bulk action is gated on `assets.update`, so a user\n * without it has nothing to select for — the views also hide the checkboxes,\n * and this makes the remaining paths (click-to-select, Space key) do nothing.\n */\n disabled?: boolean;\n}\n\nexport const AssetSelectionProvider = ({\n children,\n disabled = false,\n}: AssetSelectionProviderProps) => {\n const [state, setState] = useState<SelectionState>(createEmptySelection);\n\n const isSelected = useCallback(\n (key: ItemKey) => !disabled && state.selectedKeys.has(key),\n [disabled, state.selectedKeys]\n );\n\n const toggle = useCallback(\n (key: ItemKey) => {\n if (disabled) return;\n setState((prev) => toggleSelection(prev, key));\n },\n [disabled]\n );\n\n const selectRange = useCallback(\n (orderedKeys: ItemKey[], targetKey: ItemKey) => {\n if (disabled) return;\n setState((prev) => selectRangeState(prev, orderedKeys, targetKey));\n },\n [disabled]\n );\n\n const selectAll = useCallback(\n (orderedKeys: ItemKey[]) => {\n if (disabled) return;\n setState(selectAllState(orderedKeys));\n },\n [disabled]\n );\n\n const selectOnly = useCallback(\n (key: ItemKey) => {\n if (disabled) return;\n setState(selectAllState([key]));\n },\n [disabled]\n );\n\n // No `disabled` guard, like `clear`: this only ever shrinks the selection, and a\n // disabled provider has nothing in it (every additive path is guarded).\n const deselect = useCallback((key: ItemKey) => setState((prev) => deselectState(prev, key)), []);\n\n const clear = useCallback(() => setState(clearSelection()), []);\n\n const selectedIds = useMemo(\n () => getIdsOfKind(state.selectedKeys, 'asset'),\n [state.selectedKeys]\n );\n const selectedFolderIds = useMemo(\n () => getIdsOfKind(state.selectedKeys, 'folder'),\n [state.selectedKeys]\n );\n\n const value = useMemo<AssetSelection>(\n () => ({\n selectedKeys: state.selectedKeys,\n selectedIds,\n selectedFolderIds,\n anchorKey: state.anchorKey,\n isSelected,\n toggle,\n selectRange,\n selectAll,\n selectOnly,\n deselect,\n clear,\n }),\n [\n state.selectedKeys,\n selectedIds,\n selectedFolderIds,\n state.anchorKey,\n isSelected,\n toggle,\n selectRange,\n selectAll,\n selectOnly,\n deselect,\n clear,\n ]\n );\n\n return createElement(AssetSelectionContext.Provider, { value }, children);\n};\n\nexport const useAssetSelection = () => {\n const context = useContext(AssetSelectionContext);\n\n if (!context) {\n throw new Error('useAssetSelection must be used within an AssetSelectionProvider');\n }\n\n return context;\n};\n\nexport const useAssetSelectionOptional = () => useContext(AssetSelectionContext);\n"],"names":["AssetSelectionContext","createContext","AssetSelectionProvider","children","disabled","state","setState","useState","createEmptySelection","isSelected","useCallback","key","selectedKeys","has","toggle","prev","toggleSelection","selectRange","orderedKeys","targetKey","selectRangeState","selectAll","selectAllState","selectOnly","deselect","deselectState","clear","clearSelection","selectedIds","useMemo","getIdsOfKind","selectedFolderIds","value","anchorKey","createElement","Provider","useAssetSelection","context","useContext","Error","useAssetSelectionOptional"],"mappings":"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"}
@@ -26,6 +26,14 @@ const AssetSelectionProvider = ({ children, disabled = false })=>{
26
26
  }, [
27
27
  disabled
28
28
  ]);
29
+ const selectOnly = useCallback((key)=>{
30
+ if (disabled) return;
31
+ setState(selectAll([
32
+ key
33
+ ]));
34
+ }, [
35
+ disabled
36
+ ]);
29
37
  // No `disabled` guard, like `clear`: this only ever shrinks the selection, and a
30
38
  // disabled provider has nothing in it (every additive path is guarded).
31
39
  const deselect$1 = useCallback((key)=>setState((prev)=>deselect(prev, key)), []);
@@ -45,6 +53,7 @@ const AssetSelectionProvider = ({ children, disabled = false })=>{
45
53
  toggle,
46
54
  selectRange: selectRange$1,
47
55
  selectAll: selectAll$1,
56
+ selectOnly,
48
57
  deselect: deselect$1,
49
58
  clear
50
59
  }), [
@@ -56,6 +65,7 @@ const AssetSelectionProvider = ({ children, disabled = false })=>{
56
65
  toggle,
57
66
  selectRange$1,
58
67
  selectAll$1,
68
+ selectOnly,
59
69
  deselect$1,
60
70
  clear
61
71
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"useAssetSelection.mjs","sources":["../../../../../admin/src/pages/Assets/hooks/useAssetSelection.ts"],"sourcesContent":["import {\n createContext,\n createElement,\n useCallback,\n useContext,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\n\nimport {\n clearSelection,\n createEmptySelection,\n deselect as deselectState,\n getIdsOfKind,\n selectAll as selectAllState,\n selectRange as selectRangeState,\n toggleSelection,\n type ItemKey,\n type SelectionState,\n} from '../utils/selection';\n\n/**\n * Ephemeral, view-state-only multi-select for the future Media Library. Selection\n * is page-scoped and reset on folder navigation or sort/filter changes (the\n * table/grid toggle keeps it — same list, different presentation).\n *\n * The actual computation lives in `../utils/selection.ts` (pure + unit-tested);\n * this hook is a thin React wrapper. Assets and folders share one mechanism —\n * items are tracked as namespaced keys (`asset:1` / `folder:1`) so toggle, range\n * and select-all behave the same for both. Range / select-all receive the\n * ordered key array from the caller (the view owns the rendered order), keeping\n * the context data-source-agnostic.\n */\nexport interface AssetSelection {\n /** Every selected item key (assets and folders), render-order agnostic. */\n selectedKeys: Set<ItemKey>;\n /** Selected asset ids, derived from {@link selectedKeys}. */\n selectedIds: Set<number>;\n /** Selected folder ids, derived from {@link selectedKeys}. */\n selectedFolderIds: Set<number>;\n anchorKey: ItemKey | null;\n isSelected: (key: ItemKey) => boolean;\n /** Additive toggle (Cmd/Ctrl+click, item checkbox). */\n toggle: (key: ItemKey) => void;\n /** Shift+click — selects the contiguous range from the anchor to the target. */\n selectRange: (orderedKeys: ItemKey[], targetKey: ItemKey) => void;\n /** Header checkbox — selects every rendered item (folders and assets). */\n selectAll: (orderedKeys: ItemKey[]) => void;\n /** Row-level \"...\" menu — drops one key when its item leaves the list (move, delete). */\n deselect: (key: ItemKey) => void;\n /** Close button / folder navigation / list-identity changes. */\n clear: () => void;\n}\n\nconst AssetSelectionContext = createContext<AssetSelection | null>(null);\n\ninterface AssetSelectionProviderProps {\n children: ReactNode;\n /**\n * When true, selection is inert: every mutator is a no-op and nothing ever\n * reads as selected. Every bulk action is gated on `assets.update`, so a user\n * without it has nothing to select for — the views also hide the checkboxes,\n * and this makes the remaining paths (click-to-select, Space key) do nothing.\n */\n disabled?: boolean;\n}\n\nexport const AssetSelectionProvider = ({\n children,\n disabled = false,\n}: AssetSelectionProviderProps) => {\n const [state, setState] = useState<SelectionState>(createEmptySelection);\n\n const isSelected = useCallback(\n (key: ItemKey) => !disabled && state.selectedKeys.has(key),\n [disabled, state.selectedKeys]\n );\n\n const toggle = useCallback(\n (key: ItemKey) => {\n if (disabled) return;\n setState((prev) => toggleSelection(prev, key));\n },\n [disabled]\n );\n\n const selectRange = useCallback(\n (orderedKeys: ItemKey[], targetKey: ItemKey) => {\n if (disabled) return;\n setState((prev) => selectRangeState(prev, orderedKeys, targetKey));\n },\n [disabled]\n );\n\n const selectAll = useCallback(\n (orderedKeys: ItemKey[]) => {\n if (disabled) return;\n setState(selectAllState(orderedKeys));\n },\n [disabled]\n );\n\n // No `disabled` guard, like `clear`: this only ever shrinks the selection, and a\n // disabled provider has nothing in it (every additive path is guarded).\n const deselect = useCallback((key: ItemKey) => setState((prev) => deselectState(prev, key)), []);\n\n const clear = useCallback(() => setState(clearSelection()), []);\n\n const selectedIds = useMemo(\n () => getIdsOfKind(state.selectedKeys, 'asset'),\n [state.selectedKeys]\n );\n const selectedFolderIds = useMemo(\n () => getIdsOfKind(state.selectedKeys, 'folder'),\n [state.selectedKeys]\n );\n\n const value = useMemo<AssetSelection>(\n () => ({\n selectedKeys: state.selectedKeys,\n selectedIds,\n selectedFolderIds,\n anchorKey: state.anchorKey,\n isSelected,\n toggle,\n selectRange,\n selectAll,\n deselect,\n clear,\n }),\n [\n state.selectedKeys,\n selectedIds,\n selectedFolderIds,\n state.anchorKey,\n isSelected,\n toggle,\n selectRange,\n selectAll,\n deselect,\n clear,\n ]\n );\n\n return createElement(AssetSelectionContext.Provider, { value }, children);\n};\n\nexport const useAssetSelection = () => {\n const context = useContext(AssetSelectionContext);\n\n if (!context) {\n throw new Error('useAssetSelection must be used within an AssetSelectionProvider');\n }\n\n return context;\n};\n\nexport const useAssetSelectionOptional = () => useContext(AssetSelectionContext);\n"],"names":["AssetSelectionContext","createContext","AssetSelectionProvider","children","disabled","state","setState","useState","createEmptySelection","isSelected","useCallback","key","selectedKeys","has","toggle","prev","toggleSelection","selectRange","orderedKeys","targetKey","selectRangeState","selectAll","selectAllState","deselect","deselectState","clear","clearSelection","selectedIds","useMemo","getIdsOfKind","selectedFolderIds","value","anchorKey","createElement","Provider","useAssetSelection","context","useContext","Error","useAssetSelectionOptional"],"mappings":"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"}
1
+ {"version":3,"file":"useAssetSelection.mjs","sources":["../../../../../admin/src/pages/Assets/hooks/useAssetSelection.ts"],"sourcesContent":["import {\n createContext,\n createElement,\n useCallback,\n useContext,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\n\nimport {\n clearSelection,\n createEmptySelection,\n deselect as deselectState,\n getIdsOfKind,\n selectAll as selectAllState,\n selectRange as selectRangeState,\n toggleSelection,\n type ItemKey,\n type SelectionState,\n} from '../utils/selection';\n\n/**\n * Ephemeral, view-state-only multi-select for the future Media Library. Selection\n * is page-scoped and reset on folder navigation or sort/filter changes (the\n * table/grid toggle keeps it — same list, different presentation).\n *\n * The actual computation lives in `../utils/selection.ts` (pure + unit-tested);\n * this hook is a thin React wrapper. Assets and folders share one mechanism —\n * items are tracked as namespaced keys (`asset:1` / `folder:1`) so toggle, range\n * and select-all behave the same for both. Range / select-all receive the\n * ordered key array from the caller (the view owns the rendered order), keeping\n * the context data-source-agnostic.\n */\nexport interface AssetSelection {\n /** Every selected item key (assets and folders), render-order agnostic. */\n selectedKeys: Set<ItemKey>;\n /** Selected asset ids, derived from {@link selectedKeys}. */\n selectedIds: Set<number>;\n /** Selected folder ids, derived from {@link selectedKeys}. */\n selectedFolderIds: Set<number>;\n anchorKey: ItemKey | null;\n isSelected: (key: ItemKey) => boolean;\n /** Additive toggle (Cmd/Ctrl+click, item checkbox). */\n toggle: (key: ItemKey) => void;\n /** Shift+click — selects the contiguous range from the anchor to the target. */\n selectRange: (orderedKeys: ItemKey[], targetKey: ItemKey) => void;\n /** Header checkbox — selects every rendered item (folders and assets). */\n selectAll: (orderedKeys: ItemKey[]) => void;\n /**\n * Replaces the selection with this one key, as a right-click on an unselected\n * item does: what the menu then acts on is what the user can see is selected.\n */\n selectOnly: (key: ItemKey) => void;\n /** Row-level \"...\" menu — drops one key when its item leaves the list (move, delete). */\n deselect: (key: ItemKey) => void;\n /** Close button / folder navigation / list-identity changes. */\n clear: () => void;\n}\n\nconst AssetSelectionContext = createContext<AssetSelection | null>(null);\n\ninterface AssetSelectionProviderProps {\n children: ReactNode;\n /**\n * When true, selection is inert: every mutator is a no-op and nothing ever\n * reads as selected. Every bulk action is gated on `assets.update`, so a user\n * without it has nothing to select for — the views also hide the checkboxes,\n * and this makes the remaining paths (click-to-select, Space key) do nothing.\n */\n disabled?: boolean;\n}\n\nexport const AssetSelectionProvider = ({\n children,\n disabled = false,\n}: AssetSelectionProviderProps) => {\n const [state, setState] = useState<SelectionState>(createEmptySelection);\n\n const isSelected = useCallback(\n (key: ItemKey) => !disabled && state.selectedKeys.has(key),\n [disabled, state.selectedKeys]\n );\n\n const toggle = useCallback(\n (key: ItemKey) => {\n if (disabled) return;\n setState((prev) => toggleSelection(prev, key));\n },\n [disabled]\n );\n\n const selectRange = useCallback(\n (orderedKeys: ItemKey[], targetKey: ItemKey) => {\n if (disabled) return;\n setState((prev) => selectRangeState(prev, orderedKeys, targetKey));\n },\n [disabled]\n );\n\n const selectAll = useCallback(\n (orderedKeys: ItemKey[]) => {\n if (disabled) return;\n setState(selectAllState(orderedKeys));\n },\n [disabled]\n );\n\n const selectOnly = useCallback(\n (key: ItemKey) => {\n if (disabled) return;\n setState(selectAllState([key]));\n },\n [disabled]\n );\n\n // No `disabled` guard, like `clear`: this only ever shrinks the selection, and a\n // disabled provider has nothing in it (every additive path is guarded).\n const deselect = useCallback((key: ItemKey) => setState((prev) => deselectState(prev, key)), []);\n\n const clear = useCallback(() => setState(clearSelection()), []);\n\n const selectedIds = useMemo(\n () => getIdsOfKind(state.selectedKeys, 'asset'),\n [state.selectedKeys]\n );\n const selectedFolderIds = useMemo(\n () => getIdsOfKind(state.selectedKeys, 'folder'),\n [state.selectedKeys]\n );\n\n const value = useMemo<AssetSelection>(\n () => ({\n selectedKeys: state.selectedKeys,\n selectedIds,\n selectedFolderIds,\n anchorKey: state.anchorKey,\n isSelected,\n toggle,\n selectRange,\n selectAll,\n selectOnly,\n deselect,\n clear,\n }),\n [\n state.selectedKeys,\n selectedIds,\n selectedFolderIds,\n state.anchorKey,\n isSelected,\n toggle,\n selectRange,\n selectAll,\n selectOnly,\n deselect,\n clear,\n ]\n );\n\n return createElement(AssetSelectionContext.Provider, { value }, children);\n};\n\nexport const useAssetSelection = () => {\n const context = useContext(AssetSelectionContext);\n\n if (!context) {\n throw new Error('useAssetSelection must be used within an AssetSelectionProvider');\n }\n\n return context;\n};\n\nexport const useAssetSelectionOptional = () => useContext(AssetSelectionContext);\n"],"names":["AssetSelectionContext","createContext","AssetSelectionProvider","children","disabled","state","setState","useState","createEmptySelection","isSelected","useCallback","key","selectedKeys","has","toggle","prev","toggleSelection","selectRange","orderedKeys","targetKey","selectRangeState","selectAll","selectAllState","selectOnly","deselect","deselectState","clear","clearSelection","selectedIds","useMemo","getIdsOfKind","selectedFolderIds","value","anchorKey","createElement","Provider","useAssetSelection","context","useContext","Error","useAssetSelectionOptional"],"mappings":"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"}
@@ -3,15 +3,16 @@
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
5
  var strapiAdmin = require('@strapi/admin/strapi-admin');
6
- var ee = require('@strapi/admin/strapi-admin/ee');
7
6
  var designSystem = require('@strapi/design-system');
8
7
  var icons = require('@strapi/icons');
9
8
  var isEqual = require('lodash/isEqual');
10
9
  var reactIntl = require('react-intl');
11
10
  var reactQuery = require('react-query');
12
11
  var constants = require('../../constants.js');
12
+ var useTracking = require('../../hooks/useTracking.js');
13
+ var useAIMetadataAvailability = require('../../legacy/hooks/useAIMetadataAvailability.js');
13
14
  var useSettings = require('../../legacy/hooks/useSettings.js');
14
- var useTracking = require('../../legacy/hooks/useTracking.js');
15
+ var settings = require('../../services/settings.js');
15
16
  var translations = require('../../utils/translations.js');
16
17
  var init = require('./init.js');
17
18
  var reducer = require('./reducer.js');
@@ -145,9 +146,12 @@ const MetadataAction = ({ job, imagesWithoutMetadataCount, isConfirmDialogOpen,
145
146
  const { put, post, get } = strapiAdmin.useFetchClient();
146
147
  const [isConfirmDialogOpen, setIsConfirmDialogOpen] = React__namespace.useState(false);
147
148
  const { trackUsage } = useTracking.useTracking();
149
+ // Events read this cache. Saving must refresh it, or the next event still
150
+ // reports the value from before the save.
151
+ const { refetch: refetchUploadSettings } = settings.useGetUploadSettingsQuery();
148
152
  const [{ initialData, modifiedData }, dispatch] = React__namespace.useReducer(reducer.reducer, reducer.initialState, init.init);
149
153
  const { data, isLoading, refetch } = useSettings.useSettings();
150
- const isAIAvailable = ee.useAIAvailability();
154
+ const isAIAvailable = useAIMetadataAvailability.useAIMetadataAvailability();
151
155
  const { data: imageCountResponse, isLoading: isLoadingImagesWithoutMetadataCount } = reactQuery.useQuery([
152
156
  'ai-metadata-count'
153
157
  ], async ()=>{
@@ -171,6 +175,9 @@ const MetadataAction = ({ job, imagesWithoutMetadataCount, isConfirmDialogOpen,
171
175
  const isSaveButtonDisabled = isEqual__default.default(initialData, modifiedData);
172
176
  const { mutateAsync, isLoading: isSubmitting } = reactQuery.useMutation(async (body)=>{
173
177
  const { data } = await put('/upload/settings', body);
178
+ // Refresh before the form's own refetch reveals actions (such as
179
+ // retroactive generation) that emit a tracking event.
180
+ await refetchUploadSettings();
174
181
  return data;
175
182
  }, {
176
183
  onSuccess () {
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsPage.js","sources":["../../../../admin/src/pages/SettingsPage/SettingsPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n useNotification,\n useFetchClient,\n Layouts,\n ConfirmDialog,\n} from '@strapi/admin/strapi-admin';\nimport { useAIAvailability } from '@strapi/admin/strapi-admin/ee';\nimport {\n Box,\n Button,\n Dialog,\n Flex,\n Grid,\n Toggle,\n Typography,\n Field,\n Status,\n Divider,\n StatusProps,\n TextButton,\n} from '@strapi/design-system';\nimport { Check, Sparkle } from '@strapi/icons';\nimport isEqual from 'lodash/isEqual';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery } from 'react-query';\n\nimport { AIMetadataJob } from '../../../../shared/contracts/ai-metadata-jobs';\nimport { GetAIMetadataPendingCount, CreateAIMetadataJob } from '../../../../shared/contracts/files';\nimport { UpdateSettings } from '../../../../shared/contracts/settings';\nimport { PERMISSIONS } from '../../constants';\nimport { useSettings } from '../../legacy/hooks/useSettings';\nimport { useTracking } from '../../legacy/hooks/useTracking';\nimport { getTranslationKey } from '../../utils/translations';\n\nimport { init } from './init';\nimport { initialState, reducer } from './reducer';\nimport { useAIMetadataJob } from './useAIMetadataJob';\n\nimport type { InitialState } from './reducer';\n\n/* -------------------------------------------------------------------------------------------------\n * MetadataAction\n * -----------------------------------------------------------------------------------------------*/\n\nconst BetaStatus = (props: Omit<StatusProps, 'children'>) => {\n const { formatMessage } = useIntl();\n\n return (\n <Status\n size=\"S\"\n variant=\"secondary\"\n style={{ textTransform: 'uppercase', display: 'flex' }}\n {...props}\n >\n <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n {formatMessage({\n id: 'app.components.Status.beta',\n defaultMessage: 'Beta',\n })}\n </Typography>\n </Status>\n );\n};\n\ninterface MetadataActionProps {\n job: AIMetadataJob | null;\n imagesWithoutMetadataCount: number;\n isConfirmDialogOpen: boolean;\n onConfirmDialogChange: (open: boolean) => void;\n onGenerate: () => Promise<void>;\n}\n\nconst MetadataAction = ({\n job,\n imagesWithoutMetadataCount,\n isConfirmDialogOpen,\n onConfirmDialogChange,\n onGenerate,\n}: MetadataActionProps) => {\n const { formatMessage } = useIntl();\n\n // If there's an active job processing\n if (job?.status === 'processing') {\n return (\n <Flex gap={2} alignItems=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('settings.form.aiMetadata.generatingMetadata'),\n defaultMessage: 'AI is generating your metadata',\n })}\n </Typography>\n </Flex>\n );\n }\n\n // Only show completed state when all images have metadata\n if (imagesWithoutMetadataCount === 0) {\n return (\n <Typography variant=\"pi\" textColor=\"primary600\">\n <Flex gap={2} alignItems=\"center\">\n <Check width=\"16px\" height=\"16px\" />\n {formatMessage({\n id: getTranslationKey('settings.form.aiMetadata.metadataGenerated'),\n defaultMessage: 'Your metadata has been generated',\n })}\n </Flex>\n </Typography>\n );\n }\n\n return (\n <Dialog.Root open={isConfirmDialogOpen} onOpenChange={onConfirmDialogChange}>\n <Dialog.Trigger>\n <TextButton disabled={imagesWithoutMetadataCount === 0}>\n {formatMessage({\n id: getTranslationKey('settings.form.aiMetadata.generateButton'),\n defaultMessage: 'Generate metadata',\n })}\n </TextButton>\n </Dialog.Trigger>\n <ConfirmDialog\n variant=\"success-light\"\n onConfirm={onGenerate}\n title={\n <Flex gap={2}>\n <BetaStatus />\n {formatMessage({\n id: getTranslationKey('settings.form.aiMetadata.confirmDialog.title'),\n defaultMessage: 'Generate AI Metadata',\n })}\n </Flex>\n }\n >\n {formatMessage(\n {\n id: getTranslationKey('settings.form.aiMetadata.confirmDialog.message'),\n defaultMessage:\n 'This will start a process in the background to generate captions and alternative text for {count, plural, one {# image} other {# images}}. AI can make mistakes, be sure to review the generated content.',\n },\n { count: imagesWithoutMetadataCount }\n )}\n </ConfirmDialog>\n </Dialog.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * SettingsPage\n * -----------------------------------------------------------------------------------------------*/\n\nexport const SettingsPage = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { put, post, get } = useFetchClient();\n const [isConfirmDialogOpen, setIsConfirmDialogOpen] = React.useState(false);\n const { trackUsage } = useTracking();\n\n const [{ initialData, modifiedData }, dispatch] = React.useReducer(reducer, initialState, init);\n\n const { data, isLoading, refetch } = useSettings();\n const isAIAvailable = useAIAvailability();\n\n const { data: imageCountResponse, isLoading: isLoadingImagesWithoutMetadataCount } = useQuery<\n GetAIMetadataPendingCount.Response['data'],\n GetAIMetadataPendingCount.Response['error']\n >(\n ['ai-metadata-count'],\n async () => {\n const { data } = await get<GetAIMetadataPendingCount.Response['data']>(\n '/upload/ai-metadata-jobs/pending-count'\n );\n return data;\n },\n {\n enabled: isAIAvailable && !!data?.aiMetadata,\n retry: false,\n }\n );\n\n const imagesWithoutMetadataCount = imageCountResponse?.imagesWithoutMetadataCount ?? 0;\n\n React.useEffect(() => {\n if (data) {\n dispatch({\n type: 'GET_DATA_SUCCEEDED',\n data,\n });\n }\n }, [data]);\n\n const isSaveButtonDisabled = isEqual(initialData, modifiedData);\n\n const { mutateAsync, isLoading: isSubmitting } = useMutation<\n UpdateSettings.Response['data'],\n UpdateSettings.Response['error'],\n UpdateSettings.Request['body']\n >(\n async (body) => {\n const { data } = await put<UpdateSettings.Response['data'], UpdateSettings.Request['body']>(\n '/upload/settings',\n body\n );\n\n return data;\n },\n {\n onSuccess() {\n refetch();\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'notification.form.success.fields' }),\n });\n },\n onError(err) {\n toggleNotification({\n type: 'danger',\n message: err?.message ?? formatMessage({ id: 'notification.error' }),\n });\n },\n }\n );\n\n // Poll for latest active job - notifications are handled inside the hook\n const { data: aiMetadataJob, refetch: refetchAiMetadataJob } = useAIMetadataJob({\n enabled: isAIAvailable,\n });\n\n const { mutateAsync: startGenerateAIMetadata } = useMutation<\n CreateAIMetadataJob.Response['data'],\n CreateAIMetadataJob.Response['error'],\n void\n >(\n async () => {\n const { data } = await post<\n CreateAIMetadataJob.Response['data'],\n CreateAIMetadataJob.Request['body']\n >('/upload/ai-metadata-jobs', {});\n return data;\n },\n {\n onSuccess() {\n setIsConfirmDialogOpen(false);\n // Refetch job status to start polling the new job\n refetchAiMetadataJob();\n },\n onError(err) {\n toggleNotification({\n type: 'danger',\n message: (err as Error)?.message || formatMessage({ id: 'notification.error' }),\n });\n setIsConfirmDialogOpen(false);\n },\n }\n );\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (isSaveButtonDisabled) {\n return;\n }\n\n await mutateAsync(modifiedData!);\n };\n\n const handleChange = ({\n target: { name, value },\n }: {\n target: { name: keyof NonNullable<InitialState['initialData']>; value: boolean };\n }) => {\n dispatch({\n type: 'ON_CHANGE',\n keys: name,\n value,\n });\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <Page.Main tabIndex={-1}>\n <Page.Title>\n {formatMessage({\n id: getTranslationKey('page.title'),\n defaultMessage: 'Settings - Media Library',\n })}\n </Page.Title>\n <form onSubmit={handleSubmit}>\n <Layouts.Header\n title={formatMessage({\n id: getTranslationKey('settings.header.label'),\n defaultMessage: 'Media Library',\n })}\n primaryAction={\n <Button\n disabled={isSaveButtonDisabled}\n loading={isSubmitting}\n type=\"submit\"\n startIcon={<Check />}\n size=\"S\"\n fullWidth\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n }\n subtitle={formatMessage({\n id: getTranslationKey('settings.sub-header.label'),\n defaultMessage: 'Configure the settings for the Media Library',\n })}\n />\n <Layouts.Content>\n <Layouts.Root>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n {/* AI features section when ai is available */}\n {isAIAvailable && (\n <Box background=\"neutral0\" padding={6} shadow=\"filterShadow\" hasRadius>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Grid.Root gap={6}>\n <Grid.Item col={8} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Flex gap={2}>\n <Box color=\"alternative700\">\n <Sparkle />\n </Box>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslationKey('settings.form.aiMetadata.label'),\n defaultMessage:\n 'Generate AI captions and alt texts automatically on upload!',\n })}\n </Typography>\n </Flex>\n <Flex paddingTop={1}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('settings.form.aiMetadata.description'),\n defaultMessage:\n 'Enable this feature to save time, optimize your SEO and increase accessibility by letting our AI generate captions and alternative texts for you.',\n })}\n </Typography>\n </Flex>\n </Grid.Item>\n <Grid.Item\n col={4}\n xs={12}\n direction=\"column\"\n alignItems=\"end\"\n justifyContent={'center'}\n >\n <Field.Root name=\"aiMetadata\" minWidth=\"200px\">\n <Toggle\n checked={modifiedData?.aiMetadata}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.disabled-label',\n defaultMessage: 'Disabled',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.enabled-label',\n defaultMessage: 'Enabled',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'aiMetadata', value: e.target.checked },\n });\n }}\n />\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n {/* Retroactive metadata generation when aiMetadata is enabled */}\n {initialData?.aiMetadata &&\n !isLoadingImagesWithoutMetadataCount &&\n Boolean(imageCountResponse?.totalImages) && (\n <>\n <Divider marginTop={4} marginBottom={4} />\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={2}>\n <Flex gap={2}>\n <BetaStatus size=\"XS\" />\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {imagesWithoutMetadataCount === 0\n ? formatMessage({\n id: getTranslationKey(\n 'settings.form.aiMetadata.allAssetsHaveMetadata'\n ),\n defaultMessage: 'All assets have caption and alt text',\n })\n : formatMessage(\n {\n id: getTranslationKey(\n 'settings.form.aiMetadata.imagesWithoutMetadata'\n ),\n defaultMessage:\n '{count, plural, one {# image lacks captions or alternative text} other {# images lack captions or alternative text}}',\n },\n { count: imagesWithoutMetadataCount }\n )}\n </Typography>\n </Flex>\n <MetadataAction\n job={aiMetadataJob ?? null}\n imagesWithoutMetadataCount={imagesWithoutMetadataCount}\n isConfirmDialogOpen={isConfirmDialogOpen}\n onConfirmDialogChange={setIsConfirmDialogOpen}\n onGenerate={async () => {\n await startGenerateAIMetadata();\n trackUsage('didGenerateMetadataRetroactively');\n }}\n />\n </Flex>\n </>\n )}\n </Flex>\n </Box>\n )}\n\n <Box background=\"neutral0\" padding={6} shadow=\"filterShadow\" hasRadius>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslationKey('settings.blockTitle'),\n defaultMessage: 'Asset management',\n })}\n </Typography>\n </Flex>\n <Grid.Root gap={6}>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTranslationKey('settings.form.responsiveDimensions.description'),\n defaultMessage:\n 'Enabling this option will generate multiple formats (small, medium and large) of the uploaded asset.',\n })}\n name=\"responsiveDimensions\"\n >\n <Field.Label>\n {formatMessage({\n id: getTranslationKey('settings.form.responsiveDimensions.label'),\n defaultMessage: 'Responsive friendly upload',\n })}\n </Field.Label>\n <Toggle\n checked={modifiedData?.responsiveDimensions}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.off-label',\n defaultMessage: 'Off',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.on-label',\n defaultMessage: 'On',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'responsiveDimensions', value: e.target.checked },\n });\n }}\n />\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTranslationKey('settings.form.sizeOptimization.description'),\n defaultMessage:\n 'Enabling this option will reduce the image size and slightly reduce its quality.',\n })}\n name=\"sizeOptimization\"\n >\n <Field.Label>\n {formatMessage({\n id: getTranslationKey('settings.form.sizeOptimization.label'),\n defaultMessage: 'Size optimization',\n })}\n </Field.Label>\n <Toggle\n checked={modifiedData?.sizeOptimization}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.off-label',\n defaultMessage: 'Off',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.on-label',\n defaultMessage: 'On',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'sizeOptimization', value: e.target.checked },\n });\n }}\n />\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTranslationKey('settings.form.autoOrientation.description'),\n defaultMessage:\n 'Enabling this option will automatically rotate the image according to EXIF orientation tag.',\n })}\n name=\"autoOrientation\"\n >\n <Field.Label>\n {formatMessage({\n id: getTranslationKey('settings.form.autoOrientation.label'),\n defaultMessage: 'Auto orientation',\n })}\n </Field.Label>\n <Toggle\n checked={modifiedData?.autoOrientation}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.off-label',\n defaultMessage: 'Off',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.on-label',\n defaultMessage: 'On',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'autoOrientation', value: e.target.checked },\n });\n }}\n />\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Flex>\n </Box>\n </Flex>\n </Layouts.Root>\n </Layouts.Content>\n </form>\n </Page.Main>\n );\n};\n\nexport const ProtectedSettingsPage = () => (\n <Page.Protect permissions={PERMISSIONS.settings}>\n <SettingsPage />\n </Page.Protect>\n);\n"],"names":["BetaStatus","props","formatMessage","useIntl","_jsx","Status","size","variant","style","textTransform","display","Typography","tag","fontWeight","id","defaultMessage","MetadataAction","job","imagesWithoutMetadataCount","isConfirmDialogOpen","onConfirmDialogChange","onGenerate","status","Flex","gap","alignItems","textColor","getTranslationKey","_jsxs","Check","width","height","Dialog","Root","open","onOpenChange","Trigger","TextButton","disabled","ConfirmDialog","onConfirm","title","count","SettingsPage","toggleNotification","useNotification","put","post","get","useFetchClient","setIsConfirmDialogOpen","React","useState","trackUsage","useTracking","initialData","modifiedData","dispatch","useReducer","reducer","initialState","init","data","isLoading","refetch","useSettings","isAIAvailable","useAIAvailability","imageCountResponse","isLoadingImagesWithoutMetadataCount","useQuery","enabled","aiMetadata","retry","useEffect","type","isSaveButtonDisabled","isEqual","mutateAsync","isSubmitting","useMutation","body","onSuccess","message","onError","err","aiMetadataJob","refetchAiMetadataJob","useAIMetadataJob","startGenerateAIMetadata","handleSubmit","e","preventDefault","handleChange","target","name","value","keys","Page","Loading","Main","tabIndex","Title","form","onSubmit","Layouts","Header","primaryAction","Button","loading","startIcon","fullWidth","subtitle","Content","direction","Box","background","padding","shadow","hasRadius","Grid","Item","col","xs","color","Sparkle","paddingTop","justifyContent","Field","minWidth","Toggle","checked","offLabel","onLabel","onChange","Boolean","totalImages","_Fragment","Divider","marginTop","marginBottom","hint","Label","responsiveDimensions","Hint","sizeOptimization","autoOrientation","ProtectedSettingsPage","Protect","permissions","PERMISSIONS","settings"],"mappings":"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"}
1
+ {"version":3,"file":"SettingsPage.js","sources":["../../../../admin/src/pages/SettingsPage/SettingsPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n useNotification,\n useFetchClient,\n Layouts,\n ConfirmDialog,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Button,\n Dialog,\n Flex,\n Grid,\n Toggle,\n Typography,\n Field,\n Status,\n Divider,\n StatusProps,\n TextButton,\n} from '@strapi/design-system';\nimport { Check, Sparkle } from '@strapi/icons';\nimport isEqual from 'lodash/isEqual';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery } from 'react-query';\n\nimport { AIMetadataJob } from '../../../../shared/contracts/ai-metadata-jobs';\nimport { GetAIMetadataPendingCount, CreateAIMetadataJob } from '../../../../shared/contracts/files';\nimport { UpdateSettings } from '../../../../shared/contracts/settings';\nimport { PERMISSIONS } from '../../constants';\nimport { useTracking } from '../../hooks/useTracking';\nimport { useAIMetadataAvailability } from '../../legacy/hooks/useAIMetadataAvailability';\nimport { useSettings } from '../../legacy/hooks/useSettings';\nimport { useGetUploadSettingsQuery } from '../../services/settings';\nimport { getTranslationKey } from '../../utils/translations';\n\nimport { init } from './init';\nimport { initialState, reducer } from './reducer';\nimport { useAIMetadataJob } from './useAIMetadataJob';\n\nimport type { InitialState } from './reducer';\n\n/* -------------------------------------------------------------------------------------------------\n * MetadataAction\n * -----------------------------------------------------------------------------------------------*/\n\nconst BetaStatus = (props: Omit<StatusProps, 'children'>) => {\n const { formatMessage } = useIntl();\n\n return (\n <Status\n size=\"S\"\n variant=\"secondary\"\n style={{ textTransform: 'uppercase', display: 'flex' }}\n {...props}\n >\n <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n {formatMessage({\n id: 'app.components.Status.beta',\n defaultMessage: 'Beta',\n })}\n </Typography>\n </Status>\n );\n};\n\ninterface MetadataActionProps {\n job: AIMetadataJob | null;\n imagesWithoutMetadataCount: number;\n isConfirmDialogOpen: boolean;\n onConfirmDialogChange: (open: boolean) => void;\n onGenerate: () => Promise<void>;\n}\n\nconst MetadataAction = ({\n job,\n imagesWithoutMetadataCount,\n isConfirmDialogOpen,\n onConfirmDialogChange,\n onGenerate,\n}: MetadataActionProps) => {\n const { formatMessage } = useIntl();\n\n // If there's an active job processing\n if (job?.status === 'processing') {\n return (\n <Flex gap={2} alignItems=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('settings.form.aiMetadata.generatingMetadata'),\n defaultMessage: 'AI is generating your metadata',\n })}\n </Typography>\n </Flex>\n );\n }\n\n // Only show completed state when all images have metadata\n if (imagesWithoutMetadataCount === 0) {\n return (\n <Typography variant=\"pi\" textColor=\"primary600\">\n <Flex gap={2} alignItems=\"center\">\n <Check width=\"16px\" height=\"16px\" />\n {formatMessage({\n id: getTranslationKey('settings.form.aiMetadata.metadataGenerated'),\n defaultMessage: 'Your metadata has been generated',\n })}\n </Flex>\n </Typography>\n );\n }\n\n return (\n <Dialog.Root open={isConfirmDialogOpen} onOpenChange={onConfirmDialogChange}>\n <Dialog.Trigger>\n <TextButton disabled={imagesWithoutMetadataCount === 0}>\n {formatMessage({\n id: getTranslationKey('settings.form.aiMetadata.generateButton'),\n defaultMessage: 'Generate metadata',\n })}\n </TextButton>\n </Dialog.Trigger>\n <ConfirmDialog\n variant=\"success-light\"\n onConfirm={onGenerate}\n title={\n <Flex gap={2}>\n <BetaStatus />\n {formatMessage({\n id: getTranslationKey('settings.form.aiMetadata.confirmDialog.title'),\n defaultMessage: 'Generate AI Metadata',\n })}\n </Flex>\n }\n >\n {formatMessage(\n {\n id: getTranslationKey('settings.form.aiMetadata.confirmDialog.message'),\n defaultMessage:\n 'This will start a process in the background to generate captions and alternative text for {count, plural, one {# image} other {# images}}. AI can make mistakes, be sure to review the generated content.',\n },\n { count: imagesWithoutMetadataCount }\n )}\n </ConfirmDialog>\n </Dialog.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * SettingsPage\n * -----------------------------------------------------------------------------------------------*/\n\nexport const SettingsPage = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { put, post, get } = useFetchClient();\n const [isConfirmDialogOpen, setIsConfirmDialogOpen] = React.useState(false);\n const { trackUsage } = useTracking();\n // Events read this cache. Saving must refresh it, or the next event still\n // reports the value from before the save.\n const { refetch: refetchUploadSettings } = useGetUploadSettingsQuery();\n\n const [{ initialData, modifiedData }, dispatch] = React.useReducer(reducer, initialState, init);\n\n const { data, isLoading, refetch } = useSettings();\n const isAIAvailable = useAIMetadataAvailability();\n\n const { data: imageCountResponse, isLoading: isLoadingImagesWithoutMetadataCount } = useQuery<\n GetAIMetadataPendingCount.Response['data'],\n GetAIMetadataPendingCount.Response['error']\n >(\n ['ai-metadata-count'],\n async () => {\n const { data } = await get<GetAIMetadataPendingCount.Response['data']>(\n '/upload/ai-metadata-jobs/pending-count'\n );\n return data;\n },\n {\n enabled: isAIAvailable && !!data?.aiMetadata,\n retry: false,\n }\n );\n\n const imagesWithoutMetadataCount = imageCountResponse?.imagesWithoutMetadataCount ?? 0;\n\n React.useEffect(() => {\n if (data) {\n dispatch({\n type: 'GET_DATA_SUCCEEDED',\n data,\n });\n }\n }, [data]);\n\n const isSaveButtonDisabled = isEqual(initialData, modifiedData);\n\n const { mutateAsync, isLoading: isSubmitting } = useMutation<\n UpdateSettings.Response['data'],\n UpdateSettings.Response['error'],\n UpdateSettings.Request['body']\n >(\n async (body) => {\n const { data } = await put<UpdateSettings.Response['data'], UpdateSettings.Request['body']>(\n '/upload/settings',\n body\n );\n\n // Refresh before the form's own refetch reveals actions (such as\n // retroactive generation) that emit a tracking event.\n await refetchUploadSettings();\n\n return data;\n },\n {\n onSuccess() {\n refetch();\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'notification.form.success.fields' }),\n });\n },\n onError(err) {\n toggleNotification({\n type: 'danger',\n message: err?.message ?? formatMessage({ id: 'notification.error' }),\n });\n },\n }\n );\n\n // Poll for latest active job - notifications are handled inside the hook\n const { data: aiMetadataJob, refetch: refetchAiMetadataJob } = useAIMetadataJob({\n enabled: isAIAvailable,\n });\n\n const { mutateAsync: startGenerateAIMetadata } = useMutation<\n CreateAIMetadataJob.Response['data'],\n CreateAIMetadataJob.Response['error'],\n void\n >(\n async () => {\n const { data } = await post<\n CreateAIMetadataJob.Response['data'],\n CreateAIMetadataJob.Request['body']\n >('/upload/ai-metadata-jobs', {});\n return data;\n },\n {\n onSuccess() {\n setIsConfirmDialogOpen(false);\n // Refetch job status to start polling the new job\n refetchAiMetadataJob();\n },\n onError(err) {\n toggleNotification({\n type: 'danger',\n message: (err as Error)?.message || formatMessage({ id: 'notification.error' }),\n });\n setIsConfirmDialogOpen(false);\n },\n }\n );\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (isSaveButtonDisabled) {\n return;\n }\n\n await mutateAsync(modifiedData!);\n };\n\n const handleChange = ({\n target: { name, value },\n }: {\n target: { name: keyof NonNullable<InitialState['initialData']>; value: boolean };\n }) => {\n dispatch({\n type: 'ON_CHANGE',\n keys: name,\n value,\n });\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <Page.Main tabIndex={-1}>\n <Page.Title>\n {formatMessage({\n id: getTranslationKey('page.title'),\n defaultMessage: 'Settings - Media Library',\n })}\n </Page.Title>\n <form onSubmit={handleSubmit}>\n <Layouts.Header\n title={formatMessage({\n id: getTranslationKey('settings.header.label'),\n defaultMessage: 'Media Library',\n })}\n primaryAction={\n <Button\n disabled={isSaveButtonDisabled}\n loading={isSubmitting}\n type=\"submit\"\n startIcon={<Check />}\n size=\"S\"\n fullWidth\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n }\n subtitle={formatMessage({\n id: getTranslationKey('settings.sub-header.label'),\n defaultMessage: 'Configure the settings for the Media Library',\n })}\n />\n <Layouts.Content>\n <Layouts.Root>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n {/* AI features section when ai is available */}\n {isAIAvailable && (\n <Box background=\"neutral0\" padding={6} shadow=\"filterShadow\" hasRadius>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Grid.Root gap={6}>\n <Grid.Item col={8} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Flex gap={2}>\n <Box color=\"alternative700\">\n <Sparkle />\n </Box>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslationKey('settings.form.aiMetadata.label'),\n defaultMessage:\n 'Generate AI captions and alt texts automatically on upload!',\n })}\n </Typography>\n </Flex>\n <Flex paddingTop={1}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('settings.form.aiMetadata.description'),\n defaultMessage:\n 'Enable this feature to save time, optimize your SEO and increase accessibility by letting our AI generate captions and alternative texts for you.',\n })}\n </Typography>\n </Flex>\n </Grid.Item>\n <Grid.Item\n col={4}\n xs={12}\n direction=\"column\"\n alignItems=\"end\"\n justifyContent={'center'}\n >\n <Field.Root name=\"aiMetadata\" minWidth=\"200px\">\n <Toggle\n checked={modifiedData?.aiMetadata}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.disabled-label',\n defaultMessage: 'Disabled',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.enabled-label',\n defaultMessage: 'Enabled',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'aiMetadata', value: e.target.checked },\n });\n }}\n />\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n {/* Retroactive metadata generation when aiMetadata is enabled */}\n {initialData?.aiMetadata &&\n !isLoadingImagesWithoutMetadataCount &&\n Boolean(imageCountResponse?.totalImages) && (\n <>\n <Divider marginTop={4} marginBottom={4} />\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={2}>\n <Flex gap={2}>\n <BetaStatus size=\"XS\" />\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {imagesWithoutMetadataCount === 0\n ? formatMessage({\n id: getTranslationKey(\n 'settings.form.aiMetadata.allAssetsHaveMetadata'\n ),\n defaultMessage: 'All assets have caption and alt text',\n })\n : formatMessage(\n {\n id: getTranslationKey(\n 'settings.form.aiMetadata.imagesWithoutMetadata'\n ),\n defaultMessage:\n '{count, plural, one {# image lacks captions or alternative text} other {# images lack captions or alternative text}}',\n },\n { count: imagesWithoutMetadataCount }\n )}\n </Typography>\n </Flex>\n <MetadataAction\n job={aiMetadataJob ?? null}\n imagesWithoutMetadataCount={imagesWithoutMetadataCount}\n isConfirmDialogOpen={isConfirmDialogOpen}\n onConfirmDialogChange={setIsConfirmDialogOpen}\n onGenerate={async () => {\n await startGenerateAIMetadata();\n trackUsage('didGenerateMetadataRetroactively');\n }}\n />\n </Flex>\n </>\n )}\n </Flex>\n </Box>\n )}\n\n <Box background=\"neutral0\" padding={6} shadow=\"filterShadow\" hasRadius>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslationKey('settings.blockTitle'),\n defaultMessage: 'Asset management',\n })}\n </Typography>\n </Flex>\n <Grid.Root gap={6}>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTranslationKey('settings.form.responsiveDimensions.description'),\n defaultMessage:\n 'Enabling this option will generate multiple formats (small, medium and large) of the uploaded asset.',\n })}\n name=\"responsiveDimensions\"\n >\n <Field.Label>\n {formatMessage({\n id: getTranslationKey('settings.form.responsiveDimensions.label'),\n defaultMessage: 'Responsive friendly upload',\n })}\n </Field.Label>\n <Toggle\n checked={modifiedData?.responsiveDimensions}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.off-label',\n defaultMessage: 'Off',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.on-label',\n defaultMessage: 'On',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'responsiveDimensions', value: e.target.checked },\n });\n }}\n />\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTranslationKey('settings.form.sizeOptimization.description'),\n defaultMessage:\n 'Enabling this option will reduce the image size and slightly reduce its quality.',\n })}\n name=\"sizeOptimization\"\n >\n <Field.Label>\n {formatMessage({\n id: getTranslationKey('settings.form.sizeOptimization.label'),\n defaultMessage: 'Size optimization',\n })}\n </Field.Label>\n <Toggle\n checked={modifiedData?.sizeOptimization}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.off-label',\n defaultMessage: 'Off',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.on-label',\n defaultMessage: 'On',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'sizeOptimization', value: e.target.checked },\n });\n }}\n />\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTranslationKey('settings.form.autoOrientation.description'),\n defaultMessage:\n 'Enabling this option will automatically rotate the image according to EXIF orientation tag.',\n })}\n name=\"autoOrientation\"\n >\n <Field.Label>\n {formatMessage({\n id: getTranslationKey('settings.form.autoOrientation.label'),\n defaultMessage: 'Auto orientation',\n })}\n </Field.Label>\n <Toggle\n checked={modifiedData?.autoOrientation}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.off-label',\n defaultMessage: 'Off',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.on-label',\n defaultMessage: 'On',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'autoOrientation', value: e.target.checked },\n });\n }}\n />\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Flex>\n </Box>\n </Flex>\n </Layouts.Root>\n </Layouts.Content>\n </form>\n </Page.Main>\n );\n};\n\nexport const ProtectedSettingsPage = () => (\n <Page.Protect permissions={PERMISSIONS.settings}>\n <SettingsPage />\n </Page.Protect>\n);\n"],"names":["BetaStatus","props","formatMessage","useIntl","_jsx","Status","size","variant","style","textTransform","display","Typography","tag","fontWeight","id","defaultMessage","MetadataAction","job","imagesWithoutMetadataCount","isConfirmDialogOpen","onConfirmDialogChange","onGenerate","status","Flex","gap","alignItems","textColor","getTranslationKey","_jsxs","Check","width","height","Dialog","Root","open","onOpenChange","Trigger","TextButton","disabled","ConfirmDialog","onConfirm","title","count","SettingsPage","toggleNotification","useNotification","put","post","get","useFetchClient","setIsConfirmDialogOpen","React","useState","trackUsage","useTracking","refetch","refetchUploadSettings","useGetUploadSettingsQuery","initialData","modifiedData","dispatch","useReducer","reducer","initialState","init","data","isLoading","useSettings","isAIAvailable","useAIMetadataAvailability","imageCountResponse","isLoadingImagesWithoutMetadataCount","useQuery","enabled","aiMetadata","retry","useEffect","type","isSaveButtonDisabled","isEqual","mutateAsync","isSubmitting","useMutation","body","onSuccess","message","onError","err","aiMetadataJob","refetchAiMetadataJob","useAIMetadataJob","startGenerateAIMetadata","handleSubmit","e","preventDefault","handleChange","target","name","value","keys","Page","Loading","Main","tabIndex","Title","form","onSubmit","Layouts","Header","primaryAction","Button","loading","startIcon","fullWidth","subtitle","Content","direction","Box","background","padding","shadow","hasRadius","Grid","Item","col","xs","color","Sparkle","paddingTop","justifyContent","Field","minWidth","Toggle","checked","offLabel","onLabel","onChange","Boolean","totalImages","_Fragment","Divider","marginTop","marginBottom","hint","Label","responsiveDimensions","Hint","sizeOptimization","autoOrientation","ProtectedSettingsPage","Protect","permissions","PERMISSIONS","settings"],"mappings":"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"}