@schneideress/dashboardframework 0.0.66 → 0.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.
Files changed (113) hide show
  1. package/README.md +24 -24
  2. package/bundles/schneideress-dashboardframework.umd.js +6932 -6919
  3. package/bundles/schneideress-dashboardframework.umd.js.map +1 -1
  4. package/bundles/schneideress-dashboardframework.umd.min.js +15 -1
  5. package/bundles/schneideress-dashboardframework.umd.min.js.map +1 -1
  6. package/esm2015/gridster/index.js +18 -18
  7. package/esm2015/gridster/lib/gridster.component.js +700 -700
  8. package/esm2015/gridster/lib/gridster.interface.js +84 -84
  9. package/esm2015/gridster/lib/gridster.module.js +27 -27
  10. package/esm2015/gridster/lib/gridsterCompact.service.js +223 -223
  11. package/esm2015/gridster/lib/gridsterConfig.constant.js +179 -179
  12. package/esm2015/gridster/lib/gridsterConfig.interface.js +219 -219
  13. package/esm2015/gridster/lib/gridsterConfigS.interface.js +161 -161
  14. package/esm2015/gridster/lib/gridsterDraggable.service.js +510 -510
  15. package/esm2015/gridster/lib/gridsterEmptyCell.service.js +317 -317
  16. package/esm2015/gridster/lib/gridsterItem.component.js +213 -213
  17. package/esm2015/gridster/lib/gridsterItem.interface.js +46 -46
  18. package/esm2015/gridster/lib/gridsterItemComponent.interface.js +48 -48
  19. package/esm2015/gridster/lib/gridsterPreview.component.js +66 -66
  20. package/esm2015/gridster/lib/gridsterPush.service.js +467 -467
  21. package/esm2015/gridster/lib/gridsterPushResize.service.js +358 -358
  22. package/esm2015/gridster/lib/gridsterRenderer.service.js +277 -277
  23. package/esm2015/gridster/lib/gridsterResizable.service.js +552 -552
  24. package/esm2015/gridster/lib/gridsterResizeEventType.interface.js +19 -19
  25. package/esm2015/gridster/lib/gridsterScroll.service.js +195 -195
  26. package/esm2015/gridster/lib/gridsterSwap.service.js +134 -134
  27. package/esm2015/gridster/lib/gridsterUtils.service.js +137 -137
  28. package/esm2015/lib/custom.notifier.options.js +46 -46
  29. package/esm2015/lib/ra-dashboard-area/ra.dashboard.area.js +494 -494
  30. package/esm2015/lib/ra-widget-container/ra.widget.container.component.js +400 -400
  31. package/esm2015/lib/ra.base.dashboard.filter.js +75 -61
  32. package/esm2015/lib/ra.base.dashboard.template.js +71 -71
  33. package/esm2015/lib/ra.dashbard.event.bus.js +85 -85
  34. package/esm2015/lib/ra.dashboard.module.js +49 -50
  35. package/esm2015/lib/ra.dashboard.service.js +144 -144
  36. package/esm2015/lib/ra.event.enum.js +51 -51
  37. package/esm2015/lib/ra.gridster.config.js +67 -67
  38. package/esm2015/public-api.js +16 -16
  39. package/esm2015/schneideress-dashboardframework.js +13 -13
  40. package/esm5/gridster/index.js +18 -18
  41. package/esm5/gridster/lib/gridster.component.js +803 -803
  42. package/esm5/gridster/lib/gridster.interface.js +94 -94
  43. package/esm5/gridster/lib/gridster.module.js +31 -31
  44. package/esm5/gridster/lib/gridsterCompact.service.js +253 -253
  45. package/esm5/gridster/lib/gridsterConfig.constant.js +179 -179
  46. package/esm5/gridster/lib/gridsterConfig.interface.js +219 -219
  47. package/esm5/gridster/lib/gridsterConfigS.interface.js +161 -161
  48. package/esm5/gridster/lib/gridsterDraggable.service.js +549 -549
  49. package/esm5/gridster/lib/gridsterEmptyCell.service.js +358 -358
  50. package/esm5/gridster/lib/gridsterItem.component.js +238 -238
  51. package/esm5/gridster/lib/gridsterItem.interface.js +46 -46
  52. package/esm5/gridster/lib/gridsterItemComponent.interface.js +58 -58
  53. package/esm5/gridster/lib/gridsterPreview.component.js +70 -70
  54. package/esm5/gridster/lib/gridsterPush.service.js +547 -547
  55. package/esm5/gridster/lib/gridsterPushResize.service.js +423 -423
  56. package/esm5/gridster/lib/gridsterRenderer.service.js +323 -323
  57. package/esm5/gridster/lib/gridsterResizable.service.js +629 -629
  58. package/esm5/gridster/lib/gridsterResizeEventType.interface.js +19 -19
  59. package/esm5/gridster/lib/gridsterScroll.service.js +195 -195
  60. package/esm5/gridster/lib/gridsterSwap.service.js +152 -152
  61. package/esm5/gridster/lib/gridsterUtils.service.js +177 -177
  62. package/esm5/lib/custom.notifier.options.js +46 -46
  63. package/esm5/lib/ra-dashboard-area/ra.dashboard.area.js +586 -586
  64. package/esm5/lib/ra-widget-container/ra.widget.container.component.js +506 -506
  65. package/esm5/lib/ra.base.dashboard.filter.js +81 -67
  66. package/esm5/lib/ra.base.dashboard.template.js +74 -74
  67. package/esm5/lib/ra.dashbard.event.bus.js +125 -125
  68. package/esm5/lib/ra.dashboard.module.js +53 -54
  69. package/esm5/lib/ra.dashboard.service.js +221 -221
  70. package/esm5/lib/ra.event.enum.js +51 -51
  71. package/esm5/lib/ra.gridster.config.js +67 -67
  72. package/esm5/public-api.js +16 -16
  73. package/esm5/schneideress-dashboardframework.js +13 -13
  74. package/fesm2015/schneideress-dashboardframework.js +6045 -6033
  75. package/fesm2015/schneideress-dashboardframework.js.map +1 -1
  76. package/fesm5/schneideress-dashboardframework.js +6935 -6923
  77. package/fesm5/schneideress-dashboardframework.js.map +1 -1
  78. package/gridster/index.d.ts +11 -11
  79. package/gridster/lib/gridster.component.d.ts +67 -67
  80. package/gridster/lib/gridster.interface.d.ts +46 -46
  81. package/gridster/lib/gridster.module.d.ts +2 -2
  82. package/gridster/lib/gridsterCompact.service.d.ts +15 -15
  83. package/gridster/lib/gridsterConfig.constant.d.ts +2 -2
  84. package/gridster/lib/gridsterConfig.interface.d.ts +133 -133
  85. package/gridster/lib/gridsterConfigS.interface.d.ts +93 -93
  86. package/gridster/lib/gridsterDraggable.service.d.ts +59 -59
  87. package/gridster/lib/gridsterEmptyCell.service.d.ts +29 -29
  88. package/gridster/lib/gridsterItem.component.d.ts +32 -32
  89. package/gridster/lib/gridsterItem.interface.d.ts +21 -21
  90. package/gridster/lib/gridsterItemComponent.interface.d.ts +25 -25
  91. package/gridster/lib/gridsterPreview.component.d.ts +10 -10
  92. package/gridster/lib/gridsterPush.service.d.ts +33 -33
  93. package/gridster/lib/gridsterPushResize.service.d.ts +26 -26
  94. package/gridster/lib/gridsterRenderer.service.d.ts +38 -38
  95. package/gridster/lib/gridsterResizable.service.d.ts +67 -67
  96. package/gridster/lib/gridsterResizeEventType.interface.d.ts +6 -6
  97. package/gridster/lib/gridsterScroll.service.d.ts +4 -4
  98. package/gridster/lib/gridsterSwap.service.d.ts +13 -13
  99. package/gridster/lib/gridsterUtils.service.d.ts +16 -16
  100. package/lib/custom.notifier.options.d.ts +2 -2
  101. package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +64 -64
  102. package/lib/ra-widget-container/ra.widget.container.component.d.ts +59 -59
  103. package/lib/ra.base.dashboard.filter.d.ts +10 -8
  104. package/lib/ra.base.dashboard.template.d.ts +15 -15
  105. package/lib/ra.dashbard.event.bus.d.ts +20 -20
  106. package/lib/ra.dashboard.module.d.ts +2 -2
  107. package/lib/ra.dashboard.service.d.ts +22 -22
  108. package/lib/ra.event.enum.d.ts +42 -42
  109. package/lib/ra.gridster.config.d.ts +2 -2
  110. package/package.json +1 -1
  111. package/public-api.d.ts +8 -8
  112. package/schneideress-dashboardframework.d.ts +9 -9
  113. package/schneideress-dashboardframework.metadata.json +1 -1
