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