@cauca-911/management 18.0.2 → 20.2.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 (35) hide show
  1. package/fesm2022/cauca-911-management.mjs +51 -47
  2. package/fesm2022/cauca-911-management.mjs.map +1 -1
  3. package/index.d.ts +161 -5
  4. package/package.json +5 -7
  5. package/esm2022/cauca-911-management.mjs +0 -5
  6. package/esm2022/lib/cauca-management-group/cauca-management-group.component.mjs +0 -294
  7. package/esm2022/lib/cauca-management-user/cauca-management-user.component.mjs +0 -97
  8. package/esm2022/lib/cauca-management.component.mjs +0 -21
  9. package/esm2022/lib/cauca-management.module.mjs +0 -55
  10. package/esm2022/lib/cauca-management.service.mjs +0 -13
  11. package/esm2022/lib/shared/models/group-model.mjs +0 -8
  12. package/esm2022/lib/shared/models/group-permission-model.mjs +0 -9
  13. package/esm2022/lib/shared/models/permission-model.mjs +0 -8
  14. package/esm2022/lib/shared/models/user-group-model.mjs +0 -8
  15. package/esm2022/lib/shared/models/user-model.mjs +0 -12
  16. package/esm2022/lib/shared/models/user-permission-model.mjs +0 -9
  17. package/esm2022/lib/shared/services/management-group.service.mjs +0 -34
  18. package/esm2022/lib/shared/services/management-permission.service.mjs +0 -31
  19. package/esm2022/lib/shared/services/management-user.service.mjs +0 -49
  20. package/esm2022/public-api.mjs +0 -16
  21. package/lib/cauca-management-group/cauca-management-group.component.d.ts +0 -46
  22. package/lib/cauca-management-user/cauca-management-user.component.d.ts +0 -20
  23. package/lib/cauca-management.component.d.ts +0 -5
  24. package/lib/cauca-management.module.d.ts +0 -15
  25. package/lib/cauca-management.service.d.ts +0 -5
  26. package/lib/shared/models/group-model.d.ts +0 -9
  27. package/lib/shared/models/group-permission-model.d.ts +0 -6
  28. package/lib/shared/models/permission-model.d.ts +0 -6
  29. package/lib/shared/models/user-group-model.d.ts +0 -5
  30. package/lib/shared/models/user-model.d.ts +0 -14
  31. package/lib/shared/models/user-permission-model.d.ts +0 -6
  32. package/lib/shared/services/management-group.service.d.ts +0 -17
  33. package/lib/shared/services/management-permission.service.d.ts +0 -16
  34. package/lib/shared/services/management-user.service.d.ts +0 -23
  35. package/public-api.d.ts +0 -12
package/index.d.ts CHANGED
@@ -1,5 +1,161 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- /// <amd-module name="@cauca-911/management" />
5
- export * from './public-api';
1
+ import * as i0 from '@angular/core';
2
+ import { OnInit } from '@angular/core';
3
+ import * as i4 from '@angular/common';
4
+ import * as i5 from 'devextreme-angular/ui/check-box';
5
+ import * as i6 from 'devextreme-angular/ui/list';
6
+ import * as i7 from 'devextreme-angular/ui/tag-box';
7
+ import * as i8 from '@cauca-911/core';
8
+ import * as i9 from '@cauca-911/devextreme';
9
+ import { HttpClient } from '@angular/common/http';
10
+ import { Observable } from 'rxjs';
11
+
12
+ declare class CaucaManagementService {
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<CaucaManagementService, never>;
14
+ static ɵprov: i0.ɵɵInjectableDeclaration<CaucaManagementService>;
15
+ }
16
+
17
+ declare class CaucaManagementComponent {
18
+ static ɵfac: i0.ɵɵFactoryDeclaration<CaucaManagementComponent, never>;
19
+ static ɵcmp: i0.ɵɵComponentDeclaration<CaucaManagementComponent, "cauca-management", never, {}, {}, never, never, false, never>;
20
+ }
21
+
22
+ declare class UserGroupModel {
23
+ idUserGroup: string;
24
+ idGroup: string;
25
+ idUser: string;
26
+ }
27
+
28
+ declare class UserPermissionModel {
29
+ idUserPermission: string;
30
+ isAllowed: boolean;
31
+ idUser: string;
32
+ idModulePermission: string;
33
+ }
34
+
35
+ declare class UserModel {
36
+ id: string;
37
+ userName: string;
38
+ firstName: string;
39
+ lastName: string;
40
+ password: string;
41
+ email: string;
42
+ isActive: boolean;
43
+ groups: UserGroupModel[];
44
+ permissions: UserPermissionModel[];
45
+ twoFactorAuthenticatorEnabled: boolean;
46
+ }
47
+
48
+ declare class GroupPermissionModel {
49
+ idGroupPermission: string;
50
+ isAllowed: boolean;
51
+ idGroup: string;
52
+ idModulePermission: string;
53
+ }
54
+
55
+ declare class GroupModel {
56
+ id: string;
57
+ name: string;
58
+ users: UserGroupModel[];
59
+ permissions: GroupPermissionModel[];
60
+ assignableByAllUsers: boolean;
61
+ }
62
+
63
+ declare class PermissionModel {
64
+ id: string;
65
+ name: string;
66
+ tag: string;
67
+ idSystem: string;
68
+ }
69
+
70
+ declare class CaucaManagementGroupComponent implements OnInit {
71
+ showPrintButton: boolean;
72
+ hoverStatePermission: boolean;
73
+ showAssignableByAllUsers: boolean;
74
+ groups: GroupModel[];
75
+ users: UserModel[];
76
+ permissions: PermissionModel[];
77
+ userFullName: any;
78
+ showColumn: boolean;
79
+ showColumnXS: boolean;
80
+ translations: any;
81
+ private groupUsers;
82
+ private readonly managementGroupService;
83
+ private readonly managementUserService;
84
+ private readonly managementPermissionService;
85
+ constructor();
86
+ ngOnInit(): void;
87
+ fullName(data: any): string;
88
+ getGroupUser(field: any, e: any): void;
89
+ setGroupUser(field: any, e: any): void;
90
+ setGroupPermission(field: any, e: any): void;
91
+ getPermissionStatus(field: any, permission: any, e: any): void;
92
+ checkBoxToggled(field: any, permission: any, e: any): void;
93
+ onRowInserted(e: any): void;
94
+ onRowUpdated(e: any): void;
95
+ onRowRemoved(e: any): void;
96
+ calculateUsersCellValue: (e: any) => string;
97
+ onEditingStart(e: any): void;
98
+ onInitNewRow(): void;
99
+ groupNameAlreadyUsedValidation: (e: any) => Promise<boolean>;
100
+ private setPermissionStatus;
101
+ private saveGroup;
102
+ private removePermissionUndefined;
103
+ private getGroups;
104
+ static ɵfac: i0.ɵɵFactoryDeclaration<CaucaManagementGroupComponent, never>;
105
+ static ɵcmp: i0.ɵɵComponentDeclaration<CaucaManagementGroupComponent, "cauca-management-group", never, { "showPrintButton": { "alias": "showPrintButton"; "required": false; }; "hoverStatePermission": { "alias": "hoverStatePermission"; "required": false; }; "showAssignableByAllUsers": { "alias": "showAssignableByAllUsers"; "required": false; }; }, {}, never, never, false, never>;
106
+ }
107
+
108
+ declare class CaucaManagementUserComponent implements OnInit {
109
+ users: UserModel[];
110
+ showColumnXS: boolean;
111
+ private readonly managementUserService;
112
+ constructor();
113
+ ngOnInit(): void;
114
+ onRowInserted(e: any): void;
115
+ onRowUpdated(e: any): void;
116
+ onRowRemoved(e: any): void;
117
+ userNameAlreadyUsedValidation: (e: any) => Promise<boolean>;
118
+ private saveGroup;
119
+ private getUsers;
120
+ static ɵfac: i0.ɵɵFactoryDeclaration<CaucaManagementUserComponent, never>;
121
+ static ɵcmp: i0.ɵɵComponentDeclaration<CaucaManagementUserComponent, "cauca-management-user", never, {}, {}, never, never, false, never>;
122
+ }
123
+
124
+ declare class CaucaManagementModule {
125
+ static ɵfac: i0.ɵɵFactoryDeclaration<CaucaManagementModule, never>;
126
+ static ɵmod: i0.ɵɵNgModuleDeclaration<CaucaManagementModule, [typeof CaucaManagementComponent, typeof CaucaManagementGroupComponent, typeof CaucaManagementUserComponent], [typeof i4.CommonModule, typeof i5.DxCheckBoxModule, typeof i6.DxListModule, typeof i7.DxTagBoxModule, typeof i8.CaucaCoreForChildModule, typeof i9.CaucaDevextremeModule], [typeof CaucaManagementComponent, typeof CaucaManagementUserComponent, typeof CaucaManagementGroupComponent]>;
127
+ static ɵinj: i0.ɵɵInjectorDeclaration<CaucaManagementModule>;
128
+ }
129
+
130
+ declare class ManagementUserService {
131
+ protected http: HttpClient;
132
+ private config;
133
+ constructor();
134
+ getAll<TUser>(): Observable<TUser[]>;
135
+ get<TUser>(idUser: string): Observable<TUser>;
136
+ getGroup(idUser: string): Observable<any>;
137
+ addGroup(userGroup: UserGroupModel): Observable<any>;
138
+ deleteGroup(idUserGroup: string): Observable<any>;
139
+ addPermission(userPermission: UserPermissionModel): Observable<any>;
140
+ deletePermission(idUserPermission: string): Observable<any>;
141
+ save<TUser>(user: TUser): Observable<any>;
142
+ delete(idUser: string): Observable<any>;
143
+ hasExistingUserName<TUser>(user: TUser): Observable<boolean>;
144
+ static ɵfac: i0.ɵɵFactoryDeclaration<ManagementUserService, never>;
145
+ static ɵprov: i0.ɵɵInjectableDeclaration<ManagementUserService>;
146
+ }
147
+
148
+ declare class ManagementGroupService {
149
+ private http;
150
+ private config;
151
+ constructor();
152
+ getAll(): Observable<GroupModel[]>;
153
+ get(idGroup: string): Observable<GroupModel>;
154
+ save(group: GroupModel): Observable<any>;
155
+ delete(idGroup: string): Observable<any>;
156
+ hasExistingGroupName(group: GroupModel): Observable<boolean>;
157
+ static ɵfac: i0.ɵɵFactoryDeclaration<ManagementGroupService, never>;
158
+ static ɵprov: i0.ɵɵInjectableDeclaration<ManagementGroupService>;
159
+ }
160
+
161
+ export { CaucaManagementComponent, CaucaManagementGroupComponent, CaucaManagementModule, CaucaManagementService, CaucaManagementUserComponent, GroupModel, GroupPermissionModel, ManagementGroupService, ManagementUserService, UserGroupModel, UserModel, UserPermissionModel };
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@cauca-911/management",
3
- "version": "18.0.2",
3
+ "version": "20.2.0",
4
4
  "peerDependencies": {
5
- "@angular/common": ">=18.0.0",
6
- "@angular/core": ">=18.0.0",
7
- "@cauca-911/devextreme": ">=18.0.1"
5
+ "@angular/common": ">=20.2.1",
6
+ "@angular/core": ">=20.2.1",
7
+ "@cauca-911/devextreme": ">=20.2.0"
8
8
  },
