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

[RichTreeViewPro] Add virtualization #13520

Draft
wants to merge 60 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
75449bd
[RichTreeViewPro] Add virtualization
flaviendelangle Jun 17, 2024
aa64768
Merge branch 'master' into virtualization-tree-view
flaviendelangle Jun 18, 2024
ee2e007
Work
flaviendelangle Jun 18, 2024
7251baf
Merge branch 'master' into virtualization-tree-view
flaviendelangle Jun 21, 2024
a4e6249
Work
flaviendelangle Jun 21, 2024
b80bc1a
Work
flaviendelangle Jun 21, 2024
72c47ba
Work
flaviendelangle Jun 21, 2024
adbf9ae
Work
flaviendelangle Jun 21, 2024
31daf38
Merge branch 'master' into virtualization-tree-view
flaviendelangle Jun 24, 2024
bad9fa9
Merge branch 'master' into virtualization-tree-view
flaviendelangle Jun 24, 2024
4af70c9
Work
flaviendelangle Jun 24, 2024
7fd7cf2
Work
flaviendelangle Jun 24, 2024
ead30ca
Work
flaviendelangle Jun 24, 2024
8c0cf9b
Merge branch 'master' into virtualization-tree-view
flaviendelangle Jun 25, 2024
037237a
Work
flaviendelangle Jun 25, 2024
daa5338
Add doc exampel
flaviendelangle Jun 25, 2024
dfb13b4
Fix
flaviendelangle Jun 25, 2024
5ab71c7
Fix CI
flaviendelangle Jun 25, 2024
bb52901
Fix CI
flaviendelangle Jun 25, 2024
b42c795
Move doc demo
flaviendelangle Jun 25, 2024
79d446e
Merge branch 'master' into virtualization-tree-view
flaviendelangle Jun 25, 2024
74e554e
Fix scrollbar
flaviendelangle Jun 25, 2024
3df506b
Work
flaviendelangle Jun 25, 2024
13e1a34
Work
flaviendelangle Jun 25, 2024
50159b7
CI
flaviendelangle Jun 25, 2024
8c9a2a5
CI
flaviendelangle Jun 25, 2024
e818d75
CI
flaviendelangle Jun 25, 2024
85d9318
Merge branch 'master' into virtualization-tree-view
flaviendelangle Jun 25, 2024
4a61728
Merge
flaviendelangle Jun 25, 2024
22fbd8c
Work
flaviendelangle Jun 26, 2024
6420171
Fix
flaviendelangle Jun 26, 2024
33780a3
Work
flaviendelangle Jun 26, 2024
8ecbb5b
Work
flaviendelangle Jun 26, 2024
11b5f92
Merge branch 'master' into virtualization-tree-view
flaviendelangle Jun 26, 2024
f69a751
Merge branch 'master' into virtualization-tree-view
flaviendelangle Jun 27, 2024
f8fbcec
Merge branch 'master' into virtualization-tree-view
flaviendelangle Jun 27, 2024
aaf1843
Work
flaviendelangle Jun 27, 2024
57ad1be
Fix
flaviendelangle Jun 27, 2024
a57cebd
Merge branch 'master' into virtualization-tree-view
flaviendelangle Jul 1, 2024
5ed0419
Use x-internals
flaviendelangle Jul 1, 2024
5d73433
Merge
flaviendelangle Jul 10, 2024
0f6c6fd
Merge branch 'master' into virtualization-tree-view
flaviendelangle Jul 11, 2024
337c226
Merge
flaviendelangle Jul 17, 2024
174f2c0
Merge branch 'master' into virtualization-tree-view
flaviendelangle Jul 17, 2024
87b79d9
Keep focused item mounted
flaviendelangle Jul 17, 2024
bd56769
Merge branch 'master' into virtualization-tree-view
flaviendelangle Jul 22, 2024
ae463c5
Merge
flaviendelangle Aug 1, 2024
9b7d0f8
Empty
flaviendelangle Aug 1, 2024
47fc275
Merge
flaviendelangle Aug 1, 2024
256e774
Merge branch 'master' into virtualization-tree-view
flaviendelangle Aug 6, 2024
e1cccca
Merge
flaviendelangle Aug 14, 2024
0e3e43b
Review: Olivier
flaviendelangle Aug 14, 2024
c7d6da7
Work
flaviendelangle Aug 14, 2024
1f1377f
Work
flaviendelangle Aug 14, 2024
9d56ebe
Fix
flaviendelangle Aug 14, 2024
b61be4a
Work
flaviendelangle Aug 14, 2024
60cec6b
Merge branch 'master' into virtualization-tree-view
flaviendelangle Aug 14, 2024
526a713
Use new utils
flaviendelangle Aug 14, 2024
0990411
Merge branch 'master' into virtualization-tree-view
flaviendelangle Aug 19, 2024
6640b09
Merge
flaviendelangle Sep 9, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions docs/data/tree-view/rich-tree-view/items/Virtualization.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import * as React from 'react';
import Box from '@mui/material/Box';
import { RichTreeViewPro } from '@mui/x-tree-view-pro/RichTreeViewPro';
import { TreeItem2 } from '@mui/x-tree-view/TreeItem2';

