blob: bb1207aeff0eb1893c94555a50f5ff7fa795836d [file] [log] [blame]
kumaran.m3b4814a2020-05-01 19:48:54 +05301/*
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 */
21import { Component, Injector, Input, OnInit } from '@angular/core';
Barath Kumar R09cd4ec2020-07-07 16:12:32 +053022import { AbstractControl, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
kumaran.m3b4814a2020-05-01 19:48:54 +053023import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
24import { TranslateService } from '@ngx-translate/core';
25import { NotifierService } from 'angular-notifier';
Barath Kumar R16070582021-02-08 18:19:35 +053026import { APIURLHEADER, ERRORDATA, MODALCLOSERESPONSEDATA, TYPESECTION } from 'CommonModel';
kumaran.m3b4814a2020-05-01 19:48:54 +053027import { DataService } from 'DataService';
28import { environment } from 'environment';
Barath Kumar R16070582021-02-08 18:19:35 +053029import { ProjectData, ProjectDetails, QUOTAITEM, QUOTA_ITEMS } from 'ProjectModel';
kumaran.m3b4814a2020-05-01 19:48:54 +053030import { ProjectService } from 'ProjectService';
31import { RestService } from 'RestService';
32import { SharedService } from 'SharedService';
33import { isNullOrUndefined } from 'util';
34
35/**
36 * Creating component
37 * @Component takes ProjectCreateUpdateComponent.html as template url
38 */
39@Component({
Barath Kumar R16070582021-02-08 18:19:35 +053040 selector: 'app-project-create-update',
41 templateUrl: './ProjectCreateUpdateComponent.html',
42 styleUrls: ['./ProjectCreateUpdateComponent.scss']
kumaran.m3b4814a2020-05-01 19:48:54 +053043})
44/** Exporting a class @exports ProjectCreateUpdateComponent */
45export class ProjectCreateUpdateComponent implements OnInit {
Barath Kumar R16070582021-02-08 18:19:35 +053046 /** To inject services @public */
47 public injector: Injector;
kumaran.m3b4814a2020-05-01 19:48:54 +053048
Barath Kumar R16070582021-02-08 18:19:35 +053049 /** Instance of the rest service @public */
50 public restService: RestService;
kumaran.m3b4814a2020-05-01 19:48:54 +053051
Barath Kumar R16070582021-02-08 18:19:35 +053052 /** Instance for active modal service @public */
53 public activeModal: NgbActiveModal;
kumaran.m3b4814a2020-05-01 19:48:54 +053054
Barath Kumar R16070582021-02-08 18:19:35 +053055 /** Contains the recently created project details @public */
56 public recentProject: ProjectDetails;
kumaran.m3b4814a2020-05-01 19:48:54 +053057
Barath Kumar R16070582021-02-08 18:19:35 +053058 /** Contains project create or edit @public */
59 public getProjectType: string;
kumaran.m3b4814a2020-05-01 19:48:54 +053060
Barath Kumar R16070582021-02-08 18:19:35 +053061 /** To inject input type services @public */
62 @Input() public projectType: string;
kumaran.m3b4814a2020-05-01 19:48:54 +053063
Barath Kumar R16070582021-02-08 18:19:35 +053064 /** FormGroup user Edit Account added to the form @ html @public */
65 public projectForm: FormGroup;
kumaran.m3b4814a2020-05-01 19:48:54 +053066
Barath Kumar R16070582021-02-08 18:19:35 +053067 /** Form submission Add */
68 public submitted: boolean = false;
kumaran.m3b4814a2020-05-01 19:48:54 +053069
Barath Kumar R16070582021-02-08 18:19:35 +053070 /** Check the loading results for loader status @public */
71 public isLoadingResults: boolean = false;
kumaran.m3b4814a2020-05-01 19:48:54 +053072
Barath Kumar R16070582021-02-08 18:19:35 +053073 /** Give the message for the loading @public */
74 public message: string = 'PLEASEWAIT';
kumaran.m3b4814a2020-05-01 19:48:54 +053075
Barath Kumar R16070582021-02-08 18:19:35 +053076 /** Holds list of domains @public */
77 public domains: TYPESECTION[] = [];
kumaran.m3b4814a2020-05-01 19:48:54 +053078
Barath Kumar R16070582021-02-08 18:19:35 +053079 /** Holds list of quota items @public */
80 public quotaItems: QUOTAITEM[] = QUOTA_ITEMS;
Barath Kumar R09cd4ec2020-07-07 16:12:32 +053081
Barath Kumar R16070582021-02-08 18:19:35 +053082 /** Holds project reference from response @public */
83 public quotaRefs: {} = null;
Barath Kumar R09cd4ec2020-07-07 16:12:32 +053084
Barath Kumar R16070582021-02-08 18:19:35 +053085 /** FormBuilder instance added to the formBuilder @private */
86 private formBuilder: FormBuilder;
kumaran.m3b4814a2020-05-01 19:48:54 +053087
Barath Kumar R16070582021-02-08 18:19:35 +053088 /** DataService to pass the data from one component to another @private */
89 private dataService: DataService;
kumaran.m3b4814a2020-05-01 19:48:54 +053090
Barath Kumar R16070582021-02-08 18:19:35 +053091 /** Contains project name ref @private */
92 private projectRef: string;
kumaran.m3b4814a2020-05-01 19:48:54 +053093
Barath Kumar R16070582021-02-08 18:19:35 +053094 /** Notifier service to popup notification @private */
95 private notifierService: NotifierService;
kumaran.m3b4814a2020-05-01 19:48:54 +053096
Barath Kumar R16070582021-02-08 18:19:35 +053097 /** Contains tranlsate instance @private */
98 private translateService: TranslateService;
kumaran.m3b4814a2020-05-01 19:48:54 +053099
Barath Kumar R16070582021-02-08 18:19:35 +0530100 /** Contains all methods related to shared @private */
101 private sharedService: SharedService;
kumaran.m3b4814a2020-05-01 19:48:54 +0530102
Barath Kumar R16070582021-02-08 18:19:35 +0530103 /** ModalData instance of modal @private */
104 private modalData: MODALCLOSERESPONSEDATA;
kumaran.m3b4814a2020-05-01 19:48:54 +0530105
Barath Kumar R16070582021-02-08 18:19:35 +0530106 /** Holds all project details @private */
107 private projectService: ProjectService;
kumaran.m3b4814a2020-05-01 19:48:54 +0530108
Barath Kumar R16070582021-02-08 18:19:35 +0530109 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 });
kumaran.m3b4814a2020-05-01 19:48:54 +0530125 }
kumaran.m3b4814a2020-05-01 19:48:54 +0530126
Barath Kumar R16070582021-02-08 18:19:35 +0530127 /** convenience getter for easy access to form fields */
128 get f(): FormGroup['controls'] { return this.projectForm.controls; }
kumaran.m3b4814a2020-05-01 19:48:54 +0530129
Barath Kumar R16070582021-02-08 18:19:35 +0530130 /** 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 });
Barath Kumar R09cd4ec2020-07-07 16:12:32 +0530142 } else {
Barath Kumar R16070582021-02-08 18:19:35 +0530143 this.patchQuotaInfo();
144 this.getProjects();
Barath Kumar R09cd4ec2020-07-07 16:12:32 +0530145 }
Barath Kumar R09cd4ec2020-07-07 16:12:32 +0530146 }
Barath Kumar R16070582021-02-08 18:19:35 +0530147
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);
SANDHYA.JSb1ec4c32022-04-05 08:58:00 +0530167 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 }
Barath Kumar R16070582021-02-08 18:19:35 +0530173 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 => {
Barath Kumar R2e02e7d2021-06-09 09:18:17 +0530206 this.projectForm.addControl(quotaItem.value, new FormControl(''));
Barath Kumar R16070582021-02-08 18:19:35 +0530207 });
208 } else {
209 this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
Barath Kumar R2e02e7d2021-06-09 09:18:17 +0530210 this.getFormControl(quotaItem.value).setValue('');
Barath Kumar R16070582021-02-08 18:19:35 +0530211 });
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 => {
Barath Kumar R2e02e7d2021-06-09 09:18:17 +0530256 if (this.getFormControl(quotaItem.value).value !== '') {
257 payload.quotas[quotaItem.value] = this.getFormControl(quotaItem.value).value;
258 }
Barath Kumar R16070582021-02-08 18:19:35 +0530259 });
Barath Kumar R2e02e7d2021-06-09 09:18:17 +0530260 if (Object.keys(payload.quotas).length === 0) {
261 delete payload.quotas;
262 }
Barath Kumar R16070582021-02-08 18:19:35 +0530263 }
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],
Barath Kumar R2e02e7d2021-06-09 09:18:17 +0530273 [Validators.max(quotaItem.maxValue)]));
Barath Kumar R16070582021-02-08 18:19:35 +0530274 } else {
Barath Kumar R2e02e7d2021-06-09 09:18:17 +0530275 this.projectForm.addControl(quotaItem.value, new FormControl('', [Validators.max(quotaItem.maxValue)]));
Barath Kumar R16070582021-02-08 18:19:35 +0530276 }
277 });
278 } else {
279 this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
Barath Kumar R2e02e7d2021-06-09 09:18:17 +0530280 this.projectForm.addControl(quotaItem.value, new FormControl('', [Validators.min(quotaItem.minValue),
281 Validators.max(quotaItem.maxValue)]));
Barath Kumar R16070582021-02-08 18:19:35 +0530282 });
283 }
284 }
kumaran.m3b4814a2020-05-01 19:48:54 +0530285}