@onecx/angular-accelerator 4.43.1 → 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 +220 -220
  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 +1 -1
  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 +1 -1
  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 -168
  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 -80
  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 -3583
  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,92 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "primeng/api";
5
+ import * as i2 from "primeng/dropdown";
6
+ import * as i3 from "primeng/button";
7
+ import * as i4 from "@angular/forms";
8
+ import * as i5 from "@ngx-translate/core";
9
+ export class DataListGridSortingComponent {
10
+ constructor() {
11
+ this.columns = [];
12
+ this.sortStates = ["ASCENDING" /* DataSortDirection.ASCENDING */, "DESCENDING" /* DataSortDirection.DESCENDING */];
13
+ this._sortDirection$ = new BehaviorSubject("NONE" /* DataSortDirection.NONE */);
14
+ this._sortField$ = new BehaviorSubject('');
15
+ this.sortChange = new EventEmitter();
16
+ this.sortDirectionChange = new EventEmitter();
17
+ this.columnsChange = new EventEmitter();
18
+ this.dropdownOptions = [];
19
+ }
20
+ get sortDirection() {
21
+ return this._sortDirection$.getValue();
22
+ }
23
+ set sortDirection(value) {
24
+ this._sortDirection$.next(value);
25
+ }
26
+ get sortField() {
27
+ return this?._sortField$.getValue();
28
+ }
29
+ set sortField(value) {
30
+ this._sortField$.next(value);
31
+ }
32
+ ngOnInit() {
33
+ this.columns.forEach((element) => this.dropdownOptions.push({ columnId: element.id, columnName: element.nameKey }));
34
+ this.selectedSortingOption = this.dropdownOptions.find((e) => e.columnId === this?.sortField);
35
+ }
36
+ selectSorting(event) {
37
+ this._sortField$.next(event.value);
38
+ this.sortChange.emit(event.value.columnId);
39
+ }
40
+ sortDirectionChanged() {
41
+ const newSortDirection = this.nextSortDirection();
42
+ this._sortDirection$.next(newSortDirection);
43
+ this.sortDirectionChange.emit(newSortDirection);
44
+ }
45
+ nextSortDirection() {
46
+ return this.sortStates[(this.sortStates.indexOf(this.sortDirection) + 1) % this.sortStates.length];
47
+ }
48
+ sortIcon() {
49
+ switch (this.sortDirection) {
50
+ case "ASCENDING" /* DataSortDirection.ASCENDING */:
51
+ return 'pi-sort-amount-up';
52
+ case "DESCENDING" /* DataSortDirection.DESCENDING */:
53
+ return 'pi-sort-amount-down';
54
+ default:
55
+ return 'pi-sort-alt';
56
+ }
57
+ }
58
+ sortIconTitle() {
59
+ return this.sortDirectionToTitle(this.sortDirection);
60
+ }
61
+ sortDirectionToTitle(sortDirection) {
62
+ switch (sortDirection) {
63
+ case "ASCENDING" /* DataSortDirection.ASCENDING */:
64
+ return 'OCX_LIST_GRID_SORT.TOGGLE_BUTTON.ASCENDING_TITLE';
65
+ case "DESCENDING" /* DataSortDirection.DESCENDING */:
66
+ return 'OCX_LIST_GRID_SORT.TOGGLE_BUTTON.DESCENDING_TITLE';
67
+ default:
68
+ return 'OCX_LIST_GRID_SORT.TOGGLE_BUTTON.DEFAULT_TITLE';
69
+ }
70
+ }
71
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: DataListGridSortingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
72
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.5", type: DataListGridSortingComponent, selector: "ocx-data-list-grid-sorting", inputs: { columns: "columns", sortStates: "sortStates", sortDirection: "sortDirection", sortField: "sortField" }, outputs: { sortChange: "sortChange", sortDirectionChange: "sortDirectionChange", columnsChange: "columnsChange" }, ngImport: i0, template: "<div class=\"flex align-items-center gap-2\">\n <p-dropdown\n id=\"dataListGridSortingDropdown\"\n [(ngModel)]=\"selectedSortingOption\"\n class=\"sort-dropdown\"\n [options]=\"dropdownOptions\"\n [placeholder]=\"('OCX_LIST_GRID_SORT.DROPDOWN.PLACEHOLDER' | translate)\"\n (onChange)=\"selectSorting($event)\"\n [title]=\"('OCX_LIST_GRID_SORT.DROPDOWN.TITLE' | translate)\"\n >\n <ng-template let-item pTemplate=\"item\"> {{ item?.columnName ? (item.columnName | translate) : ''}} </ng-template>\n <ng-template let-item pTemplate=\"selectedItem\">\n {{ item?.columnName ? (item.columnName | translate) : ''}}\n </ng-template></p-dropdown\n >\n <p-button\n id=\"dataListGridSortingButton\"\n icon=\"pi {{sortIcon()}}\"\n styleClass=\"p-button-outlined\"\n (onClick)=\"sortDirectionChanged()\"\n [title]=\"(sortIconTitle() | translate)\"\n [attr.aria-label]=\"('OCX_LIST_GRID_SORT.SORTING_BUTTON_ARIA_LABEL' | translate:{direction: (sortDirectionToTitle(nextSortDirection())) | translate})\"\n ></p-button>\n</div>\n", styles: [".pi{border-radius:var(--border-radius);border-width:thin;background:none;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i2.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i3.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }] }); }
73
+ }
74
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: DataListGridSortingComponent, decorators: [{
75
+ type: Component,
76
+ args: [{ selector: 'ocx-data-list-grid-sorting', template: "<div class=\"flex align-items-center gap-2\">\n <p-dropdown\n id=\"dataListGridSortingDropdown\"\n [(ngModel)]=\"selectedSortingOption\"\n class=\"sort-dropdown\"\n [options]=\"dropdownOptions\"\n [placeholder]=\"('OCX_LIST_GRID_SORT.DROPDOWN.PLACEHOLDER' | translate)\"\n (onChange)=\"selectSorting($event)\"\n [title]=\"('OCX_LIST_GRID_SORT.DROPDOWN.TITLE' | translate)\"\n >\n <ng-template let-item pTemplate=\"item\"> {{ item?.columnName ? (item.columnName | translate) : ''}} </ng-template>\n <ng-template let-item pTemplate=\"selectedItem\">\n {{ item?.columnName ? (item.columnName | translate) : ''}}\n </ng-template></p-dropdown\n >\n <p-button\n id=\"dataListGridSortingButton\"\n icon=\"pi {{sortIcon()}}\"\n styleClass=\"p-button-outlined\"\n (onClick)=\"sortDirectionChanged()\"\n [title]=\"(sortIconTitle() | translate)\"\n [attr.aria-label]=\"('OCX_LIST_GRID_SORT.SORTING_BUTTON_ARIA_LABEL' | translate:{direction: (sortDirectionToTitle(nextSortDirection())) | translate})\"\n ></p-button>\n</div>\n", styles: [".pi{border-radius:var(--border-radius);border-width:thin;background:none;cursor:pointer}\n"] }]
77
+ }], propDecorators: { columns: [{
78
+ type: Input
79
+ }], sortStates: [{
80
+ type: Input
81
+ }], sortDirection: [{
82
+ type: Input
83
+ }], sortField: [{
84
+ type: Input
85
+ }], sortChange: [{
86
+ type: Output
87
+ }], sortDirectionChange: [{
88
+ type: Output
89
+ }], columnsChange: [{
90
+ type: Output
91
+ }] } });
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1saXN0LWdyaWQtc29ydGluZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtbGlzdC1ncmlkLXNvcnRpbmcvZGF0YS1saXN0LWdyaWQtc29ydGluZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtbGlzdC1ncmlkLXNvcnRpbmcvZGF0YS1saXN0LWdyaWQtc29ydGluZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUE7Ozs7Ozs7QUFVdEMsTUFBTSxPQUFPLDRCQUE0QjtJQUx6QztRQU1XLFlBQU8sR0FBc0IsRUFBRSxDQUFBO1FBQy9CLGVBQVUsR0FBd0IsZ0dBQTJELENBQUE7UUFDdEcsb0JBQWUsR0FBRyxJQUFJLGVBQWUscUNBQTJDLENBQUE7UUFRaEYsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBUyxFQUFFLENBQUMsQ0FBQTtRQVNuQyxlQUFVLEdBQXlCLElBQUksWUFBWSxFQUFFLENBQUE7UUFDckQsd0JBQW1CLEdBQW9DLElBQUksWUFBWSxFQUFFLENBQUE7UUFDekUsa0JBQWEsR0FBMkIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQUVwRSxvQkFBZSxHQUF1QixFQUFFLENBQUE7S0E4Q3pDO0lBbEVDLElBQ0ksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUN4QyxDQUFDO0lBQ0QsSUFBSSxhQUFhLENBQUMsS0FBd0I7UUFDeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVELElBQ0ksU0FBUztRQUNYLE9BQU8sSUFBSSxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUNyQyxDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsS0FBYTtRQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM5QixDQUFDO0lBUUQsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ25ILElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDL0YsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFVO1FBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzVDLENBQUM7SUFDRCxvQkFBb0I7UUFDbEIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQzNDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUNqRCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDcEcsQ0FBQztJQUVELFFBQVE7UUFDTixRQUFRLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQjtnQkFDRSxPQUFPLG1CQUFtQixDQUFBO1lBQzVCO2dCQUNFLE9BQU8scUJBQXFCLENBQUE7WUFDOUI7Z0JBQ0UsT0FBTyxhQUFhLENBQUE7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ3RELENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxhQUFnQztRQUNuRCxRQUFRLGFBQWEsRUFBRSxDQUFDO1lBQ3RCO2dCQUNFLE9BQU8sa0RBQWtELENBQUE7WUFDM0Q7Z0JBQ0UsT0FBTyxtREFBbUQsQ0FBQTtZQUM1RDtnQkFDRSxPQUFPLGdEQUFnRCxDQUFBO1FBQzNELENBQUM7SUFDSCxDQUFDOzhHQXJFVSw0QkFBNEI7a0dBQTVCLDRCQUE0Qix1U0NYekMsa2pDQXdCQTs7MkZEYmEsNEJBQTRCO2tCQUx4QyxTQUFTOytCQUNFLDRCQUE0Qjs4QkFLN0IsT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0YsYUFBYTtzQkFEaEIsS0FBSztnQkFTRixTQUFTO3NCQURaLEtBQUs7Z0JBUUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IERhdGFTb3J0RGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YS1zb3J0LWRpcmVjdGlvbidcbmltcG9ydCB7IERhdGFDb2x1bW5OYW1lSWQgfSBmcm9tICcuLi8uLi9tb2RlbC9kYXRhLWNvbHVtbi1uYW1lLWlkLm1vZGVsJ1xuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YS10YWJsZS1jb2x1bW4ubW9kZWwnXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29jeC1kYXRhLWxpc3QtZ3JpZC1zb3J0aW5nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtbGlzdC1ncmlkLXNvcnRpbmcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRhLWxpc3QtZ3JpZC1zb3J0aW5nLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIERhdGFMaXN0R3JpZFNvcnRpbmdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBjb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5bXSA9IFtdXG4gIEBJbnB1dCgpIHNvcnRTdGF0ZXM6IERhdGFTb3J0RGlyZWN0aW9uW10gPSBbRGF0YVNvcnREaXJlY3Rpb24uQVNDRU5ESU5HLCBEYXRhU29ydERpcmVjdGlvbi5ERVNDRU5ESU5HXVxuICBfc29ydERpcmVjdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFTb3J0RGlyZWN0aW9uPihEYXRhU29ydERpcmVjdGlvbi5OT05FKVxuICBASW5wdXQoKVxuICBnZXQgc29ydERpcmVjdGlvbigpOiBEYXRhU29ydERpcmVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnREaXJlY3Rpb24kLmdldFZhbHVlKClcbiAgfVxuICBzZXQgc29ydERpcmVjdGlvbih2YWx1ZTogRGF0YVNvcnREaXJlY3Rpb24pIHtcbiAgICB0aGlzLl9zb3J0RGlyZWN0aW9uJC5uZXh0KHZhbHVlKVxuICB9XG4gIF9zb3J0RmllbGQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKVxuICBASW5wdXQoKVxuICBnZXQgc29ydEZpZWxkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXM/Ll9zb3J0RmllbGQkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgc29ydEZpZWxkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zb3J0RmllbGQkLm5leHQodmFsdWUpXG4gIH1cblxuICBAT3V0cHV0KCkgc29ydENoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgQE91dHB1dCgpIHNvcnREaXJlY3Rpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxEYXRhU29ydERpcmVjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgQE91dHB1dCgpIGNvbHVtbnNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgc2VsZWN0ZWRTb3J0aW5nT3B0aW9uOiBEYXRhQ29sdW1uTmFtZUlkIHwgdW5kZWZpbmVkXG4gIGRyb3Bkb3duT3B0aW9uczogRGF0YUNvbHVtbk5hbWVJZFtdID0gW11cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoZWxlbWVudCkgPT4gdGhpcy5kcm9wZG93bk9wdGlvbnMucHVzaCh7IGNvbHVtbklkOiBlbGVtZW50LmlkLCBjb2x1bW5OYW1lOiBlbGVtZW50Lm5hbWVLZXkgfSkpXG4gICAgdGhpcy5zZWxlY3RlZFNvcnRpbmdPcHRpb24gPSB0aGlzLmRyb3Bkb3duT3B0aW9ucy5maW5kKChlKSA9PiBlLmNvbHVtbklkID09PSB0aGlzPy5zb3J0RmllbGQpXG4gIH1cblxuICBzZWxlY3RTb3J0aW5nKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9zb3J0RmllbGQkLm5leHQoZXZlbnQudmFsdWUpXG4gICAgdGhpcy5zb3J0Q2hhbmdlLmVtaXQoZXZlbnQudmFsdWUuY29sdW1uSWQpXG4gIH1cbiAgc29ydERpcmVjdGlvbkNoYW5nZWQoKTogdm9pZCB7XG4gICAgY29uc3QgbmV3U29ydERpcmVjdGlvbiA9IHRoaXMubmV4dFNvcnREaXJlY3Rpb24oKVxuICAgIHRoaXMuX3NvcnREaXJlY3Rpb24kLm5leHQobmV3U29ydERpcmVjdGlvbilcbiAgICB0aGlzLnNvcnREaXJlY3Rpb25DaGFuZ2UuZW1pdChuZXdTb3J0RGlyZWN0aW9uKVxuICB9XG5cbiAgbmV4dFNvcnREaXJlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ydFN0YXRlc1sodGhpcy5zb3J0U3RhdGVzLmluZGV4T2YodGhpcy5zb3J0RGlyZWN0aW9uKSArIDEpICUgdGhpcy5zb3J0U3RhdGVzLmxlbmd0aF1cbiAgfVxuXG4gIHNvcnRJY29uKCkge1xuICAgIHN3aXRjaCAodGhpcy5zb3J0RGlyZWN0aW9uKSB7XG4gICAgICBjYXNlIERhdGFTb3J0RGlyZWN0aW9uLkFTQ0VORElORzpcbiAgICAgICAgcmV0dXJuICdwaS1zb3J0LWFtb3VudC11cCdcbiAgICAgIGNhc2UgRGF0YVNvcnREaXJlY3Rpb24uREVTQ0VORElORzpcbiAgICAgICAgcmV0dXJuICdwaS1zb3J0LWFtb3VudC1kb3duJ1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdwaS1zb3J0LWFsdCdcbiAgICB9XG4gIH1cblxuICBzb3J0SWNvblRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLnNvcnREaXJlY3Rpb25Ub1RpdGxlKHRoaXMuc29ydERpcmVjdGlvbilcbiAgfVxuXG4gIHNvcnREaXJlY3Rpb25Ub1RpdGxlKHNvcnREaXJlY3Rpb246IERhdGFTb3J0RGlyZWN0aW9uKSB7XG4gICAgc3dpdGNoIChzb3J0RGlyZWN0aW9uKSB7XG4gICAgICBjYXNlIERhdGFTb3J0RGlyZWN0aW9uLkFTQ0VORElORzpcbiAgICAgICAgcmV0dXJuICdPQ1hfTElTVF9HUklEX1NPUlQuVE9HR0xFX0JVVFRPTi5BU0NFTkRJTkdfVElUTEUnXG4gICAgICBjYXNlIERhdGFTb3J0RGlyZWN0aW9uLkRFU0NFTkRJTkc6XG4gICAgICAgIHJldHVybiAnT0NYX0xJU1RfR1JJRF9TT1JULlRPR0dMRV9CVVRUT04uREVTQ0VORElOR19USVRMRSdcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnT0NYX0xJU1RfR1JJRF9TT1JULlRPR0dMRV9CVVRUT04uREVGQVVMVF9USVRMRSdcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICA8cC1kcm9wZG93blxuICAgIGlkPVwiZGF0YUxpc3RHcmlkU29ydGluZ0Ryb3Bkb3duXCJcbiAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU29ydGluZ09wdGlvblwiXG4gICAgY2xhc3M9XCJzb3J0LWRyb3Bkb3duXCJcbiAgICBbb3B0aW9uc109XCJkcm9wZG93bk9wdGlvbnNcIlxuICAgIFtwbGFjZWhvbGRlcl09XCIoJ09DWF9MSVNUX0dSSURfU09SVC5EUk9QRE9XTi5QTEFDRUhPTERFUicgfCB0cmFuc2xhdGUpXCJcbiAgICAob25DaGFuZ2UpPVwic2VsZWN0U29ydGluZygkZXZlbnQpXCJcbiAgICBbdGl0bGVdPVwiKCdPQ1hfTElTVF9HUklEX1NPUlQuRFJPUERPV04uVElUTEUnIHwgdHJhbnNsYXRlKVwiXG4gID5cbiAgICA8bmctdGVtcGxhdGUgbGV0LWl0ZW0gcFRlbXBsYXRlPVwiaXRlbVwiPiB7eyBpdGVtPy5jb2x1bW5OYW1lID8gKGl0ZW0uY29sdW1uTmFtZSB8IHRyYW5zbGF0ZSkgOiAnJ319IDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIGxldC1pdGVtIHBUZW1wbGF0ZT1cInNlbGVjdGVkSXRlbVwiPlxuICAgICAge3sgaXRlbT8uY29sdW1uTmFtZSA/IChpdGVtLmNvbHVtbk5hbWUgfCB0cmFuc2xhdGUpIDogJyd9fVxuICAgIDwvbmctdGVtcGxhdGU+PC9wLWRyb3Bkb3duXG4gID5cbiAgPHAtYnV0dG9uXG4gICAgaWQ9XCJkYXRhTGlzdEdyaWRTb3J0aW5nQnV0dG9uXCJcbiAgICBpY29uPVwicGkge3tzb3J0SWNvbigpfX1cIlxuICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZFwiXG4gICAgKG9uQ2xpY2spPVwic29ydERpcmVjdGlvbkNoYW5nZWQoKVwiXG4gICAgW3RpdGxlXT1cIihzb3J0SWNvblRpdGxlKCkgfCB0cmFuc2xhdGUpXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIignT0NYX0xJU1RfR1JJRF9TT1JULlNPUlRJTkdfQlVUVE9OX0FSSUFfTEFCRUwnIHwgdHJhbnNsYXRlOntkaXJlY3Rpb246IChzb3J0RGlyZWN0aW9uVG9UaXRsZShuZXh0U29ydERpcmVjdGlvbigpKSkgfCB0cmFuc2xhdGV9KVwiXG4gID48L3AtYnV0dG9uPlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,110 @@
1
+ import { map, of } from 'rxjs';
2
+ import { flattenObject } from '../../functions/flatten-object';
3
+ import { ColumnType } from '../../model/column-type.model';
4
+ import { ObjectUtils } from '../../utils/objectutils';
5
+ export class DataSortBase {
6
+ constructor(locale, translateService) {
7
+ this.locale = locale;
8
+ this.translateService = translateService;
9
+ }
10
+ translateItems([items, filters, sortColumn, sortDirection], columns, clientSideFiltering, clientSideSorting) {
11
+ if (clientSideFiltering || clientSideSorting) {
12
+ let translationKeys = [];
13
+ const translatedColumns = columns.filter((c) => c.columnType === ColumnType.TRANSLATION_KEY);
14
+ translatedColumns.forEach((c) => {
15
+ translationKeys = [...translationKeys, ...items.map((i) => ObjectUtils.resolveFieldData(i, c.id)?.toString())];
16
+ });
17
+ if (translationKeys.length) {
18
+ return this.translateService.get(translationKeys).pipe(map((translatedValues) => {
19
+ const translations = {};
20
+ translatedColumns.forEach((c) => {
21
+ translations[c.id] = Object.fromEntries(items.map((i) => [
22
+ ObjectUtils.resolveFieldData(i, c.id)?.toString() || '',
23
+ translatedValues[ObjectUtils.resolveFieldData(i, c.id)?.toString()],
24
+ ]));
25
+ });
26
+ return [items, filters, sortColumn, sortDirection, translations];
27
+ }));
28
+ }
29
+ }
30
+ return of([items, filters, sortColumn, sortDirection, {}]);
31
+ }
32
+ filterItems([items, filters, sortColumn, sortDirection, translations], clientSideFiltering) {
33
+ if (!clientSideFiltering) {
34
+ return [items, filters, sortColumn, sortDirection, translations];
35
+ }
36
+ return [
37
+ items.filter((item) => filters
38
+ .map((filter) => filter.columnId)
39
+ .filter((value, index, self) => self.indexOf(value) === index && value != null)
40
+ .every((filterColumnId) => filters
41
+ .filter((filter) => filter.columnId === filterColumnId)
42
+ .some((filter) => (translations[filter.columnId]?.[ObjectUtils.resolveFieldData(item, filter.columnId).toString()] ||
43
+ ObjectUtils.resolveFieldData(item, filter.columnId)).toString() === filter.value.toString()))),
44
+ filters,
45
+ sortColumn,
46
+ sortDirection,
47
+ translations,
48
+ ];
49
+ }
50
+ sortItems([items, filters, sortColumn, sortDirection, translations], columns, clientSideSorting) {
51
+ if (!clientSideSorting || sortColumn === '') {
52
+ return [items, filters, sortColumn, sortDirection, translations];
53
+ }
54
+ let translatedColValues = Object.fromEntries(items.map((i) => [
55
+ ObjectUtils.resolveFieldData(i, sortColumn)?.toString(),
56
+ ObjectUtils.resolveFieldData(i, sortColumn)?.toString(),
57
+ ]));
58
+ if (columns.find((h) => h.id === sortColumn)?.columnType === ColumnType.TRANSLATION_KEY) {
59
+ translatedColValues = translations[sortColumn];
60
+ }
61
+ return [
62
+ [...items].sort(this.createCompareFunction(translatedColValues, sortColumn, sortDirection)),
63
+ filters,
64
+ sortColumn,
65
+ sortDirection,
66
+ translations,
67
+ ];
68
+ }
69
+ flattenItems(items) {
70
+ return items.map((i) => flattenObject(i));
71
+ }
72
+ createCompareFunction(translatedColValues, sortColumn, sortDirection) {
73
+ let direction = 0;
74
+ if (sortDirection === "ASCENDING" /* DataSortDirection.ASCENDING */) {
75
+ direction = 1;
76
+ }
77
+ else if (sortDirection === "DESCENDING" /* DataSortDirection.DESCENDING */) {
78
+ direction = -1;
79
+ }
80
+ return (data1, data2) => {
81
+ if (direction === 0) {
82
+ return 0;
83
+ }
84
+ let result;
85
+ const value1 = translatedColValues[ObjectUtils.resolveFieldData(data1, sortColumn)];
86
+ const value2 = translatedColValues[ObjectUtils.resolveFieldData(data2, sortColumn)];
87
+ if (value1 == null && value2 != null)
88
+ result = -1;
89
+ else if (value1 != null && value2 == null)
90
+ result = 1;
91
+ else if (value1 == null && value2 == null)
92
+ result = 0;
93
+ else if (typeof value1 === 'string' && typeof value2 === 'string')
94
+ result = value1.localeCompare(value2, [this.locale, 'en', 'de'], { numeric: true });
95
+ else {
96
+ if (value1 < value2) {
97
+ result = -1;
98
+ }
99
+ else if (value1 > value2) {
100
+ result = 1;
101
+ }
102
+ else {
103
+ result = 0;
104
+ }
105
+ }
106
+ return direction * result;
107
+ };
108
+ }
109
+ }
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1zb3J0LWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtc29ydC1iYXNlL2RhdGEtc29ydC1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBYyxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUM5RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUE7QUFLMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBSXJELE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLFlBQXNCLE1BQWMsRUFBWSxnQkFBa0M7UUFBNUQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFZLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7SUFBRyxDQUFDO0lBRXRGLGNBQWMsQ0FDWixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBMkQsRUFDckcsT0FBMEIsRUFDMUIsbUJBQTRCLEVBQzVCLGlCQUEwQjtRQUUxQixJQUFJLG1CQUFtQixJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDN0MsSUFBSSxlQUFlLEdBQWEsRUFBRSxDQUFBO1lBQ2xDLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDNUYsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQzlCLGVBQWUsR0FBRyxDQUFDLEdBQUcsZUFBZSxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFF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RSxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO2lCQUNoRixDQUFDO2dCQUNKLElBQUksTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDO29CQUNwQixNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7Z0JBQ2IsQ0FBQztxQkFBTSxJQUFJLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQztvQkFDM0IsTUFBTSxHQUFHLENBQUMsQ0FBQTtnQkFDWixDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxHQUFHLENBQUMsQ0FBQTtnQkFDWixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sU0FBUyxHQUFHLE1BQU0sQ0FBQTtRQUMzQixDQUFDLENBQUE7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSdcbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCwgb2YgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmxhdHRlbk9iamVjdCB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucy9mbGF0dGVuLW9iamVjdCdcbmltcG9ydCB7IENvbHVtblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9jb2x1bW4tdHlwZS5tb2RlbCdcbmltcG9ydCB7IERhdGFTb3J0RGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YS1zb3J0LWRpcmVjdGlvbidcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbiB9IGZyb20gJy4uLy4uL21vZGVsL2RhdGEtdGFibGUtY29sdW1uLm1vZGVsJ1xuaW1wb3J0IHsgTGlzdEdyaWREYXRhIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9kYXRhLWxpc3QtZ3JpZC9kYXRhLWxpc3QtZ3JpZC5jb21wb25lbnQnXG5pbXBvcnQgeyBSb3csIEZpbHRlciB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudCdcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbHMvb2JqZWN0dXRpbHMnXG5cbnR5cGUgUm93TGlzdEdyaWREYXRhID0gTGlzdEdyaWREYXRhIHwgUm93XG5cbmV4cG9ydCBjbGFzcyBEYXRhU29ydEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgbG9jYWxlOiBzdHJpbmcsIHByb3RlY3RlZCB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7fVxuXG4gIHRyYW5zbGF0ZUl0ZW1zKFxuICAgIFtpdGVtcywgZmlsdGVycywgc29ydENvbHVtbiwgc29ydERpcmVjdGlvbl06IFtSb3dMaXN0R3JpZERhdGFbXSwgRmlsdGVyW10sIHN0cmluZywgRGF0YVNvcnREaXJlY3Rpb25dLFxuICAgIGNvbHVtbnM6IERhdGFUYWJsZUNvbHVtbltdLFxuICAgIGNsaWVudFNpZGVGaWx0ZXJpbmc6IGJvb2xlYW4sXG4gICAgY2xpZW50U2lkZVNvcnRpbmc6IGJvb2xlYW5cbiAgKTogT2JzZXJ2YWJsZTxbUm93TGlzdEdyaWREYXRhW10sIEZpbHRlcltdLCBzdHJpbmcsIERhdGFTb3J0RGlyZWN0aW9uLCBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pl0+IHtcbiAgICBpZiAoY2xpZW50U2lkZUZpbHRlcmluZyB8fCBjbGllbnRTaWRlU29ydGluZykge1xuICAgICAgbGV0IHRyYW5zbGF0aW9uS2V5czogc3RyaW5nW10gPSBbXVxuICAgICAgY29uc3QgdHJhbnNsYXRlZENvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcigoYykgPT4gYy5jb2x1bW5UeXBlID09PSBDb2x1bW5UeXBlLlRSQU5TTEFUSU9OX0tFWSlcbiAgICAgIHRyYW5zbGF0ZWRDb2x1bW5zLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgdHJhbnNsYXRpb25LZXlzID0gWy4uLnRyYW5zbGF0aW9uS2V5cywgLi4uaXRlbXMubWFwKChpKSA9PiBPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKGksIGMuaWQpPy50b1N0cmluZygpKV1cbiAgICAgIH0pXG4gICAgICBpZiAodHJhbnNsYXRpb25LZXlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCh0cmFuc2xhdGlvbktleXMpLnBpcGUoXG4gICAgICAgICAgbWFwKCh0cmFuc2xhdGVkVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge31cbiAgICAgICAgICAgIHRyYW5zbGF0ZWRDb2x1bW5zLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgdHJhbnNsYXRpb25zW2MuaWRdID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgIGl0ZW1zLm1hcCgoaSkgPT4gW1xuICAgICAgICAgICAgICAgICAgT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShpLCBjLmlkKT8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRWYWx1ZXNbT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShpLCBjLmlkKT8udG9TdHJpbmcoKV0sXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBbaXRlbXMsIGZpbHRlcnMsIHNvcnRDb2x1bW4sIHNvcnREaXJlY3Rpb24sIHRyYW5zbGF0aW9uc11cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZihbaXRlbXMsIGZpbHRlcnMsIHNvcnRDb2x1bW4sIHNvcnREaXJlY3Rpb24sIHt9XSlcbiAgfVxuXG4gIGZpbHRlckl0ZW1zKFxuICAgIFtpdGVtcywgZmlsdGVycywgc29ydENvbHVtbiwgc29ydERpcmVjdGlvbiwgdHJhbnNsYXRpb25zXTogW1xuICAgICAgUm93TGlzdEdyaWREYXRhW10sXG4gICAgICBGaWx0ZXJbXSxcbiAgICAgIHN0cmluZyxcbiAgICAgIERhdGFTb3J0RGlyZWN0aW9uLFxuICAgICAgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5cbiAgICBdLFxuICAgIGNsaWVudFNpZGVGaWx0ZXJpbmc6IGJvb2xlYW5cbiAgKTogW1Jvd0xpc3RHcmlkRGF0YVtdLCBGaWx0ZXJbXSwgc3RyaW5nLCBEYXRhU29ydERpcmVjdGlvbiwgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5dIHtcbiAgICBpZiAoIWNsaWVudFNpZGVGaWx0ZXJpbmcpIHtcbiAgICAgIHJldHVybiBbaXRlbXMsIGZpbHRlcnMsIHNvcnRDb2x1bW4sIHNvcnREaXJlY3Rpb24sIHRyYW5zbGF0aW9uc11cbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIGl0ZW1zLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgICAgZmlsdGVyc1xuICAgICAgICAgIC5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmNvbHVtbklkKVxuICAgICAgICAgIC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXggJiYgdmFsdWUgIT0gbnVsbClcbiAgICAgICAgICAuZXZlcnkoKGZpbHRlckNvbHVtbklkKSA9PlxuICAgICAgICAgICAgZmlsdGVyc1xuICAgICAgICAgICAgICAuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZCA9PT0gZmlsdGVyQ29sdW1uSWQpXG4gICAgICAgICAgICAgIC5zb21lKFxuICAgICAgICAgICAgICAgIChmaWx0ZXIpID0+XG4gICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uc1tmaWx0ZXIuY29sdW1uSWRdPy5bT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShpdGVtLCBmaWx0ZXIuY29sdW1uSWQpLnRvU3RyaW5nKCldIHx8XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEoaXRlbSwgZmlsdGVyLmNvbHVtbklkKVxuICAgICAgICAgICAgICAgICAgKS50b1N0cmluZygpID09PSBmaWx0ZXIudmFsdWUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIGZpbHRlcnMsXG4gICAgICBzb3J0Q29sdW1uLFxuICAgICAgc29ydERpcmVjdGlvbixcbiAgICAgIHRyYW5zbGF0aW9ucyxcbiAgICBdXG4gIH1cblxuICBzb3J0SXRlbXMoXG4gICAgW2l0ZW1zLCBmaWx0ZXJzLCBzb3J0Q29sdW1uLCBzb3J0RGlyZWN0aW9uLCB0cmFuc2xhdGlvbnNdOiBbXG4gICAgICBSb3dMaXN0R3JpZERhdGFbXSxcbiAgICAgIEZpbHRlcltdLFxuICAgICAgc3RyaW5nLFxuICAgICAgRGF0YVNvcnREaXJlY3Rpb24sXG4gICAgICBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PlxuICAgIF0sXG4gICAgY29sdW1uczogRGF0YVRhYmxlQ29sdW1uW10sXG4gICAgY2xpZW50U2lkZVNvcnRpbmc6IGJvb2xlYW5cbiAgKTogW1Jvd0xpc3RHcmlkRGF0YVtdLCBGaWx0ZXJbXSwgc3RyaW5nLCBEYXRhU29ydERpcmVjdGlvbiwgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5dIHtcbiAgICBpZiAoIWNsaWVudFNpZGVTb3J0aW5nIHx8IHNvcnRDb2x1bW4gPT09ICcnKSB7XG4gICAgICByZXR1cm4gW2l0ZW1zLCBmaWx0ZXJzLCBzb3J0Q29sdW1uLCBzb3J0RGlyZWN0aW9uLCB0cmFuc2xhdGlvbnNdXG4gICAgfVxuICAgIGxldCB0cmFuc2xhdGVkQ29sVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgaXRlbXMubWFwKChpKSA9PiBbXG4gICAgICAgIE9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEoaSwgc29ydENvbHVtbik/LnRvU3RyaW5nKCksXG4gICAgICAgIE9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEoaSwgc29ydENvbHVtbik/LnRvU3RyaW5nKCksXG4gICAgICBdKVxuICAgIClcbiAgICBpZiAoY29sdW1ucy5maW5kKChoKSA9PiBoLmlkID09PSBzb3J0Q29sdW1uKT8uY29sdW1uVHlwZSA9PT0gQ29sdW1uVHlwZS5UUkFOU0xBVElPTl9LRVkpIHtcbiAgICAgIHRyYW5zbGF0ZWRDb2xWYWx1ZXMgPSB0cmFuc2xhdGlvbnNbc29ydENvbHVtbl1cbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIFsuLi5pdGVtc10uc29ydCh0aGlzLmNyZWF0ZUNvbXBhcmVGdW5jdGlvbih0cmFuc2xhdGVkQ29sVmFsdWVzLCBzb3J0Q29sdW1uLCBzb3J0RGlyZWN0aW9uKSksXG4gICAgICBmaWx0ZXJzLFxuICAgICAgc29ydENvbHVtbixcbiAgICAgIHNvcnREaXJlY3Rpb24sXG4gICAgICB0cmFuc2xhdGlvbnMsXG4gICAgXVxuICB9XG5cbiAgZmxhdHRlbkl0ZW1zKGl0ZW1zOiBSb3dMaXN0R3JpZERhdGFbXSkge1xuICAgIHJldHVybiBpdGVtcy5tYXAoKGkpID0+IGZsYXR0ZW5PYmplY3QoaSkpXG4gIH1cblxuICBjcmVhdGVDb21wYXJlRnVuY3Rpb24oXG4gICAgdHJhbnNsYXRlZENvbFZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBzb3J0Q29sdW1uOiBzdHJpbmcsXG4gICAgc29ydERpcmVjdGlvbjogRGF0YVNvcnREaXJlY3Rpb25cbiAgKTogKGE6IFJlY29yZDxzdHJpbmcsIGFueT4sIGI6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IG51bWJlciB7XG4gICAgbGV0IGRpcmVjdGlvbiA9IDBcbiAgICBpZiAoc29ydERpcmVjdGlvbiA9PT0gRGF0YVNvcnREaXJlY3Rpb24uQVNDRU5ESU5HKSB7XG4gICAgICBkaXJlY3Rpb24gPSAxXG4gICAgfSBlbHNlIGlmIChzb3J0RGlyZWN0aW9uID09PSBEYXRhU29ydERpcmVjdGlvbi5ERVNDRU5ESU5HKSB7XG4gICAgICBkaXJlY3Rpb24gPSAtMVxuICAgIH1cbiAgICByZXR1cm4gKGRhdGExLCBkYXRhMikgPT4ge1xuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgICAgbGV0IHJlc3VsdFxuICAgICAgY29uc3QgdmFsdWUxID0gdHJhbnNsYXRlZENvbFZhbHVlc1tPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKGRhdGExLCBzb3J0Q29sdW1uKV1cbiAgICAgIGNvbnN0IHZhbHVlMiA9IHRyYW5zbGF0ZWRDb2xWYWx1ZXNbT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShkYXRhMiwgc29ydENvbHVtbildXG5cbiAgICAgIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgIT0gbnVsbCkgcmVzdWx0ID0gLTFcbiAgICAgIGVsc2UgaWYgKHZhbHVlMSAhPSBudWxsICYmIHZhbHVlMiA9PSBudWxsKSByZXN1bHQgPSAxXG4gICAgICBlbHNlIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbCkgcmVzdWx0ID0gMFxuICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlMSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlMiA9PT0gJ3N0cmluZycpXG4gICAgICAgIHJlc3VsdCA9IHZhbHVlMS5sb2NhbGVDb21wYXJlKHZhbHVlMiwgW3RoaXMubG9jYWxlLCAnZW4nLCAnZGUnXSwgeyBudW1lcmljOiB0cnVlIH0pXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKHZhbHVlMSA8IHZhbHVlMikge1xuICAgICAgICAgIHJlc3VsdCA9IC0xXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUxID4gdmFsdWUyKSB7XG4gICAgICAgICAgcmVzdWx0ID0gMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IDBcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRpcmVjdGlvbiAqIHJlc3VsdFxuICAgIH1cbiAgfVxufVxuIl19