From fe655bd2cb8bfb8d4207fda0efabb5e2b0dcb442 Mon Sep 17 00:00:00 2001
From: florimondmanca <florimond.manca@gmail.com>
Date: Thu, 20 Sep 2018 15:04:29 +0200
Subject: [PATCH] extract generic layout with blue and white themes

---
 src/app/shared/layout/layout.component.html   |  7 ++++++
 src/app/shared/layout/layout.component.scss   | 14 +++++++++++
 .../shared/layout/layout.component.spec.ts    | 25 +++++++++++++++++++
 src/app/shared/layout/layout.component.ts     | 24 ++++++++++++++++++
 .../shared/nav-group/nav-group.component.html |  4 +--
 .../shared/nav-group/nav-group.component.scss |  4 +++
 .../shared/nav-group/nav-group.component.ts   |  2 ++
 .../shared/nav-item/nav-item.component.html   |  2 +-
 .../shared/nav-item/nav-item.component.scss   | 10 ++++++++
 src/app/shared/nav-item/nav-item.component.ts |  1 +
 src/app/shared/navbar/navbar.component.html   | 11 +++++---
 src/app/shared/navbar/navbar.component.scss   |  6 +++++
 src/app/shared/navbar/navbar.component.ts     |  1 +
 src/app/shared/shared.module.ts               |  9 +++----
 .../showcase-site.component.html              | 12 +--------
 .../showcase-site.component.scss              | 20 ---------------
 .../showcase-site/showcase-site.component.ts  | 13 ++--------
 17 files changed, 110 insertions(+), 55 deletions(-)
 create mode 100644 src/app/shared/layout/layout.component.html
 create mode 100644 src/app/shared/layout/layout.component.scss
 create mode 100644 src/app/shared/layout/layout.component.spec.ts
 create mode 100644 src/app/shared/layout/layout.component.ts

