Skip to content

Commit

Permalink
Fix
Browse files Browse the repository at this point in the history
  • Loading branch information
flaviendelangle committed May 20, 2024
1 parent 53a9959 commit 0e0444b
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 83 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,98 +2,105 @@ import * as React from 'react';
import Box from '@mui/material/Box';
import { RichTreeView } from '@mui/x-tree-view/RichTreeView';
import { TreeViewBaseItem } from '@mui/x-tree-view/models';
import {useTreeViewApiRef} from "@mui/x-tree-view/hooks";
import { useTreeViewApiRef } from '@mui/x-tree-view/hooks';

const MUI_X_PRODUCTS: TreeViewBaseItem[] = [
{
id: 'grid',
label: 'Data Grid',
children: [
{ id: 'grid-community', label: '@mui/x-data-grid' },
{ id: 'grid-pro', label: '@mui/x-data-grid-pro' },
{ id: 'grid-premium', label: '@mui/x-data-grid-premium' },
],
},
{
id: 'pickers',
label: 'Date and Time Pickers',
children: [
{ id: 'pickers-community', label: '@mui/x-date-pickers' },
{ id: 'pickers-pro', label: '@mui/x-date-pickers-pro' },
],
},
{
id: 'charts',
label: 'Charts',
children: [{ id: 'charts-community', label: '@mui/x-charts' }],
},
{
id: 'tree-view',
label: 'Tree View',
children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }],
},
{
id: 'grid',
label: 'Data Grid',
children: [
{ id: 'grid-community', label: '@mui/x-data-grid' },
{ id: 'grid-pro', label: '@mui/x-data-grid-pro' },
{ id: 'grid-premium', label: '@mui/x-data-grid-premium' },
],
},
{
id: 'pickers',
label: 'Date and Time Pickers',
children: [
{ id: 'pickers-community', label: '@mui/x-date-pickers' },
{ id: 'pickers-pro', label: '@mui/x-date-pickers-pro' },
],
},
{
id: 'charts',
label: 'Charts',
children: [{ id: 'charts-community', label: '@mui/x-charts' }],
},
{
id: 'tree-view',
label: 'Tree View',
children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }],
},
];

