UNPKG

chi-app-lib

Version:

This is a custom component (input dropdown grid textarea map captcha) published to npm.

263 lines 17.6 kB
/** * @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