const ITEMS = Array.from({ length: 10 }).map((_1, index) => ({
id: `${index}`,
label: `Item ${index}`,
children: Array.from({ length: 10 }).map((_2, index2) => ({
id: `${index}-${index2}`,
label: `Item ${index}-${index2}`,
children: Array.from({ length: 10 }).map((_3, index3) => ({
id: `${index}-${index2}-${index3}`,
label: `Item ${index}-${index2}-${index3}`,
children: Array.from({ length: 10 }).map((_4, index4) => ({
id: `${index}-${index2}-${index3}-${index4}`,
label: `Item ${index}-${index2}-${index3}-${index4}`,
})),
})),
})),
}));

function addChildrenToItem(item) {
return [item.id, ...(item.children ?? []).flatMap(addChildrenToItem)];
}

const flatItemIds = ITEMS.flatMap(addChildrenToItem);

export default function Virtualization() {
return (
<Box sx={{ height: 352, minWidth: 250 }}>
<RichTreeViewPro
items={ITEMS}
experimentalFeatures={{ virtualization: true }}
defaultExpandedItems={flatItemIds}
slots={{ item: TreeItem2 }}
/>
</Box>
);
}
41 changes: 41 additions & 0 deletions docs/data/tree-view/rich-tree-view/items/Virtualization.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 { RichTreeViewPro } from '@mui/x-tree-view-pro/RichTreeViewPro';
import { TreeItem2 } from '@mui/x-tree-view/TreeItem2';
import { TreeViewBaseItem, TreeViewItemId } from '@mui/x-tree-view/models';

const ITEMS = Array.from({ length: 10 }).map((_1, index) => ({
id: `${index}`,
label: `Item ${index}`,
children: Array.from({ length: 10 }).map((_2, index2) => ({
id: `${index}-${index2}`,
label: `Item ${index}-${index2}`,
children: Array.from({ length: 10 }).map((_3, index3) => ({
id: `${index}-${index2}-${index3}`,
label: `Item ${index}-${index2}-${index3}`,
children: Array.from({ length: 10 }).map((_4, index4) => ({
id: `${index}-${index2}-${index3}-${index4}`,
label: `Item ${index}-${index2}-${index3}-${index4}`,
})),
})),
})),
}));

function addChildrenToItem(item: TreeViewBaseItem): TreeViewItemId[] {
return [item.id, ...(item.children ?? []).flatMap(addChildrenToItem)];
}

const flatItemIds = ITEMS.flatMap(addChildrenToItem);

