@tetacom/ng-components 1.0.67 → 1.0.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, ChangeDetectionStrategy, HostBinding, Directive, Optional, Inject, ContentChild, Input, Host, HostListener, Injectable, NgModule, forwardRef, EventEmitter, ElementRef, Output, Pipe, ViewChild, ViewEncapsulation, ChangeDetectorRef, TemplateRef, Injector, ContentChildren, SkipSelf, ViewContainerRef, PLATFORM_ID } from '@angular/core';
2
+ import { Component, ChangeDetectionStrategy, HostBinding, Directive, Optional, Inject, ContentChild, Input, Host, HostListener, Injectable, NgModule, forwardRef, EventEmitter, ElementRef, Output, Pipe, ViewChild, TemplateRef, Injector, ViewEncapsulation, ChangeDetectorRef, ContentChildren, SkipSelf, ViewContainerRef, PLATFORM_ID } from '@angular/core';
3
3
  import * as i2 from '@angular/common';
4
4
  import { DOCUMENT, CommonModule, isPlatformBrowser } from '@angular/common';
5
5
  import * as i1 from '@angular/common/http';
@@ -1053,6 +1053,9 @@ class DomUtil {
1053
1053
  }
1054
1054
  return null;
1055
1055
  }
1056
+ static isOverflown(element) {
1057
+ return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth;
1058
+ }
1056
1059
  }
1057
1060
 
1058
1061
  class PositionUtil {
@@ -3584,151 +3587,424 @@ class NumericFilterValue {
3584
3587
  }
3585
3588
  }
3586
3589
 
3587
- class InputComponent {
3588
- constructor() {
3589
- this.required = false;
3590
+ class TetaContentRef {
3591
+ constructor(nodes, viewRef, componentRef) {
3592
+ this.nodes = nodes;
3593
+ this.viewRef = viewRef;
3594
+ this.componentRef = componentRef;
3590
3595
  }
3591
- get column() {
3592
- return !this.horizontal;
3596
+ }
3597
+
3598
+ class DynamicData {
3599
+ constructor(value) {
3600
+ for (const key in value) {
3601
+ if (value.hasOwnProperty(key)) {
3602
+ this[key] = value[key];
3603
+ }
3604
+ }
3593
3605
  }
3594
- ngOnInit() { }
3595
3606
  }
3596
- InputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: InputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3597
- InputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: InputComponent, selector: "teta-input", inputs: { label: "label", horizontal: "horizontal", required: "required" }, host: { properties: { "class.row": "this.horizontal", "class.column": "this.column" } }, ngImport: i0, template: "<div class=\"font-caption color-text-90 align-center row nowrap overflow-hidden text-overflow-ellipsis\"\n [class.row_6]=\"horizontal\"\n [class.text-field_required]=\"required\"\n *ngIf=\"label?.length > 0\">\n {{label}}\n</div>\n<div class=\"input-container\" [class.row_6]=\"horizontal\">\n <ng-content></ng-content>\n <div class=\"input-message font-error-message\">\n <ng-content select=\"message\"></ng-content>\n </div>\n</div>\n", styles: [":host{display:flex;grid-gap:4px;flex-grow:1;flex-basis:10px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3598
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: InputComponent, decorators: [{
3599
- type: Component,
3600
- args: [{ selector: 'teta-input', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"font-caption color-text-90 align-center row nowrap overflow-hidden text-overflow-ellipsis\"\n [class.row_6]=\"horizontal\"\n [class.text-field_required]=\"required\"\n *ngIf=\"label?.length > 0\">\n {{label}}\n</div>\n<div class=\"input-container\" [class.row_6]=\"horizontal\">\n <ng-content></ng-content>\n <div class=\"input-message font-error-message\">\n <ng-content select=\"message\"></ng-content>\n </div>\n</div>\n", styles: [":host{display:flex;grid-gap:4px;flex-grow:1;flex-basis:10px}\n"] }]
3601
- }], ctorParameters: function () { return []; }, propDecorators: { label: [{
3602
- type: Input
3603
- }], horizontal: [{
3604
- type: Input
3605
- }, {
3606
- type: HostBinding,
3607
- args: ['class.row']
3608
- }], required: [{
3609
- type: Input
3610
- }], column: [{
3611
- type: HostBinding,
3612
- args: ['class.column']
3613
- }] } });
3614
3607
 
3615
- class NumericFilterComponent extends FilterComponentBase {
3616
- constructor(changeDetector, _config) {
3617
- super();
3618
- this.changeDetector = changeDetector;
3619
- this._config = _config;
3620
- this.filterOptions = [];
3621
- this.filterChanged = new EventEmitter();
3622
- this.locale = this._config.locale;
3608
+ class DynamicComponentService {
3609
+ constructor(_componentFactoryResolver, _rendererFactory, _appRef) {
3610
+ this._componentFactoryResolver = _componentFactoryResolver;
3611
+ this._rendererFactory = _rendererFactory;
3612
+ this._appRef = _appRef;
3613
+ this._renderer = this._rendererFactory.createRenderer(null, null);
3623
3614
  }
3624
- set state(val) {
3625
- this.state$ = val;
3626
- this.filter = this.getFilter();
3627
- this.changeDetector.detectChanges();
3615
+ createComponent(component, contentRef, injector, container) {
3616
+ const componentRef = this._componentFactoryResolver
3617
+ .resolveComponentFactory(component)
3618
+ .create(injector, contentRef.nodes);
3619
+ this._appRef.attachView(componentRef.hostView);
3620
+ container.appendChild(componentRef.location.nativeElement);
3621
+ return componentRef;
3628
3622
  }
3629
- get state() {
3630
- return this.state$;
3623
+ createContent(content, injector, context) {
3624
+ if (content === null || content === undefined) {
3625
+ throw new Error('Content is undefined');
3626
+ }
3627
+ if (typeof content === 'string') {
3628
+ return this.fromString(content);
3629
+ }
3630
+ else if (content instanceof TemplateRef) {
3631
+ return this.fromTemplate(content, context);
3632
+ }
3633
+ else {
3634
+ return this.fromComponent(content, injector, context);
3635
+ }
3631
3636
  }
3632
- ngOnInit() {
3633
- this.filter = this.getFilter();
3637
+ destroy(component, content, container) {
3638
+ if (component) {
3639
+ this._appRef.detachView(component.hostView);
3640
+ component.destroy();
3641
+ }
3642
+ if (content && content.viewRef) {
3643
+ content.viewRef.destroy();
3644
+ }
3645
+ content = null;
3634
3646
  }
3635
- getFilter() {
3636
- let filter = this.state.numericFilters?.find((f) => f.field === this.column.filterField);
3637
- if (filter === null || filter === undefined) {
3638
- filter = this.state.addNumericFilter(new NumericFilter({
3639
- value: new NumericFilterValue(),
3640
- field: this.column.filterField,
3641
- name: this.column.name,
3642
- strict: true,
3643
- }));
3647
+ getContext(content, context) {
3648
+ if (content instanceof TemplateRef) {
3649
+ return {
3650
+ $implicit: context,
3651
+ data: context,
3652
+ };
3644
3653
  }
3645
- return filter;
3654
+ return context;
3646
3655
  }
3647
- }
3648
- NumericFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: NumericFilterComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: TetaConfigService }], target: i0.ɵɵFactoryTarget.Component });
3649
- NumericFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: NumericFilterComponent, selector: "teta-numeric-filter", inputs: { column: "column", data: "data", filterOptions: "filterOptions", state: "state" }, outputs: { filterChanged: "filterChanged" }, usesInheritance: true, ngImport: i0, template: "<div class=\"form-row padding-3\" *ngIf=\"locale | async as loc\">\n <teta-input [label]=\"loc.from\">\n <input class=\"input\" type=\"text\"\n style=\"width: 110px\"\n [tetaOnlyNumber]=\"true\"\n [ngModel]=\"filter.value?.greaterThan\"\n (ngModelChange)=\"filter.value.greaterThan=$event\"/>\n </teta-input>\n <teta-input [label]=\"loc.to\">\n <input class=\"input\" type=\"text\"\n style=\"width: 110px\"\n [tetaOnlyNumber]=\"true\"\n [ngModel]=\"filter.value?.lessThan\"\n (ngModelChange)=\"filter.value.lessThan=$event\"/>\n </teta-input>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputComponent, selector: "teta-input", inputs: ["label", "horizontal", "required"] }, { kind: "directive", type: OnlyNumberDirective, selector: "[tetaOnlyNumber]", inputs: ["tetaOnlyNumber", "allowDecimals", "allowSign", "decimalSeparator", "commaSeparator"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3650
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: NumericFilterComponent, decorators: [{
3651
- type: Component,
3652
- args: [{ selector: 'teta-numeric-filter', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-row padding-3\" *ngIf=\"locale | async as loc\">\n <teta-input [label]=\"loc.from\">\n <input class=\"input\" type=\"text\"\n style=\"width: 110px\"\n [tetaOnlyNumber]=\"true\"\n [ngModel]=\"filter.value?.greaterThan\"\n (ngModelChange)=\"filter.value.greaterThan=$event\"/>\n </teta-input>\n <teta-input [label]=\"loc.to\">\n <input class=\"input\" type=\"text\"\n style=\"width: 110px\"\n [tetaOnlyNumber]=\"true\"\n [ngModel]=\"filter.value?.lessThan\"\n (ngModelChange)=\"filter.value.lessThan=$event\"/>\n </teta-input>\n</div>\n" }]
3653
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: TetaConfigService }]; }, propDecorators: { column: [{
3654
- type: Input
3655
- }], data: [{
3656
- type: Input
3657
- }], filterOptions: [{
3658
- type: Input
3659
- }], filterChanged: [{
3660
- type: Output
3661
- }], state: [{
3662
- type: Input
3663
- }] } });
3664
-
3665
- var StringFilterType;
3666
- (function (StringFilterType) {
3667
- /**
3668
- * Строгое совпадение
3669
- */
3670
- StringFilterType[StringFilterType["Equals"] = 1] = "Equals";
3671
- /**
3672
- * Начинается с указанной подстроки
3673
- */
3674
- StringFilterType[StringFilterType["StartsWith"] = 2] = "StartsWith";
3675
- /**
3676
- * Оканчивается указанной подстрокой
3677
- */
3678
- StringFilterType[StringFilterType["EndsWith"] = 3] = "EndsWith";
3679
- /**
3680
- * Содержит указанную подстроку
3681
- */
3682
- StringFilterType[StringFilterType["Contains"] = 4] = "Contains";
3683
- })(StringFilterType || (StringFilterType = {}));
3684
-
3685
- class StringFilter extends FilterBase {
3686
- constructor(options) {
3687
- super(options);
3688
- if (options) {
3689
- this.value = options.value || this.value;
3690
- this.type = options.type || StringFilterType.Contains;
3656
+ getInjector(data, parent) {
3657
+ return Injector.create({
3658
+ providers: [
3659
+ {
3660
+ provide: DynamicData,
3661
+ useValue: data,
3662
+ },
3663
+ ],
3664
+ parent,
3665
+ });
3666
+ }
3667
+ fromString(content) {
3668
+ return new TetaContentRef([[this._renderer.createText(`${content}`)]]);
3669
+ }
3670
+ fromTemplate(content, context) {
3671
+ const viewRef = content.createEmbeddedView(context);
3672
+ this._appRef.attachView(viewRef);
3673
+ return new TetaContentRef([viewRef.rootNodes], viewRef);
3674
+ }
3675
+ fromComponent(content, injector, context) {
3676
+ const componentFactory = this._componentFactoryResolver.resolveComponentFactory(content);
3677
+ const componentRef = componentFactory.create(injector);
3678
+ for (const key in context) {
3679
+ if (context.hasOwnProperty(key)) {
3680
+ componentRef.instance[key] = context[key];
3681
+ }
3691
3682
  }
3683
+ const componentNativeEl = componentRef.location.nativeElement;
3684
+ this._appRef.attachView(componentRef.hostView);
3685
+ return new TetaContentRef([[componentNativeEl]], componentRef.hostView, componentRef);
3692
3686
  }
3693
3687
  }
3688
+ DynamicComponentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: DynamicComponentService, deps: [{ token: i0.ComponentFactoryResolver }, { token: i0.RendererFactory2 }, { token: i0.ApplicationRef }], target: i0.ɵɵFactoryTarget.Injectable });
3689
+ DynamicComponentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: DynamicComponentService, providedIn: 'root' });
3690
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: DynamicComponentService, decorators: [{
3691
+ type: Injectable,
3692
+ args: [{
3693
+ providedIn: 'root',
3694
+ }]
3695
+ }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i0.RendererFactory2 }, { type: i0.ApplicationRef }]; } });
3694
3696
 
