This commit is contained in:
Sercan Yemen 2017-07-12 15:35:07 +03:00
parent 829f570913
commit a8844e8b46
71 changed files with 1361 additions and 856 deletions

View File

@ -1,57 +1,57 @@
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"project": {
"name": "fuse2"
},
"apps": [
{
"root": "src",
"outDir": "dist",
"assets": [
"assets",
"favicon.ico"
],
"index": "index.html",
"main": "main.ts",
"polyfills": "polyfills.ts",
"test": "test.ts",
"tsconfig": "tsconfig.app.json",
"testTsconfig": "tsconfig.spec.json",
"prefix": "app",
"styles": [
"styles.scss"
],
"scripts": [],
"environmentSource": "environments/environment.ts",
"environments": {
"dev": "environments/environment.ts",
"prod": "environments/environment.prod.ts"
}
}
],
"e2e": {
"protractor": {
"config": "./protractor.conf.js"
}
},
"lint": [
{
"project": "src/tsconfig.app.json"
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"project": {
"name": "fuse2"
},
{
"project": "src/tsconfig.spec.json"
"apps": [
{
"root": "src",
"outDir": "dist",
"assets": [
"assets",
"favicon.ico"
],
"index": "index.html",
"main": "main.ts",
"polyfills": "polyfills.ts",
"test": "test.ts",
"tsconfig": "tsconfig.app.json",
"testTsconfig": "tsconfig.spec.json",
"prefix": "app",
"styles": [
"styles.scss"
],
"scripts": [],
"environmentSource": "environments/environment.ts",
"environments": {
"dev": "environments/environment.ts",
"prod": "environments/environment.prod.ts"
}
}
],
"e2e": {
"protractor": {
"config": "./protractor.conf.js"
}
},
{
"project": "e2e/tsconfig.e2e.json"
"lint": [
{
"project": "src/tsconfig.app.json"
},
{
"project": "src/tsconfig.spec.json"
},
{
"project": "e2e/tsconfig.e2e.json"
}
],
"test": {
"karma": {
"config": "./karma.conf.js"
}
},
"defaults": {
"styleExt": "scss",
"component": {}
}
],
"test": {
"karma": {
"config": "./karma.conf.js"
}
},
"defaults": {
"styleExt": "scss",
"component": {}
}
}

3
.floo Normal file
View File

@ -0,0 +1,3 @@
{
"url": "https://floobits.com/srcn/Fuse2"
}

7
.flooignore Normal file
View File

@ -0,0 +1,7 @@
extern
node_modules
tmp
vendor
.idea/workspace.xml
.idea/misc.xml
assets/.gitkeep

655
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -12,29 +12,30 @@
},
"private": true,
"dependencies": {
"@angular/animations": "^4.2.5",
"@angular/animations": "^4.2.6",
"@angular/cdk": "^2.0.0-beta.8",
"@angular/common": "^4.2.5",
"@angular/compiler": "^4.2.5",
"@angular/core": "^4.2.5",
"@angular/flex-layout": "^2.0.0-beta.8",
"@angular/forms": "^4.2.5",
"@angular/http": "^4.2.5",
"@angular/common": "^4.2.6",
"@angular/compiler": "^4.2.6",
"@angular/core": "^4.2.6",
"@angular/flex-layout": "^2.0.0-rc.1",
"@angular/forms": "^4.2.6",
"@angular/http": "^4.2.6",
"@angular/material": "^2.0.0-beta.8",
"@angular/platform-browser": "^4.2.5",
"@angular/platform-browser-dynamic": "^4.2.5",
"@angular/router": "^4.2.5",
"@angular/platform-browser": "^4.2.6",
"@angular/platform-browser-dynamic": "^4.2.6",
"@angular/router": "^4.2.6",
"core-js": "^2.4.1",
"hammerjs": "^2.0.8",
"rxjs": "^5.4.2",
"zone.js": "^0.8.4"
},
"devDependencies": {
"@angular/cli": "1.1.3",
"@angular/compiler-cli": "^4.0.0",
"@angular/language-service": "^4.0.0",
"@types/jasmine": "2.5.45",
"@types/node": "^6.0.79",
"@angular/cli": "^1.2.0",
"@angular/compiler-cli": "^4.2.6",
"@angular/language-service": "^4.2.6",
"@types/jasmine": "^2.5.53",
"@types/jasminewd2": "^2.0.2",
"@types/node": "^6.0.80",
"codelyzer": "~3.0.1",
"jasmine-core": "~2.6.2",
"jasmine-spec-reporter": "~4.1.0",

View File

@ -1,76 +1 @@
<ng-container *ngIf="layoutSettings.toolbar === 'above'">
<fuse-toolbar></fuse-toolbar>
</ng-container>
<ng-container *ngIf="layoutSettings.navigation === 'left'">
<md-sidenav-container id="wrapper" class="example-sidenav-fab-container" fxLayout="row" fxfill>
<md-sidenav #sidenav mode="side" opened="true" fxFlex="256px">
<fuse-navigation></fuse-navigation>
</md-sidenav>
<fuse-toolbar *ngIf="layoutSettings.toolbar === 'below'" class="" [sidenav]="sidenav"></fuse-toolbar>
<div id="content">
<router-outlet></router-outlet>
</div>
</md-sidenav-container>
</ng-container>
<ng-container *ngIf="layoutSettings.navigation === 'right'">
<md-sidenav-container id="wrapper" class="example-sidenav-fab-container" fxLayout="row" fxfill>
<fuse-toolbar *ngIf="layoutSettings.toolbar === 'below'" class="" [sidenav]="sidenav"></fuse-toolbar>
<div id="content">
<router-outlet></router-outlet>
<button md-mini-fab class="example-fab" (click)="sidenav.toggle()">
<md-icon>add</md-icon>
</button>
</div>
<md-sidenav #sidenav mode="side" align="end" opened="true" fxFlex="256px">
<fuse-navigation></fuse-navigation>
</md-sidenav>
</md-sidenav-container>
</ng-container>
<ng-container *ngIf="layoutSettings.navigation === 'top'">
<div id="wrapper" class="">
<div id="nav" class="">
<fuse-navigation></fuse-navigation>
</div>
<fuse-toolbar *ngIf="layoutSettings.toolbar === 'below'" class="" [sidenav]="sidenav"></fuse-toolbar>
<div id="content-wrapper" class="">
<div id="content">
<router-outlet></router-outlet>
</div>
</div>
</div>
</ng-container>
<!--
<pre>{{layoutSettings | json}}</pre>
<fuse-layout></fuse-layout>
<div class="example-container">
<h1>Fuse Component</h1>
<fuse-fuse name="Sercan" (nameChanged)="onNameChange()"></fuse-fuse>
<h1>Muse Component</h1>
<input type="text" [(ngModel)]="bgValue">
<fuse-muse [bgColor]="bgValue"></fuse-muse>
</div>
-->

View File

@ -1,32 +0,0 @@
import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';
describe('AppComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
AppComponent
],
}).compileComponents();
}));
it('should create the app', async(() => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy();
}));
it(`should have as title 'app'`, async(() => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app.title).toEqual('app');
}));
it('should render title in a h1 tag', async(() => {
const fixture = TestBed.createComponent(AppComponent);
fixture.detectChanges();
const compiled = fixture.debugElement.nativeElement;
expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!!');
}));
});

