--- /dev/null
+/* Copyright (c) 2019 AT&T Intellectual Property. #\r
+# #\r
+# Licensed under the Apache License, Version 2.0 (the "License"); #\r
+# you may not use this file except in compliance with the License. #\r
+# You may obtain a copy of the License at #\r
+# #\r
+# http://www.apache.org/licenses/LICENSE-2.0 #\r
+# #\r
+# Unless required by applicable law or agreed to in writing, software #\r
+# distributed under the License is distributed on an "AS IS" BASIS, #\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #\r
+# See the License for the specific language governing permissions and #\r
+# limitations under the License. #\r
+##############################################################################*/\r
+\r
+\r
+import {Component, OnInit, ViewContainerRef, ViewChild} from '@angular/core';\r
+import {ActivatedRoute, Router} from '@angular/router';\r
+import { MatPaginator, MatDialog, MatSnackBar } from '@angular/material';\r
+import { MatTableDataSource } from '@angular/material/table';\r
+import {HttpClient} from "@angular/common/http";\r
+import {UserService} from "../../shared/services/user.service";\r
+import { routerTransition } from '../../router.animations';\r
+import { ListService } from '../../shared/services/list.service';\r
+import { AlertSnackbarComponent } from 'app/shared/modules/alert-snackbar/alert-snackbar.component';\r
+import { GroupService } from 'app/shared/services/group.service';\r
+import { AlertModalComponent } from 'app/shared/modules/alert-modal/alert-modal.component';\r
+import * as organizeGroups from '../../../../../server/src/feathers/hooks/permissions/get-permissions';\r
+import { CookieService } from 'ngx-cookie-service';\r
+\r
+@Component({\r
+ selector: 'app-user-management',\r
+ templateUrl: './user-management.component.pug',\r
+ styleUrls: ['./user-management.component.scss'],\r
+ animations: [routerTransition()]\r
+\r
+})\r
+export class UserManagementComponent implements OnInit {\r
+\r
+ public dataSource;\r
+ public displayedColumns: string[] = ['lastName', 'firstName', 'email', 'addGroups', 'isVerified', 'enabled'];\r
+ public resultsLength;\r
+ public loading = false;\r
+ public filterString = "";\r
+ public groups;\r
+ public search;\r
+ public currentUser;\r
+ \r
+ @ViewChild(MatPaginator) paginator: MatPaginator;\r
+\r
+\r
+ constructor(private http: HttpClient,\r
+ private router: Router,\r
+ private viewRef: ViewContainerRef,\r
+ private list: ListService,\r
+ private modal: MatDialog,\r
+ private snack: MatSnackBar,\r
+ private user: UserService,\r
+ private route: ActivatedRoute,\r
+ private groupService: GroupService,\r
+ private cookie: CookieService\r
+ ) { }\r
+\r
+ ngOnInit() {\r
+ this.loading = true;\r
+ this.groups = [];\r
+ this.search = {};\r
+ this.search.groupName = '';\r
+ this.currentUser = JSON.parse(this.cookie.get('currentUser'));\r
+ this.groupService.find({$limit: -1}).subscribe((result) => {\r
+ if(result){\r
+ this.groups = organizeGroups(this.currentUser, result);\r
+ \r
+ }\r
+ })\r
+ this.route.queryParamMap.subscribe(queryParams => {\r
+ this.filterString = queryParams.get("filter");\r
+ if(!this.filterString){\r
+ this.filterString = "";\r
+ }\r
+ });\r
+ this.list.createList('td');\r
+ //["$limit=-1", "$sort[createdAt]=-1", "$select[]=lastName", "$select[]=firstName", "$select[]=email", "$select[]=isVerified", "$select[]=enabled"]\r
+ this.user.find({\r
+ $limit: -1,\r
+ $sort: {\r
+ createdAt: -1,\r
+ },\r
+ $select: ['lastName', 'firstName', 'email', 'isVerified', 'enabled', 'groups']\r
+ }).subscribe((list) => {\r
+ this.list.changeMessage('td', list);\r
+ this.loading = false;\r
+\r
+ });\r
+\r
+ this.dataSource = new MatTableDataSource();\r
+ this.dataSource.paginator = this.paginator;\r
+\r
+ this.list.listMap['td'].currentList.subscribe((list) =>{\r
+ if(list){\r
+ this.dataSource.data = list;\r
+ this.resultsLength = this.dataSource.data.length;\r
+ this.applyFilter(this.filterString)\r
+ }\r
+ });\r
+\r
+ }\r
+\r
+ applyFilter(filterValue: string) {\r
+ this.dataSource.filter = filterValue.trim().toLowerCase();\r
+ }\r
+\r
+ applyGroupFilter(filterValue: string){\r
+ this.groups.filter = filterValue.trim().toLowerCase();\r
+ }\r
+\r
+ dropdownChange(){\r
+ this.search.groupName = '';\r
+ for(let i in this.groups){\r
+ this.groups[i].selected = false;\r
+ }\r
+ \r
+ }\r
+\r
+ \r
+ addRemoveGroupList(element, groupId, event){\r
+ if(event.checked){\r
+ if (element.groupsToAddRemove){\r
+ element.groupsToAddRemove.push(groupId);\r
+ }else{\r
+ element.groupsToAddRemove = [];\r
+ element.groupsToAddRemove.push(groupId);\r
+ }\r
+ }else{\r
+ if(element.groupsToAddRemove){\r
+ let temp = element.groupsToAddRemove.indexOf(groupId)\r
+ if(temp >= 0)\r
+ element.groupsToAddRemove.splice(temp, 1);\r
+ }\r
+ }\r
+ \r
+ }\r
+\r
+ removeGroups(user){\r
+ this.modal.open(AlertModalComponent, {\r
+ width: "250px",\r
+ data: {\r
+ type: "confirmation",\r
+ message: "Are you sure you want to remove " + user.firstName + " " + user.lastName + " from groups?"\r
+ }\r
+ }).afterClosed().subscribe((results) => {\r
+ if(results === undefined){\r
+ return;\r
+ }\r
+ if(results){\r
+ for(let i in user.groupsToAddRemove){\r
+ user[user.groupsToAddRemove[i]] = false;\r
+ let index = this.groups.findIndex(function(group){ return group._id == user.groupsToAddRemove[i]; })\r
+ if(index >= 0 && this.groups[index].members){\r
+ let memberIndex = this.groups[index].members.findIndex(function(member){return member.userId.toString() == user._id.toString()})\r
+ if(memberIndex >= 0){\r
+ this.groups[index].members.splice(memberIndex, 1);\r
+ let groupPatch = {\r
+ _id : this.groups[index]._id,\r
+ members: this.groups[index].members\r
+ }\r
+ this.groupService.patch(groupPatch).subscribe((res) => {\r
+ let snackMessage = 'Success. ' + user.firstName + ' ' + user.lastName + ' removed from group!';\r
+ this.snack.openFromComponent(AlertSnackbarComponent, {\r
+ duration: 1500,\r
+ data: {\r
+ message: snackMessage\r
+ }\r
+ });\r
+ }); \r
+ }\r
+ }\r
+ \r
+ }\r
+ }else{\r
+ return;\r
+ }\r
+ // let userPatch = {\r
+ // _id : user._id,\r
+ // groups: user.groups\r
+ // };\r
+\r
+ // this.user.patch(userPatch).subscribe((res) => {\r
+ // let snackMessage = 'Success. ' + user.firstName + ' ' + user.lastName + ' removed from group!';\r
+ // this.snack.openFromComponent(AlertSnackbarComponent, {\r
+ // duration: 1500,\r
+ // data: {\r
+ // message: snackMessage\r
+ // }\r
+ // })\r
+ // });\r
+ user.groupsToAddRemove = [];\r
+ \r
+ });\r
+ }\r
+ //add "Change Groups" header to management dropdown\\r
+ addGroups(user){\r
+ this.modal.open(AlertModalComponent, {\r
+ width: "250px",\r
+ data: {\r
+ type: "userAdmin",\r
+ message: "Would you like to add as group user or group admin?"\r
+ }\r
+ }).afterClosed().subscribe((results) => {\r
+ if(results === undefined){\r
+ return;\r
+ }\r
+ if(results){\r
+ for(let i in user.groupsToAddRemove){\r
+ user[user.groupsToAddRemove[i]] = false;\r
+ let groupPatch = {\r
+ _id : user.groupsToAddRemove[i],\r
+ $push: { members: { userId : user._id, roles: ["admin"]}}\r
+ }\r
+ \r
+\r
+ let index = this.groups.findIndex(function(group){ return group._id == user.groupsToAddRemove[i]; })\r
+ if(index >= 0 && this.groups[index].members){\r
+ let memberIndex = this.groups[index].members.findIndex(function(member){return member.userId.toString() == user._id.toString()});\r
+ \r
+ if(memberIndex >= 0 && !this.groups[index].members[memberIndex]["roles"].includes("admin")){\r
+ groupPatch = this.groups[index];\r
+ groupPatch["members"][memberIndex].roles.push("admin");\r
+ }else if (memberIndex < 0) {\r
+ groupPatch = {\r
+ _id : user.groupsToAddRemove[i],\r
+ $push: { members: { userId : user._id, roles: ["admin"]}}\r
+ }\r
+ }else{\r
+ let snackMessage = 'Success. ' + user.firstName + ' ' + user.lastName + ' already group admin!';\r
+ this.snack.openFromComponent(AlertSnackbarComponent, {\r
+ duration: 1500,\r
+ data: {\r
+ message: snackMessage\r
+ }\r
+ });\r
+ continue;\r
+ }\r
+ }\r
+ this.groupService.patch(groupPatch).subscribe((res) => {\r
+ let snackMessage = 'Success. ' + user.firstName + ' ' + user.lastName + ' added to group!';\r
+ this.snack.openFromComponent(AlertSnackbarComponent, {\r
+ duration: 1500,\r
+ data: {\r
+ message: snackMessage\r
+ }\r
+ });\r
+ }); \r
+ \r
+ }\r
+ }else{\r
+ for(let i in user.groupsToAddRemove){\r
+ user[user.groupsToAddRemove[i]] = false;\r
+ let groupPatch = {\r
+ _id : user.groupsToAddRemove[i],\r
+ $push: { members: { userId : user._id, roles: [""]}}\r
+ }\r
+ \r
+\r
+ let index = this.groups.findIndex(function(group){ return group._id == user.groupsToAddRemove[i]; })\r
+ if(index >= 0 && this.groups[index].members){\r
+ let memberIndex = this.groups[index].members.findIndex(function(member){return member.userId == user.groupsToAddRemove[i]})\r
+ if(memberIndex >= 0 ){\r
+ if( this.groups[index].members[memberIndex].roles.includes("admin")){\r
+ groupPatch = this.groups[index];\r
+ let adminIndex = groupPatch["members"][memberIndex].roles.findIndex(function(perm){return perm.toLowerCase() == "admin";});\r
+ groupPatch["members"][memberIndex].roles.splice(adminIndex, 1);\r
+ }else{\r
+ return;\r
+ }\r
+ }else if (memberIndex < 0) {\r
+ groupPatch = {\r
+ _id : user.groupsToAddRemove[i],\r
+ $push: { members: { userId : user._id, roles: [""]}}\r
+ }\r
+ }\r
+ }\r
+ this.groupService.patch(groupPatch).subscribe((res) => {\r
+ let snackMessage = 'Success. ' + user.firstName + ' ' + user.lastName + ' added to group!';\r
+ this.snack.openFromComponent(AlertSnackbarComponent, {\r
+ duration: 1500,\r
+ data: {\r
+ message: snackMessage\r
+ }\r
+ });\r
+ }); \r
+ }\r
+ }\r
+ // let userPatch = {\r
+ // _id : user._id,\r
+ // groups: user.groups\r
+ // };\r
+\r
+ // this.user.patch(userPatch).subscribe((res) => {\r
+ // let snackMessage = 'Success. ' + user.firstName + ' ' + user.lastName + ' added to group!';\r
+ // this.snack.openFromComponent(AlertSnackbarComponent, {\r
+ // duration: 1500,\r
+ // data: {\r
+ // message: snackMessage\r
+ // }\r
+ // })\r
+ // });\r
+ user.groupsToAddRemove = [];\r
+ \r
+ });\r
+\r
+ \r
+ }\r
+\r
+ enableUser(event, element){\r
+ console.log(element)\r
+ let oldVal = element.enabled;\r
+ if(event.target.checked === element.enabled){\r
+ //console.log("same");\r
+ return\r
+ }\r
+ this.user.enableUser(element._id, event.target.checked).subscribe(\r
+ (result) => {\r
+ element.enabled = result['enabled'];\r
+ let snackMessage = 'Success. Set enabled to : ' + result['enabled'];\r
+ this.snack.openFromComponent(AlertSnackbarComponent, {\r
+ duration: 1500,\r
+ data: {\r
+ message: snackMessage\r
+ }\r
+ })\r
+\r
+ },\r
+ (error) => {\r
+ element.enabled = oldVal;\r
+ let snackMessage = 'Could not set enabled to : ' + !oldVal;\r
+ this.snack.open(snackMessage, "Error", { duration: 1500 })\r
+\r
+\r
+ }\r
+\r
+ )\r
+\r
+\r
+ }\r
+\r
+}\r