@strapi/upload 5.51.1 → 5.52.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 (369) hide show
  1. package/dist/admin/components/AssetCard/VideoPreview.js +1 -1
  2. package/dist/admin/components/AssetCard/VideoPreview.js.map +1 -1
  3. package/dist/admin/components/AssetCard/VideoPreview.mjs +1 -1
  4. package/dist/admin/components/AssetCard/VideoPreview.mjs.map +1 -1
  5. package/dist/admin/components/TableList/TableList.js +1 -1
  6. package/dist/admin/components/TableList/TableList.js.map +1 -1
  7. package/dist/admin/components/TableList/TableList.mjs +1 -1
  8. package/dist/admin/components/TableList/TableList.mjs.map +1 -1
  9. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +21 -4
  10. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
  11. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +21 -4
  12. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
  13. package/dist/admin/future/App.js +3 -3
  14. package/dist/admin/future/App.js.map +1 -1
  15. package/dist/admin/future/App.mjs +4 -4
  16. package/dist/admin/future/App.mjs.map +1 -1
  17. package/dist/admin/future/components/BetaNotice.js +72 -0
  18. package/dist/admin/future/components/BetaNotice.js.map +1 -0
  19. package/dist/admin/future/components/BetaNotice.mjs +70 -0
  20. package/dist/admin/future/components/BetaNotice.mjs.map +1 -0
  21. package/dist/admin/future/components/Drawer.js +18 -3
  22. package/dist/admin/future/components/Drawer.js.map +1 -1
  23. package/dist/admin/future/components/Drawer.mjs +18 -3
  24. package/dist/admin/future/components/Drawer.mjs.map +1 -1
  25. package/dist/admin/future/components/UploadProgressDialog.js +200 -27
  26. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
  27. package/dist/admin/future/components/UploadProgressDialog.mjs +203 -30
  28. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
  29. package/dist/admin/future/hooks/useAIMetadataEnabled.js +39 -0
  30. package/dist/admin/future/hooks/useAIMetadataEnabled.js.map +1 -0
  31. package/dist/admin/future/hooks/useAIMetadataEnabled.mjs +37 -0
  32. package/dist/admin/future/hooks/useAIMetadataEnabled.mjs.map +1 -0
  33. package/dist/admin/future/hooks/useMediaLibraryPermissions.js +35 -0
  34. package/dist/admin/future/hooks/useMediaLibraryPermissions.js.map +1 -0
  35. package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs +33 -0
  36. package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs.map +1 -0
  37. package/dist/admin/future/pages/Assets/AssetsPage.js +453 -170
  38. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  39. package/dist/admin/future/pages/Assets/AssetsPage.mjs +454 -171
  40. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  41. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js +46 -0
  42. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js.map +1 -0
  43. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs +44 -0
  44. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs.map +1 -0
  45. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +325 -0
  46. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -0
  47. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +323 -0
  48. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -0
  49. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +110 -46
  50. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
  51. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +110 -46
  52. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
  53. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +95 -67
  54. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  55. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +95 -68
  56. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  57. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +94 -26
  58. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  59. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +96 -28
  60. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  61. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js +112 -0
  62. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js.map +1 -0
  63. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs +110 -0
  64. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs.map +1 -0
  65. package/dist/admin/future/pages/Assets/components/AssetsTable.js +172 -56
  66. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  67. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +175 -59
  68. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  69. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +188 -138
  70. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
  71. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +191 -141
  72. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
  73. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +123 -76
  74. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -1
  75. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +126 -79
  76. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -1
  77. package/dist/admin/future/pages/Assets/components/BusyOverlay.js +36 -0
  78. package/dist/admin/future/pages/Assets/components/BusyOverlay.js.map +1 -0
  79. package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs +34 -0
  80. package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs.map +1 -0
  81. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js +193 -0
  82. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js.map +1 -0
  83. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs +191 -0
  84. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs.map +1 -0
  85. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js +131 -0
  86. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js.map +1 -0
  87. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs +129 -0
  88. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs.map +1 -0
  89. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +45 -18
  90. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
  91. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +46 -19
  92. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
  93. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +28 -31
  94. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -1
  95. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +28 -31
  96. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -1
  97. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +10 -15
  98. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  99. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +10 -15
  100. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  101. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js +13 -3
  102. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
  103. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +13 -3
  104. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
  105. package/dist/admin/future/pages/Assets/components/EmptyState.js +62 -3
  106. package/dist/admin/future/pages/Assets/components/EmptyState.js.map +1 -1
  107. package/dist/admin/future/pages/Assets/components/EmptyState.mjs +62 -4
  108. package/dist/admin/future/pages/Assets/components/EmptyState.mjs.map +1 -1
  109. package/dist/admin/future/pages/Assets/components/FilterBadges.js +417 -0
  110. package/dist/admin/future/pages/Assets/components/FilterBadges.js.map +1 -0
  111. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs +415 -0
  112. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs.map +1 -0
  113. package/dist/admin/future/pages/Assets/components/FilterMenu.js +453 -0
  114. package/dist/admin/future/pages/Assets/components/FilterMenu.js.map +1 -0
  115. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs +447 -0
  116. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs.map +1 -0
  117. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js +144 -0
  118. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js.map +1 -0
  119. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs +142 -0
  120. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs.map +1 -0
  121. package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.js → FolderFormDialog.js} +50 -16
  122. package/dist/admin/future/pages/Assets/components/FolderFormDialog.js.map +1 -0
  123. package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.mjs → FolderFormDialog.mjs} +52 -18
  124. package/dist/admin/future/pages/Assets/components/FolderFormDialog.mjs.map +1 -0
  125. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +125 -148
  126. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  127. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +127 -150
  128. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  129. package/dist/admin/future/pages/Assets/components/SortMenu.js +21 -32
  130. package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -1
  131. package/dist/admin/future/pages/Assets/components/SortMenu.mjs +22 -33
  132. package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -1
  133. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js +40 -0
  134. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js.map +1 -0
  135. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs +38 -0
  136. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs.map +1 -0
  137. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +21 -5
  138. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  139. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +21 -5
  140. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  141. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js +47 -0
  142. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js.map +1 -0
  143. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs +44 -0
  144. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs.map +1 -0
  145. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +33 -12
  146. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  147. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +33 -12
  148. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  149. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +222 -45
  150. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
  151. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +223 -46
  152. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
  153. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js +75 -0
  154. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js.map +1 -0
  155. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs +73 -0
  156. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs.map +1 -0
  157. package/dist/admin/future/pages/Assets/hooks/useListFilters.js +168 -0
  158. package/dist/admin/future/pages/Assets/hooks/useListFilters.js.map +1 -0
  159. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs +162 -0
  160. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs.map +1 -0
  161. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js +201 -0
  162. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js.map +1 -0
  163. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs +198 -0
  164. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs.map +1 -0
  165. package/dist/admin/future/pages/Assets/utils/listQueryKey.js +2 -2
  166. package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -1
  167. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +2 -2
  168. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -1
  169. package/dist/admin/future/services/api.js +187 -28
  170. package/dist/admin/future/services/api.js.map +1 -1
  171. package/dist/admin/future/services/api.mjs +187 -30
  172. package/dist/admin/future/services/api.mjs.map +1 -1
  173. package/dist/admin/future/services/assets.js +40 -17
  174. package/dist/admin/future/services/assets.js.map +1 -1
  175. package/dist/admin/future/services/assets.mjs +40 -17
  176. package/dist/admin/future/services/assets.mjs.map +1 -1
  177. package/dist/admin/future/services/folders.js +66 -19
  178. package/dist/admin/future/services/folders.js.map +1 -1
  179. package/dist/admin/future/services/folders.mjs +66 -20
  180. package/dist/admin/future/services/folders.mjs.map +1 -1
  181. package/dist/admin/future/services/settings.js +10 -3
  182. package/dist/admin/future/services/settings.js.map +1 -1
  183. package/dist/admin/future/services/settings.mjs +10 -3
  184. package/dist/admin/future/services/settings.mjs.map +1 -1
  185. package/dist/admin/future/store/uploadProgress.js +109 -2
  186. package/dist/admin/future/store/uploadProgress.js.map +1 -1
  187. package/dist/admin/future/store/uploadProgress.mjs +105 -3
  188. package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
  189. package/dist/admin/future/utils/buildDragSetFromSelection.js +7 -5
  190. package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -1
  191. package/dist/admin/future/utils/buildDragSetFromSelection.mjs +7 -5
  192. package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -1
  193. package/dist/admin/future/utils/formatMoveSuccessMessage.js +12 -1
  194. package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -1
  195. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +12 -1
  196. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -1
  197. package/dist/admin/future/utils/getRelationId.js +24 -0
  198. package/dist/admin/future/utils/getRelationId.js.map +1 -0
  199. package/dist/admin/future/utils/getRelationId.mjs +22 -0
  200. package/dist/admin/future/utils/getRelationId.mjs.map +1 -0
  201. package/dist/admin/future/utils/isEventFromWithin.js +14 -0
  202. package/dist/admin/future/utils/isEventFromWithin.js.map +1 -0
  203. package/dist/admin/future/utils/isEventFromWithin.mjs +12 -0
  204. package/dist/admin/future/utils/isEventFromWithin.mjs.map +1 -0
  205. package/dist/admin/future/utils/itemLocations.js +40 -0
  206. package/dist/admin/future/utils/itemLocations.js.map +1 -0
  207. package/dist/admin/future/utils/itemLocations.mjs +36 -0
  208. package/dist/admin/future/utils/itemLocations.mjs.map +1 -0
  209. package/dist/admin/future/utils/itemSource.js +36 -0
  210. package/dist/admin/future/utils/itemSource.js.map +1 -0
  211. package/dist/admin/future/utils/itemSource.mjs +32 -0
  212. package/dist/admin/future/utils/itemSource.mjs.map +1 -0
  213. package/dist/admin/future/utils/searchQueryParam.js +11 -0
  214. package/dist/admin/future/utils/searchQueryParam.js.map +1 -0
  215. package/dist/admin/future/utils/searchQueryParam.mjs +9 -0
  216. package/dist/admin/future/utils/searchQueryParam.mjs.map +1 -0
  217. package/dist/admin/hooks/useSelectionState.js +2 -4
  218. package/dist/admin/hooks/useSelectionState.js.map +1 -1
  219. package/dist/admin/hooks/useSelectionState.mjs +2 -4
  220. package/dist/admin/hooks/useSelectionState.mjs.map +1 -1
  221. package/dist/admin/index.js +11 -17
  222. package/dist/admin/index.js.map +1 -1
  223. package/dist/admin/index.mjs +12 -18
  224. package/dist/admin/index.mjs.map +1 -1
  225. package/dist/admin/shared/constants.js +43 -0
  226. package/dist/admin/shared/constants.js.map +1 -0
  227. package/dist/admin/shared/constants.mjs +38 -0
  228. package/dist/admin/shared/constants.mjs.map +1 -0
  229. package/dist/admin/src/future/App.d.ts +1 -1
  230. package/dist/admin/src/future/components/BetaNotice.d.ts +11 -0
  231. package/dist/admin/src/future/components/Drawer.d.ts +5 -1
  232. package/dist/admin/src/future/hooks/useAIMetadataEnabled.d.ts +26 -0
  233. package/dist/admin/src/future/hooks/useMediaLibraryPermissions.d.ts +21 -0
  234. package/dist/admin/src/future/pages/Assets/components/ActionsMenuContent.d.ts +33 -0
  235. package/dist/admin/src/future/pages/Assets/components/AssetActionsMenu.d.ts +24 -0
  236. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetCropEditor.d.ts +7 -1
  237. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +16 -0
  238. package/dist/admin/src/future/pages/Assets/components/AssetsSearchInput.d.ts +5 -0
  239. package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +21 -1
  240. package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +17 -6
  241. package/dist/admin/src/future/pages/Assets/components/BusyOverlay.d.ts +9 -0
  242. package/dist/admin/src/future/pages/Assets/components/DateRangeCalendar.d.ts +8 -0
  243. package/dist/admin/src/future/pages/Assets/components/DeleteItemsDialog.d.ts +27 -0
  244. package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +8 -1
  245. package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +18 -3
  246. package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +2 -1
  247. package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.d.ts +8 -1
  248. package/dist/admin/src/future/pages/Assets/components/EmptyState.d.ts +18 -1
  249. package/dist/admin/src/future/pages/Assets/components/FilterBadges.d.ts +8 -0
  250. package/dist/admin/src/future/pages/Assets/components/FilterMenu.d.ts +26 -0
  251. package/dist/admin/src/future/pages/Assets/components/FolderActionsMenu.d.ts +20 -0
  252. package/dist/admin/src/future/pages/Assets/components/FolderFormDialog.d.ts +16 -0
  253. package/dist/admin/src/future/pages/Assets/components/FolderTree/FolderTree.d.ts +13 -4
  254. package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +6 -0
  255. package/dist/admin/src/future/pages/Assets/hooks/useAssetSearch.d.ts +12 -0
  256. package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +8 -1
  257. package/dist/admin/src/future/pages/Assets/hooks/useBusyAssets.d.ts +38 -0
  258. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +27 -3
  259. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteScrollSentinel.d.ts +41 -0
  260. package/dist/admin/src/future/pages/Assets/hooks/useListFilters.d.ts +69 -0
  261. package/dist/admin/src/future/pages/Assets/utils/buildAssetFilters.d.ts +46 -0
  262. package/dist/admin/src/future/pages/Assets/utils/listQueryKey.d.ts +3 -4
  263. package/dist/admin/src/future/services/api.d.ts +53 -5
  264. package/dist/admin/src/future/services/assets.d.ts +9 -1
  265. package/dist/admin/src/future/services/folders.d.ts +9 -1
  266. package/dist/admin/src/future/services/settings.d.ts +2 -2
  267. package/dist/admin/src/future/store/uploadProgress.d.ts +83 -1
  268. package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +4 -3
  269. package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +7 -1
  270. package/dist/admin/src/future/utils/getRelationId.d.ts +11 -0
  271. package/dist/admin/src/future/utils/isEventFromWithin.d.ts +11 -0
  272. package/dist/admin/src/future/utils/itemLocations.d.ts +31 -0
  273. package/dist/admin/src/future/utils/itemSource.d.ts +22 -0
  274. package/dist/admin/src/future/utils/searchQueryParam.d.ts +7 -0
  275. package/dist/admin/src/hooks/useAiAvailability.d.ts +1 -1
  276. package/dist/admin/src/hooks/useEditAsset.d.ts +4 -4
  277. package/dist/admin/src/hooks/useEditFolder.d.ts +4 -4
  278. package/dist/admin/src/hooks/useSettings.d.ts +1 -0
  279. package/dist/admin/src/hooks/useTracking.d.ts +1 -1
  280. package/dist/admin/src/hooks/useUpload.d.ts +1 -1
  281. package/dist/admin/translations/en.json.js +73 -2
  282. package/dist/admin/translations/en.json.js.map +1 -1
  283. package/dist/admin/translations/en.json.mjs +73 -2
  284. package/dist/admin/translations/en.json.mjs.map +1 -1
  285. package/dist/admin/utils/urlYupSchema.js +33 -9
  286. package/dist/admin/utils/urlYupSchema.js.map +1 -1
  287. package/dist/admin/utils/urlYupSchema.mjs +33 -9
  288. package/dist/admin/utils/urlYupSchema.mjs.map +1 -1
  289. package/dist/server/config.js +13 -5
  290. package/dist/server/config.js.map +1 -1
  291. package/dist/server/config.mjs +13 -5
  292. package/dist/server/config.mjs.map +1 -1
  293. package/dist/server/constants.js.map +1 -1
  294. package/dist/server/constants.mjs.map +1 -1
  295. package/dist/server/controllers/admin-file.js +30 -0
  296. package/dist/server/controllers/admin-file.js.map +1 -1
  297. package/dist/server/controllers/admin-file.mjs +30 -0
  298. package/dist/server/controllers/admin-file.mjs.map +1 -1
  299. package/dist/server/controllers/admin-settings.js +20 -2
  300. package/dist/server/controllers/admin-settings.js.map +1 -1
  301. package/dist/server/controllers/admin-settings.mjs +21 -3
  302. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  303. package/dist/server/controllers/content-api.js +1 -2
  304. package/dist/server/controllers/content-api.js.map +1 -1
  305. package/dist/server/controllers/content-api.mjs +2 -2
  306. package/dist/server/controllers/content-api.mjs.map +1 -1
  307. package/dist/server/controllers/validation/admin/ai-metadata.js +12 -0
  308. package/dist/server/controllers/validation/admin/ai-metadata.js.map +1 -0
  309. package/dist/server/controllers/validation/admin/ai-metadata.mjs +10 -0
  310. package/dist/server/controllers/validation/admin/ai-metadata.mjs.map +1 -0
  311. package/dist/server/controllers/validation/admin/settings.js +4 -1
  312. package/dist/server/controllers/validation/admin/settings.js.map +1 -1
  313. package/dist/server/controllers/validation/admin/settings.mjs +1 -1
  314. package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
  315. package/dist/server/routes/admin.js +18 -0
  316. package/dist/server/routes/admin.js.map +1 -1
  317. package/dist/server/routes/admin.mjs +18 -0
  318. package/dist/server/routes/admin.mjs.map +1 -1
  319. package/dist/server/services/ai-metadata.js +108 -11
  320. package/dist/server/services/ai-metadata.js.map +1 -1
  321. package/dist/server/services/ai-metadata.mjs +108 -11
  322. package/dist/server/services/ai-metadata.mjs.map +1 -1
  323. package/dist/server/services/file.js +86 -13
  324. package/dist/server/services/file.js.map +1 -1
  325. package/dist/server/services/file.mjs +87 -14
  326. package/dist/server/services/file.mjs.map +1 -1
  327. package/dist/server/services/image-manipulation.js +4 -4
  328. package/dist/server/services/image-manipulation.js.map +1 -1
  329. package/dist/server/services/image-manipulation.mjs +4 -4
  330. package/dist/server/services/image-manipulation.mjs.map +1 -1
  331. package/dist/server/shared/constants.js +43 -0
  332. package/dist/server/shared/constants.js.map +1 -0
  333. package/dist/server/shared/constants.mjs +38 -0
  334. package/dist/server/shared/constants.mjs.map +1 -0
  335. package/dist/server/src/config.d.ts +2 -0
  336. package/dist/server/src/config.d.ts.map +1 -1
  337. package/dist/server/src/constants.d.ts +2 -1
  338. package/dist/server/src/constants.d.ts.map +1 -1
  339. package/dist/server/src/controllers/admin-file.d.ts +10 -0
  340. package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
  341. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
  342. package/dist/server/src/controllers/index.d.ts +1 -0
  343. package/dist/server/src/controllers/index.d.ts.map +1 -1
  344. package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts +2 -0
  345. package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts.map +1 -0
  346. package/dist/server/src/controllers/validation/admin/settings.d.ts +1 -1
  347. package/dist/server/src/controllers/validation/admin/settings.d.ts.map +1 -1
  348. package/dist/server/src/index.d.ts +7 -1
  349. package/dist/server/src/index.d.ts.map +1 -1
  350. package/dist/server/src/routes/admin.d.ts.map +1 -1
  351. package/dist/server/src/services/ai-metadata.d.ts +19 -0
  352. package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
  353. package/dist/server/src/services/file.d.ts +12 -2
  354. package/dist/server/src/services/file.d.ts.map +1 -1
  355. package/dist/server/src/services/image-manipulation.d.ts +0 -5
  356. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  357. package/dist/server/src/services/index.d.ts +4 -1
  358. package/dist/server/src/services/index.d.ts.map +1 -1
  359. package/dist/server/src/types.d.ts +3 -0
  360. package/dist/server/src/types.d.ts.map +1 -1
  361. package/dist/shared/constants.d.ts +35 -0
  362. package/dist/shared/constants.d.ts.map +1 -0
  363. package/dist/shared/contracts/files.d.ts +25 -0
  364. package/dist/shared/contracts/files.d.ts.map +1 -1
  365. package/dist/shared/contracts/settings.d.ts +7 -0
  366. package/package.json +10 -10
  367. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js.map +0 -1
  368. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs.map +0 -1
  369. package/dist/admin/src/future/pages/Assets/components/CreateFolderDialog.d.ts +0 -8
