view client/src/components/Sidebar.vue @ 277:807efc83e507

fix: Sidebar is now positioned above Map Having the map layer and the sidebar together in documentflow leads to ugly distortion of map after minimizing sidebar. In order to prevent such distortion, the sidebar is now positioned absolute. See issue 28.
author Thomas Junk <thomas.junk@intevation.de>
date Mon, 30 Jul 2018 13:31:35 +0200
parents 9f1b84b712a8
children 9c1dfadb53aa
line wrap: on
line source

<template>
  <div :class="sidebarStyle">
    <div :class="collapseStyle"><i @click="collapse" :class="collapseicon"></i></div>
    <nav :class="menuStyle">
      <a class="nav-link active" href="#">Riverbed morphology</a>
      <a class="nav-link" href="#">Link</a>
      <a class="nav-link" href="#">Link</a>
      <a class="nav-link disabled" href="#">Disabled</a>
    </nav>
    <div :class="userinfoStyle">
      <div class="userinfo">
        <img class="userpic" src="../assets/user.png"><span class="username">{{ userinfo }}</span>
      </div>
      <div>
        <span class="logout" @click="logoff"><i class="fa fa-power-off"></i></span>
      </div>
    </div>
  </div>
</template>

<script>
import { mapGetters } from "vuex";

export default {
  name: "sidebar",
  computed: {
    ...mapGetters("user", ["userinfo"]),
    collapseicon() {
      return {
        fa: true,
        "fa-angle-double-left": !this.collapsed,
        "fa-angle-double-right": this.collapsed
      };
    },
    menuStyle() {
      return {
        menu: true,
        nav: true,
        "flex-column": true,
        "visibility-extended": !this.collapsed,
        "visibility-collapsed": this.collapsed
      };
    },
    userinfoStyle() {
      return {
        user: true,
        "d-inline-flex": true,
        "visibility-extended": !this.collapsed,
        "visibility-collapsed": this.collapsed
      };
    },
    collapseStyle() {
      return {
        collapser: true,
        collapserextended: !this.collapsed,
        collapsercollapsed: this.collapsed
      };
    },
    sidebarStyle() {
      return {
        sidebar: true,
        sidebarcollapsed: this.collapsed,
        sidebarextended: !this.collapsed
      };
    }
  },
  methods: {
    collapse() {
      this.collapsed = !this.collapsed;
    },
    logoff() {
      this.$store.commit("user/clear_auth");
      this.$router.push("/login");
    }
  },
  data() {
    return {
      collapsed: false
    };
  }
};
</script>

<style lang="scss">
@import "../assets/application.scss";

$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;
  top: 0px;
  z-index: 1000;
  background-color: #ffffff;
  font-size: 24px;
}

.collapserextended {
  left: $collapser-left-offset;
  transition: $transition;
}

.collapsercollapsed {
  left: 3px;
  transition: $transition;
}

.userpic {
  position: relative;
  left: 1px;
}

.menu {
  height: 90%;
}
.visibility-extended {
  opacity: 100;
  transition: $transition-slow;
}
.visibility-collapsed {
  opacity: 0;
  transition: $transition-fast;
}

.user {
  margin-top: auto;
}
.sidebar {
  position: absolute;
  z-index: 1;
  background-color: #ffffff;
  padding-top: $large-offset;
  height: 100vh;
}

.sidebarcollapsed {
  width: $sidebar-collapsed-width;
  transition: $transition;
}

.sidebarextended {
  width: $sidebar-full-width;
  transition: $transition;
}

.username {
  margin-left: $small-offset;
}

.userinfo {
  font-weight: bold;
}

.logout {
  position: relative;
  top: 8px;
  margin-left: $small-offset;
  cursor: pointer;
}
</style>