@ieeesa-npm/groups 0.5.0 → 0.5.1
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.
|
@@ -212,10 +212,7 @@ export class GroupsComponent {
|
|
|
212
212
|
break;
|
|
213
213
|
}
|
|
214
214
|
case GroupFunctionType?.ADD_USER_TO_ROSTER: {
|
|
215
|
-
|
|
216
|
-
this.groupsService.canShowMessage = true;
|
|
217
|
-
this.viewRoster(this.groupsService.selectedGroupInfo);
|
|
218
|
-
}
|
|
215
|
+
this.groupsService.canShowMessage = true;
|
|
219
216
|
break;
|
|
220
217
|
}
|
|
221
218
|
default:
|
|
@@ -513,4 +510,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImpor
|
|
|
513
510
|
}], permissions: [{
|
|
514
511
|
type: Input
|
|
515
512
|
}] } });
|
|
516
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXBzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2dyb3Vwcy9zcmMvbGliL2dyb3Vwcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9ncm91cHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUVMLGlCQUFpQixHQUVsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFFeEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFMUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFDTCxlQUFlLEVBQ2YsY0FBYyxFQUVkLG1CQUFtQixFQUVuQixTQUFTLEVBQ1QsMEJBQTBCLEVBQzFCLGVBQWUsRUFDZixlQUFlLEdBRWhCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFL0UsT0FBTyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBRVQsYUFBYSxHQUVkLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUd2RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNoRyxPQUFP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QUFlLCtTQUNmLGlCQUFpQiwwUUFDakIsZUFBZSw0RkFDZixtQkFBbUI7OzJGQU9WLGVBQWU7a0JBbkIzQixTQUFTOytCQUVFLGVBQWUsY0FDYixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixlQUFlO3dCQUNmLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFDZixtQkFBbUI7cUJBQ3BCLGlCQUdjLGlCQUFpQixDQUFDLElBQUksYUFDMUIsQ0FBQyxhQUFhLENBQUM7d09BdUNqQixjQUFjO3NCQUF0QixLQUFLO2dCQU9HLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBPbkluaXQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgQ3JlYXRlR3JvdXBDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvY3JlYXRlLWdyb3VwL2NyZWF0ZS1ncm91cC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcm91cHNTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9ncm91cHMuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBHcm91cEluZm8gfSBmcm9tICcuL21vZGVscy9ncm91cC1pbmZvLm1vZGVsJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHtcclxuICBTZWFyY2hDb21wb25lbnQsXHJcbiAgTW9kYWxDb21wb25lbnQsXHJcbiAgU2VsZWN0T3B0aW9uLFxyXG4gIEljb25CdXR0b25Db21wb25lbnQsXHJcbiAgSWNvbkJ1dHRvbixcclxuICBBbGlnblR5cGUsXHJcbiAgTW9kYWxDb25maXJtYXRpb25Db21wb25lbnQsXHJcbiAgU2VsZWN0Q29tcG9uZW50LFxyXG4gIExlZ2VuZENvbXBvbmVudCxcclxuICBMZWdlbmQsXHJcbn0gZnJvbSAnQGllZWVzYS1ucG0vcHJlc2VudGF0aW9uJztcclxuaW1wb3J0IHsgVHJlZVZpZXdDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdHJlZS12aWV3L3RyZWUtdmlldy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcm91cFR5cGUsIEdyb3VwVHlwZUNvbmZpZ1ZhbHVlIH0gZnJvbSAnLi9tb2RlbHMvZ3JvdXAtdHlwZXMubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIE1vZGFsVHlwZSxcclxuICBBbGVydFR5cGUsXHJcbiAgQnJlYWtwb2ludE9ic2VydmVyU2VydmljZSxcclxuICBBbGVydHNTZXJ2aWNlLFxyXG4gIEdsb2JhbEVycm9ySGFuZGxlclNlcnZpY2UsXHJcbn0gZnJvbSAnQGllZWVzYS1ucG0vdXRpbGl0eSc7XHJcbmltcG9ydCAqIGFzIHNjcmVlblRleHRzIGZyb20gJy4vYXNzZXRzL2NvbnN0YW50cy5qc29uJztcclxuaW1wb3J0IHsgR3JvdXBGdW5jdGlvblR5cGUgfSBmcm9tICcuL21vZGVscy9ncm91cC1mdW5jdGlvbi10eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgR2V0R3JvdXBzUGF5bG9hZCB9IGZyb20gJy4vbW9kZWxzL3ZpZXctZ3JvdXAubW9kZWwnO1xyXG5pbXBvcnQgeyBEZWxldGVHcm91cFBheWxvYWQgfSBmcm9tICcuL21vZGVscy9kZWxldGUtZ3JvdXAubW9kZWwnO1xyXG5pbXBvcnQgeyBBZGRVc2VyUm9zdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2FkZC11c2VyLXJvc3Rlci9hZGQtdXNlci1yb3N0ZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVmlld1Jvc3RlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy92aWV3LXJvc3Rlci92aWV3LXJvc3Rlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFZGl0R3JvdXBBbmRQYXJlbnRJbmZvIH0gZnJvbSAnLi9tb2RlbHMvZWRpdC1ncm91cC5tb2RlbCc7XHJcblxyXG4vKipcclxuICogR3JvdXBzIGNvbXBvbmVudCBpcyBhIHdyYXBwZXIgb3IgY29udGFpbmVyIGNvbXBvbmVudCBmb3IgZ3JvdXBzIG1hbmFnZW1lbnQgcmV1c2FibGUgY29tcG9uZW50IGFuZCBpbiB0aGlzIGNvbXBvbmVudCBpbnRlZ3JhdGVzIGFsbCBncm91cCBtYW5hZ2VtZW50IGZ1bmN0aW9uYWxpdGllcyBhbmQgdGhpcyB3aWxsIGJlIGVudHJ5IGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgZ3JvdXBzIHdoZW4gaXQgaXMgY29uc3VtZWQgaW4gb3RoZXIgYXBwbGljYXRpb25zLlxyXG4gKiBAY2xhc3MgR3JvdXBzQ29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxyXG4gIHNlbGVjdG9yOiAnaWVlZXNhLWdyb3VwcycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBNYXREaWFsb2dNb2R1bGUsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBTZWFyY2hDb21wb25lbnQsXHJcbiAgICBTZWxlY3RDb21wb25lbnQsXHJcbiAgICBUcmVlVmlld0NvbXBvbmVudCxcclxuICAgIExlZ2VuZENvbXBvbmVudCxcclxuICAgIEljb25CdXR0b25Db21wb25lbnQsXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ3JvdXBzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ncm91cHMuY29tcG9uZW50LnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHByb3ZpZGVyczogW0FsZXJ0c1NlcnZpY2VdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR3JvdXBzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGRlc3Ryb3kkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGRpYWxvZ1JlZjogYW55O1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgY29uc3RhbnRzOiBhbnkgPSBzY3JlZW5UZXh0cztcclxuICB2aWV3R3JvdXBUZXh0cyA9IHRoaXMuY29uc3RhbnRzPy52aWV3R3JvdXBzO1xyXG4gIGNyZWF0ZUdyb3VwVGV4dCA9IHRoaXMuY29uc3RhbnRzPy5jcmVhdGVHcm91cDtcclxuICBlZGl0R3JvdXBUZXh0cyA9IHRoaXMuY29uc3RhbnRzPy5lZGl0R3JvdXA7XHJcbiAgYWRkVXNlclJvc3RlclRleHRzID0gdGhpcy5jb25zdGFudHM/LmFkZFVzZXJSb3N0ZXI7XHJcbiAgaXNHcm91cFNlYXJjaEFjdGl2ZSA9IGZhbHNlO1xyXG4gIGlzR3JvdXBGaWx0ZXJBY3RpdmUgPSBmYWxzZTtcclxuICBpc0dyb3VwU2VhcmNoT3JGaWx0ZXJBY3RpdmUgPSBmYWxzZTtcclxuICBpc01vYmlsZVZpZXcgPSBmYWxzZTtcclxuICBjaGlsZEdyb3Vwc0luZm8hOiBHcm91cEluZm9bXTtcclxuICBzZWxlY3RlZEdyb3VwVHlwZSE6IFNlbGVjdE9wdGlvbjtcclxuICBwYXJlbnRHcm91cHNJbmZvITogR3JvdXBJbmZvW107XHJcbiAgc2VsZWN0R3JvdXBPcHRpb25zITogU2VsZWN0T3B0aW9uW107XHJcbiAgZGVsZXRlZEdyb3VwSWQhOiBzdHJpbmc7XHJcbiAgZGVsZXRlR3JvdXBOYW1lITogc3RyaW5nO1xyXG4gIGdyb3VwVHlwZXMhOiBHcm91cFR5cGVDb25maWdWYWx1ZTtcclxuICBzZWFyY2hQbGFjZUhvbGRlclRleHQ6IHN0cmluZyA9IHRoaXMudmlld0dyb3VwVGV4dHM/LnBsYWNlaG9sZGVyVGV4dD8uc2VhcmNoO1xyXG4gIGZpbHRlclBsYWNlSG9sZGVyVGV4dDogc3RyaW5nID0gdGhpcy52aWV3R3JvdXBUZXh0cz8ucGxhY2Vob2xkZXJUZXh0Py5maWx0ZXI7XHJcbiAgY3JlYXRlR3JvdXBJY29uOiBJY29uQnV0dG9uID0ge1xyXG4gICAgaWQ6IDEsXHJcbiAgICBhcmlhTGFiZWw6IHRoaXMudmlld0dyb3VwVGV4dHM/LmFyaWFMYWJlbC5hZGQsXHJcbiAgICBpY29uVVJMOiB0aGlzLnZpZXdHcm91cFRleHRzPy5jcmVhdGVHcm91cEljb24sXHJcbiAgICB0b29sVGlwOiB0aGlzLnZpZXdHcm91cFRleHRzPy5hcmlhTGFiZWwuYWRkLFxyXG4gIH07XHJcbiAgZmlsdGVyR3JvdXBJY29uOiBJY29uQnV0dG9uID0ge1xyXG4gICAgaWQ6IDIsXHJcbiAgICBhcmlhTGFiZWw6IHRoaXMudmlld0dyb3VwVGV4dHM/LmFyaWFMYWJlbC5maWx0ZXIsXHJcbiAgICBpY29uVVJMOiB0aGlzLnZpZXdHcm91cFRleHRzPy5maWx0ZXJHcm91cEljb24sXHJcbiAgICB0b29sVGlwOiB0aGlzLnZpZXdHcm91cFRleHRzPy5hcmlhTGFiZWwuZmlsdGVyLFxyXG4gIH07XHJcbiAgZ3JvdXBzTGVnZW5kczogTGVnZW5kW10gPSBbXTtcclxuICBnZXRHcm91cHNQYXlsb2FkOiBHZXRHcm91cHNQYXlsb2FkID0geyBncm91cElkOiAnJywgZ3JvdXBUeXBlSWQ6ICcnIH07XHJcbiAgQElucHV0KCkgZ3JvdXBzUGFnZUluZm86IHtcclxuICAgIGdyb3Vwc1RpdGxlOiBzdHJpbmc7XHJcbiAgICBncm91cHNEZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gIH0gPSB7XHJcbiAgICBncm91cHNUaXRsZTogdGhpcy52aWV3R3JvdXBUZXh0cz8uZ3JvdXBzVGl0bGUsXHJcbiAgICBncm91cHNEZXNjcmlwdGlvbjogdGhpcy52aWV3R3JvdXBUZXh0cz8uZ3JvdXBzRGVzY3JpcHRpb24sXHJcbiAgfTtcclxuICBASW5wdXQoKSBhcHBsaWNhdGlvbklkITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGFwaUJhc2VVUkwhOiBzdHJpbmc7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBASW5wdXQoKSBwZXJtaXNzaW9ucyE6IGFueTtcclxuICBmdW5jdGlvblR5cGUhOiBHcm91cEZ1bmN0aW9uVHlwZTtcclxuICBhbGlnbm1lbnRUeXBlID0gQWxpZ25UeXBlO1xyXG4gIGlzU29ydGluZyA9IHRydWU7XHJcbiAgY2FuUmVvcGVuVmlld1Jvc3Rlck1vZGFsID0gZmFsc2U7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSBncm91cHNTZXJ2aWNlOiBHcm91cHNTZXJ2aWNlLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwdWJsaWMgYWxlcnRTZXJ2aWNlOiBBbGVydHNTZXJ2aWNlLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIGJyZWFrcG9pbnRPYnNlcnZlclNlcnZpY2U6IEJyZWFrcG9pbnRPYnNlcnZlclNlcnZpY2UsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHB1YmxpYyBnbG9iYWxFcnJvckhhbmRsZXJTZXJ2aWNlOiBHbG9iYWxFcnJvckhhbmRsZXJTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLmJyZWFrcG9pbnRPYnNlcnZlclNlcnZpY2VcclxuICAgICAgLmdldEJyZWFrcG9pbnQoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNNb2JpbGVWaWV3ID0gcmVzdWx0Py5tYXRjaGVzO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemUgdGhlIGdyb3VwcyBjb21wb25lbnQuXHJcbiAgICogQHJldHVybiAtcmV0dXJucyBub3RoaW5nXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncm91cHNTZXJ2aWNlPy5zZXRBcHBDb25maWcodGhpcy5hcGlCYXNlVVJMLCB0aGlzLnBlcm1pc3Npb25zKTtcclxuICAgIHRoaXMuZ2V0R3JvdXBUeXBlcygpO1xyXG4gICAgdGhpcy5ncm91cHNTZXJ2aWNlPy5vcGVuTW9kYWxOb3RpZmllclxyXG4gICAgICA/LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICA/LnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICBpZiAocmVzcG9uc2UgPT09IEdyb3VwRnVuY3Rpb25UeXBlLkFERF9VU0VSX1RPX1JPU1RFUikge1xyXG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWY/LmNsb3NlKCk7XHJcbiAgICAgICAgICB0aGlzLm9wZW5BZGRVc2VyUm9zdGVyTW9kYWwoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgZGlhbG9nIG9wdGlvbnMgZm9yIGNyZWF0ZSBncm91cCBtb2RhbCBhbmQgY2FsbHMgb3Blbk1vZGFsIG1ldGhvZC5cclxuICAgKiBAcGFyYW0ge0dyb3VwSW5mb30gW3BhcmVudEdyb3VwSW5mb10gLUFuIG9wdGlvbmFsIHBhcmFtZXRlci4gUGFyZW50IGdyb3VwIGluZm8gdG8gYmUgcGFzc2VkIGZvciBjcmVhdGUgY2hpbGQgZ3JvdXAuXHJcbiAgICogQHJldHVybiAtcmV0dXJucyBub3RoaW5nXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9wZW5DcmVhdGVHcm91cEZvcm0ocGFyZW50R3JvdXBJbmZvPzogR3JvdXBJbmZvKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyb3Vwc1NlcnZpY2U/LnNldFNlbGVjdGVkR3JvdXBJbmZvKHBhcmVudEdyb3VwSW5mbyA/PyB1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5ncm91cHNTZXJ2aWNlPy5zZXRHcm91cEZ1bmN0aW9uVHlwZShHcm91cEZ1bmN0aW9uVHlwZT8uQ1JFQVRFKTtcclxuICAgIGNvbnN0IGRpYWxvZ09wdGlvbnMgPSB7XHJcbiAgICAgIGhlYWRpbmc6IHRoaXMuY3JlYXRlR3JvdXBUZXh0Py5oZWFkaW5nLFxyXG4gICAgICBpc0Nsb3NlTmVlZGVkOiB0cnVlLFxyXG4gICAgICBjb21wb25lbnRSZWZlcmVuY2U6IENyZWF0ZUdyb3VwQ29tcG9uZW50LFxyXG4gICAgICBtb2RhbFR5cGU6IE1vZGFsVHlwZS5GT1JNLFxyXG4gICAgfTtcclxuICAgIHRoaXMuZnVuY3Rpb25UeXBlID0gR3JvdXBGdW5jdGlvblR5cGU/LkNSRUFURTtcclxuICAgIHRoaXMub3Blbk1vZGFsKGRpYWxvZ09wdGlvbnMsICdpZWVlc2EtY3JlYXRlLWdyb3VwJywgcGFyZW50R3JvdXBJbmZvKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGRpYWxvZyBvcHRpb25zIGZvciBlZGl0IGdyb3VwIG1vZGFsIGFuZCBjYWxscyBvcGVuTW9kYWwgbWV0aG9kLlxyXG4gICAqIEBwYXJhbSB7RWRpdEdyb3VwQW5kUGFyZW50SW5mb30gZWRpdEdyb3VwSW5mbyAtZWRpdGluZyBncm91cCBhbmQgaXRzIHBhcmVudCBncm91cCBpbmZvIHRvIGJlIHBhc3NlZCBmb3IgcG9wdWxhdGluZyBlZGl0IGdyb3VwIGZvcm0gZmllbGRzLlxyXG4gICAqIEByZXR1cm4gLXJldHVybnMgbm90aGluZ1xyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNDb21wb25lbnRcclxuICAgKi9cclxuICBvcGVuRWRpdEdyb3VwRm9ybShlZGl0R3JvdXBJbmZvOiBFZGl0R3JvdXBBbmRQYXJlbnRJbmZvKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyb3Vwc1NlcnZpY2U/LnNldFNlbGVjdGVkR3JvdXBJbmZvKFxyXG4gICAgICBlZGl0R3JvdXBJbmZvPy5ncm91cEluZm8sXHJcbiAgICAgIGVkaXRHcm91cEluZm8/LnBhcmVudEdyb3VwSW5mb1xyXG4gICAgKTtcclxuICAgIHRoaXMuZ3JvdXBzU2VydmljZT8uc2V0R3JvdXBGdW5jdGlvblR5cGUoR3JvdXBGdW5jdGlvblR5cGU/LkVESVQpO1xyXG4gICAgY29uc3QgZGlhbG9nT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGluZzogZWRpdEdyb3VwSW5mbz8uZ3JvdXBJbmZvPy5ncm91cE5hbWUsXHJcbiAgICAgIGlzQ2xvc2VOZWVkZWQ6IHRydWUsXHJcbiAgICAgIGNvbXBvbmVudFJlZmVyZW5jZTogQ3JlYXRlR3JvdXBDb21wb25lbnQsXHJcbiAgICAgIG1vZGFsVHlwZTogTW9kYWxUeXBlLkZPUk0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5mdW5jdGlvblR5cGUgPSBHcm91cEZ1bmN0aW9uVHlwZT8uRURJVDtcclxuICAgIHRoaXMub3Blbk1vZGFsKGRpYWxvZ09wdGlvbnMsICdpZWVlc2EtY3JlYXRlLWdyb3VwJywgZWRpdEdyb3VwSW5mbyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBkaWFsb2cgb3B0aW9ucyBmb3IgYWRkIHVzZXJzIG1vZGFsIGFuZCBjYWxscyBvcGVuTW9kYWwgbWV0aG9kLlxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNDb21wb25lbnRcclxuICAgKi9cclxuICBvcGVuQWRkVXNlclJvc3Rlck1vZGFsKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZGlhbG9nT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGluZzogdGhpcy5hZGRVc2VyUm9zdGVyVGV4dHM/LmhlYWRpbmcsXHJcbiAgICAgIGlzQ2xvc2VOZWVkZWQ6IHRydWUsXHJcbiAgICAgIGNvbXBvbmVudFJlZmVyZW5jZTogQWRkVXNlclJvc3RlckNvbXBvbmVudCxcclxuICAgICAgbW9kYWxUeXBlOiBNb2RhbFR5cGUuRk9STSxcclxuICAgIH07XHJcbiAgICB0aGlzLmZ1bmN0aW9uVHlwZSA9IEdyb3VwRnVuY3Rpb25UeXBlLkFERF9VU0VSX1RPX1JPU1RFUjtcclxuICAgIHRoaXMuZ3JvdXBzU2VydmljZT8uc2V0R3JvdXBGdW5jdGlvblR5cGUodGhpcy5mdW5jdGlvblR5cGUpO1xyXG4gICAgdGhpcy5vcGVuTW9kYWwoZGlhbG9nT3B0aW9ucywgJ2llZWVzYS1hZGQtdXNlci1yb3N0ZXInKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGRpYWxvZyBvcHRpb25zIGZvciB1c2VycyBtb2RhbCBhbmQgY2FsbHMgb3Blbk1vZGFsIG1ldGhvZC5cclxuICAgKiBAcGFyYW0ge0dyb3VwSW5mb30gZ3JvdXBcclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgdmlld1Jvc3Rlcihncm91cDogR3JvdXBJbmZvKTogdm9pZCB7XHJcbiAgICBjb25zdCBkaWFsb2dPcHRpb25zID0ge1xyXG4gICAgICBoZWFkaW5nOiBncm91cD8uZ3JvdXBOYW1lLFxyXG4gICAgICBpc0Nsb3NlTmVlZGVkOiB0cnVlLFxyXG4gICAgICBjb21wb25lbnRSZWZlcmVuY2U6IFZpZXdSb3N0ZXJDb21wb25lbnQsXHJcbiAgICAgIG1vZGFsVHlwZTogTW9kYWxUeXBlLkZPUk1fQU5EX0NPTlRFTlQsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5ncm91cHNTZXJ2aWNlLnNldFNlbGVjdGVkR3JvdXBJbmZvKGdyb3VwKTtcclxuICAgIHRoaXMuZnVuY3Rpb25UeXBlID0gR3JvdXBGdW5jdGlvblR5cGUuVklFV19ST1NURVI7XHJcbiAgICB0aGlzLmdyb3Vwc1NlcnZpY2U/LnNldEdyb3VwRnVuY3Rpb25UeXBlKEdyb3VwRnVuY3Rpb25UeXBlPy5FRElUKTtcclxuICAgIHRoaXMub3Blbk1vZGFsKGRpYWxvZ09wdGlvbnMsICdpZWVlc2Etdmlldy1yb3N0ZXInKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wZW5zIG1vZGFsIGNvbXBvbmVudCB3aXRoIGZvciByZWNlaXZlZCBwYXJhbXMgYW5kIGhhbmRsZXMgZm9ybSBzdWJtaXNzaW9uIHN1Y2Nlc3MgYW5kIGVycm9ycy5cclxuICAgKiBAcGFyYW0geyp9IGRpYWxvZ09wdGlvbnNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2NsYXNzTmFtZV1cclxuICAgKiBAcmV0dXJuIC1yZXR1cm5zIG5vdGhpbmdcclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbmZlcnJhYmxlLXR5cGVzLCBuby11bnVzZWQtdmFyc1xyXG4gIG9wZW5Nb2RhbChcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBkaWFsb2dPcHRpb25zOiBhbnksXHJcbiAgICBjbGFzc05hbWU/OiBzdHJpbmcsXHJcbiAgICBncm91cEluZm8/OiBHcm91cEluZm8gfCBFZGl0R3JvdXBBbmRQYXJlbnRJbmZvXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUgPz8gJyc7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nPy5vcGVuKE1vZGFsQ29tcG9uZW50LCB7XHJcbiAgICAgIGRhdGE6IGRpYWxvZ09wdGlvbnMsXHJcbiAgICAgIHdpZHRoOlxyXG4gICAgICAgIHRoaXMuZnVuY3Rpb25UeXBlID09PSBHcm91cEZ1bmN0aW9uVHlwZS5WSUVXX1JPU1RFUiB8fFxyXG4gICAgICAgIHRoaXMuZnVuY3Rpb25UeXBlID09PSBHcm91cEZ1bmN0aW9uVHlwZS5BRERfVVNFUl9UT19ST1NURVJcclxuICAgICAgICAgID8gJydcclxuICAgICAgICAgIDogJ2F1dG8nLFxyXG4gICAgICBwYW5lbENsYXNzOiBbJ2llZWVzYS1tb2RhbC1kaWFsb2cnLCBjbGFzc05hbWVdLFxyXG4gICAgICBhcmlhTW9kYWw6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZGlhbG9nUmVmPy5jb21wb25lbnRJbnN0YW5jZT8uc3VibWl0Rm9ybVJlc3BvbnNlXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgbm8tdW51c2VkLXZhcnNcclxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmRpYWxvZ1JlZj8uY2xvc2UoKTtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuZnVuY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICBjYXNlIEdyb3VwRnVuY3Rpb25UeXBlPy5DUkVBVEU6IHtcclxuICAgICAgICAgICAgdGhpcy5zaG93QWxlcnRNZXNzYWdlKFxyXG4gICAgICAgICAgICAgIEFsZXJ0VHlwZT8uU1VDQ0VTUyxcclxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUdyb3VwVGV4dD8ubWVzc2FnZT8uc3VjY2Vzcz8uc3VibWlzc2lvblxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBjcmVhdGVHcm91cEluZm8gPSBncm91cEluZm8gYXMgR3JvdXBJbmZvO1xyXG4gICAgICAgICAgICBpZiAoY3JlYXRlR3JvdXBJbmZvKSB0aGlzLmdldEdyb3VwcyhjcmVhdGVHcm91cEluZm8pO1xyXG4gICAgICAgICAgICBlbHNlIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2FzZSBHcm91cEZ1bmN0aW9uVHlwZT8uRURJVDoge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dBbGVydE1lc3NhZ2UoXHJcbiAgICAgICAgICAgICAgQWxlcnRUeXBlPy5TVUNDRVNTLFxyXG4gICAgICAgICAgICAgIHRoaXMuZWRpdEdyb3VwVGV4dHM/Lm1lc3NhZ2U/LnN1Y2Nlc3M/LnN1Ym1pc3Npb25cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29uc3QgZWRpdEdyb3VwSW5mbyA9IGdyb3VwSW5mbyBhcyBFZGl0R3JvdXBBbmRQYXJlbnRJbmZvO1xyXG4gICAgICAgICAgICBpZiAoZWRpdEdyb3VwSW5mbz8ucGFyZW50R3JvdXBJbmZvPy5ncm91cElkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdldEdyb3VwcygpO1xyXG4gICAgICAgICAgICB9IGVsc2UgdGhpcy5nZXRHcm91cHMoZWRpdEdyb3VwSW5mby5wYXJlbnRHcm91cEluZm8pO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhc2UgR3JvdXBGdW5jdGlvblR5cGU/LkFERF9VU0VSX1RPX1JPU1RFUjoge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mdW5jdGlvblR5cGUgPT09IEdyb3VwRnVuY3Rpb25UeXBlLkFERF9VU0VSX1RPX1JPU1RFUikge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JvdXBzU2VydmljZS5jYW5TaG93TWVzc2FnZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy52aWV3Um9zdGVyKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cHNTZXJ2aWNlLnNlbGVjdGVkR3JvdXBJbmZvIGFzIEdyb3VwSW5mb1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5kaWFsb2dSZWY/LmNvbXBvbmVudEluc3RhbmNlPy5mb3JtQ2FuY2VsXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kaWFsb2dSZWY/LmNsb3NlKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZnVuY3Rpb25UeXBlID09PSBHcm91cEZ1bmN0aW9uVHlwZS5BRERfVVNFUl9UT19ST1NURVIpIHtcclxuICAgICAgICAgIHRoaXMuY2FuUmVvcGVuVmlld1Jvc3Rlck1vZGFsID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnZpZXdSb3N0ZXIodGhpcy5ncm91cHNTZXJ2aWNlLnNlbGVjdGVkR3JvdXBJbmZvIGFzIEdyb3VwSW5mbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIHRoaXMuZGlhbG9nUmVmXHJcbiAgICAgID8uYWZ0ZXJPcGVuZWQoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZ1bmN0aW9uVHlwZSA9PT0gR3JvdXBGdW5jdGlvblR5cGUuQUREX1VTRVJfVE9fUk9TVEVSKSB7XHJcbiAgICAgICAgICB0aGlzLmNhblJlb3BlblZpZXdSb3N0ZXJNb2RhbCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIHRoaXMuZGlhbG9nUmVmXHJcbiAgICAgID8uYWZ0ZXJDbG9zZWQoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmNhblJlb3BlblZpZXdSb3N0ZXJNb2RhbCkge1xyXG4gICAgICAgICAgdGhpcy5jYW5SZW9wZW5WaWV3Um9zdGVyTW9kYWwgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudmlld1Jvc3Rlcih0aGlzLmdyb3Vwc1NlcnZpY2Uuc2VsZWN0ZWRHcm91cEluZm8gYXMgR3JvdXBJbmZvKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBPcGVucyB0aGUgY29uZmlybWF0aW9uIG1vZGFsIHRvIGdldCB1c2VyIGNvbmZpcm1hdGlvbiB0byBkZWxldGUgdGhlIHNlbGVjdGVkIGdyb3VwLlxyXG4gICAqIEBtZW1iZXJvZiBHcm91cENvbXBvbmVudFxyXG4gICAqL1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgb3BlbkRlbGV0ZUNvbmZpcm1hdGlvbk1vZGFsKGdyb3VwSW5mbzogR3JvdXBJbmZvKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb25maXJtYXRpb25JbmZvID0gc2NyZWVuVGV4dHM/LmRlbGV0ZUdyb3VwPy5jb25maXJtYXRpb25JbmZvO1xyXG4gICAgY29uc3QgZGVsZXRlR3JvdXBNb2RhbE9wdGlvbnMgPSB7XHJcbiAgICAgIGxlZnRCdXR0b25MYWJlbDogY29uZmlybWF0aW9uSW5mbz8ubGVmdEJ1dHRvbkxhYmVsLFxyXG4gICAgICByaWdodEJ1dHRvbkxhYmVsOiBjb25maXJtYXRpb25JbmZvPy5yaWdodEJ1dHRvbkxhYmVsLFxyXG4gICAgICBwcm9tcHRNZXNzYWdlOlxyXG4gICAgICAgIGNvbmZpcm1hdGlvbkluZm8/LnByb21wdE1lc3NhZ2UgKyBncm91cEluZm8/Lmdyb3VwTmFtZSArICc/JyxcclxuICAgICAgYWN0aW9uQnV0dG9uQWxpZ246IHRoaXMuYWxpZ25tZW50VHlwZT8uTUlERExFLFxyXG4gICAgfTtcclxuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2c/Lm9wZW4oTW9kYWxDb25maXJtYXRpb25Db21wb25lbnQsIHtcclxuICAgICAgZGF0YTogZGVsZXRlR3JvdXBNb2RhbE9wdGlvbnMsXHJcbiAgICAgIHdpZHRoOiAnYXV0bycsXHJcbiAgICAgIGF1dG9Gb2N1czogJ2RpYWxvZycsXHJcbiAgICAgIGFyaWFMYWJlbDogdGhpcy5jb25zdGFudHM/LmFyaWFMYWJlbD8uYWxlcnQsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZGlhbG9nUmVmXHJcbiAgICAgIC5hZnRlckNsb3NlZCgpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgdGhpcy5kZWxldGVHcm91cChncm91cEluZm8pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIG1ldGhvZCBzZW5kcyBBUEkgUmVxdWVzdCB0byBkZWxldGUgdGhlIHNlbGVjdGVkIGdyb3VwIGFuZCBoYW5kbGVzIHRoZSBzdWNjZXNzIGFuZCBlcnJvciByZXNwb25zZSBvZiB0aGUgaHR0cCByZXF1ZXN0LlxyXG4gICAqIEBtZW1iZXJvZiBHcm91cENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGRlbGV0ZUdyb3VwKGdyb3VwSW5mbzogR3JvdXBJbmZvKTogdm9pZCB7XHJcbiAgICBjb25zdCBkZWxldGVHcm91cFRleHQgPSBzY3JlZW5UZXh0cz8uZGVsZXRlR3JvdXA7XHJcbiAgICB0aGlzLmRlbGV0ZUdyb3VwTmFtZSA9IGdyb3VwSW5mbz8uZ3JvdXBOYW1lO1xyXG4gICAgY29uc3QgZGVsZXRlR3JvdXBQYXlsb2FkOiBEZWxldGVHcm91cFBheWxvYWQgPSB7XHJcbiAgICAgIHBheWxvYWQ6IHtcclxuICAgICAgICBncm91cElkOiBncm91cEluZm8/Lmdyb3VwSWQsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5ncm91cHNTZXJ2aWNlXHJcbiAgICAgIC5kZWxldGVHcm91cChkZWxldGVHcm91cFBheWxvYWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmPy5jbG9zZSgpO1xyXG4gICAgICAgICAgaWYgKHJlcz8uc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlZEdyb3VwSWQgPSBncm91cEluZm8/Lmdyb3VwSWQ7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0FsZXJ0TWVzc2FnZShcclxuICAgICAgICAgICAgICBBbGVydFR5cGU/LlNVQ0NFU1MsXHJcbiAgICAgICAgICAgICAgZ3JvdXBJbmZvPy5ncm91cE5hbWUgKyBkZWxldGVHcm91cFRleHQ/Lm1lc3NhZ2U/LnN1Y2Nlc3M/LmRlbGV0aW9uXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcnMoZXJyb3IpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvd3MgdGhlIHNlYXJjaCBmaWVsZCBvbiBjbGljayBvZiBzZWFyY2ggaWNvbiBpbiBjYXNlIG9mIG1vYmlsZSB2aWV3XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uR3JvdXBTZWFyY2goKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzR3JvdXBTZWFyY2hBY3RpdmUgPSB0cnVlO1xyXG4gICAgdGhpcy5pc0dyb3VwRmlsdGVyQWN0aXZlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93cyB0aGUgRmlsdGVyIGJ5IGRyb3Bkb3duIG9wdGlvbnMgb24gY2xpY2sgb2YgZmlsdGVyIGljb24gaW4gY2FzZSBvZiBtb2JpbGUgdmlld1xyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNDb21wb25lbnRcclxuICAgKi9cclxuICBzaG93R3JvdXBGaWx0ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzR3JvdXBGaWx0ZXJBY3RpdmUgPSB0cnVlO1xyXG4gICAgdGhpcy5pc0dyb3VwU2VhcmNoQWN0aXZlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIGlzR3JvdXBTZWFyY2hPckZpbHRlckFjdGl2ZSB0byB0cnVlIGFuZCBsb2FkcyB0aGUgZ3JvdXBzIHRob3NlIGFyZSBjb25maWd1cmVkIHdpdGggc2VsZWN0ZWQgZ3JvdXAgdHlwZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VhcmNoVGVybVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNDb21wb25lbnRcclxuICAgKi9cclxuICBvbkdyb3VwU2VhcmNoQ2xpY2soc2VhcmNoVGVybTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzR3JvdXBTZWFyY2hPckZpbHRlckFjdGl2ZSA9ICEhc2VhcmNoVGVybTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgc2VsZWN0IGdyb3VwIHR5cGUgb3B0aW9ucyBmcm9tIGdyb3VwVHlwZXMgcmVzcG9uc2VcclxuICAgKiBAcmV0dXJuIHsqfSAge1NlbGVjdE9wdGlvbltdfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNDb21wb25lbnRcclxuICAgKi9cclxuICBnZXRHcm91cFR5cGVPcHRpb25zKCk6IFNlbGVjdE9wdGlvbltdIHtcclxuICAgIHRoaXMubGVnZW5kQ29sb3IoKTtcclxuICAgIGNvbnN0IGdyb3VwVHlwZU9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW107XHJcbiAgICBncm91cFR5cGVPcHRpb25zLnB1c2goe1xyXG4gICAgICBpZDogJycsXHJcbiAgICAgIG5hbWU6IHRoaXMudmlld0dyb3VwVGV4dHM/LmFsbEdyb3VwVHlwZXNPcHRpb24sXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZ3JvdXBUeXBlcyk/LmZvckVhY2goKG5vZGUpID0+IHtcclxuICAgICAgZ3JvdXBUeXBlT3B0aW9ucy5wdXNoKHsgaWQ6IG5vZGVbMF0sIG5hbWU6IG5vZGVbMV0/Lm5hbWUgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBncm91cFR5cGVPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyBsZWdlbmQgY29sb3IgZnJvbSBncm91cFR5cGVzIHJlc3BvbnNlXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIGxlZ2VuZENvbG9yKCk6IHZvaWQge1xyXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5ncm91cFR5cGVzKT8uZm9yRWFjaCgobm9kZSkgPT4ge1xyXG4gICAgICB0aGlzLmdyb3Vwc0xlZ2VuZHM/LnB1c2goe1xyXG4gICAgICAgIGNvbG9yOiBub2RlWzFdPy5sZWdlbmRDb2xvcixcclxuICAgICAgICBsYWJlbDogbm9kZVsxXT8ubmFtZSxcclxuICAgICAgICBoaWVyYXJjaHk6IG5vZGVbMV0/LmhpZXJhcmNoeSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGlzR3JvdXBTZWFyY2hPckZpbHRlckFjdGl2ZSBmbGFnIGFuZCBsb2FkcyBwYXJlbnQgZ3JvdXAgaW5mbyBhcyBwZXIgc2VsZWN0ZWQgZmlsdGVyIG9wdGlvbi5cclxuICAgKiBAcGFyYW0ge1NlbGVjdE9wdGlvbn0gZXZlbnRcclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb25Hcm91cFR5cGVGaWx0ZXJlZChldmVudDogU2VsZWN0T3B0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkR3JvdXBUeXBlID0gZXZlbnQ7XHJcbiAgICB0aGlzLmlzR3JvdXBTZWFyY2hPckZpbHRlckFjdGl2ZSA9ICEhdGhpcy5zZWxlY3RlZEdyb3VwVHlwZT8uaWQ7XHJcbiAgICB0aGlzLmdldEdyb3Vwc1BheWxvYWQgPSB7XHJcbiAgICAgIGdyb3VwSWQ6ICcnLFxyXG4gICAgICBncm91cFR5cGVJZDogdGhpcy5zZWxlY3RlZEdyb3VwVHlwZT8uaWQgYXMgc3RyaW5nLFxyXG4gICAgfTtcclxuICAgIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgICB0aGlzLmdyb3Vwc1NlcnZpY2U/LnNldEdyb3VwRnVuY3Rpb25UeXBlKEdyb3VwRnVuY3Rpb25UeXBlPy5GSUxURVIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZHMgYWxsIHRoZSBwYXJlbnQgZ3JvdXBzIGluZm9ybWF0aW9uLlxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNDb21wb25lbnRcclxuICAgKi9cclxuICBnZXRHcm91cHMoZ3JvdXA/OiBHcm91cEluZm8pOiB2b2lkIHtcclxuICAgIGlmIChncm91cCkge1xyXG4gICAgICB0aGlzLmdldEdyb3Vwc1BheWxvYWQgPSB7XHJcbiAgICAgICAgZ3JvdXBJZDogZ3JvdXA/Lmdyb3VwSWQgPz8gJycsXHJcbiAgICAgICAgZ3JvdXBUeXBlSWQ6ICcnLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmdldEdyb3Vwc1BheWxvYWQuZ3JvdXBUeXBlSWQgPT09ICcnKSB7XHJcbiAgICAgIHRoaXMuZ2V0R3JvdXBzUGF5bG9hZCA9IHtcclxuICAgICAgICBncm91cElkOiAnJyxcclxuICAgICAgICBncm91cFR5cGVJZDogJycsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICB0aGlzLmdyb3Vwc1NlcnZpY2VcclxuICAgICAgLmdldEdyb3Vwcyh0aGlzLmdldEdyb3Vwc1BheWxvYWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2U/LnN0YXR1cykge1xyXG4gICAgICAgICAgICBpZiAoZ3JvdXApIHtcclxuICAgICAgICAgICAgICB0aGlzLmNoaWxkR3JvdXBzSW5mbyA9IHRoaXMudmlld0dyb3VwUmVzcG9uc2UocmVzcG9uc2U/LmJvZHkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMucGFyZW50R3JvdXBzSW5mbyA9IHRoaXMudmlld0dyb3VwUmVzcG9uc2UocmVzcG9uc2U/LmJvZHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9ycyhlcnJvcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIGdyb3VwVHlwZSBpbmZvIHdpdGggZ3JvdXAgcmVzcG9uc2UgZnJvbSBncm91cFR5cGUgcmVzcG9uc2VcclxuICAgKiBAcGFyYW0ge0dyb3VwSW5mb1tdfSByZXNwb25zZVxyXG4gICAqIEByZXR1cm4geyp9ICB7R3JvdXBJbmZvW119XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIHZpZXdHcm91cFJlc3BvbnNlKHJlc3BvbnNlOiBHcm91cEluZm9bXSk6IEdyb3VwSW5mb1tdIHtcclxuICAgIHJlc3BvbnNlPy5mb3JFYWNoKChub2RlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGdyb3VwVHlwZUluZm86IEdyb3VwVHlwZSA9IHRoaXMuZ3JvdXBUeXBlc1tub2RlLmdyb3VwVHlwZV07XHJcbiAgICAgIG5vZGUuZ3JvdXBUeXBlSW5mbyA9IGdyb3VwVHlwZUluZm87XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWRzIHRoZSBncm91cCB0eXBlcy5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0R3JvdXBUeXBlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JvdXBzU2VydmljZVxyXG4gICAgICAuZ2V0R3JvdXBUeXBlcygpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcz8uc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBUeXBlcyA9IHRoaXMuZ3JvdXBzU2VydmljZT8uZ2V0Rm9ybWF0dGVkR3JvdXBUeXBlcyhcclxuICAgICAgICAgICAgICByZXM/LmJvZHlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RHcm91cE9wdGlvbnMgPSB0aGlzLmdldEdyb3VwVHlwZU9wdGlvbnMoKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdyb3VwVHlwZSA9IHRoaXMuc2VsZWN0R3JvdXBPcHRpb25zWzBdO1xyXG4gICAgICAgICAgICB0aGlzLm9uR3JvdXBUeXBlRmlsdGVyZWQodGhpcy5zZWxlY3RlZEdyb3VwVHlwZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9ycyhlcnJvcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGFsZXJ0cyBmb3Igc3VjY2VzcywgZXJyb3IgYW5kIHdhcm5pbmcuXHJcbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgc3RyaW5nW10pfSBtZXNzYWdlIC1zdWNjZXNzIG9yIGVycm9yIG9yIHdhcm5pbmcgbWVzc2FnZS5cclxuICAgKiBAcGFyYW0ge0FsZXJ0VHlwZX0gYWxlcnRUeXBlXHJcbiAgICogQHJldHVybiAtcmV0dXJucyBub3RoaW5nXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIHNob3dBbGVydE1lc3NhZ2UoYWxlcnRUeXBlOiBBbGVydFR5cGUsIG1lc3NhZ2U6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICB0aGlzLmFsZXJ0U2VydmljZT8uc2hvd01lc3NhZ2Uoe1xyXG4gICAgICBzdGF0dXM6ICdjdXN0b20nLFxyXG4gICAgICBtZXNzYWdlOiBtZXNzYWdlLFxyXG4gICAgICBhbGVydFR5cGU6IGFsZXJ0VHlwZSxcclxuICAgICAgaXNDbG9zZU5lZWRlZDogdHJ1ZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FwdHVyZXMgdGhlIHNlcnZlciBzaWRlIGVycm9ycyBhbmQgaGFuZGxlcyBpdCBiYXNlZCBvbiB0aGUgY3VzdG9tIG9yIEh0dHAgZXJyb3JzLlxyXG4gICAqIEBwYXJhbSB7SHR0cEVycm9yUmVzcG9uc2V9IGVycm9yXHJcbiAgICogQHJldHVybiAtcmV0dXJucyBub3RoaW5nXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIGhhbmRsZUVycm9ycyhlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVycm9yQ29kZXM6IHN0cmluZ1tdID0gZXJyb3I/LmVycm9yPy5ib2R5Py5lcnJvckNvZGVzO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZXJyb3JDb2RlcykpIHtcclxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlOiBzdHJpbmdbXSA9XHJcbiAgICAgICAgdGhpcy5ncm91cHNTZXJ2aWNlPy5wYXJzZUVycm9yTWVzc2FnZShlcnJvckNvZGVzKTtcclxuICAgICAgaWYgKGVycm9yQ29kZXM/LmluY2x1ZGVzKCcxMDA4JykpIHtcclxuICAgICAgICBlcnJvck1lc3NhZ2VbMF0gPSB0aGlzLmRlbGV0ZUdyb3VwTmFtZSArIGVycm9yTWVzc2FnZT8uWzBdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2hvd0FsZXJ0TWVzc2FnZShBbGVydFR5cGUuRVJST1IsIGVycm9yTWVzc2FnZSk7XHJcbiAgICB9IGVsc2UgaWYgKGVycm9yICYmIGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcclxuICAgICAgdGhpcy5nbG9iYWxFcnJvckhhbmRsZXJTZXJ2aWNlPy5oYW5kbGVFcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOZ09uRGVzdHJveSBwZXJmb3JtcyBuZWNlc3NhcnkgY2xlYW51cCB0YXNrcywgc3VjaCBhcyB1bnN1YnNjcmliaW5nIGZyb20gc3Vic2NyaXB0aW9uIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBiZWluZyBkZXN0cm95ZWQuXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiaWVlZXNhLWdyb3VwcyBwLTMgcC1zbS00IHAtbWQtNCBwLWxnLTRcIj5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImllZWVzYS1ncm91cHNfX2luZm8gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHBiLTNcIlxyXG4gICAgW25nQ2xhc3NdPVwiXHJcbiAgICAgIGlzTW9iaWxlVmlld1xyXG4gICAgICAgID8gJ2llZWVzYS1ncm91cHNfX2luZm8tLXdoaXRlLWJnJ1xyXG4gICAgICAgIDogJ2llZWVzYS1ncm91cHNfX2luZm8tLWJsdWUtYmcnXHJcbiAgICBcIlxyXG4gID5cclxuICAgIDxwXHJcbiAgICAgIFtuZ0NsYXNzXT1cImlzTW9iaWxlVmlldyA/ICdpZWVlc2EtdGl0bGUtbGctMjQnIDogJ2llZWVzYS1oZWFkbGluZS1sZy0zNCdcIlxyXG4gICAgPlxyXG4gICAgICB7eyBncm91cHNQYWdlSW5mby5ncm91cHNUaXRsZSB9fVxyXG4gICAgPC9wPlxyXG4gICAgPGRpdj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICBjbGFzcz1cImllZWVzYS1ncm91cHNfX2NyZWF0ZS1zdWJncm91cCBtYXQtdGVydGlhcnktYnV0dG9uIGQtbm9uZSBkLXNtLW5vbmUgZC1tZC1ibG9jayBkLWxnLWJsb2NrIGQteGwtYmxvY2tcIlxyXG4gICAgICAgIChjbGljayk9XCJvcGVuQ3JlYXRlR3JvdXBGb3JtKClcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29uc3RhbnRzPy52aWV3R3JvdXBzPy5hcmlhTGFiZWw/LmFkZEdyb3VwXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGNvbnN0YW50cz8udmlld0dyb3Vwcz8uYWRkR3JvdXAgfX1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJkLWZsZXggZC1zbS1mbGV4IGQtbWQtbm9uZSBkLWxnLW5vbmUgZC14bC1ub25lIGllZWVzYS1ncm91cHNfX21vYmlsZS1pY29ucyBnYXAtMlwiXHJcbiAgICA+XHJcbiAgICAgIDxpZWVlc2EtaWNvbi1idXR0b25cclxuICAgICAgICBbaWNvbkJ1dHRvbl09XCJjcmVhdGVHcm91cEljb25cIlxyXG4gICAgICAgIChpY29uQnV0dG9uQ2xpY2spPVwib3BlbkNyZWF0ZUdyb3VwRm9ybSgpXCJcclxuICAgICAgPlxyXG4gICAgICA8L2llZWVzYS1pY29uLWJ1dHRvbj5cclxuICAgICAgPGllZWVzYS1pY29uLWJ1dHRvblxyXG4gICAgICAgIFtpY29uQnV0dG9uXT1cImZpbHRlckdyb3VwSWNvblwiXHJcbiAgICAgICAgKGljb25CdXR0b25DbGljayk9XCJzaG93R3JvdXBGaWx0ZXIoKVwiXHJcbiAgICAgID5cclxuICAgICAgPC9pZWVlc2EtaWNvbi1idXR0b24+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjb25zdGFudHM/LnZpZXdHcm91cHM/LmFyaWFMYWJlbD8uc2VhcmNoXCJcclxuICAgICAgICAoY2xpY2spPVwib25Hcm91cFNlYXJjaCgpXCJcclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtbWFnbmlmeWluZy1nbGFzcyBzZWFyY2gtZ3JvdXAtaWNvblwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImllZWVzYS1ncm91cHNfX2FjdGlvbnNcIlxyXG4gICAgW25nQ2xhc3NdPVwiXHJcbiAgICAgIGlzTW9iaWxlVmlld1xyXG4gICAgICAgID8gJ2llZWVzYS1ncm91cHNfX2FjdGlvbnMtLXdoaXRlLWJnJ1xyXG4gICAgICAgIDogJ2llZWVzYS1ncm91cHNfX2FjdGlvbnMtLWJsdWUtYmcnXHJcbiAgICBcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJpZWVlc2EtZ3JvdXBzX19hY3Rpb25zLS1zZWFyY2ggcm93XCI+XHJcbiAgICAgIDxwXHJcbiAgICAgICAgY2xhc3M9XCJpZWVlc2EtYm9keS1tZC0xNiBvcmRlci0yIG9yZGVyLXNtLTEgY29sLTEyIGNvbC1tZC03IGNvbC1sZy03IGNvbC14bC03XCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGdyb3Vwc1BhZ2VJbmZvLmdyb3Vwc0Rlc2NyaXB0aW9uIH19XHJcbiAgICAgIDwvcD5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAoKGlzR3JvdXBTZWFyY2hBY3RpdmUgfHwgaXNHcm91cEZpbHRlckFjdGl2ZSkgJiYgaXNNb2JpbGVWaWV3KSB8fFxyXG4gICAgICAgICAgIWlzTW9iaWxlVmlld1xyXG4gICAgICAgIFwiXHJcbiAgICAgICAgY2xhc3M9XCJvcmRlci0xIG9yZGVyLXNtLTIgY29sLTEyIGNvbC1tZC01IGNvbC1sZy01IGNvbC14bC01IGQtZmxleCBmbGV4LWNvbHVtblwiXHJcbiAgICAgID5cclxuICAgICAgICA8aWVlZXNhLXNlYXJjaFxyXG4gICAgICAgICAgKm5nSWY9XCJpc0dyb3VwU2VhcmNoQWN0aXZlIHx8ICFpc01vYmlsZVZpZXdcIlxyXG4gICAgICAgICAgKHNlYXJjaFZhbHVlKT1cIm9uR3JvdXBTZWFyY2hDbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgIFtwbGFjZWhvbGRlckxhYmVsXT1cInNlYXJjaFBsYWNlSG9sZGVyVGV4dFwiXHJcbiAgICAgICAgPjwvaWVlZXNhLXNlYXJjaD5cclxuICAgICAgICA8aWVlZXNhLXNlbGVjdFxyXG4gICAgICAgICAgKm5nSWY9XCJpc0dyb3VwRmlsdGVyQWN0aXZlIHx8ICFpc01vYmlsZVZpZXdcIlxyXG4gICAgICAgICAgY2xhc3M9XCJhbGlnbi1zZWxmLWVuZCBwdC1sZy00IHB0LW1kLTQgcHQteGwtNFwiXHJcbiAgICAgICAgICBbZHJvcGRvd25PcHRpb25zXT1cInNlbGVjdEdyb3VwT3B0aW9uc1wiXHJcbiAgICAgICAgICBbaXNMYWJlbEFsaWduZWRMZWZ0XT1cInRydWVcIlxyXG4gICAgICAgICAgW3NlbGVjdExhYmVsXT1cImNvbnN0YW50cz8udmlld0dyb3Vwcz8uZmlsdGVyQnlMYWJlbFwiXHJcbiAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25Hcm91cFR5cGVGaWx0ZXJlZCgkZXZlbnQpXCJcclxuICAgICAgICAgIFtwbGFjZWhvbGRlclRleHRdPVwiZmlsdGVyUGxhY2VIb2xkZXJUZXh0XCJcclxuICAgICAgICAgIFtzZWxlY3RlZE9wdGlvbnNdPVwic2VsZWN0ZWRHcm91cFR5cGVcIlxyXG4gICAgICAgID48L2llZWVzYS1zZWxlY3Q+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8aWVlZXNhLXRyZWVcclxuICAgICAgKm5nSWY9XCJwYXJlbnRHcm91cHNJbmZvICYmIHBhcmVudEdyb3Vwc0luZm8ubGVuZ3RoID4gMFwiXHJcbiAgICAgIFtwYXJlbnRHcm91cHNJbmZvXT1cInBhcmVudEdyb3Vwc0luZm9cIlxyXG4gICAgICBbY2hpbGRHcm91cHNJbmZvXT1cImNoaWxkR3JvdXBzSW5mb1wiXHJcbiAgICAgIFtkZWxldGVkR3JvdXBJZEluZm9dPVwiZGVsZXRlZEdyb3VwSWRcIlxyXG4gICAgICBbaXNHcm91cFNlYXJjaE9yRmlsdGVyQWN0aXZlXT1cImlzR3JvdXBTZWFyY2hPckZpbHRlckFjdGl2ZVwiXHJcbiAgICAgICh0b2dnbGVHcm91cENsaWNrKT1cImdldEdyb3VwcygkZXZlbnQpXCJcclxuICAgICAgKGNyZWF0ZUdyb3VwQ2xpY2spPVwib3BlbkNyZWF0ZUdyb3VwRm9ybSgkZXZlbnQpXCJcclxuICAgICAgKGRlbGV0ZUdyb3VwQ2xpY2spPVwib3BlbkRlbGV0ZUNvbmZpcm1hdGlvbk1vZGFsKCRldmVudClcIlxyXG4gICAgICAodmlld1Jvc3RlckNsaWNrKT1cInZpZXdSb3N0ZXIoJGV2ZW50KVwiXHJcbiAgICAgIChlZGl0R3JvdXBDbGljayk9XCJvcGVuRWRpdEdyb3VwRm9ybSgkZXZlbnQpXCJcclxuICAgID48L2llZWVzYS10cmVlPlxyXG4gICAgPGRpdlxyXG4gICAgICAqbmdJZj1cInBhcmVudEdyb3Vwc0luZm8gJiYgcGFyZW50R3JvdXBzSW5mby5sZW5ndGggPiAwXCJcclxuICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZmxleC1zbS1yb3cgZmxleC1tZC1yb3cgbXQtNCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQganVzdGlmeS1jb250ZW50LXNtLWVuZFwiXHJcbiAgICA+XHJcbiAgICAgIDxwIGNsYXNzPVwicHgtc20tMyBkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQgaWVlZXNhLWxhYmVsLWxnLWJvbGQtMTZcIj5cclxuICAgICAgICB7eyBjb25zdGFudHM/LnZpZXdHcm91cHM/LmxlZ2VuZCB9fVxyXG4gICAgICA8L3A+XHJcbiAgICAgIDxpZWVlc2EtbGVnZW5kIFtsZWdlbmRzXT1cImdyb3Vwc0xlZ2VuZHNcIiBbaXNTb3J0aW5nXT1cImlzU29ydGluZ1wiPjwvaWVlZXNhLWxlZ2VuZD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|
|
513
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXBzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2dyb3Vwcy9zcmMvbGliL2dyb3Vwcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9ncm91cHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUVMLGlCQUFpQixHQUVsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFFeEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFMUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFDTCxlQUFlLEVBQ2YsY0FBYyxFQUVkLG1CQUFtQixFQUVuQixTQUFTLEVBQ1QsMEJBQTBCLEVBQzFCLGVBQWUsRUFDZixlQUFlLEdBRWhCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFL0UsT0FBTyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBRVQsYUFBYSxHQUVkLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUd2RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNoRyxPQUFP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QkFDZixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLG1CQUFtQjtxQkFDcEIsaUJBR2MsaUJBQWlCLENBQUMsSUFBSSxhQUMxQixDQUFDLGFBQWEsQ0FBQzt3T0F1Q2pCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBT0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG4gIE9uSW5pdCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBDcmVhdGVHcm91cENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9jcmVhdGUtZ3JvdXAvY3JlYXRlLWdyb3VwLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdyb3Vwc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2dyb3Vwcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEdyb3VwSW5mbyB9IGZyb20gJy4vbW9kZWxzL2dyb3VwLWluZm8ubW9kZWwnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQge1xyXG4gIFNlYXJjaENvbXBvbmVudCxcclxuICBNb2RhbENvbXBvbmVudCxcclxuICBTZWxlY3RPcHRpb24sXHJcbiAgSWNvbkJ1dHRvbkNvbXBvbmVudCxcclxuICBJY29uQnV0dG9uLFxyXG4gIEFsaWduVHlwZSxcclxuICBNb2RhbENvbmZpcm1hdGlvbkNvbXBvbmVudCxcclxuICBTZWxlY3RDb21wb25lbnQsXHJcbiAgTGVnZW5kQ29tcG9uZW50LFxyXG4gIExlZ2VuZCxcclxufSBmcm9tICdAaWVlZXNhLW5wbS9wcmVzZW50YXRpb24nO1xyXG5pbXBvcnQgeyBUcmVlVmlld0NvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90cmVlLXZpZXcvdHJlZS12aWV3LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdyb3VwVHlwZSwgR3JvdXBUeXBlQ29uZmlnVmFsdWUgfSBmcm9tICcuL21vZGVscy9ncm91cC10eXBlcy5tb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgTW9kYWxUeXBlLFxyXG4gIEFsZXJ0VHlwZSxcclxuICBCcmVha3BvaW50T2JzZXJ2ZXJTZXJ2aWNlLFxyXG4gIEFsZXJ0c1NlcnZpY2UsXHJcbiAgR2xvYmFsRXJyb3JIYW5kbGVyU2VydmljZSxcclxufSBmcm9tICdAaWVlZXNhLW5wbS91dGlsaXR5JztcclxuaW1wb3J0ICogYXMgc2NyZWVuVGV4dHMgZnJvbSAnLi9hc3NldHMvY29uc3RhbnRzLmpzb24nO1xyXG5pbXBvcnQgeyBHcm91cEZ1bmN0aW9uVHlwZSB9IGZyb20gJy4vbW9kZWxzL2dyb3VwLWZ1bmN0aW9uLXR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBHZXRHcm91cHNQYXlsb2FkIH0gZnJvbSAnLi9tb2RlbHMvdmlldy1ncm91cC5tb2RlbCc7XHJcbmltcG9ydCB7IERlbGV0ZUdyb3VwUGF5bG9hZCB9IGZyb20gJy4vbW9kZWxzL2RlbGV0ZS1ncm91cC5tb2RlbCc7XHJcbmltcG9ydCB7IEFkZFVzZXJSb3N0ZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYWRkLXVzZXItcm9zdGVyL2FkZC11c2VyLXJvc3Rlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBWaWV3Um9zdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3ZpZXctcm9zdGVyL3ZpZXctcm9zdGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEVkaXRHcm91cEFuZFBhcmVudEluZm8gfSBmcm9tICcuL21vZGVscy9lZGl0LWdyb3VwLm1vZGVsJztcclxuXHJcbi8qKlxyXG4gKiBHcm91cHMgY29tcG9uZW50IGlzIGEgd3JhcHBlciBvciBjb250YWluZXIgY29tcG9uZW50IGZvciBncm91cHMgbWFuYWdlbWVudCByZXVzYWJsZSBjb21wb25lbnQgYW5kIGluIHRoaXMgY29tcG9uZW50IGludGVncmF0ZXMgYWxsIGdyb3VwIG1hbmFnZW1lbnQgZnVuY3Rpb25hbGl0aWVzIGFuZCB0aGlzIHdpbGwgYmUgZW50cnkgY29tcG9uZW50IGZvciBtYW5hZ2luZyBncm91cHMgd2hlbiBpdCBpcyBjb25zdW1lZCBpbiBvdGhlciBhcHBsaWNhdGlvbnMuXHJcbiAqIEBjbGFzcyBHcm91cHNDb21wb25lbnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICdpZWVlc2EtZ3JvdXBzJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIE1hdERpYWxvZ01vZHVsZSxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIFNlYXJjaENvbXBvbmVudCxcclxuICAgIFNlbGVjdENvbXBvbmVudCxcclxuICAgIFRyZWVWaWV3Q29tcG9uZW50LFxyXG4gICAgTGVnZW5kQ29tcG9uZW50LFxyXG4gICAgSWNvbkJ1dHRvbkNvbXBvbmVudCxcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ncm91cHMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2dyb3Vwcy5jb21wb25lbnQuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgcHJvdmlkZXJzOiBbQWxlcnRzU2VydmljZV0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHcm91cHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgZGVzdHJveSQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgZGlhbG9nUmVmOiBhbnk7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBjb25zdGFudHM6IGFueSA9IHNjcmVlblRleHRzO1xyXG4gIHZpZXdHcm91cFRleHRzID0gdGhpcy5jb25zdGFudHM/LnZpZXdHcm91cHM7XHJcbiAgY3JlYXRlR3JvdXBUZXh0ID0gdGhpcy5jb25zdGFudHM/LmNyZWF0ZUdyb3VwO1xyXG4gIGVkaXRHcm91cFRleHRzID0gdGhpcy5jb25zdGFudHM/LmVkaXRHcm91cDtcclxuICBhZGRVc2VyUm9zdGVyVGV4dHMgPSB0aGlzLmNvbnN0YW50cz8uYWRkVXNlclJvc3RlcjtcclxuICBpc0dyb3VwU2VhcmNoQWN0aXZlID0gZmFsc2U7XHJcbiAgaXNHcm91cEZpbHRlckFjdGl2ZSA9IGZhbHNlO1xyXG4gIGlzR3JvdXBTZWFyY2hPckZpbHRlckFjdGl2ZSA9IGZhbHNlO1xyXG4gIGlzTW9iaWxlVmlldyA9IGZhbHNlO1xyXG4gIGNoaWxkR3JvdXBzSW5mbyE6IEdyb3VwSW5mb1tdO1xyXG4gIHNlbGVjdGVkR3JvdXBUeXBlITogU2VsZWN0T3B0aW9uO1xyXG4gIHBhcmVudEdyb3Vwc0luZm8hOiBHcm91cEluZm9bXTtcclxuICBzZWxlY3RHcm91cE9wdGlvbnMhOiBTZWxlY3RPcHRpb25bXTtcclxuICBkZWxldGVkR3JvdXBJZCE6IHN0cmluZztcclxuICBkZWxldGVHcm91cE5hbWUhOiBzdHJpbmc7XHJcbiAgZ3JvdXBUeXBlcyE6IEdyb3VwVHlwZUNvbmZpZ1ZhbHVlO1xyXG4gIHNlYXJjaFBsYWNlSG9sZGVyVGV4dDogc3RyaW5nID0gdGhpcy52aWV3R3JvdXBUZXh0cz8ucGxhY2Vob2xkZXJUZXh0Py5zZWFyY2g7XHJcbiAgZmlsdGVyUGxhY2VIb2xkZXJUZXh0OiBzdHJpbmcgPSB0aGlzLnZpZXdHcm91cFRleHRzPy5wbGFjZWhvbGRlclRleHQ/LmZpbHRlcjtcclxuICBjcmVhdGVHcm91cEljb246IEljb25CdXR0b24gPSB7XHJcbiAgICBpZDogMSxcclxuICAgIGFyaWFMYWJlbDogdGhpcy52aWV3R3JvdXBUZXh0cz8uYXJpYUxhYmVsLmFkZCxcclxuICAgIGljb25VUkw6IHRoaXMudmlld0dyb3VwVGV4dHM/LmNyZWF0ZUdyb3VwSWNvbixcclxuICAgIHRvb2xUaXA6IHRoaXMudmlld0dyb3VwVGV4dHM/LmFyaWFMYWJlbC5hZGQsXHJcbiAgfTtcclxuICBmaWx0ZXJHcm91cEljb246IEljb25CdXR0b24gPSB7XHJcbiAgICBpZDogMixcclxuICAgIGFyaWFMYWJlbDogdGhpcy52aWV3R3JvdXBUZXh0cz8uYXJpYUxhYmVsLmZpbHRlcixcclxuICAgIGljb25VUkw6IHRoaXMudmlld0dyb3VwVGV4dHM/LmZpbHRlckdyb3VwSWNvbixcclxuICAgIHRvb2xUaXA6IHRoaXMudmlld0dyb3VwVGV4dHM/LmFyaWFMYWJlbC5maWx0ZXIsXHJcbiAgfTtcclxuICBncm91cHNMZWdlbmRzOiBMZWdlbmRbXSA9IFtdO1xyXG4gIGdldEdyb3Vwc1BheWxvYWQ6IEdldEdyb3Vwc1BheWxvYWQgPSB7IGdyb3VwSWQ6ICcnLCBncm91cFR5cGVJZDogJycgfTtcclxuICBASW5wdXQoKSBncm91cHNQYWdlSW5mbzoge1xyXG4gICAgZ3JvdXBzVGl0bGU6IHN0cmluZztcclxuICAgIGdyb3Vwc0Rlc2NyaXB0aW9uOiBzdHJpbmc7XHJcbiAgfSA9IHtcclxuICAgIGdyb3Vwc1RpdGxlOiB0aGlzLnZpZXdHcm91cFRleHRzPy5ncm91cHNUaXRsZSxcclxuICAgIGdyb3Vwc0Rlc2NyaXB0aW9uOiB0aGlzLnZpZXdHcm91cFRleHRzPy5ncm91cHNEZXNjcmlwdGlvbixcclxuICB9O1xyXG4gIEBJbnB1dCgpIGFwcGxpY2F0aW9uSWQhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYXBpQmFzZVVSTCE6IHN0cmluZztcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIEBJbnB1dCgpIHBlcm1pc3Npb25zITogYW55O1xyXG4gIGZ1bmN0aW9uVHlwZSE6IEdyb3VwRnVuY3Rpb25UeXBlO1xyXG4gIGFsaWdubWVudFR5cGUgPSBBbGlnblR5cGU7XHJcbiAgaXNTb3J0aW5nID0gdHJ1ZTtcclxuICBjYW5SZW9wZW5WaWV3Um9zdGVyTW9kYWwgPSBmYWxzZTtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIGdyb3Vwc1NlcnZpY2U6IEdyb3Vwc1NlcnZpY2UsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHB1YmxpYyBhbGVydFNlcnZpY2U6IEFsZXJ0c1NlcnZpY2UsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHByaXZhdGUgYnJlYWtwb2ludE9ic2VydmVyU2VydmljZTogQnJlYWtwb2ludE9ic2VydmVyU2VydmljZSxcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHVibGljIGdsb2JhbEVycm9ySGFuZGxlclNlcnZpY2U6IEdsb2JhbEVycm9ySGFuZGxlclNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuYnJlYWtwb2ludE9ic2VydmVyU2VydmljZVxyXG4gICAgICAuZ2V0QnJlYWtwb2ludCgpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc01vYmlsZVZpZXcgPSByZXN1bHQ/Lm1hdGNoZXM7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbGl6ZSB0aGUgZ3JvdXBzIGNvbXBvbmVudC5cclxuICAgKiBAcmV0dXJuIC1yZXR1cm5zIG5vdGhpbmdcclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyb3Vwc1NlcnZpY2U/LnNldEFwcENvbmZpZyh0aGlzLmFwaUJhc2VVUkwsIHRoaXMucGVybWlzc2lvbnMpO1xyXG4gICAgdGhpcy5nZXRHcm91cFR5cGVzKCk7XHJcbiAgICB0aGlzLmdyb3Vwc1NlcnZpY2U/Lm9wZW5Nb2RhbE5vdGlmaWVyXHJcbiAgICAgID8ucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgID8uc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZSA9PT0gR3JvdXBGdW5jdGlvblR5cGUuQUREX1VTRVJfVE9fUk9TVEVSKSB7XHJcbiAgICAgICAgICB0aGlzLmRpYWxvZ1JlZj8uY2xvc2UoKTtcclxuICAgICAgICAgIHRoaXMub3BlbkFkZFVzZXJSb3N0ZXJNb2RhbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBkaWFsb2cgb3B0aW9ucyBmb3IgY3JlYXRlIGdyb3VwIG1vZGFsIGFuZCBjYWxscyBvcGVuTW9kYWwgbWV0aG9kLlxyXG4gICAqIEBwYXJhbSB7R3JvdXBJbmZvfSBbcGFyZW50R3JvdXBJbmZvXSAtQW4gb3B0aW9uYWwgcGFyYW1ldGVyLiBQYXJlbnQgZ3JvdXAgaW5mbyB0byBiZSBwYXNzZWQgZm9yIGNyZWF0ZSBjaGlsZCBncm91cC5cclxuICAgKiBAcmV0dXJuIC1yZXR1cm5zIG5vdGhpbmdcclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb3BlbkNyZWF0ZUdyb3VwRm9ybShwYXJlbnRHcm91cEluZm8/OiBHcm91cEluZm8pOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JvdXBzU2VydmljZT8uc2V0U2VsZWN0ZWRHcm91cEluZm8ocGFyZW50R3JvdXBJbmZvID8/IHVuZGVmaW5lZCk7XHJcbiAgICB0aGlzLmdyb3Vwc1NlcnZpY2U/LnNldEdyb3VwRnVuY3Rpb25UeXBlKEdyb3VwRnVuY3Rpb25UeXBlPy5DUkVBVEUpO1xyXG4gICAgY29uc3QgZGlhbG9nT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGluZzogdGhpcy5jcmVhdGVHcm91cFRleHQ/LmhlYWRpbmcsXHJcbiAgICAgIGlzQ2xvc2VOZWVkZWQ6IHRydWUsXHJcbiAgICAgIGNvbXBvbmVudFJlZmVyZW5jZTogQ3JlYXRlR3JvdXBDb21wb25lbnQsXHJcbiAgICAgIG1vZGFsVHlwZTogTW9kYWxUeXBlLkZPUk0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5mdW5jdGlvblR5cGUgPSBHcm91cEZ1bmN0aW9uVHlwZT8uQ1JFQVRFO1xyXG4gICAgdGhpcy5vcGVuTW9kYWwoZGlhbG9nT3B0aW9ucywgJ2llZWVzYS1jcmVhdGUtZ3JvdXAnLCBwYXJlbnRHcm91cEluZm8pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgZGlhbG9nIG9wdGlvbnMgZm9yIGVkaXQgZ3JvdXAgbW9kYWwgYW5kIGNhbGxzIG9wZW5Nb2RhbCBtZXRob2QuXHJcbiAgICogQHBhcmFtIHtFZGl0R3JvdXBBbmRQYXJlbnRJbmZvfSBlZGl0R3JvdXBJbmZvIC1lZGl0aW5nIGdyb3VwIGFuZCBpdHMgcGFyZW50IGdyb3VwIGluZm8gdG8gYmUgcGFzc2VkIGZvciBwb3B1bGF0aW5nIGVkaXQgZ3JvdXAgZm9ybSBmaWVsZHMuXHJcbiAgICogQHJldHVybiAtcmV0dXJucyBub3RoaW5nXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9wZW5FZGl0R3JvdXBGb3JtKGVkaXRHcm91cEluZm86IEVkaXRHcm91cEFuZFBhcmVudEluZm8pOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JvdXBzU2VydmljZT8uc2V0U2VsZWN0ZWRHcm91cEluZm8oXHJcbiAgICAgIGVkaXRHcm91cEluZm8/Lmdyb3VwSW5mbyxcclxuICAgICAgZWRpdEdyb3VwSW5mbz8ucGFyZW50R3JvdXBJbmZvXHJcbiAgICApO1xyXG4gICAgdGhpcy5ncm91cHNTZXJ2aWNlPy5zZXRHcm91cEZ1bmN0aW9uVHlwZShHcm91cEZ1bmN0aW9uVHlwZT8uRURJVCk7XHJcbiAgICBjb25zdCBkaWFsb2dPcHRpb25zID0ge1xyXG4gICAgICBoZWFkaW5nOiBlZGl0R3JvdXBJbmZvPy5ncm91cEluZm8/Lmdyb3VwTmFtZSxcclxuICAgICAgaXNDbG9zZU5lZWRlZDogdHJ1ZSxcclxuICAgICAgY29tcG9uZW50UmVmZXJlbmNlOiBDcmVhdGVHcm91cENvbXBvbmVudCxcclxuICAgICAgbW9kYWxUeXBlOiBNb2RhbFR5cGUuRk9STSxcclxuICAgIH07XHJcbiAgICB0aGlzLmZ1bmN0aW9uVHlwZSA9IEdyb3VwRnVuY3Rpb25UeXBlPy5FRElUO1xyXG4gICAgdGhpcy5vcGVuTW9kYWwoZGlhbG9nT3B0aW9ucywgJ2llZWVzYS1jcmVhdGUtZ3JvdXAnLCBlZGl0R3JvdXBJbmZvKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGRpYWxvZyBvcHRpb25zIGZvciBhZGQgdXNlcnMgbW9kYWwgYW5kIGNhbGxzIG9wZW5Nb2RhbCBtZXRob2QuXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9wZW5BZGRVc2VyUm9zdGVyTW9kYWwoKTogdm9pZCB7XHJcbiAgICBjb25zdCBkaWFsb2dPcHRpb25zID0ge1xyXG4gICAgICBoZWFkaW5nOiB0aGlzLmFkZFVzZXJSb3N0ZXJUZXh0cz8uaGVhZGluZyxcclxuICAgICAgaXNDbG9zZU5lZWRlZDogdHJ1ZSxcclxuICAgICAgY29tcG9uZW50UmVmZXJlbmNlOiBBZGRVc2VyUm9zdGVyQ29tcG9uZW50LFxyXG4gICAgICBtb2RhbFR5cGU6IE1vZGFsVHlwZS5GT1JNLFxyXG4gICAgfTtcclxuICAgIHRoaXMuZnVuY3Rpb25UeXBlID0gR3JvdXBGdW5jdGlvblR5cGUuQUREX1VTRVJfVE9fUk9TVEVSO1xyXG4gICAgdGhpcy5ncm91cHNTZXJ2aWNlPy5zZXRHcm91cEZ1bmN0aW9uVHlwZSh0aGlzLmZ1bmN0aW9uVHlwZSk7XHJcbiAgICB0aGlzLm9wZW5Nb2RhbChkaWFsb2dPcHRpb25zLCAnaWVlZXNhLWFkZC11c2VyLXJvc3RlcicpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgZGlhbG9nIG9wdGlvbnMgZm9yIHVzZXJzIG1vZGFsIGFuZCBjYWxscyBvcGVuTW9kYWwgbWV0aG9kLlxyXG4gICAqIEBwYXJhbSB7R3JvdXBJbmZvfSBncm91cFxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNDb21wb25lbnRcclxuICAgKi9cclxuICB2aWV3Um9zdGVyKGdyb3VwOiBHcm91cEluZm8pOiB2b2lkIHtcclxuICAgIGNvbnN0IGRpYWxvZ09wdGlvbnMgPSB7XHJcbiAgICAgIGhlYWRpbmc6IGdyb3VwPy5ncm91cE5hbWUsXHJcbiAgICAgIGlzQ2xvc2VOZWVkZWQ6IHRydWUsXHJcbiAgICAgIGNvbXBvbmVudFJlZmVyZW5jZTogVmlld1Jvc3RlckNvbXBvbmVudCxcclxuICAgICAgbW9kYWxUeXBlOiBNb2RhbFR5cGUuRk9STV9BTkRfQ09OVEVOVCxcclxuICAgIH07XHJcbiAgICB0aGlzLmdyb3Vwc1NlcnZpY2Uuc2V0U2VsZWN0ZWRHcm91cEluZm8oZ3JvdXApO1xyXG4gICAgdGhpcy5mdW5jdGlvblR5cGUgPSBHcm91cEZ1bmN0aW9uVHlwZS5WSUVXX1JPU1RFUjtcclxuICAgIHRoaXMuZ3JvdXBzU2VydmljZT8uc2V0R3JvdXBGdW5jdGlvblR5cGUoR3JvdXBGdW5jdGlvblR5cGU/LkVESVQpO1xyXG4gICAgdGhpcy5vcGVuTW9kYWwoZGlhbG9nT3B0aW9ucywgJ2llZWVzYS12aWV3LXJvc3RlcicpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbnMgbW9kYWwgY29tcG9uZW50IHdpdGggZm9yIHJlY2VpdmVkIHBhcmFtcyBhbmQgaGFuZGxlcyBmb3JtIHN1Ym1pc3Npb24gc3VjY2VzcyBhbmQgZXJyb3JzLlxyXG4gICAqIEBwYXJhbSB7Kn0gZGlhbG9nT3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbY2xhc3NOYW1lXVxyXG4gICAqIEByZXR1cm4gLXJldHVybnMgbm90aGluZ1xyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNDb21wb25lbnRcclxuICAgKi9cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L25vLWluZmVycmFibGUtdHlwZXMsIG5vLXVudXNlZC12YXJzXHJcbiAgb3Blbk1vZGFsKFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIGRpYWxvZ09wdGlvbnM6IGFueSxcclxuICAgIGNsYXNzTmFtZT86IHN0cmluZyxcclxuICAgIGdyb3VwSW5mbz86IEdyb3VwSW5mbyB8IEVkaXRHcm91cEFuZFBhcmVudEluZm9cclxuICApOiB2b2lkIHtcclxuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZSA/PyAnJztcclxuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2c/Lm9wZW4oTW9kYWxDb21wb25lbnQsIHtcclxuICAgICAgZGF0YTogZGlhbG9nT3B0aW9ucyxcclxuICAgICAgd2lkdGg6XHJcbiAgICAgICAgdGhpcy5mdW5jdGlvblR5cGUgPT09IEdyb3VwRnVuY3Rpb25UeXBlLlZJRVdfUk9TVEVSIHx8XHJcbiAgICAgICAgdGhpcy5mdW5jdGlvblR5cGUgPT09IEdyb3VwRnVuY3Rpb25UeXBlLkFERF9VU0VSX1RPX1JPU1RFUlxyXG4gICAgICAgICAgPyAnJ1xyXG4gICAgICAgICAgOiAnYXV0bycsXHJcbiAgICAgIHBhbmVsQ2xhc3M6IFsnaWVlZXNhLW1vZGFsLWRpYWxvZycsIGNsYXNzTmFtZV0sXHJcbiAgICAgIGFyaWFNb2RhbDogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5kaWFsb2dSZWY/LmNvbXBvbmVudEluc3RhbmNlPy5zdWJtaXRGb3JtUmVzcG9uc2VcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBuby11bnVzZWQtdmFyc1xyXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmPy5jbG9zZSgpO1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5mdW5jdGlvblR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgR3JvdXBGdW5jdGlvblR5cGU/LkNSRUFURToge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dBbGVydE1lc3NhZ2UoXHJcbiAgICAgICAgICAgICAgQWxlcnRUeXBlPy5TVUNDRVNTLFxyXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlR3JvdXBUZXh0Py5tZXNzYWdlPy5zdWNjZXNzPy5zdWJtaXNzaW9uXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZUdyb3VwSW5mbyA9IGdyb3VwSW5mbyBhcyBHcm91cEluZm87XHJcbiAgICAgICAgICAgIGlmIChjcmVhdGVHcm91cEluZm8pIHRoaXMuZ2V0R3JvdXBzKGNyZWF0ZUdyb3VwSW5mbyk7XHJcbiAgICAgICAgICAgIGVsc2UgdGhpcy5nZXRHcm91cHMoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXNlIEdyb3VwRnVuY3Rpb25UeXBlPy5FRElUOiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0FsZXJ0TWVzc2FnZShcclxuICAgICAgICAgICAgICBBbGVydFR5cGU/LlNVQ0NFU1MsXHJcbiAgICAgICAgICAgICAgdGhpcy5lZGl0R3JvdXBUZXh0cz8ubWVzc2FnZT8uc3VjY2Vzcz8uc3VibWlzc2lvblxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0R3JvdXBJbmZvID0gZ3JvdXBJbmZvIGFzIEVkaXRHcm91cEFuZFBhcmVudEluZm87XHJcbiAgICAgICAgICAgIGlmIChlZGl0R3JvdXBJbmZvPy5wYXJlbnRHcm91cEluZm8/Lmdyb3VwSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB0aGlzLmdldEdyb3VwcyhlZGl0R3JvdXBJbmZvLnBhcmVudEdyb3VwSW5mbyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2FzZSBHcm91cEZ1bmN0aW9uVHlwZT8uQUREX1VTRVJfVE9fUk9TVEVSOiB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzU2VydmljZS5jYW5TaG93TWVzc2FnZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIHRoaXMuZGlhbG9nUmVmPy5jb21wb25lbnRJbnN0YW5jZT8uZm9ybUNhbmNlbFxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmPy5jbG9zZSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmZ1bmN0aW9uVHlwZSA9PT0gR3JvdXBGdW5jdGlvblR5cGUuQUREX1VTRVJfVE9fUk9TVEVSKSB7XHJcbiAgICAgICAgICB0aGlzLmNhblJlb3BlblZpZXdSb3N0ZXJNb2RhbCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy52aWV3Um9zdGVyKHRoaXMuZ3JvdXBzU2VydmljZS5zZWxlY3RlZEdyb3VwSW5mbyBhcyBHcm91cEluZm8pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZlxyXG4gICAgICA/LmFmdGVyT3BlbmVkKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5mdW5jdGlvblR5cGUgPT09IEdyb3VwRnVuY3Rpb25UeXBlLkFERF9VU0VSX1RPX1JPU1RFUikge1xyXG4gICAgICAgICAgdGhpcy5jYW5SZW9wZW5WaWV3Um9zdGVyTW9kYWwgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZlxyXG4gICAgICA/LmFmdGVyQ2xvc2VkKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jYW5SZW9wZW5WaWV3Um9zdGVyTW9kYWwpIHtcclxuICAgICAgICAgIHRoaXMuY2FuUmVvcGVuVmlld1Jvc3Rlck1vZGFsID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnZpZXdSb3N0ZXIodGhpcy5ncm91cHNTZXJ2aWNlLnNlbGVjdGVkR3JvdXBJbmZvIGFzIEdyb3VwSW5mbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogT3BlbnMgdGhlIGNvbmZpcm1hdGlvbiBtb2RhbCB0byBnZXQgdXNlciBjb25maXJtYXRpb24gdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCBncm91cC5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBDb21wb25lbnRcclxuICAgKi9cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIG9wZW5EZWxldGVDb25maXJtYXRpb25Nb2RhbChncm91cEluZm86IEdyb3VwSW5mbyk6IHZvaWQge1xyXG4gICAgY29uc3QgY29uZmlybWF0aW9uSW5mbyA9IHNjcmVlblRleHRzPy5kZWxldGVHcm91cD8uY29uZmlybWF0aW9uSW5mbztcclxuICAgIGNvbnN0IGRlbGV0ZUdyb3VwTW9kYWxPcHRpb25zID0ge1xyXG4gICAgICBsZWZ0QnV0dG9uTGFiZWw6IGNvbmZpcm1hdGlvbkluZm8/LmxlZnRCdXR0b25MYWJlbCxcclxuICAgICAgcmlnaHRCdXR0b25MYWJlbDogY29uZmlybWF0aW9uSW5mbz8ucmlnaHRCdXR0b25MYWJlbCxcclxuICAgICAgcHJvbXB0TWVzc2FnZTpcclxuICAgICAgICBjb25maXJtYXRpb25JbmZvPy5wcm9tcHRNZXNzYWdlICsgZ3JvdXBJbmZvPy5ncm91cE5hbWUgKyAnPycsXHJcbiAgICAgIGFjdGlvbkJ1dHRvbkFsaWduOiB0aGlzLmFsaWdubWVudFR5cGU/Lk1JRERMRSxcclxuICAgIH07XHJcbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nPy5vcGVuKE1vZGFsQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7XHJcbiAgICAgIGRhdGE6IGRlbGV0ZUdyb3VwTW9kYWxPcHRpb25zLFxyXG4gICAgICB3aWR0aDogJ2F1dG8nLFxyXG4gICAgICBhdXRvRm9jdXM6ICdkaWFsb2cnLFxyXG4gICAgICBhcmlhTGFiZWw6IHRoaXMuY29uc3RhbnRzPy5hcmlhTGFiZWw/LmFsZXJ0LFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZlxyXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgIHRoaXMuZGVsZXRlR3JvdXAoZ3JvdXBJbmZvKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBtZXRob2Qgc2VuZHMgQVBJIFJlcXVlc3QgdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCBncm91cCBhbmQgaGFuZGxlcyB0aGUgc3VjY2VzcyBhbmQgZXJyb3IgcmVzcG9uc2Ugb2YgdGhlIGh0dHAgcmVxdWVzdC5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBDb21wb25lbnRcclxuICAgKi9cclxuICBkZWxldGVHcm91cChncm91cEluZm86IEdyb3VwSW5mbyk6IHZvaWQge1xyXG4gICAgY29uc3QgZGVsZXRlR3JvdXBUZXh0ID0gc2NyZWVuVGV4dHM/LmRlbGV0ZUdyb3VwO1xyXG4gICAgdGhpcy5kZWxldGVHcm91cE5hbWUgPSBncm91cEluZm8/Lmdyb3VwTmFtZTtcclxuICAgIGNvbnN0IGRlbGV0ZUdyb3VwUGF5bG9hZDogRGVsZXRlR3JvdXBQYXlsb2FkID0ge1xyXG4gICAgICBwYXlsb2FkOiB7XHJcbiAgICAgICAgZ3JvdXBJZDogZ3JvdXBJbmZvPy5ncm91cElkLFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMuZ3JvdXBzU2VydmljZVxyXG4gICAgICAuZGVsZXRlR3JvdXAoZGVsZXRlR3JvdXBQYXlsb2FkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRpYWxvZ1JlZj8uY2xvc2UoKTtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cykge1xyXG4gICAgICAgICAgICB0aGlzLmRlbGV0ZWRHcm91cElkID0gZ3JvdXBJbmZvPy5ncm91cElkO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dBbGVydE1lc3NhZ2UoXHJcbiAgICAgICAgICAgICAgQWxlcnRUeXBlPy5TVUNDRVNTLFxyXG4gICAgICAgICAgICAgIGdyb3VwSW5mbz8uZ3JvdXBOYW1lICsgZGVsZXRlR3JvdXBUZXh0Py5tZXNzYWdlPy5zdWNjZXNzPy5kZWxldGlvblxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3JzKGVycm9yKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3dzIHRoZSBzZWFyY2ggZmllbGQgb24gY2xpY2sgb2Ygc2VhcmNoIGljb24gaW4gY2FzZSBvZiBtb2JpbGUgdmlld1xyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNDb21wb25lbnRcclxuICAgKi9cclxuICBvbkdyb3VwU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0dyb3VwU2VhcmNoQWN0aXZlID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNHcm91cEZpbHRlckFjdGl2ZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvd3MgdGhlIEZpbHRlciBieSBkcm9wZG93biBvcHRpb25zIG9uIGNsaWNrIG9mIGZpbHRlciBpY29uIGluIGNhc2Ugb2YgbW9iaWxlIHZpZXdcclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgc2hvd0dyb3VwRmlsdGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0dyb3VwRmlsdGVyQWN0aXZlID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNHcm91cFNlYXJjaEFjdGl2ZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyBpc0dyb3VwU2VhcmNoT3JGaWx0ZXJBY3RpdmUgdG8gdHJ1ZSBhbmQgbG9hZHMgdGhlIGdyb3VwcyB0aG9zZSBhcmUgY29uZmlndXJlZCB3aXRoIHNlbGVjdGVkIGdyb3VwIHR5cGUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlYXJjaFRlcm1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb25Hcm91cFNlYXJjaENsaWNrKHNlYXJjaFRlcm06IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0dyb3VwU2VhcmNoT3JGaWx0ZXJBY3RpdmUgPSAhIXNlYXJjaFRlcm07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHNlbGVjdCBncm91cCB0eXBlIG9wdGlvbnMgZnJvbSBncm91cFR5cGVzIHJlc3BvbnNlXHJcbiAgICogQHJldHVybiB7Kn0gIHtTZWxlY3RPcHRpb25bXX1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0R3JvdXBUeXBlT3B0aW9ucygpOiBTZWxlY3RPcHRpb25bXSB7XHJcbiAgICB0aGlzLmxlZ2VuZENvbG9yKCk7XHJcbiAgICBjb25zdCBncm91cFR5cGVPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xyXG4gICAgZ3JvdXBUeXBlT3B0aW9ucy5wdXNoKHtcclxuICAgICAgaWQ6ICcnLFxyXG4gICAgICBuYW1lOiB0aGlzLnZpZXdHcm91cFRleHRzPy5hbGxHcm91cFR5cGVzT3B0aW9uLFxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZW50cmllcyh0aGlzLmdyb3VwVHlwZXMpPy5mb3JFYWNoKChub2RlKSA9PiB7XHJcbiAgICAgIGdyb3VwVHlwZU9wdGlvbnMucHVzaCh7IGlkOiBub2RlWzBdLCBuYW1lOiBub2RlWzFdPy5uYW1lIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZ3JvdXBUeXBlT3B0aW9ucztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgbGVnZW5kIGNvbG9yIGZyb20gZ3JvdXBUeXBlcyByZXNwb25zZVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNDb21wb25lbnRcclxuICAgKi9cclxuICBsZWdlbmRDb2xvcigpOiB2b2lkIHtcclxuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZ3JvdXBUeXBlcyk/LmZvckVhY2goKG5vZGUpID0+IHtcclxuICAgICAgdGhpcy5ncm91cHNMZWdlbmRzPy5wdXNoKHtcclxuICAgICAgICBjb2xvcjogbm9kZVsxXT8ubGVnZW5kQ29sb3IsXHJcbiAgICAgICAgbGFiZWw6IG5vZGVbMV0/Lm5hbWUsXHJcbiAgICAgICAgaGllcmFyY2h5OiBub2RlWzFdPy5oaWVyYXJjaHksXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBpc0dyb3VwU2VhcmNoT3JGaWx0ZXJBY3RpdmUgZmxhZyBhbmQgbG9hZHMgcGFyZW50IGdyb3VwIGluZm8gYXMgcGVyIHNlbGVjdGVkIGZpbHRlciBvcHRpb24uXHJcbiAgICogQHBhcmFtIHtTZWxlY3RPcHRpb259IGV2ZW50XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uR3JvdXBUeXBlRmlsdGVyZWQoZXZlbnQ6IFNlbGVjdE9wdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZEdyb3VwVHlwZSA9IGV2ZW50O1xyXG4gICAgdGhpcy5pc0dyb3VwU2VhcmNoT3JGaWx0ZXJBY3RpdmUgPSAhIXRoaXMuc2VsZWN0ZWRHcm91cFR5cGU/LmlkO1xyXG4gICAgdGhpcy5nZXRHcm91cHNQYXlsb2FkID0ge1xyXG4gICAgICBncm91cElkOiAnJyxcclxuICAgICAgZ3JvdXBUeXBlSWQ6IHRoaXMuc2VsZWN0ZWRHcm91cFR5cGU/LmlkIGFzIHN0cmluZyxcclxuICAgIH07XHJcbiAgICB0aGlzLmdldEdyb3VwcygpO1xyXG4gICAgdGhpcy5ncm91cHNTZXJ2aWNlPy5zZXRHcm91cEZ1bmN0aW9uVHlwZShHcm91cEZ1bmN0aW9uVHlwZT8uRklMVEVSKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWRzIGFsbCB0aGUgcGFyZW50IGdyb3VwcyBpbmZvcm1hdGlvbi5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0R3JvdXBzKGdyb3VwPzogR3JvdXBJbmZvKTogdm9pZCB7XHJcbiAgICBpZiAoZ3JvdXApIHtcclxuICAgICAgdGhpcy5nZXRHcm91cHNQYXlsb2FkID0ge1xyXG4gICAgICAgIGdyb3VwSWQ6IGdyb3VwPy5ncm91cElkID8/ICcnLFxyXG4gICAgICAgIGdyb3VwVHlwZUlkOiAnJyxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5nZXRHcm91cHNQYXlsb2FkLmdyb3VwVHlwZUlkID09PSAnJykge1xyXG4gICAgICB0aGlzLmdldEdyb3Vwc1BheWxvYWQgPSB7XHJcbiAgICAgICAgZ3JvdXBJZDogJycsXHJcbiAgICAgICAgZ3JvdXBUeXBlSWQ6ICcnLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncm91cHNTZXJ2aWNlXHJcbiAgICAgIC5nZXRHcm91cHModGhpcy5nZXRHcm91cHNQYXlsb2FkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlPy5zdGF0dXMpIHtcclxuICAgICAgICAgICAgaWYgKGdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jaGlsZEdyb3Vwc0luZm8gPSB0aGlzLnZpZXdHcm91cFJlc3BvbnNlKHJlc3BvbnNlPy5ib2R5KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnBhcmVudEdyb3Vwc0luZm8gPSB0aGlzLnZpZXdHcm91cFJlc3BvbnNlKHJlc3BvbnNlPy5ib2R5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcnMoZXJyb3IpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyBncm91cFR5cGUgaW5mbyB3aXRoIGdyb3VwIHJlc3BvbnNlIGZyb20gZ3JvdXBUeXBlIHJlc3BvbnNlXHJcbiAgICogQHBhcmFtIHtHcm91cEluZm9bXX0gcmVzcG9uc2VcclxuICAgKiBAcmV0dXJuIHsqfSAge0dyb3VwSW5mb1tdfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNDb21wb25lbnRcclxuICAgKi9cclxuICB2aWV3R3JvdXBSZXNwb25zZShyZXNwb25zZTogR3JvdXBJbmZvW10pOiBHcm91cEluZm9bXSB7XHJcbiAgICByZXNwb25zZT8uZm9yRWFjaCgobm9kZSkgPT4ge1xyXG4gICAgICBjb25zdCBncm91cFR5cGVJbmZvOiBHcm91cFR5cGUgPSB0aGlzLmdyb3VwVHlwZXNbbm9kZS5ncm91cFR5cGVdO1xyXG4gICAgICBub2RlLmdyb3VwVHlwZUluZm8gPSBncm91cFR5cGVJbmZvO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkcyB0aGUgZ3JvdXAgdHlwZXMuXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIGdldEdyb3VwVHlwZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyb3Vwc1NlcnZpY2VcclxuICAgICAgLmdldEdyb3VwVHlwZXMoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXMpID0+IHtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cykge1xyXG4gICAgICAgICAgICB0aGlzLmdyb3VwVHlwZXMgPSB0aGlzLmdyb3Vwc1NlcnZpY2U/LmdldEZvcm1hdHRlZEdyb3VwVHlwZXMoXHJcbiAgICAgICAgICAgICAgcmVzPy5ib2R5XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0R3JvdXBPcHRpb25zID0gdGhpcy5nZXRHcm91cFR5cGVPcHRpb25zKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cFR5cGUgPSB0aGlzLnNlbGVjdEdyb3VwT3B0aW9uc1swXTtcclxuICAgICAgICAgICAgdGhpcy5vbkdyb3VwVHlwZUZpbHRlcmVkKHRoaXMuc2VsZWN0ZWRHcm91cFR5cGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcnMoZXJyb3IpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBhbGVydHMgZm9yIHN1Y2Nlc3MsIGVycm9yIGFuZCB3YXJuaW5nLlxyXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IHN0cmluZ1tdKX0gbWVzc2FnZSAtc3VjY2VzcyBvciBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2UuXHJcbiAgICogQHBhcmFtIHtBbGVydFR5cGV9IGFsZXJ0VHlwZVxyXG4gICAqIEByZXR1cm4gLXJldHVybnMgbm90aGluZ1xyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNDb21wb25lbnRcclxuICAgKi9cclxuICBzaG93QWxlcnRNZXNzYWdlKGFsZXJ0VHlwZTogQWxlcnRUeXBlLCBtZXNzYWdlOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5hbGVydFNlcnZpY2U/LnNob3dNZXNzYWdlKHtcclxuICAgICAgc3RhdHVzOiAnY3VzdG9tJyxcclxuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcclxuICAgICAgYWxlcnRUeXBlOiBhbGVydFR5cGUsXHJcbiAgICAgIGlzQ2xvc2VOZWVkZWQ6IHRydWUsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhcHR1cmVzIHRoZSBzZXJ2ZXIgc2lkZSBlcnJvcnMgYW5kIGhhbmRsZXMgaXQgYmFzZWQgb24gdGhlIGN1c3RvbSBvciBIdHRwIGVycm9ycy5cclxuICAgKiBAcGFyYW0ge0h0dHBFcnJvclJlc3BvbnNlfSBlcnJvclxyXG4gICAqIEByZXR1cm4gLXJldHVybnMgbm90aGluZ1xyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNDb21wb25lbnRcclxuICAgKi9cclxuICBoYW5kbGVFcnJvcnMoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKTogdm9pZCB7XHJcbiAgICBjb25zdCBlcnJvckNvZGVzOiBzdHJpbmdbXSA9IGVycm9yPy5lcnJvcj8uYm9keT8uZXJyb3JDb2RlcztcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGVycm9yQ29kZXMpKSB7XHJcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZTogc3RyaW5nW10gPVxyXG4gICAgICAgIHRoaXMuZ3JvdXBzU2VydmljZT8ucGFyc2VFcnJvck1lc3NhZ2UoZXJyb3JDb2Rlcyk7XHJcbiAgICAgIGlmIChlcnJvckNvZGVzPy5pbmNsdWRlcygnMTAwOCcpKSB7XHJcbiAgICAgICAgZXJyb3JNZXNzYWdlWzBdID0gdGhpcy5kZWxldGVHcm91cE5hbWUgKyBlcnJvck1lc3NhZ2U/LlswXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNob3dBbGVydE1lc3NhZ2UoQWxlcnRUeXBlLkVSUk9SLCBlcnJvck1lc3NhZ2UpO1xyXG4gICAgfSBlbHNlIGlmIChlcnJvciAmJiBlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgIHRoaXMuZ2xvYmFsRXJyb3JIYW5kbGVyU2VydmljZT8uaGFuZGxlRXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmdPbkRlc3Ryb3kgcGVyZm9ybXMgbmVjZXNzYXJ5IGNsZWFudXAgdGFza3MsIHN1Y2ggYXMgdW5zdWJzY3JpYmluZyBmcm9tIHN1YnNjcmlwdGlvbiB3aGVuIHRoZSBjb21wb25lbnQgaXMgYmVpbmcgZGVzdHJveWVkLlxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNDb21wb25lbnRcclxuICAgKi9cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImllZWVzYS1ncm91cHMgcC0zIHAtc20tNCBwLW1kLTQgcC1sZy00XCI+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJpZWVlc2EtZ3JvdXBzX19pbmZvIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBwYi0zXCJcclxuICAgIFtuZ0NsYXNzXT1cIlxyXG4gICAgICBpc01vYmlsZVZpZXdcclxuICAgICAgICA/ICdpZWVlc2EtZ3JvdXBzX19pbmZvLS13aGl0ZS1iZydcclxuICAgICAgICA6ICdpZWVlc2EtZ3JvdXBzX19pbmZvLS1ibHVlLWJnJ1xyXG4gICAgXCJcclxuICA+XHJcbiAgICA8cFxyXG4gICAgICBbbmdDbGFzc109XCJpc01vYmlsZVZpZXcgPyAnaWVlZXNhLXRpdGxlLWxnLTI0JyA6ICdpZWVlc2EtaGVhZGxpbmUtbGctMzQnXCJcclxuICAgID5cclxuICAgICAge3sgZ3JvdXBzUGFnZUluZm8uZ3JvdXBzVGl0bGUgfX1cclxuICAgIDwvcD5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJpZWVlc2EtZ3JvdXBzX19jcmVhdGUtc3ViZ3JvdXAgbWF0LXRlcnRpYXJ5LWJ1dHRvbiBkLW5vbmUgZC1zbS1ub25lIGQtbWQtYmxvY2sgZC1sZy1ibG9jayBkLXhsLWJsb2NrXCJcclxuICAgICAgICAoY2xpY2spPVwib3BlbkNyZWF0ZUdyb3VwRm9ybSgpXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbnN0YW50cz8udmlld0dyb3Vwcz8uYXJpYUxhYmVsPy5hZGRHcm91cFwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBjb25zdGFudHM/LnZpZXdHcm91cHM/LmFkZEdyb3VwIH19XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiZC1mbGV4IGQtc20tZmxleCBkLW1kLW5vbmUgZC1sZy1ub25lIGQteGwtbm9uZSBpZWVlc2EtZ3JvdXBzX19tb2JpbGUtaWNvbnMgZ2FwLTJcIlxyXG4gICAgPlxyXG4gICAgICA8aWVlZXNhLWljb24tYnV0dG9uXHJcbiAgICAgICAgW2ljb25CdXR0b25dPVwiY3JlYXRlR3JvdXBJY29uXCJcclxuICAgICAgICAoaWNvbkJ1dHRvbkNsaWNrKT1cIm9wZW5DcmVhdGVHcm91cEZvcm0oKVwiXHJcbiAgICAgID5cclxuICAgICAgPC9pZWVlc2EtaWNvbi1idXR0b24+XHJcbiAgICAgIDxpZWVlc2EtaWNvbi1idXR0b25cclxuICAgICAgICBbaWNvbkJ1dHRvbl09XCJmaWx0ZXJHcm91cEljb25cIlxyXG4gICAgICAgIChpY29uQnV0dG9uQ2xpY2spPVwic2hvd0dyb3VwRmlsdGVyKClcIlxyXG4gICAgICA+XHJcbiAgICAgIDwvaWVlZXNhLWljb24tYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29uc3RhbnRzPy52aWV3R3JvdXBzPy5hcmlhTGFiZWw/LnNlYXJjaFwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uR3JvdXBTZWFyY2goKVwiXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgID5cclxuICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLW1hZ25pZnlpbmctZ2xhc3Mgc2VhcmNoLWdyb3VwLWljb25cIj48L2k+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJpZWVlc2EtZ3JvdXBzX19hY3Rpb25zXCJcclxuICAgIFtuZ0NsYXNzXT1cIlxyXG4gICAgICBpc01vYmlsZVZpZXdcclxuICAgICAgICA/ICdpZWVlc2EtZ3JvdXBzX19hY3Rpb25zLS13aGl0ZS1iZydcclxuICAgICAgICA6ICdpZWVlc2EtZ3JvdXBzX19hY3Rpb25zLS1ibHVlLWJnJ1xyXG4gICAgXCJcclxuICA+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaWVlZXNhLWdyb3Vwc19fYWN0aW9ucy0tc2VhcmNoIHJvd1wiPlxyXG4gICAgICA8cFxyXG4gICAgICAgIGNsYXNzPVwiaWVlZXNhLWJvZHktbWQtMTYgb3JkZXItMiBvcmRlci1zbS0xIGNvbC0xMiBjb2wtbWQtNyBjb2wtbGctNyBjb2wteGwtN1wiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBncm91cHNQYWdlSW5mby5ncm91cHNEZXNjcmlwdGlvbiB9fVxyXG4gICAgICA8L3A+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgKChpc0dyb3VwU2VhcmNoQWN0aXZlIHx8IGlzR3JvdXBGaWx0ZXJBY3RpdmUpICYmIGlzTW9iaWxlVmlldykgfHxcclxuICAgICAgICAgICFpc01vYmlsZVZpZXdcclxuICAgICAgICBcIlxyXG4gICAgICAgIGNsYXNzPVwib3JkZXItMSBvcmRlci1zbS0yIGNvbC0xMiBjb2wtbWQtNSBjb2wtbGctNSBjb2wteGwtNSBkLWZsZXggZmxleC1jb2x1bW5cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGllZWVzYS1zZWFyY2hcclxuICAgICAgICAgICpuZ0lmPVwiaXNHcm91cFNlYXJjaEFjdGl2ZSB8fCAhaXNNb2JpbGVWaWV3XCJcclxuICAgICAgICAgIChzZWFyY2hWYWx1ZSk9XCJvbkdyb3VwU2VhcmNoQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJMYWJlbF09XCJzZWFyY2hQbGFjZUhvbGRlclRleHRcIlxyXG4gICAgICAgID48L2llZWVzYS1zZWFyY2g+XHJcbiAgICAgICAgPGllZWVzYS1zZWxlY3RcclxuICAgICAgICAgICpuZ0lmPVwiaXNHcm91cEZpbHRlckFjdGl2ZSB8fCAhaXNNb2JpbGVWaWV3XCJcclxuICAgICAgICAgIGNsYXNzPVwiYWxpZ24tc2VsZi1lbmQgcHQtbGctNCBwdC1tZC00IHB0LXhsLTRcIlxyXG4gICAgICAgICAgW2Ryb3Bkb3duT3B0aW9uc109XCJzZWxlY3RHcm91cE9wdGlvbnNcIlxyXG4gICAgICAgICAgW2lzTGFiZWxBbGlnbmVkTGVmdF09XCJ0cnVlXCJcclxuICAgICAgICAgIFtzZWxlY3RMYWJlbF09XCJjb25zdGFudHM/LnZpZXdHcm91cHM/LmZpbHRlckJ5TGFiZWxcIlxyXG4gICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uR3JvdXBUeXBlRmlsdGVyZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJUZXh0XT1cImZpbHRlclBsYWNlSG9sZGVyVGV4dFwiXHJcbiAgICAgICAgICBbc2VsZWN0ZWRPcHRpb25zXT1cInNlbGVjdGVkR3JvdXBUeXBlXCJcclxuICAgICAgICA+PC9pZWVlc2Etc2VsZWN0PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGllZWVzYS10cmVlXHJcbiAgICAgICpuZ0lmPVwicGFyZW50R3JvdXBzSW5mbyAmJiBwYXJlbnRHcm91cHNJbmZvLmxlbmd0aCA+IDBcIlxyXG4gICAgICBbcGFyZW50R3JvdXBzSW5mb109XCJwYXJlbnRHcm91cHNJbmZvXCJcclxuICAgICAgW2NoaWxkR3JvdXBzSW5mb109XCJjaGlsZEdyb3Vwc0luZm9cIlxyXG4gICAgICBbZGVsZXRlZEdyb3VwSWRJbmZvXT1cImRlbGV0ZWRHcm91cElkXCJcclxuICAgICAgW2lzR3JvdXBTZWFyY2hPckZpbHRlckFjdGl2ZV09XCJpc0dyb3VwU2VhcmNoT3JGaWx0ZXJBY3RpdmVcIlxyXG4gICAgICAodG9nZ2xlR3JvdXBDbGljayk9XCJnZXRHcm91cHMoJGV2ZW50KVwiXHJcbiAgICAgIChjcmVhdGVHcm91cENsaWNrKT1cIm9wZW5DcmVhdGVHcm91cEZvcm0oJGV2ZW50KVwiXHJcbiAgICAgIChkZWxldGVHcm91cENsaWNrKT1cIm9wZW5EZWxldGVDb25maXJtYXRpb25Nb2RhbCgkZXZlbnQpXCJcclxuICAgICAgKHZpZXdSb3N0ZXJDbGljayk9XCJ2aWV3Um9zdGVyKCRldmVudClcIlxyXG4gICAgICAoZWRpdEdyb3VwQ2xpY2spPVwib3BlbkVkaXRHcm91cEZvcm0oJGV2ZW50KVwiXHJcbiAgICA+PC9pZWVlc2EtdHJlZT5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJwYXJlbnRHcm91cHNJbmZvICYmIHBhcmVudEdyb3Vwc0luZm8ubGVuZ3RoID4gMFwiXHJcbiAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGZsZXgtc20tcm93IGZsZXgtbWQtcm93IG10LTQganVzdGlmeS1jb250ZW50LXN0YXJ0IGp1c3RpZnktY29udGVudC1zbS1lbmRcIlxyXG4gICAgPlxyXG4gICAgICA8cCBjbGFzcz1cInB4LXNtLTMgZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IGllZWVzYS1sYWJlbC1sZy1ib2xkLTE2XCI+XHJcbiAgICAgICAge3sgY29uc3RhbnRzPy52aWV3R3JvdXBzPy5sZWdlbmQgfX1cclxuICAgICAgPC9wPlxyXG4gICAgICA8aWVlZXNhLWxlZ2VuZCBbbGVnZW5kc109XCJncm91cHNMZWdlbmRzXCIgW2lzU29ydGluZ109XCJpc1NvcnRpbmdcIj48L2llZWVzYS1sZWdlbmQ+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
@@ -2347,10 +2347,7 @@ class GroupsComponent {
|
|
|
2347
2347
|
break;
|
|
2348
2348
|
}
|
|
2349
2349
|
case GroupFunctionType?.ADD_USER_TO_ROSTER: {
|
|
2350
|
-
|
|
2351
|
-
this.groupsService.canShowMessage = true;
|
|
2352
|
-
this.viewRoster(this.groupsService.selectedGroupInfo);
|
|
2353
|
-
}
|
|
2350
|
+
this.groupsService.canShowMessage = true;
|
|
2354
2351
|
break;
|
|
2355
2352
|
}
|
|
2356
2353
|
default:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ieeesa-npm-groups.mjs","sources":["../../../projects/groups/src/lib/assets/form-validations.ts","../../../projects/groups/src/lib/models/form-status.model.ts","../../../projects/groups/src/lib/models/group-function-type.model.ts","../../../projects/groups/src/lib/services/groups.service.ts","../../../projects/groups/src/lib/components/create-group/create-group.component.ts","../../../projects/groups/src/lib/components/create-group/create-group.component.html","../../../projects/groups/src/lib/models/group-action.model.ts","../../../projects/groups/src/lib/components/tree-view/tree-view.component.ts","../../../projects/groups/src/lib/components/tree-view/tree-view.component.html","../../../projects/groups/src/lib/components/add-user-roster/add-user-roster.component.ts","../../../projects/groups/src/lib/components/add-user-roster/add-user-roster.component.html","../../../projects/groups/src/lib/components/view-roster/view-roster.component.ts","../../../projects/groups/src/lib/components/view-roster/view-roster.component.html","../../../projects/groups/src/lib/groups.component.ts","../../../projects/groups/src/lib/groups.component.html","../../../projects/groups/src/lib/groups.module.ts","../../../projects/groups/src/public-api.ts","../../../projects/groups/src/ieeesa-npm-groups.ts"],"sourcesContent":["/* eslint-disable no-useless-escape */\r\nexport const GroupsValidationPatterns = {\r\n // Group Name field regular expression, which accept Alpha Numeric, Special Characters (ASCII) and whitespace.\r\n groupName: /^(?=.*[a-zA-Z])[\\w\\s!\"#$%&'()*+,-.\\/\\:;<=>?@[\\]^_`{|}~\\\\]+$/i,\r\n // Group Short Name field regular expression which accept letters, numbers and \".\",\",\" , \"/\", \"-\" , \"_\" characters.\r\n shortName: /^(?=[a-zA-Z0-9])[a-zA-Z0-9.,\\/\\-_]+$/,\r\n // Group Scope field regular expression which accept Alpha Numeric, Special Characters and whitespace.\r\n groupScope: /^(?=.*[a-zA-Z])[\\w\\s!\"#$%&'()*+,-.\\/\\:;<=>?@[\\]^_`{|}~\\\\]+$/i,\r\n email: /^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$/,\r\n};","/* eslint-disable no-unused-vars */\r\nexport enum FormStatus {\r\n VALID = \"VALID\",\r\n INVALID = \"INVALID\",\r\n}","/* eslint-disable no-unused-vars */\r\nexport enum GroupFunctionType {\r\n CREATE = 'CREATE',\r\n EDIT = 'EDIT',\r\n VIEW_ROSTER = 'VIEW_ROSTER',\r\n FILTER = 'FILTER',\r\n ADD_USER_TO_ROSTER = 'ADD_USER_TO_ROSTER',\r\n TOGGLE = 'TOGGLE',\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, map, catchError, BehaviorSubject } from 'rxjs';\r\nimport {\r\n CreateGroupPayload,\r\n CreateGroupResponse,\r\n} from '../models/create-group.model';\r\nimport {\r\n GroupTypeConfiguration,\r\n GroupTypeConfigValue,\r\n GroupTypeResponse,\r\n} from '../models/group-types.model';\r\nimport { AlertsService, HttpService } from '@ieeesa-npm/utility';\r\nimport { GetGroupResponse, GetGroupsPayload } from '../models/view-group.model';\r\nimport * as screenTexts from '../assets/constants.json';\r\nimport { DeleteGroupPayload } from '../models/delete-group.model';\r\nimport { GroupInfo } from '../models/group-info.model';\r\nimport {\r\n SearchUsersPayload,\r\n FilterUsersByRolesPayload,\r\n GetGroupUsersResponse,\r\n User,\r\n} from '../models/user.model';\r\nimport { Role } from '../models/role.model';\r\nimport { CheckboxOption } from '@ieeesa-npm/presentation';\r\nimport { EditGroupPayload } from '../models/edit-group.model';\r\nimport { GroupFunctionType } from '../models/group-function-type.model';\r\nimport {\r\n AddNewUserPayload,\r\n GetUserDetailsPayload,\r\n SearchUserByEmailResponse,\r\n GroupUserDetailsResponse,\r\n} from '../models/add-new-user.model';\r\n\r\n/**\r\n * Groups service is an abstract layer and responsible for managing groups REST API calls.\r\n * @class GroupsService\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GroupsService {\r\n groupsText = screenTexts?.errors;\r\n apiBaseUrl!: string;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n userPermission: any;\r\n selectedGroupInfo!: GroupInfo | undefined;\r\n groupFunctionType!: GroupFunctionType;\r\n selectedGroupParentInfo!: GroupInfo | undefined;\r\n openModalNotifier = new BehaviorSubject<GroupFunctionType>(\r\n GroupFunctionType.VIEW_ROSTER\r\n );\r\n groupTypeRoles!: CheckboxOption[];\r\n canShowMessage = false;\r\n // eslint-disable-next-line no-empty-function, no-unused-vars\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private httpService: HttpService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService // eslint-disable-next-line no-empty-function\r\n ) {}\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setAppConfig(apiBaseUrl: string, userPermission: any) {\r\n this.apiBaseUrl = apiBaseUrl;\r\n this.userPermission = userPermission;\r\n }\r\n /**\r\n * Gets application group types from API and returns it as an observable.\r\n * @return {Observable<GroupTypeResponse>} -It returns group types if success else error.\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n getGroupTypes(): Observable<GroupTypeResponse> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/configurations/group_type`)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Returns all the groups based on passed group Id and group type.\r\n * @param {GetGroupsPayload} getGroupsPayload\r\n * @return {Observable<GetGroupResponse>}\r\n * @memberof GroupsService\r\n */\r\n getGroups(getGroupsPayload: GetGroupsPayload): Observable<GetGroupResponse> {\r\n let url = 'rootGroups';\r\n if (getGroupsPayload.groupId)\r\n url = 'immChildGroupsByGroupId/' + getGroupsPayload.groupId;\r\n else if (getGroupsPayload.groupTypeId)\r\n url = 'groupsByGroupType/' + getGroupsPayload.groupTypeId;\r\n\r\n return this.httpService.getData(`${this.apiBaseUrl}/groups/${url}`).pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n /**\r\n * Deletes a group based on the provided information\r\n * @param {groupId} string -groupId of the group which is to be deleted\r\n * @return {*} {Observable<any>} -Observable representing the group deletion response\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n deleteGroup(deleteGroupPayload: DeleteGroupPayload): Observable<any> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/delete`, deleteGroupPayload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Posts create group form data to server using HttpService for creating new group.\r\n * @param {CreateGroupPayload} createGroupPayload -create group form data which includes group name, type, short name, scope.\r\n * @return {Observable<CreateGroupResponse>} -returns create group API response (success or error) as an observable.\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n createGroup(\r\n createGroupPayload: CreateGroupPayload\r\n ): Observable<CreateGroupResponse> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/create`, createGroupPayload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Updates group form data to server using HttpService.\r\n * @param {EditGroupPayload} editGroupPayload -edit group form data which includes group name, short name, scope.\r\n * @return {Observable<EditGroupPayload>} -returns edit group API response (success or error) as an observable.\r\n * @memberof GroupsService\r\n */\r\n editGroup(\r\n editGroupPayload: EditGroupPayload\r\n ): Observable<CreateGroupResponse> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/edit`, editGroupPayload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * This method will parse the error codes and return the respective error message for each code.\r\n * @param {string[]} errorCodes\r\n * @return {string[]} errorMessage\r\n * @memberof GroupsService\r\n */\r\n parseErrorMessage(errorCodes: string[]) {\r\n const errorMessage: string[] = [];\r\n errorCodes?.forEach((item: string, index: number) => {\r\n const errorMessageKey = errorCodes[index] as keyof typeof this.groupsText;\r\n errorMessage.push(this.groupsText[errorMessageKey]);\r\n });\r\n return errorMessage;\r\n }\r\n\r\n /**\r\n * Sets selected group info.\r\n * @param {(GroupInfo | undefined)} selectedGroupInfo -selected group info.\r\n * @param {(GroupInfo | undefined)} [selectedGroupParentInfo] -selected parent group info.\r\n * @memberof GroupsService\r\n */\r\n setSelectedGroupInfo(\r\n selectedGroupInfo: GroupInfo | undefined,\r\n selectedGroupParentInfo?: GroupInfo | undefined\r\n ) {\r\n this.selectedGroupInfo = selectedGroupInfo;\r\n this.selectedGroupParentInfo = selectedGroupParentInfo;\r\n }\r\n\r\n /**\r\n * Returns the selected group info.\r\n * @return {(GroupInfo | undefined)} -group info.\r\n * @memberof GroupsService\r\n */\r\n getSelectedGroupInfo(): GroupInfo | undefined {\r\n return this.selectedGroupInfo;\r\n }\r\n\r\n /**\r\n * Returns the selected group parent group info.\r\n * @return {(GroupInfo | undefined)} -group info.\r\n * @memberof GroupsService\r\n */\r\n getSelectedGroupParentInfo(): GroupInfo | undefined {\r\n return this.selectedGroupParentInfo;\r\n }\r\n\r\n /**\r\n * Sets group function type.\r\n * @param {GroupFunctionType} groupFunctionType -group function type.\r\n * @memberof GroupsService\r\n */\r\n setGroupFunctionType(groupFunctionType: GroupFunctionType): void {\r\n this.groupFunctionType = groupFunctionType;\r\n }\r\n\r\n /**\r\n * Returns group function type.\r\n * @return {GroupFunctionType} -group function type.\r\n * @memberof GroupsService\r\n */\r\n getGroupFunctionType(): GroupFunctionType {\r\n return this.groupFunctionType;\r\n }\r\n\r\n /**\r\n * Gets the group users for the given group id.\r\n * @param {string} groupId\r\n * @return {Observable<GetGroupUsersResponse>}\r\n * @memberof GroupsService\r\n */\r\n getGroupUsers(groupId: string): Observable<GetGroupUsersResponse> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/roster/${groupId}`)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the group users based on the filtered roles.\r\n * @param {FilterUsersByRolesPayload} payload\r\n * @return {Observable<GetGroupUsersResponse>}\r\n * @memberof GroupsService\r\n */\r\n getGroupUsersByRoles(\r\n payload: FilterUsersByRolesPayload\r\n ): Observable<GetGroupUsersResponse> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/roster/groupUsersByRole`, payload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the group users based on searched name or email\r\n * @param {SearchUsersPayload} payload\r\n * @return {Observable<GetGroupUsersResponse>}\r\n * @memberof GroupsService\r\n */\r\n searchGroupUsers(\r\n payload: SearchUsersPayload\r\n ): Observable<GetGroupUsersResponse> {\r\n return this.httpService\r\n .postData(\r\n `${this.apiBaseUrl}/groups/roster/groupUsersByRoleByNameByEmail`,\r\n payload\r\n )\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the group roles based on the group type.\r\n * @param {string} groupTypeId\r\n * @return {Observable<CheckboxOption[]>}\r\n * @memberof GroupsService\r\n */\r\n getGroupTypeRoles(groupTypeId: string): Observable<CheckboxOption[]> {\r\n return this.httpService\r\n .getData(\r\n `${this.apiBaseUrl}/groups/config/rolesByGroupType/${groupTypeId}`\r\n )\r\n .pipe(\r\n map((response) => {\r\n const rolesOption: CheckboxOption[] = [];\r\n response?.body?.forEach((role: Role) => {\r\n rolesOption.push({\r\n id: role.roleId,\r\n name: role.roleName,\r\n disabled: false,\r\n checked: false,\r\n });\r\n });\r\n this.setGroupTypeUserRoles(rolesOption);\r\n return rolesOption;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Concatenates the group users assigned roles name separated by comma as string and returns the group users in an array.\r\n * @param {GetGroupUsersResponse} response\r\n * @return {User[]}\r\n * @memberof GroupsService\r\n */\r\n transformUserRolesNameAsString(response: GetGroupUsersResponse): User[] {\r\n const users: User[] = [];\r\n response?.body?.forEach((item) => {\r\n const roles: string[] = [];\r\n item?.rolesList?.forEach((role) => roles.push(role?.roleName));\r\n users.push({\r\n userId: item.userId,\r\n name: item.name,\r\n email: item.email,\r\n role: roles.join(', '),\r\n });\r\n });\r\n return users;\r\n }\r\n /**\r\n * Returns formatted group types.\r\n * @param {GroupTypeConfiguration[]} groupTypeResponse\r\n * @return {GroupTypeConfigValue}\r\n * @memberof GroupsService\r\n */\r\n getFormattedGroupTypes(\r\n groupTypeResponse: GroupTypeConfiguration[]\r\n ): GroupTypeConfigValue {\r\n const groupTypes: GroupTypeConfigValue = {};\r\n groupTypeResponse.forEach((item) => {\r\n groupTypes[item.configFieldId] = item.configFieldValue;\r\n });\r\n return groupTypes;\r\n }\r\n\r\n /**\r\n * Returns group user details if email is found, else throws error.\r\n * @param {string} email\r\n * @return {Observable<SearchUserByEmailResponse>}\r\n * @memberof GroupsService\r\n */\r\n getUserByEmail(email: string): Observable<SearchUserByEmailResponse> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/users/userByEmail/${email}`)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the user details for the selected group\r\n * @param {GetUserDetailsPayload} payload\r\n * @return {Observable<GroupUserDetailsResponse>}\r\n * @memberof GroupsService\r\n */\r\n getGroupUserDetails(\r\n payload: GetUserDetailsPayload\r\n ): Observable<GroupUserDetailsResponse> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/roster/userDetails`, payload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Posts add new user form data to the API for the selected group and returns the success or failure response.\r\n * @param {AddNewUserPayload} addNewUserPayload\r\n * @return {Observable<GroupUserDetailsResponse>}\r\n * @memberof GroupsService\r\n */\r\n addNewGroupUser(\r\n addNewUserPayload: AddNewUserPayload\r\n ): Observable<GroupUserDetailsResponse> {\r\n return this.httpService\r\n .postData(\r\n `${this.apiBaseUrl}/groups/roster/createGroupUserRole`,\r\n addNewUserPayload\r\n )\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Sets the loaded group type user roles\r\n * @param {CheckboxOption[]} userRoles\r\n * @memberof GroupsService\r\n */\r\n setGroupTypeUserRoles(userRoles: CheckboxOption[]): void {\r\n this.groupTypeRoles = userRoles;\r\n }\r\n\r\n /**\r\n * Returns the group type user roles.\r\n * @return {CheckboxOption[]}\r\n * @memberof GroupsService\r\n */\r\n getGroupTypeUserRoles(): CheckboxOption[] {\r\n return this.groupTypeRoles;\r\n }\r\n}\r\n","import {\r\n Component,\r\n EventEmitter,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormGroup, Validators } from '@angular/forms';\r\nimport {\r\n FormGrid,\r\n FormModel,\r\n SelectOption,\r\n DynamicFormComponent,\r\n FormControlType,\r\n AlignType,\r\n FieldConfig,\r\n} from '@ieeesa-npm/presentation';\r\nimport {\r\n AlertsService,\r\n AlertType,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport * as screenTexts from '../../assets/constants.json';\r\nimport { GroupsValidationPatterns } from '../../assets/form-validations';\r\nimport { CreateGroupPayload } from '../../models/create-group.model';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { GroupType } from '../../models/group-types.model';\r\nimport { GroupInfo } from '../../models/group-info.model';\r\nimport { EditGroupPayload } from '../../models/edit-group.model';\r\nimport { FormStatus } from '../../models/form-status.model';\r\nimport { GroupFunctionType } from '../../models/group-function-type.model';\r\n\r\n/**\r\n * CreateGroupComponent uses DynamicFormComponent to build create new group form and implement the functionalities of submission of form and handling success and error scenarios.\r\n * @class CreateGroupComponent\r\n * @implements {OnInit}\r\n * @implements {OnDestroy}\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'ieeesa-create-group',\r\n standalone: true,\r\n imports: [CommonModule, DynamicFormComponent, MatDialogModule],\r\n templateUrl: './create-group.component.html',\r\n styleUrls: ['./create-group.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [AlertsService],\r\n})\r\nexport class CreateGroupComponent implements OnInit, OnDestroy {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n /**\r\n * Event emitted when the form is successfully submitted.\r\n * @memberof CreateGroupComponent\r\n */\r\n @Output() submitFormResponse = new EventEmitter();\r\n /**\r\n * Event emitted when the form is cancelled.\r\n * @memberof CreateGroupComponent\r\n */\r\n @Output() formCancel = new EventEmitter();\r\n createGroupText = screenTexts?.createGroup;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n leftButtonLabel = this.createGroupText?.label?.leftButtonLabel;\r\n rightButtonLabel = this.createGroupText?.label?.rightButtonLabel;\r\n isLegendVisible = false;\r\n isLeftButtonNeeded = true;\r\n colWidth: FormGrid = { xs: 12, xl: 12, sm: 12, md: 12, lg: 12 };\r\n formGroup!: FormModel;\r\n groupTypes!: SelectOption[];\r\n actionButtonAlign = AlignType.LEFT;\r\n form!: FormGroup;\r\n selectedGroupInfo!: GroupInfo | undefined;\r\n groupFunctionType!: GroupFunctionType;\r\n selectedGroupParentInfo!: GroupInfo | undefined;\r\n // eslint-disable-next-line no-unused-vars, no-empty-function\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private groupsService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private globalErrorHandlerService: GlobalErrorHandlerService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService // eslint-disable-next-line no-empty-function\r\n ) {}\r\n\r\n /**\r\n * Initialize the create group form group array and component.\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n ngOnInit(): void {\r\n this.groupFunctionType = this.groupsService?.getGroupFunctionType();\r\n this.selectedGroupInfo = this.groupsService?.getSelectedGroupInfo();\r\n if (this.groupFunctionType === GroupFunctionType.EDIT) {\r\n this.selectedGroupParentInfo =\r\n this.groupsService?.getSelectedGroupParentInfo();\r\n this.createFormGroup();\r\n } else {\r\n this.groupsService\r\n .getGroupTypes()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n const groupTypes = this.groupsService?.getFormattedGroupTypes(res?.body);\r\n if (this.selectedGroupInfo?.groupType) {\r\n const allowedGroupType =\r\n groupTypes[this.selectedGroupInfo?.groupType]\r\n ?.businessRule?.allowedGroupType;\r\n if (allowedGroupType?.length) {\r\n this.groupTypes = allowedGroupType.map(\r\n (groupTypeId: string) => ({\r\n id: groupTypeId,\r\n name: groupTypes[groupTypeId]?.name,\r\n })\r\n );\r\n } else {\r\n this.showAlertMessage(\r\n screenTexts?.errors?.ER1000,\r\n AlertType.ERROR\r\n );\r\n }\r\n } else {\r\n this.groupTypes = Object.entries(groupTypes).map(\r\n ([id, item]: [string, GroupType]) => ({\r\n id,\r\n name: item?.name,\r\n })\r\n );\r\n }\r\n if (this.groupTypes?.length) {\r\n this.createFormGroup();\r\n } else {\r\n this.showAlertMessage(\r\n screenTexts?.errors?.['1010'],\r\n AlertType.ERROR\r\n );\r\n }\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Constructs and returns the group type form field based on edit group or not.\r\n * @return {FieldConfig} -group type form field.\r\n * @memberof CreateGroupComponent\r\n */\r\n getGroupTypeField(): FieldConfig {\r\n let groupTypeField: FieldConfig;\r\n if (this.groupFunctionType === GroupFunctionType.EDIT) {\r\n groupTypeField = {\r\n type: FormControlType?.TEXT_AREA,\r\n label: this.createGroupText?.label?.groupType,\r\n controlName: 'groupType',\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n value: this.selectedGroupInfo?.groupTypeInfo?.name,\r\n ariaLabel: this.constants?.editGroup?.ariaLabel?.groupType,\r\n isResize: true,\r\n };\r\n } else {\r\n groupTypeField = {\r\n type: FormControlType?.SELECT,\r\n label: this.createGroupText?.label?.groupType + '*',\r\n controlName: 'groupType',\r\n requiredErrorMessage: this.createGroupText?.message?.error?.required,\r\n value: '',\r\n validation: [Validators.required],\r\n dropdownOptions: this.groupTypes,\r\n supportMessage: this.createGroupText?.supportText?.groupType,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.groupType,\r\n placeholder: '',\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.groupType,\r\n };\r\n }\r\n return groupTypeField;\r\n }\r\n\r\n /**\r\n * Initialize the create group form group array.\r\n * @memberof CreateGroupComponent\r\n */\r\n createFormGroup(): void {\r\n this.formGroup = {\r\n formGroup: [\r\n {\r\n legend: '',\r\n controls: [\r\n this.getGroupTypeField(),\r\n {\r\n type: FormControlType?.INPUT,\r\n label: this.createGroupText?.label?.groupName + '*',\r\n controlName: 'groupName',\r\n requiredErrorMessage:\r\n this.createGroupText?.message?.error?.required,\r\n value:\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.selectedGroupInfo?.groupName\r\n : '',\r\n placeholder: '',\r\n supportMessage: this.createGroupText?.supportText?.groupName,\r\n patternErrorMessage:\r\n this.createGroupText?.message?.error?.pattern?.groupName,\r\n validation: [\r\n Validators.required,\r\n Validators.maxLength(\r\n screenTexts?.createGroup?.characterLimit?.character500\r\n ),\r\n Validators.pattern(GroupsValidationPatterns?.groupName),\r\n ],\r\n maxErrorMessage:\r\n this.createGroupText?.message?.error?.limit?.groupName,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.groupName,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.groupName,\r\n },\r\n {\r\n type: FormControlType?.INPUT,\r\n label: this.createGroupText?.label?.shortName + '*',\r\n controlName: 'shortName',\r\n requiredErrorMessage:\r\n this.createGroupText?.message?.error?.required,\r\n value:\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.selectedGroupInfo?.groupShortName\r\n : '',\r\n patternErrorMessage:\r\n this.createGroupText?.message?.error?.pattern?.shortName,\r\n placeholder: '',\r\n supportMessage: this.createGroupText?.supportText?.shortName,\r\n validation: [\r\n Validators.required,\r\n Validators.maxLength(\r\n screenTexts?.createGroup?.characterLimit?.character15\r\n ),\r\n Validators.pattern(GroupsValidationPatterns?.shortName),\r\n ],\r\n maxErrorMessage:\r\n this.createGroupText?.message?.error?.limit?.shortName,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.shortName,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.shortName,\r\n },\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.createGroupText?.label?.groupScope,\r\n controlName: 'groupScope',\r\n patternErrorMessage:\r\n this.createGroupText?.message?.error?.pattern?.groupScope,\r\n value:\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.selectedGroupInfo?.groupDesc\r\n : '',\r\n placeholder: '',\r\n supportMessage: this.createGroupText?.supportText?.groupScope,\r\n isResize: true,\r\n maxLength:\r\n screenTexts?.createGroup?.characterLimit?.character2000,\r\n validation: [\r\n Validators.maxLength(\r\n screenTexts?.createGroup?.characterLimit?.character1500\r\n ),\r\n Validators.pattern(GroupsValidationPatterns?.groupScope),\r\n ],\r\n maxErrorMessage:\r\n this.createGroupText?.message?.error?.limit?.groupScope,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.groupScope,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.groupScope,\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n if (this.selectedGroupInfo?.groupId) {\r\n this.updateCreateFormGroup(this.selectedGroupInfo);\r\n }\r\n }\r\n\r\n /**\r\n * Update the create sub group form group array.\r\n * @param {GroupInfo} parentGroupInfo -Parent group info.\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n updateCreateFormGroup(parentGroupInfo: GroupInfo): void {\r\n const parentGroup = {\r\n type: FormControlType?.TEXT_AREA,\r\n label: this.createGroupText?.label?.parentGroup,\r\n controlName: 'parentGroup',\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n value:\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.selectedGroupParentInfo?.groupName\r\n : parentGroupInfo?.groupName,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.parentGroup,\r\n isResize: true,\r\n };\r\n if (parentGroup?.value) {\r\n this.formGroup?.formGroup[0]?.controls?.unshift(parentGroup);\r\n }\r\n }\r\n\r\n /**\r\n * Handles client side validation and calls create group or edit group methods.\r\n * @param {FormGroup[]} form -Array of formGroup\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n onFormSubmit(form: FormGroup[]): void {\r\n form[0]?.markAllAsTouched();\r\n if (form[0].status === FormStatus.VALID) {\r\n const formData = form[0]?.getRawValue();\r\n // eslint-disable-next-line no-unused-expressions\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.editGroup(formData)\r\n : this.createGroup(formData);\r\n }\r\n }\r\n\r\n /**\r\n * Constructs create group payload and calls create group API and emits create group API response.\r\n * @param formData\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n createGroup(formData: any): void {\r\n const createGroupPayload: CreateGroupPayload = {\r\n payload: {\r\n groupName: formData?.groupName,\r\n groupShortName: formData?.shortName,\r\n groupType: formData?.groupType?.id,\r\n groupDesc: formData?.groupScope,\r\n groupParentId: this.selectedGroupInfo?.groupId ?? null,\r\n },\r\n };\r\n this.groupsService\r\n .createGroup(createGroupPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.submitFormResponse?.emit(res);\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Constructs edit group payload and calls edit group API and emits create group API response.\r\n * @param {*} formData\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n editGroup(formData: any): void {\r\n const editGroupPayload: EditGroupPayload = {\r\n payload: {\r\n groupName: formData?.groupName,\r\n groupShortName: formData?.shortName,\r\n groupDesc: formData?.groupScope,\r\n groupParentId: this.selectedGroupInfo?.groupParentId ?? null,\r\n groupId: this.selectedGroupInfo?.groupId as string,\r\n },\r\n };\r\n this.groupsService\r\n .editGroup(editGroupPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.submitFormResponse?.emit(res);\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Captures the server side errors and handles the errors based on the custom or Http errors.\r\n * @param {HttpErrorResponse} error\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n handleErrors(error: HttpErrorResponse): void {\r\n const errorCodes: string[] = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes)) {\r\n const errorMessage: string[] =\r\n this.groupsService?.parseErrorMessage(errorCodes);\r\n this.showAlertMessage(errorMessage, AlertType.ERROR);\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService?.handleError(error);\r\n }\r\n }\r\n\r\n /**\r\n * Get form reference.\r\n * @param {FormGroup[]} form\r\n * @memberof CreateGroupComponent\r\n */\r\n getFormGroupReference(form: FormGroup[]) {\r\n this.form = form[0];\r\n }\r\n\r\n /**\r\n * Handles alerts for error, warning.\r\n * @param {(string | string[])} message -error or warning message\r\n * @param {AlertType} alertType\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n showAlertMessage(message: string | string[], alertType: AlertType): void {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: message,\r\n alertType: alertType,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n\r\n /**\r\n * Emits form cancel event.\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n createGroupCancelled(): void {\r\n this.formCancel?.emit();\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof CreateGroupComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<ieeesa-dynamic-form\r\n *ngIf=\"formGroup\"\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLegendVisible]=\"isLegendVisible\"\r\n [colWidth]=\"colWidth\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n [formGroups]=\"formGroup\"\r\n [isLeftButtonNeeded]=\"isLeftButtonNeeded\"\r\n (formSubmit)=\"onFormSubmit($event)\"\r\n (formLeftButtonClicked)=\"createGroupCancelled()\"\r\n (formGroupsReference)=\"getFormGroupReference($event)\"\r\n></ieeesa-dynamic-form>","/* eslint-disable no-unused-vars */\r\nexport enum GroupAction {\r\n VIEW_ROSTER = 1,\r\n CREATE_SUB_GROUP = 2,\r\n EDIT_GROUP = 3,\r\n DELETE_GROUP = 4,\r\n EXPAND_GROUP_VIEW = 5,\r\n COLLAPSE_GROUP_VIEW = 6,\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Injectable,\r\n Input,\r\n OnInit,\r\n Output,\r\n AfterViewInit,\r\n OnDestroy,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport {\r\n MenuComponent,\r\n Menu,\r\n IconButtonComponent,\r\n IconButton,\r\n TextTruncatedDirective\r\n} from '@ieeesa-npm/presentation';\r\nimport * as constants from '../../assets/constants.json';\r\nimport { GroupAction } from '../../models/group-action.model';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n CollectionViewer,\r\n SelectionChange,\r\n DataSource,\r\n} from '@angular/cdk/collections';\r\nimport { FlatTreeControl } from '@angular/cdk/tree';\r\nimport { BehaviorSubject, merge, Observable, Subject } from 'rxjs';\r\nimport { map, takeUntil } from 'rxjs/operators';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTreeModule, MatTreeNodePadding } from '@angular/material/tree';\r\nimport { GroupInfo } from '../../models/group-info.model';\r\nimport { EditGroupAndParentInfo } from '../../models/edit-group.model';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { GroupFunctionType } from '../../models/group-function-type.model';\r\n/**\r\n * Dynamic Flat node creates a node structure\r\n * @export\r\n * @class GroupNode\r\n */\r\nexport class GroupNode {\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public item: GroupInfo,\r\n // eslint-disable-next-line no-unused-vars\r\n public level = 1,\r\n // eslint-disable-next-line no-unused-vars\r\n public expandable = false,\r\n // eslint-disable-next-line no-unused-vars\r\n public isLoading = false // eslint-disable-next-line no-empty-function\r\n ) {}\r\n}\r\n\r\n/**\r\n * Groups stores the parent nodes and child nodes\r\n * @export\r\n * @class Groups\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class Groups {\r\n rootLevelNodes!: GroupInfo[];\r\n /** Initial data from database */\r\n private childGroups!: GroupInfo[];\r\n /**\r\n * Get the Child groups info\r\n * @return {*} {GroupInfo[]}\r\n * @memberof Groups\r\n */\r\n getChildGroupsInfo(): GroupInfo[] {\r\n return this.childGroups;\r\n }\r\n /**\r\n * Sets the Child groups info\r\n * @param {GroupInfo[]} value\r\n * @memberof Groups\r\n */\r\n setChildGroupsInfo(value: GroupInfo[]): void {\r\n this.childGroups = value;\r\n }\r\n /**\r\n * Initialize the groups data and creates the node structure for mat tree\r\n * @param {GroupInfo[]} data\r\n * @return {*} {GroupNode[]}\r\n * @memberof Groups\r\n */\r\n initialData(data: GroupInfo[]): GroupNode[] {\r\n this.rootLevelNodes = data;\r\n return this.rootLevelNodes.map(\r\n (node) => new GroupNode(node, 0, this.isExpandable(node))\r\n );\r\n }\r\n /**\r\n * Checks the node is expandable or not\r\n * @param {GroupInfo} node\r\n * @return {*} {boolean}\r\n * @memberof Groups\r\n */\r\n isExpandable(node: GroupInfo): boolean {\r\n return (\r\n (!!node?.children && node?.children?.length > 0) || node?.hasChildren\r\n );\r\n }\r\n}\r\n/**\r\n * Dynamic Data Source handles the connection with dynamic data base\r\n * @export\r\n * @class GroupsDataSource\r\n * @implements {DataSource<GroupNode>}\r\n */\r\nexport class GroupsDataSource implements DataSource<GroupNode> {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n dataChange = new BehaviorSubject<GroupNode[]>([]);\r\n /**\r\n * Gets the updated tree control data\r\n * @type {GroupNode[]}\r\n * @memberof GroupsDataSource\r\n */\r\n get data(): GroupNode[] {\r\n return this.dataChange?.value;\r\n }\r\n /**\r\n * Sets the data to tree control and emit the value to intimate the data change\r\n * @memberof GroupsDataSource\r\n */\r\n set data(value: GroupNode[]) {\r\n this.treeControl.dataNodes = value;\r\n this.dataChange.next(value);\r\n }\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private treeControl: FlatTreeControl<GroupNode>,\r\n // eslint-disable-next-line no-unused-vars\r\n private database: Groups // eslint-disable-next-line no-empty-function\r\n ) {}\r\n\r\n /**\r\n * Handles the connection between the data base and mat tree\r\n * @param {CollectionViewer} collectionViewer\r\n * @return {*} {Observable<GroupNode[]>}\r\n * @memberof GroupsDataSource\r\n */\r\n connect(collectionViewer: CollectionViewer): Observable<GroupNode[]> {\r\n this.treeControl?.expansionModel?.changed\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((change) => {\r\n if (\r\n (change as SelectionChange<GroupNode>).added ||\r\n (change as SelectionChange<GroupNode>).removed\r\n ) {\r\n this.handleTreeControl(change as SelectionChange<GroupNode>);\r\n }\r\n });\r\n return merge(collectionViewer?.viewChange, this.dataChange).pipe(\r\n map(() => this.data)\r\n );\r\n }\r\n /**\r\n * Disconnect the connection with mat tree\r\n * @param {CollectionViewer} collectionViewer\r\n * @memberof GroupsDataSource\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function, no-empty-function, no-unused-vars, @typescript-eslint/no-unused-vars\r\n disconnect(collectionViewer: CollectionViewer): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n\r\n /**\r\n * Adds/removes the child nodes while expands/collapses the parent node\r\n * @param {SelectionChange<GroupNode>} change\r\n * @memberof GroupsDataSource\r\n */\r\n handleTreeControl(change: SelectionChange<GroupNode>) {\r\n if (change?.added) {\r\n change.added?.forEach((node) => this.toggleNode(node, true));\r\n }\r\n if (change?.removed) {\r\n change.removed\r\n .slice()\r\n .reverse()\r\n .forEach((node) => this.toggleNode(node, false));\r\n }\r\n }\r\n\r\n /**\r\n * Toggle the node, add/removes the node from display\r\n * @param {GroupNode} clickedNode\r\n * @param {boolean} expand\r\n * @return {*}\r\n * @memberof GroupsDataSource\r\n */\r\n toggleNode(clickedNode: GroupNode, expand: boolean) {\r\n const children = this.database?.getChildGroupsInfo();\r\n const index = this.data?.indexOf(clickedNode);\r\n if (!children || index < 0) {\r\n // If no children, or cannot find the node, no op\r\n return;\r\n }\r\n\r\n if (expand) {\r\n clickedNode.item.noOfChildren = children.length;\r\n const nodes = children?.map(\r\n (node) =>\r\n new GroupNode(\r\n node,\r\n clickedNode?.level + 1,\r\n this.database?.isExpandable(node)\r\n )\r\n );\r\n this.data?.splice(index + 1, 0, ...nodes);\r\n } else {\r\n let count = 0;\r\n for (\r\n let i = index + 1;\r\n i < this.data?.length && this.data[i]?.level > clickedNode?.level;\r\n i++, count++ // eslint-disable-next-line no-empty\r\n ) {}\r\n this.data?.splice(index + 1, count);\r\n }\r\n\r\n // Notify the change\r\n this.dataChange?.next(this.data);\r\n }\r\n}\r\n/**\r\n * Displays the groups where parent/child relationships are represented in a tree view/hierarchy.\r\n * @export\r\n * @class TreeViewComponent\r\n * @implements {OnInit}\r\n */\r\n@Component({\r\n selector: 'ieeesa-tree',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatTreeModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MenuComponent,\r\n IconButtonComponent,\r\n MatTooltipModule,\r\n TextTruncatedDirective,\r\n ],\r\n templateUrl: './tree-view.component.html',\r\n styleUrls: ['./tree-view.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class TreeViewComponent implements OnInit, AfterViewInit, OnDestroy {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n buttons: Menu[] = this.constants?.viewGroups?.buttons;\r\n treePaddingIndent: number = this.constants?.viewGroups?.treePaddingIndent;\r\n selectedGroup!: GroupNode;\r\n selectedGroupAction!: Menu | IconButton;\r\n treeControl!: FlatTreeControl<GroupNode>;\r\n dataSource!: GroupsDataSource;\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n matTreeNodePadding!: MatTreeNodePadding<GroupNode>;\r\n plusCircleIconButton: IconButton = this.buttons[4];\r\n minusCircleIconButton: IconButton = this.buttons[5];\r\n editGroupAndParentGroupInfo!: EditGroupAndParentInfo;\r\n menuItems: Menu[] = this.buttons?.filter(\r\n (e) =>\r\n e.id !== GroupAction?.EXPAND_GROUP_VIEW &&\r\n e.id !== GroupAction?.COLLAPSE_GROUP_VIEW\r\n );\r\n private parentGroups!: GroupInfo[];\r\n @Input()\r\n set parentGroupsInfo(value: GroupInfo[]) {\r\n this.parentGroups = value;\r\n if (value) this.setGroupDataSource();\r\n }\r\n get parentGroupsInfo(): GroupInfo[] {\r\n return this.parentGroups;\r\n }\r\n private childGroups!: GroupInfo[];\r\n @Input()\r\n set childGroupsInfo(value: GroupInfo[]) {\r\n this.childGroups = value;\r\n this.loadChildGroups();\r\n }\r\n get childGroupsInfo(): GroupInfo[] {\r\n return this.childGroups;\r\n }\r\n private isGroupSearchOrFilter = false;\r\n @Input()\r\n set isGroupSearchOrFilterActive(value: boolean) {\r\n this.isGroupSearchOrFilter = value;\r\n }\r\n get isGroupSearchOrFilterActive(): boolean {\r\n return this.isGroupSearchOrFilter;\r\n }\r\n private deletedGroupId!: string | undefined;\r\n @Input()\r\n set deletedGroupIdInfo(id: string | undefined) {\r\n this.deletedGroupId = id;\r\n this.deleteGroupNode(this.deletedGroupId);\r\n }\r\n get deletedGroupIdInfo(): string | undefined {\r\n return this.deletedGroupId;\r\n }\r\n\r\n @Output() toggleGroupClick = new EventEmitter<GroupInfo>();\r\n @Output() createGroupClick = new EventEmitter<GroupInfo>();\r\n @Output() editGroupClick = new EventEmitter<EditGroupAndParentInfo>();\r\n @Output() deleteGroupClick = new EventEmitter<GroupInfo>();\r\n @Output() viewRosterClick = new EventEmitter<GroupInfo>();\r\n // eslint-disable-next-line no-unused-vars, no-empty-function\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public database: Groups,\r\n // eslint-disable-next-line no-unused-vars\r\n public elementRef: ElementRef,\r\n // eslint-disable-next-line no-unused-vars\r\n public groupsService: GroupsService // eslint-disable-next-line no-empty-function\r\n ) {}\r\n /**\r\n * Initializes the tree view component\r\n * @memberof TreeViewComponent\r\n */\r\n ngOnInit(): void {\r\n this.setGroupDataSource();\r\n }\r\n /**\r\n * Assign ARIA role for all mat tree nodes as \"row\"\r\n * @memberof TreeViewComponent\r\n */\r\n ngAfterViewInit(): void {\r\n this.dataSource?.dataChange\r\n ?.pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n const treeItemNodes =\r\n this.elementRef?.nativeElement?.querySelectorAll('[role=treeitem]');\r\n treeItemNodes?.forEach((node: HTMLElement) => (node.role = 'row'));\r\n });\r\n }\r\n /**\r\n * Gets the level of the node\r\n * @param {GroupNode} node\r\n * @memberof TreeViewComponent\r\n */\r\n getLevel = (node: GroupNode) => node?.level;\r\n\r\n /**\r\n * Checks the node is expandable or not\r\n * @param {GroupNode} node\r\n * @memberof TreeViewComponent\r\n */\r\n isExpandable = (node: GroupNode) => node?.expandable;\r\n\r\n /**\r\n * Returns true if passed node has children otherwise false\r\n * @param {number} index\r\n * @param {GroupNode} node\r\n * @return {boolean}\r\n * @memberof TreeViewComponent\r\n */\r\n hasChildGroups = (index: number, _nodeData: GroupNode) =>\r\n _nodeData.expandable;\r\n /**\r\n * Emits the group info when the toggle group is clicked or toggles the group view\r\n * @param {GroupNode} group\r\n * @memberof TreeViewComponent\r\n */\r\n viewChildGroups(node: GroupNode) {\r\n if (!node?.item?.hasChildren) {\r\n return;\r\n }\r\n if (this.treeControl?.isExpanded(node)) {\r\n this.treeControl?.toggle(node);\r\n } else {\r\n this.groupsService.setGroupFunctionType(GroupFunctionType.TOGGLE);\r\n this.toggleGroupClick.emit(node?.item);\r\n this.selectedGroup = node;\r\n }\r\n }\r\n /**\r\n * Sets the box shadow based on the group type legend color\r\n * @param {string} color\r\n * @return {*}\r\n * @memberof TreeViewComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n getBoxShadow(color: string): any {\r\n return {\r\n boxShadow:\r\n '0px 1px 0px 0px #c9cbd0 inset, 6px 0px 0px 0px ' + color + ' inset',\r\n };\r\n }\r\n /**\r\n * Sets the dataSource with parent groups data\r\n * @memberof TreeViewComponent\r\n */\r\n setGroupDataSource(): void {\r\n if (\r\n this.dataSource &&\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.CREATE\r\n ) {\r\n this.parentGroupsInfo?.forEach((parentGroupNode) => {\r\n if (\r\n this.dataSource?.data?.findIndex(\r\n (node) => node?.item?.groupId === parentGroupNode?.groupId\r\n ) === -1\r\n ) {\r\n const newGroupNode = new GroupNode(\r\n parentGroupNode,\r\n 0,\r\n this.database.isExpandable(parentGroupNode)\r\n );\r\n const groupNodesReference = this.dataSource?.data;\r\n groupNodesReference?.push(newGroupNode);\r\n this.dataSource.data = groupNodesReference;\r\n }\r\n });\r\n } else if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.EDIT\r\n ) {\r\n this.editGroup(this.parentGroupsInfo);\r\n } else {\r\n this.treeControl = new FlatTreeControl<GroupNode>(\r\n this.getLevel,\r\n this.isExpandable\r\n );\r\n this.dataSource = new GroupsDataSource(this.treeControl, this.database);\r\n this.dataSource.data = this.database?.initialData(this.parentGroupsInfo);\r\n }\r\n }\r\n /**\r\n * Sets the updated node information\r\n * @param {GroupInfo[]} groupsInfo\r\n * @memberof TreeViewComponent\r\n */\r\n editGroup(groupsInfo: GroupInfo[]) {\r\n const groupNodeReference = this.dataSource?.data;\r\n const editedNode = groupsInfo?.find(\r\n (node) =>\r\n node?.groupId === this.editGroupAndParentGroupInfo?.groupInfo?.groupId\r\n );\r\n groupNodeReference?.forEach((node) => {\r\n if (\r\n node?.item?.groupId ===\r\n this.editGroupAndParentGroupInfo?.groupInfo?.groupId\r\n ) {\r\n const noOfChildrenReference = node.item.noOfChildren;\r\n node.item = editedNode as GroupInfo;\r\n node.item.noOfChildren = noOfChildrenReference;\r\n node.expandable = this.database.isExpandable(node?.item);\r\n if (node.item.hasChildren && this.treeControl.isExpanded(node)) {\r\n this.treeControl.toggle(node);\r\n }\r\n }\r\n });\r\n this.dataSource.data = groupNodeReference;\r\n }\r\n /**\r\n * Loads the child groups and updates the tree view.\r\n * @memberof TreeViewComponent\r\n */\r\n loadChildGroups() {\r\n this.database?.setChildGroupsInfo(this.childGroupsInfo);\r\n const groupNodesReference = this.dataSource?.data;\r\n if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.CREATE\r\n ) {\r\n if (!this.selectedGroup?.item?.hasChildren) {\r\n this.selectedGroup.item.hasChildren = true;\r\n const groupParentNode = new GroupNode(\r\n this.selectedGroup.item,\r\n this.selectedGroup.level,\r\n true\r\n );\r\n groupNodesReference.splice(\r\n groupNodesReference.indexOf(this.selectedGroup),\r\n 1,\r\n groupParentNode\r\n );\r\n this.treeControl.expand(groupParentNode);\r\n }\r\n if (this.treeControl.isExpanded(this.selectedGroup)) {\r\n const children = this.database.getChildGroupsInfo();\r\n children?.forEach((groupNode) => {\r\n if (\r\n this.dataSource?.data?.findIndex(\r\n (node) => node?.item?.groupId === groupNode?.groupId\r\n ) === -1\r\n ) {\r\n const newGroupNode = new GroupNode(\r\n groupNode,\r\n this.selectedGroup?.level + 1,\r\n this.database?.isExpandable(groupNode)\r\n );\r\n const groupNodesReference = this.dataSource?.data;\r\n groupNodesReference.forEach((node) => {\r\n if (node.item.groupId === this.selectedGroup.item.groupId) {\r\n node.item.noOfChildren = children.length;\r\n }\r\n });\r\n groupNodesReference.splice(\r\n groupNodesReference.indexOf(this.selectedGroup) + 1,\r\n 0,\r\n newGroupNode\r\n );\r\n this.dataSource.data = groupNodesReference;\r\n }\r\n });\r\n }\r\n } else if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.EDIT\r\n ) {\r\n this.editGroup(this.childGroupsInfo);\r\n } else if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.TOGGLE\r\n ) {\r\n this.treeControl?.toggle(this.selectedGroup);\r\n }\r\n }\r\n /**\r\n * Deletes the selected group and updates the tree view.\r\n * @param {string} deletedGroupId\r\n * @memberof TreeViewComponent\r\n */\r\n deleteGroupNode(deletedGroupId: string | undefined): void {\r\n if (this.treeControl && deletedGroupId) {\r\n const deletedGroupIndex = this.dataSource.data.findIndex(\r\n (node) => node.item.groupId === deletedGroupId\r\n );\r\n const deletedGroup = this.dataSource.data.at(deletedGroupIndex);\r\n const dataSourceReference = this.dataSource.data;\r\n if (deletedGroupIndex) {\r\n if (deletedGroup?.item.groupParentId !== null) {\r\n const deletedParentGroupIndex = this.dataSource.data.findIndex(\r\n (node) => node.item.groupId === deletedGroup?.item.groupParentId\r\n );\r\n const deletedParentGroup = this.dataSource.data.at(\r\n deletedParentGroupIndex\r\n );\r\n if (deletedParentGroup && deletedParentGroup.item.noOfChildren) {\r\n deletedParentGroup.item.noOfChildren =\r\n deletedParentGroup.item.noOfChildren - 1;\r\n if (deletedParentGroup.item.noOfChildren === 0) {\r\n deletedParentGroup.item.hasChildren = false;\r\n const newNode = new GroupNode(\r\n deletedParentGroup.item,\r\n deletedParentGroup.level,\r\n false\r\n );\r\n dataSourceReference.splice(deletedGroupIndex - 1, 2, newNode);\r\n } else {\r\n dataSourceReference.splice(deletedGroupIndex, 1);\r\n }\r\n }\r\n } else {\r\n dataSourceReference.splice(deletedGroupIndex, 1);\r\n }\r\n }\r\n this.dataSource.data = dataSourceReference;\r\n this.deletedGroupId = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the selected menu group action\r\n * @param {Menu} menu\r\n * @memberof TreeViewComponent\r\n */\r\n onGroupActionsClick(menu: Menu | IconButton): void {\r\n this.selectedGroupAction = menu;\r\n }\r\n /**\r\n * Changes the expand/collapse icon based on the toggle\r\n * @param {GroupNode} group\r\n * @return {*} {*}\r\n * @memberof TreeViewComponent\r\n */\r\n getToggleButtonInfo(group: GroupNode): IconButton {\r\n if (this.treeControl?.isExpanded(group)) return this.minusCircleIconButton;\r\n return this.plusCircleIconButton;\r\n }\r\n /**\r\n * Handles the emitted group actions event\r\n * @param {GroupInfo} group\r\n * @memberof TreeViewComponent\r\n */\r\n handleGroupActions(group: GroupNode): void {\r\n if (this.selectedGroupAction?.id === GroupAction.VIEW_ROSTER) {\r\n this.viewRosterClick.emit(group?.item);\r\n } else if (this.selectedGroupAction?.id === GroupAction.CREATE_SUB_GROUP) {\r\n this.selectedGroup = group;\r\n this.createGroupClick.emit(group?.item);\r\n } else if (this.selectedGroupAction?.id === GroupAction.EDIT_GROUP) {\r\n const editGroupParentInfo = this.dataSource?.data?.filter(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (item: any) => item?.item?.groupId === group?.item?.groupParentId\r\n )[0]?.item;\r\n this.editGroupAndParentGroupInfo = {\r\n groupInfo: group?.item,\r\n parentGroupInfo: editGroupParentInfo,\r\n };\r\n this.editGroupClick.emit(this.editGroupAndParentGroupInfo);\r\n } else if (this.selectedGroupAction?.id === GroupAction.DELETE_GROUP) {\r\n this.deleteGroupClick.emit(group?.item);\r\n }\r\n }\r\n /**\r\n * Returns the filtered menu items based on groups hasChildren.\r\n * @param {GroupNode} group\r\n * @return {Menu[]}\r\n * @memberof TreeViewComponent\r\n */\r\n getFilteredGroupActions(group: GroupNode): Menu[] {\r\n const filteredMenu: Menu[] = [];\r\n this.menuItems?.forEach((e) => {\r\n e.isToolTipNeeded = false;\r\n if (\r\n e?.id === GroupAction.VIEW_ROSTER ||\r\n e?.id === GroupAction.EDIT_GROUP ||\r\n (e?.id === GroupAction.DELETE_GROUP && !group?.item?.hasChildren) ||\r\n (e?.id === GroupAction.CREATE_SUB_GROUP &&\r\n group?.item?.groupTypeInfo?.businessRule?.allowSubGroup)\r\n ) {\r\n filteredMenu.push(e);\r\n }\r\n });\r\n return filteredMenu;\r\n }\r\n /**\r\n * Takes the index and the icon button as arguments and needs to return the unique identifier for this icon button.\r\n * @param {number} index\r\n * @param {IconButton} iconButton\r\n * @return {number}\r\n * @memberof TreeViewComponent\r\n */\r\n trackByFn(index: number, iconButton: IconButton): number {\r\n return iconButton.id;\r\n }\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof GroupsComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<div class=\"ieeesa-tree\">\r\n <mat-tree\r\n [dataSource]=\"dataSource\"\r\n [treeControl]=\"treeControl\"\r\n class=\"ieeesa-tree__root\"\r\n #rootSelector\r\n role=\"treegrid\"\r\n >\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodePadding\r\n [matTreeNodePaddingIndent]=\"treePaddingIndent\"\r\n class=\"ieeesa-body-md-16\"\r\n >\r\n <div\r\n class=\"ieeesa-tree__node w-100 d-flex gap-lg-3 my-0 gap-0 gap-sm-0 gap-md-2\"\r\n [ngStyle]=\"getBoxShadow(node?.item?.groupTypeInfo?.legendColor)\"\r\n >\r\n <div\r\n [ngClass]=\"\r\n !isGroupSearchOrFilterActive ? 'ieeesa-tree__collapse-icon' : ''\r\n \"\r\n role=\"gridcell\"\r\n ></div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n ieeesaGroupNodeOutlet;\r\n context: { $implicit: node }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </mat-tree-node>\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChildGroups\"\r\n matTreeNodePadding\r\n [matTreeNodePaddingIndent]=\"treePaddingIndent\"\r\n class=\"ieeesa-body-md-16 ieeesa-tree__parent-node-wrapper\"\r\n >\r\n <div\r\n [ngClass]=\"\r\n treeControl.isExpanded(node)\r\n ? 'ieeesa-tree__root-node-white-bg'\r\n : 'ieeesa-tree__root-node'\r\n \"\r\n class=\"ieeesa-tree__node w-100 d-flex gap-lg-3 my-0 gap-0 gap-sm-0 gap-md-2\"\r\n [ngStyle]=\"getBoxShadow(node?.item?.groupTypeInfo?.legendColor)\"\r\n >\r\n <div role=\"gridcell\">\r\n <ieeesa-icon-button\r\n *ngIf=\"!isGroupSearchOrFilterActive\"\r\n (iconButtonClick)=\"viewChildGroups(node)\"\r\n [iconButton]=\"getToggleButtonInfo(node)\"\r\n ></ieeesa-icon-button>\r\n </div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n ieeesaGroupNodeOutlet;\r\n context: { $implicit: node }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </mat-tree-node>\r\n <ng-template #ieeesaGroupNodeOutlet let-node>\r\n <ng-container\r\n *ngTemplateOutlet=\"ieeesaGroupInfoOutlet; context: { $implicit: node }\"\r\n ></ng-container>\r\n <div\r\n class=\"d-flex d-none gap-3 d-sm-flex d-md-flex d-lg-flex ieeesa-tree__group-actions\"\r\n role=\"gridcell\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n ieeesaGroupActionsOutlet;\r\n context: { $implicit: node }\r\n \"\r\n >\r\n </ng-container>\r\n </div>\r\n <ieeesa-menu\r\n [menuItems]=\"getFilteredGroupActions(node)\"\r\n (menuItemClick)=\"onGroupActionsClick($event); handleGroupActions(node)\"\r\n class=\"d-lg-none d-md-none d-sm-none\"\r\n role=\"gridcell\"\r\n ></ieeesa-menu>\r\n </ng-template>\r\n <ng-template #ieeesaGroupInfoOutlet let-node>\r\n <div class=\"ieeesa-tree__group-info-wrapper\">\r\n <div\r\n class=\"ieeesa-tree__group-info d-flex flex-column flex-sm-column flex-md-column flex-lg-row align-items-start align-items-sm-baseline align-items-md-baseline align-items-lg-baseline gap-2 mb-1\"\r\n >\r\n <p\r\n class=\"ieeesa-tree__node-group-name ieeesa-headline-sm-26\"\r\n [matTooltip]=\"node?.item?.groupName\"\r\n ieeesaTextTruncated\r\n role=\"gridcell\"\r\n >\r\n {{ node?.item?.groupName }}\r\n </p>\r\n <p\r\n class=\"ieeesa-tree__node-group-acronym ieeesa-title-lg-24\"\r\n [matTooltip]=\"node?.item?.groupAcronym\"\r\n ieeesaTextTruncated\r\n role=\"gridcell\"\r\n >\r\n {{ node?.item?.groupAcronym }}\r\n </p>\r\n </div>\r\n <div class=\"ieeesa-body-md-16 ieeesa-tree__node-group-desc\">\r\n {{ node?.item?.groupTypeInfo?.name }}\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template #ieeesaGroupActionsOutlet let-node>\r\n <ieeesa-icon-button\r\n *ngFor=\"let item of getFilteredGroupActions(node); trackBy: trackByFn\"\r\n [iconButton]=\"item\"\r\n (iconButtonClick)=\"\r\n onGroupActionsClick($event); handleGroupActions(node)\r\n \"\r\n >\r\n </ieeesa-icon-button>\r\n </ng-template>\r\n </mat-tree>\r\n</div>\r\n","import {\r\n Component,\r\n EventEmitter,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { FormGroup, Validators } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport {\r\n AlertsService,\r\n AlertType,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport {\r\n DynamicFormComponent,\r\n FormGrid,\r\n FormModel,\r\n FormControlType,\r\n AlignType,\r\n SearchType,\r\n CheckboxOption,\r\n} from '@ieeesa-npm/presentation';\r\nimport * as screenTexts from '../../assets/constants.json';\r\nimport { GroupsValidationPatterns } from '../../assets/form-validations';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { FormStatus } from '../../models/form-status.model';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { AddNewUserPayload } from '../../models/add-new-user.model';\r\nimport { UserInfo } from '../../models/user-info.model';\r\n\r\n/**\r\n * Component implements the view and functionalities to add group users to roster.\r\n * @export\r\n * @class AddUserRosterComponent\r\n * @implements {OnInit}\r\n * @implements {OnDestroy}\r\n */\r\n@Component({\r\n selector: 'ieeesa-add-user-roster',\r\n standalone: true,\r\n imports: [CommonModule, DynamicFormComponent, MatDialogModule],\r\n templateUrl: './add-user-roster.component.html',\r\n styleUrls: ['./add-user-roster.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [AlertsService],\r\n})\r\nexport class AddUserRosterComponent implements OnInit, OnDestroy {\r\n destroy$ = new Subject<boolean>();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n addUserRosterTexts = this.constants?.addUserRoster;\r\n leftButtonLabel = this.addUserRosterTexts?.label?.leftButtonLabel;\r\n rightButtonLabel = this.addUserRosterTexts?.label?.rightButtonLabel;\r\n isSubmitButtonDisabled = false;\r\n colWidth: FormGrid = { xs: 12, xl: 12, sm: 12, md: 12, lg: 12 };\r\n searchUserFormGroup!: FormModel;\r\n addUserFormGroup!: FormModel;\r\n actionButtonAlign = AlignType.LEFT;\r\n addUserFormGroupRef!: FormGroup;\r\n isSearchUserForm = true;\r\n userRoles: CheckboxOption[] = [];\r\n selectedUserRoles: string[] = [];\r\n userInfo!: UserInfo;\r\n isAddUserFormEmailSearch = false;\r\n @Output() submitFormResponse = new EventEmitter();\r\n @Output() formCancel = new EventEmitter();\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private groupService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private globalErrorHandlerService: GlobalErrorHandlerService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService // eslint-disable-next-line no-empty-function\r\n ) {}\r\n\r\n /**\r\n * Initializes user roles and searchUserFormGroup.\r\n * @memberof AddUserRosterComponent\r\n */\r\n ngOnInit(): void {\r\n this.userRoles = this.groupService.getGroupTypeUserRoles();\r\n this.createSearchUserFormGroup();\r\n }\r\n\r\n /**\r\n * Creates search user form group\r\n * @memberof AddUserRosterComponent\r\n */\r\n createSearchUserFormGroup(): void {\r\n this.searchUserFormGroup = {\r\n formGroup: [\r\n {\r\n legend: '',\r\n controls: [\r\n {\r\n type: FormControlType.INPUT,\r\n label: this.addUserRosterTexts?.label?.email + '*',\r\n controlName: 'emailAddress',\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n isEmail: true,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.emailAddress,\r\n patternErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.pattern?.email,\r\n validation: [\r\n Validators.required,\r\n Validators.pattern(GroupsValidationPatterns.email),\r\n ],\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.email,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.email,\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n }\r\n\r\n /**\r\n * Checks form validity and searches the user by entered email.\r\n * @param {FormGroup[]} form\r\n * @memberof AddUserRosterComponent\r\n */\r\n onSearchUserFormSubmit(form: FormGroup[]): void {\r\n this.isAddUserFormEmailSearch = false;\r\n if (form[0]?.status === FormStatus.VALID) {\r\n this.searchUserByEmail(form[0].getRawValue()?.emailAddress);\r\n }\r\n }\r\n\r\n /**\r\n * Searches the user by entered email and gets the user details when the email id is found.\r\n * @param {string} email\r\n * @memberof AddUserRosterComponent\r\n */\r\n searchUserByEmail(email: string): void {\r\n this.groupService\r\n .getUserByEmail(email)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.userInfo = res?.body;\r\n this.validateUserExistence();\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Validates whether the user is exists in the selected group and then creates add user form when the user does not exist in the selected group.\r\n * @memberof AddUserRosterComponent\r\n */\r\n validateUserExistence(): void {\r\n const payload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()?.groupId as string,\r\n userId: this.userInfo?.userId,\r\n },\r\n };\r\n this.groupService\r\n .getGroupUserDetails(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n ?.subscribe({\r\n next: () => {\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: this.constants?.errors?.['1022'],\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (errorCodes?.includes('1026')) {\r\n this.isSearchUserForm = false;\r\n this.rightButtonLabel =\r\n this.addUserRosterTexts?.label?.saveButtonLabel;\r\n if (!this.isAddUserFormEmailSearch) {\r\n this.selectedUserRoles = [];\r\n this.isSubmitButtonDisabled = true;\r\n this.addUserFormGroup = {\r\n formGroup: [\r\n {\r\n legend: '',\r\n controls: [\r\n {\r\n type: FormControlType.SEARCH,\r\n label: this.addUserRosterTexts?.label?.email + '*',\r\n controlName: 'emailSearch',\r\n value: this.userInfo?.email,\r\n searchType: SearchType.ON_CLICK,\r\n validation: [\r\n Validators.required,\r\n Validators.pattern(GroupsValidationPatterns.email),\r\n ],\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.emailAddress,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n patternErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.pattern\r\n ?.email,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.email,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.email,\r\n },\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.fullName + '*',\r\n controlName: 'fullName',\r\n value: this.userInfo?.name,\r\n validation: [Validators.required],\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.fullName,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.fullName,\r\n },\r\n {\r\n type: FormControlType.CHECKBOX,\r\n label: this.addUserRosterTexts?.label?.role + '*',\r\n controlName: 'roles',\r\n checkboxOptions: this.userRoles,\r\n minSelectionRequired: 1,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.role,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.role,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.role,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.roleRequired,\r\n validation: [Validators.required],\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n } else {\r\n this.addUserFormGroupRef\r\n ?.get('emailSearch')\r\n ?.setValue(this.userInfo?.email);\r\n this.addUserFormGroupRef\r\n ?.get('fullName')\r\n ?.setValue(this.userInfo?.name);\r\n this.isSubmitButtonDisabled =\r\n this.selectedUserRoles?.length === 0;\r\n }\r\n } else this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Handles add user form email search\r\n * @param {string} email\r\n * @memberof AddUserRosterComponent\r\n */\r\n formSearchApply(email: string): void {\r\n this.isAddUserFormEmailSearch = true;\r\n if (email.trim()) this.searchUserByEmail(email.trim());\r\n else {\r\n this.userInfo.name = '';\r\n this.addUserFormGroupRef?.get('fullName')?.setValue('');\r\n this.isSubmitButtonDisabled = true;\r\n }\r\n }\r\n\r\n /**\r\n * Assigns role to user on form submission.\r\n * @param {FormGroup[]} form\r\n * @memberof AddUserRosterComponent\r\n */\r\n onAddUserFormSubmit(form: FormGroup[]): void {\r\n form[0]?.markAllAsTouched();\r\n if (form[0].status === FormStatus.VALID) {\r\n const payload: AddNewUserPayload = {\r\n payload: {\r\n email: this.userInfo?.email,\r\n roles: this.selectedUserRoles,\r\n userId: this.userInfo?.userId,\r\n groupId: this.groupService.selectedGroupInfo?.groupId as string,\r\n },\r\n };\r\n\r\n this.groupService\r\n .addNewGroupUser(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.submitFormResponse.emit(res);\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get add user form group reference.\r\n * @param {FormGroup[]} form\r\n * @memberof AddUserRosterComponent\r\n */\r\n getAddUserFormGroupRef(form: FormGroup[]) {\r\n this.addUserFormGroupRef = form[0];\r\n }\r\n\r\n /**\r\n * Handles user role selection in add user form.\r\n * @param {CheckboxOption} event\r\n * @memberof AddUserRosterComponent\r\n */\r\n onUserRoleSelection(event: CheckboxOption): void {\r\n if (event?.checked) {\r\n this.selectedUserRoles?.push(event.id as string);\r\n } else {\r\n this.selectedUserRoles = this.selectedUserRoles.filter(\r\n (value) => value !== event.id\r\n );\r\n }\r\n this.isSubmitButtonDisabled = this.selectedUserRoles?.length === 0;\r\n }\r\n\r\n /**\r\n * Emits form cancel event.\r\n * @memberof AddUserRosterComponent\r\n */\r\n onFormCancel(): void {\r\n this.formCancel.emit();\r\n }\r\n\r\n /**\r\n * Handles the custom errors while searching user by email, validating user existence and adding new user to roster.\r\n * @param {*} error\r\n * @memberof AddUserRosterComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n handleErrors(error: any): void {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes) && !error?.error?.status) {\r\n const errorMessage = this.groupService.parseErrorMessage(errorCodes);\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: errorMessage,\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService.handleError(error);\r\n }\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof AddUserRosterComponent\r\n */\r\n ngOnDestroy(): void {\r\n if (this.destroy$) {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n }\r\n}\r\n","<ieeesa-dynamic-form\r\n *ngIf=\"searchUserFormGroup && isSearchUserForm\"\r\n class=\"ieeesa-search-user-form\"\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLegendVisible]=\"false\"\r\n [colWidth]=\"colWidth\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n [formGroups]=\"searchUserFormGroup\"\r\n [isLeftButtonNeeded]=\"true\"\r\n (formSubmit)=\"onSearchUserFormSubmit($event)\"\r\n (formLeftButtonClicked)=\"onFormCancel()\"\r\n></ieeesa-dynamic-form>\r\n\r\n<ieeesa-dynamic-form\r\n *ngIf=\"addUserFormGroup && !isSearchUserForm\"\r\n class=\"ieeesa-add-user-form\"\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLegendVisible]=\"false\"\r\n [isSubmitButtonDisabled]=\"isSubmitButtonDisabled\"\r\n [colWidth]=\"colWidth\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n [formGroups]=\"addUserFormGroup\"\r\n [isLeftButtonNeeded]=\"true\"\r\n (formSubmit)=\"onAddUserFormSubmit($event)\"\r\n (formSearchApply)=\"formSearchApply($event)\"\r\n (formLeftButtonClicked)=\"onFormCancel()\"\r\n (formGroupsReference)=\"getAddUserFormGroupRef($event)\"\r\n (formCheckboxSelection)=\"onUserRoleSelection($event)\"\r\n></ieeesa-dynamic-form>\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n OnDestroy,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { SortDirection } from '@angular/material/sort';\r\nimport {\r\n TableColumnSchema,\r\n TableColumnType,\r\n TableActions,\r\n CheckboxOption,\r\n DataTableComponent,\r\n TableColumnSortDirection,\r\n ChipsType,\r\n ChipOption,\r\n} from '@ieeesa-npm/presentation';\r\nimport {\r\n AlertType,\r\n AlertsService,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport {\r\n SearchUsersPayload,\r\n FilterUsersByRolesPayload,\r\n User,\r\n} from '../../models/user.model';\r\nimport * as constants from '../../assets/constants.json';\r\nimport { GroupFunctionType } from '../../models/group-function-type.model';\r\n\r\n/**\r\n * ViewRosterComponent implements the functionalities to add, edit, delete user to group roster, assign and modify roles(s) to the group users, and search user from roster.\r\n * @export\r\n * @class ViewRosterComponent\r\n * @implements {OnDestroy}\r\n */\r\n@Component({\r\n selector: 'ieeesa-view-roster',\r\n standalone: true,\r\n imports: [CommonModule, DataTableComponent],\r\n templateUrl: './view-roster.component.html',\r\n styleUrls: ['./view-roster.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ViewRosterComponent implements AfterViewInit, OnDestroy {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n viewRosterConstants = this.constants?.viewRoster;\r\n filters: ChipOption[] = [\r\n {\r\n id: 1,\r\n name: this.viewRosterConstants?.filterByRole,\r\n checked: false,\r\n chipType: ChipsType.TOGGLE,\r\n },\r\n ];\r\n columnSchema: TableColumnSchema[] = [\r\n {\r\n id: 1,\r\n columnDef: TableColumnType.SELECT,\r\n heading: '',\r\n columnType: TableColumnType.SELECT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.select}`,\r\n },\r\n {\r\n id: 2,\r\n columnDef: 'name',\r\n heading: this.viewRosterConstants?.tableColumns?.name,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.name}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 3,\r\n columnDef: 'email',\r\n heading: this.viewRosterConstants?.tableColumns?.email,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.email}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 4,\r\n columnDef: 'role',\r\n heading: this.viewRosterConstants?.tableColumns?.role,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.role}`,\r\n },\r\n ];\r\n tableData!: User[];\r\n selectedRoleIds: string[] = [];\r\n selectedRoles!: ChipOption[] | CheckboxOption[];\r\n roles: CheckboxOption[] = [];\r\n rosterActions: TableActions = {\r\n isSearchNeeded: true,\r\n isFilterNeeded: true,\r\n isAddNeeded: true,\r\n isDeleteNeeded: true,\r\n isEditNeeded: true,\r\n };\r\n defaultSortedColumn = this.columnSchema[1].columnDef;\r\n defaultColumnSortDirection: SortDirection =\r\n TableColumnSortDirection.ASCENDING;\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private groupService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private alertService: AlertsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private cdr: ChangeDetectorRef,\r\n // eslint-disable-next-line no-unused-vars\r\n private globalErrorHandlerService: GlobalErrorHandlerService\r\n ) {\r\n this.getRoles();\r\n this.getGroupUsersAndInitializeTableView();\r\n }\r\n /**\r\n * Show add new user success message when canShowMessage is set true\r\n * @memberof ViewRosterComponent\r\n */\r\n ngAfterViewInit(): void {\r\n if (this.groupService.canShowMessage) {\r\n this.groupService.canShowMessage = false;\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: this.constants?.addUserRoster?.message?.success?.submission,\r\n alertType: AlertType.SUCCESS,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n }\r\n /**\r\n * Gets the group users by calling getGroupUsers() from groupService and sets tableData to display the users in a grid.\r\n * @memberof ViewRosterComponent\r\n */\r\n getGroupUsersAndInitializeTableView(): void {\r\n this.groupService\r\n .getGroupUsers(\r\n this.groupService.getSelectedGroupInfo()?.groupId as string\r\n )\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.tableData =\r\n this.groupService.transformUserRolesNameAsString(response);\r\n this.cdr.detectChanges();\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Gets the selected group type roles by calling getGroupTypeRoles() from groupService and sets assign roles.\r\n * @memberof ViewRosterComponent\r\n */\r\n getRoles(): void {\r\n this.groupService\r\n .getGroupTypeRoles(\r\n this.groupService.getSelectedGroupInfo()?.groupType as string\r\n )\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.roles = response;\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Gets the group users by calling searchGroupUsers() from groupService and sets tableData to display the users in a grid.\r\n * @param {string} searchTerm -searchTerm can be user name or email and user is searched based on the email or name.\r\n * @memberof ViewRosterComponent\r\n */\r\n onSearchGroupUsers(searchTerm: string): void {\r\n if (!searchTerm) {\r\n if (this.selectedRoleIds?.length === 0) {\r\n this.getGroupUsersAndInitializeTableView();\r\n return;\r\n } else if (this.selectedRoleIds?.length > 0) {\r\n this.onFilterUsersByRoles(this.selectedRoles);\r\n return;\r\n }\r\n }\r\n if (!searchTerm.trim()) return;\r\n const payload: SearchUsersPayload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()?.groupId as string,\r\n searchByNameOrEmail: searchTerm,\r\n roles: this.selectedRoleIds,\r\n },\r\n };\r\n this.groupService\r\n .searchGroupUsers(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.tableData =\r\n this.groupService.transformUserRolesNameAsString(response);\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Gets the group users by calling getGroupUsersByRoles() from groupService and sets tableData to display the users in a grid.\r\n * @param {ChipOption[] | | CheckboxOption[]} roles\r\n * @memberof ViewRosterComponent\r\n */\r\n onFilterUsersByRoles(roles: ChipOption[] | CheckboxOption[]): void {\r\n if (roles?.length === 0) {\r\n this.getGroupUsersAndInitializeTableView();\r\n return;\r\n }\r\n this.selectedRoleIds = [];\r\n roles?.forEach((role) => {\r\n this.selectedRoleIds.push(role.id as string);\r\n });\r\n this.selectedRoles = roles;\r\n const payload: FilterUsersByRolesPayload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()?.groupId as string,\r\n roles: this.selectedRoleIds,\r\n },\r\n };\r\n this.groupService\r\n .getGroupUsersByRoles(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.tableData =\r\n this.groupService.transformUserRolesNameAsString(response);\r\n this.cdr.detectChanges();\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Handles the custom errors while retrieving groups users, roles, search users, filter user by roles.\r\n * @param {*} error\r\n * @memberof ViewRosterComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n handleErrors(error: any): void {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes) && !error?.error?.status) {\r\n const errorMessage = this.groupService.parseErrorMessage(errorCodes);\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: errorMessage,\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService.handleError(error);\r\n }\r\n }\r\n\r\n /**\r\n * Emits openModalNotifier event with GroupFunctionType value as ADD_USER_TO_ROSTER\r\n * @memberof ViewRosterComponent\r\n */\r\n onAddNewUser(): void {\r\n this.groupService?.openModalNotifier?.next(\r\n GroupFunctionType.ADD_USER_TO_ROSTER\r\n );\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof ViewRosterComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<ieeesa-data-table\r\n [tableDataInfo]=\"tableData\"\r\n [columnSchemaInfo]=\"columnSchema\"\r\n [defaultSortedColumn]=\"defaultSortedColumn\"\r\n [defaultColumnSortDirection]=\"defaultColumnSortDirection\"\r\n [searchPlaceHolderText]=\"viewRosterConstants?.searchPlaceholder\"\r\n [tableActions]=\"rosterActions\"\r\n [filters]=\"filters\"\r\n [selectedFilterOptions]=\"roles\"\r\n (removeFilteredOption)=\"onFilterUsersByRoles($event)\"\r\n (filteredOptions)=\"onFilterUsersByRoles($event)\"\r\n (searchedValue)=\"onSearchGroupUsers($event)\"\r\n (addRow)=\"onAddNewUser()\"\r\n></ieeesa-data-table>\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport {\r\n Component,\r\n Input,\r\n OnDestroy,\r\n ViewEncapsulation,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { CreateGroupComponent } from './components/create-group/create-group.component';\r\nimport { GroupsService } from './services/groups.service';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { GroupInfo } from './models/group-info.model';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport {\r\n SearchComponent,\r\n ModalComponent,\r\n SelectOption,\r\n IconButtonComponent,\r\n IconButton,\r\n AlignType,\r\n ModalConfirmationComponent,\r\n SelectComponent,\r\n LegendComponent,\r\n Legend,\r\n} from '@ieeesa-npm/presentation';\r\nimport { TreeViewComponent } from './components/tree-view/tree-view.component';\r\nimport { GroupType, GroupTypeConfigValue } from './models/group-types.model';\r\nimport {\r\n ModalType,\r\n AlertType,\r\n BreakpointObserverService,\r\n AlertsService,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport * as screenTexts from './assets/constants.json';\r\nimport { GroupFunctionType } from './models/group-function-type.model';\r\nimport { GetGroupsPayload } from './models/view-group.model';\r\nimport { DeleteGroupPayload } from './models/delete-group.model';\r\nimport { AddUserRosterComponent } from './components/add-user-roster/add-user-roster.component';\r\nimport { ViewRosterComponent } from './components/view-roster/view-roster.component';\r\nimport { EditGroupAndParentInfo } from './models/edit-group.model';\r\n\r\n/**\r\n * Groups component is a wrapper or container component for groups management reusable component and in this component integrates all group management functionalities and this will be entry component for managing groups when it is consumed in other applications.\r\n * @class GroupsComponent\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'ieeesa-groups',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n SearchComponent,\r\n SelectComponent,\r\n TreeViewComponent,\r\n LegendComponent,\r\n IconButtonComponent,\r\n ],\r\n templateUrl: './groups.component.html',\r\n styleUrls: ['./groups.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [AlertsService],\r\n})\r\nexport class GroupsComponent implements OnInit, OnDestroy {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n dialogRef: any;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n viewGroupTexts = this.constants?.viewGroups;\r\n createGroupText = this.constants?.createGroup;\r\n editGroupTexts = this.constants?.editGroup;\r\n addUserRosterTexts = this.constants?.addUserRoster;\r\n isGroupSearchActive = false;\r\n isGroupFilterActive = false;\r\n isGroupSearchOrFilterActive = false;\r\n isMobileView = false;\r\n childGroupsInfo!: GroupInfo[];\r\n selectedGroupType!: SelectOption;\r\n parentGroupsInfo!: GroupInfo[];\r\n selectGroupOptions!: SelectOption[];\r\n deletedGroupId!: string;\r\n deleteGroupName!: string;\r\n groupTypes!: GroupTypeConfigValue;\r\n searchPlaceHolderText: string = this.viewGroupTexts?.placeholderText?.search;\r\n filterPlaceHolderText: string = this.viewGroupTexts?.placeholderText?.filter;\r\n createGroupIcon: IconButton = {\r\n id: 1,\r\n ariaLabel: this.viewGroupTexts?.ariaLabel.add,\r\n iconURL: this.viewGroupTexts?.createGroupIcon,\r\n toolTip: this.viewGroupTexts?.ariaLabel.add,\r\n };\r\n filterGroupIcon: IconButton = {\r\n id: 2,\r\n ariaLabel: this.viewGroupTexts?.ariaLabel.filter,\r\n iconURL: this.viewGroupTexts?.filterGroupIcon,\r\n toolTip: this.viewGroupTexts?.ariaLabel.filter,\r\n };\r\n groupsLegends: Legend[] = [];\r\n getGroupsPayload: GetGroupsPayload = { groupId: '', groupTypeId: '' };\r\n @Input() groupsPageInfo: {\r\n groupsTitle: string;\r\n groupsDescription: string;\r\n } = {\r\n groupsTitle: this.viewGroupTexts?.groupsTitle,\r\n groupsDescription: this.viewGroupTexts?.groupsDescription,\r\n };\r\n @Input() applicationId!: string;\r\n @Input() apiBaseURL!: string;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n @Input() permissions!: any;\r\n functionType!: GroupFunctionType;\r\n alignmentType = AlignType;\r\n isSorting = true;\r\n canReopenViewRosterModal = false;\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public dialog: MatDialog,\r\n // eslint-disable-next-line no-unused-vars\r\n private groupsService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private breakpointObserverService: BreakpointObserverService,\r\n // eslint-disable-next-line no-unused-vars\r\n public globalErrorHandlerService: GlobalErrorHandlerService\r\n ) {\r\n this.breakpointObserverService\r\n .getBreakpoint()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((result) => {\r\n this.isMobileView = result?.matches;\r\n });\r\n }\r\n\r\n /**\r\n * Initialize the groups component.\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n ngOnInit(): void {\r\n this.groupsService?.setAppConfig(this.apiBaseURL, this.permissions);\r\n this.getGroupTypes();\r\n this.groupsService?.openModalNotifier\r\n ?.pipe(takeUntil(this.destroy$))\r\n ?.subscribe((response) => {\r\n if (response === GroupFunctionType.ADD_USER_TO_ROSTER) {\r\n this.dialogRef?.close();\r\n this.openAddUserRosterModal();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the dialog options for create group modal and calls openModal method.\r\n * @param {GroupInfo} [parentGroupInfo] -An optional parameter. Parent group info to be passed for create child group.\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n openCreateGroupForm(parentGroupInfo?: GroupInfo): void {\r\n this.groupsService?.setSelectedGroupInfo(parentGroupInfo ?? undefined);\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.CREATE);\r\n const dialogOptions = {\r\n heading: this.createGroupText?.heading,\r\n isCloseNeeded: true,\r\n componentReference: CreateGroupComponent,\r\n modalType: ModalType.FORM,\r\n };\r\n this.functionType = GroupFunctionType?.CREATE;\r\n this.openModal(dialogOptions, 'ieeesa-create-group', parentGroupInfo);\r\n }\r\n\r\n /**\r\n * Sets the dialog options for edit group modal and calls openModal method.\r\n * @param {EditGroupAndParentInfo} editGroupInfo -editing group and its parent group info to be passed for populating edit group form fields.\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n openEditGroupForm(editGroupInfo: EditGroupAndParentInfo): void {\r\n this.groupsService?.setSelectedGroupInfo(\r\n editGroupInfo?.groupInfo,\r\n editGroupInfo?.parentGroupInfo\r\n );\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.EDIT);\r\n const dialogOptions = {\r\n heading: editGroupInfo?.groupInfo?.groupName,\r\n isCloseNeeded: true,\r\n componentReference: CreateGroupComponent,\r\n modalType: ModalType.FORM,\r\n };\r\n this.functionType = GroupFunctionType?.EDIT;\r\n this.openModal(dialogOptions, 'ieeesa-create-group', editGroupInfo);\r\n }\r\n\r\n /**\r\n * Sets the dialog options for add users modal and calls openModal method.\r\n * @memberof GroupsComponent\r\n */\r\n openAddUserRosterModal(): void {\r\n const dialogOptions = {\r\n heading: this.addUserRosterTexts?.heading,\r\n isCloseNeeded: true,\r\n componentReference: AddUserRosterComponent,\r\n modalType: ModalType.FORM,\r\n };\r\n this.functionType = GroupFunctionType.ADD_USER_TO_ROSTER;\r\n this.groupsService?.setGroupFunctionType(this.functionType);\r\n this.openModal(dialogOptions, 'ieeesa-add-user-roster');\r\n }\r\n\r\n /**\r\n * Sets the dialog options for users modal and calls openModal method.\r\n * @param {GroupInfo} group\r\n * @memberof GroupsComponent\r\n */\r\n viewRoster(group: GroupInfo): void {\r\n const dialogOptions = {\r\n heading: group?.groupName,\r\n isCloseNeeded: true,\r\n componentReference: ViewRosterComponent,\r\n modalType: ModalType.FORM_AND_CONTENT,\r\n };\r\n this.groupsService.setSelectedGroupInfo(group);\r\n this.functionType = GroupFunctionType.VIEW_ROSTER;\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.EDIT);\r\n this.openModal(dialogOptions, 'ieeesa-view-roster');\r\n }\r\n\r\n /**\r\n * Opens modal component with for received params and handles form submission success and errors.\r\n * @param {*} dialogOptions\r\n * @param {string} [className]\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-inferrable-types, no-unused-vars\r\n openModal(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n dialogOptions: any,\r\n className?: string,\r\n groupInfo?: GroupInfo | EditGroupAndParentInfo\r\n ): void {\r\n className = className ?? '';\r\n this.dialogRef = this.dialog?.open(ModalComponent, {\r\n data: dialogOptions,\r\n width:\r\n this.functionType === GroupFunctionType.VIEW_ROSTER ||\r\n this.functionType === GroupFunctionType.ADD_USER_TO_ROSTER\r\n ? ''\r\n : 'auto',\r\n panelClass: ['ieeesa-modal-dialog', className],\r\n ariaModal: true,\r\n });\r\n this.dialogRef?.componentInstance?.submitFormResponse\r\n .pipe(takeUntil(this.destroy$))\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, no-unused-vars\r\n .subscribe((result: any) => {\r\n this.dialogRef?.close();\r\n switch (this.functionType) {\r\n case GroupFunctionType?.CREATE: {\r\n this.showAlertMessage(\r\n AlertType?.SUCCESS,\r\n this.createGroupText?.message?.success?.submission\r\n );\r\n const createGroupInfo = groupInfo as GroupInfo;\r\n if (createGroupInfo) this.getGroups(createGroupInfo);\r\n else this.getGroups();\r\n break;\r\n }\r\n case GroupFunctionType?.EDIT: {\r\n this.showAlertMessage(\r\n AlertType?.SUCCESS,\r\n this.editGroupTexts?.message?.success?.submission\r\n );\r\n const editGroupInfo = groupInfo as EditGroupAndParentInfo;\r\n if (editGroupInfo?.parentGroupInfo?.groupId === undefined) {\r\n this.getGroups();\r\n } else this.getGroups(editGroupInfo.parentGroupInfo);\r\n break;\r\n }\r\n case GroupFunctionType?.ADD_USER_TO_ROSTER: {\r\n if (this.functionType === GroupFunctionType.ADD_USER_TO_ROSTER) {\r\n this.groupsService.canShowMessage = true;\r\n this.viewRoster(\r\n this.groupsService.selectedGroupInfo as GroupInfo\r\n );\r\n }\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n });\r\n this.dialogRef?.componentInstance?.formCancel\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n this.dialogRef?.close();\r\n if (this.functionType === GroupFunctionType.ADD_USER_TO_ROSTER) {\r\n this.canReopenViewRosterModal = false;\r\n this.viewRoster(this.groupsService.selectedGroupInfo as GroupInfo);\r\n }\r\n });\r\n this.dialogRef\r\n ?.afterOpened()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n if (this.functionType === GroupFunctionType.ADD_USER_TO_ROSTER) {\r\n this.canReopenViewRosterModal = true;\r\n }\r\n });\r\n this.dialogRef\r\n ?.afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n if (this.canReopenViewRosterModal) {\r\n this.canReopenViewRosterModal = false;\r\n this.viewRoster(this.groupsService.selectedGroupInfo as GroupInfo);\r\n }\r\n });\r\n }\r\n /**\r\n * Opens the confirmation modal to get user confirmation to delete the selected group.\r\n * @memberof GroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n openDeleteConfirmationModal(groupInfo: GroupInfo): void {\r\n const confirmationInfo = screenTexts?.deleteGroup?.confirmationInfo;\r\n const deleteGroupModalOptions = {\r\n leftButtonLabel: confirmationInfo?.leftButtonLabel,\r\n rightButtonLabel: confirmationInfo?.rightButtonLabel,\r\n promptMessage:\r\n confirmationInfo?.promptMessage + groupInfo?.groupName + '?',\r\n actionButtonAlign: this.alignmentType?.MIDDLE,\r\n };\r\n this.dialogRef = this.dialog?.open(ModalConfirmationComponent, {\r\n data: deleteGroupModalOptions,\r\n width: 'auto',\r\n autoFocus: 'dialog',\r\n ariaLabel: this.constants?.ariaLabel?.alert,\r\n });\r\n this.dialogRef\r\n .afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((result: boolean) => {\r\n if (result) {\r\n this.deleteGroup(groupInfo);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * This method sends API Request to delete the selected group and handles the success and error response of the http request.\r\n * @memberof GroupComponent\r\n */\r\n deleteGroup(groupInfo: GroupInfo): void {\r\n const deleteGroupText = screenTexts?.deleteGroup;\r\n this.deleteGroupName = groupInfo?.groupName;\r\n const deleteGroupPayload: DeleteGroupPayload = {\r\n payload: {\r\n groupId: groupInfo?.groupId,\r\n },\r\n };\r\n this.groupsService\r\n .deleteGroup(deleteGroupPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n next: (res: any) => {\r\n this.dialogRef?.close();\r\n if (res?.status) {\r\n this.deletedGroupId = groupInfo?.groupId;\r\n this.showAlertMessage(\r\n AlertType?.SUCCESS,\r\n groupInfo?.groupName + deleteGroupText?.message?.success?.deletion\r\n );\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Shows the search field on click of search icon in case of mobile view\r\n * @memberof GroupsComponent\r\n */\r\n onGroupSearch(): void {\r\n this.isGroupSearchActive = true;\r\n this.isGroupFilterActive = false;\r\n }\r\n\r\n /**\r\n * Shows the Filter by dropdown options on click of filter icon in case of mobile view\r\n * @memberof GroupsComponent\r\n */\r\n showGroupFilter(): void {\r\n this.isGroupFilterActive = true;\r\n this.isGroupSearchActive = false;\r\n }\r\n\r\n /**\r\n * Sets isGroupSearchOrFilterActive to true and loads the groups those are configured with selected group type.\r\n * @param {string} searchTerm\r\n * @memberof GroupsComponent\r\n */\r\n onGroupSearchClick(searchTerm: string): void {\r\n this.isGroupSearchOrFilterActive = !!searchTerm;\r\n }\r\n\r\n /**\r\n * Sets select group type options from groupTypes response\r\n * @return {*} {SelectOption[]}\r\n * @memberof GroupsComponent\r\n */\r\n getGroupTypeOptions(): SelectOption[] {\r\n this.legendColor();\r\n const groupTypeOptions: SelectOption[] = [];\r\n groupTypeOptions.push({\r\n id: '',\r\n name: this.viewGroupTexts?.allGroupTypesOption,\r\n });\r\n Object.entries(this.groupTypes)?.forEach((node) => {\r\n groupTypeOptions.push({ id: node[0], name: node[1]?.name });\r\n });\r\n return groupTypeOptions;\r\n }\r\n\r\n /**\r\n * Sets legend color from groupTypes response\r\n * @memberof GroupsComponent\r\n */\r\n legendColor(): void {\r\n Object.entries(this.groupTypes)?.forEach((node) => {\r\n this.groupsLegends?.push({\r\n color: node[1]?.legendColor,\r\n label: node[1]?.name,\r\n hierarchy: node[1]?.hierarchy,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Sets the isGroupSearchOrFilterActive flag and loads parent group info as per selected filter option.\r\n * @param {SelectOption} event\r\n * @memberof GroupsComponent\r\n */\r\n onGroupTypeFiltered(event: SelectOption): void {\r\n this.selectedGroupType = event;\r\n this.isGroupSearchOrFilterActive = !!this.selectedGroupType?.id;\r\n this.getGroupsPayload = {\r\n groupId: '',\r\n groupTypeId: this.selectedGroupType?.id as string,\r\n };\r\n this.getGroups();\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.FILTER);\r\n }\r\n\r\n /**\r\n * Loads all the parent groups information.\r\n * @memberof GroupsComponent\r\n */\r\n getGroups(group?: GroupInfo): void {\r\n if (group) {\r\n this.getGroupsPayload = {\r\n groupId: group?.groupId ?? '',\r\n groupTypeId: '',\r\n };\r\n } else if (this.getGroupsPayload.groupTypeId === '') {\r\n this.getGroupsPayload = {\r\n groupId: '',\r\n groupTypeId: '',\r\n };\r\n }\r\n this.groupsService\r\n .getGroups(this.getGroupsPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.status) {\r\n if (group) {\r\n this.childGroupsInfo = this.viewGroupResponse(response?.body);\r\n } else {\r\n this.parentGroupsInfo = this.viewGroupResponse(response?.body);\r\n }\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Sets groupType info with group response from groupType response\r\n * @param {GroupInfo[]} response\r\n * @return {*} {GroupInfo[]}\r\n * @memberof GroupsComponent\r\n */\r\n viewGroupResponse(response: GroupInfo[]): GroupInfo[] {\r\n response?.forEach((node) => {\r\n const groupTypeInfo: GroupType = this.groupTypes[node.groupType];\r\n node.groupTypeInfo = groupTypeInfo;\r\n });\r\n return response;\r\n }\r\n\r\n /**\r\n * Loads the group types.\r\n * @memberof GroupsComponent\r\n */\r\n getGroupTypes(): void {\r\n this.groupsService\r\n .getGroupTypes()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.groupTypes = this.groupsService?.getFormattedGroupTypes(\r\n res?.body\r\n );\r\n this.selectGroupOptions = this.getGroupTypeOptions();\r\n this.selectedGroupType = this.selectGroupOptions[0];\r\n this.onGroupTypeFiltered(this.selectedGroupType);\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Handles alerts for success, error and warning.\r\n * @param {(string | string[])} message -success or error or warning message.\r\n * @param {AlertType} alertType\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n showAlertMessage(alertType: AlertType, message: string | string[]): void {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: message,\r\n alertType: alertType,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n\r\n /**\r\n * Captures the server side errors and handles it based on the custom or Http errors.\r\n * @param {HttpErrorResponse} error\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n handleErrors(error: HttpErrorResponse): void {\r\n const errorCodes: string[] = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes)) {\r\n const errorMessage: string[] =\r\n this.groupsService?.parseErrorMessage(errorCodes);\r\n if (errorCodes?.includes('1008')) {\r\n errorMessage[0] = this.deleteGroupName + errorMessage?.[0];\r\n }\r\n this.showAlertMessage(AlertType.ERROR, errorMessage);\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService?.handleError(error);\r\n }\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof GroupsComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<div class=\"ieeesa-groups p-3 p-sm-4 p-md-4 p-lg-4\">\r\n <div\r\n class=\"ieeesa-groups__info d-flex justify-content-between pb-3\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-groups__info--white-bg'\r\n : 'ieeesa-groups__info--blue-bg'\r\n \"\r\n >\r\n <p\r\n [ngClass]=\"isMobileView ? 'ieeesa-title-lg-24' : 'ieeesa-headline-lg-34'\"\r\n >\r\n {{ groupsPageInfo.groupsTitle }}\r\n </p>\r\n <div>\r\n <button\r\n mat-button\r\n class=\"ieeesa-groups__create-subgroup mat-tertiary-button d-none d-sm-none d-md-block d-lg-block d-xl-block\"\r\n (click)=\"openCreateGroupForm()\"\r\n [attr.aria-label]=\"constants?.viewGroups?.ariaLabel?.addGroup\"\r\n >\r\n {{ constants?.viewGroups?.addGroup }}\r\n </button>\r\n </div>\r\n <div\r\n class=\"d-flex d-sm-flex d-md-none d-lg-none d-xl-none ieeesa-groups__mobile-icons gap-2\"\r\n >\r\n <ieeesa-icon-button\r\n [iconButton]=\"createGroupIcon\"\r\n (iconButtonClick)=\"openCreateGroupForm()\"\r\n >\r\n </ieeesa-icon-button>\r\n <ieeesa-icon-button\r\n [iconButton]=\"filterGroupIcon\"\r\n (iconButtonClick)=\"showGroupFilter()\"\r\n >\r\n </ieeesa-icon-button>\r\n <button\r\n mat-button\r\n [attr.aria-label]=\"constants?.viewGroups?.ariaLabel?.search\"\r\n (click)=\"onGroupSearch()\"\r\n type=\"button\"\r\n >\r\n <i class=\"fa-solid fa-magnifying-glass search-group-icon\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n <div\r\n class=\"ieeesa-groups__actions\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-groups__actions--white-bg'\r\n : 'ieeesa-groups__actions--blue-bg'\r\n \"\r\n >\r\n <div class=\"ieeesa-groups__actions--search row\">\r\n <p\r\n class=\"ieeesa-body-md-16 order-2 order-sm-1 col-12 col-md-7 col-lg-7 col-xl-7\"\r\n >\r\n {{ groupsPageInfo.groupsDescription }}\r\n </p>\r\n <div\r\n *ngIf=\"\r\n ((isGroupSearchActive || isGroupFilterActive) && isMobileView) ||\r\n !isMobileView\r\n \"\r\n class=\"order-1 order-sm-2 col-12 col-md-5 col-lg-5 col-xl-5 d-flex flex-column\"\r\n >\r\n <ieeesa-search\r\n *ngIf=\"isGroupSearchActive || !isMobileView\"\r\n (searchValue)=\"onGroupSearchClick($event)\"\r\n [placeholderLabel]=\"searchPlaceHolderText\"\r\n ></ieeesa-search>\r\n <ieeesa-select\r\n *ngIf=\"isGroupFilterActive || !isMobileView\"\r\n class=\"align-self-end pt-lg-4 pt-md-4 pt-xl-4\"\r\n [dropdownOptions]=\"selectGroupOptions\"\r\n [isLabelAlignedLeft]=\"true\"\r\n [selectLabel]=\"constants?.viewGroups?.filterByLabel\"\r\n (optionSelected)=\"onGroupTypeFiltered($event)\"\r\n [placeholderText]=\"filterPlaceHolderText\"\r\n [selectedOptions]=\"selectedGroupType\"\r\n ></ieeesa-select>\r\n </div>\r\n </div>\r\n <ieeesa-tree\r\n *ngIf=\"parentGroupsInfo && parentGroupsInfo.length > 0\"\r\n [parentGroupsInfo]=\"parentGroupsInfo\"\r\n [childGroupsInfo]=\"childGroupsInfo\"\r\n [deletedGroupIdInfo]=\"deletedGroupId\"\r\n [isGroupSearchOrFilterActive]=\"isGroupSearchOrFilterActive\"\r\n (toggleGroupClick)=\"getGroups($event)\"\r\n (createGroupClick)=\"openCreateGroupForm($event)\"\r\n (deleteGroupClick)=\"openDeleteConfirmationModal($event)\"\r\n (viewRosterClick)=\"viewRoster($event)\"\r\n (editGroupClick)=\"openEditGroupForm($event)\"\r\n ></ieeesa-tree>\r\n <div\r\n *ngIf=\"parentGroupsInfo && parentGroupsInfo.length > 0\"\r\n class=\"d-flex flex-column flex-sm-row flex-md-row mt-4 justify-content-start justify-content-sm-end\"\r\n >\r\n <p class=\"px-sm-3 d-flex align-items-start ieeesa-label-lg-bold-16\">\r\n {{ constants?.viewGroups?.legend }}\r\n </p>\r\n <ieeesa-legend [legends]=\"groupsLegends\" [isSorting]=\"isSorting\"></ieeesa-legend>\r\n </div>\r\n </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n ],\r\n exports: []\r\n})\r\nexport class GroupsModule { }\r\n","/*\r\n * Public API Surface of groups\r\n */\r\nexport * from './lib/components/create-group/create-group.component';\r\nexport * from './lib/components/tree-view/tree-view.component';\r\nexport * from './lib/groups.component';\r\n\r\nexport * from './lib/models/create-group.model';\r\nexport * from './lib/models/group-action.model';\r\nexport * from './lib/models/group-function-type.model';\r\nexport * from './lib/models/group-info.model';\r\nexport * from './lib/models/group-types.model';\r\nexport * from './lib/models/view-group.model';\r\nexport * from './lib/models/edit-group.model';\r\nexport * from './lib/models/form-status.model';\r\nexport * from './lib/models/delete-group.model';\r\n\r\nexport * from './lib/services/groups.service';\r\n\r\nexport * from './lib/assets/form-validations';\r\n\r\nexport * from './lib/groups.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["screenTexts?.errors","i1","screenTexts?.createGroup","i1.GroupsService","i3","takeUntil","map","constants","i2","screenTexts?.deleteGroup","i2.GroupsService","i4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ieeesa-npm-groups.mjs","sources":["../../../projects/groups/src/lib/assets/form-validations.ts","../../../projects/groups/src/lib/models/form-status.model.ts","../../../projects/groups/src/lib/models/group-function-type.model.ts","../../../projects/groups/src/lib/services/groups.service.ts","../../../projects/groups/src/lib/components/create-group/create-group.component.ts","../../../projects/groups/src/lib/components/create-group/create-group.component.html","../../../projects/groups/src/lib/models/group-action.model.ts","../../../projects/groups/src/lib/components/tree-view/tree-view.component.ts","../../../projects/groups/src/lib/components/tree-view/tree-view.component.html","../../../projects/groups/src/lib/components/add-user-roster/add-user-roster.component.ts","../../../projects/groups/src/lib/components/add-user-roster/add-user-roster.component.html","../../../projects/groups/src/lib/components/view-roster/view-roster.component.ts","../../../projects/groups/src/lib/components/view-roster/view-roster.component.html","../../../projects/groups/src/lib/groups.component.ts","../../../projects/groups/src/lib/groups.component.html","../../../projects/groups/src/lib/groups.module.ts","../../../projects/groups/src/public-api.ts","../../../projects/groups/src/ieeesa-npm-groups.ts"],"sourcesContent":["/* eslint-disable no-useless-escape */\r\nexport const GroupsValidationPatterns = {\r\n // Group Name field regular expression, which accept Alpha Numeric, Special Characters (ASCII) and whitespace.\r\n groupName: /^(?=.*[a-zA-Z])[\\w\\s!\"#$%&'()*+,-.\\/\\:;<=>?@[\\]^_`{|}~\\\\]+$/i,\r\n // Group Short Name field regular expression which accept letters, numbers and \".\",\",\" , \"/\", \"-\" , \"_\" characters.\r\n shortName: /^(?=[a-zA-Z0-9])[a-zA-Z0-9.,\\/\\-_]+$/,\r\n // Group Scope field regular expression which accept Alpha Numeric, Special Characters and whitespace.\r\n groupScope: /^(?=.*[a-zA-Z])[\\w\\s!\"#$%&'()*+,-.\\/\\:;<=>?@[\\]^_`{|}~\\\\]+$/i,\r\n email: /^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$/,\r\n};","/* eslint-disable no-unused-vars */\r\nexport enum FormStatus {\r\n VALID = \"VALID\",\r\n INVALID = \"INVALID\",\r\n}","/* eslint-disable no-unused-vars */\r\nexport enum GroupFunctionType {\r\n CREATE = 'CREATE',\r\n EDIT = 'EDIT',\r\n VIEW_ROSTER = 'VIEW_ROSTER',\r\n FILTER = 'FILTER',\r\n ADD_USER_TO_ROSTER = 'ADD_USER_TO_ROSTER',\r\n TOGGLE = 'TOGGLE',\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, map, catchError, BehaviorSubject } from 'rxjs';\r\nimport {\r\n CreateGroupPayload,\r\n CreateGroupResponse,\r\n} from '../models/create-group.model';\r\nimport {\r\n GroupTypeConfiguration,\r\n GroupTypeConfigValue,\r\n GroupTypeResponse,\r\n} from '../models/group-types.model';\r\nimport { AlertsService, HttpService } from '@ieeesa-npm/utility';\r\nimport { GetGroupResponse, GetGroupsPayload } from '../models/view-group.model';\r\nimport * as screenTexts from '../assets/constants.json';\r\nimport { DeleteGroupPayload } from '../models/delete-group.model';\r\nimport { GroupInfo } from '../models/group-info.model';\r\nimport {\r\n SearchUsersPayload,\r\n FilterUsersByRolesPayload,\r\n GetGroupUsersResponse,\r\n User,\r\n} from '../models/user.model';\r\nimport { Role } from '../models/role.model';\r\nimport { CheckboxOption } from '@ieeesa-npm/presentation';\r\nimport { EditGroupPayload } from '../models/edit-group.model';\r\nimport { GroupFunctionType } from '../models/group-function-type.model';\r\nimport {\r\n AddNewUserPayload,\r\n GetUserDetailsPayload,\r\n SearchUserByEmailResponse,\r\n GroupUserDetailsResponse,\r\n} from '../models/add-new-user.model';\r\n\r\n/**\r\n * Groups service is an abstract layer and responsible for managing groups REST API calls.\r\n * @class GroupsService\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GroupsService {\r\n groupsText = screenTexts?.errors;\r\n apiBaseUrl!: string;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n userPermission: any;\r\n selectedGroupInfo!: GroupInfo | undefined;\r\n groupFunctionType!: GroupFunctionType;\r\n selectedGroupParentInfo!: GroupInfo | undefined;\r\n openModalNotifier = new BehaviorSubject<GroupFunctionType>(\r\n GroupFunctionType.VIEW_ROSTER\r\n );\r\n groupTypeRoles!: CheckboxOption[];\r\n canShowMessage = false;\r\n // eslint-disable-next-line no-empty-function, no-unused-vars\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private httpService: HttpService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService // eslint-disable-next-line no-empty-function\r\n ) {}\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setAppConfig(apiBaseUrl: string, userPermission: any) {\r\n this.apiBaseUrl = apiBaseUrl;\r\n this.userPermission = userPermission;\r\n }\r\n /**\r\n * Gets application group types from API and returns it as an observable.\r\n * @return {Observable<GroupTypeResponse>} -It returns group types if success else error.\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n getGroupTypes(): Observable<GroupTypeResponse> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/configurations/group_type`)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Returns all the groups based on passed group Id and group type.\r\n * @param {GetGroupsPayload} getGroupsPayload\r\n * @return {Observable<GetGroupResponse>}\r\n * @memberof GroupsService\r\n */\r\n getGroups(getGroupsPayload: GetGroupsPayload): Observable<GetGroupResponse> {\r\n let url = 'rootGroups';\r\n if (getGroupsPayload.groupId)\r\n url = 'immChildGroupsByGroupId/' + getGroupsPayload.groupId;\r\n else if (getGroupsPayload.groupTypeId)\r\n url = 'groupsByGroupType/' + getGroupsPayload.groupTypeId;\r\n\r\n return this.httpService.getData(`${this.apiBaseUrl}/groups/${url}`).pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n /**\r\n * Deletes a group based on the provided information\r\n * @param {groupId} string -groupId of the group which is to be deleted\r\n * @return {*} {Observable<any>} -Observable representing the group deletion response\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n deleteGroup(deleteGroupPayload: DeleteGroupPayload): Observable<any> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/delete`, deleteGroupPayload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Posts create group form data to server using HttpService for creating new group.\r\n * @param {CreateGroupPayload} createGroupPayload -create group form data which includes group name, type, short name, scope.\r\n * @return {Observable<CreateGroupResponse>} -returns create group API response (success or error) as an observable.\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n createGroup(\r\n createGroupPayload: CreateGroupPayload\r\n ): Observable<CreateGroupResponse> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/create`, createGroupPayload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Updates group form data to server using HttpService.\r\n * @param {EditGroupPayload} editGroupPayload -edit group form data which includes group name, short name, scope.\r\n * @return {Observable<EditGroupPayload>} -returns edit group API response (success or error) as an observable.\r\n * @memberof GroupsService\r\n */\r\n editGroup(\r\n editGroupPayload: EditGroupPayload\r\n ): Observable<CreateGroupResponse> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/edit`, editGroupPayload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * This method will parse the error codes and return the respective error message for each code.\r\n * @param {string[]} errorCodes\r\n * @return {string[]} errorMessage\r\n * @memberof GroupsService\r\n */\r\n parseErrorMessage(errorCodes: string[]) {\r\n const errorMessage: string[] = [];\r\n errorCodes?.forEach((item: string, index: number) => {\r\n const errorMessageKey = errorCodes[index] as keyof typeof this.groupsText;\r\n errorMessage.push(this.groupsText[errorMessageKey]);\r\n });\r\n return errorMessage;\r\n }\r\n\r\n /**\r\n * Sets selected group info.\r\n * @param {(GroupInfo | undefined)} selectedGroupInfo -selected group info.\r\n * @param {(GroupInfo | undefined)} [selectedGroupParentInfo] -selected parent group info.\r\n * @memberof GroupsService\r\n */\r\n setSelectedGroupInfo(\r\n selectedGroupInfo: GroupInfo | undefined,\r\n selectedGroupParentInfo?: GroupInfo | undefined\r\n ) {\r\n this.selectedGroupInfo = selectedGroupInfo;\r\n this.selectedGroupParentInfo = selectedGroupParentInfo;\r\n }\r\n\r\n /**\r\n * Returns the selected group info.\r\n * @return {(GroupInfo | undefined)} -group info.\r\n * @memberof GroupsService\r\n */\r\n getSelectedGroupInfo(): GroupInfo | undefined {\r\n return this.selectedGroupInfo;\r\n }\r\n\r\n /**\r\n * Returns the selected group parent group info.\r\n * @return {(GroupInfo | undefined)} -group info.\r\n * @memberof GroupsService\r\n */\r\n getSelectedGroupParentInfo(): GroupInfo | undefined {\r\n return this.selectedGroupParentInfo;\r\n }\r\n\r\n /**\r\n * Sets group function type.\r\n * @param {GroupFunctionType} groupFunctionType -group function type.\r\n * @memberof GroupsService\r\n */\r\n setGroupFunctionType(groupFunctionType: GroupFunctionType): void {\r\n this.groupFunctionType = groupFunctionType;\r\n }\r\n\r\n /**\r\n * Returns group function type.\r\n * @return {GroupFunctionType} -group function type.\r\n * @memberof GroupsService\r\n */\r\n getGroupFunctionType(): GroupFunctionType {\r\n return this.groupFunctionType;\r\n }\r\n\r\n /**\r\n * Gets the group users for the given group id.\r\n * @param {string} groupId\r\n * @return {Observable<GetGroupUsersResponse>}\r\n * @memberof GroupsService\r\n */\r\n getGroupUsers(groupId: string): Observable<GetGroupUsersResponse> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/roster/${groupId}`)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the group users based on the filtered roles.\r\n * @param {FilterUsersByRolesPayload} payload\r\n * @return {Observable<GetGroupUsersResponse>}\r\n * @memberof GroupsService\r\n */\r\n getGroupUsersByRoles(\r\n payload: FilterUsersByRolesPayload\r\n ): Observable<GetGroupUsersResponse> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/roster/groupUsersByRole`, payload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the group users based on searched name or email\r\n * @param {SearchUsersPayload} payload\r\n * @return {Observable<GetGroupUsersResponse>}\r\n * @memberof GroupsService\r\n */\r\n searchGroupUsers(\r\n payload: SearchUsersPayload\r\n ): Observable<GetGroupUsersResponse> {\r\n return this.httpService\r\n .postData(\r\n `${this.apiBaseUrl}/groups/roster/groupUsersByRoleByNameByEmail`,\r\n payload\r\n )\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the group roles based on the group type.\r\n * @param {string} groupTypeId\r\n * @return {Observable<CheckboxOption[]>}\r\n * @memberof GroupsService\r\n */\r\n getGroupTypeRoles(groupTypeId: string): Observable<CheckboxOption[]> {\r\n return this.httpService\r\n .getData(\r\n `${this.apiBaseUrl}/groups/config/rolesByGroupType/${groupTypeId}`\r\n )\r\n .pipe(\r\n map((response) => {\r\n const rolesOption: CheckboxOption[] = [];\r\n response?.body?.forEach((role: Role) => {\r\n rolesOption.push({\r\n id: role.roleId,\r\n name: role.roleName,\r\n disabled: false,\r\n checked: false,\r\n });\r\n });\r\n this.setGroupTypeUserRoles(rolesOption);\r\n return rolesOption;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Concatenates the group users assigned roles name separated by comma as string and returns the group users in an array.\r\n * @param {GetGroupUsersResponse} response\r\n * @return {User[]}\r\n * @memberof GroupsService\r\n */\r\n transformUserRolesNameAsString(response: GetGroupUsersResponse): User[] {\r\n const users: User[] = [];\r\n response?.body?.forEach((item) => {\r\n const roles: string[] = [];\r\n item?.rolesList?.forEach((role) => roles.push(role?.roleName));\r\n users.push({\r\n userId: item.userId,\r\n name: item.name,\r\n email: item.email,\r\n role: roles.join(', '),\r\n });\r\n });\r\n return users;\r\n }\r\n /**\r\n * Returns formatted group types.\r\n * @param {GroupTypeConfiguration[]} groupTypeResponse\r\n * @return {GroupTypeConfigValue}\r\n * @memberof GroupsService\r\n */\r\n getFormattedGroupTypes(\r\n groupTypeResponse: GroupTypeConfiguration[]\r\n ): GroupTypeConfigValue {\r\n const groupTypes: GroupTypeConfigValue = {};\r\n groupTypeResponse.forEach((item) => {\r\n groupTypes[item.configFieldId] = item.configFieldValue;\r\n });\r\n return groupTypes;\r\n }\r\n\r\n /**\r\n * Returns group user details if email is found, else throws error.\r\n * @param {string} email\r\n * @return {Observable<SearchUserByEmailResponse>}\r\n * @memberof GroupsService\r\n */\r\n getUserByEmail(email: string): Observable<SearchUserByEmailResponse> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/users/userByEmail/${email}`)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the user details for the selected group\r\n * @param {GetUserDetailsPayload} payload\r\n * @return {Observable<GroupUserDetailsResponse>}\r\n * @memberof GroupsService\r\n */\r\n getGroupUserDetails(\r\n payload: GetUserDetailsPayload\r\n ): Observable<GroupUserDetailsResponse> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/roster/userDetails`, payload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Posts add new user form data to the API for the selected group and returns the success or failure response.\r\n * @param {AddNewUserPayload} addNewUserPayload\r\n * @return {Observable<GroupUserDetailsResponse>}\r\n * @memberof GroupsService\r\n */\r\n addNewGroupUser(\r\n addNewUserPayload: AddNewUserPayload\r\n ): Observable<GroupUserDetailsResponse> {\r\n return this.httpService\r\n .postData(\r\n `${this.apiBaseUrl}/groups/roster/createGroupUserRole`,\r\n addNewUserPayload\r\n )\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Sets the loaded group type user roles\r\n * @param {CheckboxOption[]} userRoles\r\n * @memberof GroupsService\r\n */\r\n setGroupTypeUserRoles(userRoles: CheckboxOption[]): void {\r\n this.groupTypeRoles = userRoles;\r\n }\r\n\r\n /**\r\n * Returns the group type user roles.\r\n * @return {CheckboxOption[]}\r\n * @memberof GroupsService\r\n */\r\n getGroupTypeUserRoles(): CheckboxOption[] {\r\n return this.groupTypeRoles;\r\n }\r\n}\r\n","import {\r\n Component,\r\n EventEmitter,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormGroup, Validators } from '@angular/forms';\r\nimport {\r\n FormGrid,\r\n FormModel,\r\n SelectOption,\r\n DynamicFormComponent,\r\n FormControlType,\r\n AlignType,\r\n FieldConfig,\r\n} from '@ieeesa-npm/presentation';\r\nimport {\r\n AlertsService,\r\n AlertType,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport * as screenTexts from '../../assets/constants.json';\r\nimport { GroupsValidationPatterns } from '../../assets/form-validations';\r\nimport { CreateGroupPayload } from '../../models/create-group.model';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { GroupType } from '../../models/group-types.model';\r\nimport { GroupInfo } from '../../models/group-info.model';\r\nimport { EditGroupPayload } from '../../models/edit-group.model';\r\nimport { FormStatus } from '../../models/form-status.model';\r\nimport { GroupFunctionType } from '../../models/group-function-type.model';\r\n\r\n/**\r\n * CreateGroupComponent uses DynamicFormComponent to build create new group form and implement the functionalities of submission of form and handling success and error scenarios.\r\n * @class CreateGroupComponent\r\n * @implements {OnInit}\r\n * @implements {OnDestroy}\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'ieeesa-create-group',\r\n standalone: true,\r\n imports: [CommonModule, DynamicFormComponent, MatDialogModule],\r\n templateUrl: './create-group.component.html',\r\n styleUrls: ['./create-group.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [AlertsService],\r\n})\r\nexport class CreateGroupComponent implements OnInit, OnDestroy {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n /**\r\n * Event emitted when the form is successfully submitted.\r\n * @memberof CreateGroupComponent\r\n */\r\n @Output() submitFormResponse = new EventEmitter();\r\n /**\r\n * Event emitted when the form is cancelled.\r\n * @memberof CreateGroupComponent\r\n */\r\n @Output() formCancel = new EventEmitter();\r\n createGroupText = screenTexts?.createGroup;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n leftButtonLabel = this.createGroupText?.label?.leftButtonLabel;\r\n rightButtonLabel = this.createGroupText?.label?.rightButtonLabel;\r\n isLegendVisible = false;\r\n isLeftButtonNeeded = true;\r\n colWidth: FormGrid = { xs: 12, xl: 12, sm: 12, md: 12, lg: 12 };\r\n formGroup!: FormModel;\r\n groupTypes!: SelectOption[];\r\n actionButtonAlign = AlignType.LEFT;\r\n form!: FormGroup;\r\n selectedGroupInfo!: GroupInfo | undefined;\r\n groupFunctionType!: GroupFunctionType;\r\n selectedGroupParentInfo!: GroupInfo | undefined;\r\n // eslint-disable-next-line no-unused-vars, no-empty-function\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private groupsService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private globalErrorHandlerService: GlobalErrorHandlerService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService // eslint-disable-next-line no-empty-function\r\n ) {}\r\n\r\n /**\r\n * Initialize the create group form group array and component.\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n ngOnInit(): void {\r\n this.groupFunctionType = this.groupsService?.getGroupFunctionType();\r\n this.selectedGroupInfo = this.groupsService?.getSelectedGroupInfo();\r\n if (this.groupFunctionType === GroupFunctionType.EDIT) {\r\n this.selectedGroupParentInfo =\r\n this.groupsService?.getSelectedGroupParentInfo();\r\n this.createFormGroup();\r\n } else {\r\n this.groupsService\r\n .getGroupTypes()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n const groupTypes = this.groupsService?.getFormattedGroupTypes(res?.body);\r\n if (this.selectedGroupInfo?.groupType) {\r\n const allowedGroupType =\r\n groupTypes[this.selectedGroupInfo?.groupType]\r\n ?.businessRule?.allowedGroupType;\r\n if (allowedGroupType?.length) {\r\n this.groupTypes = allowedGroupType.map(\r\n (groupTypeId: string) => ({\r\n id: groupTypeId,\r\n name: groupTypes[groupTypeId]?.name,\r\n })\r\n );\r\n } else {\r\n this.showAlertMessage(\r\n screenTexts?.errors?.ER1000,\r\n AlertType.ERROR\r\n );\r\n }\r\n } else {\r\n this.groupTypes = Object.entries(groupTypes).map(\r\n ([id, item]: [string, GroupType]) => ({\r\n id,\r\n name: item?.name,\r\n })\r\n );\r\n }\r\n if (this.groupTypes?.length) {\r\n this.createFormGroup();\r\n } else {\r\n this.showAlertMessage(\r\n screenTexts?.errors?.['1010'],\r\n AlertType.ERROR\r\n );\r\n }\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Constructs and returns the group type form field based on edit group or not.\r\n * @return {FieldConfig} -group type form field.\r\n * @memberof CreateGroupComponent\r\n */\r\n getGroupTypeField(): FieldConfig {\r\n let groupTypeField: FieldConfig;\r\n if (this.groupFunctionType === GroupFunctionType.EDIT) {\r\n groupTypeField = {\r\n type: FormControlType?.TEXT_AREA,\r\n label: this.createGroupText?.label?.groupType,\r\n controlName: 'groupType',\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n value: this.selectedGroupInfo?.groupTypeInfo?.name,\r\n ariaLabel: this.constants?.editGroup?.ariaLabel?.groupType,\r\n isResize: true,\r\n };\r\n } else {\r\n groupTypeField = {\r\n type: FormControlType?.SELECT,\r\n label: this.createGroupText?.label?.groupType + '*',\r\n controlName: 'groupType',\r\n requiredErrorMessage: this.createGroupText?.message?.error?.required,\r\n value: '',\r\n validation: [Validators.required],\r\n dropdownOptions: this.groupTypes,\r\n supportMessage: this.createGroupText?.supportText?.groupType,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.groupType,\r\n placeholder: '',\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.groupType,\r\n };\r\n }\r\n return groupTypeField;\r\n }\r\n\r\n /**\r\n * Initialize the create group form group array.\r\n * @memberof CreateGroupComponent\r\n */\r\n createFormGroup(): void {\r\n this.formGroup = {\r\n formGroup: [\r\n {\r\n legend: '',\r\n controls: [\r\n this.getGroupTypeField(),\r\n {\r\n type: FormControlType?.INPUT,\r\n label: this.createGroupText?.label?.groupName + '*',\r\n controlName: 'groupName',\r\n requiredErrorMessage:\r\n this.createGroupText?.message?.error?.required,\r\n value:\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.selectedGroupInfo?.groupName\r\n : '',\r\n placeholder: '',\r\n supportMessage: this.createGroupText?.supportText?.groupName,\r\n patternErrorMessage:\r\n this.createGroupText?.message?.error?.pattern?.groupName,\r\n validation: [\r\n Validators.required,\r\n Validators.maxLength(\r\n screenTexts?.createGroup?.characterLimit?.character500\r\n ),\r\n Validators.pattern(GroupsValidationPatterns?.groupName),\r\n ],\r\n maxErrorMessage:\r\n this.createGroupText?.message?.error?.limit?.groupName,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.groupName,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.groupName,\r\n },\r\n {\r\n type: FormControlType?.INPUT,\r\n label: this.createGroupText?.label?.shortName + '*',\r\n controlName: 'shortName',\r\n requiredErrorMessage:\r\n this.createGroupText?.message?.error?.required,\r\n value:\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.selectedGroupInfo?.groupShortName\r\n : '',\r\n patternErrorMessage:\r\n this.createGroupText?.message?.error?.pattern?.shortName,\r\n placeholder: '',\r\n supportMessage: this.createGroupText?.supportText?.shortName,\r\n validation: [\r\n Validators.required,\r\n Validators.maxLength(\r\n screenTexts?.createGroup?.characterLimit?.character15\r\n ),\r\n Validators.pattern(GroupsValidationPatterns?.shortName),\r\n ],\r\n maxErrorMessage:\r\n this.createGroupText?.message?.error?.limit?.shortName,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.shortName,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.shortName,\r\n },\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.createGroupText?.label?.groupScope,\r\n controlName: 'groupScope',\r\n patternErrorMessage:\r\n this.createGroupText?.message?.error?.pattern?.groupScope,\r\n value:\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.selectedGroupInfo?.groupDesc\r\n : '',\r\n placeholder: '',\r\n supportMessage: this.createGroupText?.supportText?.groupScope,\r\n isResize: true,\r\n maxLength:\r\n screenTexts?.createGroup?.characterLimit?.character2000,\r\n validation: [\r\n Validators.maxLength(\r\n screenTexts?.createGroup?.characterLimit?.character1500\r\n ),\r\n Validators.pattern(GroupsValidationPatterns?.groupScope),\r\n ],\r\n maxErrorMessage:\r\n this.createGroupText?.message?.error?.limit?.groupScope,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.groupScope,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.groupScope,\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n if (this.selectedGroupInfo?.groupId) {\r\n this.updateCreateFormGroup(this.selectedGroupInfo);\r\n }\r\n }\r\n\r\n /**\r\n * Update the create sub group form group array.\r\n * @param {GroupInfo} parentGroupInfo -Parent group info.\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n updateCreateFormGroup(parentGroupInfo: GroupInfo): void {\r\n const parentGroup = {\r\n type: FormControlType?.TEXT_AREA,\r\n label: this.createGroupText?.label?.parentGroup,\r\n controlName: 'parentGroup',\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n value:\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.selectedGroupParentInfo?.groupName\r\n : parentGroupInfo?.groupName,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.parentGroup,\r\n isResize: true,\r\n };\r\n if (parentGroup?.value) {\r\n this.formGroup?.formGroup[0]?.controls?.unshift(parentGroup);\r\n }\r\n }\r\n\r\n /**\r\n * Handles client side validation and calls create group or edit group methods.\r\n * @param {FormGroup[]} form -Array of formGroup\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n onFormSubmit(form: FormGroup[]): void {\r\n form[0]?.markAllAsTouched();\r\n if (form[0].status === FormStatus.VALID) {\r\n const formData = form[0]?.getRawValue();\r\n // eslint-disable-next-line no-unused-expressions\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.editGroup(formData)\r\n : this.createGroup(formData);\r\n }\r\n }\r\n\r\n /**\r\n * Constructs create group payload and calls create group API and emits create group API response.\r\n * @param formData\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n createGroup(formData: any): void {\r\n const createGroupPayload: CreateGroupPayload = {\r\n payload: {\r\n groupName: formData?.groupName,\r\n groupShortName: formData?.shortName,\r\n groupType: formData?.groupType?.id,\r\n groupDesc: formData?.groupScope,\r\n groupParentId: this.selectedGroupInfo?.groupId ?? null,\r\n },\r\n };\r\n this.groupsService\r\n .createGroup(createGroupPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.submitFormResponse?.emit(res);\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Constructs edit group payload and calls edit group API and emits create group API response.\r\n * @param {*} formData\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n editGroup(formData: any): void {\r\n const editGroupPayload: EditGroupPayload = {\r\n payload: {\r\n groupName: formData?.groupName,\r\n groupShortName: formData?.shortName,\r\n groupDesc: formData?.groupScope,\r\n groupParentId: this.selectedGroupInfo?.groupParentId ?? null,\r\n groupId: this.selectedGroupInfo?.groupId as string,\r\n },\r\n };\r\n this.groupsService\r\n .editGroup(editGroupPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.submitFormResponse?.emit(res);\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Captures the server side errors and handles the errors based on the custom or Http errors.\r\n * @param {HttpErrorResponse} error\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n handleErrors(error: HttpErrorResponse): void {\r\n const errorCodes: string[] = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes)) {\r\n const errorMessage: string[] =\r\n this.groupsService?.parseErrorMessage(errorCodes);\r\n this.showAlertMessage(errorMessage, AlertType.ERROR);\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService?.handleError(error);\r\n }\r\n }\r\n\r\n /**\r\n * Get form reference.\r\n * @param {FormGroup[]} form\r\n * @memberof CreateGroupComponent\r\n */\r\n getFormGroupReference(form: FormGroup[]) {\r\n this.form = form[0];\r\n }\r\n\r\n /**\r\n * Handles alerts for error, warning.\r\n * @param {(string | string[])} message -error or warning message\r\n * @param {AlertType} alertType\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n showAlertMessage(message: string | string[], alertType: AlertType): void {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: message,\r\n alertType: alertType,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n\r\n /**\r\n * Emits form cancel event.\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n createGroupCancelled(): void {\r\n this.formCancel?.emit();\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof CreateGroupComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<ieeesa-dynamic-form\r\n *ngIf=\"formGroup\"\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLegendVisible]=\"isLegendVisible\"\r\n [colWidth]=\"colWidth\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n [formGroups]=\"formGroup\"\r\n [isLeftButtonNeeded]=\"isLeftButtonNeeded\"\r\n (formSubmit)=\"onFormSubmit($event)\"\r\n (formLeftButtonClicked)=\"createGroupCancelled()\"\r\n (formGroupsReference)=\"getFormGroupReference($event)\"\r\n></ieeesa-dynamic-form>","/* eslint-disable no-unused-vars */\r\nexport enum GroupAction {\r\n VIEW_ROSTER = 1,\r\n CREATE_SUB_GROUP = 2,\r\n EDIT_GROUP = 3,\r\n DELETE_GROUP = 4,\r\n EXPAND_GROUP_VIEW = 5,\r\n COLLAPSE_GROUP_VIEW = 6,\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Injectable,\r\n Input,\r\n OnInit,\r\n Output,\r\n AfterViewInit,\r\n OnDestroy,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport {\r\n MenuComponent,\r\n Menu,\r\n IconButtonComponent,\r\n IconButton,\r\n TextTruncatedDirective\r\n} from '@ieeesa-npm/presentation';\r\nimport * as constants from '../../assets/constants.json';\r\nimport { GroupAction } from '../../models/group-action.model';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n CollectionViewer,\r\n SelectionChange,\r\n DataSource,\r\n} from '@angular/cdk/collections';\r\nimport { FlatTreeControl } from '@angular/cdk/tree';\r\nimport { BehaviorSubject, merge, Observable, Subject } from 'rxjs';\r\nimport { map, takeUntil } from 'rxjs/operators';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTreeModule, MatTreeNodePadding } from '@angular/material/tree';\r\nimport { GroupInfo } from '../../models/group-info.model';\r\nimport { EditGroupAndParentInfo } from '../../models/edit-group.model';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { GroupFunctionType } from '../../models/group-function-type.model';\r\n/**\r\n * Dynamic Flat node creates a node structure\r\n * @export\r\n * @class GroupNode\r\n */\r\nexport class GroupNode {\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public item: GroupInfo,\r\n // eslint-disable-next-line no-unused-vars\r\n public level = 1,\r\n // eslint-disable-next-line no-unused-vars\r\n public expandable = false,\r\n // eslint-disable-next-line no-unused-vars\r\n public isLoading = false // eslint-disable-next-line no-empty-function\r\n ) {}\r\n}\r\n\r\n/**\r\n * Groups stores the parent nodes and child nodes\r\n * @export\r\n * @class Groups\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class Groups {\r\n rootLevelNodes!: GroupInfo[];\r\n /** Initial data from database */\r\n private childGroups!: GroupInfo[];\r\n /**\r\n * Get the Child groups info\r\n * @return {*} {GroupInfo[]}\r\n * @memberof Groups\r\n */\r\n getChildGroupsInfo(): GroupInfo[] {\r\n return this.childGroups;\r\n }\r\n /**\r\n * Sets the Child groups info\r\n * @param {GroupInfo[]} value\r\n * @memberof Groups\r\n */\r\n setChildGroupsInfo(value: GroupInfo[]): void {\r\n this.childGroups = value;\r\n }\r\n /**\r\n * Initialize the groups data and creates the node structure for mat tree\r\n * @param {GroupInfo[]} data\r\n * @return {*} {GroupNode[]}\r\n * @memberof Groups\r\n */\r\n initialData(data: GroupInfo[]): GroupNode[] {\r\n this.rootLevelNodes = data;\r\n return this.rootLevelNodes.map(\r\n (node) => new GroupNode(node, 0, this.isExpandable(node))\r\n );\r\n }\r\n /**\r\n * Checks the node is expandable or not\r\n * @param {GroupInfo} node\r\n * @return {*} {boolean}\r\n * @memberof Groups\r\n */\r\n isExpandable(node: GroupInfo): boolean {\r\n return (\r\n (!!node?.children && node?.children?.length > 0) || node?.hasChildren\r\n );\r\n }\r\n}\r\n/**\r\n * Dynamic Data Source handles the connection with dynamic data base\r\n * @export\r\n * @class GroupsDataSource\r\n * @implements {DataSource<GroupNode>}\r\n */\r\nexport class GroupsDataSource implements DataSource<GroupNode> {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n dataChange = new BehaviorSubject<GroupNode[]>([]);\r\n /**\r\n * Gets the updated tree control data\r\n * @type {GroupNode[]}\r\n * @memberof GroupsDataSource\r\n */\r\n get data(): GroupNode[] {\r\n return this.dataChange?.value;\r\n }\r\n /**\r\n * Sets the data to tree control and emit the value to intimate the data change\r\n * @memberof GroupsDataSource\r\n */\r\n set data(value: GroupNode[]) {\r\n this.treeControl.dataNodes = value;\r\n this.dataChange.next(value);\r\n }\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private treeControl: FlatTreeControl<GroupNode>,\r\n // eslint-disable-next-line no-unused-vars\r\n private database: Groups // eslint-disable-next-line no-empty-function\r\n ) {}\r\n\r\n /**\r\n * Handles the connection between the data base and mat tree\r\n * @param {CollectionViewer} collectionViewer\r\n * @return {*} {Observable<GroupNode[]>}\r\n * @memberof GroupsDataSource\r\n */\r\n connect(collectionViewer: CollectionViewer): Observable<GroupNode[]> {\r\n this.treeControl?.expansionModel?.changed\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((change) => {\r\n if (\r\n (change as SelectionChange<GroupNode>).added ||\r\n (change as SelectionChange<GroupNode>).removed\r\n ) {\r\n this.handleTreeControl(change as SelectionChange<GroupNode>);\r\n }\r\n });\r\n return merge(collectionViewer?.viewChange, this.dataChange).pipe(\r\n map(() => this.data)\r\n );\r\n }\r\n /**\r\n * Disconnect the connection with mat tree\r\n * @param {CollectionViewer} collectionViewer\r\n * @memberof GroupsDataSource\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function, no-empty-function, no-unused-vars, @typescript-eslint/no-unused-vars\r\n disconnect(collectionViewer: CollectionViewer): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n\r\n /**\r\n * Adds/removes the child nodes while expands/collapses the parent node\r\n * @param {SelectionChange<GroupNode>} change\r\n * @memberof GroupsDataSource\r\n */\r\n handleTreeControl(change: SelectionChange<GroupNode>) {\r\n if (change?.added) {\r\n change.added?.forEach((node) => this.toggleNode(node, true));\r\n }\r\n if (change?.removed) {\r\n change.removed\r\n .slice()\r\n .reverse()\r\n .forEach((node) => this.toggleNode(node, false));\r\n }\r\n }\r\n\r\n /**\r\n * Toggle the node, add/removes the node from display\r\n * @param {GroupNode} clickedNode\r\n * @param {boolean} expand\r\n * @return {*}\r\n * @memberof GroupsDataSource\r\n */\r\n toggleNode(clickedNode: GroupNode, expand: boolean) {\r\n const children = this.database?.getChildGroupsInfo();\r\n const index = this.data?.indexOf(clickedNode);\r\n if (!children || index < 0) {\r\n // If no children, or cannot find the node, no op\r\n return;\r\n }\r\n\r\n if (expand) {\r\n clickedNode.item.noOfChildren = children.length;\r\n const nodes = children?.map(\r\n (node) =>\r\n new GroupNode(\r\n node,\r\n clickedNode?.level + 1,\r\n this.database?.isExpandable(node)\r\n )\r\n );\r\n this.data?.splice(index + 1, 0, ...nodes);\r\n } else {\r\n let count = 0;\r\n for (\r\n let i = index + 1;\r\n i < this.data?.length && this.data[i]?.level > clickedNode?.level;\r\n i++, count++ // eslint-disable-next-line no-empty\r\n ) {}\r\n this.data?.splice(index + 1, count);\r\n }\r\n\r\n // Notify the change\r\n this.dataChange?.next(this.data);\r\n }\r\n}\r\n/**\r\n * Displays the groups where parent/child relationships are represented in a tree view/hierarchy.\r\n * @export\r\n * @class TreeViewComponent\r\n * @implements {OnInit}\r\n */\r\n@Component({\r\n selector: 'ieeesa-tree',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatTreeModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MenuComponent,\r\n IconButtonComponent,\r\n MatTooltipModule,\r\n TextTruncatedDirective,\r\n ],\r\n templateUrl: './tree-view.component.html',\r\n styleUrls: ['./tree-view.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class TreeViewComponent implements OnInit, AfterViewInit, OnDestroy {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n buttons: Menu[] = this.constants?.viewGroups?.buttons;\r\n treePaddingIndent: number = this.constants?.viewGroups?.treePaddingIndent;\r\n selectedGroup!: GroupNode;\r\n selectedGroupAction!: Menu | IconButton;\r\n treeControl!: FlatTreeControl<GroupNode>;\r\n dataSource!: GroupsDataSource;\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n matTreeNodePadding!: MatTreeNodePadding<GroupNode>;\r\n plusCircleIconButton: IconButton = this.buttons[4];\r\n minusCircleIconButton: IconButton = this.buttons[5];\r\n editGroupAndParentGroupInfo!: EditGroupAndParentInfo;\r\n menuItems: Menu[] = this.buttons?.filter(\r\n (e) =>\r\n e.id !== GroupAction?.EXPAND_GROUP_VIEW &&\r\n e.id !== GroupAction?.COLLAPSE_GROUP_VIEW\r\n );\r\n private parentGroups!: GroupInfo[];\r\n @Input()\r\n set parentGroupsInfo(value: GroupInfo[]) {\r\n this.parentGroups = value;\r\n if (value) this.setGroupDataSource();\r\n }\r\n get parentGroupsInfo(): GroupInfo[] {\r\n return this.parentGroups;\r\n }\r\n private childGroups!: GroupInfo[];\r\n @Input()\r\n set childGroupsInfo(value: GroupInfo[]) {\r\n this.childGroups = value;\r\n this.loadChildGroups();\r\n }\r\n get childGroupsInfo(): GroupInfo[] {\r\n return this.childGroups;\r\n }\r\n private isGroupSearchOrFilter = false;\r\n @Input()\r\n set isGroupSearchOrFilterActive(value: boolean) {\r\n this.isGroupSearchOrFilter = value;\r\n }\r\n get isGroupSearchOrFilterActive(): boolean {\r\n return this.isGroupSearchOrFilter;\r\n }\r\n private deletedGroupId!: string | undefined;\r\n @Input()\r\n set deletedGroupIdInfo(id: string | undefined) {\r\n this.deletedGroupId = id;\r\n this.deleteGroupNode(this.deletedGroupId);\r\n }\r\n get deletedGroupIdInfo(): string | undefined {\r\n return this.deletedGroupId;\r\n }\r\n\r\n @Output() toggleGroupClick = new EventEmitter<GroupInfo>();\r\n @Output() createGroupClick = new EventEmitter<GroupInfo>();\r\n @Output() editGroupClick = new EventEmitter<EditGroupAndParentInfo>();\r\n @Output() deleteGroupClick = new EventEmitter<GroupInfo>();\r\n @Output() viewRosterClick = new EventEmitter<GroupInfo>();\r\n // eslint-disable-next-line no-unused-vars, no-empty-function\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public database: Groups,\r\n // eslint-disable-next-line no-unused-vars\r\n public elementRef: ElementRef,\r\n // eslint-disable-next-line no-unused-vars\r\n public groupsService: GroupsService // eslint-disable-next-line no-empty-function\r\n ) {}\r\n /**\r\n * Initializes the tree view component\r\n * @memberof TreeViewComponent\r\n */\r\n ngOnInit(): void {\r\n this.setGroupDataSource();\r\n }\r\n /**\r\n * Assign ARIA role for all mat tree nodes as \"row\"\r\n * @memberof TreeViewComponent\r\n */\r\n ngAfterViewInit(): void {\r\n this.dataSource?.dataChange\r\n ?.pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n const treeItemNodes =\r\n this.elementRef?.nativeElement?.querySelectorAll('[role=treeitem]');\r\n treeItemNodes?.forEach((node: HTMLElement) => (node.role = 'row'));\r\n });\r\n }\r\n /**\r\n * Gets the level of the node\r\n * @param {GroupNode} node\r\n * @memberof TreeViewComponent\r\n */\r\n getLevel = (node: GroupNode) => node?.level;\r\n\r\n /**\r\n * Checks the node is expandable or not\r\n * @param {GroupNode} node\r\n * @memberof TreeViewComponent\r\n */\r\n isExpandable = (node: GroupNode) => node?.expandable;\r\n\r\n /**\r\n * Returns true if passed node has children otherwise false\r\n * @param {number} index\r\n * @param {GroupNode} node\r\n * @return {boolean}\r\n * @memberof TreeViewComponent\r\n */\r\n hasChildGroups = (index: number, _nodeData: GroupNode) =>\r\n _nodeData.expandable;\r\n /**\r\n * Emits the group info when the toggle group is clicked or toggles the group view\r\n * @param {GroupNode} group\r\n * @memberof TreeViewComponent\r\n */\r\n viewChildGroups(node: GroupNode) {\r\n if (!node?.item?.hasChildren) {\r\n return;\r\n }\r\n if (this.treeControl?.isExpanded(node)) {\r\n this.treeControl?.toggle(node);\r\n } else {\r\n this.groupsService.setGroupFunctionType(GroupFunctionType.TOGGLE);\r\n this.toggleGroupClick.emit(node?.item);\r\n this.selectedGroup = node;\r\n }\r\n }\r\n /**\r\n * Sets the box shadow based on the group type legend color\r\n * @param {string} color\r\n * @return {*}\r\n * @memberof TreeViewComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n getBoxShadow(color: string): any {\r\n return {\r\n boxShadow:\r\n '0px 1px 0px 0px #c9cbd0 inset, 6px 0px 0px 0px ' + color + ' inset',\r\n };\r\n }\r\n /**\r\n * Sets the dataSource with parent groups data\r\n * @memberof TreeViewComponent\r\n */\r\n setGroupDataSource(): void {\r\n if (\r\n this.dataSource &&\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.CREATE\r\n ) {\r\n this.parentGroupsInfo?.forEach((parentGroupNode) => {\r\n if (\r\n this.dataSource?.data?.findIndex(\r\n (node) => node?.item?.groupId === parentGroupNode?.groupId\r\n ) === -1\r\n ) {\r\n const newGroupNode = new GroupNode(\r\n parentGroupNode,\r\n 0,\r\n this.database.isExpandable(parentGroupNode)\r\n );\r\n const groupNodesReference = this.dataSource?.data;\r\n groupNodesReference?.push(newGroupNode);\r\n this.dataSource.data = groupNodesReference;\r\n }\r\n });\r\n } else if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.EDIT\r\n ) {\r\n this.editGroup(this.parentGroupsInfo);\r\n } else {\r\n this.treeControl = new FlatTreeControl<GroupNode>(\r\n this.getLevel,\r\n this.isExpandable\r\n );\r\n this.dataSource = new GroupsDataSource(this.treeControl, this.database);\r\n this.dataSource.data = this.database?.initialData(this.parentGroupsInfo);\r\n }\r\n }\r\n /**\r\n * Sets the updated node information\r\n * @param {GroupInfo[]} groupsInfo\r\n * @memberof TreeViewComponent\r\n */\r\n editGroup(groupsInfo: GroupInfo[]) {\r\n const groupNodeReference = this.dataSource?.data;\r\n const editedNode = groupsInfo?.find(\r\n (node) =>\r\n node?.groupId === this.editGroupAndParentGroupInfo?.groupInfo?.groupId\r\n );\r\n groupNodeReference?.forEach((node) => {\r\n if (\r\n node?.item?.groupId ===\r\n this.editGroupAndParentGroupInfo?.groupInfo?.groupId\r\n ) {\r\n const noOfChildrenReference = node.item.noOfChildren;\r\n node.item = editedNode as GroupInfo;\r\n node.item.noOfChildren = noOfChildrenReference;\r\n node.expandable = this.database.isExpandable(node?.item);\r\n if (node.item.hasChildren && this.treeControl.isExpanded(node)) {\r\n this.treeControl.toggle(node);\r\n }\r\n }\r\n });\r\n this.dataSource.data = groupNodeReference;\r\n }\r\n /**\r\n * Loads the child groups and updates the tree view.\r\n * @memberof TreeViewComponent\r\n */\r\n loadChildGroups() {\r\n this.database?.setChildGroupsInfo(this.childGroupsInfo);\r\n const groupNodesReference = this.dataSource?.data;\r\n if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.CREATE\r\n ) {\r\n if (!this.selectedGroup?.item?.hasChildren) {\r\n this.selectedGroup.item.hasChildren = true;\r\n const groupParentNode = new GroupNode(\r\n this.selectedGroup.item,\r\n this.selectedGroup.level,\r\n true\r\n );\r\n groupNodesReference.splice(\r\n groupNodesReference.indexOf(this.selectedGroup),\r\n 1,\r\n groupParentNode\r\n );\r\n this.treeControl.expand(groupParentNode);\r\n }\r\n if (this.treeControl.isExpanded(this.selectedGroup)) {\r\n const children = this.database.getChildGroupsInfo();\r\n children?.forEach((groupNode) => {\r\n if (\r\n this.dataSource?.data?.findIndex(\r\n (node) => node?.item?.groupId === groupNode?.groupId\r\n ) === -1\r\n ) {\r\n const newGroupNode = new GroupNode(\r\n groupNode,\r\n this.selectedGroup?.level + 1,\r\n this.database?.isExpandable(groupNode)\r\n );\r\n const groupNodesReference = this.dataSource?.data;\r\n groupNodesReference.forEach((node) => {\r\n if (node.item.groupId === this.selectedGroup.item.groupId) {\r\n node.item.noOfChildren = children.length;\r\n }\r\n });\r\n groupNodesReference.splice(\r\n groupNodesReference.indexOf(this.selectedGroup) + 1,\r\n 0,\r\n newGroupNode\r\n );\r\n this.dataSource.data = groupNodesReference;\r\n }\r\n });\r\n }\r\n } else if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.EDIT\r\n ) {\r\n this.editGroup(this.childGroupsInfo);\r\n } else if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.TOGGLE\r\n ) {\r\n this.treeControl?.toggle(this.selectedGroup);\r\n }\r\n }\r\n /**\r\n * Deletes the selected group and updates the tree view.\r\n * @param {string} deletedGroupId\r\n * @memberof TreeViewComponent\r\n */\r\n deleteGroupNode(deletedGroupId: string | undefined): void {\r\n if (this.treeControl && deletedGroupId) {\r\n const deletedGroupIndex = this.dataSource.data.findIndex(\r\n (node) => node.item.groupId === deletedGroupId\r\n );\r\n const deletedGroup = this.dataSource.data.at(deletedGroupIndex);\r\n const dataSourceReference = this.dataSource.data;\r\n if (deletedGroupIndex) {\r\n if (deletedGroup?.item.groupParentId !== null) {\r\n const deletedParentGroupIndex = this.dataSource.data.findIndex(\r\n (node) => node.item.groupId === deletedGroup?.item.groupParentId\r\n );\r\n const deletedParentGroup = this.dataSource.data.at(\r\n deletedParentGroupIndex\r\n );\r\n if (deletedParentGroup && deletedParentGroup.item.noOfChildren) {\r\n deletedParentGroup.item.noOfChildren =\r\n deletedParentGroup.item.noOfChildren - 1;\r\n if (deletedParentGroup.item.noOfChildren === 0) {\r\n deletedParentGroup.item.hasChildren = false;\r\n const newNode = new GroupNode(\r\n deletedParentGroup.item,\r\n deletedParentGroup.level,\r\n false\r\n );\r\n dataSourceReference.splice(deletedGroupIndex - 1, 2, newNode);\r\n } else {\r\n dataSourceReference.splice(deletedGroupIndex, 1);\r\n }\r\n }\r\n } else {\r\n dataSourceReference.splice(deletedGroupIndex, 1);\r\n }\r\n }\r\n this.dataSource.data = dataSourceReference;\r\n this.deletedGroupId = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the selected menu group action\r\n * @param {Menu} menu\r\n * @memberof TreeViewComponent\r\n */\r\n onGroupActionsClick(menu: Menu | IconButton): void {\r\n this.selectedGroupAction = menu;\r\n }\r\n /**\r\n * Changes the expand/collapse icon based on the toggle\r\n * @param {GroupNode} group\r\n * @return {*} {*}\r\n * @memberof TreeViewComponent\r\n */\r\n getToggleButtonInfo(group: GroupNode): IconButton {\r\n if (this.treeControl?.isExpanded(group)) return this.minusCircleIconButton;\r\n return this.plusCircleIconButton;\r\n }\r\n /**\r\n * Handles the emitted group actions event\r\n * @param {GroupInfo} group\r\n * @memberof TreeViewComponent\r\n */\r\n handleGroupActions(group: GroupNode): void {\r\n if (this.selectedGroupAction?.id === GroupAction.VIEW_ROSTER) {\r\n this.viewRosterClick.emit(group?.item);\r\n } else if (this.selectedGroupAction?.id === GroupAction.CREATE_SUB_GROUP) {\r\n this.selectedGroup = group;\r\n this.createGroupClick.emit(group?.item);\r\n } else if (this.selectedGroupAction?.id === GroupAction.EDIT_GROUP) {\r\n const editGroupParentInfo = this.dataSource?.data?.filter(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (item: any) => item?.item?.groupId === group?.item?.groupParentId\r\n )[0]?.item;\r\n this.editGroupAndParentGroupInfo = {\r\n groupInfo: group?.item,\r\n parentGroupInfo: editGroupParentInfo,\r\n };\r\n this.editGroupClick.emit(this.editGroupAndParentGroupInfo);\r\n } else if (this.selectedGroupAction?.id === GroupAction.DELETE_GROUP) {\r\n this.deleteGroupClick.emit(group?.item);\r\n }\r\n }\r\n /**\r\n * Returns the filtered menu items based on groups hasChildren.\r\n * @param {GroupNode} group\r\n * @return {Menu[]}\r\n * @memberof TreeViewComponent\r\n */\r\n getFilteredGroupActions(group: GroupNode): Menu[] {\r\n const filteredMenu: Menu[] = [];\r\n this.menuItems?.forEach((e) => {\r\n e.isToolTipNeeded = false;\r\n if (\r\n e?.id === GroupAction.VIEW_ROSTER ||\r\n e?.id === GroupAction.EDIT_GROUP ||\r\n (e?.id === GroupAction.DELETE_GROUP && !group?.item?.hasChildren) ||\r\n (e?.id === GroupAction.CREATE_SUB_GROUP &&\r\n group?.item?.groupTypeInfo?.businessRule?.allowSubGroup)\r\n ) {\r\n filteredMenu.push(e);\r\n }\r\n });\r\n return filteredMenu;\r\n }\r\n /**\r\n * Takes the index and the icon button as arguments and needs to return the unique identifier for this icon button.\r\n * @param {number} index\r\n * @param {IconButton} iconButton\r\n * @return {number}\r\n * @memberof TreeViewComponent\r\n */\r\n trackByFn(index: number, iconButton: IconButton): number {\r\n return iconButton.id;\r\n }\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof GroupsComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<div class=\"ieeesa-tree\">\r\n <mat-tree\r\n [dataSource]=\"dataSource\"\r\n [treeControl]=\"treeControl\"\r\n class=\"ieeesa-tree__root\"\r\n #rootSelector\r\n role=\"treegrid\"\r\n >\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodePadding\r\n [matTreeNodePaddingIndent]=\"treePaddingIndent\"\r\n class=\"ieeesa-body-md-16\"\r\n >\r\n <div\r\n class=\"ieeesa-tree__node w-100 d-flex gap-lg-3 my-0 gap-0 gap-sm-0 gap-md-2\"\r\n [ngStyle]=\"getBoxShadow(node?.item?.groupTypeInfo?.legendColor)\"\r\n >\r\n <div\r\n [ngClass]=\"\r\n !isGroupSearchOrFilterActive ? 'ieeesa-tree__collapse-icon' : ''\r\n \"\r\n role=\"gridcell\"\r\n ></div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n ieeesaGroupNodeOutlet;\r\n context: { $implicit: node }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </mat-tree-node>\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChildGroups\"\r\n matTreeNodePadding\r\n [matTreeNodePaddingIndent]=\"treePaddingIndent\"\r\n class=\"ieeesa-body-md-16 ieeesa-tree__parent-node-wrapper\"\r\n >\r\n <div\r\n [ngClass]=\"\r\n treeControl.isExpanded(node)\r\n ? 'ieeesa-tree__root-node-white-bg'\r\n : 'ieeesa-tree__root-node'\r\n \"\r\n class=\"ieeesa-tree__node w-100 d-flex gap-lg-3 my-0 gap-0 gap-sm-0 gap-md-2\"\r\n [ngStyle]=\"getBoxShadow(node?.item?.groupTypeInfo?.legendColor)\"\r\n >\r\n <div role=\"gridcell\">\r\n <ieeesa-icon-button\r\n *ngIf=\"!isGroupSearchOrFilterActive\"\r\n (iconButtonClick)=\"viewChildGroups(node)\"\r\n [iconButton]=\"getToggleButtonInfo(node)\"\r\n ></ieeesa-icon-button>\r\n </div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n ieeesaGroupNodeOutlet;\r\n context: { $implicit: node }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </mat-tree-node>\r\n <ng-template #ieeesaGroupNodeOutlet let-node>\r\n <ng-container\r\n *ngTemplateOutlet=\"ieeesaGroupInfoOutlet; context: { $implicit: node }\"\r\n ></ng-container>\r\n <div\r\n class=\"d-flex d-none gap-3 d-sm-flex d-md-flex d-lg-flex ieeesa-tree__group-actions\"\r\n role=\"gridcell\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n ieeesaGroupActionsOutlet;\r\n context: { $implicit: node }\r\n \"\r\n >\r\n </ng-container>\r\n </div>\r\n <ieeesa-menu\r\n [menuItems]=\"getFilteredGroupActions(node)\"\r\n (menuItemClick)=\"onGroupActionsClick($event); handleGroupActions(node)\"\r\n class=\"d-lg-none d-md-none d-sm-none\"\r\n role=\"gridcell\"\r\n ></ieeesa-menu>\r\n </ng-template>\r\n <ng-template #ieeesaGroupInfoOutlet let-node>\r\n <div class=\"ieeesa-tree__group-info-wrapper\">\r\n <div\r\n class=\"ieeesa-tree__group-info d-flex flex-column flex-sm-column flex-md-column flex-lg-row align-items-start align-items-sm-baseline align-items-md-baseline align-items-lg-baseline gap-2 mb-1\"\r\n >\r\n <p\r\n class=\"ieeesa-tree__node-group-name ieeesa-headline-sm-26\"\r\n [matTooltip]=\"node?.item?.groupName\"\r\n ieeesaTextTruncated\r\n role=\"gridcell\"\r\n >\r\n {{ node?.item?.groupName }}\r\n </p>\r\n <p\r\n class=\"ieeesa-tree__node-group-acronym ieeesa-title-lg-24\"\r\n [matTooltip]=\"node?.item?.groupAcronym\"\r\n ieeesaTextTruncated\r\n role=\"gridcell\"\r\n >\r\n {{ node?.item?.groupAcronym }}\r\n </p>\r\n </div>\r\n <div class=\"ieeesa-body-md-16 ieeesa-tree__node-group-desc\">\r\n {{ node?.item?.groupTypeInfo?.name }}\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template #ieeesaGroupActionsOutlet let-node>\r\n <ieeesa-icon-button\r\n *ngFor=\"let item of getFilteredGroupActions(node); trackBy: trackByFn\"\r\n [iconButton]=\"item\"\r\n (iconButtonClick)=\"\r\n onGroupActionsClick($event); handleGroupActions(node)\r\n \"\r\n >\r\n </ieeesa-icon-button>\r\n </ng-template>\r\n </mat-tree>\r\n</div>\r\n","import {\r\n Component,\r\n EventEmitter,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { FormGroup, Validators } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport {\r\n AlertsService,\r\n AlertType,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport {\r\n DynamicFormComponent,\r\n FormGrid,\r\n FormModel,\r\n FormControlType,\r\n AlignType,\r\n SearchType,\r\n CheckboxOption,\r\n} from '@ieeesa-npm/presentation';\r\nimport * as screenTexts from '../../assets/constants.json';\r\nimport { GroupsValidationPatterns } from '../../assets/form-validations';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { FormStatus } from '../../models/form-status.model';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { AddNewUserPayload } from '../../models/add-new-user.model';\r\nimport { UserInfo } from '../../models/user-info.model';\r\n\r\n/**\r\n * Component implements the view and functionalities to add group users to roster.\r\n * @export\r\n * @class AddUserRosterComponent\r\n * @implements {OnInit}\r\n * @implements {OnDestroy}\r\n */\r\n@Component({\r\n selector: 'ieeesa-add-user-roster',\r\n standalone: true,\r\n imports: [CommonModule, DynamicFormComponent, MatDialogModule],\r\n templateUrl: './add-user-roster.component.html',\r\n styleUrls: ['./add-user-roster.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [AlertsService],\r\n})\r\nexport class AddUserRosterComponent implements OnInit, OnDestroy {\r\n destroy$ = new Subject<boolean>();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n addUserRosterTexts = this.constants?.addUserRoster;\r\n leftButtonLabel = this.addUserRosterTexts?.label?.leftButtonLabel;\r\n rightButtonLabel = this.addUserRosterTexts?.label?.rightButtonLabel;\r\n isSubmitButtonDisabled = false;\r\n colWidth: FormGrid = { xs: 12, xl: 12, sm: 12, md: 12, lg: 12 };\r\n searchUserFormGroup!: FormModel;\r\n addUserFormGroup!: FormModel;\r\n actionButtonAlign = AlignType.LEFT;\r\n addUserFormGroupRef!: FormGroup;\r\n isSearchUserForm = true;\r\n userRoles: CheckboxOption[] = [];\r\n selectedUserRoles: string[] = [];\r\n userInfo!: UserInfo;\r\n isAddUserFormEmailSearch = false;\r\n @Output() submitFormResponse = new EventEmitter();\r\n @Output() formCancel = new EventEmitter();\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private groupService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private globalErrorHandlerService: GlobalErrorHandlerService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService // eslint-disable-next-line no-empty-function\r\n ) {}\r\n\r\n /**\r\n * Initializes user roles and searchUserFormGroup.\r\n * @memberof AddUserRosterComponent\r\n */\r\n ngOnInit(): void {\r\n this.userRoles = this.groupService.getGroupTypeUserRoles();\r\n this.createSearchUserFormGroup();\r\n }\r\n\r\n /**\r\n * Creates search user form group\r\n * @memberof AddUserRosterComponent\r\n */\r\n createSearchUserFormGroup(): void {\r\n this.searchUserFormGroup = {\r\n formGroup: [\r\n {\r\n legend: '',\r\n controls: [\r\n {\r\n type: FormControlType.INPUT,\r\n label: this.addUserRosterTexts?.label?.email + '*',\r\n controlName: 'emailAddress',\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n isEmail: true,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.emailAddress,\r\n patternErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.pattern?.email,\r\n validation: [\r\n Validators.required,\r\n Validators.pattern(GroupsValidationPatterns.email),\r\n ],\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.email,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.email,\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n }\r\n\r\n /**\r\n * Checks form validity and searches the user by entered email.\r\n * @param {FormGroup[]} form\r\n * @memberof AddUserRosterComponent\r\n */\r\n onSearchUserFormSubmit(form: FormGroup[]): void {\r\n this.isAddUserFormEmailSearch = false;\r\n if (form[0]?.status === FormStatus.VALID) {\r\n this.searchUserByEmail(form[0].getRawValue()?.emailAddress);\r\n }\r\n }\r\n\r\n /**\r\n * Searches the user by entered email and gets the user details when the email id is found.\r\n * @param {string} email\r\n * @memberof AddUserRosterComponent\r\n */\r\n searchUserByEmail(email: string): void {\r\n this.groupService\r\n .getUserByEmail(email)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.userInfo = res?.body;\r\n this.validateUserExistence();\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Validates whether the user is exists in the selected group and then creates add user form when the user does not exist in the selected group.\r\n * @memberof AddUserRosterComponent\r\n */\r\n validateUserExistence(): void {\r\n const payload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()?.groupId as string,\r\n userId: this.userInfo?.userId,\r\n },\r\n };\r\n this.groupService\r\n .getGroupUserDetails(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n ?.subscribe({\r\n next: () => {\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: this.constants?.errors?.['1022'],\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (errorCodes?.includes('1026')) {\r\n this.isSearchUserForm = false;\r\n this.rightButtonLabel =\r\n this.addUserRosterTexts?.label?.saveButtonLabel;\r\n if (!this.isAddUserFormEmailSearch) {\r\n this.selectedUserRoles = [];\r\n this.isSubmitButtonDisabled = true;\r\n this.addUserFormGroup = {\r\n formGroup: [\r\n {\r\n legend: '',\r\n controls: [\r\n {\r\n type: FormControlType.SEARCH,\r\n label: this.addUserRosterTexts?.label?.email + '*',\r\n controlName: 'emailSearch',\r\n value: this.userInfo?.email,\r\n searchType: SearchType.ON_CLICK,\r\n validation: [\r\n Validators.required,\r\n Validators.pattern(GroupsValidationPatterns.email),\r\n ],\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.emailAddress,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n patternErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.pattern\r\n ?.email,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.email,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.email,\r\n },\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.fullName + '*',\r\n controlName: 'fullName',\r\n value: this.userInfo?.name,\r\n validation: [Validators.required],\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.fullName,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.fullName,\r\n },\r\n {\r\n type: FormControlType.CHECKBOX,\r\n label: this.addUserRosterTexts?.label?.role + '*',\r\n controlName: 'roles',\r\n checkboxOptions: this.userRoles,\r\n minSelectionRequired: 1,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.role,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.role,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.role,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.roleRequired,\r\n validation: [Validators.required],\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n } else {\r\n this.addUserFormGroupRef\r\n ?.get('emailSearch')\r\n ?.setValue(this.userInfo?.email);\r\n this.addUserFormGroupRef\r\n ?.get('fullName')\r\n ?.setValue(this.userInfo?.name);\r\n this.isSubmitButtonDisabled =\r\n this.selectedUserRoles?.length === 0;\r\n }\r\n } else this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Handles add user form email search\r\n * @param {string} email\r\n * @memberof AddUserRosterComponent\r\n */\r\n formSearchApply(email: string): void {\r\n this.isAddUserFormEmailSearch = true;\r\n if (email.trim()) this.searchUserByEmail(email.trim());\r\n else {\r\n this.userInfo.name = '';\r\n this.addUserFormGroupRef?.get('fullName')?.setValue('');\r\n this.isSubmitButtonDisabled = true;\r\n }\r\n }\r\n\r\n /**\r\n * Assigns role to user on form submission.\r\n * @param {FormGroup[]} form\r\n * @memberof AddUserRosterComponent\r\n */\r\n onAddUserFormSubmit(form: FormGroup[]): void {\r\n form[0]?.markAllAsTouched();\r\n if (form[0].status === FormStatus.VALID) {\r\n const payload: AddNewUserPayload = {\r\n payload: {\r\n email: this.userInfo?.email,\r\n roles: this.selectedUserRoles,\r\n userId: this.userInfo?.userId,\r\n groupId: this.groupService.selectedGroupInfo?.groupId as string,\r\n },\r\n };\r\n\r\n this.groupService\r\n .addNewGroupUser(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.submitFormResponse.emit(res);\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get add user form group reference.\r\n * @param {FormGroup[]} form\r\n * @memberof AddUserRosterComponent\r\n */\r\n getAddUserFormGroupRef(form: FormGroup[]) {\r\n this.addUserFormGroupRef = form[0];\r\n }\r\n\r\n /**\r\n * Handles user role selection in add user form.\r\n * @param {CheckboxOption} event\r\n * @memberof AddUserRosterComponent\r\n */\r\n onUserRoleSelection(event: CheckboxOption): void {\r\n if (event?.checked) {\r\n this.selectedUserRoles?.push(event.id as string);\r\n } else {\r\n this.selectedUserRoles = this.selectedUserRoles.filter(\r\n (value) => value !== event.id\r\n );\r\n }\r\n this.isSubmitButtonDisabled = this.selectedUserRoles?.length === 0;\r\n }\r\n\r\n /**\r\n * Emits form cancel event.\r\n * @memberof AddUserRosterComponent\r\n */\r\n onFormCancel(): void {\r\n this.formCancel.emit();\r\n }\r\n\r\n /**\r\n * Handles the custom errors while searching user by email, validating user existence and adding new user to roster.\r\n * @param {*} error\r\n * @memberof AddUserRosterComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n handleErrors(error: any): void {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes) && !error?.error?.status) {\r\n const errorMessage = this.groupService.parseErrorMessage(errorCodes);\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: errorMessage,\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService.handleError(error);\r\n }\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof AddUserRosterComponent\r\n */\r\n ngOnDestroy(): void {\r\n if (this.destroy$) {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n }\r\n}\r\n","<ieeesa-dynamic-form\r\n *ngIf=\"searchUserFormGroup && isSearchUserForm\"\r\n class=\"ieeesa-search-user-form\"\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLegendVisible]=\"false\"\r\n [colWidth]=\"colWidth\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n [formGroups]=\"searchUserFormGroup\"\r\n [isLeftButtonNeeded]=\"true\"\r\n (formSubmit)=\"onSearchUserFormSubmit($event)\"\r\n (formLeftButtonClicked)=\"onFormCancel()\"\r\n></ieeesa-dynamic-form>\r\n\r\n<ieeesa-dynamic-form\r\n *ngIf=\"addUserFormGroup && !isSearchUserForm\"\r\n class=\"ieeesa-add-user-form\"\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLegendVisible]=\"false\"\r\n [isSubmitButtonDisabled]=\"isSubmitButtonDisabled\"\r\n [colWidth]=\"colWidth\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n [formGroups]=\"addUserFormGroup\"\r\n [isLeftButtonNeeded]=\"true\"\r\n (formSubmit)=\"onAddUserFormSubmit($event)\"\r\n (formSearchApply)=\"formSearchApply($event)\"\r\n (formLeftButtonClicked)=\"onFormCancel()\"\r\n (formGroupsReference)=\"getAddUserFormGroupRef($event)\"\r\n (formCheckboxSelection)=\"onUserRoleSelection($event)\"\r\n></ieeesa-dynamic-form>\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n OnDestroy,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { SortDirection } from '@angular/material/sort';\r\nimport {\r\n TableColumnSchema,\r\n TableColumnType,\r\n TableActions,\r\n CheckboxOption,\r\n DataTableComponent,\r\n TableColumnSortDirection,\r\n ChipsType,\r\n ChipOption,\r\n} from '@ieeesa-npm/presentation';\r\nimport {\r\n AlertType,\r\n AlertsService,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport {\r\n SearchUsersPayload,\r\n FilterUsersByRolesPayload,\r\n User,\r\n} from '../../models/user.model';\r\nimport * as constants from '../../assets/constants.json';\r\nimport { GroupFunctionType } from '../../models/group-function-type.model';\r\n\r\n/**\r\n * ViewRosterComponent implements the functionalities to add, edit, delete user to group roster, assign and modify roles(s) to the group users, and search user from roster.\r\n * @export\r\n * @class ViewRosterComponent\r\n * @implements {OnDestroy}\r\n */\r\n@Component({\r\n selector: 'ieeesa-view-roster',\r\n standalone: true,\r\n imports: [CommonModule, DataTableComponent],\r\n templateUrl: './view-roster.component.html',\r\n styleUrls: ['./view-roster.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ViewRosterComponent implements AfterViewInit, OnDestroy {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n viewRosterConstants = this.constants?.viewRoster;\r\n filters: ChipOption[] = [\r\n {\r\n id: 1,\r\n name: this.viewRosterConstants?.filterByRole,\r\n checked: false,\r\n chipType: ChipsType.TOGGLE,\r\n },\r\n ];\r\n columnSchema: TableColumnSchema[] = [\r\n {\r\n id: 1,\r\n columnDef: TableColumnType.SELECT,\r\n heading: '',\r\n columnType: TableColumnType.SELECT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.select}`,\r\n },\r\n {\r\n id: 2,\r\n columnDef: 'name',\r\n heading: this.viewRosterConstants?.tableColumns?.name,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.name}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 3,\r\n columnDef: 'email',\r\n heading: this.viewRosterConstants?.tableColumns?.email,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.email}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 4,\r\n columnDef: 'role',\r\n heading: this.viewRosterConstants?.tableColumns?.role,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.role}`,\r\n },\r\n ];\r\n tableData!: User[];\r\n selectedRoleIds: string[] = [];\r\n selectedRoles!: ChipOption[] | CheckboxOption[];\r\n roles: CheckboxOption[] = [];\r\n rosterActions: TableActions = {\r\n isSearchNeeded: true,\r\n isFilterNeeded: true,\r\n isAddNeeded: true,\r\n isDeleteNeeded: true,\r\n isEditNeeded: true,\r\n };\r\n defaultSortedColumn = this.columnSchema[1].columnDef;\r\n defaultColumnSortDirection: SortDirection =\r\n TableColumnSortDirection.ASCENDING;\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private groupService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private alertService: AlertsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private cdr: ChangeDetectorRef,\r\n // eslint-disable-next-line no-unused-vars\r\n private globalErrorHandlerService: GlobalErrorHandlerService\r\n ) {\r\n this.getRoles();\r\n this.getGroupUsersAndInitializeTableView();\r\n }\r\n /**\r\n * Show add new user success message when canShowMessage is set true\r\n * @memberof ViewRosterComponent\r\n */\r\n ngAfterViewInit(): void {\r\n if (this.groupService.canShowMessage) {\r\n this.groupService.canShowMessage = false;\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: this.constants?.addUserRoster?.message?.success?.submission,\r\n alertType: AlertType.SUCCESS,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n }\r\n /**\r\n * Gets the group users by calling getGroupUsers() from groupService and sets tableData to display the users in a grid.\r\n * @memberof ViewRosterComponent\r\n */\r\n getGroupUsersAndInitializeTableView(): void {\r\n this.groupService\r\n .getGroupUsers(\r\n this.groupService.getSelectedGroupInfo()?.groupId as string\r\n )\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.tableData =\r\n this.groupService.transformUserRolesNameAsString(response);\r\n this.cdr.detectChanges();\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Gets the selected group type roles by calling getGroupTypeRoles() from groupService and sets assign roles.\r\n * @memberof ViewRosterComponent\r\n */\r\n getRoles(): void {\r\n this.groupService\r\n .getGroupTypeRoles(\r\n this.groupService.getSelectedGroupInfo()?.groupType as string\r\n )\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.roles = response;\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Gets the group users by calling searchGroupUsers() from groupService and sets tableData to display the users in a grid.\r\n * @param {string} searchTerm -searchTerm can be user name or email and user is searched based on the email or name.\r\n * @memberof ViewRosterComponent\r\n */\r\n onSearchGroupUsers(searchTerm: string): void {\r\n if (!searchTerm) {\r\n if (this.selectedRoleIds?.length === 0) {\r\n this.getGroupUsersAndInitializeTableView();\r\n return;\r\n } else if (this.selectedRoleIds?.length > 0) {\r\n this.onFilterUsersByRoles(this.selectedRoles);\r\n return;\r\n }\r\n }\r\n if (!searchTerm.trim()) return;\r\n const payload: SearchUsersPayload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()?.groupId as string,\r\n searchByNameOrEmail: searchTerm,\r\n roles: this.selectedRoleIds,\r\n },\r\n };\r\n this.groupService\r\n .searchGroupUsers(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.tableData =\r\n this.groupService.transformUserRolesNameAsString(response);\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Gets the group users by calling getGroupUsersByRoles() from groupService and sets tableData to display the users in a grid.\r\n * @param {ChipOption[] | | CheckboxOption[]} roles\r\n * @memberof ViewRosterComponent\r\n */\r\n onFilterUsersByRoles(roles: ChipOption[] | CheckboxOption[]): void {\r\n if (roles?.length === 0) {\r\n this.getGroupUsersAndInitializeTableView();\r\n return;\r\n }\r\n this.selectedRoleIds = [];\r\n roles?.forEach((role) => {\r\n this.selectedRoleIds.push(role.id as string);\r\n });\r\n this.selectedRoles = roles;\r\n const payload: FilterUsersByRolesPayload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()?.groupId as string,\r\n roles: this.selectedRoleIds,\r\n },\r\n };\r\n this.groupService\r\n .getGroupUsersByRoles(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.tableData =\r\n this.groupService.transformUserRolesNameAsString(response);\r\n this.cdr.detectChanges();\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Handles the custom errors while retrieving groups users, roles, search users, filter user by roles.\r\n * @param {*} error\r\n * @memberof ViewRosterComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n handleErrors(error: any): void {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes) && !error?.error?.status) {\r\n const errorMessage = this.groupService.parseErrorMessage(errorCodes);\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: errorMessage,\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService.handleError(error);\r\n }\r\n }\r\n\r\n /**\r\n * Emits openModalNotifier event with GroupFunctionType value as ADD_USER_TO_ROSTER\r\n * @memberof ViewRosterComponent\r\n */\r\n onAddNewUser(): void {\r\n this.groupService?.openModalNotifier?.next(\r\n GroupFunctionType.ADD_USER_TO_ROSTER\r\n );\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof ViewRosterComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<ieeesa-data-table\r\n [tableDataInfo]=\"tableData\"\r\n [columnSchemaInfo]=\"columnSchema\"\r\n [defaultSortedColumn]=\"defaultSortedColumn\"\r\n [defaultColumnSortDirection]=\"defaultColumnSortDirection\"\r\n [searchPlaceHolderText]=\"viewRosterConstants?.searchPlaceholder\"\r\n [tableActions]=\"rosterActions\"\r\n [filters]=\"filters\"\r\n [selectedFilterOptions]=\"roles\"\r\n (removeFilteredOption)=\"onFilterUsersByRoles($event)\"\r\n (filteredOptions)=\"onFilterUsersByRoles($event)\"\r\n (searchedValue)=\"onSearchGroupUsers($event)\"\r\n (addRow)=\"onAddNewUser()\"\r\n></ieeesa-data-table>\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport {\r\n Component,\r\n Input,\r\n OnDestroy,\r\n ViewEncapsulation,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { CreateGroupComponent } from './components/create-group/create-group.component';\r\nimport { GroupsService } from './services/groups.service';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { GroupInfo } from './models/group-info.model';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport {\r\n SearchComponent,\r\n ModalComponent,\r\n SelectOption,\r\n IconButtonComponent,\r\n IconButton,\r\n AlignType,\r\n ModalConfirmationComponent,\r\n SelectComponent,\r\n LegendComponent,\r\n Legend,\r\n} from '@ieeesa-npm/presentation';\r\nimport { TreeViewComponent } from './components/tree-view/tree-view.component';\r\nimport { GroupType, GroupTypeConfigValue } from './models/group-types.model';\r\nimport {\r\n ModalType,\r\n AlertType,\r\n BreakpointObserverService,\r\n AlertsService,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport * as screenTexts from './assets/constants.json';\r\nimport { GroupFunctionType } from './models/group-function-type.model';\r\nimport { GetGroupsPayload } from './models/view-group.model';\r\nimport { DeleteGroupPayload } from './models/delete-group.model';\r\nimport { AddUserRosterComponent } from './components/add-user-roster/add-user-roster.component';\r\nimport { ViewRosterComponent } from './components/view-roster/view-roster.component';\r\nimport { EditGroupAndParentInfo } from './models/edit-group.model';\r\n\r\n/**\r\n * Groups component is a wrapper or container component for groups management reusable component and in this component integrates all group management functionalities and this will be entry component for managing groups when it is consumed in other applications.\r\n * @class GroupsComponent\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'ieeesa-groups',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n SearchComponent,\r\n SelectComponent,\r\n TreeViewComponent,\r\n LegendComponent,\r\n IconButtonComponent,\r\n ],\r\n templateUrl: './groups.component.html',\r\n styleUrls: ['./groups.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [AlertsService],\r\n})\r\nexport class GroupsComponent implements OnInit, OnDestroy {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n dialogRef: any;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n viewGroupTexts = this.constants?.viewGroups;\r\n createGroupText = this.constants?.createGroup;\r\n editGroupTexts = this.constants?.editGroup;\r\n addUserRosterTexts = this.constants?.addUserRoster;\r\n isGroupSearchActive = false;\r\n isGroupFilterActive = false;\r\n isGroupSearchOrFilterActive = false;\r\n isMobileView = false;\r\n childGroupsInfo!: GroupInfo[];\r\n selectedGroupType!: SelectOption;\r\n parentGroupsInfo!: GroupInfo[];\r\n selectGroupOptions!: SelectOption[];\r\n deletedGroupId!: string;\r\n deleteGroupName!: string;\r\n groupTypes!: GroupTypeConfigValue;\r\n searchPlaceHolderText: string = this.viewGroupTexts?.placeholderText?.search;\r\n filterPlaceHolderText: string = this.viewGroupTexts?.placeholderText?.filter;\r\n createGroupIcon: IconButton = {\r\n id: 1,\r\n ariaLabel: this.viewGroupTexts?.ariaLabel.add,\r\n iconURL: this.viewGroupTexts?.createGroupIcon,\r\n toolTip: this.viewGroupTexts?.ariaLabel.add,\r\n };\r\n filterGroupIcon: IconButton = {\r\n id: 2,\r\n ariaLabel: this.viewGroupTexts?.ariaLabel.filter,\r\n iconURL: this.viewGroupTexts?.filterGroupIcon,\r\n toolTip: this.viewGroupTexts?.ariaLabel.filter,\r\n };\r\n groupsLegends: Legend[] = [];\r\n getGroupsPayload: GetGroupsPayload = { groupId: '', groupTypeId: '' };\r\n @Input() groupsPageInfo: {\r\n groupsTitle: string;\r\n groupsDescription: string;\r\n } = {\r\n groupsTitle: this.viewGroupTexts?.groupsTitle,\r\n groupsDescription: this.viewGroupTexts?.groupsDescription,\r\n };\r\n @Input() applicationId!: string;\r\n @Input() apiBaseURL!: string;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n @Input() permissions!: any;\r\n functionType!: GroupFunctionType;\r\n alignmentType = AlignType;\r\n isSorting = true;\r\n canReopenViewRosterModal = false;\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public dialog: MatDialog,\r\n // eslint-disable-next-line no-unused-vars\r\n private groupsService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private breakpointObserverService: BreakpointObserverService,\r\n // eslint-disable-next-line no-unused-vars\r\n public globalErrorHandlerService: GlobalErrorHandlerService\r\n ) {\r\n this.breakpointObserverService\r\n .getBreakpoint()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((result) => {\r\n this.isMobileView = result?.matches;\r\n });\r\n }\r\n\r\n /**\r\n * Initialize the groups component.\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n ngOnInit(): void {\r\n this.groupsService?.setAppConfig(this.apiBaseURL, this.permissions);\r\n this.getGroupTypes();\r\n this.groupsService?.openModalNotifier\r\n ?.pipe(takeUntil(this.destroy$))\r\n ?.subscribe((response) => {\r\n if (response === GroupFunctionType.ADD_USER_TO_ROSTER) {\r\n this.dialogRef?.close();\r\n this.openAddUserRosterModal();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the dialog options for create group modal and calls openModal method.\r\n * @param {GroupInfo} [parentGroupInfo] -An optional parameter. Parent group info to be passed for create child group.\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n openCreateGroupForm(parentGroupInfo?: GroupInfo): void {\r\n this.groupsService?.setSelectedGroupInfo(parentGroupInfo ?? undefined);\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.CREATE);\r\n const dialogOptions = {\r\n heading: this.createGroupText?.heading,\r\n isCloseNeeded: true,\r\n componentReference: CreateGroupComponent,\r\n modalType: ModalType.FORM,\r\n };\r\n this.functionType = GroupFunctionType?.CREATE;\r\n this.openModal(dialogOptions, 'ieeesa-create-group', parentGroupInfo);\r\n }\r\n\r\n /**\r\n * Sets the dialog options for edit group modal and calls openModal method.\r\n * @param {EditGroupAndParentInfo} editGroupInfo -editing group and its parent group info to be passed for populating edit group form fields.\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n openEditGroupForm(editGroupInfo: EditGroupAndParentInfo): void {\r\n this.groupsService?.setSelectedGroupInfo(\r\n editGroupInfo?.groupInfo,\r\n editGroupInfo?.parentGroupInfo\r\n );\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.EDIT);\r\n const dialogOptions = {\r\n heading: editGroupInfo?.groupInfo?.groupName,\r\n isCloseNeeded: true,\r\n componentReference: CreateGroupComponent,\r\n modalType: ModalType.FORM,\r\n };\r\n this.functionType = GroupFunctionType?.EDIT;\r\n this.openModal(dialogOptions, 'ieeesa-create-group', editGroupInfo);\r\n }\r\n\r\n /**\r\n * Sets the dialog options for add users modal and calls openModal method.\r\n * @memberof GroupsComponent\r\n */\r\n openAddUserRosterModal(): void {\r\n const dialogOptions = {\r\n heading: this.addUserRosterTexts?.heading,\r\n isCloseNeeded: true,\r\n componentReference: AddUserRosterComponent,\r\n modalType: ModalType.FORM,\r\n };\r\n this.functionType = GroupFunctionType.ADD_USER_TO_ROSTER;\r\n this.groupsService?.setGroupFunctionType(this.functionType);\r\n this.openModal(dialogOptions, 'ieeesa-add-user-roster');\r\n }\r\n\r\n /**\r\n * Sets the dialog options for users modal and calls openModal method.\r\n * @param {GroupInfo} group\r\n * @memberof GroupsComponent\r\n */\r\n viewRoster(group: GroupInfo): void {\r\n const dialogOptions = {\r\n heading: group?.groupName,\r\n isCloseNeeded: true,\r\n componentReference: ViewRosterComponent,\r\n modalType: ModalType.FORM_AND_CONTENT,\r\n };\r\n this.groupsService.setSelectedGroupInfo(group);\r\n this.functionType = GroupFunctionType.VIEW_ROSTER;\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.EDIT);\r\n this.openModal(dialogOptions, 'ieeesa-view-roster');\r\n }\r\n\r\n /**\r\n * Opens modal component with for received params and handles form submission success and errors.\r\n * @param {*} dialogOptions\r\n * @param {string} [className]\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-inferrable-types, no-unused-vars\r\n openModal(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n dialogOptions: any,\r\n className?: string,\r\n groupInfo?: GroupInfo | EditGroupAndParentInfo\r\n ): void {\r\n className = className ?? '';\r\n this.dialogRef = this.dialog?.open(ModalComponent, {\r\n data: dialogOptions,\r\n width:\r\n this.functionType === GroupFunctionType.VIEW_ROSTER ||\r\n this.functionType === GroupFunctionType.ADD_USER_TO_ROSTER\r\n ? ''\r\n : 'auto',\r\n panelClass: ['ieeesa-modal-dialog', className],\r\n ariaModal: true,\r\n });\r\n this.dialogRef?.componentInstance?.submitFormResponse\r\n .pipe(takeUntil(this.destroy$))\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, no-unused-vars\r\n .subscribe((result: any) => {\r\n this.dialogRef?.close();\r\n switch (this.functionType) {\r\n case GroupFunctionType?.CREATE: {\r\n this.showAlertMessage(\r\n AlertType?.SUCCESS,\r\n this.createGroupText?.message?.success?.submission\r\n );\r\n const createGroupInfo = groupInfo as GroupInfo;\r\n if (createGroupInfo) this.getGroups(createGroupInfo);\r\n else this.getGroups();\r\n break;\r\n }\r\n case GroupFunctionType?.EDIT: {\r\n this.showAlertMessage(\r\n AlertType?.SUCCESS,\r\n this.editGroupTexts?.message?.success?.submission\r\n );\r\n const editGroupInfo = groupInfo as EditGroupAndParentInfo;\r\n if (editGroupInfo?.parentGroupInfo?.groupId === undefined) {\r\n this.getGroups();\r\n } else this.getGroups(editGroupInfo.parentGroupInfo);\r\n break;\r\n }\r\n case GroupFunctionType?.ADD_USER_TO_ROSTER: {\r\n this.groupsService.canShowMessage = true;\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n });\r\n this.dialogRef?.componentInstance?.formCancel\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n this.dialogRef?.close();\r\n if (this.functionType === GroupFunctionType.ADD_USER_TO_ROSTER) {\r\n this.canReopenViewRosterModal = false;\r\n this.viewRoster(this.groupsService.selectedGroupInfo as GroupInfo);\r\n }\r\n });\r\n this.dialogRef\r\n ?.afterOpened()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n if (this.functionType === GroupFunctionType.ADD_USER_TO_ROSTER) {\r\n this.canReopenViewRosterModal = true;\r\n }\r\n });\r\n this.dialogRef\r\n ?.afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n if (this.canReopenViewRosterModal) {\r\n this.canReopenViewRosterModal = false;\r\n this.viewRoster(this.groupsService.selectedGroupInfo as GroupInfo);\r\n }\r\n });\r\n }\r\n /**\r\n * Opens the confirmation modal to get user confirmation to delete the selected group.\r\n * @memberof GroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n openDeleteConfirmationModal(groupInfo: GroupInfo): void {\r\n const confirmationInfo = screenTexts?.deleteGroup?.confirmationInfo;\r\n const deleteGroupModalOptions = {\r\n leftButtonLabel: confirmationInfo?.leftButtonLabel,\r\n rightButtonLabel: confirmationInfo?.rightButtonLabel,\r\n promptMessage:\r\n confirmationInfo?.promptMessage + groupInfo?.groupName + '?',\r\n actionButtonAlign: this.alignmentType?.MIDDLE,\r\n };\r\n this.dialogRef = this.dialog?.open(ModalConfirmationComponent, {\r\n data: deleteGroupModalOptions,\r\n width: 'auto',\r\n autoFocus: 'dialog',\r\n ariaLabel: this.constants?.ariaLabel?.alert,\r\n });\r\n this.dialogRef\r\n .afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((result: boolean) => {\r\n if (result) {\r\n this.deleteGroup(groupInfo);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * This method sends API Request to delete the selected group and handles the success and error response of the http request.\r\n * @memberof GroupComponent\r\n */\r\n deleteGroup(groupInfo: GroupInfo): void {\r\n const deleteGroupText = screenTexts?.deleteGroup;\r\n this.deleteGroupName = groupInfo?.groupName;\r\n const deleteGroupPayload: DeleteGroupPayload = {\r\n payload: {\r\n groupId: groupInfo?.groupId,\r\n },\r\n };\r\n this.groupsService\r\n .deleteGroup(deleteGroupPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n next: (res: any) => {\r\n this.dialogRef?.close();\r\n if (res?.status) {\r\n this.deletedGroupId = groupInfo?.groupId;\r\n this.showAlertMessage(\r\n AlertType?.SUCCESS,\r\n groupInfo?.groupName + deleteGroupText?.message?.success?.deletion\r\n );\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Shows the search field on click of search icon in case of mobile view\r\n * @memberof GroupsComponent\r\n */\r\n onGroupSearch(): void {\r\n this.isGroupSearchActive = true;\r\n this.isGroupFilterActive = false;\r\n }\r\n\r\n /**\r\n * Shows the Filter by dropdown options on click of filter icon in case of mobile view\r\n * @memberof GroupsComponent\r\n */\r\n showGroupFilter(): void {\r\n this.isGroupFilterActive = true;\r\n this.isGroupSearchActive = false;\r\n }\r\n\r\n /**\r\n * Sets isGroupSearchOrFilterActive to true and loads the groups those are configured with selected group type.\r\n * @param {string} searchTerm\r\n * @memberof GroupsComponent\r\n */\r\n onGroupSearchClick(searchTerm: string): void {\r\n this.isGroupSearchOrFilterActive = !!searchTerm;\r\n }\r\n\r\n /**\r\n * Sets select group type options from groupTypes response\r\n * @return {*} {SelectOption[]}\r\n * @memberof GroupsComponent\r\n */\r\n getGroupTypeOptions(): SelectOption[] {\r\n this.legendColor();\r\n const groupTypeOptions: SelectOption[] = [];\r\n groupTypeOptions.push({\r\n id: '',\r\n name: this.viewGroupTexts?.allGroupTypesOption,\r\n });\r\n Object.entries(this.groupTypes)?.forEach((node) => {\r\n groupTypeOptions.push({ id: node[0], name: node[1]?.name });\r\n });\r\n return groupTypeOptions;\r\n }\r\n\r\n /**\r\n * Sets legend color from groupTypes response\r\n * @memberof GroupsComponent\r\n */\r\n legendColor(): void {\r\n Object.entries(this.groupTypes)?.forEach((node) => {\r\n this.groupsLegends?.push({\r\n color: node[1]?.legendColor,\r\n label: node[1]?.name,\r\n hierarchy: node[1]?.hierarchy,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Sets the isGroupSearchOrFilterActive flag and loads parent group info as per selected filter option.\r\n * @param {SelectOption} event\r\n * @memberof GroupsComponent\r\n */\r\n onGroupTypeFiltered(event: SelectOption): void {\r\n this.selectedGroupType = event;\r\n this.isGroupSearchOrFilterActive = !!this.selectedGroupType?.id;\r\n this.getGroupsPayload = {\r\n groupId: '',\r\n groupTypeId: this.selectedGroupType?.id as string,\r\n };\r\n this.getGroups();\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.FILTER);\r\n }\r\n\r\n /**\r\n * Loads all the parent groups information.\r\n * @memberof GroupsComponent\r\n */\r\n getGroups(group?: GroupInfo): void {\r\n if (group) {\r\n this.getGroupsPayload = {\r\n groupId: group?.groupId ?? '',\r\n groupTypeId: '',\r\n };\r\n } else if (this.getGroupsPayload.groupTypeId === '') {\r\n this.getGroupsPayload = {\r\n groupId: '',\r\n groupTypeId: '',\r\n };\r\n }\r\n this.groupsService\r\n .getGroups(this.getGroupsPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.status) {\r\n if (group) {\r\n this.childGroupsInfo = this.viewGroupResponse(response?.body);\r\n } else {\r\n this.parentGroupsInfo = this.viewGroupResponse(response?.body);\r\n }\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Sets groupType info with group response from groupType response\r\n * @param {GroupInfo[]} response\r\n * @return {*} {GroupInfo[]}\r\n * @memberof GroupsComponent\r\n */\r\n viewGroupResponse(response: GroupInfo[]): GroupInfo[] {\r\n response?.forEach((node) => {\r\n const groupTypeInfo: GroupType = this.groupTypes[node.groupType];\r\n node.groupTypeInfo = groupTypeInfo;\r\n });\r\n return response;\r\n }\r\n\r\n /**\r\n * Loads the group types.\r\n * @memberof GroupsComponent\r\n */\r\n getGroupTypes(): void {\r\n this.groupsService\r\n .getGroupTypes()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.groupTypes = this.groupsService?.getFormattedGroupTypes(\r\n res?.body\r\n );\r\n this.selectGroupOptions = this.getGroupTypeOptions();\r\n this.selectedGroupType = this.selectGroupOptions[0];\r\n this.onGroupTypeFiltered(this.selectedGroupType);\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Handles alerts for success, error and warning.\r\n * @param {(string | string[])} message -success or error or warning message.\r\n * @param {AlertType} alertType\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n showAlertMessage(alertType: AlertType, message: string | string[]): void {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: message,\r\n alertType: alertType,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n\r\n /**\r\n * Captures the server side errors and handles it based on the custom or Http errors.\r\n * @param {HttpErrorResponse} error\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n handleErrors(error: HttpErrorResponse): void {\r\n const errorCodes: string[] = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes)) {\r\n const errorMessage: string[] =\r\n this.groupsService?.parseErrorMessage(errorCodes);\r\n if (errorCodes?.includes('1008')) {\r\n errorMessage[0] = this.deleteGroupName + errorMessage?.[0];\r\n }\r\n this.showAlertMessage(AlertType.ERROR, errorMessage);\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService?.handleError(error);\r\n }\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof GroupsComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<div class=\"ieeesa-groups p-3 p-sm-4 p-md-4 p-lg-4\">\r\n <div\r\n class=\"ieeesa-groups__info d-flex justify-content-between pb-3\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-groups__info--white-bg'\r\n : 'ieeesa-groups__info--blue-bg'\r\n \"\r\n >\r\n <p\r\n [ngClass]=\"isMobileView ? 'ieeesa-title-lg-24' : 'ieeesa-headline-lg-34'\"\r\n >\r\n {{ groupsPageInfo.groupsTitle }}\r\n </p>\r\n <div>\r\n <button\r\n mat-button\r\n class=\"ieeesa-groups__create-subgroup mat-tertiary-button d-none d-sm-none d-md-block d-lg-block d-xl-block\"\r\n (click)=\"openCreateGroupForm()\"\r\n [attr.aria-label]=\"constants?.viewGroups?.ariaLabel?.addGroup\"\r\n >\r\n {{ constants?.viewGroups?.addGroup }}\r\n </button>\r\n </div>\r\n <div\r\n class=\"d-flex d-sm-flex d-md-none d-lg-none d-xl-none ieeesa-groups__mobile-icons gap-2\"\r\n >\r\n <ieeesa-icon-button\r\n [iconButton]=\"createGroupIcon\"\r\n (iconButtonClick)=\"openCreateGroupForm()\"\r\n >\r\n </ieeesa-icon-button>\r\n <ieeesa-icon-button\r\n [iconButton]=\"filterGroupIcon\"\r\n (iconButtonClick)=\"showGroupFilter()\"\r\n >\r\n </ieeesa-icon-button>\r\n <button\r\n mat-button\r\n [attr.aria-label]=\"constants?.viewGroups?.ariaLabel?.search\"\r\n (click)=\"onGroupSearch()\"\r\n type=\"button\"\r\n >\r\n <i class=\"fa-solid fa-magnifying-glass search-group-icon\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n <div\r\n class=\"ieeesa-groups__actions\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-groups__actions--white-bg'\r\n : 'ieeesa-groups__actions--blue-bg'\r\n \"\r\n >\r\n <div class=\"ieeesa-groups__actions--search row\">\r\n <p\r\n class=\"ieeesa-body-md-16 order-2 order-sm-1 col-12 col-md-7 col-lg-7 col-xl-7\"\r\n >\r\n {{ groupsPageInfo.groupsDescription }}\r\n </p>\r\n <div\r\n *ngIf=\"\r\n ((isGroupSearchActive || isGroupFilterActive) && isMobileView) ||\r\n !isMobileView\r\n \"\r\n class=\"order-1 order-sm-2 col-12 col-md-5 col-lg-5 col-xl-5 d-flex flex-column\"\r\n >\r\n <ieeesa-search\r\n *ngIf=\"isGroupSearchActive || !isMobileView\"\r\n (searchValue)=\"onGroupSearchClick($event)\"\r\n [placeholderLabel]=\"searchPlaceHolderText\"\r\n ></ieeesa-search>\r\n <ieeesa-select\r\n *ngIf=\"isGroupFilterActive || !isMobileView\"\r\n class=\"align-self-end pt-lg-4 pt-md-4 pt-xl-4\"\r\n [dropdownOptions]=\"selectGroupOptions\"\r\n [isLabelAlignedLeft]=\"true\"\r\n [selectLabel]=\"constants?.viewGroups?.filterByLabel\"\r\n (optionSelected)=\"onGroupTypeFiltered($event)\"\r\n [placeholderText]=\"filterPlaceHolderText\"\r\n [selectedOptions]=\"selectedGroupType\"\r\n ></ieeesa-select>\r\n </div>\r\n </div>\r\n <ieeesa-tree\r\n *ngIf=\"parentGroupsInfo && parentGroupsInfo.length > 0\"\r\n [parentGroupsInfo]=\"parentGroupsInfo\"\r\n [childGroupsInfo]=\"childGroupsInfo\"\r\n [deletedGroupIdInfo]=\"deletedGroupId\"\r\n [isGroupSearchOrFilterActive]=\"isGroupSearchOrFilterActive\"\r\n (toggleGroupClick)=\"getGroups($event)\"\r\n (createGroupClick)=\"openCreateGroupForm($event)\"\r\n (deleteGroupClick)=\"openDeleteConfirmationModal($event)\"\r\n (viewRosterClick)=\"viewRoster($event)\"\r\n (editGroupClick)=\"openEditGroupForm($event)\"\r\n ></ieeesa-tree>\r\n <div\r\n *ngIf=\"parentGroupsInfo && parentGroupsInfo.length > 0\"\r\n class=\"d-flex flex-column flex-sm-row flex-md-row mt-4 justify-content-start justify-content-sm-end\"\r\n >\r\n <p class=\"px-sm-3 d-flex align-items-start ieeesa-label-lg-bold-16\">\r\n {{ constants?.viewGroups?.legend }}\r\n </p>\r\n <ieeesa-legend [legends]=\"groupsLegends\" [isSorting]=\"isSorting\"></ieeesa-legend>\r\n </div>\r\n </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n ],\r\n exports: []\r\n})\r\nexport class GroupsModule { }\r\n","/*\r\n * Public API Surface of groups\r\n */\r\nexport * from './lib/components/create-group/create-group.component';\r\nexport * from './lib/components/tree-view/tree-view.component';\r\nexport * from './lib/groups.component';\r\n\r\nexport * from './lib/models/create-group.model';\r\nexport * from './lib/models/group-action.model';\r\nexport * from './lib/models/group-function-type.model';\r\nexport * from './lib/models/group-info.model';\r\nexport * from './lib/models/group-types.model';\r\nexport * from './lib/models/view-group.model';\r\nexport * from './lib/models/edit-group.model';\r\nexport * from './lib/models/form-status.model';\r\nexport * from './lib/models/delete-group.model';\r\n\r\nexport * from './lib/services/groups.service';\r\n\r\nexport * from './lib/assets/form-validations';\r\n\r\nexport * from './lib/groups.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["screenTexts?.errors","i1","screenTexts?.createGroup","i1.GroupsService","i3","takeUntil","map","constants","i2","screenTexts?.deleteGroup","i2.GroupsService","i4"],"mappings":"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"}
|