changeset 362:2c58906649be

refactor: user detail view refactored to accordion
author Thomas Junk <thomas.junk@intevation.de>
date Wed, 08 Aug 2018 18:14:16 +0200
parents 55388227e7da
children 45d4399f6c15
files client/package.json client/src/assets/application.scss client/src/components/Sidebar.vue client/src/components/Userdetail.vue client/src/main.js client/src/views/Users.vue client/yarn.lock
diffstat 7 files changed, 115 insertions(+), 76 deletions(-) [+]
line wrap: on
line diff
--- a/client/package.json	Tue Aug 07 19:28:03 2018 +0200
+++ b/client/package.json	Wed Aug 08 18:14:16 2018 +0200
@@ -16,8 +16,10 @@
     "bootstrap": "^4.1.1",
     "cxlt-vue2-toastr": "^1.1.0",
     "font-awesome": "^4.7.0",
+    "jquery": "^3.3.1",
     "locale2": "^2.2.0",
     "ol": "^5.0.0",
+    "popper.js": "^1.14.4",
     "vue": "^2.5.16",
     "vue-router": "^3.0.1",
     "vuex": "^3.0.1"
--- a/client/src/assets/application.scss	Tue Aug 07 19:28:03 2018 +0200
+++ b/client/src/assets/application.scss	Wed Aug 08 18:14:16 2018 +0200
@@ -6,7 +6,9 @@
 $iconwidth: 20px;
 $basic-shadow: 1px 3px 8px 2px rgba(220, 220, 220, 0.75);
 $basic-shadow-light: 1px 1px 12px 1px rgba(235, 235, 235, 0.75);
