mirror of
https://github.com/richard-loafle/fuse-angular.git
synced 2025-01-10 12:35:07 +00:00
fixed layout service + some auth pages + simple page layouts + mail tweaks
This commit is contained in:
parent
6237b1132a
commit
d44a76b8c6
|
@ -5,7 +5,6 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||||
import { AppComponent } from './app.component';
|
import { AppComponent } from './app.component';
|
||||||
import { RouterModule, Routes } from '@angular/router';
|
import { RouterModule, Routes } from '@angular/router';
|
||||||
import 'hammerjs';
|
import 'hammerjs';
|
||||||
import { ChatModule } from './main/apps/chat/chat.module';
|
|
||||||
import { ProjectModule } from './main/apps/dashboards/project/project.module';
|
import { ProjectModule } from './main/apps/dashboards/project/project.module';
|
||||||
import { FuseLayoutService } from './core/services/layout.service';
|
import { FuseLayoutService } from './core/services/layout.service';
|
||||||
import { FuseNavigationService } from './core/components/navigation/navigation.service';
|
import { FuseNavigationService } from './core/components/navigation/navigation.service';
|
||||||
|
@ -14,13 +13,13 @@ import { FuseMatchMedia } from './core/services/match-media.service';
|
||||||
import { FuseNavbarService } from './core/components/layout/navbar/navbar.service';
|
import { FuseNavbarService } from './core/components/layout/navbar/navbar.service';
|
||||||
import { SharedModule } from './core/modules/shared.module';
|
import { SharedModule } from './core/modules/shared.module';
|
||||||
import { FuseMdSidenavHelperService } from './core/directives/md-sidenav-helper/md-sidenav-helper.service';
|
import { FuseMdSidenavHelperService } from './core/directives/md-sidenav-helper/md-sidenav-helper.service';
|
||||||
import { UIPageLayoutsModule } from './main/ui/page-layouts/page-layouts.module';
|
|
||||||
import { FuseLayoutModule } from './core/components/layout/layout.module';
|
import { FuseLayoutModule } from './core/components/layout/layout.module';
|
||||||
import { PerfectScrollbarConfigInterface, PerfectScrollbarModule } from 'ngx-perfect-scrollbar';
|
import { PerfectScrollbarConfigInterface, PerfectScrollbarModule } from 'ngx-perfect-scrollbar';
|
||||||
import { HttpModule } from '@angular/http';
|
import { HttpModule } from '@angular/http';
|
||||||
import { InMemoryWebApiModule } from 'angular-in-memory-web-api';
|
import { InMemoryWebApiModule } from 'angular-in-memory-web-api';
|
||||||
import { FuseFakeDbService } from './fuse-fake-db/fuse-fake-db.service';
|
import { FuseFakeDbService } from './fuse-fake-db/fuse-fake-db.service';
|
||||||
import { INTERNAL_BROWSER_DYNAMIC_PLATFORM_PROVIDERS } from '@angular/platform-browser-dynamic/src/platform_providers';
|
import { PagesModule } from './main/pages/pages.module';
|
||||||
|
import { UIModule } from './main/ui/ui.module';
|
||||||
|
|
||||||
const PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
|
const PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
|
||||||
suppressScrollX: true
|
suppressScrollX: true
|
||||||
|
@ -66,7 +65,8 @@ const appRoutes: Routes = [
|
||||||
|
|
||||||
ProjectModule,
|
ProjectModule,
|
||||||
|
|
||||||
UIPageLayoutsModule
|
PagesModule,
|
||||||
|
UIModule
|
||||||
],
|
],
|
||||||
providers : [
|
providers : [
|
||||||
FuseNavigationService,
|
FuseNavigationService,
|
||||||
|
|
|
@ -6,8 +6,7 @@
|
||||||
|
|
||||||
<div id="wrapper">
|
<div id="wrapper">
|
||||||
|
|
||||||
<!-- NAVIGATION: None -->
|
<fuse-navbar *ngIf="layoutSettings.navigation === 'left'"></fuse-navbar>
|
||||||
<ng-container *ngIf="layoutSettings.navigation === 'none'">
|
|
||||||
|
|
||||||
<div class="content-wrapper">
|
<div class="content-wrapper">
|
||||||
|
|
||||||
|
@ -27,60 +26,7 @@
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</ng-container>
|
<fuse-navbar *ngIf="layoutSettings.navigation === 'right'"></fuse-navbar>
|
||||||
<!-- / NAVIGATION: None -->
|
|
||||||
|
|
||||||
<!-- NAVIGATION: Left -->
|
|
||||||
<ng-container *ngIf="layoutSettings.navigation === 'left'">
|
|
||||||
|
|
||||||
<fuse-navbar></fuse-navbar>
|
|
||||||
|
|
||||||
<div class="content-wrapper">
|
|
||||||
|
|
||||||
<!-- TOOLBAR: Below -->
|
|
||||||
<ng-container *ngIf="layoutSettings.toolbar === 'below'">
|
|
||||||
<fuse-toolbar class="below"></fuse-toolbar>
|
|
||||||
</ng-container>
|
|
||||||
<!-- / TOOLBAR: Below -->
|
|
||||||
|
|
||||||
<fuse-content perfect-scrollbar></fuse-content>
|
|
||||||
|
|
||||||
<!-- FOOTER: Below -->
|
|
||||||
<ng-container *ngIf="layoutSettings.footer === 'below'">
|
|
||||||
<fuse-footer class="below"></fuse-footer>
|
|
||||||
</ng-container>
|
|
||||||
<!-- / FOOTER: Below -->
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</ng-container>
|
|
||||||
<!-- / NAVIGATION: Left -->
|
|
||||||
|
|
||||||
<!-- NAVIGATION: Right -->
|
|
||||||
<ng-container *ngIf="layoutSettings.navigation === 'right'">
|
|
||||||
|
|
||||||
<div class="content-wrapper">
|
|
||||||
|
|
||||||
<!-- TOOLBAR: Below -->
|
|
||||||
<ng-container *ngIf="layoutSettings.toolbar === 'below'">
|
|
||||||
<fuse-toolbar class="below"></fuse-toolbar>
|
|
||||||
</ng-container>
|
|
||||||
<!-- / TOOLBAR: Below -->
|
|
||||||
|
|
||||||
<fuse-content perfect-scrollbar></fuse-content>
|
|
||||||
|
|
||||||
<!-- FOOTER: Below -->
|
|
||||||
<ng-container *ngIf="layoutSettings.footer === 'below'">
|
|
||||||
<fuse-footer class="below"></fuse-footer>
|
|
||||||
</ng-container>
|
|
||||||
<!-- / FOOTER: Below -->
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<fuse-navbar></fuse-navbar>
|
|
||||||
|
|
||||||
</ng-container>
|
|
||||||
<!-- / NAVIGATION: Right -->
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
|
import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
|
||||||
import { FuseLayoutService } from '../../services/layout.service';
|
import { FuseLayoutService } from '../../services/layout.service';
|
||||||
|
import { Subscription } from 'rxjs/Subscription';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector : 'fuse-layout',
|
selector : 'fuse-layout',
|
||||||
|
@ -7,24 +8,28 @@ import { FuseLayoutService } from '../../services/layout.service';
|
||||||
styleUrls : ['./layout.component.scss'],
|
styleUrls : ['./layout.component.scss'],
|
||||||
encapsulation: ViewEncapsulation.None
|
encapsulation: ViewEncapsulation.None
|
||||||
})
|
})
|
||||||
export class FuseLayoutComponent implements OnInit
|
export class FuseLayoutComponent implements OnInit, OnDestroy
|
||||||
{
|
{
|
||||||
|
onSettingsChanged: Subscription;
|
||||||
layoutSettings: { navigation: string, toolbar: string, footer: string };
|
layoutSettings: { navigation: string, toolbar: string, footer: string };
|
||||||
|
|
||||||
constructor(private layoutService: FuseLayoutService)
|
constructor(private layoutService: FuseLayoutService)
|
||||||
{
|
{
|
||||||
this.layoutSettings = layoutService.getSettings();
|
this.onSettingsChanged =
|
||||||
}
|
|
||||||
|
|
||||||
ngOnInit()
|
|
||||||
{
|
|
||||||
this.layoutService.onSettingsChanged
|
this.layoutService.onSettingsChanged
|
||||||
.subscribe(
|
.subscribe(
|
||||||
(newSettings) =>
|
(newSettings) => {
|
||||||
{
|
|
||||||
this.layoutSettings = newSettings;
|
this.layoutSettings = newSettings;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngOnInit()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnDestroy()
|
||||||
|
{
|
||||||
|
this.onSettingsChanged.unsubscribe();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,8 +21,7 @@ export class FuseNavCollapseComponent implements OnInit
|
||||||
* When navigation changed
|
* When navigation changed
|
||||||
*/
|
*/
|
||||||
router.events.subscribe(
|
router.events.subscribe(
|
||||||
(event) =>
|
(event) => {
|
||||||
{
|
|
||||||
if ( event instanceof NavigationEnd )
|
if ( event instanceof NavigationEnd )
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -30,6 +29,7 @@ export class FuseNavCollapseComponent implements OnInit
|
||||||
*/
|
*/
|
||||||
if ( this.isUrlInChildren(this.item, event.urlAfterRedirects) )
|
if ( this.isUrlInChildren(this.item, event.urlAfterRedirects) )
|
||||||
{
|
{
|
||||||
|
// console.log(this.item);
|
||||||
this.expand();
|
this.expand();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -44,8 +44,7 @@ export class FuseNavCollapseComponent implements OnInit
|
||||||
* Whenever a navigaiton collapse item toggled
|
* Whenever a navigaiton collapse item toggled
|
||||||
*/
|
*/
|
||||||
this.navigationService.onNavCollapseToggled.subscribe(
|
this.navigationService.onNavCollapseToggled.subscribe(
|
||||||
(clickedItem) =>
|
(clickedItem) => {
|
||||||
{
|
|
||||||
if ( clickedItem.children )
|
if ( clickedItem.children )
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -116,20 +115,23 @@ export class FuseNavCollapseComponent implements OnInit
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( let i = 0; i < arr.children.length; i++ )
|
for ( let i = 0; i < arr.children.length; i++ )
|
||||||
{
|
{
|
||||||
if ( arr.children[i].children )
|
if ( arr.children[i].children )
|
||||||
{
|
{
|
||||||
return this.isUrlInChildren(arr.children[i], url);
|
if ( this.isUrlInChildren(arr.children[i], url) )
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ( arr.children[i].url === url )
|
if ( arr.children[i].url === url )
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -325,34 +325,24 @@ export class FuseNavigation
|
||||||
'url' : '/ui/page-layouts/simple/full-width'
|
'url' : '/ui/page-layouts/simple/full-width'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'title': 'Left Sidebar',
|
'title': 'Left Sidenav',
|
||||||
'type' : 'nav-item',
|
'type' : 'nav-item',
|
||||||
'url' : '/ui/page-layouts/simple/left-sidebar'
|
'url' : '/ui/page-layouts/simple/left-sidenav'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'title': 'Left Sidebar Inner',
|
'title': 'Left Sidenav 2',
|
||||||
'type' : 'nav-item',
|
'type' : 'nav-item',
|
||||||
'url' : '/ui/page-layouts/simple/left-sidebar-inner'
|
'url' : '/ui/page-layouts/simple/left-sidenav-2'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'title': 'Left Sidebar Floating',
|
'title': 'Right Sidenav',
|
||||||
'type' : 'nav-item',
|
'type' : 'nav-item',
|
||||||
'url' : '/ui/page-layouts/simple/left-sidebar-floating'
|
'url' : '/ui/page-layouts/simple/right-sidenav'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'title': 'Right Sidebar',
|
'title': 'Right Sidenav 2',
|
||||||
'type' : 'nav-item',
|
'type' : 'nav-item',
|
||||||
'url' : '/ui/page-layouts/simple/right-sidebar'
|
'url' : '/ui/page-layouts/simple/right-sidenav-2'
|
||||||
},
|
|
||||||
{
|
|
||||||
'title': 'Right Sidebar Inner',
|
|
||||||
'type' : 'nav-item',
|
|
||||||
'url' : '/ui/page-layouts/simple/sidebar-inner'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'title': 'Right Sidebar Floating',
|
|
||||||
'type' : 'nav-item',
|
|
||||||
'url' : '/ui/page-layouts/simple/right-sidebar-floating'
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'title': 'Tabbed',
|
'title': 'Tabbed',
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
@import "partials/spacing";
|
@import "partials/spacing";
|
||||||
@import "partials/global";
|
@import "partials/global";
|
||||||
@import "partials/icons";
|
@import "partials/icons";
|
||||||
|
@import "partials/colors";
|
||||||
@import "partials/material";
|
@import "partials/material";
|
||||||
@import "partials/angular-material-fix";
|
@import "partials/angular-material-fix";
|
||||||
@import "partials/typography";
|
@import "partials/typography";
|
||||||
|
|
0
src/app/core/scss/partials/_colors.scss
Normal file
0
src/app/core/scss/partials/_colors.scss
Normal file
|
@ -95,7 +95,7 @@ $card-header-height-sm: $header-height-sm - $card-toolbar-height;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Left sidenav
|
// Left sidenav - Right sidenav
|
||||||
&.left-sidenav,
|
&.left-sidenav,
|
||||||
&.right-sidenav {
|
&.right-sidenav {
|
||||||
|
|
||||||
|
@ -254,4 +254,127 @@ $card-header-height-sm: $header-height-sm - $card-toolbar-height;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Simple layout
|
||||||
|
&.simple {
|
||||||
|
|
||||||
|
// Fullwidth
|
||||||
|
&.fullwidth,
|
||||||
|
&.inner-sidenav {
|
||||||
|
min-height: 100%;
|
||||||
|
|
||||||
|
> .header {
|
||||||
|
height: $header-height;
|
||||||
|
min-height: $header-height;
|
||||||
|
max-height: $header-height;
|
||||||
|
padding: 24px;
|
||||||
|
background-color: mat-color($accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
> .content {
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Left sidenav - Right sidenav
|
||||||
|
&.left-sidenav,
|
||||||
|
&.right-sidenav {
|
||||||
|
min-height: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
// Single scroll
|
||||||
|
&.single-scroll {
|
||||||
|
height: auto;
|
||||||
|
|
||||||
|
> md-sidenav-container {
|
||||||
|
|
||||||
|
> .center {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> md-sidenav-container {
|
||||||
|
|
||||||
|
.sidenav {
|
||||||
|
width: 240px;
|
||||||
|
min-width: 240px;
|
||||||
|
max-width: 240px;
|
||||||
|
padding: 24px;
|
||||||
|
z-index: 51;
|
||||||
|
@include mat-elevation(7);
|
||||||
|
|
||||||
|
&.md-is-locked-open {
|
||||||
|
width: 220px;
|
||||||
|
min-width: 220px;
|
||||||
|
max-width: 220px;
|
||||||
|
box-shadow: none;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.md-stop-transition {
|
||||||
|
|
||||||
|
~ .mat-sidenav-content {
|
||||||
|
transition: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mat-sidenav-content {
|
||||||
|
overflow: visible;
|
||||||
|
|
||||||
|
.header {
|
||||||
|
height: $header-height;
|
||||||
|
min-height: $header-height;
|
||||||
|
max-height: $header-height;
|
||||||
|
padding: 24px;
|
||||||
|
background-color: mat-color($accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.center {
|
||||||
|
overflow: auto;
|
||||||
|
@include mat-elevation(7);
|
||||||
|
|
||||||
|
.content {
|
||||||
|
padding: 24px;
|
||||||
|
background: #FFFFFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tabbed
|
||||||
|
&.tabbed {
|
||||||
|
min-height: 100%;
|
||||||
|
|
||||||
|
.header {
|
||||||
|
height: $header-height;
|
||||||
|
min-height: $header-height;
|
||||||
|
max-height: $header-height;
|
||||||
|
padding: 24px;
|
||||||
|
background-color: mat-color($accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
> .content {
|
||||||
|
|
||||||
|
.mat-tab-group {
|
||||||
|
|
||||||
|
.mat-tab-labels {
|
||||||
|
padding: 0 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mat-tab-body {
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Blank layout
|
||||||
|
&.blank {
|
||||||
|
min-height: 100%;
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
// Truncate
|
// Truncate
|
||||||
.text-truncate {
|
.text-truncate {
|
||||||
display: block;
|
display: block;
|
||||||
|
|
|
@ -1,13 +1,19 @@
|
||||||
import { EventEmitter, Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { NavigationStart, Router } from '@angular/router';
|
import { ActivatedRoute, ActivatedRouteSnapshot, NavigationStart, Router, NavigationEnd } from '@angular/router';
|
||||||
|
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
|
||||||
|
|
||||||
|
import 'rxjs/add/operator/filter';
|
||||||
|
import 'rxjs/add/operator/map';
|
||||||
|
import 'rxjs/add/operator/mergeMap';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class FuseLayoutService
|
export class FuseLayoutService
|
||||||
{
|
{
|
||||||
defaultSettings: { navigation: string, toolbar: string, footer: string };
|
defaultSettings: { navigation: string, toolbar: string, footer: string };
|
||||||
settings: { navigation: string, toolbar: string, footer: string };
|
|
||||||
|
|
||||||
onSettingsChanged = new EventEmitter<{ navigation: string, toolbar: string, footer: string }>();
|
// onSettingsChanged = new EventEmitter<{ navigation: string, toolbar: string, footer: string }>();
|
||||||
|
|
||||||
|
onSettingsChanged: BehaviorSubject<{ navigation: string, toolbar: string, footer: string }>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param router
|
* @param router
|
||||||
|
@ -17,53 +23,47 @@ export class FuseLayoutService
|
||||||
// Set the default settings
|
// Set the default settings
|
||||||
this.defaultSettings = {
|
this.defaultSettings = {
|
||||||
navigation: 'left', // 'right', 'left', 'top', none
|
navigation: 'left', // 'right', 'left', 'top', none
|
||||||
toolbar : 'below', // 'above', 'below', none
|
toolbar : 'none', // 'above', 'below', none
|
||||||
footer : 'none' // 'above', 'below', none
|
footer : 'none' // 'above', 'below', none
|
||||||
};
|
};
|
||||||
|
|
||||||
// Assign default settings at the init
|
this.onSettingsChanged = new BehaviorSubject(this.defaultSettings);
|
||||||
this.settings = {...this.defaultSettings};
|
|
||||||
|
|
||||||
// Reset the default settings whenever navigation starts
|
|
||||||
router.events.subscribe(
|
router.events.subscribe(
|
||||||
(event) =>
|
(event) => {
|
||||||
{
|
|
||||||
if ( event instanceof NavigationStart )
|
if ( event instanceof NavigationStart )
|
||||||
{
|
{
|
||||||
this.settings = {...this.defaultSettings};
|
const routerConfig = router.config;
|
||||||
this.onSettingsChanged.emit(this.settings);
|
|
||||||
|
const currentRouteConfig = routerConfig.find((config) => {
|
||||||
|
return '/' + config.path === event.url;
|
||||||
|
});
|
||||||
|
|
||||||
|
if ( !currentRouteConfig || !currentRouteConfig.data )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( currentRouteConfig.data.layout )
|
||||||
|
{
|
||||||
|
this.setSettings(currentRouteConfig.data.layout);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.setSettings(this.defaultSettings);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets settings
|
|
||||||
* @returns {{navigation: string, toolbar: string, footer: string}}
|
|
||||||
*/
|
|
||||||
getSettings()
|
|
||||||
{
|
|
||||||
return {...this.settings};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets settings
|
* Sets settings
|
||||||
* @param newSettings
|
* @param settings
|
||||||
*/
|
*/
|
||||||
setSettings(newSettings)
|
setSettings(settings)
|
||||||
{
|
{
|
||||||
Object.assign(this.settings, newSettings);
|
const newSettings = Object.assign({}, this.defaultSettings, settings);
|
||||||
this.onSettingsChanged.emit(this.settings);
|
this.onSettingsChanged.next(newSettings);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets default settings
|
|
||||||
* @param newDefaultSettings
|
|
||||||
*/
|
|
||||||
setDefaultSettings(newDefaultSettings)
|
|
||||||
{
|
|
||||||
Object.assign(this.defaultSettings, newDefaultSettings);
|
|
||||||
|
|
||||||
// this.onSettingsChanged.emit(this.settings);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
Navigation:
|
Navigation:
|
||||||
<md-radio-group [(ngModel)]="layoutSettings.navigation" (ngModelChange)="onSettingsChanged()">
|
<md-radio-group [(ngModel)]="layoutSettings.navigation" (ngModelChange)="onLayoutSettingsChanged()">
|
||||||
<md-radio-button value="left">Left</md-radio-button>
|
<md-radio-button value="left">Left</md-radio-button>
|
||||||
<md-radio-button value="right">Right</md-radio-button>
|
<md-radio-button value="right">Right</md-radio-button>
|
||||||
<md-radio-button value="none">None</md-radio-button>
|
<md-radio-button value="none">None</md-radio-button>
|
||||||
|
@ -9,7 +9,7 @@ Navigation:
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
Toolbar:
|
Toolbar:
|
||||||
<md-radio-group [(ngModel)]="layoutSettings.toolbar" (ngModelChange)="onSettingsChanged()">
|
<md-radio-group [(ngModel)]="layoutSettings.toolbar" (ngModelChange)="onLayoutSettingsChanged()">
|
||||||
<md-radio-button value="below">Below</md-radio-button>
|
<md-radio-button value="below">Below</md-radio-button>
|
||||||
<md-radio-button value="above">Above</md-radio-button>
|
<md-radio-button value="above">Above</md-radio-button>
|
||||||
<md-radio-button value="none">None</md-radio-button>
|
<md-radio-button value="none">None</md-radio-button>
|
||||||
|
@ -19,7 +19,7 @@ Toolbar:
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
Footer:
|
Footer:
|
||||||
<md-radio-group [(ngModel)]="layoutSettings.footer" (ngModelChange)="onSettingsChanged()">
|
<md-radio-group [(ngModel)]="layoutSettings.footer" (ngModelChange)="onLayoutSettingsChanged()">
|
||||||
<md-radio-button value="below">Below</md-radio-button>
|
<md-radio-button value="below">Below</md-radio-button>
|
||||||
<md-radio-button value="above">Above</md-radio-button>
|
<md-radio-button value="above">Above</md-radio-button>
|
||||||
<md-radio-button value="none">None</md-radio-button>
|
<md-radio-button value="none">None</md-radio-button>
|
||||||
|
|
|
@ -1,33 +1,39 @@
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnDestroy, OnInit } from '@angular/core';
|
||||||
import { FuseLayoutService } from '../../../../core/services/layout.service';
|
import { FuseLayoutService } from '../../../../core/services/layout.service';
|
||||||
|
import { Subscription } from 'rxjs/Subscription';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector : 'fuse-project',
|
selector : 'fuse-project',
|
||||||
templateUrl: './project.component.html',
|
templateUrl: './project.component.html',
|
||||||
styleUrls : ['./project.component.scss']
|
styleUrls : ['./project.component.scss']
|
||||||
})
|
})
|
||||||
export class ProjectComponent implements OnInit
|
export class ProjectComponent implements OnInit, OnDestroy
|
||||||
{
|
{
|
||||||
layoutSettings: any;
|
onSettingsChanged: Subscription;
|
||||||
|
layoutSettings: { navigation: string, toolbar: string, footer: string };
|
||||||
|
|
||||||
constructor(private layoutService: FuseLayoutService)
|
constructor(private layoutService: FuseLayoutService)
|
||||||
{
|
{
|
||||||
/*this.layoutService.setSettings({
|
this.onSettingsChanged =
|
||||||
navigation: 'left',
|
this.layoutService.onSettingsChanged
|
||||||
toolbar : 'above',
|
.subscribe(
|
||||||
footer : 'above'
|
(newSettings) => {
|
||||||
});*/
|
this.layoutSettings = newSettings;
|
||||||
// this.layoutSettings = Object.assign(this.layoutSettings, this.layoutService.getSettings());
|
|
||||||
}
|
}
|
||||||
|
);
|
||||||
onSettingsChanged()
|
|
||||||
{
|
|
||||||
this.layoutService.setSettings({...this.layoutSettings});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit()
|
ngOnInit()
|
||||||
{
|
{
|
||||||
this.layoutSettings = this.layoutService.getSettings();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngOnDestroy()
|
||||||
|
{
|
||||||
|
this.onSettingsChanged.unsubscribe();
|
||||||
|
}
|
||||||
|
|
||||||
|
onLayoutSettingsChanged()
|
||||||
|
{
|
||||||
|
this.layoutService.onSettingsChanged.next(this.layoutSettings);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<div *ngIf="!mail" fxLayout="column" fxLayoutAlign="center center" fxFlex>
|
<div *ngIf="!mail" fxLayout="column" fxLayoutAlign="center center" fxFlex>
|
||||||
<md-icon>email</md-icon>
|
<md-icon class="s-128 mb-16">email</md-icon>
|
||||||
<span class="hint-text">Select a message to read</span>
|
<span class="select-message-text hint-text">Select a message to read</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div *ngIf="mail">
|
<div *ngIf="mail">
|
||||||
|
|
|
@ -7,6 +7,11 @@
|
||||||
background: #FFFFFF;
|
background: #FFFFFF;
|
||||||
padding: 24px;
|
padding: 24px;
|
||||||
|
|
||||||
|
.select-message-text {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
|
||||||
.mail-header {
|
.mail-header {
|
||||||
padding-bottom: 24px;
|
padding-bottom: 24px;
|
||||||
border-bottom: 1px solid rgba(0, 0, 0, 0.12);
|
border-bottom: 1px solid rgba(0, 0, 0, 0.12);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<div *ngIf="mails.length === 0" fxLayout="column" fxLayoutAlign="center center" fxFlex>
|
<div *ngIf="mails.length === 0" fxLayout="column" fxLayoutAlign="center center" fxFlex>
|
||||||
<span class="hint-text">There are no messages!</span>
|
<span class="no-messages-text hint-text">There are no messages!</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<fuse-mail-list-item md-ripple *ngFor="let mail of mails" [mail]="mail" (click)="readMail(mail.id)"
|
<fuse-mail-list-item md-ripple *ngFor="let mail of mails" [mail]="mail" (click)="readMail(mail.id)"
|
||||||
|
|
|
@ -5,4 +5,9 @@
|
||||||
position: relative;
|
position: relative;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
border-right: 1px solid rgba(0,0,0,.12);
|
border-right: 1px solid rgba(0,0,0,.12);
|
||||||
|
|
||||||
|
.no-messages-text {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<div class="page-layout carded left-sidenav">
|
<div id="mail" class="page-layout carded left-sidenav">
|
||||||
|
|
||||||
<!-- TOP BACKGROUND -->
|
<!-- TOP BACKGROUND -->
|
||||||
<div class="top-bg md-accent-bg"></div>
|
<div class="top-bg md-accent-bg"></div>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
@import "src/app/core/scss/fuse";
|
@import "src/app/core/scss/fuse";
|
||||||
|
|
||||||
:host, #mail {
|
:host {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
<div id="login" fxLayout="row" fxLayoutAlign="start">
|
||||||
|
|
||||||
|
<div id="login-intro" fxFlex fxHide fxShow.gt-xs>
|
||||||
|
<div class="logo">
|
||||||
|
<span>F</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="title">
|
||||||
|
Welcome to the FUSE!
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="description">
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ullamcorper nisl erat,
|
||||||
|
vel convallis elit fermentum pellentesque. Sed mollis velit facilisis facilisis viverra.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="login-form-wrapper" perfect-scrollbar>
|
||||||
|
|
||||||
|
<div id="login-form">
|
||||||
|
|
||||||
|
<div class="logo" fxHide.gt-xs>
|
||||||
|
<span>F</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="title">LOGIN TO YOUR ACCOUNT</div>
|
||||||
|
<div class="description">Sed mollis velit facilisis facilisis viverra</div>
|
||||||
|
|
||||||
|
<form name="loginForm" [formGroup]="loginForm" novalidate>
|
||||||
|
|
||||||
|
<md-input-container>
|
||||||
|
<input mdInput placeholder="Email" formControlName="email">
|
||||||
|
<md-error *ngIf="loginFormErrors.email.required">
|
||||||
|
Email is required
|
||||||
|
</md-error>
|
||||||
|
<md-error *ngIf="!loginFormErrors.email.required && loginFormErrors.email.email">
|
||||||
|
Please enter a valid email address
|
||||||
|
</md-error>
|
||||||
|
</md-input-container>
|
||||||
|
|
||||||
|
<md-input-container>
|
||||||
|
<input mdInput placeholder="Password" formControlName="password">
|
||||||
|
<md-error *ngIf="loginFormErrors.password.required">
|
||||||
|
Password is required
|
||||||
|
</md-error>
|
||||||
|
</md-input-container>
|
||||||
|
|
||||||
|
<div class="remember-forgot-password" fxLayout="row" fxLayout.xs="column"
|
||||||
|
fxLayoutAlign="space-between center">
|
||||||
|
<md-checkbox class="remember-me" aria-label="Remember Me">
|
||||||
|
Remember Me
|
||||||
|
</md-checkbox>
|
||||||
|
|
||||||
|
<a class="forgot-password">Forgot Password?</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button md-raised-button color="primary" class="submit-button" aria-label="LOG IN"
|
||||||
|
[disabled]="loginForm.invalid" type="submit">
|
||||||
|
LOGIN
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<div class="separator">
|
||||||
|
<span class="text">OR</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div fxLayout="column" fxLayoutAlign="start center">
|
||||||
|
|
||||||
|
<button md-raised-button class="google">
|
||||||
|
Log in with Google
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button md-raised-button class="facebook">
|
||||||
|
Log in with Facebook
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="register" fxLayout="column" fxLayoutAlign="center center">
|
||||||
|
<span class="text">Don't have an account?</span>
|
||||||
|
<a class="link">Create an account</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
215
src/app/main/pages/authentication/login-2/login-2.component.scss
Normal file
215
src/app/main/pages/authentication/login-2/login-2.component.scss
Normal file
|
@ -0,0 +1,215 @@
|
||||||
|
@import "src/app/core/scss/fuse";
|
||||||
|
|
||||||
|
:host {
|
||||||
|
|
||||||
|
#login {
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
background: url('/assets/images/backgrounds/march.jpg') no-repeat;
|
||||||
|
background-size: cover;
|
||||||
|
|
||||||
|
#login-intro {
|
||||||
|
padding: 128px;
|
||||||
|
|
||||||
|
@include media-breakpoint('sm') {
|
||||||
|
padding: 128px 64px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
width: 128px;
|
||||||
|
height: 128px;
|
||||||
|
line-height: 128px;
|
||||||
|
font-size: 86px;
|
||||||
|
font-weight: 500;
|
||||||
|
margin-bottom: 32px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
border-radius: 2px;
|
||||||
|
text-align: center;
|
||||||
|
background: mat-color($accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 42px;
|
||||||
|
font-weight: 300;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.description {
|
||||||
|
padding-top: 8px;
|
||||||
|
font-size: 14px;
|
||||||
|
max-width: 600px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#login-form-wrapper {
|
||||||
|
width: 400px;
|
||||||
|
min-width: 400px;
|
||||||
|
max-width: 400px;
|
||||||
|
height: 100%;
|
||||||
|
background: #FFFFFF;
|
||||||
|
@include mat-elevation(7);
|
||||||
|
|
||||||
|
@include media-breakpoint('sm') {
|
||||||
|
width: 360px;
|
||||||
|
min-width: 360px;
|
||||||
|
max-width: 360px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include media-breakpoint('xs') {
|
||||||
|
width: 100%;
|
||||||
|
min-width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#login-form {
|
||||||
|
padding: 128px 48px 48px 48px;
|
||||||
|
|
||||||
|
@include media-breakpoint('xs') {
|
||||||
|
text-align: center;
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
width: 128px;
|
||||||
|
height: 128px;
|
||||||
|
line-height: 128px;
|
||||||
|
font-size: 86px;
|
||||||
|
font-weight: 500;
|
||||||
|
text-align: center;
|
||||||
|
margin: 32px auto;
|
||||||
|
color: #FFFFFF;
|
||||||
|
border-radius: 2px;
|
||||||
|
background: mat-color($accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 21px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.description {
|
||||||
|
padding-top: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
width: 100%;
|
||||||
|
padding-top: 32px;
|
||||||
|
|
||||||
|
md-input-container {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
@include media-breakpoint('xs') {
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
md-checkbox {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.remember-forgot-password {
|
||||||
|
font-size: 13px;
|
||||||
|
margin-top: 8px;
|
||||||
|
|
||||||
|
.remember-me {
|
||||||
|
margin-bottom: 16px
|
||||||
|
}
|
||||||
|
|
||||||
|
.forgot-password {
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 500;
|
||||||
|
margin-bottom: 16px
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit-button {
|
||||||
|
width: 100%;
|
||||||
|
margin: 16px auto;
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
@include media-breakpoint('xs') {
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.separator {
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 600;
|
||||||
|
margin: 24px auto;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
width: 100px;
|
||||||
|
text-align: center;
|
||||||
|
color: rgba(0, 0, 0, 0.54);
|
||||||
|
|
||||||
|
.text {
|
||||||
|
display: inline-flex;
|
||||||
|
position: relative;
|
||||||
|
padding: 0 8px;
|
||||||
|
z-index: 9999;
|
||||||
|
|
||||||
|
&:before, &:after {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
width: 30px;
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
border-top: 1px solid rgba(0, 0, 0, 0.12);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
right: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
left: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
|
||||||
|
&.google,
|
||||||
|
&.facebook {
|
||||||
|
width: 70%;
|
||||||
|
text-transform: none;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 13px;
|
||||||
|
|
||||||
|
@include media-breakpoint('xs') {
|
||||||
|
width: 60%;
|
||||||
|
}
|
||||||
|
|
||||||
|
md-icon {
|
||||||
|
color: #FFFFFF;
|
||||||
|
margin: 0 8px 0 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.google {
|
||||||
|
background-color: #D73D32;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.facebook {
|
||||||
|
background-color: rgb(63, 92, 154);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.register {
|
||||||
|
margin: 32px auto 24px auto;
|
||||||
|
width: 250px;
|
||||||
|
font-weight: 500;
|
||||||
|
|
||||||
|
.text {
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
import { FuseLayoutService } from '../../../../core/services/layout.service';
|
||||||
|
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector : 'fuse-login-2',
|
||||||
|
templateUrl: './login-2.component.html',
|
||||||
|
styleUrls : ['./login-2.component.scss']
|
||||||
|
})
|
||||||
|
export class Login2Component implements OnInit
|
||||||
|
{
|
||||||
|
loginForm: FormGroup;
|
||||||
|
loginFormErrors: any;
|
||||||
|
|
||||||
|
constructor(private layoutService: FuseLayoutService, private formBuilder: FormBuilder)
|
||||||
|
{
|
||||||
|
this.layoutService.setSettings({
|
||||||
|
navigation: 'none',
|
||||||
|
toolbar : 'none',
|
||||||
|
footer : 'none'
|
||||||
|
});
|
||||||
|
|
||||||
|
this.loginFormErrors = {
|
||||||
|
email : {},
|
||||||
|
password: {}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit()
|
||||||
|
{
|
||||||
|
this.loginForm = this.formBuilder.group({
|
||||||
|
email : ['', [Validators.required, Validators.email]],
|
||||||
|
password: ['', Validators.required]
|
||||||
|
});
|
||||||
|
|
||||||
|
this.loginForm.valueChanges.subscribe(() => {
|
||||||
|
this.onLoginFormValuesChanged();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onLoginFormValuesChanged()
|
||||||
|
{
|
||||||
|
for ( const field in this.loginFormErrors )
|
||||||
|
{
|
||||||
|
if ( this.loginFormErrors.hasOwnProperty(field) )
|
||||||
|
{
|
||||||
|
// Clear previous errors
|
||||||
|
this.loginFormErrors[field] = {};
|
||||||
|
|
||||||
|
// Get the control
|
||||||
|
const control = this.loginForm.get(field);
|
||||||
|
|
||||||
|
if ( control && control.dirty && !control.valid )
|
||||||
|
{
|
||||||
|
this.loginFormErrors[field] = control.errors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
65
src/app/main/pages/authentication/login/login.component.html
Normal file
65
src/app/main/pages/authentication/login/login.component.html
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
<div id="login" fxLayout="column" perfect-scrollbar>
|
||||||
|
|
||||||
|
<div id="login-form-wrapper" fxLayout="column" fxLayoutAlign="center center">
|
||||||
|
|
||||||
|
<div id="login-form">
|
||||||
|
<div class="logo md-accent-bg">
|
||||||
|
<span>F</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="title">LOGIN TO YOUR ACCOUNT</div>
|
||||||
|
|
||||||
|
<form name="loginForm" [formGroup]="loginForm" novalidate>
|
||||||
|
|
||||||
|
<md-input-container>
|
||||||
|
<input mdInput placeholder="Email" formControlName="email">
|
||||||
|
<md-error *ngIf="loginFormErrors.email.required">
|
||||||
|
Email is required
|
||||||
|
</md-error>
|
||||||
|
<md-error *ngIf="!loginFormErrors.email.required && loginFormErrors.email.email">
|
||||||
|
Please enter a valid email address
|
||||||
|
</md-error>
|
||||||
|
</md-input-container>
|
||||||
|
|
||||||
|
<md-input-container>
|
||||||
|
<input mdInput placeholder="Password" formControlName="password">
|
||||||
|
<md-error *ngIf="loginFormErrors.password.required">
|
||||||
|
Password is required
|
||||||
|
</md-error>
|
||||||
|
</md-input-container>
|
||||||
|
|
||||||
|
<div class="remember-forgot-password" fxLayout="row" fxLayout.xs="column"
|
||||||
|
fxLayoutAlign="space-between center">
|
||||||
|
<md-checkbox class="remember-me" aria-label="Remember Me">
|
||||||
|
Remember Me
|
||||||
|
</md-checkbox>
|
||||||
|
|
||||||
|
<a class="forgot-password">Forgot Password?</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button md-raised-button color="primary" class="submit-button" aria-label="LOG IN"
|
||||||
|
[disabled]="loginForm.invalid" type="submit">
|
||||||
|
LOGIN
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<div class="separator">
|
||||||
|
<span class="text">OR</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button md-raised-button class="google">
|
||||||
|
Log in with Google
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button md-raised-button class="facebook">
|
||||||
|
Log in with Facebook
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div class="register" fxLayout="column" fxLayoutAlign="center center">
|
||||||
|
<span class="text">Don't have an account?</span>
|
||||||
|
<a class="link" [routerLink]="'/pages/auth/register'">Create an account</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
155
src/app/main/pages/authentication/login/login.component.scss
Normal file
155
src/app/main/pages/authentication/login/login.component.scss
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
@import "src/app/core/scss/fuse";
|
||||||
|
|
||||||
|
:host {
|
||||||
|
|
||||||
|
#login {
|
||||||
|
height: 100%;
|
||||||
|
background: url('/assets/images/backgrounds/march.jpg') no-repeat;
|
||||||
|
background-size: cover;
|
||||||
|
|
||||||
|
#login-form-wrapper {
|
||||||
|
flex: 1 0 auto;
|
||||||
|
padding: 32px;
|
||||||
|
|
||||||
|
@include media-breakpoint('xs') {
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#login-form {
|
||||||
|
width: 384px;
|
||||||
|
max-width: 384px;
|
||||||
|
padding: 32px;
|
||||||
|
background: #FFFFFF;
|
||||||
|
text-align: center;
|
||||||
|
@include mat-elevation(7);
|
||||||
|
|
||||||
|
@include media-breakpoint('xs') {
|
||||||
|
padding: 24px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
width: 128px;
|
||||||
|
height: 128px;
|
||||||
|
line-height: 128px;
|
||||||
|
font-size: 86px;
|
||||||
|
font-weight: 500;
|
||||||
|
margin: 32px auto;
|
||||||
|
color: #FFFFFF;
|
||||||
|
border-radius: 2px;
|
||||||
|
background: mat-color($accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 17px;
|
||||||
|
margin: 16px 0 32px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
width: 100%;
|
||||||
|
text-align: left;
|
||||||
|
|
||||||
|
md-input-container {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
md-checkbox {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.remember-forgot-password {
|
||||||
|
font-size: 13px;
|
||||||
|
margin-top: 8px;
|
||||||
|
|
||||||
|
.remember-me {
|
||||||
|
margin-bottom: 16px
|
||||||
|
}
|
||||||
|
|
||||||
|
.forgot-password {
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 500;
|
||||||
|
margin-bottom: 16px
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit-button {
|
||||||
|
width: 220px;
|
||||||
|
margin: 16px auto;
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
@include media-breakpoint('xs') {
|
||||||
|
width: 90%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.register {
|
||||||
|
margin: 32px auto 24px auto;
|
||||||
|
font-weight: 500;
|
||||||
|
|
||||||
|
.text {
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.separator {
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 600;
|
||||||
|
margin: 24px auto;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
width: 100px;
|
||||||
|
color: rgba(0, 0, 0, 0.54);
|
||||||
|
|
||||||
|
.text {
|
||||||
|
display: inline-flex;
|
||||||
|
position: relative;
|
||||||
|
padding: 0 8px;
|
||||||
|
z-index: 9999;
|
||||||
|
|
||||||
|
&:before, &:after {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
width: 30px;
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
border-top: 1px solid rgba(0, 0, 0, 0.12);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
right: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
left: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
|
||||||
|
&.google,
|
||||||
|
&.facebook {
|
||||||
|
width: 192px;
|
||||||
|
text-transform: none;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include media-breakpoint('xs') {
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.google {
|
||||||
|
background-color: #D73D32;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.facebook {
|
||||||
|
background-color: rgb(63, 92, 154);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
55
src/app/main/pages/authentication/login/login.component.ts
Normal file
55
src/app/main/pages/authentication/login/login.component.ts
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
import { FuseLayoutService } from '../../../../core/services/layout.service';
|
||||||
|
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector : 'fuse-login',
|
||||||
|
templateUrl: './login.component.html',
|
||||||
|
styleUrls : ['./login.component.scss']
|
||||||
|
})
|
||||||
|
export class LoginComponent implements OnInit
|
||||||
|
{
|
||||||
|
loginForm: FormGroup;
|
||||||
|
loginFormErrors: any;
|
||||||
|
|
||||||
|
constructor(private layoutService: FuseLayoutService, private formBuilder: FormBuilder)
|
||||||
|
{
|
||||||
|
this.loginFormErrors = {
|
||||||
|
email : {},
|
||||||
|
password: {}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit()
|
||||||
|
{
|
||||||
|
this.loginForm = this.formBuilder.group({
|
||||||
|
email : ['', [Validators.required, Validators.email]],
|
||||||
|
password: ['', Validators.required]
|
||||||
|
});
|
||||||
|
|
||||||
|
this.loginForm.valueChanges.subscribe(() => {
|
||||||
|
this.onLoginFormValuesChanged();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onLoginFormValuesChanged()
|
||||||
|
{
|
||||||
|
for ( const field in this.loginFormErrors )
|
||||||
|
{
|
||||||
|
if ( this.loginFormErrors.hasOwnProperty(field) )
|
||||||
|
{
|
||||||
|
// Clear previous errors
|
||||||
|
this.loginFormErrors[field] = {};
|
||||||
|
|
||||||
|
// Get the control
|
||||||
|
const control = this.loginForm.get(field);
|
||||||
|
|
||||||
|
if ( control && control.dirty && !control.valid )
|
||||||
|
{
|
||||||
|
this.loginFormErrors[field] = control.errors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
<div id="register" fxLayout="column" perfect-scrollbar>
|
||||||
|
|
||||||
|
<div id="register-form-wrapper" fxLayout="column" fxLayoutAlign="center center">
|
||||||
|
|
||||||
|
<div id="register-form">
|
||||||
|
<div class="logo md-accent-bg">
|
||||||
|
<span>F</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="title">CREATE AN ACCOUNT</div>
|
||||||
|
|
||||||
|
<form name="registerForm" [formGroup]="registerForm" novalidate>
|
||||||
|
|
||||||
|
<md-input-container>
|
||||||
|
<input mdInput placeholder="Name" formControlName="name">
|
||||||
|
<md-error *ngIf="registerFormErrors.name.required">
|
||||||
|
Name is required
|
||||||
|
</md-error>
|
||||||
|
</md-input-container>
|
||||||
|
|
||||||
|
<md-input-container>
|
||||||
|
<input mdInput placeholder="Email" formControlName="email">
|
||||||
|
<md-error *ngIf="registerFormErrors.email.required">
|
||||||
|
Email is required
|
||||||
|
</md-error>
|
||||||
|
<md-error *ngIf="!registerFormErrors.email.required && registerFormErrors.email.email">
|
||||||
|
Please enter a valid email address
|
||||||
|
</md-error>
|
||||||
|
</md-input-container>
|
||||||
|
|
||||||
|
<md-input-container>
|
||||||
|
<input mdInput placeholder="Password" formControlName="password">
|
||||||
|
<md-error *ngIf="registerFormErrors.password.required">
|
||||||
|
Password is required
|
||||||
|
</md-error>
|
||||||
|
</md-input-container>
|
||||||
|
|
||||||
|
<md-input-container>
|
||||||
|
<input mdInput placeholder="Password Confirm" formControlName="passwordConfirm">
|
||||||
|
<md-error *ngIf="registerFormErrors.passwordConfirm.required">
|
||||||
|
Password confirmation is required
|
||||||
|
</md-error>
|
||||||
|
</md-input-container>
|
||||||
|
|
||||||
|
<div class="terms" fxLayout="row" fxLayoutAlign="center center">
|
||||||
|
<md-checkbox name="terms" aria-label="I read and accept" required>
|
||||||
|
<span>I read and accept</span>
|
||||||
|
</md-checkbox>
|
||||||
|
<a href="#">terms and conditions</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button md-raised-button color="primary" class="submit-button" aria-label="CREATE AN ACCOUNT"
|
||||||
|
[disabled]="registerForm.invalid" type="submit">
|
||||||
|
CREATE AN ACCOUNT
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<div class="register" fxLayout="column" fxLayoutAlign="center center">
|
||||||
|
<span class="text">Already have an account?</span>
|
||||||
|
<a class="link" [routerLink]="'/pages/auth/login'">Login</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,149 @@
|
||||||
|
@import "src/app/core/scss/fuse";
|
||||||
|
|
||||||
|
:host {
|
||||||
|
|
||||||
|
#register {
|
||||||
|
height: 100%;
|
||||||
|
background: url('/assets/images/backgrounds/march.jpg') no-repeat;
|
||||||
|
background-size: cover;
|
||||||
|
|
||||||
|
#register-form-wrapper {
|
||||||
|
flex: 1 0 auto;
|
||||||
|
padding: 32px;
|
||||||
|
|
||||||
|
@include media-breakpoint('xs') {
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#register-form {
|
||||||
|
width: 384px;
|
||||||
|
max-width: 384px;
|
||||||
|
padding: 32px;
|
||||||
|
background: #FFFFFF;
|
||||||
|
text-align: center;
|
||||||
|
@include mat-elevation(7);
|
||||||
|
|
||||||
|
@include media-breakpoint('xs') {
|
||||||
|
padding: 24px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
width: 128px;
|
||||||
|
height: 128px;
|
||||||
|
line-height: 128px;
|
||||||
|
font-size: 86px;
|
||||||
|
font-weight: 500;
|
||||||
|
margin: 32px auto;
|
||||||
|
color: #FFFFFF;
|
||||||
|
border-radius: 2px;
|
||||||
|
background: mat-color($accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 17px;
|
||||||
|
margin: 16px 0 32px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
width: 100%;
|
||||||
|
text-align: left;
|
||||||
|
|
||||||
|
md-input-container {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
md-checkbox {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.terms {
|
||||||
|
font-size: 13px;
|
||||||
|
margin: 16px 0 32px 0;
|
||||||
|
|
||||||
|
a {
|
||||||
|
margin-left: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit-button {
|
||||||
|
width: 220px;
|
||||||
|
margin: 16px auto;
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
@include media-breakpoint('xs') {
|
||||||
|
width: 90%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.register {
|
||||||
|
margin: 32px auto 24px auto;
|
||||||
|
font-weight: 500;
|
||||||
|
|
||||||
|
.text {
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.separator {
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 600;
|
||||||
|
margin: 24px auto;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
width: 100px;
|
||||||
|
color: rgba(0, 0, 0, 0.54);
|
||||||
|
|
||||||
|
.text {
|
||||||
|
display: inline-flex;
|
||||||
|
position: relative;
|
||||||
|
padding: 0 8px;
|
||||||
|
z-index: 9999;
|
||||||
|
|
||||||
|
&:before, &:after {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
width: 30px;
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
border-top: 1px solid rgba(0, 0, 0, 0.12);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
right: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
left: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
|
||||||
|
&.google,
|
||||||
|
&.facebook {
|
||||||
|
width: 192px;
|
||||||
|
text-transform: none;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include media-breakpoint('xs') {
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.google {
|
||||||
|
background-color: #D73D32;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.facebook {
|
||||||
|
background-color: rgb(63, 92, 154);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
import { FuseLayoutService } from '../../../../core/services/layout.service';
|
||||||
|
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector : 'fuse-register',
|
||||||
|
templateUrl: './register.component.html',
|
||||||
|
styleUrls : ['./register.component.scss']
|
||||||
|
})
|
||||||
|
export class RegisterComponent implements OnInit
|
||||||
|
{
|
||||||
|
registerForm: FormGroup;
|
||||||
|
registerFormErrors: any;
|
||||||
|
|
||||||
|
constructor(private layoutService: FuseLayoutService, private formBuilder: FormBuilder)
|
||||||
|
{
|
||||||
|
this.registerFormErrors = {
|
||||||
|
name : {},
|
||||||
|
email : {},
|
||||||
|
password : {},
|
||||||
|
passwordConfirm: {}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit()
|
||||||
|
{
|
||||||
|
|
||||||
|
this.registerForm = this.formBuilder.group({
|
||||||
|
name : ['', Validators.required],
|
||||||
|
email : ['', [Validators.required, Validators.email]],
|
||||||
|
password : ['', Validators.required],
|
||||||
|
passwordConfirm: ['', Validators.required]
|
||||||
|
});
|
||||||
|
|
||||||
|
this.registerForm.valueChanges.subscribe(() => {
|
||||||
|
this.onRegisterFormValuesChanged();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onRegisterFormValuesChanged()
|
||||||
|
{
|
||||||
|
for ( const field in this.registerFormErrors )
|
||||||
|
{
|
||||||
|
if ( this.registerFormErrors.hasOwnProperty(field) )
|
||||||
|
{
|
||||||
|
// Clear previous errors
|
||||||
|
this.registerFormErrors[field] = {};
|
||||||
|
|
||||||
|
// Get the control
|
||||||
|
const control = this.registerForm.get(field);
|
||||||
|
|
||||||
|
if ( control && control.dirty && !control.valid )
|
||||||
|
{
|
||||||
|
this.registerFormErrors[field] = control.errors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
58
src/app/main/pages/pages.module.ts
Normal file
58
src/app/main/pages/pages.module.ts
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
import { NgModule } from '@angular/core';
|
||||||
|
import { SharedModule } from '../../core/modules/shared.module';
|
||||||
|
import { RouterModule } from '@angular/router';
|
||||||
|
|
||||||
|
import { LoginComponent } from './authentication/login/login.component';
|
||||||
|
import { Login2Component } from './authentication/login-2/login-2.component';
|
||||||
|
import { RegisterComponent } from './authentication/register/register.component';
|
||||||
|
|
||||||
|
const routes = [
|
||||||
|
{
|
||||||
|
path : 'pages/auth/login',
|
||||||
|
component: LoginComponent,
|
||||||
|
data : {
|
||||||
|
layout: {
|
||||||
|
navigation: 'none',
|
||||||
|
toolbar : 'none',
|
||||||
|
footer : 'none'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path : 'pages/auth/login-2',
|
||||||
|
component: Login2Component,
|
||||||
|
data : {
|
||||||
|
layout: {
|
||||||
|
navigation: 'none',
|
||||||
|
toolbar : 'none',
|
||||||
|
footer : 'none'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path : 'pages/auth/register',
|
||||||
|
component: RegisterComponent,
|
||||||
|
data : {
|
||||||
|
layout: {
|
||||||
|
navigation: 'none',
|
||||||
|
toolbar : 'none',
|
||||||
|
footer : 'none'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports : [
|
||||||
|
SharedModule,
|
||||||
|
RouterModule.forChild(routes)
|
||||||
|
],
|
||||||
|
declarations: [
|
||||||
|
LoginComponent,
|
||||||
|
Login2Component,
|
||||||
|
RegisterComponent
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class PagesModule
|
||||||
|
{
|
||||||
|
}
|
5
src/app/main/ui/page-layouts/blank/blank.component.html
Normal file
5
src/app/main/ui/page-layouts/blank/blank.component.html
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<div class="page-layout blank">
|
||||||
|
|
||||||
|
<h2>Blank Page</h2>
|
||||||
|
|
||||||
|
</div>
|
13
src/app/main/ui/page-layouts/blank/blank.component.ts
Normal file
13
src/app/main/ui/page-layouts/blank/blank.component.ts
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector : 'fuse-blank',
|
||||||
|
templateUrl: './blank.component.html',
|
||||||
|
styleUrls : ['./blank.component.scss']
|
||||||
|
})
|
||||||
|
export class BlankComponent
|
||||||
|
{
|
||||||
|
constructor()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
<div class="page-layout carded fullwidth single-scroll">
|
<div class="page-layout carded fullwidth single-scroll">
|
||||||
|
|
||||||
<!-- TOP BACKGROUND -->
|
<!-- TOP BACKGROUND -->
|
||||||
<div class="top-bg md-accent-bg"></div>
|
<div class="top-bg"></div>
|
||||||
<!-- / TOP BACKGROUND -->
|
<!-- / TOP BACKGROUND -->
|
||||||
|
|
||||||
<!-- CENTER -->
|
<!-- CENTER -->
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<div class="page-layout carded fullwidth">
|
<div class="page-layout carded fullwidth">
|
||||||
|
|
||||||
<!-- TOP BACKGROUND -->
|
<!-- TOP BACKGROUND -->
|
||||||
<div class="top-bg md-accent-bg"></div>
|
<div class="top-bg"></div>
|
||||||
<!-- / TOP BACKGROUND -->
|
<!-- / TOP BACKGROUND -->
|
||||||
|
|
||||||
<!-- CENTER -->
|
<!-- CENTER -->
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<div class="page-layout carded left-sidenav single-scroll">
|
<div class="page-layout carded left-sidenav single-scroll">
|
||||||
|
|
||||||
<!-- TOP BACKGROUND -->
|
<!-- TOP BACKGROUND -->
|
||||||
<div class="top-bg md-accent-bg"></div>
|
<div class="top-bg"></div>
|
||||||
<!-- / TOP BACKGROUND -->
|
<!-- / TOP BACKGROUND -->
|
||||||
|
|
||||||
<md-sidenav-container>
|
<md-sidenav-container>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<div class="page-layout carded left-sidenav">
|
<div class="page-layout carded left-sidenav">
|
||||||
|
|
||||||
<!-- TOP BACKGROUND -->
|
<!-- TOP BACKGROUND -->
|
||||||
<div class="top-bg md-accent-bg"></div>
|
<div class="top-bg"></div>
|
||||||
<!-- / TOP BACKGROUND -->
|
<!-- / TOP BACKGROUND -->
|
||||||
|
|
||||||
<md-sidenav-container>
|
<md-sidenav-container>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<div class="page-layout carded right-sidenav">
|
<div class="page-layout carded right-sidenav">
|
||||||
|
|
||||||
<!-- TOP BACKGROUND -->
|
<!-- TOP BACKGROUND -->
|
||||||
<div class="top-bg md-accent-bg"></div>
|
<div class="top-bg"></div>
|
||||||
<!-- / TOP BACKGROUND -->
|
<!-- / TOP BACKGROUND -->
|
||||||
|
|
||||||
<md-sidenav-container>
|
<md-sidenav-container>
|
||||||
|
|
|
@ -8,37 +8,66 @@ import { CardedLeftSidenavComponent } from './carded/left-sidenav/left-sidenav.c
|
||||||
import { CardedLeftSidenav2Component } from './carded/left-sidenav-2/left-sidenav-2.component';
|
import { CardedLeftSidenav2Component } from './carded/left-sidenav-2/left-sidenav-2.component';
|
||||||
import { CardedRightSidenavComponent } from './carded/right-sidenav/right-sidenav.component';
|
import { CardedRightSidenavComponent } from './carded/right-sidenav/right-sidenav.component';
|
||||||
import { CardedRightSidenav2Component } from './carded/right-sidenav-2/right-sidenav-2.component';
|
import { CardedRightSidenav2Component } from './carded/right-sidenav-2/right-sidenav-2.component';
|
||||||
|
import { SimpleFullWidthComponent } from './simple/fullwidth/fullwidth.component';
|
||||||
|
import { SimpleLeftSidenavComponent } from './simple/left-sidenav/left-sidenav.component';
|
||||||
|
import { SimpleLeftSidenav2Component } from './simple/left-sidenav-2/left-sidenav-2.component';
|
||||||
|
import { SimpleRightSidenavComponent } from './simple/right-sidenav/right-sidenav.component';
|
||||||
|
import { SimpleRightSidenav2Component } from './simple/right-sidenav-2/right-sidenav-2.component';
|
||||||
|
import { TabbedComponent } from './simple/tabbed/tabbed.component';
|
||||||
|
import { BlankComponent } from './blank/blank.component';
|
||||||
|
|
||||||
const routes: Routes = [
|
const routes: Routes = [
|
||||||
{
|
{
|
||||||
path : 'ui/page-layouts/carded/full-width',
|
path : 'ui/page-layouts/carded/full-width',
|
||||||
component: CardedFullWidthComponent,
|
component: CardedFullWidthComponent
|
||||||
children : []
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path : 'ui/page-layouts/carded/full-width-2',
|
path : 'ui/page-layouts/carded/full-width-2',
|
||||||
component: CardedFullWidth2Component,
|
component: CardedFullWidth2Component
|
||||||
children : []
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path : 'ui/page-layouts/carded/left-sidenav',
|
path : 'ui/page-layouts/carded/left-sidenav',
|
||||||
component: CardedLeftSidenavComponent,
|
component: CardedLeftSidenavComponent
|
||||||
children : []
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path : 'ui/page-layouts/carded/left-sidenav-2',
|
path : 'ui/page-layouts/carded/left-sidenav-2',
|
||||||
component: CardedLeftSidenav2Component,
|
component: CardedLeftSidenav2Component
|
||||||
children : []
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path : 'ui/page-layouts/carded/right-sidenav',
|
path : 'ui/page-layouts/carded/right-sidenav',
|
||||||
component: CardedRightSidenavComponent,
|
component: CardedRightSidenavComponent
|
||||||
children : []
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path : 'ui/page-layouts/carded/right-sidenav-2',
|
path : 'ui/page-layouts/carded/right-sidenav-2',
|
||||||
component: CardedRightSidenav2Component,
|
component: CardedRightSidenav2Component
|
||||||
children : []
|
},
|
||||||
|
{
|
||||||
|
path : 'ui/page-layouts/simple/full-width',
|
||||||
|
component: SimpleFullWidthComponent
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path : 'ui/page-layouts/simple/left-sidenav',
|
||||||
|
component: SimpleLeftSidenavComponent
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path : 'ui/page-layouts/simple/left-sidenav-2',
|
||||||
|
component: SimpleLeftSidenav2Component
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path : 'ui/page-layouts/simple/right-sidenav',
|
||||||
|
component: SimpleRightSidenavComponent
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path : 'ui/page-layouts/simple/right-sidenav-2',
|
||||||
|
component: SimpleRightSidenav2Component
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path : 'ui/page-layouts/simple/tabbed',
|
||||||
|
component: TabbedComponent
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path : 'ui/page-layouts/blank',
|
||||||
|
component: BlankComponent
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -54,7 +83,14 @@ const routes: Routes = [
|
||||||
CardedLeftSidenavComponent,
|
CardedLeftSidenavComponent,
|
||||||
CardedLeftSidenav2Component,
|
CardedLeftSidenav2Component,
|
||||||
CardedRightSidenavComponent,
|
CardedRightSidenavComponent,
|
||||||
CardedRightSidenav2Component
|
CardedRightSidenav2Component,
|
||||||
|
SimpleFullWidthComponent,
|
||||||
|
SimpleLeftSidenavComponent,
|
||||||
|
SimpleLeftSidenav2Component,
|
||||||
|
SimpleRightSidenavComponent,
|
||||||
|
SimpleRightSidenav2Component,
|
||||||
|
TabbedComponent,
|
||||||
|
BlankComponent
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
export class UIPageLayoutsModule
|
export class UIPageLayoutsModule
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
<div class="page-layout simple fullwidth">
|
||||||
|
|
||||||
|
<!-- HEADER -->
|
||||||
|
<div class="header">
|
||||||
|
<h2>Fullwidth</h2>
|
||||||
|
</div>
|
||||||
|
<!-- / HEADER -->
|
||||||
|
|
||||||
|
<!-- CONTENT -->
|
||||||
|
<div class="content">
|
||||||
|
|
||||||
|
<fuse-demo-content></fuse-demo-content>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- / CONTENT -->
|
||||||
|
|
||||||
|
</div>
|
|
@ -0,0 +1,13 @@
|
||||||
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector : 'fuse-simple-fullwidth',
|
||||||
|
templateUrl: './fullwidth.component.html',
|
||||||
|
styleUrls : ['./fullwidth.component.scss']
|
||||||
|
})
|
||||||
|
export class SimpleFullWidthComponent
|
||||||
|
{
|
||||||
|
constructor()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
<div class="page-layout simple left-sidenav single-scroll" fxLayout="row">
|
||||||
|
|
||||||
|
<md-sidenav-container>
|
||||||
|
|
||||||
|
<!-- SIDENAV -->
|
||||||
|
<md-sidenav class="sidenav mat-sidenav-opened" align="start" opened="true" mode="side"
|
||||||
|
fuseMdSidenavHelper="simple-left-sidenav-2" md-is-locked-open="gt-md">
|
||||||
|
|
||||||
|
<fuse-demo-sidenav></fuse-demo-sidenav>
|
||||||
|
|
||||||
|
</md-sidenav>
|
||||||
|
<!-- / SIDENAV -->
|
||||||
|
|
||||||
|
<!-- CENTER -->
|
||||||
|
<div class="center" fxFlex perfect-scrollbar>
|
||||||
|
|
||||||
|
<!-- HEADER -->
|
||||||
|
<div class="header" fxLayout="row">
|
||||||
|
|
||||||
|
<button md-button class="mat-icon-button sidenav-toggle"
|
||||||
|
fuseMdSidenavToggler="simple-left-sidenav-2"
|
||||||
|
fxHide.gt-md>
|
||||||
|
<md-icon>menu</md-icon>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h2>Left sidenav with page scroll</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- / HEADER -->
|
||||||
|
|
||||||
|
<!-- CONTENT -->
|
||||||
|
<div class="content">
|
||||||
|
|
||||||
|
<fuse-demo-content></fuse-demo-content>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- / CONTENT -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- / CENTER -->
|
||||||
|
|
||||||
|
</md-sidenav-container>
|
||||||
|
|
||||||
|
</div>
|
|
@ -0,0 +1,14 @@
|
||||||
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector : 'fuse-simple-left-sidenav-2',
|
||||||
|
templateUrl: './left-sidenav-2.component.html',
|
||||||
|
styleUrls : ['./left-sidenav-2.component.scss']
|
||||||
|
})
|
||||||
|
export class SimpleLeftSidenav2Component
|
||||||
|
{
|
||||||
|
constructor()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
<div class="page-layout simple left-sidenav" fxLayout="row">
|
||||||
|
|
||||||
|
<md-sidenav-container>
|
||||||
|
|
||||||
|
<!-- SIDENAV -->
|
||||||
|
<md-sidenav class="sidenav mat-sidenav-opened" align="start" opened="true" mode="side"
|
||||||
|
fuseMdSidenavHelper="simple-left-sidenav" md-is-locked-open="gt-md">
|
||||||
|
|
||||||
|
<fuse-demo-sidenav></fuse-demo-sidenav>
|
||||||
|
|
||||||
|
</md-sidenav>
|
||||||
|
<!-- / SIDENAV -->
|
||||||
|
|
||||||
|
<!-- CENTER -->
|
||||||
|
<div class="center" fxFlex perfect-scrollbar>
|
||||||
|
|
||||||
|
<!-- HEADER -->
|
||||||
|
<div class="header" fxLayout="row">
|
||||||
|
|
||||||
|
<button md-button class="mat-icon-button sidenav-toggle"
|
||||||
|
fuseMdSidenavToggler="simple-left-sidenav"
|
||||||
|
fxHide.gt-md>
|
||||||
|
<md-icon>menu</md-icon>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h2>Left sidenav with content scroll</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- / HEADER -->
|
||||||
|
|
||||||
|
<!-- CONTENT -->
|
||||||
|
<div class="content">
|
||||||
|
|
||||||
|
<fuse-demo-content></fuse-demo-content>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- / CONTENT -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- / CENTER -->
|
||||||
|
|
||||||
|
</md-sidenav-container>
|
||||||
|
|
||||||
|
</div>
|
|
@ -0,0 +1,14 @@
|
||||||
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector : 'fuse-simple-left-sidenav',
|
||||||
|
templateUrl: './left-sidenav.component.html',
|
||||||
|
styleUrls : ['./left-sidenav.component.scss']
|
||||||
|
})
|
||||||
|
export class SimpleLeftSidenavComponent
|
||||||
|
{
|
||||||
|
constructor()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
<div class="page-layout simple right-sidenav single-scroll" fxLayout="row">
|
||||||
|
|
||||||
|
<md-sidenav-container>
|
||||||
|
|
||||||
|
<!-- SIDENAV -->
|
||||||
|
<md-sidenav class="sidenav mat-sidenav-opened" align="end" opened="true" mode="side"
|
||||||
|
fuseMdSidenavHelper="simple-right-sidenav-2" md-is-locked-open="gt-md">
|
||||||
|
|
||||||
|
<fuse-demo-sidenav></fuse-demo-sidenav>
|
||||||
|
|
||||||
|
</md-sidenav>
|
||||||
|
<!-- / SIDENAV -->
|
||||||
|
|
||||||
|
<!-- CENTER -->
|
||||||
|
<div class="center" fxFlex perfect-scrollbar>
|
||||||
|
|
||||||
|
<!-- HEADER -->
|
||||||
|
<div class="header" fxLayout="row">
|
||||||
|
|
||||||
|
<button md-button class="mat-icon-button sidenav-toggle"
|
||||||
|
fuseMdSidenavToggler="simple-right-sidenav-2"
|
||||||
|
fxHide.gt-md>
|
||||||
|
<md-icon>menu</md-icon>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h2>Right sidenav with page scroll</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- / HEADER -->
|
||||||
|
|
||||||
|
<!-- CONTENT -->
|
||||||
|
<div class="content">
|
||||||
|
|
||||||
|
<fuse-demo-content></fuse-demo-content>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- / CONTENT -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- / CENTER -->
|
||||||
|
|
||||||
|
</md-sidenav-container>
|
||||||
|
|
||||||
|
</div>
|
|
@ -0,0 +1,14 @@
|
||||||
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector : 'fuse-simple-right-sidenav-2',
|
||||||
|
templateUrl: './right-sidenav-2.component.html',
|
||||||
|
styleUrls : ['./right-sidenav-2.component.scss']
|
||||||
|
})
|
||||||
|
export class SimpleRightSidenav2Component
|
||||||
|
{
|
||||||
|
constructor()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
<div class="page-layout simple right-sidenav" fxLayout="row">
|
||||||
|
|
||||||
|
<md-sidenav-container>
|
||||||
|
|
||||||
|
<!-- SIDENAV -->
|
||||||
|
<md-sidenav class="sidenav mat-sidenav-opened" align="end" opened="true" mode="side"
|
||||||
|
fuseMdSidenavHelper="simple-right-sidenav" md-is-locked-open="gt-md">
|
||||||
|
|
||||||
|
<fuse-demo-sidenav></fuse-demo-sidenav>
|
||||||
|
|
||||||
|
</md-sidenav>
|
||||||
|
<!-- / SIDENAV -->
|
||||||
|
|
||||||
|
<!-- CENTER -->
|
||||||
|
<div class="center" fxFlex perfect-scrollbar>
|
||||||
|
|
||||||
|
<!-- HEADER -->
|
||||||
|
<div class="header" fxLayout="row">
|
||||||
|
|
||||||
|
<button md-button class="mat-icon-button sidenav-toggle"
|
||||||
|
fuseMdSidenavToggler="simple-right-sidenav"
|
||||||
|
fxHide.gt-md>
|
||||||
|
<md-icon>menu</md-icon>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h2>Right sidenav with content scroll</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- / HEADER -->
|
||||||
|
|
||||||
|
<!-- CONTENT -->
|
||||||
|
<div class="content">
|
||||||
|
|
||||||
|
<fuse-demo-content></fuse-demo-content>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- / CONTENT -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- / CENTER -->
|
||||||
|
|
||||||
|
</md-sidenav-container>
|
||||||
|
|
||||||
|
</div>
|
|
@ -0,0 +1,14 @@
|
||||||
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector : 'fuse-simple-right-sidenav',
|
||||||
|
templateUrl: './right-sidenav.component.html',
|
||||||
|
styleUrls : ['./right-sidenav.component.scss']
|
||||||
|
})
|
||||||
|
export class SimpleRightSidenavComponent
|
||||||
|
{
|
||||||
|
constructor()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
<div class="page-layout simple tabbed" fxLayout="column">
|
||||||
|
|
||||||
|
<!-- HEADER -->
|
||||||
|
<div class="header">
|
||||||
|
<h2>Tabbed</h2>
|
||||||
|
</div>
|
||||||
|
<!-- / HEADER -->
|
||||||
|
|
||||||
|
<!-- CONTENT -->
|
||||||
|
<div class="content">
|
||||||
|
|
||||||
|
<md-tab-group md-dynamic-height="true">
|
||||||
|
|
||||||
|
<md-tab label="Tab 1">
|
||||||
|
<fuse-demo-content></fuse-demo-content>
|
||||||
|
</md-tab>
|
||||||
|
|
||||||
|
<md-tab label="Tab 2">
|
||||||
|
<fuse-demo-content></fuse-demo-content>
|
||||||
|
</md-tab>
|
||||||
|
|
||||||
|
<md-tab label="Tab 3">
|
||||||
|
<fuse-demo-content></fuse-demo-content>
|
||||||
|
</md-tab>
|
||||||
|
|
||||||
|
</md-tab-group>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- / CONTENT -->
|
||||||
|
|
||||||
|
</div>
|
|
@ -0,0 +1,14 @@
|
||||||
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector : 'fuse-tabbed',
|
||||||
|
templateUrl: './tabbed.component.html',
|
||||||
|
styleUrls : ['./tabbed.component.scss']
|
||||||
|
})
|
||||||
|
export class TabbedComponent
|
||||||
|
{
|
||||||
|
constructor()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
12
src/app/main/ui/ui.module.ts
Normal file
12
src/app/main/ui/ui.module.ts
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import { NgModule } from '@angular/core';
|
||||||
|
import { UIPageLayoutsModule } from './page-layouts/page-layouts.module';
|
||||||
|
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports : [
|
||||||
|
UIPageLayoutsModule
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class UIModule
|
||||||
|
{
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user