@strapi/upload 5.51.1 → 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 +203 -78
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +200 -75
- 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 +5 -2
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +5 -2
- 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 +10 -4
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +10 -4
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +140 -22
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +142 -24
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
- 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 +18 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +18 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
- 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 +76 -19
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +78 -21
- 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/SortMenu.js +21 -32
- package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs +22 -33
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -1
- 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 +21 -5
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +21 -5
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
- 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/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 +2 -2
- package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -1
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +2 -2
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -1
- 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 +29 -17
- package/dist/admin/future/services/assets.js.map +1 -1
- package/dist/admin/future/services/assets.mjs +29 -17
- package/dist/admin/future/services/assets.mjs.map +1 -1
- package/dist/admin/future/services/folders.js +29 -17
- package/dist/admin/future/services/folders.js.map +1 -1
- package/dist/admin/future/services/folders.mjs +29 -17
- 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/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/BulkActionsBar.d.ts +14 -1
- package/dist/admin/src/future/pages/Assets/components/DateRangeCalendar.d.ts +8 -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/SortMenu.d.ts +6 -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 +8 -1
- 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/utils/buildAssetFilters.d.ts +46 -0
- package/dist/admin/src/future/pages/Assets/utils/listQueryKey.d.ts +3 -4
- package/dist/admin/src/future/services/api.d.ts +53 -5
- package/dist/admin/src/future/services/assets.d.ts +9 -1
- package/dist/admin/src/future/services/folders.d.ts +3 -0
- 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/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 +53 -3
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +53 -3
- 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/settings.d.ts +7 -0
- package/package.json +7 -7
|
@@ -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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"}
|