@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
JavaScript
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==