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

[TreeView] Add support for checkbox selection #11452

Merged
merged 43 commits into from
May 13, 2024
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
4fabbc7
[tree view] Add support for checkbox selection
flaviendelangle Dec 19, 2023
54a5400
Add doc
flaviendelangle Dec 19, 2023
16f994a
Merge
flaviendelangle Jan 2, 2024
5ae80ce
Merge branch 'next' into checkbox-selection
flaviendelangle Jan 2, 2024
19a94fe
Fix
flaviendelangle Jan 2, 2024
271dfb8
Merge branch 'next' into checkbox-selection
flaviendelangle Jan 3, 2024
8baa24e
Review Jose
flaviendelangle Jan 3, 2024
1478eda
Merge
flaviendelangle Jan 3, 2024
55aca5c
Merge branch 'next' into checkbox-selection
flaviendelangle Jan 4, 2024
3486d4f
Remove context builder hook
flaviendelangle Jan 4, 2024
d38cd25
Work
flaviendelangle Jan 4, 2024
f60f388
Merge
flaviendelangle Jan 8, 2024
e046107
Fix
flaviendelangle Jan 8, 2024
b871e66
Fix
flaviendelangle Jan 8, 2024
4589b20
Merge
flaviendelangle Jan 10, 2024
95d59aa
Merge
flaviendelangle Jan 10, 2024
99eefc3
Merge branch 'next' into checkbox-selection
flaviendelangle Jan 11, 2024
9d6634d
Fix
flaviendelangle Jan 11, 2024
72a7b9b
Merge
flaviendelangle Jan 12, 2024
c127986
Merge branch 'next' into checkbox-selection
flaviendelangle Jan 15, 2024
9bb46fb
Merge
flaviendelangle Jan 18, 2024
c1e8338
Fix doc
flaviendelangle Jan 18, 2024
af55ea5
Fix doc
flaviendelangle Jan 18, 2024
fa13038
Fix doc
flaviendelangle Jan 18, 2024
c2b010f
Merge
flaviendelangle Feb 23, 2024
f97f3da
Merge
flaviendelangle Mar 20, 2024
16a3b09
Remove padding on checkbox
flaviendelangle Mar 20, 2024
636e3d1
Work
flaviendelangle Mar 20, 2024
fe94a0c
Fix
flaviendelangle Mar 20, 2024
b7c59cc
Merge branch 'master' into checkbox-selection
flaviendelangle Mar 21, 2024
b9a5807
Merge branch 'master' into checkbox-selection
flaviendelangle Apr 23, 2024
eeaeac5
Fix
flaviendelangle Apr 23, 2024
223160d
Add support for TreeItem2
flaviendelangle Apr 23, 2024
9f398a7
Try fix keyboard navigation
flaviendelangle Apr 23, 2024
449fdde
Fix
flaviendelangle Apr 23, 2024
6deb56e
Fix
flaviendelangle Apr 23, 2024
02982b7
Remove interactive class
flaviendelangle Apr 24, 2024
d508e87
Fix
flaviendelangle Apr 24, 2024
f816031
Fix
flaviendelangle Apr 24, 2024
59c5454
Add test and fine tune behaviors
flaviendelangle Apr 24, 2024
48d3259
Fix
flaviendelangle Apr 24, 2024
8b73595
Merge branch 'master' into checkbox-selection
flaviendelangle Apr 25, 2024
1aa1a58
Merge branch 'master' into checkbox-selection
flaviendelangle May 13, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import * as React from 'react';
import Box from '@mui/material/Box';
import { RichTreeView } from '@mui/x-tree-view';

const MUI_X_PRODUCTS = [
{
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' }],
},
];

export default function CheckboxMultiSelection() {
return (
<Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}>
<RichTreeView multiSelect checkboxSelection items={MUI_X_PRODUCTS} />
</Box>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import * as React from 'react';
import Box from '@mui/material/Box';
import { RichTreeView, TreeViewBaseItem } from '@mui/x-tree-view';

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' }],
},
];

export default function CheckboxMultiSelection() {
return (
<Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}>
<RichTreeView multiSelect checkboxSelection items={MUI_X_PRODUCTS} />
</Box>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<RichTreeView multiSelect checkboxSelection items={MUI_X_PRODUCTS} />
41 changes: 41 additions & 0 deletions docs/data/tree-view/rich-tree-view/selection/CheckboxSelection.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import * as React from 'react';
import Box from '@mui/material/Box';
import { RichTreeView } from '@mui/x-tree-view';

const MUI_X_PRODUCTS = [
{
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' }],
},
];

export default function CheckboxSelection() {
return (
<Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}>
<RichTreeView checkboxSelection items={MUI_X_PRODUCTS} />
</Box>
);
}
41 changes: 41 additions & 0 deletions docs/data/tree-view/rich-tree-view/selection/CheckboxSelection.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import * as React from 'react';
import Box from '@mui/material/Box';
import { RichTreeView, TreeViewBaseItem } from '@mui/x-tree-view';

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' }],
},
];

