2 Copyright 2020 TATA ELXSI
4 Licensed under the Apache License, Version 2.0 (the 'License');
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
8 http://www.apache.org/licenses/LICENSE-2.0
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
16 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
19 * @file Project Role Component.
21 import { HttpHeaders } from '@angular/common/http';
22 import { Component, Injector, Input, OnInit } from '@angular/core';
23 import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';
24 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
25 import { TranslateService } from '@ngx-translate/core';
26 import { NotifierService } from 'angular-notifier';
27 import { APIURLHEADER, ERRORDATA, MODALCLOSERESPONSEDATA } from 'CommonModel';
28 import { environment } from 'environment';
29 import { ProjectData } from 'ProjectModel';
30 import { ProjectService } from 'ProjectService';
31 import { RestService } from 'RestService';
32 import { RoleData } from 'RolesModel';
33 import { ProjectRoleMappings, UserDetail, UserRoleMap } from 'UserModel';
37 * @Component takes ProjectRole.html as template url
40 templateUrl: './ProjectRoleComponent.html',
41 styleUrls: ['./ProjectRoleComponent.scss']
43 /** Exporting a class @exports ProjectRoleComponent */
44 export class ProjectRoleComponent implements OnInit {
45 /** To inject services @public */
46 public injector: Injector;
48 /** Instance for active modal service @public */
49 public activeModal: NgbActiveModal;
51 /** FormGroup user Edit Account added to the form @ html @public */
52 public projectRoleForm: FormGroup;
54 /** Form submission Add */
55 public submitted: boolean = false;
57 /** Input contains Modal dialog component Instance @private */
58 @Input() public userTitle: string;
60 /** Input contains Modal dialog component Instance @private */
61 @Input() public userID: string;
63 /** Contains user details information @public */
64 public userDetails: UserDetail;
66 /** Project Role Mapping @public */
67 public projectRoleMap: UserRoleMap = {};
69 /** Check the loading results @public */
70 public isLoadingResults: boolean = false;
72 /** Give the message for the loading @public */
73 public message: string = 'PLEASEWAIT';
75 /** Contains project information @public */
76 public projects: ProjectData[] = [];
78 /** Contains roles information @public */
79 public roles: RoleData[] = [];
81 /** Instance of the rest service @private */
82 private restService: RestService;
84 /** FormBuilder instance added to the formBuilder @private */
85 private formBuilder: FormBuilder;
87 /** Controls the header form @private */
88 private headers: HttpHeaders;
90 /** Notifier service to popup notification @private */
91 private notifierService: NotifierService;
93 /** Contains tranlsate instance @private */
94 private translateService: TranslateService;
96 /** Project Role Form array @private */
97 private projectRoleFormArray: FormArray;
99 /** Holds all project details @private */
100 private projectService: ProjectService;
102 constructor(injector: Injector) {
103 this.injector = injector;
104 this.formBuilder = this.injector.get(FormBuilder);
105 this.restService = this.injector.get(RestService);
106 this.activeModal = this.injector.get(NgbActiveModal);
107 this.notifierService = this.injector.get(NotifierService);
108 this.translateService = this.injector.get(TranslateService);
109 this.projectService = this.injector.get(ProjectService);
112 /** Generate primitive params @public */
113 get projectRoleParamsBuilder(): FormGroup {
114 return this.formBuilder.group({
115 project_name: [null, [Validators.required]],
116 role_name: [null, [Validators.required]]
120 /** convenience getter for easy access to form fields */
121 get f(): FormGroup['controls'] { return this.projectRoleForm.controls; }
123 /** Lifecyle Hooks the trigger before component is instantiate @public */
124 public ngOnInit(): void {
125 this.headers = new HttpHeaders({
126 'Content-Type': 'application/json',
127 Accept: 'application/json',
128 'Cache-Control': 'no-cache, no-store, must-revalidate, max-age=0'
130 this.initializeForm();
135 /** Initializing Form Action @public */
136 public initializeForm(): void {
137 this.projectRoleForm = this.formBuilder.group({
138 project_role_mappings: this.formBuilder.array([])
142 /** Handle FormArray Controls @public */
143 public getControls(): AbstractControl[] {
144 // tslint:disable-next-line:no-backbone-get-set-outside-model
145 return (this.projectRoleForm.get('project_role_mappings') as FormArray).controls;
148 /** Fetching the data from server to Load in the smarttable @public */
149 public generateData(): void {
150 if (this.userID !== '') {
151 this.isLoadingResults = true;
152 this.restService.getResource(environment.USERS_URL + '/' + this.userID).subscribe((userDetails: UserDetail): void => {
153 this.userDetails = userDetails;
155 this.isLoadingResults = false;
156 }, (error: ERRORDATA): void => {
157 this.isLoadingResults = false;
158 this.restService.handleError(error, 'get');
162 /** Fetching the projects information @public */
163 public getProjects(): void {
164 this.isLoadingResults = true;
165 this.restService.getResource(environment.PROJECTS_URL).subscribe((projectsData: ProjectData[]): void => {
166 this.projects = projectsData;
168 }, (error: ERRORDATA): void => {
169 this.isLoadingResults = false;
170 this.restService.handleError(error, 'get');
174 /** Fetching the Roles information @public */
175 public getRoles(): void {
176 this.restService.getResource(environment.ROLES_URL).subscribe((rolesData: RoleData[]): void => {
177 this.roles = rolesData;
178 this.isLoadingResults = false;
179 }, (error: ERRORDATA): void => {
180 this.isLoadingResults = false;
181 this.restService.handleError(error, 'get');
185 /** Set all roles and project values to the form @public */
186 public loadMapping(): void {
187 this.userDetails.project_role_mappings.forEach((data: ProjectRoleMappings): void => {
188 // tslint:disable-next-line:no-backbone-get-set-outside-model
189 this.projectRoleFormArray = this.projectRoleForm.get('project_role_mappings') as FormArray;
190 this.projectRoleFormArray.push(this.projectRoleParamsBuilder);
192 this.projectRoleForm.patchValue(this.userDetails);
195 /** Remove project and roles from the list @public */
196 public removeMapping(index: number): void {
197 this.projectRoleFormArray.removeAt(index);
200 /** Submit project and roles @public */
201 public addProjectRole(): void {
202 this.submitted = true;
203 const modalData: MODALCLOSERESPONSEDATA = {
206 if (this.projectRoleForm.invalid) { return; }
207 const apiURLHeader: APIURLHEADER = {
208 url: environment.USERS_URL + '/' + this.userID
210 this.projectRoleMap.project_role_mappings = [];
211 this.projectRoleForm.value.project_role_mappings.forEach((res: ProjectRoleMappings): void => {
212 this.projectRoleMap.project_role_mappings.push({ project: res.project_name, role: res.role_name });
214 if (this.projectRoleMap.project_role_mappings.length !== 0) {
215 this.isLoadingResults = true;
216 this.restService.patchResource(apiURLHeader, this.projectRoleMap).subscribe((result: {}): void => {
217 this.isLoadingResults = false;
218 this.activeModal.close(modalData);
219 this.projectService.setHeaderProjects();
220 this.notifierService.notify('success', this.translateService.instant('PAGE.USERS.EDITEDSUCCESSFULLY'));
221 }, (error: ERRORDATA): void => {
222 this.isLoadingResults = false;
223 this.restService.handleError(error, 'patch');
226 this.notifierService.notify('error', this.translateService.instant('PAGE.USERS.EDITPROJECTROLEERROR'));
230 /** Add extra mapping and set empty project and roles @public */
231 public addMapping(): void {
232 // tslint:disable-next-line:no-backbone-get-set-outside-model
233 this.projectRoleFormArray = this.projectRoleForm.get('project_role_mappings') as FormArray;
234 this.projectRoleFormArray.push(this.projectRoleParamsBuilder);
237 /** Remove project and roles for the user @public */
238 public deleteProjectAndRoleMapping(getProjectRoles: ProjectRoleMappings): void {
239 const modalData: MODALCLOSERESPONSEDATA = {
242 const removeProjectRole: UserRoleMap = { remove_project_role_mappings: [] };
243 removeProjectRole.remove_project_role_mappings = [{ project: getProjectRoles.project_name, role: getProjectRoles.role_name }];
244 const apiURLHeader: APIURLHEADER = {
245 url: environment.USERS_URL + '/' + this.userID
247 this.isLoadingResults = true;
248 this.restService.patchResource(apiURLHeader, removeProjectRole).subscribe((result: {}): void => {
249 this.isLoadingResults = false;
250 this.activeModal.close(modalData);
251 this.projectService.setHeaderProjects();
252 this.notifierService.notify('success', this.translateService.instant('PAGE.USERS.EDITEDSUCCESSFULLY'));
253 }, (error: ERRORDATA): void => {
254 this.isLoadingResults = false;
255 this.restService.handleError(error, 'patch');