import { Meta } from '@storybook/react';
import { useState } from 'react';
import * as React from 'react';
import { longTree, shortTree } from 'demodata';
import { action } from '@storybook/addon-actions';
import { Tree } from '../tree/Tree';
import { StaticTreeDataProvider } from '../uncontrolledEnvironment/StaticTreeDataProvider';
import { UncontrolledTreeEnvironment } from '../uncontrolledEnvironment/UncontrolledTreeEnvironment';
import { buildTestTree } from '../../test/helpers';
import { TreeItemIndex } from '../types';
import { createDefaultRenderers } from '../renderers';
export default {
title: 'Core/Basic Examples',
} as Meta;
export const SingleTree = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(longTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{
'tree-1': {
expandedItems: [
'Fruit',
'Meals',
'America',
'Europe',
'Asia',
'Desserts',
],
},
}}
>
);
export const DarkMode = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(longTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{
'tree-1': {
expandedItems: [
'Fruit',
'Meals',
'America',
'Europe',
'Asia',
'Desserts',
],
},
}}
>
);
export const PredefinedViewState = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(longTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{
'tree-1': {
expandedItems: ['Fruit'],
focusedItem: 'Apple',
selectedItems: ['Apple', 'Lemon', 'Berries'],
},
}}
>
);
export const Actions = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(longTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{
'tree-1': {
expandedItems: [
'Fruit',
'Meals',
'America',
'Europe',
'Asia',
'Desserts',
],
},
}}
onStartRenamingItem={action('onStartRenamingItem')}
onRenameItem={action('onRenameItem')}
onAbortRenamingItem={action('onAbortRenamingItem')}
onCollapseItem={action('onCollapseItem')}
onExpandItem={action('onExpandItem')}
onSelectItems={action('onSelectItems')}
onFocusItem={action('onFocusItem')}
onDrop={action('onDrop')}
onPrimaryAction={action('onPrimaryAction')}
onRegisterTree={action('onRegisterTree')}
onUnregisterTree={action('onUnregisterTree')}
onMissingItems={action('onMissingItems')}
onMissingChildren={action('onMissingChildren')}
>
<>
In this example, action hooks trigger Storybook actions in the
"Actions" tab below.
>
);
export const SingleTreeAllCollapsed = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(longTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{
'tree-1': {},
}}
>
);
export const SmallTree = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(shortTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{
'tree-1': {},
}}
>
);
export const MultipleTrees = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(longTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{
'tree-1': {},
}}
>
);
export const MultipleTrees2 = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(longTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{
'tree-1': {
expandedItems: ['Meals', 'Europe'],
selectedItems: ['Risotto', 'Pizza', 'Weisswurst', 'Spargel'],
focusedItem: 'Spargel',
},
'tree-2': {
expandedItems: ['Fruit', 'Berries'],
selectedItems: ['Orange'],
focusedItem: 'Orange',
},
}}
>
);
export const DropOnEmptyTree = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(
{
...longTree.items,
empty: {
data: 'Empty Folder',
index: 'empty',
isFolder: true,
},
},
(item, data) => ({
...item,
data,
})
)
}
getItemTitle={item => item.data}
viewState={{
'tree-1': {},
}}
renderTreeContainer={({ children, containerProps, info }) => (
)}
>
);
export const SwitchMountedTree = () => {
const [showFirstTree, setShowFirstTree] = useState(false);
return (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(longTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{}}
>
{showFirstTree ? (
) : (
)}
);
};
export const TreeItemContextRenaming = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(longTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{}}
renderItem={({ item, depth, children, title, context, arrow }) => {
const InteractiveComponent = context.isRenaming ? 'div' : 'button';
const type = context.isRenaming ? undefined : 'button';
return (
{arrow}
{title}
{children}
);
}}
>
);
export const UnitTestTree = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(buildTestTree(), (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{}}
>
);
export const UnitTestTreeOpen = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(buildTestTree(), (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{
'tree-1': {
expandedItems: Object.keys(buildTestTree()),
},
}}
>
);
export const ReparentTestTree = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(buildTestTree(), (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => `${item.data}`}
viewState={{ 'tree-1': { expandedItems: ['a', 'ad'] } }}
>
);
export const DisableMultiselect = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
disableMultiselect
dataProvider={
new StaticTreeDataProvider(longTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{
'tree-1': {
expandedItems: [
'Fruit',
'Meals',
'America',
'Europe',
'Asia',
'Desserts',
],
},
}}
>
);
export const NavigateAway = () => {
const [navigatedAway, setNavigatedAway] = useState(false);
if (navigatedAway) return
Navigated away!
;
return (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(longTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
onSelectItems={() => {
setNavigatedAway(true);
}}
viewState={{
'tree-1': {
expandedItems: [],
},
}}
>
);
};
export const AnimatedExpandingAndCollapsing = () => {
const [openingItem, setOpeningItem] = useState();
const [closingItem, setClosingItem] = useState();
return (
dataProvider={
new StaticTreeDataProvider(longTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
shouldRenderChildren={(item, context) =>
context.isExpanded ||
closingItem === item.index ||
openingItem === item.index
}
onExpandItem={item => {
setOpeningItem(item.index);
setTimeout(() => {
setOpeningItem(undefined);
});
}}
onCollapseItem={item => {
setClosingItem(item.index);
setTimeout(() => {
setClosingItem(undefined);
}, 500);
}}
viewState={{
'tree-1': {},
}}
renderItemsContainer={({ children, containerProps, parentId }) => (
)}
>
);
};
export const RightToLeftRenderers = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(longTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{
'tree-1': {
expandedItems: [
'Fruit',
'Meals',
'America',
'Europe',
'Asia',
'Desserts',
],
},
}}
{...createDefaultRenderers(10, true)}
>
);
export const ItemContainersWithMargin = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
dataProvider={
new StaticTreeDataProvider(longTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{
'tree-1': {
expandedItems: [
'Fruit',
'Meals',
'America',
'Europe',
'Asia',
'Desserts',
],
},
}}
>
);
export const HotkeysDisabled = () => (
canDragAndDrop
canDropOnFolder
canReorderItems
keyboardBindings={{
primaryAction: [],
moveFocusToFirstItem: [],
moveFocusToLastItem: [],
expandSiblings: [],
renameItem: [],
abortRenameItem: [],
toggleSelectItem: [],
abortSearch: [],
startSearch: [],
selectAll: [],
startProgrammaticDnd: [],
abortProgrammaticDnd: [],
completeProgrammaticDnd: [],
}}
dataProvider={
new StaticTreeDataProvider(longTree.items, (item, data) => ({
...item,
data,
}))
}
getItemTitle={item => item.data}
viewState={{
'tree-1': {
expandedItems: [
'Fruit',
'Meals',
'America',
'Europe',
'Asia',
'Desserts',
],
},
}}
>
);