diff --git a/src/app/shared/layout/layout.component.html b/src/app/shared/layout/layout.component.html
new file mode 100644
index 0000000..ef36d90
--- /dev/null
+++ b/src/app/shared/layout/layout.component.html
@@ -0,0 +1,7 @@
+<div id="layout">
+  <app-navbar [links]="links" [theme]="theme"></app-navbar>
+  <main class="content">
+   <router-outlet (deactivate)="onDeactivate()"></router-outlet>
+  </main>
+  <app-footer></app-footer>
+</div>
diff --git a/src/app/shared/layout/layout.component.scss b/src/app/shared/layout/layout.component.scss
new file mode 100644
index 0000000..dbb1a1a
--- /dev/null
+++ b/src/app/shared/layout/layout.component.scss
@@ -0,0 +1,14 @@
+/*
+Sticky footer solution from
+https://philipwalton.github.io/solved-by-flexbox/demos/sticky-footer/
+*/
+#layout {
+  display: flex;
+  min-height: 100vh;
+  flex-direction: column;
+}
+
+/* Make main content expand to pull footer to the bottom */
+.content {
+  flex: 1;
+}
diff --git a/src/app/shared/layout/layout.component.spec.ts b/src/app/shared/layout/layout.component.spec.ts
new file mode 100644
index 0000000..c4d6365
--- /dev/null
+++ b/src/app/shared/layout/layout.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { LayoutComponent } from './layout.component';
+
+describe('LayoutComponent', () => {
+  let component: LayoutComponent;
+  let fixture: ComponentFixture<LayoutComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ LayoutComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(LayoutComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/src/app/shared/layout/layout.component.ts b/src/app/shared/layout/layout.component.ts
new file mode 100644
index 0000000..a91537c
--- /dev/null
+++ b/src/app/shared/layout/layout.component.ts
@@ -0,0 +1,24 @@
+import { Component, Input, Renderer } from '@angular/core';
+ import { Link } from '../nav.model';
+
+
+ @Component({
+   selector: 'app-layout',
+   templateUrl: './layout.component.html',
+   styleUrls: ['./layout.component.scss']
+ })
+ export class LayoutComponent {
+
+   @Input() links: Link[];
+   @Input() theme: string;
+
+   constructor(private renderer: Renderer) {
+     this.links = [];
+   }
+
+   onDeactivate() {
+     // on page reload, scroll to top of window
+     this.renderer.setElementProperty(document.body, 'scrollTop', 0);
+   }
+
+ }
diff --git a/src/app/shared/nav-group/nav-group.component.html b/src/app/shared/nav-group/nav-group.component.html
index 66cc875..a184f3b 100644
--- a/src/app/shared/nav-group/nav-group.component.html
+++ b/src/app/shared/nav-group/nav-group.component.html
@@ -1,5 +1,5 @@
-<ul>
+<ul [ngClass]="{'vertical': vertical}">
   <li *ngFor="let link of links">
-    <app-nav-item [link]="link"></app-nav-item>
+    <app-nav-item [link]="link" [theme]="theme"></app-nav-item>
   </li>
 </ul>
diff --git a/src/app/shared/nav-group/nav-group.component.scss b/src/app/shared/nav-group/nav-group.component.scss
index 17c79f4..3592083 100644
--- a/src/app/shared/nav-group/nav-group.component.scss
+++ b/src/app/shared/nav-group/nav-group.component.scss
@@ -4,6 +4,10 @@ ul {
   padding: 0;
   display: flex;
 
+  &.vertical {
+    flex-direction: column;
+  }
+
   li {
     text-align: center;
   }
diff --git a/src/app/shared/nav-group/nav-group.component.ts b/src/app/shared/nav-group/nav-group.component.ts
index 0562b94..44d9d75 100644
--- a/src/app/shared/nav-group/nav-group.component.ts
+++ b/src/app/shared/nav-group/nav-group.component.ts
@@ -9,5 +9,7 @@ import { Link } from '../nav.model';
 export class NavGroupComponent {
 
   @Input() links: Link[];
+  @Input() theme: string;
+  @Input() vertical = false;
 
 }
diff --git a/src/app/shared/nav-item/nav-item.component.html b/src/app/shared/nav-item/nav-item.component.html
index b7312fe..be52dbb 100644
--- a/src/app/shared/nav-item/nav-item.component.html
+++ b/src/app/shared/nav-item/nav-item.component.html
@@ -1,4 +1,4 @@
-<div class="nav-link">
+<div class="nav-link" [ngClass]="{'blue': theme === 'blue'}">
   <a *ngIf="link.href; else action" class="no-style" [routerLink]="link.href">
     {{ link.text }}
   </a>
diff --git a/src/app/shared/nav-item/nav-item.component.scss b/src/app/shared/nav-item/nav-item.component.scss
index c4fe3d1..bc6391e 100644
--- a/src/app/shared/nav-item/nav-item.component.scss
+++ b/src/app/shared/nav-item/nav-item.component.scss
@@ -17,4 +17,14 @@
     color: $color-dark-blue;
     border-color: $color-dark-blue;
   }
+
+  &.blue {
+    color: $color-purple-light;
+    &:hover {
+      &:hover {
+        color: $color-light-gray;
+        border-color: $color-light-gray;
+      }
+    }
+  }
 }
diff --git a/src/app/shared/nav-item/nav-item.component.ts b/src/app/shared/nav-item/nav-item.component.ts
index 6c87861..25168ec 100644
--- a/src/app/shared/nav-item/nav-item.component.ts
+++ b/src/app/shared/nav-item/nav-item.component.ts
@@ -9,5 +9,6 @@ import { Link } from '../nav.model';
 export class NavItemComponent {
 
   @Input() link: Link;
+  @Input() theme: string;
 
 }
diff --git a/src/app/shared/navbar/navbar.component.html b/src/app/shared/navbar/navbar.component.html
index 8f241fb..383d7ed 100644
--- a/src/app/shared/navbar/navbar.component.html
+++ b/src/app/shared/navbar/navbar.component.html
@@ -1,16 +1,19 @@
-<div class="navbar drop-shadow-md">
+<div class="navbar drop-shadow-md" [ngClass]="{'blue': theme === 'blue'}">
   <div class="top">
     <a routerLink="/" class='logo-container'>
-      <img src='assets/img/oser-logo.png' alt='Logo' class='logo'>
+      <span [ngSwitch]="theme">
+        <img *ngSwitchCase="'blue'" src='assets/img/oser-logo-white.png' alt='Logo' class='logo'>
+        <img *ngSwitchDefault src='assets/img/oser-logo.png' alt='Logo' class='logo'>
+      </span>
     </a>
     <div class="nav-wide">
-      <app-nav-group [links]="links"></app-nav-group>
+      <app-nav-group [theme]="theme" [links]="links"></app-nav-group>
       <ng-content select="[app-navbar-extra]"></ng-content>
     </div>
     <i (click)="toggle()" class="hamburger fa fa-bars fa-2x"></i>
   </div>
   <div class="nav-narrow" *ngIf="visible">
-    <app-nav-group-vertical [links]="links" (click)="toggle()"></app-nav-group-vertical>
+    <app-nav-group [links]="links" [vertical]="true" [theme]="theme" (click)="toggle()"></app-nav-group>
     <ng-content select="[app-navbar-extra-narrow]"></ng-content>
   </div>
 </div>
diff --git a/src/app/shared/navbar/navbar.component.scss b/src/app/shared/navbar/navbar.component.scss
index c09439a..1e058e1 100644
--- a/src/app/shared/navbar/navbar.component.scss
+++ b/src/app/shared/navbar/navbar.component.scss
@@ -9,6 +9,12 @@ $col-padding: 10px;
   padding: 0 $margin-page;
   margin: 0;
   background: white;
+  &.blue {
+    background: $color-dark-blue;
+    i.hamburger {
+      color: white !important;
+    }
+  }
   z-index: 10;
   display: flex;
   flex-flow: column nowrap;
diff --git a/src/app/shared/navbar/navbar.component.ts b/src/app/shared/navbar/navbar.component.ts
index 7549ee5..031453b 100644
--- a/src/app/shared/navbar/navbar.component.ts
+++ b/src/app/shared/navbar/navbar.component.ts
@@ -11,6 +11,7 @@ export class NavbarComponent {
 
   visible = false;
   @Input() links: Link[] = [];
+  @Input() theme: string;
 
   constructor() { }
 
diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts
index c783a20..57ae8ab 100644
--- a/src/app/shared/shared.module.ts
+++ b/src/app/shared/shared.module.ts
@@ -14,11 +14,10 @@ import { RevealComponent } from './reveal/reveal.component';
 import { FilterComponent } from './filter/filter.component';
 import { NavItemComponent } from './nav-item/nav-item.component';
 import { NavGroupComponent } from './nav-group/nav-group.component';
-import { NavGroupVerticalComponent } from './nav-group-vertical/nav-group-vertical.component';
-import { BlueNavbarComponent } from './blue_navbar/blue_navbar.component';
 import { MailtoComponent } from './mailto/mailto.component';
 import { LoginButtonComponent } from './login-button/login-button.component';
 import { FormPageComponent } from './form-page/form-page.component';
+import { LayoutComponent } from './layout/layout.component';
 
 @NgModule({
   imports: [
@@ -37,11 +36,10 @@ import { FormPageComponent } from './form-page/form-page.component';
     FilterComponent,
     NavItemComponent,
     NavGroupComponent,
-    NavGroupVerticalComponent,
-    BlueNavbarComponent,
     MailtoComponent,
     LoginButtonComponent,
     FormPageComponent,
+    LayoutComponent,
   ],
   exports: [
     NavbarComponent,
@@ -50,11 +48,10 @@ import { FormPageComponent } from './form-page/form-page.component';
     RevealComponent,
     FilterComponent,
     NavGroupComponent,
-    NavGroupVerticalComponent,
-    BlueNavbarComponent,
     MailtoComponent,
     LoginButtonComponent,
     FormPageComponent,
+    LayoutComponent,
   ]
 })
 export class SharedModule { }
diff --git a/src/app/showcase-site/showcase-site.component.html b/src/app/showcase-site/showcase-site.component.html
index 7d800a8..fab21ab 100644
--- a/src/app/showcase-site/showcase-site.component.html
+++ b/src/app/showcase-site/showcase-site.component.html
@@ -1,11 +1 @@
-<span id="top"></span>
-<div id="showcase-site">
-  <app-navbar [links]="navLinks">
-    <app-login-button app-navbar-extra class="login-link"></app-login-button>
-    <app-login-button app-navbar-extra-narrow class="text-center login-link"></app-login-button>
-  </app-navbar>
-  <main class="content">
-    <router-outlet (deactivate)="onDeactivate()"></router-outlet>
-  </main>
-  <app-footer></app-footer>
-</div>
+<app-layout [links]="navLinks"></app-layout>
diff --git a/src/app/showcase-site/showcase-site.component.scss b/src/app/showcase-site/showcase-site.component.scss
index 8add28a..e69de29 100644
--- a/src/app/showcase-site/showcase-site.component.scss
+++ b/src/app/showcase-site/showcase-site.component.scss
@@ -1,20 +0,0 @@
-/*
-Sticky footer solution from
-https://philipwalton.github.io/solved-by-flexbox/demos/sticky-footer/
-*/
-#showcase-site {
-  display: flex;
-  min-height: 100vh;
-  flex-direction: column;
-}
-
-/* Make main content expand to pull footer to the bottom */
-.content {
-  flex: 1;
-}
-
-.login-link {
-  display: block;
-  margin: auto 0;
-  padding: 1em 0;
-}
diff --git a/src/app/showcase-site/showcase-site.component.ts b/src/app/showcase-site/showcase-site.component.ts
index 5ef44ae..89f9c6d 100644
--- a/src/app/showcase-site/showcase-site.component.ts
+++ b/src/app/showcase-site/showcase-site.component.ts
@@ -1,4 +1,4 @@
-import { Component, OnInit, Renderer } from '@angular/core';
+import { Component } from '@angular/core';
 import { Link } from 'app/shared';
 
 @Component({
@@ -6,9 +6,7 @@ import { Link } from 'app/shared';
   templateUrl: './showcase-site.component.html',
   styleUrls: ['./showcase-site.component.scss']
 })
-export class ShowcaseSiteComponent implements OnInit {
-
-  constructor(private renderer: Renderer) { }
+export class ShowcaseSiteComponent {
 
   navLinks: Link[] = [
     { href: '/qui-sommes-nous', text: 'Qui sommes-nous ?' },
@@ -18,11 +16,4 @@ export class ShowcaseSiteComponent implements OnInit {
     { href: '/contact', text: 'Contact' }
   ];
 
-  ngOnInit() { }
-
-  onDeactivate() {
-    // on page reload, scroll to top of window
-    this.renderer.setElementProperty(document.body, "scrollTop", 0);
-  }
-
 }
-- 
GitLab