@universis/ngx-tables 0.6.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 (103) hide show
  1. package/LICENSE +163 -0
  2. package/README.md +121 -0
  3. package/bundles/universis-ngx-tables.umd.js +4591 -0
  4. package/bundles/universis-ngx-tables.umd.js.map +1 -0
  5. package/bundles/universis-ngx-tables.umd.min.js +2 -0
  6. package/bundles/universis-ngx-tables.umd.min.js.map +1 -0
  7. package/esm2015/lib/components/add-items/add-items.component.js +142 -0
  8. package/esm2015/lib/components/advanced-aggregator/advanced-aggregator.component.js +120 -0
  9. package/esm2015/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +53 -0
  10. package/esm2015/lib/components/advanced-list/advanced-list.component.js +173 -0
  11. package/esm2015/lib/components/advanced-row-action/advanced-row-action.component.js +175 -0
  12. package/esm2015/lib/components/advanced-search-form/advanced-search-form.component.js +134 -0
  13. package/esm2015/lib/components/advanced-select/advanced-select.component.js +51 -0
  14. package/esm2015/lib/components/advanced-select/advanced-select.service.js +40 -0
  15. package/esm2015/lib/components/advanced-table/advanced-filter-value-provider.service.js +37 -0
  16. package/esm2015/lib/components/advanced-table/advanced-table-resolvers.js +44 -0
  17. package/esm2015/lib/components/advanced-table/advanced-table-search-base.js +23 -0
  18. package/esm2015/lib/components/advanced-table/advanced-table-search.component.js +519 -0
  19. package/esm2015/lib/components/advanced-table/advanced-table-settings.component.js +109 -0
  20. package/esm2015/lib/components/advanced-table/advanced-table.component.js +1007 -0
  21. package/esm2015/lib/components/advanced-table/advanced-table.formatters.interface.js +16 -0
  22. package/esm2015/lib/components/advanced-table/advanced-table.formatters.js +271 -0
  23. package/esm2015/lib/components/advanced-table/advanced-table.interfaces.js +2 -0
  24. package/esm2015/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +379 -0
  25. package/esm2015/lib/components/table-simple-header/table-simple-header.component.js +52 -0
  26. package/esm2015/lib/directives/advanced-table-editor.directive.js +157 -0
  27. package/esm2015/lib/directives/btnexp.directive.js +225 -0
  28. package/esm2015/lib/i18n/tables.el.js +104 -0
  29. package/esm2015/lib/i18n/tables.en.js +103 -0
  30. package/esm2015/lib/pipes/advanced-aggregator.pipe.js +35 -0
  31. package/esm2015/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +46 -0
  32. package/esm2015/lib/services/advanced-aggregator/advanced-aggregator.service.js +117 -0
  33. package/esm2015/lib/tables.activated-table.service.js +36 -0
  34. package/esm2015/lib/tables.module.js +134 -0
  35. package/esm2015/public_api.js +22 -0
  36. package/esm2015/universis-ngx-tables.js +14 -0
  37. package/esm5/lib/components/add-items/add-items.component.js +153 -0
  38. package/esm5/lib/components/advanced-aggregator/advanced-aggregator.component.js +169 -0
  39. package/esm5/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +56 -0
  40. package/esm5/lib/components/advanced-list/advanced-list.component.js +185 -0
  41. package/esm5/lib/components/advanced-row-action/advanced-row-action.component.js +179 -0
  42. package/esm5/lib/components/advanced-search-form/advanced-search-form.component.js +137 -0
  43. package/esm5/lib/components/advanced-select/advanced-select.component.js +56 -0
  44. package/esm5/lib/components/advanced-select/advanced-select.service.js +43 -0
  45. package/esm5/lib/components/advanced-table/advanced-filter-value-provider.service.js +50 -0
  46. package/esm5/lib/components/advanced-table/advanced-table-resolvers.js +48 -0
  47. package/esm5/lib/components/advanced-table/advanced-table-search-base.js +29 -0
  48. package/esm5/lib/components/advanced-table/advanced-table-search.component.js +556 -0
  49. package/esm5/lib/components/advanced-table/advanced-table-settings.component.js +115 -0
  50. package/esm5/lib/components/advanced-table/advanced-table.component.js +1035 -0
  51. package/esm5/lib/components/advanced-table/advanced-table.formatters.interface.js +16 -0
  52. package/esm5/lib/components/advanced-table/advanced-table.formatters.js +313 -0
  53. package/esm5/lib/components/advanced-table/advanced-table.interfaces.js +2 -0
  54. package/esm5/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +295 -0
  55. package/esm5/lib/components/table-simple-header/table-simple-header.component.js +58 -0
  56. package/esm5/lib/directives/advanced-table-editor.directive.js +175 -0
  57. package/esm5/lib/directives/btnexp.directive.js +253 -0
  58. package/esm5/lib/i18n/tables.el.js +104 -0
  59. package/esm5/lib/i18n/tables.en.js +103 -0
  60. package/esm5/lib/pipes/advanced-aggregator.pipe.js +39 -0
  61. package/esm5/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +49 -0
  62. package/esm5/lib/services/advanced-aggregator/advanced-aggregator.service.js +130 -0
  63. package/esm5/lib/tables.activated-table.service.js +43 -0
  64. package/esm5/lib/tables.module.js +139 -0
  65. package/esm5/public_api.js +22 -0
  66. package/esm5/universis-ngx-tables.js +14 -0
  67. package/fesm2015/universis-ngx-tables.js +4127 -0
  68. package/fesm2015/universis-ngx-tables.js.map +1 -0
  69. package/fesm5/universis-ngx-tables.js +4313 -0
  70. package/fesm5/universis-ngx-tables.js.map +1 -0
  71. package/lib/advanced-aggregator.d.ts +124 -0
  72. package/lib/components/add-items/add-items.component.d.ts +44 -0
  73. package/lib/components/advanced-aggregator/advanced-aggregator.component.d.ts +45 -0
  74. package/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.d.ts +25 -0
  75. package/lib/components/advanced-list/advanced-list.component.d.ts +42 -0
  76. package/lib/components/advanced-row-action/advanced-row-action.component.d.ts +42 -0
  77. package/lib/components/advanced-search-form/advanced-search-form.component.d.ts +27 -0
  78. package/lib/components/advanced-select/advanced-select.component.d.ts +14 -0
  79. package/lib/components/advanced-select/advanced-select.service.d.ts +9 -0
  80. package/lib/components/advanced-table/advanced-filter-value-provider.service.d.ts +8 -0
  81. package/lib/components/advanced-table/advanced-table-resolvers.d.ts +12 -0
  82. package/lib/components/advanced-table/advanced-table-search-base.d.ts +7 -0
  83. package/lib/components/advanced-table/advanced-table-search.component.d.ts +80 -0
  84. package/lib/components/advanced-table/advanced-table-settings.component.d.ts +35 -0
  85. package/lib/components/advanced-table/advanced-table.component.d.ts +142 -0
  86. package/lib/components/advanced-table/advanced-table.formatters.d.ts +62 -0
  87. package/lib/components/advanced-table/advanced-table.formatters.interface.d.ts +15 -0
  88. package/lib/components/advanced-table/advanced-table.interfaces.d.ts +27 -0
  89. package/lib/components/advanced-table-modal/advanced-table-modal-base.component.d.ts +82 -0
  90. package/lib/components/table-simple-header/table-simple-header.component.d.ts +14 -0
  91. package/lib/directives/advanced-table-editor.directive.d.ts +25 -0
  92. package/lib/directives/btnexp.directive.d.ts +68 -0
  93. package/lib/i18n/tables.el.d.ts +102 -0
  94. package/lib/i18n/tables.en.d.ts +101 -0
  95. package/lib/pipes/advanced-aggregator.pipe.d.ts +21 -0
  96. package/lib/pipes/advansed-aggregator-list-title-parse.pipe.d.ts +21 -0
  97. package/lib/services/advanced-aggregator/advanced-aggregator.service.d.ts +32 -0
  98. package/lib/tables.activated-table.service.d.ts +9 -0
  99. package/lib/tables.module.d.ts +7 -0
  100. package/package.json +51 -0
  101. package/public_api.d.ts +18 -0
  102. package/universis-ngx-tables.d.ts +12 -0
  103. package/universis-ngx-tables.metadata.json +1 -0
