@strapi/upload 5.51.2 → 5.52.1

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 (253) hide show
  1. package/dist/admin/future/App.js +3 -3
  2. package/dist/admin/future/App.js.map +1 -1
  3. package/dist/admin/future/App.mjs +4 -4
  4. package/dist/admin/future/App.mjs.map +1 -1
  5. package/dist/admin/future/components/BetaNotice.js +72 -0
  6. package/dist/admin/future/components/BetaNotice.js.map +1 -0
  7. package/dist/admin/future/components/BetaNotice.mjs +70 -0
  8. package/dist/admin/future/components/BetaNotice.mjs.map +1 -0
  9. package/dist/admin/future/components/Drawer.js +16 -3
  10. package/dist/admin/future/components/Drawer.js.map +1 -1
  11. package/dist/admin/future/components/Drawer.mjs +16 -3
  12. package/dist/admin/future/components/Drawer.mjs.map +1 -1
  13. package/dist/admin/future/components/TruncatedText.js +76 -0
  14. package/dist/admin/future/components/TruncatedText.js.map +1 -0
  15. package/dist/admin/future/components/TruncatedText.mjs +74 -0
  16. package/dist/admin/future/components/TruncatedText.mjs.map +1 -0
  17. package/dist/admin/future/hooks/useAIMetadataEnabled.js +39 -0
  18. package/dist/admin/future/hooks/useAIMetadataEnabled.js.map +1 -0
  19. package/dist/admin/future/hooks/useAIMetadataEnabled.mjs +37 -0
  20. package/dist/admin/future/hooks/useAIMetadataEnabled.mjs.map +1 -0
  21. package/dist/admin/future/hooks/useTracking.js +57 -0
  22. package/dist/admin/future/hooks/useTracking.js.map +1 -0
  23. package/dist/admin/future/hooks/useTracking.mjs +53 -0
  24. package/dist/admin/future/hooks/useTracking.mjs.map +1 -0
  25. package/dist/admin/future/pages/Assets/AssetsPage.js +328 -139
  26. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  27. package/dist/admin/future/pages/Assets/AssetsPage.mjs +332 -143
  28. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  29. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js +46 -0
  30. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js.map +1 -0
  31. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs +44 -0
  32. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs.map +1 -0
  33. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +328 -0
  34. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -0
  35. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +326 -0
  36. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -0
  37. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +35 -14
  38. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
  39. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +35 -14
  40. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
  41. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +74 -53
  42. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  43. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +74 -54
  44. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  45. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +92 -28
  46. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  47. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +94 -30
  48. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  49. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js +26 -4
  50. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js.map +1 -1
  51. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs +27 -5
  52. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs.map +1 -1
  53. package/dist/admin/future/pages/Assets/components/AssetsTable.js +172 -60
  54. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  55. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +175 -63
  56. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  57. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +64 -132
  58. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
  59. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +64 -132
  60. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
  61. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +123 -76
  62. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -1
  63. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +126 -79
  64. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -1
  65. package/dist/admin/future/pages/Assets/components/BusyOverlay.js +36 -0
  66. package/dist/admin/future/pages/Assets/components/BusyOverlay.js.map +1 -0
  67. package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs +34 -0
  68. package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs.map +1 -0
  69. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js +131 -0
  70. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js.map +1 -0
  71. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs +129 -0
  72. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs.map +1 -0
  73. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +27 -17
  74. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
  75. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +28 -18
  76. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
  77. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +28 -31
  78. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -1
  79. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +28 -31
  80. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -1
  81. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +10 -15
  82. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  83. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +10 -15
  84. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  85. package/dist/admin/future/pages/Assets/components/FilterBadges.js +13 -4
  86. package/dist/admin/future/pages/Assets/components/FilterBadges.js.map +1 -1
  87. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs +13 -4
  88. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs.map +1 -1
  89. package/dist/admin/future/pages/Assets/components/FilterMenu.js +259 -63
  90. package/dist/admin/future/pages/Assets/components/FilterMenu.js.map +1 -1
  91. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs +262 -66
  92. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs.map +1 -1
  93. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js +146 -0
  94. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js.map +1 -0
  95. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs +144 -0
  96. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs.map +1 -0
  97. package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.js → FolderFormDialog.js} +62 -16
  98. package/dist/admin/future/pages/Assets/components/FolderFormDialog.js.map +1 -0
  99. package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.mjs → FolderFormDialog.mjs} +64 -18
  100. package/dist/admin/future/pages/Assets/components/FolderFormDialog.mjs.map +1 -0
  101. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +132 -229
  102. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  103. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +135 -232
  104. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  105. package/dist/admin/future/pages/Assets/components/SortMenu.js +14 -0
  106. package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -1
  107. package/dist/admin/future/pages/Assets/components/SortMenu.mjs +14 -0
  108. package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -1
  109. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +5 -0
  110. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  111. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +6 -1
  112. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  113. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js +47 -0
  114. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js.map +1 -0
  115. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs +44 -0
  116. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs.map +1 -0
  117. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +203 -62
  118. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
  119. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +204 -63
  120. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
  121. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js +75 -0
  122. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js.map +1 -0
  123. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs +73 -0
  124. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs.map +1 -0
  125. package/dist/admin/future/pages/Assets/utils/selection.js +17 -0
  126. package/dist/admin/future/pages/Assets/utils/selection.js.map +1 -1
  127. package/dist/admin/future/pages/Assets/utils/selection.mjs +17 -1
  128. package/dist/admin/future/pages/Assets/utils/selection.mjs.map +1 -1
  129. package/dist/admin/future/services/api.js +31 -8
  130. package/dist/admin/future/services/api.js.map +1 -1
  131. package/dist/admin/future/services/api.mjs +31 -8
  132. package/dist/admin/future/services/api.mjs.map +1 -1
  133. package/dist/admin/future/services/assets.js +22 -23
  134. package/dist/admin/future/services/assets.js.map +1 -1
  135. package/dist/admin/future/services/assets.mjs +22 -23
  136. package/dist/admin/future/services/assets.mjs.map +1 -1
  137. package/dist/admin/future/services/folders.js +37 -2
  138. package/dist/admin/future/services/folders.js.map +1 -1
  139. package/dist/admin/future/services/folders.mjs +37 -3
  140. package/dist/admin/future/services/folders.mjs.map +1 -1
  141. package/dist/admin/future/utils/buildDragSetFromSelection.js +7 -5
  142. package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -1
  143. package/dist/admin/future/utils/buildDragSetFromSelection.mjs +7 -5
  144. package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -1
  145. package/dist/admin/future/utils/formatMoveSuccessMessage.js +12 -1
  146. package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -1
  147. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +12 -1
  148. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -1
  149. package/dist/admin/future/utils/getRelationId.js +24 -0
  150. package/dist/admin/future/utils/getRelationId.js.map +1 -0
  151. package/dist/admin/future/utils/getRelationId.mjs +22 -0
  152. package/dist/admin/future/utils/getRelationId.mjs.map +1 -0
  153. package/dist/admin/future/utils/isEventFromWithin.js +14 -0
  154. package/dist/admin/future/utils/isEventFromWithin.js.map +1 -0
  155. package/dist/admin/future/utils/isEventFromWithin.mjs +12 -0
  156. package/dist/admin/future/utils/isEventFromWithin.mjs.map +1 -0
  157. package/dist/admin/future/utils/itemLocations.js +40 -0
  158. package/dist/admin/future/utils/itemLocations.js.map +1 -0
  159. package/dist/admin/future/utils/itemLocations.mjs +36 -0
  160. package/dist/admin/future/utils/itemLocations.mjs.map +1 -0
  161. package/dist/admin/future/utils/itemSource.js +36 -0
  162. package/dist/admin/future/utils/itemSource.js.map +1 -0
  163. package/dist/admin/future/utils/itemSource.mjs +32 -0
  164. package/dist/admin/future/utils/itemSource.mjs.map +1 -0
  165. package/dist/admin/hooks/useAIMetadataJob.js +1 -1
  166. package/dist/admin/hooks/useAIMetadataJob.js.map +1 -1
  167. package/dist/admin/hooks/useAIMetadataJob.mjs +1 -1
  168. package/dist/admin/hooks/useAIMetadataJob.mjs.map +1 -1
  169. package/dist/admin/index.js +11 -17
  170. package/dist/admin/index.js.map +1 -1
  171. package/dist/admin/index.mjs +12 -18
  172. package/dist/admin/index.mjs.map +1 -1
  173. package/dist/admin/pages/SettingsPage/SettingsPage.js +2 -2
  174. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  175. package/dist/admin/pages/SettingsPage/SettingsPage.mjs +2 -2
  176. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  177. package/dist/admin/src/future/App.d.ts +1 -1
  178. package/dist/admin/src/future/components/BetaNotice.d.ts +11 -0
  179. package/dist/admin/src/future/components/Drawer.d.ts +5 -1
  180. package/dist/admin/src/future/components/TruncatedText.d.ts +32 -0
  181. package/dist/admin/src/future/hooks/useAIMetadataEnabled.d.ts +26 -0
  182. package/dist/admin/src/future/hooks/useTracking.d.ts +29 -0
  183. package/dist/admin/src/future/pages/Assets/components/ActionsMenuContent.d.ts +33 -0
  184. package/dist/admin/src/future/pages/Assets/components/AssetActionsMenu.d.ts +26 -0
  185. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +16 -0
  186. package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +8 -1
  187. package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +17 -6
  188. package/dist/admin/src/future/pages/Assets/components/BusyOverlay.d.ts +9 -0
  189. package/dist/admin/src/future/pages/Assets/components/DeleteItemsDialog.d.ts +27 -0
  190. package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +8 -1
  191. package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +18 -3
  192. package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +2 -1
  193. package/dist/admin/src/future/pages/Assets/components/FilterBadges.d.ts +3 -1
  194. package/dist/admin/src/future/pages/Assets/components/FilterMenu.d.ts +4 -0
  195. package/dist/admin/src/future/pages/Assets/components/FolderActionsMenu.d.ts +21 -0
  196. package/dist/admin/src/future/pages/Assets/components/FolderFormDialog.d.ts +16 -0
  197. package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +2 -0
  198. package/dist/admin/src/future/pages/Assets/hooks/useBusyAssets.d.ts +38 -0
  199. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +20 -6
  200. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteScrollSentinel.d.ts +41 -0
  201. package/dist/admin/src/future/pages/Assets/utils/selection.d.ts +10 -0
  202. package/dist/admin/src/future/services/api.d.ts +6 -7
  203. package/dist/admin/src/future/services/folders.d.ts +6 -1
  204. package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +4 -3
  205. package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +7 -1
  206. package/dist/admin/src/future/utils/getRelationId.d.ts +11 -0
  207. package/dist/admin/src/future/utils/isEventFromWithin.d.ts +11 -0
  208. package/dist/admin/src/future/utils/itemLocations.d.ts +31 -0
  209. package/dist/admin/src/future/utils/itemSource.d.ts +22 -0
  210. package/dist/admin/translations/en.json.js +25 -4
  211. package/dist/admin/translations/en.json.js.map +1 -1
  212. package/dist/admin/translations/en.json.mjs +25 -4
  213. package/dist/admin/translations/en.json.mjs.map +1 -1
  214. package/dist/server/controllers/admin-file.js +27 -9
  215. package/dist/server/controllers/admin-file.js.map +1 -1
  216. package/dist/server/controllers/admin-file.mjs +27 -9
  217. package/dist/server/controllers/admin-file.mjs.map +1 -1
  218. package/dist/server/controllers/admin-upload.js +24 -8
  219. package/dist/server/controllers/admin-upload.js.map +1 -1
  220. package/dist/server/controllers/admin-upload.mjs +24 -8
  221. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  222. package/dist/server/routes/admin.js +41 -21
  223. package/dist/server/routes/admin.js.map +1 -1
  224. package/dist/server/routes/admin.mjs +41 -21
  225. package/dist/server/routes/admin.mjs.map +1 -1
  226. package/dist/server/services/ai-metadata.js.map +1 -1
  227. package/dist/server/services/ai-metadata.mjs.map +1 -1
  228. package/dist/server/services/image-manipulation.js.map +1 -1
  229. package/dist/server/services/image-manipulation.mjs.map +1 -1
  230. package/dist/server/src/controllers/admin-file.d.ts +29 -8
  231. package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
  232. package/dist/server/src/controllers/admin-upload.d.ts +20 -4
  233. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  234. package/dist/server/src/controllers/index.d.ts +4 -4
  235. package/dist/server/src/index.d.ts +4 -4
  236. package/dist/server/src/routes/admin.d.ts.map +1 -1
  237. package/dist/server/src/services/ai-metadata.d.ts +2 -2
  238. package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
  239. package/dist/server/src/services/image-manipulation.d.ts +0 -5
  240. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  241. package/dist/shared/contracts/ai-metadata-jobs.d.ts +10 -32
  242. package/dist/shared/contracts/ai-metadata-jobs.d.ts.map +1 -1
  243. package/dist/shared/contracts/files.d.ts +10 -10
  244. package/dist/shared/contracts/files.d.ts.map +1 -1
  245. package/package.json +9 -9
  246. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js.map +0 -1
  247. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs.map +0 -1
  248. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js +0 -33
  249. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js.map +0 -1
  250. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs +0 -31
  251. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs.map +0 -1
  252. package/dist/admin/src/future/pages/Assets/components/CreateFolderDialog.d.ts +0 -8
  253. package/dist/admin/src/future/pages/Assets/components/FolderTree/filterFolderTree.d.ts +0 -16
