@@ -2,8 +2,10 @@ import {number, withKnobs} from '@storybook/addon-knobs';
22import { storiesOf } from '@storybook/react' ;
33import * as React from 'react' ;
44import AutoSizer from 'react-virtualized-auto-sizer' ;
5- import Tree from '../src/FixedSizeTree' ;
6- import { CommonNodeComponentProps , CommonNodeMetadata } from '../src/utils' ;
5+ import Tree , {
6+ FixedSizeNodeComponentProps ,
7+ FixedSizeNodeData ,
8+ } from '../src/FixedSizeTree' ;
79
810document . body . style . margin = '0' ;
911document . body . style . display = 'flex' ;
@@ -12,16 +14,22 @@ const root = document.getElementById('root')!;
1214root . style . margin = '10px 0 0 10px' ;
1315root . style . flex = '1' ;
1416
15- interface DataNode {
17+ type DataNode = {
1618 children : DataNode [ ] ;
1719 id : number ;
1820 name : string ;
19- }
21+ } ;
2022
21- interface StackElement {
23+ type StackElement = {
2224 nestingLevel : number ;
2325 node : DataNode ;
24- }
26+ } ;
27+
28+ type ExtendedData = {
29+ readonly isLeaf : boolean ;
30+ readonly name : string ;
31+ readonly nestingLevel : number ;
32+ } ;
2533
2634let nodeId = 0 ;
2735
@@ -52,7 +60,7 @@ const defaultButtonStyle = {fontFamily: 'Courier New'};
5260
5361function * treeWalker (
5462 refresh : boolean ,
55- ) : IterableIterator < CommonNodeMetadata | string | symbol > {
63+ ) : IterableIterator < FixedSizeNodeData < ExtendedData > | string | symbol > {
5664 const stack : StackElement [ ] = [ ] ;
5765
5866 stack . push ( {
@@ -66,10 +74,10 @@ function* treeWalker(
6674
6775 const isOpened = yield refresh
6876 ? {
69- childrenCount : node . children . length ,
70- data : node . name ,
7177 id,
78+ isLeaf : node . children . length === 0 ,
7279 isOpenByDefault : true ,
80+ name : node . name ,
7381 nestingLevel,
7482 }
7583 : id ;
@@ -86,34 +94,27 @@ function* treeWalker(
8694 }
8795}
8896
89- const Node : React . FunctionComponent < CommonNodeComponentProps > = ( {
90- metadata : { childrenCount, data, nestingLevel} ,
91- isOpen,
92- style,
93- toggle,
94- } ) => {
95- const isLeaf = childrenCount === 0 ;
96-
97- return (
98- < div
99- style = { {
100- ...style ,
101- alignItems : 'center' ,
102- display : 'flex' ,
103- marginLeft : nestingLevel * 30 + ( isLeaf ? 48 : 0 ) ,
104- } }
105- >
106- { ! isLeaf && (
107- < div >
108- < button type = "button" onClick = { toggle } style = { defaultButtonStyle } >
109- { isOpen ? '-' : '+' }
110- </ button >
111- </ div >
112- ) }
113- < div style = { defaultTextStyle } > { data } </ div >
114- </ div >
115- ) ;
116- } ;
97+ const Node : React . FunctionComponent <
98+ FixedSizeNodeComponentProps < ExtendedData >
99+ > = ( { data : { isLeaf, name, nestingLevel} , isOpen, style, toggle} ) => (
100+ < div
101+ style = { {
102+ ...style ,
103+ alignItems : 'center' ,
104+ display : 'flex' ,
105+ marginLeft : nestingLevel * 30 + ( isLeaf ? 48 : 0 ) ,
106+ } }
107+ >
108+ { ! isLeaf && (
109+ < div >
110+ < button type = "button" onClick = { toggle } style = { defaultButtonStyle } >
111+ { isOpen ? '-' : '+' }
112+ </ button >
113+ </ div >
114+ ) }
115+ < div style = { defaultTextStyle } > { name } </ div >
116+ </ div >
117+ ) ;
117118
118119interface TreePresenterProps {
119120 readonly itemSize : number ;
@@ -124,7 +125,7 @@ const TreePresenter: React.FunctionComponent<TreePresenterProps> = ({
124125} ) => (
125126 < AutoSizer disableWidth >
126127 { ( { height} ) => (
127- < Tree
128+ < Tree < ExtendedData >
128129 treeWalker = { treeWalker }
129130 itemSize = { itemSize }
130131 height = { height }
0 commit comments