diff --git a/frontend/components/edit-user.vue b/frontend/components/edit-user.vue index 78ac492339f34d689639e0a1ff14e401aa399e05..5216f1ba79a2ad9af3b6d965dfb30f46d127c1c1 100644 --- a/frontend/components/edit-user.vue +++ b/frontend/components/edit-user.vue @@ -1,29 +1,59 @@ <template> <b-row class="mb-2"> - <b-col> + <b-col cols="3"> {{ user.username }} </b-col> - <b-col> + <b-col cols="2"> <b-form-input type="password" v-model="user.password" placeholder="password"></b-form-input> </b-col> - <b-col> + <b-col cols="3"> <b-form-input type="email" v-model="user.email"></b-form-input> </b-col> - <b-col> - <b-button-group class="ml-auto"> + <b-col cols="1"> + <b-badge class="mr-1" variant="primary" v-for="role in user.roles" v-bind:key="role">{{role}}</b-badge> + </b-col> + <b-col cols="3"> + <b-button-group v-show="!showAddRole"> + <b-button variant="outline-primary" v-on:click="addRole">Add role</b-button> <b-button v-show="isModified" variant="outline-primary" v-on:click="savePressed()">Save</b-button> <b-button variant="outline-danger" v-on:click="$emit('delete')">Delete</b-button> </b-button-group> + <b-form inline @submit="addRole" v-show="showAddRole"> + <b-form-input + style="width: 60%" + v-model="newRole" + :state="addRoleState" + placeholder="Enter role" + class="mr-1" + trim> + </b-form-input> + <b-button type="submit" variant="success">Add</b-button> + </b-form> </b-col> </b-row> </template> <script> export default { - props: ['user'], + props: ['user', 'roles'], methods: { savePressed: function(){ this.$emit('save'); this.isModified = false; + }, + addRole: function(evt){ + evt.preventDefault(); + if(!this.showAddRole){this.showAddRole = true;} + else{ + if(this.addRoleState){this.user.roles.push(this.newRole)} + this.newRole = ""; + this.showAddRole = false; + } + } + }, + computed: { + addRoleState(){ + if (!this.roles.includes(this.newRole)){return false} + return true; } }, watch: { @@ -34,7 +64,9 @@ export default { }, data(){ return { - isModified: false + isModified: false, + showAddRole: false, + newRole: "", } } } diff --git a/frontend/components/edit-users.vue b/frontend/components/edit-users.vue index 67d8f0e990c0c4401b7cba3887488be2c92d0570..be623a073fdff50492a9d0cd3640001e26f868bc 100644 --- a/frontend/components/edit-users.vue +++ b/frontend/components/edit-users.vue @@ -1,21 +1,25 @@ <template> <div> <b-row class="mb-3 mt-3"> - <b-col> + <b-col cols="3"> <label>Username</label> </b-col> - <b-col> + <b-col cols="2"> <label>Password</label> </b-col> - <b-col> - <label>email</label> + <b-col cols="3"> + <label>Email</label> </b-col> - <b-col> + <b-col cols="1"> + <label>Roles</label> + </b-col> + <b-col cols="3"> </b-col> </b-row> <edit-user v-for="(user, index) in users" v-model="users[index]" v-bind:user="user" + v-bind:roles="roles" v-bind:key="user.username" v-on:delete="$emit('delete', user.username, index)" v-on:save="$emit('save', user.username, index)"> @@ -26,6 +30,6 @@ import editUser from '~/components/edit-user' export default { components: { editUser }, - props: ['users'] + props: ['users', 'roles'] } </script> diff --git a/frontend/pages/users.vue b/frontend/pages/users.vue index b1a76b574df6adcb05b925e4bba07fea7dac2828..ee5d3ddfce7928b765f029b3a0a3f5fff8bf5ee2 100644 --- a/frontend/pages/users.vue +++ b/frontend/pages/users.vue @@ -6,14 +6,15 @@ All <b-badge pill variant="primary">{{ users.length }}</b-badge> </b-list-group-item> - <b-list-group-item button v-bind:active="role==selectedRole" class="d-flex justify-content-between align-items-center" v-for="role in roles" v-bind:key="role" @click="selectRole(role)"> - {{ role }} - <b-badge pill variant="primary">{{ role.length }}</b-badge> + <b-list-group-item button v-bind:active="role.name==selectedRole" class="d-flex justify-content-between align-items-center" v-for="role in roles" v-bind:key="role.name" @click="selectRole(role.name)"> + {{ role.name }} + <b-badge pill variant="primary">{{ role.users.length }}</b-badge> </b-list-group-item> </b-list-group> </div> <div class="container"> <edit-users v-bind:users="selectedUsers" + v-bind:roles="roleList" v-model="selectedUsers" v-on:save="saveUser" v-on:delete="deleteUser"> @@ -44,7 +45,7 @@ </div> </b-form> <edit-user v-bind:user="newUser" - :roles="roles" + :roles="roleList" v-model="newUser" v-on:save="addUser" v-show="userFormVisibility" @@ -64,9 +65,8 @@ export default { console.log(username); console.log(index); }, - selectRole: function(role){ - console.log(role) - this.selectedRole = role; + selectRole: function(roleName){ + this.selectedRole = roleName; }, deleteUser: function(username, index){ axios.post( @@ -123,6 +123,7 @@ export default { this.newUser.username = ""; this.newUser.password = ""; this.newUser.email = ""; + this.newUser.roles = [] this.toggleAddUser(); } }, @@ -135,7 +136,7 @@ export default { } return axios.post( url, { - query: "query{allUsers{edges{node{username, email, roles{edges{node{name}}}}}}}" + query: "query{allUsers{edges{node{username, email, roles{edges{node{name}}}}}},allRoles{edges{node{name, description, users{edges{node{username}}}}}}}" }).then((res) => { return {users: res.data.data.allUsers.edges.map(user => { var rUser = {}; @@ -146,6 +147,14 @@ export default { }); rUser["password"] = ""; return rUser; + }), roles: res.data.data.allRoles.edges.map(role => { + var rRole = {}; + rRole["name"] = role.node.name; + rRole["description"] = role.node.description; + rRole["users"] = role.node.users.edges.map(user => { + return user.node.username; + }); + return rRole; })} }).catch((e) => { console.log(e); @@ -156,8 +165,8 @@ export default { data() { return { users: [], - newUser: {username: "", password: "", email: "", roles: ""}, - roles: ["admin", "guest", "cluster-admin"], + newUser: {username: "", password: "", email: "", roles: []}, + roles: [], addUserButtonVisibility: true, usernameFormVisibility: false, userFormVisibility: false, @@ -166,6 +175,9 @@ export default { } }, computed: { + roleList(){ + return this.roles.map( role => {return role.name}) + }, newUsernameState(){ if (this.newUser.username.length < 2){return false} return !this.users.find(function(user){