5
5
6
6
import * as assert from 'assert' ;
7
7
import { IIdentityProvider , IListVirtualDelegate } from 'vs/base/browser/ui/list/list' ;
8
- import { AsyncDataTree } from 'vs/base/browser/ui/tree/asyncDataTree' ;
9
- import { IAsyncDataSource , ITreeNode , ITreeRenderer } from 'vs/base/browser/ui/tree/tree' ;
8
+ import { AsyncDataTree , CompressibleAsyncDataTree , ITreeCompressionDelegate } from 'vs/base/browser/ui/tree/asyncDataTree' ;
9
+ import { ICompressedTreeNode } from 'vs/base/browser/ui/tree/compressedObjectTreeModel' ;
10
+ import { ICompressibleTreeRenderer } from 'vs/base/browser/ui/tree/objectTree' ;
11
+ import { IAsyncDataSource , ITreeNode } from 'vs/base/browser/ui/tree/tree' ;
10
12
import { timeout } from 'vs/base/common/async' ;
11
13
import { Iterable } from 'vs/base/common/iterator' ;
12
14
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils' ;
@@ -37,7 +39,7 @@ function find(element: Element, id: string): Element | undefined {
37
39
return undefined ;
38
40
}
39
41
40
- class Renderer implements ITreeRenderer < Element , void , HTMLElement > {
42
+ class Renderer implements ICompressibleTreeRenderer < Element , void , HTMLElement > {
41
43
readonly templateId = 'default' ;
42
44
renderTemplate ( container : HTMLElement ) : HTMLElement {
43
45
return container ;
@@ -48,6 +50,15 @@ class Renderer implements ITreeRenderer<Element, void, HTMLElement> {
48
50
disposeTemplate ( templateData : HTMLElement ) : void {
49
51
// noop
50
52
}
53
+ renderCompressedElements ( node : ITreeNode < ICompressedTreeNode < Element > , void > , index : number , templateData : HTMLElement , height : number | undefined ) : void {
54
+ const result : string [ ] = [ ] ;
55
+
56
+ for ( const element of node . element . elements ) {
57
+ result . push ( element . id + ( element . suffix || '' ) ) ;
58
+ }
59
+
60
+ templateData . textContent = result . join ( '/' ) ;
61
+ }
51
62
}
52
63
53
64
class IdentityProvider implements IIdentityProvider < Element > {
@@ -495,4 +506,49 @@ suite('AsyncDataTree', function () {
495
506
assert ( tree . isCollapsible ( a ) , 'a is still collapsible' ) ;
496
507
assert ( ! tree . isCollapsed ( a ) , 'a is expanded' ) ;
497
508
} ) ;
509
+
510
+ test ( 'issue #199441' , async ( ) => {
511
+ const container = document . createElement ( 'div' ) ;
512
+
513
+ const dataSource = new class implements IAsyncDataSource < Element , Element > {
514
+ hasChildren ( element : Element ) : boolean {
515
+ return ! ! element . children && element . children . length > 0 ;
516
+ }
517
+ async getChildren ( element : Element ) {
518
+ return element . children ?? Iterable . empty ( ) ;
519
+ }
520
+ } ;
521
+
522
+ const compressionDelegate = new class implements ITreeCompressionDelegate < Element > {
523
+ isIncompressible ( element : Element ) : boolean {
524
+ return ! dataSource . hasChildren ( element ) ;
525
+ }
526
+ } ;
527
+
528
+ const model = new Model ( {
529
+ id : 'root' ,
530
+ children : [ {
531
+ id : 'a' , children : [ {
532
+ id : 'b' ,
533
+ children : [ { id : 'b.txt' } ]
534
+ } ]
535
+ } ]
536
+ } ) ;
537
+
538
+ const collapseByDefault = ( element : Element ) => false ;
539
+
540
+ const tree = store . add ( new CompressibleAsyncDataTree < Element , Element > ( 'test' , container , new VirtualDelegate ( ) , compressionDelegate , [ new Renderer ( ) ] , dataSource , { identityProvider : new IdentityProvider ( ) , collapseByDefault } ) ) ;
541
+ tree . layout ( 200 ) ;
542
+
543
+ await tree . setInput ( model . root ) ;
544
+ assert . deepStrictEqual ( Array . from ( container . querySelectorAll ( '.monaco-list-row' ) ) . map ( e => e . textContent ) , [ 'a/b' , 'b.txt' ] ) ;
545
+
546
+ model . get ( 'a' ) . children ! . push ( {
547
+ id : 'c' ,
548
+ children : [ { id : 'c.txt' } ]
549
+ } ) ;
550
+
551
+ await tree . updateChildren ( model . root , true ) ;
552
+ assert . deepStrictEqual ( Array . from ( container . querySelectorAll ( '.monaco-list-row' ) ) . map ( e => e . textContent ) , [ 'a' , 'b' , 'b.txt' , 'c' , 'c.txt' ] ) ;
553
+ } ) ;
498
554
} ) ;
0 commit comments