Client: add ability to hide left menu
authorChocobozzz <florian.bigard@gmail.com>
Wed, 26 Apr 2017 19:22:00 +0000 (21:22 +0200)
committerChocobozzz <florian.bigard@gmail.com>
Wed, 26 Apr 2017 19:23:19 +0000 (21:23 +0200)
client/src/app/app.component.html
client/src/app/app.component.scss
client/src/app/app.component.ts
client/src/sass/application.scss

index 04cdbb1f83cbdf230361dc61c205c90440e0a874..a1e38cdb1016c78ad575df936959e843da2d3fa7 100644 (file)
@@ -1,13 +1,29 @@
 <div class="container-fluid">
-  <div class="row">
-    <div class="col-md-2 col-sm-3 col-xs-3 title-menu-left">
+  <div class="row header">
+
+    <div class="col-md-2 col-sm-3 col-xs-3 top-left-block" [ngClass]="{ 'border-bottom': isMenuDisplayed === false }">
+      <div class="hamburger-block">
+        <span (click)="toggleMenu()" class="glyphicon glyphicon-menu-hamburger"></span>
+      </div>
+
       <div id="peertube-title" class="title-menu-left-block header">
         <a [routerLink]="['/videos/list']" title="Homepage"></a>
       </div>
+    </div>
+
+    <!-- Used for the fixed title -->
+    <div class="col-md-2 col-sm-3 col-xs-3 fake-title-block"></div>
+
+    <!-- We need to reset col-md-* because my-search is in fixed position -->
+    <my-search class="col-md-10 col-sm-9 col-xs-9"></my-search>
+  </div>
+
+  <div class="row">
+    <div class="col-md-2 col-sm-3 col-xs-3 title-menu-left">
 
       <div class="title-menu-left-block menu">
-        <my-menu *ngIf="isInAdmin() === false"></my-menu>
-        <my-menu-admin *ngIf="isInAdmin() === true"></my-menu-admin>
+        <my-menu *ngIf="isMenuDisplayed && isInAdmin() === false"></my-menu>
+        <my-menu-admin *ngIf="isMenuDisplayed && isInAdmin() === true"></my-menu-admin>
       </div>
     </div>
 
     <div class="col-md-2 col-sm-3 col-xs-3">
     </div>
 
-    <div class="col-md-10 col-sm-9 col-xs-9 main-col">
-      <div class="row header">
-        <!-- We need to reset col-md-* because my-search is in fixed position -->
-        <my-search class="col-md-10 col-sm-9 col-xs-9"></my-search>
-      </div>
+    <div [ngClass]="getMainColClasses()">
 
       <div class="main-row">
         <router-outlet></router-outlet>
index 627187bd05e2d3802ecc8aae35c6a289793e1362..ca0030922f77565a88a04521a44565fbb2edc952 100644 (file)
@@ -1,49 +1,79 @@
+.main-row {
+  min-height: calc(100vh - #{$header-height} - #{$footer-height} - #{$footer-margin});
+}
+
 .title-menu-left {
+  position: fixed;
   height: calc(100vh - #{$header-height});
-  padding-right: 0;
+  padding: 0;
 
-  .title-menu-left-block {
-    margin-left: -15px;
+  .title-menu-left-block.menu {
+    height: 100%;
+  }
+}
 
-    &.menu {
-      height: 100%;
-    }
+.header {
+  height: $header-height;
+
+  .fake-title-block {
+    display: inline-block;
   }
 
-  #peertube-title {
+  .top-left-block {
     background-color: #fff;
     border-right: 1px solid $header-border-color;
-    font-size: 25px;
     line-height: $header-height;
-    text-align: center;
     margin-top: 0;
     margin-bottom: 0;
-
     display: flex;
-    flex-direction: column;
-    justify-content: center;
-    text-align: center;
-
-    a {
-      color: inherit !important;
-      display: block;
-      background: url(/client/assets/logo.png) no-repeat;
-      background-size: contain;
-      width: 180px;
-      height: 22px;
-      margin: auto;
-
-      &:hover {
+    position: fixed;
+
+    &.border-bottom {
+      border-bottom: 1px solid $header-border-color;
+    }
+
+    .hamburger-block {
+      margin-right: 20px;
+      margin-left: 15px;
+
+      .glyphicon {
+        position: relative;
+        top: 4px;
+      }
+    }
+
+    #peertube-title {
+
+      a {
         color: inherit !important;
-        text-decoration: none !important;
+        display: block;
+        background: url(/client/assets/logo.png) no-repeat;
+        background-size: contain;
+        background-position: center;
+        width: 180px;
+        height: 100%;
+        margin: auto;
+
+        &:hover {
+          color: inherit !important;
+          text-decoration: none !important;
+        }
       }
     }
   }
-}
 
-my-search {
-  // Fix col-md-* padding
-  padding: 0;
+  my-search {
+    position: fixed;
+    z-index: 1000;
+    // Fix col-md-* padding
+    padding: 0;
+  }
+
+  .search-col {
+    height: 100%;
+    margin-left: -15px;
+    padding: 0;
+  }
 }
 
 footer {
index c29790d96e24a72bf662658a6b2809429030d9c5..14870bb5f8c2c876b50d011a8f98732792dd01a0 100644 (file)
@@ -24,6 +24,8 @@ export class AppComponent implements OnInit {
     rtl: false
   };
 
+  isMenuDisplayed = true;
+
   constructor(
     private router: Router,
     private authService: AuthService,
@@ -48,4 +50,26 @@ export class AppComponent implements OnInit {
   isInAdmin() {
     return this.router.url.indexOf('/admin/') !== -1;
   }
+
+  toggleMenu() {
+    this.isMenuDisplayed = !this.isMenuDisplayed;
+  }
+
+  getMainColClasses() {
+    const colSizes = {
+      md: 10,
+      sm: 9,
+      xs: 9
+    }
+
+    // Take all width is the menu is not displayed
+    if (this.isMenuDisplayed === false) {
+      Object.keys(colSizes).forEach(col => colSizes[col] = 12);
+    }
+
+    const classes = [ "main-col" ];
+    Object.keys(colSizes).forEach(col => classes.push(`col-${col}-${colSizes[col]}`));
+
+    return classes;
+  }
 }
index b446dde2a9c006362487fb3d525a40a96c4234bc..db23afd0d0acd6eef4f21ac08982d26f3b2a78c7 100644 (file)
@@ -21,29 +21,6 @@ input.readonly {
   color: black;
 }
 
-.header {
-  height: $header-height;
-
-  my-search {
-    position: fixed;
-    z-index: 1000;
-  }
-
-  .search-col {
-    height: 100%;
-    margin-left: -15px;
-    padding: 0;
-  }
-}
-
-.title-menu-left {
-  position: fixed;
-}
-
-.main-row {
-  min-height: calc(100vh - #{$header-height} - #{$footer-height} - #{$footer-margin});
-}
-
 .main-col {
 
   .content-padding {