@taiga-ui/cdk
Version:
Base library for creating Angular components and applications using Taiga UI principles regarding of actual visual appearance
43 lines • 6.75 kB
JavaScript
import { Directive, Input } from '@angular/core';
import { NG_VALIDATORS } from '@angular/forms';
import { tuiTakeUntilDestroyed, tuiZonefree } from '@taiga-ui/cdk/observables';
import { tuiInjectElement, tuiProvide } from '@taiga-ui/cdk/utils';
import { BehaviorSubject, delay, of, switchMap } from 'rxjs';
import * as i0 from "@angular/core";
class TuiNativeValidator {
constructor() {
this.el = tuiInjectElement();
this.control$ = new BehaviorSubject(null);
this.sub = this.control$
.pipe(switchMap((control) => control?.events || of(null)), delay(0), tuiZonefree(), tuiTakeUntilDestroyed())
.subscribe(() => this.handleValidation());
this.tuiNativeValidator = 'Invalid';
}
validate(control) {
this.control$.next(control);
return null;
}
handleValidation() {
const invalid = !!this.control$.value?.touched && this.control$.value?.invalid;
// TODO: Replace with :has(:invalid) when supported
this.el.closest('tui-textfield')?.classList.toggle('tui-invalid', invalid);
this.el.setCustomValidity?.(invalid ? this.tuiNativeValidator : '');
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiNativeValidator, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiNativeValidator, isStandalone: true, selector: "[tuiNativeValidator]", inputs: { tuiNativeValidator: "tuiNativeValidator" }, host: { listeners: { "focusout": "handleValidation()" } }, providers: [tuiProvide(NG_VALIDATORS, TuiNativeValidator, true)], ngImport: i0 }); }
}
export { TuiNativeValidator };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiNativeValidator, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: '[tuiNativeValidator]',
providers: [tuiProvide(NG_VALIDATORS, TuiNativeValidator, true)],
host: {
'(focusout)': 'handleValidation()',
},
}]
}], propDecorators: { tuiNativeValidator: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLXZhbGlkYXRvci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvZGlyZWN0aXZlcy9uYXRpdmUtdmFsaWRhdG9yL25hdGl2ZS12YWxpZGF0b3IuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBdUIsYUFBYSxFQUFpQixNQUFNLGdCQUFnQixDQUFDO0FBQ25GLE9BQU8sRUFBQyxxQkFBcUIsRUFBRSxXQUFXLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsVUFBVSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDakUsT0FBTyxFQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQzs7QUFFM0QsTUFRYSxrQkFBa0I7SUFSL0I7UUFTcUIsT0FBRSxHQUFHLGdCQUFnQixFQUFvQixDQUFDO1FBQzFDLGFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBeUIsSUFBSSxDQUFDLENBQUM7UUFFM0QsUUFBRyxHQUFHLElBQUksQ0FBQyxRQUFRO2FBQ2pDLElBQUksQ0FDRCxTQUFTLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQ3hELEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixXQUFXLEVBQUUsRUFDYixxQkFBcUIsRUFBRSxDQUMxQjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBR3ZDLHVCQUFrQixHQUFHLFNBQVMsQ0FBQztLQWV6QztJQWJVLFFBQVEsQ0FBQyxPQUF3QjtRQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU1QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRVMsZ0JBQWdCO1FBQ3RCLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1FBRS9FLG1EQUFtRDtRQUNuRCxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7K0dBNUJRLGtCQUFrQjttR0FBbEIsa0JBQWtCLG9MQUxoQixDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7O1NBS3ZELGtCQUFrQjs0RkFBbEIsa0JBQWtCO2tCQVI5QixTQUFTO21CQUFDO29CQUNQLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsc0JBQXNCO29CQUNoQyxTQUFTLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxzQkFBc0IsSUFBSSxDQUFDLENBQUM7b0JBQ2hFLElBQUksRUFBRTt3QkFDRixZQUFZLEVBQUUsb0JBQW9CO3FCQUNyQztpQkFDSjs4QkFlVSxrQkFBa0I7c0JBRHhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgSW5wdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHt0eXBlIEFic3RyYWN0Q29udHJvbCwgTkdfVkFMSURBVE9SUywgdHlwZSBWYWxpZGF0b3J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7dHVpVGFrZVVudGlsRGVzdHJveWVkLCB0dWlab25lZnJlZX0gZnJvbSAnQHRhaWdhLXVpL2Nkay9vYnNlcnZhYmxlcyc7XG5pbXBvcnQge3R1aUluamVjdEVsZW1lbnQsIHR1aVByb3ZpZGV9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGRlbGF5LCBvZiwgc3dpdGNoTWFwfSBmcm9tICdyeGpzJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ1t0dWlOYXRpdmVWYWxpZGF0b3JdJyxcbiAgICBwcm92aWRlcnM6IFt0dWlQcm92aWRlKE5HX1ZBTElEQVRPUlMsIFR1aU5hdGl2ZVZhbGlkYXRvciwgdHJ1ZSldLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhmb2N1c291dCknOiAnaGFuZGxlVmFsaWRhdGlvbigpJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUdWlOYXRpdmVWYWxpZGF0b3IgaW1wbGVtZW50cyBWYWxpZGF0b3Ige1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZWwgPSB0dWlJbmplY3RFbGVtZW50PEhUTUxJbnB1dEVsZW1lbnQ+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QWJzdHJhY3RDb250cm9sIHwgbnVsbD4obnVsbCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3ViID0gdGhpcy5jb250cm9sJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoY29udHJvbDogYW55KSA9PiBjb250cm9sPy5ldmVudHMgfHwgb2YobnVsbCkpLFxuICAgICAgICAgICAgZGVsYXkoMCksXG4gICAgICAgICAgICB0dWlab25lZnJlZSgpLFxuICAgICAgICAgICAgdHVpVGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhhbmRsZVZhbGlkYXRpb24oKSk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB0dWlOYXRpdmVWYWxpZGF0b3IgPSAnSW52YWxpZCc7XG5cbiAgICBwdWJsaWMgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogbnVsbCB7XG4gICAgICAgIHRoaXMuY29udHJvbCQubmV4dChjb250cm9sKTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlVmFsaWRhdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW52YWxpZCA9ICEhdGhpcy5jb250cm9sJC52YWx1ZT8udG91Y2hlZCAmJiB0aGlzLmNvbnRyb2wkLnZhbHVlPy5pbnZhbGlkO1xuXG4gICAgICAgIC8vIFRPRE86IFJlcGxhY2Ugd2l0aCA6aGFzKDppbnZhbGlkKSB3aGVuIHN1cHBvcnRlZFxuICAgICAgICB0aGlzLmVsLmNsb3Nlc3QoJ3R1aS10ZXh0ZmllbGQnKT8uY2xhc3NMaXN0LnRvZ2dsZSgndHVpLWludmFsaWQnLCBpbnZhbGlkKTtcbiAgICAgICAgdGhpcy5lbC5zZXRDdXN0b21WYWxpZGl0eT8uKGludmFsaWQgPyB0aGlzLnR1aU5hdGl2ZVZhbGlkYXRvciA6ICcnKTtcbiAgICB9XG59XG4iXX0=