xui
Version:
xUI Components for Angular
118 lines • 15.2 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, Optional, Self } from '@angular/core';
import { NgControl } from '@angular/forms';
import { TranslateService } from '@ngx-translate/core';
import { InputBoolean, InputNumber } from '../utils';
import * as i0 from "@angular/core";
import * as i1 from "@ngx-translate/core";
import * as i2 from "@angular/forms";
import * as i3 from "@angular/common";
export class TextareaComponent {
get value() {
return this._value;
}
set value(v) {
if (this._value !== v) {
this._value = v;
this.onChange?.(v);
this.cdr.markForCheck();
}
}
get wordCount() {
return (this.maxLength ?? 0) - (this.value?.length ?? 0);
}
get styles() {
const ret = {
'x-textarea': true,
'x-textarea-disabled': this.disabled
};
ret[`x-textarea-${this.color}`] = true;
return ret;
}
get errorMessage() {
const msg = this.control?.getError('message');
return this.translation.instant(msg);
}
constructor(cdr, translation, control) {
this.cdr = cdr;
this.translation = translation;
this.control = control;
this._value = null;
this.touched = false;
this.disabled = false;
this.color = 'light';
this.size = 'normal';
this.rows = 3;
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;
}
markAsTouched() {
if (!this.touched) {
this.onTouched?.();
this.touched = true;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: TextareaComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.TranslateService }, { token: i2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.1", type: TextareaComponent, selector: "xui-textarea", inputs: { placeholder: "placeholder", disabled: "disabled", color: "color", size: "size", rows: "rows", maxLength: "maxLength", value: "value" }, ngImport: i0, template: "<div [ngClass]=\"styles\" [class.x-textarea-error]=\"showError\" [tabindex]=\"disabled ? -1 : 0\">\n <textarea\n [disabled]=\"disabled\"\n [(ngModel)]=\"value\"\n [rows]=\"rows\"\n [placeholder]=\"placeholder ?? ''\"\n [maxLength]=\"maxLength ?? 524288\"\n ></textarea>\n\n <div *ngIf=\"maxLength\" class=\"x-textarea-word-counter\">{{ wordCount }}</div>\n</div>\n\n<div class=\"x-textarea-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", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.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)
], TextareaComponent.prototype, "disabled", void 0);
__decorate([
InputNumber(),
__metadata("design:type", Object)
], TextareaComponent.prototype, "rows", void 0);
__decorate([
InputNumber(),
__metadata("design:type", Number)
], TextareaComponent.prototype, "maxLength", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: TextareaComponent, decorators: [{
type: Component,
args: [{ selector: 'xui-textarea', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"styles\" [class.x-textarea-error]=\"showError\" [tabindex]=\"disabled ? -1 : 0\">\n <textarea\n [disabled]=\"disabled\"\n [(ngModel)]=\"value\"\n [rows]=\"rows\"\n [placeholder]=\"placeholder ?? ''\"\n [maxLength]=\"maxLength ?? 524288\"\n ></textarea>\n\n <div *ngIf=\"maxLength\" class=\"x-textarea-word-counter\">{{ wordCount }}</div>\n</div>\n\n<div class=\"x-textarea-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" }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.TranslateService }, { type: i2.NgControl, decorators: [{
type: Self
}, {
type: Optional
}] }]; }, propDecorators: { placeholder: [{
type: Input
}], disabled: [{
type: Input
}], color: [{
type: Input
}], size: [{
type: Input
}], rows: [{
type: Input
}], maxLength: [{
type: Input
}], value: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy94dWkvc3JjL3RleHRhcmVhL3RleHRhcmVhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMveHVpL3NyYy90ZXh0YXJlYS90ZXh0YXJlYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEVBQXdCLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDOzs7OztBQVFyRCxNQUFNLE9BQU8saUJBQWlCO0lBZ0I1QixJQUNJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLENBQUM7UUFDVCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE1BQU0sR0FBRyxH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UUFBUTtzQkFBaEMsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNrQixJQUFJO3NCQUEzQixLQUFLO2dCQUNrQixTQUFTO3NCQUFoQyxLQUFLO2dCQUdGLEtBQUs7c0JBRFIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJvb2xlYW5JbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWwsIFNlbGYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBJbnB1dEJvb2xlYW4sIElucHV0TnVtYmVyIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVGV4dGFyZWFDb2xvciwgVGV4dGFyZWFTaXplIH0gZnJvbSAnLi90ZXh0YXJlYS50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3h1aS10ZXh0YXJlYScsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZVVybDogJ3RleHRhcmVhLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBUZXh0YXJlYUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGlzYWJsZWQ6IEJvb2xlYW5JbnB1dDtcblxuICBwcml2YXRlIG9uQ2hhbmdlPzogKHNvdXJjZTogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ/OiAoKSA9PiB2b2lkO1xuXG4gIF92YWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHRvdWNoZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKSBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbG9yOiBUZXh0YXJlYUNvbG9yID0gJ2xpZ2h0JztcbiAgQElucHV0KCkgc2l6ZTogVGV4dGFyZWFTaXplID0gJ25vcm1hbCc7XG4gIEBJbnB1dCgpIEBJbnB1dE51bWJlcigpIHJvd3MgPSAzO1xuICBASW5wdXQoKSBASW5wdXROdW1iZXIoKSBtYXhMZW5ndGg/OiBudW1iZXI7XG5cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2KSB7XG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSB2KSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgICB0aGlzLm9uQ2hhbmdlPy4odik7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBnZXQgd29yZENvdW50KCkge1xuICAgIHJldHVybiAodGhpcy5tYXhMZW5ndGggPz8gMCkgLSAodGhpcy52YWx1ZT8ubGVuZ3RoID8/IDApO1xuICB9XG5cbiAgZ2V0IHN0eWxlcygpIHtcbiAgICBjb25zdCByZXQ6IHsgW2tsYXNzOiBzdHJpbmddOiBib29sZWFuIH0gPSB7XG4gICAgICAneC10ZXh0YXJlYSc6IHRydWUsXG4gICAgICAneC10ZXh0YXJlYS1kaXNhYmxlZCc6IHRoaXMuZGlzYWJsZWRcbiAgICB9O1xuXG4gICAgcmV0W2B4LXRleHRhcmVhLSR7dGhpcy5jb2xvcn1gXSA9IHRydWU7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIGdldCBlcnJvck1lc3NhZ2UoKSB7XG4gICAgY29uc3QgbXNnID0gdGhpcy5jb250cm9sPy5nZXRFcnJvcignbWVzc2FnZScpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQobXNnKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIEBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIGNvbnRyb2w/OiBOZ0NvbnRyb2xcbiAgKSB7XG4gICAgaWYgKHRoaXMuY29udHJvbCkge1xuICAgICAgdGhpcy5jb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29udHJvbD8uc3RhdHVzQ2hhbmdlcz8uc3Vic2NyaWJlKCgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpKTtcbiAgfVxuXG4gIGdldCBpbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY29udHJvbD8uaW52YWxpZDtcbiAgfVxuXG4gIGdldCBzaG93RXJyb3IoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvbnRyb2wpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRpcnR5LCB0b3VjaGVkIH0gPSB0aGlzLmNvbnRyb2w7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IChkaXJ0eSA/PyBmYWxzZSkgfHwgKHRvdWNoZWQgPz8gZmFsc2UpIDogZmFsc2U7XG4gIH1cblxuICB3cml0ZVZhbHVlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgdGhpcy52YWx1ZSA9IHNvdXJjZTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6IChzb3VyY2U6IHN0cmluZyB8IG51bGwpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gb25DaGFuZ2U7XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IG9uVG91Y2hlZDtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgbWFya0FzVG91Y2hlZCgpIHtcbiAgICBpZiAoIXRoaXMudG91Y2hlZCkge1xuICAgICAgdGhpcy5vblRvdWNoZWQ/LigpO1xuICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgW25nQ2xhc3NdPVwic3R5bGVzXCIgW2NsYXNzLngtdGV4dGFyZWEtZXJyb3JdPVwic2hvd0Vycm9yXCIgW3RhYmluZGV4XT1cImRpc2FibGVkID8gLTEgOiAwXCI+XG4gIDx0ZXh0YXJlYVxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXG4gICAgW3Jvd3NdPVwicm93c1wiXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyID8/ICcnXCJcbiAgICBbbWF4TGVuZ3RoXT1cIm1heExlbmd0aCA/PyA1MjQyODhcIlxuICA+PC90ZXh0YXJlYT5cblxuICA8ZGl2ICpuZ0lmPVwibWF4TGVuZ3RoXCIgY2xhc3M9XCJ4LXRleHRhcmVhLXdvcmQtY291bnRlclwiPnt7IHdvcmRDb3VudCB9fTwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJ4LXRleHRhcmVhLWVycm9yLXRleHRcIiAqbmdJZj1cInNob3dFcnJvclwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbD8uaGFzRXJyb3IoJ21lc3NhZ2UnKVwiPnt7IGVycm9yTWVzc2FnZSB9fTwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbD8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5UaGlzIGZpZWxkIGlzIHJlcXVpcmVkITwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbD8uaGFzRXJyb3IoJ2VtYWlsJylcIj5FbWFpbCBleHBlY3RlZDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=