View File

@ -1,33 +1,30 @@
import {Component, ElementRef, OnInit, ViewChild} from '@angular/core';
import {LayoutService} from './core/services/layout.service';
import { Component, ElementRef, OnInit, Renderer2 } from '@angular/core';
@Component({
selector : 'fuse-root',
selector : 'body',
templateUrl: './app.component.html',
styleUrls : ['./app.component.scss'],
providers : [LayoutService]
styleUrls : ['./app.component.scss']
})
export class AppComponent implements OnInit
{
layoutSettings: { toolbar: any, navigation: any };
constructor(private layoutService: LayoutService)
constructor(
private _renderer: Renderer2,
private _elementRef: ElementRef
)
{
this.layoutSettings = layoutService.getSettings();
}
addClass(className: string)
{
this._renderer.addClass(this._elementRef.nativeElement, className);
}
removeClass(className: string)
{
this._renderer.removeClass(this._elementRef.nativeElement, className);
}
ngOnInit()
{
this.layoutService.settingsChanged
.subscribe(
(newSettings) =>
{
this.layoutSettings = newSettings;
}
)
}
onNameChange()
{
}

View File

@ -4,18 +4,28 @@ import 'hammerjs';
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import {AppComponent} from './app.component';
import {RouterModule, Routes} from '@angular/router';
import {LayoutComponent} from './core/layout/layout.component';
import {ToolbarComponent} from './toolbar/toolbar.component';
import {LayoutComponent} from './core/components/layout/layout.component';
import {MailModule} from './main/apps/mail/mail.module';
import {ChatModule} from './main/apps/chat/chat.module';
import {NavigationModule} from './navigation/navigation.module';
import {ProjectModule} from './main/apps/dashboards/project/project.module';
import {SharedModule} from './core/shared.module';
import {NavigationService} from './navigation/navigation.service';
import {CardedFullWidthModule} from './main/ui/page-layouts/carded/fullwidth/fullwidth.module';
import {LayoutService} from './core/services/layout.service';
import {NavbarComponent} from './core/components/layout/navbar/navbar.component';
import {ToolbarComponent} from './core/components/layout/toolbar/toolbar.component';
import {NavigationModule} from './core/components/navigation/navigation.module';
import {NavigationService} from './core/components/navigation/navigation.service';
import {SidenavComponent} from './core/components/sidenav/sidenav.component';
import {FuseMatchMedia} from './core/services/match-media.service';
import {NavbarToggleDirective} from './core/components/layout/navbar/navbar-toggle.directive';
import {NavbarService} from './core/components/layout/navbar/navbar.service';
import { ContentComponent } from './core/components/layout/content/content.component';
import { SharedModule } from './core/modules/shared.module';
const appRoutes: Routes = [
{path: '**', redirectTo: 'apps/dashboards/project'}
{
path : '**',
redirectTo: 'apps/dashboards/project'
}
];
@NgModule({
@ -23,22 +33,23 @@ const appRoutes: Routes = [
AppComponent,
LayoutComponent,
ToolbarComponent,
NavbarComponent,
SidenavComponent,
NavbarToggleDirective,
ContentComponent
],
imports : [
SharedModule,
BrowserModule,
BrowserAnimationsModule,
RouterModule.forRoot(
appRoutes,
{enableTracing: true} // <-- debugging purposes only
),
RouterModule.forRoot(appRoutes),
NavigationModule,
MailModule,
ChatModule,
ProjectModule,
CardedFullWidthModule
],
providers : [NavigationService],
providers : [NavigationService, LayoutService, FuseMatchMedia, NavbarService],
bootstrap : [AppComponent]
})
export class AppModule

View File

@ -1,5 +1 @@
<router-outlet></router-outlet>
<p>
layout works!
</p>

View File

@ -0,0 +1,3 @@
:host {
}

View File

@ -0,0 +1,19 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector : 'fuse-content',
templateUrl: './content.component.html',
styleUrls : ['./content.component.scss']
})
export class ContentComponent implements OnInit
{
constructor()
{
}
ngOnInit()
{
}
}