@@ -0,0 +1,142 @@
1
+ import { Component, Input, ViewChild } from '@angular/core';
2
+ import { RouterModalOkCancel } from '@universis/common/routing';
3
+ import { ActivatedRoute, Router } from '@angular/router';
4
+ import { Observable } from 'rxjs';
5
+ import { TranslateService } from '@ngx-translate/core';
6
+ import { AngularDataContext } from '@themost/angular';
7
+ import { AdvancedTableModalBaseComponent } from '../advanced-table-modal/advanced-table-modal-base.component';
8
+ import { AdvancedFormComponent } from '@universis/forms';
9
+ import { AppEventService, ErrorService, LoadingService, ModalService, ToastService } from '@universis/common';
10
+ export class AddItemsComponent extends RouterModalOkCancel {
11
+ constructor(router, activatedRoute, _errorService, _modalService, _appEvent, _toastService, _loadingService, _translateService, _context) {
12
+ super(router, activatedRoute);
13
+ this._errorService = _errorService;
14
+ this._modalService = _modalService;
15
+ this._appEvent = _appEvent;
16
+ this._toastService = _toastService;
17
+ this._loadingService = _loadingService;
18
+ this._translateService = _translateService;
19
+ this._context = _context;
20
+ this.loading = false;
21
+ this.items = [];
22
+ this.messages = [];
23
+ // set modal size
24
+ this.modalClass = 'modal-lg';
25
+ this.okButtonDisabled = true;
26
+ }
27
+ ngOnInit() {
28
+ this.selectedSubscription = this.selectComponent.advancedTable.selectedItems.subscribe((items) => {
29
+ if (this.formName == null) {
30
+ this.okButtonDisabled = items.length === 0;
31
+ }
32
+ });
33
+ if (this.formName != null) {
34
+ this.formChangeSubscription = this.formComponent.form.change.subscribe((event) => {
35
+ if (Object.prototype.hasOwnProperty.call(event, 'isValid')) {
36
+ // enable or disable button based on form status
37
+ this.okButtonDisabled = (!event.isValid);
38
+ }
39
+ });
40
+ }
41
+ if (this.target) {
42
+ const target = this.target;
43
+ }
44
+ }
45
+ cancel() {
46
+ this.clearMessages();
47
+ if (this.loading) {
48
+ return;
49
+ }
50
+ // close
51
+ if (this._modalService.modalRef) {
52
+ return this._modalService.modalRef.hide();
53
+ }
54
+ }
55
+ ngOnDestroy() {
56
+ if (this.formLoadSubscription) {
57
+ this.formLoadSubscription.unsubscribe();
58
+ }
59
+ if (this.formChangeSubscription) {
60
+ this.formChangeSubscription.unsubscribe();
61
+ }
62
+ if (this.selectedSubscription) {
63
+ this.selectedSubscription.unsubscribe();
64
+ }
65
+ }
66
+ get formData() {
67
+ if (this.formComponent === null) {
68
+ return null;
69
+ }
70
+ return this.formComponent.form.formio.data;
71
+ }
72
+ ok() {
73
+ try {
74
+ this.clearMessages();
75
+ return new Promise((resolve, reject) => {
76
+ this.loading = false;
77
+ this.lastError = null;
78
+ // set courses
79
+ this.items = this.selectComponent.advancedTable.selected;
80
+ // execute add
81
+ this.executeSubscription = this.execute.subscribe((result) => {
82
+ this.loading = false;
83
+ if (this.executeSubscription) {
84
+ this.executeSubscription.unsubscribe();
85
+ }
86
+ // close modal
87
+ if (this._modalService.modalRef) {
88
+ this._modalService.modalRef.hide();
89
+ }
90
+ return resolve();
91
+ }, (err) => {
92
+ this.loading = false;
93
+ // ensure that loading is hidden
94
+ this._loadingService.hideLoading();
95
+ // set last error
96
+ this.lastError = err;
97
+ return resolve();
98
+ });
99
+ });
100
+ }
101
+ catch (err) {
102
+ this.loading = false;
103
+ this._loadingService.hideLoading();
104
+ this.lastError = err;
105
+ }
106
+ }
107
+ onChange($event) { }
108
+ clearMessages() {
109
+ this.messages = [];
110
+ }
111
+ onFilterChange(event) { }
112
+ }
113
+ AddItemsComponent.decorators = [
114
+ { type: Component, args: [{
115
+ selector: 'app-add-items',
116
+ template: "<div>\n <div class=\"modal-header\" *ngIf=\"modalTitle\">\n <h5 class=\"modal-title\">{{modalTitle | translate}}</h5>\n <button (click)=\"cancel()\" [disabled]=\"loading\"\n type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Cancel\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n <div class=\"modal-body pt-0\">\n <div class=\"row\" *ngIf=\"lastError\">\n <div class=\"alert alert-danger col-12\" role=\"alert\">\n <span [translate]=\"'E' + (lastError.statusCode || 500) + '.title'\"></span><br>\n <small *ngIf=\"lastError.statusCode >= 0\" [translate]=\"'E' + (lastError.statusCode || 500) + '.message'\"></small>\n <small *ngIf=\"lastError.statusCode == null\">{{lastError.message}}</small>\n </div>\n </div>\n <div class=\"row d-none\" *ngIf=\"items\">\n <div class=\"col-12\">\n <p [translate]=\"'StudyPrograms.AddCoursesHelp'\" [translateParams]=\"items\" ></p>\n </div>\n </div>\n <div class=\"row mt-3\">\n <div class=\"col-12\">\n <ng-container>\n <ul style=\"margin-left: -24px\" class=\"nav nav-tabs mb-1\" id=\"myTab\" role=\"tablist\">\n <li class=\"nav-item\" *ngIf=\"tableConfiguration\">\n <a class=\"nav-link active\" id=\"courses-tab\" data-toggle=\"tab\" href=\"#courses\" role=\"tab\" aria-controls=\"home\" aria-selected=\"true\" [translate]=\"'AddItems.SelectCourses'\" ></a>\n </li>\n <li class=\"nav-item\" *ngIf=\"formName\">\n <a class=\"nav-link\" [ngClass]=\"{ 'disabled': !(selectComponent.advancedTable.selected && selectComponent.advancedTable.selected.length) }\" id=\"attributes-tab\" data-toggle=\"tab\" href=\"#attributes\" role=\"tab\" aria-controls=\"profile\" aria-selected=\"false\" [translate]=\"'AddItems.EditAttributes'\"></a>\n </li>\n <li class=\"nav-item\" *ngIf=\"messages && messages.length > 0\">\n <a class=\"nav-link\" id=\"messages-tab\" data-toggle=\"tab\" href=\"#messages\" role=\"tab\" aria-controls=\"profile\" aria-selected=\"false\" [translate]=\"'AddItems.Messages'\"></a>\n </li>\n </ul>\n <div class=\"tab-content border-0\" id=\"myTabContent\">\n <div class=\"tab-pane fade show active\" id=\"courses\" role=\"tabpanel\" aria-labelledby=\"home-tab\">\n <app-advanced-table-modal #selectComponent (filter)=\"onFilterChange($event)\" [tableConfig]=\"tableConfiguration\"></app-advanced-table-modal>\n </div>\n <div class=\"tab-pane fade\" id=\"attributes\" role=\"tabpanel\" aria-labelledby=\"profile-tab\"\n [ngClass]=\"{'invisible':(formName == null)}\">\n<!-- <advanced-form-edit #formComponent [formName]=\"formName\" ></advanced-form-edit>-->\n </div>\n <div class=\"tab-pane fade\" id=\"messages\" role=\"tabpanel\" aria-labelledby=\"profile-tab\"\n [ngClass]=\"{'invisible':(messages == null)}\">\n <ul *ngIf=\"messages && messages.length>0\" class=\"sis--list-group sis--list-group-header\">\n <li class=\"sis--list-group-item\">\n <div class=\"d-flex justify-content-center align-items-center\">\n <div class=\"sis--list-group-item_lg_column\" [translate]=\"'AddItems.Messages'\"></div>\n </div>\n </li>\n </ul>\n <ul class=\"sis--list-group sis--list-group-body\">\n <li *ngFor=\"let message of messages\" class=\"sis--list-group-item\">\n <div class=\"d-flex justify-content-center align-items-center list-color\">\n <div class=\"sis--list-group-item_lg_column\">{{ message?.message }}</div>\n </div>\n </li>\n </ul>\n <div *ngIf=\"messages && messages.length>0\">\n <button [disabled]=\"loading\" (click)=\"clearMessages()\" type=\"button\" class=\"btn btn-indigo mt-3\">\n {{'Clear' | translate}}\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"modal-footer justify-content-end\">\n <button [disabled]=\"okButtonDisabled || loading || !(selectComponent.advancedTable.selected && selectComponent.advancedTable.selected.length) \" (click)=\"ok()\"\n type=\"button\" [ngClass]=\"okButtonClass\">\n {{'OK' | translate}}\n </button>\n <button [disabled]=\"cancelButtonDisabled || loading\"\n (click)=\"cancel()\" type=\"button\" [ngClass]=\"cancelButtonClass\" data-dismiss=\"modal\">\n {{'Cancel' | translate}}\n </button>\n </div>\n</div>\n"
117
+ }] }
118
+ ];
119
+ /** @nocollapse */
120
+ AddItemsComponent.ctorParameters = () => [
121
+ { type: Router },
122
+ { type: ActivatedRoute },
123
+ { type: ErrorService },
124
+ { type: ModalService },
125
+ { type: AppEventService },
126
+ { type: ToastService },
127
+ { type: LoadingService },
128
+ { type: TranslateService },
129
+ { type: AngularDataContext }
130
+ ];
131
+ AddItemsComponent.propDecorators = {
132
+ execute: [{ type: Input }],
133
+ items: [{ type: Input }],
134
+ target: [{ type: Input }],
135
+ tableConfiguration: [{ type: Input }],
136
+ formName: [{ type: Input }],
137
+ messages: [{ type: Input }],
138
+ formComponent: [{ type: ViewChild, args: ['formComponent',] }],
139
+ selectComponent: [{ type: ViewChild, args: ['selectComponent',] }]
140
+ };
141
+
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWl0ZW1zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1bml2ZXJzaXMvbmd4LXRhYmxlcy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2FkZC1pdGVtcy9hZGQtaXRlbXMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFxQixTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsVUFBVSxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFBQywrQkFBK0IsRUFBQyxNQUFNLDZEQUE2RCxDQUFDO0FBQzVHLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFNNUcsTUFBTSx3QkFBeUIsU0FBUSxtQkFBbUI7SUFpQnhELFlBQVksTUFBYyxFQUNkLGNBQThCLEVBQ3RCLGFBQTJCLEVBQzNCLGFBQTJCLEVBQzNCLFNBQTBCLEVBQzFCLGFBQTJCLEVBQzNCLGVBQStCLEVBQy9CLGlCQUFtQyxFQUNuQyxRQUE0QjtRQUM5QyxLQUFLLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBUFosa0JBQWEsR0FBYixhQUFhLENBQWM7UUFDM0Isa0JBQWEsR0FBYixhQUFhLENBQWM7UUFDM0IsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFDMUIsa0JBQWEsR0FBYixhQUFhLENBQWM7UUFDM0Isb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBQy9CLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFDbkMsYUFBUSxHQUFSLFFBQVEsQ0FBb0I7UUF2QnpDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFHZCxVQUFLLEdBQWUsRUFBRSxDQUFDO1FBS3ZCLGFBQVEsR0FBZSxFQUFFLENBQUM7UUFpQmpDLGlCQUFpQjtRQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMvRixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO2dCQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7YUFDNUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDekIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDL0UsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFO29CQUMxRCxnREFBZ0Q7b0JBQ2hELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUMxQztZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLE9BQU87U0FDUjtRQUNELFFBQVE7UUFDUixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFO1lBQy9CLE9BQVEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDNUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzdCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUN6QztRQUNELElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQy9CLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUMzQztRQUNELElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzdCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUN6QztJQUNILENBQUM7SUFJQyxJQUFXLFFBQVE7UUFDakIsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksRUFBRTtZQUMvQixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzdDLENBQUM7SUFFRCxFQUFFO1FBQ0EsSUFBSTtZQUNGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLGNBQWM7Z0JBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUE7Z0JBQ3hELGNBQWM7Z0JBQ2IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQzVELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO29CQUN0QixJQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBQzt3QkFDMUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDO3FCQUN4QztvQkFDQSxjQUFjO29CQUNkLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUU7d0JBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO3FCQUNwQztvQkFDRCxPQUFPLE9BQU8sRUFBRSxDQUFDO2dCQUNuQixDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDVCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztvQkFDckIsZ0NBQWdDO29CQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNuQyxpQkFBaUI7b0JBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO29CQUNyQixPQUFPLE9BQU8sRUFBRSxDQUFDO2dCQUNuQixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBRUQsUUFBUSxDQUFDLE1BQVcsSUFBRyxDQUFDO0lBRXhCLGFBQWE7UUFDWCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQXVDLElBQUcsQ0FBQzs7O1lBbEkzRCxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLGl1SkFBeUM7YUFDMUM7Ozs7WUFYdUIsTUFBTTtZQUF0QixjQUFjO1lBTUcsWUFBWTtZQUFrQixZQUFZO1lBQTNELGVBQWU7WUFBOEMsWUFBWTtZQUExQyxjQUFjO1lBSjdDLGdCQUFnQjtZQUNoQixrQkFBa0I7OztzQkFhdkIsS0FBSztvQkFDTCxLQUFLO3FCQUNMLEtBQUs7aUNBRUwsS0FBSzt1QkFDTCxLQUFLO3VCQUNMLEtBQUs7NEJBQ0wsU0FBUyxTQUFDLGVBQWU7OEJBQ3pCLFNBQVMsU0FBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtSb3V0ZXJNb2RhbE9rQ2FuY2VsfSBmcm9tICdAdW5pdmVyc2lzL2NvbW1vbi9yb3V0aW5nJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0FuZ3VsYXJEYXRhQ29udGV4dH0gZnJvbSAnQHRoZW1vc3QvYW5ndWxhcic7XG5pbXBvcnQge0FkdmFuY2VkVGFibGVNb2RhbEJhc2VDb21wb25lbnR9IGZyb20gJy4uL2FkdmFuY2VkLXRhYmxlLW1vZGFsL2FkdmFuY2VkLXRhYmxlLW1vZGFsLWJhc2UuY29tcG9uZW50JztcbmltcG9ydCB7QWR2YW5jZWRGb3JtQ29tcG9uZW50fSBmcm9tICdAdW5pdmVyc2lzL2Zvcm1zJztcbmltcG9ydCB7QXBwRXZlbnRTZXJ2aWNlLCBFcnJvclNlcnZpY2UsIExvYWRpbmdTZXJ2aWNlLCBNb2RhbFNlcnZpY2UsIFRvYXN0U2VydmljZX0gZnJvbSAnQHVuaXZlcnNpcy9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtYWRkLWl0ZW1zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC1pdGVtcy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgQWRkSXRlbXNDb21wb25lbnQgZXh0ZW5kcyBSb3V0ZXJNb2RhbE9rQ2FuY2VsIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG4gIHB1YmxpYyBsYXN0RXJyb3I7XG4gIEBJbnB1dCgpIGV4ZWN1dGU6IE9ic2VydmFibGU8YW55PjtcbiAgQElucHV0KCkgaXRlbXM6IEFycmF5PGFueT4gPSBbXTtcbiAgQElucHV0KCkgdGFyZ2V0OiBhbnk7XG4gIC8vIEBJbnB1dCgpIHNlbGVjdGVkOiBhbnk7XG4gIEBJbnB1dCgpIHRhYmxlQ29uZmlndXJhdGlvbjogYW55O1xuICBASW5wdXQoKSBmb3JtTmFtZTogYW55O1xuICBASW5wdXQoKSBtZXNzYWdlczogQXJyYXk8YW55PiA9IFtdO1xuICBAVmlld0NoaWxkKCdmb3JtQ29tcG9uZW50JykgZm9ybUNvbXBvbmVudDogQWR2YW5jZWRGb3JtQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdzZWxlY3RDb21wb25lbnQnKSBzZWxlY3RDb21wb25lbnQ6IEFkdmFuY2VkVGFibGVNb2RhbEJhc2VDb21wb25lbnQ7XG4gIHByaXZhdGUgZm9ybUxvYWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBmb3JtQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgc2VsZWN0ZWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihyb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgICAgICAgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9lcnJvclNlcnZpY2U6IEVycm9yU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2FwcEV2ZW50OiBBcHBFdmVudFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3RvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9sb2FkaW5nU2VydmljZTogTG9hZGluZ1NlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3RyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NvbnRleHQ6IEFuZ3VsYXJEYXRhQ29udGV4dCkge1xuICAgIHN1cGVyKHJvdXRlciwgYWN0aXZhdGVkUm91dGUpO1xuICAgIC8vIHNldCBtb2RhbCBzaXplXG4gICAgdGhpcy5tb2RhbENsYXNzID0gJ21vZGFsLWxnJztcbiAgICB0aGlzLm9rQnV0dG9uRGlzYWJsZWQgPSB0cnVlO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZWxlY3RlZFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VsZWN0Q29tcG9uZW50LmFkdmFuY2VkVGFibGUuc2VsZWN0ZWRJdGVtcy5zdWJzY3JpYmUoKGl0ZW1zKSA9PiB7XG4gICAgICBpZiAodGhpcy5mb3JtTmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMub2tCdXR0b25EaXNhYmxlZCA9IGl0ZW1zLmxlbmd0aCA9PT0gMDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmZvcm1OYW1lICE9IG51bGwpIHtcbiAgICAgIHRoaXMuZm9ybUNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMuZm9ybUNvbXBvbmVudC5mb3JtLmNoYW5nZS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXZlbnQsICdpc1ZhbGlkJykpIHtcbiAgICAgICAgICAvLyBlbmFibGUgb3IgZGlzYWJsZSBidXR0b24gYmFzZWQgb24gZm9ybSBzdGF0dXNcbiAgICAgICAgICB0aGlzLm9rQnV0dG9uRGlzYWJsZWQgPSAoIWV2ZW50LmlzVmFsaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YXJnZXQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMudGFyZ2V0O1xuICAgIH1cbiAgfVxuXG4gIGNhbmNlbCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHRoaXMuY2xlYXJNZXNzYWdlcygpO1xuICAgIGlmICh0aGlzLmxvYWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gY2xvc2VcbiAgICBpZiAodGhpcy5fbW9kYWxTZXJ2aWNlLm1vZGFsUmVmKSB7XG4gICAgICByZXR1cm4gIHRoaXMuX21vZGFsU2VydmljZS5tb2RhbFJlZi5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9ybUxvYWRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZm9ybUxvYWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9ybUNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5mb3JtQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgICAvLyBnZXQgZm9ybSBkYXRhXG4gIHByaXZhdGUgZXhlY3V0ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAgIHB1YmxpYyBnZXQgZm9ybURhdGEoKTogYW55IHtcbiAgICAgIGlmICh0aGlzLmZvcm1Db21wb25lbnQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5mb3JtQ29tcG9uZW50LmZvcm0uZm9ybWlvLmRhdGE7XG4gICAgfVxuXG4gICAgb2soKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY2xlYXJNZXNzYWdlcygpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sYXN0RXJyb3IgPSBudWxsO1xuICAgICAgICAvLyBzZXQgY291cnNlc1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5zZWxlY3RDb21wb25lbnQuYWR2YW5jZWRUYWJsZS5zZWxlY3RlZFxuICAgICAgICAvLyBleGVjdXRlIGFkZFxuICAgICAgICAgdGhpcy5leGVjdXRlU3Vic2NyaXB0aW9uID0gdGhpcy5leGVjdXRlLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICBpZih0aGlzLmV4ZWN1dGVTdWJzY3JpcHRpb24pe1xuICAgICAgICAgICB0aGlzLmV4ZWN1dGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgIH1cbiAgICAgICAgICAvLyBjbG9zZSBtb2RhbFxuICAgICAgICAgIGlmICh0aGlzLl9tb2RhbFNlcnZpY2UubW9kYWxSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuX21vZGFsU2VydmljZS5tb2RhbFJlZi5oaWRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAvLyBlbnN1cmUgdGhhdCBsb2FkaW5nIGlzIGhpZGRlblxuICAgICAgICAgIHRoaXMuX2xvYWRpbmdTZXJ2aWNlLmhpZGVMb2FkaW5nKCk7XG4gICAgICAgICAgLy8gc2V0IGxhc3QgZXJyb3JcbiAgICAgICAgICB0aGlzLmxhc3RFcnJvciA9IGVycjtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLl9sb2FkaW5nU2VydmljZS5oaWRlTG9hZGluZygpO1xuICAgICAgdGhpcy5sYXN0RXJyb3IgPSBlcnI7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2UoJGV2ZW50OiBhbnkpIHt9XG5cbiAgY2xlYXJNZXNzYWdlcygpIHtcbiAgICB0aGlzLm1lc3NhZ2VzID0gW107XG4gIH1cblxuICBvbkZpbHRlckNoYW5nZShldmVudDogIHsgbmFtZTogc3RyaW5nLCBlbWl0OiBib29sZWFuIH0pIHt9XG59XG4iXX0=
@@ -0,0 +1,120 @@
1
+ import * as tslib_1 from "tslib";
2
+ import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';
3
+ import { AdvancedAggregatorService } from '../../services/advanced-aggregator/advanced-aggregator.service';
4
+ import { LoadingService } from '@universis/common';
5
+ /**
6
+ *
7
+ * @class AdvancedAggregatorComponent
8
+ * @classdesc An advanced list with the capability of aggregate data based on configurable filters
9
+ *
10
+ */
11
+ export class AdvancedAggregatorComponent {
12
+ constructor(_changeDetector, _advancedAggregatorService, _loadingService) {
13
+ this._changeDetector = _changeDetector;
14
+ this._advancedAggregatorService = _advancedAggregatorService;
15
+ this._loadingService = _loadingService;
16
+ this.groups = [];
17
+ this.eventHandler = new EventEmitter();
18
+ }
19
+ set config(value) {
20
+ this._config = value;
21
+ }
22
+ set aggregators(value) {
23
+ this._aggregators = value;
24
+ }
25
+ set postProcessors(value) {
26
+ this._postProcessors = value;
27
+ }
28
+ get config() {
29
+ return this._config;
30
+ }
31
+ get aggregators() {
32
+ return this._aggregators;
33
+ }
34
+ get postProcessors() {
35
+ return this._postProcessors;
36
+ }
37
+ ngOnInit() {
38
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
39
+ this.selectedGroups$.subscribe((data) => {
40
+ this.groups = data;
41
+ this._changeDetector.markForCheck();
42
+ });
43
+ this.filters$.subscribe((filters) => tslib_1.__awaiter(this, void 0, void 0, function* () {
44
+ try {
45
+ yield this.fetch(filters);
46
+ }
47
+ catch (err) {
48
+ console.error(err);
49
+ }
50
+ }));
51
+ });
52
+ }
53
+ ngOnDestroy() {
54
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
55
+ this.selectedGroups$.unsubscribe();
56
+ this.filters$.unsubscribe();
57
+ });
58
+ }
59
+ /**
60
+ *
61
+ * Retrieves the data
62
+ *
63
+ */
64
+ fetch(filters) {
65
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
66
+ try {
67
+ this._loadingService.showLoading();
68
+ let data = yield this._advancedAggregatorService.fetchData(this.config.model, this.params, this.config.query, filters.filters, this.searchExpression, filters.text);
69
+ if (this.postProcessors && Object.keys(this.postProcessors).length > 0 && this.config.postProcessors && this.config.postProcessors.length > 0) {
70
+ for (let i = 0; i < this.config.postProcessors.length; i++) {
71
+ data = yield this.postProcessors[this.config.postProcessors[i].name](data);
72
+ }
73
+ }
74
+ this.body = this._advancedAggregatorService.formatData(this.config, data);
75
+ this._changeDetector.markForCheck();
76
+ }
77
+ catch (err) {
78
+ console.error(err);
79
+ }
80
+ finally {
81
+ this._loadingService.hideLoading();
82
+ }
83
+ });
84
+ }
85
+ /**
86
+ *
87
+ * Triggers the event handler event
88
+ *
89
+ * @param {*} event The event data
90
+ *
91
+ */
92
+ onActionEvent(event) {
93
+ this.eventHandler.emit(event);
94
+ }
95
+ }
96
+ AdvancedAggregatorComponent.decorators = [
97
+ { type: Component, args: [{
98
+ selector: 'app-advanced-aggregator',
99
+ template: "<ng-container *ngIf=\"config && body\">\n <div class=\"w-100 text-center\" *ngIf=\"body && body.length === 0\">\n <div>\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-gray-300 border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-dark\" [translate]=\"'Tables.EmptyTableTitle'\"></h4>\n <p class=\"font-lg text-dark\" [translate]=\"'Tables.EmptyTableMessage'\"></p>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"groups.length === 0\">\n <div class=\"row mt-4\">\n <app-advanced-aggregator-list [body]=\"body\" [config]=\"config\" (clickEvent)=\"onActionEvent($event)\" class=\"col-12\">\n </app-advanced-aggregator-list>\n <div *ngIf=\"config.aggregators && config.aggregators.length > 0\"\n class=\"footer-text text-dark font-weight-normal text-right font-sm mt-3 mr-2 w-100\">\n <div *ngFor=\"let aggregator of config.aggregators\">\n <span *ngIf=\"aggregator.label\"> {{ aggregator.label | translate }} </span>:\n <span class=\"font-weight-bold\"> {{ body | callAggregator: aggregators: aggregator.name }}\n </span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"groups.length === 1\">\n <ng-container *ngFor=\"let group of body | groupBy: groups[0].name | keyvalue\">\n <div class=\"row mt-4\">\n <h4 class=\"col text-secondary\"> {{ groups[0].title | aggregatorListTitle: group.key }} </h4>\n <app-advanced-aggregator-list [body]=\"group.value\" [config]=\"config\" (clickEvent)=\"onActionEvent($event)\"\n class=\"col-12\">\n </app-advanced-aggregator-list>\n </div>\n\n <!-- Footer for the group -->\n <div *ngIf=\"config.aggregators && config.aggregators.length > 0\"\n class=\"footer-text text-dark font-weight-normal text-right font-sm mt-3 mr-2 w-100\">\n <div *ngFor=\"let aggregator of config.aggregators\">\n <span *ngIf=\"aggregator.label\"> {{ aggregator.label | translate }} </span>:\n <span class=\"font-weight-bold\"> {{ group.value | callAggregator: aggregators: aggregator.name }} </span>\n </div>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"groups.length > 1\">\n <ng-container *ngFor=\"let group of body | groupBy: groups[0].name | keyvalue\">\n <div class=\"row mt-4\">\n <h4 class=\"col text-secondary\"> {{ groups[0].title | aggregatorListTitle: group.key }} </h4>\n <div *ngFor=\"let subgroup of group.value | groupBy: groups[1].name | keyvalue\" class=\"col-12 ml-4 pl-4\">\n <div class=\"row mt-4\">\n <h6 class=\"col-12 text-secondary\"> {{ groups[1].title | aggregatorListTitle: subgroup.key }} </h6>\n <app-advanced-aggregator-list [body]=\"subgroup.value\" [config]=\"config\" (clickEvent)=\"onActionEvent($event)\"\n class=\"col-12\">\n </app-advanced-aggregator-list>\n </div>\n\n <!-- Footer for each subgroup -->\n <div *ngIf=\"config.aggregators && config.aggregators.length > 0\"\n class=\"footer-text text-dark font-weight-normal text-right font-sm mt-3 mr-2 w-100\">\n <div *ngFor=\"let aggregator of config.aggregators\">\n <span *ngIf=\"aggregator.label\"> {{ aggregator.label | translate }} </span>:\n <span class=\"font-weight-bold\"> {{ subgroup.value | callAggregator: aggregators: aggregator.name }}\n </span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</ng-container>",
100
+ changeDetection: ChangeDetectionStrategy.OnPush
101
+ }] }
102
+ ];
103
+ /** @nocollapse */
104
+ AdvancedAggregatorComponent.ctorParameters = () => [
105
+ { type: ChangeDetectorRef },
106
+ { type: AdvancedAggregatorService },
107
+ { type: LoadingService }
108
+ ];
109
+ AdvancedAggregatorComponent.propDecorators = {
110
+ config: [{ type: Input, args: ['config',] }],
111
+ aggregators: [{ type: Input, args: ['aggregators',] }],
112
+ postProcessors: [{ type: Input, args: ['postProcessors',] }],
113
+ params: [{ type: Input, args: ['params',] }],
114
+ selectedGroups$: [{ type: Input, args: ['selectedGroups',] }],
115
+ filters$: [{ type: Input, args: ['filters',] }],
116
+ searchExpression: [{ type: Input, args: ['searchExpression',] }],
117
+ eventHandler: [{ type: Output }]
118
+ };
119
+
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtYWdncmVnYXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdW5pdmVyc2lzL25neC10YWJsZXMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hZHZhbmNlZC1hZ2dyZWdhdG9yL2FkdmFuY2VkLWFnZ3JlZ2F0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUFhLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RJLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBRTNHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRDs7Ozs7R0FLRztBQU9ILE1BQU07SUErQkosWUFDVSxlQUFrQyxFQUNsQywwQkFBcUQsRUFDckQsZUFBK0I7UUFGL0Isb0JBQWUsR0FBZixlQUFlLENBQW1CO1FBQ2xDLCtCQUEwQixHQUExQiwwQkFBMEIsQ0FBMkI7UUFDckQsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBM0JsQyxXQUFNLEdBQUcsRUFBRSxDQUFDO1FBc0JULGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQU14QyxDQUFDO0lBMUJMLElBQ1csTUFBTSxDQUFDLEtBQStCO1FBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUNXLFdBQVcsQ0FBQyxLQUFLO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUNXLGNBQWMsQ0FBQyxLQUFLO1FBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFlRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQVcs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Q3JHLHlCQUF5QjtZQUV6QixjQUFjOzs7cUJBdUJwQixLQUFLLFNBQUMsUUFBUTswQkFLZCxLQUFLLFNBQUMsYUFBYTs2QkFLbkIsS0FBSyxTQUFDLGdCQUFnQjtxQkFLdEIsS0FBSyxTQUFDLFFBQVE7OEJBQ2QsS0FBSyxTQUFDLGdCQUFnQjt1QkFDdEIsS0FBSyxTQUFDLFNBQVM7K0JBQ2YsS0FBSyxTQUFDLGtCQUFrQjsyQkFFeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBZHZhbmNlZEFnZ3JlZ2F0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWR2YW5jZWQtYWdncmVnYXRvci9hZHZhbmNlZC1hZ2dyZWdhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWR2YW5jZWRBZ2dyZWdhdG9yQ29uZmlnLCBBZHZhbmNlZEFnZ3JlZ2F0b3JGaWx0ZXJzIH0gZnJvbSAnLi4vLi4vYWR2YW5jZWQtYWdncmVnYXRvcic7XG5pbXBvcnQgeyBMb2FkaW5nU2VydmljZSB9IGZyb20gJ0B1bml2ZXJzaXMvY29tbW9uJztcblxuLyoqXG4gKlxuICogQGNsYXNzIEFkdmFuY2VkQWdncmVnYXRvckNvbXBvbmVudFxuICogQGNsYXNzZGVzYyBBbiBhZHZhbmNlZCBsaXN0IHdpdGggdGhlIGNhcGFiaWxpdHkgb2YgYWdncmVnYXRlIGRhdGEgYmFzZWQgb24gY29uZmlndXJhYmxlIGZpbHRlcnNcbiAqXG4gKi9cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFkdmFuY2VkLWFnZ3JlZ2F0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vYWR2YW5jZWQtYWdncmVnYXRvci5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBZHZhbmNlZEFnZ3JlZ2F0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBBZHZhbmNlZEFnZ3JlZ2F0b3JDb25maWc7XG4gIHByaXZhdGUgX2FnZ3JlZ2F0b3JzO1xuICBwcml2YXRlIF9wb3N0UHJvY2Vzc29ycztcblxuICBwdWJsaWMgYm9keTtcbiAgcHVibGljIGdyb3VwcyA9IFtdO1xuXG4gIEBJbnB1dCgnY29uZmlnJylcbiAgcHVibGljIHNldCBjb25maWcodmFsdWU6IEFkdmFuY2VkQWdncmVnYXRvckNvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IHZhbHVlO1xuICB9XG5cbiAgQElucHV0KCdhZ2dyZWdhdG9ycycpXG4gIHB1YmxpYyBzZXQgYWdncmVnYXRvcnModmFsdWUpIHtcbiAgICB0aGlzLl9hZ2dyZWdhdG9ycyA9IHZhbHVlO1xuICB9XG5cbiAgQElucHV0KCdwb3N0UHJvY2Vzc29ycycpXG4gIHB1YmxpYyBzZXQgcG9zdFByb2Nlc3NvcnModmFsdWUpIHtcbiAgICB0aGlzLl9wb3N0UHJvY2Vzc29ycyA9IHZhbHVlO1xuICB9XG5cbiAgQElucHV0KCdwYXJhbXMnKSBwYXJhbXM7XG4gIEBJbnB1dCgnc2VsZWN0ZWRHcm91cHMnKSBzZWxlY3RlZEdyb3VwcyQ7XG4gIEBJbnB1dCgnZmlsdGVycycpIGZpbHRlcnMkO1xuICBASW5wdXQoJ3NlYXJjaEV4cHJlc3Npb24nKSBzZWFyY2hFeHByZXNzaW9uOiBzdHJpbmc7XG5cbiAgQE91dHB1dCgpIGV2ZW50SGFuZGxlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBfYWR2YW5jZWRBZ2dyZWdhdG9yU2VydmljZTogQWR2YW5jZWRBZ2dyZWdhdG9yU2VydmljZSxcbiAgICBwcml2YXRlIF9sb2FkaW5nU2VydmljZTogTG9hZGluZ1NlcnZpY2VcbiAgKSB7IH1cblxuICBwdWJsaWMgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgcHVibGljIGdldCBhZ2dyZWdhdG9ycygpIHtcbiAgICByZXR1cm4gdGhpcy5fYWdncmVnYXRvcnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvc3RQcm9jZXNzb3JzKCkge1xuICAgIHJldHVybiB0aGlzLl9wb3N0UHJvY2Vzc29ycztcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc2VsZWN0ZWRHcm91cHMkLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5ncm91cHMgPSBkYXRhO1xuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmZpbHRlcnMkLnN1YnNjcmliZShhc3luYyAoZmlsdGVyczogQWR2YW5jZWRBZ2dyZWdhdG9yRmlsdGVycykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaChmaWx0ZXJzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnNlbGVjdGVkR3JvdXBzJC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZmlsdGVycyQudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGRhdGFcbiAgICpcbiAgICovXG4gIGFzeW5jIGZldGNoKGZpbHRlcnM6IEFkdmFuY2VkQWdncmVnYXRvckZpbHRlcnMpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fbG9hZGluZ1NlcnZpY2Uuc2hvd0xvYWRpbmcoKTtcbiAgICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5fYWR2YW5jZWRBZ2dyZWdhdG9yU2VydmljZS5mZXRjaERhdGEodGhpcy5jb25maWcubW9kZWwsXG4gICAgICAgIHRoaXMucGFyYW1zLFxuICAgICAgICB0aGlzLmNvbmZpZy5xdWVyeSxcbiAgICAgICAgZmlsdGVycy5maWx0ZXJzLFxuICAgICAgICB0aGlzLnNlYXJjaEV4cHJlc3Npb24sXG4gICAgICAgIGZpbHRlcnMudGV4dFxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMucG9zdFByb2Nlc3NvcnMgJiYgT2JqZWN0LmtleXModGhpcy5wb3N0UHJvY2Vzc29ycykubGVuZ3RoID4gMCAmJiB0aGlzLmNvbmZpZy5wb3N0UHJvY2Vzc29ycyAmJiB0aGlzLmNvbmZpZy5wb3N0UHJvY2Vzc29ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25maWcucG9zdFByb2Nlc3NvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBkYXRhID0gYXdhaXQgdGhpcy5wb3N0UHJvY2Vzc29yc1t0aGlzLmNvbmZpZy5wb3N0UHJvY2Vzc29yc1tpXS5uYW1lXShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmJvZHkgPSB0aGlzLl9hZHZhbmNlZEFnZ3JlZ2F0b3JTZXJ2aWNlLmZvcm1hdERhdGEodGhpcy5jb25maWcsIGRhdGEpO1xuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2xvYWRpbmdTZXJ2aWNlLmhpZGVMb2FkaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFRyaWdnZXJzIHRoZSBldmVudCBoYW5kbGVyIGV2ZW50XG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZXZlbnQgVGhlIGV2ZW50IGRhdGFcbiAgICpcbiAgICovXG4gIG9uQWN0aW9uRXZlbnQoZXZlbnQpIHtcbiAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0KGV2ZW50KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,53 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { TemplatePipe } from '@universis/common';
3
+ var Lengths;
4
+ (function (Lengths) {
5
+ Lengths["XL"] = "xl";
6
+ Lengths["LG"] = "lg";
7
+ Lengths["MD"] = "md";
8
+ Lengths["SM"] = "sm";
9
+ Lengths["XS"] = "xs";
10
+ })(Lengths || (Lengths = {}));
11
+ export class AdvancedAggregatorListComponent {
12
+ constructor(_template) {
13
+ this._template = _template;
14
+ this.clickEvent = new EventEmitter();
15
+ }
16
+ ngOnInit() {
17
+ this.config.columns.forEach(x => {
18
+ x.length = Object.values(Lengths).includes(x.length) ? this._template.transform(`sis--list-group-item_${x.length}_column`, x) :
19
+ !x.length ? 'sis--list-group-item_sm_column' : x.length;
20
+ });
21
+ }
22
+ /**
23
+ *
24
+ * Triggers the output event emitter
25
+ *
26
+ * @param type The type of the event as it's declared in the configuration
27
+ * @param item The value of the current item
28
+ * }
29
+ */
30
+ callCallback(type, data) {
31
+ this.clickEvent.emit({
32
+ type,
33
+ data
34
+ });
35
+ }
36
+ }
37
+ AdvancedAggregatorListComponent.decorators = [
38
+ { type: Component, args: [{
39
+ selector: 'app-advanced-aggregator-list',
40
+ template: "<div id=\"group-list\" class=\"flex-column\" *ngIf=\"config && config.columns\">\n <ul class=\"sis--list-group sis--list-group-header\">\n <li class=\"sis--list-group-item text-wrap\">\n <div class=\"d-flex justify-content-center align-items-center\" *ngIf=\"body && body.length > 0\">\n <div *ngIf=\"config.actions && config.actions.length > 0\" class=\"sis--list-group-item_sm_column\"></div>\n <div *ngFor=\"let column of config.columns; let i = index\" class=\"text-left\"\n [class]=\"config.columns[i].length\"\n [translate]=\"config.columns[i].type === 'action' ? '' : column.title\" [ngClass]=\"{\n 'd-none': config.columns[i].hidden\n }\"></div>\n </div>\n </li>\n </ul>\n\n <!-- The list of entries -->\n <ul class=\"sis--list-group sis--list-group-body\" *ngIf=\"body && body.length > 0\">\n <li class=\"sis--list-group-item text-wrap\" *ngFor=\"let entry of body | orderBy: config.orderBy\">\n <div class=\"d-flex justify-content-center align-items-center list-color\">\n <!-- The list of actions -->\n <div *ngIf=\"config.actions && config.actions.length > 0\" class=\"sis--list-group-item_sm_column text-left pr-0\">\n <button *ngFor=\"let action of config.actions\" (click)=\"callCallback(action.identifier, entry)\"\n [title]=\"(action.title ? action.title : '') | translate \" class=\"btn btn-default px-0\">\n <i [class]=\"'fas text-indigo ml-2 ' + 'fa-' + action.icon\"></i>\n </button>\n </div>\n <!-- The list of data -->\n <div *ngFor=\"let column of config.columns; let i=index\" [class]=\"config.columns[i].length\" class=\"text-left\"\n [ngClass]=\"{\n 'text-truncate': config.columns[i].hasOwnProperty('truncate') && config.columns[i].truncate,\n 'd-none': config.columns[i].hidden,\n 'd-md-block': !config.columns[i].hidden\n }\"\n [title]=\"config.columns[i].hasOwnProperty('truncate') && config.columns[i].truncate ? entry[column.name] : ''\">\n <span class=\"text-secondary\"\n *ngIf=\"!config.columns[i].hasOwnProperty('type') || (config.columns[i].hasOwnProperty('type') && config.columns[i].type === 'text')\"\n [ngClass]=\"{\n 'font-xs': config.columns[i].variant !== 'primary',\n 'text-body': config.columns[i].variant === 'primary',\n 'text-success': config.columns[i].variant === 'redGreen' && config.columns[i].hasOwnProperty('condition') && entry[config.columns[i].condition],\n 'text-danger': config.columns[i].variant === 'redGreen' && config.columns[i].hasOwnProperty('condition') && !entry[config.columns[i].condition],\n 'font-lg': config.columns[i].variant === 'redGreen' && entry[column.name] && entry[column.name].length > 3,\n 'font-2xl': config.columns[i].variant === 'redGreen' && entry[column.name] && entry[column.name].length <= 3\n }\">\n {{entry[column.name] || '-'}}\n </span>\n\n <span *ngIf=\"config.columns[i].type === 'boolean'\">\n <i class=\"fa font-lg\" [ngClass]=\"{\n 'fa-check text-success': entry[column.name].toString() === config.columns[i].trueValue,\n 'fa-times text-danger': entry[column.name].toString() !== config.columns[i].trueValue && config.columns[i].variant !== 'checkOrDash'\n }\"></i>\n <span\n *ngIf=\"entry[column.name].toString() !== config.columns[i].trueValue && config.columns[i].variant === 'checkOrDash'\"\n class=\"text-secondary font-xs\">-</span>\n </span>\n </div>\n </div>\n <ul *ngIf=\"entry && entry.subitems\">\n <li *ngFor=\"let subitem of entry.subitems\" class=\"d-flex justify-content-center align-items-center list-color\">\n <div class=\"text-left\"></div>\n <div *ngFor=\"let column of config.columns; let i=index\" [class]=\"config.column[i].length\" class=\"text-left\"\n [ngClass]=\"{\n 'text-truncate': config.columns[i].hasOwnProperty('truncate') && config.columns[i].truncate,\n 'd-none': config.columns[i].hidden,\n 'd-md-block': !config.columns[i].hidden\n }\"\n [title]=\"config.columns[i].hasOwnProperty('truncate') && config.columns[i].truncate ? entry[column.name] : ''\">\n <span class=\"text-secondary\"\n *ngIf=\"!config.columns[i].hasOwnProperty('type') || (config.columns[i].hasOwnProperty('type') && config.columns[i].type === 'text')\"\n [ngClass]=\"{\n 'font-xs': config.columns[i].variant !== 'primary',\n 'text-body': config.columns[i].variant === 'primary',\n 'text-success': config.columns[i].variant === 'redGreen' && config.columns[i].hasOwnProperty('condition') && subitem[config.columns[i].condition],\n 'text-danger': config.columns[i].variant === 'redGreen' && config.columns[i].hasOwnProperty('condition') && !subitem[config.columns[i].condition],\n 'font-lg': config.columns[i].variant === 'redGreen' && subitem[column.name] && subitem[column.name].length > 3,\n 'font-2xl': config.columns[i].variant === 'redGreen' && subitem[column.name] && subitem[column.name].length <= 3\n }\">\n {{subitem[column.name] || '-'}}\n </span>\n </div>\n </li>\n </ul>\n </li>\n </ul>\n</div>\n"
41
+ }] }
42
+ ];
43
+ /** @nocollapse */
44
+ AdvancedAggregatorListComponent.ctorParameters = () => [
45
+ { type: TemplatePipe }
46
+ ];
47
+ AdvancedAggregatorListComponent.propDecorators = {
48
+ config: [{ type: Input }],
49
+ body: [{ type: Input }],
50
+ clickEvent: [{ type: Output }]
51
+ };
52
+
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtYWdncmVnYXRvci1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1bml2ZXJzaXMvbmd4LXRhYmxlcy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2FkdmFuY2VkLWFnZ3JlZ2F0b3ItbGlzdC9hZHZhbmNlZC1hZ2dyZWdhdG9yLWxpc3QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLFlBQVksRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWhELElBQUssT0FNSjtBQU5ELFdBQUssT0FBTztJQUNWLG9CQUFRLENBQUE7SUFDUixvQkFBUSxDQUFBO0lBQ1Isb0JBQVEsQ0FBQTtJQUNSLG9CQUFRLENBQUE7SUFDUixvQkFBUSxDQUFBO0FBQ1YsQ0FBQyxFQU5JLE9BQU8sS0FBUCxPQUFPLFFBTVg7QUFPRCxNQUFNO0lBY0osWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUZqQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVLLENBQUM7SUFFaEQsUUFBUTtRQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM5QixDQUFDLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxNQUFNLFNBQVMsRUFBRSxDQUFDLENBQUUsQ0FBQyxDQUFDO2dCQUM5SCxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGdDQUFnQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFFO1FBQzVELENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxZQUFZLENBQUMsSUFBWSxFQUFFLElBQVM7UUFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDbkIsSUFBSTtZQUNKLElBQUk7U0FDTCxDQUFDLENBQUM7SUFDTCxDQUFDOzs7WUF4Q0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSw4QkFBOEI7Z0JBQ3hDLDY5S0FBd0Q7YUFDekQ7Ozs7WUFkUSxZQUFZOzs7cUJBb0JsQixLQUFLO21CQUtMLEtBQUs7eUJBRUwsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRlbXBsYXRlUGlwZX0gZnJvbSAnQHVuaXZlcnNpcy9jb21tb24nO1xuXG5lbnVtIExlbmd0aHMge1xuICBYTD0gJ3hsJyxcbiAgTEc9ICdsZycsXG4gIE1EPSAnbWQnLFxuICBTTT0gJ3NtJyxcbiAgWFM9ICd4cydcbn1cblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtYWR2YW5jZWQtYWdncmVnYXRvci1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FkdmFuY2VkLWFnZ3JlZ2F0b3ItbGlzdC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgQWR2YW5jZWRBZ2dyZWdhdG9yTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7QWR2YW5jZWRBZ2dyZWdhdG9yQ29uZmlnfSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRvIHVzZVxuICAgKi9cbiAgQElucHV0KCkgY29uZmlnOiBhbnk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXk8QXJyYXk8YW55Pj59IGJvZHkgVGhlIGxpc3Qgb2YgZGF0YSBlbnRyaWVzIHRvIHNob3cgYXMgdGhlIGxpc3QgYm9keVxuICAgKi9cbiAgQElucHV0KCkgYm9keTtcblxuICBAT3V0cHV0KCkgY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF90ZW1wbGF0ZTogVGVtcGxhdGVQaXBlKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbmZpZy5jb2x1bW5zLmZvckVhY2goeCA9PiB7XG4gICAgICB4Lmxlbmd0aCA9IE9iamVjdC52YWx1ZXMoTGVuZ3RocykuaW5jbHVkZXMoeC5sZW5ndGgpID8gdGhpcy5fdGVtcGxhdGUudHJhbnNmb3JtKGBzaXMtLWxpc3QtZ3JvdXAtaXRlbV8ke3gubGVuZ3RofV9jb2x1bW5gLCB4ICkgOlxuICAgICAgICAheC5sZW5ndGggPyAnc2lzLS1saXN0LWdyb3VwLWl0ZW1fc21fY29sdW1uJzogeC5sZW5ndGggO1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVHJpZ2dlcnMgdGhlIG91dHB1dCBldmVudCBlbWl0dGVyXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBldmVudCBhcyBpdCdzIGRlY2xhcmVkIGluIHRoZSBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBpdGVtIFRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBpdGVtXG4gICAqIH1cbiAgICovXG4gIGNhbGxDYWxsYmFjayh0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KHtcbiAgICAgIHR5cGUsXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,173 @@
1
+ import * as tslib_1 from "tslib";
2
+ import { Component, ViewChild, Input } from '@angular/core';
3
+ import { AngularDataContext } from '@themost/angular';
4
+ import { TranslateService } from '@ngx-translate/core';
5
+ import { ActivatedRoute } from '@angular/router';
6
+ // tslint:disable-next-line: max-line-length
7
+ import { AdvancedTableComponent, AdvancedTableConfiguration } from '../advanced-table/advanced-table.component';
8
+ import { ErrorService, DIALOG_BUTTONS, ModalService, UserActivityService } from '@universis/common';
9
+ import { ResponseError } from '@themost/client';
10
+ import { ToastService } from '@universis/common';
11
+ export class AdvancedListComponent {
12
+ constructor(_context, _translateService, _activatedRoute, _errorService, _toastService, _modalService, _userActivityService) {
13
+ this._context = _context;
14
+ this._translateService = _translateService;
15
+ this._activatedRoute = _activatedRoute;
16
+ this._errorService = _errorService;
17
+ this._toastService = _toastService;
18
+ this._modalService = _modalService;
19
+ this._userActivityService = _userActivityService;
20
+ this.allowSaveOption = true;
21
+ }
22
+ ngOnDestroy() {
23
+ if (this.dataSubscription) {
24
+ this.dataSubscription.unsubscribe();
25
+ }
26
+ if (this.reloadSubscription) {
27
+ this.reloadSubscription.unsubscribe();
28
+ }
29
+ if (this.subscription) {
30
+ this.subscription.unsubscribe();
31
+ }
32
+ }
33
+ ngOnInit() {
34
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
35
+ try {
36
+ // get metadata
37
+ const metadata = yield this._context.getMetadata();
38
+ // get route data
39
+ this.dataSubscription = this._activatedRoute.data.subscribe(routeData => {
40
+ // get entityType
41
+ const re = new RegExp(`^${routeData.model}$`, 'ig');
42
+ const entitySet = metadata.EntityContainer.EntitySet.find(x => {
43
+ return re.test(x.Name);
44
+ });
45
+ // if entity type is null
46
+ if (entitySet == null) {
47
+ // navigate to error
48
+ return this._errorService.navigateToError(new ResponseError('EntitySet Not Found', 404));
49
+ }
50
+ // get entity type
51
+ const entityType = metadata.EntityType.find(x => {
52
+ return x.Name === entitySet.EntityType;
53
+ });
54
+ if (entityType == null) {
55
+ return this._errorService.navigateToError(new ResponseError('EntityType Not Found', 404));
56
+ }
57
+ if (routeData.searchConfiguration) {
58
+ if (Object.prototype.hasOwnProperty.call(routeData.searchConfiguration, 'allowSave')) {
59
+ this.allowSaveOption = routeData.searchConfiguration.allowSave;
60
+ }
61
+ this.searchConfiguration = routeData.searchConfiguration;
62
+ }
63
+ if (routeData.tableConfiguration) {
64
+ this.tableConfiguration = routeData.tableConfiguration;
65
+ }
66
+ if (routeData.description) {
67
+ this.description = this._translateService.instant(routeData.description);
68
+ }
69
+ if (routeData.longDescription) {
70
+ this.longDescription = this._translateService.instant(routeData.longDescription);
71
+ }
72
+ if (routeData.category) {
73
+ this.category = this._translateService.instant(routeData.category);
74
+ }
75
+ // clone default configuration
76
+ const defaultConfiguration = AdvancedTableConfiguration.cast(this.tableConfiguration, true);
77
+ // correct edit button link
78
+ const column = defaultConfiguration.columns.find(col => {
79
+ return col.formatter === 'ButtonFormatter' && col.formatString === '(modal:edit)';
80
+ });
81
+ if (column) {
82
+ const url = [];
83
+ this._activatedRoute.snapshot.pathFromRoot.forEach(route => {
84
+ url.push.apply(url, route.url);
85
+ });
86
+ column.formatString = `#/${url.join('/')}/(modal:\$\{id\}/edit)`;
87
+ }
88
+ // create list configuration by assigning list entity set
89
+ this.table.config = Object.assign({
90
+ model: entitySet.Name
91
+ }, defaultConfiguration);
92
+ // fetch data
93
+ this.table.fetch(true);
94
+ // do reload by using hidden fragment e.g. /classes#reload
95
+ this.reloadSubscription = this._activatedRoute.fragment.subscribe(fragment => {
96
+ if (fragment && fragment === 'reload') {
97
+ this._toastService.show(this.description, this._translateService.instant('Settings.OperationCompleted'));
98
+ this.table.fetch(true);
99
+ }
100
+ });
101
+ // finally add user activity
102
+ this._userActivityService.setItem({
103
+ category: this.category,
104
+ description: this.description,
105
+ url: window.location.hash.substring(1),
106
+ dateCreated: new Date
107
+ });
108
+ });
109
+ }
110
+ catch (err) {
111
+ console.error(err);
112
+ return this._errorService.showError(err);
113
+ }
114
+ });
115
+ }
116
+ /**
117
+ * Data load event handler of advanced table component
118
+ * @param {AdvancedTableDataResult} data
119
+ */
120
+ onDataLoad(data) {
121
+ this.recordsTotal = data.recordsTotal;
122
+ }
123
+ /**
124
+ * Remove selected items
125
+ */
126
+ remove() {
127
+ if (this.table && this.table.selected && this.table.selected.length) {
128
+ // get items to remove
129
+ const items = this.table.selected;
130
+ return this._modalService.showWarningDialog(this._translateService.instant('Tables.RemoveItemsTitle'), this._translateService.instant('Tables.RemoveItemsMessage'), DIALOG_BUTTONS.OkCancel).then(result => {
131
+ if (result === 'ok') {
132
+ this._context.model(this.table.config.model).remove(items).then(() => {
133
+ this._toastService.show(this.description + ':' + this._translateService.instant('Tables.RemoveItemMessage.title'), this._translateService.instant((items.length === 1 ?
134
+ 'Tables.RemoveItemMessage.one' : 'Tables.RemoveItemMessage.many'), { value: items.length }));
135
+ this.table.fetch(true);
136
+ }).catch(err => {
137
+ this._errorService.showError(err, {
138
+ continueLink: '.'
139
+ });
140
+ });
141
+ }
142
+ });
143
+ }
144
+ }
145
+ }
146
+ AdvancedListComponent.decorators = [
147
+ { type: Component, args: [{
148
+ selector: 'app-advanced-list',
149
+ template: "<div>\n <div class=\"row\" *ngIf=\"description\">\n <div class=\"col-auto\">\n <h2>{{description}}</h2>\n <p *ngIf=\"longDescription\">{{longDescription}}</p>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"searchConfiguration\">\n <div class=\"col-12\" [ngVar]=\"{}\" #filter=\"ngVar\">\n <app-advanced-table-search #advancedSearch [(filter)]=\"filter.value\" [collapsed]=\"true\" [table]=\"table\" [allowSave]=\"allowSaveOption\">\n <advanced-search>\n <app-advanced-search-form [form]=\"searchConfiguration\" (filterChange)=\"advancedSearch.asyncAdvancedSearch()\" #search [(filter)]=\"filter.value\"></app-advanced-search-form>\n </advanced-search>\n </app-advanced-table-search>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-auto mt-4\">\n <div class=\"font-xl text-secondary\" *ngIf=\"recordsTotal > 1\">\n <span>{{recordsTotal}}</span><span>&nbsp;</span><span [translate]=\"'Tables.Items'\"></span>\n </div>\n <div class=\"font-xl text-secondary\" *ngIf=\"recordsTotal === 1\">\n <span>{{recordsTotal}}</span><span>&nbsp;</span><span [translate]=\"'Tables.Item'\"></span>\n </div>\n </div>\n <div class=\"pull-right ml-auto mr-3 mt-3\">\n <div class=\"font-lg btn-toolbar mt-3\">\n <a *ngIf=\"table && table.selected && table.selected.length\"\n class=\"text-danger text-decoration-none mr-2\" href=\"javascript:void(0)\" (click)=\"remove()\">\n <span>-</span><span>&nbsp;</span><span [translate]=\"'Tables.RemoveItem'\"></span>\n </a>\n <a class=\"text-indigo text-decoration-none\" [routerLink]=\"['.', { outlets:{ modal:'add'} }]\">\n <span>+</span><span>&nbsp;</span><span [translate]=\"'Tables.AddItem'\"></span>\n </a>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-12 mb-4\">\n <app-advanced-table [selectable]=\"true\" #table\n [autoLoad]=false\n [showFooter]=\"false\"\n (load)=\"onDataLoad($event)\" [height]=\"600\"></app-advanced-table>\n </div>\n </div>\n <router-modal></router-modal>\n</div>\n"
150
+ }] }
151
+ ];
152
+ /** @nocollapse */
153
+ AdvancedListComponent.ctorParameters = () => [
154
+ { type: AngularDataContext },
155
+ { type: TranslateService },
156
+ { type: ActivatedRoute },
157
+ { type: ErrorService },
158
+ { type: ToastService },
159
+ { type: ModalService },
160
+ { type: UserActivityService }
161
+ ];
162
+ AdvancedListComponent.propDecorators = {
163
+ entitySet: [{ type: Input, args: ['entitySet',] }],
164
+ category: [{ type: Input, args: ['category',] }],
165
+ description: [{ type: Input, args: ['description',] }],
166
+ longDescription: [{ type: Input, args: ['longDescription',] }],
167
+ tableConfiguration: [{ type: Input, args: ['tableConfiguration',] }],
168
+ searchConfiguration: [{ type: Input, args: ['searchConfiguration',] }],
169
+ table: [{ type: ViewChild, args: ['table',] }],
170
+ allowSaveOption: [{ type: Input, args: ['allowSaveOption',] }]
171
+ };
172
+
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdW5pdmVyc2lzL25neC10YWJsZXMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hZHZhbmNlZC1saXN0L2FkdmFuY2VkLWxpc3QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBeUIsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxrQkFBa0IsRUFBc0IsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsNENBQTRDO0FBQzVDLE9BQU8sRUFBRSxzQkFBc0IsRUFBMkIsMEJBQTBCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN6SSxPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBTWpELE1BQU07SUFnQkosWUFBb0IsUUFBNEIsRUFDdEMsaUJBQW1DLEVBQ25DLGVBQStCLEVBQy9CLGFBQTJCLEVBQzNCLGFBQTJCLEVBQzNCLGFBQTJCLEVBQzNCLG9CQUF5QztRQU4vQixhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUN0QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ25DLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtRQUMvQixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQix5QkFBb0IsR0FB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QyxDQUFDO2lCQUNKO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNILENBQUM7OztZQWpLRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtnQkFDN0IsaW5FQUE2QzthQUM5Qzs7OztZQWRRLGtCQUFrQjtZQUNsQixnQkFBZ0I7WUFFaEIsY0FBYztZQUdkLFlBQVk7WUFHWixZQUFZO1lBSGtCLFlBQVk7WUFBRSxtQkFBbUI7Ozt3QkFnQnJFLEtBQUssU0FBQyxXQUFXO3VCQUNqQixLQUFLLFNBQUMsVUFBVTswQkFDaEIsS0FBSyxTQUFDLGFBQWE7OEJBQ25CLEtBQUssU0FBQyxpQkFBaUI7aUNBQ3ZCLEtBQUssU0FBQyxvQkFBb0I7a0NBQzFCLEtBQUssU0FBQyxxQkFBcUI7b0JBQzNCLFNBQVMsU0FBQyxPQUFPOzhCQUNqQixLQUFLLFNBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgT25EZXN0cm95LCBJbmplY3RhYmxlLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQW5ndWxhckRhdGFDb250ZXh0LCBBbmd1bGFyRGF0YVNlcnZpY2UgfSBmcm9tICdAdGhlbW9zdC9hbmd1bGFyJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbmltcG9ydCB7IEFkdmFuY2VkVGFibGVDb21wb25lbnQsIEFkdmFuY2VkVGFibGVEYXRhUmVzdWx0LCBBZHZhbmNlZFRhYmxlQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL2FkdmFuY2VkLXRhYmxlL2FkdmFuY2VkLXRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFcnJvclNlcnZpY2UsIERJQUxPR19CVVRUT05TLCBNb2RhbFNlcnZpY2UsIFVzZXJBY3Rpdml0eVNlcnZpY2UgfSBmcm9tICdAdW5pdmVyc2lzL2NvbW1vbic7XG5pbXBvcnQge1Jlc3BvbnNlRXJyb3J9IGZyb20gJ0B0aGVtb3N0L2NsaWVudCc7XG5pbXBvcnQgeyBUYWJsZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9hZHZhbmNlZC10YWJsZS9hZHZhbmNlZC10YWJsZS5pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ0B1bml2ZXJzaXMvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFkdmFuY2VkLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWR2YW5jZWQtbGlzdC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgQWR2YW5jZWRMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyByZWNvcmRzVG90YWw6IG51bWJlcjtcbiAgcHVibGljIGNvbmZpZzogVGFibGVDb25maWd1cmF0aW9uO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGRhdGFTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSByZWxvYWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgQElucHV0KCdlbnRpdHlTZXQnKSBlbnRpdHlTZXQ6IHN0cmluZztcbiAgQElucHV0KCdjYXRlZ29yeScpIGNhdGVnb3J5OiBzdHJpbmc7XG4gIEBJbnB1dCgnZGVzY3JpcHRpb24nKSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBASW5wdXQoJ2xvbmdEZXNjcmlwdGlvbicpIGxvbmdEZXNjcmlwdGlvbjogc3RyaW5nO1xuICBASW5wdXQoJ3RhYmxlQ29uZmlndXJhdGlvbicpIHRhYmxlQ29uZmlndXJhdGlvbjogYW55O1xuICBASW5wdXQoJ3NlYXJjaENvbmZpZ3VyYXRpb24nKSBzZWFyY2hDb25maWd1cmF0aW9uOiBhbnk7XG4gIEBWaWV3Q2hpbGQoJ3RhYmxlJykgdGFibGU6IEFkdmFuY2VkVGFibGVDb21wb25lbnQ7XG4gIEBJbnB1dCgnYWxsb3dTYXZlT3B0aW9uJykgYWxsb3dTYXZlT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb250ZXh0OiBBbmd1bGFyRGF0YUNvbnRleHQsXG4gICAgcHJpdmF0ZSBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIF9hY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBfZXJyb3JTZXJ2aWNlOiBFcnJvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfdXNlckFjdGl2aXR5U2VydmljZTogVXNlckFjdGl2aXR5U2VydmljZVxuICAgICkgeyB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGFTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGF0YVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWxvYWRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucmVsb2FkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICB0cnkge1xuICAgICAgLy8gZ2V0IG1ldGFkYXRhXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMuX2NvbnRleHQuZ2V0TWV0YWRhdGEoKTtcbiAgICAgIC8vIGdldCByb3V0ZSBkYXRhXG4gICAgICB0aGlzLmRhdGFTdWJzY3JpcHRpb24gPSB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5kYXRhLnN1YnNjcmliZSggcm91dGVEYXRhID0+IHtcbiAgICAgICAgLy8gZ2V0IGVudGl0eVR5cGVcbiAgICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGBeJHtyb3V0ZURhdGEubW9kZWx9JGAsICdpZycpO1xuICAgICAgICBjb25zdCBlbnRpdHlTZXQgPSBtZXRhZGF0YS5FbnRpdHlDb250YWluZXIuRW50aXR5U2V0LmZpbmQoIHggPT4ge1xuICAgICAgICAgIHJldHVybiByZS50ZXN0KHguTmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBpZiBlbnRpdHkgdHlwZSBpcyBudWxsXG4gICAgICAgIGlmIChlbnRpdHlTZXQgPT0gbnVsbCkge1xuICAgICAgICAgIC8vIG5hdmlnYXRlIHRvIGVycm9yXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yU2VydmljZS5uYXZpZ2F0ZVRvRXJyb3IobmV3IFJlc3BvbnNlRXJyb3IoJ0VudGl0eVNldCBOb3QgRm91bmQnLCA0MDQpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBnZXQgZW50aXR5IHR5cGVcbiAgICAgICAgY29uc3QgZW50aXR5VHlwZSA9IG1ldGFkYXRhLkVudGl0eVR5cGUuZmluZCggeCA9PiB7XG4gICAgICAgICAgcmV0dXJuIHguTmFtZSA9PT0gZW50aXR5U2V0LkVudGl0eVR5cGU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZW50aXR5VHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yU2VydmljZS5uYXZpZ2F0ZVRvRXJyb3IobmV3IFJlc3BvbnNlRXJyb3IoJ0VudGl0eVR5cGUgTm90IEZvdW5kJywgNDA0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlRGF0YS5zZWFyY2hDb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyb3V0ZURhdGEuc2VhcmNoQ29uZmlndXJhdGlvbiwgJ2FsbG93U2F2ZScpKSB7XG4gICAgICAgICAgICB0aGlzLmFsbG93U2F2ZU9wdGlvbiA9IHJvdXRlRGF0YS5zZWFyY2hDb25maWd1cmF0aW9uLmFsbG93U2F2ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zZWFyY2hDb25maWd1cmF0aW9uID0gcm91dGVEYXRhLnNlYXJjaENvbmZpZ3VyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlRGF0YS50YWJsZUNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICB0aGlzLnRhYmxlQ29uZmlndXJhdGlvbiA9IHJvdXRlRGF0YS50YWJsZUNvbmZpZ3VyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlRGF0YS5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQocm91dGVEYXRhLmRlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm91dGVEYXRhLmxvbmdEZXNjcmlwdGlvbikge1xuICAgICAgICAgIHRoaXMubG9uZ0Rlc2NyaXB0aW9uID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHJvdXRlRGF0YS5sb25nRGVzY3JpcHRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3V0ZURhdGEuY2F0ZWdvcnkpIHtcbiAgICAgICAgICB0aGlzLmNhdGVnb3J5ID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHJvdXRlRGF0YS5jYXRlZ29yeSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2xvbmUgZGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgICAgIGNvbnN0IGRlZmF1bHRDb25maWd1cmF0aW9uID0gQWR2YW5jZWRUYWJsZUNvbmZpZ3VyYXRpb24uY2FzdCh0aGlzLnRhYmxlQ29uZmlndXJhdGlvbiwgdHJ1ZSk7XG4gICAgICAgIC8vIGNvcnJlY3QgZWRpdCBidXR0b24gbGlua1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBkZWZhdWx0Q29uZmlndXJhdGlvbi5jb2x1bW5zLmZpbmQoIGNvbCA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbC5mb3JtYXR0ZXIgPT09ICdCdXR0b25Gb3JtYXR0ZXInICYmIGNvbC5mb3JtYXRTdHJpbmcgPT09ICcobW9kYWw6ZWRpdCknO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgIGNvbnN0IHVybDogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgICAgICAgIHRoaXMuX2FjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhdGhGcm9tUm9vdC5mb3JFYWNoKCByb3V0ZSA9PiB7XG4gICAgICAgICAgICB1cmwucHVzaC5hcHBseSh1cmwsIHJvdXRlLnVybCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29sdW1uLmZvcm1hdFN0cmluZyA9IGAjLyR7dXJsLmpvaW4oJy8nKX0vKG1vZGFsOlxcJFxce2lkXFx9L2VkaXQpYDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjcmVhdGUgbGlzdCBjb25maWd1cmF0aW9uIGJ5IGFzc2lnbmluZyBsaXN0IGVudGl0eSBzZXRcbiAgICAgICAgdGhpcy50YWJsZS5jb25maWcgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICBtb2RlbDogZW50aXR5U2V0Lk5hbWVcbiAgICAgICAgfSwgZGVmYXVsdENvbmZpZ3VyYXRpb24pO1xuICAgICAgICAvLyBmZXRjaCBkYXRhXG4gICAgICAgIHRoaXMudGFibGUuZmV0Y2godHJ1ZSk7XG4gICAgICAgIC8vIGRvIHJlbG9hZCBieSB1c2luZyBoaWRkZW4gZnJhZ21lbnQgZS5nLiAvY2xhc3NlcyNyZWxvYWRcbiAgICAgICAgdGhpcy5yZWxvYWRTdWJzY3JpcHRpb24gPSB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5mcmFnbWVudC5zdWJzY3JpYmUoZnJhZ21lbnQgPT4ge1xuICAgICAgICAgIGlmIChmcmFnbWVudCAmJiBmcmFnbWVudCA9PT0gJ3JlbG9hZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX3RvYXN0U2VydmljZS5zaG93KFxuICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1NldHRpbmdzLk9wZXJhdGlvbkNvbXBsZXRlZCcpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy50YWJsZS5mZXRjaCh0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBmaW5hbGx5IGFkZCB1c2VyIGFjdGl2aXR5XG4gICAgICAgIHRoaXMuX3VzZXJBY3Rpdml0eVNlcnZpY2Uuc2V0SXRlbSh7XG4gICAgICAgICAgY2F0ZWdvcnk6IHRoaXMuY2F0ZWdvcnksXG4gICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSksXG4gICAgICAgICAgZGF0ZUNyZWF0ZWQ6IG5ldyBEYXRlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICByZXR1cm4gdGhpcy5fZXJyb3JTZXJ2aWNlLnNob3dFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIERhdGEgbG9hZCBldmVudCBoYW5kbGVyIG9mIGFkdmFuY2VkIHRhYmxlIGNvbXBvbmVudFxuICAgKiBAcGFyYW0ge0FkdmFuY2VkVGFibGVEYXRhUmVzdWx0fSBkYXRhXG4gICAqL1xuICBvbkRhdGFMb2FkKGRhdGE6IEFkdmFuY2VkVGFibGVEYXRhUmVzdWx0KSB7XG4gICAgdGhpcy5yZWNvcmRzVG90YWwgPSBkYXRhLnJlY29yZHNUb3RhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgc2VsZWN0ZWQgaXRlbXNcbiAgICovXG4gIHJlbW92ZSgpIHtcbiAgICBpZiAodGhpcy50YWJsZSAmJiB0aGlzLnRhYmxlLnNlbGVjdGVkICYmIHRoaXMudGFibGUuc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICAvLyBnZXQgaXRlbXMgdG8gcmVtb3ZlXG4gICAgICBjb25zdCBpdGVtcyA9IHRoaXMudGFibGUuc2VsZWN0ZWQ7XG4gICAgICByZXR1cm4gdGhpcy5fbW9kYWxTZXJ2aWNlLnNob3dXYXJuaW5nRGlhbG9nKFxuICAgICAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1RhYmxlcy5SZW1vdmVJdGVtc1RpdGxlJyksXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnVGFibGVzLlJlbW92ZUl0ZW1zTWVzc2FnZScpLFxuICAgICAgICBESUFMT0dfQlVUVE9OUy5Pa0NhbmNlbCkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09ICdvaycpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQubW9kZWwodGhpcy50YWJsZS5jb25maWcubW9kZWwpLnJlbW92ZShpdGVtcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX3RvYXN0U2VydmljZS5zaG93KFxuICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gKyAnOicgKyB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1RhYmxlcy5SZW1vdmVJdGVtTWVzc2FnZS50aXRsZScpLFxuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgoaXRlbXMubGVuZ3RoID09PSAxID9cbiAgICAgICAgICAgICAgICAgICdUYWJsZXMuUmVtb3ZlSXRlbU1lc3NhZ2Uub25lJyA6ICdUYWJsZXMuUmVtb3ZlSXRlbU1lc3NhZ2UubWFueScpXG4gICAgICAgICAgICAgICAgICAsIHsgdmFsdWU6IGl0ZW1zLmxlbmd0aCB9KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLnRhYmxlLmZldGNoKHRydWUpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fZXJyb3JTZXJ2aWNlLnNob3dFcnJvcihlcnIsIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZUxpbms6ICcuJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbn1cbiJdfQ==