Fix Bug 1975: Map view Issue in VIM account
[osm/NG-UI.git] / src / app / projects / project-create-update / ProjectCreateUpdateComponent.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 Add Modal
20  */
21 import { Component, Injector, Input, OnInit } from '@angular/core';
22 import { AbstractControl, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
23 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
24 import { TranslateService } from '@ngx-translate/core';
25 import { NotifierService } from 'angular-notifier';
26 import { APIURLHEADER, ERRORDATA, MODALCLOSERESPONSEDATA, TYPESECTION } from 'CommonModel';
27 import { DataService } from 'DataService';
28 import { environment } from 'environment';
29 import { ProjectData, ProjectDetails, QUOTAITEM, QUOTA_ITEMS } from 'ProjectModel';
30 import { ProjectService } from 'ProjectService';
31 import { RestService } from 'RestService';
32 import { SharedService } from 'SharedService';
33 import { isNullOrUndefined } from 'util';
34
35 /**
36  * Creating component
37  * @Component takes ProjectCreateUpdateComponent.html as template url
38  */
39 @Component({
40     selector: 'app-project-create-update',
41     templateUrl: './ProjectCreateUpdateComponent.html',
42     styleUrls: ['./ProjectCreateUpdateComponent.scss']
43 })
44 /** Exporting a class @exports ProjectCreateUpdateComponent */
45 export class ProjectCreateUpdateComponent implements OnInit {
46     /** To inject services @public */
47     public injector: Injector;
48
49     /** Instance of the rest service @public */
50     public restService: RestService;
51
52     /** Instance for active modal service @public */
53     public activeModal: NgbActiveModal;
54
55     /** Contains the recently created project details @public */
56     public recentProject: ProjectDetails;
57
58     /** Contains project create or edit @public */
59     public getProjectType: string;
60
61     /** To inject input type services @public */
62     @Input() public projectType: string;
63
64     /** FormGroup user Edit Account added to the form @ html @public */
65     public projectForm: FormGroup;
66
67     /** Form submission Add */
68     public submitted: boolean = false;
69
70     /** Check the loading results for loader status @public */
71     public isLoadingResults: boolean = false;
72
73     /** Give the message for the loading @public */
74     public message: string = 'PLEASEWAIT';
75
76     /** Holds list of domains @public */
77     public domains: TYPESECTION[] = [];
78
79     /** Holds list of quota items @public */
80     public quotaItems: QUOTAITEM[] = QUOTA_ITEMS;
81
82     /** Holds project reference from response  @public */
83     public quotaRefs: {} = null;
84
85     /** FormBuilder instance added to the formBuilder @private */
86     private formBuilder: FormBuilder;
87
88     /** DataService to pass the data from one component to another @private */
89     private dataService: DataService;
90
91     /** Contains project name ref @private */
92     private projectRef: string;
93
94     /** Notifier service to popup notification @private */
95     private notifierService: NotifierService;
96
97     /** Contains tranlsate instance @private */
98     private translateService: TranslateService;
99
100     /** Contains all methods related to shared @private */
101     private sharedService: SharedService;
102
103     /** ModalData instance of modal @private  */
104     private modalData: MODALCLOSERESPONSEDATA;
105
106     /** Holds all project details @private */
107     private projectService: ProjectService;
108
109     constructor(injector: Injector) {
110         this.injector = injector;
111         this.formBuilder = this.injector.get(FormBuilder);
112         this.restService = this.injector.get(RestService);
113         this.activeModal = this.injector.get(NgbActiveModal);
114         this.dataService = this.injector.get(DataService);
115         this.notifierService = this.injector.get(NotifierService);
116         this.translateService = this.injector.get(TranslateService);
117         this.sharedService = this.injector.get(SharedService);
118         this.projectService = this.injector.get(ProjectService);
119         /** Initializing Form Action */
120         this.projectForm = this.formBuilder.group({
121             project_name: ['', Validators.required],
122             domain_name: [null],
123             enable_quota: [false, Validators.required]
124         });
125     }
126
127     /** convenience getter for easy access to form fields */
128     get f(): FormGroup['controls'] { return this.projectForm.controls; }
129
130     /** Lifecyle Hooks the trigger before component is instantiate @public */
131     public ngOnInit(): void {
132         this.getProjectType = this.projectType;
133         if (this.getProjectType === 'Edit') {
134             this.dataService.currentMessage.subscribe((data: ProjectData): void => {
135                 if (data.projectName !== undefined || data.projectName !== '' || data.projectName !== null) {
136                     this.projectForm.patchValue({ project_name: data.projectName });
137                     this.projectRef = data.id;
138                     this.quotaRefs = data.quotas;
139                     this.patchQuotaInfo(this.quotaRefs);
140                 }
141             });
142         } else {
143             this.patchQuotaInfo();
144             this.getProjects();
145         }
146     }
147
148     /** Get the last project name @public */
149     public getProjects(): void {
150         this.isLoadingResults = true;
151         this.restService.getResource(environment.PROJECTS_URL).subscribe((projects: ProjectDetails[]): void => {
152             this.recentProject = projects.slice(-1).pop();
153             this.getDomainList();
154         }, (error: ERRORDATA): void => {
155             this.restService.handleError(error, 'get');
156             this.isLoadingResults = false;
157         });
158     }
159
160     /** On modal submit users acction will called @public */
161     public projectAction(userType: string): void {
162         this.submitted = true;
163         this.modalData = {
164             message: 'Done'
165         };
166         this.sharedService.cleanForm(this.projectForm);
167         for (const data of this.quotaItems) {
168             if (this.getFormControl(data.value).value > data.maxValue) {
169                 this.notifierService.notify('error', this.translateService.instant('PAGE.PROJECT.QUOTALIMIT'));
170                 break;
171             }
172         }
173         if (!this.projectForm.invalid) {
174             if (userType === 'Add') {
175                 this.createProject();
176             } else if (userType === 'Edit') {
177                 this.editProject();
178             }
179         }
180     }
181
182     /** Create project @public */
183     public createProject(): void {
184         this.isLoadingResults = true;
185         const apiURLHeader: APIURLHEADER = {
186             url: environment.PROJECTS_URL
187         };
188         const projectPayload: ProjectDetails = {
189             name: this.projectForm.value.project_name,
190             domain_name: !isNullOrUndefined(this.projectForm.value.domain_name) ? this.projectForm.value.domain_name : undefined
191         };
192         this.addQuotaLimit(projectPayload);
193         this.restService.postResource(apiURLHeader, projectPayload).subscribe((): void => {
194             this.activeModal.close(this.modalData);
195             this.isLoadingResults = false;
196             this.notifierService.notify('success', this.translateService.instant('PAGE.PROJECT.CREATEDSUCCESSFULLY'));
197         }, (error: ERRORDATA): void => {
198             this.restService.handleError(error, 'post');
199             this.isLoadingResults = false;
200         });
201     }
202     /** Handle enable quota limit checkbox event @public */
203     public checkQuota(): void {
204         if (this.getFormControl('enable_quota').value) {
205             this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
206                 this.projectForm.addControl(quotaItem.value, new FormControl(''));
207             });
208         } else {
209             this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
210                 this.getFormControl(quotaItem.value).setValue('');
211             });
212         }
213     }
214     /** Edit project @public */
215     public editProject(): void {
216         this.isLoadingResults = true;
217         const apiURLHeader: APIURLHEADER = {
218             url: environment.PROJECTS_URL + '/' + this.projectRef
219         };
220         const projectPayload: ProjectDetails = {
221             name: this.projectForm.value.project_name
222         };
223         this.addQuotaLimit(projectPayload);
224         this.restService.patchResource(apiURLHeader, projectPayload).subscribe((): void => {
225             this.activeModal.close(this.modalData);
226             this.isLoadingResults = false;
227             this.projectService.setHeaderProjects();
228             this.notifierService.notify('success', this.translateService.instant('PAGE.PROJECT.UPDATEDSUCCESSFULLY'));
229         }, (error: ERRORDATA): void => {
230             this.restService.handleError(error, 'patch');
231             this.isLoadingResults = false;
232         });
233     }
234     /** Get domain name list @private */
235     private getDomainList(): void {
236         this.isLoadingResults = true;
237         this.sharedService.getDomainName().subscribe((domainList: TYPESECTION[]): void => {
238             this.domains = domainList;
239             this.isLoadingResults = false;
240         }, (error: ERRORDATA): void => {
241             this.isLoadingResults = false;
242             this.restService.handleError(error, 'get');
243         });
244     }
245
246     /** Used to get the AbstractControl of controlName passed @private */
247     private getFormControl(controlName: string): AbstractControl {
248         return this.projectForm.controls[controlName];
249     }
250
251     /** Add quota information to payload @private */
252     private addQuotaLimit(payload: ProjectDetails): void {
253         if (this.getFormControl('enable_quota').value) {
254             payload.quotas = {};
255             this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
256                 if (this.getFormControl(quotaItem.value).value !== '') {
257                     payload.quotas[quotaItem.value] = this.getFormControl(quotaItem.value).value;
258                 }
259             });
260             if (Object.keys(payload.quotas).length === 0) {
261                 delete payload.quotas;
262             }
263         }
264     }
265
266     /** Set quota information in project form model @private */
267     private patchQuotaInfo(quotaRef?: {}): void {
268         if (quotaRef !== null && this.getProjectType === 'Edit') {
269             this.getFormControl('enable_quota').setValue(true);
270             this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
271                 if (!isNullOrUndefined(quotaRef[quotaItem.value])) {
272                     this.projectForm.addControl(quotaItem.value, new FormControl(quotaRef[quotaItem.value],
273                         [Validators.max(quotaItem.maxValue)]));
274                 } else {
275                     this.projectForm.addControl(quotaItem.value, new FormControl('', [Validators.max(quotaItem.maxValue)]));
276                 }
277             });
278         } else {
279             this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
280                 this.projectForm.addControl(quotaItem.value, new FormControl('', [Validators.min(quotaItem.minValue),
281                 Validators.max(quotaItem.maxValue)]));
282             });
283         }
284     }
285 }