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