9
9
  "homepage": "https://cauca.ca",
10
10
  "license": "SEE LICENSE IN LICENSE",
@@ -25,13 +25,11 @@
25
25
  },
26
26
  ".": {
27
27
  "types": "./index.d.ts",
28
- "esm2022": "./esm2022/cauca-911-management.mjs",
29
- "esm": "./esm2022/cauca-911-management.mjs",
30
28
  "default": "./fesm2022/cauca-911-management.mjs"
31
29
  }
32
30
  },
33
31
  "sideEffects": false,
34
32
  "scripts": {
35
- "prepublishOnly": "node --eval \"console.error('ERROR: Trying to publish a package that has been compiled by Ivy in full compilation mode. This is not allowed.\\nPlease delete and rebuild the package with Ivy partial compilation mode, before attempting to publish.\\n')\" && exit 1"
33
+ "prepublishOnly": "node --eval \"console.error('ERROR: Trying to publish a package that has been compiled in full compilation mode. This is not allowed.\\nPlease delete and rebuild the package with partial compilation mode, before attempting to publish.\\n')\" && exit 1"
36
34
  }
37
35
  }
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F1Y2EtOTExLW1hbmFnZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9jYXVjYS1tYW5hZ2VtZW50L3NyYy9jYXVjYS05MTEtbWFuYWdlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -1,294 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { map } from 'rxjs/operators';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../shared/services/management-group.service";
5
- import * as i2 from "../shared/services/management-user.service";
6
- import * as i3 from "../shared/services/management-permission.service";
7
- import * as i4 from "@angular/cdk/layout";
8
- import * as i5 from "devextreme-angular/ui/check-box";
9
- import * as i6 from "devextreme-angular/core";
10
- import * as i7 from "devextreme-angular/ui/list";
11
- import * as i8 from "devextreme-angular/ui/nested";
12
- import * as i9 from "devextreme-angular/ui/tag-box";
13
- import * as i10 from "@cauca-911/devextreme";
14
- import * as i11 from "@ngx-translate/core";
15
- const _c0 = () => ["name", "tag"];
16
- function CaucaManagementGroupComponent_div_20_Template(rf, ctx) { if (rf & 1) {
17
- const _r1 = i0.ɵɵgetCurrentView();
18
- i0.ɵɵelementStart(0, "div")(1, "dx-tag-box", 15);
19
- i0.ɵɵlistener("onInitialized", function CaucaManagementGroupComponent_div_20_Template_dx_tag_box_onInitialized_1_listener($event) { const field_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.getGroupUser(field_r2, $event)); })("onValueChanged", function CaucaManagementGroupComponent_div_20_Template_dx_tag_box_onValueChanged_1_listener($event) { const field_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setGroupUser(field_r2, $event)); });
20
- i0.ɵɵelementEnd()();
21
- } if (rf & 2) {
22
- const ctx_r2 = i0.ɵɵnextContext();
23
- i0.ɵɵadvance();
24
- i0.ɵɵproperty("displayExpr", ctx_r2.fullName)("dataSource", ctx_r2.users)("searchEnabled", true)("searchExpr", ctx_r2.fullName);
25
- } }
26
- function CaucaManagementGroupComponent_div_21_div_2_Template(rf, ctx) { if (rf & 1) {
27
- const _r4 = i0.ɵɵgetCurrentView();
28
- i0.ɵɵelementStart(0, "div")(1, "dx-check-box", 17);
29
- i0.ɵɵlistener("onInitialized", function CaucaManagementGroupComponent_div_21_div_2_Template_dx_check_box_onInitialized_1_listener($event) { const permission_r5 = i0.ɵɵrestoreView(_r4).$implicit; const field_r6 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.getPermissionStatus(field_r6, permission_r5, $event)); })("onValueChanged", function CaucaManagementGroupComponent_div_21_div_2_Template_dx_check_box_onValueChanged_1_listener($event) { const permission_r5 = i0.ɵɵrestoreView(_r4).$implicit; const field_r6 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.checkBoxToggled(field_r6, permission_r5, $event)); });
30
- i0.ɵɵelementEnd()();
31
- } if (rf & 2) {
32
- const permission_r5 = ctx.$implicit;
33
- i0.ɵɵadvance();
34
- i0.ɵɵproperty("text", permission_r5.name);
35
- } }
36
- function CaucaManagementGroupComponent_div_21_Template(rf, ctx) { if (rf & 1) {
37
- i0.ɵɵelementStart(0, "div")(1, "dx-list", 16);
38
- i0.ɵɵtemplate(2, CaucaManagementGroupComponent_div_21_div_2_Template, 2, 1, "div", 14);
39
- i0.ɵɵelementEnd()();
40
- } if (rf & 2) {
41
- const ctx_r2 = i0.ɵɵnextContext();
42
- i0.ɵɵadvance();
43
- i0.ɵɵproperty("dataSource", ctx_r2.permissions)("searchEnabled", true)("searchExpr", i0.ɵɵpureFunction0(5, _c0))("hoverStateEnabled", ctx_r2.hoverStatePermission);
44
- i0.ɵɵadvance();
45
- i0.ɵɵproperty("dxTemplateOf", "rowTemplate");
46
- } }
47
- export class CaucaManagementGroupComponent {
48
- constructor(managementGroupService, managementUserService, managementPermissionService, breakpointObserver) {
49
- this.managementGroupService = managementGroupService;
50
- this.managementUserService = managementUserService;
51
- this.managementPermissionService = managementPermissionService;
52
- this.showPrintButton = true;
53
- this.hoverStatePermission = true;
54
- this.showAssignableByAllUsers = true;
55
- this.groups = [];
56
- this.users = [];
57
- this.permissions = [];
58
- this.userFullName = {};
59
- this.showColumn = true;
60
- this.showColumnXS = true;
61
- this.translations = [];
62
- this.calculateUsersCellValue = (e) => {
63
- const users = (e.users ? e.users : []);
64
- let usersNames = [];
65
- users.forEach((user) => {
66
- const userGroup = this.users.filter((u) => u.id === user.idUser);
67
- if (userGroup && userGroup[0]) {
68
- usersNames.push(userGroup[0].firstName + ' ' + userGroup[0].lastName);
69
- }
70
- });
71
- usersNames = usersNames.sort((one, two) => (one < two ? -1 : 1));
72
- return usersNames.join(', ');
73
- };
74
- this.groupNameAlreadyUsedValidation = (e) => this.managementGroupService.hasExistingGroupName(e.data).pipe(map((exist) => !exist)).toPromise();
75
- breakpointObserver.observe(['(max-width: 1000px)']).subscribe((result) => {
76
- this.showColumn = !result.matches;
77
- });
78
- breakpointObserver.observe(['(max-width: 600px)']).subscribe((result) => {
79
- this.showColumnXS = !result.matches;
80
- });
81
- }
82
- ngOnInit() {
83
- this.managementUserService.getAll().subscribe((data) => {
84
- this.users = data;
85
- this.users.forEach((user) => {
86
- if (user.isActive) {
87
- if (user.firstName !== '' && user.lastName !== '') {
88
- this.userFullName[user.id] = `${user.firstName} ${user.lastName}`;
89
- }
90
- }
91
- });
92
- });
93
- this.managementPermissionService.getAll().subscribe((permissions) => {
94
- const permissionIndex = permissions.findIndex((c) => c.tag === 'CanAccessPermissions');
95
- if (permissionIndex !== -1) {
96
- permissions.splice(permissionIndex, 1);
97
- }
98
- permissions.sort((a, b) => {
99
- if (a.name < b.name) {
100
- return -1;
101
- }
102
- if (a.name > b.name) {
103
- return 1;
104
- }
105
- return 0;
106
- });
107
- this.permissions = permissions;
108
- });
109
- this.getGroups();
110
- }
111
- fullName(data) {
112
- if (!data) {
113
- return '';
114
- }
115
- return `${data.firstName} ${data.lastName}`;
116
- }
117
- getGroupUser(field, e) {
118
- const users = [];
119
- if (this.groupUsers) {
120
- this.groupUsers.forEach((user) => {
121
- users.push(user.idUser);
122
- });
123
- }
124
- e.component.option('value', users);
125
- }
126
- setGroupUser(field, e) {
127
- const groupUser = [];
128
- e.value.forEach((idUser) => {
129
- const groupIndex = (field.data.users || []).findIndex((g) => g.idUser === idUser);
130
- if (groupIndex === -1) {
131
- groupUser.push({ idUser, });
132
- }
133
- else {
134
- groupUser.push(field.data.users[groupIndex]);
135
- }
136
- });
137
- field.setValue(JSON.parse(JSON.stringify(groupUser)));
138
- }
139
- setGroupPermission(field, e) {
140
- const groupUser = [];
141
- e.value.forEach((idUser) => {
142
- groupUser.push({
143
- idUser,
144
- });
145
- });
146
- field.setValue(JSON.parse(JSON.stringify(groupUser)));
147
- }
148
- getPermissionStatus(field, permission, e) {
149
- const groupPermission = (field.value || []).find((p) => p.idModulePermission === permission.id);
150
- if (groupPermission) {
151
- e.component.option('value', groupPermission.isAllowed);
152
- }
153
- else {
154
- e.component.option('value', undefined);
155
- }
156
- }
157
- checkBoxToggled(field, permission, e) {
158
- if (e.component.skipOnValueChanged) {
159
- e.component.skipOnValueChanged = false;
160
- return;
161
- }
162
- if (e.component.setUndefinedNextTime) {
163
- e.component.setUndefinedNextTime = false;
164
- e.component.skipOnValueChanged = true;
165
- e.component.option('value', undefined);
166
- this.setPermissionStatus(field, permission, undefined);
167
- return;
168
- }
169
- if (e.value === false) {
170
- e.component.setUndefinedNextTime = true;
171
- }
172
- this.setPermissionStatus(field, permission, e.value);
173
- }
174
- onRowInserted(e) {
175
- this.saveGroup(e.data);
176
- }
177
- onRowUpdated(e) {
178
- this.saveGroup(e.data);
179
- }
180
- onRowRemoved(e) {
181
- const group = e.data;
182
- this.managementGroupService.delete(group.id).subscribe(() => {
183
- this.getGroups();
184
- });
185
- }
186
- onEditingStart(e) {
187
- this.groupUsers = e.data.users;
188
- }
189
- onInitNewRow() {
190
- this.groupUsers = [];
191
- }
192
- setPermissionStatus(field, permission, value) {
193
- const groupPermissions = field.value || [];
194
- const groupIndex = groupPermissions.findIndex((p) => p.idModulePermission === permission.id);
195
- if (groupIndex > -1) {
196
- groupPermissions[groupIndex].isAllowed = value;
197
- }
198
- else {
199
- groupPermissions.push({
200
- idModulePermission: permission.id,
201
- isAllowed: value,
202
- });
203
- }
204
- field.setValue(JSON.parse(JSON.stringify(groupPermissions)));
205
- }
206
- saveGroup(group) {
207
- this.removePermissionUndefined(group);
208
- if (group.users) {
209
- group.users.forEach((userGroup) => {
210
- userGroup.idGroup = group.id;
211
- });
212
- }
213
- if (group.permissions) {
214
- group.permissions.forEach((groupPermission) => {
215
- groupPermission.idGroup = group.id;
216
- });
217
- }
218
- this.managementGroupService.save(group).subscribe(() => {
219
- this.getGroups();
220
- });
221
- this.groupUsers = [];
222
- }
223
- removePermissionUndefined(group) {
224
- group.permissions = group.permissions.filter((permission) => permission.isAllowed !== undefined);
225
- }
226
- getGroups() {
227
- this.managementGroupService.getAll().subscribe((data) => this.groups = data);
228
- }
229
- static { this.ɵfac = function CaucaManagementGroupComponent_Factory(t) { return new (t || CaucaManagementGroupComponent)(i0.ɵɵdirectiveInject(i1.ManagementGroupService), i0.ɵɵdirectiveInject(i2.ManagementUserService), i0.ɵɵdirectiveInject(i3.ManagementPermissionService), i0.ɵɵdirectiveInject(i4.BreakpointObserver)); }; }
230
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CaucaManagementGroupComponent, selectors: [["cauca-management-group"]], inputs: { showPrintButton: "showPrintButton", hoverStatePermission: "hoverStatePermission", showAssignableByAllUsers: "showAssignableByAllUsers" }, decls: 22, vars: 36, consts: [["keyExpr", "id", 3, "onRowInserted", "onInitNewRow", "onRowUpdated", "onEditingStart", "onRowRemoved", "allowPrint", "dataSource"], ["dataField", "name", 3, "caption"], ["type", "async", 3, "message", "validationCallback"], ["dataField", "assignableByAllUsers", "dataType", "boolean", 3, "caption", "visible"], ["dataField", "users", "editCellTemplate", "usersEditTemplate", 3, "caption", "calculateCellValue"], ["dataField", "permissions", "editCellTemplate", "permissionsEditTemplate", 3, "caption", "visible"], [3, "enabled"], ["mode", "popup", 3, "allowAdding", "allowUpdating", "allowDeleting", "useIcons"], [3, "showTitle", "title", "fullScreen"], ["colCount", "1", 3, "labelLocation"], ["dataField", "name", 3, "isRequired"], ["dataField", "users"], ["dataField", "permissions"], ["dataField", "assignableByAllUsers", 3, "visible"], [4, "dxTemplate", "dxTemplateOf"], ["valueExpr", "id", 3, "onInitialized", "onValueChanged", "displayExpr", "dataSource", "searchEnabled", "searchExpr"], ["itemTemplate", "rowTemplate", 3, "dataSource", "searchEnabled", "searchExpr", "hoverStateEnabled"], [3, "onInitialized", "onValueChanged", "text"]], template: function CaucaManagementGroupComponent_Template(rf, ctx) { if (rf & 1) {
231
- i0.ɵɵelementStart(0, "cauca-dx-data-grid", 0);
232
- i0.ɵɵlistener("onRowInserted", function CaucaManagementGroupComponent_Template_cauca_dx_data_grid_onRowInserted_0_listener($event) { return ctx.onRowInserted($event); })("onInitNewRow", function CaucaManagementGroupComponent_Template_cauca_dx_data_grid_onInitNewRow_0_listener() { return ctx.onInitNewRow(); })("onRowUpdated", function CaucaManagementGroupComponent_Template_cauca_dx_data_grid_onRowUpdated_0_listener($event) { return ctx.onRowUpdated($event); })("onEditingStart", function CaucaManagementGroupComponent_Template_cauca_dx_data_grid_onEditingStart_0_listener($event) { return ctx.onEditingStart($event); })("onRowRemoved", function CaucaManagementGroupComponent_Template_cauca_dx_data_grid_onRowRemoved_0_listener($event) { return ctx.onRowRemoved($event); });
233
- i0.ɵɵelementStart(1, "dxi-column", 1);
234
- i0.ɵɵpipe(2, "translate");
235
- i0.ɵɵelement(3, "dxi-validation-rule", 2);
236
- i0.ɵɵpipe(4, "translate");
237
- i0.ɵɵelementEnd();
238
- i0.ɵɵelement(5, "dxi-column", 3);
239
- i0.ɵɵpipe(6, "translate");
240
- i0.ɵɵelement(7, "dxi-column", 4);
241
- i0.ɵɵpipe(8, "translate");
242
- i0.ɵɵelement(9, "dxi-column", 5);
243
- i0.ɵɵpipe(10, "translate");
244
- i0.ɵɵelement(11, "dxo-export", 6);
245
- i0.ɵɵelementStart(12, "dxo-editing", 7);
246
- i0.ɵɵelement(13, "dxo-popup", 8);
247
- i0.ɵɵpipe(14, "translate");
248
- i0.ɵɵelementStart(15, "dxo-form", 9);
249
- i0.ɵɵelement(16, "dxi-item", 10)(17, "dxi-item", 11)(18, "dxi-item", 12)(19, "dxi-item", 13);
250
- i0.ɵɵelementEnd()();
251
- i0.ɵɵtemplate(20, CaucaManagementGroupComponent_div_20_Template, 2, 4, "div", 14)(21, CaucaManagementGroupComponent_div_21_Template, 3, 6, "div", 14);
252
- i0.ɵɵelementEnd();
253
- } if (rf & 2) {
254
- i0.ɵɵproperty("allowPrint", ctx.showPrintButton)("dataSource", ctx.groups);
255
- i0.ɵɵadvance();
256
- i0.ɵɵproperty("caption", i0.ɵɵpipeBind1(2, 24, "management.name"));
257
- i0.ɵɵadvance(2);
258
- i0.ɵɵproperty("message", i0.ɵɵpipeBind1(4, 26, "management.groupNameAlreadyUsed"))("validationCallback", ctx.groupNameAlreadyUsedValidation);
259
- i0.ɵɵadvance(2);
260
- i0.ɵɵproperty("caption", i0.ɵɵpipeBind1(6, 28, "management.assignableByAllUsers"))("visible", ctx.showAssignableByAllUsers);
261
- i0.ɵɵadvance(2);
262
- i0.ɵɵproperty("caption", i0.ɵɵpipeBind1(8, 30, "management.users"))("calculateCellValue", ctx.calculateUsersCellValue);
263
- i0.ɵɵadvance(2);
264
- i0.ɵɵproperty("caption", i0.ɵɵpipeBind1(10, 32, "management.permissions"))("visible", false);
265
- i0.ɵɵadvance(2);
266
- i0.ɵɵproperty("enabled", false);
267
- i0.ɵɵadvance();
268
- i0.ɵɵproperty("allowAdding", true)("allowUpdating", true)("allowDeleting", true)("useIcons", true);
269
- i0.ɵɵadvance();
270
- i0.ɵɵproperty("showTitle", true)("title", i0.ɵɵpipeBind1(14, 34, "management.group"))("fullScreen", !ctx.showColumn);
271
- i0.ɵɵadvance(2);
272
- i0.ɵɵproperty("labelLocation", ctx.showColumnXS ? "left" : "top");
273
- i0.ɵɵadvance();
274
- i0.ɵɵproperty("isRequired", true);
275
- i0.ɵɵadvance(3);
276
- i0.ɵɵproperty("visible", ctx.showAssignableByAllUsers);
277
- i0.ɵɵadvance();
278
- i0.ɵɵproperty("dxTemplateOf", "usersEditTemplate");
279
- i0.ɵɵadvance();
280
- i0.ɵɵproperty("dxTemplateOf", "permissionsEditTemplate");
281
- } }, dependencies: [i5.DxCheckBoxComponent, i6.DxTemplateDirective, i7.DxListComponent, i8.DxiItemComponent, i9.DxTagBoxComponent, i10.CaucaDataGridComponent, i8.DxiColumnComponent, i8.DxiValidationRuleComponent, i8.DxoEditingComponent, i8.DxoFormComponent, i8.DxoPopupComponent, i8.DxoExportComponent, i11.TranslatePipe] }); }
282
- }
283
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CaucaManagementGroupComponent, [{
284
- type: Component,
285
- args: [{ selector: 'cauca-management-group', template: "<cauca-dx-data-grid [allowPrint]=\"showPrintButton\" keyExpr=\"id\" [dataSource]=\"groups\"\n (onRowInserted)=\"onRowInserted($event)\" (onInitNewRow)=\"onInitNewRow()\" (onRowUpdated)=\"onRowUpdated($event)\"\n (onEditingStart)=\"onEditingStart($event)\" (onRowRemoved)=\"onRowRemoved($event)\">\n\n <dxi-column dataField=\"name\" [caption]=\"'management.name' | translate\">\n <dxi-validation-rule type=\"async\" [message]=\"'management.groupNameAlreadyUsed' | translate\"\n [validationCallback]=\"groupNameAlreadyUsedValidation\"></dxi-validation-rule>\n </dxi-column>\n <dxi-column dataField=\"assignableByAllUsers\" [caption]=\"'management.assignableByAllUsers' | translate\"\n dataType=\"boolean\" [visible]=\"showAssignableByAllUsers\">\n </dxi-column>\n <dxi-column dataField=\"users\" [caption]=\"'management.users' | translate\" editCellTemplate=\"usersEditTemplate\"\n [calculateCellValue]=\"calculateUsersCellValue\">\n </dxi-column>\n <dxi-column dataField=\"permissions\" [caption]=\"'management.permissions' | translate\" [visible]=\"false\"\n editCellTemplate=\"permissionsEditTemplate\">\n </dxi-column>\n <dxo-export [enabled]=\"false\"></dxo-export>\n <dxo-editing mode=\"popup\" [allowAdding]=\"true\" [allowUpdating]=\"true\" [allowDeleting]=\"true\" [useIcons]=\"true\">\n <dxo-popup [showTitle]=\"true\" [title]=\"'management.group' | translate\" [fullScreen]=\"!showColumn\"></dxo-popup>\n <dxo-form colCount=\"1\" [labelLocation]=\"showColumnXS ? 'left' : 'top'\">\n <dxi-item dataField=\"name\" [isRequired]=\"true\"></dxi-item>\n <dxi-item dataField=\"users\"></dxi-item>\n <dxi-item dataField=\"permissions\"></dxi-item>\n <dxi-item dataField=\"assignableByAllUsers\" [visible]=\"showAssignableByAllUsers\"></dxi-item>\n </dxo-form>\n </dxo-editing>\n\n <div *dxTemplate=\"let field of 'usersEditTemplate'\">\n <dx-tag-box valueExpr=\"id\" [displayExpr]=\"fullName\" [dataSource]=\"users\" [searchEnabled]=\"true\"\n [searchExpr]=\"fullName\" (onInitialized)=\"getGroupUser(field, $event)\"\n (onValueChanged)=\"setGroupUser(field, $event)\">\n </dx-tag-box>\n </div>\n <div *dxTemplate=\"let field of 'permissionsEditTemplate'\">\n <dx-list [dataSource]=\"permissions\" itemTemplate=\"rowTemplate\" [searchEnabled]=\"true\"\n [searchExpr]=\"['name', 'tag']\" [hoverStateEnabled]=\"hoverStatePermission\">\n <div *dxTemplate=\"let permission of 'rowTemplate'\">\n <dx-check-box [text]=\"permission.name\" (onInitialized)=\"getPermissionStatus(field, permission, $event)\"\n (onValueChanged)=\"checkBoxToggled(field, permission, $event)\">\n </dx-check-box>\n </div>\n </dx-list>\n </div>\n</cauca-dx-data-grid>" }]
286
- }], () => [{ type: i1.ManagementGroupService }, { type: i2.ManagementUserService }, { type: i3.ManagementPermissionService }, { type: i4.BreakpointObserver }], { showPrintButton: [{
287
- type: Input
288
- }], hoverStatePermission: [{
289
- type: Input
290
- }], showAssignableByAllUsers: [{
291
- type: Input
292
- }] }); })();
293
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CaucaManagementGroupComponent, { className: "CaucaManagementGroupComponent", filePath: "lib\\cauca-management-group\\cauca-management-group.component.ts", lineNumber: 18 }); })();
294
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F1Y2EtbWFuYWdlbWVudC1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jYXVjYS1tYW5hZ2VtZW50L3NyYy9saWIvY2F1Y2EtbWFuYWdlbWVudC1ncm91cC9jYXVjYS1tYW5hZ2VtZW50LWdyb3VwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NhdWNhLW1hbmFnZW1lbnQvc3JjL2xpYi9jYXVjYS1tYW5hZ2VtZW50LWdyb3VwL2NhdWNhLW1hbmFnZW1lbnQtZ3JvdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFekQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0lDMkI3QixBQURKLDJCQUFvRCxxQkFHRztJQUEvQyxBQUR3QiwrT0FBaUIscUNBQTJCLEtBQUMsb09BQ25ELHFDQUEyQixLQUFDO0lBRXRELEFBREksaUJBQWEsRUFDWDs7O0lBSnlCLGNBQXdCO0lBQy9DLEFBRHFFLEFBQXJCLEFBQXpCLDZDQUF3Qiw0QkFBcUIsdUJBQXVCLCtCQUNwRTs7OztJQVFuQixBQURKLDJCQUFtRCx1QkFFbUI7SUFBOUQsQUFEbUMsMlNBQWlCLDJEQUE4QyxLQUFDLGdTQUNqRix1REFBMEMsS0FBQztJQUVyRSxBQURJLGlCQUFlLEVBQ2I7OztJQUhZLGNBQXdCO0lBQXhCLHlDQUF3Qjs7O0lBSDlDLEFBREosMkJBQTBELGtCQUV3QjtJQUMxRSxzRkFBbUQ7SUFNM0QsQUFESSxpQkFBVSxFQUNSOzs7SUFSTyxjQUEwQjtJQUNBLEFBQS9CLEFBRDJELEFBQXRELCtDQUEwQix1QkFBa0QsMENBQ25ELGtEQUEyQztJQUN4QyxjQUFnQjtJQUFoQiw0Q0FBZ0I7O0FEcEI3RCxNQUFNLE9BQU8sNkJB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dCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnJlYWtwb2ludE9ic2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBVc2VyTW9kZWwgfSBmcm9tICcuLi9zaGFyZWQvbW9kZWxzL3VzZXItbW9kZWwnO1xuaW1wb3J0IHsgVXNlckdyb3VwTW9kZWwgfSBmcm9tICcuLi9zaGFyZWQvbW9kZWxzL3VzZXItZ3JvdXAtbW9kZWwnO1xuaW1wb3J0IHsgR3JvdXBNb2RlbCB9IGZyb20gJy4uL3NoYXJlZC9tb2RlbHMvZ3JvdXAtbW9kZWwnO1xuaW1wb3J0IHsgR3JvdXBQZXJtaXNzaW9uTW9kZWwgfSBmcm9tICcuLi9zaGFyZWQvbW9kZWxzL2dyb3VwLXBlcm1pc3Npb24tbW9kZWwnO1xuaW1wb3J0IHsgTWFuYWdlbWVudEdyb3VwU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9zZXJ2aWNlcy9tYW5hZ2VtZW50LWdyb3VwLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWFuYWdlbWVudFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2hhcmVkL3NlcnZpY2VzL21hbmFnZW1lbnQtdXNlci5zZXJ2aWNlJztcbmltcG9ydCB7IFBlcm1pc3Npb25Nb2RlbCB9IGZyb20gJy4uL3NoYXJlZC9tb2RlbHMvcGVybWlzc2lvbi1tb2RlbCc7XG5pbXBvcnQgeyBNYW5hZ2VtZW50UGVybWlzc2lvblNlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvc2VydmljZXMvbWFuYWdlbWVudC1wZXJtaXNzaW9uLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2NhdWNhLW1hbmFnZW1lbnQtZ3JvdXAnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYXVjYS1tYW5hZ2VtZW50LWdyb3VwLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYXVjYS1tYW5hZ2VtZW50LWdyb3VwLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ2F1Y2FNYW5hZ2VtZW50R3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNob3dQcmludEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaG92ZXJTdGF0ZVBlcm1pc3Npb24gPSB0cnVlO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNob3dBc3NpZ25hYmxlQnlBbGxVc2VycyA9IHRydWU7XG5cbiAgICBwdWJsaWMgZ3JvdXBzOiBHcm91cE1vZGVsW10gPSBbXTtcbiAgICBwdWJsaWMgdXNlcnM6IFVzZXJNb2RlbFtdID0gW107XG4gICAgcHVibGljIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uTW9kZWxbXSA9IFtdO1xuICAgIHB1YmxpYyB1c2VyRnVsbE5hbWU6IGFueSA9IHt9O1xuICAgIHB1YmxpYyBzaG93Q29sdW1uID0gdHJ1ZTtcbiAgICBwdWJsaWMgc2hvd0NvbHVtblhTID0gdHJ1ZTtcbiAgICBwdWJsaWMgdHJhbnNsYXRpb25zOiBhbnkgPSBbXTtcblxuICAgIHByaXZhdGUgZ3JvdXBVc2VyczogYW55O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIG1hbmFnZW1lbnRHcm91cFNlcnZpY2U6IE1hbmFnZW1lbnRHcm91cFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbWFuYWdlbWVudFVzZXJTZXJ2aWNlOiBNYW5hZ2VtZW50VXNlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbWFuYWdlbWVudFBlcm1pc3Npb25TZXJ2aWNlOiBNYW5hZ2VtZW50UGVybWlzc2lvblNlcnZpY2UsXG4gICAgICAgIGJyZWFrcG9pbnRPYnNlcnZlcjogQnJlYWtwb2ludE9ic2VydmVyLFxuICAgICkge1xuICAgICAgICBicmVha3BvaW50T2JzZXJ2ZXIub2JzZXJ2ZShbJyhtYXgtd2lkdGg6IDEwMDBweCknXSkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93Q29sdW1uID0gIXJlc3VsdC5tYXRjaGVzO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWtwb2ludE9ic2VydmVyLm9ic2VydmUoWycobWF4LXdpZHRoOiA2MDBweCknXSkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93Q29sdW1uWFMgPSAhcmVzdWx0Lm1hdGNoZXM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VtZW50VXNlclNlcnZpY2UuZ2V0QWxsPFVzZXJNb2RlbD4oKS5zdWJzY3JpYmUoKGRhdGE6IFVzZXJNb2RlbFtdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVzZXJzID0gZGF0YTtcbiAgICAgICAgICAgIHRoaXMudXNlcnMuZm9yRWFjaCgodXNlcjogVXNlck1vZGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXIuaXNBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXIuZmlyc3ROYW1lICE9PSAnJyAmJiB1c2VyLmxhc3ROYW1lICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VyRnVsbE5hbWVbdXNlci5pZF0gID0gYCR7dXNlci5maXJzdE5hbWV9ICR7dXNlci5sYXN0TmFtZX1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1hbmFnZW1lbnRQZXJtaXNzaW9uU2VydmljZS5nZXRBbGwoKS5zdWJzY3JpYmUoKHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uTW9kZWxbXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGVybWlzc2lvbkluZGV4ID0gcGVybWlzc2lvbnMuZmluZEluZGV4KChjOiBQZXJtaXNzaW9uTW9kZWwpID0+IGMudGFnID09PSAnQ2FuQWNjZXNzUGVybWlzc2lvbnMnKTtcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbnMuc3BsaWNlKHBlcm1pc3Npb25JbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5zb3J0KChhOiBQZXJtaXNzaW9uTW9kZWwsIGI6IFBlcm1pc3Npb25Nb2RlbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhLm5hbWUgPCBiLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYS5uYW1lID4gYi5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nZXRHcm91cHMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZnVsbE5hbWUoZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7ZGF0YS5maXJzdE5hbWV9ICR7ZGF0YS5sYXN0TmFtZX1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRHcm91cFVzZXIoZmllbGQ6IGFueSwgZTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHVzZXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5ncm91cFVzZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3VwVXNlcnMuZm9yRWFjaCgodXNlcjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdXNlcnMucHVzaCh1c2VyLmlkVXNlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJywgdXNlcnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRHcm91cFVzZXIoZmllbGQ6IGFueSwgZTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGdyb3VwVXNlcjogVXNlckdyb3VwTW9kZWxbXSA9IFtdO1xuXG4gICAgICAgIGUudmFsdWUuZm9yRWFjaCgoaWRVc2VyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwSW5kZXggPSAoZmllbGQuZGF0YS51c2VycyB8fCBbXSkuZmluZEluZGV4KChnOiBhbnkpID0+IGcuaWRVc2VyID09PSBpZFVzZXIpO1xuXG4gICAgICAgICAgICBpZiAoZ3JvdXBJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBncm91cFVzZXIucHVzaCh7IGlkVXNlciwgfSBhcyBVc2VyR3JvdXBNb2RlbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdyb3VwVXNlci5wdXNoKGZpZWxkLmRhdGEudXNlcnNbZ3JvdXBJbmRleF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBmaWVsZC5zZXRWYWx1ZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdyb3VwVXNlcikpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0R3JvdXBQZXJtaXNzaW9uKGZpZWxkOiBhbnksIGU6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBncm91cFVzZXI6IFVzZXJHcm91cE1vZGVsW10gPSBbXTtcblxuICAgICAgICBlLnZhbHVlLmZvckVhY2goKGlkVXNlcjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBncm91cFVzZXIucHVzaCh7XG4gICAgICAgICAgICAgICAgaWRVc2VyLFxuICAgICAgICAgICAgfSBhcyBVc2VyR3JvdXBNb2RlbCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZpZWxkLnNldFZhbHVlKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZ3JvdXBVc2VyKSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQZXJtaXNzaW9uU3RhdHVzKGZpZWxkOiBhbnksIHBlcm1pc3Npb246IGFueSwgZTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGdyb3VwUGVybWlzc2lvbiA9IChmaWVsZC52YWx1ZSB8fCBbXSkuZmluZCgocDogYW55KSA9PiBwLmlkTW9kdWxlUGVybWlzc2lvbiA9PT0gcGVybWlzc2lvbi5pZCk7XG5cbiAgICAgICAgaWYgKGdyb3VwUGVybWlzc2lvbikge1xuICAgICAgICAgICAgZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScsIGdyb3VwUGVybWlzc2lvbi5pc0FsbG93ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2hlY2tCb3hUb2dnbGVkKGZpZWxkOiBhbnksIHBlcm1pc3Npb246IGFueSwgZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmIChlLmNvbXBvbmVudC5za2lwT25WYWx1ZUNoYW5nZWQpIHtcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNraXBPblZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlLmNvbXBvbmVudC5zZXRVbmRlZmluZWROZXh0VGltZSkge1xuICAgICAgICAgICAgZS5jb21wb25lbnQuc2V0VW5kZWZpbmVkTmV4dFRpbWUgPSBmYWxzZTtcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNraXBPblZhbHVlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICBlLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UGVybWlzc2lvblN0YXR1cyhmaWVsZCwgcGVybWlzc2lvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZS52YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNldFVuZGVmaW5lZE5leHRUaW1lID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0UGVybWlzc2lvblN0YXR1cyhmaWVsZCwgcGVybWlzc2lvbiwgZS52YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUm93SW5zZXJ0ZWQoZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2F2ZUdyb3VwKGUuZGF0YSBhcyBHcm91cE1vZGVsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Sb3dVcGRhdGVkKGU6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNhdmVHcm91cChlLmRhdGEgYXMgR3JvdXBNb2RlbCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUm93UmVtb3ZlZChlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSAoZS5kYXRhIGFzIEdyb3VwTW9kZWwpO1xuICAgICAgICB0aGlzLm1hbmFnZW1lbnRHcm91cFNlcnZpY2UuZGVsZXRlKGdyb3VwLmlkKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZXRHcm91cHMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbGN1bGF0ZVVzZXJzQ2VsbFZhbHVlID0gKGU6IGFueSk6IHN0cmluZyA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJzID0gKGUudXNlcnMgPyBlLnVzZXJzIGFzIFVzZXJHcm91cE1vZGVsW10gOiBbXSk7XG4gICAgICAgIGxldCB1c2Vyc05hbWVzOiBhbnlbXSA9IFtdO1xuICAgICAgICB1c2Vycy5mb3JFYWNoKCh1c2VyOiBVc2VyR3JvdXBNb2RlbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXNlckdyb3VwID0gdGhpcy51c2Vycy5maWx0ZXIoKHU6IFVzZXJNb2RlbCkgPT4gdS5pZCA9PT0gdXNlci5pZFVzZXIpO1xuICAgICAgICAgICAgaWYgKHVzZXJHcm91cCAmJiB1c2VyR3JvdXBbMF0pIHtcbiAgICAgICAgICAgICAgICB1c2Vyc05hbWVzLnB1c2godXNlckdyb3VwWzBdLmZpcnN0TmFtZSArICcgJyArIHVzZXJHcm91cFswXS5sYXN0TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB1c2Vyc05hbWVzID0gdXNlcnNOYW1lcy5zb3J0KChvbmU6IHN0cmluZywgdHdvOiBzdHJpbmcpID0+IChvbmUgPCB0d28gPyAtMSA6IDEpKTtcbiAgICAgICAgcmV0dXJuIHVzZXJzTmFtZXMuam9pbignLCAnKTtcbiAgICB9O1xuXG4gICAgcHVibGljIG9uRWRpdGluZ1N0YXJ0KGU6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmdyb3VwVXNlcnMgPSBlLmRhdGEudXNlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSW5pdE5ld1JvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ncm91cFVzZXJzID0gW107XG4gICAgfVxuXG4gICAgcHVibGljIGdyb3VwTmFtZUFscmVhZHlVc2VkVmFsaWRhdGlvbiA9IChlOiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHRoaXMubWFuYWdlbWVudEdyb3VwU2VydmljZS5oYXNFeGlzdGluZ0dyb3VwTmFtZShlLmRhdGEpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKGV4aXN0OiBib29sZWFuKSA9PiAhZXhpc3QpXG4gICAgICAgICkudG9Qcm9taXNlKCk7XG5cbiAgICBwcml2YXRlIHNldFBlcm1pc3Npb25TdGF0dXMoZmllbGQ6IGFueSwgcGVybWlzc2lvbjogYW55LCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGdyb3VwUGVybWlzc2lvbnMgPSBmaWVsZC52YWx1ZSB8fCBbXTtcbiAgICAgICAgY29uc3QgZ3JvdXBJbmRleCA9IGdyb3VwUGVybWlzc2lvbnMuZmluZEluZGV4KChwOiBHcm91cFBlcm1pc3Npb25Nb2RlbCkgPT4gcC5pZE1vZHVsZVBlcm1pc3Npb24gPT09IHBlcm1pc3Npb24uaWQpO1xuXG4gICAgICAgIGlmIChncm91cEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGdyb3VwUGVybWlzc2lvbnNbZ3JvdXBJbmRleF0uaXNBbGxvd2VkID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBncm91cFBlcm1pc3Npb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkTW9kdWxlUGVybWlzc2lvbjogcGVybWlzc2lvbi5pZCxcbiAgICAgICAgICAgICAgICBpc0FsbG93ZWQ6IHZhbHVlLFxuICAgICAgICAgICAgfSBhcyBHcm91cFBlcm1pc3Npb25Nb2RlbCk7XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZC5zZXRWYWx1ZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdyb3VwUGVybWlzc2lvbnMpKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzYXZlR3JvdXAoZ3JvdXA6IEdyb3VwTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmVQZXJtaXNzaW9uVW5kZWZpbmVkKGdyb3VwKTtcbiAgICAgICAgaWYgKGdyb3VwLnVzZXJzKSB7XG4gICAgICAgICAgICBncm91cC51c2Vycy5mb3JFYWNoKCh1c2VyR3JvdXA6IFVzZXJHcm91cE1vZGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgdXNlckdyb3VwLmlkR3JvdXAgPSBncm91cC5pZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChncm91cC5wZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgZ3JvdXAucGVybWlzc2lvbnMuZm9yRWFjaCgoZ3JvdXBQZXJtaXNzaW9uOiBHcm91cFBlcm1pc3Npb25Nb2RlbCkgPT4ge1xuICAgICAgICAgICAgICAgIGdyb3VwUGVybWlzc2lvbi5pZEdyb3VwID0gZ3JvdXAuaWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hbmFnZW1lbnRHcm91cFNlcnZpY2Uuc2F2ZShncm91cCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ2V0R3JvdXBzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdyb3VwVXNlcnMgPSBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZVBlcm1pc3Npb25VbmRlZmluZWQoZ3JvdXA6IEdyb3VwTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgZ3JvdXAucGVybWlzc2lvbnMgPSBncm91cC5wZXJtaXNzaW9ucy5maWx0ZXIoKHBlcm1pc3Npb246IEdyb3VwUGVybWlzc2lvbk1vZGVsKSA9PiBwZXJtaXNzaW9uLmlzQWxsb3dlZCAhPT0gdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEdyb3VwcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VtZW50R3JvdXBTZXJ2aWNlLmdldEFsbCgpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB0aGlzLmdyb3VwcyA9IGRhdGEpO1xuICAgIH1cbn1cbiIsIjxjYXVjYS1keC1kYXRhLWdyaWQgW2FsbG93UHJpbnRdPVwic2hvd1ByaW50QnV0dG9uXCIga2V5RXhwcj1cImlkXCIgW2RhdGFTb3VyY2VdPVwiZ3JvdXBzXCJcbiAgICAob25Sb3dJbnNlcnRlZCk9XCJvblJvd0luc2VydGVkKCRldmVudClcIiAob25Jbml0TmV3Um93KT1cIm9uSW5pdE5ld1JvdygpXCIgKG9uUm93VXBkYXRlZCk9XCJvblJvd1VwZGF0ZWQoJGV2ZW50KVwiXG4gICAgKG9uRWRpdGluZ1N0YXJ0KT1cIm9uRWRpdGluZ1N0YXJ0KCRldmVudClcIiAob25Sb3dSZW1vdmVkKT1cIm9uUm93UmVtb3ZlZCgkZXZlbnQpXCI+XG5cbiAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJuYW1lXCIgW2NhcHRpb25dPVwiJ21hbmFnZW1lbnQubmFtZScgfCB0cmFuc2xhdGVcIj5cbiAgICAgICAgPGR4aS12YWxpZGF0aW9uLXJ1bGUgdHlwZT1cImFzeW5jXCIgW21lc3NhZ2VdPVwiJ21hbmFnZW1lbnQuZ3JvdXBOYW1lQWxyZWFkeVVzZWQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFt2YWxpZGF0aW9uQ2FsbGJhY2tdPVwiZ3JvdXBOYW1lQWxyZWFkeVVzZWRWYWxpZGF0aW9uXCI+PC9keGktdmFsaWRhdGlvbi1ydWxlPlxuICAgIDwvZHhpLWNvbHVtbj5cbiAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJhc3NpZ25hYmxlQnlBbGxVc2Vyc1wiIFtjYXB0aW9uXT1cIidtYW5hZ2VtZW50LmFzc2lnbmFibGVCeUFsbFVzZXJzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIGRhdGFUeXBlPVwiYm9vbGVhblwiIFt2aXNpYmxlXT1cInNob3dBc3NpZ25hYmxlQnlBbGxVc2Vyc1wiPlxuICAgIDwvZHhpLWNvbHVtbj5cbiAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJ1c2Vyc1wiIFtjYXB0aW9uXT1cIidtYW5hZ2VtZW50LnVzZXJzJyB8IHRyYW5zbGF0ZVwiIGVkaXRDZWxsVGVtcGxhdGU9XCJ1c2Vyc0VkaXRUZW1wbGF0ZVwiXG4gICAgICAgIFtjYWxjdWxhdGVDZWxsVmFsdWVdPVwiY2FsY3VsYXRlVXNlcnNDZWxsVmFsdWVcIj5cbiAgICA8L2R4aS1jb2x1bW4+XG4gICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwicGVybWlzc2lvbnNcIiBbY2FwdGlvbl09XCInbWFuYWdlbWVudC5wZXJtaXNzaW9ucycgfCB0cmFuc2xhdGVcIiBbdmlzaWJsZV09XCJmYWxzZVwiXG4gICAgICAgIGVkaXRDZWxsVGVtcGxhdGU9XCJwZXJtaXNzaW9uc0VkaXRUZW1wbGF0ZVwiPlxuICAgIDwvZHhpLWNvbHVtbj5cbiAgICA8ZHhvLWV4cG9ydCBbZW5hYmxlZF09XCJmYWxzZVwiPjwvZHhvLWV4cG9ydD5cbiAgICA8ZHhvLWVkaXRpbmcgbW9kZT1cInBvcHVwXCIgW2FsbG93QWRkaW5nXT1cInRydWVcIiBbYWxsb3dVcGRhdGluZ109XCJ0cnVlXCIgW2FsbG93RGVsZXRpbmddPVwidHJ1ZVwiIFt1c2VJY29uc109XCJ0cnVlXCI+XG4gICAgICAgIDxkeG8tcG9wdXAgW3Nob3dUaXRsZV09XCJ0cnVlXCIgW3RpdGxlXT1cIidtYW5hZ2VtZW50Lmdyb3VwJyB8IHRyYW5zbGF0ZVwiIFtmdWxsU2NyZWVuXT1cIiFzaG93Q29sdW1uXCI+PC9keG8tcG9wdXA+XG4gICAgICAgIDxkeG8tZm9ybSBjb2xDb3VudD1cIjFcIiBbbGFiZWxMb2NhdGlvbl09XCJzaG93Q29sdW1uWFMgPyAnbGVmdCcgOiAndG9wJ1wiPlxuICAgICAgICAgICAgPGR4aS1pdGVtIGRhdGFGaWVsZD1cIm5hbWVcIiBbaXNSZXF1aXJlZF09XCJ0cnVlXCI+PC9keGktaXRlbT5cbiAgICAgICAgICAgIDxkeGktaXRlbSBkYXRhRmllbGQ9XCJ1c2Vyc1wiPjwvZHhpLWl0ZW0+XG4gICAgICAgICAgICA8ZHhpLWl0ZW0gZGF0YUZpZWxkPVwicGVybWlzc2lvbnNcIj48L2R4aS1pdGVtPlxuICAgICAgICAgICAgPGR4aS1pdGVtIGRhdGFGaWVsZD1cImFzc2lnbmFibGVCeUFsbFVzZXJzXCIgW3Zpc2libGVdPVwic2hvd0Fzc2lnbmFibGVCeUFsbFVzZXJzXCI+PC9keGktaXRlbT5cbiAgICAgICAgPC9keG8tZm9ybT5cbiAgICA8L2R4by1lZGl0aW5nPlxuXG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBmaWVsZCBvZiAndXNlcnNFZGl0VGVtcGxhdGUnXCI+XG4gICAgICAgIDxkeC10YWctYm94IHZhbHVlRXhwcj1cImlkXCIgW2Rpc3BsYXlFeHByXT1cImZ1bGxOYW1lXCIgW2RhdGFTb3VyY2VdPVwidXNlcnNcIiBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtzZWFyY2hFeHByXT1cImZ1bGxOYW1lXCIgKG9uSW5pdGlhbGl6ZWQpPVwiZ2V0R3JvdXBVc2VyKGZpZWxkLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJzZXRHcm91cFVzZXIoZmllbGQsICRldmVudClcIj5cbiAgICAgICAgPC9keC10YWctYm94PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZmllbGQgb2YgJ3Blcm1pc3Npb25zRWRpdFRlbXBsYXRlJ1wiPlxuICAgICAgICA8ZHgtbGlzdCBbZGF0YVNvdXJjZV09XCJwZXJtaXNzaW9uc1wiIGl0ZW1UZW1wbGF0ZT1cInJvd1RlbXBsYXRlXCIgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbc2VhcmNoRXhwcl09XCJbJ25hbWUnLCAndGFnJ11cIiBbaG92ZXJTdGF0ZUVuYWJsZWRdPVwiaG92ZXJTdGF0ZVBlcm1pc3Npb25cIj5cbiAgICAgICAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgcGVybWlzc2lvbiBvZiAncm93VGVtcGxhdGUnXCI+XG4gICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCBbdGV4dF09XCJwZXJtaXNzaW9uLm5hbWVcIiAob25Jbml0aWFsaXplZCk9XCJnZXRQZXJtaXNzaW9uU3RhdHVzKGZpZWxkLCBwZXJtaXNzaW9uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImNoZWNrQm94VG9nZ2xlZChmaWVsZCwgcGVybWlzc2lvbiwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZHgtbGlzdD5cbiAgICA8L2Rpdj5cbjwvY2F1Y2EtZHgtZGF0YS1ncmlkPiJdfQ==