@@ -1 +1 @@
1
- {"version":3,"file":"SortMenu.js","sources":["../../../../../../admin/src/future/pages/Assets/components/SortMenu.tsx"],"sourcesContent":["import { Menu, VisuallyHidden } from '@strapi/design-system';\nimport { Check, ChevronDown } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../../utils/translations';\nimport {\n type FoldersPosition,\n type ListSort,\n type SortByKey,\n type SortDirectionKey,\n} from '../hooks/useListSort';\n\nimport type { MessageDescriptor } from 'react-intl';\n\nconst SORT_BY_LABELS: Record<SortByKey, MessageDescriptor> = {\n oldestUploads: {\n id: getTranslationKey('list.sort.oldest-uploads'),\n defaultMessage: 'Oldest uploads',\n },\n mostRecentUpdates: {\n id: getTranslationKey('list.sort.most-recent-updates'),\n defaultMessage: 'Most recent updates',\n },\n};\n\nconst SORT_DIRECTION_LABELS: Record<SortDirectionKey, MessageDescriptor> = {\n nameAsc: { id: getTranslationKey('list.sort.name-asc'), defaultMessage: 'A to Z' },\n nameDesc: { id: getTranslationKey('list.sort.name-desc'), defaultMessage: 'Z to A' },\n sizeAsc: {\n id: getTranslationKey('list.sort.size-asc'),\n defaultMessage: 'File size ascending',\n },\n sizeDesc: {\n id: getTranslationKey('list.sort.size-desc'),\n defaultMessage: 'File size descending',\n },\n};\n\nconst FOLDERS_LABELS: Record<FoldersPosition, MessageDescriptor> = {\n top: { id: getTranslationKey('list.sort.folders-on-top'), defaultMessage: 'On top' },\n mixed: {\n id: getTranslationKey('list.sort.folders-mixed'),\n defaultMessage: 'Mixed with files',\n },\n};\n\n// Stretch to the toolbar row height so the trigger matches the view toggle\n// (the parent Flex uses alignItems=\"stretch\").\nconst SortTrigger = styled(Menu.Trigger)`\n height: auto;\n`;\n\n// Full-width section band, like the design mock (sits inside the Menu.Content\n// padding, so the band stops short of the panel edges).\nconst GroupLabel = styled(Menu.Label)`\n width: 100%;\n display: block;\n background: ${({ theme }) =>\n theme.colorScheme === 'dark' ? theme.colors.neutral150 : theme.colors.neutral100};\n padding-inline: ${({ theme }) => theme.spaces[3]};\n border-radius: ${({ theme }) => theme.borderRadius};\n`;\n\ninterface SortMenuProps {\n sort: ListSort;\n /**\n * The grid view forces folders on top (mixing folder cards with asset cards\n * is not supported there), so it hides the Folders group entirely.\n */\n showFoldersGroup?: boolean;\n}\n\n/**\n * Toolbar \"Sort\" dropdown: single-select sections (Sort / Folders). Picking an\n * option keeps the menu open (`onSelect` preventDefault) so several facets can\n * be tuned in one visit; clicking a checked facet clears it (the hook\n * guarantees at least one sort rule stays active).\n */\nexport const SortMenu = ({ sort, showFoldersGroup = true }: SortMenuProps) => {\n const { formatMessage } = useIntl();\n\n const triggerLabel = formatMessage(\n { id: getTranslationKey('list.sort.trigger'), defaultMessage: 'Sort: {active}' },\n {\n active: sort.sortBy\n ? formatMessage(SORT_BY_LABELS[sort.sortBy])\n : formatMessage(SORT_DIRECTION_LABELS[sort.direction!]),\n }\n );\n\n const checkmark = <Check aria-hidden width=\"1.6rem\" height=\"1.6rem\" fill=\"primary600\" />;\n\n // The checkmark icon is aria-hidden, so the active option carries a\n // visually-hidden suffix for screen readers instead (menuitem does not\n // allow aria-checked).\n const activeMark = (\n <VisuallyHidden>\n {' '}\n {formatMessage({ id: getTranslationKey('list.sort.active'), defaultMessage: '(active)' })}\n </VisuallyHidden>\n );\n\n return (\n <Menu.Root>\n <SortTrigger variant=\"tertiary\" endIcon={<ChevronDown aria-hidden />}>\n {triggerLabel}\n </SortTrigger>\n {/* The DS default maxHeight (15rem) folds everything after the first\n group behind an invisible scroll — all groups must be visible at\n once. 70vh keeps a scroll on very short viewports. */}\n <Menu.Content popoverPlacement=\"bottom-end\" zIndex={2} maxHeight=\"70vh\" width=\"25rem\">\n {/* One single-select \"Sort\" section: the two rule families were always\n mutually exclusive (one checkmark total), so they share a group. */}\n <GroupLabel>\n {formatMessage({ id: getTranslationKey('list.sort.section'), defaultMessage: 'Sort' })}\n </GroupLabel>\n {(Object.keys(SORT_BY_LABELS) as SortByKey[]).map((key) => (\n <Menu.Item\n key={key}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setSortBy(sort.sortBy === key ? null : key);\n }}\n endIcon={sort.sortBy === key ? checkmark : null}\n >\n {formatMessage(SORT_BY_LABELS[key])}\n {sort.sortBy === key && activeMark}\n </Menu.Item>\n ))}\n {(Object.keys(SORT_DIRECTION_LABELS) as SortDirectionKey[]).map((key) => (\n <Menu.Item\n key={key}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setDirection(sort.direction === key ? null : key);\n }}\n endIcon={sort.direction === key ? checkmark : null}\n >\n {formatMessage(SORT_DIRECTION_LABELS[key])}\n {sort.direction === key && activeMark}\n </Menu.Item>\n ))}\n\n {showFoldersGroup && (\n <>\n <Menu.Separator />\n <GroupLabel>\n {formatMessage({\n id: getTranslationKey('list.sort.folders'),\n defaultMessage: 'Folders',\n })}\n </GroupLabel>\n {(Object.keys(FOLDERS_LABELS) as FoldersPosition[]).map((position) => (\n <Menu.Item\n key={position}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setFoldersPosition(position);\n }}\n endIcon={sort.foldersPosition === position ? checkmark : null}\n >\n {formatMessage(FOLDERS_LABELS[position])}\n {sort.foldersPosition === position && activeMark}\n </Menu.Item>\n ))}\n </>\n )}\n </Menu.Content>\n </Menu.Root>\n );\n};\n"],"names":["SORT_BY_LABELS","oldestUploads","id","getTranslationKey","defaultMessage","mostRecentUpdates","SORT_DIRECTION_LABELS","nameAsc","nameDesc","sizeAsc","sizeDesc","FOLDERS_LABELS","top","mixed","SortTrigger","styled","Menu","Trigger","GroupLabel","Label","theme","colorScheme","colors","neutral150","neutral100","spaces","borderRadius","SortMenu","sort","showFoldersGroup","formatMessage","useIntl","triggerLabel","active","sortBy","direction","checkmark","_jsx","Check","aria-hidden","width","height","fill","activeMark","_jsxs","VisuallyHidden","Root","variant","endIcon","ChevronDown","Content","popoverPlacement","zIndex","maxHeight","Object","keys","map","key","Item","onSelect","e","preventDefault","setSortBy","setDirection","_Fragment","Separator","position","setFoldersPosition","foldersPosition"],"mappings":"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"}
1
+ {"version":3,"file":"SortMenu.js","sources":["../../../../../../admin/src/future/pages/Assets/components/SortMenu.tsx"],"sourcesContent":["import { Menu } from '@strapi/design-system';\nimport { Check, ChevronDown } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../../utils/translations';\nimport {\n type FoldersPosition,\n type ListSort,\n type SortByKey,\n type SortDirectionKey,\n} from '../hooks/useListSort';\n\nimport type { MessageDescriptor } from 'react-intl';\n\nconst SORT_BY_LABELS: Record<SortByKey, MessageDescriptor> = {\n oldestUploads: {\n id: getTranslationKey('list.sort.oldest-uploads'),\n defaultMessage: 'Oldest uploads',\n },\n mostRecentUpdates: {\n id: getTranslationKey('list.sort.most-recent-updates'),\n defaultMessage: 'Most recent updates',\n },\n};\n\nconst SORT_DIRECTION_LABELS: Record<SortDirectionKey, MessageDescriptor> = {\n nameAsc: { id: getTranslationKey('list.sort.name-asc'), defaultMessage: 'A to Z' },\n nameDesc: { id: getTranslationKey('list.sort.name-desc'), defaultMessage: 'Z to A' },\n sizeAsc: {\n id: getTranslationKey('list.sort.size-asc'),\n defaultMessage: 'File size ascending',\n },\n sizeDesc: {\n id: getTranslationKey('list.sort.size-desc'),\n defaultMessage: 'File size descending',\n },\n};\n\nconst FOLDERS_LABELS: Record<FoldersPosition, MessageDescriptor> = {\n top: { id: getTranslationKey('list.sort.folders-on-top'), defaultMessage: 'On top' },\n mixed: {\n id: getTranslationKey('list.sort.folders-mixed'),\n defaultMessage: 'Mixed with files',\n },\n};\n\n// Stretch to the toolbar row height so the trigger matches the view toggle\n// (the parent Flex uses alignItems=\"stretch\").\nconst SortTrigger = styled(Menu.Trigger)``;\n\n// Full-width section band, like the design mock (sits inside the Menu.Content\n// padding, so the band stops short of the panel edges).\nconst GroupLabel = styled(Menu.Label)`\n width: 100%;\n display: block;\n background: ${({ theme }) =>\n theme.colorScheme === 'dark' ? theme.colors.neutral150 : theme.colors.neutral100};\n padding-inline: ${({ theme }) => theme.spaces[3]};\n border-radius: ${({ theme }) => theme.borderRadius};\n`;\n\ninterface SortMenuProps {\n sort: ListSort;\n /**\n * The grid view forces folders on top (mixing folder cards with asset cards\n * is not supported there), so it hides the Folders group entirely.\n */\n showFoldersGroup?: boolean;\n}\n\n/**\n * Toolbar \"Sort\" dropdown: single-select sections (Sort / Folders). Picking an\n * option keeps the menu open (`onSelect` preventDefault) so several facets can\n * be tuned in one visit; clicking a checked facet clears it (the hook\n * guarantees at least one sort rule stays active).\n *\n * Each section is single-select, so its items are radios: the checkmark icon is\n * decorative, and `aria-checked` is what assistive tech reads. The DS `Menu`\n * exposes no `RadioItem`, but `Menu.Item` forwards extra props onto the element\n * it renders through Radix's `asChild`, where they take precedence over Radix's\n * own `role=\"menuitem\"`.\n */\nexport const SortMenu = ({ sort, showFoldersGroup = true }: SortMenuProps) => {\n const { formatMessage } = useIntl();\n\n const triggerLabel = formatMessage(\n { id: getTranslationKey('list.sort.trigger'), defaultMessage: 'Sort: {active}' },\n {\n active: sort.sortBy\n ? formatMessage(SORT_BY_LABELS[sort.sortBy])\n : formatMessage(SORT_DIRECTION_LABELS[sort.direction!]),\n }\n );\n\n const checkmark = <Check aria-hidden width=\"1.6rem\" height=\"1.6rem\" fill=\"primary600\" />;\n\n return (\n <Menu.Root>\n <SortTrigger variant=\"ghost\" endIcon={<ChevronDown aria-hidden />}>\n {triggerLabel}\n </SortTrigger>\n {/* The DS default maxHeight (15rem) folds everything after the first\n group behind an invisible scroll — all groups must be visible at\n once. 70vh keeps a scroll on very short viewports. */}\n <Menu.Content popoverPlacement=\"bottom-end\" zIndex={2} maxHeight=\"70vh\" minWidth=\"25rem\">\n {/* One single-select \"Sort\" section: the two rule families were always\n mutually exclusive (one checkmark total), so they share a group. */}\n <GroupLabel>\n {formatMessage({ id: getTranslationKey('list.sort.section'), defaultMessage: 'Sort' })}\n </GroupLabel>\n {(Object.keys(SORT_BY_LABELS) as SortByKey[]).map((key) => (\n <Menu.Item\n key={key}\n role=\"menuitemradio\"\n aria-checked={sort.sortBy === key}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setSortBy(sort.sortBy === key ? null : key);\n }}\n endIcon={sort.sortBy === key ? checkmark : null}\n >\n {formatMessage(SORT_BY_LABELS[key])}\n </Menu.Item>\n ))}\n {(Object.keys(SORT_DIRECTION_LABELS) as SortDirectionKey[]).map((key) => (\n <Menu.Item\n key={key}\n role=\"menuitemradio\"\n aria-checked={sort.direction === key}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setDirection(sort.direction === key ? null : key);\n }}\n endIcon={sort.direction === key ? checkmark : null}\n >\n {formatMessage(SORT_DIRECTION_LABELS[key])}\n </Menu.Item>\n ))}\n\n {showFoldersGroup && (\n <>\n <Menu.Separator />\n <GroupLabel>\n {formatMessage({\n id: getTranslationKey('list.sort.folders'),\n defaultMessage: 'Folders',\n })}\n </GroupLabel>\n {(Object.keys(FOLDERS_LABELS) as FoldersPosition[]).map((position) => (\n <Menu.Item\n key={position}\n role=\"menuitemradio\"\n aria-checked={sort.foldersPosition === position}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setFoldersPosition(position);\n }}\n endIcon={sort.foldersPosition === position ? checkmark : null}\n >\n {formatMessage(FOLDERS_LABELS[position])}\n </Menu.Item>\n ))}\n </>\n )}\n </Menu.Content>\n </Menu.Root>\n );\n};\n"],"names":["SORT_BY_LABELS","oldestUploads","id","getTranslationKey","defaultMessage","mostRecentUpdates","SORT_DIRECTION_LABELS","nameAsc","nameDesc","sizeAsc","sizeDesc","FOLDERS_LABELS","top","mixed","SortTrigger","styled","Menu","Trigger","GroupLabel","Label","theme","colorScheme","colors","neutral150","neutral100","spaces","borderRadius","SortMenu","sort","showFoldersGroup","formatMessage","useIntl","triggerLabel","active","sortBy","direction","checkmark","_jsx","Check","aria-hidden","width","height","fill","_jsxs","Root","variant","endIcon","ChevronDown","Content","popoverPlacement","zIndex","maxHeight","minWidth","Object","keys","map","key","Item","role","aria-checked","onSelect","e","preventDefault","setSortBy","setDirection","_Fragment","Separator","position","foldersPosition","setFoldersPosition"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { VisuallyHidden, Menu } from '@strapi/design-system';
2
+ import { Menu } from '@strapi/design-system';
3
3
  import { ChevronDown, Check } from '@strapi/icons';
4
4
  import { useIntl } from 'react-intl';
5
5
  import { styled } from 'styled-components';
@@ -45,9 +45,7 @@ const FOLDERS_LABELS = {
45
45
  };
46
46
  // Stretch to the toolbar row height so the trigger matches the view toggle
47
47
  // (the parent Flex uses alignItems="stretch").
48
- const SortTrigger = styled(Menu.Trigger)`
49
- height: auto;
50
- `;
48
+ const SortTrigger = styled(Menu.Trigger)``;
51
49
  // Full-width section band, like the design mock (sits inside the Menu.Content
52
50
  // padding, so the band stops short of the panel edges).
53
51
  const GroupLabel = styled(Menu.Label)`
@@ -62,6 +60,12 @@ const GroupLabel = styled(Menu.Label)`
62
60
  * option keeps the menu open (`onSelect` preventDefault) so several facets can
63
61
  * be tuned in one visit; clicking a checked facet clears it (the hook
64
62
  * guarantees at least one sort rule stays active).
63
+ *
64
+ * Each section is single-select, so its items are radios: the checkmark icon is
65
+ * decorative, and `aria-checked` is what assistive tech reads. The DS `Menu`
66
+ * exposes no `RadioItem`, but `Menu.Item` forwards extra props onto the element
67
+ * it renders through Radix's `asChild`, where they take precedence over Radix's
68
+ * own `role="menuitem"`.
65
69
  */ const SortMenu = ({ sort, showFoldersGroup = true })=>{
66
70
  const { formatMessage } = useIntl();
67
71
  const triggerLabel = formatMessage({
@@ -76,22 +80,10 @@ const GroupLabel = styled(Menu.Label)`
76
80
  height: "1.6rem",
77
81
  fill: "primary600"
78
82
  });
79
- // The checkmark icon is aria-hidden, so the active option carries a
80
- // visually-hidden suffix for screen readers instead (menuitem does not
81
- // allow aria-checked).
82
- const activeMark = /*#__PURE__*/ jsxs(VisuallyHidden, {
83
- children: [
84
- ' ',
85
- formatMessage({
86
- id: getTranslationKey('list.sort.active'),
87
- defaultMessage: '(active)'
88
- })
89
- ]
90
- });
91
83
  return /*#__PURE__*/ jsxs(Menu.Root, {
92
84
  children: [
93
85
  /*#__PURE__*/ jsx(SortTrigger, {
94
- variant: "tertiary",
86
+ variant: "ghost",
95
87
  endIcon: /*#__PURE__*/ jsx(ChevronDown, {
96
88
  "aria-hidden": true
97
89
  }),
@@ -101,7 +93,7 @@ const GroupLabel = styled(Menu.Label)`
101
93
  popoverPlacement: "bottom-end",
102
94
  zIndex: 2,
103
95
  maxHeight: "70vh",
104
- width: "25rem",
96
+ minWidth: "25rem",
105
97
  children: [
106
98
  /*#__PURE__*/ jsx(GroupLabel, {
107
99
  children: formatMessage({
@@ -109,27 +101,25 @@ const GroupLabel = styled(Menu.Label)`
109
101
  defaultMessage: 'Sort'
110
102
  })
111
103
  }),
112
- Object.keys(SORT_BY_LABELS).map((key)=>/*#__PURE__*/ jsxs(Menu.Item, {
104
+ Object.keys(SORT_BY_LABELS).map((key)=>/*#__PURE__*/ jsx(Menu.Item, {
105
+ role: "menuitemradio",
106
+ "aria-checked": sort.sortBy === key,
113
107
  onSelect: (e)=>{
114
108
  e.preventDefault();
115
109
  sort.setSortBy(sort.sortBy === key ? null : key);
116
110
  },
117
111
  endIcon: sort.sortBy === key ? checkmark : null,
118
- children: [
119
- formatMessage(SORT_BY_LABELS[key]),
120
- sort.sortBy === key && activeMark
121
- ]
112
+ children: formatMessage(SORT_BY_LABELS[key])
122
113
  }, key)),
123
- Object.keys(SORT_DIRECTION_LABELS).map((key)=>/*#__PURE__*/ jsxs(Menu.Item, {
114
+ Object.keys(SORT_DIRECTION_LABELS).map((key)=>/*#__PURE__*/ jsx(Menu.Item, {
115
+ role: "menuitemradio",
116
+ "aria-checked": sort.direction === key,
124
117
  onSelect: (e)=>{
125
118
  e.preventDefault();
126
119
  sort.setDirection(sort.direction === key ? null : key);
127
120
  },
128
121
  endIcon: sort.direction === key ? checkmark : null,
129
- children: [
130
- formatMessage(SORT_DIRECTION_LABELS[key]),
131
- sort.direction === key && activeMark
132
- ]
122
+ children: formatMessage(SORT_DIRECTION_LABELS[key])
133
123
  }, key)),
134
124
  showFoldersGroup && /*#__PURE__*/ jsxs(Fragment, {
135
125
  children: [
@@ -140,16 +130,15 @@ const GroupLabel = styled(Menu.Label)`
140
130
  defaultMessage: 'Folders'
141
131
  })
142
132
  }),
143
- Object.keys(FOLDERS_LABELS).map((position)=>/*#__PURE__*/ jsxs(Menu.Item, {
133
+ Object.keys(FOLDERS_LABELS).map((position)=>/*#__PURE__*/ jsx(Menu.Item, {
134
+ role: "menuitemradio",
135
+ "aria-checked": sort.foldersPosition === position,
144
136
  onSelect: (e)=>{
145
137
  e.preventDefault();
146
138
  sort.setFoldersPosition(position);
147
139
  },
148
140
  endIcon: sort.foldersPosition === position ? checkmark : null,
149
- children: [
150
- formatMessage(FOLDERS_LABELS[position]),
151
- sort.foldersPosition === position && activeMark
152
- ]
141
+ children: formatMessage(FOLDERS_LABELS[position])
153
142
  }, position))
154
143
  ]
155
144
  })
@@ -1 +1 @@
1
- {"version":3,"file":"SortMenu.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/SortMenu.tsx"],"sourcesContent":["import { Menu, VisuallyHidden } from '@strapi/design-system';\nimport { Check, ChevronDown } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../../utils/translations';\nimport {\n type FoldersPosition,\n type ListSort,\n type SortByKey,\n type SortDirectionKey,\n} from '../hooks/useListSort';\n\nimport type { MessageDescriptor } from 'react-intl';\n\nconst SORT_BY_LABELS: Record<SortByKey, MessageDescriptor> = {\n oldestUploads: {\n id: getTranslationKey('list.sort.oldest-uploads'),\n defaultMessage: 'Oldest uploads',\n },\n mostRecentUpdates: {\n id: getTranslationKey('list.sort.most-recent-updates'),\n defaultMessage: 'Most recent updates',\n },\n};\n\nconst SORT_DIRECTION_LABELS: Record<SortDirectionKey, MessageDescriptor> = {\n nameAsc: { id: getTranslationKey('list.sort.name-asc'), defaultMessage: 'A to Z' },\n nameDesc: { id: getTranslationKey('list.sort.name-desc'), defaultMessage: 'Z to A' },\n sizeAsc: {\n id: getTranslationKey('list.sort.size-asc'),\n defaultMessage: 'File size ascending',\n },\n sizeDesc: {\n id: getTranslationKey('list.sort.size-desc'),\n defaultMessage: 'File size descending',\n },\n};\n\nconst FOLDERS_LABELS: Record<FoldersPosition, MessageDescriptor> = {\n top: { id: getTranslationKey('list.sort.folders-on-top'), defaultMessage: 'On top' },\n mixed: {\n id: getTranslationKey('list.sort.folders-mixed'),\n defaultMessage: 'Mixed with files',\n },\n};\n\n// Stretch to the toolbar row height so the trigger matches the view toggle\n// (the parent Flex uses alignItems=\"stretch\").\nconst SortTrigger = styled(Menu.Trigger)`\n height: auto;\n`;\n\n// Full-width section band, like the design mock (sits inside the Menu.Content\n// padding, so the band stops short of the panel edges).\nconst GroupLabel = styled(Menu.Label)`\n width: 100%;\n display: block;\n background: ${({ theme }) =>\n theme.colorScheme === 'dark' ? theme.colors.neutral150 : theme.colors.neutral100};\n padding-inline: ${({ theme }) => theme.spaces[3]};\n border-radius: ${({ theme }) => theme.borderRadius};\n`;\n\ninterface SortMenuProps {\n sort: ListSort;\n /**\n * The grid view forces folders on top (mixing folder cards with asset cards\n * is not supported there), so it hides the Folders group entirely.\n */\n showFoldersGroup?: boolean;\n}\n\n/**\n * Toolbar \"Sort\" dropdown: single-select sections (Sort / Folders). Picking an\n * option keeps the menu open (`onSelect` preventDefault) so several facets can\n * be tuned in one visit; clicking a checked facet clears it (the hook\n * guarantees at least one sort rule stays active).\n */\nexport const SortMenu = ({ sort, showFoldersGroup = true }: SortMenuProps) => {\n const { formatMessage } = useIntl();\n\n const triggerLabel = formatMessage(\n { id: getTranslationKey('list.sort.trigger'), defaultMessage: 'Sort: {active}' },\n {\n active: sort.sortBy\n ? formatMessage(SORT_BY_LABELS[sort.sortBy])\n : formatMessage(SORT_DIRECTION_LABELS[sort.direction!]),\n }\n );\n\n const checkmark = <Check aria-hidden width=\"1.6rem\" height=\"1.6rem\" fill=\"primary600\" />;\n\n // The checkmark icon is aria-hidden, so the active option carries a\n // visually-hidden suffix for screen readers instead (menuitem does not\n // allow aria-checked).\n const activeMark = (\n <VisuallyHidden>\n {' '}\n {formatMessage({ id: getTranslationKey('list.sort.active'), defaultMessage: '(active)' })}\n </VisuallyHidden>\n );\n\n return (\n <Menu.Root>\n <SortTrigger variant=\"tertiary\" endIcon={<ChevronDown aria-hidden />}>\n {triggerLabel}\n </SortTrigger>\n {/* The DS default maxHeight (15rem) folds everything after the first\n group behind an invisible scroll — all groups must be visible at\n once. 70vh keeps a scroll on very short viewports. */}\n <Menu.Content popoverPlacement=\"bottom-end\" zIndex={2} maxHeight=\"70vh\" width=\"25rem\">\n {/* One single-select \"Sort\" section: the two rule families were always\n mutually exclusive (one checkmark total), so they share a group. */}\n <GroupLabel>\n {formatMessage({ id: getTranslationKey('list.sort.section'), defaultMessage: 'Sort' })}\n </GroupLabel>\n {(Object.keys(SORT_BY_LABELS) as SortByKey[]).map((key) => (\n <Menu.Item\n key={key}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setSortBy(sort.sortBy === key ? null : key);\n }}\n endIcon={sort.sortBy === key ? checkmark : null}\n >\n {formatMessage(SORT_BY_LABELS[key])}\n {sort.sortBy === key && activeMark}\n </Menu.Item>\n ))}\n {(Object.keys(SORT_DIRECTION_LABELS) as SortDirectionKey[]).map((key) => (\n <Menu.Item\n key={key}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setDirection(sort.direction === key ? null : key);\n }}\n endIcon={sort.direction === key ? checkmark : null}\n >\n {formatMessage(SORT_DIRECTION_LABELS[key])}\n {sort.direction === key && activeMark}\n </Menu.Item>\n ))}\n\n {showFoldersGroup && (\n <>\n <Menu.Separator />\n <GroupLabel>\n {formatMessage({\n id: getTranslationKey('list.sort.folders'),\n defaultMessage: 'Folders',\n })}\n </GroupLabel>\n {(Object.keys(FOLDERS_LABELS) as FoldersPosition[]).map((position) => (\n <Menu.Item\n key={position}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setFoldersPosition(position);\n }}\n endIcon={sort.foldersPosition === position ? checkmark : null}\n >\n {formatMessage(FOLDERS_LABELS[position])}\n {sort.foldersPosition === position && activeMark}\n </Menu.Item>\n ))}\n </>\n )}\n </Menu.Content>\n </Menu.Root>\n );\n};\n"],"names":["SORT_BY_LABELS","oldestUploads","id","getTranslationKey","defaultMessage","mostRecentUpdates","SORT_DIRECTION_LABELS","nameAsc","nameDesc","sizeAsc","sizeDesc","FOLDERS_LABELS","top","mixed","SortTrigger","styled","Menu","Trigger","GroupLabel","Label","theme","colorScheme","colors","neutral150","neutral100","spaces","borderRadius","SortMenu","sort","showFoldersGroup","formatMessage","useIntl","triggerLabel","active","sortBy","direction","checkmark","_jsx","Check","aria-hidden","width","height","fill","activeMark","_jsxs","VisuallyHidden","Root","variant","endIcon","ChevronDown","Content","popoverPlacement","zIndex","maxHeight","Object","keys","map","key","Item","onSelect","e","preventDefault","setSortBy","setDirection","_Fragment","Separator","position","setFoldersPosition","foldersPosition"],"mappings":"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"}
1
+ {"version":3,"file":"SortMenu.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/SortMenu.tsx"],"sourcesContent":["import { Menu } from '@strapi/design-system';\nimport { Check, ChevronDown } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../../utils/translations';\nimport {\n type FoldersPosition,\n type ListSort,\n type SortByKey,\n type SortDirectionKey,\n} from '../hooks/useListSort';\n\nimport type { MessageDescriptor } from 'react-intl';\n\nconst SORT_BY_LABELS: Record<SortByKey, MessageDescriptor> = {\n oldestUploads: {\n id: getTranslationKey('list.sort.oldest-uploads'),\n defaultMessage: 'Oldest uploads',\n },\n mostRecentUpdates: {\n id: getTranslationKey('list.sort.most-recent-updates'),\n defaultMessage: 'Most recent updates',\n },\n};\n\nconst SORT_DIRECTION_LABELS: Record<SortDirectionKey, MessageDescriptor> = {\n nameAsc: { id: getTranslationKey('list.sort.name-asc'), defaultMessage: 'A to Z' },\n nameDesc: { id: getTranslationKey('list.sort.name-desc'), defaultMessage: 'Z to A' },\n sizeAsc: {\n id: getTranslationKey('list.sort.size-asc'),\n defaultMessage: 'File size ascending',\n },\n sizeDesc: {\n id: getTranslationKey('list.sort.size-desc'),\n defaultMessage: 'File size descending',\n },\n};\n\nconst FOLDERS_LABELS: Record<FoldersPosition, MessageDescriptor> = {\n top: { id: getTranslationKey('list.sort.folders-on-top'), defaultMessage: 'On top' },\n mixed: {\n id: getTranslationKey('list.sort.folders-mixed'),\n defaultMessage: 'Mixed with files',\n },\n};\n\n// Stretch to the toolbar row height so the trigger matches the view toggle\n// (the parent Flex uses alignItems=\"stretch\").\nconst SortTrigger = styled(Menu.Trigger)``;\n\n// Full-width section band, like the design mock (sits inside the Menu.Content\n// padding, so the band stops short of the panel edges).\nconst GroupLabel = styled(Menu.Label)`\n width: 100%;\n display: block;\n background: ${({ theme }) =>\n theme.colorScheme === 'dark' ? theme.colors.neutral150 : theme.colors.neutral100};\n padding-inline: ${({ theme }) => theme.spaces[3]};\n border-radius: ${({ theme }) => theme.borderRadius};\n`;\n\ninterface SortMenuProps {\n sort: ListSort;\n /**\n * The grid view forces folders on top (mixing folder cards with asset cards\n * is not supported there), so it hides the Folders group entirely.\n */\n showFoldersGroup?: boolean;\n}\n\n/**\n * Toolbar \"Sort\" dropdown: single-select sections (Sort / Folders). Picking an\n * option keeps the menu open (`onSelect` preventDefault) so several facets can\n * be tuned in one visit; clicking a checked facet clears it (the hook\n * guarantees at least one sort rule stays active).\n *\n * Each section is single-select, so its items are radios: the checkmark icon is\n * decorative, and `aria-checked` is what assistive tech reads. The DS `Menu`\n * exposes no `RadioItem`, but `Menu.Item` forwards extra props onto the element\n * it renders through Radix's `asChild`, where they take precedence over Radix's\n * own `role=\"menuitem\"`.\n */\nexport const SortMenu = ({ sort, showFoldersGroup = true }: SortMenuProps) => {\n const { formatMessage } = useIntl();\n\n const triggerLabel = formatMessage(\n { id: getTranslationKey('list.sort.trigger'), defaultMessage: 'Sort: {active}' },\n {\n active: sort.sortBy\n ? formatMessage(SORT_BY_LABELS[sort.sortBy])\n : formatMessage(SORT_DIRECTION_LABELS[sort.direction!]),\n }\n );\n\n const checkmark = <Check aria-hidden width=\"1.6rem\" height=\"1.6rem\" fill=\"primary600\" />;\n\n return (\n <Menu.Root>\n <SortTrigger variant=\"ghost\" endIcon={<ChevronDown aria-hidden />}>\n {triggerLabel}\n </SortTrigger>\n {/* The DS default maxHeight (15rem) folds everything after the first\n group behind an invisible scroll — all groups must be visible at\n once. 70vh keeps a scroll on very short viewports. */}\n <Menu.Content popoverPlacement=\"bottom-end\" zIndex={2} maxHeight=\"70vh\" minWidth=\"25rem\">\n {/* One single-select \"Sort\" section: the two rule families were always\n mutually exclusive (one checkmark total), so they share a group. */}\n <GroupLabel>\n {formatMessage({ id: getTranslationKey('list.sort.section'), defaultMessage: 'Sort' })}\n </GroupLabel>\n {(Object.keys(SORT_BY_LABELS) as SortByKey[]).map((key) => (\n <Menu.Item\n key={key}\n role=\"menuitemradio\"\n aria-checked={sort.sortBy === key}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setSortBy(sort.sortBy === key ? null : key);\n }}\n endIcon={sort.sortBy === key ? checkmark : null}\n >\n {formatMessage(SORT_BY_LABELS[key])}\n </Menu.Item>\n ))}\n {(Object.keys(SORT_DIRECTION_LABELS) as SortDirectionKey[]).map((key) => (\n <Menu.Item\n key={key}\n role=\"menuitemradio\"\n aria-checked={sort.direction === key}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setDirection(sort.direction === key ? null : key);\n }}\n endIcon={sort.direction === key ? checkmark : null}\n >\n {formatMessage(SORT_DIRECTION_LABELS[key])}\n </Menu.Item>\n ))}\n\n {showFoldersGroup && (\n <>\n <Menu.Separator />\n <GroupLabel>\n {formatMessage({\n id: getTranslationKey('list.sort.folders'),\n defaultMessage: 'Folders',\n })}\n </GroupLabel>\n {(Object.keys(FOLDERS_LABELS) as FoldersPosition[]).map((position) => (\n <Menu.Item\n key={position}\n role=\"menuitemradio\"\n aria-checked={sort.foldersPosition === position}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setFoldersPosition(position);\n }}\n endIcon={sort.foldersPosition === position ? checkmark : null}\n >\n {formatMessage(FOLDERS_LABELS[position])}\n </Menu.Item>\n ))}\n </>\n )}\n </Menu.Content>\n </Menu.Root>\n );\n};\n"],"names":["SORT_BY_LABELS","oldestUploads","id","getTranslationKey","defaultMessage","mostRecentUpdates","SORT_DIRECTION_LABELS","nameAsc","nameDesc","sizeAsc","sizeDesc","FOLDERS_LABELS","top","mixed","SortTrigger","styled","Menu","Trigger","GroupLabel","Label","theme","colorScheme","colors","neutral150","neutral100","spaces","borderRadius","SortMenu","sort","showFoldersGroup","formatMessage","useIntl","triggerLabel","active","sortBy","direction","checkmark","_jsx","Check","aria-hidden","width","height","fill","_jsxs","Root","variant","endIcon","ChevronDown","Content","popoverPlacement","zIndex","maxHeight","minWidth","Object","keys","map","key","Item","role","aria-checked","onSelect","e","preventDefault","setSortBy","setDirection","_Fragment","Separator","position","foldersPosition","setFoldersPosition"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
5
+ var searchQueryParam = require('../../../utils/searchQueryParam.js');
6
+
7
+ /**
8
+ * Reads and writes the global asset search term held in `?_q=`.
9
+ *
10
+ * Debouncing is the input component's job (see `AssetsSearchInput`) — this hook
11
+ * is a thin URL accessor so every consumer reads the same source of truth.
12
+ */ const useAssetSearch = ()=>{
13
+ const [{ query }, setQuery] = strapiAdmin.useQueryParams();
14
+ const searchQuery = query?._q ?? '';
15
+ const setSearchQuery = React.useCallback((value)=>{
16
+ if (value) {
17
+ setQuery({
18
+ _q: searchQueryParam.encodeSearchQuery(value)
19
+ }, 'push', true);
20
+ } else {
21
+ setQuery({
22
+ _q: ''
23
+ }, 'remove', true);
24
+ }
25
+ }, [
26
+ setQuery
27
+ ]);
28
+ const clearSearch = React.useCallback(()=>setSearchQuery(''), [
29
+ setSearchQuery
30
+ ]);
31
+ return {
32
+ searchQuery,
33
+ isSearching: searchQuery !== '',
34
+ setSearchQuery,
35
+ clearSearch
36
+ };
37
+ };
38
+
39
+ exports.useAssetSearch = useAssetSearch;
40
+ //# sourceMappingURL=useAssetSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAssetSearch.js","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useAssetSearch.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\n\nimport { encodeSearchQuery } from '../../../utils/searchQueryParam';\n\n/**\n * Reads and writes the global asset search term held in `?_q=`.\n *\n * Debouncing is the input component's job (see `AssetsSearchInput`) — this hook\n * is a thin URL accessor so every consumer reads the same source of truth.\n */\nexport const useAssetSearch = () => {\n const [{ query }, setQuery] = useQueryParams<{ _q?: string }>();\n\n const searchQuery = query?._q ?? '';\n\n const setSearchQuery = useCallback(\n (value: string) => {\n if (value) {\n setQuery({ _q: encodeSearchQuery(value) }, 'push', true);\n } else {\n setQuery({ _q: '' }, 'remove', true);\n }\n },\n [setQuery]\n );\n\n const clearSearch = useCallback(() => setSearchQuery(''), [setSearchQuery]);\n\n return {\n searchQuery,\n isSearching: searchQuery !== '',\n setSearchQuery,\n clearSearch,\n };\n};\n"],"names":["useAssetSearch","query","setQuery","useQueryParams","searchQuery","_q","setSearchQuery","useCallback","value","encodeSearchQuery","clearSearch","isSearching"],"mappings":";;;;;;AAMA;;;;;UAMaA,cAAAA,GAAiB,IAAA;AAC5B,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,EAAEC,SAAS,GAAGC,0BAAAA,EAAAA;IAE9B,MAAMC,WAAAA,GAAcH,OAAOI,EAAAA,IAAM,EAAA;IAEjC,MAAMC,cAAAA,GAAiBC,kBACrB,CAACC,KAAAA,GAAAA;AACC,QAAA,IAAIA,KAAAA,EAAO;YACTN,QAAAA,CAAS;AAAEG,gBAAAA,EAAAA,EAAII,kCAAAA,CAAkBD,KAAAA;AAAO,aAAA,EAAG,MAAA,EAAQ,IAAA,CAAA;QACrD,CAAA,MAAO;YACLN,QAAAA,CAAS;gBAAEG,EAAAA,EAAI;AAAG,aAAA,EAAG,QAAA,EAAU,IAAA,CAAA;AACjC,QAAA;IACF,CAAA,EACA;AAACH,QAAAA;AAAS,KAAA,CAAA;AAGZ,IAAA,MAAMQ,WAAAA,GAAcH,iBAAAA,CAAY,IAAMD,cAAAA,CAAe,EAAA,CAAA,EAAK;AAACA,QAAAA;AAAe,KAAA,CAAA;IAE1E,OAAO;AACLF,QAAAA,WAAAA;AACAO,QAAAA,WAAAA,EAAaP,WAAAA,KAAgB,EAAA;AAC7BE,QAAAA,cAAAA;AACAI,QAAAA;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,38 @@
1
+ import { useCallback } from 'react';
2
+ import { useQueryParams } from '@strapi/admin/strapi-admin';
3
+ import { encodeSearchQuery } from '../../../utils/searchQueryParam.mjs';
4
+
5
+ /**
6
+ * Reads and writes the global asset search term held in `?_q=`.
7
+ *
8
+ * Debouncing is the input component's job (see `AssetsSearchInput`) — this hook
9
+ * is a thin URL accessor so every consumer reads the same source of truth.
10
+ */ const useAssetSearch = ()=>{
11
+ const [{ query }, setQuery] = useQueryParams();
12
+ const searchQuery = query?._q ?? '';
13
+ const setSearchQuery = useCallback((value)=>{
14
+ if (value) {
15
+ setQuery({
16
+ _q: encodeSearchQuery(value)
17
+ }, 'push', true);
18
+ } else {
19
+ setQuery({
20
+ _q: ''
21
+ }, 'remove', true);
22
+ }
23
+ }, [
24
+ setQuery
25
+ ]);
26
+ const clearSearch = useCallback(()=>setSearchQuery(''), [
27
+ setSearchQuery
28
+ ]);
29
+ return {
30
+ searchQuery,
31
+ isSearching: searchQuery !== '',
32
+ setSearchQuery,
33
+ clearSearch
34
+ };
35
+ };
36
+
37
+ export { useAssetSearch };
38
+ //# sourceMappingURL=useAssetSearch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAssetSearch.mjs","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useAssetSearch.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\n\nimport { encodeSearchQuery } from '../../../utils/searchQueryParam';\n\n/**\n * Reads and writes the global asset search term held in `?_q=`.\n *\n * Debouncing is the input component's job (see `AssetsSearchInput`) — this hook\n * is a thin URL accessor so every consumer reads the same source of truth.\n */\nexport const useAssetSearch = () => {\n const [{ query }, setQuery] = useQueryParams<{ _q?: string }>();\n\n const searchQuery = query?._q ?? '';\n\n const setSearchQuery = useCallback(\n (value: string) => {\n if (value) {\n setQuery({ _q: encodeSearchQuery(value) }, 'push', true);\n } else {\n setQuery({ _q: '' }, 'remove', true);\n }\n },\n [setQuery]\n );\n\n const clearSearch = useCallback(() => setSearchQuery(''), [setSearchQuery]);\n\n return {\n searchQuery,\n isSearching: searchQuery !== '',\n setSearchQuery,\n clearSearch,\n };\n};\n"],"names":["useAssetSearch","query","setQuery","useQueryParams","searchQuery","_q","setSearchQuery","useCallback","value","encodeSearchQuery","clearSearch","isSearching"],"mappings":";;;;AAMA;;;;;UAMaA,cAAAA,GAAiB,IAAA;AAC5B,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,EAAEC,SAAS,GAAGC,cAAAA,EAAAA;IAE9B,MAAMC,WAAAA,GAAcH,OAAOI,EAAAA,IAAM,EAAA;IAEjC,MAAMC,cAAAA,GAAiBC,YACrB,CAACC,KAAAA,GAAAA;AACC,QAAA,IAAIA,KAAAA,EAAO;YACTN,QAAAA,CAAS;AAAEG,gBAAAA,EAAAA,EAAII,iBAAAA,CAAkBD,KAAAA;AAAO,aAAA,EAAG,MAAA,EAAQ,IAAA,CAAA;QACrD,CAAA,MAAO;YACLN,QAAAA,CAAS;gBAAEG,EAAAA,EAAI;AAAG,aAAA,EAAG,QAAA,EAAU,IAAA,CAAA;AACjC,QAAA;IACF,CAAA,EACA;AAACH,QAAAA;AAAS,KAAA,CAAA;AAGZ,IAAA,MAAMQ,WAAAA,GAAcH,WAAAA,CAAY,IAAMD,cAAAA,CAAe,EAAA,CAAA,EAAK;AAACA,QAAAA;AAAe,KAAA,CAAA;IAE1E,OAAO;AACLF,QAAAA,WAAAA;AACAO,QAAAA,WAAAA,EAAaP,WAAAA,KAAgB,EAAA;AAC7BE,QAAAA,cAAAA;AACAI,QAAAA;AACF,KAAA;AACF;;;;"}
@@ -4,14 +4,30 @@ var React = require('react');
4
4
  var selection = require('../utils/selection.js');
5
5
 
6
6
  const AssetSelectionContext = React.createContext(null);
7
- const AssetSelectionProvider = ({ children })=>{
7
+ const AssetSelectionProvider = ({ children, disabled = false })=>{
8
8
  const [state, setState] = React.useState(selection.createEmptySelection);
9
- const isSelected = React.useCallback((key)=>state.selectedKeys.has(key), [
9
+ const isSelected = React.useCallback((key)=>!disabled && state.selectedKeys.has(key), [
10
+ disabled,
10
11
  state.selectedKeys
11
12
  ]);
12
- const toggle = React.useCallback((key)=>setState((prev)=>selection.toggleSelection(prev, key)), []);
13
- const selectRange = React.useCallback((orderedKeys, targetKey)=>setState((prev)=>selection.selectRange(prev, orderedKeys, targetKey)), []);
14
- const selectAll = React.useCallback((orderedKeys)=>setState(selection.selectAll(orderedKeys)), []);
13
+ const toggle = React.useCallback((key)=>{
14
+ if (disabled) return;
15
+ setState((prev)=>selection.toggleSelection(prev, key));
16
+ }, [
17
+ disabled
18
+ ]);
19
+ const selectRange = React.useCallback((orderedKeys, targetKey)=>{
20
+ if (disabled) return;
21
+ setState((prev)=>selection.selectRange(prev, orderedKeys, targetKey));
22
+ }, [
23
+ disabled
24
+ ]);
25
+ const selectAll = React.useCallback((orderedKeys)=>{
26
+ if (disabled) return;
27
+ setState(selection.selectAll(orderedKeys));
28
+ }, [
29
+ disabled
30
+ ]);
15
31
  const clear = React.useCallback(()=>setState(selection.clearSelection()), []);
16
32
  const selectedIds = React.useMemo(()=>selection.getIdsOfKind(state.selectedKeys, 'asset'), [
17
33
  state.selectedKeys
@@ -1 +1 @@
1
- {"version":3,"file":"useAssetSelection.js","sources":["../../../../../../admin/src/future/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 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 /** 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\nexport const AssetSelectionProvider = ({ children }: AssetSelectionProviderProps) => {\n const [state, setState] = useState<SelectionState>(createEmptySelection);\n\n const isSelected = useCallback(\n (key: ItemKey) => state.selectedKeys.has(key),\n [state.selectedKeys]\n );\n\n const toggle = useCallback((key: ItemKey) => setState((prev) => toggleSelection(prev, key)), []);\n\n const selectRange = useCallback(\n (orderedKeys: ItemKey[], targetKey: ItemKey) =>\n setState((prev) => selectRangeState(prev, orderedKeys, targetKey)),\n []\n );\n\n const selectAll = useCallback(\n (orderedKeys: ItemKey[]) => setState(selectAllState(orderedKeys)),\n []\n );\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 clear,\n }),\n [\n state.selectedKeys,\n selectedIds,\n selectedFolderIds,\n state.anchorKey,\n isSelected,\n toggle,\n selectRange,\n selectAll,\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","state","setState","useState","createEmptySelection","isSelected","useCallback","key","selectedKeys","has","toggle","prev","toggleSelection","selectRange","orderedKeys","targetKey","selectRangeState","selectAll","selectAllState","clear","clearSelection","selectedIds","useMemo","getIdsOfKind","selectedFolderIds","value","anchorKey","createElement","Provider","useAssetSelection","context","useContext","Error","useAssetSelectionOptional"],"mappings":";;;;;AAoDA,MAAMA,wBAAwBC,mBAAAA,CAAqC,IAAA,CAAA;AAM5D,MAAMC,sBAAAA,GAAyB,CAAC,EAAEC,QAAQ,EAA+B,GAAA;AAC9E,IAAA,MAAM,CAACC,KAAAA,EAAOC,QAAAA,CAAS,GAAGC,cAAAA,CAAyBC,8BAAAA,CAAAA;IAEnD,MAAMC,UAAAA,GAAaC,kBACjB,CAACC,GAAAA,GAAiBN,MAAMO,YAAY,CAACC,GAAG,CAACF,GAAAA,CAAAA,EACzC;AAACN,QAAAA,KAAAA,CAAMO;AAAa,KAAA,CAAA;IAGtB,MAAME,MAAAA,GAASJ,iBAAAA,CAAY,CAACC,GAAAA,GAAiBL,QAAAA,CAAS,CAACS,IAAAA,GAASC,yBAAAA,CAAgBD,IAAAA,EAAMJ,GAAAA,CAAAA,CAAAA,EAAO,EAAE,CAAA;AAE/F,IAAA,MAAMM,WAAAA,GAAcP,iBAAAA,CAClB,CAACQ,WAAAA,EAAwBC,SAAAA,GACvBb,QAAAA,CAAS,CAACS,IAAAA,GAASK,qBAAAA,CAAiBL,IAAAA,EAAMG,WAAAA,EAAaC,SAAAA,CAAAA,CAAAA,EACzD,EAAE,CAAA;AAGJ,IAAA,MAAME,YAAYX,iBAAAA,CAChB,CAACQ,cAA2BZ,QAAAA,CAASgB,mBAAAA,CAAeJ,eACpD,EAAE,CAAA;AAGJ,IAAA,MAAMK,KAAAA,GAAQb,iBAAAA,CAAY,IAAMJ,QAAAA,CAASkB,6BAAmB,EAAE,CAAA;AAE9D,IAAA,MAAMC,cAAcC,aAAAA,CAClB,IAAMC,uBAAatB,KAAAA,CAAMO,YAAY,EAAE,OAAA,CAAA,EACvC;AAACP,QAAAA,KAAAA,CAAMO;AAAa,KAAA,CAAA;AAEtB,IAAA,MAAMgB,oBAAoBF,aAAAA,CACxB,IAAMC,uBAAatB,KAAAA,CAAMO,YAAY,EAAE,QAAA,CAAA,EACvC;AAACP,QAAAA,KAAAA,CAAMO;AAAa,KAAA,CAAA;IAGtB,MAAMiB,KAAAA,GAAQH,aAAAA,CACZ,KAAO;AACLd,YAAAA,YAAAA,EAAcP,MAAMO,YAAY;AAChCa,YAAAA,WAAAA;AACAG,YAAAA,iBAAAA;AACAE,YAAAA,SAAAA,EAAWzB,MAAMyB,SAAS;AAC1BrB,YAAAA,UAAAA;AACAK,YAAAA,MAAAA;AACAG,YAAAA,WAAAA;AACAI,YAAAA,SAAAA;AACAE,YAAAA;AACF,SAAA,CAAA,EACA;AACElB,QAAAA,KAAAA,CAAMO,YAAY;AAClBa,QAAAA,WAAAA;AACAG,QAAAA,iBAAAA;AACAvB,QAAAA,KAAAA,CAAMyB,SAAS;AACfrB,QAAAA,UAAAA;AACAK,QAAAA,MAAAA;AACAG,QAAAA,WAAAA;AACAI,QAAAA,SAAAA;AACAE,QAAAA;AACD,KAAA,CAAA;IAGH,OAAOQ,mBAAAA,CAAc9B,qBAAAA,CAAsB+B,QAAQ,EAAE;AAAEH,QAAAA;KAAM,EAAGzB,QAAAA,CAAAA;AAClE;MAEa6B,iBAAAA,GAAoB,IAAA;AAC/B,IAAA,MAAMC,UAAUC,gBAAAA,CAAWlC,qBAAAA,CAAAA;AAE3B,IAAA,IAAI,CAACiC,OAAAA,EAAS;AACZ,QAAA,MAAM,IAAIE,KAAAA,CAAM,iEAAA,CAAA;AAClB,IAAA;IAEA,OAAOF,OAAAA;AACT;AAEO,MAAMG,yBAAAA,GAA4B,IAAMF,gBAAAA,CAAWlC,qBAAAA;;;;;;"}
1
+ {"version":3,"file":"useAssetSelection.js","sources":["../../../../../../admin/src/future/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 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 /** 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 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 clear,\n }),\n [\n state.selectedKeys,\n selectedIds,\n selectedFolderIds,\n state.anchorKey,\n isSelected,\n toggle,\n selectRange,\n selectAll,\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","clear","clearSelection","selectedIds","useMemo","getIdsOfKind","selectedFolderIds","value","anchorKey","createElement","Provider","useAssetSelection","context","useContext","Error","useAssetSelectionOptional"],"mappings":"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"}
@@ -2,14 +2,30 @@ import { useState, useCallback, useMemo, createElement, createContext, useContex
2
2
  import { createEmptySelection, toggleSelection, selectRange, selectAll, clearSelection, getIdsOfKind } from '../utils/selection.mjs';
3
3
 
4
4
  const AssetSelectionContext = createContext(null);
5
- const AssetSelectionProvider = ({ children })=>{
5
+ const AssetSelectionProvider = ({ children, disabled = false })=>{
6
6
  const [state, setState] = useState(createEmptySelection);
7
- const isSelected = useCallback((key)=>state.selectedKeys.has(key), [
7
+ const isSelected = useCallback((key)=>!disabled && state.selectedKeys.has(key), [
8
+ disabled,
8
9
  state.selectedKeys
9
10
  ]);
10
- const toggle = useCallback((key)=>setState((prev)=>toggleSelection(prev, key)), []);
11
- const selectRange$1 = useCallback((orderedKeys, targetKey)=>setState((prev)=>selectRange(prev, orderedKeys, targetKey)), []);
12
- const selectAll$1 = useCallback((orderedKeys)=>setState(selectAll(orderedKeys)), []);
11
+ const toggle = useCallback((key)=>{
12
+ if (disabled) return;
13
+ setState((prev)=>toggleSelection(prev, key));
14
+ }, [
15
+ disabled
16
+ ]);
17
+ const selectRange$1 = useCallback((orderedKeys, targetKey)=>{
18
+ if (disabled) return;
19
+ setState((prev)=>selectRange(prev, orderedKeys, targetKey));
20
+ }, [
21
+ disabled
22
+ ]);
23
+ const selectAll$1 = useCallback((orderedKeys)=>{
24
+ if (disabled) return;
25
+ setState(selectAll(orderedKeys));
26
+ }, [
27
+ disabled
28
+ ]);
13
29
  const clear = useCallback(()=>setState(clearSelection()), []);
14
30
  const selectedIds = useMemo(()=>getIdsOfKind(state.selectedKeys, 'asset'), [
15
31
  state.selectedKeys
@@ -1 +1 @@
1
- {"version":3,"file":"useAssetSelection.mjs","sources":["../../../../../../admin/src/future/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 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 /** 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\nexport const AssetSelectionProvider = ({ children }: AssetSelectionProviderProps) => {\n const [state, setState] = useState<SelectionState>(createEmptySelection);\n\n const isSelected = useCallback(\n (key: ItemKey) => state.selectedKeys.has(key),\n [state.selectedKeys]\n );\n\n const toggle = useCallback((key: ItemKey) => setState((prev) => toggleSelection(prev, key)), []);\n\n const selectRange = useCallback(\n (orderedKeys: ItemKey[], targetKey: ItemKey) =>\n setState((prev) => selectRangeState(prev, orderedKeys, targetKey)),\n []\n );\n\n const selectAll = useCallback(\n (orderedKeys: ItemKey[]) => setState(selectAllState(orderedKeys)),\n []\n );\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 clear,\n }),\n [\n state.selectedKeys,\n selectedIds,\n selectedFolderIds,\n state.anchorKey,\n isSelected,\n toggle,\n selectRange,\n selectAll,\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","state","setState","useState","createEmptySelection","isSelected","useCallback","key","selectedKeys","has","toggle","prev","toggleSelection","selectRange","orderedKeys","targetKey","selectRangeState","selectAll","selectAllState","clear","clearSelection","selectedIds","useMemo","getIdsOfKind","selectedFolderIds","value","anchorKey","createElement","Provider","useAssetSelection","context","useContext","Error","useAssetSelectionOptional"],"mappings":";;;AAoDA,MAAMA,wBAAwBC,aAAAA,CAAqC,IAAA,CAAA;AAM5D,MAAMC,sBAAAA,GAAyB,CAAC,EAAEC,QAAQ,EAA+B,GAAA;AAC9E,IAAA,MAAM,CAACC,KAAAA,EAAOC,QAAAA,CAAS,GAAGC,QAAAA,CAAyBC,oBAAAA,CAAAA;IAEnD,MAAMC,UAAAA,GAAaC,YACjB,CAACC,GAAAA,GAAiBN,MAAMO,YAAY,CAACC,GAAG,CAACF,GAAAA,CAAAA,EACzC;AAACN,QAAAA,KAAAA,CAAMO;AAAa,KAAA,CAAA;IAGtB,MAAME,MAAAA,GAASJ,WAAAA,CAAY,CAACC,GAAAA,GAAiBL,QAAAA,CAAS,CAACS,IAAAA,GAASC,eAAAA,CAAgBD,IAAAA,EAAMJ,GAAAA,CAAAA,CAAAA,EAAO,EAAE,CAAA;AAE/F,IAAA,MAAMM,aAAAA,GAAcP,WAAAA,CAClB,CAACQ,WAAAA,EAAwBC,SAAAA,GACvBb,QAAAA,CAAS,CAACS,IAAAA,GAASK,WAAAA,CAAiBL,IAAAA,EAAMG,WAAAA,EAAaC,SAAAA,CAAAA,CAAAA,EACzD,EAAE,CAAA;AAGJ,IAAA,MAAME,cAAYX,WAAAA,CAChB,CAACQ,cAA2BZ,QAAAA,CAASgB,SAAAA,CAAeJ,eACpD,EAAE,CAAA;AAGJ,IAAA,MAAMK,KAAAA,GAAQb,WAAAA,CAAY,IAAMJ,QAAAA,CAASkB,mBAAmB,EAAE,CAAA;AAE9D,IAAA,MAAMC,cAAcC,OAAAA,CAClB,IAAMC,aAAatB,KAAAA,CAAMO,YAAY,EAAE,OAAA,CAAA,EACvC;AAACP,QAAAA,KAAAA,CAAMO;AAAa,KAAA,CAAA;AAEtB,IAAA,MAAMgB,oBAAoBF,OAAAA,CACxB,IAAMC,aAAatB,KAAAA,CAAMO,YAAY,EAAE,QAAA,CAAA,EACvC;AAACP,QAAAA,KAAAA,CAAMO;AAAa,KAAA,CAAA;IAGtB,MAAMiB,KAAAA,GAAQH,OAAAA,CACZ,KAAO;AACLd,YAAAA,YAAAA,EAAcP,MAAMO,YAAY;AAChCa,YAAAA,WAAAA;AACAG,YAAAA,iBAAAA;AACAE,YAAAA,SAAAA,EAAWzB,MAAMyB,SAAS;AAC1BrB,YAAAA,UAAAA;AACAK,YAAAA,MAAAA;AACAG,yBAAAA,aAAAA;AACAI,uBAAAA,WAAAA;AACAE,YAAAA;AACF,SAAA,CAAA,EACA;AACElB,QAAAA,KAAAA,CAAMO,YAAY;AAClBa,QAAAA,WAAAA;AACAG,QAAAA,iBAAAA;AACAvB,QAAAA,KAAAA,CAAMyB,SAAS;AACfrB,QAAAA,UAAAA;AACAK,QAAAA,MAAAA;AACAG,QAAAA,aAAAA;AACAI,QAAAA,WAAAA;AACAE,QAAAA;AACD,KAAA,CAAA;IAGH,OAAOQ,aAAAA,CAAc9B,qBAAAA,CAAsB+B,QAAQ,EAAE;AAAEH,QAAAA;KAAM,EAAGzB,QAAAA,CAAAA;AAClE;MAEa6B,iBAAAA,GAAoB,IAAA;AAC/B,IAAA,MAAMC,UAAUC,UAAAA,CAAWlC,qBAAAA,CAAAA;AAE3B,IAAA,IAAI,CAACiC,OAAAA,EAAS;AACZ,QAAA,MAAM,IAAIE,KAAAA,CAAM,iEAAA,CAAA;AAClB,IAAA;IAEA,OAAOF,OAAAA;AACT;AAEO,MAAMG,yBAAAA,GAA4B,IAAMF,UAAAA,CAAWlC,qBAAAA;;;;"}
1
+ {"version":3,"file":"useAssetSelection.mjs","sources":["../../../../../../admin/src/future/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 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 /** 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 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 clear,\n }),\n [\n state.selectedKeys,\n selectedIds,\n selectedFolderIds,\n state.anchorKey,\n isSelected,\n toggle,\n selectRange,\n selectAll,\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","clear","clearSelection","selectedIds","useMemo","getIdsOfKind","selectedFolderIds","value","anchorKey","createElement","Provider","useAssetSelection","context","useContext","Error","useAssetSelectionOptional"],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ const BusyAssetsContext = React.createContext(null);
6
+ const BusyAssetsProvider = ({ children })=>{
7
+ const [busyById, setBusyById] = React.useState({});
8
+ const markBusy = React.useCallback((id, message)=>{
9
+ setBusyById((prev)=>({
10
+ ...prev,
11
+ [id]: message
12
+ }));
13
+ return ()=>setBusyById((prev)=>{
14
+ // Rebuild without the key rather than mutating — the value is compared
15
+ // by identity downstream.
16
+ const { [id]: _released, ...rest } = prev;
17
+ return rest;
18
+ });
19
+ }, []);
20
+ const isBusy = React.useCallback((id)=>busyById[id] !== undefined, [
21
+ busyById
22
+ ]);
23
+ const getBusyMessage = React.useCallback((id)=>busyById[id] ?? null, [
24
+ busyById
25
+ ]);
26
+ const value = React.useMemo(()=>({
27
+ isBusy,
28
+ getBusyMessage,
29
+ markBusy
30
+ }), [
31
+ isBusy,
32
+ getBusyMessage,
33
+ markBusy
34
+ ]);
35
+ return React.createElement(BusyAssetsContext.Provider, {
36
+ value
37
+ }, children);
38
+ };
39
+ /**
40
+ * Optional by design: `AssetActionsMenu`, `AssetRow` and `AssetCard` are also
41
+ * rendered in tests and in the asset picker, outside this provider. Without it
42
+ * the mutation still runs, it just shows no row-level feedback.
43
+ */ const useBusyAssetsOptional = ()=>React.useContext(BusyAssetsContext);
44
+
45
+ exports.BusyAssetsProvider = BusyAssetsProvider;
46
+ exports.useBusyAssetsOptional = useBusyAssetsOptional;
47
+ //# sourceMappingURL=useBusyAssets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBusyAssets.js","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useBusyAssets.ts"],"sourcesContent":["import { createContext, createElement, useCallback, useContext, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\n\n/**\n * Which assets have a long-running mutation in flight, so the list can show it\n * on the item itself.\n *\n * The mutation stays where it is triggered — the row's \"...\" menu — but the\n * feedback has to render on the row or card, which is an ancestor of it. The\n * menu sits in a leaf `<td>` (table) / footer `Flex` (grid), so an overlay\n * mounted there would cover the button and nothing else. Rather than hoist the\n * mutation up into both `AssetRow` and `AssetCard` (duplicating it, and moving\n * it away from the control that owns it), the busy flag travels up through\n * context and the ancestor renders the overlay.\n *\n * Scoped per asset id rather than a single boolean: a replace on one row must\n * not blank out every other row. Modelled on `isMovePending` in\n * `AssetsDndProvider`, which does the same thing for drag-moves — that one is\n * list-wide because a move genuinely blocks the whole list.\n */\nexport interface BusyAssets {\n /** Whether this asset has a mutation in flight. */\n isBusy: (id: number) => boolean;\n /** The message to show while it is, or `null`. */\n getBusyMessage: (id: number) => string | null;\n /**\n * Marks the asset busy and returns the release function. Pair it with\n * `try`/`finally` so the flag clears on failure too.\n */\n markBusy: (id: number, message: string) => () => void;\n}\n\nconst BusyAssetsContext = createContext<BusyAssets | null>(null);\n\nexport const BusyAssetsProvider = ({ children }: { children: ReactNode }) => {\n const [busyById, setBusyById] = useState<Record<number, string>>({});\n\n const markBusy = useCallback((id: number, message: string) => {\n setBusyById((prev) => ({ ...prev, [id]: message }));\n\n return () =>\n setBusyById((prev) => {\n // Rebuild without the key rather than mutating — the value is compared\n // by identity downstream.\n const { [id]: _released, ...rest } = prev;\n return rest;\n });\n }, []);\n\n const isBusy = useCallback((id: number) => busyById[id] !== undefined, [busyById]);\n\n const getBusyMessage = useCallback((id: number) => busyById[id] ?? null, [busyById]);\n\n const value = useMemo<BusyAssets>(\n () => ({ isBusy, getBusyMessage, markBusy }),\n [isBusy, getBusyMessage, markBusy]\n );\n\n return createElement(BusyAssetsContext.Provider, { value }, children);\n};\n\n/**\n * Optional by design: `AssetActionsMenu`, `AssetRow` and `AssetCard` are also\n * rendered in tests and in the asset picker, outside this provider. Without it\n * the mutation still runs, it just shows no row-level feedback.\n */\nexport const useBusyAssetsOptional = () => useContext(BusyAssetsContext);\n"],"names":["BusyAssetsContext","createContext","BusyAssetsProvider","children","busyById","setBusyById","useState","markBusy","useCallback","id","message","prev","_released","rest","isBusy","undefined","getBusyMessage","value","useMemo","createElement","Provider","useBusyAssetsOptional","useContext"],"mappings":";;;;AAgCA,MAAMA,oBAAoBC,mBAAAA,CAAiC,IAAA,CAAA;AAEpD,MAAMC,kBAAAA,GAAqB,CAAC,EAAEC,QAAQ,EAA2B,GAAA;AACtE,IAAA,MAAM,CAACC,QAAAA,EAAUC,WAAAA,CAAY,GAAGC,eAAiC,EAAC,CAAA;IAElE,MAAMC,QAAAA,GAAWC,iBAAAA,CAAY,CAACC,EAAAA,EAAYC,OAAAA,GAAAA;QACxCL,WAAAA,CAAY,CAACM,QAAU;AAAE,gBAAA,GAAGA,IAAI;AAAE,gBAAA,CAACF,KAAKC;aAAQ,CAAA,CAAA;QAEhD,OAAO,IACLL,YAAY,CAACM,IAAAA,GAAAA;;;gBAGX,MAAM,EAAE,CAACF,EAAAA,GAAKG,SAAS,EAAE,GAAGC,MAAM,GAAGF,IAAAA;gBACrC,OAAOE,IAAAA;AACT,YAAA,CAAA,CAAA;AACJ,IAAA,CAAA,EAAG,EAAE,CAAA;IAEL,MAAMC,MAAAA,GAASN,kBAAY,CAACC,EAAAA,GAAeL,QAAQ,CAACK,EAAAA,CAAG,KAAKM,SAAAA,EAAW;AAACX,QAAAA;AAAS,KAAA,CAAA;IAEjF,MAAMY,cAAAA,GAAiBR,kBAAY,CAACC,EAAAA,GAAeL,QAAQ,CAACK,EAAAA,CAAG,IAAI,IAAA,EAAM;AAACL,QAAAA;AAAS,KAAA,CAAA;IAEnF,MAAMa,KAAAA,GAAQC,aAAAA,CACZ,KAAO;AAAEJ,YAAAA,MAAAA;AAAQE,YAAAA,cAAAA;AAAgBT,YAAAA;AAAS,SAAA,CAAA,EAC1C;AAACO,QAAAA,MAAAA;AAAQE,QAAAA,cAAAA;AAAgBT,QAAAA;AAAS,KAAA,CAAA;IAGpC,OAAOY,mBAAAA,CAAcnB,iBAAAA,CAAkBoB,QAAQ,EAAE;AAAEH,QAAAA;KAAM,EAAGd,QAAAA,CAAAA;AAC9D;AAEA;;;;AAIC,IACM,MAAMkB,qBAAAA,GAAwB,IAAMC,iBAAWtB,iBAAAA;;;;;"}
@@ -0,0 +1,44 @@
1
+ import { useState, useCallback, useMemo, createElement, createContext, useContext } from 'react';
2
+
3
+ const BusyAssetsContext = createContext(null);
4
+ const BusyAssetsProvider = ({ children })=>{
5
+ const [busyById, setBusyById] = useState({});
6
+ const markBusy = useCallback((id, message)=>{
7
+ setBusyById((prev)=>({
8
+ ...prev,
9
+ [id]: message
10
+ }));
11
+ return ()=>setBusyById((prev)=>{
12
+ // Rebuild without the key rather than mutating — the value is compared
13
+ // by identity downstream.
14
+ const { [id]: _released, ...rest } = prev;
15
+ return rest;
16
+ });
17
+ }, []);
18
+ const isBusy = useCallback((id)=>busyById[id] !== undefined, [
19
+ busyById
20
+ ]);
21
+ const getBusyMessage = useCallback((id)=>busyById[id] ?? null, [
22
+ busyById
23
+ ]);
24
+ const value = useMemo(()=>({
25
+ isBusy,
26
+ getBusyMessage,
27
+ markBusy
28
+ }), [
29
+ isBusy,
30
+ getBusyMessage,
31
+ markBusy
32
+ ]);
33
+ return createElement(BusyAssetsContext.Provider, {
34
+ value
35
+ }, children);
36
+ };
37
+ /**
38
+ * Optional by design: `AssetActionsMenu`, `AssetRow` and `AssetCard` are also
39
+ * rendered in tests and in the asset picker, outside this provider. Without it
40
+ * the mutation still runs, it just shows no row-level feedback.
41
+ */ const useBusyAssetsOptional = ()=>useContext(BusyAssetsContext);
42
+
43
+ export { BusyAssetsProvider, useBusyAssetsOptional };
44
+ //# sourceMappingURL=useBusyAssets.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBusyAssets.mjs","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useBusyAssets.ts"],"sourcesContent":["import { createContext, createElement, useCallback, useContext, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\n\n/**\n * Which assets have a long-running mutation in flight, so the list can show it\n * on the item itself.\n *\n * The mutation stays where it is triggered — the row's \"...\" menu — but the\n * feedback has to render on the row or card, which is an ancestor of it. The\n * menu sits in a leaf `<td>` (table) / footer `Flex` (grid), so an overlay\n * mounted there would cover the button and nothing else. Rather than hoist the\n * mutation up into both `AssetRow` and `AssetCard` (duplicating it, and moving\n * it away from the control that owns it), the busy flag travels up through\n * context and the ancestor renders the overlay.\n *\n * Scoped per asset id rather than a single boolean: a replace on one row must\n * not blank out every other row. Modelled on `isMovePending` in\n * `AssetsDndProvider`, which does the same thing for drag-moves — that one is\n * list-wide because a move genuinely blocks the whole list.\n */\nexport interface BusyAssets {\n /** Whether this asset has a mutation in flight. */\n isBusy: (id: number) => boolean;\n /** The message to show while it is, or `null`. */\n getBusyMessage: (id: number) => string | null;\n /**\n * Marks the asset busy and returns the release function. Pair it with\n * `try`/`finally` so the flag clears on failure too.\n */\n markBusy: (id: number, message: string) => () => void;\n}\n\nconst BusyAssetsContext = createContext<BusyAssets | null>(null);\n\nexport const BusyAssetsProvider = ({ children }: { children: ReactNode }) => {\n const [busyById, setBusyById] = useState<Record<number, string>>({});\n\n const markBusy = useCallback((id: number, message: string) => {\n setBusyById((prev) => ({ ...prev, [id]: message }));\n\n return () =>\n setBusyById((prev) => {\n // Rebuild without the key rather than mutating — the value is compared\n // by identity downstream.\n const { [id]: _released, ...rest } = prev;\n return rest;\n });\n }, []);\n\n const isBusy = useCallback((id: number) => busyById[id] !== undefined, [busyById]);\n\n const getBusyMessage = useCallback((id: number) => busyById[id] ?? null, [busyById]);\n\n const value = useMemo<BusyAssets>(\n () => ({ isBusy, getBusyMessage, markBusy }),\n [isBusy, getBusyMessage, markBusy]\n );\n\n return createElement(BusyAssetsContext.Provider, { value }, children);\n};\n\n/**\n * Optional by design: `AssetActionsMenu`, `AssetRow` and `AssetCard` are also\n * rendered in tests and in the asset picker, outside this provider. Without it\n * the mutation still runs, it just shows no row-level feedback.\n */\nexport const useBusyAssetsOptional = () => useContext(BusyAssetsContext);\n"],"names":["BusyAssetsContext","createContext","BusyAssetsProvider","children","busyById","setBusyById","useState","markBusy","useCallback","id","message","prev","_released","rest","isBusy","undefined","getBusyMessage","value","useMemo","createElement","Provider","useBusyAssetsOptional","useContext"],"mappings":";;AAgCA,MAAMA,oBAAoBC,aAAAA,CAAiC,IAAA,CAAA;AAEpD,MAAMC,kBAAAA,GAAqB,CAAC,EAAEC,QAAQ,EAA2B,GAAA;AACtE,IAAA,MAAM,CAACC,QAAAA,EAAUC,WAAAA,CAAY,GAAGC,SAAiC,EAAC,CAAA;IAElE,MAAMC,QAAAA,GAAWC,WAAAA,CAAY,CAACC,EAAAA,EAAYC,OAAAA,GAAAA;QACxCL,WAAAA,CAAY,CAACM,QAAU;AAAE,gBAAA,GAAGA,IAAI;AAAE,gBAAA,CAACF,KAAKC;aAAQ,CAAA,CAAA;QAEhD,OAAO,IACLL,YAAY,CAACM,IAAAA,GAAAA;;;gBAGX,MAAM,EAAE,CAACF,EAAAA,GAAKG,SAAS,EAAE,GAAGC,MAAM,GAAGF,IAAAA;gBACrC,OAAOE,IAAAA;AACT,YAAA,CAAA,CAAA;AACJ,IAAA,CAAA,EAAG,EAAE,CAAA;IAEL,MAAMC,MAAAA,GAASN,YAAY,CAACC,EAAAA,GAAeL,QAAQ,CAACK,EAAAA,CAAG,KAAKM,SAAAA,EAAW;AAACX,QAAAA;AAAS,KAAA,CAAA;IAEjF,MAAMY,cAAAA,GAAiBR,YAAY,CAACC,EAAAA,GAAeL,QAAQ,CAACK,EAAAA,CAAG,IAAI,IAAA,EAAM;AAACL,QAAAA;AAAS,KAAA,CAAA;IAEnF,MAAMa,KAAAA,GAAQC,OAAAA,CACZ,KAAO;AAAEJ,YAAAA,MAAAA;AAAQE,YAAAA,cAAAA;AAAgBT,YAAAA;AAAS,SAAA,CAAA,EAC1C;AAACO,QAAAA,MAAAA;AAAQE,QAAAA,cAAAA;AAAgBT,QAAAA;AAAS,KAAA,CAAA;IAGpC,OAAOY,aAAAA,CAAcnB,iBAAAA,CAAkBoB,QAAQ,EAAE;AAAEH,QAAAA;KAAM,EAAGd,QAAAA,CAAAA;AAC9D;AAEA;;;;AAIC,IACM,MAAMkB,qBAAAA,GAAwB,IAAMC,WAAWtB,iBAAAA;;;;"}