f5bb7721a441d5a8d103dbd82bfc691a61719ac0
[osm/NG-UI.git] / src / app / users / project-role / ProjectRoleComponent.ts
1 /*
2  Copyright 2020 TATA ELXSI
3
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
7
8   http://www.apache.org/licenses/LICENSE-2.0
9
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.
15
16  Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
17 */
18 /**
19  * @file Project Role Component.
20  */
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';
34
35 /**
36  * Creating component
37  * @Component takes ProjectRole.html as template url
38  */
39 @Component({
40   templateUrl: './ProjectRoleComponent.html',
41   styleUrls: ['./ProjectRoleComponent.scss']
42 })
43 /** Exporting a class @exports ProjectRoleComponent */
44 export class ProjectRoleComponent implements OnInit {
45   /** To inject services @public */
46   public injector: Injector;
47
48   /** Instance for active modal service @public */
49   public activeModal: NgbActiveModal;
50
51   /** FormGroup user Edit Account added to the form @ html @public */
52   public projectRoleForm: FormGroup;
53
54   /** Form submission Add */
55   public submitted: boolean = false;
56
57   /** Input contains Modal dialog component Instance @private */
58   @Input() public userTitle: string;
59
60   /** Input contains Modal dialog component Instance @private */
61   @Input() public userID: string;
62
63   /** Contains user details information @public */
64   public userDetails: UserDetail;
65
66   /** Project Role Mapping @public */
67   public projectRoleMap: UserRoleMap = {};
68
69   /** Check the loading results @public */
70   public isLoadingResults: boolean = false;
71
72   /** Give the message for the loading @public */
73   public message: string = 'PLEASEWAIT';
74
75   /** Contains project information @public */
76   public projects: ProjectData[] = [];
77
78   /** Contains roles information @public */
79   public roles: RoleData[] = [];
80
81   /** Instance of the rest service @private */
82   private restService: RestService;
83
84   /** FormBuilder instance added to the formBuilder @private */
85   private formBuilder: FormBuilder;
86
87   /** Controls the header form @private */
88   private headers: HttpHeaders;
89
90   /** Notifier service to popup notification @private */
91   private notifierService: NotifierService;
92
93   /** Contains tranlsate instance @private */
94   private translateService: TranslateService;
95
96   /** Project Role Form array @private */
97   private projectRoleFormArray: FormArray;
98
99   /** Holds all project details @private */
100   private projectService: ProjectService;
101
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);
110     this.initializeForm();
111   }
112
113   /** Generate primitive params @public */
114   get projectRoleParamsBuilder(): FormGroup {
115     return this.formBuilder.group({
116       project_name: [null, [Validators.required]],
117       role_name: [null, [Validators.required]]
118     });
119   }
120
121   /** Lifecyle Hooks the trigger before component is instantiate @public */
122   public ngOnInit(): void {
123     this.headers = new HttpHeaders({
124       'Content-Type': 'application/json',
125       Accept: 'application/json',
126       'Cache-Control': 'no-cache, no-store, must-revalidate, max-age=0'
127     });
128     this.getProjects();
129     this.generateData();
130   }
131
132   /** convenience getter for easy access to form fields */
133   get f(): FormGroup['controls'] { return this.projectRoleForm.controls; }
134
135   /** Initializing Form Action  @public */
136   public initializeForm(): void {
137     this.projectRoleForm = this.formBuilder.group({
138       project_role_mappings: this.formBuilder.array([])
139     });
140   }
141
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;
146   }
147
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) => {
153         this.userDetails = userDetails;
154         this.loadMapping();
155         this.isLoadingResults = false;
156       }, (error: ERRORDATA) => {
157         this.isLoadingResults = false;
158         this.restService.handleError(error, 'get');
159       });
160     }
161   }
162   /** Fetching the projects information @public */
163   public getProjects(): void {
164     this.isLoadingResults = true;
165     this.restService.getResource(environment.PROJECTS_URL).subscribe((projectsData: ProjectData[]) => {
166       this.projects = projectsData;
167       this.getRoles();
168     }, (error: ERRORDATA) => {
169       this.isLoadingResults = false;
170       this.restService.handleError(error, 'get');
171     });
172   }
173
174   /** Fetching the Roles information @public */
175   public getRoles(): void {
176     this.restService.getResource(environment.ROLES_URL).subscribe((rolesData: RoleData[]) => {
177       this.roles = rolesData;
178       this.isLoadingResults = false;
179     }, (error: ERRORDATA) => {
180       this.isLoadingResults = false;
181       this.restService.handleError(error, 'get');
182     });
183   }
184
185   /** Set all roles and project values to the form @public */
186   public loadMapping(): void {
187     this.userDetails.project_role_mappings.forEach((data: ProjectRoleMappings) => {
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);
191     });
192     this.projectRoleForm.patchValue(this.userDetails);
193   }
194
195   /** Remove project and roles from the list @public */
196   public removeMapping(index: number): void {
197     this.projectRoleFormArray.removeAt(index);
198   }
199
200   /** Submit project and roles @public */
201   public addProjectRole(): void {
202     this.submitted = true;
203     const modalData: MODALCLOSERESPONSEDATA = {
204       message: 'Done'
205     };
206     if (this.projectRoleForm.invalid) { return; }
207     const apiURLHeader: APIURLHEADER = {
208       url: environment.USERS_URL + '/' + this.userID
209     };
210     this.projectRoleMap.project_role_mappings = [];
211     this.projectRoleForm.value.project_role_mappings.forEach((res: ProjectRoleMappings) => {
212       this.projectRoleMap.project_role_mappings.push({ project: res.project_name, role: res.role_name });
213     });
214     if (this.projectRoleMap.project_role_mappings.length !== 0) {
215       this.isLoadingResults = true;
216       this.restService.patchResource(apiURLHeader, this.projectRoleMap).subscribe((result: {}) => {
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) => {
222         this.isLoadingResults = false;
223         this.restService.handleError(error, 'patch');
224       });
225     } else {
226       this.notifierService.notify('error', this.translateService.instant('PAGE.USERS.EDITPROJECTROLEERROR'));
227     }
228   }
229
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);
235   }
236 }