@@ -1,9 +1,11 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { useState } from 'react';
3
- import { Menu, Flex, Checkbox, Badge } from '@strapi/design-system';
4
- import { Filter } from '@strapi/icons';
3
+ import { useIsMobile } from '@strapi/admin/strapi-admin';
4
+ import { Menu, Checkbox, Flex, Box, Badge } from '@strapi/design-system';
5
+ import { Filter, ChevronDown, Check } from '@strapi/icons';
5
6
  import { useIntl } from 'react-intl';
6
7
  import { styled } from 'styled-components';
8
+ import { useTracking, MEDIA_LIBRARY_LOCATION } from '../../../hooks/useTracking.mjs';
7
9
  import { getTranslationKey } from '../../../utils/translations.mjs';
8
10
  import { TYPE_VALUES, DATE_PRESETS } from '../hooks/useListFilters.mjs';
9
11
  import { DateRangeCalendar } from './DateRangeCalendar.mjs';
@@ -77,6 +79,47 @@ const FieldSubTrigger = styled(Menu.SubTrigger)`
77
79
  justify-content: space-between;
78
80
  `;
79
81
  /** Every panel of the filter tree shares this fixed width (design). */ const FILTER_PANEL_WIDTH = '24.2rem';
82
+ // dvh, not vh: on a phone `vh` ignores the browser chrome, so a 70vh panel can
83
+ // extend past the visual viewport and leave its lower rows (the last field, and
84
+ // anything under the date-range calendar) stranded under the URL bar with no way
85
+ // to scroll to them. Same reason the drawer caps on dvh.
86
+ const PANEL_MAX_HEIGHT = '70dvh';
87
+ // Mobile uses one flat panel (accordion), so it never needs room for a side
88
+ // flyout — cap it to the viewport so it can't overflow a narrow screen.
89
+ const MOBILE_PANEL_WIDTH = `min(${FILTER_PANEL_WIDTH}, calc(100dvw - 2rem))`;
90
+ // Mobile accordion: the field row is a plain menu item that expands its options
91
+ // inline below it (Radix sub-menus can only fly out sideways, off a phone).
92
+ const FieldToggle = styled(Menu.Item)`
93
+ width: 100%;
94
+ `;
95
+ // The options revealed under a field row.
96
+ //
97
+ // `width: 100%` is load-bearing: Menu.Content is a column flex with
98
+ // `align-items: flex-start`, so a child shrink-wraps to its content unless it
99
+ // sets a width explicitly. Without it the group collapsed to the widest option
100
+ // label and the rows' own `width: 100%` resolved against that, so a selected row
101
+ // highlighted only part of the panel.
102
+ //
103
+ // The indent then lives on each row's padding rather than on this wrapper —
104
+ // padding here would inset the rows, and the highlight with them.
105
+ const OptionGroup = styled(Box)`
106
+ width: 100%;
107
+
108
+ > * {
109
+ width: 100%;
110
+ }
111
+
112
+ /* menuitem, menuitemradio and menuitemcheckbox — every option row, plus the
113
+ "Select date range" toggle, which sits at the same level. */
114
+ > [role^='menuitem'] {
115
+ padding-left: ${({ theme })=>theme.spaces[6]};
116
+ }
117
+ `;
118
+ // Rotates the chevron when its section is open.
119
+ const Chevron = styled(ChevronDown)`
120
+ transition: transform 0.2s ease;
121
+ transform: rotate(${({ $open })=>$open ? '180deg' : '0deg'});
122
+ `;
80
123
  // Sub panels: fixed width, no 15rem clamp (the DS default folds the calendar),
