added svcapi ui and camunda code
[it/otf.git] / otf-frontend / client / src / app / layout / user-management / user-management.component.ts
diff --git a/otf-frontend/client/src/app/layout/user-management/user-management.component.ts b/otf-frontend/client/src/app/layout/user-management/user-management.component.ts
new file mode 100644 (file)
index 0000000..4ce454f
--- /dev/null
@@ -0,0 +1,347 @@
+/*  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