fix: Dropdown Overlapping Sidebar on Column Header Click in Horizontal Table When Scrolling (#8287)

fixes : #8272

---------

Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
This commit is contained in:
Vardhaman Bhandari
2024-11-18 19:49:04 +05:30
committed by GitHub
parent 8b8b9fe55b
commit 5115022355
5 changed files with 64 additions and 12 deletions

View File

@@ -10,6 +10,8 @@ import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper';
import { useSaveCurrentViewFields } from '@/views/hooks/useSaveCurrentViewFields';
import { mapColumnDefinitionsToViewFields } from '@/views/utils/mapColumnDefinitionToViewField';
import { isScrollEnabledForRecordTableState } from '@/object-record/record-table/states/isScrollEnabledForRecordTableState';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { RecordUpdateContext } from '../contexts/EntityUpdateMutationHookContext';
import { useRecordTable } from '../hooks/useRecordTable';
@@ -46,6 +48,11 @@ export const RecordTableWithWrappers = ({
recordTableId,
viewBarId,
}: RecordTableWithWrappersProps) => {
const isScrollEnabledForRecordTable = useRecoilComponentValueV2(
isScrollEnabledForRecordTableState,
recordTableId,
);
const { resetTableRowSelection, selectAllRows } = useRecordTable({
recordTableId,
});
@@ -80,7 +87,11 @@ export const RecordTableWithWrappers = ({
return (
<EntityDeleteContext.Provider value={deleteOneRecord}>
<ScrollWrapper contextProviderName="recordTableWithWrappers">
<ScrollWrapper
enableXScroll={isScrollEnabledForRecordTable.enableXScroll}
enableYScroll={isScrollEnabledForRecordTable.enableYScroll}
contextProviderName="recordTableWithWrappers"
>
<RecordUpdateContext.Provider value={updateRecordMutation}>
<StyledTableWithHeader>
<StyledTableContainer>

View File

@@ -1,12 +1,12 @@
import styled from '@emotion/styled';
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
import { isScrollEnabledForRecordTableState } from '@/object-record/record-table/states/isScrollEnabledForRecordTableState';
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
import { RecordTableColumnHeadDropdownMenu } from './RecordTableColumnHeadDropdownMenu';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import styled from '@emotion/styled';
import { useCallback } from 'react';
import { RecordTableColumnHead } from './RecordTableColumnHead';
import { RecordTableColumnHeadDropdownMenu } from './RecordTableColumnHeadDropdownMenu';
type RecordTableColumnHeadWithDropdownProps = {
column: ColumnDefinition<FieldMetadata>;
@@ -14,7 +14,6 @@ type RecordTableColumnHeadWithDropdownProps = {
const StyledDropdown = styled(Dropdown)`
display: flex;
flex: 1;
z-index: ${({ theme }) => theme.lastLayerZIndex};
`;
@@ -22,8 +21,28 @@ const StyledDropdown = styled(Dropdown)`
export const RecordTableColumnHeadWithDropdown = ({
column,
}: RecordTableColumnHeadWithDropdownProps) => {
const setIsScrollEnabledForRecordTable = useSetRecoilComponentStateV2(
isScrollEnabledForRecordTableState,
);
const handleDropdownOpen = useCallback(() => {
setIsScrollEnabledForRecordTable({
enableXScroll: false,
enableYScroll: false,
});
}, [setIsScrollEnabledForRecordTable]);
const handleDropdownClose = useCallback(() => {
setIsScrollEnabledForRecordTable({
enableXScroll: true,
enableYScroll: true,
});
}, [setIsScrollEnabledForRecordTable]);
return (
<StyledDropdown
onOpen={handleDropdownOpen}
onClose={handleDropdownClose}
dropdownId={column.fieldMetadataId + '-header'}
clickableComponent={<RecordTableColumnHead column={column} />}
dropdownComponents={<RecordTableColumnHeadDropdownMenu column={column} />}

View File

@@ -0,0 +1,17 @@
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
export type ScrollEnabled = {
enableXScroll: boolean;
enableYScroll: boolean;
};
export const isScrollEnabledForRecordTableState =
createComponentStateV2<ScrollEnabled>({
key: 'isScrollEnabledForRecordTableState',
defaultValue: {
enableXScroll: true,
enableYScroll: true,
},
componentInstanceContext: RecordTableComponentInstanceContext,
});

View File

@@ -126,7 +126,6 @@ export const Dropdown = ({
listenerId: dropdownId,
callback: () => {
onClickOutside?.();
if (isDropdownOpen) {
closeDropdown();
}
@@ -141,10 +140,12 @@ export const Dropdown = ({
useScopedHotkeys(
[Key.Escape],
() => {
closeDropdown();
if (isDropdownOpen) {
closeDropdown();
}
},
dropdownHotkeyScope.scope,
[closeDropdown],
[closeDropdown, isDropdownOpen],
);
return (

View File

@@ -45,7 +45,6 @@ export const ScrollWrapper = ({
useScrollStates(contextProviderName);
const setScrollTop = useSetRecoilState(scrollTopComponentState);
const setScrollLeft = useSetRecoilState(scrollLeftComponentState);
const handleScroll = (overlayScroll: OverlayScrollbars) => {
const target = overlayScroll.elements().scrollOffsetElement;
setScrollTop(target.scrollTop);
@@ -78,7 +77,12 @@ export const ScrollWrapper = ({
}, [instance, setOverlayScrollbars]);
return (
<Context.Provider value={{ ref: scrollableRef, id: contextProviderName }}>
<Context.Provider
value={{
ref: scrollableRef,
id: contextProviderName,
}}
>
<StyledScrollWrapper ref={scrollableRef} className={className}>
{children}
</StyledScrollWrapper>