81
124
  // and a negative top margin cancelling the parent panel's padding + border so
82
125
  // the sub panel's top edge lines up with the parent panel, not the item.
@@ -97,10 +140,21 @@ const CountBadge = styled(Badge)`
97
140
  * - Creation date / Last modified → preset list (single pick, `within the
98
141
  * last` by default) + "Select date range" (creation date only) opening the
99
142
  * range calendar; a completed range adds an `is` range badge.
143
+ *
144
+ * Closing behaviour follows how many values a field can hold: a date is one
145
+ * value, so picking a preset (or committing a range) closes the menu; Type is a
146
+ * set, so it stays open until dismissed.
100
147
  */ const FilterMenu = ({ listFilters })=>{
101
148
  const { formatMessage } = useIntl();
149
+ const { trackUsage } = useTracking();
102
150
  const [isOpen, setIsOpen] = useState(false);
103
151
  const { filters, addFilter, updateFilter, removeFilter } = listFilters;
152
+ // Fired whenever a filter facet is turned on (not on removal). `filter` names
153
+ // the facet, mirroring the legacy field-key payload.
154
+ const trackFilter = (filter)=>trackUsage('didFilterMediaLibraryElements', {
155
+ location: MEDIA_LIBRARY_LOCATION,
156
+ filter
157
+ });
104
158
  // The Type submenu edits the LAST type badge in place while the menu stays
105
159
  // open (checking values accumulates into one badge, per design).
106
160
  let lastTypeIndex = -1;
@@ -113,10 +167,14 @@ const CountBadge = styled(Badge)`
113
167
  const lastTypeFilter = lastTypeIndex >= 0 ? filters[lastTypeIndex] : null;
114
168
  const checkedValues = lastTypeFilter && lastTypeFilter.kind === 'type' ? lastTypeFilter.values : [];
115
169
  const toggleTypeValue = (value)=>{
116
- const nextValues = checkedValues.includes(value) ? checkedValues.filter((v)=>v !== value) : [
170
+ const isAdding = !checkedValues.includes(value);
171
+ const nextValues = isAdding ? [
117
172
  ...checkedValues,
118
173
  value
119
- ];
174
+ ] : checkedValues.filter((v)=>v !== value);
175
+ if (isAdding) {
176
+ trackFilter('type');
177
+ }
120
178
  if (lastTypeFilter && lastTypeFilter.kind === 'type') {
121
179
  if (nextValues.length === 0) {
122
180
  // Unchecking the final value removes the badge outright — a type
@@ -137,7 +195,24 @@ const CountBadge = styled(Badge)`
137
195
  });
138
196
  }
139
197
  };
198
+ // Creation date / Last modified are single-select (per design): selecting a
199
+ // preset replaces the field's existing preset badge in place (keeping its
200
+ // condition) rather than adding another pill; a badge is created only when the
201
+ // field has none yet.
140
202
  const addPreset = (field, preset)=>{
203
+ // Fired before the replace path returns: swapping a field's preset is still
204
+ // the user filtering, same as adding the badge in the first place.
205
+ trackFilter(field);
206
+ for(let i = filters.length - 1; i >= 0; i -= 1){
207
+ const f = filters[i];
208
+ if (f.kind === 'date' && f.mode === 'preset' && f.field === field) {
209
+ updateFilter(i, {
210
+ ...f,
211
+ preset
212
+ });
213
+ return;
214
+ }
215
+ }
141
216
  addFilter({
142
217
  kind: 'date',
143
218
  field,
@@ -147,6 +222,7 @@ const CountBadge = styled(Badge)`
147
222
  });
148
223
  };