3695
- class StringFilterComponent extends FilterComponentBase {
3696
- constructor(changeDetector, _config) {
3697
- super();
3698
- this.changeDetector = changeDetector;
3699
- this._config = _config;
3700
- this.filterOptions = [];
3701
- this.filterChanged = new EventEmitter();
3702
- this.locale = this._config.locale;
3697
+ class DynamicContentBaseDirective {
3698
+ constructor(_document, _elementRef, _service, _injector, _zone, _cdr) {
3699
+ this._document = _document;
3700
+ this._elementRef = _elementRef;
3701
+ this._service = _service;
3702
+ this._injector = _injector;
3703
+ this._zone = _zone;
3704
+ this._cdr = _cdr;
3705
+ this.align = Align.left;
3706
+ this.verticalAlign = VerticalAlign.bottom;
3707
+ this.openChange = new EventEmitter();
3708
+ this._alive = true;
3709
+ this._open = false;
3710
+ this._zone.onStable
3711
+ .pipe(takeWhile((_) => this._alive), filter((_) => this._open))
3712
+ .subscribe((_) => {
3713
+ this.setPosition();
3714
+ });
3703
3715
  }
3704
- set state(val) {
3705
- this.state$ = val;
3706
- this.filter = this.getFilter();
3707
- this.changeDetector.detectChanges();
3716
+ set open(open) {
3717
+ this._open = open;
3718
+ if (this._open) {
3719
+ this.createContentRef();
3720
+ }
3721
+ else {
3722
+ this.destroyContentRef();
3723
+ }
3708
3724
  }
3709
- get state() {
3710
- return this.state$;
3725
+ ngOnDestroy() {
3726
+ this._alive = false;
3727
+ this.destroyContentRef();
3711
3728
  }
3712
3729
  ngOnInit() {
3713
3730
  }
3714
- setFilter() {
3715
- this.filterChanged.emit(this.filter);
3716
- }
3717
- getFilter() {
3718
- let filter = this.state.stringFilters.find((f) => f.field === this.column.filterField);
3719
- if (!filter) {
3720
- filter = this.state.addStringFilter(new StringFilter({
3721
- value: '',
3722
- field: this.column.filterField,
3723
- type: this.column.stringFilterType,
3724
- name: this.column.name,
3725
- }));
3731
+ createContentRef(className) {
3732
+ if (!this._componentRef) {
3733
+ this._open = true;
3734
+ const injector = this._service.getInjector(this.data, this._injector);
3735
+ const context = this._service.getContext(this._dynamicContent, this.data);
3736
+ this._content = this._service.createContent(this._dynamicContent, this._injector, context);
3737
+ this._componentRef = this._service.createComponent(PopupContentComponent, this._content, injector, this.appendToBody ? this._document.body : this._elementRef.nativeElement);
3738
+ if (className) {
3739
+ this._componentRef.instance.addClass(className);
3740
+ }
3726
3741
  }
3727
- filter.type = this.column.stringFilterType;
3728
- return filter;
3742
+ return this._componentRef;
3729
3743
  }
3730
- }
3731
- StringFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: StringFilterComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: TetaConfigService }], target: i0.ɵɵFactoryTarget.Component });
3744
+ destroyContentRef() {
3745
+ this._open = false;
3746
+ this._service.destroy(this._componentRef, this._content, this.appendToBody ? this._document.body : this._elementRef.nativeElement);
3747
+ this._componentRef = null;
3748
+ }
3749
+ }
3750
+ DynamicContentBaseDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: DynamicContentBaseDirective, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
3751
+ DynamicContentBaseDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.2", type: DynamicContentBaseDirective, inputs: { data: "data", className: "className", align: "align", verticalAlign: "verticalAlign", appendToBody: "appendToBody", open: "open" }, outputs: { openChange: "openChange" }, ngImport: i0 });
3752
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: DynamicContentBaseDirective, decorators: [{
3753
+ type: Directive
3754
+ }], ctorParameters: function () { return [{ type: undefined }, { type: i0.ElementRef }, { type: DynamicComponentService }, { type: i0.Injector }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { data: [{
3755
+ type: Input
3756
+ }], className: [{
3757
+ type: Input
3758
+ }], align: [{
3759
+ type: Input
3760
+ }], verticalAlign: [{
3761
+ type: Input
3762
+ }], appendToBody: [{
3763
+ type: Input
3764
+ }], open: [{
3765
+ type: Input
3766
+ }], openChange: [{
3767
+ type: Output
3768
+ }] } });
3769
+
3770
+ class HintDirective extends DynamicContentBaseDirective {
3771
+ constructor(_document, _elementRef, _service, _injector, _zone, _cdr) {
3772
+ super(_document, _elementRef, _service, _injector, _zone, _cdr);
3773
+ this._document = _document;
3774
+ this._elementRef = _elementRef;
3775
+ this._service = _service;
3776
+ this._injector = _injector;
3777
+ this._zone = _zone;
3778
+ this._cdr = _cdr;
3779
+ this.align = Align.center;
3780
+ this.verticalAlign = VerticalAlign.top;
3781
+ this.delay = 300;
3782
+ this.overflownOnly = false;
3783
+ }
3784
+ get _dynamicContent() {
3785
+ return this.tetaHint;
3786
+ }
3787
+ mouseenter() {
3788
+ clearTimeout(this._timeout);
3789
+ this._timeout = setTimeout(() => {
3790
+ this.createHint();
3791
+ }, this.delay);
3792
+ }
3793
+ mouseleave() {
3794
+ clearTimeout(this._timeout);
3795
+ if (this._open && this._componentRef) {
3796
+ this._timeout = setTimeout(() => {
3797
+ this.destroyContentRef();
3798
+ }, this.delay);
3799
+ }
3800
+ }
3801
+ click(event) {
3802
+ if (this._open &&
3803
+ this._componentRef &&
3804
+ DomUtil.clickedInside(this._componentRef.location.nativeElement, event)) {
3805
+ event.stopPropagation();
3806
+ }
3807
+ }
3808
+ setPosition() {
3809
+ if (this._componentRef && this._open) {
3810
+ if (!this._componentRect) {
3811
+ this._componentRect =
3812
+ this._componentRef.location.nativeElement.getBoundingClientRect();
3813
+ }
3814
+ const position = PositionUtil.getPosition(this._elementRef.nativeElement.getBoundingClientRect(), this._componentRect, this.align, this.verticalAlign, 0, 4);
3815
+ PositionUtil.setElementPosition(this._componentRef.location.nativeElement, position);
3816
+ }
3817
+ }
3818
+ createHint() {
3819
+ if (!this._dynamicContent || (this.overflownOnly && !DomUtil.isOverflown(this._elementRef.nativeElement))) {
3820
+ return;
3821
+ }
3822
+ this._componentRef = this.createContentRef();
3823
+ this._componentRef.instance.className = [
3824
+ ...ArrayUtil.asArray(this.className),
3825
+ 'hint',
3826
+ ];
3827
+ }
3828
+ ngOnDestroy() {
3829
+ super.ngOnDestroy();
3830
+ }
3831
+ }
3832
+ HintDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: HintDirective, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: DynamicComponentService }, { token: i0.Injector }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
3833
+ HintDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.2", type: HintDirective, selector: "[tetaHint]", inputs: { tetaHint: "tetaHint", align: "align", verticalAlign: "verticalAlign", delay: "delay", overflownOnly: "overflownOnly" }, host: { listeners: { "mouseenter": "mouseenter($event)", "mouseleave": "mouseleave($event)", "click": "click($event)" } }, usesInheritance: true, ngImport: i0 });
3834
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: HintDirective, decorators: [{
3835
+ type: Directive,
3836
+ args: [{
3837
+ selector: '[tetaHint]',
3838
+ }]
3839
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
3840
+ type: Inject,
3841
+ args: [DOCUMENT]
3842
+ }] }, { type: i0.ElementRef }, { type: DynamicComponentService }, { type: i0.Injector }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { tetaHint: [{
3843
+ type: Input
3844
+ }], align: [{
3845
+ type: Input
3846
+ }], verticalAlign: [{
3847
+ type: Input
3848
+ }], delay: [{
3849
+ type: Input
3850
+ }], overflownOnly: [{
3851
+ type: Input
3852
+ }], mouseenter: [{
3853
+ type: HostListener,
3854
+ args: ['mouseenter', ['$event']]
3855
+ }], mouseleave: [{
3856
+ type: HostListener,
3857
+ args: ['mouseleave', ['$event']]
3858
+ }], click: [{
3859
+ type: HostListener,
3860
+ args: ['click', ['$event']]
3861
+ }] } });
3862
+
3863
+ class InputComponent {
3864
+ constructor() {
3865
+ this.required = false;
3866
+ }
3867
+ get column() {
3868
+ return !this.horizontal;
3869
+ }
3870
+ ngOnInit() { }
3871
+ }
3872
+ InputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: InputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3873
+ InputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: InputComponent, selector: "teta-input", inputs: { label: "label", horizontal: "horizontal", required: "required" }, host: { properties: { "class.row": "this.horizontal", "class.column": "this.column" } }, ngImport: i0, template: "<div class=\"font-caption color-text-90 align-center row nowrap overflow-hidden text-overflow-ellipsis\"\n [class.row_6]=\"horizontal\"\n [class.text-field_required]=\"required\"\n *ngIf=\"label?.length > 0\">\n <span class=\"overflow-hidden text-overflow-ellipsis\"\n [tetaHint]=\"label\"\n [overflownOnly]=\"true\">\n {{label}}\n </span>\n</div>\n<div class=\"input-container\" [class.row_6]=\"horizontal\">\n <ng-content></ng-content>\n <div class=\"input-message font-error-message\">\n <ng-content select=\"message\"></ng-content>\n </div>\n</div>\n", styles: [":host{display:flex;grid-gap:4px;flex-grow:1;flex-basis:10px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: HintDirective, selector: "[tetaHint]", inputs: ["tetaHint", "align", "verticalAlign", "delay", "overflownOnly"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3874
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: InputComponent, decorators: [{
3875
+ type: Component,
3876
+ args: [{ selector: 'teta-input', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"font-caption color-text-90 align-center row nowrap overflow-hidden text-overflow-ellipsis\"\n [class.row_6]=\"horizontal\"\n [class.text-field_required]=\"required\"\n *ngIf=\"label?.length > 0\">\n <span class=\"overflow-hidden text-overflow-ellipsis\"\n [tetaHint]=\"label\"\n [overflownOnly]=\"true\">\n {{label}}\n </span>\n</div>\n<div class=\"input-container\" [class.row_6]=\"horizontal\">\n <ng-content></ng-content>\n <div class=\"input-message font-error-message\">\n <ng-content select=\"message\"></ng-content>\n </div>\n</div>\n", styles: [":host{display:flex;grid-gap:4px;flex-grow:1;flex-basis:10px}\n"] }]
3877
+ }], ctorParameters: function () { return []; }, propDecorators: { label: [{
3878
+ type: Input
3879
+ }], horizontal: [{
3880
+ type: Input
3881
+ }, {
3882
+ type: HostBinding,
3883
+ args: ['class.row']
3884
+ }], required: [{
3885
+ type: Input
3886
+ }], column: [{
3887
+ type: HostBinding,
3888
+ args: ['class.column']
3889
+ }] } });
3890
+
3891
+ class NumericFilterComponent extends FilterComponentBase {
3892
+ constructor(changeDetector, _config) {
3893
+ super();
3894
+ this.changeDetector = changeDetector;
3895
+ this._config = _config;
3896
+ this.filterOptions = [];
3897
+ this.filterChanged = new EventEmitter();
3898
+ this.locale = this._config.locale;
3899
+ }
3900
+ set state(val) {
3901
+ this.state$ = val;
3902
+ this.filter = this.getFilter();
3903
+ this.changeDetector.detectChanges();
3904
+ }
3905
+ get state() {
3906
+ return this.state$;
3907
+ }
3908
+ ngOnInit() {
3909
+ this.filter = this.getFilter();
3910
+ }
3911
+ getFilter() {
3912
+ let filter = this.state.numericFilters?.find((f) => f.field === this.column.filterField);
3913
+ if (filter === null || filter === undefined) {
3914
+ filter = this.state.addNumericFilter(new NumericFilter({
3915
+ value: new NumericFilterValue(),
3916
+ field: this.column.filterField,
3917
+ name: this.column.name,
3918
+ strict: true,
3919
+ }));
3920
+ }
3921
+ return filter;
3922
+ }
3923
+ }
3924
+ NumericFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: NumericFilterComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: TetaConfigService }], target: i0.ɵɵFactoryTarget.Component });
3925
+ NumericFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: NumericFilterComponent, selector: "teta-numeric-filter", inputs: { column: "column", data: "data", filterOptions: "filterOptions", state: "state" }, outputs: { filterChanged: "filterChanged" }, usesInheritance: true, ngImport: i0, template: "<div class=\"form-row padding-3\" *ngIf=\"locale | async as loc\">\n <teta-input [label]=\"loc.from\">\n <input class=\"input\" type=\"text\"\n style=\"width: 110px\"\n [tetaOnlyNumber]=\"true\"\n [ngModel]=\"filter.value?.greaterThan\"\n (ngModelChange)=\"filter.value.greaterThan=$event\"/>\n </teta-input>\n <teta-input [label]=\"loc.to\">\n <input class=\"input\" type=\"text\"\n style=\"width: 110px\"\n [tetaOnlyNumber]=\"true\"\n [ngModel]=\"filter.value?.lessThan\"\n (ngModelChange)=\"filter.value.lessThan=$event\"/>\n </teta-input>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputComponent, selector: "teta-input", inputs: ["label", "horizontal", "required"] }, { kind: "directive", type: OnlyNumberDirective, selector: "[tetaOnlyNumber]", inputs: ["tetaOnlyNumber", "allowDecimals", "allowSign", "decimalSeparator", "commaSeparator"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3926
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: NumericFilterComponent, decorators: [{
3927
+ type: Component,
3928
+ args: [{ selector: 'teta-numeric-filter', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-row padding-3\" *ngIf=\"locale | async as loc\">\n <teta-input [label]=\"loc.from\">\n <input class=\"input\" type=\"text\"\n style=\"width: 110px\"\n [tetaOnlyNumber]=\"true\"\n [ngModel]=\"filter.value?.greaterThan\"\n (ngModelChange)=\"filter.value.greaterThan=$event\"/>\n </teta-input>\n <teta-input [label]=\"loc.to\">\n <input class=\"input\" type=\"text\"\n style=\"width: 110px\"\n [tetaOnlyNumber]=\"true\"\n [ngModel]=\"filter.value?.lessThan\"\n (ngModelChange)=\"filter.value.lessThan=$event\"/>\n </teta-input>\n</div>\n" }]
3929
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: TetaConfigService }]; }, propDecorators: { column: [{
3930
+ type: Input
3931
+ }], data: [{
3932
+ type: Input
3933
+ }], filterOptions: [{
3934
+ type: Input
3935
+ }], filterChanged: [{
3936
+ type: Output
3937
+ }], state: [{
3938
+ type: Input
3939
+ }] } });
3940
+
3941
+ var StringFilterType;
3942
+ (function (StringFilterType) {
3943
+ /**
3944
+ * Строгое совпадение
3945
+ */
3946
+ StringFilterType[StringFilterType["Equals"] = 1] = "Equals";
3947
+ /**
3948
+ * Начинается с указанной подстроки
3949
+ */
3950
+ StringFilterType[StringFilterType["StartsWith"] = 2] = "StartsWith";
3951
+ /**
3952
+ * Оканчивается указанной подстрокой
3953
+ */
3954
+ StringFilterType[StringFilterType["EndsWith"] = 3] = "EndsWith";
3955
+ /**
3956
+ * Содержит указанную подстроку
3957
+ */
3958
+ StringFilterType[StringFilterType["Contains"] = 4] = "Contains";
3959
+ })(StringFilterType || (StringFilterType = {}));
3960
+
3961
+ class StringFilter extends FilterBase {
3962
+ constructor(options) {
3963
+ super(options);
3964
+ if (options) {
3965
+ this.value = options.value || this.value;
3966
+ this.type = options.type || StringFilterType.Contains;
3967
+ }
3968
+ }
3969
+ }
3970
+
3971
+ class StringFilterComponent extends FilterComponentBase {
3972
+ constructor(changeDetector, _config) {
3973
+ super();
3974
+ this.changeDetector = changeDetector;
3975
+ this._config = _config;
3976
+ this.filterOptions = [];
3977
+ this.filterChanged = new EventEmitter();
3978
+ this.locale = this._config.locale;
3979
+ }
3980
+ set state(val) {
3981
+ this.state$ = val;
3982
+ this.filter = this.getFilter();
3983
+ this.changeDetector.detectChanges();
3984
+ }
3985
+ get state() {
3986
+ return this.state$;
3987
+ }
3988
+ ngOnInit() {
3989
+ }
3990
+ setFilter() {
3991
+ this.filterChanged.emit(this.filter);
3992
+ }
3993
+ getFilter() {
3994
+ let filter = this.state.stringFilters.find((f) => f.field === this.column.filterField);
3995
+ if (!filter) {
3996
+ filter = this.state.addStringFilter(new StringFilter({
3997
+ value: '',
3998
+ field: this.column.filterField,
3999
+ type: this.column.stringFilterType,
4000
+ name: this.column.name,
4001
+ }));
4002
+ }
4003
+ filter.type = this.column.stringFilterType;
4004
+ return filter;
4005
+ }
4006
+ }
4007
+ StringFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: StringFilterComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: TetaConfigService }], target: i0.ɵɵFactoryTarget.Component });
3732
4008
  StringFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: StringFilterComponent, selector: "teta-string-filter", inputs: { column: "column", data: "data", filterOptions: "filterOptions", state: "state" }, outputs: { filterChanged: "filterChanged" }, usesInheritance: true, ngImport: i0, template: "<div class=\"padding-3\">\n <teta-input [label]=\"(locale | async)?.search\">\n <input type=\"text\" class=\"input\" [(ngModel)]=\"filter.value\" (blur)=\"setFilter()\" (keydown.enter)=\"setFilter()\" />\n </teta-input>\n</div>\n\n", styles: [""], dependencies: [{ kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputComponent, selector: "teta-input", inputs: ["label", "horizontal", "required"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3733
4009
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: StringFilterComponent, decorators: [{
3734
4010
  type: Component,
@@ -4805,17 +5081,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImpor
4805
5081
  args: ['class.form-group-title']
4806
5082
  }] } });
