@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,406 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Flex, Typography, Popover, Checkbox } from '@strapi/design-system';
|
|
4
|
+
import { Cross, Check } 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 { parseCalendarDate } from '../utils/buildAssetFilters.mjs';
|
|
10
|
+
import { DateRangeCalendar } from './DateRangeCalendar.mjs';
|
|
11
|
+
import { DATE_FIELD_LABELS, TYPE_LABELS, PRESET_LABELS, FILTER_PANEL_WIDTH } from './FilterMenu.mjs';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Row of applied-filter badges under the toolbar. A badge has three segments —
|
|
15
|
+
* field (static), condition (click → select popover), value (click → type
|
|
16
|
+
* checkboxes / preset list / range calendar) — plus a remove button.
|
|
17
|
+
*/ const BadgePill = styled(Flex)`
|
|
18
|
+
border: 1px solid ${({ theme })=>theme.colors.neutral200};
|
|
19
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
20
|
+
background: ${({ theme })=>theme.colors.neutral0};
|
|
21
|
+
overflow: hidden;
|
|
22
|
+
`;
|
|
23
|
+
const Segment = styled.button`
|
|
24
|
+
border: none;
|
|
25
|
+
background: transparent;
|
|
26
|
+
font: inherit;
|
|
27
|
+
padding: ${({ theme })=>`${theme.spaces[1]} ${theme.spaces[2]}`};
|
|
28
|
+
cursor: ${({ $interactive })=>$interactive ? 'pointer' : 'default'};
|
|
29
|
+
border-right: 1px solid ${({ theme })=>theme.colors.neutral200};
|
|
30
|
+
|
|
31
|
+
${({ $interactive, theme })=>$interactive && `&:hover { background: ${theme.colors.primary100}; }`}
|
|
32
|
+
|
|
33
|
+
&:focus-visible {
|
|
34
|
+
outline: 2px solid ${({ theme })=>theme.colors.primary600};
|
|
35
|
+
outline-offset: -2px;
|
|
36
|
+
}
|
|
37
|
+
`;
|
|
38
|
+
// Non-interactive field segment (first pill cell).
|
|
39
|
+
const FieldSegment = styled.span`
|
|
40
|
+
display: inline-flex;
|
|
41
|
+
align-items: center;
|
|
42
|
+
padding: ${({ theme })=>`${theme.spaces[1]} ${theme.spaces[2]}`};
|
|
43
|
+
border-right: 1px solid ${({ theme })=>theme.colors.neutral200};
|
|
44
|
+
`;
|
|
45
|
+
// Badge popovers mirror the filter-menu panels: same fixed width, same font.
|
|
46
|
+
const PanelPopoverContent = styled(Popover.Content)`
|
|
47
|
+
width: ${FILTER_PANEL_WIDTH};
|
|
48
|
+
`;
|
|
49
|
+
// Option row inside a segment popover — sized like a DS Menu.Item so the badge
|
|
50
|
+
// dropdowns read as the same control family as the filter menu.
|
|
51
|
+
const OptionButton = styled.button`
|
|
52
|
+
display: flex;
|
|
53
|
+
align-items: center;
|
|
54
|
+
justify-content: space-between;
|
|
55
|
+
gap: ${({ theme })=>theme.spaces[4]};
|
|
56
|
+
width: 100%;
|
|
57
|
+
border: none;
|
|
58
|
+
background: transparent;
|
|
59
|
+
font-size: ${({ theme })=>theme.fontSizes[2]};
|
|
60
|
+
line-height: ${({ theme })=>theme.lineHeights[4]};
|
|
61
|
+
font-family: inherit;
|
|
62
|
+
text-align: left;
|
|
63
|
+
padding: ${({ theme })=>`${theme.spaces[2]} ${theme.spaces[4]}`};
|
|
64
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
65
|
+
cursor: pointer;
|
|
66
|
+
color: ${({ theme })=>theme.colors.neutral800};
|
|
67
|
+
|
|
68
|
+
&:hover {
|
|
69
|
+
background: ${({ theme })=>theme.colors.primary100};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
&:focus-visible {
|
|
73
|
+
outline: 2px solid ${({ theme })=>theme.colors.primary600};
|
|
74
|
+
outline-offset: -2px;
|
|
75
|
+
}
|
|
76
|
+
`;
|
|
77
|
+
const RemoveButton = styled.button`
|
|
78
|
+
border: none;
|
|
79
|
+
background: transparent;
|
|
80
|
+
display: inline-flex;
|
|
81
|
+
align-items: center;
|
|
82
|
+
padding: ${({ theme })=>`0 ${theme.spaces[2]}`};
|
|
83
|
+
cursor: pointer;
|
|
84
|
+
color: ${({ theme })=>theme.colors.neutral600};
|
|
85
|
+
|
|
86
|
+
&:hover {
|
|
87
|
+
color: ${({ theme })=>theme.colors.neutral800};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
&:focus-visible {
|
|
91
|
+
outline: 2px solid ${({ theme })=>theme.colors.primary600};
|
|
92
|
+
outline-offset: -2px;
|
|
93
|
+
}
|
|
94
|
+
`;
|
|
95
|
+
const TYPE_CONDITION_LABELS = {
|
|
96
|
+
is: {
|
|
97
|
+
id: getTranslationKey('list.filters.condition.is'),
|
|
98
|
+
defaultMessage: 'is'
|
|
99
|
+
},
|
|
100
|
+
isNot: {
|
|
101
|
+
id: getTranslationKey('list.filters.condition.is-not'),
|
|
102
|
+
defaultMessage: 'is not'
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const PRESET_CONDITION_LABELS = {
|
|
106
|
+
isExactly: {
|
|
107
|
+
id: getTranslationKey('list.filters.condition.is-exactly'),
|
|
108
|
+
defaultMessage: 'is exactly'
|
|
109
|
+
},
|
|
110
|
+
withinLast: {
|
|
111
|
+
id: getTranslationKey('list.filters.condition.within-last'),
|
|
112
|
+
defaultMessage: 'within the last'
|
|
113
|
+
},
|
|
114
|
+
notWithinLast: {
|
|
115
|
+
id: getTranslationKey('list.filters.condition.not-within-last'),
|
|
116
|
+
defaultMessage: 'not within the last'
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
const RANGE_CONDITION_LABELS = {
|
|
120
|
+
is: {
|
|
121
|
+
id: getTranslationKey('list.filters.condition.is'),
|
|
122
|
+
defaultMessage: 'is'
|
|
123
|
+
},
|
|
124
|
+
isNot: {
|
|
125
|
+
id: getTranslationKey('list.filters.condition.is-not'),
|
|
126
|
+
defaultMessage: 'is not'
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const SegmentPopover = ({ label, options, active, getOptionLabel, onPick })=>{
|
|
130
|
+
const [open, setOpen] = useState(false);
|
|
131
|
+
return /*#__PURE__*/ jsxs(Popover.Root, {
|
|
132
|
+
open: open,
|
|
133
|
+
onOpenChange: setOpen,
|
|
134
|
+
children: [
|
|
135
|
+
/*#__PURE__*/ jsx(Popover.Trigger, {
|
|
136
|
+
children: /*#__PURE__*/ jsx(Segment, {
|
|
137
|
+
type: "button",
|
|
138
|
+
$interactive: true,
|
|
139
|
+
children: /*#__PURE__*/ jsx(Typography, {
|
|
140
|
+
variant: "pi",
|
|
141
|
+
textColor: "neutral800",
|
|
142
|
+
children: label
|
|
143
|
+
})
|
|
144
|
+
})
|
|
145
|
+
}),
|
|
146
|
+
/*#__PURE__*/ jsx(PanelPopoverContent, {
|
|
147
|
+
children: /*#__PURE__*/ jsx(Flex, {
|
|
148
|
+
direction: "column",
|
|
149
|
+
alignItems: "stretch",
|
|
150
|
+
padding: 1,
|
|
151
|
+
children: options.map((option)=>/*#__PURE__*/ jsxs(OptionButton, {
|
|
152
|
+
type: "button",
|
|
153
|
+
onClick: ()=>{
|
|
154
|
+
onPick(option);
|
|
155
|
+
setOpen(false);
|
|
156
|
+
},
|
|
157
|
+
children: [
|
|
158
|
+
getOptionLabel(option),
|
|
159
|
+
option === active && /*#__PURE__*/ jsx(Check, {
|
|
160
|
+
"aria-hidden": true,
|
|
161
|
+
width: "1.6rem",
|
|
162
|
+
height: "1.6rem"
|
|
163
|
+
})
|
|
164
|
+
]
|
|
165
|
+
}, option))
|
|
166
|
+
})
|
|
167
|
+
})
|
|
168
|
+
]
|
|
169
|
+
});
|
|
170
|
+
};
|
|
171
|
+
const TypeValuePopover = ({ filter, onChange })=>{
|
|
172
|
+
const { formatMessage } = useIntl();
|
|
173
|
+
const [open, setOpen] = useState(false);
|
|
174
|
+
const label = filter.values.map((value)=>formatMessage(TYPE_LABELS[value])).join(', ');
|
|
175
|
+
const toggleValue = (value)=>{
|
|
176
|
+
const nextValues = filter.values.includes(value) ? filter.values.filter((v)=>v !== value) : [
|
|
177
|
+
...filter.values,
|
|
178
|
+
value
|
|
179
|
+
];
|
|
180
|
+
// At least one value stays checked — an empty badge is removed via ×, not here.
|
|
181
|
+
if (nextValues.length > 0) {
|
|
182
|
+
onChange({
|
|
183
|
+
...filter,
|
|
184
|
+
values: nextValues
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
return /*#__PURE__*/ jsxs(Popover.Root, {
|
|
189
|
+
open: open,
|
|
190
|
+
onOpenChange: setOpen,
|
|
191
|
+
children: [
|
|
192
|
+
/*#__PURE__*/ jsx(Popover.Trigger, {
|
|
193
|
+
children: /*#__PURE__*/ jsx(Segment, {
|
|
194
|
+
type: "button",
|
|
195
|
+
$interactive: true,
|
|
196
|
+
children: /*#__PURE__*/ jsx(Typography, {
|
|
197
|
+
variant: "pi",
|
|
198
|
+
textColor: "neutral800",
|
|
199
|
+
children: label
|
|
200
|
+
})
|
|
201
|
+
})
|
|
202
|
+
}),
|
|
203
|
+
/*#__PURE__*/ jsx(PanelPopoverContent, {
|
|
204
|
+
children: /*#__PURE__*/ jsx(Flex, {
|
|
205
|
+
direction: "column",
|
|
206
|
+
alignItems: "flex-start",
|
|
207
|
+
padding: 3,
|
|
208
|
+
gap: 2,
|
|
209
|
+
children: TYPE_VALUES.map((value)=>/*#__PURE__*/ jsx(Checkbox, {
|
|
210
|
+
checked: filter.values.includes(value),
|
|
211
|
+
onCheckedChange: ()=>toggleValue(value),
|
|
212
|
+
children: formatMessage(TYPE_LABELS[value])
|
|
213
|
+
}, value))
|
|
214
|
+
})
|
|
215
|
+
})
|
|
216
|
+
]
|
|
217
|
+
});
|
|
218
|
+
};
|
|
219
|
+
const DateValuePopover = ({ filter, onChange })=>{
|
|
220
|
+
const { formatMessage, formatDate } = useIntl();
|
|
221
|
+
const [open, setOpen] = useState(false);
|
|
222
|
+
// Parse as LOCAL calendar dates before formatting: react-intl would coerce
|
|
223
|
+
// the raw `YYYY-MM-DD` strings via `new Date(value)` = UTC midnight, showing
|
|
224
|
+
// the previous day in every timezone west of UTC while the query (also
|
|
225
|
+
// local, see buildAssetFilters) filters the day the user actually picked.
|
|
226
|
+
const label = filter.mode === 'preset' ? formatMessage(PRESET_LABELS[filter.preset]) : `${formatDate(parseCalendarDate(filter.from), {
|
|
227
|
+
day: '2-digit',
|
|
228
|
+
month: 'short'
|
|
229
|
+
})} - ${formatDate(parseCalendarDate(filter.to), {
|
|
230
|
+
day: '2-digit',
|
|
231
|
+
month: 'short',
|
|
232
|
+
year: 'numeric'
|
|
233
|
+
})}`;
|
|
234
|
+
return /*#__PURE__*/ jsxs(Popover.Root, {
|
|
235
|
+
open: open,
|
|
236
|
+
onOpenChange: setOpen,
|
|
237
|
+
children: [
|
|
238
|
+
/*#__PURE__*/ jsx(Popover.Trigger, {
|
|
239
|
+
children: /*#__PURE__*/ jsx(Segment, {
|
|
240
|
+
type: "button",
|
|
241
|
+
$interactive: true,
|
|
242
|
+
children: /*#__PURE__*/ jsx(Typography, {
|
|
243
|
+
variant: "pi",
|
|
244
|
+
textColor: "neutral800",
|
|
245
|
+
children: label
|
|
246
|
+
})
|
|
247
|
+
})
|
|
248
|
+
}),
|
|
249
|
+
/*#__PURE__*/ jsx(PanelPopoverContent, {
|
|
250
|
+
children: filter.mode === 'preset' ? /*#__PURE__*/ jsx(Flex, {
|
|
251
|
+
direction: "column",
|
|
252
|
+
alignItems: "stretch",
|
|
253
|
+
padding: 1,
|
|
254
|
+
children: DATE_PRESETS.map((preset)=>/*#__PURE__*/ jsxs(OptionButton, {
|
|
255
|
+
type: "button",
|
|
256
|
+
onClick: ()=>{
|
|
257
|
+
onChange({
|
|
258
|
+
...filter,
|
|
259
|
+
preset
|
|
260
|
+
});
|
|
261
|
+
setOpen(false);
|
|
262
|
+
},
|
|
263
|
+
children: [
|
|
264
|
+
formatMessage(PRESET_LABELS[preset]),
|
|
265
|
+
preset === filter.preset && /*#__PURE__*/ jsx(Check, {
|
|
266
|
+
"aria-hidden": true,
|
|
267
|
+
width: "1.6rem",
|
|
268
|
+
height: "1.6rem"
|
|
269
|
+
})
|
|
270
|
+
]
|
|
271
|
+
}, preset))
|
|
272
|
+
}) : /*#__PURE__*/ jsx(DateRangeCalendar, {
|
|
273
|
+
from: filter.from,
|
|
274
|
+
to: filter.to,
|
|
275
|
+
onSelect: (from, to)=>{
|
|
276
|
+
onChange({
|
|
277
|
+
...filter,
|
|
278
|
+
from,
|
|
279
|
+
to
|
|
280
|
+
});
|
|
281
|
+
setOpen(false);
|
|
282
|
+
}
|
|
283
|
+
})
|
|
284
|
+
})
|
|
285
|
+
]
|
|
286
|
+
});
|
|
287
|
+
};
|
|
288
|
+
const FilterBadge = ({ filter, onChange, onRemove })=>{
|
|
289
|
+
const { formatMessage } = useIntl();
|
|
290
|
+
const fieldLabel = filter.kind === 'type' ? formatMessage({
|
|
291
|
+
id: getTranslationKey('list.filters.field.type'),
|
|
292
|
+
defaultMessage: 'Type'
|
|
293
|
+
}) : formatMessage(DATE_FIELD_LABELS[filter.field]);
|
|
294
|
+
return /*#__PURE__*/ jsxs(BadgePill, {
|
|
295
|
+
alignItems: "stretch",
|
|
296
|
+
"data-testid": "filter-badge",
|
|
297
|
+
children: [
|
|
298
|
+
/*#__PURE__*/ jsx(FieldSegment, {
|
|
299
|
+
children: /*#__PURE__*/ jsx(Typography, {
|
|
300
|
+
variant: "pi",
|
|
301
|
+
textColor: "neutral600",
|
|
302
|
+
children: fieldLabel
|
|
303
|
+
})
|
|
304
|
+
}),
|
|
305
|
+
filter.kind === 'type' && /*#__PURE__*/ jsxs(Fragment, {
|
|
306
|
+
children: [
|
|
307
|
+
/*#__PURE__*/ jsx(SegmentPopover, {
|
|
308
|
+
label: formatMessage(TYPE_CONDITION_LABELS[filter.condition]),
|
|
309
|
+
options: [
|
|
310
|
+
'is',
|
|
311
|
+
'isNot'
|
|
312
|
+
],
|
|
313
|
+
active: filter.condition,
|
|
314
|
+
getOptionLabel: (option)=>formatMessage(TYPE_CONDITION_LABELS[option]),
|
|
315
|
+
onPick: (condition)=>onChange({
|
|
316
|
+
...filter,
|
|
317
|
+
condition
|
|
318
|
+
})
|
|
319
|
+
}),
|
|
320
|
+
/*#__PURE__*/ jsx(TypeValuePopover, {
|
|
321
|
+
filter: filter,
|
|
322
|
+
onChange: onChange
|
|
323
|
+
})
|
|
324
|
+
]
|
|
325
|
+
}),
|
|
326
|
+
filter.kind === 'date' && filter.mode === 'preset' && /*#__PURE__*/ jsxs(Fragment, {
|
|
327
|
+
children: [
|
|
328
|
+
/*#__PURE__*/ jsx(SegmentPopover, {
|
|
329
|
+
label: formatMessage(PRESET_CONDITION_LABELS[filter.condition]),
|
|
330
|
+
options: [
|
|
331
|
+
'isExactly',
|
|
332
|
+
'withinLast',
|
|
333
|
+
'notWithinLast'
|
|
334
|
+
],
|
|
335
|
+
active: filter.condition,
|
|
336
|
+
getOptionLabel: (option)=>formatMessage(PRESET_CONDITION_LABELS[option]),
|
|
337
|
+
onPick: (condition)=>onChange({
|
|
338
|
+
...filter,
|
|
339
|
+
condition
|
|
340
|
+
})
|
|
341
|
+
}),
|
|
342
|
+
/*#__PURE__*/ jsx(DateValuePopover, {
|
|
343
|
+
filter: filter,
|
|
344
|
+
onChange: onChange
|
|
345
|
+
})
|
|
346
|
+
]
|
|
347
|
+
}),
|
|
348
|
+
filter.kind === 'date' && filter.mode === 'range' && /*#__PURE__*/ jsxs(Fragment, {
|
|
349
|
+
children: [
|
|
350
|
+
/*#__PURE__*/ jsx(SegmentPopover, {
|
|
351
|
+
label: formatMessage(RANGE_CONDITION_LABELS[filter.condition]),
|
|
352
|
+
options: [
|
|
353
|
+
'is',
|
|
354
|
+
'isNot'
|
|
355
|
+
],
|
|
356
|
+
active: filter.condition,
|
|
357
|
+
getOptionLabel: (option)=>formatMessage(RANGE_CONDITION_LABELS[option]),
|
|
358
|
+
onPick: (condition)=>onChange({
|
|
359
|
+
...filter,
|
|
360
|
+
condition
|
|
361
|
+
})
|
|
362
|
+
}),
|
|
363
|
+
/*#__PURE__*/ jsx(DateValuePopover, {
|
|
364
|
+
filter: filter,
|
|
365
|
+
onChange: onChange
|
|
366
|
+
})
|
|
367
|
+
]
|
|
368
|
+
}),
|
|
369
|
+
/*#__PURE__*/ jsx(RemoveButton, {
|
|
370
|
+
type: "button",
|
|
371
|
+
onClick: onRemove,
|
|
372
|
+
"aria-label": formatMessage({
|
|
373
|
+
id: getTranslationKey('list.filters.remove'),
|
|
374
|
+
defaultMessage: 'Remove {filter} filter'
|
|
375
|
+
}, {
|
|
376
|
+
filter: fieldLabel
|
|
377
|
+
}),
|
|
378
|
+
children: /*#__PURE__*/ jsx(Cross, {
|
|
379
|
+
width: "1.2rem",
|
|
380
|
+
height: "1.2rem",
|
|
381
|
+
"aria-hidden": true
|
|
382
|
+
})
|
|
383
|
+
})
|
|
384
|
+
]
|
|
385
|
+
});
|
|
386
|
+
};
|
|
387
|
+
const FilterBadges = ({ listFilters })=>{
|
|
388
|
+
const { filters, updateFilter, removeFilter } = listFilters;
|
|
389
|
+
if (filters.length === 0) {
|
|
390
|
+
return null;
|
|
391
|
+
}
|
|
392
|
+
return /*#__PURE__*/ jsx(Flex, {
|
|
393
|
+
gap: 2,
|
|
394
|
+
wrap: "wrap",
|
|
395
|
+
paddingTop: 2,
|
|
396
|
+
"data-testid": "filter-badges",
|
|
397
|
+
children: filters.map((filter, index)=>/*#__PURE__*/ jsx(FilterBadge, {
|
|
398
|
+
filter: filter,
|
|
399
|
+
onChange: (next)=>updateFilter(index, next),
|
|
400
|
+
onRemove: ()=>removeFilter(index)
|
|
401
|
+
}, index))
|
|
402
|
+
});
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
export { FilterBadges };
|
|
406
|
+
//# sourceMappingURL=FilterBadges.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterBadges.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/FilterBadges.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { Checkbox, Flex, Popover, Typography } from '@strapi/design-system';\nimport { Check, Cross } 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 DateFilter,\n type DatePreset,\n type ListFilter,\n type ListFilters,\n type PresetCondition,\n type RangeCondition,\n type TypeCondition,\n type TypeFilter,\n type TypeValue,\n} from '../hooks/useListFilters';\nimport { parseCalendarDate } from '../utils/buildAssetFilters';\n\nimport { DateRangeCalendar } from './DateRangeCalendar';\nimport { DATE_FIELD_LABELS, FILTER_PANEL_WIDTH, PRESET_LABELS, TYPE_LABELS } from './FilterMenu';\n\nimport type { MessageDescriptor } from 'react-intl';\n\n/**\n * Row of applied-filter badges under the toolbar. A badge has three segments —\n * field (static), condition (click → select popover), value (click → type\n * checkboxes / preset list / range calendar) — plus a remove button.\n */\n\nconst BadgePill = styled(Flex)`\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.neutral0};\n overflow: hidden;\n`;\n\nconst Segment = styled.button<{ $interactive?: boolean }>`\n border: none;\n background: transparent;\n font: inherit;\n padding: ${({ theme }) => `${theme.spaces[1]} ${theme.spaces[2]}`};\n cursor: ${({ $interactive }) => ($interactive ? 'pointer' : 'default')};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral200};\n\n ${({ $interactive, theme }) =>\n $interactive && `&:hover { background: ${theme.colors.primary100}; }`}\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n`;\n\n// Non-interactive field segment (first pill cell).\nconst FieldSegment = styled.span`\n display: inline-flex;\n align-items: center;\n padding: ${({ theme }) => `${theme.spaces[1]} ${theme.spaces[2]}`};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral200};\n`;\n\n// Badge popovers mirror the filter-menu panels: same fixed width, same font.\nconst PanelPopoverContent = styled(Popover.Content)`\n width: ${FILTER_PANEL_WIDTH};\n`;\n\n// Option row inside a segment popover — sized like a DS Menu.Item so the badge\n// dropdowns read as the same control family as the filter menu.\nconst OptionButton = styled.button`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: ${({ theme }) => theme.spaces[4]};\n width: 100%;\n border: none;\n background: transparent;\n font-size: ${({ theme }) => theme.fontSizes[2]};\n line-height: ${({ theme }) => theme.lineHeights[4]};\n font-family: inherit;\n text-align: left;\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[4]}`};\n border-radius: ${({ theme }) => theme.borderRadius};\n cursor: pointer;\n color: ${({ theme }) => theme.colors.neutral800};\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n`;\n\nconst RemoveButton = styled.button`\n border: none;\n background: transparent;\n display: inline-flex;\n align-items: center;\n padding: ${({ theme }) => `0 ${theme.spaces[2]}`};\n cursor: pointer;\n color: ${({ theme }) => theme.colors.neutral600};\n\n &:hover {\n color: ${({ theme }) => theme.colors.neutral800};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n`;\n\nconst TYPE_CONDITION_LABELS: Record<TypeCondition, MessageDescriptor> = {\n is: { id: getTranslationKey('list.filters.condition.is'), defaultMessage: 'is' },\n isNot: { id: getTranslationKey('list.filters.condition.is-not'), defaultMessage: 'is not' },\n};\n\nconst PRESET_CONDITION_LABELS: Record<PresetCondition, MessageDescriptor> = {\n isExactly: {\n id: getTranslationKey('list.filters.condition.is-exactly'),\n defaultMessage: 'is exactly',\n },\n withinLast: {\n id: getTranslationKey('list.filters.condition.within-last'),\n defaultMessage: 'within the last',\n },\n notWithinLast: {\n id: getTranslationKey('list.filters.condition.not-within-last'),\n defaultMessage: 'not within the last',\n },\n};\n\nconst RANGE_CONDITION_LABELS: Record<RangeCondition, MessageDescriptor> = {\n is: { id: getTranslationKey('list.filters.condition.is'), defaultMessage: 'is' },\n isNot: { id: getTranslationKey('list.filters.condition.is-not'), defaultMessage: 'is not' },\n};\n\n/** A small single-choice popover listing options with a check on the active one. */\ninterface SegmentPopoverProps<T extends string> {\n label: string;\n options: T[];\n active: T;\n getOptionLabel: (option: T) => string;\n onPick: (option: T) => void;\n}\n\nconst SegmentPopover = <T extends string>({\n label,\n options,\n active,\n getOptionLabel,\n onPick,\n}: SegmentPopoverProps<T>) => {\n const [open, setOpen] = useState(false);\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger>\n <Segment type=\"button\" $interactive>\n <Typography variant=\"pi\" textColor=\"neutral800\">\n {label}\n </Typography>\n </Segment>\n </Popover.Trigger>\n <PanelPopoverContent>\n <Flex direction=\"column\" alignItems=\"stretch\" padding={1}>\n {options.map((option) => (\n <OptionButton\n key={option}\n type=\"button\"\n onClick={() => {\n onPick(option);\n setOpen(false);\n }}\n >\n {getOptionLabel(option)}\n {option === active && <Check aria-hidden width=\"1.6rem\" height=\"1.6rem\" />}\n </OptionButton>\n ))}\n </Flex>\n </PanelPopoverContent>\n </Popover.Root>\n );\n};\n\nconst TypeValuePopover = ({\n filter,\n onChange,\n}: {\n filter: TypeFilter;\n onChange: (next: TypeFilter) => void;\n}) => {\n const { formatMessage } = useIntl();\n const [open, setOpen] = useState(false);\n\n const label = filter.values.map((value) => formatMessage(TYPE_LABELS[value])).join(', ');\n\n const toggleValue = (value: TypeValue) => {\n const nextValues = filter.values.includes(value)\n ? filter.values.filter((v) => v !== value)\n : [...filter.values, value];\n\n // At least one value stays checked — an empty badge is removed via ×, not here.\n if (nextValues.length > 0) {\n onChange({ ...filter, values: nextValues });\n }\n };\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger>\n <Segment type=\"button\" $interactive>\n <Typography variant=\"pi\" textColor=\"neutral800\">\n {label}\n </Typography>\n </Segment>\n </Popover.Trigger>\n <PanelPopoverContent>\n <Flex direction=\"column\" alignItems=\"flex-start\" padding={3} gap={2}>\n {TYPE_VALUES.map((value) => (\n <Checkbox\n key={value}\n checked={filter.values.includes(value)}\n onCheckedChange={() => toggleValue(value)}\n >\n {formatMessage(TYPE_LABELS[value])}\n </Checkbox>\n ))}\n </Flex>\n </PanelPopoverContent>\n </Popover.Root>\n );\n};\n\nconst DateValuePopover = ({\n filter,\n onChange,\n}: {\n filter: DateFilter;\n onChange: (next: DateFilter) => void;\n}) => {\n const { formatMessage, formatDate } = useIntl();\n const [open, setOpen] = useState(false);\n\n // Parse as LOCAL calendar dates before formatting: react-intl would coerce\n // the raw `YYYY-MM-DD` strings via `new Date(value)` = UTC midnight, showing\n // the previous day in every timezone west of UTC while the query (also\n // local, see buildAssetFilters) filters the day the user actually picked.\n const label =\n filter.mode === 'preset'\n ? formatMessage(PRESET_LABELS[filter.preset])\n : `${formatDate(parseCalendarDate(filter.from), {\n day: '2-digit',\n month: 'short',\n })} - ${formatDate(parseCalendarDate(filter.to), {\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n })}`;\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger>\n <Segment type=\"button\" $interactive>\n <Typography variant=\"pi\" textColor=\"neutral800\">\n {label}\n </Typography>\n </Segment>\n </Popover.Trigger>\n <PanelPopoverContent>\n {filter.mode === 'preset' ? (\n <Flex direction=\"column\" alignItems=\"stretch\" padding={1}>\n {DATE_PRESETS.map((preset: DatePreset) => (\n <OptionButton\n key={preset}\n type=\"button\"\n onClick={() => {\n onChange({ ...filter, preset });\n setOpen(false);\n }}\n >\n {formatMessage(PRESET_LABELS[preset])}\n {preset === filter.preset && <Check aria-hidden width=\"1.6rem\" height=\"1.6rem\" />}\n </OptionButton>\n ))}\n </Flex>\n ) : (\n <DateRangeCalendar\n from={filter.from}\n to={filter.to}\n onSelect={(from, to) => {\n onChange({ ...filter, from, to });\n setOpen(false);\n }}\n />\n )}\n </PanelPopoverContent>\n </Popover.Root>\n );\n};\n\nconst FilterBadge = ({\n filter,\n onChange,\n onRemove,\n}: {\n filter: ListFilter;\n onChange: (next: ListFilter) => void;\n onRemove: () => void;\n}) => {\n const { formatMessage } = useIntl();\n\n const fieldLabel =\n filter.kind === 'type'\n ? formatMessage({ id: getTranslationKey('list.filters.field.type'), defaultMessage: 'Type' })\n : formatMessage(DATE_FIELD_LABELS[filter.field]);\n\n return (\n <BadgePill alignItems=\"stretch\" data-testid=\"filter-badge\">\n <FieldSegment>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {fieldLabel}\n </Typography>\n </FieldSegment>\n\n {filter.kind === 'type' && (\n <>\n <SegmentPopover\n label={formatMessage(TYPE_CONDITION_LABELS[filter.condition])}\n options={['is', 'isNot'] as TypeCondition[]}\n active={filter.condition}\n getOptionLabel={(option) => formatMessage(TYPE_CONDITION_LABELS[option])}\n onPick={(condition) => onChange({ ...filter, condition })}\n />\n <TypeValuePopover filter={filter} onChange={onChange} />\n </>\n )}\n\n {filter.kind === 'date' && filter.mode === 'preset' && (\n <>\n <SegmentPopover\n label={formatMessage(PRESET_CONDITION_LABELS[filter.condition])}\n options={['isExactly', 'withinLast', 'notWithinLast'] as PresetCondition[]}\n active={filter.condition}\n getOptionLabel={(option) => formatMessage(PRESET_CONDITION_LABELS[option])}\n onPick={(condition) => onChange({ ...filter, condition })}\n />\n <DateValuePopover filter={filter} onChange={onChange} />\n </>\n )}\n\n {filter.kind === 'date' && filter.mode === 'range' && (\n <>\n <SegmentPopover\n label={formatMessage(RANGE_CONDITION_LABELS[filter.condition])}\n options={['is', 'isNot'] as RangeCondition[]}\n active={filter.condition}\n getOptionLabel={(option) => formatMessage(RANGE_CONDITION_LABELS[option])}\n onPick={(condition) => onChange({ ...filter, condition })}\n />\n <DateValuePopover filter={filter} onChange={onChange} />\n </>\n )}\n\n <RemoveButton\n type=\"button\"\n onClick={onRemove}\n aria-label={formatMessage(\n {\n id: getTranslationKey('list.filters.remove'),\n defaultMessage: 'Remove {filter} filter',\n },\n { filter: fieldLabel }\n )}\n >\n <Cross width=\"1.2rem\" height=\"1.2rem\" aria-hidden />\n </RemoveButton>\n </BadgePill>\n );\n};\n\ninterface FilterBadgesProps {\n listFilters: ListFilters;\n}\n\nexport const FilterBadges = ({ listFilters }: FilterBadgesProps) => {\n const { filters, updateFilter, removeFilter } = listFilters;\n\n if (filters.length === 0) {\n return null;\n }\n\n return (\n <Flex gap={2} wrap=\"wrap\" paddingTop={2} data-testid=\"filter-badges\">\n {filters.map((filter, index) => (\n <FilterBadge\n // Position is identity: badges are edited/removed by index.\n key={index}\n filter={filter}\n onChange={(next) => updateFilter(index, next)}\n onRemove={() => removeFilter(index)}\n />\n ))}\n </Flex>\n );\n};\n"],"names":["BadgePill","styled","Flex","theme","colors","neutral200","borderRadius","neutral0","Segment","button","spaces","$interactive","primary100","primary600","FieldSegment","span","PanelPopoverContent","Popover","Content","FILTER_PANEL_WIDTH","OptionButton","fontSizes","lineHeights","neutral800","RemoveButton","neutral600","TYPE_CONDITION_LABELS","is","id","getTranslationKey","defaultMessage","isNot","PRESET_CONDITION_LABELS","isExactly","withinLast","notWithinLast","RANGE_CONDITION_LABELS","SegmentPopover","label","options","active","getOptionLabel","onPick","open","setOpen","useState","_jsxs","Root","onOpenChange","_jsx","Trigger","type","Typography","variant","textColor","direction","alignItems","padding","map","option","onClick","Check","aria-hidden","width","height","TypeValuePopover","filter","onChange","formatMessage","useIntl","values","value","TYPE_LABELS","join","toggleValue","nextValues","includes","v","length","gap","TYPE_VALUES","Checkbox","checked","onCheckedChange","DateValuePopover","formatDate","mode","PRESET_LABELS","preset","parseCalendarDate","from","day","month","to","year","DATE_PRESETS","DateRangeCalendar","onSelect","FilterBadge","onRemove","fieldLabel","kind","DATE_FIELD_LABELS","field","data-testid","_Fragment","condition","aria-label","Cross","FilterBadges","listFilters","filters","updateFilter","removeFilter","wrap","paddingTop","index","next"],"mappings":"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"}
|