diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index db3316f7158..04e11a90415 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -954,7 +954,6 @@ export class AsyncDataTree implements IDisposable asyncDataTreeNode.element = element; asyncDataTreeNode.hasChildren = hasChildren; - asyncDataTreeNode.collapsedByDefault = this.collapseByDefault?.(element); if (recursive) { if (result.collapsed) { @@ -964,7 +963,8 @@ export class AsyncDataTree implements IDisposable } else { childrenToRefresh.push(asyncDataTreeNode); } - } else if (hasChildren && !asyncDataTreeNode.collapsedByDefault) { + } else if (hasChildren && this.collapseByDefault && !this.collapseByDefault(element)) { + asyncDataTreeNode.collapsedByDefault = false; childrenToRefresh.push(asyncDataTreeNode); } diff --git a/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts b/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts index 11f4be82fee..9a552a91b83 100644 --- a/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts +++ b/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts @@ -5,10 +5,8 @@ import * as assert from 'assert'; import { IIdentityProvider, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; -import { AsyncDataTree, CompressibleAsyncDataTree, ITreeCompressionDelegate } from 'vs/base/browser/ui/tree/asyncDataTree'; -import { ICompressedTreeNode } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; -import { ICompressibleTreeRenderer } from 'vs/base/browser/ui/tree/objectTree'; -import { IAsyncDataSource, ITreeNode } from 'vs/base/browser/ui/tree/tree'; +import { AsyncDataTree } from 'vs/base/browser/ui/tree/asyncDataTree'; +import { IAsyncDataSource, ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; import { timeout } from 'vs/base/common/async'; import { Iterable } from 'vs/base/common/iterator'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; @@ -39,7 +37,7 @@ function find(element: Element, id: string): Element | undefined { return undefined; } -class Renderer implements ICompressibleTreeRenderer { +class Renderer implements ITreeRenderer { readonly templateId = 'default'; renderTemplate(container: HTMLElement): HTMLElement { return container; @@ -50,15 +48,6 @@ class Renderer implements ICompressibleTreeRenderer disposeTemplate(templateData: HTMLElement): void { // noop } - renderCompressedElements(node: ITreeNode, void>, index: number, templateData: HTMLElement, height: number | undefined): void { - const result: string[] = []; - - for (const element of node.element.elements) { - result.push(element.id + (element.suffix || '')); - } - - templateData.textContent = result.join('/'); - } } class IdentityProvider implements IIdentityProvider { @@ -506,49 +495,4 @@ suite('AsyncDataTree', function () { assert(tree.isCollapsible(a), 'a is still collapsible'); assert(!tree.isCollapsed(a), 'a is expanded'); }); - - test('issue #199441', async () => { - const container = document.createElement('div'); - - const dataSource = new class implements IAsyncDataSource { - hasChildren(element: Element): boolean { - return !!element.children && element.children.length > 0; - } - async getChildren(element: Element) { - return element.children ?? Iterable.empty(); - } - }; - - const compressionDelegate = new class implements ITreeCompressionDelegate { - isIncompressible(element: Element): boolean { - return !dataSource.hasChildren(element); - } - }; - - const model = new Model({ - id: 'root', - children: [{ - id: 'a', children: [{ - id: 'b', - children: [{ id: 'b.txt' }] - }] - }] - }); - - const collapseByDefault = (element: Element) => false; - - const tree = store.add(new CompressibleAsyncDataTree('test', container, new VirtualDelegate(), compressionDelegate, [new Renderer()], dataSource, { identityProvider: new IdentityProvider(), collapseByDefault })); - tree.layout(200); - - await tree.setInput(model.root); - assert.deepStrictEqual(Array.from(container.querySelectorAll('.monaco-list-row')).map(e => e.textContent), ['a/b', 'b.txt']); - - model.get('a').children!.push({ - id: 'c', - children: [{ id: 'c.txt' }] - }); - - await tree.updateChildren(model.root, true); - assert.deepStrictEqual(Array.from(container.querySelectorAll('.monaco-list-row')).map(e => e.textContent), ['a', 'b', 'b.txt', 'c', 'c.txt']); - }); });