diff --git a/front/src/modules/ui/data/view-bar/components/MultipleFiltersDropdownContent.tsx b/front/src/modules/ui/data/view-bar/components/MultipleFiltersDropdownContent.tsx index b31f9421b..0cd002eee 100644 --- a/front/src/modules/ui/data/view-bar/components/MultipleFiltersDropdownContent.tsx +++ b/front/src/modules/ui/data/view-bar/components/MultipleFiltersDropdownContent.tsx @@ -14,6 +14,7 @@ import { FilterDropdownNumberSearchInput } from './FilterDropdownNumberSearchInp import { FilterDropdownOperandButton } from './FilterDropdownOperandButton'; import { FilterDropdownOperandSelect } from './FilterDropdownOperandSelect'; import { FilterDropdownTextSearchInput } from './FilterDropdownTextSearchInput'; +import { MultipleFiltersDropdownFilterOnFilterChangedEffect } from './MultipleFiltersDropdownFilterOnFilterChangedEffect'; export const MultipleFiltersDropdownContent = () => { const { ViewBarRecoilScopeContext } = useViewBarContext(); @@ -62,6 +63,11 @@ export const MultipleFiltersDropdownContent = () => { ) )} + ); }; diff --git a/front/src/modules/ui/data/view-bar/components/MultipleFiltersDropdownFilterOnFilterChangedEffect.tsx b/front/src/modules/ui/data/view-bar/components/MultipleFiltersDropdownFilterOnFilterChangedEffect.tsx new file mode 100644 index 000000000..cd68c503c --- /dev/null +++ b/front/src/modules/ui/data/view-bar/components/MultipleFiltersDropdownFilterOnFilterChangedEffect.tsx @@ -0,0 +1,23 @@ +import { useEffect } from 'react'; + +import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; + +export const MultipleFiltersDropdownFilterOnFilterChangedEffect = ({ + filterDefinitionUsedInDropdownType, +}: { + filterDefinitionUsedInDropdownType: string | undefined; +}) => { + const { setDropdownWidth } = useDropdown(); + + useEffect(() => { + switch (filterDefinitionUsedInDropdownType) { + case 'date': + setDropdownWidth(280); + break; + default: + setDropdownWidth(160); + } + }, [filterDefinitionUsedInDropdownType, setDropdownWidth]); + + return null; +}; diff --git a/front/src/modules/ui/layout/dropdown/components/Dropdown.tsx b/front/src/modules/ui/layout/dropdown/components/Dropdown.tsx index 46378b850..9bd883498 100644 --- a/front/src/modules/ui/layout/dropdown/components/Dropdown.tsx +++ b/front/src/modules/ui/layout/dropdown/components/Dropdown.tsx @@ -1,6 +1,12 @@ import { useRef } from 'react'; import { Keys } from 'react-hotkeys-hook'; -import { flip, offset, Placement, useFloating } from '@floating-ui/react'; +import { + autoUpdate, + flip, + offset, + Placement, + useFloating, +} from '@floating-ui/react'; import { Key } from 'ts-key-enum'; import { HotkeyEffect } from '@/ui/utilities/hotkey/components/HotkeyEffect'; @@ -12,7 +18,7 @@ import { useDropdown } from '../hooks/useDropdown'; import { useInternalHotkeyScopeManagement } from '../hooks/useInternalHotkeyScopeManagement'; import { DropdownMenu } from './DropdownMenu'; -import { DropdownToggleEffect } from './DropdownToggleEffect'; +import { DropdownOnToggleEffect } from './DropdownOnToggleEffect'; type DropdownProps = { clickableComponent?: JSX.Element | JSX.Element[]; @@ -33,7 +39,7 @@ type DropdownProps = { export const Dropdown = ({ clickableComponent, dropdownComponents, - dropdownMenuWidth = 160, + dropdownMenuWidth, hotkey, dropdownHotkeyScope, dropdownPlacement = 'bottom-end', @@ -44,8 +50,10 @@ export const Dropdown = ({ }: DropdownProps) => { const containerRef = useRef(null); - const { isDropdownOpen, toggleDropdown, closeDropdown } = useDropdown(); + const { isDropdownOpen, toggleDropdown, closeDropdown, dropdownWidth } = + useDropdown(); + const dropdownWidthState = dropdownMenuWidth ?? dropdownWidth; const offsetMiddlewares = []; if (dropdownOffset.x) { offsetMiddlewares.push(offset({ crossAxis: dropdownOffset.x })); @@ -58,6 +66,7 @@ export const Dropdown = ({ const { refs, floatingStyles } = useFloating({ placement: dropdownPlacement, middleware: [flip(), ...offsetMiddlewares], + whileElementsMounted: autoUpdate, }); const handleHotkeyTriggered = () => { @@ -103,7 +112,7 @@ export const Dropdown = ({ )} {isDropdownOpen && ( )} - + ); }; diff --git a/front/src/modules/ui/layout/dropdown/components/DropdownToggleEffect.tsx b/front/src/modules/ui/layout/dropdown/components/DropdownOnToggleEffect.tsx similarity index 91% rename from front/src/modules/ui/layout/dropdown/components/DropdownToggleEffect.tsx rename to front/src/modules/ui/layout/dropdown/components/DropdownOnToggleEffect.tsx index ecd676980..9ffb63e3a 100644 --- a/front/src/modules/ui/layout/dropdown/components/DropdownToggleEffect.tsx +++ b/front/src/modules/ui/layout/dropdown/components/DropdownOnToggleEffect.tsx @@ -2,7 +2,7 @@ import { useEffect } from 'react'; import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; -export const DropdownToggleEffect = ({ +export const DropdownOnToggleEffect = ({ onDropdownClose, onDropdownOpen, }: { diff --git a/front/src/modules/ui/layout/dropdown/hooks/useDropdown.ts b/front/src/modules/ui/layout/dropdown/hooks/useDropdown.ts index 1e38288a0..7ddf10bc1 100644 --- a/front/src/modules/ui/layout/dropdown/hooks/useDropdown.ts +++ b/front/src/modules/ui/layout/dropdown/hooks/useDropdown.ts @@ -25,6 +25,8 @@ export const useDropdown = (props?: UseDropdownProps) => { setDropdownHotkeyScope, isDropdownOpen, setIsDropdownOpen, + dropdownWidth, + setDropdownWidth, } = useDropdownStates({ scopeId, }); @@ -61,5 +63,7 @@ export const useDropdown = (props?: UseDropdownProps) => { scopeId, dropdownHotkeyScope, setDropdownHotkeyScope, + dropdownWidth, + setDropdownWidth, }; }; diff --git a/front/src/modules/ui/layout/dropdown/hooks/useDropdownStates.ts b/front/src/modules/ui/layout/dropdown/hooks/useDropdownStates.ts index d60ac3c55..461ca1b3f 100644 --- a/front/src/modules/ui/layout/dropdown/hooks/useDropdownStates.ts +++ b/front/src/modules/ui/layout/dropdown/hooks/useDropdownStates.ts @@ -1,6 +1,7 @@ import { useRecoilScopedStateV2 } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedStateV2'; import { dropdownHotkeyScopeScopedState } from '../states/dropdownHotkeyScopeScopedState'; +import { dropdownWidthScopedState } from '../states/dropdownWidthScopedState'; import { isDropdownOpenScopedState } from '../states/isDropdownOpenScopedState'; export const useDropdownStates = ({ scopeId }: { scopeId: string }) => { @@ -14,10 +15,17 @@ export const useDropdownStates = ({ scopeId }: { scopeId: string }) => { scopeId, ); + const [dropdownWidth, setDropdownWidth] = useRecoilScopedStateV2( + dropdownWidthScopedState, + scopeId, + ); + return { isDropdownOpen, setIsDropdownOpen, dropdownHotkeyScope, setDropdownHotkeyScope, + dropdownWidth, + setDropdownWidth, }; }; diff --git a/front/src/modules/ui/layout/dropdown/states/dropdownWidthScopedState.ts b/front/src/modules/ui/layout/dropdown/states/dropdownWidthScopedState.ts new file mode 100644 index 000000000..b620687c6 --- /dev/null +++ b/front/src/modules/ui/layout/dropdown/states/dropdownWidthScopedState.ts @@ -0,0 +1,6 @@ +import { createScopedState } from '@/ui/utilities/recoil-scope/utils/createScopedState'; + +export const dropdownWidthScopedState = createScopedState({ + key: 'dropdownWidthScopedState', + defaultValue: 160, +});