ipsos-components
Version:
Material Design components for Angular
132 lines (111 loc) • 3.82 kB
text/typescript
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import {coerceBooleanProperty} from '@angular/cdk/coercion';
import {ENTER} from '@angular/cdk/keycodes';
import {Directive, ElementRef, EventEmitter, Input, Output} from '@angular/core';
import {MatChipList} from './chip-list';
/** Represents an input event on a `matChipInput`. */
export interface MatChipInputEvent {
/** The native `<input>` element that the event is being fired for. */
input: HTMLInputElement;
/** The value of the input. */
value: string;
}
/**
* Directive that adds chip-specific behaviors to an input element inside <mat-form-field>.
* May be placed inside or outside of an <mat-chip-list>.
*/
export class MatChipInput {
focused: boolean = false;
_chipList: MatChipList;
/** Register input for chip list */
set chipList(value: MatChipList) {
if (value) {
this._chipList = value;
this._chipList.registerInput(this);
}
}
/**
* Whether or not the chipEnd event will be emitted when the input is blurred.
*/
get addOnBlur() { return this._addOnBlur; }
set addOnBlur(value: boolean) { this._addOnBlur = coerceBooleanProperty(value); }
_addOnBlur: boolean = false;
/**
* The list of key codes that will trigger a chipEnd event.
*
* Defaults to `[ENTER]`.
*/
// TODO(tinayuangao): Support Set here
separatorKeyCodes: number[] = [ENTER];
/** Emitted when a chip is to be added. */
chipEnd = new EventEmitter<MatChipInputEvent>();
/** The input's placeholder text. */
placeholder: string = '';
/** Whether the input is empty. */
get empty(): boolean {
let value: string | null = this._inputElement.value;
return (value == null || value === '');
}
/** The native input element to which this directive is attached. */
protected _inputElement: HTMLInputElement;
constructor(protected _elementRef: ElementRef) {
this._inputElement = this._elementRef.nativeElement as HTMLInputElement;
}
/** Utility method to make host definition/tests more clear. */
_keydown(event?: KeyboardEvent) {
this._emitChipEnd(event);
}
/** Checks to see if the blur should emit the (chipEnd) event. */
_blur() {
if (this.addOnBlur) {
this._emitChipEnd();
}
this.focused = false;
// Blur the chip list if it is not focused
if (!this._chipList.focused) {
this._chipList._blur();
}
this._chipList.stateChanges.next();
}
_focus() {
this.focused = true;
this._chipList.stateChanges.next();
}
/** Checks to see if the (chipEnd) event needs to be emitted. */
_emitChipEnd(event?: KeyboardEvent) {
if (!this._inputElement.value && !!event) {
this._chipList._keydown(event);
}
if (!event || this.separatorKeyCodes.indexOf(event.keyCode) > -1) {
this.chipEnd.emit({ input: this._inputElement, value: this._inputElement.value });
if (event) {
event.preventDefault();
}
}
}
_onInput() {
// Let chip list know whenever the value changes.
this._chipList.stateChanges.next();
}
focus() { this._inputElement.focus(); }
}