149
224
  const addRange = (from, to)=>{
225
+ trackFilter('createdAt');
150
226
  addFilter({
151
227
  kind: 'date',
152
228
  field: 'createdAt',
@@ -158,9 +234,82 @@ const CountBadge = styled(Badge)`
158
234
  // The calendar is not a Menu.Item — close the menu explicitly on commit.
159
235
  setIsOpen(false);
160
236
  };
237
+ const isMobile = useIsMobile();
238
+ // Mobile accordion state: which field is expanded, and whether its date-range
239
+ // calendar is open. Both reset when the whole menu closes.
240
+ const [openField, setOpenField] = useState(null);
241
+ const [rangeOpen, setRangeOpen] = useState(false);
242
+ const handleOpenChange = (next)=>{
243
+ setIsOpen(next);
244
+ if (!next) {
245
+ setOpenField(null);
246
+ setRangeOpen(false);
247
+ }
248
+ };
249
+ const toggleField = (field)=>{
250
+ setOpenField((current)=>current === field ? null : field);
251
+ setRangeOpen(false);
252
+ };
253
+ // Option lists, shared by the desktop flyouts and the mobile accordion.
254
+ // Multi-select semantics: menuitemcheckbox + aria-checked carry the state for
255
+ // assistive tech; the Checkbox is purely decorative (aria-hidden, unfocusable)
256
+ // — the Menu.Item is the control.
257
+ const typeItems = TYPE_VALUES.map((value)=>/*#__PURE__*/ jsx(Menu.Item, {
258
+ role: "menuitemcheckbox",
259
+ "aria-checked": checkedValues.includes(value),
260
+ onSelect: (e)=>{
261
+ e.preventDefault();
262
+ toggleTypeValue(value);
263
+ },
264
+ startIcon: /*#__PURE__*/ jsx(Checkbox, {
265
+ checked: checkedValues.includes(value),
266
+ tabIndex: -1,
267
+ "aria-hidden": true
268
+ }),
269
+ children: formatMessage(TYPE_LABELS[value])
270
+ }, value));
271
+ // The field's currently-selected preset (single-select), so the menu can mark
272
+ // it with a check.
273
+ const selectedPresetForField = (field)=>{
274
+ for(let i = filters.length - 1; i >= 0; i -= 1){
275
+ const f = filters[i];
276
+ if (f.kind === 'date' && f.mode === 'preset' && f.field === field) {
277
+ return f.preset;
278
+ }
279
+ }
280
+ return null;
281
+ };
282
+ const presetItems = (field)=>{
283
+ const selected = selectedPresetForField(field);
284
+ return DATE_PRESETS.map((preset)=>/*#__PURE__*/ jsx(Menu.Item, {
285
+ role: "menuitemradio",
286
+ "aria-checked": selected === preset,
287
+ onSelect: ()=>{
288
+ // No preventDefault, unlike Type: a date field holds exactly one
289
+ // value, so the pick is complete and the menu closes on it. Type stays
290
+ // open because the user may still be building up a multi-value set.
291
+ addPreset(field, preset);
292
+ },
293
+ endIcon: selected === preset ? /*#__PURE__*/ jsx(Check, {
294
+ "aria-hidden": true,
295
+ width: "1.6rem",
296
+ height: "1.6rem",
297
+ fill: "primary600"
298
+ }) : null,
299
+ children: formatMessage(PRESET_LABELS[preset])
300
+ }, preset));
301
+ };
302
+ const typeLabel = formatMessage({
303
+ id: getTranslationKey('list.filters.field.type'),
304
+ defaultMessage: 'Type'
305
+ });
306
+ const selectDateRangeLabel = formatMessage({
307
+ id: getTranslationKey('list.filters.select-date-range'),
308
+ defaultMessage: 'Select date range'
309
+ });
161
310
  return /*#__PURE__*/ jsxs(Menu.Root, {
162
311
  open: isOpen,
163
- onOpenChange: setIsOpen,
312
+ onOpenChange: handleOpenChange,
164
313
  children: [
165
314
  /*#__PURE__*/ jsx(Menu.Trigger, {
166
315
  variant: "tertiary",
@@ -183,81 +332,128 @@ const CountBadge = styled(Badge)`
183
332
  ]
184
333
  })
185
334
  }),