export default function CheckboxSelection() {
return (
<Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}>
<RichTreeView checkboxSelection items={MUI_X_PRODUCTS} />
</Box>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<RichTreeView checkboxSelection items={MUI_X_PRODUCTS} />
10 changes: 10 additions & 0 deletions docs/data/tree-view/rich-tree-view/selection/selection.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,16 @@ The Tree View also supports multi-selection:

{{"demo": "MultiSelectTreeView.js"}}

## Checkbox selection

To activate checkbox selection set `checkboxSelection={true}`:
flaviendelangle marked this conversation as resolved.
Show resolved Hide resolved

{{"demo": "CheckboxSelection.js"}}

This is also compatible with multi selection:

{{"demo": "CheckboxMultiSelection.js"}}

## Controlled selection

Use the `selectedNodes` prop to control the selected items.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import * as React from 'react';
import Box from '@mui/material/Box';
import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView';
import { TreeItem } from '@mui/x-tree-view/TreeItem';

export default function CheckboxMultiSelection() {
return (
<Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}>
<SimpleTreeView multiSelect checkboxSelection>
<TreeItem nodeId="grid" label="Data Grid">
<TreeItem nodeId="grid-community" label="@mui/x-data-grid" />
<TreeItem nodeId="grid-pro" label="@mui/x-data-grid-pro" />
<TreeItem nodeId="grid-premium" label="@mui/x-data-grid-premium" />
</TreeItem>
<TreeItem nodeId="pickers" label="Date and Time Pickers">
<TreeItem nodeId="pickers-community" label="@mui/x-date-pickers" />
<TreeItem nodeId="pickers-pro" label="@mui/x-date-pickers-pro" />
</TreeItem>
<TreeItem nodeId="charts" label="Charts">
<TreeItem nodeId="charts-community" label="@mui/x-charts" />
</TreeItem>
<TreeItem nodeId="tree-view" label="Tree View">
<TreeItem nodeId="tree-view-community" label="@mui/x-tree-view" />
</TreeItem>
</SimpleTreeView>
</Box>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import * as React from 'react';
import Box from '@mui/material/Box';
import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView';
import { TreeItem } from '@mui/x-tree-view/TreeItem';

export default function CheckboxMultiSelection() {
return (
<Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}>
<SimpleTreeView multiSelect checkboxSelection>
<TreeItem nodeId="grid" label="Data Grid">
<TreeItem nodeId="grid-community" label="@mui/x-data-grid" />
<TreeItem nodeId="grid-pro" label="@mui/x-data-grid-pro" />
<TreeItem nodeId="grid-premium" label="@mui/x-data-grid-premium" />
</TreeItem>
<TreeItem nodeId="pickers" label="Date and Time Pickers">
<TreeItem nodeId="pickers-community" label="@mui/x-date-pickers" />
<TreeItem nodeId="pickers-pro" label="@mui/x-date-pickers-pro" />
</TreeItem>
<TreeItem nodeId="charts" label="Charts">
<TreeItem nodeId="charts-community" label="@mui/x-charts" />
</TreeItem>
<TreeItem nodeId="tree-view" label="Tree View">
<TreeItem nodeId="tree-view-community" label="@mui/x-tree-view" />
</TreeItem>
</SimpleTreeView>
</Box>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import * as React from 'react';
import Box from '@mui/material/Box';
import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView';
import { TreeItem } from '@mui/x-tree-view/TreeItem';

export default function CheckboxSelection() {
return (
<Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}>
<SimpleTreeView checkboxSelection>
<TreeItem nodeId="grid" label="Data Grid">
<TreeItem nodeId="grid-community" label="@mui/x-data-grid" />
<TreeItem nodeId="grid-pro" label="@mui/x-data-grid-pro" />
<TreeItem nodeId="grid-premium" label="@mui/x-data-grid-premium" />
</TreeItem>
<TreeItem nodeId="pickers" label="Date and Time Pickers">
<TreeItem nodeId="pickers-community" label="@mui/x-date-pickers" />
<TreeItem nodeId="pickers-pro" label="@mui/x-date-pickers-pro" />
</TreeItem>
<TreeItem nodeId="charts" label="Charts">
<TreeItem nodeId="charts-community" label="@mui/x-charts" />
</TreeItem>
<TreeItem nodeId="tree-view" label="Tree View">
<TreeItem nodeId="tree-view-community" label="@mui/x-tree-view" />
</TreeItem>
</SimpleTreeView>
</Box>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import * as React from 'react';
import Box from '@mui/material/Box';
import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView';
import { TreeItem } from '@mui/x-tree-view/TreeItem';

export default function CheckboxSelection() {
return (
<Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}>
flaviendelangle marked this conversation as resolved.
Show resolved Hide resolved
<SimpleTreeView checkboxSelection>
<TreeItem nodeId="grid" label="Data Grid">
<TreeItem nodeId="grid-community" label="@mui/x-data-grid" />
<TreeItem nodeId="grid-pro" label="@mui/x-data-grid-pro" />
<TreeItem nodeId="grid-premium" label="@mui/x-data-grid-premium" />
</TreeItem>
<TreeItem nodeId="pickers" label="Date and Time Pickers">
<TreeItem nodeId="pickers-community" label="@mui/x-date-pickers" />
<TreeItem nodeId="pickers-pro" label="@mui/x-date-pickers-pro" />
</TreeItem>
<TreeItem nodeId="charts" label="Charts">
<TreeItem nodeId="charts-community" label="@mui/x-charts" />
</TreeItem>
<TreeItem nodeId="tree-view" label="Tree View">
<TreeItem nodeId="tree-view-community" label="@mui/x-tree-view" />
</TreeItem>
</SimpleTreeView>
</Box>
);
}
10 changes: 10 additions & 0 deletions docs/data/tree-view/simple-tree-view/selection/selection.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,16 @@ The Tree View also supports multi-selection:

{{"demo": "MultiSelectTreeView.js"}}

## Checkbox selection

To activate checkbox selection set `checkboxSelection={true}`:

{{"demo": "CheckboxSelection.js"}}

This is also compatible with multi selection:

{{"demo": "CheckboxMultiSelection.js"}}

## Controlled selection

Use the `selectedNodes` prop to control the selected items.
Expand Down
1 change: 1 addition & 0 deletions docs/pages/x/api/tree-view/rich-tree-view.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"props": {
"checkboxSelection": { "type": { "name": "bool" }, "default": "false" },
"classes": { "type": { "name": "object" }, "additionalInfo": { "cssApi": true } },
"defaultEndIcon": { "type": { "name": "node" } },
"defaultExpandedNodes": {
Expand Down
1 change: 1 addition & 0 deletions docs/pages/x/api/tree-view/simple-tree-view.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"props": {
"checkboxSelection": { "type": { "name": "bool" }, "default": "false" },
"children": { "type": { "name": "node" } },
"classes": { "type": { "name": "object" }, "additionalInfo": { "cssApi": true } },
"defaultEndIcon": { "type": { "name": "node" } },
Expand Down
8 changes: 7 additions & 1 deletion docs/pages/x/api/tree-view/tree-item.json
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,12 @@
"description": "Styles applied to the tree node icon.",
"isGlobal": false
},
{
"key": "interactive",
"className": "MuiTreeItem-interactive",
"description": "State class applied to the content element when clicking it causes an action.",
"isGlobal": false
},
{
"key": "label",
"className": "MuiTreeItem-label",
Expand All @@ -86,7 +92,7 @@
{
"key": "selected",
"className": "Mui-selected",
"description": "State class applied to the content element when selected.",
"description": "State class applied to the content element when selected and not using the checkbox selection.",
"isGlobal": true
}
],
Expand Down
1 change: 1 addition & 0 deletions docs/pages/x/api/tree-view/tree-view.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"props": {
"checkboxSelection": { "type": { "name": "bool" }, "default": "false" },
"children": { "type": { "name": "node" } },
"classes": { "type": { "name": "object" }, "additionalInfo": { "cssApi": true } },
"defaultEndIcon": { "type": { "name": "node" } },
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
{
"componentDescription": "",
"propDescriptions": {
"checkboxSelection": {
"description": "If <code>true</code>, the tree view renders a checkbox at the left of its label that allows selecting it."
},
"classes": { "description": "Override or extend the styles applied to the component." },
"defaultEndIcon": {
"description": "The default icon displayed next to a end node. This is applied to all tree nodes and can be overridden by the TreeItem <code>icon</code> prop."
Expand Down Expand Up @@ -40,7 +43,7 @@
}
},
"multiSelect": {
"description": "If true <code>ctrl</code> and <code>shift</code> will trigger multiselect."
"description": "If <code>true</code>, <code>ctrl</code> and <code>shift</code> will trigger multiselect."
},
"onExpandedNodesChange": {
"description": "Callback fired when tree items are expanded/collapsed.",
Expand Down