UNPKG

xui

Version:

xUI Components for Angular

133 lines 17.5 kB
import { __decorate, __metadata } from "tslib"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, Inject, Input, Optional, Self } from '@angular/core'; import { NgControl } from '@angular/forms'; import { TranslateService } from '@ngx-translate/core'; import { InputBoolean } from '../utils'; import { INPUT_GROUP_ACCESSOR } from './input.types'; import { INPUT_MODULE, WithConfig, XuiConfigService } from '../config'; import * as i0 from "@angular/core"; import * as i1 from "../config"; import * as i2 from "@ngx-translate/core"; import * as i3 from "@angular/forms"; import * as i4 from "@angular/common"; export class InputComponent { get value() { return this._value; } set value(v) { if (this._value !== v) { this._value = v; this.onChange?.(v); this.cdr.markForCheck(); } } get styles() { const ret = { 'x-input': true, 'x-input-error': this.showError }; ret[`x-input-${this.color}`] = true; ret[`x-input-${this.group?.size ?? this.size}`] = true; return ret; } get errorMessage() { const msg = this.control?.getError('message'); return this.translation.instant(msg); } constructor(configService, cdr, translation, group, control) { this.configService = configService; this.cdr = cdr; this.translation = translation; this.group = group; this.control = control; this._moduleName = INPUT_MODULE; this._value = null; this.disabled = false; this.readOnly = false; this.color = 'light'; this.size = 'large'; this.type = 'text'; if (this.control) { this.control.valueAccessor = this; } } ngOnInit() { this.control?.statusChanges?.subscribe(() => this.cdr.markForCheck()); } get invalid() { return !!this.control?.invalid; } get showError() { if (!this.control) { return false; } const { dirty, touched } = this.control; return this.invalid ? (dirty ?? false) || (touched ?? false) : false; } writeValue(source) { this.value = source; } registerOnChange(onChange) { this.onChange = onChange; } registerOnTouched(onTouched) { this.onTouched = onTouched; } setDisabledState(isDisabled) { this.disabled = isDisabled; } _focusOut() { this.onTouched?.(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: InputComponent, deps: [{ token: i1.XuiConfigService }, { token: i0.ChangeDetectorRef }, { token: i2.TranslateService }, { token: INPUT_GROUP_ACCESSOR, optional: true }, { token: i3.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.1", type: InputComponent, selector: "xui-input", inputs: { placeholder: "placeholder", disabled: "disabled", readOnly: "readOnly", color: "color", size: "size", type: "type", dataList: "dataList", value: "value" }, host: { listeners: { "focusout": "_focusOut()" } }, ngImport: i0, template: "<div [ngClass]=\"styles\" [tabindex]=\"disabled ? -1 : 0\">\n <ng-content select=\"[xuiPrefix]\"></ng-content>\n <input\n tabindex=\"-1\"\n [disabled]=\"disabled\"\n [readOnly]=\"readOnly\"\n [type]=\"type\"\n [placeholder]=\"placeholder ?? ''\"\n [(ngModel)]=\"value\"\n list=\"list\"\n />\n <ng-content select=\"[xuiPostfix]\"></ng-content>\n</div>\n\n<div class=\"x-input-error-text\" *ngIf=\"showError\">\n <ng-container *ngIf=\"control?.hasError('message')\">{{ errorMessage }}</ng-container>\n <ng-container *ngIf=\"control?.hasError('required')\">This field is required!</ng-container>\n <ng-container *ngIf=\"control?.hasError('email')\">Email expected</ng-container>\n</div>\n\n<datalist id=\"list\" *ngIf=\"dataList\">\n <option *ngFor=\"let item of dataList\" [value]=\"item\"></option>\n</datalist>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } __decorate([ InputBoolean(), __metadata("design:type", Object) ], InputComponent.prototype, "disabled", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], InputComponent.prototype, "readOnly", void 0); __decorate([ WithConfig(), __metadata("design:type", String) ], InputComponent.prototype, "color", void 0); __decorate([ WithConfig(), __metadata("design:type", String) ], InputComponent.prototype, "size", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: InputComponent, decorators: [{ type: Component, args: [{ selector: 'xui-input', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"styles\" [tabindex]=\"disabled ? -1 : 0\">\n <ng-content select=\"[xuiPrefix]\"></ng-content>\n <input\n tabindex=\"-1\"\n [disabled]=\"disabled\"\n [readOnly]=\"readOnly\"\n [type]=\"type\"\n [placeholder]=\"placeholder ?? ''\"\n [(ngModel)]=\"value\"\n list=\"list\"\n />\n <ng-content select=\"[xuiPostfix]\"></ng-content>\n</div>\n\n<div class=\"x-input-error-text\" *ngIf=\"showError\">\n <ng-container *ngIf=\"control?.hasError('message')\">{{ errorMessage }}</ng-container>\n <ng-container *ngIf=\"control?.hasError('required')\">This field is required!</ng-container>\n <ng-container *ngIf=\"control?.hasError('email')\">Email expected</ng-container>\n</div>\n\n<datalist id=\"list\" *ngIf=\"dataList\">\n <option *ngFor=\"let item of dataList\" [value]=\"item\"></option>\n</datalist>\n" }] }], ctorParameters: function () { return [{ type: i1.XuiConfigService }, { type: i0.ChangeDetectorRef }, { type: i2.TranslateService }, { type: undefined, decorators: [{ type: Inject, args: [INPUT_GROUP_ACCESSOR] }, { type: Optional }] }, { type: i3.NgControl, decorators: [{ type: Self }, { type: Optional }] }]; }, propDecorators: { placeholder: [{ type: Input }], disabled: [{ type: Input }], readOnly: [{ type: Input }], color: [{ type: Input }], size: [{ type: Input }], type: [{ type: Input }], dataList: [{ type: Input }], value: [{ type: Input }], _focusOut: [{ type: HostListener, args: ['focusout'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy94dWkvc3JjL2lucHV0L2lucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMveHVpL3NyYy9pbnB1dC9pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixJQUFJLEVBQ0wsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxvQkFBb0IsRUFBd0QsTUFBTSxlQUFlLENBQUM7QUFFM0csT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7OztBQU92RSxNQUFNLE9BQU8sY0FBYztJQWlCekIsSUFDSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxDQUFDO1FBQ1QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixNQUFNLEdBQUcsR0FBaUM7WUFDeEMsU0FBUyxFQUFFLElB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LFVBQVUsRUFBRTs7NENBQTJCOzJGQWJ0QyxjQUFjO2tCQUwxQixTQUFTOytCQUNFLFdBQVcsbUJBQ0osdUJBQXVCLENBQUMsTUFBTTs7MEJBcUQ1QyxNQUFNOzJCQUFDLG9CQUFvQjs7MEJBQUcsUUFBUTs7MEJBQ3RDLElBQUk7OzBCQUFJLFFBQVE7NENBMUNWLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ21CLFFBQVE7c0JBQWhDLEtBQUs7Z0JBQ21CLFFBQVE7c0JBQWhDLEtBQUs7Z0JBQ2lCLEtBQUs7c0JBQTNCLEtBQUs7Z0JBQ2lCLElBQUk7c0JBQTFCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0YsS0FBSztzQkFEUixLQUFLO2dCQTJFRSxTQUFTO3NCQURoQixZQUFZO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBTZWxmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IElucHV0Qm9vbGVhbiB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IElOUFVUX0dST1VQX0FDQ0VTU09SLCBJbnB1dENvbG9yLCBJbnB1dEdyb3VwQWNjZXNzb3IsIElucHV0U2l6ZSwgSW5wdXRUeXBlIH0gZnJvbSAnLi9pbnB1dC50eXBlcyc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgSU5QVVRfTU9EVUxFLCBXaXRoQ29uZmlnLCBYdWlDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vY29uZmlnJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneHVpLWlucHV0JyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlVXJsOiAnaW5wdXQuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElucHV0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCB7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9kaXNhYmxlZDogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfcmVhZE9ubHk6IEJvb2xlYW5JbnB1dDtcbiAgcHJpdmF0ZSByZWFkb25seSBfbW9kdWxlTmFtZSA9IElOUFVUX01PRFVMRTtcblxuICBwcml2YXRlIG9uQ2hhbmdlPzogKHNvdXJjZTogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIF92YWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgcmVhZE9ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgQFdpdGhDb25maWcoKSBjb2xvcjogSW5wdXRDb2xvciA9ICdsaWdodCc7XG4gIEBJbnB1dCgpIEBXaXRoQ29uZmlnKCkgc2l6ZTogSW5wdXRTaXplID0gJ2xhcmdlJztcbiAgQElucHV0KCkgdHlwZTogSW5wdXRUeXBlID0gJ3RleHQnO1xuICBASW5wdXQoKSBkYXRhTGlzdD86IHN0cmluZ1tdIHwgbnVsbDtcblxuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgc2V0IHZhbHVlKHYpIHtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IHYpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdjtcbiAgICAgIHRoaXMub25DaGFuZ2U/Lih2KTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzdHlsZXMoKSB7XG4gICAgY29uc3QgcmV0OiB7IFtrbGFzczogc3RyaW5nXTogYm9vbGVhbiB9ID0ge1xuICAgICAgJ3gtaW5wdXQnOiB0cnVlLFxuICAgICAgJ3gtaW5wdXQtZXJyb3InOiB0aGlzLnNob3dFcnJvclxuICAgIH07XG5cbiAgICByZXRbYHgtaW5wdXQtJHt0aGlzLmNvbG9yfWBdID0gdHJ1ZTtcbiAgICByZXRbYHgtaW5wdXQtJHt0aGlzLmdyb3VwPy5zaXplID8/IHRoaXMuc2l6ZX1gXSA9IHRydWU7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIGdldCBlcnJvck1lc3NhZ2UoKSB7XG4gICAgY29uc3QgbXNnID0gdGhpcy5jb250cm9sPy5nZXRFcnJvcignbWVzc2FnZScpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQobXNnKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogWHVpQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvbjogVHJhbnNsYXRlU2VydmljZSxcbiAgICBASW5qZWN0KElOUFVUX0dST1VQX0FDQ0VTU09SKSBAT3B0aW9uYWwoKSBwcml2YXRlIGdyb3VwOiBJbnB1dEdyb3VwQWNjZXNzb3IsXG4gICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgY29udHJvbD86IE5nQ29udHJvbFxuICApIHtcbiAgICBpZiAodGhpcy5jb250cm9sKSB7XG4gICAgICB0aGlzLmNvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jb250cm9sPy5zdGF0dXNDaGFuZ2VzPy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jZHIubWFya0ZvckNoZWNrKCkpO1xuICB9XG5cbiAgZ2V0IGludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb250cm9sPy5pbnZhbGlkO1xuICB9XG5cbiAgZ2V0IHNob3dFcnJvcigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZGlydHksIHRvdWNoZWQgfSA9IHRoaXMuY29udHJvbDtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gKGRpcnR5ID8/IGZhbHNlKSB8fCAodG91Y2hlZCA/PyBmYWxzZSkgOiBmYWxzZTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUoc291cmNlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnZhbHVlID0gc291cmNlO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHNvdXJjZTogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZCkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMub25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdmb2N1c291dCcpXG4gIHByaXZhdGUgX2ZvY3VzT3V0KCkge1xuICAgIHRoaXMub25Ub3VjaGVkPy4oKTtcbiAgfVxufVxuIiwiPGRpdiBbbmdDbGFzc109XCJzdHlsZXNcIiBbdGFiaW5kZXhdPVwiZGlzYWJsZWQgPyAtMSA6IDBcIj5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3h1aVByZWZpeF1cIj48L25nLWNvbnRlbnQ+XG4gIDxpbnB1dFxuICAgIHRhYmluZGV4PVwiLTFcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5XCJcbiAgICBbdHlwZV09XCJ0eXBlXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgPz8gJydcIlxuICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgIGxpc3Q9XCJsaXN0XCJcbiAgLz5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3h1aVBvc3RmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJ4LWlucHV0LWVycm9yLXRleHRcIiAqbmdJZj1cInNob3dFcnJvclwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbD8uaGFzRXJyb3IoJ21lc3NhZ2UnKVwiPnt7IGVycm9yTWVzc2FnZSB9fTwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbD8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5UaGlzIGZpZWxkIGlzIHJlcXVpcmVkITwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbD8uaGFzRXJyb3IoJ2VtYWlsJylcIj5FbWFpbCBleHBlY3RlZDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjxkYXRhbGlzdCBpZD1cImxpc3RcIiAqbmdJZj1cImRhdGFMaXN0XCI+XG4gIDxvcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0YUxpc3RcIiBbdmFsdWVdPVwiaXRlbVwiPjwvb3B0aW9uPlxuPC9kYXRhbGlzdD5cbiJdfQ==