-
+$transition: 0.5s;
+$transition-fast: 0.1s;
+$transition-slow: 2s;
 
 %fully-centered {
   position: absolute;
--- a/client/src/components/Sidebar.vue	Tue Aug 07 19:28:03 2018 +0200
+++ b/client/src/components/Sidebar.vue	Wed Aug 08 18:14:16 2018 +0200
@@ -92,9 +92,6 @@
 $sidebar-full-width: 210px;
 $collapser-left-offset: 170px;
 $sidebar-collapsed-width: 0px;
-$transition: 0.5s;
-$transition-fast: 0.1s;
-$transition-slow: 2s;
 
 .collapser {
   position: absolute;
--- a/client/src/components/Userdetail.vue	Tue Aug 07 19:28:03 2018 +0200
+++ b/client/src/components/Userdetail.vue	Wed Aug 08 18:14:16 2018 +0200
@@ -1,58 +1,113 @@
 <template>
-  <div class="userdetails card shadow" style="width: 35rem;">
-    <div class="card" style="width: 35rem;">
-      <div class="card-header text-white bg-info mb-3">
-        {{ currentUser.user }}
-      </div>
-      <div class="card-body">
-        <form>
-          <div class="form-group">
-            <label for="country">Country</label>
-            <select v-model="currentUser.country">
-              <option disabled value="">Please select one</option>
-              <option>AT</option>
-              <option>RO</option>
-              <option>BG</option>
-            </select>
+  <div class="userdetail card">
+    <div @click="showDetails" class="card-header bg-light" id="headingOne">
+      <h5 class="mb-0">
+        <div class="btn" data-toggle="collapse" data-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
+          <div class="d-flex d-flex-row">
+            <div class="name">Name: {{this.user.user}}</div>
+            <div class="mail">Email: {{this.user.email}}</div>
+            <div class="country">Country: {{this.user.country}}</div>
+            <div class="role">Role: {{this.user.role}}</div>
           </div>
-          <div class="form-group">
-            <label for="email">Email address</label>
-            <input type="email" class="form-control" id="email" aria-describedby="emailHelp" v-model="currentUser.email">
-          </div>
-          <div class="form-group">
-            <label for="role">Role</label>
-             <select v-model="currentUser.role">
-              <option disabled value="">Please select one</option>
-              <option value="sys_admin">Sysadmin</option>
-              <option value="waterway_admin">Waterway Admin</option>
-              <option value="waterway_user">Waterway User</option>
-            </select>
-          </div>
-          <button type="submit" class="btn btn-primary">Submit</button>
-        </form>
+        </div>
+      </h5>
     </div>
+    <div id="collapseOne" :class="collapseStyle" aria-labelledby="headingOne" data-parent="#accordion">
+      <div class="card-body">
+        <div>
+          <form class="details" @submit.prevent="editUser">
+            <div class="form-group"><label for="user">User</label><input class="form-control" id="user" v-model="currentUser.user"></div>
+            <div class="form-group"><label for="email">Email</label><input class="form-control" id="email" v-model="currentUser.email"></div>
+            <div class="form-group">
+              <label for="country">Country</label>
+              <select id="country"  class="form-control" v-model="currentUser.country">
+                <option disabled value="">Please select one</option>
+                <option>AT</option>
+                <option>RO</option>
+                <option>BG</option>
+              </select>
+            </div>
+            <div class="form-group">
+              <label for="role">Role</label>
+              <select id="role"  class="form-control" v-model="currentUser.role">
+                <option disabled value="">Please select one</option>
+                <option value="sys_admin">Sysadmin</option>
+                <option value="waterway_admin">Waterway Admin</option>
+                <option value="waterway_user">Waterway User</option>
+              </select>
+            </div>
+            <button class="btn btn-primary pull-right">Submit</button>
+          </form>
+        </div>
+      </div>
     </div>
   </div>
 </template>
 
 <style lang="scss">
 @import "../assets/application.scss";
-
-.userdetails {
-  margin-top: 20px;
-  width: 50vw;
+.userdetail {
+  text-align: left !important;
 }
-
-.shadow {
-  box-shadow: $basic-shadow-light !important;
+.details {
+  width: 30vw;
+  height: 45vh;
+}
+.name,
+.mail,
+.country,
+.role {
+  padding-right: $large-offset;
 }
 </style>
 <script>
+import { HTTP } from "../lib/http";
+import app from "../main";
+import store from "../store";
+
 export default {
   name: "userdetail",
-  props: ["currentUser"],
-  data() {},
-  computed: {},
-  methods: {}
+  props: ["user"],
+  data() {
+    return {
+      currentUser: Object.assign({}, this.user),
+      show: false
+    };
+  },
+  computed: {
+    collapseStyle() {
+      return {
+        collapse: true,
+        show: this.show
+      };
+    }
+  },
+  methods: {
+    editUser() {
+      HTTP.put("/users/" + this.user.user, {
+        headers: { "X-Gemma-Auth": localStorage.getItem("token") }
+      })
+        .then(() => {
+          this.show = false;
+          store.dispatch("usermanagement/loadUsers").catch(error => {
+            const { status, data } = error.response;
+            app.$toast.error({
+              title: "Backend Error",
+              message: `${status}: ${data}`
+            });
+          });
+        })
+        .catch(error => {
+          const { status, data } = error.response;
+          app.$toast.error({
+            title: "Backend Error",
+            message: `${status}: ${data}`
+          });
+        });
+    },
+    showDetails() {
+      this.show = !this.show;
+    }
+  }
 };
 </script>
--- a/client/src/main.js	Tue Aug 07 19:28:03 2018 +0200
+++ b/client/src/main.js	Wed Aug 08 18:14:16 2018 +0200
@@ -10,6 +10,7 @@
 import "../node_modules/font-awesome/css/font-awesome.min.css";
 import "../node_modules/ol/ol.css";
 import "../node_modules/cxlt-vue2-toastr/dist/css/cxlt-vue2-toastr.css";
+import "bootstrap";
 
 var toastrConfigs = {
   position: "bottom center",
--- a/client/src/views/Users.vue	Tue Aug 07 19:28:03 2018 +0200
+++ b/client/src/views/Users.vue	Wed Aug 08 18:14:16 2018 +0200
@@ -12,28 +12,12 @@
                 users
               </div>
               <div class="card-body">
-                <table class="table table-hover">
-                  <thead>
-                    <tr>
-                      <th scope="col">Username</th>
-                      <th scope="col">Country</th>
-                      <th scope="col">Email</th>
-                      <th scope="col">Role</th>
-                    </tr>
-                  </thead>
-                  <tbody>
-                  <tr v-for="user in users" :key="user.user" @click="selectUser(user.user)">
-                    <td>{{ user.user }}</td>
-                    <td>{{ user.country }}</td>
-                    <td>{{ user.email}}</td>
-                    <td>{{ user.role }}</td>
-                    </tr>
-                  </tbody>
-              </table>
-            </div>
+                <div class="accordion" v-for="user in this.users" v-bind:key="user.name">
+                  <Userdetail :user="user"></Userdetail>
+                </div>
+              </div>
           </div>
         </div>
-        <Userdetail v-bind:currentUser="currentUser"></Userdetail>
       </div>
     </div>
   </div>
@@ -77,11 +61,6 @@
 
 export default {
   name: "userview",
-  data() {
-    return {
-      currentUser: null
-    };
-  },
   components: {
     Sidebar,
     Userdetail
@@ -89,12 +68,7 @@
   computed: {
     ...mapGetters("usermanagement", ["users"])
   },
-  methods: {
-    selectUser(name) {
-      const user = this.$store.getters["usermanagement/getUserByName"](name);
-      this.currentUser = user;
-    }
-  },
+  methods: {},
   beforeRouteEnter(to, from, next) {
     store
       .dispatch("usermanagement/loadUsers")
--- a/client/yarn.lock	Tue Aug 07 19:28:03 2018 +0200
+++ b/client/yarn.lock	Wed Aug 08 18:14:16 2018 +0200
@@ -5195,6 +5195,10 @@
     isemail "3.x.x"
     topo "2.x.x"
 
+jquery@^3.3.1:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca"
+
 js-base64@^2.1.8, js-base64@^2.1.9:
   version "2.4.5"
   resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.5.tgz#e293cd3c7c82f070d700fc7a1ca0a2e69f101f92"
@@ -6752,6 +6756,10 @@
   version "1.0.11"
   resolved "https://registry.yarnpkg.com/pofile/-/pofile-1.0.11.tgz#35aff58c17491d127a07336d5522ebc9df57c954"
 
+popper.js@^1.14.4:
+  version "1.14.4"
+  resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.4.tgz#8eec1d8ff02a5a3a152dd43414a15c7b79fd69b6"
+
 portfinder@^1.0.13, portfinder@^1.0.9:
   version "1.0.13"
   resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9"