UNPKG

air-lib

Version:

This is Air's angular component library

1,172 lines (1,156 loc) 107 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter, ElementRef, forwardRef } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { SelectItem } from './select-item'; import { stripTags } from './select-pipes'; import { escapeRegexp } from './common'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; // Customization: NEW STRING: import { MessageEvent } from '../../../services/Broadcaster/message-event'; import { AutocompleteCountSettings } from '../../../entities/auto-complete-count-settings'; /** @type {?} */ const styles = ` .ui-select-toggle { position: relative; } /* Fix Bootstrap dropdown position when inside a input-group */ .input-group > .dropdown { /* Instead of relative */ position: static; } .ui-select-match > .btn { /* Instead of center because of .btn */ text-align: left !important; } .ui-select-match > .caret { position: absolute; top: 45%; right: 15px; } .ui-disabled { background-color: transparent; border-radius: 0; position: absolute; width: 100%; height: 100%; z-index: 5; opacity: 0; top: 0; left: 0; cursor: not-allowed; } .ui-select-choices { width: 100%; height: auto; max-height: 200px; overflow-x: hidden; margin-top: 0; } .ui-select-multiple .ui-select-choices { margin-top: 1px; } .ui-select-choices-row>a { display: block; padding: 3px 20px; clear: both; font-weight: 400; line-height: 1.42857143; color: #333; white-space: nowrap; } .ui-select-choices-row.active>a { color: #000; text-decoration: none; outline: 0; background-color: #f5f5f5; } .ui-select-multiple { height: auto; padding:3px 3px 0 3px; } .ui-select-multiple input.ui-select-search { background-color: transparent !important; /* To prevent double background when disabled */ border: none; outline: none; box-shadow: none; height: 1.6666em; padding: 0; margin-bottom: 3px; } .ui-select-match .close { font-size: 1.6em; line-height: 0.75; } .ui-select-multiple .ui-select-match-item { outline: 0; margin: 0 3px 3px 0; } .ui-select-toggle > .caret { position: absolute; height: 10px; top: 50%; right: 10px; margin-top: -2px; } .autocomplete-count{ font-weight: 400; } .ui-select-choices-row:hover { background-color: #f5f5f5; } .text-muted{ color: #cccccc; } `; export class SelectComponent { // Customization: NEW STRINGS: /** * @param {?} element * @param {?} sanitizer * @param {?} messageEvent */ constructor(element, sanitizer, messageEvent) { this.sanitizer = sanitizer; this.messageEvent = messageEvent; this.editInputData = true; this.allowClear = false; this.placeholder = ''; this.idField = 'id'; this.textField = 'text'; this.multiple = false; this.isSearch = false; this.allowSearchIcons = false; this.hasError = false; this.searchPrepared = new EventEmitter(); // Customization: NEW STRINGS: this.componentId = ''; this.enterKeySuppress = false; this.opened = new EventEmitter(); this.closed = new EventEmitter(); this.inputText = new EventEmitter(); this.data = new EventEmitter(); this.selected = new EventEmitter(); this.removed = new EventEmitter(); this.typed = new EventEmitter(); this.options = []; this.itemObjects = []; this.inputMode = false; this.optionsOpened = false; this.inputValue = ''; this._items = []; this._disabled = false; this._active = []; this.propagateChange = (_) => { }; // Customization: COMMENTED STRINGS: // public constructor(element: ElementRef, private sanitizer: DomSanitizer) { this.element = element; this.clickedOutside = this.clickedOutside.bind(this); } /** * @param {?} value * @return {?} */ set items(value) { if (!value) { this._items = this.itemObjects = []; } else { this._items = value.filter((item) => { // if ((typeof item === 'string' && item) || (typeof item === 'object' && item && item.text && item.id)) { if ((typeof item === 'string') || (typeof item === 'object' && item.text)) { return item; } }); this.itemObjects = this._items.map((item) => new SelectItem(item)); // Customization: NEW STRING: this.options = this.itemObjects; } } /** * @param {?} value * @return {?} */ set disabled(value) { this._disabled = value; if (this._disabled === true) { this.hideOptions(); } } /** * @return {?} */ get disabled() { return this._disabled; } /** * @param {?} selectedItems * @return {?} */ set active(selectedItems) { // Customization: NEW STRINGS: if (this.activeOption) { this.activeOption.id = ''; this.activeOption.text = ''; } if (!selectedItems || selectedItems.length === 0) { this._active = []; } else { /** @type {?} */ const areItemsStrings = typeof selectedItems[0] === 'string'; this._active = selectedItems.map((item) => { /** @type {?} */ const data = areItemsStrings ? item : { id: item[this.idField], text: item[this.textField] }; return new SelectItem(data); }); } } /** * @param {?} searchTitle * @return {?} */ set title(searchTitle) { if (searchTitle) { this._title = searchTitle; } } /** * @return {?} */ get title() { return this._title; } /** * @param {?} autocompleteCountSettings * @return {?} */ set autocompleteCountSettings(autocompleteCountSettings) { if (autocompleteCountSettings) { this.optionsAutocomplete = autocompleteCountSettings; } } /** * @param {?} value * @return {?} */ set searchString(value) { if (value) { this.inputValue = value; } } /** * @return {?} */ get active() { return this._active; } /** * @return {?} */ get firstItemHasChildren() { return this.itemObjects[0] && this.itemObjects[0].hasChildren(); } /** * @param {?} obj * @return {?} */ writeValue(obj) { this.active = obj; } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this.propagateChange = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { // throw new Error("Method not implemented."); } /** * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { // throw new Error("Method not implemented."); } /** * @param {?} value * @param {?=} e * @return {?} */ selectMatch(value, e = null) { if (value.id.indexOf('noclick') > -1) { return; } if (e) { e.stopPropagation(); e.preventDefault(); } if (this.options.length <= 0) { return; } if (this.multiple === true) { this.active.push(value); this.data.next(this.active); } if (this.multiple === false) { this.active[0] = value; this.data.next(this.active[0]); } this.doEvent('selected', value); this.hideOptions(); if (this.multiple === true) { this.focusToInput(''); } else { this.focusToInput(stripTags(value.text)); this.element.nativeElement.querySelector('.ui-select-container').focus(); } } /** * @param {?} html * @return {?} */ sanitize(html) { return this.sanitizer.bypassSecurityTrustHtml(html); } /** * @param {?} e * @param {?=} isUpMode * @return {?} */ inputEvent(e, isUpMode = false) { // Customization: NEW STRING: if (e.type === 'keyup') { /** @type {?} */ const inputText = document.getElementById(this.componentId + '-input-text'); if (this.inputText && inputText) { this.inputText.emit(inputText.value); this.searchText = inputText.value; } } // tab if (e.keyCode === 9) { return; } if (!this.isSearch && isUpMode && (e.keyCode === 37 || e.keyCode === 39 || e.keyCode === 38 || e.keyCode === 40)) { e.preventDefault(); return; } // backspace if (!isUpMode && e.keyCode === 8) { /** @type {?} */ const el = this.element.nativeElement .querySelector('div.ui-select-container > input'); if (!el.value || el.value.length <= 0) { if (this.active.length > 0) { this.remove(this.active[this.active.length - 1]); } e.preventDefault(); } } // esc if (!isUpMode && e.keyCode === 27) { this.hideOptions(); this.element.nativeElement.children[0].focus(); e.preventDefault(); return; } // del if (!isUpMode && e.keyCode === 46) { if (this.active.length > 0) { this.remove(this.active[this.active.length - 1]); } e.preventDefault(); } // left if (!isUpMode && e.keyCode === 37 && this._items.length > 0) { this.behavior.first(); e.preventDefault(); return; } // right if (!isUpMode && e.keyCode === 39 && this._items.length > 0) { this.behavior.last(); e.preventDefault(); return; } // up if (!isUpMode && e.keyCode === 38) { this.behavior.prev(); e.preventDefault(); return; } // down if (!isUpMode && e.keyCode === 40) { this.behavior.next(); e.preventDefault(); return; } // enter if (e.keyCode === 13) { // Customization: NEW STRINGS: if (this.isSearch) { this.selectionPrepared(e.target.value); } else { if (this.active.indexOf(this.activeOption) === -1) { this.selectActiveMatch(); this.behavior.next(); } e.preventDefault(); return; } } /** @type {?} */ const target = e.target || e.srcElement; if (target && target.value) { this.inputValue = target.value; this.behavior.filter(new RegExp(escapeRegexp(this.inputValue), 'ig')); this.doEvent('typed', this.inputValue); } } /** * @return {?} */ ngOnInit() { this.behavior = (this.firstItemHasChildren) ? new ChildrenBehavior(this) : new GenericBehavior(this); // Customization: NEW STRING: this.registerBroadcastEvent(); } /** * @param {?} item * @return {?} */ remove(item) { if (this._disabled === true) { return; } if (this.multiple === true && this.active) { /** @type {?} */ const index = this.active.indexOf(item); this.active.splice(index, 1); this.data.next(this.active); this.doEvent('removed', item); } if (this.multiple === false) { this.active = []; this.data.next(this.active); this.removed.emit(this.active); } } /** * @param {?} type * @param {?} value * @return {?} */ doEvent(type, value) { if (((/** @type {?} */ (this)))[type] && value) { ((/** @type {?} */ (this)))[type].next(value); } if (type === 'selected') { this.propagateChange(value); } } /** * @return {?} */ clickedOutside() { this.inputMode = false; this.optionsOpened = false; // Customization: NEW STRING: this.closed.emit(); } /** * @param {?} e * @return {?} */ matchClick(e) { if (this._disabled === true) { return; } this.inputMode = !this.inputMode; if (this.inputMode === true && ((this.multiple === true && e) || this.multiple === false)) { /** @type {?} */ let editableValue = ''; if (e.target.textContent && this.editInputData) { editableValue = e.target.textContent; // @ts-ignore this.searchSettings.presetList.forEach(item => { if (item.text === editableValue) { editableValue = ''; } }); // @ts-ignore if (editableValue === this.searchSettings.placeholder) { editableValue = ''; } } else { editableValue = ''; } this.focusToInput(editableValue); this.open(); } } /** * @param {?} event * @return {?} */ mainClick(event) { if (this.inputMode === true || this._disabled === true) { return; } if (event.keyCode === 46) { event.preventDefault(); this.inputEvent(event); return; } if (event.keyCode === 8) { event.preventDefault(); this.inputEvent(event, true); return; } if (event.keyCode === 9 || event.keyCode === 13 || event.keyCode === 27 || (event.keyCode >= 37 && event.keyCode <= 40)) { event.preventDefault(); return; } this.inputMode = true; /** @type {?} */ const value = String .fromCharCode(96 <= event.keyCode && event.keyCode <= 105 ? event.keyCode - 48 : event.keyCode) .toLowerCase(); this.focusToInput(value); this.open(); /** @type {?} */ const target = event.target || event.srcElement; target.value = value; this.inputEvent(event); } /** * @param {?} value * @return {?} */ selectActive(value) { this.activeOption = value; } /** * @param {?} value * @return {?} */ isActive(value) { return this.activeOption && (this.activeOption.text === value.text); } /** * @param {?=} value * @return {?} */ focusToInput(value = '') { setTimeout(() => { /** @type {?} */ const el = this.element.nativeElement.querySelector('div.ui-select-container > input'); if (el) { el.focus(); el.value = value; } }, 0); } /** * @private * @return {?} */ open() { this.options = this.itemObjects .filter((option) => (this.multiple === false || this.multiple === true && !this.active.find((o) => option.text === o.text))); if (this.options.length > 0) { this.behavior.first(); } this.optionsOpened = true; // Customization: NEW STRINGS: this.emitBroadcastEvent(); this.opened.emit(); } /** * @private * @return {?} */ hideOptions() { this.inputMode = false; this.optionsOpened = false; } /** * @private * @return {?} */ selectActiveMatch() { this.selectMatch(this.activeOption); } // Customization: NEW STRINGS: /** * @private * @return {?} */ registerBroadcastEvent() { this.messageEvent.on() .subscribe(message => { if (message !== this.componentId) { this.clickedOutside(); } }); } /** * @private * @return {?} */ emitBroadcastEvent() { this.messageEvent.fire(this.componentId); } /** * @param {?} value * @return {?} */ selectionPrepared(value) { this.searchPrepared.emit(value); this.hideOptions(); } } SelectComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line:component-selector selector: 'ng-select', // Customization: NEW STRING: providers: [MessageEvent, { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SelectComponent), multi: true } ], template: ` <div tabindex="0" *ngIf="multiple === false" (keyup)="mainClick($event)" [offClick]="clickedOutside" class="ui-select-container dropdown open" [ngClass]="{'ui-select-focusud':inputMode, 'has-error': hasError}"> <div [ngClass]="{'ui-disabled': disabled}"></div> <div *ngIf="title" class='title-input'>{{title}}</div> <div class="ui-select-match" *ngIf="!inputMode"> <span tabindex="-1" class="btn btn-default btn-secondary form-control ui-select-toggle" (click)="matchClick($event)" style="outline: 0;"> <span *ngIf="active.length <= 0 || active[0].id ==''" class="ui-select-placeholder text-muted">{{placeholder}}</span> <span *ngIf="active.length > 0" class="ui-select-match-text" [ngClass]="{'ui-select-allow-clear': allowClear && active.length > 0}" [innerHTML]="sanitize(active[0].text)"></span> <i class="dropdown-toggle pull-right"></i> <i *ngIf="!isSearch" class="caret pull-right"></i> </span> </div> <div class='ui-block-icons'> <a *ngIf="allowClear && active.length>0" class="icons rotate45" (click)="remove(activeOption)"> <i class="ui-close">+</i> </a> <a *ngIf="allowSearchIcons && active.length > 0" class="icons" (click)="selectionPrepared(searchText)"> <i class="fa fa-search" aria-hidden="true"></i> </a> </div> <input #search type="text" autocomplete="false" tabindex="-1" id="{{componentId}}-input-text" (keyup)="inputEvent($event, true)" [disabled]="disabled" class="form-control ui-select-search" *ngIf="inputMode" placeholder="{{active.length <= 0 ? placeholder : ''}}"> <!-- options template --> <ul *ngIf="optionsOpened && options && options.length > 0 && !firstItemHasChildren" class="ui-select-choices dropdown-menu" role="menu"> <li *ngFor="let o of options" role="menuitem"> <div class="ui-select-choices-row" (click)="selectMatch(o, $event)" [ngClass]="{'active': o.text == active[0]?.text}"> <a href="javascript:void(0)" class="dropdown-item"> <div [innerHtml]="sanitize(o.text | highlight:inputValue)"></div> </a> </div> </li> <li *ngIf="optionsAutocomplete?.hasAutocompleteCount"> <div class="autocomplete-count color-link p-l-30"><i [innerHTML]="optionsAutocomplete?.autocompleteCountString"></i></div> </li> </ul> <ul *ngIf="optionsOpened && options && options.length > 0 && firstItemHasChildren" class="ui-select-choices dropdown-menu" role="menu"> <li *ngFor="let c of options; let index=index" role="menuitem"> <div class="divider dropdown-divider" *ngIf="index > 0"></div> <div class="dropdown-header">{{c.text}}</div> <div *ngFor="let o of c.children" class="ui-select-choices-row" [class.active]="isActive(o)" (mouseenter)="selectActive(o)" (click)="selectMatch(o, $event)" [ngClass]="{'active': isActive(o)}"> <a href="javascript:void(0)" class="dropdown-item"> <div [innerHtml]="sanitize(o.text | highlight:inputValue)"></div> </a> </div> </li> </ul> </div> <div tabindex="0" *ngIf="multiple === true" (keyup)="mainClick($event)" (focus)="focusToInput('')" [offClick]="clickedOutside" class="ui-select-container ui-select-multiple dropdown form-control open"> <div [ngClass]="{'ui-disabled': disabled}"></div> <span class="ui-select-match"> <span *ngFor="let a of active"> <span class="ui-select-match-item btn btn-default btn-secondary btn-xs" tabindex="-1" type="button" [ngClass]="{'btn-default': true}"> <a class="close" style="margin-left: 5px; padding: 0;" (click)="remove(a)">&times;</a> <span>{{a.text}}</span> </span> </span> </span> <input type="text" (keydown)="inputEvent($event)" (keyup)="inputEvent($event, true)" (click)="matchClick($event)" [disabled]="disabled" id="{{componentId}}-input-text" autocomplete="false" autocorrect="off" autocapitalize="off" spellcheck="false" class="form-control ui-select-search" placeholder="{{active.length <= 0 ? placeholder : ''}}" role="combobox"> <!-- options template --> <ul *ngIf="optionsOpened && options && options.length > 0 && !firstItemHasChildren" class="ui-select-choices dropdown-menu" role="menu"> <li *ngFor="let o of options" role="menuitem"> <div class="ui-select-choices-row" [class.active]="isActive(o)" (mouseenter)="selectActive(o)" (click)="selectMatch(o, $event)"> <a href="javascript:void(0)" class="dropdown-item"> <div [innerHtml]="sanitize(o.text | highlight:inputValue)"></div> </a> </div> </li> </ul> <ul *ngIf="optionsOpened && options && options.length > 0 && firstItemHasChildren" class="ui-select-choices dropdown-menu" role="menu"> <li *ngFor="let c of options; let index=index" role="menuitem"> <div class="divider dropdown-divider" *ngIf="index > 0"></div> <div class="dropdown-header">{{c.text}}</div> <div *ngFor="let o of c.children" class="ui-select-choices-row" [class.active]="isActive(o)" (mouseenter)="selectActive(o)" (click)="selectMatch(o, $event)" [ngClass]="{'active': isActive(o)}"> <a href="javascript:void(0)" class="dropdown-item"> <div [innerHtml]="sanitize(o.text | highlight:inputValue)"></div> </a> </div> </li> </ul> </div> `, styles: [styles] }] } ]; SelectComponent.ctorParameters = () => [ { type: ElementRef }, { type: DomSanitizer }, { type: MessageEvent } ]; SelectComponent.propDecorators = { items: [{ type: Input }], disabled: [{ type: Input }], active: [{ type: Input }], title: [{ type: Input }], autocompleteCountSettings: [{ type: Input }], searchString: [{ type: Input }], editInputData: [{ type: Input }], searchSettings: [{ type: Input }], allowClear: [{ type: Input }], placeholder: [{ type: Input }], idField: [{ type: Input }], textField: [{ type: Input }], multiple: [{ type: Input }], isSearch: [{ type: Input }], allowSearchIcons: [{ type: Input }], hasError: [{ type: Input }], searchPrepared: [{ type: Output }], componentId: [{ type: Input }], enterKeySuppress: [{ type: Input }], opened: [{ type: Output }], closed: [{ type: Output }], inputText: [{ type: Output }], data: [{ type: Output }], selected: [{ type: Output }], removed: [{ type: Output }], typed: [{ type: Output }] }; if (false) { /** @type {?} */ SelectComponent.prototype.editInputData; /** @type {?} */ SelectComponent.prototype.searchSettings; /** @type {?} */ SelectComponent.prototype.allowClear; /** @type {?} */ SelectComponent.prototype.placeholder; /** @type {?} */ SelectComponent.prototype.idField; /** @type {?} */ SelectComponent.prototype.textField; /** @type {?} */ SelectComponent.prototype.multiple; /** @type {?} */ SelectComponent.prototype.isSearch; /** * @type {?} * @private */ SelectComponent.prototype._title; /** @type {?} */ SelectComponent.prototype.allowSearchIcons; /** @type {?} */ SelectComponent.prototype.hasError; /** @type {?} */ SelectComponent.prototype.searchPrepared; /** @type {?} */ SelectComponent.prototype.searchText; /** @type {?} */ SelectComponent.prototype.optionsAutocomplete; /** @type {?} */ SelectComponent.prototype.componentId; /** @type {?} */ SelectComponent.prototype.enterKeySuppress; /** @type {?} */ SelectComponent.prototype.opened; /** @type {?} */ SelectComponent.prototype.closed; /** @type {?} */ SelectComponent.prototype.inputText; /** @type {?} */ SelectComponent.prototype.data; /** @type {?} */ SelectComponent.prototype.selected; /** @type {?} */ SelectComponent.prototype.removed; /** @type {?} */ SelectComponent.prototype.typed; /** @type {?} */ SelectComponent.prototype.options; /** @type {?} */ SelectComponent.prototype.itemObjects; /** @type {?} */ SelectComponent.prototype.activeOption; /** @type {?} */ SelectComponent.prototype.element; /** @type {?} */ SelectComponent.prototype.inputMode; /** @type {?} */ SelectComponent.prototype.optionsOpened; /** * @type {?} * @private */ SelectComponent.prototype.behavior; /** @type {?} */ SelectComponent.prototype.inputValue; /** * @type {?} * @private */ SelectComponent.prototype._items; /** * @type {?} * @private */ SelectComponent.prototype._disabled; /** * @type {?} * @private */ SelectComponent.prototype._active; /** @type {?} */ SelectComponent.prototype.propagateChange; /** * @type {?} * @private */ SelectComponent.prototype.sanitizer; /** * @type {?} * @private */ SelectComponent.prototype.messageEvent; } export class Behavior { /** * @param {?} actor */ constructor(actor) { this.optionsMap = new Map(); this.actor = actor; } /** * @return {?} */ fillOptionsMap() { this.optionsMap.clear(); /** @type {?} */ let startPos = 0; this.actor.itemObjects .map((item) => { startPos = item.fillChildrenHash(this.optionsMap, startPos); }); } /** * @param {?=} optionsMap * @return {?} */ ensureHighlightVisible(optionsMap = null) { /** @type {?} */ const container = this.actor.element.nativeElement.querySelector('.ui-select-choices-content'); if (!container) { return; } /** @type {?} */ const choices = container.querySelectorAll('.ui-select-choices-row'); if (choices.length < 1) { return; } /** @type {?} */ const activeIndex = this.getActiveIndex(optionsMap); if (activeIndex < 0) { return; } /** @type {?} */ const highlighted = choices[activeIndex]; if (!highlighted) { return; } /** @type {?} */ const posY = highlighted.offsetTop + highlighted.clientHeight - container.scrollTop; /** @type {?} */ const height = container.offsetHeight; if (posY > height) { container.scrollTop += posY - height; } else if (posY < highlighted.clientHeight) { container.scrollTop -= highlighted.clientHeight - posY; } } /** * @private * @param {?=} optionsMap * @return {?} */ getActiveIndex(optionsMap = null) { /** @type {?} */ let ai = this.actor.options.indexOf(this.actor.activeOption); if (ai < 0 && optionsMap !== null) { /** @type {?} */ const a = optionsMap.get(this.actor.activeOption.id); if (a) { ai = a; } else { ai = 0; } } return ai; } } if (false) { /** @type {?} */ Behavior.prototype.optionsMap; /** @type {?} */ Behavior.prototype.actor; } export class GenericBehavior extends Behavior { /** * @param {?} actor */ constructor(actor) { super(actor); } /** * @return {?} */ first() { this.actor.activeOption = this.actor.options[0]; super.ensureHighlightVisible(); } /** * @return {?} */ last() { this.actor.activeOption = this.actor.options[this.actor.options.length - 1]; super.ensureHighlightVisible(); } /** * @return {?} */ prev() { /** @type {?} */ const index = this.actor.options.indexOf(this.actor.activeOption); this.actor.activeOption = this.actor .options[index - 1 < 0 ? this.actor.options.length - 1 : index - 1]; super.ensureHighlightVisible(); } /** * @return {?} */ next() { /** @type {?} */ const index = this.actor.options.indexOf(this.actor.activeOption); this.actor.activeOption = this.actor .options[index + 1 > this.actor.options.length - 1 ? 0 : index + 1]; super.ensureHighlightVisible(); } /** * @param {?} query * @return {?} */ filter(query) { /** @type {?} */ const options = this.actor.itemObjects .filter((option) => { return stripTags(option.text).match(query) && (this.actor.multiple === false || (this.actor.multiple === true && this.actor.active.map((item) => item.id).indexOf(option.id) < 0)); }); this.actor.options = options; if (this.actor.options.length > 0) { this.actor.activeOption = this.actor.options[0]; super.ensureHighlightVisible(); } } } export class ChildrenBehavior extends Behavior { /** * @param {?} actor */ constructor(actor) { super(actor); } /** * @return {?} */ first() { this.actor.activeOption = this.actor.options[0].children[0]; this.fillOptionsMap(); this.ensureHighlightVisible(this.optionsMap); } /** * @return {?} */ last() { this.actor.activeOption = this.actor .options[this.actor.options.length - 1] .children[this.actor.options[this.actor.options.length - 1].children.length - 1]; this.fillOptionsMap(); this.ensureHighlightVisible(this.optionsMap); } /** * @return {?} */ prev() { /** @type {?} */ const indexParent = this.actor.options .findIndex((option) => this.actor.activeOption.parent && this.actor.activeOption.parent.id === option.id); /** @type {?} */ const index = this.actor.options[indexParent].children .findIndex((option) => this.actor.activeOption && this.actor.activeOption.id === option.id); this.actor.activeOption = this.actor.options[indexParent].children[index - 1]; if (!this.actor.activeOption) { if (this.actor.options[indexParent - 1]) { this.actor.activeOption = this.actor .options[indexParent - 1] .children[this.actor.options[indexParent - 1].children.length - 1]; } } if (!this.actor.activeOption) { this.last(); } this.fillOptionsMap(); this.ensureHighlightVisible(this.optionsMap); } /** * @return {?} */ next() { /** @type {?} */ const indexParent = this.actor.options .findIndex((option) => this.actor.activeOption.parent && this.actor.activeOption.parent.id === option.id); /** @type {?} */ const index = this.actor.options[indexParent].children .findIndex((option) => this.actor.activeOption && this.actor.activeOption.id === option.id); this.actor.activeOption = this.actor.options[indexParent].children[index + 1]; if (!this.actor.activeOption) { if (this.actor.options[indexParent + 1]) { this.actor.activeOption = this.actor.options[indexParent + 1].children[0]; } } if (!this.actor.activeOption) { this.first(); } this.fillOptionsMap(); this.ensureHighlightVisible(this.optionsMap); } /** * @param {?} query * @return {?} */ filter(query) { /** @type {?} */ const options = []; /** @type {?} */ const optionsMap = new Map(); /** @type {?} */ let startPos = 0; // tslint:disable-next-line:prefer-const for (let si of this.actor.itemObjects) { /** @type {?} */ const children = si.children.filter((option) => query.test(option.text)); startPos = si.fillChildrenHash(optionsMap, startPos); if (children.length > 0) { /** @type {?} */ const newSi = si.getSimilar(); newSi.children = children; options.push(newSi); } } this.actor.options = options; if (this.actor.options.length > 0) { this.actor.activeOption = this.actor.options[0].children[0]; super.ensureHighlightVisible(optionsMap); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWlyLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL25nMi1zZWxlY3QtY3VzdG9tL3NlbGVjdC9zZWxlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFVLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN4QyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBR3pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUMzRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7TUFFckYsTUFBTSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FzR2Q7QUE0SkQsTUFBTTs7Ozs7OztJQXFGRixZQUFtQixPQUFtQixFQUFVLFNBQXVCLEVBQzNELFlBQTBCO1FBRFUsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUMzRCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQVl0QixrQkFBYSxHQUFHLElBQUksQ0FBQztRQUVyQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFDZixjQUFTLEdBQUcs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