Commit caf91be3386afd110b82e7c562233af777ec0e01

Authored by Vladyslav
Committed by GitHub
1 parent 4ede9a3a

Change resize events to observer (#2652)

@@ -1561,6 +1561,11 @@ @@ -1561,6 +1561,11 @@
1561 } 1561 }
1562 } 1562 }
1563 }, 1563 },
  1564 + "@juggle/resize-observer": {
  1565 + "version": "3.1.3",
  1566 + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.1.3.tgz",
  1567 + "integrity": "sha512-y7qc6SzZBlSpx8hEDfV0S9Cx6goROX/vBhS2Ru1Q78Jp1FlCMbxp7UcAN90rLgB3X8DSMBgDFxcmoG/VfdAhFA=="
  1568 + },
1564 "@mat-datetimepicker/core": { 1569 "@mat-datetimepicker/core": {
1565 "version": "4.1.0", 1570 "version": "4.1.0",
1566 "resolved": "https://registry.npmjs.org/@mat-datetimepicker/core/-/core-4.1.0.tgz", 1571 "resolved": "https://registry.npmjs.org/@mat-datetimepicker/core/-/core-4.1.0.tgz",
@@ -28,6 +28,7 @@ @@ -28,6 +28,7 @@
28 "@date-io/date-fns": "^2.6.1", 28 "@date-io/date-fns": "^2.6.1",
29 "@flowjs/flow.js": "^2.14.0", 29 "@flowjs/flow.js": "^2.14.0",
30 "@flowjs/ngx-flow": "^0.4.3", 30 "@flowjs/ngx-flow": "^0.4.3",
  31 + "@juggle/resize-observer": "^3.1.3",
31 "@mat-datetimepicker/core": "^4.1.0", 32 "@mat-datetimepicker/core": "^4.1.0",
32 "@material-ui/core": "^4.9.11", 33 "@material-ui/core": "^4.9.11",
33 "@material-ui/icons": "^4.9.1", 34 "@material-ui/icons": "^4.9.1",
@@ -53,6 +53,7 @@ import { Widget, WidgetPosition } from '@app/shared/models/widget.models'; @@ -53,6 +53,7 @@ import { Widget, WidgetPosition } from '@app/shared/models/widget.models';
53 import { MatMenuTrigger } from '@angular/material/menu'; 53 import { MatMenuTrigger } from '@angular/material/menu';
54 import { SafeStyle } from '@angular/platform-browser'; 54 import { SafeStyle } from '@angular/platform-browser';
55 import { distinct } from 'rxjs/operators'; 55 import { distinct } from 'rxjs/operators';
  56 +import { ResizeObserver } from '@juggle/resize-observer';
56 57
57 @Component({ 58 @Component({
58 selector: 'tb-dashboard', 59 selector: 'tb-dashboard',
@@ -166,7 +167,7 @@ export class DashboardComponent extends PageComponent implements IDashboardCompo @@ -166,7 +167,7 @@ export class DashboardComponent extends PageComponent implements IDashboardCompo
166 167
167 private optionsChangeNotificationsPaused = false; 168 private optionsChangeNotificationsPaused = false;
168 169
169 - private gridsterResizeListener = null; 170 + private gridsterResize$: ResizeObserver;
170 171
171 constructor(protected store: Store<AppState>, 172 constructor(protected store: Store<AppState>,
172 private timeService: TimeService, 173 private timeService: TimeService,
@@ -225,9 +226,8 @@ export class DashboardComponent extends PageComponent implements IDashboardCompo @@ -225,9 +226,8 @@ export class DashboardComponent extends PageComponent implements IDashboardCompo
225 226
226 ngOnDestroy(): void { 227 ngOnDestroy(): void {
227 super.ngOnDestroy(); 228 super.ngOnDestroy();
228 - if (this.gridsterResizeListener) {  
229 - // @ts-ignore  
230 - removeResizeListener(this.gridster.el, this.gridsterResizeListener); 229 + if (this.gridsterResize$) {
  230 + this.gridsterResize$.disconnect();
231 } 231 }
232 if (this.breakpointObserverSubscription) { 232 if (this.breakpointObserverSubscription) {
233 this.breakpointObserverSubscription.unsubscribe(); 233 this.breakpointObserverSubscription.unsubscribe();
@@ -290,9 +290,10 @@ export class DashboardComponent extends PageComponent implements IDashboardCompo @@ -290,9 +290,10 @@ export class DashboardComponent extends PageComponent implements IDashboardCompo
290 } 290 }
291 291
292 ngAfterViewInit(): void { 292 ngAfterViewInit(): void {
293 - this.gridsterResizeListener = this.onGridsterParentResize.bind(this);  
294 - // @ts-ignore  
295 - addResizeListener(this.gridster.el, this.gridsterResizeListener); 293 + this.gridsterResize$ = new ResizeObserver(() => {
  294 + this.onGridsterParentResize()
  295 + });
  296 + this.gridsterResize$.observe(this.gridster.el);
296 } 297 }
297 298
298 onUpdateTimewindow(startTimeMs: number, endTimeMs: number, interval?: number, persist?: boolean): void { 299 onUpdateTimewindow(startTimeMs: number, endTimeMs: number, interval?: number, persist?: boolean): void {
@@ -35,6 +35,7 @@ import { CustomActionDescriptor } from '@shared/models/widget.models'; @@ -35,6 +35,7 @@ import { CustomActionDescriptor } from '@shared/models/widget.models';
35 import * as ace from 'ace-builds'; 35 import * as ace from 'ace-builds';
36 import { CancelAnimationFrame, RafService } from '@core/services/raf.service'; 36 import { CancelAnimationFrame, RafService } from '@core/services/raf.service';
37 import { css_beautify, html_beautify } from 'js-beautify'; 37 import { css_beautify, html_beautify } from 'js-beautify';
  38 +import { ResizeObserver } from '@juggle/resize-observer';
38 39
39 @Component({ 40 @Component({
40 selector: 'tb-custom-action-pretty-resources-tabs', 41 selector: 'tb-custom-action-pretty-resources-tabs',
@@ -64,7 +65,7 @@ export class CustomActionPrettyResourcesTabsComponent extends PageComponent impl @@ -64,7 +65,7 @@ export class CustomActionPrettyResourcesTabsComponent extends PageComponent impl
64 65
65 aceEditors: ace.Ace.Editor[] = []; 66 aceEditors: ace.Ace.Editor[] = [];
66 editorsResizeCafs: {[editorId: string]: CancelAnimationFrame} = {}; 67 editorsResizeCafs: {[editorId: string]: CancelAnimationFrame} = {};
67 - aceResizeListeners: { element: any, resizeListener: any }[] = []; 68 + aceResizeObservers: ResizeObserver[] = [];
68 htmlEditor: ace.Ace.Editor; 69 htmlEditor: ace.Ace.Editor;
69 cssEditor: ace.Ace.Editor; 70 cssEditor: ace.Ace.Editor;
70 setValuesPending = false; 71 setValuesPending = false;
@@ -84,9 +85,8 @@ export class CustomActionPrettyResourcesTabsComponent extends PageComponent impl @@ -84,9 +85,8 @@ export class CustomActionPrettyResourcesTabsComponent extends PageComponent impl
84 } 85 }
85 86
86 ngOnDestroy(): void { 87 ngOnDestroy(): void {
87 - this.aceResizeListeners.forEach((resizeListener) => {  
88 - // @ts-ignore  
89 - removeResizeListener(resizeListener.element, resizeListener.resizeListener); 88 + this.aceResizeObservers.forEach((resize$) => {
  89 + resize$.disconnect();
90 }); 90 });
91 } 91 }
92 92
@@ -188,11 +188,11 @@ export class CustomActionPrettyResourcesTabsComponent extends PageComponent impl @@ -188,11 +188,11 @@ export class CustomActionPrettyResourcesTabsComponent extends PageComponent impl
188 aceEditor.session.setUseWrapMode(true); 188 aceEditor.session.setUseWrapMode(true);
189 this.aceEditors.push(aceEditor); 189 this.aceEditors.push(aceEditor);
190 190
191 - const resizeListener = this.onAceEditorResize.bind(this, aceEditor);  
192 -  
193 - // @ts-ignore  
194 - addResizeListener(editorElement, resizeListener);  
195 - this.aceResizeListeners.push({element: editorElement, resizeListener}); 191 + const resize$ = new ResizeObserver(() => {
  192 + this.onAceEditorResize(aceEditor);
  193 + });
  194 + resize$.observe(editorElement);
  195 + this.aceResizeObservers.push(resize$);
196 return aceEditor; 196 return aceEditor;
197 } 197 }
198 198
@@ -58,6 +58,7 @@ import { AttributeData, AttributeScope } from '@shared/models/telemetry/telemetr @@ -58,6 +58,7 @@ import { AttributeData, AttributeScope } from '@shared/models/telemetry/telemetr
58 import { forkJoin, Observable } from 'rxjs'; 58 import { forkJoin, Observable } from 'rxjs';
59 import { tap } from 'rxjs/operators'; 59 import { tap } from 'rxjs/operators';
60 import { ImportExportService } from '@home/components/import-export/import-export.service'; 60 import { ImportExportService } from '@home/components/import-export/import-export.service';
  61 +import { ResizeObserver } from '@juggle/resize-observer';
61 62
62 // @dynamic 63 // @dynamic
63 @Component({ 64 @Component({
@@ -93,7 +94,7 @@ export class GatewayFormComponent extends PageComponent implements OnInit, OnDes @@ -93,7 +94,7 @@ export class GatewayFormComponent extends PageComponent implements OnInit, OnDes
93 private successfulSaved: string; 94 private successfulSaved: string;
94 private gatewayNameExists: string; 95 private gatewayNameExists: string;
95 private archiveFileName: string; 96 private archiveFileName: string;
96 - private formResizeListener: any; 97 + private formResize$: ResizeObserver;
97 private subscribeStorageType$: any; 98 private subscribeStorageType$: any;
98 private subscribeGateway$: any; 99 private subscribeGateway$: any;
99 100
@@ -116,15 +117,15 @@ export class GatewayFormComponent extends PageComponent implements OnInit, OnDes @@ -116,15 +117,15 @@ export class GatewayFormComponent extends PageComponent implements OnInit, OnDes
116 117
117 this.buildForm(); 118 this.buildForm();
118 this.ctx.updateWidgetParams(); 119 this.ctx.updateWidgetParams();
119 - this.formResizeListener = this.resize.bind(this);  
120 - // @ts-ignore  
121 - addResizeListener(this.formContainerRef.nativeElement, this.formResizeListener); 120 + this.formResize$ = new ResizeObserver(() => {
  121 + this.resize();
  122 + });
  123 + this.formResize$.observe(this.formContainerRef.nativeElement);
122 } 124 }
123 125
124 ngOnDestroy(): void { 126 ngOnDestroy(): void {
125 - if (this.formResizeListener) {  
126 - // @ts-ignore  
127 - removeResizeListener(this.formContainerRef.nativeElement, this.formResizeListener); 127 + if (this.formResize$) {
  128 + this.formResize$.disconnect();
128 } 129 }
129 this.subscribeGateway$.unsubscribe(); 130 this.subscribeGateway$.unsubscribe();
130 this.subscribeStorageType$.unsubscribe(); 131 this.subscribeStorageType$.unsubscribe();
@@ -33,6 +33,7 @@ import { AttributeService } from '@core/http/attribute.service'; @@ -33,6 +33,7 @@ import { AttributeService } from '@core/http/attribute.service';
33 import { AttributeData, AttributeScope, LatestTelemetry } from '@shared/models/telemetry/telemetry.models'; 33 import { AttributeData, AttributeScope, LatestTelemetry } from '@shared/models/telemetry/telemetry.models';
34 import { forkJoin, Observable } from 'rxjs'; 34 import { forkJoin, Observable } from 'rxjs';
35 import { EntityId } from '@shared/models/id/entity-id'; 35 import { EntityId } from '@shared/models/id/entity-id';
  36 +import { ResizeObserver } from '@juggle/resize-observer';
36 37
37 type FieldAlignment = 'row' | 'column'; 38 type FieldAlignment = 'row' | 'column';
38 39
@@ -94,7 +95,7 @@ export class MultipleInputWidgetComponent extends PageComponent implements OnIni @@ -94,7 +95,7 @@ export class MultipleInputWidgetComponent extends PageComponent implements OnIni
94 @Input() 95 @Input()
95 ctx: WidgetContext; 96 ctx: WidgetContext;
96 97
97 - private formResizeListener: any; 98 + private formResize$: ResizeObserver;
98 private settings: MultipleInputWidgetSettings; 99 private settings: MultipleInputWidgetSettings;
99 private widgetConfig: WidgetConfig; 100 private widgetConfig: WidgetConfig;
100 private subscription: IWidgetSubscription; 101 private subscription: IWidgetSubscription;
@@ -135,15 +136,15 @@ export class MultipleInputWidgetComponent extends PageComponent implements OnIni @@ -135,15 +136,15 @@ export class MultipleInputWidgetComponent extends PageComponent implements OnIni
135 this.updateDatasources(); 136 this.updateDatasources();
136 this.buildForm(); 137 this.buildForm();
137 this.ctx.updateWidgetParams(); 138 this.ctx.updateWidgetParams();
138 - this.formResizeListener = this.resize.bind(this);  
139 - // @ts-ignore  
140 - addResizeListener(this.formContainerRef.nativeElement, this.formResizeListener); 139 + this.formResize$ = new ResizeObserver(() => {
  140 + this.resize();
  141 + });
  142 + this.formResize$.observe(this.formContainerRef.nativeElement);
141 } 143 }
142 144
143 ngOnDestroy(): void { 145 ngOnDestroy(): void {
144 - if (this.formResizeListener) {  
145 - // @ts-ignore  
146 - removeResizeListener(this.formContainerRef.nativeElement, this.formResizeListener); 146 + if (this.formResize$) {
  147 + this.formResize$.disconnect();
147 } 148 }
148 } 149 }
149 150
@@ -22,9 +22,9 @@ import { Store } from '@ngrx/store'; @@ -22,9 +22,9 @@ import { Store } from '@ngrx/store';
22 import { AppState } from '@core/core.state'; 22 import { AppState } from '@core/core.state';
23 import { isDefined, isNumber } from '@core/utils'; 23 import { isDefined, isNumber } from '@core/utils';
24 import { CanvasDigitalGauge, CanvasDigitalGaugeOptions } from '@home/components/widget/lib/canvas-digital-gauge'; 24 import { CanvasDigitalGauge, CanvasDigitalGaugeOptions } from '@home/components/widget/lib/canvas-digital-gauge';
25 -import GenericOptions = CanvasGauges.GenericOptions;  
26 import * as tinycolor_ from 'tinycolor2'; 25 import * as tinycolor_ from 'tinycolor2';
27 -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; 26 +import GenericOptions = CanvasGauges.GenericOptions;
  27 +import { ResizeObserver } from '@juggle/resize-observer';
28 28
29 const tinycolor = tinycolor_; 29 const tinycolor = tinycolor_;
30 30
@@ -103,7 +103,7 @@ export class KnobComponent extends PageComponent implements OnInit, OnDestroy { @@ -103,7 +103,7 @@ export class KnobComponent extends PageComponent implements OnInit, OnDestroy {
103 103
104 private canvasBar: CanvasDigitalGauge; 104 private canvasBar: CanvasDigitalGauge;
105 105
106 - private knobResizeListener: any; 106 + private knobResize$: ResizeObserver;
107 107
108 constructor(private utils: UtilsService, 108 constructor(private utils: UtilsService,
109 protected store: Store<AppState>) { 109 protected store: Store<AppState>) {
@@ -126,16 +126,16 @@ export class KnobComponent extends PageComponent implements OnInit, OnDestroy { @@ -126,16 +126,16 @@ export class KnobComponent extends PageComponent implements OnInit, OnDestroy {
126 this.textMeasure = $(this.textMeasureRef.nativeElement); 126 this.textMeasure = $(this.textMeasureRef.nativeElement);
127 this.canvasBarElement = this.canvasBarElementRef.nativeElement; 127 this.canvasBarElement = this.canvasBarElementRef.nativeElement;
128 128
129 - this.knobResizeListener = this.resize.bind(this);  
130 - // @ts-ignore  
131 - addResizeListener(this.knobContainerRef.nativeElement, this.knobResizeListener); 129 + this.knobResize$ = new ResizeObserver(() => {
  130 + this.resize();
  131 + });
  132 + this.knobResize$.observe(this.knobContainerRef.nativeElement);
132 this.init(); 133 this.init();
133 } 134 }
134 135
135 ngOnDestroy(): void { 136 ngOnDestroy(): void {
136 - if (this.knobResizeListener) {  
137 - // @ts-ignore  
138 - removeResizeListener(this.knobContainerRef.nativeElement, this.knobResizeListener); 137 + if (this.knobResize$) {
  138 + this.knobResize$.disconnect();
139 } 139 }
140 } 140 }
141 141
@@ -25,6 +25,7 @@ import { UtilsService } from '@core/services/utils.service'; @@ -25,6 +25,7 @@ import { UtilsService } from '@core/services/utils.service';
25 import { IWidgetSubscription, SubscriptionInfo, WidgetSubscriptionOptions } from '@core/api/widget-api.models'; 25 import { IWidgetSubscription, SubscriptionInfo, WidgetSubscriptionOptions } from '@core/api/widget-api.models';
26 import { DatasourceType, widgetType } from '@shared/models/widget.models'; 26 import { DatasourceType, widgetType } from '@shared/models/widget.models';
27 import { EntityType } from '@shared/models/entity-type.models'; 27 import { EntityType } from '@shared/models/entity-type.models';
  28 +import { ResizeObserver } from '@juggle/resize-observer';
28 import Timeout = NodeJS.Timeout; 29 import Timeout = NodeJS.Timeout;
29 30
30 const tinycolor = tinycolor_; 31 const tinycolor = tinycolor_;
@@ -93,7 +94,7 @@ export class LedIndicatorComponent extends PageComponent implements OnInit, OnDe @@ -93,7 +94,7 @@ export class LedIndicatorComponent extends PageComponent implements OnInit, OnDe
93 private ledErrorContainer: JQuery<HTMLElement>; 94 private ledErrorContainer: JQuery<HTMLElement>;
94 private ledError: JQuery<HTMLElement>; 95 private ledError: JQuery<HTMLElement>;
95 96
96 - private ledResizeListener: any; 97 + private ledResize$: ResizeObserver;
97 98
98 private subscriptionOptions: WidgetSubscriptionOptions = { 99 private subscriptionOptions: WidgetSubscriptionOptions = {
99 callbacks: { 100 callbacks: {
@@ -122,9 +123,10 @@ export class LedIndicatorComponent extends PageComponent implements OnInit, OnDe @@ -122,9 +123,10 @@ export class LedIndicatorComponent extends PageComponent implements OnInit, OnDe
122 this.ledErrorContainer = $(this.ledErrorContainerRef.nativeElement); 123 this.ledErrorContainer = $(this.ledErrorContainerRef.nativeElement);
123 this.ledError = $(this.ledErrorRef.nativeElement); 124 this.ledError = $(this.ledErrorRef.nativeElement);
124 125
125 - this.ledResizeListener = this.resize.bind(this);  
126 - // @ts-ignore  
127 - addResizeListener(this.ledContainerRef.nativeElement, this.ledResizeListener); 126 + this.ledResize$ = new ResizeObserver(() => {
  127 + this.resize();
  128 + });
  129 + this.ledResize$.observe(this.ledContainerRef.nativeElement);
128 this.init(); 130 this.init();
129 } 131 }
130 132
@@ -136,9 +138,8 @@ export class LedIndicatorComponent extends PageComponent implements OnInit, OnDe @@ -136,9 +138,8 @@ export class LedIndicatorComponent extends PageComponent implements OnInit, OnDe
136 if (this.subscription) { 138 if (this.subscription) {
137 this.ctx.subscriptionApi.removeSubscription(this.subscription.id); 139 this.ctx.subscriptionApi.removeSubscription(this.subscription.id);
138 } 140 }
139 - if (this.ledResizeListener) {  
140 - // @ts-ignore  
141 - removeResizeListener(this.ledContainerRef.nativeElement, this.ledResizeListener); 141 + if (this.ledResize$) {
  142 + this.ledResize$.disconnect();
142 } 143 }
143 } 144 }
144 145
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 /// limitations under the License. 14 /// limitations under the License.
15 /// 15 ///
16 16
17 -import { AfterViewInit, Component, ElementRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; 17 +import { Component, ElementRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core';
18 import { PageComponent } from '@shared/components/page.component'; 18 import { PageComponent } from '@shared/components/page.component';
19 import { WidgetContext } from '@home/models/widget-component.models'; 19 import { WidgetContext } from '@home/models/widget-component.models';
20 import { UtilsService } from '@core/services/utils.service'; 20 import { UtilsService } from '@core/services/utils.service';
@@ -24,6 +24,7 @@ import { isDefined } from '@core/utils'; @@ -24,6 +24,7 @@ import { isDefined } from '@core/utils';
24 import { IWidgetSubscription, SubscriptionInfo, WidgetSubscriptionOptions } from '@core/api/widget-api.models'; 24 import { IWidgetSubscription, SubscriptionInfo, WidgetSubscriptionOptions } from '@core/api/widget-api.models';
25 import { DatasourceType, widgetType } from '@shared/models/widget.models'; 25 import { DatasourceType, widgetType } from '@shared/models/widget.models';
26 import { EntityType } from '@shared/models/entity-type.models'; 26 import { EntityType } from '@shared/models/entity-type.models';
  27 +import { ResizeObserver } from '@juggle/resize-observer';
27 28
28 type RetrieveValueMethod = 'rpc' | 'attribute' | 'timeseries'; 29 type RetrieveValueMethod = 'rpc' | 'attribute' | 'timeseries';
29 30
@@ -88,7 +89,7 @@ export class RoundSwitchComponent extends PageComponent implements OnInit, OnDes @@ -88,7 +89,7 @@ export class RoundSwitchComponent extends PageComponent implements OnInit, OnDes
88 private switchErrorContainer: JQuery<HTMLElement>; 89 private switchErrorContainer: JQuery<HTMLElement>;
89 private switchError: JQuery<HTMLElement>; 90 private switchError: JQuery<HTMLElement>;
90 91
91 - private switchResizeListener: any; 92 + private switchResize$: ResizeObserver;
92 93
93 constructor(private utils: UtilsService, 94 constructor(private utils: UtilsService,
94 protected store: Store<AppState>) { 95 protected store: Store<AppState>) {
@@ -110,20 +111,19 @@ export class RoundSwitchComponent extends PageComponent implements OnInit, OnDes @@ -110,20 +111,19 @@ export class RoundSwitchComponent extends PageComponent implements OnInit, OnDes
110 this.onValue(); 111 this.onValue();
111 }); 112 });
112 113
113 - this.switchResizeListener = this.resize.bind(this);  
114 - // @ts-ignore  
115 - addResizeListener(this.switchContainerRef.nativeElement, this.switchResizeListener); 114 + this.switchResize$ = new ResizeObserver(() => {
  115 + this.resize();
  116 + });
  117 + this.switchResize$.observe(this.switchContainerRef.nativeElement);
116 this.init(); 118 this.init();
117 - // this.ctx.resize = this.resize.bind(this);  
118 } 119 }
119 120
120 ngOnDestroy(): void { 121 ngOnDestroy(): void {
121 if (this.valueSubscription) { 122 if (this.valueSubscription) {
122 this.ctx.subscriptionApi.removeSubscription(this.valueSubscription.id); 123 this.ctx.subscriptionApi.removeSubscription(this.valueSubscription.id);
123 } 124 }
124 - if (this.switchResizeListener) {  
125 - // @ts-ignore  
126 - removeResizeListener(this.switchContainerRef.nativeElement, this.switchResizeListener); 125 + if (this.switchResize$) {
  126 + this.switchResize$.disconnect();
127 } 127 }
128 } 128 }
129 129
@@ -25,6 +25,7 @@ import { IWidgetSubscription, SubscriptionInfo, WidgetSubscriptionOptions } from @@ -25,6 +25,7 @@ import { IWidgetSubscription, SubscriptionInfo, WidgetSubscriptionOptions } from
25 import { DatasourceType, widgetType } from '@shared/models/widget.models'; 25 import { DatasourceType, widgetType } from '@shared/models/widget.models';
26 import { EntityType } from '@shared/models/entity-type.models'; 26 import { EntityType } from '@shared/models/entity-type.models';
27 import { MatSlideToggle } from '@angular/material/slide-toggle'; 27 import { MatSlideToggle } from '@angular/material/slide-toggle';
  28 +import { ResizeObserver } from '@juggle/resize-observer';
28 29
29 const switchAspectRation = 2.7893; 30 const switchAspectRation = 2.7893;
30 31
@@ -98,7 +99,7 @@ export class SwitchComponent extends PageComponent implements OnInit, OnDestroy @@ -98,7 +99,7 @@ export class SwitchComponent extends PageComponent implements OnInit, OnDestroy
98 private switchErrorContainer: JQuery<HTMLElement>; 99 private switchErrorContainer: JQuery<HTMLElement>;
99 private switchError: JQuery<HTMLElement>; 100 private switchError: JQuery<HTMLElement>;
100 101
101 - private switchResizeListener: any; 102 + private switchResize$: ResizeObserver;
102 103
103 constructor(private utils: UtilsService, 104 constructor(private utils: UtilsService,
104 protected store: Store<AppState>) { 105 protected store: Store<AppState>) {
@@ -118,9 +119,10 @@ export class SwitchComponent extends PageComponent implements OnInit, OnDestroy @@ -118,9 +119,10 @@ export class SwitchComponent extends PageComponent implements OnInit, OnDestroy
118 this.switchErrorContainer = $(this.switchErrorContainerRef.nativeElement); 119 this.switchErrorContainer = $(this.switchErrorContainerRef.nativeElement);
119 this.switchError = $(this.switchErrorRef.nativeElement); 120 this.switchError = $(this.switchErrorRef.nativeElement);
120 121
121 - this.switchResizeListener = this.resize.bind(this);  
122 - // @ts-ignore  
123 - addResizeListener(this.switchContainerRef.nativeElement, this.switchResizeListener); 122 + this.switchResize$ = new ResizeObserver(() => {
  123 + this.resize();
  124 + })
  125 + this.switchResize$.observe(this.switchContainerRef.nativeElement);
124 this.init(); 126 this.init();
125 } 127 }
126 128
@@ -128,9 +130,8 @@ export class SwitchComponent extends PageComponent implements OnInit, OnDestroy @@ -128,9 +130,8 @@ export class SwitchComponent extends PageComponent implements OnInit, OnDestroy
128 if (this.valueSubscription) { 130 if (this.valueSubscription) {
129 this.ctx.subscriptionApi.removeSubscription(this.valueSubscription.id); 131 this.ctx.subscriptionApi.removeSubscription(this.valueSubscription.id);
130 } 132 }
131 - if (this.switchResizeListener) {  
132 - // @ts-ignore  
133 - removeResizeListener(this.switchContainerRef.nativeElement, this.switchResizeListener); 133 + if (this.switchResize$) {
  134 + this.switchResize$.disconnect();
134 } 135 }
135 } 136 }
136 137
@@ -91,6 +91,7 @@ import { DatasourceService } from '@core/api/datasource.service'; @@ -91,6 +91,7 @@ import { DatasourceService } from '@core/api/datasource.service';
91 import { WidgetSubscription } from '@core/api/widget-subscription'; 91 import { WidgetSubscription } from '@core/api/widget-subscription';
92 import { EntityService } from '@core/http/entity.service'; 92 import { EntityService } from '@core/http/entity.service';
93 import { ServicesMap } from '@home/models/services.map'; 93 import { ServicesMap } from '@home/models/services.map';
  94 +import { ResizeObserver } from '@juggle/resize-observer';
94 95
95 @Component({ 96 @Component({
96 selector: 'tb-widget', 97 selector: 'tb-widget',
@@ -140,7 +141,7 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI @@ -140,7 +141,7 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI
140 141
141 cafs: {[cafId: string]: CancelAnimationFrame} = {}; 142 cafs: {[cafId: string]: CancelAnimationFrame} = {};
142 143
143 - onResizeListener = null; 144 + private widgetResize$: ResizeObserver;
144 145
145 private cssParser = new cssjs(); 146 private cssParser = new cssjs();
146 147
@@ -647,10 +648,8 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI @@ -647,10 +648,8 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI
647 } 648 }
648 649
649 private destroyDynamicWidgetComponent() { 650 private destroyDynamicWidgetComponent() {
650 - if (this.widgetContext.$containerParent && this.onResizeListener) {  
651 - // @ts-ignore  
652 - removeResizeListener(this.widgetContext.$containerParent[0], this.onResizeListener);  
653 - this.onResizeListener = null; 651 + if (this.widgetContext.$containerParent && this.widgetResize$) {
  652 + this.widgetResize$.disconnect()
654 } 653 }
655 if (this.dynamicWidgetComponentRef) { 654 if (this.dynamicWidgetComponentRef) {
656 this.dynamicWidgetComponentRef.destroy(); 655 this.dynamicWidgetComponentRef.destroy();
@@ -709,9 +708,10 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI @@ -709,9 +708,10 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI
709 } 708 }
710 } 709 }
711 710
712 - this.onResizeListener = this.onResize.bind(this);  
713 - // @ts-ignore  
714 - addResizeListener(this.widgetContext.$containerParent[0], this.onResizeListener); 711 + this.widgetResize$ = new ResizeObserver(() => {
  712 + this.onResize();
  713 + });
  714 + this.widgetResize$.observe(this.widgetContext.$containerParent[0]);
715 } 715 }
716 716
717 private createSubscription(options: WidgetSubscriptionOptions, subscribe?: boolean): Observable<IWidgetSubscription> { 717 private createSubscription(options: WidgetSubscriptionOptions, subscribe?: boolean): Observable<IWidgetSubscription> {
@@ -14,8 +14,7 @@ @@ -14,8 +14,7 @@
14 /// limitations under the License. 14 /// limitations under the License.
15 /// 15 ///
16 16
17 -import { Component, OnDestroy, OnInit, ViewEncapsulation, Input, Output, EventEmitter } from '@angular/core';  
18 -import { PageComponent } from '@shared/components/page.component'; 17 +import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from '@angular/core';
19 18
20 @Component({ 19 @Component({
21 selector: 'tb-dashboard-toolbar', 20 selector: 'tb-dashboard-toolbar',
@@ -46,6 +46,7 @@ import { @@ -46,6 +46,7 @@ import {
46 } from '@home/pages/widget/save-widget-type-as-dialog.component'; 46 } from '@home/pages/widget/save-widget-type-as-dialog.component';
47 import { Subscription } from 'rxjs'; 47 import { Subscription } from 'rxjs';
48 import Timeout = NodeJS.Timeout; 48 import Timeout = NodeJS.Timeout;
  49 +import { ResizeObserver } from '@juggle/resize-observer';
49 50
50 // @dynamic 51 // @dynamic
51 @Component({ 52 @Component({
@@ -124,7 +125,7 @@ export class WidgetEditorComponent extends PageComponent implements OnInit, OnDe @@ -124,7 +125,7 @@ export class WidgetEditorComponent extends PageComponent implements OnInit, OnDe
124 jsonSettingsEditor: ace.Ace.Editor; 125 jsonSettingsEditor: ace.Ace.Editor;
125 dataKeyJsonSettingsEditor: ace.Ace.Editor; 126 dataKeyJsonSettingsEditor: ace.Ace.Editor;
126 jsEditor: ace.Ace.Editor; 127 jsEditor: ace.Ace.Editor;
127 - aceResizeListeners: { element: any, resizeListener: any }[] = []; 128 + aceResizeObservers: ResizeObserver[] = [];
128 129
129 onWindowMessageListener = this.onWindowMessage.bind(this); 130 onWindowMessageListener = this.onWindowMessage.bind(this);
130 131
@@ -193,9 +194,8 @@ export class WidgetEditorComponent extends PageComponent implements OnInit, OnDe @@ -193,9 +194,8 @@ export class WidgetEditorComponent extends PageComponent implements OnInit, OnDe
193 194
194 ngOnDestroy(): void { 195 ngOnDestroy(): void {
195 this.window.removeEventListener('message', this.onWindowMessageListener); 196 this.window.removeEventListener('message', this.onWindowMessageListener);
196 - this.aceResizeListeners.forEach((resizeListener) => {  
197 - // @ts-ignore  
198 - removeResizeListener(resizeListener.element, resizeListener.resizeListener); 197 + this.aceResizeObservers.forEach((resize$) => {
  198 + resize$.disconnect();
199 }); 199 });
200 this.rxSubscriptions.forEach((subscription) => { 200 this.rxSubscriptions.forEach((subscription) => {
201 subscription.unsubscribe(); 201 subscription.unsubscribe();
@@ -343,11 +343,11 @@ export class WidgetEditorComponent extends PageComponent implements OnInit, OnDe @@ -343,11 +343,11 @@ export class WidgetEditorComponent extends PageComponent implements OnInit, OnDe
343 aceEditor.session.setUseWrapMode(true); 343 aceEditor.session.setUseWrapMode(true);
344 this.aceEditors.push(aceEditor); 344 this.aceEditors.push(aceEditor);
345 345
346 - const resizeListener = this.onAceEditorResize.bind(this, aceEditor);  
347 -  
348 - // @ts-ignore  
349 - addResizeListener(editorElement, resizeListener);  
350 - this.aceResizeListeners.push({element: editorElement, resizeListener}); 346 + const resize$ = new ResizeObserver(() => {
  347 + this.onAceEditorResize(aceEditor);
  348 + });
  349 + resize$.observe(editorElement);
  350 + this.aceResizeObservers.push(resize$);
351 return aceEditor; 351 return aceEditor;
352 } 352 }
353 353
@@ -29,6 +29,7 @@ import { @@ -29,6 +29,7 @@ import {
29 } from '@angular/core'; 29 } from '@angular/core';
30 import { WINDOW } from '@core/services/window.service'; 30 import { WINDOW } from '@core/services/window.service';
31 import { CanColorCtor, mixinColor } from '@angular/material/core'; 31 import { CanColorCtor, mixinColor } from '@angular/material/core';
  32 +import { ResizeObserver } from '@juggle/resize-observer';
32 33
33 export declare type FabToolbarDirection = 'left' | 'right'; 34 export declare type FabToolbarDirection = 'left' | 'right';
34 35
@@ -77,14 +78,14 @@ export class FabActionsDirective implements OnInit { @@ -77,14 +78,14 @@ export class FabActionsDirective implements OnInit {
77 }) 78 })
78 export class FabToolbarComponent extends MatFabToolbarMixinBase implements OnInit, OnDestroy, AfterViewInit, OnChanges { 79 export class FabToolbarComponent extends MatFabToolbarMixinBase implements OnInit, OnDestroy, AfterViewInit, OnChanges {
79 80
  81 + private fabToolbarResize$: ResizeObserver;
  82 +
80 @Input() 83 @Input()
81 isOpen: boolean; 84 isOpen: boolean;
82 85
83 @Input() 86 @Input()
84 direction: FabToolbarDirection; 87 direction: FabToolbarDirection;
85 88
86 - fabToolbarResizeListener = this.onFabToolbarResize.bind(this);  
87 -  
88 constructor(private el: ElementRef<HTMLElement>, 89 constructor(private el: ElementRef<HTMLElement>,
89 @Inject(WINDOW) private window: Window) { 90 @Inject(WINDOW) private window: Window) {
90 super(el); 91 super(el);
@@ -96,13 +97,14 @@ export class FabToolbarComponent extends MatFabToolbarMixinBase implements OnIni @@ -96,13 +97,14 @@ export class FabToolbarComponent extends MatFabToolbarMixinBase implements OnIni
96 element.find('mat-fab-trigger').find('button') 97 element.find('mat-fab-trigger').find('button')
97 .prepend('<div class="mat-fab-toolbar-background"></div>'); 98 .prepend('<div class="mat-fab-toolbar-background"></div>');
98 element.addClass(`mat-${this.direction}`); 99 element.addClass(`mat-${this.direction}`);
99 - // @ts-ignore  
100 - addResizeListener(this.el.nativeElement, this.fabToolbarResizeListener); 100 + this.fabToolbarResize$ = new ResizeObserver(() => {
  101 + this.onFabToolbarResize();
  102 + });
  103 + this.fabToolbarResize$.observe(this.el.nativeElement);
101 } 104 }
102 105
103 ngOnDestroy(): void { 106 ngOnDestroy(): void {
104 - // @ts-ignore  
105 - removeResizeListener(this.el.nativeElement, this.fabToolbarResizeListener); 107 + this.fabToolbarResize$.disconnect();
106 } 108 }
107 109
108 ngAfterViewInit(): void { 110 ngAfterViewInit(): void {
@@ -15,11 +15,11 @@ @@ -15,11 +15,11 @@
15 /// 15 ///
16 16
17 import { 17 import {
18 - ChangeDetectionStrategy,  
19 Component, 18 Component,
20 ElementRef, 19 ElementRef,
21 forwardRef, 20 forwardRef,
22 - Input, OnDestroy, 21 + Input,
  22 + OnDestroy,
23 OnInit, 23 OnInit,
24 ViewChild, 24 ViewChild,
25 ViewEncapsulation 25 ViewEncapsulation
@@ -34,6 +34,7 @@ import { UtilsService } from '@core/services/utils.service'; @@ -34,6 +34,7 @@ import { UtilsService } from '@core/services/utils.service';
34 import { guid, isUndefined } from '@app/core/utils'; 34 import { guid, isUndefined } from '@app/core/utils';
35 import { TranslateService } from '@ngx-translate/core'; 35 import { TranslateService } from '@ngx-translate/core';
36 import { CancelAnimationFrame, RafService } from '@core/services/raf.service'; 36 import { CancelAnimationFrame, RafService } from '@core/services/raf.service';
  37 +import { ResizeObserver } from '@juggle/resize-observer';
37 38
38 @Component({ 39 @Component({
39 selector: 'tb-js-func', 40 selector: 'tb-js-func',
@@ -60,7 +61,7 @@ export class JsFuncComponent implements OnInit, OnDestroy, ControlValueAccessor, @@ -60,7 +61,7 @@ export class JsFuncComponent implements OnInit, OnDestroy, ControlValueAccessor,
60 61
61 private jsEditor: ace.Ace.Editor; 62 private jsEditor: ace.Ace.Editor;
62 private editorsResizeCaf: CancelAnimationFrame; 63 private editorsResizeCaf: CancelAnimationFrame;
63 - private editorResizeListener: any; 64 + private editorResize$: ResizeObserver;
64 65
65 toastTargetId = `jsFuncEditor-${guid()}`; 66 toastTargetId = `jsFuncEditor-${guid()}`;
66 67
@@ -152,16 +153,15 @@ export class JsFuncComponent implements OnInit, OnDestroy, ControlValueAccessor, @@ -152,16 +153,15 @@ export class JsFuncComponent implements OnInit, OnDestroy, ControlValueAccessor,
152 this.cleanupJsErrors(); 153 this.cleanupJsErrors();
153 this.updateView(); 154 this.updateView();
154 }); 155 });
155 - this.editorResizeListener = this.onAceEditorResize.bind(this);  
156 - // @ts-ignore  
157 - addResizeListener(editorElement, this.editorResizeListener); 156 + this.editorResize$ = new ResizeObserver(() => {
  157 + this.onAceEditorResize();
  158 + });
  159 + this.editorResize$.observe(editorElement);
158 } 160 }
159 161
160 ngOnDestroy(): void { 162 ngOnDestroy(): void {
161 - if (this.editorResizeListener) {  
162 - const editorElement = this.javascriptEditorElmRef.nativeElement;  
163 - // @ts-ignore  
164 - removeResizeListener(editorElement, this.editorResizeListener); 163 + if (this.editorResize$) {
  164 + this.editorResize$.disconnect();
165 } 165 }
166 } 166 }
167 167
@@ -20,10 +20,10 @@ import { @@ -20,10 +20,10 @@ import {
20 forwardRef, 20 forwardRef,
21 Input, 21 Input,
22 OnChanges, 22 OnChanges,
  23 + OnDestroy,
23 OnInit, 24 OnInit,
24 - ViewChild,  
25 SimpleChanges, 25 SimpleChanges,
26 - OnDestroy 26 + ViewChild
27 } from '@angular/core'; 27 } from '@angular/core';
28 import { ControlValueAccessor, FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validator } from '@angular/forms'; 28 import { ControlValueAccessor, FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validator } from '@angular/forms';
29 import * as ace from 'ace-builds'; 29 import * as ace from 'ace-builds';
@@ -34,6 +34,7 @@ import { AppState } from '@core/core.state'; @@ -34,6 +34,7 @@ import { AppState } from '@core/core.state';
34 import { ContentType, contentTypesMap } from '@shared/models/constants'; 34 import { ContentType, contentTypesMap } from '@shared/models/constants';
35 import { CancelAnimationFrame, RafService } from '@core/services/raf.service'; 35 import { CancelAnimationFrame, RafService } from '@core/services/raf.service';
36 import { guid } from '@core/utils'; 36 import { guid } from '@core/utils';
  37 +import { ResizeObserver } from '@juggle/resize-observer';
37 38
38 @Component({ 39 @Component({
39 selector: 'tb-json-content', 40 selector: 'tb-json-content',
@@ -59,7 +60,7 @@ export class JsonContentComponent implements OnInit, ControlValueAccessor, Valid @@ -59,7 +60,7 @@ export class JsonContentComponent implements OnInit, ControlValueAccessor, Valid
59 60
60 private jsonEditor: ace.Ace.Editor; 61 private jsonEditor: ace.Ace.Editor;
61 private editorsResizeCaf: CancelAnimationFrame; 62 private editorsResizeCaf: CancelAnimationFrame;
62 - private editorResizeListener: any; 63 + private editorResize$: ResizeObserver;
63 64
64 toastTargetId = `jsonContentEditor-${guid()}`; 65 toastTargetId = `jsonContentEditor-${guid()}`;
65 66
@@ -97,8 +98,6 @@ export class JsonContentComponent implements OnInit, ControlValueAccessor, Valid @@ -97,8 +98,6 @@ export class JsonContentComponent implements OnInit, ControlValueAccessor, Valid
97 98
98 contentValid: boolean; 99 contentValid: boolean;
99 100
100 - validationError: string;  
101 -  
102 errorShowed = false; 101 errorShowed = false;
103 102
104 private propagateChange = null; 103 private propagateChange = null;
@@ -135,16 +134,15 @@ export class JsonContentComponent implements OnInit, ControlValueAccessor, Valid @@ -135,16 +134,15 @@ export class JsonContentComponent implements OnInit, ControlValueAccessor, Valid
135 this.cleanupJsonErrors(); 134 this.cleanupJsonErrors();
136 this.updateView(); 135 this.updateView();
137 }); 136 });
138 - this.editorResizeListener = this.onAceEditorResize.bind(this);  
139 - // @ts-ignore  
140 - addResizeListener(editorElement, this.editorResizeListener); 137 + this.editorResize$ = new ResizeObserver(() => {
  138 + this.onAceEditorResize();
  139 + });
  140 + this.editorResize$.observe(editorElement);
141 } 141 }
142 142
143 ngOnDestroy(): void { 143 ngOnDestroy(): void {
144 - if (this.editorResizeListener) {  
145 - const editorElement = this.jsonEditorElmRef.nativeElement;  
146 - // @ts-ignore  
147 - removeResizeListener(editorElement, this.editorResizeListener); 144 + if (this.editorResize$) {
  145 + this.editorResize$.disconnect();
148 } 146 }
149 } 147 }
150 148
@@ -14,16 +14,8 @@ @@ -14,16 +14,8 @@
14 /// limitations under the License. 14 /// limitations under the License.
15 /// 15 ///
16 16
17 -import {  
18 - Attribute, ChangeDetectionStrategy,  
19 - Component,  
20 - ElementRef,  
21 - forwardRef,  
22 - Input, OnDestroy,  
23 - OnInit,  
24 - ViewChild  
25 -} from '@angular/core';  
26 -import { ControlValueAccessor, NG_VALUE_ACCESSOR, FormControl, Validator, NG_VALIDATORS } from '@angular/forms'; 17 +import { Component, ElementRef, forwardRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core';
  18 +import { ControlValueAccessor, FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validator } from '@angular/forms';
27 import * as ace from 'ace-builds'; 19 import * as ace from 'ace-builds';
28 import { coerceBooleanProperty } from '@angular/cdk/coercion'; 20 import { coerceBooleanProperty } from '@angular/cdk/coercion';
29 import { ActionNotificationHide, ActionNotificationShow } from '@core/notification/notification.actions'; 21 import { ActionNotificationHide, ActionNotificationShow } from '@core/notification/notification.actions';
@@ -31,6 +23,7 @@ import { Store } from '@ngrx/store'; @@ -31,6 +23,7 @@ import { Store } from '@ngrx/store';
31 import { AppState } from '@core/core.state'; 23 import { AppState } from '@core/core.state';
32 import { CancelAnimationFrame, RafService } from '@core/services/raf.service'; 24 import { CancelAnimationFrame, RafService } from '@core/services/raf.service';
33 import { guid } from '@core/utils'; 25 import { guid } from '@core/utils';
  26 +import { ResizeObserver } from '@juggle/resize-observer';
34 27
35 @Component({ 28 @Component({
36 selector: 'tb-json-object-edit', 29 selector: 'tb-json-object-edit',
@@ -56,7 +49,7 @@ export class JsonObjectEditComponent implements OnInit, ControlValueAccessor, Va @@ -56,7 +49,7 @@ export class JsonObjectEditComponent implements OnInit, ControlValueAccessor, Va
56 49
57 private jsonEditor: ace.Ace.Editor; 50 private jsonEditor: ace.Ace.Editor;
58 private editorsResizeCaf: CancelAnimationFrame; 51 private editorsResizeCaf: CancelAnimationFrame;
59 - private editorResizeListener: any; 52 + private editorResize$: ResizeObserver;
60 53
61 toastTargetId = `jsonObjectEditor-${guid()}`; 54 toastTargetId = `jsonObjectEditor-${guid()}`;
62 55
@@ -128,16 +121,15 @@ export class JsonObjectEditComponent implements OnInit, ControlValueAccessor, Va @@ -128,16 +121,15 @@ export class JsonObjectEditComponent implements OnInit, ControlValueAccessor, Va
128 this.cleanupJsonErrors(); 121 this.cleanupJsonErrors();
129 this.updateView(); 122 this.updateView();
130 }); 123 });
131 - this.editorResizeListener = this.onAceEditorResize.bind(this);  
132 - // @ts-ignore  
133 - addResizeListener(editorElement, this.editorResizeListener); 124 + this.editorResize$ = new ResizeObserver(() => {
  125 + this.onAceEditorResize();
  126 + });
  127 + this.editorResize$.observe(editorElement);
134 } 128 }
135 129
136 ngOnDestroy(): void { 130 ngOnDestroy(): void {
137 - if (this.editorResizeListener) {  
138 - const editorElement = this.jsonEditorElmRef.nativeElement;  
139 - // @ts-ignore  
140 - removeResizeListener(editorElement, this.editorResizeListener); 131 + if (this.editorResize$) {
  132 + this.editorResize$.disconnect();
141 } 133 }
142 } 134 }
143 135