View File

@ -0,0 +1,27 @@
<!-- TOOLBAR: Above -->
<ng-container *ngIf="layoutSettings.toolbar === 'above'">
<fuse-toolbar></fuse-toolbar>
</ng-container>
<!-- / TOOLBAR: Above -->
<div id="wrapper">
<!-- NAVIGATION: Left -->
<ng-container *ngIf="layoutSettings.navigation === 'left'">
<fuse-navbar></fuse-navbar>
<div class="content-wrapper">
<ng-container *ngIf="layoutSettings.toolbar === 'below'">
<fuse-toolbar></fuse-toolbar>
</ng-container>
<fuse-content></fuse-content>
</div>
</ng-container>
<!-- / NAVIGATION: Left -->
</div>

View File

@ -0,0 +1,23 @@
:host {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
#wrapper {
display: flex;
.content-wrapper {
display: flex;
flex: 1;
fuse-content {
display: flex;
width: 100%;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
}
}
}
}

View File

@ -0,0 +1,30 @@
import { Component, OnInit } from '@angular/core';
import { LayoutService } from '../../services/layout.service';
@Component({
selector : 'fuse-layout',
templateUrl: './layout.component.html',
styleUrls : ['./layout.component.scss']
})
export class LayoutComponent implements OnInit
{
layoutSettings: { toolbar: any, navigation: any };
constructor(private layoutService: LayoutService)
{
this.layoutSettings = layoutService.getSettings();
}
ngOnInit()
{
this.layoutService.onSettingsChanged
.subscribe(
(newSettings) =>
{
this.layoutSettings = newSettings;
}
);
}
}

View File

@ -0,0 +1,27 @@
import {Directive, HostListener, Input} from '@angular/core';
import {NavbarService} from './navbar.service';
import {NavbarComponent} from './navbar.component';
@Directive({
selector: '[fuseNavbar]',
})
export class NavbarToggleDirective
{
@Input() fuseNavbar: string;
navbar: NavbarComponent;
constructor(navbar: NavbarService)
{
this.navbar = navbar.getNavBar();
}
@HostListener('click')
onMouseEnter()
{
if ( !this.navbar[this.fuseNavbar] )
{
return;
}
this.navbar[this.fuseNavbar]();
}
}

View File

@ -0,0 +1,17 @@
<div class="navbar-header">
<div class="logo">
<span class="logo-icon">F</span><span class="logo-text">FUSE</span>
</div>
<button md-button class="toggle-button-navbar mat-icon-button" fuseNavbar="toggleFold" fxHide.xs>
<md-icon>menu</md-icon>
</button>
<button md-button class="toggle-button-navbar mat-icon-button" fuseNavbar="closeBar" fxHide.gt-xs>
<md-icon>arrow_back</md-icon>
</button>
</div>
<fuse-navigation></fuse-navigation>

View File

@ -0,0 +1,86 @@
@import "../../../scss/fuse";
:host {
display: block;
width: 256px;
height: 100%;
background-color: #FFFFFF;
overflow-y: auto;
overflow-x: hidden;
z-index: 20;
box-shadow: 0 5px 5px -3px rgba(0, 0, 0, .2), 0 8px 10px 1px rgba(0, 0, 0, .14), 0 3px 14px 2px rgba(0, 0, 0, .12);
transition: all .3s cubic-bezier(.55, 0, .55, .2), width .1s linear, min-width .1s linear, max-width .1s linear;
transform: translateX(0);
&.folded {
position: absolute;
&:not(.folded-open) {
width: 64px !important;
min-width: 64px !important;
max-width: 64px !important;
}
&.folded-open {
}
}
&.open {
transform: translateX(0) !important;
}
&.close {
transform: translateX(-100%) !important;
}
@include media-breakpoint('xs') {
position: absolute;
top: 0;
left: 0;
bottom: 0;
transform: translateX(-100%);
}
.navbar-header {
padding: 0 16px 0 24px;
display: flex;
align-items: center;
height: 64px;
justify-content: space-between;
.logo {
display: flex;
align-items: center;
.logo-icon {
display: block;
background: #039BE5;
width: 32px;
min-width: 32px;
height: 32px;
line-height: 32px;
text-align: center;
font-size: 16px;
font-weight: 500;
color: #FFF;
border-radius: 2px;
}
.logo-text {
margin-left: 16px;
font-size: 16px;
}
}
.toggle-button-navbar {
/* border-radius: 50%;
position: relative;
cursor: pointer;
width: 32px;
height: 32px;
padding: 4px;
box-sizing: border-box;*/
}
}
}

