explorer: properly set aria attributes on compact folders

fixes #86414
This commit is contained in:
isidor 2020-06-18 16:56:36 +02:00
parent 01630824e8
commit 994e64fac1
3 changed files with 23 additions and 3 deletions

View file

@ -450,6 +450,16 @@ export class ExplorerView extends ViewPane {
}
}));
this._register(this.tree.onDidChangeCollapseState(e => {
const element = e.node.element?.element;
if (element) {
const navigationController = this.renderer.getCompressedNavigationController(element instanceof Array ? element[0] : element);
if (navigationController) {
navigationController.updateCollapsed(e.node.collapsed);
}
}
}));
// save view state
this._register(this.storageService.onWillSaveState(() => {
this.storageService.store(ExplorerView.TREE_VIEW_STATE_STORAGE_KEY, JSON.stringify(this.tree.getViewState()), StorageScope.WORKSPACE);

View file

@ -134,6 +134,7 @@ export interface ICompressedNavigationController {
first(): void;
last(): void;
setIndex(index: number): void;
updateCollapsed(collapsed: boolean): void;
}
export class CompressedNavigationController implements ICompressedNavigationController, IDisposable {
@ -153,7 +154,7 @@ export class CompressedNavigationController implements ICompressedNavigationCont
private _onDidChange = new Emitter<void>();
readonly onDidChange = this._onDidChange.event;
constructor(private id: string, readonly items: ExplorerItem[], templateData: IFileTemplateData) {
constructor(private id: string, readonly items: ExplorerItem[], templateData: IFileTemplateData, private depth: number, private collapsed: boolean) {
this._index = items.length - 1;
this.updateLabels(templateData);
@ -165,7 +166,9 @@ export class CompressedNavigationController implements ICompressedNavigationCont
for (let i = 0; i < this.labels.length; i++) {
this.labels[i].setAttribute('aria-label', this.items[i].name);
this.labels[i].setAttribute('aria-level', `${this.depth + i}`);
}
this.updateCollapsed(this.collapsed);
if (this._index < this.labels.length) {
DOM.addClass(this.labels[this._index], 'active');
@ -216,6 +219,13 @@ export class CompressedNavigationController implements ICompressedNavigationCont
this._onDidChange.fire();
}
updateCollapsed(collapsed: boolean): void {
this.collapsed = collapsed;
for (let i = 0; i < this.labels.length; i++) {
this.labels[i].setAttribute('aria-expanded', collapsed ? 'false' : 'true');
}
}
dispose(): void {
this._onDidChange.dispose();
this._updateLabelDisposable.dispose();
@ -308,7 +318,7 @@ export class FilesRenderer implements ICompressibleTreeRenderer<ExplorerItem, Fu
const label = node.element.elements.map(e => e.name);
disposables.add(this.renderStat(stat, label, id, node.filterData, templateData));
const compressedNavigationController = new CompressedNavigationController(id, node.element.elements, templateData);
const compressedNavigationController = new CompressedNavigationController(id, node.element.elements, templateData, node.depth, node.collapsed);
disposables.add(compressedNavigationController);
this.compressedNavigationControllers.set(stat, compressedNavigationController);

View file

@ -87,7 +87,7 @@ suite('Files - ExplorerView', () => {
container: label,
onDidRender: emitter.event
}
});
}, 1, false);
assert.equal(navigationController.count, 3);
assert.equal(navigationController.index, 2);