export default function Virtualization() {
return (
<Box sx={{ height: 352, minWidth: 250 }}>
<RichTreeViewPro
items={ITEMS}
experimentalFeatures={{ virtualization: true }}
defaultExpandedItems={flatItemIds}
slots={{ item: TreeItem2 }}
/>
</Box>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<RichTreeViewPro
items={ITEMS}
experimentalFeatures={{ virtualization: true }}
defaultExpandedItems={flatItemIds}
slots={{ item: TreeItem2 }}
/>
10 changes: 9 additions & 1 deletion docs/data/tree-view/rich-tree-view/items/items.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
productId: x-tree-view
title: Rich Tree View - Items
components: RichTreeView, TreeItem
components: RichTreeView, TreeItem, TreeItem2
packageName: '@mui/x-tree-view'
githubLabel: 'component: tree view'
waiAria: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
Expand Down Expand Up @@ -149,6 +149,14 @@ Use the `onItemClick` prop to track the clicked item:

{{"demo": "OnItemClick.js"}}

## Virtualization [<span class="plan-pro"></span>](/x/introduction/licensing/#pro-plan 'Pro plan')

:::warning
This is only a POC, a lot of the behaviors are potentially broken.
:::

{{"demo": "Virtualization.js"}}

## Imperative API

:::success
Expand Down
29 changes: 16 additions & 13 deletions docs/pages/x/api/tree-view/rich-tree-view-pro.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
"experimentalFeatures": {
"type": {
"name": "shape",
"description": "{ indentationAtItemLevel?: bool, itemsReordering?: bool, labelEditing?: bool }"
"description": "{ indentationAtItemLevel?: bool, itemsReordering?: bool, labelEditing?: bool, virtualization?: bool }"
}
},
"getItemId": {
Expand Down Expand Up @@ -75,6 +75,7 @@
"type": { "name": "union", "description": "number<br>&#124;&nbsp;string" },
"default": "12px"
},
"itemsHeight": { "type": { "name": "number" }, "default": "32" },
"itemsReordering": { "type": { "name": "bool" }, "default": "false" },
"multiSelect": { "type": { "name": "bool" }, "default": "false" },
"onExpandedItemsChange": {
Expand Down Expand Up @@ -133,6 +134,8 @@
"describedArgs": ["event", "itemIds"]
}
},
"resizeThrottleMs": { "type": { "name": "number" }, "default": "60" },
"scrollBufferPx": { "type": { "name": "number" }, "default": "150" },
"selectedItems": { "type": { "name": "any" } },
"slotProps": { "type": { "name": "object" }, "default": "{}" },
"slots": {
Expand All @@ -154,18 +157,6 @@
"import { RichTreeViewPro } from '@mui/x-tree-view-pro';"
],
"slots": [
{
"name": "root",
"description": "Element rendered at the root.",
"default": "RichTreeViewProRoot",
"class": "MuiRichTreeViewPro-root"
},
{
"name": "item",
"description": "Custom component for the item.",
"default": "TreeItem.",
"class": null
},
{
"name": "collapseIcon",
"description": "The default icon used to collapse the item.",
Expand All @@ -180,6 +171,18 @@
"name": "endIcon",
"description": "The default icon displayed next to an end item.\nThis is applied to all tree items and can be overridden by the TreeItem `icon` slot prop.",
"class": null
},
{
"name": "item",
"description": "Custom component for the item.",
"default": "TreeItem.",
"class": null
},
{
"name": "root",
"description": "Element rendered at the root.",
"default": "RichTreeViewProRoot",
"class": "MuiRichTreeViewPro-root"
}
],
"classes": [],
Expand Down
2 changes: 1 addition & 1 deletion docs/pages/x/api/tree-view/tree-item-2.json
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,6 @@
"forwardsRefTo": "HTMLLIElement",
"filename": "/packages/x-tree-view/src/TreeItem2/TreeItem2.tsx",
"inheritance": null,
"demos": "<ul><li><a href=\"/x/react-tree-view/rich-tree-view/customization/\">Rich Tree View - Customization</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/ordering/\">Rich Tree View - Ordering <a href=\"/x/introduction/licensing/#pro-plan\" title=\"Pro plan\"><span class=\"plan-pro\"></span></a></a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/customization/\">Simple Tree View - Customization</a></li>\n<li><a href=\"/x/react-tree-view/tree-item-customization/\">Tree Item Customization</a></li></ul>",
"demos": "<ul><li><a href=\"/x/react-tree-view/rich-tree-view/customization/\">Rich Tree View - Customization</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/items/\">Rich Tree View - Items</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/ordering/\">Rich Tree View - Ordering <a href=\"/x/introduction/licensing/#pro-plan\" title=\"Pro plan\"><span class=\"plan-pro\"></span></a></a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/customization/\">Simple Tree View - Customization</a></li>\n<li><a href=\"/x/react-tree-view/tree-item-customization/\">Tree Item Customization</a></li></ul>",
"cssComponent": false
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
"itemChildrenIndentation": {
"description": "Horizontal indentation between an item and its children. Examples: 24, &quot;24px&quot;, &quot;2rem&quot;, &quot;2em&quot;."
},
"itemsHeight": { "description": "Sets the height in pixel of an item." },
"itemsReordering": {
"description": "If <code>true</code>, the reordering of items is enabled. Make sure to also enable the <code>itemsReordering</code> experimental feature: <code>&lt;RichTreeViewPro experimentalFeatures={{ itemsReordering: true }} itemsReordering /&gt;</code>."
},
Expand Down Expand Up @@ -134,6 +135,10 @@
"itemIds": "The ids of the selected items. When <code>multiSelect</code> is <code>true</code>, this is an array of strings; when false (default) a string."
}
},
"resizeThrottleMs": {
"description": "The millisecond throttle delay for resizing the Tree View when virtualization is enabled."
},
"scrollBufferPx": { "description": "Region in pixels to render before/after the viewport." },
"selectedItems": {
"description": "Selected item ids. (Controlled) When <code>multiSelect</code> is true this takes an array of strings; when false (default) a string."
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ import {
useTreeViewItemsReordering,
UseTreeViewItemsReorderingParameters,
} from '../internals/plugins/useTreeViewItemsReordering';
import {
useTreeViewVirtualization,
UseTreeViewVirtualizationParameters,
} from '../internals/plugins/useTreeViewVirtualization';

export const RICH_TREE_VIEW_PRO_PLUGINS = [
useTreeViewItems,
Expand All @@ -30,6 +34,7 @@ export const RICH_TREE_VIEW_PRO_PLUGINS = [
useTreeViewIcons,
useTreeViewLabel,
useTreeViewItemsReordering,
useTreeViewVirtualization,
] as const;

export type RichTreeViewProPluginSignatures = ConvertPluginsIntoSignatures<
Expand All @@ -55,4 +60,5 @@ export interface RichTreeViewProPluginParameters<R extends {}, Multiple extends
UseTreeViewSelectionParameters<Multiple>,
UseTreeViewIconsParameters,
UseTreeViewLabelParameters<R>,
UseTreeViewItemsReorderingParameters {}
UseTreeViewItemsReorderingParameters,
UseTreeViewVirtualizationParameters {}
Loading
Loading