4807
5083
 
5084
+ class HintModule {
5085
+ }
5086
+ HintModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: HintModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
5087
+ HintModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.2", ngImport: i0, type: HintModule, declarations: [HintDirective], imports: [CommonModule,
5088
+ DynamicComponentModule], exports: [HintDirective] });
5089
+ HintModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: HintModule, imports: [CommonModule,
5090
+ DynamicComponentModule] });
5091
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: HintModule, decorators: [{
5092
+ type: NgModule,
5093
+ args: [{
5094
+ declarations: [HintDirective],
5095
+ exports: [HintDirective],
5096
+ imports: [
5097
+ CommonModule,
5098
+ DynamicComponentModule
5099
+ ]
5100
+ }]
5101
+ }] });
5102
+
4808
5103
  class InputModule {
4809
5104
  }
4810
5105
  InputModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: InputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
4811
- InputModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.2", ngImport: i0, type: InputModule, declarations: [InputComponent, TextFieldComponent, FormGroupTitleComponent], imports: [CommonModule, IconModule, FormsModule, OnlyNumberModule], exports: [InputComponent, TextFieldComponent, FormGroupTitleComponent] });
4812
- InputModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: InputModule, imports: [CommonModule, IconModule, FormsModule, OnlyNumberModule] });
5106
+ InputModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.2", ngImport: i0, type: InputModule, declarations: [InputComponent, TextFieldComponent, FormGroupTitleComponent], imports: [CommonModule, IconModule, FormsModule, OnlyNumberModule, HintModule], exports: [InputComponent, TextFieldComponent, FormGroupTitleComponent] });
5107
+ InputModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: InputModule, imports: [CommonModule, IconModule, FormsModule, OnlyNumberModule, HintModule] });
4813
5108
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: InputModule, decorators: [{
4814
5109
  type: NgModule,
4815
5110
  args: [{
4816
5111
  declarations: [InputComponent, TextFieldComponent, FormGroupTitleComponent],
4817
5112
  exports: [InputComponent, TextFieldComponent, FormGroupTitleComponent],
4818
- imports: [CommonModule, IconModule, FormsModule, OnlyNumberModule],
5113
+ imports: [CommonModule, IconModule, FormsModule, OnlyNumberModule, HintModule],
4819
5114
  }]
4820
5115
  }] });
