added svcapi ui and camunda code
[it/otf.git] / otf-frontend / client / src / app / layout / user-management / user-management.component.ts
1 /*  Copyright (c) 2019 AT&T Intellectual Property.                             #\r
2 #                                                                              #\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
6 #                                                                              #\r
7 #       http://www.apache.org/licenses/LICENSE-2.0                             #\r
8 #                                                                              #\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
15 \r
16 \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
30 \r
31 @Component({\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
36 \r
37 })\r
38 export class UserManagementComponent implements OnInit {\r
39 \r
40     public dataSource;\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
45     public groups;\r
46     public search;\r
47     public currentUser;\r
48     \r
49     @ViewChild(MatPaginator) paginator: MatPaginator;\r
50 \r
51 \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
62     ) { }\r
63 \r
64     ngOnInit() {\r
65         this.loading = true;\r
66         this.groups = [];\r
67         this.search = {};\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
71             if(result){\r
72                 this.groups = organizeGroups(this.currentUser, result);\r
73                 \r
74             }\r
75         })\r
76         this.route.queryParamMap.subscribe(queryParams => {\r
77             this.filterString = queryParams.get("filter");\r
78             if(!this.filterString){\r
79                 this.filterString = "";\r
80             }\r
81         });\r
82         this.list.createList('td');\r
83         //["$limit=-1", "$sort[createdAt]=-1", "$select[]=lastName", "$select[]=firstName", "$select[]=email", "$select[]=isVerified", "$select[]=enabled"]\r
84         this.user.find({\r
85             $limit: -1,\r
86             $sort: {\r
87                 createdAt: -1,\r
88             },\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
93 \r
94         });\r
95 \r
96         this.dataSource = new MatTableDataSource();\r
97         this.dataSource.paginator = this.paginator;\r
98 \r
99         this.list.listMap['td'].currentList.subscribe((list) =>{\r
100             if(list){\r
101                 this.dataSource.data = list;\r
102                 this.resultsLength = this.dataSource.data.length;\r
103                 this.applyFilter(this.filterString)\r
104             }\r
105         });\r
106 \r
107     }\r
108 \r
109     applyFilter(filterValue: string) {\r
110         this.dataSource.filter = filterValue.trim().toLowerCase();\r
111     }\r
112 \r
113     applyGroupFilter(filterValue: string){\r
114         this.groups.filter = filterValue.trim().toLowerCase();\r
115     }\r
116 \r
117     dropdownChange(){\r
118         this.search.groupName = '';\r
119         for(let i in this.groups){\r
120             this.groups[i].selected = false;\r
121         }\r
122         \r
123     }\r
124 \r
125     \r
126     addRemoveGroupList(element, groupId, event){\r
127         if(event.checked){\r
128             if (element.groupsToAddRemove){\r
129                 element.groupsToAddRemove.push(groupId);\r
130             }else{\r
131                 element.groupsToAddRemove = [];\r
132                 element.groupsToAddRemove.push(groupId);\r
133             }\r
134         }else{\r
135             if(element.groupsToAddRemove){\r
136                 let temp = element.groupsToAddRemove.indexOf(groupId)\r
137                 if(temp >= 0)\r
138                     element.groupsToAddRemove.splice(temp, 1);\r
139             }\r
140         }\r
141         \r
142     }\r
143 \r
144     removeGroups(user){\r
145         this.modal.open(AlertModalComponent, {\r
146             width: "250px",\r
147             data: {\r
148                 type: "confirmation",\r
149                 message: "Are you sure you want to remove " + user.firstName + " " + user.lastName + " from groups?"\r
150             }\r
151         }).afterClosed().subscribe((results) => {\r
152             if(results === undefined){\r
153                 return;\r
154             }\r
155             if(results){\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
163                             let groupPatch = {\r
164                                 _id : this.groups[index]._id,\r
165                                 members: this.groups[index].members\r
166                             }\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
170                                     duration: 1500,\r
171                                     data: {\r
172                                         message: snackMessage\r
173                                     }\r
174                                 });\r
175                             });   \r
176                         }\r
177                     }\r
178                   \r
179                 }\r
180             }else{\r
181                 return;\r
182             }\r
183             // let userPatch = {\r
184             //     _id : user._id,\r
185             //     groups: user.groups\r
186             // };\r
187 \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
191             //         duration: 1500,\r
192             //         data: {\r
193             //             message: snackMessage\r
194             //         }\r
195             //     })\r
196             // });\r
197             user.groupsToAddRemove = [];\r
198             \r
199         });\r
200     }\r
201     //add "Change Groups" header to management dropdown\\r
202     addGroups(user){\r
203         this.modal.open(AlertModalComponent, {\r
204             width: "250px",\r
205             data: {\r
206                 type: "userAdmin",\r
207                 message: "Would you like to add as group user or group admin?"\r
208             }\r
209         }).afterClosed().subscribe((results) => {\r
210             if(results === undefined){\r
211                 return;\r
212             }\r
213             if(results){\r
214                 for(let i in user.groupsToAddRemove){\r
215                     user[user.groupsToAddRemove[i]] = false;\r
216                     let groupPatch = {\r
217                         _id : user.groupsToAddRemove[i],\r
218                         $push: { members: { userId : user._id, roles: ["admin"]}}\r
219                     }\r
220                     \r
221 \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
225                         \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
230                             groupPatch = {\r
231                                 _id : user.groupsToAddRemove[i],\r
232                                 $push: { members: { userId : user._id, roles: ["admin"]}}\r
233                             }\r
234                         }else{\r
235                             let snackMessage = 'Success. ' + user.firstName + ' ' + user.lastName + ' already group admin!';\r
236                             this.snack.openFromComponent(AlertSnackbarComponent, {\r
237                                 duration: 1500,\r
238                                 data: {\r
239                                     message: snackMessage\r
240                                 }\r
241                             });\r
242                             continue;\r
243                         }\r
244                     }\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
248                             duration: 1500,\r
249                             data: {\r
250                                 message: snackMessage\r
251                             }\r
252                         });\r
253                     });   \r
254                    \r
255                 }\r
256             }else{\r
257                 for(let i in user.groupsToAddRemove){\r
258                     user[user.groupsToAddRemove[i]] = false;\r
259                     let groupPatch = {\r
260                         _id : user.groupsToAddRemove[i],\r
261                         $push: { members: { userId : user._id, roles: [""]}}\r
262                     }\r
263                     \r
264 \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
273                             }else{\r
274                                 return;\r
275                             }\r
276                         }else if (memberIndex < 0) {\r
277                             groupPatch = {\r
278                                 _id : user.groupsToAddRemove[i],\r
279                                 $push: { members: { userId : user._id, roles: [""]}}\r
280                             }\r
281                         }\r
282                     }\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
286                             duration: 1500,\r
287                             data: {\r
288                                 message: snackMessage\r
289                             }\r
290                         });\r
291                     });  \r
292                 }\r
293             }\r
294             // let userPatch = {\r
295             //     _id : user._id,\r
296             //     groups: user.groups\r
297             // };\r
298 \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
302             //         duration: 1500,\r
303             //         data: {\r
304             //             message: snackMessage\r
305             //         }\r
306             //     })\r
307             // });\r
308             user.groupsToAddRemove = [];\r
309            \r
310         });\r
311 \r
312         \r
313     }\r
314 \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
320             return\r
321         }\r
322         this.user.enableUser(element._id, event.target.checked).subscribe(\r
323             (result) => {\r
324                 element.enabled = result['enabled'];\r
325                 let snackMessage = 'Success. Set enabled to : ' + result['enabled'];\r
326                 this.snack.openFromComponent(AlertSnackbarComponent, {\r
327                     duration: 1500,\r
328                     data: {\r
329                         message: snackMessage\r
330                     }\r
331                 })\r
332 \r
333             },\r
334             (error) => {\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
338 \r
339 \r
340             }\r
341 \r
342         )\r
343 \r
344 \r
345     }\r
346 \r
347 }\r