From 1d4f552ae62474a84f80c3a6456293be44ea0ce1 Mon Sep 17 00:00:00 2001 From: Catalin Date: Tue, 7 Mar 2023 20:24:06 +0200 Subject: [PATCH 1/6] feat(a11y): add menu-trigger directive that sets aria-expanded --- .../custom-mat-menu-trigger/ng-package.json | 1 + .../src/custom-mat-menu-trigger.directive.ts | 68 +++++++++++++++++++ .../src/custom-mat-menu-trigger.module.ts | 9 +++ .../custom-mat-menu-trigger/src/public_api.ts | 2 + tsconfig.json | 3 + 5 files changed, 83 insertions(+) create mode 100644 projects/angular/directives/custom-mat-menu-trigger/ng-package.json create mode 100644 projects/angular/directives/custom-mat-menu-trigger/src/custom-mat-menu-trigger.directive.ts create mode 100644 projects/angular/directives/custom-mat-menu-trigger/src/custom-mat-menu-trigger.module.ts create mode 100644 projects/angular/directives/custom-mat-menu-trigger/src/public_api.ts diff --git a/projects/angular/directives/custom-mat-menu-trigger/ng-package.json b/projects/angular/directives/custom-mat-menu-trigger/ng-package.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/projects/angular/directives/custom-mat-menu-trigger/ng-package.json @@ -0,0 +1 @@ +{} diff --git a/projects/angular/directives/custom-mat-menu-trigger/src/custom-mat-menu-trigger.directive.ts b/projects/angular/directives/custom-mat-menu-trigger/src/custom-mat-menu-trigger.directive.ts new file mode 100644 index 000000000..ea18224fc --- /dev/null +++ b/projects/angular/directives/custom-mat-menu-trigger/src/custom-mat-menu-trigger.directive.ts @@ -0,0 +1,68 @@ +import { + Subject, + takeUntil, +} from 'rxjs'; + +import { LiveAnnouncer } from '@angular/cdk/a11y'; +import { + AfterContentInit, + Directive, + HostBinding, + inject, + Input, + OnDestroy, +} from '@angular/core'; +import { _MatMenuTriggerBase } from '@angular/material/menu'; + +@Directive({ + selector: '[uiCustomMatMenuTriggerFor]', +}) +export class UiCustomMatMenuTriggerDirective extends _MatMenuTriggerBase implements AfterContentInit, OnDestroy { + @HostBinding() + ariaExpanded = false; + + @Input() + expandedTranslation = 'expanded'; + + get nativeElement() { + // eslint-disable-next-line no-underscore-dangle + return (this as any)._element.nativeElement as HTMLElement; + } + + private _liveAnnouncer = inject(LiveAnnouncer); + private _destroyed$ = new Subject(); + ngAfterContentInit() { + this.menuOpened.pipe( + takeUntil(this._destroyed$), + ).subscribe(() => { + // although setting aria-expanded to true, it is not announced + this.nativeElement.setAttribute('aria-expanded', 'true'); + this._liveAnnouncer.announce(this.expandedTranslation); + + // after closing the menu it would appear for a short time as expanded + // therefore we set it as collapsed before it is actually closed + setTimeout(() => { + this.nativeElement.setAttribute('aria-expanded', 'false'); + }, 100); + }); + + this.menuClosed.pipe( + takeUntil(this._destroyed$), + ).subscribe(() => { + this.nativeElement.setAttribute('aria-expanded', 'false'); + + // timeout is required because + // after focusing another element then returning to this one, it will lose collapsed state + setTimeout(() => { + this.nativeElement.setAttribute('aria-expanded', 'false'); + }, 100); + }); + } + + ngOnDestroy() { + super.ngOnDestroy(); + this._destroyed$.next(); + this._destroyed$.complete(); + } +} + diff --git a/projects/angular/directives/custom-mat-menu-trigger/src/custom-mat-menu-trigger.module.ts b/projects/angular/directives/custom-mat-menu-trigger/src/custom-mat-menu-trigger.module.ts new file mode 100644 index 000000000..fa31c706a --- /dev/null +++ b/projects/angular/directives/custom-mat-menu-trigger/src/custom-mat-menu-trigger.module.ts @@ -0,0 +1,9 @@ +import { NgModule } from '@angular/core'; + +import { UiCustomMatMenuTriggerDirective } from './custom-mat-menu-trigger.directive'; + +@NgModule({ + declarations: [UiCustomMatMenuTriggerDirective], + exports: [UiCustomMatMenuTriggerDirective], +}) +export class UiCustomMatMenuTriggerModule { } diff --git a/projects/angular/directives/custom-mat-menu-trigger/src/public_api.ts b/projects/angular/directives/custom-mat-menu-trigger/src/public_api.ts new file mode 100644 index 000000000..fda813e9c --- /dev/null +++ b/projects/angular/directives/custom-mat-menu-trigger/src/public_api.ts @@ -0,0 +1,2 @@ +export { UiCustomMatMenuTriggerModule } from './custom-mat-menu-trigger.module'; +export { UiCustomMatMenuTriggerDirective } from './custom-mat-menu-trigger.directive'; diff --git a/tsconfig.json b/tsconfig.json index 93d684c1e..63e595377 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -55,6 +55,9 @@ "@uipath/angular/directives/keyboard-shortcut": [ "projects/angular/directives/keyboard-shortcut/src/public_api.ts" ], + "@uipath/angular/directives/custom-mat-menu-trigger": [ + "projects/angular/directives/custom-mat-menu-trigger/src/public_api.ts" + ], "@uipath/angular/directives/ui-autofocus": [ "projects/angular/directives/ui-autofocus/src/public_api.ts" ], From b784f903fcf8164e5023e5b63e3c8e8fd16f75fe Mon Sep 17 00:00:00 2001 From: Catalin Date: Tue, 7 Mar 2023 22:44:05 +0200 Subject: [PATCH 2/6] fix(a11y): filter messages that are announced --- projects/angular/a11y/src/queued-announcer/queued-announcer.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/projects/angular/a11y/src/queued-announcer/queued-announcer.ts b/projects/angular/a11y/src/queued-announcer/queued-announcer.ts index c6a12082b..dfda45bd6 100644 --- a/projects/angular/a11y/src/queued-announcer/queued-announcer.ts +++ b/projects/angular/a11y/src/queued-announcer/queued-announcer.ts @@ -16,7 +16,8 @@ export class QueuedAnnouncer { constructor(private _liveAnnouncer: LiveAnnouncer) { } - enqueue(msg: string) { + enqueue(msg: string | undefined) { + if (!msg) { return; } this._msgQueue.push(msg); if (!this._isAnnouncing) { From 6adb26416556a4dca9cd878e1a900c1dfe92a7d6 Mon Sep 17 00:00:00 2001 From: Catalin Date: Tue, 7 Mar 2023 22:45:39 +0200 Subject: [PATCH 3/6] fix(grid): announce filter menu state collapsed/expanded --- .../angular/components/ui-grid/src/ui-grid.component.html | 2 ++ projects/angular/components/ui-grid/src/ui-grid.intl.ts | 5 +++++ projects/angular/components/ui-grid/src/ui-grid.module.ts | 2 ++ .../src/custom-mat-menu-trigger.directive.ts | 6 ++---- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/projects/angular/components/ui-grid/src/ui-grid.component.html b/projects/angular/components/ui-grid/src/ui-grid.component.html index 4779d4b68..01b1fca19 100644 --- a/projects/angular/components/ui-grid/src/ui-grid.component.html +++ b/projects/angular/components/ui-grid/src/ui-grid.component.html @@ -630,6 +630,8 @@