function getItemDescendantsIds (item: TreeViewBaseItem) {
const ids: string[] = []
item.children?.forEach(child => {
ids.push(child.id)
ids.push(...getItemDescendantsIds(child))
})
function getItemDescendantsIds(item: TreeViewBaseItem) {
const ids: string[] = [];
item.children?.forEach((child) => {
ids.push(child.id);
ids.push(...getItemDescendantsIds(child));
});

return ids;
return ids;
}

export default function ParentChildrenSelectionRelationship() {
const [selectedItems, setSelectedItems] = React.useState<string[]>([]);
const toggledItemRef = React.useRef<{ [itemId: string]: boolean}>({})
const apiRef = useTreeViewApiRef()
const [selectedItems, setSelectedItems] = React.useState<string[]>([]);
const toggledItemRef = React.useRef<{ [itemId: string]: boolean }>({});
const apiRef = useTreeViewApiRef();

const handleItemSelectionToggle = (
event: React.SyntheticEvent,
itemId: string,
isSelected: boolean,
) => {
toggledItemRef.current[itemId] = isSelected
};
const handleItemSelectionToggle = (
event: React.SyntheticEvent,
itemId: string,
isSelected: boolean,
) => {
toggledItemRef.current[itemId] = isSelected;
};

const handleSelectedItemsChange = (
event: React.SyntheticEvent,
newSelectedItems: string[]) => {
setSelectedItems(newSelectedItems)
const handleSelectedItemsChange = (
event: React.SyntheticEvent,
newSelectedItems: string[],
) => {
setSelectedItems(newSelectedItems);

// Select / unselect the children of the toggled item
const itemsToSelect: string[] = [];
const itemsToUnSelect: { [itemId: string]: boolean } = {};
Object.entries(toggledItemRef.current).forEach(([itemId, isSelected]) => {
const item = apiRef.current!.getItem(itemId)
if (isSelected) {
itemsToSelect.push(...getItemDescendantsIds(item))
} else {
getItemDescendantsIds(item).forEach(descendantId => {
itemsToUnSelect[descendantId] = true
})
}
})
// Select / unselect the children of the toggled item
const itemsToSelect: string[] = [];
const itemsToUnSelect: { [itemId: string]: boolean } = {};
Object.entries(toggledItemRef.current).forEach(([itemId, isSelected]) => {
const item = apiRef.current!.getItem(itemId);
if (isSelected) {
itemsToSelect.push(...getItemDescendantsIds(item));
} else {
getItemDescendantsIds(item).forEach((descendantId) => {
itemsToUnSelect[descendantId] = true;
});
}
});

const newSelectedItemsWithChildren = Array.from(new Set([...newSelectedItems, ...itemsToSelect].filter(itemId => !itemsToUnSelect[itemId])))
const newSelectedItemsWithChildren = Array.from(
new Set(
[...newSelectedItems, ...itemsToSelect].filter(
(itemId) => !itemsToUnSelect[itemId],
),
),
);

setSelectedItems(newSelectedItemsWithChildren)
setSelectedItems(newSelectedItemsWithChildren);

toggledItemRef.current = {}
}
toggledItemRef.current = {};
};

return (
<Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}>
<RichTreeView
multiSelect
checkboxSelection
apiRef={apiRef}
items={MUI_X_PRODUCTS}
selectedItems={selectedItems}
onSelectedItemsChange={handleSelectedItemsChange}
onItemSelectionToggle={handleItemSelectionToggle}
/>
</Box>
);
return (
<Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}>
<RichTreeView
multiSelect
checkboxSelection
apiRef={apiRef}
items={MUI_X_PRODUCTS}
selectedItems={selectedItems}
onSelectedItemsChange={handleSelectedItemsChange}
onItemSelectionToggle={handleItemSelectionToggle}
/>
</Box>
);
}
2 changes: 1 addition & 1 deletion docs/data/tree-view/rich-tree-view/selection/selection.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ Especially if you already have a use case for this component,
or if you are facing a pain point with your current solution.
:::

If you cannot wait for the official implementation,
If you cannot wait for the official implementation,
you can create your own custom solution using the `selectedItems`,
`onSelectedItemsChange` and `onItemSelectionToggle` props:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ export interface GridAggregationFunction<V = any, AV = V> {
getCellValue?: (params: GridAggregationGetCellValueParams) => V;
}

export interface GridAggregationParams<V = any> {
interface GridAggregationParams<V = any> {
values: (V | undefined)[];
groupId: GridRowId;
field: GridColDef['field'];
Expand Down
2 changes: 1 addition & 1 deletion scripts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ pnpm release:changelog
> `<!--/ DO_NOT_REMOVE /-->`
> This string needs to stay where it gets inserted for the automated discord announcement to work.
You can also provide the github token by setting `process.env.GITHUB_TOKEN` variable.
You can also provide the GitHub token by setting `process.env.GITHUB_TOKEN` variable.

In case of a problem, another method to generate the changelog is available at the end of this page.

Expand Down
1 change: 0 additions & 1 deletion scripts/x-data-grid-premium.exports.json
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,6 @@
{ "name": "gridAggregationLookupSelector", "kind": "Variable" },
{ "name": "GridAggregationModel", "kind": "TypeAlias" },
{ "name": "gridAggregationModelSelector", "kind": "Variable" },
{ "name": "GridAggregationParams", "kind": "Interface" },
{ "name": "GridAggregationPosition", "kind": "TypeAlias" },
{ "name": "GridAggregationRule", "kind": "Interface" },
{ "name": "GridAggregationRules", "kind": "TypeAlias" },
Expand Down

0 comments on commit 0e0444b

Please sign in to comment.