mirror of
https://github.com/twentyhq/twenty.git
synced 2024-12-24 04:23:57 +03:00
fix: dropdowns should have a max-height & padding from screen (#8055)
Fixes: #6105 ### Problem - The dropdown gets clipped when the number of filters increases. ### Solution - Added scroll property to the ```DropdownMenu``` - Added size middleware to the floating UI hook. - Provided padding of 20px to the size middleware, so that it maintains distance from the bottom of the screen. [Screencast from 2024-10-25 13-47-04.webm](https://github.com/user-attachments/assets/c2315ee2-6092-4c4a-8126-dba7ac3bf49b) --------- Co-authored-by: martmull <martmull@hotmail.fr>
This commit is contained in:
parent
cabae4c462
commit
e648d942a2
@ -4,9 +4,10 @@ import {
|
||||
FloatingPortal,
|
||||
offset,
|
||||
Placement,
|
||||
size,
|
||||
useFloating,
|
||||
} from '@floating-ui/react';
|
||||
import { MouseEvent, useEffect, useRef } from 'react';
|
||||
import { MouseEvent, useEffect, useRef, useState } from 'react';
|
||||
import { Keys } from 'react-hotkeys-hook';
|
||||
import { Key } from 'ts-key-enum';
|
||||
|
||||
@ -21,6 +22,7 @@ import { isDefined } from '~/utils/isDefined';
|
||||
import { useDropdown } from '../hooks/useDropdown';
|
||||
import { useInternalHotkeyScopeManagement } from '../hooks/useInternalHotkeyScopeManagement';
|
||||
|
||||
import { flushSync } from 'react-dom';
|
||||
import { DropdownMenu } from './DropdownMenu';
|
||||
import { DropdownOnToggleEffect } from './DropdownOnToggleEffect';
|
||||
|
||||
@ -63,6 +65,9 @@ export const Dropdown = ({
|
||||
onOpen,
|
||||
}: DropdownProps) => {
|
||||
const containerRef = useRef<HTMLDivElement>(null);
|
||||
const [maxHeight, setMaxHeight] = useState<string | number | undefined>(
|
||||
undefined,
|
||||
);
|
||||
|
||||
const {
|
||||
isDropdownOpen,
|
||||
@ -84,7 +89,16 @@ export const Dropdown = ({
|
||||
|
||||
const { refs, floatingStyles, placement } = useFloating({
|
||||
placement: dropdownPlacement,
|
||||
middleware: [flip(), ...offsetMiddlewares],
|
||||
middleware: [
|
||||
flip(),
|
||||
size({
|
||||
padding: 12 + 20, // 12px for padding bottom, 20px for dropdown bottom margin target
|
||||
apply: ({ availableHeight }) => {
|
||||
flushSync(() => setMaxHeight(availableHeight));
|
||||
},
|
||||
}),
|
||||
...offsetMiddlewares,
|
||||
],
|
||||
whileElementsMounted: autoUpdate,
|
||||
strategy: dropdownStrategy,
|
||||
});
|
||||
@ -155,7 +169,7 @@ export const Dropdown = ({
|
||||
width={dropdownMenuWidth ?? dropdownWidth}
|
||||
data-select-disable
|
||||
ref={refs.setFloating}
|
||||
style={floatingStyles}
|
||||
style={{ ...floatingStyles, maxHeight }}
|
||||
>
|
||||
{dropdownComponents}
|
||||
</DropdownMenu>
|
||||
@ -167,7 +181,7 @@ export const Dropdown = ({
|
||||
width={dropdownMenuWidth ?? dropdownWidth}
|
||||
data-select-disable
|
||||
ref={refs.setFloating}
|
||||
style={floatingStyles}
|
||||
style={{ ...floatingStyles, maxHeight }}
|
||||
>
|
||||
{dropdownComponents}
|
||||
</DropdownMenu>
|
||||
|
@ -25,6 +25,8 @@ const StyledDropdownMenu = styled.div<{
|
||||
|
||||
flex-direction: column;
|
||||
z-index: 30;
|
||||
overflow-y: scroll;
|
||||
overflow-x: hidden;
|
||||
width: ${({ width = 160 }) =>
|
||||
typeof width === 'number' ? `${width}px` : width};
|
||||
`;
|
||||
|
Loading…
Reference in New Issue
Block a user