@schneideress/dashboardframework 0.0.271 → 0.0.273

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 (34) hide show
  1. package/bundles/schneideress-dashboardframework.umd.js +430 -118
  2. package/bundles/schneideress-dashboardframework.umd.js.map +1 -1
  3. package/bundles/schneideress-dashboardframework.umd.min.js +1 -15
  4. package/bundles/schneideress-dashboardframework.umd.min.js.map +1 -1
  5. package/esm2015/gridster/lib/gridsterItem.component.js +1 -1
  6. package/esm2015/gridster/lib/gridsterRenderer.service.js +1 -1
  7. package/esm2015/lib/ra-dashboard-area/ra.dashboard.area.js +164 -62
  8. package/esm2015/lib/ra-widget-container/ra.widget.container.component.js +64 -31
  9. package/esm2015/lib/ra.base.dashboard.template.js +4 -2
  10. package/esm2015/lib/ra.dashboard.responsive.service.js +12 -2
  11. package/esm2015/lib/ra.dashboard.service.js +7 -2
  12. package/esm2015/lib/ra.event.enum.js +7 -1
  13. package/esm2015/lib/ra.gridster.config.js +3 -3
  14. package/esm5/gridster/lib/gridsterItem.component.js +1 -1
  15. package/esm5/gridster/lib/gridsterRenderer.service.js +1 -1
  16. package/esm5/lib/ra-dashboard-area/ra.dashboard.area.js +166 -62
  17. package/esm5/lib/ra-widget-container/ra.widget.container.component.js +64 -31
  18. package/esm5/lib/ra.base.dashboard.template.js +4 -2
  19. package/esm5/lib/ra.dashboard.responsive.service.js +12 -2
  20. package/esm5/lib/ra.dashboard.service.js +7 -2
  21. package/esm5/lib/ra.event.enum.js +7 -1
  22. package/esm5/lib/ra.gridster.config.js +3 -3
  23. package/fesm2015/schneideress-dashboardframework.js +254 -96
  24. package/fesm2015/schneideress-dashboardframework.js.map +1 -1
  25. package/fesm5/schneideress-dashboardframework.js +257 -97
  26. package/fesm5/schneideress-dashboardframework.js.map +1 -1
  27. package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +24 -2
  28. package/lib/ra-widget-container/ra.widget.container.component.d.ts +6 -2
  29. package/lib/ra.base.dashboard.template.d.ts +4 -2
  30. package/lib/ra.dashboard.responsive.service.d.ts +1 -1
  31. package/lib/ra.dashboard.service.d.ts +0 -1
  32. package/lib/ra.event.enum.d.ts +7 -1
  33. package/package.json +1 -1
  34. package/schneideress-dashboardframework.metadata.json +1 -1
@@ -1,4 +1,4 @@
1
- import { __extends, __decorate, __metadata, __awaiter, __generator, __assign, __param } from 'tslib';
1
+ import { __extends, __decorate, __metadata, __spread, __awaiter, __generator, __assign, __param } from 'tslib';
2
2
  import { Injector, ɵɵdefineInjectable, ɵɵinject, INJECTOR, Injectable, EventEmitter, NgZone, Input, Output, ViewChild, ElementRef, Component, Renderer2, ChangeDetectorRef, ViewEncapsulation, Host, NgModule } from '@angular/core';
3
3
  import { of, Subject } from 'rxjs';
4
4
  import { BaseService, RATranslateService, RAPermissionService, DomService, RACommonModule } from '@schneideress/ra-common';
