@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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Nkay9jbGFzc2VzL2NvbnRyb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNILGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUU5RCxPQUFPLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxFQUNILEtBQUssRUFDTCxvQkFBb0IsRUFDcEIsS0FBSyxFQUNMLE1BQU0sRUFDTixHQUFHLEVBQ0gsS0FBSyxFQUNMLFNBQVMsRUFDVCxPQUFPLEVBQ1AsU0FBUyxHQUNaLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFDLDhCQUE4QixFQUFFLG1CQUFtQixFQUFDLE1BQU0scUJBQXFCLENBQUM7O0FBRXhGLE1BQU0sS0FBSyxHQUFHLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFDLENBQUM7QUFFM0M7O0dBRUc7QUFDSCxNQUNzQixVQUFVO0lBK0I1QjtRQTlCaUIsYUFBUSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQU0sQ0FBQztRQUNsRCxhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUMvQixrQkFBYSxHQUFHLE1BQU0sQ0FBaUIsSUFBSSxDQUFDLENBQUM7UUFDN0MsYUFBUSxHQUFHLE1B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QUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzVCLENBQUM7K0dBckdpQixVQUFVO21HQUFWLFVBQVU7O1NBQVYsVUFBVTs0RkFBVixVQUFVO2tCQUQvQixTQUFTOzBFQXNESyxjQUFjO3NCQUR4QixLQUFLO3VCQUFDLFVBQVU7Z0JBTU4sYUFBYTtzQkFEdkIsS0FBSzt1QkFBQyxTQUFTOztBQStDcEIsTUFBTSxVQUFVLFlBQVksQ0FBSSxPQUE0QjtJQUN4RCxPQUFPLFVBQVUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtQcm92aWRlciwgVHlwZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIGNvbXB1dGVkLFxuICAgIERpcmVjdGl2ZSxcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgc2lnbmFsLFxuICAgIHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHR5cGUge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbFN0YXR1c30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtOZ0NvbnRyb2wsIE5nTW9kZWx9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7RU1QVFlfRlVOQ1RJT059IGZyb20gJ0B0YWlnYS11aS9jZGsvY29uc3RhbnRzJztcbmltcG9ydCB7VFVJX0ZBTExCQUNLX1ZBTFVFfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3Rva2Vucyc7XG5pbXBvcnQge3R1aVByb3ZpZGV9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMnO1xuaW1wb3J0IHtcbiAgICBkZWxheSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgICBFTVBUWSxcbiAgICBmaWx0ZXIsXG4gICAgbWFwLFxuICAgIG1lcmdlLFxuICAgIHN0YXJ0V2l0aCxcbiAgICBTdWJqZWN0LFxuICAgIHN3aXRjaE1hcCxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7VFVJX0lERU5USVRZX1ZBTFVFX1RSQU5TRk9STUVSLCBUdWlWYWx1ZVRyYW5zZm9ybWVyfSBmcm9tICcuL3ZhbHVlLXRyYW5zZm9ybWVyJztcblxuY29uc3QgRkxBR1MgPSB7c2VsZjogdHJ1ZSwgb3B0aW9uYWw6IHRydWV9O1xuXG4vKipcbiAqIEJhc2ljIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGNsYXNzIHRvIGJ1aWxkIGZvcm0gY29tcG9uZW50cyB1cG9uXG4gKi9cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFR1aUNvbnRyb2w8VD4gaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmYWxsYmFjayA9IGluamVjdChUVUlfRkFMTEJBQ0tfVkFMVUUsIEZMQUdTKSBhcyBUO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVmcmVzaCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcHNldWRvSW52YWxpZCA9IHNpZ25hbDxib29sZWFuIHwgbnVsbD4obnVsbCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbnRlcm5hbCA9IHNpZ25hbCh0aGlzLmZhbGxiYWNrKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBjb250cm9sID0gaW5qZWN0KE5nQ29udHJvbCwge3NlbGY6IHRydWV9KTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgICBwcm90ZWN0ZWQgdHJhbnNmb3JtZXIgPVxuICAgICAgICBpbmplY3QoVHVpVmFsdWVUcmFuc2Zvcm1lciwgRkxBR1MpID8/IFRVSV9JREVOVElUWV9WQUxVRV9UUkFOU0ZPUk1FUjtcblxuICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaW50ZXJuYWwoKSA/PyB0aGlzLmZhbGxiYWNrKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVhZE9ubHkgPSBzaWduYWwoZmFsc2UpO1xuICAgIHB1YmxpYyByZWFkb25seSB0b3VjaGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzID0gc2lnbmFsPEZvcm1Db250cm9sU3RhdHVzIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgIHB1YmxpYyByZWFkb25seSBkaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdHVzKCkgPT09ICdESVNBQkxFRCcpO1xuICAgIHB1YmxpYyByZWFkb25seSBpbnRlcmFjdGl2ZSA9IGNvbXB1dGVkKCgpID0+ICF0aGlzLmRpc2FibGVkKCkgJiYgIXRoaXMucmVhZE9ubHkoKSk7XG4gICAgcHVibGljIHJlYWRvbmx5IGludmFsaWQgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgICB0aGlzLnBzZXVkb0ludmFsaWQoKSAhPT0gbnVsbFxuICAgICAgICAgICAgPyAhIXRoaXMucHNldWRvSW52YWxpZCgpICYmIHRoaXMuaW50ZXJhY3RpdmUoKVxuICAgICAgICAgICAgOiB0aGlzLmludGVyYWN0aXZlKCkgJiYgdGhpcy50b3VjaGVkKCkgJiYgdGhpcy5zdGF0dXMoKSA9PT0gJ0lOVkFMSUQnLFxuICAgICk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgbW9kZSA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuICAgICAgICB0aGlzLnJlYWRPbmx5KCkgPyAncmVhZG9ubHknIDogdGhpcy5pbnZhbGlkKCkgPyAnaW52YWxpZCcgOiAndmFsaWQnLFxuICAgICk7XG5cbiAgICBwdWJsaWMgb25Ub3VjaGVkID0gRU1QVFlfRlVOQ1RJT047XG4gICAgcHVibGljIG9uQ2hhbmdlOiAodmFsdWU6IFQpID0+IHZvaWQgPSBFTVBUWV9GVU5DVElPTjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgICAgIHRoaXMucmVmcmVzaCRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGRlbGF5KDApLFxuICAgICAgICAgICAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5jb250cm9sLmNvbnRyb2wpLFxuICAgICAgICAgICAgICAgIGZpbHRlcihCb29sZWFuKSxcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoYykgPT5cbiAgICAgICAgICAgICAgICAgICAgbWVyZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBjLnZhbHVlQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGMuc3RhdHVzQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIChjIGFzIGFueSkuZXZlbnRzIHx8IEVNUFRZLFxuICAgICAgICAgICAgICAgICAgICApLnBpcGUoc3RhcnRXaXRoKG51bGwpKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwZGF0ZSgpKTtcbiAgICB9XG5cbiAgICBASW5wdXQoJ3JlYWRPbmx5JylcbiAgICBwdWJsaWMgc2V0IHJlYWRPbmx5U2V0dGVyKHJlYWRPbmx5OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMucmVhZE9ubHkuc2V0KHJlYWRPbmx5KTtcbiAgICB9XG5cbiAgICBASW5wdXQoJ2ludmFsaWQnKVxuICAgIHB1YmxpYyBzZXQgaW52YWxpZFNldHRlcihpbnZhbGlkOiBib29sZWFuIHwgbnVsbCkge1xuICAgICAgICB0aGlzLnBzZXVkb0ludmFsaWQuc2V0KGludmFsaWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoJC5uZXh0KCk7XG5cbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9ICh2YWx1ZTogVCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJuYWwgPSB1bnRyYWNrZWQoKCkgPT4gdGhpcy5pbnRlcm5hbCgpKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBpbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb25DaGFuZ2UodGhpcy50cmFuc2Zvcm1lci50b0NvbnRyb2xWYWx1ZSh2YWx1ZSkpO1xuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbC5zZXQodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gKCkgPT4ge1xuICAgICAgICAgICAgb25Ub3VjaGVkKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBUIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICAvLyBUT0RPOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xNDk4OFxuICAgICAgICBjb25zdCBzYWZlID0gdGhpcy5jb250cm9sIGluc3RhbmNlb2YgTmdNb2RlbCA/IHRoaXMuY29udHJvbC5tb2RlbCA6IHZhbHVlO1xuXG4gICAgICAgIHRoaXMuaW50ZXJuYWwuc2V0KHRoaXMudHJhbnNmb3JtZXIuZnJvbUNvbnRyb2xWYWx1ZShzYWZlKSk7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdHVzLnNldCh0aGlzLmNvbnRyb2wuY29udHJvbD8uc3RhdHVzKTtcbiAgICAgICAgdGhpcy50b3VjaGVkLnNldCghIXRoaXMuY29udHJvbC5jb250cm9sPy50b3VjaGVkKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHVpQXNDb250cm9sPFQ+KGNvbnRyb2w6IFR5cGU8VHVpQ29udHJvbDxUPj4pOiBQcm92aWRlciB7XG4gICAgcmV0dXJuIHR1aVByb3ZpZGUoVHVpQ29udHJvbCwgY29udHJvbCk7XG59XG4iXX0=