@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
@@ -0,0 +1,453 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
6
+ var designSystem = require('@strapi/design-system');
7
+ var icons = require('@strapi/icons');
8
+ var reactIntl = require('react-intl');
9
+ var styledComponents = require('styled-components');
10
+ var translations = require('../../../utils/translations.js');
11
+ var useListFilters = require('../hooks/useListFilters.js');
12
+ var DateRangeCalendar = require('./DateRangeCalendar.js');
13
+
14
+ const TYPE_LABELS = {
15
+ folder: {
16
+ id: translations.getTranslationKey('list.filters.type.folder'),
17
+ defaultMessage: 'Folder'
18
+ },
19
+ picture: {
20
+ id: translations.getTranslationKey('list.filters.type.picture'),
21
+ defaultMessage: 'Picture'
22
+ },
23
+ audio: {
24
+ id: translations.getTranslationKey('list.filters.type.audio'),
25
+ defaultMessage: 'Audio'
26
+ },
27
+ video: {
28
+ id: translations.getTranslationKey('list.filters.type.video'),
29
+ defaultMessage: 'Video'
30
+ },
31
+ document: {
32
+ id: translations.getTranslationKey('list.filters.type.document'),
33
+ defaultMessage: 'Document'
34
+ }
35
+ };
36
+ const PRESET_LABELS = {
37
+ '1day': {
38
+ id: translations.getTranslationKey('list.filters.preset.1day'),
39
+ defaultMessage: '1 day ago'
40
+ },
41
+ '3days': {
42
+ id: translations.getTranslationKey('list.filters.preset.3days'),
43
+ defaultMessage: '3 days ago'
44
+ },
45
+ '1week': {
46
+ id: translations.getTranslationKey('list.filters.preset.1week'),
47
+ defaultMessage: '1 week ago'
48
+ },
49
+ '1month': {
50
+ id: translations.getTranslationKey('list.filters.preset.1month'),
51
+ defaultMessage: '1 month ago'
52
+ },
53
+ '3months': {
54
+ id: translations.getTranslationKey('list.filters.preset.3months'),
55
+ defaultMessage: '3 months ago'
56
+ },
57
+ '6months': {
58
+ id: translations.getTranslationKey('list.filters.preset.6months'),
59
+ defaultMessage: '6 months ago'
60
+ },
61
+ '1year': {
62
+ id: translations.getTranslationKey('list.filters.preset.1year'),
63
+ defaultMessage: '1 year ago'
64
+ }
65
+ };
66
+ const DATE_FIELD_LABELS = {
67
+ createdAt: {
68
+ id: translations.getTranslationKey('list.filters.field.created'),
69
+ defaultMessage: 'Creation date'
70
+ },
71
+ updatedAt: {
72
+ id: translations.getTranslationKey('list.filters.field.updated'),
73
+ defaultMessage: 'Last modified'
74
+ }
75
+ };
76
+ // The DS SubTrigger renders its chevron inline right after the label — push it
77
+ // to the far edge so every field row reads label · · · ›, like the mock.
78
+ const FieldSubTrigger = styledComponents.styled(designSystem.Menu.SubTrigger)`
79
+ width: 100%;
80
+ justify-content: space-between;
81
+ `;
82
+ /** Every panel of the filter tree shares this fixed width (design). */ const FILTER_PANEL_WIDTH = '24.2rem';
83
+ // dvh, not vh: on a phone `vh` ignores the browser chrome, so a 70vh panel can
84
+ // extend past the visual viewport and leave its lower rows (the last field, and
85
+ // anything under the date-range calendar) stranded under the URL bar with no way
86
+ // to scroll to them. Same reason the drawer caps on dvh.
87
+ const PANEL_MAX_HEIGHT = '70dvh';
88
+ // Mobile uses one flat panel (accordion), so it never needs room for a side
89
+ // flyout — cap it to the viewport so it can't overflow a narrow screen.
90
+ const MOBILE_PANEL_WIDTH = `min(${FILTER_PANEL_WIDTH}, calc(100dvw - 2rem))`;
91
+ // Mobile accordion: the field row is a plain menu item that expands its options
92
+ // inline below it (Radix sub-menus can only fly out sideways, off a phone).
93
+ const FieldToggle = styledComponents.styled(designSystem.Menu.Item)`
94
+ width: 100%;
95
+ `;
96
+ // The options revealed under a field row.
97
+ //
98
+ // `width: 100%` is load-bearing: Menu.Content is a column flex with
99
+ // `align-items: flex-start`, so a child shrink-wraps to its content unless it
100
+ // sets a width explicitly. Without it the group collapsed to the widest option
101
+ // label and the rows' own `width: 100%` resolved against that, so a selected row
102
+ // highlighted only part of the panel.
103
+ //
104
+ // The indent then lives on each row's padding rather than on this wrapper —
105
+ // padding here would inset the rows, and the highlight with them.
106
+ const OptionGroup = styledComponents.styled(designSystem.Box)`
107
+ width: 100%;
108
+
109
+ > * {
110
+ width: 100%;
111
+ }
112
+
113
+ /* menuitem, menuitemradio and menuitemcheckbox — every option row, plus the
114
+ "Select date range" toggle, which sits at the same level. */
115
+ > [role^='menuitem'] {
116
+ padding-left: ${({ theme })=>theme.spaces[6]};
117
+ }
118
+ `;
119
+ // Rotates the chevron when its section is open.
120
+ const Chevron = styledComponents.styled(icons.ChevronDown)`
121
+ transition: transform 0.2s ease;
122
+ transform: rotate(${({ $open })=>$open ? '180deg' : '0deg'});
123
+ `;
124
+ // Sub panels: fixed width, no 15rem clamp (the DS default folds the calendar),
125
+ // and a negative top margin cancelling the parent panel's padding + border so
126
+ // the sub panel's top edge lines up with the parent panel, not the item.
127
+ const SubPanel = styledComponents.styled(designSystem.Menu.SubContent)`
128
+ margin-top: calc(-1 * (${({ theme })=>theme.spaces[1]} + 1px));
129
+ `;
130
+ const CountBadge = styledComponents.styled(designSystem.Badge)`
131
+ height: 1.6rem;
132
+ min-width: auto;
133
+ padding: 0 0.4rem;
134
+ `;
135
+ /**
136
+ * Toolbar "Filter" dropdown. Picking anything ADDS a badge (editing happens on
137
+ * the badge itself, see FilterBadges):
138
+ *
139
+ * - Type → keep-open checkbox list; the badge is created/updated live with the
140
+ * checked set (`is` by default, condition editable on the badge).
141
+ * - Creation date / Last modified → preset list (single pick, `within the
142
+ * last` by default) + "Select date range" (creation date only) opening the
143
+ * range calendar; a completed range adds an `is` range badge.
144
+ *
145
+ * Closing behaviour follows how many values a field can hold: a date is one
146
+ * value, so picking a preset (or committing a range) closes the menu; Type is a
147
+ * set, so it stays open until dismissed.
148
+ */ const FilterMenu = ({ listFilters })=>{
149
+ const { formatMessage } = reactIntl.useIntl();
150
+ const [isOpen, setIsOpen] = React.useState(false);
151
+ const { filters, addFilter, updateFilter, removeFilter } = listFilters;
152
+ // The Type submenu edits the LAST type badge in place while the menu stays
153
+ // open (checking values accumulates into one badge, per design).
154
+ let lastTypeIndex = -1;
155
+ for(let i = filters.length - 1; i >= 0; i -= 1){
156
+ if (filters[i].kind === 'type') {
157
+ lastTypeIndex = i;
158
+ break;
159
+ }
160
+ }
161
+ const lastTypeFilter = lastTypeIndex >= 0 ? filters[lastTypeIndex] : null;
162
+ const checkedValues = lastTypeFilter && lastTypeFilter.kind === 'type' ? lastTypeFilter.values : [];
163
+ const toggleTypeValue = (value)=>{
164
+ const nextValues = checkedValues.includes(value) ? checkedValues.filter((v)=>v !== value) : [
165
+ ...checkedValues,
166
+ value
167
+ ];
168
+ if (lastTypeFilter && lastTypeFilter.kind === 'type') {
169
+ if (nextValues.length === 0) {
170
+ // Unchecking the final value removes the badge outright — a type
171
+ // filter with no values is not a state (it would serialize to a
172
+ // malformed `type:is:` the parser drops anyway).
173
+ removeFilter(lastTypeIndex);
174
+ } else {
175
+ updateFilter(lastTypeIndex, {
176
+ ...lastTypeFilter,
177
+ values: nextValues
178
+ });
179
+ }
180
+ } else if (nextValues.length > 0) {
181
+ addFilter({
182
+ kind: 'type',
183
+ condition: 'is',
184
+ values: nextValues
185
+ });
186
+ }
187
+ };
188
+ // Creation date / Last modified are single-select (per design): selecting a
189
+ // preset replaces the field's existing preset badge in place (keeping its
190
+ // condition) rather than adding another pill; a badge is created only when the
191
+ // field has none yet.
192
+ const addPreset = (field, preset)=>{
193
+ for(let i = filters.length - 1; i >= 0; i -= 1){
194
+ const f = filters[i];
195
+ if (f.kind === 'date' && f.mode === 'preset' && f.field === field) {
196
+ updateFilter(i, {
197
+ ...f,
198
+ preset
199
+ });
200
+ return;
201
+ }
202
+ }
203
+ addFilter({
204
+ kind: 'date',
205
+ field,
206
+ mode: 'preset',
207
+ condition: 'withinLast',
208
+ preset
209
+ });
210
+ };
211
+ const addRange = (from, to)=>{
212
+ addFilter({
213
+ kind: 'date',
214
+ field: 'createdAt',
215
+ mode: 'range',
216
+ condition: 'is',
217
+ from,
218
+ to
219
+ });
220
+ // The calendar is not a Menu.Item — close the menu explicitly on commit.
221
+ setIsOpen(false);
222
+ };
223
+ const isMobile = strapiAdmin.useIsMobile();
224
+ // Mobile accordion state: which field is expanded, and whether its date-range
225
+ // calendar is open. Both reset when the whole menu closes.
226
+ const [openField, setOpenField] = React.useState(null);
227
+ const [rangeOpen, setRangeOpen] = React.useState(false);
228
+ const handleOpenChange = (next)=>{
229
+ setIsOpen(next);
230
+ if (!next) {
231
+ setOpenField(null);
232
+ setRangeOpen(false);
233
+ }
234
+ };
235
+ const toggleField = (field)=>{
236
+ setOpenField((current)=>current === field ? null : field);
237
+ setRangeOpen(false);
238
+ };
239
+ // Option lists, shared by the desktop flyouts and the mobile accordion.
240
+ // Multi-select semantics: menuitemcheckbox + aria-checked carry the state for
241
+ // assistive tech; the Checkbox is purely decorative (aria-hidden, unfocusable)
242
+ // — the Menu.Item is the control.
243
+ const typeItems = useListFilters.TYPE_VALUES.map((value)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
244
+ role: "menuitemcheckbox",
245
+ "aria-checked": checkedValues.includes(value),
246
+ onSelect: (e)=>{
247
+ e.preventDefault();
248
+ toggleTypeValue(value);
249
+ },
250
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Checkbox, {
251
+ checked: checkedValues.includes(value),
252
+ tabIndex: -1,
253
+ "aria-hidden": true
254
+ }),
255
+ children: formatMessage(TYPE_LABELS[value])
256
+ }, value));
257
+ // The field's currently-selected preset (single-select), so the menu can mark
258
+ // it with a check.
259
+ const selectedPresetForField = (field)=>{
260
+ for(let i = filters.length - 1; i >= 0; i -= 1){
261
+ const f = filters[i];
262
+ if (f.kind === 'date' && f.mode === 'preset' && f.field === field) {
263
+ return f.preset;
264
+ }
265
+ }
266
+ return null;
267
+ };
268
+ const presetItems = (field)=>{
269
+ const selected = selectedPresetForField(field);
270
+ return useListFilters.DATE_PRESETS.map((preset)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
271
+ role: "menuitemradio",
272
+ "aria-checked": selected === preset,
273
+ onSelect: ()=>{
274
+ // No preventDefault, unlike Type: a date field holds exactly one
275
+ // value, so the pick is complete and the menu closes on it. Type stays
276
+ // open because the user may still be building up a multi-value set.
277
+ addPreset(field, preset);
278
+ },
279
+ endIcon: selected === preset ? /*#__PURE__*/ jsxRuntime.jsx(icons.Check, {
280
+ "aria-hidden": true,
281
+ width: "1.6rem",
282
+ height: "1.6rem",
283
+ fill: "primary600"
284
+ }) : null,
285
+ children: formatMessage(PRESET_LABELS[preset])
286
+ }, preset));
287
+ };
288
+ const typeLabel = formatMessage({
289
+ id: translations.getTranslationKey('list.filters.field.type'),
290
+ defaultMessage: 'Type'
291
+ });
292
+ const selectDateRangeLabel = formatMessage({
293
+ id: translations.getTranslationKey('list.filters.select-date-range'),
294
+ defaultMessage: 'Select date range'
295
+ });
296
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Root, {
297
+ open: isOpen,
298
+ onOpenChange: handleOpenChange,
299
+ children: [
300
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Trigger, {
301
+ variant: "tertiary",
302
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Filter, {
303
+ "aria-hidden": true
304
+ }),
305
+ endIcon: null,
306
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
307
+ gap: 2,
308
+ alignItems: "center",
309
+ tag: "span",
310
+ children: [
311
+ formatMessage({
312
+ id: translations.getTranslationKey('list.filters.trigger'),
313
+ defaultMessage: 'Filter'
314
+ }),
315
+ filters.length > 0 && /*#__PURE__*/ jsxRuntime.jsx(CountBadge, {
316
+ children: filters.length
317
+ })
318
+ ]
319
+ })
320
+ }),
321
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Content, {
322
+ popoverPlacement: "bottom-start",
323
+ zIndex: 2,
324
+ maxHeight: PANEL_MAX_HEIGHT,
325
+ width: isMobile ? MOBILE_PANEL_WIDTH : FILTER_PANEL_WIDTH,
326
+ children: isMobile ? // Mobile: one flat panel. Each field expands its options inline below
327
+ // itself — Radix sub-menus can only fly out sideways, off a phone.
328
+ /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
329
+ children: [
330
+ /*#__PURE__*/ jsxRuntime.jsx(FieldToggle, {
331
+ "aria-expanded": openField === 'type',
332
+ onSelect: (e)=>{
333
+ e.preventDefault();
334
+ toggleField('type');
335
+ },
336
+ endIcon: /*#__PURE__*/ jsxRuntime.jsx(Chevron, {
337
+ $open: openField === 'type',
338
+ "aria-hidden": true
339
+ }),
340
+ children: typeLabel
341
+ }),
342
+ openField === 'type' && /*#__PURE__*/ jsxRuntime.jsx(OptionGroup, {
343
+ children: typeItems
344
+ }),
345
+ [
346
+ 'createdAt',
347
+ 'updatedAt'
348
+ ].map((field)=>/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Box, {
349
+ width: "100%",
350
+ children: [
351
+ /*#__PURE__*/ jsxRuntime.jsx(FieldToggle, {
352
+ "aria-expanded": openField === field,
353
+ onSelect: (e)=>{
354
+ e.preventDefault();
355
+ toggleField(field);
356
+ },
357
+ endIcon: /*#__PURE__*/ jsxRuntime.jsx(Chevron, {
358
+ $open: openField === field,
359
+ "aria-hidden": true
360
+ }),
361
+ children: formatMessage(DATE_FIELD_LABELS[field])
362
+ }),
363
+ openField === field && /*#__PURE__*/ jsxRuntime.jsxs(OptionGroup, {
364
+ children: [
365
+ presetItems(field),
366
+ field === 'createdAt' && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
367
+ children: [
368
+ /*#__PURE__*/ jsxRuntime.jsx(FieldToggle, {
369
+ "aria-expanded": rangeOpen,
370
+ onSelect: (e)=>{
371
+ e.preventDefault();
372
+ setRangeOpen((open)=>!open);
373
+ },
374
+ endIcon: /*#__PURE__*/ jsxRuntime.jsx(Chevron, {
375
+ $open: rangeOpen,
376
+ "aria-hidden": true
377
+ }),
378
+ children: selectDateRangeLabel
379
+ }),
380
+ rangeOpen && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
381
+ paddingLeft: 2,
382
+ children: /*#__PURE__*/ jsxRuntime.jsx(DateRangeCalendar.DateRangeCalendar, {
383
+ onSelect: addRange
384
+ })
385
+ })
386
+ ]
387
+ })
388
+ ]
389
+ })
390
+ ]
391
+ }, field))
392
+ ]
393
+ }) : /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
394
+ children: [
395
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.SubRoot, {
396
+ children: [
397
+ /*#__PURE__*/ jsxRuntime.jsx(FieldSubTrigger, {
398
+ children: typeLabel
399
+ }),
400
+ /*#__PURE__*/ jsxRuntime.jsx(SubPanel, {
401
+ zIndex: 2,
402
+ maxHeight: PANEL_MAX_HEIGHT,
403
+ width: FILTER_PANEL_WIDTH,
404
+ children: typeItems
405
+ })
406
+ ]
407
+ }),
408
+ [
409
+ 'createdAt',
410
+ 'updatedAt'
411
+ ].map((field)=>/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.SubRoot, {
412
+ children: [
413
+ /*#__PURE__*/ jsxRuntime.jsx(FieldSubTrigger, {
414
+ children: formatMessage(DATE_FIELD_LABELS[field])
415
+ }),
416
+ /*#__PURE__*/ jsxRuntime.jsxs(SubPanel, {
417
+ zIndex: 2,
418
+ maxHeight: PANEL_MAX_HEIGHT,
419
+ width: FILTER_PANEL_WIDTH,
420
+ children: [
421
+ presetItems(field),
422
+ field === 'createdAt' && /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.SubRoot, {
423
+ children: [
424
+ /*#__PURE__*/ jsxRuntime.jsx(FieldSubTrigger, {
425
+ children: selectDateRangeLabel
426
+ }),
427
+ /*#__PURE__*/ jsxRuntime.jsx(SubPanel, {
428
+ zIndex: 2,
429
+ maxHeight: "none",
430
+ width: FILTER_PANEL_WIDTH,
431
+ children: /*#__PURE__*/ jsxRuntime.jsx(DateRangeCalendar.DateRangeCalendar, {
432
+ onSelect: addRange
433
+ })
434
+ })
435
+ ]
436
+ })
437
+ ]
438
+ })
439
+ ]
440
+ }, field))
441
+ ]
442
+ })
443
+ })
444
+ ]
445
+ });
446
+ };
447
+
448
+ exports.DATE_FIELD_LABELS = DATE_FIELD_LABELS;
449
+ exports.FILTER_PANEL_WIDTH = FILTER_PANEL_WIDTH;
450
+ exports.FilterMenu = FilterMenu;
451
+ exports.PRESET_LABELS = PRESET_LABELS;
452
+ exports.TYPE_LABELS = TYPE_LABELS;
453
+ //# sourceMappingURL=FilterMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterMenu.js","sources":["../../../../../../admin/src/future/pages/Assets/components/FilterMenu.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { useIsMobile } from '@strapi/admin/strapi-admin';\nimport { Badge, Box, Checkbox, Flex, Menu } from '@strapi/design-system';\nimport { Check, ChevronDown, Filter as FilterIcon } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../../utils/translations';\nimport {\n DATE_PRESETS,\n TYPE_VALUES,\n type DateField,\n type DatePreset,\n type ListFilters,\n type TypeValue,\n} from '../hooks/useListFilters';\n\nimport { DateRangeCalendar } from './DateRangeCalendar';\n\nimport type { MessageDescriptor } from 'react-intl';\n\nexport const TYPE_LABELS: Record<TypeValue, MessageDescriptor> = {\n folder: { id: getTranslationKey('list.filters.type.folder'), defaultMessage: 'Folder' },\n picture: { id: getTranslationKey('list.filters.type.picture'), defaultMessage: 'Picture' },\n audio: { id: getTranslationKey('list.filters.type.audio'), defaultMessage: 'Audio' },\n video: { id: getTranslationKey('list.filters.type.video'), defaultMessage: 'Video' },\n document: { id: getTranslationKey('list.filters.type.document'), defaultMessage: 'Document' },\n};\n\nexport const PRESET_LABELS: Record<DatePreset, MessageDescriptor> = {\n '1day': { id: getTranslationKey('list.filters.preset.1day'), defaultMessage: '1 day ago' },\n '3days': { id: getTranslationKey('list.filters.preset.3days'), defaultMessage: '3 days ago' },\n '1week': { id: getTranslationKey('list.filters.preset.1week'), defaultMessage: '1 week ago' },\n '1month': { id: getTranslationKey('list.filters.preset.1month'), defaultMessage: '1 month ago' },\n '3months': {\n id: getTranslationKey('list.filters.preset.3months'),\n defaultMessage: '3 months ago',\n },\n '6months': {\n id: getTranslationKey('list.filters.preset.6months'),\n defaultMessage: '6 months ago',\n },\n '1year': { id: getTranslationKey('list.filters.preset.1year'), defaultMessage: '1 year ago' },\n};\n\nexport const DATE_FIELD_LABELS: Record<DateField, MessageDescriptor> = {\n createdAt: {\n id: getTranslationKey('list.filters.field.created'),\n defaultMessage: 'Creation date',\n },\n updatedAt: {\n id: getTranslationKey('list.filters.field.updated'),\n defaultMessage: 'Last modified',\n },\n};\n\n// The DS SubTrigger renders its chevron inline right after the label — push it\n// to the far edge so every field row reads label · · · ›, like the mock.\nconst FieldSubTrigger = styled(Menu.SubTrigger)`\n width: 100%;\n justify-content: space-between;\n`;\n\n/** Every panel of the filter tree shares this fixed width (design). */\nexport const FILTER_PANEL_WIDTH = '24.2rem';\n\n// dvh, not vh: on a phone `vh` ignores the browser chrome, so a 70vh panel can\n// extend past the visual viewport and leave its lower rows (the last field, and\n// anything under the date-range calendar) stranded under the URL bar with no way\n// to scroll to them. Same reason the drawer caps on dvh.\nconst PANEL_MAX_HEIGHT = '70dvh';\n\n// Mobile uses one flat panel (accordion), so it never needs room for a side\n// flyout — cap it to the viewport so it can't overflow a narrow screen.\nconst MOBILE_PANEL_WIDTH = `min(${FILTER_PANEL_WIDTH}, calc(100dvw - 2rem))`;\n\n// Mobile accordion: the field row is a plain menu item that expands its options\n// inline below it (Radix sub-menus can only fly out sideways, off a phone).\nconst FieldToggle = styled(Menu.Item)`\n width: 100%;\n`;\n\n// The options revealed under a field row.\n//\n// `width: 100%` is load-bearing: Menu.Content is a column flex with\n// `align-items: flex-start`, so a child shrink-wraps to its content unless it\n// sets a width explicitly. Without it the group collapsed to the widest option\n// label and the rows' own `width: 100%` resolved against that, so a selected row\n// highlighted only part of the panel.\n//\n// The indent then lives on each row's padding rather than on this wrapper —\n// padding here would inset the rows, and the highlight with them.\nconst OptionGroup = styled(Box)`\n width: 100%;\n\n > * {\n width: 100%;\n }\n\n /* menuitem, menuitemradio and menuitemcheckbox — every option row, plus the\n \"Select date range\" toggle, which sits at the same level. */\n > [role^='menuitem'] {\n padding-left: ${({ theme }) => theme.spaces[6]};\n }\n`;\n\n// Rotates the chevron when its section is open.\nconst Chevron = styled(ChevronDown)<{ $open: boolean }>`\n transition: transform 0.2s ease;\n transform: rotate(${({ $open }) => ($open ? '180deg' : '0deg')});\n`;\n\n// Sub panels: fixed width, no 15rem clamp (the DS default folds the calendar),\n// and a negative top margin cancelling the parent panel's padding + border so\n// the sub panel's top edge lines up with the parent panel, not the item.\nconst SubPanel = styled(Menu.SubContent)`\n margin-top: calc(-1 * (${({ theme }) => theme.spaces[1]} + 1px));\n`;\n\nconst CountBadge = styled(Badge)`\n height: 1.6rem;\n min-width: auto;\n padding: 0 0.4rem;\n`;\n\ninterface FilterMenuProps {\n listFilters: ListFilters;\n}\n\n/**\n * Toolbar \"Filter\" dropdown. Picking anything ADDS a badge (editing happens on\n * the badge itself, see FilterBadges):\n *\n * - Type → keep-open checkbox list; the badge is created/updated live with the\n * checked set (`is` by default, condition editable on the badge).\n * - Creation date / Last modified → preset list (single pick, `within the\n * last` by default) + \"Select date range\" (creation date only) opening the\n * range calendar; a completed range adds an `is` range badge.\n *\n * Closing behaviour follows how many values a field can hold: a date is one\n * value, so picking a preset (or committing a range) closes the menu; Type is a\n * set, so it stays open until dismissed.\n */\nexport const FilterMenu = ({ listFilters }: FilterMenuProps) => {\n const { formatMessage } = useIntl();\n const [isOpen, setIsOpen] = useState(false);\n const { filters, addFilter, updateFilter, removeFilter } = listFilters;\n\n // The Type submenu edits the LAST type badge in place while the menu stays\n // open (checking values accumulates into one badge, per design).\n let lastTypeIndex = -1;\n for (let i = filters.length - 1; i >= 0; i -= 1) {\n if (filters[i].kind === 'type') {\n lastTypeIndex = i;\n break;\n }\n }\n const lastTypeFilter = lastTypeIndex >= 0 ? filters[lastTypeIndex] : null;\n const checkedValues =\n lastTypeFilter && lastTypeFilter.kind === 'type' ? lastTypeFilter.values : [];\n\n const toggleTypeValue = (value: TypeValue) => {\n const nextValues = checkedValues.includes(value)\n ? checkedValues.filter((v) => v !== value)\n : [...checkedValues, value];\n\n if (lastTypeFilter && lastTypeFilter.kind === 'type') {\n if (nextValues.length === 0) {\n // Unchecking the final value removes the badge outright — a type\n // filter with no values is not a state (it would serialize to a\n // malformed `type:is:` the parser drops anyway).\n removeFilter(lastTypeIndex);\n } else {\n updateFilter(lastTypeIndex, { ...lastTypeFilter, values: nextValues });\n }\n } else if (nextValues.length > 0) {\n addFilter({ kind: 'type', condition: 'is', values: nextValues });\n }\n };\n\n // Creation date / Last modified are single-select (per design): selecting a\n // preset replaces the field's existing preset badge in place (keeping its\n // condition) rather than adding another pill; a badge is created only when the\n // field has none yet.\n const addPreset = (field: DateField, preset: DatePreset) => {\n for (let i = filters.length - 1; i >= 0; i -= 1) {\n const f = filters[i];\n if (f.kind === 'date' && f.mode === 'preset' && f.field === field) {\n updateFilter(i, { ...f, preset });\n return;\n }\n }\n addFilter({ kind: 'date', field, mode: 'preset', condition: 'withinLast', preset });\n };\n\n const addRange = (from: string, to: string) => {\n addFilter({ kind: 'date', field: 'createdAt', mode: 'range', condition: 'is', from, to });\n // The calendar is not a Menu.Item — close the menu explicitly on commit.\n setIsOpen(false);\n };\n\n const isMobile = useIsMobile();\n // Mobile accordion state: which field is expanded, and whether its date-range\n // calendar is open. Both reset when the whole menu closes.\n const [openField, setOpenField] = useState<'type' | 'createdAt' | 'updatedAt' | null>(null);\n const [rangeOpen, setRangeOpen] = useState(false);\n\n const handleOpenChange = (next: boolean) => {\n setIsOpen(next);\n if (!next) {\n setOpenField(null);\n setRangeOpen(false);\n }\n };\n\n const toggleField = (field: 'type' | 'createdAt' | 'updatedAt') => {\n setOpenField((current) => (current === field ? null : field));\n setRangeOpen(false);\n };\n\n // Option lists, shared by the desktop flyouts and the mobile accordion.\n // Multi-select semantics: menuitemcheckbox + aria-checked carry the state for\n // assistive tech; the Checkbox is purely decorative (aria-hidden, unfocusable)\n // — the Menu.Item is the control.\n const typeItems = TYPE_VALUES.map((value) => (\n <Menu.Item\n key={value}\n role=\"menuitemcheckbox\"\n aria-checked={checkedValues.includes(value)}\n onSelect={(e: Event) => {\n e.preventDefault();\n toggleTypeValue(value);\n }}\n startIcon={<Checkbox checked={checkedValues.includes(value)} tabIndex={-1} aria-hidden />}\n >\n {formatMessage(TYPE_LABELS[value])}\n </Menu.Item>\n ));\n\n // The field's currently-selected preset (single-select), so the menu can mark\n // it with a check.\n const selectedPresetForField = (field: DateField): DatePreset | null => {\n for (let i = filters.length - 1; i >= 0; i -= 1) {\n const f = filters[i];\n if (f.kind === 'date' && f.mode === 'preset' && f.field === field) {\n return f.preset;\n }\n }\n return null;\n };\n\n const presetItems = (field: DateField) => {\n const selected = selectedPresetForField(field);\n\n return DATE_PRESETS.map((preset) => (\n <Menu.Item\n key={preset}\n role=\"menuitemradio\"\n aria-checked={selected === preset}\n onSelect={() => {\n // No preventDefault, unlike Type: a date field holds exactly one\n // value, so the pick is complete and the menu closes on it. Type stays\n // open because the user may still be building up a multi-value set.\n addPreset(field, preset);\n }}\n endIcon={\n selected === preset ? (\n <Check aria-hidden width=\"1.6rem\" height=\"1.6rem\" fill=\"primary600\" />\n ) : null\n }\n >\n {formatMessage(PRESET_LABELS[preset])}\n </Menu.Item>\n ));\n };\n\n const typeLabel = formatMessage({\n id: getTranslationKey('list.filters.field.type'),\n defaultMessage: 'Type',\n });\n const selectDateRangeLabel = formatMessage({\n id: getTranslationKey('list.filters.select-date-range'),\n defaultMessage: 'Select date range',\n });\n\n return (\n <Menu.Root open={isOpen} onOpenChange={handleOpenChange}>\n {/* endIcon={null} drops the DS default chevron — the mock has none. */}\n <Menu.Trigger variant=\"tertiary\" startIcon={<FilterIcon aria-hidden />} endIcon={null}>\n <Flex gap={2} alignItems=\"center\" tag=\"span\">\n {formatMessage({\n id: getTranslationKey('list.filters.trigger'),\n defaultMessage: 'Filter',\n })}\n {filters.length > 0 && <CountBadge>{filters.length}</CountBadge>}\n </Flex>\n </Menu.Trigger>\n <Menu.Content\n popoverPlacement=\"bottom-start\"\n zIndex={2}\n maxHeight={PANEL_MAX_HEIGHT}\n width={isMobile ? MOBILE_PANEL_WIDTH : FILTER_PANEL_WIDTH}\n >\n {isMobile ? (\n // Mobile: one flat panel. Each field expands its options inline below\n // itself — Radix sub-menus can only fly out sideways, off a phone.\n <>\n <FieldToggle\n aria-expanded={openField === 'type'}\n onSelect={(e: Event) => {\n e.preventDefault();\n toggleField('type');\n }}\n endIcon={<Chevron $open={openField === 'type'} aria-hidden />}\n >\n {typeLabel}\n </FieldToggle>\n {openField === 'type' && <OptionGroup>{typeItems}</OptionGroup>}\n\n {(['createdAt', 'updatedAt'] as const).map((field) => (\n <Box key={field} width=\"100%\">\n <FieldToggle\n aria-expanded={openField === field}\n onSelect={(e: Event) => {\n e.preventDefault();\n toggleField(field);\n }}\n endIcon={<Chevron $open={openField === field} aria-hidden />}\n >\n {formatMessage(DATE_FIELD_LABELS[field])}\n </FieldToggle>\n {openField === field && (\n <OptionGroup>\n {presetItems(field)}\n {/* Only Creation date offers a range from the UI (design). */}\n {field === 'createdAt' && (\n <>\n <FieldToggle\n aria-expanded={rangeOpen}\n onSelect={(e: Event) => {\n e.preventDefault();\n setRangeOpen((open) => !open);\n }}\n endIcon={<Chevron $open={rangeOpen} aria-hidden />}\n >\n {selectDateRangeLabel}\n </FieldToggle>\n {rangeOpen && (\n <Box paddingLeft={2}>\n <DateRangeCalendar onSelect={addRange} />\n </Box>\n )}\n </>\n )}\n </OptionGroup>\n )}\n </Box>\n ))}\n </>\n ) : (\n <>\n <Menu.SubRoot>\n <FieldSubTrigger>{typeLabel}</FieldSubTrigger>\n <SubPanel zIndex={2} maxHeight={PANEL_MAX_HEIGHT} width={FILTER_PANEL_WIDTH}>\n {typeItems}\n </SubPanel>\n </Menu.SubRoot>\n\n {(['createdAt', 'updatedAt'] as const).map((field) => (\n <Menu.SubRoot key={field}>\n <FieldSubTrigger>{formatMessage(DATE_FIELD_LABELS[field])}</FieldSubTrigger>\n <SubPanel zIndex={2} maxHeight={PANEL_MAX_HEIGHT} width={FILTER_PANEL_WIDTH}>\n {presetItems(field)}\n {/* Design constraint: only Creation date offers a range from the\n UI. The URL codec and the badges support ranges on both date\n fields (`updated:rangeis:…` works when hand-crafted) so this\n stays a one-line change if design extends it later. */}\n {field === 'createdAt' && (\n <Menu.SubRoot>\n <FieldSubTrigger>{selectDateRangeLabel}</FieldSubTrigger>\n <SubPanel zIndex={2} maxHeight=\"none\" width={FILTER_PANEL_WIDTH}>\n <DateRangeCalendar onSelect={addRange} />\n </SubPanel>\n </Menu.SubRoot>\n )}\n </SubPanel>\n </Menu.SubRoot>\n ))}\n </>\n )}\n </Menu.Content>\n </Menu.Root>\n );\n};\n"],"names":["TYPE_LABELS","folder","id","getTranslationKey","defaultMessage","picture","audio","video","document","PRESET_LABELS","DATE_FIELD_LABELS","createdAt","updatedAt","FieldSubTrigger","styled","Menu","SubTrigger","FILTER_PANEL_WIDTH","PANEL_MAX_HEIGHT","MOBILE_PANEL_WIDTH","FieldToggle","Item","OptionGroup","Box","theme","spaces","Chevron","ChevronDown","$open","SubPanel","SubContent","CountBadge","Badge","FilterMenu","listFilters","formatMessage","useIntl","isOpen","setIsOpen","useState","filters","addFilter","updateFilter","removeFilter","lastTypeIndex","i","length","kind","lastTypeFilter","checkedValues","values","toggleTypeValue","value","nextValues","includes","filter","v","condition","addPreset","field","preset","f","mode","addRange","from","to","isMobile","useIsMobile","openField","setOpenField","rangeOpen","setRangeOpen","handleOpenChange","next","toggleField","current","typeItems","TYPE_VALUES","map","_jsx","role","aria-checked","onSelect","e","preventDefault","startIcon","Checkbox","checked","tabIndex","aria-hidden","selectedPresetForField","presetItems","selected","DATE_PRESETS","endIcon","Check","width","height","fill","typeLabel","selectDateRangeLabel","_jsxs","Root","open","onOpenChange","Trigger","variant","FilterIcon","Flex","gap","alignItems","tag","Content","popoverPlacement","zIndex","maxHeight","_Fragment","aria-expanded","paddingLeft","DateRangeCalendar","SubRoot"],"mappings":"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"}