@@ -17,7 +17,6 @@ var RaDashboardService = /** @class */ (function (_super) {
17
17
  function RaDashboardService(injector) {
18
18
  var _this = _super.call(this, injector, '') || this;
19
19
  _this.loadedScripts = [];
20
- _this.clientId = undefined;
21
20
  return _this;
22
21
  }
23
22
  /*
@@ -70,6 +69,12 @@ var RaDashboardService = /** @class */ (function (_super) {
70
69
  /**To Update widgetInfo in database */
71
70
  RaDashboardService.prototype.updateWidget = function (widgetInfo, appConfig) {
72
71
  this.baseUrl = appConfig.apiBaseUrl;
72
+ var info = {};
73
+ info.widgetConfigInfo = widgetInfo.widgetConfigInfo;
74
+ info.widgetInstanceId = widgetInfo.widgetInstanceId;
75
+ info.widgetTitle = widgetInfo.widgetTitle;
76
+ info.widgetType = widgetInfo.widgetType;
77
+ info.widgetId = widgetInfo.widgetId;
73
78
  return this.post('widget/UpdateUserWidget', widgetInfo);
74
79
  };
75
80
  /** To Move or change position if current widget container*/
@@ -185,6 +190,12 @@ var RAEvent;
185
190
  RAEvent["UpdateAppledFiterForInapplicableFilter"] = "UpdateAppledFiterForInapplicableFilter";
186
191
  /**show inapplicable filter message in global filter flyout */
187
192
  RAEvent["ShowInapplicableFilterMessage"] = "ShowInapplicableFilterMessage";
193
+ /** Bulk Action Clicked */
194
+ RAEvent["BulkActionClick"] = "BulkActionClick";
195
+ /** Global Filter Clicked */
196
+ /** When user change the curated filter(eg:data streams), system will create/delete widgets */
197
+ RAEvent["CuratedFilterChange"] = "CuratedFilterChange";
198
+ RAEvent["GlobalFilterClick"] = "GlobalFilterClick";
188
199
  })(RAEvent || (RAEvent = {}));
189
200
  var RAEventKey;
190
201
  (function (RAEventKey) {
@@ -198,9 +209,9 @@ var GridsterConfigDefaultSettings = {
198
209
  margin: 10,
199
210
  outerMargin: true,
200
211
  outerMarginTop: 10,
201
- outerMarginRight: 10,
212
+ outerMarginRight: 0,
202
213
  outerMarginBottom: 30,
203
- outerMarginLeft: 10,
214
+ outerMarginLeft: 0,
204
215
  useTransformPositioning: true,
205
216
  mobileBreakpoint: 640,
206
217
  minCols: 10,
@@ -315,7 +326,7 @@ var RADashboardResponsiveService = /** @class */ (function () {
315
326
  enumerable: true,
316
327
  configurable: true
317
328
  });
318
- RADashboardResponsiveService.prototype.getGridsterConfig = function (isWidgetMgmnt) {
329
+ RADashboardResponsiveService.prototype.getGridsterConfig = function (isWidgetMgmnt, resize, canMove) {
319
330
  var config = GridsterConfigDefaultSettings;
320
331
  config.minCols = this.currentResInfo.maxCols;
321
332
  config.maxCols = this.currentResInfo.maxCols;
@@ -337,6 +348,13 @@ var RADashboardResponsiveService = /** @class */ (function () {
337
348
  config.swap = true;
338
349
  config.draggable.enabled = true;
339
350
  }
351
+ if (!resize) {
352
+ config.resizable.enabled = false;
353
+ config.swap = false;
354
+ }
355
+ if (!canMove) {
356
+ config.draggable.enabled = false;
357
+ }
340
358
  return config;
341
359
  };
342
360
  /**To map IwidgetInfo object to gridsterItem */
@@ -344,6 +362,9 @@ var RADashboardResponsiveService = /** @class */ (function () {
344
362
  if (widget.widgetSettings) {
345
363
  widget.settings = JSON.parse(widget.widgetSettings);
346
364
  }
365
+ if (widget.templateSettings) {
366
+ widget.templateWidgetSettings = JSON.parse(widget.templateSettings);
367
+ }
347
368
  var gridsterItem = {
348
369
  cols: this.getWidth(widget.width),
349
370
  rows: this.getHeight(widget.height),
@@ -411,14 +432,21 @@ var RADashboardArea = /** @class */ (function () {
411
432
  this.domResized = false;
412
433
  this.showEmptyDashboard = false;
413
434
  this.isWidgetMgmnt = false;
435
+ this.initialWidgetCount = 10;
436
+ this.currentLoadedIndex = 0;
437
+ this.loading = false;
414
438
  this.widgetHeight = 2;
415
439
  this.widgetWidth = 4;
416
440
  this.hideDashboardBanner = new EventEmitter();
417
441
  }
418
442
  RADashboardArea.prototype.ngOnInit = function () {
419
443
  var _this = this;
444
+ window.addEventListener('scroll', function () {
445
+ _this.loadNext();
446
+ });
420
447
  this.isWidgetMgmnt = this.permissionService.hasPermission('ra.widgetmanagement');
421
448
  this.initiateGridsterConfig();
449
+ this.setEmptyDashboardConfig();
422
450
  this.lastViewType = this.responsiveService.IsDesktopView ? 'desktop' : 'mobile';
423
451
  this.responsiveService.resized.subscribe(function (isDesktop) {
424
452
  if (_this.lastViewType != (isDesktop ? 'desktop' : 'mobile') || !isDesktop) {
@@ -447,6 +475,11 @@ var RADashboardArea = /** @class */ (function () {
447
475
  }, 100);
448
476
  }
449
477
  });
478
+ setTimeout(function () {
479
+ _this.bulkActionClick = _this.raDashboardEventBus.subscribe(RAEvent.BulkActionClick).subscribe(function (data) {
480
+ _this.bulkActionData = JSON.parse(JSON.stringify(data)); // To create a new reference;
481
+ });
482
+ });
450
483
  };
451
484
  RADashboardArea.prototype.ngOnChanges = function (changes) {
452
485
  this.isWidgetMgmnt = this.permissionService.hasPermission('ra.widgetmanagement');
@@ -454,28 +487,44 @@ var RADashboardArea = /** @class */ (function () {
454
487
  this.isWidgetLoaded = true;
455
488
  this.loadWidgets(this.userDashboardId, this.areaKey);
456
489
  }
490
+ this.initiateGridsterConfig();
457
491
  if (changes.raDashboardEventBus && changes.raDashboardEventBus.currentValue != changes.raDashboardEventBus.previousValue) {
458
492
  this.inititateEventBusSubscritions();
459
493
  }
460
494
  };
495
+ RADashboardArea.prototype.setEmptyDashboardConfig = function () {
496
+ if (this.dashboardInfo && this.dashboardInfo.templateConfig.emptyDashboardHeader) {
497
+ this.emptyDashboardTitle = this.translateService.translate("dashboard." + this.dashboardInfo.templateConfig.emptyDashboardHeader.titleKey);
498
+ this.emptyDashboardMsg1 = this.translateService.translate("dashboard." + this.dashboardInfo.templateConfig.emptyDashboardHeader.descriptionKey1);
499
+ this.emptyDashboardMsg2 = (this.dashboardInfo.templateConfig.emptyDashboardHeader.descriptionKey2) ? this.translateService.translate("dashboard." + this.dashboardInfo.templateConfig.emptyDashboardHeader.descriptionKey2) : '';
500
+ this.emptyDashboardButtonText = this.translateService.translate("dashboard." + this.dashboardInfo.templateConfig.emptyDashboardHeader.buttonTextKey);
501
+ this.emptyDashboardButtonIcon = this.dashboardInfo.templateConfig.emptyDashboardHeader.buttonIcon ? this.dashboardInfo.templateConfig.emptyDashboardHeader.buttonIcon : '';
502
+ this.emptyDashboardButtonAction = this.dashboardInfo.templateConfig.emptyDashboardHeader.buttonAction ? this.dashboardInfo.templateConfig.emptyDashboardHeader.buttonAction : '';
503
+ }
504
+ };
461
505
  /**To set GridsterConfig */
462
506
  RADashboardArea.prototype.initiateGridsterConfig = function () {
463
507
  var _this = this;
464
- /**To override default configuration values to the gridster control */
465
- this.options = this.responsiveService.getGridsterConfig(this.isWidgetMgmnt);
466
- this.options.initCallback = function (gridster) {
467
- if (_this.options.api) {
468
- _this.gridcellHeight = _this.options.api.getCurrentRowHeight();
469
- }
470
- };
471
- this.options.itemChangeCallback = function (item) {
472
- if (_this.responsiveService.IsDesktopView) {
473
- if (item.widgetInfo && item.widgetInfo.widgetInstanceId) {
474
- _this.updateWidgetPosition(item.widgetInfo.widgetInstanceId);
508
+ if (this.dashboardInfo) {
509
+ /**To override default configuration values to the gridster control */
510
+ this.options = this.responsiveService.getGridsterConfig(this.isWidgetMgmnt, this.dashboardInfo.templateConfig.widget.canResize, this.dashboardInfo.templateConfig.widget.canMove);
511
+ this.options.initCallback = function (gridster) {
512
+ if (_this.options.api) {
513
+ _this.gridcellHeight = _this.options.api.getCurrentRowHeight();
475
514
  }
476
- }
477
- _this.setAreaHeight();
478
- };
515
+ };
516
+ this.options.itemChangeCallback = function (item) {
517
+ if (_this.responsiveService.IsDesktopView) {
518
+ if (item.widgetInfo && item.widgetInfo.widgetInstanceId) {
519
+ _this.updateWidgetPosition(item.widgetInfo.widgetInstanceId);
520
+ }
521
+ }
522
+ _this.setAreaHeight();
523
+ };
524
+ }
525
+ };
526
+ RADashboardArea.prototype.widgetLoaded = function (widget) {
527
+ widget.canLoadData = true;
479
528
  };
480
529
  /** To initiate eventbus subsctiptions */
481
530
  RADashboardArea.prototype.inititateEventBusSubscritions = function () {
@@ -495,6 +544,11 @@ var RADashboardArea = /** @class */ (function () {
495
544
  _this.addWidget(e);
496
545
  });
497
546
  });
547
+ this.curatedFilterChange = this.raDashboardEventBus.subscribe(RAEvent.CuratedFilterChange).subscribe(function (e) {
548
+ _this.ngZone.run(function () {
549
+ _this.loadWidgets(_this.userDashboardId, _this.areaKey);
550
+ });
551
+ });
498
552
  this.rearrangeWidgetClick = this.raDashboardEventBus.subscribe(RAEvent.RearrangeClicked).subscribe(function (e) {
499
553
  _this.ngZone.run(function () {
500
554
  _this.rearrangeWidgets();
@@ -543,6 +597,10 @@ var RADashboardArea = /** @class */ (function () {
543
597
  this.widgetLibraryDoneClick.unsubscribe();
544
598
  if (this.rearrangeWidgetClick)
545
599
  this.rearrangeWidgetClick.unsubscribe();
600
+ if (this.curatedFilterChange)
601
+ this.curatedFilterChange.unsubscribe();
602
+ if (this.bulkActionClick)
603
+ this.bulkActionClick.unsubscribe();
546
604
  };
547
605
  /**To update position/dimention of all widgets in the area */
548
606
  RADashboardArea.prototype.updateWidgets = function () {
@@ -579,6 +637,12 @@ var RADashboardArea = /** @class */ (function () {
579
637
  /** To retrieve widgets based on userDashboardid and area name */
580
638
  RADashboardArea.prototype.loadWidgets = function (userDashboarId, areaKey) {
581
639
  var _this = this;
640
+ if (this.templateConfig && this.templateConfig.initialWidgetCount)
641
+ this.initialWidgetCount = this.templateConfig.initialWidgetCount;
642
+ if (location.href.indexOf('/kiosk/') > -1)
643
+ this.initialWidgetCount = 1000;
644
+ this.currentLoadedIndex = 0;
645
+ this.loading = false;
582
646
  var widgetInfo = {
583
647
  dashboardId: userDashboarId.toString(),
584
648
  dashboardAreaKey: areaKey
@@ -586,7 +650,6 @@ var RADashboardArea = /** @class */ (function () {
586
650
  this.widgetList = [];
587
651
  this.dashboardService.getWidgetsByDashboardArea(widgetInfo, this.appConfig).subscribe(function (widgets) {
588
652
  _this.userWidgets = widgets;
589
- _this.dashboardService.clientId = widgets[0].clientId;
590
653
  _this.PAMWidgets = [];
591
654
  widgets.forEach(function (element) {
592
655
  var settings = undefined;
@@ -598,8 +661,8 @@ var RADashboardArea = /** @class */ (function () {
598
661
  });
599
662
  _this.checkPAMWidgets();
600
663
  if (widgets && widgets.length > 0) {
601
- _this.widgetList = _this.mapObjectListToGridsterItemList(widgets);
602
- _this.setAreaHeight();
664
+ _this.widgetList = [];
665
+ _this.loadWidgetsDelta();
603
666
  _this.raDashboardEventBus.publish(RAEvent.HideDashboardBanner, false);
604
667
  }
605
668
  else {
@@ -608,6 +671,45 @@ var RADashboardArea = /** @class */ (function () {
608
671
  }
609
672
  });
610
673
  };
674
+ RADashboardArea.prototype.loadWidgetsDelta = function () {
675
+ var _this = this;
676
+ var _a;
677
+ if (!this.loading) {
678
+ this.loading = true;
679
+ var widgets = this.mapObjectListToGridsterItemList(this.userWidgets.slice(this.currentLoadedIndex, (this.currentLoadedIndex + this.initialWidgetCount)));
680
+ this.currentLoadedIndex += this.initialWidgetCount;
681
+ (_a = this.widgetList).push.apply(_a, __spread(widgets));
682
+ this.setAreaHeight();
683
+ setTimeout(function () {
684
+ _this.loading = false;
685
+ });
686
+ }
687
+ };
688
+ RADashboardArea.prototype.dataLoaded = function (widgetElement) {
689
+ this.loadNext();
690
+ };
691
+ RADashboardArea.prototype.loadNext = function () {
692
+ if (this.divBottom) {
693
+ if (this.elementInViewport(this.divBottom.nativeElement)) {
694
+ this.loadWidgetsDelta();
695
+ }
696
+ }
697
+ };
698
+ RADashboardArea.prototype.elementInViewport = function (el) {
699
+ var top = el.offsetTop;
700
+ var left = el.offsetLeft;
701
+ var width = el.offsetWidth;
702
+ var height = el.offsetHeight;
703
+ while (el.offsetParent) {
704
+ el = el.offsetParent;
705
+ top += el.offsetTop;
706
+ left += el.offsetLeft;
707
+ }
708
+ return (top >= window.scrollY &&
709
+ left >= window.scrollX &&
710
+ (top + height) <= (window.scrollY + window.innerHeight) &&
711
+ (left + width) <= (window.scrollX + window.innerWidth));
712
+ };
611
713
  /** To set Area(Gridster) height dynamically as widgets are added/removed */
612
714
  RADashboardArea.prototype.setAreaHeight = function () {
613
715
  var _this = this;
@@ -651,22 +753,22 @@ var RADashboardArea = /** @class */ (function () {
651
753
  /** To remove a widget instance from dashboard and to save info in database */
652
754
  RADashboardArea.prototype.deleteWidget = function (widgetInstanceId, isalertDisabled) {
653
755
  if (isalertDisabled === void 0) { isalertDisabled = false; }
756
+ var widget = this.userWidgets.filter(function (item) {
757
+ return item.widgetInstanceId === widgetInstanceId;
758
+ });
759
+ if (widget.length > 0) {
760
+ this.userWidgets.splice(this.userWidgets.indexOf(widget[0]), 1);
761
+ }
762
+ if (this.PAMWidgets.length > 0) {
763
+ var indx = this.PAMWidgets.indexOf(widgetInstanceId);
764
+ if (indx > -1)
765
+ this.PAMWidgets.splice(indx, 1);
766
+ this.checkPAMWidgets();
767
+ }
654
768
  var gridsterItem = this.widgetList.filter(function (item) {
655
769
  return item.widgetInfo.widgetInstanceId === widgetInstanceId;
656
770
  });
657
771
  if (gridsterItem.length > 0) {
658
- var widget = this.userWidgets.filter(function (item) {
659
- return item.widgetInstanceId === widgetInstanceId;
660
- });
661
- if (widget.length > 0) {
662
- this.userWidgets.splice(this.userWidgets.indexOf(widget[0]), 1);
663
- }
664
- if (this.PAMWidgets.length > 0) {
665
- var indx = this.PAMWidgets.indexOf(widgetInstanceId);
666
- if (indx > -1)
667
- this.PAMWidgets.splice(indx, 1);
668
- this.checkPAMWidgets();
669
- }
670
772
  this.widgetList.splice(this.widgetList.indexOf(gridsterItem[0]), 1);
671
773
  this.setAreaHeight();
672
774
  if (!isalertDisabled) {
@@ -681,11 +783,15 @@ var RADashboardArea = /** @class */ (function () {
681
783
  /**To rearrange widgets position in the dashboard, compactLeft&Up,compactLeft,compactUp,etc*/
682
784
  RADashboardArea.prototype.rearrangeWidgets = function () {
683
785
  var _this = this;
786
+ this.currentLoadedIndex = 0;
787
+ this.loading = false;
684
788
  for (var i = 0; i < this.userWidgets.length; i++) {
685
789
  this.userWidgets[i].position_x = 0;
686
790
  this.userWidgets[i].position_y = 0;
687
791
  }
688
- this.widgetList = this.mapObjectListToGridsterItemList(this.userWidgets);
792
+ this.widgetList = [];
793
+ this.loadWidgetsDelta();
794
+ this.raDashboardEventBus.publish(RAEvent.HideDashboardBanner, false);
689
795
  if (this.widgetList.length > 0)
690
796
  this.updateWidgetPosition(this.widgetList[0].widgetInfo.widgetInstanceId);
691
797
  setTimeout(function () {
@@ -718,29 +824,31 @@ var RADashboardArea = /** @class */ (function () {
718
824
  this.ngxService.start();
719
825
  this.dashboardService.addWidget(data, this.appConfig).subscribe(function (widget) {
720
826
  _this.userWidgets.push(widget);
721
- var gridsterItem = _this.responsiveService.getGridsterItem(widget);
722
- _this.widgetList.push(gridsterItem);
723
- _this.setAreaHeight();
724
- if (_this.options.api) {
725
- var curRowHeight = Number(_this.options.api.getCurrentRowHeight());
726
- if (curRowHeight > 0) {
727
- widget.rowHeight = curRowHeight;
728
- _this.gridcellHeight = curRowHeight;
827
+ if (_this.currentLoadedIndex >= _this.userWidgets.length) {
828
+ var gridsterItem = _this.responsiveService.getGridsterItem(widget);
829
+ _this.widgetList.push(gridsterItem);
830
+ _this.setAreaHeight();
831
+ if (_this.options.api) {
832
+ var curRowHeight = Number(_this.options.api.getCurrentRowHeight());
833
+ if (curRowHeight > 0) {
834
+ widget.rowHeight = curRowHeight;
835
+ _this.gridcellHeight = curRowHeight;
836
+ }
729
837
  }
730
- }
731
- var widgetInstanceId = 0;
732
- if (widget && widget.widgetInstanceId) {
733
- widgetInstanceId = widget.widgetInstanceId;
734
- /**To save added widget position in db */
735
- if (_this.responsiveService.IsDesktopView) {
736
- setTimeout(function () {
737
- _this.updateWidgetPosition(widgetInstanceId);
738
- });
838
+ var widgetInstanceId = 0;
839
+ if (widget && widget.widgetInstanceId) {
840
+ widgetInstanceId = widget.widgetInstanceId;
841
+ /**To save added widget position in db */
842
+ if (_this.responsiveService.IsDesktopView) {
843
+ setTimeout(function () {
844
+ _this.updateWidgetPosition(widgetInstanceId);
845
+ });
846
+ }
847
+ }
848
+ if (widget.settings && widget.settings.isPAMWidget) {
849
+ _this.PAMWidgets.push(widget.widgetInstanceId);
850
+ _this.checkPAMWidgets();
739
851
  }
740
- }
741
- if (widget.settings && widget.settings.isPAMWidget) {
742
- _this.PAMWidgets.push(widget.widgetInstanceId);
743
- _this.checkPAMWidgets();
744
852
  }
745
853
  _this.raDashboardEventBus.publish(RAEvent.WidgetAdded, widget);
746
854
  });
@@ -770,12 +878,14 @@ var RADashboardArea = /** @class */ (function () {
770
878
  });
771
879
  }
772
880
  this.userWidgets.push(data);
773
- var gridsterItem = this.responsiveService.getGridsterItem(data);
774
- this.widgetList.push(gridsterItem);
775
- this.setAreaHeight();
776
- if (data.settings && data.settings.isPAMWidget) {
777
- this.PAMWidgets.push(data.widgetInstanceId);
778
- this.checkPAMWidgets();
881
+ if (this.currentLoadedIndex >= this.userWidgets.length) {
882
+ var gridsterItem = this.responsiveService.getGridsterItem(data);
883
+ this.widgetList.push(gridsterItem);
884
+ this.setAreaHeight();
885
+ if (data.settings && data.settings.isPAMWidget) {
886
+ this.PAMWidgets.push(data.widgetInstanceId);
887
+ this.checkPAMWidgets();
888
+ }
779
889
  }
780
890
  };
781
891
  RADashboardArea.prototype.mapObjectListToGridsterItemList = function (widgetList) {
@@ -804,8 +914,11 @@ var RADashboardArea = /** @class */ (function () {
804
914
  });
805
915
  return widgetListArray;
806
916
  };
807
- RADashboardArea.prototype.addNewWidget = function () {
808
- this.raDashboardEventBus.publish(RAEvent.AddNewWidgetToDashboard, null);
917
+ RADashboardArea.prototype.buttonClick = function () {
918
+ if (this.emptyDashboardButtonAction == "widgets")
919
+ this.raDashboardEventBus.publish(RAEvent.AddNewWidgetToDashboard, null);
920
+ else if (this.emptyDashboardButtonAction == "filter")
921
+ this.raDashboardEventBus.publish(RAEvent.GlobalFilterClick, null);
809
922
  };
810
923
  RADashboardArea.prototype.updateAppliedFilters = function (data) {
811
924
  this.raDashboardEventBus.publish(RAEvent.UpdateAppledFiterForInapplicableFilter, data);
@@ -855,6 +968,14 @@ var RADashboardArea = /** @class */ (function () {
855
968
  Input('app-config'),
856
969
  __metadata("design:type", Object)
857
970
  ], RADashboardArea.prototype, "appConfig", void 0);
971
+ __decorate([
972
+ Input('dashboard-info'),
973
+ __metadata("design:type", Object)
974
+ ], RADashboardArea.prototype, "dashboardInfo", void 0);
975
+ __decorate([
976
+ Input(),
977
+ __metadata("design:type", Object)
978
+ ], RADashboardArea.prototype, "templateConfig", void 0);
858
979
  __decorate([
859
980
  Output(),
860
981
  __metadata("design:type", Object)
@@ -863,11 +984,15 @@ var RADashboardArea = /** @class */ (function () {
863
984
  ViewChild('gridWrapper', { static: false }),
864
985
  __metadata("design:type", ElementRef)
865
986
  ], RADashboardArea.prototype, "gridWrapper", void 0);
987
+ __decorate([
988
+ ViewChild('divBottom', { static: false }),
989
+ __metadata("design:type", ElementRef)
990
+ ], RADashboardArea.prototype, "divBottom", void 0);
866
991
  RADashboardArea = __decorate([
867
992
  Component({
868
993
  selector: 'ra-dashboard-area',
869
- template: "<div #gridWrapper class=\"wrap gridster gridster-mobile\" [ngStyle]=\"{'height': userWidgets.length > 0 ? (gridheight + 'px') : 'unset'}\">\r\n <!-- <div #gridWrapper class=\"wrap gridster\"> -->\r\n <gridster [options]=\"options\" style=\"height:100%;\" *ngIf=\"userWidgets.length > 0\">\r\n <gridster-item [item]=\"item\" *ngFor=\"let item of widgetList\">\r\n <ra-widget-container [app-config]=\"appConfig\" [event-bus]=\"raDashboardEventBus\"\r\n (widgetDeleted)=\"deleteWidget($event)\" [data]=\"item\" [global-filter]=\"globalFilter\"\r\n [grid-cell-height]=\"gridcellHeight\" *ngIf=\"gridcellHeight && gridcellHeight > 0\" [widget-width]=\"item.cols\"\r\n [widget-height]=\"item.rows\" [widget-instance-id]=\"item.widgetInstanceId\" [dom-resized]=\"domResized\"\r\n (updateAppliedFilters)=\"updateAppliedFilters($event)\">\r\n </ra-widget-container>\r\n </gridster-item>\r\n </gridster>\r\n\r\n <div class=\"empty-padding kiosk-hide\" *ngIf=\"showEmptyDashboard\">\r\n <div class=\"empty-wrapper\">\r\n <div></div>\r\n <div class=\"m-1 empty-prefix\">\r\n <i class=\"fal fa-edit edit-icon\"></i>\r\n <span class=\"empty-title\">{{'dashboard.emptydashboard'|translate}}</span>\r\n </div>\r\n <div class=\"empty-content light\">\r\n <div>\r\n <div class=\"col-sm-12 empty-msg\">\r\n {{'dashboard.emptydashboardmessage'|translate}} <br />\r\n {{'dashboard.emptydashboardmessage2'|translate}}\r\n </div>\r\n <button *ngIf=\"isWidgetMgmnt\" class=\"btn btnLib btn-sm m-1 dashboard-button light\" (click)=\"addNewWidget()\">\r\n <i class=\"fal fa-plus m-1\"></i>{{'dashboard.addawidgets'|translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <notifier-container></notifier-container>\r\n</div>",
870
- styles: ["gridster{width:inherit;resize:height;display:flex;background-color:#ededed;overflow-y:hidden!important}.dvheader{width:100%;height:35px;background:#000;color:#fff;padding:7px 3px 5px 6px;text-transform:uppercase}gridster-item{box-sizing:border-box;z-index:1;position:absolute;overflow:hidden;transition:.3s;display:none;background:#fff;-webkit-user-select:text;-moz-user-select:text;user-select:text;box-shadow:0 1px 10px rgba(0,0,0,.05)}gridster-item:hover{box-shadow:0 1px 10px rgba(0,0,0,.15)}@media screen and (max-width:685px){.gridster-mobile{height:auto!important;margin-bottom:50px!important}}@media screen and (max-width:350px){.gridster-mobile{min-height:330px!important;margin-bottom:0!important}}.empty-padding{padding:40px 20px 20px;background-color:#ededed;display:flex;justify-content:center;align-content:center}.empty-wrapper{display:flex;background-color:#fff;border-radius:8px;min-height:125px;width:72%}.empty-prefix{color:#32ad3c;font-size:18px;display:flex;align-items:center;padding:10px 30px;min-width:-webkit-max-content;min-width:max-content;min-width:-moz-max-content}.empty-content{color:#333;border-left:1px solid #a9afb1;width:100%;display:flex;align-items:center;padding:15px 30px 10px 40px}.empty-msg{padding:0 0 5px;font-size:16px}.dashboard-button{padding:5px 10px 5px 5px!important}.btnLib{background-color:#ededed;color:#333!important}.btn-group-sm>.btn,.btn-sm{padding:5px 20px 5px 5px}.edit-icon{color:#32ad3c;font-size:24px;margin-right:15px}.empty-title{margin-top:10px}@media screen and (max-width:600px){.empty-padding{padding:10px;background-color:#ededed;width:100%;display:block}.empty-wrapper{display:flex;background-color:#fff;border-radius:8px;min-height:125px;width:100%}.empty-prefix{color:#32ad3c;font-size:16px;display:flex;height:40px;padding:6px 10px 8px}.empty-content{color:#333;display:flex;padding:5px 10px 10px;margin-top:44px;margin-left:-185px;border-left:none}.empty-msg{padding:12px 10px 10px 5px;font-size:14px;border-top:1px solid #a9afb1}.edit-icon{color:#32ad3c;font-size:20px;margin-right:6px}.empty-title{margin-top:6px}}"]
994
+ template: "<div #gridWrapper class=\"wrap gridster gridster-mobile\"\r\n [ngStyle]=\"{'height': userWidgets.length > 0 ? (gridheight + 'px') : 'unset'}\">\r\n <!-- <div #gridWrapper class=\"wrap gridster\"> -->\r\n <gridster [options]=\"options\" style=\"height:100%;\" *ngIf=\"userWidgets.length > 0\">\r\n <gridster-item [item]=\"item\" *ngFor=\"let item of widgetList\">\r\n <ra-widget-container (widgetLoaded)=\"widgetLoaded(item)\" [canLoadData]=\"item.canLoadData\" (dataLoaded)=\"dataLoaded($event)\"\r\n [bulk-action-data]=\"bulkActionData\" [dashboard-info]=\"dashboardInfo\" [app-config]=\"appConfig\"\r\n [event-bus]=\"raDashboardEventBus\" (widgetDeleted)=\"deleteWidget($event)\" [data]=\"item\"\r\n [global-filter]=\"globalFilter\" [grid-cell-height]=\"gridcellHeight\" *ngIf=\"gridcellHeight && gridcellHeight > 0\"\r\n [widget-width]=\"item.cols\" [widget-height]=\"item.rows\" [widget-instance-id]=\"item.widgetInstanceId\"\r\n [dom-resized]=\"domResized\" (updateAppliedFilters)=\"updateAppliedFilters($event)\">\r\n </ra-widget-container>\r\n </gridster-item>\r\n </gridster>\r\n\r\n <div class=\"empty-padding kiosk-hide\" *ngIf=\"showEmptyDashboard\">\r\n <div class=\"empty-wrapper\">\r\n <div></div>\r\n <div class=\"empty-prefix\">\r\n <!-- <i class=\"fal fa-edit edit-icon\"></i> -->\r\n <span>{{emptyDashboardTitle}}</span>\r\n </div>\r\n <hr class=\"horizontalLine-solid\" />\r\n <div class=\"empty-content light\">\r\n <div>\r\n <div class=\"col-sm-12 empty-msg\">\r\n {{emptyDashboardMsg1}} <br />\r\n {{emptyDashboardMsg2}}\r\n </div>\r\n <button *ngIf=\"isWidgetMgmnt\" class=\"btn btnLib btn-sm dashboard-button light\" (click)=\"buttonClick()\">\r\n <i class=\"{{emptyDashboardButtonIcon}}\"></i>{{emptyDashboardButtonText}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <notifier-container></notifier-container>\r\n</div>\r\n<div #divBottom></div>",
995
+ styles: ["gridster{width:inherit;resize:height;display:flex;background-color:#fff;overflow-y:hidden!important}.dvheader{width:100%;height:35px;background:#000;color:#fff;padding:7px 3px 5px 6px;text-transform:uppercase}gridster-item{box-sizing:border-box;z-index:1;position:absolute;overflow:hidden;transition:.3s;display:none;background:#fff;-webkit-user-select:text;-moz-user-select:text;user-select:text;box-shadow:none}gridster-item:hover{box-shadow:0 1px 10px rgba(0,0,0,.15)!important}@media screen and (max-width:685px){.gridster-mobile{height:auto!important;margin-bottom:50px!important}}@media screen and (max-width:350px){.gridster-mobile{min-height:330px!important;margin-bottom:0!important}}.empty-padding{padding:15px 0;background-color:#fff;display:flex}.empty-wrapper{background-color:#fff;border:1px solid #9fa0a4;min-height:125px;width:100%}.empty-prefix{color:#32ad3c;font-size:18px;padding:15px}.empty-content{color:#626469;width:100%;padding:15px}.empty-msg{padding:0 0 15px;font-size:16px}.horizontalLine-solid{border-top:1px solid #cbcbcb;margin:0 15px}.dashboard-button{padding:5px 10px 5px 5px!important}.btnLib{background-color:#ededed;color:#333!important}.btn-group-sm>.btn,.btn-sm{padding:5px 20px 5px 5px}.edit-icon{color:#32ad3c;font-size:24px;margin-right:15px}.empty-title{margin-top:10px}@media screen and (max-width:600px){.empty-padding{padding:15px 0;background-color:#fff;width:100%;display:block}.empty-wrapper{display:flex;background-color:#fff;border:1px solid #9fa0a4;min-height:125px;width:100%}.empty-prefix{color:#32ad3c;font-size:16px;display:flex;height:40px;padding:15px}.empty-content{color:#333;display:flex;padding:15px}.empty-msg{padding:0 0 15px;font-size:14px}.edit-icon{color:#32ad3c;font-size:20px;margin-right:6px}.empty-title{margin-top:6px}}"]
871
996
  }),
872
997
  __metadata("design:paramtypes", [RaDashboardService,
873
998
  NgZone,
@@ -970,8 +1095,11 @@ var RAWidgetContainer = /** @class */ (function () {
970
1095
  this.showExcell = true;
971
1096
  this.hideTitle = false;
972
1097
  this.inapplicableFilters = [];
1098
+ this.canLoadData = false;
973
1099
  this.widgetDeleted = new EventEmitter();
974
1100
  this.updateAppliedFilters = new EventEmitter();
1101
+ this.dataLoaded = new EventEmitter();
1102
+ this.widgetLoaded = new EventEmitter();
975
1103
  this.isWidgetStateApplicable = false;
976
1104
  this.widgetEmptyState = '';
977
1105
  this.lockVisible = false;
@@ -996,7 +1124,7 @@ var RAWidgetContainer = /** @class */ (function () {
996
1124
  configurable: true
997
1125
  });
998
1126
  RAWidgetContainer.prototype.ngOnInit = function () {
999
- this.WidgetDisplayName = this.getwidgetTitleTranslation(this.data.widgetInfo.widgetTitle);
1127
+ this.WidgetDisplayName = this.translateService.translate('Common.' + this.data.widgetInfo.widgetTitle, true);
1000
1128
  this.lockIconTitle = this.translateService.translate('Common.lockedfields');
1001
1129
  this.lockIconFooter = this.translateService.translate('Common.lockedfieldseditinfo');
1002
1130
  this.inapplicableIconTitle = this.translateService.translate('Common.InapplicableFilters');
@@ -1017,19 +1145,32 @@ var RAWidgetContainer = /** @class */ (function () {
1017
1145
  });
1018
1146
  });
1019
1147
  }
1020
- if (this.widgetElement && changes.globalFilter && changes.globalFilter.currentValue != changes.globalFilter.previousValue) {
1021
- var filterObj = this.getParsedConfig(this.globalFilter);
1022
- if (filterObj.WidgetInstanceId) {
1023
- if (this.data.widgetInfo.widgetInstanceId != filterObj.WidgetInstanceId)
1024
- this.refreshWidget(this.data.widgetInfo);
1148
+ if (this.widgetElement) {
1149
+ if (changes.bulkActionData && changes.bulkActionData.currentValue != changes.bulkActionData.previousValue) {
1150
+ if (typeof this.widgetElement.bulkActionClicked === "function") {
1151
+ this.widgetElement.bulkActionClicked(this.bulkActionData);
1152
+ }
1025
1153
  }
1026
- else {
1027
- this.refreshWidget(this.data.widgetInfo);
1154
+ if (changes.globalFilter && changes.globalFilter.currentValue != changes.globalFilter.previousValue) {
1155
+ if (!this.dashboardInfo.curatedFilters) {
1156
+ var filterObj = this.getParsedConfig(this.globalFilter);
1157
+ if (filterObj.WidgetInstanceId) {
1158
+ if (this.data.widgetInfo.widgetInstanceId != filterObj.WidgetInstanceId)
1159
+ this.refreshWidget(this.data.widgetInfo);
1160
+ }
1161
+ else {
1162
+ //this.refreshWidget(this.data.widgetInfo);
1163
+ }
1164
+ }
1165
+ }
1166
+ if (changes.width && changes.width.currentValue != changes.width.previousValue ||
1167
+ (changes.height && changes.height.currentValue != changes.height.previousValue)) {
1168
+ this.invokeWidgetResizedEvent();
1028
1169
  }
1029
1170
  }
1030
- if (changes.width && changes.width.currentValue != changes.width.previousValue ||
1031
- (changes.height && changes.height.currentValue != changes.height.previousValue)) {
1032
- this.invokeWidgetResizedEvent();
1171
+ if (changes.canLoadData && changes.canLoadData.currentValue != changes.canLoadData.previousValue) {
1172
+ if (this.canLoadData)
1173
+ this.refreshWidget(this.data.widgetInfo);
1033
1174
  }
1034
1175
  };
1035
1176
  RAWidgetContainer.prototype.invokeWidgetResizedEvent = function () {
@@ -1221,6 +1362,10 @@ var RAWidgetContainer = /** @class */ (function () {
1221
1362
  _this.showPanel = true;
1222
1363
  else
1223
1364
  _this.showPanel = false;
1365
+ if (!_this.data.dataLoaded) {
1366
+ _this.data.dataLoaded = true;
1367
+ _this.dataLoaded.emit(_this.widgetElement);
1368
+ }
1224
1369
  break;
1225
1370
  case 'onConfigEditClicked':
1226
1371
  _this.editWidget();
@@ -1293,7 +1438,9 @@ var RAWidgetContainer = /** @class */ (function () {
1293
1438
  widgetConfigFilter.configChanges = this.getConfigChanges(false);
1294
1439
  widgetConfigFilter.widgetInfo.widgetName = widgetInfo.widgetName;
1295
1440
  widgetConfigFilter.globalFilter = this.globalFilter;
1296
- this.widgetElement.loadContent(widgetConfigFilter);
1441
+ widgetConfigFilter.dashboardInfo = me.dashboardInfo;
1442
+ //this.widgetElement.loadContent(widgetConfigFilter);
1443
+ this.widgetLoaded.emit();
1297
1444
  return [4 /*yield*/, this.setLock(widgetConfigFilter.config)];
1298
1445
  case 1:
1299
1446
  _a.sent();
@@ -1563,9 +1710,12 @@ var RAWidgetContainer = /** @class */ (function () {
1563
1710
  var html = '<div id="ra-db-widget-menu"' + 'style="' + style + '" class="download-content dropdown-content widget-config-item dropdown-click" style="z-index: 1002;">';
1564
1711
  var settings = '';
1565
1712
  if (this.isWidgetMgmnt) {
1566
- settings += this.getHtmlForButton('wcEditWidget', 'fal fa-edit', this.editText);
1567
- settings += this.getHtmlForButton('wcCopyWidget', 'fal fa-copy', this.copyText);
1568
- settings += this.getHtmlForButton('wcMoveWidget', 'fal fa-arrows-alt', this.moveText);
1713
+ if (!this.data.widgetInfo.templateWidgetSettings || !this.data.widgetInfo.templateWidgetSettings.hideEdit)
1714
+ settings += this.getHtmlForButton('wcEditWidget', 'fal fa-edit', this.editText);
1715
+ if (!this.data.widgetInfo.templateWidgetSettings || !this.data.widgetInfo.templateWidgetSettings.hideCopy)
1716
+ settings += this.getHtmlForButton('wcCopyWidget', 'fal fa-copy', this.copyText);
1717
+ if (!this.data.widgetInfo.templateWidgetSettings || !this.data.widgetInfo.templateWidgetSettings.hideMove)
1718
+ settings += this.getHtmlForButton('wcMoveWidget', 'fal fa-arrows-alt', this.moveText);
1569
1719
  }
1570
1720
  var customPageParams = false;
1571
1721
  if (this.data.widgetInfo && this.data.widgetInfo.widgetSettings) {
@@ -1574,14 +1724,14 @@ var RAWidgetContainer = /** @class */ (function () {
1574
1724
  customPageParams = true;
1575
1725
  }
1576
1726
  }
1577
- if ((this.detailPageUrl || customPageParams) && this.checkVisitLinkVisiblity()) {
1727
+ if (!this.data.widgetInfo.templateWidgetSettings || !this.data.widgetInfo.templateWidgetSettings.hideVisitPage && (this.detailPageUrl || customPageParams) && this.checkVisitLinkVisiblity()) {
1578
1728
  settings += '<a style="max-height: 30px;align-items: center;align-content: center; display: flex;" id="wcVisitWidget">';
1579
1729
  settings += '<i style="padding-left: 4px;font-size: 27px !important;" class="fal fa-angle-right"></i> ';
1580
1730
  settings += '<span style="padding-left: 11px;margin-top: 2px;" style="padding-left: 6px;">';
1581
1731
  settings += this.translateService.translate('Common.visitpage');
1582
1732
  settings += '</span></a>';
1583
1733
  }
1584
- if ((this.detailPageUrl && this.checkVisitLinkVisiblity()) || this.isWidgetMgmnt) {
1734
+ if (!this.data.widgetInfo.templateWidgetSettings || !this.data.widgetInfo.templateWidgetSettings.hideVisitPage && (this.detailPageUrl && this.checkVisitLinkVisiblity()) || this.isWidgetMgmnt) {
1585
1735
  html += '<div style="color: #9FA0A4;font-size: 12px;padding-top: 8px;padding-left: 12px;">';
1586
1736
  html += this.translateService.translate('Common.settings') + '</div>';
1587
1737
  html += settings;
@@ -1613,7 +1763,7 @@ var RAWidgetContainer = /** @class */ (function () {
1613
1763
  if (this.isDownloadIconVisible && this.isWidgetMgmnt && this.showExcell) {
1614
1764
  html += this.getHr();
1615
1765
  }
1616
- if (this.isWidgetMgmnt) {
1766
+ if (this.isWidgetMgmnt && !this.data.widgetInfo.templateWidgetSettings || !this.data.widgetInfo.templateWidgetSettings.hideDelete) {
1617
1767
  html += '<a id="wcWidgetDelete"><i class="fal fa-times" style="padding-left: 3px;color: red;"></i><span>';
1618
1768
  html += this.deleteText;
1619
1769
  html += '</span></a>';
@@ -1694,18 +1844,6 @@ var RAWidgetContainer = /** @class */ (function () {
1694
1844
  if (this.currentComponent)
1695
1845
  this.popupInstance.removeMe(this.currentComponent);
1696
1846
  };
1697
- RAWidgetContainer.prototype.getwidgetTitleTranslation = function (item) {
1698
- var rKey = 'DBW_' + this.translateService.makeCode(item);
1699
- var translatedString = '';
1700
- var translationModule = this.dashboardService.clientId + '_DBW';
1701
- translatedString = this.translateService.translate(translationModule + '.' + rKey);
1702
- if (translatedString.toLowerCase() === rKey.toLowerCase()) {
1703
- return item;
1704
- }
1705
- else {
1706
- return translatedString;
1707
- }
1708
- };
1709
1847
  RAWidgetContainer.ctorParameters = function () { return [
1710
1848
  { type: RaDashboardService },
1711
1849
  { type: NgxUiLoaderService },
@@ -1748,6 +1886,10 @@ var RAWidgetContainer = /** @class */ (function () {
1748
1886
  Input('global-filter'),
1749
1887
  __metadata("design:type", Object)
1750
1888
  ], RAWidgetContainer.prototype, "globalFilter", void 0);
1889
+ __decorate([
1890
+ Input('dashboard-info'),
1891
+ __metadata("design:type", Object)
1892
+ ], RAWidgetContainer.prototype, "dashboardInfo", void 0);
1751
1893
  __decorate([
1752
1894
  Input('data'),
1753
1895
  __metadata("design:type", Object)
@@ -1772,6 +1914,14 @@ var RAWidgetContainer = /** @class */ (function () {
1772
1914
  Input('grid-cell-height'),
1773
1915
  __metadata("design:type", Number)
1774
1916
  ], RAWidgetContainer.prototype, "gridCellHeight", void 0);
1917
+ __decorate([
1918
+ Input('bulk-action-data'),
1919
+ __metadata("design:type", Object)
1920
+ ], RAWidgetContainer.prototype, "bulkActionData", void 0);
1921
+ __decorate([
1922
+ Input(),
1923
+ __metadata("design:type", Boolean)
1924
+ ], RAWidgetContainer.prototype, "canLoadData", void 0);
1775
1925
  __decorate([
1776
1926
  Output(),
1777
1927
  __metadata("design:type", Object)
@@ -1780,6 +1930,14 @@ var RAWidgetContainer = /** @class */ (function () {
1780
1930
  Output(),
1781
1931
  __metadata("design:type", Object)
1782
1932
  ], RAWidgetContainer.prototype, "updateAppliedFilters", void 0);
1933
+ __decorate([
1934
+ Output(),
1935
+ __metadata("design:type", Object)
1936
+ ], RAWidgetContainer.prototype, "dataLoaded", void 0);
1937
+ __decorate([
1938
+ Output(),
1939
+ __metadata("design:type", Object)
1940
+ ], RAWidgetContainer.prototype, "widgetLoaded", void 0);
1783
1941
  __decorate([
1784
1942
  Input('dom-resized'),
1785
1943
  __metadata("design:type", Boolean),
@@ -4778,11 +4936,13 @@ var RaBaseDashboardTemplate = /** @class */ (function () {
4778
4936
  function RaBaseDashboardTemplate(ngZone) {
4779
4937
  var _this = this;
4780
4938
  this.ngZone = ngZone;
4781
- this.initialize = function (eventBus, userDashboardId, appConfig) {
4939
+ this.initialize = function (eventBus, userDashboardId, appConfig, dashboardInfo, templateConfig) {
4782
4940
  _this.ngZone.run(function () {
4783
4941
  _this.userDashboardId = userDashboardId;
4784
4942
  _this.appConfig = appConfig;
4785
4943
  _this.raDashboardEventBus = eventBus;
4944
+ _this.dashboardInfo = dashboardInfo;
4945
+ _this.templateConfig = templateConfig;
4786
4946
  });
4787
4947
  _this.init();
4788
4948
  };