chi-app-lib
Version:
This is a custom component (input dropdown grid textarea map captcha) published to npm.
263 lines • 17.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, forwardRef, Input, Output, EventEmitter, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';
import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
/** @type {?} */
const noop = (/**
* @return {?}
*/
() => {
});
const ɵ0 = noop;
/**
* Error when invalid control is dirty or touched
*/
export class DropdownErrorStateMatcher {
/**
* @param {?} control
* @param {?} form
* @return {?}
*/
isErrorState(control, form) {
return !!(control && control.invalid && (control.dirty || control.touched));
}
}
/** @type {?} */
export const DROPDOWN_COMPONENT_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => DropdownComponent)),
multi: true
};
export class DropdownComponent {
/**
* @param {?} ref
*/
constructor(ref) {
this.ref = ref;
this.options = [];
this.direction = 'rtl';
this.floatLabel = 'auto'; // never
// never
this.pattern = '';
this.showValidatorMessage = true;
this.isValid = new EventEmitter();
this.valueChanged = new EventEmitter();
this.matcher = new DropdownErrorStateMatcher();
this.id = 'chi-input' + this.idGenerator();
this.element = new FormControl('');
// The internal data model
this.innerValue = '';
// Placeholders for the callbacks which are later provided
// by the Control Value Accessor
this.onTouchedCallback = noop;
this.onChangeCallback = noop;
}
//
// get accessor
/**
* @return {?}
*/
get value() {
return this.innerValue;
}
// set accessor including call the onchange callback
/**
* @param {?} v
* @return {?}
*/
set value(v) {
if (v !== this.innerValue) {
this.innerValue = v;
this.onChangeCallback(v);
setTimeout((/**
* @param {?} _
* @return {?}
*/
_ => {
this.isValid.emit(this.element.valid);
}), 100);
}
}
// Set touched on blur
/**
* @param {?} validate
* @return {?}
*/
onBlur(validate) {
this.onTouchedCallback();
this.isValid.emit(this.element.valid);
}
// From ControlValueAccessor interface
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (value !== this.innerValue) {
this.innerValue = value;
setTimeout((/**
* @param {?} _
* @return {?}
*/
_ => {
this.isValid.emit(this.element.valid);
}), 100);
}
}
// From ControlValueAccessor interface
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChangeCallback = fn;
}
// From ControlValueAccessor interface
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouchedCallback = fn;
}
/**
* @param {?} event
* @param {?} validate
* @return {?}
*/
changedInput(event, validate) {
setTimeout((/**
* @param {?} _
* @return {?}
*/
_ => {
this.isValid.emit(this.element.valid);
this.valueChanged.emit(this.value);
}), 100);
}
/**
* @param {?} validate
* @return {?}
*/
onFocused(validate) {
this.isValid.emit(this.element.valid);
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
/** @type {?} */
const name = changes.isDirty;
if ((name || {})['currentValue']) {
this.ref.markForCheck();
this.element.markAsDirty({ onlySelf: true });
}
}
/**
* @return {?}
*/
getErrorMessage() {
return this.element.hasError('required') ? ' لا يمكن أن يكون هذا الحقل فارغًا!' : '';
}
/**
* @return {?}
*/
idGenerator() {
/** @type {?} */
const number = Math.random();
number.toString(36);
return number.toString(36).substr(2, 9);
}
}
DropdownComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-dropdown',
template: "<div class=\"element-container\" [ngClass]=\"className\" dir=\"{{direction}}\">\n <mat-form-field [hideRequiredMarker]=\"true\" floatLabel=\"{{floatLabel}}\" >\n <mat-label>{{placeHolder}}</mat-label>\n <mat-select [(ngModel)]=\"value\"\n [formControl]=\"element\"\n [errorStateMatcher]=\"matcher\"\n [disableOptionCentering]=\"true\"\n #itemSelect\n required=\"{{required}}\"\n [disabled]=\"readonly\"\n (valueChange)=\"changedInput($event,element.valid)\">\n <mat-option *ngFor=\"let item of options\" [value]=\"item.value\">\n {{item.viewValue}}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"element.invalid&&showValidatorMessage\">{{getErrorMessage()}}</mat-error>\n </mat-form-field>\n</div>\n",
providers: [DROPDOWN_COMPONENT_CONTROL_VALUE_ACCESSOR],
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [".element-container{display:flex;flex-direction:column}.element-container>*{width:100%}"]
}] }
];
/** @nocollapse */
DropdownComponent.ctorParameters = () => [
{ type: ChangeDetectorRef }
];
DropdownComponent.propDecorators = {
options: [{ type: Input }],
direction: [{ type: Input }],
floatLabel: [{ type: Input }],
pattern: [{ type: Input }],
className: [{ type: Input }],
readonly: [{ type: Input }],
required: [{ type: Input }],
placeHolder: [{ type: Input }],
showValidatorMessage: [{ type: Input }],
isDirty: [{ type: Input }],
isValid: [{ type: Output }],
valueChanged: [{ type: Output }]
};
if (false) {
/** @type {?} */
DropdownComponent.prototype.options;
/** @type {?} */
DropdownComponent.prototype.direction;
/** @type {?} */
DropdownComponent.prototype.floatLabel;
/** @type {?} */
DropdownComponent.prototype.pattern;
/** @type {?} */
DropdownComponent.prototype.className;
/** @type {?} */
DropdownComponent.prototype.readonly;
/** @type {?} */
DropdownComponent.prototype.required;
/** @type {?} */
DropdownComponent.prototype.placeHolder;
/** @type {?} */
DropdownComponent.prototype.showValidatorMessage;
/** @type {?} */
DropdownComponent.prototype.isDirty;
/** @type {?} */
DropdownComponent.prototype.isValid;
/** @type {?} */
DropdownComponent.prototype.valueChanged;
/** @type {?} */
DropdownComponent.prototype.matcher;
/** @type {?} */
DropdownComponent.prototype.id;
/** @type {?} */
DropdownComponent.prototype.element;
/**
* @type {?}
* @private
*/
DropdownComponent.prototype.innerValue;
/**
* @type {?}
* @private
*/
DropdownComponent.prototype.onTouchedCallback;
/**
* @type {?}
* @private
*/
DropdownComponent.prototype.onChangeCallback;
/**
* @type {?}
* @private
*/
DropdownComponent.prototype.ref;
}
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY2hpLWFwcC1saWIvIiwic291cmNlcyI6WyJsaWIvZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFlBQVksRUFDL0MsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQ3RELE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxXQUFXLEVBQXNCLGlCQUFpQixFQUE4QixNQUFNLGdCQUFnQixDQUFDOztNQUl6RyxJQUFJOzs7QUFBRyxHQUFHLEVBQUU7QUFDbEIsQ0FBQyxDQUFBOzs7OztBQUdELE1BQU0sT0FBTyx5QkFBeUI7Ozs7OztJQUNwQyxZQUFZLENBQUMsT0FBMkIsRUFBRSxJQUF3QztRQUNoRixPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFFLENBQUMsQ0FBQztJQUMvRSxDQUFDO0NBQ0Y7O0FBRUQsTUFBTSxPQUFPLHlDQUF5QyxHQUFRO0lBQzVELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVU7OztJQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFDO0lBQ2hELEtBQUssRUFBRSxJQUFJO0NBQ1o7QUFTRCxNQUFNLE9BQU8saUJBQWlCOzs7O0lBK0U1QixZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTdFakMsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsZUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLFFBQVE7O1FBQzdCLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFLYix5QkFBb0IsR0FBRyxJQUFJLENBQUM7UUFF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dCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsIGZvcndhcmRSZWYsIElucHV0LCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBTaW1wbGVDaGFuZ2VzLCBTaW1wbGVDaGFuZ2UsXG4gIE9uQ2hhbmdlcywgQ2hhbmdlRGV0ZWN0b3JSZWYsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3JtQ29udHJvbCwgRm9ybUdyb3VwRGlyZWN0aXZlLCBOR19WQUxVRV9BQ0NFU1NPUiwgTmdGb3JtLCBSZWFjdGl2ZUZvcm1zTW9kdWxlfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7RXJyb3JTdGF0ZU1hdGNoZXJ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcblxuY29uc3Qgbm9vcCA9ICgpID0+IHtcbn07XG5cbi8qKiBFcnJvciB3aGVuIGludmFsaWQgY29udHJvbCBpcyBkaXJ0eSBvciB0b3VjaGVkKi9cbmV4cG9ydCBjbGFzcyBEcm9wZG93bkVycm9yU3RhdGVNYXRjaGVyIGltcGxlbWVudHMgRXJyb3JTdGF0ZU1hdGNoZXIge1xuICBpc0Vycm9yU3RhdGUoY29udHJvbDogRm9ybUNvbnRyb2wgfCBudWxsLCBmb3JtOiBGb3JtR3JvdXBEaXJlY3RpdmUgfCBOZ0Zvcm0gfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKGNvbnRyb2wgJiYgY29udHJvbC5pbnZhbGlkICYmIChjb250cm9sLmRpcnR5IHx8IGNvbnRyb2wudG91Y2hlZCApKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRFJPUERPV05fQ09NUE9ORU5UX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERyb3Bkb3duQ29tcG9uZW50KSxcbiAgbXVsdGk6IHRydWVcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1kcm9wZG93bicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Ryb3Bkb3duLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW0RST1BET1dOX0NPTVBPTkVOVF9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIERyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIG9wdGlvbnMgPSBbXTtcbiAgQElucHV0KCkgZGlyZWN0aW9uID0gJ3J0bCc7XG4gIEBJbnB1dCgpIGZsb2F0TGFiZWwgPSAnYXV0byc7IC8vIG5ldmVyXG4gIEBJbnB1dCgpIHBhdHRlcm4gPSAnJztcbiAgQElucHV0KCkgY2xhc3NOYW1lO1xuICBASW5wdXQoKSByZWFkb25seTtcbiAgQElucHV0KCkgcmVxdWlyZWQ7XG4gIEBJbnB1dCgpIHBsYWNlSG9sZGVyO1xuICBASW5wdXQoKSBzaG93VmFsaWRhdG9yTWVzc2FnZSA9IHRydWU7XG4gIEBJbnB1dCgpIGlzRGlydHk7XG4gIEBPdXRwdXQoKSBpc1ZhbGlkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIG1hdGNoZXIgPSBuZXcgRHJvcGRvd25FcnJvclN0YXRlTWF0Y2hlcigpO1xuICBpZCA9ICdjaGktaW5wdXQnICsgdGhpcy5pZEdlbmVyYXRvcigpO1xuICBlbGVtZW50ID0gbmV3IEZvcm1Db250cm9sKCcnKTtcblxuICAvLyBUaGUgaW50ZXJuYWwgZGF0YSBtb2RlbFxuICBwcml2YXRlIGlubmVyVmFsdWU6IGFueSA9ICcnO1xuXG4gIC8vIFBsYWNlaG9sZGVycyBmb3IgdGhlIGNhbGxiYWNrcyB3aGljaCBhcmUgbGF0ZXIgcHJvdmlkZWRcbiAgLy8gYnkgdGhlIENvbnRyb2wgVmFsdWUgQWNjZXNzb3JcbiAgcHJpdmF0ZSBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gIC8vXG4gIC8vIGdldCBhY2Nlc3NvclxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5pbm5lclZhbHVlO1xuICB9XG5cbiAgLy8gc2V0IGFjY2Vzc29yIGluY2x1ZGluZyBjYWxsIHRoZSBvbmNoYW5nZSBjYWxsYmFja1xuICBzZXQgdmFsdWUodjogYW55KSB7XG4gICAgaWYgKHYgIT09IHRoaXMuaW5uZXJWYWx1ZSkge1xuICAgICAgdGhpcy5pbm5lclZhbHVlID0gdjtcbiAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh2KTtcbiAgICAgIHNldFRpbWVvdXQoXyA9PiB7XG4gICAgICAgIHRoaXMuaXNWYWxpZC5lbWl0KHRoaXMuZWxlbWVudC52YWxpZCk7XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNldCB0b3VjaGVkIG9uIGJsdXJcbiAgb25CbHVyKHZhbGlkYXRlKSB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuaXNWYWxpZC5lbWl0KHRoaXMuZWxlbWVudC52YWxpZCk7XG4gIH1cblxuICAvLyBGcm9tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZVxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuaW5uZXJWYWx1ZSkge1xuICAgICAgdGhpcy5pbm5lclZhbHVlID0gdmFsdWU7XG4gICAgICBzZXRUaW1lb3V0KF8gPT4ge1xuICAgICAgICB0aGlzLmlzVmFsaWQuZW1pdCh0aGlzLmVsZW1lbnQudmFsaWQpO1xuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gIH1cblxuICAvLyBGcm9tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZVxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIC8vIEZyb20gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cblxuICBjaGFuZ2VkSW5wdXQoZXZlbnQsIHZhbGlkYXRlKSB7XG4gICAgc2V0VGltZW91dChfID0+IHtcbiAgICAgIHRoaXMuaXNWYWxpZC5lbWl0KHRoaXMuZWxlbWVudC52YWxpZCk7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlZC5lbWl0KHRoaXMudmFsdWUpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBvbkZvY3VzZWQodmFsaWRhdGUpIHtcbiAgICB0aGlzLmlzVmFsaWQuZW1pdCh0aGlzLmVsZW1lbnQudmFsaWQpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBjb25zdCBuYW1lOiBTaW1wbGVDaGFuZ2UgPSBjaGFuZ2VzLmlzRGlydHk7XG4gICAgaWYgKChuYW1lIHx8IHt9KVsnY3VycmVudFZhbHVlJ10pIHtcbiAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5lbGVtZW50Lm1hcmtBc0RpcnR5KHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RXJyb3JNZXNzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnQuaGFzRXJyb3IoJ3JlcXVpcmVkJykgPyAnINmE2Kcg2YrZhdmD2YYg2KPZhiDZitmD2YjZhiDZh9iw2Kcg2KfZhNit2YLZhCDZgdin2LHYutmL2KchJyA6ICcnO1xuICB9XG5cbiAgaWRHZW5lcmF0b3IoKSB7XG4gICAgY29uc3QgbnVtYmVyID0gTWF0aC5yYW5kb20oKTtcbiAgICBudW1iZXIudG9TdHJpbmcoMzYpO1xuICAgIHJldHVybiBudW1iZXIudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTtcbiAgfVxufVxuIl19