@onecx/angular-accelerator 4.43.0 → 5.0.0

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 (130) hide show
  1. package/{esm2020 → esm2022}/lib/angular-accelerator-primeng.module.mjs +53 -53
  2. package/esm2022/lib/angular-accelerator.module.mjs +168 -0
  3. package/esm2022/lib/components/column-group-selection/column-group-selection.component.mjs +72 -0
  4. package/esm2022/lib/components/custom-group-column-selector/custom-group-column-selector.component.mjs +109 -0
  5. package/esm2022/lib/components/data-layout-selection/data-layout-selection.component.mjs +46 -0
  6. package/esm2022/lib/components/data-list-grid/data-list-grid.component.mjs +399 -0
  7. package/esm2022/lib/components/data-list-grid-sorting/data-list-grid-sorting.component.mjs +92 -0
  8. package/esm2022/lib/components/data-sort-base/data-sort-base.mjs +110 -0
  9. package/esm2022/lib/components/data-table/data-table.component.mjs +401 -0
  10. package/esm2022/lib/components/data-view/data-view.component.mjs +407 -0
  11. package/esm2022/lib/components/diagram/diagram.component.mjs +137 -0
  12. package/esm2022/lib/components/group-by-count-diagram/group-by-count-diagram.component.mjs +109 -0
  13. package/esm2022/lib/components/interactive-data-view/interactive-data-view.component.mjs +375 -0
  14. package/esm2022/lib/components/page-header/page-header.component.mjs +232 -0
  15. package/{esm2020 → esm2022}/lib/components/search-config/search-config.component.mjs +4 -4
  16. package/esm2022/lib/components/search-header/search-header.component.mjs +136 -0
  17. package/esm2022/lib/directives/advanced.directive.mjs +36 -0
  18. package/esm2022/lib/directives/if-breakpoint.directive.mjs +39 -0
  19. package/esm2022/lib/directives/if-permission.directive.mjs +80 -0
  20. package/esm2022/lib/directives/src.directive.mjs +59 -0
  21. package/esm2022/lib/functions/flatten-object.mjs +20 -0
  22. package/{esm2020 → esm2022}/lib/model/breadcrumb-menu-item.model.mjs +1 -1
  23. package/esm2022/lib/pipes/dynamic.pipe.mjs +58 -0
  24. package/esm2022/lib/pipes/ocxtimeago.pipe.mjs +107 -0
  25. package/esm2022/lib/services/app-config-service.mjs +43 -0
  26. package/esm2022/lib/services/breadcrumb.service.mjs +113 -0
  27. package/esm2022/lib/services/translation-cache.service.mjs +41 -0
  28. package/esm2022/lib/utils/async-translate-loader.utils.mjs +12 -0
  29. package/esm2022/lib/utils/caching-translate-loader.utils.mjs +15 -0
  30. package/{esm2020 → esm2022}/lib/utils/colorutils.mjs +1 -1
  31. package/{esm2020 → esm2022}/lib/utils/dateutils.mjs +6 -6
  32. package/esm2022/lib/utils/objectutils.mjs +30 -0
  33. package/{esm2020 → esm2022}/lib/utils/translate.combined.loader.mjs +1 -1
  34. package/{esm2020 → esm2022}/testing/column-group-selection.harness.mjs +2 -2
  35. package/esm2022/testing/custom-group-column-selector.harness.mjs +31 -0
  36. package/esm2022/testing/data-layout-selection.harness.mjs +33 -0
  37. package/esm2022/testing/data-list-grid.harness.mjs +47 -0
  38. package/esm2022/testing/data-table.harness.mjs +63 -0
  39. package/{esm2020 → esm2022}/testing/data-view.harness.mjs +2 -2
  40. package/esm2022/testing/default-grid-item.harness.mjs +24 -0
  41. package/esm2022/testing/default-list-item.harness.mjs +24 -0
  42. package/esm2022/testing/diagram.harness.mjs +22 -0
  43. package/{esm2020 → esm2022}/testing/group-by-count-diagram.harness.mjs +2 -2
  44. package/{esm2020 → esm2022}/testing/interactive-data-view.harness.mjs +2 -2
  45. package/esm2022/testing/more-actions-menu-button.harness.mjs +35 -0
  46. package/esm2022/testing/page-header.harness.mjs +78 -0
  47. package/{esm2020 → esm2022}/testing/search-config.harness.mjs +2 -2
  48. package/{esm2020 → esm2022}/testing/search-header.harness.mjs +2 -2
  49. package/{fesm2020 → fesm2022}/onecx-angular-accelerator-testing.mjs +34 -28
  50. package/fesm2022/onecx-angular-accelerator-testing.mjs.map +1 -0
  51. package/{fesm2020 → fesm2022}/onecx-angular-accelerator.mjs +244 -224
  52. package/fesm2022/onecx-angular-accelerator.mjs.map +1 -0
  53. package/lib/components/column-group-selection/column-group-selection.component.d.ts +1 -1
  54. package/lib/components/custom-group-column-selector/custom-group-column-selector.component.d.ts +1 -1
  55. package/lib/components/data-layout-selection/data-layout-selection.component.d.ts +1 -1
  56. package/lib/components/data-list-grid/data-list-grid.component.d.ts +1 -1
  57. package/lib/components/data-list-grid-sorting/data-list-grid-sorting.component.d.ts +1 -1
  58. package/lib/components/data-table/data-table.component.d.ts +1 -1
  59. package/lib/components/data-view/data-view.component.d.ts +2 -2
  60. package/lib/components/diagram/diagram.component.d.ts +2 -2
  61. package/lib/components/group-by-count-diagram/group-by-count-diagram.component.d.ts +1 -1
  62. package/lib/components/interactive-data-view/interactive-data-view.component.d.ts +1 -1
  63. package/lib/components/page-header/page-header.component.d.ts +1 -1
  64. package/lib/components/search-config/search-config.component.d.ts +1 -1
  65. package/lib/components/search-header/search-header.component.d.ts +1 -1
  66. package/lib/directives/if-breakpoint.directive.d.ts +1 -1
  67. package/lib/directives/if-permission.directive.d.ts +14 -5
  68. package/lib/directives/src.directive.d.ts +1 -1
  69. package/lib/model/breadcrumb-menu-item.model.d.ts +2 -2
  70. package/package.json +20 -28
  71. package/testing/data-list-grid.harness.d.ts +1 -1
  72. package/esm2020/lib/angular-accelerator.module.mjs +0 -160
  73. package/esm2020/lib/components/column-group-selection/column-group-selection.component.mjs +0 -72
  74. package/esm2020/lib/components/custom-group-column-selector/custom-group-column-selector.component.mjs +0 -109
  75. package/esm2020/lib/components/data-layout-selection/data-layout-selection.component.mjs +0 -45
  76. package/esm2020/lib/components/data-list-grid/data-list-grid.component.mjs +0 -399
  77. package/esm2020/lib/components/data-list-grid-sorting/data-list-grid-sorting.component.mjs +0 -92
  78. package/esm2020/lib/components/data-sort-base/data-sort-base.mjs +0 -110
  79. package/esm2020/lib/components/data-table/data-table.component.mjs +0 -401
  80. package/esm2020/lib/components/data-view/data-view.component.mjs +0 -407
  81. package/esm2020/lib/components/diagram/diagram.component.mjs +0 -137
  82. package/esm2020/lib/components/group-by-count-diagram/group-by-count-diagram.component.mjs +0 -109
  83. package/esm2020/lib/components/interactive-data-view/interactive-data-view.component.mjs +0 -375
  84. package/esm2020/lib/components/page-header/page-header.component.mjs +0 -232
  85. package/esm2020/lib/components/search-header/search-header.component.mjs +0 -136
  86. package/esm2020/lib/directives/advanced.directive.mjs +0 -36
  87. package/esm2020/lib/directives/if-breakpoint.directive.mjs +0 -39
  88. package/esm2020/lib/directives/if-permission.directive.mjs +0 -70
  89. package/esm2020/lib/directives/src.directive.mjs +0 -59
  90. package/esm2020/lib/functions/flatten-object.mjs +0 -20
  91. package/esm2020/lib/pipes/dynamic.pipe.mjs +0 -58
  92. package/esm2020/lib/pipes/ocxtimeago.pipe.mjs +0 -107
  93. package/esm2020/lib/services/app-config-service.mjs +0 -43
  94. package/esm2020/lib/services/breadcrumb.service.mjs +0 -113
  95. package/esm2020/lib/services/translation-cache.service.mjs +0 -41
  96. package/esm2020/lib/utils/async-translate-loader.utils.mjs +0 -12
  97. package/esm2020/lib/utils/caching-translate-loader.utils.mjs +0 -15
  98. package/esm2020/lib/utils/objectutils.mjs +0 -30
  99. package/esm2020/testing/custom-group-column-selector.harness.mjs +0 -31
  100. package/esm2020/testing/data-layout-selection.harness.mjs +0 -33
  101. package/esm2020/testing/data-list-grid.harness.mjs +0 -47
  102. package/esm2020/testing/data-table.harness.mjs +0 -57
  103. package/esm2020/testing/default-grid-item.harness.mjs +0 -24
  104. package/esm2020/testing/default-list-item.harness.mjs +0 -24
  105. package/esm2020/testing/diagram.harness.mjs +0 -22
  106. package/esm2020/testing/more-actions-menu-button.harness.mjs +0 -35
  107. package/esm2020/testing/page-header.harness.mjs +0 -78
  108. package/fesm2015/onecx-angular-accelerator-testing.mjs +0 -541
  109. package/fesm2015/onecx-angular-accelerator-testing.mjs.map +0 -1
  110. package/fesm2015/onecx-angular-accelerator.mjs +0 -3563
  111. package/fesm2015/onecx-angular-accelerator.mjs.map +0 -1
  112. package/fesm2020/onecx-angular-accelerator-testing.mjs.map +0 -1
  113. package/fesm2020/onecx-angular-accelerator.mjs.map +0 -1
  114. /package/{esm2020 → esm2022}/index.mjs +0 -0
  115. /package/{esm2020 → esm2022}/lib/model/column-type.model.mjs +0 -0
  116. /package/{esm2020 → esm2022}/lib/model/data-action.mjs +0 -0
  117. /package/{esm2020 → esm2022}/lib/model/data-column-name-id.model.mjs +0 -0
  118. /package/{esm2020 → esm2022}/lib/model/data-sort-direction.mjs +0 -0
  119. /package/{esm2020 → esm2022}/lib/model/data-table-column.model.mjs +0 -0
  120. /package/{esm2020 → esm2022}/lib/model/diagram-column.mjs +0 -0
  121. /package/{esm2020 → esm2022}/lib/model/diagram-data.mjs +0 -0
  122. /package/{esm2020 → esm2022}/lib/model/diagram-type.mjs +0 -0
  123. /package/{esm2020 → esm2022}/lib/model/search-config-info.mjs +0 -0
  124. /package/{esm2020 → esm2022}/lib/utils/create-remote-component-translate-loader.utils.mjs +0 -0
  125. /package/{esm2020 → esm2022}/lib/utils/create-translate-loader.utils.mjs +0 -0
  126. /package/{esm2020 → esm2022}/lib/utils/enum-to-dropdown-options.utils.mjs +0 -0
  127. /package/{esm2020 → esm2022}/lib/utils/primeicon.utils.mjs +0 -0
  128. /package/{esm2020 → esm2022}/onecx-angular-accelerator.mjs +0 -0
  129. /package/{esm2020 → esm2022}/testing/index.mjs +0 -0
  130. /package/{esm2020 → esm2022}/testing/onecx-angular-accelerator-testing.mjs +0 -0
