@strapi/upload 5.51.0 → 5.51.2
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.
- package/dist/admin/components/AssetCard/VideoPreview.js +1 -1
- package/dist/admin/components/AssetCard/VideoPreview.js.map +1 -1
- package/dist/admin/components/AssetCard/VideoPreview.mjs +1 -1
- package/dist/admin/components/AssetCard/VideoPreview.mjs.map +1 -1
- package/dist/admin/components/TableList/TableList.js +1 -1
- package/dist/admin/components/TableList/TableList.js.map +1 -1
- package/dist/admin/components/TableList/TableList.mjs +1 -1
- package/dist/admin/components/TableList/TableList.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +21 -4
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +21 -4
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
- package/dist/admin/future/components/Drawer.js +3 -1
- package/dist/admin/future/components/Drawer.js.map +1 -1
- package/dist/admin/future/components/Drawer.mjs +3 -1
- package/dist/admin/future/components/Drawer.mjs.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.js +200 -27
- package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.mjs +203 -30
- package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
- package/dist/admin/future/hooks/useMediaLibraryPermissions.js +35 -0
- package/dist/admin/future/hooks/useMediaLibraryPermissions.js.map +1 -0
- package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs +33 -0
- package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/AssetsPage.js +344 -150
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +343 -149
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +75 -32
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +75 -32
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +46 -19
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +47 -20
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +161 -19
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +162 -20
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js +100 -0
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs +98 -0
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsTable.js +218 -37
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +219 -38
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +370 -0
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +368 -0
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +209 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +207 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js +193 -0
- package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs +191 -0
- package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +129 -37
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +131 -39
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js +120 -13
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs +120 -13
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +71 -0
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +69 -0
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js +34 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs +32 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js +15 -0
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs +13 -1
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +19 -25
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +19 -25
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js +35 -0
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs +33 -0
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js +13 -3
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +13 -3
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/EmptyState.js +62 -3
- package/dist/admin/future/pages/Assets/components/EmptyState.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/EmptyState.mjs +62 -4
- package/dist/admin/future/pages/Assets/components/EmptyState.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/FilterBadges.js +408 -0
- package/dist/admin/future/pages/Assets/components/FilterBadges.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FilterBadges.mjs +406 -0
- package/dist/admin/future/pages/Assets/components/FilterBadges.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.js +273 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.mjs +267 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +195 -40
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +198 -43
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js +33 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs +31 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js +22 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs +19 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.js +154 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs +152 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js +40 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs +38 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +75 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +71 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +33 -12
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +33 -12
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +40 -4
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +40 -4
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useListFilters.js +168 -0
- package/dist/admin/future/pages/Assets/hooks/useListFilters.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs +162 -0
- package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.js +124 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.mjs +120 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js +201 -0
- package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs +198 -0
- package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.js +29 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +27 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.js +84 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs +81 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/selection.js +104 -0
- package/dist/admin/future/pages/Assets/utils/selection.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/selection.mjs +94 -0
- package/dist/admin/future/pages/Assets/utils/selection.mjs.map +1 -0
- package/dist/admin/future/services/api.js +163 -28
- package/dist/admin/future/services/api.js.map +1 -1
- package/dist/admin/future/services/api.mjs +163 -30
- package/dist/admin/future/services/api.mjs.map +1 -1
- package/dist/admin/future/services/assets.js +62 -18
- package/dist/admin/future/services/assets.js.map +1 -1
- package/dist/admin/future/services/assets.mjs +62 -19
- package/dist/admin/future/services/assets.mjs.map +1 -1
- package/dist/admin/future/services/folders.js +31 -19
- package/dist/admin/future/services/folders.js.map +1 -1
- package/dist/admin/future/services/folders.mjs +31 -19
- package/dist/admin/future/services/folders.mjs.map +1 -1
- package/dist/admin/future/services/settings.js +10 -3
- package/dist/admin/future/services/settings.js.map +1 -1
- package/dist/admin/future/services/settings.mjs +10 -3
- package/dist/admin/future/services/settings.mjs.map +1 -1
- package/dist/admin/future/store/uploadProgress.js +109 -2
- package/dist/admin/future/store/uploadProgress.js.map +1 -1
- package/dist/admin/future/store/uploadProgress.mjs +105 -3
- package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
- package/dist/admin/future/utils/buildDragSetFromSelection.js +33 -0
- package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -0
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs +31 -0
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -0
- package/dist/admin/future/utils/canDropItemOnFolder.js +4 -0
- package/dist/admin/future/utils/canDropItemOnFolder.js.map +1 -1
- package/dist/admin/future/utils/canDropItemOnFolder.mjs +4 -0
- package/dist/admin/future/utils/canDropItemOnFolder.mjs.map +1 -1
- package/dist/admin/future/utils/flattenFolderStructure.js +28 -0
- package/dist/admin/future/utils/flattenFolderStructure.js.map +1 -0
- package/dist/admin/future/utils/flattenFolderStructure.mjs +26 -0
- package/dist/admin/future/utils/flattenFolderStructure.mjs.map +1 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.js +19 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +17 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -0
- package/dist/admin/future/utils/getFolderLabel.js +31 -0
- package/dist/admin/future/utils/getFolderLabel.js.map +1 -0
- package/dist/admin/future/utils/getFolderLabel.mjs +29 -0
- package/dist/admin/future/utils/getFolderLabel.mjs.map +1 -0
- package/dist/admin/future/utils/searchQueryParam.js +11 -0
- package/dist/admin/future/utils/searchQueryParam.js.map +1 -0
- package/dist/admin/future/utils/searchQueryParam.mjs +9 -0
- package/dist/admin/future/utils/searchQueryParam.mjs.map +1 -0
- package/dist/admin/hooks/useSelectionState.js +2 -4
- package/dist/admin/hooks/useSelectionState.js.map +1 -1
- package/dist/admin/hooks/useSelectionState.mjs +2 -4
- package/dist/admin/hooks/useSelectionState.mjs.map +1 -1
- package/dist/admin/shared/constants.js +43 -0
- package/dist/admin/shared/constants.js.map +1 -0
- package/dist/admin/shared/constants.mjs +38 -0
- package/dist/admin/shared/constants.mjs.map +1 -0
- package/dist/admin/src/future/hooks/useMediaLibraryPermissions.d.ts +21 -0
- package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetCropEditor.d.ts +7 -1
- package/dist/admin/src/future/pages/Assets/components/AssetsSearchInput.d.ts +5 -0
- package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +7 -1
- package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +14 -0
- package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +13 -0
- package/dist/admin/src/future/pages/Assets/components/DateRangeCalendar.d.ts +8 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +2 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.d.ts +2 -2
- package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +17 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/computeValidDropTargets.d.ts +7 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/dndIds.d.ts +3 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +3 -1
- package/dist/admin/src/future/pages/Assets/components/Dnd/useFolderTreeDroppable.d.ts +19 -0
- package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.d.ts +8 -1
- package/dist/admin/src/future/pages/Assets/components/EmptyState.d.ts +18 -1
- package/dist/admin/src/future/pages/Assets/components/FilterBadges.d.ts +6 -0
- package/dist/admin/src/future/pages/Assets/components/FilterMenu.d.ts +22 -0
- package/dist/admin/src/future/pages/Assets/components/FolderTree/FolderTree.d.ts +13 -4
- package/dist/admin/src/future/pages/Assets/components/FolderTree/filterFolderTree.d.ts +16 -0
- package/dist/admin/src/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.d.ts +6 -0
- package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +23 -0
- package/dist/admin/src/future/pages/Assets/hooks/useAssetSearch.d.ts +12 -0
- package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +46 -0
- package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +13 -3
- package/dist/admin/src/future/pages/Assets/hooks/useListFilters.d.ts +69 -0
- package/dist/admin/src/future/pages/Assets/hooks/useListSort.d.ts +47 -0
- package/dist/admin/src/future/pages/Assets/utils/buildAssetFilters.d.ts +46 -0
- package/dist/admin/src/future/pages/Assets/utils/listQueryKey.d.ts +29 -0
- package/dist/admin/src/future/pages/Assets/utils/mergeMixedList.d.ts +40 -0
- package/dist/admin/src/future/pages/Assets/utils/selection.d.ts +50 -0
- package/dist/admin/src/future/services/api.d.ts +53 -5
- package/dist/admin/src/future/services/assets.d.ts +13 -2
- package/dist/admin/src/future/services/folders.d.ts +7 -1
- package/dist/admin/src/future/services/settings.d.ts +2 -2
- package/dist/admin/src/future/store/uploadProgress.d.ts +83 -1
- package/dist/admin/src/future/types/dnd.d.ts +5 -0
- package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +11 -0
- package/dist/admin/src/future/utils/canDropItemOnFolder.d.ts +1 -1
- package/dist/admin/src/future/utils/flattenFolderStructure.d.ts +18 -0
- package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +14 -0
- package/dist/admin/src/future/utils/getFolderLabel.d.ts +11 -0
- package/dist/admin/src/future/utils/searchQueryParam.d.ts +7 -0
- package/dist/admin/src/hooks/useAiAvailability.d.ts +1 -1
- package/dist/admin/src/hooks/useEditAsset.d.ts +4 -4
- package/dist/admin/src/hooks/useEditFolder.d.ts +4 -4
- package/dist/admin/src/hooks/useSettings.d.ts +1 -0
- package/dist/admin/src/hooks/useTracking.d.ts +1 -1
- package/dist/admin/src/hooks/useUpload.d.ts +1 -1
- package/dist/admin/translations/en.json.js +85 -2
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +85 -2
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/utils/urlYupSchema.js +33 -9
- package/dist/admin/utils/urlYupSchema.js.map +1 -1
- package/dist/admin/utils/urlYupSchema.mjs +33 -9
- package/dist/admin/utils/urlYupSchema.mjs.map +1 -1
- package/dist/server/config.js +13 -5
- package/dist/server/config.js.map +1 -1
- package/dist/server/config.mjs +13 -5
- package/dist/server/config.mjs.map +1 -1
- package/dist/server/constants.js.map +1 -1
- package/dist/server/constants.mjs.map +1 -1
- package/dist/server/controllers/admin-file.js +30 -0
- package/dist/server/controllers/admin-file.js.map +1 -1
- package/dist/server/controllers/admin-file.mjs +30 -0
- package/dist/server/controllers/admin-file.mjs.map +1 -1
- package/dist/server/controllers/admin-settings.js +20 -2
- package/dist/server/controllers/admin-settings.js.map +1 -1
- package/dist/server/controllers/admin-settings.mjs +21 -3
- package/dist/server/controllers/admin-settings.mjs.map +1 -1
- package/dist/server/controllers/content-api.js +1 -2
- package/dist/server/controllers/content-api.js.map +1 -1
- package/dist/server/controllers/content-api.mjs +2 -2
- package/dist/server/controllers/content-api.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/ai-metadata.js +12 -0
- package/dist/server/controllers/validation/admin/ai-metadata.js.map +1 -0
- package/dist/server/controllers/validation/admin/ai-metadata.mjs +10 -0
- package/dist/server/controllers/validation/admin/ai-metadata.mjs.map +1 -0
- package/dist/server/controllers/validation/admin/settings.js +4 -1
- package/dist/server/controllers/validation/admin/settings.js.map +1 -1
- package/dist/server/controllers/validation/admin/settings.mjs +1 -1
- package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
- package/dist/server/routes/admin.js +18 -0
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/admin.mjs +18 -0
- package/dist/server/routes/admin.mjs.map +1 -1
- package/dist/server/services/ai-metadata.js +108 -11
- package/dist/server/services/ai-metadata.js.map +1 -1
- package/dist/server/services/ai-metadata.mjs +108 -11
- package/dist/server/services/ai-metadata.mjs.map +1 -1
- package/dist/server/services/file.js +86 -13
- package/dist/server/services/file.js.map +1 -1
- package/dist/server/services/file.mjs +87 -14
- package/dist/server/services/file.mjs.map +1 -1
- package/dist/server/services/image-manipulation.js +4 -4
- package/dist/server/services/image-manipulation.js.map +1 -1
- package/dist/server/services/image-manipulation.mjs +4 -4
- package/dist/server/services/image-manipulation.mjs.map +1 -1
- package/dist/server/shared/constants.js +43 -0
- package/dist/server/shared/constants.js.map +1 -0
- package/dist/server/shared/constants.mjs +38 -0
- package/dist/server/shared/constants.mjs.map +1 -0
- package/dist/server/src/config.d.ts +2 -0
- package/dist/server/src/config.d.ts.map +1 -1
- package/dist/server/src/constants.d.ts +2 -1
- package/dist/server/src/constants.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-file.d.ts +10 -0
- package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +1 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts +2 -0
- package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts.map +1 -0
- package/dist/server/src/controllers/validation/admin/settings.d.ts +1 -1
- package/dist/server/src/controllers/validation/admin/settings.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +7 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/routes/admin.d.ts.map +1 -1
- package/dist/server/src/services/ai-metadata.d.ts +19 -0
- package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
- package/dist/server/src/services/file.d.ts +12 -2
- package/dist/server/src/services/file.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +4 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/types.d.ts +3 -0
- package/dist/server/src/types.d.ts.map +1 -1
- package/dist/shared/constants.d.ts +35 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/contracts/files.d.ts +25 -0
- package/dist/shared/contracts/files.d.ts.map +1 -1
- package/dist/shared/contracts/folders.d.ts +1 -1
- package/dist/shared/contracts/settings.d.ts +7 -0
- package/package.json +8 -8
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var designSystem = require('@strapi/design-system');
|
|
6
|
+
var icons = require('@strapi/icons');
|
|
7
|
+
var reactIntl = require('react-intl');
|
|
8
|
+
var styledComponents = require('styled-components');
|
|
9
|
+
var translations = require('../../../utils/translations.js');
|
|
10
|
+
var useListFilters = require('../hooks/useListFilters.js');
|
|
11
|
+
var DateRangeCalendar = require('./DateRangeCalendar.js');
|
|
12
|
+
|
|
13
|
+
const TYPE_LABELS = {
|
|
14
|
+
folder: {
|
|
15
|
+
id: translations.getTranslationKey('list.filters.type.folder'),
|
|
16
|
+
defaultMessage: 'Folder'
|
|
17
|
+
},
|
|
18
|
+
picture: {
|
|
19
|
+
id: translations.getTranslationKey('list.filters.type.picture'),
|
|
20
|
+
defaultMessage: 'Picture'
|
|
21
|
+
},
|
|
22
|
+
audio: {
|
|
23
|
+
id: translations.getTranslationKey('list.filters.type.audio'),
|
|
24
|
+
defaultMessage: 'Audio'
|
|
25
|
+
},
|
|
26
|
+
video: {
|
|
27
|
+
id: translations.getTranslationKey('list.filters.type.video'),
|
|
28
|
+
defaultMessage: 'Video'
|
|
29
|
+
},
|
|
30
|
+
document: {
|
|
31
|
+
id: translations.getTranslationKey('list.filters.type.document'),
|
|
32
|
+
defaultMessage: 'Document'
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const PRESET_LABELS = {
|
|
36
|
+
'1day': {
|
|
37
|
+
id: translations.getTranslationKey('list.filters.preset.1day'),
|
|
38
|
+
defaultMessage: '1 day ago'
|
|
39
|
+
},
|
|
40
|
+
'3days': {
|
|
41
|
+
id: translations.getTranslationKey('list.filters.preset.3days'),
|
|
42
|
+
defaultMessage: '3 days ago'
|
|
43
|
+
},
|
|
44
|
+
'1week': {
|
|
45
|
+
id: translations.getTranslationKey('list.filters.preset.1week'),
|
|
46
|
+
defaultMessage: '1 week ago'
|
|
47
|
+
},
|
|
48
|
+
'1month': {
|
|
49
|
+
id: translations.getTranslationKey('list.filters.preset.1month'),
|
|
50
|
+
defaultMessage: '1 month ago'
|
|
51
|
+
},
|
|
52
|
+
'3months': {
|
|
53
|
+
id: translations.getTranslationKey('list.filters.preset.3months'),
|
|
54
|
+
defaultMessage: '3 months ago'
|
|
55
|
+
},
|
|
56
|
+
'6months': {
|
|
57
|
+
id: translations.getTranslationKey('list.filters.preset.6months'),
|
|
58
|
+
defaultMessage: '6 months ago'
|
|
59
|
+
},
|
|
60
|
+
'1year': {
|
|
61
|
+
id: translations.getTranslationKey('list.filters.preset.1year'),
|
|
62
|
+
defaultMessage: '1 year ago'
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const DATE_FIELD_LABELS = {
|
|
66
|
+
createdAt: {
|
|
67
|
+
id: translations.getTranslationKey('list.filters.field.created'),
|
|
68
|
+
defaultMessage: 'Creation date'
|
|
69
|
+
},
|
|
70
|
+
updatedAt: {
|
|
71
|
+
id: translations.getTranslationKey('list.filters.field.updated'),
|
|
72
|
+
defaultMessage: 'Last modified'
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
// The DS SubTrigger renders its chevron inline right after the label — push it
|
|
76
|
+
// to the far edge so every field row reads label · · · ›, like the mock.
|
|
77
|
+
const FieldSubTrigger = styledComponents.styled(designSystem.Menu.SubTrigger)`
|
|
78
|
+
width: 100%;
|
|
79
|
+
justify-content: space-between;
|
|
80
|
+
`;
|
|
81
|
+
/** Every panel of the filter tree shares this fixed width (design). */ const FILTER_PANEL_WIDTH = '24.2rem';
|
|
82
|
+
// Sub panels: fixed width, no 15rem clamp (the DS default folds the calendar),
|
|
83
|
+
// and a negative top margin cancelling the parent panel's padding + border so
|
|
84
|
+
// the sub panel's top edge lines up with the parent panel, not the item.
|
|
85
|
+
const SubPanel = styledComponents.styled(designSystem.Menu.SubContent)`
|
|
86
|
+
margin-top: calc(-1 * (${({ theme })=>theme.spaces[1]} + 1px));
|
|
87
|
+
`;
|
|
88
|
+
const CountBadge = styledComponents.styled(designSystem.Badge)`
|
|
89
|
+
height: 1.6rem;
|
|
90
|
+
min-width: auto;
|
|
91
|
+
padding: 0 0.4rem;
|
|
92
|
+
`;
|
|
93
|
+
/**
|
|
94
|
+
* Toolbar "Filter" dropdown. Picking anything ADDS a badge (editing happens on
|
|
95
|
+
* the badge itself, see FilterBadges):
|
|
96
|
+
*
|
|
97
|
+
* - Type → keep-open checkbox list; the badge is created/updated live with the
|
|
98
|
+
* checked set (`is` by default, condition editable on the badge).
|
|
99
|
+
* - Creation date / Last modified → preset list (single pick, `within the
|
|
100
|
+
* last` by default) + "Select date range" (creation date only) opening the
|
|
101
|
+
* range calendar; a completed range adds an `is` range badge.
|
|
102
|
+
*/ const FilterMenu = ({ listFilters })=>{
|
|
103
|
+
const { formatMessage } = reactIntl.useIntl();
|
|
104
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
|
105
|
+
const { filters, addFilter, updateFilter, removeFilter } = listFilters;
|
|
106
|
+
// The Type submenu edits the LAST type badge in place while the menu stays
|
|
107
|
+
// open (checking values accumulates into one badge, per design).
|
|
108
|
+
let lastTypeIndex = -1;
|
|
109
|
+
for(let i = filters.length - 1; i >= 0; i -= 1){
|
|
110
|
+
if (filters[i].kind === 'type') {
|
|
111
|
+
lastTypeIndex = i;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const lastTypeFilter = lastTypeIndex >= 0 ? filters[lastTypeIndex] : null;
|
|
116
|
+
const checkedValues = lastTypeFilter && lastTypeFilter.kind === 'type' ? lastTypeFilter.values : [];
|
|
117
|
+
const toggleTypeValue = (value)=>{
|
|
118
|
+
const nextValues = checkedValues.includes(value) ? checkedValues.filter((v)=>v !== value) : [
|
|
119
|
+
...checkedValues,
|
|
120
|
+
value
|
|
121
|
+
];
|
|
122
|
+
if (lastTypeFilter && lastTypeFilter.kind === 'type') {
|
|
123
|
+
if (nextValues.length === 0) {
|
|
124
|
+
// Unchecking the final value removes the badge outright — a type
|
|
125
|
+
// filter with no values is not a state (it would serialize to a
|
|
126
|
+
// malformed `type:is:` the parser drops anyway).
|
|
127
|
+
removeFilter(lastTypeIndex);
|
|
128
|
+
} else {
|
|
129
|
+
updateFilter(lastTypeIndex, {
|
|
130
|
+
...lastTypeFilter,
|
|
131
|
+
values: nextValues
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
} else if (nextValues.length > 0) {
|
|
135
|
+
addFilter({
|
|
136
|
+
kind: 'type',
|
|
137
|
+
condition: 'is',
|
|
138
|
+
values: nextValues
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
const addPreset = (field, preset)=>{
|
|
143
|
+
addFilter({
|
|
144
|
+
kind: 'date',
|
|
145
|
+
field,
|
|
146
|
+
mode: 'preset',
|
|
147
|
+
condition: 'withinLast',
|
|
148
|
+
preset
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
const addRange = (from, to)=>{
|
|
152
|
+
addFilter({
|
|
153
|
+
kind: 'date',
|
|
154
|
+
field: 'createdAt',
|
|
155
|
+
mode: 'range',
|
|
156
|
+
condition: 'is',
|
|
157
|
+
from,
|
|
158
|
+
to
|
|
159
|
+
});
|
|
160
|
+
// The calendar is not a Menu.Item — close the menu explicitly on commit.
|
|
161
|
+
setIsOpen(false);
|
|
162
|
+
};
|
|
163
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Root, {
|
|
164
|
+
open: isOpen,
|
|
165
|
+
onOpenChange: setIsOpen,
|
|
166
|
+
children: [
|
|
167
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Trigger, {
|
|
168
|
+
variant: "tertiary",
|
|
169
|
+
startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Filter, {
|
|
170
|
+
"aria-hidden": true
|
|
171
|
+
}),
|
|
172
|
+
endIcon: null,
|
|
173
|
+
children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
174
|
+
gap: 2,
|
|
175
|
+
alignItems: "center",
|
|
176
|
+
tag: "span",
|
|
177
|
+
children: [
|
|
178
|
+
formatMessage({
|
|
179
|
+
id: translations.getTranslationKey('list.filters.trigger'),
|
|
180
|
+
defaultMessage: 'Filter'
|
|
181
|
+
}),
|
|
182
|
+
filters.length > 0 && /*#__PURE__*/ jsxRuntime.jsx(CountBadge, {
|
|
183
|
+
children: filters.length
|
|
184
|
+
})
|
|
185
|
+
]
|
|
186
|
+
})
|
|
187
|
+
}),
|
|
188
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Content, {
|
|
189
|
+
popoverPlacement: "bottom-start",
|
|
190
|
+
zIndex: 2,
|
|
191
|
+
maxHeight: "70vh",
|
|
192
|
+
width: FILTER_PANEL_WIDTH,
|
|
193
|
+
children: [
|
|
194
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.SubRoot, {
|
|
195
|
+
children: [
|
|
196
|
+
/*#__PURE__*/ jsxRuntime.jsx(FieldSubTrigger, {
|
|
197
|
+
children: formatMessage({
|
|
198
|
+
id: translations.getTranslationKey('list.filters.field.type'),
|
|
199
|
+
defaultMessage: 'Type'
|
|
200
|
+
})
|
|
201
|
+
}),
|
|
202
|
+
/*#__PURE__*/ jsxRuntime.jsx(SubPanel, {
|
|
203
|
+
zIndex: 2,
|
|
204
|
+
maxHeight: "70vh",
|
|
205
|
+
width: FILTER_PANEL_WIDTH,
|
|
206
|
+
children: useListFilters.TYPE_VALUES.map((value)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
|
|
207
|
+
role: "menuitemcheckbox",
|
|
208
|
+
"aria-checked": checkedValues.includes(value),
|
|
209
|
+
onSelect: (e)=>{
|
|
210
|
+
e.preventDefault();
|
|
211
|
+
toggleTypeValue(value);
|
|
212
|
+
},
|
|
213
|
+
startIcon: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Checkbox, {
|
|
214
|
+
checked: checkedValues.includes(value),
|
|
215
|
+
tabIndex: -1,
|
|
216
|
+
"aria-hidden": true
|
|
217
|
+
}),
|
|
218
|
+
children: formatMessage(TYPE_LABELS[value])
|
|
219
|
+
}, value))
|
|
220
|
+
})
|
|
221
|
+
]
|
|
222
|
+
}),
|
|
223
|
+
[
|
|
224
|
+
'createdAt',
|
|
225
|
+
'updatedAt'
|
|
226
|
+
].map((field)=>/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.SubRoot, {
|
|
227
|
+
children: [
|
|
228
|
+
/*#__PURE__*/ jsxRuntime.jsx(FieldSubTrigger, {
|
|
229
|
+
children: formatMessage(DATE_FIELD_LABELS[field])
|
|
230
|
+
}),
|
|
231
|
+
/*#__PURE__*/ jsxRuntime.jsxs(SubPanel, {
|
|
232
|
+
zIndex: 2,
|
|
233
|
+
maxHeight: "70vh",
|
|
234
|
+
width: FILTER_PANEL_WIDTH,
|
|
235
|
+
children: [
|
|
236
|
+
useListFilters.DATE_PRESETS.map((preset)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
|
|
237
|
+
onSelect: ()=>addPreset(field, preset),
|
|
238
|
+
children: formatMessage(PRESET_LABELS[preset])
|
|
239
|
+
}, preset)),
|
|
240
|
+
field === 'createdAt' && /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.SubRoot, {
|
|
241
|
+
children: [
|
|
242
|
+
/*#__PURE__*/ jsxRuntime.jsx(FieldSubTrigger, {
|
|
243
|
+
children: formatMessage({
|
|
244
|
+
id: translations.getTranslationKey('list.filters.select-date-range'),
|
|
245
|
+
defaultMessage: 'Select date range'
|
|
246
|
+
})
|
|
247
|
+
}),
|
|
248
|
+
/*#__PURE__*/ jsxRuntime.jsx(SubPanel, {
|
|
249
|
+
zIndex: 2,
|
|
250
|
+
maxHeight: "none",
|
|
251
|
+
width: FILTER_PANEL_WIDTH,
|
|
252
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(DateRangeCalendar.DateRangeCalendar, {
|
|
253
|
+
onSelect: addRange
|
|
254
|
+
})
|
|
255
|
+
})
|
|
256
|
+
]
|
|
257
|
+
})
|
|
258
|
+
]
|
|
259
|
+
})
|
|
260
|
+
]
|
|
261
|
+
}, field))
|
|
262
|
+
]
|
|
263
|
+
})
|
|
264
|
+
]
|
|
265
|
+
});
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
exports.DATE_FIELD_LABELS = DATE_FIELD_LABELS;
|
|
269
|
+
exports.FILTER_PANEL_WIDTH = FILTER_PANEL_WIDTH;
|
|
270
|
+
exports.FilterMenu = FilterMenu;
|
|
271
|
+
exports.PRESET_LABELS = PRESET_LABELS;
|
|
272
|
+
exports.TYPE_LABELS = TYPE_LABELS;
|
|
273
|
+
//# 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 { 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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"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Menu, Flex, Checkbox, Badge } from '@strapi/design-system';
|
|
4
|
+
import { Filter } from '@strapi/icons';
|
|
5
|
+
import { useIntl } from 'react-intl';
|
|
6
|
+
import { styled } from 'styled-components';
|
|
7
|
+
import { getTranslationKey } from '../../../utils/translations.mjs';
|
|
8
|
+
import { TYPE_VALUES, DATE_PRESETS } from '../hooks/useListFilters.mjs';
|
|
9
|
+
import { DateRangeCalendar } from './DateRangeCalendar.mjs';
|
|
10
|
+
|
|
11
|
+
const TYPE_LABELS = {
|
|
12
|
+
folder: {
|
|
13
|
+
id: getTranslationKey('list.filters.type.folder'),
|
|
14
|
+
defaultMessage: 'Folder'
|
|
15
|
+
},
|
|
16
|
+
picture: {
|
|
17
|
+
id: getTranslationKey('list.filters.type.picture'),
|
|
18
|
+
defaultMessage: 'Picture'
|
|
19
|
+
},
|
|
20
|
+
audio: {
|
|
21
|
+
id: getTranslationKey('list.filters.type.audio'),
|
|
22
|
+
defaultMessage: 'Audio'
|
|
23
|
+
},
|
|
24
|
+
video: {
|
|
25
|
+
id: getTranslationKey('list.filters.type.video'),
|
|
26
|
+
defaultMessage: 'Video'
|
|
27
|
+
},
|
|
28
|
+
document: {
|
|
29
|
+
id: getTranslationKey('list.filters.type.document'),
|
|
30
|
+
defaultMessage: 'Document'
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const PRESET_LABELS = {
|
|
34
|
+
'1day': {
|
|
35
|
+
id: getTranslationKey('list.filters.preset.1day'),
|
|
36
|
+
defaultMessage: '1 day ago'
|
|
37
|
+
},
|
|
38
|
+
'3days': {
|
|
39
|
+
id: getTranslationKey('list.filters.preset.3days'),
|
|
40
|
+
defaultMessage: '3 days ago'
|
|
41
|
+
},
|
|
42
|
+
'1week': {
|
|
43
|
+
id: getTranslationKey('list.filters.preset.1week'),
|
|
44
|
+
defaultMessage: '1 week ago'
|
|
45
|
+
},
|
|
46
|
+
'1month': {
|
|
47
|
+
id: getTranslationKey('list.filters.preset.1month'),
|
|
48
|
+
defaultMessage: '1 month ago'
|
|
49
|
+
},
|
|
50
|
+
'3months': {
|
|
51
|
+
id: getTranslationKey('list.filters.preset.3months'),
|
|
52
|
+
defaultMessage: '3 months ago'
|
|
53
|
+
},
|
|
54
|
+
'6months': {
|
|
55
|
+
id: getTranslationKey('list.filters.preset.6months'),
|
|
56
|
+
defaultMessage: '6 months ago'
|
|
57
|
+
},
|
|
58
|
+
'1year': {
|
|
59
|
+
id: getTranslationKey('list.filters.preset.1year'),
|
|
60
|
+
defaultMessage: '1 year ago'
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const DATE_FIELD_LABELS = {
|
|
64
|
+
createdAt: {
|
|
65
|
+
id: getTranslationKey('list.filters.field.created'),
|
|
66
|
+
defaultMessage: 'Creation date'
|
|
67
|
+
},
|
|
68
|
+
updatedAt: {
|
|
69
|
+
id: getTranslationKey('list.filters.field.updated'),
|
|
70
|
+
defaultMessage: 'Last modified'
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
// The DS SubTrigger renders its chevron inline right after the label — push it
|
|
74
|
+
// to the far edge so every field row reads label · · · ›, like the mock.
|
|
75
|
+
const FieldSubTrigger = styled(Menu.SubTrigger)`
|
|
76
|
+
width: 100%;
|
|
77
|
+
justify-content: space-between;
|
|
78
|
+
`;
|
|
79
|
+
/** Every panel of the filter tree shares this fixed width (design). */ const FILTER_PANEL_WIDTH = '24.2rem';
|
|
80
|
+
// Sub panels: fixed width, no 15rem clamp (the DS default folds the calendar),
|
|
81
|
+
// and a negative top margin cancelling the parent panel's padding + border so
|
|
82
|
+
// the sub panel's top edge lines up with the parent panel, not the item.
|
|
83
|
+
const SubPanel = styled(Menu.SubContent)`
|
|
84
|
+
margin-top: calc(-1 * (${({ theme })=>theme.spaces[1]} + 1px));
|
|
85
|
+
`;
|
|
86
|
+
const CountBadge = styled(Badge)`
|
|
87
|
+
height: 1.6rem;
|
|
88
|
+
min-width: auto;
|
|
89
|
+
padding: 0 0.4rem;
|
|
90
|
+
`;
|
|
91
|
+
/**
|
|
92
|
+
* Toolbar "Filter" dropdown. Picking anything ADDS a badge (editing happens on
|
|
93
|
+
* the badge itself, see FilterBadges):
|
|
94
|
+
*
|
|
95
|
+
* - Type → keep-open checkbox list; the badge is created/updated live with the
|
|
96
|
+
* checked set (`is` by default, condition editable on the badge).
|
|
97
|
+
* - Creation date / Last modified → preset list (single pick, `within the
|
|
98
|
+
* last` by default) + "Select date range" (creation date only) opening the
|
|
99
|
+
* range calendar; a completed range adds an `is` range badge.
|
|
100
|
+
*/ const FilterMenu = ({ listFilters })=>{
|
|
101
|
+
const { formatMessage } = useIntl();
|
|
102
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
103
|
+
const { filters, addFilter, updateFilter, removeFilter } = listFilters;
|
|
104
|
+
// The Type submenu edits the LAST type badge in place while the menu stays
|
|
105
|
+
// open (checking values accumulates into one badge, per design).
|
|
106
|
+
let lastTypeIndex = -1;
|
|
107
|
+
for(let i = filters.length - 1; i >= 0; i -= 1){
|
|
108
|
+
if (filters[i].kind === 'type') {
|
|
109
|
+
lastTypeIndex = i;
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const lastTypeFilter = lastTypeIndex >= 0 ? filters[lastTypeIndex] : null;
|
|
114
|
+
const checkedValues = lastTypeFilter && lastTypeFilter.kind === 'type' ? lastTypeFilter.values : [];
|
|
115
|
+
const toggleTypeValue = (value)=>{
|
|
116
|
+
const nextValues = checkedValues.includes(value) ? checkedValues.filter((v)=>v !== value) : [
|
|
117
|
+
...checkedValues,
|
|
118
|
+
value
|
|
119
|
+
];
|
|
120
|
+
if (lastTypeFilter && lastTypeFilter.kind === 'type') {
|
|
121
|
+
if (nextValues.length === 0) {
|
|
122
|
+
// Unchecking the final value removes the badge outright — a type
|
|
123
|
+
// filter with no values is not a state (it would serialize to a
|
|
124
|
+
// malformed `type:is:` the parser drops anyway).
|
|
125
|
+
removeFilter(lastTypeIndex);
|
|
126
|
+
} else {
|
|
127
|
+
updateFilter(lastTypeIndex, {
|
|
128
|
+
...lastTypeFilter,
|
|
129
|
+
values: nextValues
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
} else if (nextValues.length > 0) {
|
|
133
|
+
addFilter({
|
|
134
|
+
kind: 'type',
|
|
135
|
+
condition: 'is',
|
|
136
|
+
values: nextValues
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
const addPreset = (field, preset)=>{
|
|
141
|
+
addFilter({
|
|
142
|
+
kind: 'date',
|
|
143
|
+
field,
|
|
144
|
+
mode: 'preset',
|
|
145
|
+
condition: 'withinLast',
|
|
146
|
+
preset
|
|
147
|
+
});
|
|
148
|
+
};
|
|
149
|
+
const addRange = (from, to)=>{
|
|
150
|
+
addFilter({
|
|
151
|
+
kind: 'date',
|
|
152
|
+
field: 'createdAt',
|
|
153
|
+
mode: 'range',
|
|
154
|
+
condition: 'is',
|
|
155
|
+
from,
|
|
156
|
+
to
|
|
157
|
+
});
|
|
158
|
+
// The calendar is not a Menu.Item — close the menu explicitly on commit.
|
|
159
|
+
setIsOpen(false);
|
|
160
|
+
};
|
|
161
|
+
return /*#__PURE__*/ jsxs(Menu.Root, {
|
|
162
|
+
open: isOpen,
|
|
163
|
+
onOpenChange: setIsOpen,
|
|
164
|
+
children: [
|
|
165
|
+
/*#__PURE__*/ jsx(Menu.Trigger, {
|
|
166
|
+
variant: "tertiary",
|
|
167
|
+
startIcon: /*#__PURE__*/ jsx(Filter, {
|
|
168
|
+
"aria-hidden": true
|
|
169
|
+
}),
|
|
170
|
+
endIcon: null,
|
|
171
|
+
children: /*#__PURE__*/ jsxs(Flex, {
|
|
172
|
+
gap: 2,
|
|
173
|
+
alignItems: "center",
|
|
174
|
+
tag: "span",
|
|
175
|
+
children: [
|
|
176
|
+
formatMessage({
|
|
177
|
+
id: getTranslationKey('list.filters.trigger'),
|
|
178
|
+
defaultMessage: 'Filter'
|
|
179
|
+
}),
|
|
180
|
+
filters.length > 0 && /*#__PURE__*/ jsx(CountBadge, {
|
|
181
|
+
children: filters.length
|
|
182
|
+
})
|
|
183
|
+
]
|
|
184
|
+
})
|
|
185
|
+
}),
|
|
186
|
+
/*#__PURE__*/ jsxs(Menu.Content, {
|
|
187
|
+
popoverPlacement: "bottom-start",
|
|
188
|
+
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
|
+
})
|
|
199
|
+
}),
|
|
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),
|
|
207
|
+
onSelect: (e)=>{
|
|
208
|
+
e.preventDefault();
|
|
209
|
+
toggleTypeValue(value);
|
|
210
|
+
},
|
|
211
|
+
startIcon: /*#__PURE__*/ jsx(Checkbox, {
|
|
212
|
+
checked: checkedValues.includes(value),
|
|
213
|
+
tabIndex: -1,
|
|
214
|
+
"aria-hidden": true
|
|
215
|
+
}),
|
|
216
|
+
children: formatMessage(TYPE_LABELS[value])
|
|
217
|
+
}, value))
|
|
218
|
+
})
|
|
219
|
+
]
|
|
220
|
+
}),
|
|
221
|
+
[
|
|
222
|
+
'createdAt',
|
|
223
|
+
'updatedAt'
|
|
224
|
+
].map((field)=>/*#__PURE__*/ jsxs(Menu.SubRoot, {
|
|
225
|
+
children: [
|
|
226
|
+
/*#__PURE__*/ jsx(FieldSubTrigger, {
|
|
227
|
+
children: formatMessage(DATE_FIELD_LABELS[field])
|
|
228
|
+
}),
|
|
229
|
+
/*#__PURE__*/ jsxs(SubPanel, {
|
|
230
|
+
zIndex: 2,
|
|
231
|
+
maxHeight: "70vh",
|
|
232
|
+
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
|
+
]
|
|
257
|
+
})
|
|
258
|
+
]
|
|
259
|
+
}, field))
|
|
260
|
+
]
|
|
261
|
+
})
|
|
262
|
+
]
|
|
263
|
+
});
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
export { DATE_FIELD_LABELS, FILTER_PANEL_WIDTH, FilterMenu, PRESET_LABELS, TYPE_LABELS };
|
|
267
|
+
//# sourceMappingURL=FilterMenu.mjs.map
|
|
@@ -0,0 +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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"}
|