View File

@ -0,0 +1,125 @@
import {AfterViewInit, Component, ElementRef, HostBinding, HostListener, OnDestroy, OnInit} from '@angular/core';
import {AppComponent} from '../../../../app.component';
import {Subscription} from 'rxjs/Subscription';
import {MatchMedia, MediaChange, MediaMonitor, ObservableMedia} from '@angular/flex-layout';
import {FuseMatchMedia} from '../../../services/match-media.service';
import {NavbarService} from './navbar.service';
@Component({
selector : 'fuse-navbar',
templateUrl: './navbar.component.html',
styleUrls : ['./navbar.component.scss']
})
export class NavbarComponent implements OnInit, OnDestroy
{
@HostBinding('class.close') isClosed: boolean;
@HostBinding('class.open') isOpened: boolean = !this.isClosed;
@HostBinding('class.folded') isFoldedActive: boolean;
@HostBinding('class.folded-open') isFoldedOpen: boolean;
matchMediaWatcher: Subscription;
constructor(private elementRef: ElementRef,
private bodyEl: AppComponent,
private observableMedia: ObservableMedia,
private fuseMatchMedia: FuseMatchMedia,
private navBarService: NavbarService)
{
navBarService.setNavBar(this);
this.isClosed = false;
this.isFoldedActive = false;
this.isFoldedOpen = false;
this.updateCssClasses();
this.matchMediaWatcher = this.fuseMatchMedia.onMediaChange.subscribe((mediaStep) =>
{
console.warn('Media step changed:', mediaStep);
if ( mediaStep === 'xs' )
{
this.closeBar();
}
else
{
this.openBar();
}
});
}
openBar()
{
console.info('opened');
this.isClosed = false;
this.updateCssClasses();
}
closeBar()
{
console.info('closed');
this.isClosed = true;
this.updateCssClasses();
}
toggleBar()
{
if ( this.isClosed )
{
this.openBar();
}
else
{
this.closeBar();
}
}
toggleFold()
{
if ( !this.isFoldedActive )
{
this.isFoldedActive = true;
this.bodyEl.addClass('fuse-nav-bar-folded');
}
else
{
this.isFoldedActive = false;
this.bodyEl.removeClass('fuse-nav-bar-folded');
}
this.isFoldedOpen = false;
}
@HostListener('mouseenter')
onMouseEnter()
{
this.isFoldedOpen = true;
}
@HostListener('mouseleave')
onMouseLeave()
{
this.isFoldedOpen = false;
}
updateCssClasses()
{
if ( this.isClosed )
{
this.bodyEl.addClass('fuse-nav-bar-opened');
this.bodyEl.removeClass('fuse-nav-bar-closed');
}
else
{
this.bodyEl.addClass('fuse-nav-bar-closed');
this.bodyEl.removeClass('fuse-nav-bar-opened');
}
}
ngOnInit()
{
}
ngOnDestroy()
{
this.matchMediaWatcher.unsubscribe();
}
}

View File

@ -0,0 +1,21 @@
import {EventEmitter, Injectable} from '@angular/core';
@Injectable()
export class NavbarService
{
navBarRef;
constructor()
{
}
setNavBar(ref)
{
this.navBarRef = ref;
}
getNavBar()
{
return this.navBarRef;
}
}

View File

@ -0,0 +1,9 @@
<md-toolbar>
<button md-button class="toggle-button-navbar mat-icon-button" fuseNavbar="openBar" fxHide.gt-xs>
<md-icon>menu</md-icon>
</button>
<span>Toolbar</span>
</md-toolbar>

View File

