@@ -20,20 +20,6 @@ interface TreeNodeAction<N extends TreeNode> {
2020 showInline ?: boolean ;
2121}
2222
23- export interface TreeViewAPI < N extends TreeNode > {
24- createFile ( options : {
25- underNode : TreeNode | null ;
26- defaultName ?: string ;
27- execute ( options : { node : N | null ; parents : N [ ] ; name : string ; dryRun : boolean ; } ) : Promise < void > ;
28- } ) : void ;
29-
30- createFolder ( options : {
31- underNode : TreeNode | null ;
32- defaultName ?: string ;
33- execute ( options : { node : N | null ; parents : N [ ] ; name : string ; dryRun : boolean ; } ) : Promise < void > ;
34- } ) : void ;
35- }
36-
3723interface TreeNodeAPI {
3824 rename ( options : {
3925 execute ( options : { newName : string ; dryRun : boolean ; } ) : Promise < void > ;
@@ -44,12 +30,8 @@ interface TreeRootContextValue {
4430 rootNodes : TreeNode [ ] ;
4531 nodeElements : Map < TreeNode , HTMLElement > ;
4632 currentlyFocusableNode : TreeNode | null ;
47- creatingNewNode : (
48- (
49- | Parameters < TreeViewAPI < TreeNode > [ 'createFile' ] > [ 0 ]
50- | Parameters < TreeViewAPI < TreeNode > [ 'createFolder' ] > [ 0 ]
51- ) & { type : 'file' | 'folder' ; }
52- ) | null ;
33+ creatingNewNode : TreeViewProps < any > [ 'creatingNewNode' ] ;
34+ cancelNodeCreation : ( ) => void ;
5335 actions : TreeNodeAction < TreeNode > [ ] ;
5436 focus ( node : TreeNode | null ) : void ;
5537}
@@ -84,14 +66,14 @@ const TreeNodeCreationForm = (props: TreeNodeCreationProps) => {
8466 nameInput . setCustomValidity ( '' ) ;
8567 if ( dryRun )
8668 return ;
87- treeRootContext . creatingNewNode = null ;
69+ treeRootContext . cancelNodeCreation ( ) ;
8870 } catch ( e ) {
8971 nameInput . setCustomValidity ( String ( e ) ) ;
9072 }
9173 } ;
9274
9375 const cancel = ( ) => {
94- treeRootContext . creatingNewNode = null ;
76+ treeRootContext . cancelNodeCreation ( ) ;
9577 } ;
9678
9779 const handleBlur = ( _event : FocusEvent ) => {
@@ -502,16 +484,21 @@ const TreeNodeView = (props: TreeNodeViewProps) => {
502484
503485interface TreeViewProps < N extends TreeNode > {
504486 nodes : N [ ] ;
487+ creatingNewNode : null | {
488+ type : 'file' | 'folder' ;
489+ underNode : TreeNode | null ;
490+ defaultName ?: string ;
491+ execute ( options : { node : N | null ; parents : N [ ] ; name : string ; dryRun : boolean ; } ) : Promise < void > ;
492+ } ;
505493 emptyTreeMessage ?: string ;
506494 actions : TreeNodeAction < N > [ ] ;
507- api : ( api : TreeViewAPI < N > ) => void ;
495+ onCancelNodeCreation : ( ) => void ;
508496}
509497
510498export const TreeView = < N extends TreeNode > ( props : TreeViewProps < N > ) => {
511499 let rootListRef : HTMLElement | undefined ;
512500 const nodeElements = new Map < TreeNode , HTMLElement > ( ) ;
513501 const [ currentlyFocusableNode , setCurrentlyFocusableNode ] = createSignal < TreeNode | null > ( null ) ;
514- const [ creatingNewNode , setCreatingNewNode ] = createSignal < TreeRootContextValue [ 'creatingNewNode' ] > ( null ) ;
515502
516503 createComputed ( ( ) => {
517504 props . nodes ;
@@ -530,10 +517,10 @@ export const TreeView = <N extends TreeNode>(props: TreeViewProps<N>) => {
530517 } ,
531518 nodeElements : nodeElements ,
532519 get creatingNewNode ( ) {
533- return creatingNewNode ( ) ;
520+ return props . creatingNewNode ;
534521 } ,
535- set creatingNewNode ( value ) {
536- setCreatingNewNode ( value ) ;
522+ get cancelNodeCreation ( ) {
523+ return props . onCancelNodeCreation ;
537524 } ,
538525 get actions ( ) {
539526 return props . actions as TreeNodeAction < TreeNode > [ ] ;
@@ -549,22 +536,10 @@ export const TreeView = <N extends TreeNode>(props: TreeViewProps<N>) => {
549536 } ,
550537 } satisfies TreeRootContextValue ;
551538
552- const api = {
553- createFile ( options ) {
554- setCreatingNewNode ( { ...options , type : 'file' } ) ;
555- } ,
556-
557- createFolder ( options ) {
558- setCreatingNewNode ( { ...options , type : 'folder' } ) ;
559- } ,
560- } satisfies TreeViewAPI < N > ;
561-
562- props . api ( api ) ;
563-
564539 return (
565540 < TreeRootContext . Provider value = { treeRootContextValue } >
566541 < Show
567- when = { props . nodes . length > 0 || creatingNewNode ( ) !== null }
542+ when = { props . nodes . length > 0 || props . creatingNewNode !== null }
568543 fallback = { < i > { props . emptyTreeMessage ?? 'No entries' } </ i > }
569544 >
570545 < TreeList ref = { el => rootListRef = el } nodes = { props . nodes } parents = { [ ] } />
0 commit comments