Added portal-FE-os components
[portal.git] / portal-FE-os / src / app / pages / users / new-user-modal / new-user-modal.component.ts
diff --git a/portal-FE-os/src/app/pages/users/new-user-modal/new-user-modal.component.ts b/portal-FE-os/src/app/pages/users/new-user-modal/new-user-modal.component.ts
new file mode 100644 (file)
index 0000000..76c14f1
--- /dev/null
@@ -0,0 +1,322 @@
+/*-
+ * ============LICENSE_START==========================================
+ * ONAP Portal
+ * ===================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License");
+ * you may not use this software except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END============================================
+ *
+ *
+ */
+import { Component, OnInit, Input, EventEmitter, Output } from '@angular/core';
+import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap';
+import { ApplicationsService, UsersService } from 'src/app/shared/services';
+import { MatTableDataSource, MatRadioChange } from '@angular/material';
+import { UserAdminApps, UserAccessRoles } from 'src/app/shared/model';
+import { ConfirmationModalComponent } from 'src/app/modals/confirmation-modal/confirmation-modal.component';
+import { InformationModalComponent } from 'src/app/modals/information-modal/information-modal.component';
+import { HttpErrorResponse } from '@angular/common/http';
+
+@Component({
+  selector: 'app-new-user-modal',
+  templateUrl: './new-user-modal.component.html',
+  styleUrls: ['./new-user-modal.component.scss']
+})
+export class NewUserModalComponent implements OnInit {
+  @Input() dialogState: number;
+  @Input() userTitle: string;
+  @Input() disableBack: boolean;
+  @Input() adminModalData: any;
+  @Input() userModalData: any;
+  @Output() passBackNewUserPopup: EventEmitter<any> = new EventEmitter();
+  changedSelectedUser: any;
+  showSpinner: boolean;
+  isGettingAdminApps: boolean;
+  adminApps: any;
+  modelSelectedRoles: any;
+  appRoles: Array<UserAccessRoles>;
+  numberAppsProcessed: number;
+  isSystemUserCheck = false;
+  extRequestValue = false;
+  searchTitleText = 'Enter First Name, Last Name or Org-ID';
+  placeholderText = 'Search';
+  ngRepeatDemo = [
+    { id: 'userButton', value: 'true', labelValue: 'User' },
+    { id: 'systemUserButton', value: 'false', labelValue: 'System' }
+  ]
+  selectedvalueradioButtonGroup = {
+    type: 'true'
+  }
+  userRadioSearchButton = this.ngRepeatDemo[0].labelValue;
+  displayedColumns: string[] = ['applications', 'roles', 'delete'];
+  userAdminAppsSource = new MatTableDataSource(this.adminApps);
+  showAppSpinner: boolean;
+  isError: boolean;
+  errorMessage: any;
+  originalSelectedRoles: any;
+  numberAppsSucceeded: number;
+  anyChanges: boolean;
+  orgUserIdValue: string;
+  constructor(public ngbModal: NgbModal, public activeModal: NgbActiveModal, private applicationsService: ApplicationsService, private usersService: UsersService) { }
+
+  ngOnInit() {
+    this.appRoles = [];
+    this.adminApps = [];
+    this.anyChanges = false;
+    this.modelSelectedRoles = [];
+    this.originalSelectedRoles = [];
+    this.changedSelectedUser = null;
+    if (this.dialogState === 2) {
+      this.changedSelectedUser = this.userModalData;
+      this.orgUserIdValue = this.changedSelectedUser.orgUserId;
+      this.getUserAppsRoles();
+    }
+  }
+
+  addUserFlag : boolean = false;
+
+  addNewUser(newUserFlag : boolean){
+    console.log("New user flag ", newUserFlag);
+    this.addUserFlag = true;
+  }
+
+  changeSelectedUser(user: any) {
+    this.changedSelectedUser = user;
+    if (this.changedSelectedUser.firstName === undefined || this.changedSelectedUser.lastName === undefined) {
+      this.userTitle = this.changedSelectedUser;
+      this.orgUserIdValue = this.changedSelectedUser;
+    }
+    else {
+      this.orgUserIdValue = this.changedSelectedUser.orgUserId;
+      this.userTitle = `${this.changedSelectedUser.firstName}, ` + ` ${this.changedSelectedUser.lastName} ` + ` (${this.changedSelectedUser.orgUserId})`;
+    }
+  }
+
+  searchUserRadioChange($event: MatRadioChange) {
+    if ($event.value === 'System') {
+      this.searchTitleText = 'Enter System UserID';
+      this.placeholderText = 'xxxxxx@org.com';
+      this.isSystemUserCheck = true;
+    } else {
+      this.searchTitleText = 'Enter First Name, Last Name or ATTUID';
+      this.placeholderText = 'Search';
+      this.isSystemUserCheck = false;
+    }
+  }
+
+  navigateBack() {
+    this.anyChanges = false;
+    this.dialogState = 1;
+  }
+
+  roleSelectChange(element: any) { // update this.adminApps list when user select roles from dropdown
+    let existingSelectedRoles = this.modelSelectedRoles;
+    this.modelSelectedRoles = [];
+    this.anyChanges = true;
+    this.adminApps.forEach(_item => {
+      if (_item.id === element.id) {
+        _item['isChanged'] = true;
+      }
+      let appRoleList = _item.appRoles;
+      if (appRoleList != undefined) {
+        appRoleList.forEach(_itemRole => {
+          if (_itemRole.appId === element.id) {
+            const index = existingSelectedRoles.indexOf(_itemRole);
+            if (index != -1) {
+              _itemRole.isApplied = true;
+            } else {
+              _itemRole.isApplied = false;
+            }
+          }
+          if (_itemRole.isApplied)
+            this.modelSelectedRoles.push(_itemRole);
+        });
+      }
+    });
+  }
+
+  getUserAppsRoles() {
+    if (this.changedSelectedUser === undefined) {
+      this.dialogState = 1;
+      return;
+    }
+    this.isGettingAdminApps = true;
+    this.applicationsService.getAdminApps().subscribe((apps: Array<UserAdminApps>) => {
+      this.isGettingAdminApps = false;
+      if (!apps || !apps.length) {
+        return null;
+      }
+      this.adminApps = apps;
+      this.dialogState = 2;
+      this.numberAppsProcessed = 0;
+      this.showSpinner = true;
+      apps.forEach(app => {
+        //$log.debug('NewUserModalCtrl::getUserAppsRoles: app: id: ', app.id, 'name: ',app.name);
+        // Keep track of which app has changed, so we know which apps to update using a BE API
+        app['isChanged'] = false;
+        // Each of these specifies a state, which corresponds to a different message and style that gets displayed
+        app['showSpinner'] = true;
+        app['isError'] = false;
+        app['isDeleted'] = false;
+        app['printNoChanges'] = false;
+        app['isUpdating'] = false;
+        app['isErrorUpdating'] = false;
+        app['isDoneUpdating'] = false;
+        app['errorMessage'] = "";
+        this.usersService.getUserAppRoles(app.id, this.orgUserIdValue, this.extRequestValue, this.isSystemUserCheck).toPromise().then((userAppRolesResult) => {
+          app['appRoles'] = userAppRolesResult;
+          app['showSpinner'] = false;
+          for (var i = 0; i < app['appRoles'].length; i++) {
+            app['appRoles'][i]['appId'] = app.id;
+            if (app['appRoles'][i].roleName.indexOf('global_') != -1) {
+              app['appRoles'][i].roleName = '*' + app['appRoles'][i].roleName;
+            }
+            if (app['appRoles'][i].isApplied)
+              this.modelSelectedRoles.push(app['appRoles'][i]);
+          }
+        }).catch((err: HttpErrorResponse) => {
+          app['isError'] = true;
+          app['showSpinner'] = false;
+          if (err.status == 200 || err.message.toLowerCase().includes("rollback"))
+            app['errorMessage'] = 'Error: ' + 500;
+          else
+            app['errorMessage'] = 'Error: ' + err.status;
+        }).finally(() => {
+          this.numberAppsProcessed++;
+          if (this.numberAppsProcessed === this.adminApps.length) {
+            this.originalSelectedRoles = this.modelSelectedRoles;
+            this.showSpinner = false;
+          }
+        });
+      })
+      this.userAdminAppsSource = new MatTableDataSource(this.adminApps);
+    }, (_err) => {
+
+    })
+  }
+
+  updateUserAppsRoles() {
+    this.anyChanges = false;
+    if (!this.changedSelectedUser ||
+        (this.changedSelectedUser.orgUserId == undefined && !this.isSystemUserCheck) ||
+          !this.adminApps) {
+      return;
+    }
+    this.showSpinner = true;
+    this.numberAppsProcessed = 0;
+    this.numberAppsSucceeded = 0;
+    this.adminApps.forEach(app => {
+      if (app.isChanged) {
+        app.isUpdating = true;
+        for (var i = 0; i < app.appRoles.length; i++) {
+          if (app.appRoles[i].roleName.indexOf('*global_') != -1) {
+            app.appRoles[i].roleName = app.appRoles[i].roleName.replace('*', '');
+          }
+        }
+        var newUserAppRoles = {
+          orgUserId: this.orgUserIdValue,
+          appId: app.id,
+          appRoles: app.appRoles,
+          appName: app.name,
+          isSystemUser: this.isSystemUserCheck
+        };
+        this.usersService.updateUserAppRoles(newUserAppRoles).toPromise()
+          .then((res: any) => {
+            if (res.status && res.status.toLowerCase() === 'error') {
+              const modalErrorRef = this.ngbModal.open(ConfirmationModalComponent);
+              modalErrorRef.componentInstance.message = "Error: " + res.message;
+            }
+            app.isUpdating = false;
+            app.isDoneUpdating = true;
+            this.numberAppsSucceeded++;
+          }).catch(err => {
+            var errorMessage = 'Failed to update the user application roles: ' + err;
+            if (err.status == 504) {
+              this.numberAppsSucceeded++;
+              errorMessage = 'Request is being processed, please check back later!';
+            } else {
+              app.isErrorUpdating = true;
+            }
+            const modalErrorRef = this.ngbModal.open(ConfirmationModalComponent);
+            modalErrorRef.componentInstance.message = errorMessage;
+          }).finally(() => {
+            this.numberAppsProcessed++;
+            if (this.numberAppsProcessed === this.adminApps.length) {
+              this.showSpinner = false; // hide the spinner
+            }
+            if (this.numberAppsSucceeded === this.adminApps.length) {
+              this.passBackNewUserPopup.emit();
+              this.activeModal.close('Close');//close and resolve dialog promise with true (to update the table)
+            }
+          })
+      } else {
+        app.noChanges = true;
+        app.isError = false; //remove the error message; just show the No Changes messages
+        this.numberAppsProcessed++;
+        this.numberAppsSucceeded++;
+        if (this.numberAppsProcessed === this.adminApps.length) {
+          this.showSpinner = false; // hide the spinner
+        }
+        if (this.numberAppsSucceeded === this.adminApps.length) {
+          this.activeModal.close('Close');
+        }
+      }
+    });
+  }
+
+  deleteApp(app) {
+    let appMessage = this.changedSelectedUser.firstName + ' ' + this.changedSelectedUser.lastName;
+    const ngbModalConfirm = this.ngbModal.open(InformationModalComponent);
+    ngbModalConfirm.componentInstance.title = 'Confirmation';
+    ngbModalConfirm.componentInstance.message = 'Are you sure you want to delete ' + appMessage;
+    ngbModalConfirm.result.then((_res) => {
+      if (_res === 'Ok') {
+        this.anyChanges = true;
+        app.isChanged = true;
+        app.isDeleted = true; // use this to hide the app in the display
+        app.appRoles.forEach((role) => {
+          role.isApplied = false;
+        });
+        // remove app roles if user app delete option is selected
+        this.modelSelectedRoles.forEach((_role, index) => {
+          if (_role.appId === app.id) this.modelSelectedRoles.splice(index, 1);
+        })
+        this.roleSelectChange(app);
+      }
+    }).catch(err => {
+      // $log.error('NewUserModalCtrl::deleteApp error: ',err);
+      const ngbModalError = this.ngbModal.open(InformationModalComponent);
+      ngbModalError.componentInstance.title = 'Error';
+      ngbModalError.componentInstance.message = 'There was a problem deleting the the applications. ' +
+        'Please try again later. Error: ' + err.status;
+    });
+  }
+
+}