@ -1,4 +1,4 @@
import {Component, Input, OnInit} from '@angular/core';
import { Component, Input, OnInit } from '@angular/core';
@Component({
selector : 'fuse-toolbar',
@ -16,5 +16,4 @@ export class ToolbarComponent implements OnInit
ngOnInit()
{
}
}

View File

@ -13,7 +13,8 @@
&.open {
.nav-link {
> .nav-link {
.collapse-arrow {
transform: rotate(90deg);
}

View File

@ -1,7 +1,7 @@
import {Component, HostBinding, Input, OnInit} from '@angular/core';
import {NavigationService} from '../navigation.service';
import {NavigationEnd, Router} from '@angular/router';
import {Animations} from '../../core/animations';
import {Animations} from '../../../animations';
@Component({
selector : 'fuse-nav-collapse',

View File

@ -1,4 +1,4 @@
@import '../../theme-config';
@import 'src/app/core/scss/fuse';
#main-navigation {
margin: 0;
@ -11,6 +11,7 @@
color: rgba(0, 0, 0, .54);
font-weight: 500;
padding-left: 24px;
white-space: nowrap;
}
.nav-item {
@ -26,9 +27,11 @@
background-color: map-get($background, raised-button);
color: map_get($foreground, text);
cursor: pointer;
user-select: none;
> span {
flex: 1;
white-space: nowrap;
}
&:hover {

View File

@ -1,5 +1,5 @@
import {NgModule} from '@angular/core';
import {SharedModule} from '../core/shared.module';
import {SharedModule} from '../../modules/shared.module';
import {RouterModule, Routes} from '@angular/router';
import {NavSubheaderComponent} from './nav-subheader/nav-subheader.component';
import {NavigationComponent} from './navigation.component';

View File

@ -0,0 +1,16 @@
<p>
sidenav works!
</p>
<div class.md="red-bg" class.lg="green-bg">
sidenav works!
<br>
sidenav works!
<br>
sidenav works!
<br>
sidenav works!
<br>
sidenav works!
</div>

View File

@ -0,0 +1,28 @@
@import "src/app/core/scss/fuse";
:host {
display: block;
position: absolute;
width: 320px;
height: 100%;
background: grey;
right: 0;
top: 0;
overflow-y: auto;
@include media-breakpoint('sm') {
background: white;
}
@include media-breakpoint('md') {
background: red;
}
@include media-breakpoint('lg') {
background: green;
}
@include media-breakpoint('gt-lg') {
background: white;
}
}

View File

@ -0,0 +1,45 @@
import { Component, ElementRef, HostBinding, OnInit } from '@angular/core';
import { style, animate, sequence, AnimationBuilder, AnimationPlayer } from '@angular/animations';
import { AppComponent } from '../../../app.component';
@Component({
selector : 'fuse-sidenav',
templateUrl: './sidenav.component.html',
styleUrls : ['./sidenav.component.scss']
})
export class SidenavComponent implements OnInit
{
constructor(private elementRef: ElementRef,
private animationBuilder: AnimationBuilder,
private bodyEl: AppComponent)
{
}
closeBar()
{
this.animationBuilder
.build([
style({transform: 'translate3d(0,0,0)'}),
animate('400ms ease', style({transform: 'translate3d(100%,0,0)'}))
])
.create(this.elementRef.nativeElement)
.play();
}
openBar()
{
this.animationBuilder
.build([
style({transform: 'translate3d(100%,0,0)'}),
animate('400ms ease', style({transform: 'translate3d(0,0,0)'}))
])
.create(this.elementRef.nativeElement)
.play();
}
ngOnInit()
{
}
}

View File

@ -1,25 +0,0 @@
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 be created', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,15 +0,0 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'fuse-layout',
templateUrl: './layout.component.html',
styleUrls: ['./layout.component.scss']
})
export class LayoutComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}

View File

@ -0,0 +1,22 @@
// Fuse
@import "fuse";
// Theming
@include mat-core();
// Include theme styles for core and each component used in your app.
// Alternatively, you can import and @include the theme mixins for each component
// that you are using.
@include angular-material-theme($theme);
// Override typography CSS classes (e.g., mat-h1, mat-display-1, mat-typography, etc.).
@include mat-base-typography($custom-typography);
// Override typography for a specific Angular Material components.
@include mat-checkbox-typography($custom-typography);
// Override typography for all Angular Material, including mat-base-typography and all components.
@include angular-material-typography($custom-typography);
// Partials

View File

@ -0,0 +1,5 @@
// Variables
@import "variables/theme-variables";
// Mixins
@import "mixins/breakpoints";

View File

@ -0,0 +1,24 @@
// Media step breakpoint mixin based on Angular Material lib
$breakpoints: (
xs: 'screen and (max-width: 599px)',
gt-xs: 'screen and (min-width: 600px)',
sm: 'screen and (min-width: 600px) and (max-width: 959px)',
gt-sm: 'screen and (min-width: 960px)',
md: 'screen and (min-width: 960px) and (max-width: 1279px)',
gt-md: 'screen and (min-width: 1280px)',
lg: 'screen and (min-width: 1280px) and (max-width: 1919px)',
gt-lg: 'screen and (min-width: 1920px)',
xl: 'screen and (min-width: 1920px) and (max-width: 5000px)'
) !default;
@mixin media-breakpoint($breakpointName) {
$mediaQuery: map_get($breakpoints, $breakpointName);
@if ($mediaQuery != null) {
@media #{$mediaQuery} {
@content
}
}
}

View File

@ -0,0 +1,17 @@
@import '~@angular/material/theming';
$primary: mat-palette($mat-indigo);
$accent: mat-palette($mat-blue, A200, A100, A400);
// The warn palette is optional (defaults to red).
$warn: mat-palette($mat-red);
// Create the theme object (a Sass map containing all of the palettes).
$theme: mat-light-theme($primary, $accent, $warn);
$custom-typography: mat-typography-config(
$font-family: 'Roboto, "Helvetica Neue", sans-serif'
);
$background: map-get($theme, background);
$foreground: map-get($theme, foreground);

View File

@ -1,25 +1,26 @@
import {EventEmitter, Injectable} from '@angular/core';
import {NavigationStart, Router} from '@angular/router';
import { EventEmitter, Injectable } from '@angular/core';
import { NavigationStart, Router } from '@angular/router';
@Injectable()
export class LayoutService
{
defaultSettings: { toolbar: string, navigation: string };
settings: { toolbar: string, navigation: string };
onSettingsChanged = new EventEmitter<{ toolbar: string, navigation: string }>();
/**
* Default Settings
* @type {{navigation: string; toolbar: string}}
* @param router
*/
defaultSettings = {
navigation: 'left', // 'right', 'left', 'top', false
toolbar : 'above' // 'above', 'below', false
}
settings;
settingsChanged = new EventEmitter<{ toolbar: any, navigation: any }>()
constructor(private router: Router)
{
// Asign default settings at the init
// Set the default settings
this.defaultSettings = {
navigation: 'left', // 'right', 'left', 'top', false
toolbar : 'above' // 'above', 'below', false
};
// Assign default settings at the init
this.settings = {...this.defaultSettings};
// Reset the default settings whenever navigation starts
@ -29,9 +30,8 @@ export class LayoutService
if ( event instanceof NavigationStart )
{
this.settings = {...this.defaultSettings};
this.settingsChanged.emit(this.settings);
this.onSettingsChanged.emit(this.settings);
}
}
);
}
@ -52,7 +52,6 @@ export class LayoutService
setSettings(newSettings)
{
Object.assign(this.settings, newSettings);
this.settingsChanged.emit(this.settings);
// console.log('settings changed');
this.onSettingsChanged.emit(this.settings);
}
}

View File

@ -0,0 +1,77 @@
import { MediaChange, MediaMonitor, ObservableMedia } from '@angular/flex-layout';
import { Observable } from 'rxjs/Observable';
import { Observer } from 'rxjs/Observer';
import { EventEmitter, Injectable } from '@angular/core';
import 'rxjs/add/operator/filter';
import { Subscription } from 'rxjs/Subscription';
@Injectable()
export class FuseMatchMedia
{
activeMediaQuery: string;
onMediaChange: Observable<string>;
// onMediaChange = new EventEmitter<string>();
watcher: Subscription;
constructor(private observableMedia: ObservableMedia,
private mediaMonitor: MediaMonitor)
{
this.activeMediaQuery = '';
this.onMediaChange = Observable.create((observer: Observer<string>) =>
{
this.observableMedia.subscribe((change: MediaChange) =>
{
if ( this.activeMediaQuery !== change.mqAlias )
{
this.activeMediaQuery = change.mqAlias;
observer.next(this.activeMediaQuery);
console.warn('From observableMedia:', change.mqAlias);
}
});
});
/*
this.mediaMonitor.observe('xs').subscribe((change: MediaChange) =>
{
console.warn('From mediaMonitor:', change);
if ( this.activeMediaQuery !== change.mqAlias )
{
// this.activeMediaQuery = change.mqAlias;
// this.onMediaChange.emit(this.activeMediaQuery);
}
});*/
/* this.observableMedia.subscribe((change: MediaChange) =>
{
console.warn('From observableMedia:', change.mqAlias);
if ( this.activeMediaQuery !== change.mqAlias )
{
this.activeMediaQuery = change.mqAlias;
this.onMediaChange.emit(this.activeMediaQuery);
}
});*/
/*this.observableMedia.asObservable()
.filter((change: MediaChange) => change.mqAlias === 'xs')
.subscribe(() =>
{
console.warn('From observableMedia:', this.activeMediaQuery);
this.onMediaChange.emit(this.activeMediaQuery);
});*/
/* this.watcher = this.observableMedia.subscribe((change: MediaChange) =>
{
this.activeMediaQuery = change ? `'${change.mqAlias}' = (${change.mediaQuery})` : '';
console.warn('From Watcher:', change.mqAlias);
});*/
}
}

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ChatComponent } from './chat.component';
describe('ChatComponent', () => {
let component: ChatComponent;
let fixture: ComponentFixture<ChatComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ChatComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ChatComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,5 +1,5 @@
import {NgModule} from '@angular/core';
import {SharedModule} from '../../../core/shared.module';
import {SharedModule} from '../../../core/modules/shared.module';
import {RouterModule, Routes} from '@angular/router';
import {ChatComponent} from './chat.component';
@ -7,7 +7,7 @@ const routes: Routes = [
{
path: 'apps/chat', component: ChatComponent, children: []
}
]
];
@NgModule({
imports : [

View File

@ -0,0 +1,4 @@
:host {
display: flex;
flex: 1;
}

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ProjectComponent } from './project.component';
describe('ProjectComponent', () => {
let component: ProjectComponent;
let fixture: ComponentFixture<ProjectComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ProjectComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ProjectComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,7 +1,7 @@
import {NgModule} from '@angular/core';
import {RouterModule, Routes} from '@angular/router';
import {ProjectComponent} from './project.component';
import {SharedModule} from '../../../../core/shared.module';
import {SharedModule} from '../../../../core/modules/shared.module';
const routes: Routes = [
{

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MailComponent } from './mail.component';
describe('MailComponent', () => {
let component: MailComponent;
let fixture: ComponentFixture<MailComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ MailComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MailComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,17 +1,23 @@
import {NgModule} from '@angular/core';
import {SharedModule} from '../../../core/shared.module';
import {RouterModule, Routes} from '@angular/router';
import {MailComponent} from './mail.component';
import {MainSidenavComponent} from './sidenavs/main/main-sidenav.component';
import {ClassicViewComponent} from './views/classic/classic-view.component';
import { NgModule } from '@angular/core';
import { SharedModule } from '../../../core/modules/shared.module';
import { RouterModule, Routes } from '@angular/router';
import { MailComponent } from './mail.component';
import { MainSidenavComponent } from './sidenavs/main/main-sidenav.component';
import { ClassicViewComponent } from './views/classic/classic-view.component';
const routes: Routes = [
{
path: 'apps/mail', component: MailComponent, children: [
{path: '', component: ClassicViewComponent, outlet: 'view'}
]
path : 'apps/mail',
component: MailComponent,
children : [
{
path : '',
component: ClassicViewComponent,
outlet : 'view'
}
]
}
]
];
@NgModule({
imports : [

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MainSidenavComponent } from './main-sidenav.component';
describe('MainSidenavComponent', () => {
let component: MainSidenavComponent;
let fixture: ComponentFixture<MainSidenavComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ MainSidenavComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MainSidenavComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ClassicViewComponent } from './classic-view.component';
describe('ClassicViewComponent', () => {
let component: ClassicViewComponent;
let fixture: ComponentFixture<ClassicViewComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ClassicViewComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ClassicViewComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ChatComponent } from './fullwidth.component';
describe('ChatComponent', () => {
let component: ChatComponent;
let fixture: ComponentFixture<ChatComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ChatComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ChatComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,7 +1,7 @@
import {NgModule} from '@angular/core';
import {RouterModule, Routes} from '@angular/router';
import {CardedFullWidthComponent} from './fullwidth.component';
import {SharedModule} from '../../../../../core/shared.module';
import {SharedModule} from '../../../../../core/modules/shared.module';
const routes: Routes = [
{

View File

@ -1,9 +0,0 @@
<md-toolbar>
<a md-mini-fab class="sidenav-toggle-button" (click)="sidenav.toggle()">
<md-icon>menu</md-icon>
</a>
<span>Toolbar</span>
</md-toolbar>

View File

@ -17,8 +17,7 @@
<body class="mat-body">
<fuse-root></fuse-root>
</body>
</html>

View File

@ -1,33 +1,19 @@
@import './theme-config';
// Plus imports for other components in your app.
// Include the common styles for Angular Material. We include this here so that you only
// have to load a single css file for Angular Material in your app.
// Be sure that you only ever include this mixin once!
// Include theme styles for core and each component used in your app.
// Alternatively, you can import and @include the theme mixins for each component
// that you are using.
@include angular-material-theme($theme);
// Override typography CSS classes (e.g., mat-h1, mat-display-1, mat-typography, etc.).
@include mat-base-typography($custom-typography);
// Override typography for a specific Angular Material components.
@include mat-checkbox-typography($custom-typography);
// Override typography for all Angular Material, including mat-base-typography and all components.
@include angular-material-typography($custom-typography);
html {
}
// Import Fuse main library
@import "app/core/scss/core";
html, body {
margin: 0;
}
html, body, fuse-root, #wrapper, #content, .mat-sidenav-content {
width: 100%;
height: 100%;
overflow: hidden;
}
body {
&.fuse-nav-bar-folded {
.content-wrapper {
padding-left: 64px;
}
}
}

View File

@ -1,26 +0,0 @@
@import '~@angular/material/theming';
// Plus imports for other components in your app.
// Include the common styles for Angular Material. We include this here so that you only
// have to load a single css file for Angular Material in your app.
// Be sure that you only ever include this mixin once!
@include mat-core();
// Define the palettes for your theme using the Material Design palettes available in palette.scss
// (imported above). For each palette, you can optionally specify a default, lighter, and darker
// hue.
$primary: mat-palette($mat-indigo);
$accent: mat-palette($mat-blue, A200, A100, A400);
// The warn palette is optional (defaults to red).
$warn: mat-palette($mat-red);
// Create the theme object (a Sass map containing all of the palettes).
$theme: mat-light-theme($primary, $accent, $warn);
$custom-typography: mat-typography-config(
$font-family: 'Roboto, "Helvetica Neue", sans-serif'
);
$background: map-get($theme, background);
$foreground: map-get($theme, foreground);

View File

@ -1,135 +1,130 @@
{
"rulesDirectory": [
"node_modules/codelyzer"
],
"rules": {
"arrow-return-shorthand": true,
"callable-types": true,
"class-name": true,
"comment-format": [
true,
"check-space"
"rulesDirectory": [
"node_modules/codelyzer"
],
"curly": true,
"eofline": true,
"forin": true,
"import-blacklist": [
true,
"rxjs"
],
"import-spacing": true,
"indent": [
true,
"spaces"
],
"interface-over-type-literal": true,
"label-position": true,
"max-line-length": [
true,
140
],
"member-access": false,
"member-ordering": [
true,
"static-before-instance",
"variables-before-functions"
],
"no-arg": true,
"no-bitwise": true,
"no-console": [
true,
"debug",
"info",
"time",
"timeEnd",
"trace"
],
"no-construct": true,
"no-debugger": true,
"no-duplicate-super": true,
"no-empty": false,
"no-empty-interface": true,
"no-eval": true,
"no-inferrable-types": [
true,
"ignore-params"
],
"no-misused-new": true,
"no-non-null-assertion": true,
"no-shadowed-variable": true,
"no-string-literal": false,
"no-string-throw": true,
"no-switch-case-fall-through": true,
"no-trailing-whitespace": true,
"no-unnecessary-initializer": true,
"no-unused-expression": true,
"no-use-before-declare": true,
"no-var-keyword": true,
"object-literal-sort-keys": false,
"one-line": [
true,
//"check-open-brace",
"check-catch",
"check-else",
"check-whitespace"
],
"prefer-const": true,
"quotemark": [
true,
"single"
],
"radix": true,
"semicolon": [
"always"
],
"triple-equals": [
true,
"allow-null-check"
],
"typedef-whitespace": [
true,
{
"call-signature": "nospace",
"index-signature": "nospace",
"parameter": "nospace",
"property-declaration": "nospace",
"variable-declaration": "nospace"
}
],
"typeof-compare": true,
"unified-signatures": true,
"variable-name": false,
"whitespace": [
true,
"check-branch",
"check-decl",
"check-operator",
"check-separator",
"check-type"
],
"directive-selector": [
true,
"attribute",
"fuse",
"camelCase"
],
"component-selector": [
true,
"element",
"fuse",
"kebab-case"
],
"use-input-property-decorator": true,
"use-output-property-decorator": true,
"use-host-property-decorator": true,
"no-input-rename": true,
"no-output-rename": true,
"use-life-cycle-interface": true,
"use-pipe-transform-interface": true,
"component-class-suffix": true,
"directive-class-suffix": true,
"no-access-missing-member": true,
"templates-use-public": true,
"invoke-injectable": true
}
"rules": {
"arrow-return-shorthand": true,
"callable-types": true,
"class-name": true,
"comment-format": [
true,
"check-space"
],
"curly": true,
"eofline": true,
"forin": true,
"import-blacklist": [
true,
"rxjs"
],
"import-spacing": true,
"indent": [
true,
"spaces"
],
"interface-over-type-literal": true,
"label-position": true,
"max-line-length": [
true,
120
],
"member-access": false,
"member-ordering": [
true,
"static-before-instance",
"variables-before-functions"
],
"no-arg": true,
"no-bitwise": true,
"no-console": [
true,
"debug",
"info",
"time",
"timeEnd",
"trace"
],
"no-construct": true,
"no-debugger": true,
"no-duplicate-super": true,
"no-empty": false,
"no-empty-interface": true,
"no-eval": true,
"no-inferrable-types": [
true,
"ignore-params"
],
"no-misused-new": true,
"no-non-null-assertion": true,
"no-shadowed-variable": true,
"no-string-literal": false,
"no-string-throw": true,
"no-switch-case-fall-through": true,
"no-trailing-whitespace": false,
"no-unnecessary-initializer": true,
"no-unused-expression": true,
"no-use-before-declare": true,
"no-var-keyword": true,
"object-literal-sort-keys": false,
"one-line": false,
"prefer-const": true,
"quotemark": [
true,
"single"
],
"radix": true,
"semicolon": [
true,
"always"
],
"triple-equals": [
true,
"allow-null-check"
],
"typedef-whitespace": [
true,
{
"call-signature": "nospace",
"index-signature": "nospace",
"parameter": "nospace",
"property-declaration": "nospace",
"variable-declaration": "nospace"
}
],
"typeof-compare": true,
"unified-signatures": true,
"variable-name": false,
"whitespace": [
true,
"check-branch",
"check-decl",
"check-operator",
"check-separator",
"check-type"
],
"directive-selector": [
true,
"attribute",
"fuse",
"camelCase"
],
"component-selector": [
true,
"element",
"fuse",
"kebab-case"
],
"use-input-property-decorator": true,
"use-output-property-decorator": true,
"use-host-property-decorator": true,
"no-input-rename": true,
"no-output-rename": true,
"use-life-cycle-interface": true,
"use-pipe-transform-interface": true,
"component-class-suffix": true,
"directive-class-suffix": true,
"no-access-missing-member": true,
"templates-use-public": true,
"invoke-injectable": true
}
}