UNPKG

@xui/components

Version:

xUI Components for Angular

86 lines 16.5 kB
import { booleanAttribute, ChangeDetectionStrategy, Component, computed, effect, Inject, input, model, Optional, Self, signal } from '@angular/core'; import { NgControl } from '@angular/forms'; import { TranslateService } from '@ngx-translate/core'; import { INPUT_GROUP_ACCESSOR } from './input.types'; import { INPUT_MODULE, 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 XuiInput { get errorMessage() { const msg = this.control?.getError('message'); return this.translation.instant(msg); } constructor(configService, translation, group, control) { this.configService = configService; this.translation = translation; this.group = group; this.control = control; this._moduleName = INPUT_MODULE; this._disabled = signal(false); this.value = model(); this.placeholder = input(); this.color = input('light'); this.size = input('large'); this.type = input('text'); this.dataList = input(); this.disabled = input(undefined, { transform: booleanAttribute }); this.readOnly = input(false, { transform: booleanAttribute }); this._styles = computed(() => { 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; }); if (this.control) { this.control.valueAccessor = this; } effect(() => this.disabled() && this._disabled.set(this.disabled()), { allowSignalWrites: true }); effect(() => this.value() != undefined && this.onChange?.(this.value())); } get _showError() { if (!this.control) { return false; } const invalid = !!this.control.invalid; const { dirty, touched } = this.control; return invalid ? (dirty ?? false) || (touched ?? false) : false; } writeValue(source) { this.value.set(source); } registerOnChange(onChange) { this.onChange = onChange; } registerOnTouched(onTouched) { this._onTouched = onTouched; } setDisabledState(isDisabled) { this._disabled.set(isDisabled); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: XuiInput, deps: [{ token: i1.XuiConfigService }, { 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: "17.0.0", version: "18.0.1", type: XuiInput, selector: "xui-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, dataList: { classPropertyName: "dataList", publicName: "dataList", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readOnly: { classPropertyName: "readOnly", publicName: "readOnly", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { listeners: { "focusout": "_onTouched?.()" } }, ngImport: i0, template: "<div [ngClass]=\"_styles()\" [class.x-input-error]=\"_showError\">\n <ng-content select=\"[xuiPrefix]\" />\n <input\n [tabindex]=\"_disabled() ? -1 : 0\"\n [disabled]=\"_disabled()\"\n [readOnly]=\"readOnly()\"\n [type]=\"type()\"\n [placeholder]=\"placeholder() ?? ''\"\n [(ngModel)]=\"value\"\n list=\"list\"\n />\n <ng-content select=\"[xuiPostfix]\" />\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 @for (item of dataList(); track item) {\n <option [value]=\"item\"></option>\n }\n</datalist>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: XuiInput, decorators: [{ type: Component, args: [{ selector: 'xui-input', changeDetection: ChangeDetectionStrategy.OnPush, host: { '(focusout)': '_onTouched?.()' }, template: "<div [ngClass]=\"_styles()\" [class.x-input-error]=\"_showError\">\n <ng-content select=\"[xuiPrefix]\" />\n <input\n [tabindex]=\"_disabled() ? -1 : 0\"\n [disabled]=\"_disabled()\"\n [readOnly]=\"readOnly()\"\n [type]=\"type()\"\n [placeholder]=\"placeholder() ?? ''\"\n [(ngModel)]=\"value\"\n list=\"list\"\n />\n <ng-content select=\"[xuiPostfix]\" />\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 @for (item of dataList(); track item) {\n <option [value]=\"item\"></option>\n }\n</datalist>\n" }] }], ctorParameters: () => [{ type: i1.XuiConfigService }, { type: i2.TranslateService }, { type: undefined, decorators: [{ type: Inject, args: [INPUT_GROUP_ACCESSOR] }, { type: Optional }] }, { type: i3.NgControl, decorators: [{ type: Self }, { type: Optional }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3h1aS9zcmMvaW5wdXQvaW5wdXQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzL3h1aS9zcmMvaW5wdXQvaW5wdXQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFDTCxRQUFRLEVBQ1IsSUFBSSxFQUNKLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBd0QsTUFBTSxlQUFlLENBQUM7QUFDM0csT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7Ozs7O0FBVTNELE1BQU0sT0FBTyxRQUFRO0lBNkJuQixJQUFJLFlBQVk7UUFDZCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxZQUNVLGFBQStCLEVBQy9CLFdBQTZCLEVBQ2EsS0FBeUIsRUFDaEQsT0FBbUI7UUFIdEMsa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQy9CLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUNhLFVBQUssR0FBTCxLQUFLLENBQW9CO1FBQ2hELFlBQU8sR0FBUCxPQUFPLENBQVk7UUFyQy9CLGdCQUFXLEdBQUcsWUFBWSxDQUFDO1FBSTVDLGNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxD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OytCQUNFLFdBQVcsbUJBQ0osdUJBQXVCLENBQUMsTUFBTSxRQUV6Qzt3QkFDSixZQUFZLEVBQUUsZ0JBQWdCO3FCQUMvQjs7MEJBdUNFLE1BQU07MkJBQUMsb0JBQW9COzswQkFBRyxRQUFROzswQkFDdEMsSUFBSTs7MEJBQUksUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIEluamVjdCxcbiAgaW5wdXQsXG4gIG1vZGVsLFxuICBPcHRpb25hbCxcbiAgU2VsZixcbiAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IElOUFVUX0dST1VQX0FDQ0VTU09SLCBJbnB1dENvbG9yLCBJbnB1dEdyb3VwQWNjZXNzb3IsIElucHV0U2l6ZSwgSW5wdXRUeXBlIH0gZnJvbSAnLi9pbnB1dC50eXBlcyc7XG5pbXBvcnQgeyBJTlBVVF9NT0RVTEUsIFh1aUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9jb25maWcnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd4dWktaW5wdXQnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGVVcmw6ICdpbnB1dC5odG1sJyxcbiAgaG9zdDoge1xuICAgICcoZm9jdXNvdXQpJzogJ19vblRvdWNoZWQ/LigpJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIFh1aUlucHV0IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IF9tb2R1bGVOYW1lID0gSU5QVVRfTU9EVUxFO1xuXG4gIHByaXZhdGUgb25DaGFuZ2U/OiAoc291cmNlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkO1xuICBfb25Ub3VjaGVkPzogKCkgPT4gdm9pZDtcbiAgX2Rpc2FibGVkID0gc2lnbmFsKGZhbHNlKTtcblxuICB2YWx1ZSA9IG1vZGVsPHN0cmluZz4oKTtcbiAgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIGNvbG9yID0gaW5wdXQ8SW5wdXRDb2xvcj4oJ2xpZ2h0Jyk7XG4gIHNpemUgPSBpbnB1dDxJbnB1dFNpemU+KCdsYXJnZScpO1xuICB0eXBlID0gaW5wdXQ8SW5wdXRUeXBlPigndGV4dCcpO1xuICBkYXRhTGlzdCA9IGlucHV0PHN0cmluZ1tdIHwgbnVsbD4oKTtcbiAgZGlzYWJsZWQgPSBpbnB1dDxib29sZWFuIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCBib29sZWFuPih1bmRlZmluZWQsIHtcbiAgICB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGVcbiAgfSk7XG4gIHJlYWRPbmx5ID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXG4gIF9zdHlsZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgcmV0OiB7IFtrbGFzczogc3RyaW5nXTogYm9vbGVhbiB9ID0ge1xuICAgICAgJ3gtaW5wdXQnOiB0cnVlLFxuICAgICAgJ3gtaW5wdXQtZXJyb3InOiB0aGlzLl9zaG93RXJyb3JcbiAgICB9O1xuXG4gICAgcmV0W2B4LWlucHV0LSR7dGhpcy5jb2xvcigpfWBdID0gdHJ1ZTtcbiAgICByZXRbYHgtaW5wdXQtJHt0aGlzLmdyb3VwPy5zaXplKCkgPz8gdGhpcy5zaXplKCl9YF0gPSB0cnVlO1xuICAgIHJldHVybiByZXQ7XG4gIH0pO1xuXG4gIGdldCBlcnJvck1lc3NhZ2UoKSB7XG4gICAgY29uc3QgbXNnID0gdGhpcy5jb250cm9sPy5nZXRFcnJvcignbWVzc2FnZScpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQobXNnKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogWHVpQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIEBJbmplY3QoSU5QVVRfR1JPVVBfQUNDRVNTT1IpIEBPcHRpb25hbCgpIHByaXZhdGUgZ3JvdXA6IElucHV0R3JvdXBBY2Nlc3NvcixcbiAgICBAU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBjb250cm9sPzogTmdDb250cm9sXG4gICkge1xuICAgIGlmICh0aGlzLmNvbnRyb2wpIHtcbiAgICAgIHRoaXMuY29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG5cbiAgICBlZmZlY3QoKCkgPT4gdGhpcy5kaXNhYmxlZCgpICYmIHRoaXMuX2Rpc2FibGVkLnNldCh0aGlzLmRpc2FibGVkKCkhKSwgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcbiAgICBlZmZlY3QoKCkgPT4gdGhpcy52YWx1ZSgpICE9IHVuZGVmaW5lZCAmJiB0aGlzLm9uQ2hhbmdlPy4odGhpcy52YWx1ZSgpISkpO1xuICB9XG5cbiAgZ2V0IF9zaG93RXJyb3IoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvbnRyb2wpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnZhbGlkID0gISF0aGlzLmNvbnRyb2wuaW52YWxpZDtcbiAgICBjb25zdCB7IGRpcnR5LCB0b3VjaGVkIH0gPSB0aGlzLmNvbnRyb2w7XG4gICAgcmV0dXJuIGludmFsaWQgPyAoZGlydHkgPz8gZmFsc2UpIHx8ICh0b3VjaGVkID8/IGZhbHNlKSA6IGZhbHNlO1xuICB9XG5cbiAgd3JpdGVWYWx1ZShzb3VyY2U6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUuc2V0KHNvdXJjZSk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAoc291cmNlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5fb25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fZGlzYWJsZWQuc2V0KGlzRGlzYWJsZWQpO1xuICB9XG59XG4iLCI8ZGl2IFtuZ0NsYXNzXT1cIl9zdHlsZXMoKVwiIFtjbGFzcy54LWlucHV0LWVycm9yXT1cIl9zaG93RXJyb3JcIj5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3h1aVByZWZpeF1cIiAvPlxuICA8aW5wdXRcbiAgICBbdGFiaW5kZXhdPVwiX2Rpc2FibGVkKCkgPyAtMSA6IDBcIlxuICAgIFtkaXNhYmxlZF09XCJfZGlzYWJsZWQoKVwiXG4gICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5KClcIlxuICAgIFt0eXBlXT1cInR5cGUoKVwiXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyKCkgPz8gJydcIlxuICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgIGxpc3Q9XCJsaXN0XCJcbiAgLz5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3h1aVBvc3RmaXhdXCIgLz5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwieC1pbnB1dC1lcnJvci10ZXh0XCIgKm5nSWY9XCJfc2hvd0Vycm9yXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sPy5oYXNFcnJvcignbWVzc2FnZScpXCI+e3sgZXJyb3JNZXNzYWdlIH19PC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlRoaXMgZmllbGQgaXMgcmVxdWlyZWQhPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sPy5oYXNFcnJvcignZW1haWwnKVwiPkVtYWlsIGV4cGVjdGVkPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPGRhdGFsaXN0IGlkPVwibGlzdFwiICpuZ0lmPVwiZGF0YUxpc3QoKVwiPlxuICBAZm9yIChpdGVtIG9mIGRhdGFMaXN0KCk7IHRyYWNrIGl0ZW0pIHtcbiAgICA8b3B0aW9uIFt2YWx1ZV09XCJpdGVtXCI+PC9vcHRpb24+XG4gIH1cbjwvZGF0YWxpc3Q+XG4iXX0=