1 /* Copyright (c) 2019 AT&T Intellectual Property. #
\r
3 # Licensed under the Apache License, Version 2.0 (the "License"); #
\r
4 # you may not use this file except in compliance with the License. #
\r
5 # You may obtain a copy of the License at #
\r
7 # http://www.apache.org/licenses/LICENSE-2.0 #
\r
9 # Unless required by applicable law or agreed to in writing, software #
\r
10 # distributed under the License is distributed on an "AS IS" BASIS, #
\r
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
\r
12 # See the License for the specific language governing permissions and #
\r
13 # limitations under the License. #
\r
14 ##############################################################################*/
\r
17 import {Component, OnInit, ViewContainerRef, ViewChild} from '@angular/core';
\r
18 import {ActivatedRoute, Router} from '@angular/router';
\r
19 import { MatPaginator, MatDialog, MatSnackBar } from '@angular/material';
\r
20 import { MatTableDataSource } from '@angular/material/table';
\r
21 import {HttpClient} from "@angular/common/http";
\r
22 import {UserService} from "../../shared/services/user.service";
\r
23 import { routerTransition } from '../../router.animations';
\r
24 import { ListService } from '../../shared/services/list.service';
\r
25 import { AlertSnackbarComponent } from 'app/shared/modules/alert-snackbar/alert-snackbar.component';
\r
26 import { GroupService } from 'app/shared/services/group.service';
\r
27 import { AlertModalComponent } from 'app/shared/modules/alert-modal/alert-modal.component';
\r
28 import * as organizeGroups from '../../../../../server/src/feathers/hooks/permissions/get-permissions';
\r
29 import { CookieService } from 'ngx-cookie-service';
\r
32 selector: 'app-user-management',
\r
33 templateUrl: './user-management.component.pug',
\r
34 styleUrls: ['./user-management.component.scss'],
\r
35 animations: [routerTransition()]
\r
38 export class UserManagementComponent implements OnInit {
\r
41 public displayedColumns: string[] = ['lastName', 'firstName', 'email', 'addGroups', 'isVerified', 'enabled'];
\r
42 public resultsLength;
\r
43 public loading = false;
\r
44 public filterString = "";
\r
49 @ViewChild(MatPaginator) paginator: MatPaginator;
\r
52 constructor(private http: HttpClient,
\r
53 private router: Router,
\r
54 private viewRef: ViewContainerRef,
\r
55 private list: ListService,
\r
56 private modal: MatDialog,
\r
57 private snack: MatSnackBar,
\r
58 private user: UserService,
\r
59 private route: ActivatedRoute,
\r
60 private groupService: GroupService,
\r
61 private cookie: CookieService
\r
65 this.loading = true;
\r
68 this.search.groupName = '';
\r
69 this.currentUser = JSON.parse(this.cookie.get('currentUser'));
\r
70 this.groupService.find({$limit: -1}).subscribe((result) => {
\r
72 this.groups = organizeGroups(this.currentUser, result);
\r
76 this.route.queryParamMap.subscribe(queryParams => {
\r
77 this.filterString = queryParams.get("filter");
\r
78 if(!this.filterString){
\r
79 this.filterString = "";
\r
82 this.list.createList('td');
\r
83 //["$limit=-1", "$sort[createdAt]=-1", "$select[]=lastName", "$select[]=firstName", "$select[]=email", "$select[]=isVerified", "$select[]=enabled"]
\r
89 $select: ['lastName', 'firstName', 'email', 'isVerified', 'enabled', 'groups']
\r
90 }).subscribe((list) => {
\r
91 this.list.changeMessage('td', list);
\r
92 this.loading = false;
\r
96 this.dataSource = new MatTableDataSource();
\r
97 this.dataSource.paginator = this.paginator;
\r
99 this.list.listMap['td'].currentList.subscribe((list) =>{
\r
101 this.dataSource.data = list;
\r
102 this.resultsLength = this.dataSource.data.length;
\r
103 this.applyFilter(this.filterString)
\r
109 applyFilter(filterValue: string) {
\r
110 this.dataSource.filter = filterValue.trim().toLowerCase();
\r
113 applyGroupFilter(filterValue: string){
\r
114 this.groups.filter = filterValue.trim().toLowerCase();
\r
118 this.search.groupName = '';
\r
119 for(let i in this.groups){
\r
120 this.groups[i].selected = false;
\r
126 addRemoveGroupList(element, groupId, event){
\r
128 if (element.groupsToAddRemove){
\r
129 element.groupsToAddRemove.push(groupId);
\r
131 element.groupsToAddRemove = [];
\r
132 element.groupsToAddRemove.push(groupId);
\r
135 if(element.groupsToAddRemove){
\r
136 let temp = element.groupsToAddRemove.indexOf(groupId)
\r
138 element.groupsToAddRemove.splice(temp, 1);
\r
144 removeGroups(user){
\r
145 this.modal.open(AlertModalComponent, {
\r
148 type: "confirmation",
\r
149 message: "Are you sure you want to remove " + user.firstName + " " + user.lastName + " from groups?"
\r
151 }).afterClosed().subscribe((results) => {
\r
152 if(results === undefined){
\r
156 for(let i in user.groupsToAddRemove){
\r
157 user[user.groupsToAddRemove[i]] = false;
\r
158 let index = this.groups.findIndex(function(group){ return group._id == user.groupsToAddRemove[i]; })
\r
159 if(index >= 0 && this.groups[index].members){
\r
160 let memberIndex = this.groups[index].members.findIndex(function(member){return member.userId.toString() == user._id.toString()})
\r
161 if(memberIndex >= 0){
\r
162 this.groups[index].members.splice(memberIndex, 1);
\r
164 _id : this.groups[index]._id,
\r
165 members: this.groups[index].members
\r
167 this.groupService.patch(groupPatch).subscribe((res) => {
\r
168 let snackMessage = 'Success. ' + user.firstName + ' ' + user.lastName + ' removed from group!';
\r
169 this.snack.openFromComponent(AlertSnackbarComponent, {
\r
172 message: snackMessage
\r
183 // let userPatch = {
\r
185 // groups: user.groups
\r
188 // this.user.patch(userPatch).subscribe((res) => {
\r
189 // let snackMessage = 'Success. ' + user.firstName + ' ' + user.lastName + ' removed from group!';
\r
190 // this.snack.openFromComponent(AlertSnackbarComponent, {
\r
193 // message: snackMessage
\r
197 user.groupsToAddRemove = [];
\r
201 //add "Change Groups" header to management dropdown\
\r
203 this.modal.open(AlertModalComponent, {
\r
207 message: "Would you like to add as group user or group admin?"
\r
209 }).afterClosed().subscribe((results) => {
\r
210 if(results === undefined){
\r
214 for(let i in user.groupsToAddRemove){
\r
215 user[user.groupsToAddRemove[i]] = false;
\r
217 _id : user.groupsToAddRemove[i],
\r
218 $push: { members: { userId : user._id, roles: ["admin"]}}
\r
222 let index = this.groups.findIndex(function(group){ return group._id == user.groupsToAddRemove[i]; })
\r
223 if(index >= 0 && this.groups[index].members){
\r
224 let memberIndex = this.groups[index].members.findIndex(function(member){return member.userId.toString() == user._id.toString()});
\r
226 if(memberIndex >= 0 && !this.groups[index].members[memberIndex]["roles"].includes("admin")){
\r
227 groupPatch = this.groups[index];
\r
228 groupPatch["members"][memberIndex].roles.push("admin");
\r
229 }else if (memberIndex < 0) {
\r
231 _id : user.groupsToAddRemove[i],
\r
232 $push: { members: { userId : user._id, roles: ["admin"]}}
\r
235 let snackMessage = 'Success. ' + user.firstName + ' ' + user.lastName + ' already group admin!';
\r
236 this.snack.openFromComponent(AlertSnackbarComponent, {
\r
239 message: snackMessage
\r
245 this.groupService.patch(groupPatch).subscribe((res) => {
\r
246 let snackMessage = 'Success. ' + user.firstName + ' ' + user.lastName + ' added to group!';
\r
247 this.snack.openFromComponent(AlertSnackbarComponent, {
\r
250 message: snackMessage
\r
257 for(let i in user.groupsToAddRemove){
\r
258 user[user.groupsToAddRemove[i]] = false;
\r
260 _id : user.groupsToAddRemove[i],
\r
261 $push: { members: { userId : user._id, roles: [""]}}
\r
265 let index = this.groups.findIndex(function(group){ return group._id == user.groupsToAddRemove[i]; })
\r
266 if(index >= 0 && this.groups[index].members){
\r
267 let memberIndex = this.groups[index].members.findIndex(function(member){return member.userId == user.groupsToAddRemove[i]})
\r
268 if(memberIndex >= 0 ){
\r
269 if( this.groups[index].members[memberIndex].roles.includes("admin")){
\r
270 groupPatch = this.groups[index];
\r
271 let adminIndex = groupPatch["members"][memberIndex].roles.findIndex(function(perm){return perm.toLowerCase() == "admin";});
\r
272 groupPatch["members"][memberIndex].roles.splice(adminIndex, 1);
\r
276 }else if (memberIndex < 0) {
\r
278 _id : user.groupsToAddRemove[i],
\r
279 $push: { members: { userId : user._id, roles: [""]}}
\r
283 this.groupService.patch(groupPatch).subscribe((res) => {
\r
284 let snackMessage = 'Success. ' + user.firstName + ' ' + user.lastName + ' added to group!';
\r
285 this.snack.openFromComponent(AlertSnackbarComponent, {
\r
288 message: snackMessage
\r
294 // let userPatch = {
\r
296 // groups: user.groups
\r
299 // this.user.patch(userPatch).subscribe((res) => {
\r
300 // let snackMessage = 'Success. ' + user.firstName + ' ' + user.lastName + ' added to group!';
\r
301 // this.snack.openFromComponent(AlertSnackbarComponent, {
\r
304 // message: snackMessage
\r
308 user.groupsToAddRemove = [];
\r
315 enableUser(event, element){
\r
316 console.log(element)
\r
317 let oldVal = element.enabled;
\r
318 if(event.target.checked === element.enabled){
\r
319 //console.log("same");
\r
322 this.user.enableUser(element._id, event.target.checked).subscribe(
\r
324 element.enabled = result['enabled'];
\r
325 let snackMessage = 'Success. Set enabled to : ' + result['enabled'];
\r
326 this.snack.openFromComponent(AlertSnackbarComponent, {
\r
329 message: snackMessage
\r
335 element.enabled = oldVal;
\r
336 let snackMessage = 'Could not set enabled to : ' + !oldVal;
\r
337 this.snack.open(snackMessage, "Error", { duration: 1500 })
\r