Skip to content

Commit 920374c

Browse files
committed
chore: new stories
1 parent 02b25c7 commit 920374c

File tree

2 files changed

+151
-1
lines changed

2 files changed

+151
-1
lines changed
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
import { Meta } from '@storybook/react';
2+
import { useMemo, useState } from 'react';
3+
import * as React from 'react';
4+
import { longTree, shortTree } from 'demodata';
5+
import { action } from '@storybook/addon-actions';
6+
import { Tree } from '../tree/Tree';
7+
import { StaticTreeDataProvider } from '../uncontrolledEnvironment/StaticTreeDataProvider';
8+
import { UncontrolledTreeEnvironment } from '../uncontrolledEnvironment/UncontrolledTreeEnvironment';
9+
import { buildTestTree } from '../../test/helpers';
10+
import {
11+
Disposable,
12+
ExplicitDataSource,
13+
TreeDataProvider,
14+
TreeItem,
15+
TreeItemIndex,
16+
} from '../types';
17+
import { EventEmitter } from '../EventEmitter';
18+
19+
export default {
20+
title: 'Core/Data Provider',
21+
} as Meta;
22+
23+
export const InjectingDataFromOutside = () => {
24+
const items = useMemo(() => ({ ...shortTree.items }), []);
25+
const dataProvider = useMemo(
26+
() =>
27+
new StaticTreeDataProvider(items, (item, data) => ({
28+
...item,
29+
data,
30+
})),
31+
[items]
32+
);
33+
34+
const injectItem = () => {
35+
const rand = `${Math.random()}`;
36+
items[rand] = { data: 'New Item', index: rand } as TreeItem;
37+
items.root.children.push(rand);
38+
dataProvider.onDidChangeTreeDataEmitter.emit(['root']);
39+
};
40+
41+
const removeItem = () => {
42+
if (items.root.children.length === 0) return;
43+
items.root.children.pop();
44+
dataProvider.onDidChangeTreeDataEmitter.emit(['root']);
45+
};
46+
47+
return (
48+
<UncontrolledTreeEnvironment<string>
49+
canDragAndDrop
50+
canDropOnFolder
51+
canReorderItems
52+
dataProvider={dataProvider}
53+
getItemTitle={item => item.data}
54+
viewState={{
55+
'tree-1': {
56+
expandedItems: [],
57+
},
58+
}}
59+
>
60+
<button type="button" onClick={injectItem}>
61+
Inject item
62+
</button>
63+
<button type="button" onClick={removeItem}>
64+
Remove item
65+
</button>
66+
<Tree treeId="tree-1" rootItem="root" treeLabel="Tree Example" />
67+
</UncontrolledTreeEnvironment>
68+
);
69+
};
70+
71+
class CustomDataProviderImplementation implements TreeDataProvider {
72+
private data: Record<TreeItemIndex, TreeItem> = { ...shortTree.items };
73+
74+
private treeChangeListeners: ((changedItemIds: TreeItemIndex[]) => void)[] =
75+
[];
76+
77+
public async getTreeItem(itemId: TreeItemIndex) {
78+
console.log(this.data);
79+
return this.data[itemId];
80+
}
81+
82+
public async onChangeItemChildren(
83+
itemId: TreeItemIndex,
84+
newChildren: TreeItemIndex[]
85+
) {
86+
this.data[itemId].children = newChildren;
87+
this.treeChangeListeners.forEach(listener => listener([itemId]));
88+
}
89+
90+
public onDidChangeTreeData(
91+
listener: (changedItemIds: TreeItemIndex[]) => void
92+
): Disposable {
93+
this.treeChangeListeners.push(listener);
94+
return {
95+
dispose: () =>
96+
this.treeChangeListeners.splice(
97+
this.treeChangeListeners.indexOf(listener),
98+
1
99+
),
100+
};
101+
}
102+
103+
public async onRenameItem(item: TreeItem<any>, name: string): Promise<void> {
104+
this.data[item.index].data = name;
105+
}
106+
107+
public injectItem(name: string) {
108+
const rand = `${Math.random()}`;
109+
this.data[rand] = { data: name, index: rand } as TreeItem;
110+
this.data.root.children?.push(rand);
111+
this.treeChangeListeners.forEach(listener => listener(['root']));
112+
}
113+
}
114+
115+
export const CustomDataProvider = () => {
116+
const dataProvider = useMemo(
117+
() => new CustomDataProviderImplementation(),
118+
[]
119+
);
120+
121+
return (
122+
<UncontrolledTreeEnvironment<string>
123+
canDragAndDrop
124+
canDropOnFolder
125+
canReorderItems
126+
dataProvider={dataProvider}
127+
getItemTitle={item => item.data}
128+
viewState={{
129+
'tree-1': {
130+
expandedItems: [],
131+
},
132+
}}
133+
>
134+
<button
135+
type="button"
136+
onClick={() =>
137+
dataProvider.injectItem(window.prompt('Item name') ?? 'New item')
138+
}
139+
>
140+
Inject item
141+
</button>
142+
<Tree treeId="tree-1" rootItem="root" treeLabel="Tree Example" />
143+
</UncontrolledTreeEnvironment>
144+
);
145+
};

packages/demodata/src/treeData.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
const readTemplate = (template: any, data: any = { items: {} }) => {
1+
import { TreeItemIndex, TreeItem } from 'react-complex-tree';
2+
3+
const readTemplate = (
4+
template: any,
5+
data: any = { items: {} }
6+
): Record<TreeItemIndex, TreeItem> => {
27
for (const [key, value] of Object.entries(template)) {
38
// eslint-disable-next-line no-param-reassign
49
data.items[key] = {

0 commit comments

Comments
 (0)