4821
5116
 
@@ -5423,16 +5718,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImpor
5423
5718
  class CurrentModal {
5424
5719
  }
5425
5720
 
5426
- class DynamicData {
5427
- constructor(value) {
5428
- for (const key in value) {
5429
- if (value.hasOwnProperty(key)) {
5430
- this[key] = value[key];
5431
- }
5432
- }
5433
- }
5434
- }
5435
-
5436
5721
  class DialogComponent {
5437
5722
  constructor(modal, data) {
5438
5723
  this.modal = modal;
@@ -5493,150 +5778,53 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImpor
5493
5778
  exports: [ModalContainerComponent, DialogComponent],
5494
5779
  imports: [
5495
5780
  CommonModule,
5496
- ToolbarModule,
5497
- ButtonModule,
5498
- TranslocoModule,
5499
- IconModule,
5500
- ],
5501
- providers: [
5502
- {
5503
- provide: TRANSLOCO_SCOPE,
5504
- useValue: { scope: 'common', alias: 'common' },
5505
- multi: true,
5506
- },
5507
- ],
5508
- }]
5509
- }] });
5510
-
5511
- class ModalInstance {
5512
- constructor(_window, _content) {
5513
- this._window = _window;
5514
- this._content = _content;
5515
- this._onClose = new Subject();
5516
- this.close = (event) => {
5517
- this._onClose.next(event);
5518
- this._onClose.complete();
5519
- this.destroy();
5520
- };
5521
- this.onClose = this._onClose.asObservable();
5522
- if (this._window && this._window.instance) {
5523
- this._window.instance.closeEvent.subscribe((event) => {
5524
- this.close(event);
5525
- });
5526
- }
5527
- }
5528
- get window() {
5529
- return this._window;
5530
- }
5531
- get component() {
5532
- return this._content.componentRef ? this._content.componentRef : null;
5533
- }
5534
- destroy() {
5535
- this._window.destroy();
5536
- if (this._content && this._content.viewRef) {
5537
- setTimeout(() => {
5538
- this._content.viewRef.destroy();
5539
- }, 150);
5540
- }
5541
- }
5542
- }
5543
-
5544
- class TetaContentRef {
5545
- constructor(nodes, viewRef, componentRef) {
5546
- this.nodes = nodes;
5547
- this.viewRef = viewRef;
5548
- this.componentRef = componentRef;
5549
- }
5550
- }
5551
-
5552
- class DynamicComponentService {
5553
- constructor(_componentFactoryResolver, _rendererFactory, _appRef) {
5554
- this._componentFactoryResolver = _componentFactoryResolver;
5555
- this._rendererFactory = _rendererFactory;
5556
- this._appRef = _appRef;
5557
- this._renderer = this._rendererFactory.createRenderer(null, null);
5558
- }
5559
- createComponent(component, contentRef, injector, container) {
5560
- const componentRef = this._componentFactoryResolver
5561
- .resolveComponentFactory(component)
5562
- .create(injector, contentRef.nodes);
5563
- this._appRef.attachView(componentRef.hostView);
5564
- container.appendChild(componentRef.location.nativeElement);
5565
- return componentRef;
5566
- }
5567
- createContent(content, injector, context) {
5568
- if (content === null || content === undefined) {
5569
- throw new Error('Content is undefined');
5570
- }
5571
- if (typeof content === 'string') {
5572
- return this.fromString(content);
5573
- }
5574
- else if (content instanceof TemplateRef) {
5575
- return this.fromTemplate(content, context);
5576
- }
5577
- else {
5578
- return this.fromComponent(content, injector, context);
5579
- }
5580
- }
5581
- destroy(component, content, container) {
5582
- if (component) {
5583
- this._appRef.detachView(component.hostView);
5584
- component.destroy();
5585
- }
5586
- if (content && content.viewRef) {
5587
- content.viewRef.destroy();
5588
- }
5589
- content = null;
5590
- }
5591
- getContext(content, context) {
5592
- if (content instanceof TemplateRef) {
5593
- return {
5594
- $implicit: context,
5595
- data: context,
5596
- };
5781
+ ToolbarModule,
5782
+ ButtonModule,
5783
+ TranslocoModule,
5784
+ IconModule,
5785
+ ],
5786
+ providers: [
5787
+ {
5788
+ provide: TRANSLOCO_SCOPE,
5789
+ useValue: { scope: 'common', alias: 'common' },
5790
+ multi: true,
5791
+ },
5792
+ ],
5793
+ }]
5794
+ }] });
5795
+
5796
+ class ModalInstance {
5797
+ constructor(_window, _content) {
5798
+ this._window = _window;
5799
+ this._content = _content;
5800
+ this._onClose = new Subject();
5801
+ this.close = (event) => {
5802
+ this._onClose.next(event);
5803
+ this._onClose.complete();
5804
+ this.destroy();
5805
+ };
5806
+ this.onClose = this._onClose.asObservable();
5807
+ if (this._window && this._window.instance) {
5808
+ this._window.instance.closeEvent.subscribe((event) => {
5809
+ this.close(event);
5810
+ });
5597
5811
  }
5598
- return context;
5599
- }
5600
- getInjector(data, parent) {
5601
- return Injector.create({
5602
- providers: [
5603
- {
5604
- provide: DynamicData,
5605
- useValue: data,
5606
- },
5607
- ],
5608
- parent,
5609
- });
5610
5812
  }
5611
- fromString(content) {
5612
- return new TetaContentRef([[this._renderer.createText(`${content}`)]]);
5813
+ get window() {
5814
+ return this._window;
5613
5815
  }
5614
- fromTemplate(content, context) {
5615
- const viewRef = content.createEmbeddedView(context);
5616
- this._appRef.attachView(viewRef);
5617
- return new TetaContentRef([viewRef.rootNodes], viewRef);
5816
+ get component() {
5817
+ return this._content.componentRef ? this._content.componentRef : null;
5618
5818
  }
5619
- fromComponent(content, injector, context) {
5620
- const componentFactory = this._componentFactoryResolver.resolveComponentFactory(content);
5621
- const componentRef = componentFactory.create(injector);
5622
- for (const key in context) {
5623
- if (context.hasOwnProperty(key)) {
5624
- componentRef.instance[key] = context[key];
5625
- }
5819
+ destroy() {
5820
+ this._window.destroy();
5821
+ if (this._content && this._content.viewRef) {
5822
+ setTimeout(() => {
5823
+ this._content.viewRef.destroy();
5824
+ }, 150);
5626
5825
  }
5627
- const componentNativeEl = componentRef.location.nativeElement;
5628
- this._appRef.attachView(componentRef.hostView);
5629
- return new TetaContentRef([[componentNativeEl]], componentRef.hostView, componentRef);
5630
5826
  }
5631
5827
  }
5632
- DynamicComponentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: DynamicComponentService, deps: [{ token: i0.ComponentFactoryResolver }, { token: i0.RendererFactory2 }, { token: i0.ApplicationRef }], target: i0.ɵɵFactoryTarget.Injectable });
5633
- DynamicComponentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: DynamicComponentService, providedIn: 'root' });
5634
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: DynamicComponentService, decorators: [{
5635
- type: Injectable,
5636
- args: [{
5637
- providedIn: 'root',
5638
- }]
5639
- }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i0.RendererFactory2 }, { type: i0.ApplicationRef }]; } });
5640
5828
 