186
- /*#__PURE__*/ jsxs(Menu.Content, {
335
+ /*#__PURE__*/ jsx(Menu.Content, {
187
336
  popoverPlacement: "bottom-start",
188
337
  zIndex: 2,
189
- maxHeight: "70vh",
190
- width: FILTER_PANEL_WIDTH,
191
- children: [
192
- /*#__PURE__*/ jsxs(Menu.SubRoot, {
193
- children: [
194
- /*#__PURE__*/ jsx(FieldSubTrigger, {
195
- children: formatMessage({
196
- id: getTranslationKey('list.filters.field.type'),
197
- defaultMessage: 'Type'
198
- })
338
+ maxHeight: PANEL_MAX_HEIGHT,
339
+ width: isMobile ? MOBILE_PANEL_WIDTH : FILTER_PANEL_WIDTH,
340
+ children: isMobile ? // Mobile: one flat panel. Each field expands its options inline below
341
+ // itself — Radix sub-menus can only fly out sideways, off a phone.
342
+ /*#__PURE__*/ jsxs(Fragment, {
343
+ children: [
344
+ /*#__PURE__*/ jsx(FieldToggle, {
345
+ "aria-expanded": openField === 'type',
346
+ onSelect: (e)=>{
347
+ e.preventDefault();
348
+ toggleField('type');
349
+ },
350
+ endIcon: /*#__PURE__*/ jsx(Chevron, {
351
+ $open: openField === 'type',
352
+ "aria-hidden": true
199
353
  }),
200
- /*#__PURE__*/ jsx(SubPanel, {
201
- zIndex: 2,
202
- maxHeight: "70vh",
203
- width: FILTER_PANEL_WIDTH,
204
- children: TYPE_VALUES.map((value)=>/*#__PURE__*/ jsx(Menu.Item, {
205
- role: "menuitemcheckbox",
206
- "aria-checked": checkedValues.includes(value),
354
+ children: typeLabel
355
+ }),
356
+ openField === 'type' && /*#__PURE__*/ jsx(OptionGroup, {
357
+ children: typeItems
358
+ }),
359
+ [
360
+ 'createdAt',
361
+ 'updatedAt'
362
+ ].map((field)=>/*#__PURE__*/ jsxs(Box, {
363
+ width: "100%",
364
+ children: [
365
+ /*#__PURE__*/ jsx(FieldToggle, {
366
+ "aria-expanded": openField === field,
207
367
  onSelect: (e)=>{
208
368
  e.preventDefault();
209
- toggleTypeValue(value);
369
+ toggleField(field);
210
370
  },
211
- startIcon: /*#__PURE__*/ jsx(Checkbox, {
212
- checked: checkedValues.includes(value),
213
- tabIndex: -1,
371
+ endIcon: /*#__PURE__*/ jsx(Chevron, {
372
+ $open: openField === field,
214
373
  "aria-hidden": true
215
374
  }),
216
- children: formatMessage(TYPE_LABELS[value])
217
- }, value))
218
- })
219
- ]
220
- }),
221
- [
222
- 'createdAt',
223
- 'updatedAt'
224
- ].map((field)=>/*#__PURE__*/ jsxs(Menu.SubRoot, {
375
+ children: formatMessage(DATE_FIELD_LABELS[field])
376
+ }),
377
+ openField === field && /*#__PURE__*/ jsxs(OptionGroup, {
378
+ children: [
379
+ presetItems(field),
380
+ field === 'createdAt' && /*#__PURE__*/ jsxs(Fragment, {
381
+ children: [
382
+ /*#__PURE__*/ jsx(FieldToggle, {
383
+ "aria-expanded": rangeOpen,
384
+ onSelect: (e)=>{
385
+ e.preventDefault();
386
+ setRangeOpen((open)=>!open);
387
+ },
388
+ endIcon: /*#__PURE__*/ jsx(Chevron, {
389
+ $open: rangeOpen,
390
+ "aria-hidden": true
391
+ }),
392
+ children: selectDateRangeLabel
393
+ }),
394
+ rangeOpen && /*#__PURE__*/ jsx(Box, {
395
+ paddingLeft: 2,
396
+ children: /*#__PURE__*/ jsx(DateRangeCalendar, {
397
+ onSelect: addRange
398
+ })
399
+ })
400
+ ]
401
+ })
402
+ ]
403
+ })
404
+ ]
405
+ }, field))
406
+ ]
407
+ }) : /*#__PURE__*/ jsxs(Fragment, {
408
+ children: [
409
+ /*#__PURE__*/ jsxs(Menu.SubRoot, {
225
410
  children: [
226
411
  /*#__PURE__*/ jsx(FieldSubTrigger, {
227
- children: formatMessage(DATE_FIELD_LABELS[field])
412
+ children: typeLabel
228
413
  }),
229
- /*#__PURE__*/ jsxs(SubPanel, {
414
+ /*#__PURE__*/ jsx(SubPanel, {
230
415
  zIndex: 2,
231
- maxHeight: "70vh",
416
+ maxHeight: PANEL_MAX_HEIGHT,
232
417
  width: FILTER_PANEL_WIDTH,
233
- children: [
234
- DATE_PRESETS.map((preset)=>/*#__PURE__*/ jsx(Menu.Item, {
235
- onSelect: ()=>addPreset(field, preset),
236
- children: formatMessage(PRESET_LABELS[preset])
237
- }, preset)),
238
- field === 'createdAt' && /*#__PURE__*/ jsxs(Menu.SubRoot, {
239
- children: [
240
- /*#__PURE__*/ jsx(FieldSubTrigger, {
241
- children: formatMessage({
242
- id: getTranslationKey('list.filters.select-date-range'),
243
- defaultMessage: 'Select date range'
244
- })
245
- }),
246
- /*#__PURE__*/ jsx(SubPanel, {
247
- zIndex: 2,
248
- maxHeight: "none",
249
- width: FILTER_PANEL_WIDTH,
250
- children: /*#__PURE__*/ jsx(DateRangeCalendar, {
251
- onSelect: addRange
252
- })
253
- })
254
- ]
255
- })
256
- ]
418
+ children: typeItems
257
419
  })
258
420
  ]
259
- }, field))
260
- ]
421
+ }),
422
+ [
423
+ 'createdAt',
424
+ 'updatedAt'
425
+ ].map((field)=>/*#__PURE__*/ jsxs(Menu.SubRoot, {
426
+ children: [
427
+ /*#__PURE__*/ jsx(FieldSubTrigger, {
428
+ children: formatMessage(DATE_FIELD_LABELS[field])
429
+ }),
430
+ /*#__PURE__*/ jsxs(SubPanel, {
431
+ zIndex: 2,
432
+ maxHeight: PANEL_MAX_HEIGHT,
433
+ width: FILTER_PANEL_WIDTH,
434
+ children: [
435
+ presetItems(field),
436
+ field === 'createdAt' && /*#__PURE__*/ jsxs(Menu.SubRoot, {
437
+ children: [
438
+ /*#__PURE__*/ jsx(FieldSubTrigger, {
439
+ children: selectDateRangeLabel
440
+ }),
441
+ /*#__PURE__*/ jsx(SubPanel, {
442
+ zIndex: 2,
443
+ maxHeight: "none",
444
+ width: FILTER_PANEL_WIDTH,
445
+ children: /*#__PURE__*/ jsx(DateRangeCalendar, {
446
+ onSelect: addRange
447
+ })
448
+ })
449
+ ]
450
+ })
451
+ ]
452
+ })
453
+ ]
454
+ }, field))
455
+ ]
456
+ })
261
457
  })
262
458
  ]
263
459
  });
@@ -1 +1 @@
1
- {"version":3,"file":"FilterMenu.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/FilterMenu.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { Badge, Checkbox, Flex, Menu } from '@strapi/design-system';\nimport { 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// 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 */\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 const addPreset = (field: DateField, preset: DatePreset) => {\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 return (\n <Menu.Root open={isOpen} onOpenChange={setIsOpen}>\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=\"70vh\"\n width={FILTER_PANEL_WIDTH}\n >\n <Menu.SubRoot>\n <FieldSubTrigger>\n {formatMessage({\n id: getTranslationKey('list.filters.field.type'),\n defaultMessage: 'Type',\n })}\n </FieldSubTrigger>\n <SubPanel zIndex={2} maxHeight=\"70vh\" width={FILTER_PANEL_WIDTH}>\n {/* Multi-select semantics: menuitemcheckbox + aria-checked carry the\n state for assistive tech; the Checkbox is purely decorative\n (aria-hidden, unfocusable) — the Menu.Item is the control. */}\n {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={\n <Checkbox checked={checkedValues.includes(value)} tabIndex={-1} aria-hidden />\n }\n >\n {formatMessage(TYPE_LABELS[value])}\n </Menu.Item>\n ))}\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=\"70vh\" width={FILTER_PANEL_WIDTH}>\n {DATE_PRESETS.map((preset) => (\n <Menu.Item key={preset} onSelect={() => addPreset(field, preset)}>\n {formatMessage(PRESET_LABELS[preset])}\n </Menu.Item>\n ))}\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>\n {formatMessage({\n id: getTranslationKey('list.filters.select-date-range'),\n defaultMessage: 'Select date range',\n })}\n </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 </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","SubPanel","SubContent","theme","spaces","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","mode","addRange","from","to","_jsxs","Root","open","onOpenChange","_jsx","Trigger","variant","startIcon","FilterIcon","aria-hidden","endIcon","Flex","gap","alignItems","tag","Content","popoverPlacement","zIndex","maxHeight","width","SubRoot","TYPE_VALUES","map","Item","role","aria-checked","onSelect","e","preventDefault","Checkbox","checked","tabIndex","DATE_PRESETS","DateRangeCalendar"],"mappings":"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"}
1
+ {"version":3,"file":"FilterMenu.mjs","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 { useTracking, MEDIA_LIBRARY_LOCATION } from '../../../hooks/useTracking';\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 { trackUsage } = useTracking();\n const [isOpen, setIsOpen] = useState(false);\n const { filters, addFilter, updateFilter, removeFilter } = listFilters;\n\n // Fired whenever a filter facet is turned on (not on removal). `filter` names\n // the facet, mirroring the legacy field-key payload.\n const trackFilter = (filter: string) =>\n trackUsage('didFilterMediaLibraryElements', { location: MEDIA_LIBRARY_LOCATION, filter });\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 isAdding = !checkedValues.includes(value);\n const nextValues = isAdding\n ? [...checkedValues, value]\n : checkedValues.filter((v) => v !== value);\n\n if (isAdding) {\n trackFilter('type');\n }\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 // Fired before the replace path returns: swapping a field's preset is still\n // the user filtering, same as adding the badge in the first place.\n trackFilter(field);\n\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\n addFilter({ kind: 'date', field, mode: 'preset', condition: 'withinLast', preset });\n };\n\n const addRange = (from: string, to: string) => {\n trackFilter('createdAt');\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","trackUsage","useTracking","isOpen","setIsOpen","useState","filters","addFilter","updateFilter","removeFilter","trackFilter","filter","location","MEDIA_LIBRARY_LOCATION","lastTypeIndex","i","length","kind","lastTypeFilter","checkedValues","values","toggleTypeValue","value","isAdding","includes","nextValues","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":";;;;;;;;;;;;MAuBaA,WAAAA,GAAoD;IAC/DC,MAAAA,EAAQ;AAAEC,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,0BAAA,CAAA;QAA6BC,cAAAA,EAAgB;AAAS,KAAA;IACtFC,OAAAA,EAAS;AAAEH,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,2BAAA,CAAA;QAA8BC,cAAAA,EAAgB;AAAU,KAAA;IACzFE,KAAAA,EAAO;AAAEJ,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,yBAAA,CAAA;QAA4BC,cAAAA,EAAgB;AAAQ,KAAA;IACnFG,KAAAA,EAAO;AAAEL,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,yBAAA,CAAA;QAA4BC,cAAAA,EAAgB;AAAQ,KAAA;IACnFI,QAAAA,EAAU;AAAEN,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,4BAAA,CAAA;QAA+BC,cAAAA,EAAgB;AAAW;AAC9F;MAEaK,aAAAA,GAAuD;IAClE,MAAA,EAAQ;AAAEP,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,0BAAA,CAAA;QAA6BC,cAAAA,EAAgB;AAAY,KAAA;IACzF,OAAA,EAAS;AAAEF,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,2BAAA,CAAA;QAA8BC,cAAAA,EAAgB;AAAa,KAAA;IAC5F,OAAA,EAAS;AAAEF,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,2BAAA,CAAA;QAA8BC,cAAAA,EAAgB;AAAa,KAAA;IAC5F,QAAA,EAAU;AAAEF,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,4BAAA,CAAA;QAA+BC,cAAAA,EAAgB;AAAc,KAAA;IAC/F,SAAA,EAAW;AACTF,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,6BAAA,CAAA;QACtBC,cAAAA,EAAgB;AAClB,KAAA;IACA,SAAA,EAAW;AACTF,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,6BAAA,CAAA;QACtBC,cAAAA,EAAgB;AAClB,KAAA;IACA,OAAA,EAAS;AAAEF,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,2BAAA,CAAA;QAA8BC,cAAAA,EAAgB;AAAa;AAC9F;MAEaM,iBAAAA,GAA0D;IACrEC,SAAAA,EAAW;AACTT,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,4BAAA,CAAA;QACtBC,cAAAA,EAAgB;AAClB,KAAA;IACAQ,SAAAA,EAAW;AACTV,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,4BAAA,CAAA;QACtBC,cAAAA,EAAgB;AAClB;AACF;AAEA;AACA;AACA,MAAMS,eAAAA,GAAkBC,MAAAA,CAAOC,IAAAA,CAAKC,UAAU,CAAC;;;AAG/C,CAAC;AAED,wEACO,MAAMC,kBAAAA,GAAqB;AAElC;AACA;AACA;AACA;AACA,MAAMC,gBAAAA,GAAmB,OAAA;AAEzB;AACA;AACA,MAAMC,qBAAqB,CAAC,IAAI,EAAEF,kBAAAA,CAAmB,sBAAsB,CAAC;AAE5E;AACA;AACA,MAAMG,WAAAA,GAAcN,MAAAA,CAAOC,IAAAA,CAAKM,IAAI,CAAC;;AAErC,CAAC;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,WAAAA,GAAcR,MAAAA,CAAOS,GAAAA,CAAI;;;;;;;;;;kBAUb,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;;AAEnD,CAAC;AAED;AACA,MAAMC,OAAAA,GAAUZ,MAAAA,CAAOa,WAAAA,CAAgC;;AAEnC,oBAAA,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAMA,KAAAA,GAAQ,WAAW,MAAA,CAAQ;AACjE,CAAC;AAED;AACA;AACA;AACA,MAAMC,QAAAA,GAAWf,MAAAA,CAAOC,IAAAA,CAAKe,UAAU,CAAC;yBACf,EAAE,CAAC,EAAEN,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;AAC1D,CAAC;AAED,MAAMM,UAAAA,GAAajB,MAAAA,CAAOkB,KAAAA,CAAM;;;;AAIhC,CAAC;AAMD;;;;;;;;;;;;;AAaC,IACM,MAAMC,UAAAA,GAAa,CAAC,EAAEC,WAAW,EAAmB,GAAA;IACzD,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,UAAU,EAAE,GAAGC,WAAAA,EAAAA;AACvB,IAAA,MAAM,CAACC,MAAAA,EAAQC,SAAAA,CAAU,GAAGC,QAAAA,CAAS,KAAA,CAAA;IACrC,MAAM,EAAEC,OAAO,EAAEC,SAAS,EAAEC,YAAY,EAAEC,YAAY,EAAE,GAAGX,WAAAA;;;AAI3D,IAAA,MAAMY,WAAAA,GAAc,CAACC,MAAAA,GACnBV,UAAAA,CAAW,+BAAA,EAAiC;YAAEW,QAAAA,EAAUC,sBAAAA;AAAwBF,YAAAA;AAAO,SAAA,CAAA;;;AAIzF,IAAA,IAAIG,gBAAgB,EAAC;IACrB,IAAK,IAAIC,IAAIT,OAAAA,CAAQU,MAAM,GAAG,CAAA,EAAGD,CAAAA,IAAK,CAAA,EAAGA,CAAAA,IAAK,CAAA,CAAG;AAC/C,QAAA,IAAIT,OAAO,CAACS,CAAAA,CAAE,CAACE,IAAI,KAAK,MAAA,EAAQ;YAC9BH,aAAAA,GAAgBC,CAAAA;AAChB,YAAA;AACF,QAAA;AACF,IAAA;AACA,IAAA,MAAMG,iBAAiBJ,aAAAA,IAAiB,CAAA,GAAIR,OAAO,CAACQ,cAAc,GAAG,IAAA;IACrE,MAAMK,aAAAA,GACJD,kBAAkBA,cAAAA,CAAeD,IAAI,KAAK,MAAA,GAASC,cAAAA,CAAeE,MAAM,GAAG,EAAE;AAE/E,IAAA,MAAMC,kBAAkB,CAACC,KAAAA,GAAAA;AACvB,QAAA,MAAMC,QAAAA,GAAW,CAACJ,aAAAA,CAAcK,QAAQ,CAACF,KAAAA,CAAAA;AACzC,QAAA,MAAMG,aAAaF,QAAAA,GACf;AAAIJ,YAAAA,GAAAA,aAAAA;AAAeG,YAAAA;AAAM,SAAA,GACzBH,aAAAA,CAAcR,MAAM,CAAC,CAACe,IAAMA,CAAAA,KAAMJ,KAAAA,CAAAA;AAEtC,QAAA,IAAIC,QAAAA,EAAU;YACZb,WAAAA,CAAY,MAAA,CAAA;AACd,QAAA;AAEA,QAAA,IAAIQ,cAAAA,IAAkBA,cAAAA,CAAeD,IAAI,KAAK,MAAA,EAAQ;YACpD,IAAIQ,UAAAA,CAAWT,MAAM,KAAK,CAAA,EAAG;;;;gBAI3BP,YAAAA,CAAaK,aAAAA,CAAAA;YACf,CAAA,MAAO;AACLN,gBAAAA,YAAAA,CAAaM,aAAAA,EAAe;AAAE,oBAAA,GAAGI,cAAc;oBAAEE,MAAAA,EAAQK;AAAW,iBAAA,CAAA;AACtE,YAAA;AACF,QAAA,CAAA,MAAO,IAAIA,UAAAA,CAAWT,MAAM,GAAG,CAAA,EAAG;YAChCT,SAAAA,CAAU;gBAAEU,IAAAA,EAAM,MAAA;gBAAQU,SAAAA,EAAW,IAAA;gBAAMP,MAAAA,EAAQK;AAAW,aAAA,CAAA;AAChE,QAAA;AACF,IAAA,CAAA;;;;;IAMA,MAAMG,SAAAA,GAAY,CAACC,KAAAA,EAAkBC,MAAAA,GAAAA;;;QAGnCpB,WAAAA,CAAYmB,KAAAA,CAAAA;QAEZ,IAAK,IAAId,IAAIT,OAAAA,CAAQU,MAAM,GAAG,CAAA,EAAGD,CAAAA,IAAK,CAAA,EAAGA,CAAAA,IAAK,CAAA,CAAG;YAC/C,MAAMgB,CAAAA,GAAIzB,OAAO,CAACS,CAAAA,CAAE;YACpB,IAAIgB,CAAAA,CAAEd,IAAI,KAAK,MAAA,IAAUc,CAAAA,CAAEC,IAAI,KAAK,QAAA,IAAYD,CAAAA,CAAEF,KAAK,KAAKA,KAAAA,EAAO;AACjErB,gBAAAA,YAAAA,CAAaO,CAAAA,EAAG;AAAE,oBAAA,GAAGgB,CAAC;AAAED,oBAAAA;AAAO,iBAAA,CAAA;AAC/B,gBAAA;AACF,YAAA;AACF,QAAA;QAEAvB,SAAAA,CAAU;YAAEU,IAAAA,EAAM,MAAA;AAAQY,YAAAA,KAAAA;YAAOG,IAAAA,EAAM,QAAA;YAAUL,SAAAA,EAAW,YAAA;AAAcG,YAAAA;AAAO,SAAA,CAAA;AACnF,IAAA,CAAA;IAEA,MAAMG,QAAAA,GAAW,CAACC,IAAAA,EAAcC,EAAAA,GAAAA;QAC9BzB,WAAAA,CAAY,WAAA,CAAA;QACZH,SAAAA,CAAU;YAAEU,IAAAA,EAAM,MAAA;YAAQY,KAAAA,EAAO,WAAA;YAAaG,IAAAA,EAAM,OAAA;YAASL,SAAAA,EAAW,IAAA;AAAMO,YAAAA,IAAAA;AAAMC,YAAAA;AAAG,SAAA,CAAA;;QAEvF/B,SAAAA,CAAU,KAAA,CAAA;AACZ,IAAA,CAAA;AAEA,IAAA,MAAMgC,QAAAA,GAAWC,WAAAA,EAAAA;;;AAGjB,IAAA,MAAM,CAACC,SAAAA,EAAWC,YAAAA,CAAa,GAAGlC,QAAAA,CAAoD,IAAA,CAAA;AACtF,IAAA,MAAM,CAACmC,SAAAA,EAAWC,YAAAA,CAAa,GAAGpC,QAAAA,CAAS,KAAA,CAAA;AAE3C,IAAA,MAAMqC,mBAAmB,CAACC,IAAAA,GAAAA;QACxBvC,SAAAA,CAAUuC,IAAAA,CAAAA;AACV,QAAA,IAAI,CAACA,IAAAA,EAAM;YACTJ,YAAAA,CAAa,IAAA,CAAA;YACbE,YAAAA,CAAa,KAAA,CAAA;AACf,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMG,cAAc,CAACf,KAAAA,GAAAA;AACnBU,QAAAA,YAAAA,CAAa,CAACM,OAAAA,GAAaA,OAAAA,KAAYhB,KAAAA,GAAQ,IAAA,GAAOA,KAAAA,CAAAA;QACtDY,YAAAA,CAAa,KAAA,CAAA;AACf,IAAA,CAAA;;;;;IAMA,MAAMK,SAAAA,GAAYC,YAAYC,GAAG,CAAC,CAAC1B,KAAAA,iBACjC2B,GAAA,CAACtE,KAAKM,IAAI,EAAA;YAERiE,IAAAA,EAAK,kBAAA;YACLC,cAAAA,EAAchC,aAAAA,CAAcK,QAAQ,CAACF,KAAAA,CAAAA;AACrC8B,YAAAA,QAAAA,EAAU,CAACC,CAAAA,GAAAA;AACTA,gBAAAA,CAAAA,CAAEC,cAAc,EAAA;gBAChBjC,eAAAA,CAAgBC,KAAAA,CAAAA;AAClB,YAAA,CAAA;AACAiC,YAAAA,SAAAA,gBAAWN,GAAA,CAACO,QAAAA,EAAAA;gBAASC,OAAAA,EAAStC,aAAAA,CAAcK,QAAQ,CAACF,KAAAA,CAAAA;AAAQoC,gBAAAA,QAAAA,EAAU,EAAC;gBAAGC,aAAW,EAAA;;sBAErF5D,aAAAA,CAAcnC,WAAW,CAAC0D,KAAAA,CAAM;AAT5BA,SAAAA,EAAAA,KAAAA,CAAAA,CAAAA;;;AAeT,IAAA,MAAMsC,yBAAyB,CAAC/B,KAAAA,GAAAA;QAC9B,IAAK,IAAId,IAAIT,OAAAA,CAAQU,MAAM,GAAG,CAAA,EAAGD,CAAAA,IAAK,CAAA,EAAGA,CAAAA,IAAK,CAAA,CAAG;YAC/C,MAAMgB,CAAAA,GAAIzB,OAAO,CAACS,CAAAA,CAAE;YACpB,IAAIgB,CAAAA,CAAEd,IAAI,KAAK,MAAA,IAAUc,CAAAA,CAAEC,IAAI,KAAK,QAAA,IAAYD,CAAAA,CAAEF,KAAK,KAAKA,KAAAA,EAAO;AACjE,gBAAA,OAAOE,EAAED,MAAM;AACjB,YAAA;AACF,QAAA;QACA,OAAO,IAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAM+B,cAAc,CAAChC,KAAAA,GAAAA;AACnB,QAAA,MAAMiC,WAAWF,sBAAAA,CAAuB/B,KAAAA,CAAAA;AAExC,QAAA,OAAOkC,aAAaf,GAAG,CAAC,CAAClB,MAAAA,iBACvBmB,GAAA,CAACtE,KAAKM,IAAI,EAAA;gBAERiE,IAAAA,EAAK,eAAA;AACLC,gBAAAA,cAAAA,EAAcW,QAAAA,KAAahC,MAAAA;gBAC3BsB,QAAAA,EAAU,IAAA;;;;AAIRxB,oBAAAA,SAAAA,CAAUC,KAAAA,EAAOC,MAAAA,CAAAA;AACnB,gBAAA,CAAA;gBACAkC,OAAAA,EACEF,QAAAA,KAAahC,uBACXmB,GAAA,CAACgB,KAAAA,EAAAA;oBAAMN,aAAW,EAAA,IAAA;oBAACO,KAAAA,EAAM,QAAA;oBAASC,MAAAA,EAAO,QAAA;oBAASC,IAAAA,EAAK;AACrD,iBAAA,CAAA,GAAA,IAAA;0BAGLrE,aAAAA,CAAc1B,aAAa,CAACyD,MAAAA,CAAO;AAf/BA,aAAAA,EAAAA,MAAAA,CAAAA,CAAAA;AAkBX,IAAA,CAAA;AAEA,IAAA,MAAMuC,YAAYtE,aAAAA,CAAc;AAC9BjC,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,yBAAA,CAAA;QACtBC,cAAAA,EAAgB;AAClB,KAAA,CAAA;AACA,IAAA,MAAMsG,uBAAuBvE,aAAAA,CAAc;AACzCjC,QAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,gCAAA,CAAA;QACtBC,cAAAA,EAAgB;AAClB,KAAA,CAAA;IAEA,qBACEuG,IAAA,CAAC5F,KAAK6F,IAAI,EAAA;QAACC,IAAAA,EAAMtE,MAAAA;QAAQuE,YAAAA,EAAchC,gBAAAA;;AAErC,0BAAAO,GAAA,CAACtE,KAAKgG,OAAO,EAAA;gBAACC,OAAAA,EAAQ,UAAA;AAAWrB,gBAAAA,SAAAA,gBAAWN,GAAA,CAAC4B,MAAAA,EAAAA;oBAAWlB,aAAW,EAAA;;gBAAKK,OAAAA,EAAS,IAAA;AAC/E,gBAAA,QAAA,gBAAAO,IAAA,CAACO,IAAAA,EAAAA;oBAAKC,GAAAA,EAAK,CAAA;oBAAGC,UAAAA,EAAW,QAAA;oBAASC,GAAAA,EAAI,MAAA;;wBACnClF,aAAAA,CAAc;AACbjC,4BAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,sBAAA,CAAA;4BACtBC,cAAAA,EAAgB;AAClB,yBAAA,CAAA;wBACCsC,OAAAA,CAAQU,MAAM,GAAG,CAAA,kBAAKiC,GAAA,CAACtD,UAAAA,EAAAA;AAAYW,4BAAAA,QAAAA,EAAAA,OAAAA,CAAQU;;;;;AAGhD,0BAAAiC,GAAA,CAACtE,KAAKuG,OAAO,EAAA;gBACXC,gBAAAA,EAAiB,cAAA;gBACjBC,MAAAA,EAAQ,CAAA;gBACRC,SAAAA,EAAWvG,gBAAAA;AACXoF,gBAAAA,KAAAA,EAAO9B,WAAWrD,kBAAAA,GAAqBF,kBAAAA;AAEtCuD,gBAAAA,QAAAA,EAAAA,QAAAA;;AAGC,8BAAAmC,IAAA,CAAAe,QAAA,EAAA;;sCACErC,GAAA,CAACjE,WAAAA,EAAAA;AACCuG,4BAAAA,eAAAA,EAAejD,SAAAA,KAAc,MAAA;AAC7Bc,4BAAAA,QAAAA,EAAU,CAACC,CAAAA,GAAAA;AACTA,gCAAAA,CAAAA,CAAEC,cAAc,EAAA;gCAChBV,WAAAA,CAAY,MAAA,CAAA;AACd,4BAAA,CAAA;AACAoB,4BAAAA,OAAAA,gBAASf,GAAA,CAAC3D,OAAAA,EAAAA;AAAQE,gCAAAA,KAAAA,EAAO8C,SAAAA,KAAc,MAAA;gCAAQqB,aAAW,EAAA;;AAEzDU,4BAAAA,QAAAA,EAAAA;;AAEF/B,wBAAAA,SAAAA,KAAc,wBAAUW,GAAA,CAAC/D,WAAAA,EAAAA;AAAa4D,4BAAAA,QAAAA,EAAAA;;AAErC,wBAAA;AAAC,4BAAA,WAAA;AAAa,4BAAA;AAAY,yBAAA,CAAWE,GAAG,CAAC,CAACnB,KAAAA,iBAC1C0C,IAAA,CAACpF,GAAAA,EAAAA;gCAAgB+E,KAAAA,EAAM,MAAA;;kDACrBjB,GAAA,CAACjE,WAAAA,EAAAA;AACCuG,wCAAAA,eAAAA,EAAejD,SAAAA,KAAcT,KAAAA;AAC7BuB,wCAAAA,QAAAA,EAAU,CAACC,CAAAA,GAAAA;AACTA,4CAAAA,CAAAA,CAAEC,cAAc,EAAA;4CAChBV,WAAAA,CAAYf,KAAAA,CAAAA;AACd,wCAAA,CAAA;AACAmC,wCAAAA,OAAAA,gBAASf,GAAA,CAAC3D,OAAAA,EAAAA;AAAQE,4CAAAA,KAAAA,EAAO8C,SAAAA,KAAcT,KAAAA;4CAAO8B,aAAW,EAAA;;kDAExD5D,aAAAA,CAAczB,iBAAiB,CAACuD,KAAAA,CAAM;;AAExCS,oCAAAA,SAAAA,KAAcT,uBACb0C,IAAA,CAACrF,WAAAA,EAAAA;;4CACE2E,WAAAA,CAAYhC,KAAAA,CAAAA;AAEZA,4CAAAA,KAAAA,KAAU,WAAA,kBACT0C,IAAA,CAAAe,QAAA,EAAA;;kEACErC,GAAA,CAACjE,WAAAA,EAAAA;wDACCuG,eAAAA,EAAe/C,SAAAA;AACfY,wDAAAA,QAAAA,EAAU,CAACC,CAAAA,GAAAA;AACTA,4DAAAA,CAAAA,CAAEC,cAAc,EAAA;4DAChBb,YAAAA,CAAa,CAACgC,OAAS,CAACA,IAAAA,CAAAA;AAC1B,wDAAA,CAAA;AACAT,wDAAAA,OAAAA,gBAASf,GAAA,CAAC3D,OAAAA,EAAAA;4DAAQE,KAAAA,EAAOgD,SAAAA;4DAAWmB,aAAW,EAAA;;AAE9CW,wDAAAA,QAAAA,EAAAA;;AAEF9B,oDAAAA,SAAAA,kBACCS,GAAA,CAAC9D,GAAAA,EAAAA;wDAAIqG,WAAAA,EAAa,CAAA;AAChB,wDAAA,QAAA,gBAAAvC,GAAA,CAACwC,iBAAAA,EAAAA;4DAAkBrC,QAAAA,EAAUnB;;;;;;;;AA7BjCJ,6BAAAA,EAAAA,KAAAA,CAAAA;;AAwCd,iBAAA,CAAA,iBAAA0C,IAAA,CAAAe,QAAA,EAAA;;AACE,sCAAAf,IAAA,CAAC5F,KAAK+G,OAAO,EAAA;;8CACXzC,GAAA,CAACxE,eAAAA,EAAAA;AAAiB4F,oCAAAA,QAAAA,EAAAA;;8CAClBpB,GAAA,CAACxD,QAAAA,EAAAA;oCAAS2F,MAAAA,EAAQ,CAAA;oCAAGC,SAAAA,EAAWvG,gBAAAA;oCAAkBoF,KAAAA,EAAOrF,kBAAAA;AACtDiE,oCAAAA,QAAAA,EAAAA;;;;AAIH,wBAAA;AAAC,4BAAA,WAAA;AAAa,4BAAA;AAAY,yBAAA,CAAWE,GAAG,CAAC,CAACnB,KAAAA,iBAC1C0C,IAAA,CAAC5F,KAAK+G,OAAO,EAAA;;kDACXzC,GAAA,CAACxE,eAAAA,EAAAA;kDAAiBsB,aAAAA,CAAczB,iBAAiB,CAACuD,KAAAA,CAAM;;kDACxD0C,IAAA,CAAC9E,QAAAA,EAAAA;wCAAS2F,MAAAA,EAAQ,CAAA;wCAAGC,SAAAA,EAAWvG,gBAAAA;wCAAkBoF,KAAAA,EAAOrF,kBAAAA;;4CACtDgF,WAAAA,CAAYhC,KAAAA,CAAAA;4CAKZA,KAAAA,KAAU,WAAA,kBACT0C,IAAA,CAAC5F,IAAAA,CAAK+G,OAAO,EAAA;;kEACXzC,GAAA,CAACxE,eAAAA,EAAAA;AAAiB6F,wDAAAA,QAAAA,EAAAA;;kEAClBrB,GAAA,CAACxD,QAAAA,EAAAA;wDAAS2F,MAAAA,EAAQ,CAAA;wDAAGC,SAAAA,EAAU,MAAA;wDAAOnB,KAAAA,EAAOrF,kBAAAA;AAC3C,wDAAA,QAAA,gBAAAoE,GAAA,CAACwC,iBAAAA,EAAAA;4DAAkBrC,QAAAA,EAAUnB;;;;;;;;AAZpBJ,6BAAAA,EAAAA,KAAAA,CAAAA;;;;;;AAwBjC;;;;"}