@@ -0,0 +1,137 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { TranslateService } from '@ngx-translate/core';
3
+ import * as d3 from 'd3-scale-chromatic';
4
+ import { PrimeIcons } from 'primeng/api';
5
+ import { ColorUtils } from '../../utils/colorutils';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@ngx-translate/core";
8
+ import * as i2 from "@angular/common";
9
+ import * as i3 from "primeng/api";
10
+ import * as i4 from "primeng/selectbutton";
11
+ import * as i5 from "primeng/chart";
12
+ import * as i6 from "primeng/message";
13
+ import * as i7 from "@angular/forms";
14
+ const allDiagramTypes = [
15
+ { icon: PrimeIcons.CHART_PIE, layout: "PIE" /* DiagramType.PIE */, titleKey: 'OCX_DIAGRAM.SWITCH_DIAGRAM_TYPE.PIE' },
16
+ {
17
+ icon: PrimeIcons.BARS,
18
+ layout: "HORIZONTAL_BAR" /* DiagramType.HORIZONTAL_BAR */,
19
+ titleKey: 'OCX_DIAGRAM.SWITCH_DIAGRAM_TYPE.HORIZONTAL_BAR',
20
+ },
21
+ {
22
+ icon: PrimeIcons.CHART_BAR,
23
+ layout: "VERTICAL_BAR" /* DiagramType.VERTICAL_BAR */,
24
+ titleKey: 'OCX_DIAGRAM.SWITCH_DIAGRAM_TYPE.VERTICAL_BAR',
25
+ },
26
+ ];
27
+ export class DiagramComponent {
28
+ get diagramType() {
29
+ return this._diagramType;
30
+ }
31
+ set diagramType(value) {
32
+ this._diagramType = value;
33
+ this.selectedDiagramType = allDiagramTypes.find((v) => v.layout === value);
34
+ this.chartType = this.diagramTypeToChartType(value);
35
+ }
36
+ get supportedDiagramTypes() {
37
+ return this._supportedDiagramTypes;
38
+ }
39
+ set supportedDiagramTypes(value) {
40
+ this._supportedDiagramTypes = value;
41
+ this.shownDiagramTypes = allDiagramTypes.filter((vl) => this.supportedDiagramTypes.includes(vl.layout));
42
+ }
43
+ constructor(translateService) {
44
+ this.translateService = translateService;
45
+ this.sumKey = 'OCX_DIAGRAM.SUM';
46
+ this._diagramType = "PIE" /* DiagramType.PIE */;
47
+ this.chartType = 'pie';
48
+ this._supportedDiagramTypes = [];
49
+ this.dataSelected = new EventEmitter();
50
+ this.diagramTypeChanged = new EventEmitter();
51
+ this.shownDiagramTypes = [];
52
+ // Changing the colorRangeInfo, will change the range of the color palette of the diagram.
53
+ this.colorRangeInfo = {
54
+ colorStart: 0,
55
+ colorEnd: 1,
56
+ useEndAsStart: false,
57
+ };
58
+ // Changing the colorScale, will change the thematic color appearance of the diagram.
59
+ this.colorScale = d3.interpolateCool;
60
+ }
61
+ ngOnChanges() {
62
+ this.generateChart(this.colorScale, this.colorRangeInfo);
63
+ }
64
+ ngOnInit() {
65
+ this.generateChart(this.colorScale, this.colorRangeInfo);
66
+ }
67
+ generateChart(colorScale, colorRangeInfo) {
68
+ if (this.data) {
69
+ const inputData = this.data.map((diagramData) => diagramData.value);
70
+ this.amountOfData = this.data.reduce((acc, current) => acc + current.value, 0);
71
+ const COLORS = interpolateColors(this.data.length, colorScale, colorRangeInfo);
72
+ this.chartData = {
73
+ labels: this.data.map((data) => data.label),
74
+ datasets: [
75
+ {
76
+ data: inputData,
77
+ backgroundColor: COLORS,
78
+ },
79
+ ],
80
+ };
81
+ }
82
+ this.chartOptions = {
83
+ plugins: {
84
+ legend: {
85
+ position: 'bottom',
86
+ },
87
+ },
88
+ maintainAspectRatio: false,
89
+ ...(this._diagramType === "VERTICAL_BAR" /* DiagramType.VERTICAL_BAR */ && {
90
+ plugins: { legend: { display: false } },
91
+ scales: { y: { ticks: { precision: 0 } } },
92
+ }),
93
+ ...(this._diagramType === "HORIZONTAL_BAR" /* DiagramType.HORIZONTAL_BAR */ && {
94
+ indexAxis: 'y',
95
+ plugins: { legend: { display: false } },
96
+ scales: { x: { ticks: { precision: 0 } } },
97
+ }),
98
+ };
99
+ }
100
+ diagramTypeToChartType(value) {
101
+ if (value === "PIE" /* DiagramType.PIE */)
102
+ return 'pie';
103
+ else if (value === "HORIZONTAL_BAR" /* DiagramType.HORIZONTAL_BAR */ || value === "VERTICAL_BAR" /* DiagramType.VERTICAL_BAR */)
104
+ return 'bar';
105
+ return 'pie';
106
+ }
107
+ dataClicked(event) {
108
+ this.dataSelected.emit(event.length);
109
+ }
110
+ onDiagramTypeChanged(event) {
111
+ this.diagramType = event.value.layout;
112
+ this.generateChart(this.colorScale, this.colorRangeInfo);
113
+ this.diagramTypeChanged.emit(event.value.layout);
114
+ }
115
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: DiagramComponent, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
116
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.5", type: DiagramComponent, selector: "ocx-diagram", inputs: { data: "data", sumKey: "sumKey", diagramType: "diagramType", supportedDiagramTypes: "supportedDiagramTypes" }, outputs: { dataSelected: "dataSelected", diagramTypeChanged: "diagramTypeChanged" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"this.data\">\n <div class=\"flex justify-content-center pb-2\" *ngIf=\"shownDiagramTypes.length > 1\">\n <p-selectButton\n [options]=\"shownDiagramTypes\"\n [(ngModel)]=\"selectedDiagramType\"\n optionLabel=\"icon\"\n (onChange)=\"onDiagramTypeChanged($event)\"\n name=\"diagram-type-select-button\"\n >\n <ng-template let-item pTemplate>\n <i [class]=\"item.icon\" [title]=\"item.title || (item.titleKey | translate)\"></i>\n </ng-template>\n </p-selectButton>\n </div>\n <div class=\"w-full flex justify-content-center\">\n <p-chart\n id=\"diagram\"\n [type]=\"chartType\"\n [data]=\"chartData\"\n [responsive]=\"false\"\n [options]=\"chartOptions\"\n (onDataSelect)=\"dataClicked($event)\"\n ></p-chart>\n </div>\n <div class=\"w-full flex justify-content-center mt-2 sumKey\">\n <p class=\"text-md font-medium text-700\">\n <span name=\"sumLabel\"> {{ sumKey | translate }}</span> : <span name=\"amountOfData\">{{ amountOfData}}</span>\n </p>\n </div>\n</ng-container>\n\n<div *ngIf=\"!this.data\" class=\"w-full flex justify-content-center\">\n <p-message severity=\"info\" text=\"{{ 'OCX_DIAGRAM.NO_DATA' | translate }}\"></p-message>\n</div>\n", styles: ["::ng-deep .p-buttonset .p-button{min-width:auto}::ng-deep .p-buttonset{display:flex}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i4.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey", "autofocus"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i5.UIChart, selector: "p-chart", inputs: ["type", "plugins", "width", "height", "responsive", "ariaLabel", "ariaLabelledBy", "data", "options"], outputs: ["onDataSelect"] }, { kind: "component", type: i6.UIMessage, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] }); }
117
+ }
118
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: DiagramComponent, decorators: [{
119
+ type: Component,
120
+ args: [{ selector: 'ocx-diagram', template: "<ng-container *ngIf=\"this.data\">\n <div class=\"flex justify-content-center pb-2\" *ngIf=\"shownDiagramTypes.length > 1\">\n <p-selectButton\n [options]=\"shownDiagramTypes\"\n [(ngModel)]=\"selectedDiagramType\"\n optionLabel=\"icon\"\n (onChange)=\"onDiagramTypeChanged($event)\"\n name=\"diagram-type-select-button\"\n >\n <ng-template let-item pTemplate>\n <i [class]=\"item.icon\" [title]=\"item.title || (item.titleKey | translate)\"></i>\n </ng-template>\n </p-selectButton>\n </div>\n <div class=\"w-full flex justify-content-center\">\n <p-chart\n id=\"diagram\"\n [type]=\"chartType\"\n [data]=\"chartData\"\n [responsive]=\"false\"\n [options]=\"chartOptions\"\n (onDataSelect)=\"dataClicked($event)\"\n ></p-chart>\n </div>\n <div class=\"w-full flex justify-content-center mt-2 sumKey\">\n <p class=\"text-md font-medium text-700\">\n <span name=\"sumLabel\"> {{ sumKey | translate }}</span> : <span name=\"amountOfData\">{{ amountOfData}}</span>\n </p>\n </div>\n</ng-container>\n\n<div *ngIf=\"!this.data\" class=\"w-full flex justify-content-center\">\n <p-message severity=\"info\" text=\"{{ 'OCX_DIAGRAM.NO_DATA' | translate }}\"></p-message>\n</div>\n", styles: ["::ng-deep .p-buttonset .p-button{min-width:auto}::ng-deep .p-buttonset{display:flex}\n"] }]
121
+ }], ctorParameters: () => [{ type: i1.TranslateService }], propDecorators: { data: [{
122
+ type: Input
123
+ }], sumKey: [{
124
+ type: Input
125
+ }], diagramType: [{
126
+ type: Input
127
+ }], supportedDiagramTypes: [{
128
+ type: Input
129
+ }], dataSelected: [{
130
+ type: Output
131
+ }], diagramTypeChanged: [{
132
+ type: Output
133
+ }] } });
134
+ function interpolateColors(amountOfData, colorScale, colorRangeInfo) {
135
+ return ColorUtils.interpolateColors(amountOfData, colorScale, colorRangeInfo);
136
+ }
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ3JhbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RpYWdyYW0vZGlhZ3JhbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RpYWdyYW0vZGlhZ3JhbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUN6RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUV0RCxPQUFPLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFHeEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFBOzs7Ozs7Ozs7QUFVbkQsTUFBTSxlQUFlLEdBQXFCO0lBQ3hDLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsTUFBTSw2QkFBaUIsRUFBRSxRQUFRLEVBQUUscUNBQXFDLEVBQUU7SUFDeEc7UUFDRSxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7UUFDckIsTUFBTSxtREFBNEI7UUFDbEMsUUFBUSxFQUFFLGdEQUFnRDtLQUMzRDtJQUNEO1FBQ0UsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTO1FBQzFCLE1BQU0sK0NBQTBCO1FBQ2hDLFFBQVEsRUFBRSw4Q0FBOEM7S0FDekQ7Q0FDRixDQUFBO0FBT0QsTUFBTSxPQUFPLGdCQUFnQjtJQU8zQixJQUNJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUE7SUFDMUIsQ0FBQztJQUNELElBQUks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LEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEQsQ0FBQzs4R0FyR1UsZ0JBQWdCO2tHQUFoQixnQkFBZ0IscVJDcEM3QixxeENBa0NBOzsyRkRFYSxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsYUFBYTtxRkFLZCxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQU1GLFdBQVc7c0JBRGQsS0FBSztnQkFXRixxQkFBcUI7c0JBRHhCLEtBQUs7Z0JBUUksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07O0FBNkVULFNBQVMsaUJBQWlCLENBQUMsWUFBb0IsRUFBRSxVQUFlLEVBQUUsY0FBbUI7SUFDbkYsT0FBTyxVQUFVLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQTtBQUMvRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJ1xuaW1wb3J0IHsgQ2hhcnREYXRhLCBDaGFydE9wdGlvbnMgfSBmcm9tICdjaGFydC5qcydcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzLXNjYWxlLWNocm9tYXRpYydcbmltcG9ydCB7IFByaW1lSWNvbnMgfSBmcm9tICdwcmltZW5nL2FwaSdcbmltcG9ydCB7IERpYWdyYW1EYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGlhZ3JhbS1kYXRhJ1xuaW1wb3J0IHsgRGlhZ3JhbVR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9kaWFncmFtLXR5cGUnXG5pbXBvcnQgeyBDb2xvclV0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29sb3J1dGlscydcbmltcG9ydCB7IFByaW1lSWNvbiB9IGZyb20gJy4uLy4uL3V0aWxzL3ByaW1laWNvbi51dGlscydcblxuZXhwb3J0IGludGVyZmFjZSBEaWFncmFtTGF5b3V0cyB7XG4gIGljb246IFByaW1lSWNvblxuICBsYXlvdXQ6IERpYWdyYW1UeXBlXG4gIHRpdGxlPzogc3RyaW5nXG4gIHRpdGxlS2V5OiBzdHJpbmdcbn1cblxuY29uc3QgYWxsRGlhZ3JhbVR5cGVzOiBEaWFncmFtTGF5b3V0c1tdID0gW1xuICB7IGljb246IFByaW1lSWNvbnMuQ0hBUlRfUElFLCBsYXlvdXQ6IERpYWdyYW1UeXBlLlBJRSwgdGl0bGVLZXk6ICdPQ1hfRElBR1JBTS5TV0lUQ0hfRElBR1JBTV9UWVBFLlBJRScgfSxcbiAge1xuICAgIGljb246IFByaW1lSWNvbnMuQkFSUyxcbiAgICBsYXlvdXQ6IERpYWdyYW1UeXBlLkhPUklaT05UQUxfQkFSLFxuICAgIHRpdGxlS2V5OiAnT0NYX0RJQUdSQU0uU1dJVENIX0RJQUdSQU1fVFlQRS5IT1JJWk9OVEFMX0JBUicsXG4gIH0sXG4gIHtcbiAgICBpY29uOiBQcmltZUljb25zLkNIQVJUX0JBUixcbiAgICBsYXlvdXQ6IERpYWdyYW1UeXBlLlZFUlRJQ0FMX0JBUixcbiAgICB0aXRsZUtleTogJ09DWF9ESUFHUkFNLlNXSVRDSF9ESUFHUkFNX1RZUEUuVkVSVElDQUxfQkFSJyxcbiAgfSxcbl1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2N4LWRpYWdyYW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZGlhZ3JhbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RpYWdyYW0uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRGlhZ3JhbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZGF0YTogRGlhZ3JhbURhdGFbXSB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBzdW1LZXkgPSAnT0NYX0RJQUdSQU0uU1VNJ1xuICBwcml2YXRlIF9kaWFncmFtVHlwZTogRGlhZ3JhbVR5cGUgPSBEaWFncmFtVHlwZS5QSUVcbiAgc2VsZWN0ZWREaWFncmFtVHlwZTogRGlhZ3JhbUxheW91dHMgfCB1bmRlZmluZWRcbiAgcHVibGljIGNoYXJ0VHlwZTogJ2JhcicgfCAnbGluZScgfCAnc2NhdHRlcicgfCAnYnViYmxlJyB8ICdwaWUnIHwgJ2RvdWdobnV0JyB8ICdwb2xhckFyZWEnIHwgJ3JhZGFyJyB8IHVuZGVmaW5lZCA9XG4gICAgJ3BpZSdcbiAgQElucHV0KClcbiAgZ2V0IGRpYWdyYW1UeXBlKCk6IERpYWdyYW1UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZGlhZ3JhbVR5cGVcbiAgfVxuICBzZXQgZGlhZ3JhbVR5cGUodmFsdWU6IERpYWdyYW1UeXBlKSB7XG4gICAgdGhpcy5fZGlhZ3JhbVR5cGUgPSB2YWx1ZVxuICAgIHRoaXMuc2VsZWN0ZWREaWFncmFtVHlwZSA9IGFsbERpYWdyYW1UeXBlcy5maW5kKCh2KSA9PiB2LmxheW91dCA9PT0gdmFsdWUpXG4gICAgdGhpcy5jaGFydFR5cGUgPSB0aGlzLmRpYWdyYW1UeXBlVG9DaGFydFR5cGUodmFsdWUpXG4gIH1cbiAgcHJpdmF0ZSBfc3VwcG9ydGVkRGlhZ3JhbVR5cGVzOiBEaWFncmFtVHlwZVtdID0gW11cbiAgQElucHV0KClcbiAgZ2V0IHN1cHBvcnRlZERpYWdyYW1UeXBlcygpOiBEaWFncmFtVHlwZVtdIHtcbiAgICByZXR1cm4gdGhpcy5fc3VwcG9ydGVkRGlhZ3JhbVR5cGVzXG4gIH1cbiAgc2V0IHN1cHBvcnRlZERpYWdyYW1UeXBlcyh2YWx1ZTogRGlhZ3JhbVR5cGVbXSkge1xuICAgIHRoaXMuX3N1cHBvcnRlZERpYWdyYW1UeXBlcyA9IHZhbHVlXG4gICAgdGhpcy5zaG93bkRpYWdyYW1UeXBlcyA9IGFsbERpYWdyYW1UeXBlcy5maWx0ZXIoKHZsKSA9PiB0aGlzLnN1cHBvcnRlZERpYWdyYW1UeXBlcy5pbmNsdWRlcyh2bC5sYXlvdXQpKVxuICB9XG4gIEBPdXRwdXQoKSBkYXRhU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG4gIEBPdXRwdXQoKSBkaWFncmFtVHlwZUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxEaWFncmFtVHlwZT4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgY2hhcnRPcHRpb25zOiBDaGFydE9wdGlvbnMgfCB1bmRlZmluZWRcbiAgY2hhcnREYXRhOiBDaGFydERhdGEgfCB1bmRlZmluZWRcbiAgYW1vdW50T2ZEYXRhOiBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsXG4gIHNob3duRGlhZ3JhbVR5cGVzOiBEaWFncmFtTGF5b3V0c1tdID0gW11cbiAgLy8gQ2hhbmdpbmcgdGhlIGNvbG9yUmFuZ2VJbmZvLCB3aWxsIGNoYW5nZSB0aGUgcmFuZ2Ugb2YgdGhlIGNvbG9yIHBhbGV0dGUgb2YgdGhlIGRpYWdyYW0uXG4gIHByaXZhdGUgY29sb3JSYW5nZUluZm8gPSB7XG4gICAgY29sb3JTdGFydDogMCxcbiAgICBjb2xvckVuZDogMSxcbiAgICB1c2VFbmRBc1N0YXJ0OiBmYWxzZSxcbiAgfVxuICAvLyBDaGFuZ2luZyB0aGUgY29sb3JTY2FsZSwgd2lsbCBjaGFuZ2UgdGhlIHRoZW1hdGljIGNvbG9yIGFwcGVhcmFuY2Ugb2YgdGhlIGRpYWdyYW0uXG4gIHByaXZhdGUgY29sb3JTY2FsZSA9IGQzLmludGVycG9sYXRlQ29vbFxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSkge31cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmdlbmVyYXRlQ2hhcnQodGhpcy5jb2xvclNjYWxlLCB0aGlzLmNvbG9yUmFuZ2VJbmZvKVxuICB9XG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2VuZXJhdGVDaGFydCh0aGlzLmNvbG9yU2NhbGUsIHRoaXMuY29sb3JSYW5nZUluZm8pXG4gIH1cblxuICBwdWJsaWMgZ2VuZXJhdGVDaGFydChjb2xvclNjYWxlOiBhbnksIGNvbG9yUmFuZ2VJbmZvOiBhbnkpIHtcbiAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICBjb25zdCBpbnB1dERhdGEgPSB0aGlzLmRhdGEubWFwKChkaWFncmFtRGF0YSkgPT4gZGlhZ3JhbURhdGEudmFsdWUpXG5cbiAgICAgIHRoaXMuYW1vdW50T2ZEYXRhID0gdGhpcy5kYXRhLnJlZHVjZSgoYWNjLCBjdXJyZW50KSA9PiBhY2MgKyBjdXJyZW50LnZhbHVlLCAwKVxuICAgICAgY29uc3QgQ09MT1JTID0gaW50ZXJwb2xhdGVDb2xvcnModGhpcy5kYXRhLmxlbmd0aCwgY29sb3JTY2FsZSwgY29sb3JSYW5nZUluZm8pXG4gICAgICB0aGlzLmNoYXJ0RGF0YSA9IHtcbiAgICAgICAgbGFiZWxzOiB0aGlzLmRhdGEubWFwKChkYXRhKSA9PiBkYXRhLmxhYmVsKSxcbiAgICAgICAgZGF0YXNldHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkYXRhOiBpbnB1dERhdGEsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IENPTE9SUyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY2hhcnRPcHRpb25zID0ge1xuICAgICAgcGx1Z2luczoge1xuICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2JvdHRvbScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgICAuLi4odGhpcy5fZGlhZ3JhbVR5cGUgPT09IERpYWdyYW1UeXBlLlZFUlRJQ0FMX0JBUiAmJiB7XG4gICAgICAgIHBsdWdpbnM6IHsgbGVnZW5kOiB7IGRpc3BsYXk6IGZhbHNlIH0gfSxcbiAgICAgICAgc2NhbGVzOiB7IHk6IHsgdGlja3M6IHsgcHJlY2lzaW9uOiAwIH0gfSB9LFxuICAgICAgfSksXG4gICAgICAuLi4odGhpcy5fZGlhZ3JhbVR5cGUgPT09IERpYWdyYW1UeXBlLkhPUklaT05UQUxfQkFSICYmIHtcbiAgICAgICAgaW5kZXhBeGlzOiAneScsXG4gICAgICAgIHBsdWdpbnM6IHsgbGVnZW5kOiB7IGRpc3BsYXk6IGZhbHNlIH0gfSxcbiAgICAgICAgc2NhbGVzOiB7IHg6IHsgdGlja3M6IHsgcHJlY2lzaW9uOiAwIH0gfSB9LFxuICAgICAgfSksXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkaWFncmFtVHlwZVRvQ2hhcnRUeXBlKFxuICAgIHZhbHVlOiBEaWFncmFtVHlwZVxuICApOiAnYmFyJyB8ICdsaW5lJyB8ICdzY2F0dGVyJyB8ICdidWJibGUnIHwgJ3BpZScgfCAnZG91Z2hudXQnIHwgJ3BvbGFyQXJlYScgfCAncmFkYXInIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IERpYWdyYW1UeXBlLlBJRSkgcmV0dXJuICdwaWUnXG4gICAgZWxzZSBpZiAodmFsdWUgPT09IERpYWdyYW1UeXBlLkhPUklaT05UQUxfQkFSIHx8IHZhbHVlID09PSBEaWFncmFtVHlwZS5WRVJUSUNBTF9CQVIpIHJldHVybiAnYmFyJ1xuICAgIHJldHVybiAncGllJ1xuICB9XG5cbiAgZGF0YUNsaWNrZWQoZXZlbnQ6IFtdKSB7XG4gICAgdGhpcy5kYXRhU2VsZWN0ZWQuZW1pdChldmVudC5sZW5ndGgpXG4gIH1cblxuICBvbkRpYWdyYW1UeXBlQ2hhbmdlZChldmVudDogYW55KSB7XG4gICAgdGhpcy5kaWFncmFtVHlwZSA9IGV2ZW50LnZhbHVlLmxheW91dFxuICAgIHRoaXMuZ2VuZXJhdGVDaGFydCh0aGlzLmNvbG9yU2NhbGUsIHRoaXMuY29sb3JSYW5nZUluZm8pXG4gICAgdGhpcy5kaWFncmFtVHlwZUNoYW5nZWQuZW1pdChldmVudC52YWx1ZS5sYXlvdXQpXG4gIH1cbn1cbmZ1bmN0aW9uIGludGVycG9sYXRlQ29sb3JzKGFtb3VudE9mRGF0YTogbnVtYmVyLCBjb2xvclNjYWxlOiBhbnksIGNvbG9yUmFuZ2VJbmZvOiBhbnkpIHtcbiAgcmV0dXJuIENvbG9yVXRpbHMuaW50ZXJwb2xhdGVDb2xvcnMoYW1vdW50T2ZEYXRhLCBjb2xvclNjYWxlLCBjb2xvclJhbmdlSW5mbylcbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJ0aGlzLmRhdGFcIj5cbiAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBwYi0yXCIgKm5nSWY9XCJzaG93bkRpYWdyYW1UeXBlcy5sZW5ndGggPiAxXCI+XG4gICAgICA8cC1zZWxlY3RCdXR0b25cbiAgICAgICAgW29wdGlvbnNdPVwic2hvd25EaWFncmFtVHlwZXNcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRGlhZ3JhbVR5cGVcIlxuICAgICAgICBvcHRpb25MYWJlbD1cImljb25cIlxuICAgICAgICAob25DaGFuZ2UpPVwib25EaWFncmFtVHlwZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgIG5hbWU9XCJkaWFncmFtLXR5cGUtc2VsZWN0LWJ1dHRvblwiXG4gICAgICA+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU+XG4gICAgICAgICAgPGkgW2NsYXNzXT1cIml0ZW0uaWNvblwiIFt0aXRsZV09XCJpdGVtLnRpdGxlIHx8IChpdGVtLnRpdGxlS2V5IHwgdHJhbnNsYXRlKVwiPjwvaT5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvcC1zZWxlY3RCdXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxuICAgIDxwLWNoYXJ0XG4gICAgICBpZD1cImRpYWdyYW1cIlxuICAgICAgW3R5cGVdPVwiY2hhcnRUeXBlXCJcbiAgICAgIFtkYXRhXT1cImNoYXJ0RGF0YVwiXG4gICAgICBbcmVzcG9uc2l2ZV09XCJmYWxzZVwiXG4gICAgICBbb3B0aW9uc109XCJjaGFydE9wdGlvbnNcIlxuICAgICAgKG9uRGF0YVNlbGVjdCk9XCJkYXRhQ2xpY2tlZCgkZXZlbnQpXCJcbiAgICA+PC9wLWNoYXJ0PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgbXQtMiBzdW1LZXlcIj5cbiAgICA8cCBjbGFzcz1cInRleHQtbWQgZm9udC1tZWRpdW0gdGV4dC03MDBcIj5cbiAgICAgIDxzcGFuIG5hbWU9XCJzdW1MYWJlbFwiPiB7eyBzdW1LZXkgfCB0cmFuc2xhdGUgfX08L3NwYW4+IDogPHNwYW4gbmFtZT1cImFtb3VudE9mRGF0YVwiPnt7IGFtb3VudE9mRGF0YX19PC9zcGFuPlxuICAgIDwvcD5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPGRpdiAqbmdJZj1cIiF0aGlzLmRhdGFcIiBjbGFzcz1cInctZnVsbCBmbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgPHAtbWVzc2FnZSBzZXZlcml0eT1cImluZm9cIiB0ZXh0PVwie3sgJ09DWF9ESUFHUkFNLk5PX0RBVEEnIHwgdHJhbnNsYXRlIH19XCI+PC9wLW1lc3NhZ2U+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,109 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { TranslateService } from '@ngx-translate/core';
3
+ import { BehaviorSubject, combineLatest, map, mergeMap, of } from 'rxjs';
4
+ import { ColumnType } from '../../model/column-type.model';
5
+ import { ObjectUtils } from '../../utils/objectutils';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@ngx-translate/core";
8
+ import * as i2 from "../diagram/diagram.component";
9
+ import * as i3 from "@angular/common";
10
+ export class GroupByCountDiagramComponent {
11
+ /**
12
+ * @deprecated Will be replaced by diagramType
13
+ */
14
+ get type() {
15
+ return this.diagramType;
16
+ }
17
+ set type(value) {
18
+ this.diagramType = value;
19
+ }
20
+ get data() {
21
+ return this._data$.getValue();
22
+ }
23
+ set data(value) {
24
+ this._data$.next(value);
25
+ }
26
+ get columnType() {
27
+ return this._columnType$.getValue();
28
+ }
29
+ set columnType(value) {
30
+ this._columnType$.next(value);
31
+ }
32
+ get columnField() {
33
+ return this._columnField$.getValue();
34
+ }
35
+ set columnField(value) {
36
+ this._columnField$.next(value);
37
+ }
38
+ get column() {
39
+ return { columnType: this.columnType, id: this.columnField };
40
+ }
41
+ set column(value) {
42
+ this.columnType = value.columnType;
43
+ this.columnField = value.id;
44
+ }
45
+ constructor(translateService) {
46
+ this.translateService = translateService;
47
+ this.sumKey = 'SEARCH.SUMMARY_TITLE';
48
+ this.diagramType = "PIE" /* DiagramType.PIE */;
49
+ this.supportedDiagramTypes = [];
50
+ this._data$ = new BehaviorSubject([]);
51
+ this._columnType$ = new BehaviorSubject(ColumnType.STRING);
52
+ this._columnField$ = new BehaviorSubject('');
53
+ this.dataSelected = new EventEmitter();
54
+ this.diagramTypeChanged = new EventEmitter();
55
+ }
56
+ ngOnInit() {
57
+ this.diagramData$ = combineLatest([this._data$, this._columnField$, this._columnType$]).pipe(mergeMap(([data, columnField, columnType]) => {
58
+ const columnData = data.map((d) => ObjectUtils.resolveFieldData(d, columnField));
59
+ const occurrences = columnData.reduce((acc, current) => {
60
+ return acc.some((e) => e.label === current)
61
+ ? (acc.find((e) => e.label === current).value++, acc)
62
+ : [...acc, { label: current, value: 1 }];
63
+ }, []);
64
+ if (columnType === ColumnType.TRANSLATION_KEY && occurrences.length > 0) {
65
+ return this.translateService.get(occurrences.map((o) => o.label)).pipe(map((translations) => occurrences.map((o) => ({
66
+ label: translations[o.label],
67
+ value: o.value,
68
+ }))));
69
+ }
70
+ else {
71
+ return of(occurrences);
72
+ }
73
+ }));
74
+ }
75
+ dataClicked(event) {
76
+ this.dataSelected.emit(event);
77
+ }
78
+ onDiagramTypeChanged(newDiagramType) {
79
+ this.diagramType = newDiagramType;
80
+ this.diagramTypeChanged.emit(newDiagramType);
81
+ }
82
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: GroupByCountDiagramComponent, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
83
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.5", type: GroupByCountDiagramComponent, selector: "ocx-group-by-count-diagram", inputs: { sumKey: "sumKey", diagramType: "diagramType", type: "type", supportedDiagramTypes: "supportedDiagramTypes", data: "data", columnType: "columnType", columnField: "columnField", column: "column" }, outputs: { dataSelected: "dataSelected", diagramTypeChanged: "diagramTypeChanged" }, ngImport: i0, template: "<ocx-diagram\n [data]=\"(diagramData$ | async) || []\"\n [sumKey]=\"sumKey\"\n [diagramType]=\"diagramType\"\n (onDataSelect)=\"dataClicked($event)\"\n [supportedDiagramTypes]=\"supportedDiagramTypes\"\n (diagramTypeChanged)=\"onDiagramTypeChanged($event)\"\n></ocx-diagram>\n", dependencies: [{ kind: "component", type: i2.DiagramComponent, selector: "ocx-diagram", inputs: ["data", "sumKey", "diagramType", "supportedDiagramTypes"], outputs: ["dataSelected", "diagramTypeChanged"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); }
84
+ }
85
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: GroupByCountDiagramComponent, decorators: [{
86
+ type: Component,
87
+ args: [{ selector: 'ocx-group-by-count-diagram', template: "<ocx-diagram\n [data]=\"(diagramData$ | async) || []\"\n [sumKey]=\"sumKey\"\n [diagramType]=\"diagramType\"\n (onDataSelect)=\"dataClicked($event)\"\n [supportedDiagramTypes]=\"supportedDiagramTypes\"\n (diagramTypeChanged)=\"onDiagramTypeChanged($event)\"\n></ocx-diagram>\n" }]
88
+ }], ctorParameters: () => [{ type: i1.TranslateService }], propDecorators: { sumKey: [{
89
+ type: Input
90
+ }], diagramType: [{
91
+ type: Input
92
+ }], type: [{
93
+ type: Input
94
+ }], supportedDiagramTypes: [{
95
+ type: Input
96
+ }], data: [{
97
+ type: Input
98
+ }], columnType: [{
99
+ type: Input
100
+ }], columnField: [{
101
+ type: Input
102
+ }], column: [{
103
+ type: Input
104
+ }], dataSelected: [{
105
+ type: Output
106
+ }], diagramTypeChanged: [{
107
+ type: Output
108
+ }] } });
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtYnktY291bnQtZGlhZ3JhbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2dyb3VwLWJ5LWNvdW50LWRpYWdyYW0vZ3JvdXAtYnktY291bnQtZGlhZ3JhbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2dyb3VwLWJ5LWNvdW50LWRpYWdyYW0vZ3JvdXAtYnktY291bnQtZGlhZ3JhbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQWMsYUFBYSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ3BGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQTtBQUUxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUE7Ozs7O0FBUXJELE1BQU0sT0FBTyw0QkFBNEI7SUFHdkM7O09BRUc7SUFDSCxJQUNJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUE7SUFDekIsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLEtBQWtCO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO0lBQzFCLENBQUM7SUFHRCxJQUNJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDL0IsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLEtBQWdCO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFJRCxJQUNJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDckMsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLEtBQWlCO1FBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQy9CLENBQUM7SUFHRCxJQUNJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDdEMsQ0FBQztJQUNELElBQUksV0FBVyxDQUFDLEtBQWE7UUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDaEMsQ0FBQztJQUVELElBQ0ksTUFBTTtRQUNSLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzlELENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxLQUFvQjtRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUE7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFBO0lBQzdCLENBQUM7SUFLRCxZQUFvQixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQXJEN0MsV0FBTSxHQUFHLHNCQUFzQixDQUFBO1FBQy9CLGdCQUFXLCtCQUFrQjtRQVc3QiwwQkFBcUIsR0FBa0IsRUFBRSxDQUFBO1FBQzFDLFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBWSxFQUFFLENBQUMsQ0FBQTtRQVUzQyxpQkFBWSxHQUFHLElBQUksZUFBZSxDQUFhLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQVNqRSxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFTLEVBQUUsQ0FBQyxDQUFBO1FBa0I3QyxpQkFBWSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFBO1FBQ3BELHVCQUFrQixHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFBO0lBRW5CLENBQUM7SUFFMUQsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDMUYsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUU7WUFDM0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFBO1lBQ2hGLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUU7Z0JBQ3JELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDO29CQUN6RCxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLENBQUM7b0JBQ3JFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUM1QyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFDTixJQUFJLFVBQVUsS0FBSyxVQUFVLENBQUMsZUFBZSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNwRixHQUFHLENBQUMsQ0FBQyxZQUFrQyxFQUFFLEVBQUUsQ0FDekMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQWdDLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ3JELEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDNUIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO2lCQUNmLENBQUMsQ0FBQyxDQUNKLENBQ0YsQ0FBQTtZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUN4QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQTtJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsS0FBVTtRQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMvQixDQUFDO0lBRUQsb0JBQW9CLENBQUMsY0FBMkI7UUFDOUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUE7UUFDakMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUM5QyxDQUFDOzhHQXhGVSw0QkFBNEI7a0dBQTVCLDRCQUE0QixxV0NiekMsNFJBUUE7OzJGREthLDRCQUE0QjtrQkFKeEMsU0FBUzsrQkFDRSw0QkFBNEI7cUZBSTdCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUtGLElBQUk7c0JBRFAsS0FBSztnQkFPRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBR0YsSUFBSTtzQkFEUCxLQUFLO2dCQVdGLFVBQVU7c0JBRGIsS0FBSztnQkFVRixXQUFXO3NCQURkLEtBQUs7Z0JBU0YsTUFBTTtzQkFEVCxLQUFLO2dCQVNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSdcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCwgbWFwLCBtZXJnZU1hcCwgb2YgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgQ29sdW1uVHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL2NvbHVtbi10eXBlLm1vZGVsJ1xuaW1wb3J0IHsgRGlhZ3JhbUNvbHVtbiB9IGZyb20gJy4uLy4uL21vZGVsL2RpYWdyYW0tY29sdW1uJ1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tICcuLi8uLi91dGlscy9vYmplY3R1dGlscydcbmltcG9ydCB7IERpYWdyYW1EYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGlhZ3JhbS1kYXRhJ1xuaW1wb3J0IHsgRGlhZ3JhbVR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9kaWFncmFtLXR5cGUnXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29jeC1ncm91cC1ieS1jb3VudC1kaWFncmFtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dyb3VwLWJ5LWNvdW50LWRpYWdyYW0uY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBHcm91cEJ5Q291bnREaWFncmFtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgc3VtS2V5ID0gJ1NFQVJDSC5TVU1NQVJZX1RJVExFJ1xuICBASW5wdXQoKSBkaWFncmFtVHlwZSA9IERpYWdyYW1UeXBlLlBJRVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZXBsYWNlZCBieSBkaWFncmFtVHlwZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHR5cGUoKTogRGlhZ3JhbVR5cGUge1xuICAgIHJldHVybiB0aGlzLmRpYWdyYW1UeXBlXG4gIH1cbiAgc2V0IHR5cGUodmFsdWU6IERpYWdyYW1UeXBlKSB7XG4gICAgdGhpcy5kaWFncmFtVHlwZSA9IHZhbHVlXG4gIH1cbiAgQElucHV0KCkgc3VwcG9ydGVkRGlhZ3JhbVR5cGVzOiBEaWFncmFtVHlwZVtdID0gW11cbiAgcHJpdmF0ZSBfZGF0YSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHVua25vd25bXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCBkYXRhKCk6IHVua25vd25bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgZGF0YSh2YWx1ZTogdW5rbm93bltdKSB7XG4gICAgdGhpcy5fZGF0YSQubmV4dCh2YWx1ZSlcbiAgfVxuICBkaWFncmFtRGF0YSQ6IE9ic2VydmFibGU8RGlhZ3JhbURhdGFbXT4gfCB1bmRlZmluZWRcblxuICBwcml2YXRlIF9jb2x1bW5UeXBlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q29sdW1uVHlwZT4oQ29sdW1uVHlwZS5TVFJJTkcpXG4gIEBJbnB1dCgpXG4gIGdldCBjb2x1bW5UeXBlKCk6IENvbHVtblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5UeXBlJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IGNvbHVtblR5cGUodmFsdWU6IENvbHVtblR5cGUpIHtcbiAgICB0aGlzLl9jb2x1bW5UeXBlJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgcHJpdmF0ZSBfY29sdW1uRmllbGQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKVxuICBASW5wdXQoKVxuICBnZXQgY29sdW1uRmllbGQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uRmllbGQkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgY29sdW1uRmllbGQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NvbHVtbkZpZWxkJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IGNvbHVtbigpOiBEaWFncmFtQ29sdW1uIHtcbiAgICByZXR1cm4geyBjb2x1bW5UeXBlOiB0aGlzLmNvbHVtblR5cGUsIGlkOiB0aGlzLmNvbHVtbkZpZWxkIH1cbiAgfVxuICBzZXQgY29sdW1uKHZhbHVlOiBEaWFncmFtQ29sdW1uKSB7XG4gICAgdGhpcy5jb2x1bW5UeXBlID0gdmFsdWUuY29sdW1uVHlwZVxuICAgIHRoaXMuY29sdW1uRmllbGQgPSB2YWx1ZS5pZFxuICB9XG5cbiAgQE91dHB1dCgpIGRhdGFTZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgQE91dHB1dCgpIGRpYWdyYW1UeXBlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPERpYWdyYW1UeXBlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmRpYWdyYW1EYXRhJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX2RhdGEkLCB0aGlzLl9jb2x1bW5GaWVsZCQsIHRoaXMuX2NvbHVtblR5cGUkXSkucGlwZShcbiAgICAgIG1lcmdlTWFwKChbZGF0YSwgY29sdW1uRmllbGQsIGNvbHVtblR5cGVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbkRhdGEgPSBkYXRhLm1hcCgoZCkgPT4gT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShkLCBjb2x1bW5GaWVsZCkpXG4gICAgICAgIGNvbnN0IG9jY3VycmVuY2VzID0gY29sdW1uRGF0YS5yZWR1Y2UoKGFjYywgY3VycmVudCkgPT4ge1xuICAgICAgICAgIHJldHVybiBhY2Muc29tZSgoZTogeyBsYWJlbDogYW55IH0pID0+IGUubGFiZWwgPT09IGN1cnJlbnQpXG4gICAgICAgICAgICA/IChhY2MuZmluZCgoZTogeyBsYWJlbDogYW55IH0pID0+IGUubGFiZWwgPT09IGN1cnJlbnQpLnZhbHVlKyssIGFjYylcbiAgICAgICAgICAgIDogWy4uLmFjYywgeyBsYWJlbDogY3VycmVudCwgdmFsdWU6IDEgfV1cbiAgICAgICAgfSwgW10pXG4gICAgICAgIGlmIChjb2x1bW5UeXBlID09PSBDb2x1bW5UeXBlLlRSQU5TTEFUSU9OX0tFWSAmJiBvY2N1cnJlbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQob2NjdXJyZW5jZXMubWFwKChvOiB7IGxhYmVsOiBhbnkgfSkgPT4gby5sYWJlbCkpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHRyYW5zbGF0aW9uczogeyBbeDogc3RyaW5nXTogYW55IH0pID0+XG4gICAgICAgICAgICAgIG9jY3VycmVuY2VzLm1hcCgobzogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogYW55IH0pID0+ICh7XG4gICAgICAgICAgICAgICAgbGFiZWw6IHRyYW5zbGF0aW9uc1tvLmxhYmVsXSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogby52YWx1ZSxcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBvZihvY2N1cnJlbmNlcylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBkYXRhQ2xpY2tlZChldmVudDogYW55KSB7XG4gICAgdGhpcy5kYXRhU2VsZWN0ZWQuZW1pdChldmVudClcbiAgfVxuXG4gIG9uRGlhZ3JhbVR5cGVDaGFuZ2VkKG5ld0RpYWdyYW1UeXBlOiBEaWFncmFtVHlwZSkge1xuICAgIHRoaXMuZGlhZ3JhbVR5cGUgPSBuZXdEaWFncmFtVHlwZVxuICAgIHRoaXMuZGlhZ3JhbVR5cGVDaGFuZ2VkLmVtaXQobmV3RGlhZ3JhbVR5cGUpXG4gIH1cbn1cbiIsIjxvY3gtZGlhZ3JhbVxuICBbZGF0YV09XCIoZGlhZ3JhbURhdGEkIHwgYXN5bmMpIHx8IFtdXCJcbiAgW3N1bUtleV09XCJzdW1LZXlcIlxuICBbZGlhZ3JhbVR5cGVdPVwiZGlhZ3JhbVR5cGVcIlxuICAob25EYXRhU2VsZWN0KT1cImRhdGFDbGlja2VkKCRldmVudClcIlxuICBbc3VwcG9ydGVkRGlhZ3JhbVR5cGVzXT1cInN1cHBvcnRlZERpYWdyYW1UeXBlc1wiXG4gIChkaWFncmFtVHlwZUNoYW5nZWQpPVwib25EaWFncmFtVHlwZUNoYW5nZWQoJGV2ZW50KVwiXG4+PC9vY3gtZGlhZ3JhbT5cbiJdfQ==