5641
5829
  class ModalService {
5642
5830
  constructor(_document, _injector, _factory) {
@@ -6215,169 +6403,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImpor
6215
6403
  args: ['click']
6216
6404
  }] } });
6217
6405
 
6218
- class DynamicContentBaseDirective {
6219
- constructor(_document, _elementRef, _service, _injector, _zone, _cdr) {
6220
- this._document = _document;
6221
- this._elementRef = _elementRef;
6222
- this._service = _service;
6223
- this._injector = _injector;
6224
- this._zone = _zone;
6225
- this._cdr = _cdr;
6226
- this.align = Align.left;
6227
- this.verticalAlign = VerticalAlign.bottom;
6228
- this.openChange = new EventEmitter();
6229
- this._alive = true;
6230
- this._open = false;
6231
- this._zone.onStable
6232
- .pipe(takeWhile((_) => this._alive), filter((_) => this._open))
6233
- .subscribe((_) => {
6234
- this.setPosition();
6235
- });
6236
- }
6237
- set open(open) {
6238
- this._open = open;
6239
- if (this._open) {
6240
- this.createContentRef();
6241
- }
6242
- else {
6243
- this.destroyContentRef();
6244
- }
6245
- }
6246
- ngOnDestroy() {
6247
- this._alive = false;
6248
- this.destroyContentRef();
6249
- }
6250
- ngOnInit() {
6251
- }
6252
- createContentRef(className) {
6253
- if (!this._componentRef) {
6254
- this._open = true;
6255
- const injector = this._service.getInjector(this.data, this._injector);
6256
- const context = this._service.getContext(this._dynamicContent, this.data);
6257
- this._content = this._service.createContent(this._dynamicContent, this._injector, context);
6258
- this._componentRef = this._service.createComponent(PopupContentComponent, this._content, injector, this.appendToBody ? this._document.body : this._elementRef.nativeElement);
6259
- if (className) {
6260
- this._componentRef.instance.addClass(className);
6261
- }
6262
- }
6263
- return this._componentRef;
6264
- }
6265
- destroyContentRef() {
6266
- this._open = false;
6267
- this._service.destroy(this._componentRef, this._content, this.appendToBody ? this._document.body : this._elementRef.nativeElement);
6268
- this._componentRef = null;
6269
- }
6270
- }
6271
- DynamicContentBaseDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: DynamicContentBaseDirective, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
6272
- DynamicContentBaseDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.2", type: DynamicContentBaseDirective, inputs: { data: "data", className: "className", align: "align", verticalAlign: "verticalAlign", appendToBody: "appendToBody", open: "open" }, outputs: { openChange: "openChange" }, ngImport: i0 });
6273
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: DynamicContentBaseDirective, decorators: [{
6274
- type: Directive
6275
- }], ctorParameters: function () { return [{ type: undefined }, { type: i0.ElementRef }, { type: DynamicComponentService }, { type: i0.Injector }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { data: [{
6276
- type: Input
6277
- }], className: [{
6278
- type: Input
6279
- }], align: [{
6280
- type: Input
6281
- }], verticalAlign: [{
6282
- type: Input
6283
- }], appendToBody: [{
6284
- type: Input
6285
- }], open: [{
6286
- type: Input
6287
- }], openChange: [{
6288
- type: Output
6289
- }] } });
6290
-
6291
- class HintDirective extends DynamicContentBaseDirective {
6292
- constructor(_document, _elementRef, _service, _injector, _zone, _cdr) {
6293
- super(_document, _elementRef, _service, _injector, _zone, _cdr);
6294
- this._document = _document;
6295
- this._elementRef = _elementRef;
6296
- this._service = _service;
6297
- this._injector = _injector;
6298
- this._zone = _zone;
6299
- this._cdr = _cdr;
6300
- this.align = Align.center;
6301
- this.verticalAlign = VerticalAlign.top;
6302
- this.delay = 300;
6303
- }
6304
- get _dynamicContent() {
6305
- return this.tetaHint;
6306
- }
6307
- mouseenter() {
6308
- clearTimeout(this._timeout);
6309
- this._timeout = setTimeout(() => {
6310
- this.createHint();
6311
- }, this.delay);
6312
- }
6313
- mouseleave() {
6314
- clearTimeout(this._timeout);
6315
- if (this._open && this._componentRef) {
6316
- this._timeout = setTimeout(() => {
6317
- this.destroyContentRef();
6318
- }, this.delay);
6319
- }
6320
- }
6321
- click(event) {
6322
- if (this._open &&
6323
- this._componentRef &&
6324
- DomUtil.clickedInside(this._componentRef.location.nativeElement, event)) {
6325
- event.stopPropagation();
6326
- }
6327
- }
6328
- setPosition() {
6329
- if (this._componentRef && this._open) {
6330
- if (!this._componentRect) {
6331
- this._componentRect =
6332
- this._componentRef.location.nativeElement.getBoundingClientRect();
6333
- }
6334
- const position = PositionUtil.getPosition(this._elementRef.nativeElement.getBoundingClientRect(), this._componentRect, this.align, this.verticalAlign, 0, 4);
6335
- PositionUtil.setElementPosition(this._componentRef.location.nativeElement, position);
6336
- }
6337
- }
6338
- createHint() {
6339
- if (!this._dynamicContent) {
6340
- return;
6341
- }
6342
- this._componentRef = this.createContentRef();
6343
- this._componentRef.instance.className = [
6344
- ...ArrayUtil.asArray(this.className),
6345
- 'hint',
6346
- ];
6347
- }
6348
- ngOnDestroy() {
6349
- super.ngOnDestroy();
6350
- }
6351
- }
6352
- HintDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: HintDirective, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: DynamicComponentService }, { token: i0.Injector }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
6353
- HintDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.2", type: HintDirective, selector: "[tetaHint]", inputs: { tetaHint: "tetaHint", align: "align", verticalAlign: "verticalAlign", delay: "delay" }, host: { listeners: { "mouseenter": "mouseenter($event)", "mouseleave": "mouseleave($event)", "click": "click($event)" } }, usesInheritance: true, ngImport: i0 });
6354
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: HintDirective, decorators: [{
6355
- type: Directive,
6356
- args: [{
6357
- selector: '[tetaHint]',
6358
- }]
6359
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
6360
- type: Inject,
6361
- args: [DOCUMENT]
6362
- }] }, { type: i0.ElementRef }, { type: DynamicComponentService }, { type: i0.Injector }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { tetaHint: [{
6363
- type: Input
6364
- }], align: [{
6365
- type: Input
6366
- }], verticalAlign: [{
6367
- type: Input
6368
- }], delay: [{
6369
- type: Input
6370
- }], mouseenter: [{
6371
- type: HostListener,
6372
- args: ['mouseenter', ['$event']]
6373
- }], mouseleave: [{
6374
- type: HostListener,
6375
- args: ['mouseleave', ['$event']]
6376
- }], click: [{
6377
- type: HostListener,
6378
- args: ['click', ['$event']]
6379
- }] } });
6380
-
6381
6406
  class PropertyGridItemComponent {
6382
6407
  constructor(_transloco) {
6383
6408
  this._transloco = _transloco;
@@ -6448,7 +6473,7 @@ class PropertyGridItemComponent {
6448
6473
  }
6449
6474
  }
6450
6475
  PropertyGridItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PropertyGridItemComponent, deps: [{ token: i1$1.TranslocoService }], target: i0.ɵɵFactoryTarget.Component });