@@ -1,400 +1,400 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
6
- import { Component, Input, ViewChild, ElementRef, EventEmitter, Output, NgZone, Renderer2 } from '@angular/core';
7
- import { RaDashboardService } from './../ra.dashboard.service';
8
- import { RADashboardEventBus } from '../ra.dashbard.event.bus';
9
- import { RAEvent, RAEventKey } from '../ra.event.enum';
10
- import { NgxUiLoaderService } from 'ngx-ui-loader';
11
- import { NotifierService } from 'angular-notifier';
12
- import { TranslateService } from '@schneideress/ess-base';
13
- export class RAWidgetContainer {
14
- /**
15
- * @param {?} dashboardService
16
- * @param {?} ngxService
17
- * @param {?} translateService
18
- * @param {?} ngZone
19
- * @param {?} notifier
20
- * @param {?} renderer
21
- */
22
- constructor(dashboardService, ngxService, translateService, ngZone, notifier, renderer) {
23
- this.dashboardService = dashboardService;
24
- this.ngxService = ngxService;
25
- this.translateService = translateService;
26
- this.ngZone = ngZone;
27
- this.notifier = notifier;
28
- this.renderer = renderer;
29
- this.showPanel = false;
30
- this.isWidgetLoaded = false;
31
- this.isIEOrEdge = /msie\s|trident\/|edge\//i.test(window.navigator.userAgent);
32
- this.lockClass = "unlocked";
33
- this.lockStatus = "unlock";
34
- this.isDownloadIconVisible = false;
35
- this.dropDownShown = false;
36
- this.widgetDeleted = new EventEmitter();
37
- this.renderer.listen('window', 'click', (/**
38
- * @param {?} e
39
- * @return {?}
40
- */
41
- (e) => {
42
- if (e.target !== this.widgetDropdown.nativeElement) {
43
- this.dropDownShown = false;
44
- }
45
- }));
46
- }
47
- /**
48
- * @param {?} changes
49
- * @return {?}
50
- */
51
- ngOnChanges(changes) {
52
- if (changes.raDashboardEventBus && changes.raDashboardEventBus.currentValue != changes.raDashboardEventBus.previousValue) {
53
- this.configChanged = this.raDashboardEventBus.subscribeWithKey(RAEvent.ConfigChanged, RAEventKey.WidgetInstanceId, this.data.widgetInfo.widgetInstanceId.toString()).subscribe((/**
54
- * @param {?} e
55
- * @return {?}
56
- */
57
- (e) => {
58
- this.ngZone.run((/**
59
- * @return {?}
60
- */
61
- () => {
62
- this.configChangeEventHandler(e);
63
- }));
64
- }));
65
- }
66
- if (this.widgetElement && changes.globalFilter && changes.globalFilter.currentValue != changes.globalFilter.previousValue) {
67
- this.refreshWidget(this.data.widgetInfo);
68
- }
69
- if (changes.width && changes.width.currentValue != changes.width.previousValue ||
70
- (changes.height && changes.height.currentValue != changes.height.previousValue)) {
71
- if (this.widgetElement) {
72
- /** @type {?} */
73
- let size = {};
74
- size.height = this.height;
75
- size.width = this.width;
76
- this.widgetElement.widgetResized(size);
77
- }
78
- }
79
- }
80
- /**
81
- * @return {?}
82
- */
83
- ngAfterViewInit() {
84
- setTimeout((/**
85
- * @return {?}
86
- */
87
- () => {
88
- this.loadWidget(this.data.widgetInfo);
89
- }));
90
- }
91
- /**
92
- * @return {?}
93
- */
94
- ngOnDestroy() {
95
- if (this.configChanged)
96
- this.configChanged.unsubscribe();
97
- }
98
- /**
99
- * To Edit current widget configuration
100
- * @return {?}
101
- */
102
- editWidget() {
103
- this.raDashboardEventBus.publish(RAEvent.WidgetEditClicked, this.data.widgetInfo);
104
- }
105
- /**
106
- * To Delete current widget from DOM
107
- * @return {?}
108
- */
109
- deleteWidget() {
110
- /** @type {?} */
111
- let widgetContainerContext = this;
112
- widgetContainerContext.ngxService.start();
113
- widgetContainerContext.dashboardService.deleteWidget(this.data.widgetInfo, this.appConfig).subscribe((/**
114
- * @param {?} status
115
- * @return {?}
116
- */
117
- status => {
118
- widgetContainerContext.ngxService.stop();
119
- if (status) {
120
- widgetContainerContext.widgetDeleted.emit(this.data.widgetInfo.widgetInstanceId);
121
- }
122
- else {
123
- widgetContainerContext.notifier.notify('error', " " + this.translateService.translate('FailedToRemoveWidget') + " (" + this.data.widgetInfo.widgetTitle + ")!");
124
- }
125
- }));
126
- }
127
- /**
128
- * To Move or change position if current widget container
129
- * @return {?}
130
- */
131
- moveWidget() {
132
- this.raDashboardEventBus.publish(RAEvent.MoveWidget, this.data.widgetInfo);
133
- // this.dashboardService.moveWidget(widgetInfo);
134
- }
135
- /**
136
- * To Copy Current widget with same configuration
137
- * @return {?}
138
- */
139
- copyWidget() {
140
- this.raDashboardEventBus.publish(RAEvent.CopyWidget, this.data.widgetInfo);
141
- //this.dashboardService.copyWidget(widgetInfo);
142
- }
143
- /**
144
- * @param {?} widgetInfo
145
- * @return {?}
146
- */
147
- configChangeEventHandler(widgetInfo) {
148
- this.data.widgetInfo = widgetInfo;
149
- this.refreshWidget(this.data.widgetInfo);
150
- // this.updateWidget(widgetInfo);
151
- }
152
- /**
153
- * To load external custom element to the widget container
154
- * @param {?} widgetInfo
155
- * @return {?}
156
- */
157
- loadWidget(widgetInfo) {
158
- return tslib_1.__awaiter(this, void 0, void 0, /** @this {!RAWidgetContainer} */ function* () {
159
- /** @type {?} */
160
- let widgetConfigFilter = (/** @type {?} */ ({
161
- config: widgetInfo.widgetConfigInfo.config,
162
- globalFilter: this.globalFilter
163
- }));
164
- /** @type {?} */
165
- let widgetContainer = this;
166
- this.dashboardService.loadExternalScript(widgetInfo.scriptUrl, (/**
167
- * @return {?}
168
- */
169
- () => {
170
- widgetContainer.widgetElement = document.createElement(widgetInfo.customTag);
171
- widgetContainer.widgetElement.setAttribute("widget-instance-id", widgetInfo.widgetInstanceId);
172
- document.body.addEventListener('widgetinitiated' + widgetInfo.widgetInstanceId, (/**
173
- * @return {?}
174
- */
175
- () => tslib_1.__awaiter(this, void 0, void 0, /** @this {!RAWidgetContainer} */ function* () {
176
- setTimeout((/**
177
- * @return {?}
178
- */
179
- () => tslib_1.__awaiter(this, void 0, void 0, /** @this {!RAWidgetContainer} */ function* () {
180
- this.widgetElement.addEventListener('on-data-load', (/**
181
- * @param {?} e
182
- * @return {?}
183
- */
184
- (e) => {
185
- if (e.detail)
186
- this.showPanel = true;
187
- else
188
- this.showPanel = false;
189
- }));
190
- widgetContainer.isWidgetLoaded = true;
191
- widgetConfigFilter.appConfig = this.appConfig;
192
- widgetConfigFilter.widgetInfo = (/** @type {?} */ ({}));
193
- widgetConfigFilter.widgetInfo.widgetName = widgetInfo.widgetName;
194
- widgetContainer.widgetElement.loadContent(widgetConfigFilter);
195
- yield widgetContainer.setLock(widgetConfigFilter.config);
196
- yield widgetContainer.setDownloadIcon();
197
- })));
198
- })));
199
- this.ctlWidget.nativeElement.appendChild(this.widgetElement);
200
- }));
201
- });
202
- }
203
- /**
204
- * To refresh widget on input config changes
205
- * @param {?} widgetInfo
206
- * @return {?}
207
- */
208
- refreshWidget(widgetInfo) {
209
- return tslib_1.__awaiter(this, void 0, void 0, /** @this {!RAWidgetContainer} */ function* () {
210
- /** @type {?} */
211
- let widgetContainerContext = this;
212
- /** @type {?} */
213
- let widgetConfigFilter = (/** @type {?} */ ({
214
- config: widgetInfo.widgetConfigInfo.config,
215
- globalFilter: this.globalFilter,
216
- appConfig: this.appConfig,
217
- widgetInfo: widgetInfo
218
- }));
219
- if (widgetContainerContext.isWidgetLoaded) {
220
- widgetContainerContext.widgetElement.loadContent(widgetConfigFilter);
221
- yield this.setLock(widgetConfigFilter.config);
222
- yield this.setDownloadIcon();
223
- }
224
- });
225
- }
226
- /**
227
- * @private
228
- * @param {?} config
229
- * @return {?}
230
- */
231
- setLock(config) {
232
- return tslib_1.__awaiter(this, void 0, void 0, /** @this {!RAWidgetContainer} */ function* () {
233
- this.lockStatus = yield this.widgetElement.loadLockStatus(config);
234
- if (this.lockStatus) {
235
- switch (this.lockStatus) {
236
- case "lock": {
237
- this.lockClass = "fa fa-lock locked";
238
- break;
239
- }
240
- case "unlock": {
241
- this.lockClass = "unlocked";
242
- break;
243
- }
244
- case "partiallock": {
245
- this.lockClass = "fa fa-lock partiallocked";
246
- break;
247
- }
248
- default: {
249
- this.lockClass = "unlocked";
250
- break;
251
- }
252
- }
253
- }
254
- });
255
- }
256
- /**
257
- * @private
258
- * @return {?}
259
- */
260
- setDownloadIcon() {
261
- return tslib_1.__awaiter(this, void 0, void 0, /** @this {!RAWidgetContainer} */ function* () {
262
- // this.isDownloadIconVisible = await this.widgetElement.isDownloadVisible();
263
- this.isDownloadIconVisible = false; //temp. commented
264
- });
265
- }
266
- /**
267
- * @return {?}
268
- */
269
- downloadClicked() {
270
- //this.widgetElement.isDownloadVisible();
271
- }
272
- /**
273
- * Show dropdown on gear icon click
274
- * @return {?}
275
- */
276
- showDropDown() {
277
- this.dropDownShown = !this.dropDownShown;
278
- }
279
- /**
280
- * Hide dropdown on outside click
281
- * @return {?}
282
- */
283
- hideDropDown() {
284
- if (this.dropDownShown)
285
- this.dropDownShown = false;
286
- }
287
- }
288
- RAWidgetContainer.decorators = [
289
- { type: Component, args: [{
290
- selector: 'ra-widget-container',
291
- template: "<div class=\"wc-wrapper\" (mouseleave) =\"hideDropDown()\">\r\n <div class=\"wcheader widget-move\">\r\n <div class=\"col-md-12 wc-mover\" style=\"padding-left: 0px;height:inherit;\">\r\n <div style=\"display:flex;margin-top:10px;\">\r\n <div class=\"col-md-11 float-left\" style=\"width:96%;padding-left: 0px\">{{data.widgetInfo.widgetTitle}}\r\n </div>\r\n <div class=\"col-md-1\" style=\"cursor:default;\">\r\n <div class=\"float-right\" style=\"display: flex;\">\r\n <div *ngIf=\"isDownloadIconVisible\"> <i class=\"far fa-download\" (click)=\"downloadClicked\"></i></div>\r\n <div class=\"pr-3\"><i [ngClass]=\"lockClass\"\r\n [attr.title]=\"lockStatus=='lock' ? 'Locked' : 'Partially Locked'\"></i></div>\r\n <div class=\"dropdown\">\r\n <div class=\"dropbtn gearIcon\"> <i #widgetDropdown class=\"fal fa-cog\" (click)=\"showDropDown()\"></i></div>\r\n <div class=\"dropdown-content widget-config-item\" [ngClass]=\"{'dropdown-click': dropDownShown}\">\r\n <a (click)=\"editWidget()\">\r\n <i class=\"fal fa-edit\"></i>\r\n <span>{{'Edit'|translate}}</span>\r\n </a>\r\n <a (click)=\"copyWidget()\">\r\n <i class=\"fal fa-copy\"></i>\r\n <span>{{'Copy'|translate}}</span>\r\n </a>\r\n <a (click)=\"moveWidget()\">\r\n <i class=\"fal fa-arrows-alt\"></i>\r\n <span>{{'Move'|translate}}</span>\r\n </a>\r\n <hr class=\"hr\">\r\n <a (click)=\"deleteWidget()\">\r\n <i class=\"fal fa-times\" style=\"padding-left: 3px;\"></i>\r\n <span>{{'Delete'|translate}}</span>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"wcBody\">\r\n <div class=\"m-fadeOut widget-overlay\" [ngClass]=\"{'m-fadeIn': showPanel}\">\r\n <div class=\"lds-roller\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n </div>\r\n <perfect-scrollbar [scrollIndicators]=\"true\">\r\n <div #ctlWidget></div>\r\n </perfect-scrollbar>\r\n </div>\r\n</div>",
292
- styles: [".wcheader{width:100%;height:24px;background:#fff;color:#3dcd58;font-family:\"Arial Rounded MT\";font-size:16px;position:absolute;left:0;top:0}.wc-wrapper{height:100%;position:relative;margin:auto 15px}.wc-mover{cursor:all-scroll}.wcBody{width:100%;position:absolute;top:46px;left:0;bottom:0}.wcBodyBorder{border:1px dashed #e6e2e2}.sp_icon{float:left;margin:0 15% 0 0}.dropbtn{cursor:pointer;color:#42b4e6}.dropdown{visibility:hidden;opacity:0;transition:visibility,opacity .5s linear;position:relative}.dropdown hr{margin:0!important}.dropdown-content{display:none;position:absolute;right:0;background-color:#f9f9f9;min-width:100px;box-shadow:0 8px 16px 8px rgba(0,0,0,.2);z-index:2;font-size:12px;font-weight:400}.dropdown-content a{color:#000;padding:5px 16px;text-decoration:none;display:block;cursor:pointer}.dropdown-content a:hover{background-color:#f1f1f1}.dropdown-click{display:block;-webkit-animation:.3s ease-out slide-down;animation:.3s ease-out slide-down}.dropdown:hover .dropdown-content{color:#fff}.wc-wrapper:hover .dropdown{visibility:visible;opacity:1}.gearIcon{color:#42b4e6}.hr{border:0;border-top:1px solid rgba(0,0,0,.1)}@keyframes slide-down{0%{opacity:0;-webkit-transform:translateY(-20%);transform:translateY(-20%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slide-down{0%{opacity:0;-webkit-transform:translateY(-20%)}100%{opacity:1;-webkit-transform:translateY(0)}}.widget-config-item i{font-size:17px;color:#42b4e6}.widget-config-item span{font-size:12px;font:inherit;padding-left:12px;color:#42b4e6}.locked{color:#42b4e6}.partiallocked{color:#a0d9f2}.unlocked{display:none}"]
293
- }] }
294
- ];
295
- /** @nocollapse */
296
- RAWidgetContainer.ctorParameters = () => [
297
- { type: RaDashboardService },
298
- { type: NgxUiLoaderService },
299
- { type: TranslateService },
300
- { type: NgZone },
301
- { type: NotifierService },
302
- { type: Renderer2 }
303
- ];
304
- RAWidgetContainer.propDecorators = {
305
- ctlWidget: [{ type: ViewChild, args: ['ctlWidget', { static: false },] }],
306
- widgetDropdown: [{ type: ViewChild, args: ['widgetDropdown', { static: false },] }],
307
- widgetInstanceId: [{ type: Input, args: ['widget-instance-id',] }],
308
- globalFilter: [{ type: Input, args: ['global-filter',] }],
309
- data: [{ type: Input, args: ['data',] }],
310
- raDashboardEventBus: [{ type: Input, args: ['event-bus',] }],
311
- appConfig: [{ type: Input, args: ['app-config',] }],
312
- width: [{ type: Input, args: ['widget-width',] }],
313
- height: [{ type: Input, args: ['widget-height',] }],
314
- widgetDeleted: [{ type: Output }]
315
- };
316
- if (false) {
317
- /** @type {?} */
318
- RAWidgetContainer.prototype.showPanel;
319
- /**
320
- * @type {?}
321
- * @private
322
- */
323
- RAWidgetContainer.prototype.isWidgetLoaded;
324
- /**
325
- * @type {?}
326
- * @private
327
- */
328
- RAWidgetContainer.prototype.widgetElement;
329
- /**
330
- * @type {?}
331
- * @private
332
- */
333
- RAWidgetContainer.prototype.configChanged;
334
- /**
335
- * @type {?}
336
- * @private
337
- */
338
- RAWidgetContainer.prototype.isIEOrEdge;
339
- /** @type {?} */
340
- RAWidgetContainer.prototype.widgetHeight;
341
- /** @type {?} */
342
- RAWidgetContainer.prototype.lockClass;
343
- /** @type {?} */
344
- RAWidgetContainer.prototype.lockStatus;
345
- /** @type {?} */
346
- RAWidgetContainer.prototype.isDownloadIconVisible;
347
- /** @type {?} */
348
- RAWidgetContainer.prototype.dropDownShown;
349
- /** @type {?} */
350
- RAWidgetContainer.prototype.ctlWidget;
351
- /** @type {?} */
352
- RAWidgetContainer.prototype.widgetDropdown;
353
- /** @type {?} */
354
- RAWidgetContainer.prototype.widgetInstanceId;
355
- /** @type {?} */
356
- RAWidgetContainer.prototype.globalFilter;
357
- /** @type {?} */
358
- RAWidgetContainer.prototype.data;
359
- /** @type {?} */
360
- RAWidgetContainer.prototype.raDashboardEventBus;
361
- /** @type {?} */
362
- RAWidgetContainer.prototype.appConfig;
363
- /** @type {?} */
364
- RAWidgetContainer.prototype.width;
365
- /** @type {?} */
366
- RAWidgetContainer.prototype.height;
367
- /** @type {?} */
368
- RAWidgetContainer.prototype.widgetDeleted;
369
- /**
370
- * @type {?}
371
- * @private
372
- */
373
- RAWidgetContainer.prototype.dashboardService;
374
- /**
375
- * @type {?}
376
- * @private
377
- */
378
- RAWidgetContainer.prototype.ngxService;
379
- /**
380
- * @type {?}
381
- * @private
382
- */
383
- RAWidgetContainer.prototype.translateService;
384
- /**
385
- * @type {?}
386
- * @private
387
- */
388
- RAWidgetContainer.prototype.ngZone;
389
- /**
390
- * @type {?}
391
- * @private
392
- */
393
- RAWidgetContainer.prototype.notifier;
394
- /**
395
- * @type {?}
396
- * @private
397
- */
398
- RAWidgetContainer.prototype.renderer;
399
- }
400
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmEud2lkZ2V0LmNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2NobmVpZGVyZXNzL2Rhc2hib2FyZGZyYW1ld29yay8iLCJzb3VyY2VzIjpbImxpYi9yYS13aWRnZXQtY29udGFpbmVyL3JhLndpZGdldC5jb250YWluZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFvRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNMLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVExRCxNQUFNLE9BQU8saUJBQWlCOzs7Ozs7Ozs7SUEyQjVCLFlBQW9CLGdCQUFvQyxFQUM5QyxVQUE4QixFQUM5QixnQkFBa0MsRUFDbEMsTUFBYyxFQUNkLFFBQXlCLEVBQ3pCLFFBQW1CO1FBTFQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFvQjtRQUM5QyxlQUFVLEdBQVYsVUFBVSxDQUFvQjtRQUM5QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBOUJ0QixjQUFTLEdBQVksS0FBSyxDQUFDO1FB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QUFTLFNBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs2QkFDeEMsU0FBUyxTQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTsrQkFFN0MsS0FBSyxTQUFDLG9CQUFvQjsyQkFDMUIsS0FBSyxTQUFDLGVBQWU7bUJBQ3JCLEtBQUssU0FBQyxNQUFNO2tDQUNaLEtBQUssU0FBQyxXQUFXO3dCQUNqQixLQUFLLFNBQUMsWUFBWTtvQkFDbEIsS0FBSyxTQUFDLGNBQWM7cUJBQ3BCLEtBQUssU0FBQyxlQUFlOzRCQUVyQixNQUFNOzs7O0lBdEJQLHNDQUFrQzs7Ozs7SUFDbEMsMkNBQXdDOzs7OztJQUN4QywwQ0FBMkI7Ozs7O0lBQzNCLDBDQUEyQjs7Ozs7SUFDM0IsdUNBQWlGOztJQUNqRix5Q0FBNEI7O0lBQzVCLHNDQUFzQzs7SUFDdEMsdUNBQXFDOztJQUNyQyxrREFBOEM7O0lBQzlDLDBDQUFzQzs7SUFFdEMsc0NBQWlFOztJQUNqRSwyQ0FBMkU7O0lBRTNFLDZDQUFzRDs7SUFDdEQseUNBQTBDOztJQUMxQyxpQ0FBeUI7O0lBQ3pCLGdEQUE2RDs7SUFDN0Qsc0NBQTJDOztJQUMzQyxrQ0FBcUM7O0lBQ3JDLG1DQUF1Qzs7SUFFdkMsMENBQXFEOzs7OztJQUd6Qyw2Q0FBNEM7Ozs7O0lBQ3RELHVDQUFzQzs7Ozs7SUFDdEMsNkNBQTBDOzs7OztJQUMxQyxtQ0FBc0I7Ozs7O0lBQ3RCLHFDQUFpQzs7Ozs7SUFDakMscUNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEFmdGVyVmlld0luaXQsIFNpbXBsZUNoYW5nZSwgT25EZXN0cm95LCBOZ1pvbmUsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSYURhc2hib2FyZFNlcnZpY2UgfSBmcm9tICcuLy4uL3JhLmRhc2hib2FyZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUkFEYXNoYm9hcmRFdmVudEJ1cyB9IGZyb20gJy4uL3JhLmRhc2hiYXJkLmV2ZW50LmJ1cyc7XHJcbmltcG9ydCB7IFJBRXZlbnQsIFJBRXZlbnRLZXkgfSBmcm9tICcuLi9yYS5ldmVudC5lbnVtJztcclxuaW1wb3J0IHsgSUFwcENvbmZpZywgSVdpZGdldENvbmZpZ0ZpbHRlciwgSVdpZGdldEluZm8gfSBmcm9tICdAc2NobmVpZGVyZXNzL3dpZGdldGZyYW1ld29yayc7XHJcbmltcG9ydCB7IE5neFVpTG9hZGVyU2VydmljZSB9IGZyb20gJ25neC11aS1sb2FkZXInO1xyXG5pbXBvcnQgeyBOb3RpZmllclNlcnZpY2UgfSBmcm9tICdhbmd1bGFyLW5vdGlmaWVyJztcclxuXHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAc2NobmVpZGVyZXNzL2Vzcy1iYXNlJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3JhLXdpZGdldC1jb250YWluZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9yYS53aWRnZXQuY29udGFpbmVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9yYS53aWRnZXQuY29udGFpbmVyLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUkFXaWRnZXRDb250YWluZXIgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyBzaG93UGFuZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGlzV2lkZ2V0TG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB3aWRnZXRFbGVtZW50OiBhbnk7XHJcbiAgcHJpdmF0ZSBjb25maWdDaGFuZ2VkOiBhbnk7XHJcbiAgcHJpdmF0ZSBpc0lFT3JFZGdlID0gL21zaWVcXHN8dHJpZGVudFxcL3xlZGdlXFwvL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCk7XHJcbiAgcHVibGljIHdpZGdldEhlaWdodDogbnVtYmVyO1xyXG4gIHB1YmxpYyBsb2NrQ2xhc3M6IHN0cmluZyA9IFwidW5sb2NrZWRcIjtcclxuICBwdWJsaWMgbG9ja1N0YXR1czogc3RyaW5nID0gXCJ1bmxvY2tcIjtcclxuICBwdWJsaWMgaXNEb3dubG9hZEljb25WaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGRyb3BEb3duU2hvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnY3RsV2lkZ2V0JywgeyBzdGF0aWM6IGZhbHNlIH0pIGN0bFdpZGdldDogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCd3aWRnZXREcm9wZG93bicsIHsgc3RhdGljOiBmYWxzZSB9KSB3aWRnZXREcm9wZG93bjogRWxlbWVudFJlZjtcclxuXHJcbiAgQElucHV0KCd3aWRnZXQtaW5zdGFuY2UtaWQnKSB3aWRnZXRJbnN0YW5jZUlkOiBudW1iZXI7XHJcbiAgQElucHV0KCdnbG9iYWwtZmlsdGVyJykgZ2xvYmFsRmlsdGVyOiBhbnk7XHJcbiAgQElucHV0KCdkYXRhJykgZGF0YTogYW55O1xyXG4gIEBJbnB1dCgnZXZlbnQtYnVzJykgcmFEYXNoYm9hcmRFdmVudEJ1czogUkFEYXNoYm9hcmRFdmVudEJ1cztcclxuICBASW5wdXQoJ2FwcC1jb25maWcnKSBhcHBDb25maWc6IElBcHBDb25maWc7XHJcbiAgQElucHV0KCd3aWRnZXQtd2lkdGgnKSB3aWR0aDogbnVtYmVyO1xyXG4gIEBJbnB1dCgnd2lkZ2V0LWhlaWdodCcpIGhlaWdodDogbnVtYmVyO1xyXG5cclxuICBAT3V0cHV0KCkgd2lkZ2V0RGVsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXNoYm9hcmRTZXJ2aWNlOiBSYURhc2hib2FyZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5neFNlcnZpY2U6IE5neFVpTG9hZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXHJcbiAgICBwcml2YXRlIG5vdGlmaWVyOiBOb3RpZmllclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcclxuXHJcbiAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKCd3aW5kb3cnLCAnY2xpY2snLChlOkV2ZW50KT0+e1xyXG4gICAgICAgaWYoZS50YXJnZXQgIT09IHRoaXMud2lkZ2V0RHJvcGRvd24ubmF0aXZlRWxlbWVudCApe1xyXG4gICAgICAgIHRoaXMuZHJvcERvd25TaG93biA9IGZhbHNlO1xyXG4gICAgICAgfVxyXG4gICB9KTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXMucmFEYXNoYm9hcmRFdmVudEJ1cyAmJiBjaGFuZ2VzLnJhRGFzaGJvYXJkRXZlbnRCdXMuY3VycmVudFZhbHVlICE9IGNoYW5nZXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnQ2hhbmdlZCA9IHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5zdWJzY3JpYmVXaXRoS2V5KFJBRXZlbnQuQ29uZmlnQ2hhbmdlZCwgUkFFdmVudEtleS5XaWRnZXRJbnN0YW5jZUlkLCB0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXRJbnN0YW5jZUlkLnRvU3RyaW5nKCkpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbmZpZ0NoYW5nZUV2ZW50SGFuZGxlcihlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMud2lkZ2V0RWxlbWVudCAmJiBjaGFuZ2VzLmdsb2JhbEZpbHRlciAmJiBjaGFuZ2VzLmdsb2JhbEZpbHRlci5jdXJyZW50VmFsdWUgIT0gY2hhbmdlcy5nbG9iYWxGaWx0ZXIucHJldmlvdXNWYWx1ZSkge1xyXG5cclxuICAgICAgdGhpcy5yZWZyZXNoV2lkZ2V0KHRoaXMuZGF0YS53aWRnZXRJbmZvKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlcy53aWR0aCAmJiBjaGFuZ2VzLndpZHRoLmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzLndpZHRoLnByZXZpb3VzVmFsdWUgfHxcclxuICAgICAgKGNoYW5nZXMuaGVpZ2h0ICYmIGNoYW5nZXMuaGVpZ2h0LmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzLmhlaWdodC5wcmV2aW91c1ZhbHVlKSkge1xyXG4gICAgICBpZiAodGhpcy53aWRnZXRFbGVtZW50KSB7XHJcbiAgICAgICAgbGV0IHNpemU6IGFueSA9IHt9O1xyXG4gICAgICAgIHNpemUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XHJcbiAgICAgICAgc2l6ZS53aWR0aCA9IHRoaXMud2lkdGg7XHJcbiAgICAgICAgdGhpcy53aWRnZXRFbGVtZW50LndpZGdldFJlc2l6ZWQoc2l6ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5sb2FkV2lkZ2V0KHRoaXMuZGF0YS53aWRnZXRJbmZvKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jb25maWdDaGFuZ2VkKVxyXG4gICAgICB0aGlzLmNvbmZpZ0NoYW5nZWQudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG5cclxuICAvKiogVG8gRWRpdCBjdXJyZW50IHdpZGdldCBjb25maWd1cmF0aW9uKi9cclxuICBwdWJsaWMgZWRpdFdpZGdldCgpIHtcclxuICAgIHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wdWJsaXNoKFJBRXZlbnQuV2lkZ2V0RWRpdENsaWNrZWQsIHRoaXMuZGF0YS53aWRnZXRJbmZvKTtcclxuICB9XHJcblxyXG4gIC8qKiBUbyBEZWxldGUgY3VycmVudCB3aWRnZXQgZnJvbSBET00qL1xyXG4gIHB1YmxpYyBkZWxldGVXaWRnZXQoKSB7XHJcbiAgICBsZXQgd2lkZ2V0Q29udGFpbmVyQ29udGV4dCA9IHRoaXM7XHJcbiAgICB3aWRnZXRDb250YWluZXJDb250ZXh0Lm5neFNlcnZpY2Uuc3RhcnQoKTtcclxuICAgIHdpZGdldENvbnRhaW5lckNvbnRleHQuZGFzaGJvYXJkU2VydmljZS5kZWxldGVXaWRnZXQodGhpcy5kYXRhLndpZGdldEluZm8sIHRoaXMuYXBwQ29uZmlnKS5zdWJzY3JpYmUoc3RhdHVzID0+IHtcclxuICAgICAgd2lkZ2V0Q29udGFpbmVyQ29udGV4dC5uZ3hTZXJ2aWNlLnN0b3AoKTtcclxuICAgICAgaWYgKHN0YXR1cykge1xyXG4gICAgICAgIHdpZGdldENvbnRhaW5lckNvbnRleHQud2lkZ2V0RGVsZXRlZC5lbWl0KHRoaXMuZGF0YS53aWRnZXRJbmZvLndpZGdldEluc3RhbmNlSWQpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHdpZGdldENvbnRhaW5lckNvbnRleHQubm90aWZpZXIubm90aWZ5KCdlcnJvcicsIFwiIFwiICsgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnRmFpbGVkVG9SZW1vdmVXaWRnZXQnKSArIFwiICAoXCIgKyB0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXRUaXRsZSArIFwiKSFcIik7XHJcblxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBUbyBNb3ZlIG9yIGNoYW5nZSBwb3NpdGlvbiBpZiBjdXJyZW50IHdpZGdldCBjb250YWluZXIqL1xyXG4gIHB1YmxpYyBtb3ZlV2lkZ2V0KCkge1xyXG4gICAgdGhpcy5yYURhc2hib2FyZEV2ZW50QnVzLnB1Ymxpc2goUkFFdmVudC5Nb3ZlV2lkZ2V0LCB0aGlzLmRhdGEud2lkZ2V0SW5mbyk7XHJcbiAgICAvLyB0aGlzLmRhc2hib2FyZFNlcnZpY2UubW92ZVdpZGdldCh3aWRnZXRJbmZvKTtcclxuICB9XHJcblxyXG4gIC8qKiBUbyBDb3B5IEN1cnJlbnQgd2lkZ2V0IHdpdGggc2FtZSBjb25maWd1cmF0aW9uKi9cclxuICBwdWJsaWMgY29weVdpZGdldCgpIHtcclxuICAgIHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wdWJsaXNoKFJBRXZlbnQuQ29weVdpZGdldCwgdGhpcy5kYXRhLndpZGdldEluZm8pO1xyXG4gICAgLy90aGlzLmRhc2hib2FyZFNlcnZpY2UuY29weVdpZGdldCh3aWRnZXRJbmZvKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb25maWdDaGFuZ2VFdmVudEhhbmRsZXIod2lkZ2V0SW5mbykge1xyXG4gICAgdGhpcy5kYXRhLndpZGdldEluZm8gPSB3aWRnZXRJbmZvO1xyXG4gICAgdGhpcy5yZWZyZXNoV2lkZ2V0KHRoaXMuZGF0YS53aWRnZXRJbmZvKTtcclxuICAgIC8vIHRoaXMudXBkYXRlV2lkZ2V0KHdpZGdldEluZm8pO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKiAgVG8gbG9hZCBleHRlcm5hbCBjdXN0b20gZWxlbWVudCB0byB0aGUgd2lkZ2V0IGNvbnRhaW5lciovXHJcbiAgYXN5bmMgbG9hZFdpZGdldCh3aWRnZXRJbmZvOiBhbnkpIHtcclxuICAgIGxldCB3aWRnZXRDb25maWdGaWx0ZXIgPSA8SVdpZGdldENvbmZpZ0ZpbHRlcj57XHJcbiAgICAgIGNvbmZpZzogd2lkZ2V0SW5mby53aWRnZXRDb25maWdJbmZvLmNvbmZpZyxcclxuICAgICAgZ2xvYmFsRmlsdGVyOiB0aGlzLmdsb2JhbEZpbHRlclxyXG4gICAgfVxyXG5cclxuICAgIGxldCB3aWRnZXRDb250YWluZXIgPSB0aGlzO1xyXG4gICAgdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmxvYWRFeHRlcm5hbFNjcmlwdCh3aWRnZXRJbmZvLnNjcmlwdFVybCwgKCkgPT4ge1xyXG5cclxuICAgICAgd2lkZ2V0Q29udGFpbmVyLndpZGdldEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHdpZGdldEluZm8uY3VzdG9tVGFnKTtcclxuICAgICAgd2lkZ2V0Q29udGFpbmVyLndpZGdldEVsZW1lbnQuc2V0QXR0cmlidXRlKFwid2lkZ2V0LWluc3RhbmNlLWlkXCIsIHdpZGdldEluZm8ud2lkZ2V0SW5zdGFuY2VJZCk7XHJcblxyXG4gICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ3dpZGdldGluaXRpYXRlZCcgKyB3aWRnZXRJbmZvLndpZGdldEluc3RhbmNlSWQsIGFzeW5jICgpID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIHRoaXMud2lkZ2V0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdvbi1kYXRhLWxvYWQnLCAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlLmRldGFpbClcclxuICAgICAgICAgICAgICB0aGlzLnNob3dQYW5lbCA9IHRydWU7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICB0aGlzLnNob3dQYW5lbCA9IGZhbHNlO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgd2lkZ2V0Q29udGFpbmVyLmlzV2lkZ2V0TG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICAgIHdpZGdldENvbmZpZ0ZpbHRlci5hcHBDb25maWcgPSB0aGlzLmFwcENvbmZpZztcclxuICAgICAgICAgIHdpZGdldENvbmZpZ0ZpbHRlci53aWRnZXRJbmZvID0gPElXaWRnZXRJbmZvPnt9O1xyXG4gICAgICAgICAgd2lkZ2V0Q29uZmlnRmlsdGVyLndpZGdldEluZm8ud2lkZ2V0TmFtZSA9IHdpZGdldEluZm8ud2lkZ2V0TmFtZTtcclxuICAgICAgICAgIHdpZGdldENvbnRhaW5lci53aWRnZXRFbGVtZW50LmxvYWRDb250ZW50KHdpZGdldENvbmZpZ0ZpbHRlcik7XHJcbiAgICAgICAgICBhd2FpdCB3aWRnZXRDb250YWluZXIuc2V0TG9jayh3aWRnZXRDb25maWdGaWx0ZXIuY29uZmlnKTtcclxuICAgICAgICAgIGF3YWl0IHdpZGdldENvbnRhaW5lci5zZXREb3dubG9hZEljb24oKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5jdGxXaWRnZXQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLndpZGdldEVsZW1lbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogVG8gcmVmcmVzaCB3aWRnZXQgb24gaW5wdXQgY29uZmlnIGNoYW5nZXMgKi9cclxuICBhc3luYyByZWZyZXNoV2lkZ2V0KHdpZGdldEluZm86IElXaWRnZXRJbmZvKSB7XHJcbiAgICBsZXQgd2lkZ2V0Q29udGFpbmVyQ29udGV4dCA9IHRoaXM7XHJcbiAgICBsZXQgd2lkZ2V0Q29uZmlnRmlsdGVyID0gPElXaWRnZXRDb25maWdGaWx0ZXI+e1xyXG4gICAgICBjb25maWc6IHdpZGdldEluZm8ud2lkZ2V0Q29uZmlnSW5mby5jb25maWcsXHJcbiAgICAgIGdsb2JhbEZpbHRlcjogdGhpcy5nbG9iYWxGaWx0ZXIsXHJcbiAgICAgIGFwcENvbmZpZzogdGhpcy5hcHBDb25maWcsXHJcbiAgICAgIHdpZGdldEluZm86IHdpZGdldEluZm9cclxuICAgIH1cclxuICAgIGlmICh3aWRnZXRDb250YWluZXJDb250ZXh0LmlzV2lkZ2V0TG9hZGVkKSB7XHJcbiAgICAgIHdpZGdldENvbnRhaW5lckNvbnRleHQud2lkZ2V0RWxlbWVudC5sb2FkQ29udGVudCh3aWRnZXRDb25maWdGaWx0ZXIpO1xyXG4gICAgICBhd2FpdCB0aGlzLnNldExvY2sod2lkZ2V0Q29uZmlnRmlsdGVyLmNvbmZpZyk7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2V0RG93bmxvYWRJY29uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNldExvY2soY29uZmlnOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubG9ja1N0YXR1cyA9IGF3YWl0IHRoaXMud2lkZ2V0RWxlbWVudC5sb2FkTG9ja1N0YXR1cyhjb25maWcpO1xyXG4gICAgaWYgKHRoaXMubG9ja1N0YXR1cykge1xyXG4gICAgICBzd2l0Y2ggKHRoaXMubG9ja1N0YXR1cykge1xyXG4gICAgICAgIGNhc2UgXCJsb2NrXCI6IHtcclxuICAgICAgICAgIHRoaXMubG9ja0NsYXNzID0gXCJmYSBmYS1sb2NrIGxvY2tlZFwiO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgXCJ1bmxvY2tcIjoge1xyXG4gICAgICAgICAgdGhpcy5sb2NrQ2xhc3MgPSBcInVubG9ja2VkXCI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBcInBhcnRpYWxsb2NrXCI6IHtcclxuICAgICAgICAgIHRoaXMubG9ja0NsYXNzID0gXCJmYSBmYS1sb2NrIHBhcnRpYWxsb2NrZWRcIjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICB0aGlzLmxvY2tDbGFzcyA9IFwidW5sb2NrZWRcIjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzZXREb3dubG9hZEljb24oKSB7XHJcbiAgICAvLyB0aGlzLmlzRG93bmxvYWRJY29uVmlzaWJsZSA9IGF3YWl0IHRoaXMud2lkZ2V0RWxlbWVudC5pc0Rvd25sb2FkVmlzaWJsZSgpO1xyXG4gICAgdGhpcy5pc0Rvd25sb2FkSWNvblZpc2libGUgPSBmYWxzZTsvL3RlbXAuIGNvbW1lbnRlZFxyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkb3dubG9hZENsaWNrZWQoKSB7XHJcbiAgICAvL3RoaXMud2lkZ2V0RWxlbWVudC5pc0Rvd25sb2FkVmlzaWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqU2hvdyBkcm9wZG93biBvbiBnZWFyIGljb24gY2xpY2sgICovXHJcbiAgcHVibGljIHNob3dEcm9wRG93bigpIHtcclxuICAgIHRoaXMuZHJvcERvd25TaG93biA9ICF0aGlzLmRyb3BEb3duU2hvd247XHJcbiAgfVxyXG5cclxuICAvKipIaWRlIGRyb3Bkb3duIG9uIG91dHNpZGUgY2xpY2sgKi9cclxuICBwdWJsaWMgaGlkZURyb3BEb3duKCkge1xyXG4gICAgaWYodGhpcy5kcm9wRG93blNob3duKVxyXG4gICAgICB0aGlzLmRyb3BEb3duU2hvd24gPSBmYWxzZTtcclxuICB9XHJcbn1cclxuIl19
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import * as tslib_1 from "tslib";
6
+ import { Component, Input, ViewChild, ElementRef, EventEmitter, Output, NgZone, Renderer2 } from '@angular/core';
7
+ import { RaDashboardService } from './../ra.dashboard.service';
8
+ import { RADashboardEventBus } from '../ra.dashbard.event.bus';
9
+ import { RAEvent, RAEventKey } from '../ra.event.enum';
10
+ import { NgxUiLoaderService } from 'ngx-ui-loader';
11
+ import { NotifierService } from 'angular-notifier';
12
+ import { RATranslateService } from '@schneideress/ra-common';
13
+ export class RAWidgetContainer {
14
+ /**
15
+ * @param {?} dashboardService
16
+ * @param {?} ngxService
17
+ * @param {?} translateService
18
+ * @param {?} ngZone
19
+ * @param {?} notifier
20
+ * @param {?} renderer
21
+ */
22
+ constructor(dashboardService, ngxService, translateService, ngZone, notifier, renderer) {
23
+ this.dashboardService = dashboardService;
24
+ this.ngxService = ngxService;
25
+ this.translateService = translateService;
26
+ this.ngZone = ngZone;
27
+ this.notifier = notifier;
28
+ this.renderer = renderer;
29
+ this.showPanel = false;
30
+ this.isWidgetLoaded = false;
31
+ this.isIEOrEdge = /msie\s|trident\/|edge\//i.test(window.navigator.userAgent);
32
+ this.lockClass = "unlocked";
33
+ this.lockStatus = "unlock";
34
+ this.isDownloadIconVisible = false;
35
+ this.dropDownShown = false;
36
+ this.widgetDeleted = new EventEmitter();
37
+ this.renderer.listen('window', 'click', (/**
38
+ * @param {?} e
39
+ * @return {?}
40
+ */
41
+ (e) => {
42
+ if (e.target !== this.widgetDropdown.nativeElement) {
43
+ this.dropDownShown = false;
44
+ }
45
+ }));
46
+ }
47
+ /**
48
+ * @param {?} changes
49
+ * @return {?}
50
+ */
51
+ ngOnChanges(changes) {
52
+ if (changes.raDashboardEventBus && changes.raDashboardEventBus.currentValue != changes.raDashboardEventBus.previousValue) {
53
+ this.configChanged = this.raDashboardEventBus.subscribeWithKey(RAEvent.ConfigChanged, RAEventKey.WidgetInstanceId, this.data.widgetInfo.widgetInstanceId.toString()).subscribe((/**
54
+ * @param {?} e
55
+ * @return {?}
56
+ */
57
+ (e) => {
58
+ this.ngZone.run((/**
59
+ * @return {?}
60
+ */
61
+ () => {
62
+ this.configChangeEventHandler(e);
63
+ }));
64
+ }));
65
+ }
66
+ if (this.widgetElement && changes.globalFilter && changes.globalFilter.currentValue != changes.globalFilter.previousValue) {
67
+ this.refreshWidget(this.data.widgetInfo);
68
+ }
69
+ if (changes.width && changes.width.currentValue != changes.width.previousValue ||
70
+ (changes.height && changes.height.currentValue != changes.height.previousValue)) {
71
+ if (this.widgetElement) {
72
+ /** @type {?} */
73
+ let size = {};
74
+ size.height = this.height;
75
+ size.width = this.width;
76
+ this.widgetElement.widgetResized(size);
77
+ }
78
+ }
79
+ }
80
+ /**
81
+ * @return {?}
82
+ */
83
+ ngAfterViewInit() {
84
+ setTimeout((/**
85
+ * @return {?}
86
+ */
87
+ () => {
88
+ this.loadWidget(this.data.widgetInfo);
89
+ }));
90
+ }
91
+ /**
92
+ * @return {?}
93
+ */
94
+ ngOnDestroy() {
95
+ if (this.configChanged)
96
+ this.configChanged.unsubscribe();
97
+ }
98
+ /**
99
+ * To Edit current widget configuration
100
+ * @return {?}
101
+ */
102
+ editWidget() {
103
+ this.raDashboardEventBus.publish(RAEvent.WidgetEditClicked, this.data.widgetInfo);
104
+ }
105
+ /**
106
+ * To Delete current widget from DOM
107
+ * @return {?}
108
+ */
109
+ deleteWidget() {
110
+ /** @type {?} */
111
+ let widgetContainerContext = this;
112
+ widgetContainerContext.ngxService.start();
113
+ widgetContainerContext.dashboardService.deleteWidget(this.data.widgetInfo, this.appConfig).subscribe((/**
114
+ * @param {?} status
115
+ * @return {?}
116
+ */
117
+ status => {
118
+ widgetContainerContext.ngxService.stop();
119
+ if (status) {
120
+ widgetContainerContext.widgetDeleted.emit(this.data.widgetInfo.widgetInstanceId);
121
+ }
122
+ else {
123
+ widgetContainerContext.notifier.notify('error', " " + this.translateService.translate('FailedToRemoveWidget') + " (" + this.data.widgetInfo.widgetTitle + ")!");
124
+ }
125
+ }));
126
+ }
127
+ /**
128
+ * To Move or change position if current widget container
129
+ * @return {?}
130
+ */
131
+ moveWidget() {
132
+ this.raDashboardEventBus.publish(RAEvent.MoveWidget, this.data.widgetInfo);
133
+ // this.dashboardService.moveWidget(widgetInfo);
134
+ }
135
+ /**
136
+ * To Copy Current widget with same configuration
137
+ * @return {?}
138
+ */
139
+ copyWidget() {
140
+ this.raDashboardEventBus.publish(RAEvent.CopyWidget, this.data.widgetInfo);
141
+ //this.dashboardService.copyWidget(widgetInfo);
142
+ }
143
+ /**
144
+ * @param {?} widgetInfo
145
+ * @return {?}
146
+ */
147
+ configChangeEventHandler(widgetInfo) {
148
+ this.data.widgetInfo = widgetInfo;
149
+ this.refreshWidget(this.data.widgetInfo);
150
+ // this.updateWidget(widgetInfo);
151
+ }
152
+ /**
153
+ * To load external custom element to the widget container
154
+ * @param {?} widgetInfo
155
+ * @return {?}
156
+ */
157
+ loadWidget(widgetInfo) {
158
+ return tslib_1.__awaiter(this, void 0, void 0, /** @this {!RAWidgetContainer} */ function* () {
159
+ /** @type {?} */
160
+ let widgetConfigFilter = (/** @type {?} */ ({
161
+ config: widgetInfo.widgetConfigInfo.config,
162
+ globalFilter: this.globalFilter
163
+ }));
164
+ /** @type {?} */
165
+ let widgetContainer = this;
166
+ this.dashboardService.loadExternalScript(widgetInfo.scriptUrl, (/**
167
+ * @return {?}
168
+ */
169
+ () => {
170
+ widgetContainer.widgetElement = document.createElement(widgetInfo.customTag);
171
+ widgetContainer.widgetElement.setAttribute("widget-instance-id", widgetInfo.widgetInstanceId);
172
+ document.body.addEventListener('widgetinitiated' + widgetInfo.widgetInstanceId, (/**
173
+ * @return {?}
174
+ */
175
+ () => tslib_1.__awaiter(this, void 0, void 0, /** @this {!RAWidgetContainer} */ function* () {
176
+ setTimeout((/**
177
+ * @return {?}
178
+ */
179
+ () => tslib_1.__awaiter(this, void 0, void 0, /** @this {!RAWidgetContainer} */ function* () {
180
+ this.widgetElement.addEventListener('on-data-load', (/**
181
+ * @param {?} e
182
+ * @return {?}
183
+ */
184
+ (e) => {
185
+ if (e.detail)
186
+ this.showPanel = true;
187
+ else
188
+ this.showPanel = false;
189
+ }));
190
+ widgetContainer.isWidgetLoaded = true;
191
+ widgetConfigFilter.appConfig = this.appConfig;
192
+ widgetConfigFilter.widgetInfo = (/** @type {?} */ ({}));
193
+ widgetConfigFilter.widgetInfo.widgetName = widgetInfo.widgetName;
194
+ widgetContainer.widgetElement.loadContent(widgetConfigFilter);
195
+ yield widgetContainer.setLock(widgetConfigFilter.config);
196
+ yield widgetContainer.setDownloadIcon();
197
+ })));
198
+ })));
199
+ this.ctlWidget.nativeElement.appendChild(this.widgetElement);
200
+ }));
201
+ });
202
+ }
203
+ /**
204
+ * To refresh widget on input config changes
205
+ * @param {?} widgetInfo
206
+ * @return {?}
207
+ */
208
+ refreshWidget(widgetInfo) {
209
+ return tslib_1.__awaiter(this, void 0, void 0, /** @this {!RAWidgetContainer} */ function* () {
210
+ /** @type {?} */
211
+ let widgetContainerContext = this;
212
+ /** @type {?} */
213
+ let widgetConfigFilter = (/** @type {?} */ ({
214
+ config: widgetInfo.widgetConfigInfo.config,
215
+ globalFilter: this.globalFilter,
216
+ appConfig: this.appConfig,
217
+ widgetInfo: widgetInfo
218
+ }));
219
+ if (widgetContainerContext.isWidgetLoaded) {
220
+ widgetContainerContext.widgetElement.loadContent(widgetConfigFilter);
221
+ yield this.setLock(widgetConfigFilter.config);
222
+ yield this.setDownloadIcon();
223
+ }
224
+ });
225
+ }
226
+ /**
227
+ * @private
228
+ * @param {?} config
229
+ * @return {?}
230
+ */
231
+ setLock(config) {
232
+ return tslib_1.__awaiter(this, void 0, void 0, /** @this {!RAWidgetContainer} */ function* () {
233
+ this.lockStatus = yield this.widgetElement.loadLockStatus(config);
234
+ if (this.lockStatus) {
235
+ switch (this.lockStatus) {
236
+ case "lock": {
237
+ this.lockClass = "fa fa-lock locked";
238
+ break;
239
+ }
240
+ case "unlock": {
241
+ this.lockClass = "unlocked";
242
+ break;
243
+ }
244
+ case "partiallock": {
245
+ this.lockClass = "fa fa-lock partiallocked";
246
+ break;
247
+ }
248
+ default: {
249
+ this.lockClass = "unlocked";
250
+ break;
251
+ }
252
+ }
253
+ }
254
+ });
255
+ }
256
+ /**
257
+ * @private
258
+ * @return {?}
259
+ */
260
+ setDownloadIcon() {
261
+ return tslib_1.__awaiter(this, void 0, void 0, /** @this {!RAWidgetContainer} */ function* () {
262
+ // this.isDownloadIconVisible = await this.widgetElement.isDownloadVisible();
263
+ this.isDownloadIconVisible = false; //temp. commented
264
+ });
265
+ }
266
+ /**
267
+ * @return {?}
268
+ */
269
+ downloadClicked() {
270
+ //this.widgetElement.isDownloadVisible();
271
+ }
272
+ /**
273
+ * Show dropdown on gear icon click
274
+ * @return {?}
275
+ */
276
+ showDropDown() {
277
+ this.dropDownShown = !this.dropDownShown;
278
+ }
279
+ /**
280
+ * Hide dropdown on outside click
281
+ * @return {?}
282
+ */
283
+ hideDropDown() {
284
+ if (this.dropDownShown)
285
+ this.dropDownShown = false;
286
+ }
287
+ }
288
+ RAWidgetContainer.decorators = [
289
+ { type: Component, args: [{
290
+ selector: 'ra-widget-container',
291
+ template: "<div class=\"wc-wrapper\" (mouseleave) =\"hideDropDown()\">\n <div class=\"wcheader widget-move\">\n <div class=\"col-md-12 wc-mover\" style=\"padding-left: 0px;height:inherit;\">\n <div style=\"display:flex;margin-top:10px;\">\n <div class=\"col-md-11 float-left\" style=\"width:96%;padding-left: 0px\">{{data.widgetInfo.widgetTitle}}\n </div>\n <div class=\"col-md-1\" style=\"cursor:default;\">\n <div class=\"float-right\" style=\"display: flex;\">\n <div *ngIf=\"isDownloadIconVisible\"> <i class=\"far fa-download\" (click)=\"downloadClicked\"></i></div>\n <div class=\"pr-3\"><i [ngClass]=\"lockClass\"\n [attr.title]=\"lockStatus=='lock' ? 'Locked' : 'Partially Locked'\"></i></div>\n <div class=\"dropdown\">\n <div class=\"dropbtn gearIcon\"> <i #widgetDropdown class=\"fal fa-cog\" (click)=\"showDropDown()\"></i></div>\n <div class=\"dropdown-content widget-config-item\" [ngClass]=\"{'dropdown-click': dropDownShown}\">\n <a (click)=\"editWidget()\">\n <i class=\"fal fa-edit\"></i>\n <span>{{'Edit'|translate}}</span>\n </a>\n <a (click)=\"copyWidget()\">\n <i class=\"fal fa-copy\"></i>\n <span>{{'Copy'|translate}}</span>\n </a>\n <a (click)=\"moveWidget()\">\n <i class=\"fal fa-arrows-alt\"></i>\n <span>{{'Move'|translate}}</span>\n </a>\n <hr class=\"hr\">\n <a (click)=\"deleteWidget()\">\n <i class=\"fal fa-times\" style=\"padding-left: 3px;\"></i>\n <span>{{'Delete'|translate}}</span>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"wcBody\">\n <div class=\"m-fadeOut widget-overlay\" [ngClass]=\"{'m-fadeIn': showPanel}\">\n <div class=\"lds-roller\">\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n </div>\n </div>\n <perfect-scrollbar [scrollIndicators]=\"true\">\n <div #ctlWidget></div>\n </perfect-scrollbar>\n </div>\n</div>",
292
+ styles: [".wcheader{width:100%;height:24px;background:#fff;color:#3dcd58;font-family:\"Arial Rounded MT\";font-size:16px;position:absolute;left:0;top:0}.wc-wrapper{height:100%;position:relative;margin:auto 15px}.wc-mover{cursor:all-scroll}.wcBody{width:100%;position:absolute;top:46px;left:0;bottom:0}.wcBodyBorder{border:1px dashed #e6e2e2}.sp_icon{float:left;margin:0 15% 0 0}.dropbtn{cursor:pointer;color:#42b4e6}.dropdown{visibility:hidden;opacity:0;-webkit-transition:visibility,opacity .5s linear;transition:visibility,opacity .5s linear;position:relative}.dropdown hr{margin:0!important}.dropdown-content{display:none;position:absolute;right:0;background-color:#f9f9f9;min-width:100px;box-shadow:0 8px 16px 8px rgba(0,0,0,.2);z-index:2;font-size:12px;font-weight:400}.dropdown-content a{color:#000;padding:5px 16px;text-decoration:none;display:block;cursor:pointer}.dropdown-content a:hover{background-color:#f1f1f1}.dropdown-click{display:block;-webkit-animation:.3s ease-out slide-down;animation:.3s ease-out slide-down}.dropdown:hover .dropdown-content{color:#fff}.wc-wrapper:hover .dropdown{visibility:visible;opacity:1}.gearIcon{color:#42b4e6}.hr{border:0;border-top:1px solid rgba(0,0,0,.1)}@keyframes slide-down{0%{opacity:0;-webkit-transform:translateY(-20%);transform:translateY(-20%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slide-down{0%{opacity:0;-webkit-transform:translateY(-20%)}100%{opacity:1;-webkit-transform:translateY(0)}}.widget-config-item i{font-size:17px;color:#42b4e6}.widget-config-item span{font-size:12px;font:inherit;padding-left:12px;color:#42b4e6}.locked{color:#42b4e6}.partiallocked{color:#a0d9f2}.unlocked{display:none}"]
293
+ }] }
294
+ ];
295
+ /** @nocollapse */
296
+ RAWidgetContainer.ctorParameters = () => [
297
+ { type: RaDashboardService },
298
+ { type: NgxUiLoaderService },
299
+ { type: RATranslateService },
300
+ { type: NgZone },
301
+ { type: NotifierService },
302
+ { type: Renderer2 }
303
+ ];
304
+ RAWidgetContainer.propDecorators = {
305
+ ctlWidget: [{ type: ViewChild, args: ['ctlWidget', { static: false },] }],
306
+ widgetDropdown: [{ type: ViewChild, args: ['widgetDropdown', { static: false },] }],
307
+ widgetInstanceId: [{ type: Input, args: ['widget-instance-id',] }],
308
+ globalFilter: [{ type: Input, args: ['global-filter',] }],
309
+ data: [{ type: Input, args: ['data',] }],
310
+ raDashboardEventBus: [{ type: Input, args: ['event-bus',] }],
311
+ appConfig: [{ type: Input, args: ['app-config',] }],
312
+ width: [{ type: Input, args: ['widget-width',] }],
313
+ height: [{ type: Input, args: ['widget-height',] }],
314
+ widgetDeleted: [{ type: Output }]
315
+ };
316
+ if (false) {
317
+ /** @type {?} */
318
+ RAWidgetContainer.prototype.showPanel;
319
+ /**
320
+ * @type {?}
321
+ * @private
322
+ */
323
+ RAWidgetContainer.prototype.isWidgetLoaded;
324
+ /**
325
+ * @type {?}
326
+ * @private
327
+ */
328
+ RAWidgetContainer.prototype.widgetElement;
329
+ /**
330
+ * @type {?}
331
+ * @private
332
+ */
333
+ RAWidgetContainer.prototype.configChanged;
334
+ /**
335
+ * @type {?}
336
+ * @private
337
+ */
338
+ RAWidgetContainer.prototype.isIEOrEdge;
339
+ /** @type {?} */
340
+ RAWidgetContainer.prototype.widgetHeight;
341
+ /** @type {?} */
342
+ RAWidgetContainer.prototype.lockClass;
343
+ /** @type {?} */
344
+ RAWidgetContainer.prototype.lockStatus;
345
+ /** @type {?} */
346
+ RAWidgetContainer.prototype.isDownloadIconVisible;
347
+ /** @type {?} */
348
+ RAWidgetContainer.prototype.dropDownShown;
349
+ /** @type {?} */
350
+ RAWidgetContainer.prototype.ctlWidget;
351
+ /** @type {?} */
352
+ RAWidgetContainer.prototype.widgetDropdown;
353
+ /** @type {?} */
354
+ RAWidgetContainer.prototype.widgetInstanceId;
355
+ /** @type {?} */
356
+ RAWidgetContainer.prototype.globalFilter;
357
+ /** @type {?} */
358
+ RAWidgetContainer.prototype.data;
359
+ /** @type {?} */
360
+ RAWidgetContainer.prototype.raDashboardEventBus;
361
+ /** @type {?} */
362
+ RAWidgetContainer.prototype.appConfig;
363
+ /** @type {?} */
364
+ RAWidgetContainer.prototype.width;
365
+ /** @type {?} */
366
+ RAWidgetContainer.prototype.height;
367
+ /** @type {?} */
368
+ RAWidgetContainer.prototype.widgetDeleted;
369
+ /**
370
+ * @type {?}
371
+ * @private
372
+ */
373
+ RAWidgetContainer.prototype.dashboardService;
374
+ /**
375
+ * @type {?}
376
+ * @private
377
+ */
378
+ RAWidgetContainer.prototype.ngxService;
379
+ /**
380
+ * @type {?}
381
+ * @private
382
+ */
383
+ RAWidgetContainer.prototype.translateService;
384
+ /**
385
+ * @type {?}
386
+ * @private
387
+ */
388
+ RAWidgetContainer.prototype.ngZone;
389
+ /**
390
+ * @type {?}
391
+ * @private
392
+ */
393
+ RAWidgetContainer.prototype.notifier;
394
+ /**
395
+ * @type {?}
396
+ * @private
397
+ */
398
+ RAWidgetContainer.prototype.renderer;
399
+ }
400
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmEud2lkZ2V0LmNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2NobmVpZGVyZXNzL2Rhc2hib2FyZGZyYW1ld29yay8iLCJzb3VyY2VzIjpbImxpYi9yYS13aWRnZXQtY29udGFpbmVyL3JhLndpZGdldC5jb250YWluZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFvRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNMLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVE3RCxNQUFNLE9BQU8saUJBQWlCOzs7Ozs7Ozs7SUEyQjVCLFlBQW9CLGdCQUFvQyxFQUM5QyxVQUE4QixFQUM5QixnQkFBb0MsRUFDcEMsTUFBYyxFQUNkLFFBQXlCLEVBQ3pCLFFBQW1CO1FBTFQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFvQjtRQUM5QyxlQUFVLEdBQVYsVUFBVSxDQUFvQjtRQUM5QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW9CO1FBQ3BDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBOUJ0QixjQUFTLEdBQVksS0FBSyxDQUFDO1FB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QUFTLFNBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs2QkFDeEMsU0FBUyxTQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTsrQkFFN0MsS0FBSyxTQUFDLG9CQUFvQjsyQkFDMUIsS0FBSyxTQUFDLGVBQWU7bUJBQ3JCLEtBQUssU0FBQyxNQUFNO2tDQUNaLEtBQUssU0FBQyxXQUFXO3dCQUNqQixLQUFLLFNBQUMsWUFBWTtvQkFDbEIsS0FBSyxTQUFDLGNBQWM7cUJBQ3BCLEtBQUssU0FBQyxlQUFlOzRCQUVyQixNQUFNOzs7O0lBdEJQLHNDQUFrQzs7Ozs7SUFDbEMsMkNBQXdDOzs7OztJQUN4QywwQ0FBMkI7Ozs7O0lBQzNCLDBDQUEyQjs7Ozs7SUFDM0IsdUNBQWlGOztJQUNqRix5Q0FBNEI7O0lBQzVCLHNDQUFzQzs7SUFDdEMsdUNBQXFDOztJQUNyQyxrREFBOEM7O0lBQzlDLDBDQUFzQzs7SUFFdEMsc0NBQWlFOztJQUNqRSwyQ0FBMkU7O0lBRTNFLDZDQUFzRDs7SUFDdEQseUNBQTBDOztJQUMxQyxpQ0FBeUI7O0lBQ3pCLGdEQUE2RDs7SUFDN0Qsc0NBQTJDOztJQUMzQyxrQ0FBcUM7O0lBQ3JDLG1DQUF1Qzs7SUFFdkMsMENBQXFEOzs7OztJQUd6Qyw2Q0FBNEM7Ozs7O0lBQ3RELHVDQUFzQzs7Ozs7SUFDdEMsNkNBQTRDOzs7OztJQUM1QyxtQ0FBc0I7Ozs7O0lBQ3RCLHFDQUFpQzs7Ozs7SUFDakMscUNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEFmdGVyVmlld0luaXQsIFNpbXBsZUNoYW5nZSwgT25EZXN0cm95LCBOZ1pvbmUsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmFEYXNoYm9hcmRTZXJ2aWNlIH0gZnJvbSAnLi8uLi9yYS5kYXNoYm9hcmQuc2VydmljZSc7XG5pbXBvcnQgeyBSQURhc2hib2FyZEV2ZW50QnVzIH0gZnJvbSAnLi4vcmEuZGFzaGJhcmQuZXZlbnQuYnVzJztcbmltcG9ydCB7IFJBRXZlbnQsIFJBRXZlbnRLZXkgfSBmcm9tICcuLi9yYS5ldmVudC5lbnVtJztcbmltcG9ydCB7IElBcHBDb25maWcsIElXaWRnZXRDb25maWdGaWx0ZXIsIElXaWRnZXRJbmZvIH0gZnJvbSAnQHNjaG5laWRlcmVzcy93aWRnZXRmcmFtZXdvcmsnO1xuaW1wb3J0IHsgTmd4VWlMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnbmd4LXVpLWxvYWRlcic7XG5pbXBvcnQgeyBOb3RpZmllclNlcnZpY2UgfSBmcm9tICdhbmd1bGFyLW5vdGlmaWVyJztcblxuaW1wb3J0IHsgUkFUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQHNjaG5laWRlcmVzcy9yYS1jb21tb24nO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JhLXdpZGdldC1jb250YWluZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcmEud2lkZ2V0LmNvbnRhaW5lci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JhLndpZGdldC5jb250YWluZXIuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJBV2lkZ2V0Q29udGFpbmVyIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyBzaG93UGFuZWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc1dpZGdldExvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHdpZGdldEVsZW1lbnQ6IGFueTtcbiAgcHJpdmF0ZSBjb25maWdDaGFuZ2VkOiBhbnk7XG4gIHByaXZhdGUgaXNJRU9yRWRnZSA9IC9tc2llXFxzfHRyaWRlbnRcXC98ZWRnZVxcLy9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xuICBwdWJsaWMgd2lkZ2V0SGVpZ2h0OiBudW1iZXI7XG4gIHB1YmxpYyBsb2NrQ2xhc3M6IHN0cmluZyA9IFwidW5sb2NrZWRcIjtcbiAgcHVibGljIGxvY2tTdGF0dXM6IHN0cmluZyA9IFwidW5sb2NrXCI7XG4gIHB1YmxpYyBpc0Rvd25sb2FkSWNvblZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGRyb3BEb3duU2hvd246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdjdGxXaWRnZXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgY3RsV2lkZ2V0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd3aWRnZXREcm9wZG93bicsIHsgc3RhdGljOiBmYWxzZSB9KSB3aWRnZXREcm9wZG93bjogRWxlbWVudFJlZjtcblxuICBASW5wdXQoJ3dpZGdldC1pbnN0YW5jZS1pZCcpIHdpZGdldEluc3RhbmNlSWQ6IG51bWJlcjtcbiAgQElucHV0KCdnbG9iYWwtZmlsdGVyJykgZ2xvYmFsRmlsdGVyOiBhbnk7XG4gIEBJbnB1dCgnZGF0YScpIGRhdGE6IGFueTtcbiAgQElucHV0KCdldmVudC1idXMnKSByYURhc2hib2FyZEV2ZW50QnVzOiBSQURhc2hib2FyZEV2ZW50QnVzO1xuICBASW5wdXQoJ2FwcC1jb25maWcnKSBhcHBDb25maWc6IElBcHBDb25maWc7XG4gIEBJbnB1dCgnd2lkZ2V0LXdpZHRoJykgd2lkdGg6IG51bWJlcjtcbiAgQElucHV0KCd3aWRnZXQtaGVpZ2h0JykgaGVpZ2h0OiBudW1iZXI7XG5cbiAgQE91dHB1dCgpIHdpZGdldERlbGV0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGFzaGJvYXJkU2VydmljZTogUmFEYXNoYm9hcmRTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmd4U2VydmljZTogTmd4VWlMb2FkZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogUkFUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBub3RpZmllcjogTm90aWZpZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuXG4gICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ2NsaWNrJywoZTpFdmVudCk9PntcbiAgICAgICBpZihlLnRhcmdldCAhPT0gdGhpcy53aWRnZXREcm9wZG93bi5uYXRpdmVFbGVtZW50ICl7XG4gICAgICAgIHRoaXMuZHJvcERvd25TaG93biA9IGZhbHNlO1xuICAgICAgIH1cbiAgIH0pO1xuXG5cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5yYURhc2hib2FyZEV2ZW50QnVzICYmIGNoYW5nZXMucmFEYXNoYm9hcmRFdmVudEJ1cy5jdXJyZW50VmFsdWUgIT0gY2hhbmdlcy5yYURhc2hib2FyZEV2ZW50QnVzLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMuY29uZmlnQ2hhbmdlZCA9IHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5zdWJzY3JpYmVXaXRoS2V5KFJBRXZlbnQuQ29uZmlnQ2hhbmdlZCwgUkFFdmVudEtleS5XaWRnZXRJbnN0YW5jZUlkLCB0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXRJbnN0YW5jZUlkLnRvU3RyaW5nKCkpLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29uZmlnQ2hhbmdlRXZlbnRIYW5kbGVyKGUpO1xuICAgICAgICB9KTtcblxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLndpZGdldEVsZW1lbnQgJiYgY2hhbmdlcy5nbG9iYWxGaWx0ZXIgJiYgY2hhbmdlcy5nbG9iYWxGaWx0ZXIuY3VycmVudFZhbHVlICE9IGNoYW5nZXMuZ2xvYmFsRmlsdGVyLnByZXZpb3VzVmFsdWUpIHtcblxuICAgICAgdGhpcy5yZWZyZXNoV2lkZ2V0KHRoaXMuZGF0YS53aWRnZXRJbmZvKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy53aWR0aCAmJiBjaGFuZ2VzLndpZHRoLmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzLndpZHRoLnByZXZpb3VzVmFsdWUgfHxcbiAgICAgIChjaGFuZ2VzLmhlaWdodCAmJiBjaGFuZ2VzLmhlaWdodC5jdXJyZW50VmFsdWUgIT0gY2hhbmdlcy5oZWlnaHQucHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgIGlmICh0aGlzLndpZGdldEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHNpemU6IGFueSA9IHt9O1xuICAgICAgICBzaXplLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICBzaXplLndpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgdGhpcy53aWRnZXRFbGVtZW50LndpZGdldFJlc2l6ZWQoc2l6ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxvYWRXaWRnZXQodGhpcy5kYXRhLndpZGdldEluZm8pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnQ2hhbmdlZClcbiAgICAgIHRoaXMuY29uZmlnQ2hhbmdlZC51bnN1YnNjcmliZSgpO1xuICB9XG5cblxuICAvKiogVG8gRWRpdCBjdXJyZW50IHdpZGdldCBjb25maWd1cmF0aW9uKi9cbiAgcHVibGljIGVkaXRXaWRnZXQoKSB7XG4gICAgdGhpcy5yYURhc2hib2FyZEV2ZW50QnVzLnB1Ymxpc2goUkFFdmVudC5XaWRnZXRFZGl0Q2xpY2tlZCwgdGhpcy5kYXRhLndpZGdldEluZm8pO1xuICB9XG5cbiAgLyoqIFRvIERlbGV0ZSBjdXJyZW50IHdpZGdldCBmcm9tIERPTSovXG4gIHB1YmxpYyBkZWxldGVXaWRnZXQoKSB7XG4gICAgbGV0IHdpZGdldENvbnRhaW5lckNvbnRleHQgPSB0aGlzO1xuICAgIHdpZGdldENvbnRhaW5lckNvbnRleHQubmd4U2VydmljZS5zdGFydCgpO1xuICAgIHdpZGdldENvbnRhaW5lckNvbnRleHQuZGFzaGJvYXJkU2VydmljZS5kZWxldGVXaWRnZXQodGhpcy5kYXRhLndpZGdldEluZm8sIHRoaXMuYXBwQ29uZmlnKS5zdWJzY3JpYmUoc3RhdHVzID0+IHtcbiAgICAgIHdpZGdldENvbnRhaW5lckNvbnRleHQubmd4U2VydmljZS5zdG9wKCk7XG4gICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHdpZGdldENvbnRhaW5lckNvbnRleHQud2lkZ2V0RGVsZXRlZC5lbWl0KHRoaXMuZGF0YS53aWRnZXRJbmZvLndpZGdldEluc3RhbmNlSWQpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHdpZGdldENvbnRhaW5lckNvbnRleHQubm90aWZpZXIubm90aWZ5KCdlcnJvcicsIFwiIFwiICsgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnRmFpbGVkVG9SZW1vdmVXaWRnZXQnKSArIFwiICAoXCIgKyB0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXRUaXRsZSArIFwiKSFcIik7XG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUbyBNb3ZlIG9yIGNoYW5nZSBwb3NpdGlvbiBpZiBjdXJyZW50IHdpZGdldCBjb250YWluZXIqL1xuICBwdWJsaWMgbW92ZVdpZGdldCgpIHtcbiAgICB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMucHVibGlzaChSQUV2ZW50Lk1vdmVXaWRnZXQsIHRoaXMuZGF0YS53aWRnZXRJbmZvKTtcbiAgICAvLyB0aGlzLmRhc2hib2FyZFNlcnZpY2UubW92ZVdpZGdldCh3aWRnZXRJbmZvKTtcbiAgfVxuXG4gIC8qKiBUbyBDb3B5IEN1cnJlbnQgd2lkZ2V0IHdpdGggc2FtZSBjb25maWd1cmF0aW9uKi9cbiAgcHVibGljIGNvcHlXaWRnZXQoKSB7XG4gICAgdGhpcy5yYURhc2hib2FyZEV2ZW50QnVzLnB1Ymxpc2goUkFFdmVudC5Db3B5V2lkZ2V0LCB0aGlzLmRhdGEud2lkZ2V0SW5mbyk7XG4gICAgLy90aGlzLmRhc2hib2FyZFNlcnZpY2UuY29weVdpZGdldCh3aWRnZXRJbmZvKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maWdDaGFuZ2VFdmVudEhhbmRsZXIod2lkZ2V0SW5mbykge1xuICAgIHRoaXMuZGF0YS53aWRnZXRJbmZvID0gd2lkZ2V0SW5mbztcbiAgICB0aGlzLnJlZnJlc2hXaWRnZXQodGhpcy5kYXRhLndpZGdldEluZm8pO1xuICAgIC8vIHRoaXMudXBkYXRlV2lkZ2V0KHdpZGdldEluZm8pO1xuICB9XG5cblxuICAvKiogIFRvIGxvYWQgZXh0ZXJuYWwgY3VzdG9tIGVsZW1lbnQgdG8gdGhlIHdpZGdldCBjb250YWluZXIqL1xuICBhc3luYyBsb2FkV2lkZ2V0KHdpZGdldEluZm86IGFueSkge1xuICAgIGxldCB3aWRnZXRDb25maWdGaWx0ZXIgPSA8SVdpZGdldENvbmZpZ0ZpbHRlcj57XG4gICAgICBjb25maWc6IHdpZGdldEluZm8ud2lkZ2V0Q29uZmlnSW5mby5jb25maWcsXG4gICAgICBnbG9iYWxGaWx0ZXI6IHRoaXMuZ2xvYmFsRmlsdGVyXG4gICAgfVxuXG4gICAgbGV0IHdpZGdldENvbnRhaW5lciA9IHRoaXM7XG4gICAgdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmxvYWRFeHRlcm5hbFNjcmlwdCh3aWRnZXRJbmZvLnNjcmlwdFVybCwgKCkgPT4ge1xuXG4gICAgICB3aWRnZXRDb250YWluZXIud2lkZ2V0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQod2lkZ2V0SW5mby5jdXN0b21UYWcpO1xuICAgICAgd2lkZ2V0Q29udGFpbmVyLndpZGdldEVsZW1lbnQuc2V0QXR0cmlidXRlKFwid2lkZ2V0LWluc3RhbmNlLWlkXCIsIHdpZGdldEluZm8ud2lkZ2V0SW5zdGFuY2VJZCk7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignd2lkZ2V0aW5pdGlhdGVkJyArIHdpZGdldEluZm8ud2lkZ2V0SW5zdGFuY2VJZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0aGlzLndpZGdldEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignb24tZGF0YS1sb2FkJywgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuZGV0YWlsKVxuICAgICAgICAgICAgICB0aGlzLnNob3dQYW5lbCA9IHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIHRoaXMuc2hvd1BhbmVsID0gZmFsc2U7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB3aWRnZXRDb250YWluZXIuaXNXaWRnZXRMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHdpZGdldENvbmZpZ0ZpbHRlci5hcHBDb25maWcgPSB0aGlzLmFwcENvbmZpZztcbiAgICAgICAgICB3aWRnZXRDb25maWdGaWx0ZXIud2lkZ2V0SW5mbyA9IDxJV2lkZ2V0SW5mbz57fTtcbiAgICAgICAgICB3aWRnZXRDb25maWdGaWx0ZXIud2lkZ2V0SW5mby53aWRnZXROYW1lID0gd2lkZ2V0SW5mby53aWRnZXROYW1lO1xuICAgICAgICAgIHdpZGdldENvbnRhaW5lci53aWRnZXRFbGVtZW50LmxvYWRDb250ZW50KHdpZGdldENvbmZpZ0ZpbHRlcik7XG4gICAgICAgICAgYXdhaXQgd2lkZ2V0Q29udGFpbmVyLnNldExvY2sod2lkZ2V0Q29uZmlnRmlsdGVyLmNvbmZpZyk7XG4gICAgICAgICAgYXdhaXQgd2lkZ2V0Q29udGFpbmVyLnNldERvd25sb2FkSWNvbigpO1xuICAgICAgICB9KTtcblxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY3RsV2lkZ2V0Lm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy53aWRnZXRFbGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUbyByZWZyZXNoIHdpZGdldCBvbiBpbnB1dCBjb25maWcgY2hhbmdlcyAqL1xuICBhc3luYyByZWZyZXNoV2lkZ2V0KHdpZGdldEluZm86IElXaWRnZXRJbmZvKSB7XG4gICAgbGV0IHdpZGdldENvbnRhaW5lckNvbnRleHQgPSB0aGlzO1xuICAgIGxldCB3aWRnZXRDb25maWdGaWx0ZXIgPSA8SVdpZGdldENvbmZpZ0ZpbHRlcj57XG4gICAgICBjb25maWc6IHdpZGdldEluZm8ud2lkZ2V0Q29uZmlnSW5mby5jb25maWcsXG4gICAgICBnbG9iYWxGaWx0ZXI6IHRoaXMuZ2xvYmFsRmlsdGVyLFxuICAgICAgYXBwQ29uZmlnOiB0aGlzLmFwcENvbmZpZyxcbiAgICAgIHdpZGdldEluZm86IHdpZGdldEluZm9cbiAgICB9XG4gICAgaWYgKHdpZGdldENvbnRhaW5lckNvbnRleHQuaXNXaWRnZXRMb2FkZWQpIHtcbiAgICAgIHdpZGdldENvbnRhaW5lckNvbnRleHQud2lkZ2V0RWxlbWVudC5sb2FkQ29udGVudCh3aWRnZXRDb25maWdGaWx0ZXIpO1xuICAgICAgYXdhaXQgdGhpcy5zZXRMb2NrKHdpZGdldENvbmZpZ0ZpbHRlci5jb25maWcpO1xuICAgICAgYXdhaXQgdGhpcy5zZXREb3dubG9hZEljb24oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldExvY2soY29uZmlnOiBzdHJpbmcpIHtcbiAgICB0aGlzLmxvY2tTdGF0dXMgPSBhd2FpdCB0aGlzLndpZGdldEVsZW1lbnQubG9hZExvY2tTdGF0dXMoY29uZmlnKTtcbiAgICBpZiAodGhpcy5sb2NrU3RhdHVzKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMubG9ja1N0YXR1cykge1xuICAgICAgICBjYXNlIFwibG9ja1wiOiB7XG4gICAgICAgICAgdGhpcy5sb2NrQ2xhc3MgPSBcImZhIGZhLWxvY2sgbG9ja2VkXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInVubG9ja1wiOiB7XG4gICAgICAgICAgdGhpcy5sb2NrQ2xhc3MgPSBcInVubG9ja2VkXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInBhcnRpYWxsb2NrXCI6IHtcbiAgICAgICAgICB0aGlzLmxvY2tDbGFzcyA9IFwiZmEgZmEtbG9jayBwYXJ0aWFsbG9ja2VkXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRoaXMubG9ja0NsYXNzID0gXCJ1bmxvY2tlZFwiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXREb3dubG9hZEljb24oKSB7XG4gICAgLy8gdGhpcy5pc0Rvd25sb2FkSWNvblZpc2libGUgPSBhd2FpdCB0aGlzLndpZGdldEVsZW1lbnQuaXNEb3dubG9hZFZpc2libGUoKTtcbiAgICB0aGlzLmlzRG93bmxvYWRJY29uVmlzaWJsZSA9IGZhbHNlOy8vdGVtcC4gY29tbWVudGVkXG5cbiAgfVxuXG4gIHB1YmxpYyBkb3dubG9hZENsaWNrZWQoKSB7XG4gICAgLy90aGlzLndpZGdldEVsZW1lbnQuaXNEb3dubG9hZFZpc2libGUoKTtcbiAgfVxuXG4gIC8qKlNob3cgZHJvcGRvd24gb24gZ2VhciBpY29uIGNsaWNrICAqL1xuICBwdWJsaWMgc2hvd0Ryb3BEb3duKCkge1xuICAgIHRoaXMuZHJvcERvd25TaG93biA9ICF0aGlzLmRyb3BEb3duU2hvd247XG4gIH1cblxuICAvKipIaWRlIGRyb3Bkb3duIG9uIG91dHNpZGUgY2xpY2sgKi9cbiAgcHVibGljIGhpZGVEcm9wRG93bigpIHtcbiAgICBpZih0aGlzLmRyb3BEb3duU2hvd24pXG4gICAgICB0aGlzLmRyb3BEb3duU2hvd24gPSBmYWxzZTtcbiAgfVxufVxuIl19