UNPKG

@taiga-ui/cdk

Version:

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

81 lines (77 loc) 4.04 kB
import { __decorate } from 'tslib'; import * as i0 from '@angular/core'; import { inject, NgZone, Directive, Output, Input } from '@angular/core'; import { NgControl } from '@angular/forms'; import { tuiZoneOptimized } from '@taiga-ui/cdk/observables'; import { TUI_ACTIVE_ELEMENT } from '@taiga-ui/cdk/tokens'; import { tuiInjectElement, tuiArrayRemove, tuiPure } from '@taiga-ui/cdk/utils'; import { map, startWith, distinctUntilChanged, skip, tap, share } from 'rxjs'; class TuiActiveZone { constructor() { // TODO: Should we remove in v5? It's no longer used in Taiga UI this.control = inject(NgControl, { self: true, optional: true }); this.active$ = inject(TUI_ACTIVE_ELEMENT); this.zone = inject(NgZone); this.el = tuiInjectElement(); this.tuiActiveZoneParent = null; this.subActiveZones = []; this.directParentActiveZone = inject(TuiActiveZone, { skipSelf: true, optional: true, }); this.tuiActiveZoneChange = this.active$.pipe(map((element) => !!element && this.contains(element)), startWith(false), distinctUntilChanged(), skip(1), tap((active) => { if (!active && typeof this.control?.valueAccessor.onTouched === 'function') { this.control.valueAccessor.onTouched(); } }), tuiZoneOptimized(this.zone), share()); this.directParentActiveZone?.addSubActiveZone(this); } set tuiActiveZoneParentSetter(zone) { this.setZone(zone); } ngOnDestroy() { this.directParentActiveZone?.removeSubActiveZone(this); this.tuiActiveZoneParent?.removeSubActiveZone(this); } contains(node) { return (this.el.contains(node) || this.subActiveZones.some((item, index, array) => array.indexOf(item) === index && item.contains(node))); } setZone(zone) { this.tuiActiveZoneParent?.removeSubActiveZone(this); zone?.addSubActiveZone(this); this.tuiActiveZoneParent = zone; } addSubActiveZone(activeZone) { this.subActiveZones = [...this.subActiveZones, activeZone]; } removeSubActiveZone(activeZone) { this.subActiveZones = tuiArrayRemove(this.subActiveZones, this.subActiveZones.indexOf(activeZone)); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiActiveZone, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiActiveZone, isStandalone: true, selector: "[tuiActiveZone]:not(ng-container), [tuiActiveZoneChange]:not(ng-container), [tuiActiveZoneParent]:not(ng-container)", inputs: { tuiActiveZoneParentSetter: ["tuiActiveZoneParent", "tuiActiveZoneParentSetter"] }, outputs: { tuiActiveZoneChange: "tuiActiveZoneChange" }, host: { listeners: { "document:mousedown.zoneless": "(0)" } }, exportAs: ["tuiActiveZone"], ngImport: i0 }); } } __decorate([ tuiPure ], TuiActiveZone.prototype, "setZone", null); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiActiveZone, decorators: [{ type: Directive, args: [{ standalone: true, selector: '[tuiActiveZone]:not(ng-container), [tuiActiveZoneChange]:not(ng-container), [tuiActiveZoneParent]:not(ng-container)', exportAs: 'tuiActiveZone', host: { '(document:mousedown.zoneless)': '(0)', }, }] }], ctorParameters: function () { return []; }, propDecorators: { tuiActiveZoneChange: [{ type: Output }], tuiActiveZoneParentSetter: [{ type: Input, args: ['tuiActiveZoneParent'] }], setZone: [] } }); /** * Generated bundle index. Do not edit. */ export { TuiActiveZone }; //# sourceMappingURL=taiga-ui-cdk-directives-active-zone.mjs.map