6451
- PropertyGridItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: PropertyGridItemComponent, selector: "teta-property-grid-item", inputs: { column: "column", hideNonEditable: "hideNonEditable", dict: "dict", formGroup: "formGroup", horizontal: "horizontal" }, outputs: { controlValueChange: "controlValueChange" }, ngImport: i0, template: "<teta-input [label]=\"caption\"\n [tetaHint]=\"column.hint\"\n [align]=\"align.left\"\n [formGroup]=\"formGroup\"\n [horizontal]=\"horizontal\"\n [required]=\"column.required\"\n *ngIf=\"column.editable || !hideNonEditable\">\n <ng-container [ngSwitch]=\"column.filterType\">\n <teta-select class=\"row_auto\"\n *ngSwitchCase=\"filterTypeEnum.list\"\n [searchRef]=\"getDict()?.length > 10 ? 'name' : ''\"\n [allowNull]=\"!column.required\"\n [appendToBody]=\"true\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"\n [options]=\"getDict()\"\n [valueRef]=\"'id'\"\n [textRef]=\"'name'\"\n [multiple]=\"false\"></teta-select>\n <teta-date-picker *ngSwitchCase=\"filterTypeEnum.date\"\n class=\"row_auto\"\n [appendToBody]=\"true\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"></teta-date-picker>\n <teta-toggle *ngSwitchCase=\"filterTypeEnum.boolean\"\n [formControlName]=\"column.name\">{{column.caption}}</teta-toggle>\n <teta-text-field class=\"row_auto\"\n *ngSwitchDefault\n (focusout)=\"valueChange()\"\n [onlyNumber]=\"column.filterType === filterTypeEnum.number\"\n [placeholder]=\"column.caption\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"></teta-text-field>\n </ng-container>\n <div *ngIf=\"controlIsInvalid(column.name)\"\n ngProjectAs=\"message\"\n class=\"color-red-50\">\n {{getError(column)}}\n </div>\n</teta-input>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: DatePickerComponent, selector: "teta-date-picker", inputs: ["disabled", "invalid", "firstDayOfWeek", "disabledDates", "disabledPeriods", "disabledDays", "minDate", "maxDate", "minYearDate", "maxYearDate", "align", "verticalAlign", "appendToBody", "allowNull", "backdrop", "showTime", "format"] }, { kind: "component", type: SelectComponent, selector: "teta-select", inputs: ["multiple", "options", "invalid", "align", "verticalAlign", "autoClose", "autoCloseIgnore", "disabled", "itemSize", "virtual", "icon", "placeholder", "appendToBody", "allowNull", "valueRef", "textRef", "searchRef"] }, { kind: "component", type: InputComponent, selector: "teta-input", inputs: ["label", "horizontal", "required"] }, { kind: "component", type: TextFieldComponent, selector: "teta-text-field", inputs: ["placeholder", "leftIconName", "disabled", "onlyNumber", "invalid"] }, { kind: "component", type: ToggleComponent, selector: "teta-toggle", inputs: ["palette", "noLabel", "disabled"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: HintDirective, selector: "[tetaHint]", inputs: ["tetaHint", "align", "verticalAlign", "delay"] }] });
6476
+ PropertyGridItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: PropertyGridItemComponent, selector: "teta-property-grid-item", inputs: { column: "column", hideNonEditable: "hideNonEditable", dict: "dict", formGroup: "formGroup", horizontal: "horizontal" }, outputs: { controlValueChange: "controlValueChange" }, ngImport: i0, template: "<teta-input [label]=\"caption\"\n [tetaHint]=\"column.hint\"\n [align]=\"align.left\"\n [formGroup]=\"formGroup\"\n [horizontal]=\"horizontal\"\n [required]=\"column.required\"\n *ngIf=\"column.editable || !hideNonEditable\">\n <ng-container [ngSwitch]=\"column.filterType\">\n <teta-select class=\"row_auto\"\n *ngSwitchCase=\"filterTypeEnum.list\"\n [searchRef]=\"getDict()?.length > 10 ? 'name' : ''\"\n [allowNull]=\"!column.required\"\n [appendToBody]=\"true\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"\n [options]=\"getDict()\"\n [valueRef]=\"'id'\"\n [textRef]=\"'name'\"\n [multiple]=\"false\"></teta-select>\n <teta-date-picker *ngSwitchCase=\"filterTypeEnum.date\"\n class=\"row_auto\"\n [appendToBody]=\"true\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"></teta-date-picker>\n <teta-toggle *ngSwitchCase=\"filterTypeEnum.boolean\"\n [formControlName]=\"column.name\">{{column.caption}}</teta-toggle>\n <teta-text-field class=\"row_auto\"\n *ngSwitchDefault\n (focusout)=\"valueChange()\"\n [onlyNumber]=\"column.filterType === filterTypeEnum.number\"\n [placeholder]=\"column.caption\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"></teta-text-field>\n </ng-container>\n <div *ngIf=\"controlIsInvalid(column.name)\"\n ngProjectAs=\"message\"\n class=\"color-red-50\">\n {{getError(column)}}\n </div>\n</teta-input>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: DatePickerComponent, selector: "teta-date-picker", inputs: ["disabled", "invalid", "firstDayOfWeek", "disabledDates", "disabledPeriods", "disabledDays", "minDate", "maxDate", "minYearDate", "maxYearDate", "align", "verticalAlign", "appendToBody", "allowNull", "backdrop", "showTime", "format"] }, { kind: "component", type: SelectComponent, selector: "teta-select", inputs: ["multiple", "options", "invalid", "align", "verticalAlign", "autoClose", "autoCloseIgnore", "disabled", "itemSize", "virtual", "icon", "placeholder", "appendToBody", "allowNull", "valueRef", "textRef", "searchRef"] }, { kind: "component", type: InputComponent, selector: "teta-input", inputs: ["label", "horizontal", "required"] }, { kind: "component", type: TextFieldComponent, selector: "teta-text-field", inputs: ["placeholder", "leftIconName", "disabled", "onlyNumber", "invalid"] }, { kind: "component", type: ToggleComponent, selector: "teta-toggle", inputs: ["palette", "noLabel", "disabled"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: HintDirective, selector: "[tetaHint]", inputs: ["tetaHint", "align", "verticalAlign", "delay", "overflownOnly"] }] });
6452
6477
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PropertyGridItemComponent, decorators: [{
6453
6478
  type: Component,
6454
6479
  args: [{ selector: 'teta-property-grid-item', template: "<teta-input [label]=\"caption\"\n [tetaHint]=\"column.hint\"\n [align]=\"align.left\"\n [formGroup]=\"formGroup\"\n [horizontal]=\"horizontal\"\n [required]=\"column.required\"\n *ngIf=\"column.editable || !hideNonEditable\">\n <ng-container [ngSwitch]=\"column.filterType\">\n <teta-select class=\"row_auto\"\n *ngSwitchCase=\"filterTypeEnum.list\"\n [searchRef]=\"getDict()?.length > 10 ? 'name' : ''\"\n [allowNull]=\"!column.required\"\n [appendToBody]=\"true\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"\n [options]=\"getDict()\"\n [valueRef]=\"'id'\"\n [textRef]=\"'name'\"\n [multiple]=\"false\"></teta-select>\n <teta-date-picker *ngSwitchCase=\"filterTypeEnum.date\"\n class=\"row_auto\"\n [appendToBody]=\"true\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"></teta-date-picker>\n <teta-toggle *ngSwitchCase=\"filterTypeEnum.boolean\"\n [formControlName]=\"column.name\">{{column.caption}}</teta-toggle>\n <teta-text-field class=\"row_auto\"\n *ngSwitchDefault\n (focusout)=\"valueChange()\"\n [onlyNumber]=\"column.filterType === filterTypeEnum.number\"\n [placeholder]=\"column.caption\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"></teta-text-field>\n </ng-container>\n <div *ngIf=\"controlIsInvalid(column.name)\"\n ngProjectAs=\"message\"\n class=\"color-red-50\">\n {{getError(column)}}\n </div>\n</teta-input>\n" }]
@@ -6645,25 +6670,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImpor
6645
6670
  }]
