Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add "expand_all" toggle to datagrid header #8152

Merged
merged 12 commits into from
Sep 12, 2022
21 changes: 21 additions & 0 deletions packages/ra-core/src/controller/list/useExpanded.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,24 @@ export const useExpanded = (

return [expanded, toggleExpanded];
};

export const useExpandedMultiple = (
fzaninotto marked this conversation as resolved.
Show resolved Hide resolved
hiaselhans marked this conversation as resolved.
Show resolved Hide resolved
resource: string,
ids: Identifier[]
): [boolean, () => void] => {
const [expandedIds, setExpandedIds] = useStore<Identifier[]>(
`${resource}.datagrid.expanded`,
[]
);

const expanded = expandedIds.some(id => ids.some(id2 => id2 == id));
hiaselhans marked this conversation as resolved.
Show resolved Hide resolved
hiaselhans marked this conversation as resolved.
Show resolved Hide resolved

const setExpanded = useCallback(() => {
const filtered = expandedIds.filter(
hiaselhans marked this conversation as resolved.
Show resolved Hide resolved
expanded_id => !ids.some(id => id == expanded_id)
);
setExpandedIds(expanded ? filtered : filtered.concat(ids));
}, [expandedIds, setExpandedIds, expanded, ids]);

return [expanded, setExpanded];
};
17 changes: 16 additions & 1 deletion packages/ra-ui-materialui/src/list/datagrid/DatagridHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import * as React from 'react';
import { Children, isValidElement, useCallback } from 'react';
import PropTypes from 'prop-types';
import {
useExpandedMultiple,
useListContext,
useResourceContext,
Identifier,
Expand All @@ -12,6 +13,7 @@ import {
import { Checkbox, TableCell, TableHead, TableRow } from '@mui/material';
import clsx from 'clsx';

import ExpandRowButton from './ExpandRowButton';
import DatagridHeaderCell from './DatagridHeaderCell';
import { DatagridClasses } from './useDatagridStyles';

Expand Down Expand Up @@ -52,6 +54,11 @@ export const DatagridHeader = (props: DatagridHeaderProps) => {

const updateSort = setSort ? updateSortCallback : null;

const [expanded, toggleExpanded] = useExpandedMultiple(
hiaselhans marked this conversation as resolved.
Show resolved Hide resolved
resource,
data.map(record => record.id)
);

const handleSelectAll = useCallback(
event =>
onSelect(
Expand Down Expand Up @@ -93,7 +100,15 @@ export const DatagridHeader = (props: DatagridHeaderProps) => {
DatagridClasses.headerCell,
DatagridClasses.expandHeader
)}
/>
>
<ExpandRowButton
className={clsx(DatagridClasses.expandIcon, {
[DatagridClasses.expanded]: expanded,
})}
expanded={expanded}
onClick={toggleExpanded}
/>
</TableCell>
)}
{hasBulkActions && selectedIds && (
<TableCell
Expand Down