Chore: First table column should not be hideable (#1711)

* First table column should not be hideable

Co-authored-by: v1b3m <vibenjamin6@gmail.com>
Co-authored-by: chiazokam <chiazokamecheta@gmail.com>

* Refactor according to review

Co-authored-by: v1b3m <vibenjamin6@gmail.com>
Co-authored-by: chiazokam <chiazokamecheta@gmail.com>

---------

Co-authored-by: v1b3m <vibenjamin6@gmail.com>
Co-authored-by: chiazokam <chiazokamecheta@gmail.com>
This commit is contained in:
gitstart-twenty
2023-09-25 11:26:41 +01:00
committed by GitHub
parent 0ce11b6908
commit fabbe7ddf2
6 changed files with 117 additions and 74 deletions

View File

@ -12,6 +12,7 @@ type OwnProps = {
column: ColumnDefinition<ViewFieldMetadata>; column: ColumnDefinition<ViewFieldMetadata>;
isFirstColumn: boolean; isFirstColumn: boolean;
isLastColumn: boolean; isLastColumn: boolean;
primaryColumnKey: string;
}; };
const StyledTitle = styled.div` const StyledTitle = styled.div`
@ -44,6 +45,7 @@ export const ColumnHead = ({
column, column,
isFirstColumn, isFirstColumn,
isLastColumn, isLastColumn,
primaryColumnKey,
}: OwnProps) => { }: OwnProps) => {
const theme = useTheme(); const theme = useTheme();
@ -63,6 +65,7 @@ export const ColumnHead = ({
column={column} column={column}
isFirstColumn={isFirstColumn} isFirstColumn={isFirstColumn}
isLastColumn={isLastColumn} isLastColumn={isLastColumn}
primaryColumnKey={primaryColumnKey}
/> />
</> </>
); );

View File

@ -158,6 +158,8 @@ export const EntityTableHeader = () => {
setIsColumnMenuOpen((previousValue) => !previousValue); setIsColumnMenuOpen((previousValue) => !previousValue);
}, []); }, []);
const primaryColumn = visibleTableColumns[0];
return ( return (
<StyledTableHead data-select-disable> <StyledTableHead data-select-disable>
<tr> <tr>
@ -183,8 +185,9 @@ export const EntityTableHeader = () => {
> >
<ColumnHead <ColumnHead
column={column} column={column}
isFirstColumn={index === 0} isFirstColumn={index === 1}
isLastColumn={index === visibleTableColumns.length - 1} isLastColumn={index === visibleTableColumns.length - 1}
primaryColumnKey={primaryColumn.key}
/> />
<StyledResizeHandler <StyledResizeHandler

View File

@ -1,15 +1,10 @@
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { DropdownButton } from '@/ui/dropdown/components/DropdownButton'; import { DropdownButton } from '@/ui/dropdown/components/DropdownButton';
import { StyledDropdownMenu } from '@/ui/dropdown/components/StyledDropdownMenu'; import {
import { StyledDropdownMenuItemsContainer } from '@/ui/dropdown/components/StyledDropdownMenuItemsContainer'; EntityTableHeaderOptionsProps,
import { useDropdownButton } from '@/ui/dropdown/hooks/useDropdownButton'; TableColumnDropdownMenu,
import { ViewFieldMetadata } from '@/ui/editable-field/types/ViewField'; } from '@/ui/table/components/TableColumnDropdownMenu';
import { IconArrowLeft, IconArrowRight, IconEyeOff } from '@/ui/icon';
import { MenuItem } from '@/ui/menu-item/components/MenuItem';
import { useTableColumns } from '../hooks/useTableColumns';
import { ColumnDefinition } from '../types/ColumnDefinition';
const StyledDropdownContainer = styled.div` const StyledDropdownContainer = styled.div`
left: 0px; left: 0px;
@ -17,70 +12,24 @@ const StyledDropdownContainer = styled.div`
top: 32px; top: 32px;
z-index: 1; z-index: 1;
`; `;
type EntityTableHeaderOptionsProps = {
column: ColumnDefinition<ViewFieldMetadata>;
isFirstColumn: boolean;
isLastColumn: boolean;
};
export const EntityTableHeaderOptions = ({ export const EntityTableHeaderOptions = ({
column, column,
isFirstColumn, isFirstColumn,
isLastColumn, isLastColumn,
primaryColumnKey,
}: EntityTableHeaderOptionsProps) => { }: EntityTableHeaderOptionsProps) => {
const {
handleColumnVisibilityChange,
handleColumnLeftMove,
handleColumnRightMove,
} = useTableColumns();
const { closeDropdownButton } = useDropdownButton({
dropdownId: column.key + '-header',
});
const handleColumnMoveLeft = () => {
closeDropdownButton();
if (isFirstColumn) {
return;
}
handleColumnLeftMove(column);
};
const handleColumnMoveRight = () => {
closeDropdownButton();
if (isLastColumn) {
return;
}
handleColumnRightMove(column);
};
const handleColumnVisibility = () => {
handleColumnVisibilityChange(column);
};
return ( return (
<StyledDropdownContainer> <StyledDropdownContainer>
<DropdownButton <DropdownButton
dropdownId={column.key + '-header'} dropdownId={column.key + '-header'}
dropdownComponents={ dropdownComponents={
<StyledDropdownMenu> <TableColumnDropdownMenu
<StyledDropdownMenuItemsContainer> column={column}
<MenuItem isFirstColumn={isFirstColumn}
LeftIcon={IconArrowLeft} isLastColumn={isLastColumn}
onClick={handleColumnMoveLeft} primaryColumnKey={primaryColumnKey}
text="Move left" />
/>
<MenuItem
LeftIcon={IconArrowRight}
onClick={handleColumnMoveRight}
text="Move right"
/>
<MenuItem
LeftIcon={IconEyeOff}
onClick={handleColumnVisibility}
text="Hide"
/>
</StyledDropdownMenuItemsContainer>
</StyledDropdownMenu>
} }
dropdownHotkeyScope={{ scope: column.key + '-header' }} dropdownHotkeyScope={{ scope: column.key + '-header' }}
/> />

View File

@ -0,0 +1,82 @@
import { StyledDropdownMenu } from '@/ui/dropdown/components/StyledDropdownMenu';
import { StyledDropdownMenuItemsContainer } from '@/ui/dropdown/components/StyledDropdownMenuItemsContainer';
import { useDropdownButton } from '@/ui/dropdown/hooks/useDropdownButton';
import { ViewFieldMetadata } from '@/ui/editable-field/types/ViewField';
import { IconArrowLeft, IconArrowRight, IconEyeOff } from '@/ui/icon';
import { MenuItem } from '@/ui/menu-item/components/MenuItem';
import { ColumnHeadDropdownId } from '../constants/ColumnHeadDropdownId';
import { useTableColumns } from '../hooks/useTableColumns';
import { ColumnDefinition } from '../types/ColumnDefinition';
export type EntityTableHeaderOptionsProps = {
column: ColumnDefinition<ViewFieldMetadata>;
isFirstColumn: boolean;
isLastColumn: boolean;
primaryColumnKey: string;
};
export const TableColumnDropdownMenu = ({
column,
isFirstColumn,
isLastColumn,
primaryColumnKey,
}: EntityTableHeaderOptionsProps) => {
const {
handleColumnVisibilityChange,
handleColumnLeftMove,
handleColumnRightMove,
} = useTableColumns();
const { closeDropdownButton } = useDropdownButton({
dropdownId: ColumnHeadDropdownId,
});
const handleColumnMoveLeft = () => {
closeDropdownButton();
if (isFirstColumn) {
return;
}
handleColumnLeftMove(column);
};
const handleColumnMoveRight = () => {
closeDropdownButton();
if (isLastColumn) {
return;
}
handleColumnRightMove(column);
};
const handleColumnVisibility = () => {
handleColumnVisibilityChange(column);
};
return column.key === primaryColumnKey ? (
<></>
) : (
<StyledDropdownMenu>
<StyledDropdownMenuItemsContainer>
{!isFirstColumn && (
<MenuItem
LeftIcon={IconArrowLeft}
onClick={handleColumnMoveLeft}
text="Move left"
/>
)}
{!isLastColumn && (
<MenuItem
LeftIcon={IconArrowRight}
onClick={handleColumnMoveRight}
text="Move right"
/>
)}
<MenuItem
LeftIcon={IconEyeOff}
onClick={handleColumnVisibility}
text="Hide"
/>
</StyledDropdownMenuItemsContainer>
</StyledDropdownMenu>
);
};

View File

@ -95,7 +95,7 @@ export const TableOptionsDropdownContent = () => {
const handleReorderField: OnDragEndResponder = useCallback( const handleReorderField: OnDragEndResponder = useCallback(
(result) => { (result) => {
if (!result.destination) { if (!result.destination || result.destination.index === 0) {
return; return;
} }

View File

@ -41,6 +41,18 @@ export const ViewFieldsVisibilityDropdownSection = <
const handleOnDrag = (result: DropResult, provided: ResponderProvided) => { const handleOnDrag = (result: DropResult, provided: ResponderProvided) => {
onDragEnd?.(result, provided); onDragEnd?.(result, provided);
}; };
const getIconButtons = (index: number, field: Field) => {
if (index !== 0) {
return [
{
Icon: field.isVisible ? IconMinus : IconPlus,
onClick: () => onVisibilityChange(field),
},
];
}
};
return ( return (
<> <>
<StyledDropdownMenuSubheader>{title}</StyledDropdownMenuSubheader> <StyledDropdownMenuSubheader>{title}</StyledDropdownMenuSubheader>
@ -56,6 +68,7 @@ export const ViewFieldsVisibilityDropdownSection = <
key={field.key} key={field.key}
draggableId={field.key} draggableId={field.key}
index={index} index={index}
isDragDisabled={index === 0}
> >
{(draggableProvided) => { {(draggableProvided) => {
const draggableStyle = const draggableStyle =
@ -79,17 +92,10 @@ export const ViewFieldsVisibilityDropdownSection = <
{...draggableProvided.dragHandleProps} {...draggableProvided.dragHandleProps}
> >
<MenuItem <MenuItem
isDraggable={isDraggable} isDraggable={index !== 0 && isDraggable}
key={field.key} key={field.key}
LeftIcon={field.Icon} LeftIcon={field.Icon}
iconButtons={[ iconButtons={getIconButtons(index, field)}
{
Icon: field.isVisible
? IconMinus
: IconPlus,
onClick: () => onVisibilityChange(field),
},
]}
text={field.name} text={field.name}
/> />
</div> </div>