6646
6671
  }] });
6647
6672
 
6648
- class HintModule {
6649
- }
6650
- HintModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: HintModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
6651
- HintModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.2", ngImport: i0, type: HintModule, declarations: [HintDirective], imports: [CommonModule,
6652
- DynamicComponentModule], exports: [HintDirective] });
6653
- HintModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: HintModule, imports: [CommonModule,
6654
- DynamicComponentModule] });
6655
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: HintModule, decorators: [{
6656
- type: NgModule,
6657
- args: [{
6658
- declarations: [HintDirective],
6659
- exports: [HintDirective],
6660
- imports: [
6661
- CommonModule,
6662
- DynamicComponentModule
6663
- ]
6664
- }]
6665
- }] });
6666
-
6667
6673
  class PropertyGridModule {
6668
6674
  }
6669
6675
  PropertyGridModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PropertyGridModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
@@ -8147,7 +8153,7 @@ class DefaultHeadCellComponent extends HeadCellComponentBase {
8147
8153
  }
8148
8154
  }
8149
8155
  DefaultHeadCellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: DefaultHeadCellComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
8150
- DefaultHeadCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: DefaultHeadCellComponent, selector: "teta-default-head-cell", inputs: { column: "column", columns: "columns", data: "data" }, usesInheritance: true, ngImport: i0, template: "<div class=\"column column_auto\" [tetaHint]=\"column.hint || column.caption\">\n <div class=\"table-head__cell__text\">\n {{column.caption}}\n </div>\n <div *ngIf=\"column.unit\" class=\"table-head__cell__text font-caption color-text-70\">\n [{{column.unit}}]\n </div>\n</div>\n", styles: [":host{align-items:center;justify-content:center;display:flex;min-width:0;padding:6px 8px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: HintDirective, selector: "[tetaHint]", inputs: ["tetaHint", "align", "verticalAlign", "delay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8156
+ DefaultHeadCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: DefaultHeadCellComponent, selector: "teta-default-head-cell", inputs: { column: "column", columns: "columns", data: "data" }, usesInheritance: true, ngImport: i0, template: "<div class=\"column column_auto\" [tetaHint]=\"column.hint || column.caption\">\n <div class=\"table-head__cell__text\">\n {{column.caption}}\n </div>\n <div *ngIf=\"column.unit\" class=\"table-head__cell__text font-caption color-text-70\">\n [{{column.unit}}]\n </div>\n</div>\n", styles: [":host{align-items:center;justify-content:center;display:flex;min-width:0;padding:6px 8px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: HintDirective, selector: "[tetaHint]", inputs: ["tetaHint", "align", "verticalAlign", "delay", "overflownOnly"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8151
8157
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: DefaultHeadCellComponent, decorators: [{
8152
8158
  type: Component,
8153
8159
  args: [{ selector: 'teta-default-head-cell', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"column column_auto\" [tetaHint]=\"column.hint || column.caption\">\n <div class=\"table-head__cell__text\">\n {{column.caption}}\n </div>\n <div *ngIf=\"column.unit\" class=\"table-head__cell__text font-caption color-text-70\">\n [{{column.unit}}]\n </div>\n</div>\n", styles: [":host{align-items:center;justify-content:center;display:flex;min-width:0;padding:6px 8px}\n"] }]
@@ -8329,10 +8335,10 @@ class TabsComponent {
8329
8335
  }
8330
8336
  }
8331
8337
  TabsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: TabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8332
- TabsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: TabsComponent, selector: "teta-tabs", inputs: { activeId: "activeId", destroyOnHide: "destroyOnHide" }, outputs: { tabChange: "tabChange" }, host: { properties: { "class.tabs": "this.classTabs" } }, queries: [{ propertyName: "tabs", predicate: TabComponent }], ngImport: i0, template: "<div class=\"tabs-head\" role=\"tablist\">\n <div class=\"tabs-head-item\"\n *ngFor=\"let tab of tabs\"\n (click)=\"select(tab.id);\"\n [class.tabs-head-item_active]=\"tab.id === activeId\"\n [class.tabs-head-item_disabled]=\"tab.disabled\">\n <span [id]=\"tab.id\" class=\"tabs-title\"\n role=\"tab\"\n [attr.tabindex]=\"(tab.disabled ? '-1': undefined)\"\n [attr.aria-controls]=\"(!destroyOnHide || tab.id === activeId ? tab.id + '-panel' : null)\"\n [attr.aria-expanded]=\"tab.id === activeId\"\n [attr.aria-disabled]=\"tab.disabled\">\n {{tab.title}}\n <ng-template [ngTemplateOutlet]=\"tab.titleTpl?.template\"></ng-template>\n </span>\n </div>\n</div>\n<div class=\"tabs-content\">\n <ng-template ngFor let-tab [ngForOf]=\"tabs\">\n <ng-container *ngIf=\"!destroyOnHide || tab.id === activeId\">\n <ng-template [ngTemplateOutlet]=\"tab.contentTpl?.template\"></ng-template>\n </ng-container>\n </ng-template>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
8338
+ TabsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: TabsComponent, selector: "teta-tabs", inputs: { activeId: "activeId", destroyOnHide: "destroyOnHide" }, outputs: { tabChange: "tabChange" }, host: { properties: { "class.tabs": "this.classTabs" } }, queries: [{ propertyName: "tabs", predicate: TabComponent }], ngImport: i0, template: "<div class=\"tabs-head\" role=\"tablist\">\n <div class=\"tabs-head-item\"\n *ngFor=\"let tab of tabs\"\n (click)=\"select(tab.id);\"\n [class.tabs-head-item_active]=\"tab.id === activeId\"\n [class.tabs-head-item_disabled]=\"tab.disabled\">\n <span [id]=\"tab.id\" class=\"tabs-title\"\n role=\"tab\"\n [attr.tabindex]=\"(tab.disabled ? '-1': undefined)\"\n [attr.aria-controls]=\"(!destroyOnHide || tab.id === activeId ? tab.id + '-panel' : null)\"\n [attr.aria-expanded]=\"tab.id === activeId\"\n [attr.aria-disabled]=\"tab.disabled\">\n {{tab.title}}\n <ng-template [ngTemplateOutlet]=\"tab.titleTpl?.template\"></ng-template>\n </span>\n </div>\n <ng-content></ng-content>\n</div>\n<div class=\"tabs-content\">\n <ng-template ngFor let-tab [ngForOf]=\"tabs\">\n <ng-container *ngIf=\"!destroyOnHide || tab.id === activeId\">\n <ng-template [ngTemplateOutlet]=\"tab.contentTpl?.template\"></ng-template>\n </ng-container>\n </ng-template>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
8333
8339
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: TabsComponent, decorators: [{
8334
8340
  type: Component,
8335
- args: [{ selector: 'teta-tabs', template: "<div class=\"tabs-head\" role=\"tablist\">\n <div class=\"tabs-head-item\"\n *ngFor=\"let tab of tabs\"\n (click)=\"select(tab.id);\"\n [class.tabs-head-item_active]=\"tab.id === activeId\"\n [class.tabs-head-item_disabled]=\"tab.disabled\">\n <span [id]=\"tab.id\" class=\"tabs-title\"\n role=\"tab\"\n [attr.tabindex]=\"(tab.disabled ? '-1': undefined)\"\n [attr.aria-controls]=\"(!destroyOnHide || tab.id === activeId ? tab.id + '-panel' : null)\"\n [attr.aria-expanded]=\"tab.id === activeId\"\n [attr.aria-disabled]=\"tab.disabled\">\n {{tab.title}}\n <ng-template [ngTemplateOutlet]=\"tab.titleTpl?.template\"></ng-template>\n </span>\n </div>\n</div>\n<div class=\"tabs-content\">\n <ng-template ngFor let-tab [ngForOf]=\"tabs\">\n <ng-container *ngIf=\"!destroyOnHide || tab.id === activeId\">\n <ng-template [ngTemplateOutlet]=\"tab.contentTpl?.template\"></ng-template>\n </ng-container>\n </ng-template>\n</div>\n" }]
8341
+ args: [{ selector: 'teta-tabs', template: "<div class=\"tabs-head\" role=\"tablist\">\n <div class=\"tabs-head-item\"\n *ngFor=\"let tab of tabs\"\n (click)=\"select(tab.id);\"\n [class.tabs-head-item_active]=\"tab.id === activeId\"\n [class.tabs-head-item_disabled]=\"tab.disabled\">\n <span [id]=\"tab.id\" class=\"tabs-title\"\n role=\"tab\"\n [attr.tabindex]=\"(tab.disabled ? '-1': undefined)\"\n [attr.aria-controls]=\"(!destroyOnHide || tab.id === activeId ? tab.id + '-panel' : null)\"\n [attr.aria-expanded]=\"tab.id === activeId\"\n [attr.aria-disabled]=\"tab.disabled\">\n {{tab.title}}\n <ng-template [ngTemplateOutlet]=\"tab.titleTpl?.template\"></ng-template>\n </span>\n </div>\n <ng-content></ng-content>\n</div>\n<div class=\"tabs-content\">\n <ng-template ngFor let-tab [ngForOf]=\"tabs\">\n <ng-container *ngIf=\"!destroyOnHide || tab.id === activeId\">\n <ng-template [ngTemplateOutlet]=\"tab.contentTpl?.template\"></ng-template>\n </ng-container>\n </ng-template>\n</div>\n" }]
8336
8342
  }], ctorParameters: function () { return []; }, propDecorators: { classTabs: [{
8337
8343
  type: HostBinding,
8338
8344
  args: ['class.tabs']
@@ -9465,10 +9471,10 @@ class StringCellComponent extends CellComponentBase {
9465
9471
  }
9466
9472
  }
9467
9473
  StringCellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: StringCellComponent, deps: [{ token: TableService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
9468
- StringCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: StringCellComponent, selector: "teta-string-cell", inputs: { column: "column", row: "row" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<span [style.display]=\"edit ? 'none' : 'block'\"\n class=\"cell-text\"\n [class.cell-text_disabled]=\"!editable\">\n {{row[column.name]}}\n</span>\n<input #input\n *ngIf=\"edit\"\n type=\"text\"\n class=\"input row_auto border-radius-0\"\n (blur)=\"setValue()\"\n [ngModel]=\"row[column.name]\"\n (ngModelChange)=\"row[column.name]=$event\"/>\n\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9474
+ StringCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: StringCellComponent, selector: "teta-string-cell", inputs: { column: "column", row: "row" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<span [style.display]=\"edit ? 'none' : 'block'\"\n class=\"cell-text\"\n [tetaHint]=\"row[column.name]\"\n [appendToBody]=\"true\"\n [overflownOnly]=\"true\"\n [class.cell-text_disabled]=\"!editable\">\n {{row[column.name]}}\n</span>\n<input #input\n *ngIf=\"edit\"\n type=\"text\"\n class=\"input row_auto border-radius-0\"\n (blur)=\"setValue()\"\n [ngModel]=\"row[column.name]\"\n (ngModelChange)=\"row[column.name]=$event\"/>\n\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: HintDirective, selector: "[tetaHint]", inputs: ["tetaHint", "align", "verticalAlign", "delay", "overflownOnly"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9469
9475
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: StringCellComponent, decorators: [{
9470
9476
  type: Component,
9471
- args: [{ selector: 'teta-string-cell', changeDetection: ChangeDetectionStrategy.OnPush, template: "<span [style.display]=\"edit ? 'none' : 'block'\"\n class=\"cell-text\"\n [class.cell-text_disabled]=\"!editable\">\n {{row[column.name]}}\n</span>\n<input #input\n *ngIf=\"edit\"\n type=\"text\"\n class=\"input row_auto border-radius-0\"\n (blur)=\"setValue()\"\n [ngModel]=\"row[column.name]\"\n (ngModelChange)=\"row[column.name]=$event\"/>\n\n" }]
9477
+ args: [{ selector: 'teta-string-cell', changeDetection: ChangeDetectionStrategy.OnPush, template: "<span [style.display]=\"edit ? 'none' : 'block'\"\n class=\"cell-text\"\n [tetaHint]=\"row[column.name]\"\n [appendToBody]=\"true\"\n [overflownOnly]=\"true\"\n [class.cell-text_disabled]=\"!editable\">\n {{row[column.name]}}\n</span>\n<input #input\n *ngIf=\"edit\"\n type=\"text\"\n class=\"input row_auto border-radius-0\"\n (blur)=\"setValue()\"\n [ngModel]=\"row[column.name]\"\n (ngModelChange)=\"row[column.name]=$event\"/>\n\n" }]
9472
9478
  }], ctorParameters: function () { return [{ type: TableService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { column: [{
9473
9479
  type: Input
9474
9480
  }], row: [{