air-lib
Version:
This is Air's angular component library
1,172 lines (1,156 loc) • 107 kB
JavaScript
/**
* @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)">×</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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