UNPKG

@taiga-ui/cdk

Version:

Base library for creating Angular components and applications using Taiga UI principles regarding of actual visual appearance

96 lines 16.1 kB
import { ChangeDetectorRef, computed, Directive, inject, Input, signal, untracked, } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { NgControl, NgModel, } from '@angular/forms'; import { EMPTY_FUNCTION } from '@taiga-ui/cdk/constants'; import { TUI_FALLBACK_VALUE } from '@taiga-ui/cdk/tokens'; import { tuiProvide } from '@taiga-ui/cdk/utils'; import { delay, distinctUntilChanged, EMPTY, filter, map, merge, startWith, Subject, switchMap, } from 'rxjs'; import { TUI_IDENTITY_VALUE_TRANSFORMER, TuiValueTransformer } from './value-transformer'; import * as i0 from "@angular/core"; const FLAGS = { self: true, optional: true }; /** * Basic ControlValueAccessor class to build form components upon */ class TuiControl { constructor() { this.fallback = inject(TUI_FALLBACK_VALUE, FLAGS); this.refresh$ = new Subject(); this.pseudoInvalid = signal(null); this.internal = signal(this.fallback); this.control = inject(NgControl, { self: true }); this.cdr = inject(ChangeDetectorRef); this.transformer = inject(TuiValueTransformer, FLAGS) ?? TUI_IDENTITY_VALUE_TRANSFORMER; this.value = computed(() => this.internal() ?? this.fallback); this.readOnly = signal(false); this.touched = signal(false); this.status = signal(undefined); this.disabled = computed(() => this.status() === 'DISABLED'); this.interactive = computed(() => !this.disabled() && !this.readOnly()); this.invalid = computed(() => this.pseudoInvalid() !== null ? !!this.pseudoInvalid() && this.interactive() : this.interactive() && this.touched() && this.status() === 'INVALID'); this.mode = computed(() => // eslint-disable-next-line no-nested-ternary this.readOnly() ? 'readonly' : this.invalid() ? 'invalid' : 'valid'); this.onTouched = EMPTY_FUNCTION; this.onChange = EMPTY_FUNCTION; this.control.valueAccessor = this; this.refresh$ .pipe(delay(0), startWith(null), map(() => this.control.control), filter(Boolean), distinctUntilChanged(), switchMap((c) => merge(c.valueChanges, c.statusChanges, c.events || EMPTY).pipe(startWith(null))), takeUntilDestroyed()) .subscribe(() => this.update()); } set readOnlySetter(readOnly) { this.readOnly.set(readOnly); } set invalidSetter(invalid) { this.pseudoInvalid.set(invalid); } registerOnChange(onChange) { this.refresh$.next(); this.onChange = (value) => { const internal = untracked(() => this.internal()); if (value === internal) { return; } onChange(this.transformer.toControlValue(value)); this.internal.set(value); this.update(); }; } registerOnTouched(onTouched) { this.onTouched = () => { onTouched(); this.update(); }; } setDisabledState() { this.update(); } writeValue(value) { // TODO: https://github.com/angular/angular/issues/14988 const safe = this.control instanceof NgModel ? this.control.model : value; this.internal.set(this.transformer.fromControlValue(safe)); this.update(); } update() { this.status.set(this.control.control?.status); this.touched.set(!!this.control.control?.touched); this.cdr.markForCheck(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiControl, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiControl, inputs: { readOnlySetter: ["readOnly", "readOnlySetter"], invalidSetter: ["invalid", "invalidSetter"] }, ngImport: i0 }); } } export { TuiControl }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiControl, decorators: [{ type: Directive }], ctorParameters: function () { return []; }, propDecorators: { readOnlySetter: [{ type: Input, args: ['readOnly'] }], invalidSetter: [{ type: Input, args: ['invalid'] }] } }); export function tuiAsControl(control) { return tuiProvide(TuiControl, control); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Nkay9jbGFzc2VzL2NvbnRyb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBR0gsU0FBUyxFQUNULE9BQU8sR0FDVixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxFQUNILEtBQUssRUFDTCxvQkFBb0IsRUFDcEIsS0FBSyxFQUNMLE1BQU0sRUFDTixHQUFHLEVBQ0gsS0FBSyxFQUNMLFNBQVMsRUFDVCxPQUFPLEVBQ1AsU0FBUyxHQUNaLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFDLDhCQUE4QixFQUFFLG1CQUFtQixFQUFDLE1BQU0scUJBQXFCLENBQUM7O0FBRXhGLE1BQU0sS0FBSyxHQUFHLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFDLENBQUM7QUFFM0M7O0dBRUc7QUFDSCxNQUNzQixVQUFVO0lBK0I1QjtRQTlCaUIsYUFBUSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQU0sQ0FBQztRQUNsRCxhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUMvQixrQkFBYSxHQUFHLE1BQU0sQ0FBaUIsSUFBSSxDQUFDLENBQUM7UUFDN0MsYUFBUSxHQUFHLE1B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QUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzVCLENBQUM7K0dBckdpQixVQUFVO21HQUFWLFVBQVU7O1NBQVYsVUFBVTs0RkFBVixVQUFVO2tCQUQvQixTQUFTOzBFQXNESyxjQUFjO3NCQUR4QixLQUFLO3VCQUFDLFVBQVU7Z0JBTU4sYUFBYTtzQkFEdkIsS0FBSzt1QkFBQyxTQUFTOztBQStDcEIsTUFBTSxVQUFVLFlBQVksQ0FBSSxPQUE0QjtJQUN4RCxPQUFPLFVBQVUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgY29tcHV0ZWQsXG4gICAgRGlyZWN0aXZlLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICB0eXBlIFByb3ZpZGVyLFxuICAgIHNpZ25hbCxcbiAgICB0eXBlIFR5cGUsXG4gICAgdW50cmFja2VkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICAgIHR5cGUgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgdHlwZSBGb3JtQ29udHJvbFN0YXR1cyxcbiAgICBOZ0NvbnRyb2wsXG4gICAgTmdNb2RlbCxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtFTVBUWV9GVU5DVElPTn0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuaW1wb3J0IHtUVUlfRkFMTEJBQ0tfVkFMVUV9IGZyb20gJ0B0YWlnYS11aS9jZGsvdG9rZW5zJztcbmltcG9ydCB7dHVpUHJvdmlkZX0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscyc7XG5pbXBvcnQge1xuICAgIGRlbGF5LFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICAgIEVNUFRZLFxuICAgIGZpbHRlcixcbiAgICBtYXAsXG4gICAgbWVyZ2UsXG4gICAgc3RhcnRXaXRoLFxuICAgIFN1YmplY3QsXG4gICAgc3dpdGNoTWFwLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtUVUlfSURFTlRJVFlfVkFMVUVfVFJBTlNGT1JNRVIsIFR1aVZhbHVlVHJhbnNmb3JtZXJ9IGZyb20gJy4vdmFsdWUtdHJhbnNmb3JtZXInO1xuXG5jb25zdCBGTEFHUyA9IHtzZWxmOiB0cnVlLCBvcHRpb25hbDogdHJ1ZX07XG5cbi8qKlxuICogQmFzaWMgQ29udHJvbFZhbHVlQWNjZXNzb3IgY2xhc3MgdG8gYnVpbGQgZm9ybSBjb21wb25lbnRzIHVwb25cbiAqL1xuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVHVpQ29udHJvbDxUPiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZhbGxiYWNrID0gaW5qZWN0KFRVSV9GQUxMQkFDS19WQUxVRSwgRkxBR1MpIGFzIFQ7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZWZyZXNoJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwc2V1ZG9JbnZhbGlkID0gc2lnbmFsPGJvb2xlYW4gfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGludGVybmFsID0gc2lnbmFsKHRoaXMuZmFsbGJhY2spO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbnRyb2wgPSBpbmplY3QoTmdDb250cm9sLCB7c2VsZjogdHJ1ZX0pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgIHByb3RlY3RlZCB0cmFuc2Zvcm1lciA9XG4gICAgICAgIGluamVjdChUdWlWYWx1ZVRyYW5zZm9ybWVyLCBGTEFHUykgPz8gVFVJX0lERU5USVRZX1ZBTFVFX1RSQU5TRk9STUVSO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHZhbHVlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pbnRlcm5hbCgpID8/IHRoaXMuZmFsbGJhY2spO1xuICAgIHB1YmxpYyByZWFkb25seSByZWFkT25seSA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHVibGljIHJlYWRvbmx5IHRvdWNoZWQgPSBzaWduYWwoZmFsc2UpO1xuICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXMgPSBzaWduYWw8Rm9ybUNvbnRyb2xTdGF0dXMgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gICAgcHVibGljIHJlYWRvbmx5IGRpc2FibGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGF0dXMoKSA9PT0gJ0RJU0FCTEVEJyk7XG4gICAgcHVibGljIHJlYWRvbmx5IGludGVyYWN0aXZlID0gY29tcHV0ZWQoKCkgPT4gIXRoaXMuZGlzYWJsZWQoKSAmJiAhdGhpcy5yZWFkT25seSgpKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaW52YWxpZCA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIHRoaXMucHNldWRvSW52YWxpZCgpICE9PSBudWxsXG4gICAgICAgICAgICA/ICEhdGhpcy5wc2V1ZG9JbnZhbGlkKCkgJiYgdGhpcy5pbnRlcmFjdGl2ZSgpXG4gICAgICAgICAgICA6IHRoaXMuaW50ZXJhY3RpdmUoKSAmJiB0aGlzLnRvdWNoZWQoKSAmJiB0aGlzLnN0YXR1cygpID09PSAnSU5WQUxJRCcsXG4gICAgKTtcblxuICAgIHB1YmxpYyByZWFkb25seSBtb2RlID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5XG4gICAgICAgIHRoaXMucmVhZE9ubHkoKSA/ICdyZWFkb25seScgOiB0aGlzLmludmFsaWQoKSA/ICdpbnZhbGlkJyA6ICd2YWxpZCcsXG4gICAgKTtcblxuICAgIHB1YmxpYyBvblRvdWNoZWQgPSBFTVBUWV9GVU5DVElPTjtcbiAgICBwdWJsaWMgb25DaGFuZ2U6ICh2YWx1ZTogVCkgPT4gdm9pZCA9IEVNUFRZX0ZVTkNUSU9OO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICAgICAgdGhpcy5yZWZyZXNoJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVsYXkoMCksXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKG51bGwpLFxuICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB0aGlzLmNvbnRyb2wuY29udHJvbCksXG4gICAgICAgICAgICAgICAgZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKChjKSA9PlxuICAgICAgICAgICAgICAgICAgICBtZXJnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGMudmFsdWVDaGFuZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgYy5zdGF0dXNDaGFuZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGMgYXMgYW55KS5ldmVudHMgfHwgRU1QVFksXG4gICAgICAgICAgICAgICAgICAgICkucGlwZShzdGFydFdpdGgobnVsbCkpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMudXBkYXRlKCkpO1xuICAgIH1cblxuICAgIEBJbnB1dCgncmVhZE9ubHknKVxuICAgIHB1YmxpYyBzZXQgcmVhZE9ubHlTZXR0ZXIocmVhZE9ubHk6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5yZWFkT25seS5zZXQocmVhZE9ubHkpO1xuICAgIH1cblxuICAgIEBJbnB1dCgnaW52YWxpZCcpXG4gICAgcHVibGljIHNldCBpbnZhbGlkU2V0dGVyKGludmFsaWQ6IGJvb2xlYW4gfCBudWxsKSB7XG4gICAgICAgIHRoaXMucHNldWRvSW52YWxpZC5zZXQoaW52YWxpZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZnJlc2gkLm5leHQoKTtcblxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gKHZhbHVlOiBUKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcm5hbCA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLmludGVybmFsKCkpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IGludGVybmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvbkNoYW5nZSh0aGlzLnRyYW5zZm9ybWVyLnRvQ29udHJvbFZhbHVlKHZhbHVlKSk7XG4gICAgICAgICAgICB0aGlzLmludGVybmFsLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICBvblRvdWNoZWQoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IFQgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIC8vIFRPRE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE0OTg4XG4gICAgICAgIGNvbnN0IHNhZmUgPSB0aGlzLmNvbnRyb2wgaW5zdGFuY2VvZiBOZ01vZGVsID8gdGhpcy5jb250cm9sLm1vZGVsIDogdmFsdWU7XG5cbiAgICAgICAgdGhpcy5pbnRlcm5hbC5zZXQodGhpcy50cmFuc2Zvcm1lci5mcm9tQ29udHJvbFZhbHVlKHNhZmUpKTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0dXMuc2V0KHRoaXMuY29udHJvbC5jb250cm9sPy5zdGF0dXMpO1xuICAgICAgICB0aGlzLnRvdWNoZWQuc2V0KCEhdGhpcy5jb250cm9sLmNvbnRyb2w/LnRvdWNoZWQpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0dWlBc0NvbnRyb2w8VD4oY29udHJvbDogVHlwZTxUdWlDb250cm9sPFQ+Pik6IFByb3ZpZGVyIHtcbiAgICByZXR1cm4gdHVpUHJvdmlkZShUdWlDb250cm9sLCBjb250cm9sKTtcbn1cbiJdfQ==