@xui/components
Version:
xUI Components for Angular
77 lines • 15.9 kB
JavaScript
import { booleanAttribute, ChangeDetectionStrategy, Component, computed, effect, input, model, Optional, Self, signal } from '@angular/core';
import { FormsModule, NgControl } from '@angular/forms';
import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { CommonModule } from '@angular/common';
import { XuiFocusModule } from '../utils/focus.service';
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 XuiTextarea {
get errorMessage() {
const msg = this.control?.getError('message');
return this.translation.instant(msg);
}
constructor(translation, control) {
this.translation = translation;
this.control = control;
this._disabled = signal(false);
this.value = model();
this.placeholder = input();
this.color = input('light');
this.size = input('normal');
this.rows = input(3);
this.maxLength = input();
this.disabled = input(undefined, {
transform: booleanAttribute
});
this.readOnly = input(false, { transform: booleanAttribute });
this._worldCount = computed(() => (this.maxLength() ?? 0) - (this.value()?.length ?? 0));
this._styles = computed(() => {
const ret = {
'x-textarea': true,
'x-textarea-disabled': this._disabled()
};
ret[`x-textarea-${this.color()}`] = 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: XuiTextarea, deps: [{ token: i1.TranslateService }, { token: i2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.1", type: XuiTextarea, isStandalone: true, selector: "xui-textarea", 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 }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", 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-textarea-error]=\"_showError\">\n <textarea\n [disabled]=\"_disabled()\"\n [readOnly]=\"readOnly()\"\n [(ngModel)]=\"value\"\n [rows]=\"rows()\"\n [placeholder]=\"placeholder() ?? ''\"\n [maxLength]=\"maxLength() ?? 524288\"\n [tabindex]=\"_disabled() ? -1 : 0\"\n ></textarea>\n\n <div *ngIf=\"maxLength()\" class=\"x-textarea-word-counter\">{{ _worldCount() }}</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: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { 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"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: XuiFocusModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: XuiTextarea, decorators: [{
type: Component,
args: [{ standalone: true, imports: [CommonModule, FormsModule, TranslateModule, XuiFocusModule], selector: 'xui-textarea', changeDetection: ChangeDetectionStrategy.OnPush, host: {
'(focusout)': '_onTouched?.()'
}, template: "<div [ngClass]=\"_styles()\" [class.x-textarea-error]=\"_showError\">\n <textarea\n [disabled]=\"_disabled()\"\n [readOnly]=\"readOnly()\"\n [(ngModel)]=\"value\"\n [rows]=\"rows()\"\n [placeholder]=\"placeholder() ?? ''\"\n [maxLength]=\"maxLength() ?? 524288\"\n [tabindex]=\"_disabled() ? -1 : 0\"\n ></textarea>\n\n <div *ngIf=\"maxLength()\" class=\"x-textarea-word-counter\">{{ _worldCount() }}</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: () => [{ type: i1.TranslateService }, { type: i2.NgControl, decorators: [{
type: Self
}, {
type: Optional
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3h1aS9zcmMvdGV4dGFyZWEvdGV4dGFyZWEudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzL3h1aS9zcmMvdGV4dGFyZWEvdGV4dGFyZWEuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLFFBQVEsRUFDUixJQUFJLEVBQ0osTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV4RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7OztBQVl4RCxNQUFNLE9BQU8sV0FBVztJQTJCdEIsSUFBSSxZQUFZO1FBQ2QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsWUFDVSxXQUE2QixFQUNWLE9BQW1CO1FBRHRDLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUNWLFlBQU8sR0FBUCxPQUFPLENBQVk7UUEvQmhELGNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUIsVUFBSyxHQUFHLEtBQUssRUFBVSxDQUFDO1FBQ3hCLGdCQUFXLEdBQUcsS0FBSyxFQUFVLENBQUM7UUFDOUIsVUFBSyxHQUFHLEtBQUss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QUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQyxZQUMzRCxjQUFjLG1CQUNQLHVCQUF1QixDQUFDLE1BQU0sUUFFekM7d0JBQ0osWUFBWSxFQUFFLGdCQUFnQjtxQkFDL0I7OzBCQW9DRSxJQUFJOzswQkFBSSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5wdXQsXG4gIG1vZGVsLFxuICBPcHRpb25hbCxcbiAgU2VsZixcbiAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFRleHRhcmVhQ29sb3IsIFRleHRhcmVhU2l6ZSB9IGZyb20gJy4vdGV4dGFyZWEudHlwZXMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFh1aUZvY3VzTW9kdWxlIH0gZnJvbSAnLi4vdXRpbHMvZm9jdXMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLCBYdWlGb2N1c01vZHVsZV0sXG4gIHNlbGVjdG9yOiAneHVpLXRleHRhcmVhJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlVXJsOiAndGV4dGFyZWEuaHRtbCcsXG4gIGhvc3Q6IHtcbiAgICAnKGZvY3Vzb3V0KSc6ICdfb25Ub3VjaGVkPy4oKSdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBYdWlUZXh0YXJlYSBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgcHJpdmF0ZSBvbkNoYW5nZT86IChzb3VyY2U6IHN0cmluZyB8IG51bGwpID0+IHZvaWQ7XG4gIF9vblRvdWNoZWQ/OiAoKSA9PiB2b2lkO1xuICBfZGlzYWJsZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHZhbHVlID0gbW9kZWw8c3RyaW5nPigpO1xuICBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgY29sb3IgPSBpbnB1dDxUZXh0YXJlYUNvbG9yPignbGlnaHQnKTtcbiAgc2l6ZSA9IGlucHV0PFRleHRhcmVhU2l6ZT4oJ25vcm1hbCcpO1xuICByb3dzID0gaW5wdXQoMyk7XG4gIG1heExlbmd0aCA9IGlucHV0PG51bWJlcj4oKTtcbiAgZGlzYWJsZWQgPSBpbnB1dDxib29sZWFuIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCBib29sZWFuPih1bmRlZmluZWQsIHtcbiAgICB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGVcbiAgfSk7XG4gIHJlYWRPbmx5ID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXG4gIF93b3JsZENvdW50ID0gY29tcHV0ZWQoKCkgPT4gKCh0aGlzLm1heExlbmd0aCgpIGFzIG51bWJlcikgPz8gMCkgLSAodGhpcy52YWx1ZSgpPy5sZW5ndGggPz8gMCkpO1xuICBfc3R5bGVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHJldDogeyBba2xhc3M6IHN0cmluZ106IGJvb2xlYW4gfSA9IHtcbiAgICAgICd4LXRleHRhcmVhJzogdHJ1ZSxcbiAgICAgICd4LXRleHRhcmVhLWRpc2FibGVkJzogdGhpcy5fZGlzYWJsZWQoKVxuICAgIH07XG5cbiAgICByZXRbYHgtdGV4dGFyZWEtJHt0aGlzLmNvbG9yKCl9YF0gPSB0cnVlO1xuICAgIHJldHVybiByZXQ7XG4gIH0pO1xuXG4gIGdldCBlcnJvck1lc3NhZ2UoKSB7XG4gICAgY29uc3QgbXNnID0gdGhpcy5jb250cm9sPy5nZXRFcnJvcignbWVzc2FnZScpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQobXNnKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb246IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgY29udHJvbD86IE5nQ29udHJvbFxuICApIHtcbiAgICBpZiAodGhpcy5jb250cm9sKSB7XG4gICAgICB0aGlzLmNvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgfVxuXG4gICAgZWZmZWN0KCgpID0+IHRoaXMuZGlzYWJsZWQoKSAmJiB0aGlzLl9kaXNhYmxlZC5zZXQodGhpcy5kaXNhYmxlZCgpISksIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSk7XG4gICAgZWZmZWN0KCgpID0+IHRoaXMudmFsdWUoKSAhPSB1bmRlZmluZWQgJiYgdGhpcy5vbkNoYW5nZT8uKHRoaXMudmFsdWUoKSEpKTtcbiAgfVxuXG4gIGdldCBfc2hvd0Vycm9yKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jb250cm9sKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZCA9ICEhdGhpcy5jb250cm9sLmludmFsaWQ7XG4gICAgY29uc3QgeyBkaXJ0eSwgdG91Y2hlZCB9ID0gdGhpcy5jb250cm9sO1xuICAgIHJldHVybiBpbnZhbGlkID8gKGRpcnR5ID8/IGZhbHNlKSB8fCAodG91Y2hlZCA/PyBmYWxzZSkgOiBmYWxzZTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUoc291cmNlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnZhbHVlLnNldChzb3VyY2UpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHNvdXJjZTogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZCkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMuX29uVG91Y2hlZCA9IG9uVG91Y2hlZDtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2Rpc2FibGVkLnNldChpc0Rpc2FibGVkKTtcbiAgfVxufVxuIiwiPGRpdiBbbmdDbGFzc109XCJfc3R5bGVzKClcIiBbY2xhc3MueC10ZXh0YXJlYS1lcnJvcl09XCJfc2hvd0Vycm9yXCI+XG4gIDx0ZXh0YXJlYVxuICAgIFtkaXNhYmxlZF09XCJfZGlzYWJsZWQoKVwiXG4gICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5KClcIlxuICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgIFtyb3dzXT1cInJvd3MoKVwiXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyKCkgPz8gJydcIlxuICAgIFttYXhMZW5ndGhdPVwibWF4TGVuZ3RoKCkgPz8gNTI0Mjg4XCJcbiAgICBbdGFiaW5kZXhdPVwiX2Rpc2FibGVkKCkgPyAtMSA6IDBcIlxuICA+PC90ZXh0YXJlYT5cblxuICA8ZGl2ICpuZ0lmPVwibWF4TGVuZ3RoKClcIiBjbGFzcz1cIngtdGV4dGFyZWEtd29yZC1jb3VudGVyXCI+e3sgX3dvcmxkQ291bnQoKSB9fTwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJ4LXRleHRhcmVhLWVycm9yLXRleHRcIiAqbmdJZj1cIl9zaG93RXJyb3JcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2w/Lmhhc0Vycm9yKCdtZXNzYWdlJylcIj57eyBlcnJvck1lc3NhZ2UgfX08L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2w/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+VGhpcyBmaWVsZCBpcyByZXF1aXJlZCE8L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2w/Lmhhc0Vycm9yKCdlbWFpbCcpXCI+RW1haWwgZXhwZWN0ZWQ8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuIl19