Skip to content

Commit

Permalink
[#4923] Fix focus returning to document body when hiding a column via…
Browse files Browse the repository at this point in the history
… header
  • Loading branch information
cee-chen committed Jan 11, 2022
1 parent 2f44ab9 commit d29d938
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 3 deletions.
5 changes: 4 additions & 1 deletion src/components/datagrid/body/header/column_actions.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {

describe('getColumnActions', () => {
const setVisibleColumns = jest.fn();
const focusFirstVisibleInteractiveCell = jest.fn();
const setIsPopoverOpen = jest.fn();
const switchColumnPos = jest.fn();

Expand All @@ -28,6 +29,7 @@ describe('getColumnActions', () => {
schema: {},
schemaDetectors,
setVisibleColumns,
focusFirstVisibleInteractiveCell,
setIsPopoverOpen,
sorting: undefined,
switchColumnPos,
Expand Down Expand Up @@ -104,9 +106,10 @@ describe('getColumnActions', () => {
`);
});

it('sets column visibility on click', () => {
it('hides the current column on click and refocuses into the grid', () => {
callActionOnClick(hideColumn);
expect(setVisibleColumns).toHaveBeenCalledWith(['A', 'C']);
expect(focusFirstVisibleInteractiveCell).toHaveBeenCalled();
});
});

Expand Down
15 changes: 13 additions & 2 deletions src/components/datagrid/body/header/column_actions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
EuiDataGridSchema,
EuiDataGridSchemaDetector,
EuiDataGridSorting,
DataGridFocusContextShape,
} from '../../data_grid_types';
import { EuiI18n } from '../../../i18n';
import { EuiListGroupItemProps } from '../../../list_group';
Expand All @@ -28,6 +29,7 @@ interface GetColumnActions {
schema: EuiDataGridSchema;
schemaDetectors: EuiDataGridSchemaDetector[];
setVisibleColumns: (columnId: string[]) => void;
focusFirstVisibleInteractiveCell: DataGridFocusContextShape['focusFirstVisibleInteractiveCell'];
setIsPopoverOpen: (value: boolean) => void;
sorting: EuiDataGridSorting | undefined;
switchColumnPos: (colFromId: string, colToId: string) => void;
Expand All @@ -39,6 +41,7 @@ export const getColumnActions = ({
schema,
schemaDetectors,
setVisibleColumns,
focusFirstVisibleInteractiveCell,
setIsPopoverOpen,
sorting,
switchColumnPos,
Expand All @@ -52,6 +55,7 @@ export const getColumnActions = ({
column,
columns,
setVisibleColumns,
focusFirstVisibleInteractiveCell,
}),
...getSortColumnActions({
column,
Expand Down Expand Up @@ -85,20 +89,27 @@ export const getColumnActions = ({
*/
type HideColumnAction = Pick<
GetColumnActions,
'column' | 'columns' | 'setVisibleColumns'
| 'column'
| 'columns'
| 'setVisibleColumns'
| 'focusFirstVisibleInteractiveCell'
>;

export const getHideColumnAction = ({
column,
columns,
setVisibleColumns,
focusFirstVisibleInteractiveCell,
}: HideColumnAction): EuiListGroupItemProps[] => {
const items = [];

const onClickHideColumn = () =>
const onClickHideColumn = () => {
setVisibleColumns(
columns.filter((col) => col.id !== column.id).map((col) => col.id)
);
// Since we hid the current column, we need to manually set focus back onto the grid
focusFirstVisibleInteractiveCell();
};

const action = {
label: (
Expand Down
4 changes: 4 additions & 0 deletions src/components/datagrid/body/header/data_grid_header_cell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { EuiIcon } from '../../../icon';
import { EuiListGroup } from '../../../list_group';
import { EuiPopover } from '../../../popover';
import { DataGridSortingContext } from '../../utils/sorting';
import { DataGridFocusContext } from '../../utils/focus';
import { EuiDataGridHeaderCellProps } from '../../data_grid_types';

import { getColumnActions } from './column_actions';
Expand Down Expand Up @@ -58,6 +59,8 @@ export const EuiDataGridHeaderCell: FunctionComponent<EuiDataGridHeaderCellProps
} = {};
const screenReaderId = useGeneratedHtmlId();

const { focusFirstVisibleInteractiveCell } = useContext(DataGridFocusContext);

const { sorting } = useContext(DataGridSortingContext);
let sortString;
if (sorting) {
Expand Down Expand Up @@ -92,6 +95,7 @@ export const EuiDataGridHeaderCell: FunctionComponent<EuiDataGridHeaderCellProps
schema,
schemaDetectors,
setVisibleColumns,
focusFirstVisibleInteractiveCell,
setIsPopoverOpen,
sorting,
switchColumnPos,
Expand Down
1 change: 1 addition & 0 deletions src/components/datagrid/data_grid_types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ export interface DataGridFocusContextShape {
cell: EuiDataGridFocusedCell,
updateFocus: Function
) => () => void;
focusFirstVisibleInteractiveCell: () => void;
}

export type CommonGridProps = CommonProps &
Expand Down
1 change: 1 addition & 0 deletions src/components/datagrid/utils/__mocks__/focus_context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ export const mockFocusContext = {
onFocusUpdate: jest.fn(),
setFocusedCell: jest.fn(),
setIsFocusedCellInView: jest.fn(),
focusFirstVisibleInteractiveCell: jest.fn(),
};
2 changes: 2 additions & 0 deletions src/components/datagrid/utils/focus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ export const DataGridFocusContext = createContext<DataGridFocusContextShape>({
setFocusedCell: () => {},
setIsFocusedCellInView: () => {},
onFocusUpdate: () => () => {},
focusFirstVisibleInteractiveCell: () => {},
});

type FocusProps = Pick<HTMLAttributes<HTMLDivElement>, 'tabIndex' | 'onFocus'>;
Expand Down Expand Up @@ -127,6 +128,7 @@ export const useFocus = ({
focusedCell,
setFocusedCell,
setIsFocusedCellInView,
focusFirstVisibleInteractiveCell,
focusProps,
};
};
Expand Down

0 comments on commit d29d938

Please sign in to comment.