[ACS-10206]: setting haspopup after init (#11475)

* [ACS-10206]: setting haspopup after init

* [ACS-10206]: sonarQube fixes

* [ACS-10206]: sonarQube fixes

* [ACS-10206]: sonarQube fixes

* [ACS-10206]: cleanup

* [ACS-10206]: revert
This commit is contained in:
Anton Ramanovich
2026-01-22 07:24:55 +01:00
committed by GitHub
parent 506aeecdc2
commit c81a64be79
3 changed files with 60 additions and 24 deletions
@@ -1,40 +1,65 @@
<mat-chip [attr.data-automation-id]="'search-filter-chip-' + category.name"
[disableRipple]="true"
class="adf-search-filter-chip"
[class.adf-search-toggle-chip]="(widget.getDisplayValue() | async) || menuTrigger.menuOpen"
tabindex="0"
[matMenuTriggerFor]="menu"
(menuOpened)="onMenuOpen()"
(keydown.enter)="onEnterKeydown()"
(keydown.escape)="onEscKeydown()"
[attr.title]="widget.getDisplayValue() | async"
#menuTrigger="matMenuTrigger">
<mat-chip
role="button"
[attr.data-automation-id]="'search-filter-chip-' + category.name"
[disableRipple]="true"
class="adf-search-filter-chip"
[class.adf-search-toggle-chip]="(widget.getDisplayValue() | async) || menuTrigger.menuOpen"
tabindex="0"
[matMenuTriggerFor]="menu"
(menuOpened)="onMenuOpen()"
(keydown.enter)="onEnterKeydown()"
(keydown.escape)="onEscKeydown()"
[attr.title]="widget.getDisplayValue() | async"
[attr.aria-label]="category.name | translate"
[attr.aria-expanded]="menuTrigger.menuOpen"
[attr.aria-haspopup]="'dialog'"
#menuTrigger="matMenuTrigger"
>
<span class="adf-search-filter-placeholder">
<span class="adf-search-filter-ellipsis">{{ category.name | translate }}:</span>
</span>
<span class="adf-search-filter-ellipsis adf-filter-value" *ngIf="widget.getDisplayValue() | async as displayValue; else showAny">
&nbsp;{{ displayValue | translate }}
</span>
<ng-template #showAny><span class="adf-search-filter-ellipsis adf-filter-value">&nbsp;{{ 'SEARCH.FILTER.ANY' | translate }}</span></ng-template>
<ng-template #showAny
><span class="adf-search-filter-ellipsis adf-filter-value">&nbsp;{{ 'SEARCH.FILTER.ANY' | translate }}</span></ng-template
>
<mat-icon class="adf-search-filter-chip-icon" [adf-icon]="chipIcon" />
</mat-chip>
<mat-menu #menu="matMenu" class="adf-search-widget-extra-width" backdropClass="adf-search-filter-chip-menu" [class]="'adf-search-filter-chip-menu-panel adf-search-filter-chip-menu-panel-' + category.id" (closed)="onClosed()">
<div #menuContainer [attr.data-automation-id]="'search-field-' + category.name">
<adf-search-filter-menu-card (click)="$event.stopPropagation()"
(keydown.tab)="$event.stopPropagation();"
(keydown.shift.tab)="$event.stopPropagation()"
(close)="menuTrigger.closeMenu()">
<mat-menu
#menu="matMenu"
class="adf-search-widget-extra-width"
backdropClass="adf-search-filter-chip-menu"
[class]="'adf-search-filter-chip-menu-panel adf-search-filter-chip-menu-panel-' + category.id"
(closed)="onClosed()"
role="presentation"
>
<div
[attr.aria-label]="category.name | translate"
role="dialog"
aria-modal="false"
#menuContainer
[attr.data-automation-id]="'search-field-' + category.name"
>
<adf-search-filter-menu-card
(click)="$event.stopPropagation()"
(keydown.tab)="$event.stopPropagation()"
(keydown.shift.tab)="$event.stopPropagation()"
(close)="menuTrigger.closeMenu()"
>
<ng-container ngProjectAs="filter-title">
{{ category.name | translate }} <ng-container *ngIf="category.component.settings.unit">({{category.component.settings.unit}})</ng-container>
{{ category.name | translate }}
<ng-container *ngIf="category.component.settings.unit">({{ category.component.settings.unit }})</ng-container>
</ng-container>
<ng-container ngProjectAs="filter-content">
<adf-search-widget-container #widget
[id]="category.id"
[selector]="category.component.selector"
[settings]="category.component.settings" />
<adf-search-widget-container
#widget
[id]="category.id"
[selector]="category.component.selector"
[settings]="category.component.settings"
/>
</ng-container>
<ng-container ngProjectAs="filter-actions">
@@ -105,4 +105,8 @@ describe('SearchWidgetChipComponent', () => {
expect(focusTrap.destroy).toHaveBeenCalled();
expect(component.focusTrap).toBeNull();
});
it('should set aria-haspopup to "dialog" for matMenu trigger on initialization', () => {
expect(component.menuTriggerEl.nativeElement.getAttribute('aria-haspopup')).toBe('dialog');
});
});
@@ -57,6 +57,9 @@ export class SearchWidgetChipComponent implements AfterViewInit {
@ViewChild('menuContainer', { static: false })
menuContainer: ElementRef;
@ViewChild('menuTrigger', { read: ElementRef, static: false })
menuTriggerEl: ElementRef;
@ViewChild('menuTrigger', { static: false })
menuTrigger: MatMenuTrigger;
@@ -78,6 +81,10 @@ export class SearchWidgetChipComponent implements AfterViewInit {
.subscribe(() => {
this.cd.detectChanges();
});
if (this.menuTriggerEl) {
this.menuTriggerEl.nativeElement.setAttribute('aria-haspopup', 'dialog');
}
}
onMenuOpen() {