coveo-search-ui
Version:
Coveo JavaScript Search Framework
80 lines (61 loc) • 2.34 kB
text/typescript
import { ISearchDropdownNavigator, DefaultSearchDropdownNavigator, ISearchDropdownConfig } from './DefaultSearchDropdownNavigator';
import { $$, Dom } from '../../../utils/Dom';
import { IFacetSearch } from '../IFacetSearch';
export interface IFacetSearchDropdownConfig extends ISearchDropdownConfig {
facetSearch: IFacetSearch;
}
export class FacetSearchDropdownNavigator implements ISearchDropdownNavigator {
private defaultDropdownNavigator: DefaultSearchDropdownNavigator;
constructor(private config: IFacetSearchDropdownConfig) {
this.defaultDropdownNavigator = new DefaultSearchDropdownNavigator(config);
}
public setAsCurrentResult(dom: Dom) {
this.defaultDropdownNavigator.setAsCurrentResult(dom);
}
public get currentResult() {
return this.defaultDropdownNavigator.currentResult;
}
public focusNextElement() {
this.toggleCanExcludeCurrentResult();
if (this.willExcludeCurrentResult) {
this.announceCurrentResultCanBeExcluded();
return;
}
this.defaultDropdownNavigator.moveCurrentResultDown();
}
public focusPreviousElement() {
if (this.willExcludeCurrentResult) {
this.toggleCanExcludeCurrentResult();
return;
}
this.moveResultUp();
this.toggleCanExcludeCurrentResult();
}
private moveResultUp() {
if (this.willExcludeCurrentResult) {
this.toggleCanExcludeCurrentResult();
return;
}
this.defaultDropdownNavigator.moveCurrentResultUp();
this.toggleCanExcludeCurrentResult();
}
private get isCurrentResultNotAFacetValue() {
return this.currentResult.hasClass('coveo-facet-search-select-all') || this.currentResult.hasClass('coveo-facet-value-not-found');
}
private get willExcludeCurrentResult() {
return this.currentResult.hasClass('coveo-facet-value-will-exclude');
}
private toggleCanExcludeCurrentResult() {
if (this.isCurrentResultNotAFacetValue) {
return;
}
this.currentResult.toggleClass('coveo-facet-value-will-exclude', !this.willExcludeCurrentResult);
}
private announceCurrentResultCanBeExcluded() {
if (this.isCurrentResultNotAFacetValue) {
return;
}
const excludeIcon = $$(this.currentResult).find('.coveo-facet-value-exclude');
this.config.facetSearch.updateAriaLive(excludeIcon.getAttribute('aria-label'));
}
}