Compare commits

..

56 Commits

Author SHA1 Message Date
mustafahlvc
21c96c76da Merge remote-tracking branch 'origin/master' 2017-09-22 16:18:24 +03:00
mustafahlvc
5e2e2b7d53 Backdrop added to FuseNavBar for mobile 2017-09-22 16:18:05 +03:00
Sercan Yemen
dcff423943 Updated version to 1.1.0 since we have couple breaking changes! 2017-09-22 16:07:05 +03:00
Sercan Yemen
6747610771 Fixed: Fullwidth simple page layout doesn't scroll
+ Added: New logo to the various pages
+ Fixed: Mobile zoom is not disabled
+ Fixed: Profile timeline mobile order is not correct
+ Fixed: Quickpanel focusses to the form elements causing it to scroll on mobile devices when opened
+ Various demo page mobile fixes
2017-09-22 16:04:59 +03:00
Sercan Yemen
e6ee5d017e small tweaks and ng-* cleanups
+ Fixed: todo item action buttons shouldn't trigger "view todo" action
+ Fixed: contacts selected bar mobile issues
2017-09-22 15:02:07 +03:00
Sercan Yemen
cb2b544526 chat, todo & theme options tweaks 2017-09-22 12:11:21 +03:00
mustafahlvc
5ace09f782 Calendar, Contacts, Mail, Scrumboard apps responsive refinements,
+ temporary fix for md-sidenav-locked transition
2017-09-22 12:03:21 +03:00
Sercan Yemen
678dde8c0e calendar, mail and todo tweaks 2017-09-22 11:32:31 +03:00
Sercan Yemen
236cf1eb06 renamed the HMR starting scripts
+ modified the build scripts to use more memory. If you are having `out of memory` issues while building, use these scripts
2017-09-22 11:32:08 +03:00
Sercan Yemen
f4efbe07f7 Merge branch 'master' of https://github.com/withinpixels/fuse2 2017-09-22 09:23:38 +03:00
mustafahlvc
671287b55a Reverting the sidenav fixes.. 2017-09-21 19:03:19 +03:00
Sercan Yemen
19c85c964b updated the version number to 1.0.6 2017-09-21 15:54:25 +03:00
Sercan Yemen
e5cf4fdafb demo component and service page updates 2017-09-21 15:54:11 +03:00
Sercan Yemen
098dacf2a5 removed console warn 2017-09-21 15:13:27 +03:00
mustafahlvc
2f8539e987 Merge remote-tracking branch 'origin/master' 2017-09-21 15:05:36 +03:00
mustafahlvc
f688a58656 Animations enhanced for all apps and some pages. 2017-09-21 15:05:18 +03:00
Sercan Yemen
9cb8c0c96b Added a way to swap navigation model on the fly
Moved the navigation service to the app.module since we need it to be a singleton at all times
2017-09-21 14:56:08 +03:00
Sercan Yemen
05575d3f82 Fixed: Navigation model must be public 2017-09-21 14:08:37 +03:00
Sercan Yemen
b9198e3717 Entirely changed the navigation model structure (sorry!)
+ Fixed: Horizontal and Vertical navigation must be able to use the same model structure
+ Fixed: Collapsable nav item that has the active menu shouldn't be collapsed when other collapsables toggles
2017-09-21 12:08:52 +03:00
Sercan Yemen
769e67c2f3 Added HMR config. Use 'npm run hmr' for HMR enabled environment. This start script disables the sourcemaps to further increase the re-compile performance. If you need HMR with sourcemaps use 'npm run hmrs' 2017-09-21 10:58:19 +03:00
Sercan Yemen
32960abd7c fixed sidenav for fuse https://github.com/angular/material2/issues/7201 2017-09-20 17:38:14 +03:00
Sercan Yemen
126e32d9e7 updated Angular to 4.4.3 2017-09-20 10:06:43 +03:00
Sercan Yemen
d6d74cb998 small tweaks 2017-09-20 10:06:28 +03:00
Sercan Yemen
6d20c1d62d Custom perfect-scrollbar directive for better control (replaced the ngx-perfect-scrollbar with fuse-perfect-scrollbar) 2017-09-18 16:06:15 +03:00
Sercan Yemen
b55bce2de4 fixed: navigation collapsable issue on route change
fixed: footer stays on top of the navigation on mobile
2017-09-18 15:58:47 +03:00
Sercan Yemen
6f4dc36a3d locked dev dependency versions to prevent "npm update" errors! 2017-09-18 10:48:02 +03:00
Sercan Yemen
fe7e6d173b small tweaks and clean-ups 2017-09-18 10:47:35 +03:00
Sercan Yemen
b377d99c66 new fuse logo 2017-09-18 10:47:08 +03:00
Sercan Yemen
d4374e6df0 changed 'perfect-scrollbar' to 'perfectScrollbar' 2017-09-18 10:46:09 +03:00
Sercan Yemen
c74fad84b6 Merge branch 'master' of https://github.com/withinpixels/fuse2 2017-09-18 10:25:04 +03:00
mustafahlvc
e09ef05e02 (ngx-perfect-scroolbar) updated to v.4.6.2 2017-09-15 17:40:38 +03:00
Sercan Yemen
2c0fc76b8a meta tags and description for demo 2017-09-12 14:23:54 +03:00
Sercan Yemen
752660f5dc fix: theme options are not correctly shown on mobile 2017-09-12 10:25:11 +03:00
Sercan Yemen
01f00121ba Revert "removed md2 + replaced the date/time picker in scrumboard"
This reverts commit dde2333
2017-09-11 16:33:20 +03:00
Sercan Yemen
dde2333c8a removed md2
+ replaced the date/time picker in scrumboard
2017-09-11 16:19:46 +03:00
Sercan Yemen
babf6dc47b updated the readme 2017-09-11 13:06:24 +03:00
Sercan Yemen
55288bbbd4 set the correct default values for layout
+ increased the version number
2017-09-11 12:59:13 +03:00
Sercan Yemen
7297a9b4a4 toolbar adjustments 2017-09-11 12:34:16 +03:00
Sercan Yemen
4cbbd3a1d6 Merge branch 'master' of https://github.com/withinpixels/fuse2 2017-09-11 12:30:07 +03:00
Sercan Yemen
2f4ce6221e horizontal navigation layout
+ added boxed layout option
+ added a close overlay to theme options
+ moved the buy button to the footer
+ added fade-in-out animation
+ File Manager app min row height
2017-09-11 12:30:01 +03:00
mustafahlvc
44cdadaec9 (Scrumboard, Chat) some css style refinements 2017-09-08 19:21:35 +03:00
Sercan Yemen
d5b6dea1a2 update version 2017-08-30 20:52:08 +03:00
Sercan Yemen
31087186f7 Merge branch 'scrumboard-app' 2017-08-30 20:03:21 +03:00
Sercan Yemen
48a47a0876 sidenav helper small tweaks
+ chat & toolbar small mobile tweaks
2017-08-30 20:02:54 +03:00
Sercan Yemen
e0a85a19db package lock 2017-08-30 20:01:45 +03:00
mustafahlvc
b21526410a (Scrumboard) final touches.. 2017-08-30 18:46:07 +03:00
mustafahlvc
ce6797a80b (Scrumboard) Drag-drop support 2017-08-30 15:58:40 +03:00
mustafahlvc
7d5693421f Merge branch 'master' into scrumboard-app
# Conflicts:
#	package.json
2017-08-30 15:11:21 +03:00
mustafahlvc
9106fcd066 Merge branch 'master' into scrumboard-app
# Conflicts:
#	package.json
2017-08-30 15:11:07 +03:00
mustafahlvc
58bdf07da0 Style fixes especially for Edge/IE Browser 2017-08-30 15:04:20 +03:00
Sercan Yemen
58291058ae update version number 2017-08-30 14:42:55 +03:00
Sercan Yemen
9ae746a3ed fix: revert back to Angular 4.3.5 since the animations are not working correctly on 4.3.6 2017-08-30 14:36:54 +03:00
Sercan Yemen
a7549a1770 fix: pages not scrolling on various browsers 2017-08-30 14:26:45 +03:00
mustafahlvc
0bf158f8a5 (Scrumboard) board settings added + some refinements. 2017-08-30 14:21:14 +03:00
mustafahlvc
a0da9bd81e Merge branch 'master' into scrumboard-app
# Conflicts:
#	package.json
#	src/app/core/modules/shared.module.ts
2017-08-30 14:19:45 +03:00
mustafahlvc
cd99fbf77a (Scrumboard App) added
+ md2 added for date-time picker,
+ toggleInArray func added to FuseUtils
2017-08-30 06:54:11 +03:00
266 changed files with 9179 additions and 3468 deletions

View File

@@ -25,6 +25,7 @@
"environmentSource": "environments/environment.ts", "environmentSource": "environments/environment.ts",
"environments": { "environments": {
"dev": "environments/environment.ts", "dev": "environments/environment.ts",
"hmr": "environments/environment.hmr.ts",
"prod": "environments/environment.prod.ts" "prod": "environments/environment.prod.ts"
} }
} }

View File

@@ -1,6 +1,6 @@
# Fuse2 # Fuse2
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.1.3. Material Design Admin Template with Angular 4+ and Angular Material 2
## Development server ## Development server
@@ -22,7 +22,3 @@ Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.
Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
Before running the tests make sure you are serving the app via `ng serve`. Before running the tests make sure you are serving the app via `ng serve`.
## Further help
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).

2102
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,29 +1,32 @@
{ {
"name": "fuse2", "name": "fuse2",
"version": "1.0.2", "version": "1.1.0",
"license": "", "license": "",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve", "start": "ng serve",
"build": "ng build", "start-hmr": "ng serve --hmr -e=hmr -sm=false",
"start-hmr-sourcemaps": "ng serve --hmr -e=hmr",
"build": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build",
"build-prod": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build --prod",
"test": "ng test", "test": "ng test",
"lint": "ng lint", "lint": "ng lint",
"e2e": "ng e2e" "e2e": "ng e2e"
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular/animations": "4.3.6", "@angular/animations": "4.4.3",
"@angular/cdk": "2.0.0-beta.10", "@angular/cdk": "2.0.0-beta.10",
"@angular/common": "4.3.6", "@angular/common": "4.4.3",
"@angular/compiler": "4.3.6", "@angular/compiler": "4.4.3",
"@angular/core": "4.3.6", "@angular/core": "4.4.3",
"@angular/flex-layout": "2.0.0-beta.9", "@angular/flex-layout": "2.0.0-beta.9",
"@angular/forms": "4.3.6", "@angular/forms": "4.4.3",
"@angular/http": "4.3.6", "@angular/http": "4.4.3",
"@angular/material": "2.0.0-beta.10", "@angular/material": "2.0.0-beta.10",
"@angular/platform-browser": "4.3.6", "@angular/platform-browser": "4.4.3",
"@angular/platform-browser-dynamic": "4.3.6", "@angular/platform-browser-dynamic": "4.4.3",
"@angular/router": "4.3.6", "@angular/router": "4.4.3",
"@swimlane/ngx-charts": "6.0.2", "@swimlane/ngx-charts": "6.0.2",
"@swimlane/ngx-datatable": "9.3.1", "@swimlane/ngx-datatable": "9.3.1",
"@swimlane/ngx-dnd": "3.0.0", "@swimlane/ngx-dnd": "3.0.0",
@@ -35,35 +38,38 @@
"hammerjs": "2.0.8", "hammerjs": "2.0.8",
"highlight.js": "9.12.0", "highlight.js": "9.12.0",
"intl": "1.2.5", "intl": "1.2.5",
"md2": "0.0.28",
"moment": "2.18.1", "moment": "2.18.1",
"ngx-color-picker": "4.3.1", "ngx-color-picker": "4.3.1",
"ngx-cookie-service": "1.0.7", "ngx-cookie-service": "1.0.7",
"ngx-perfect-scrollbar": "4.5.6", "ngx-perfect-scrollbar": "4.6.2",
"perfect-scrollbar": "0.8.1",
"rxjs": "5.4.3", "rxjs": "5.4.3",
"web-animations-js": "2.3.1", "web-animations-js": "2.3.1",
"zone.js": "0.8.17" "zone.js": "0.8.17"
}, },
"devDependencies": { "devDependencies": {
"@angular/cli": "^1.3.2", "@angular/cli": "1.4.2",
"@angular/compiler-cli": "4.3.6", "@angular/compiler-cli": "4.4.3",
"@angular/language-service": "4.3.6", "@angular/language-service": "4.4.3",
"@ngtools/webpack": "^1.6.2", "@angularclass/hmr": "2.1.3",
"@types/jasmine": "^2.5.54", "@ngtools/webpack": "1.7.1",
"@types/jasminewd2": "^2.0.2", "@types/jasmine": "2.6.0",
"@types/node": "^6.0.88", "@types/jasminewd2": "2.0.2",
"codelyzer": "~3.0.1", "@types/node": "6.0.88",
"jasmine-core": "~2.6.2", "codelyzer": "3.0.1",
"jasmine-spec-reporter": "~4.1.0", "jasmine-core": "2.6.2",
"karma": "~1.7.0", "jasmine-spec-reporter": "4.1.0",
"karma-chrome-launcher": "~2.1.1", "karma": "1.7.1",
"karma-cli": "~1.0.1", "karma-chrome-launcher": "2.1.1",
"karma-coverage-istanbul-reporter": "^1.2.1", "karma-cli": "1.0.1",
"karma-jasmine": "~1.1.0", "karma-coverage-istanbul-reporter": "1.2.1",
"karma-jasmine-html-reporter": "^0.2.2", "karma-jasmine": "1.1.0",
"node-sass": "^4.5.3", "karma-jasmine-html-reporter": "0.2.2",
"protractor": "~5.1.2", "node-sass": "4.5.3",
"ts-node": "~3.0.4", "protractor": "5.1.2",
"tslint": "~5.3.2", "ts-node": "3.0.4",
"typescript": "~2.3.3" "tslint": "5.3.2",
"typescript": "2.3.3"
} }
} }

View File

@@ -9,7 +9,6 @@ import 'hammerjs';
import { SharedModule } from './core/modules/shared.module'; import { SharedModule } from './core/modules/shared.module';
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
import { ProjectModule } from './main/content/apps/dashboards/project/project.module'; import { ProjectModule } from './main/content/apps/dashboards/project/project.module';
import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar';
import { FuseFakeDbService } from './fuse-fake-db/fuse-fake-db.service'; import { FuseFakeDbService } from './fuse-fake-db/fuse-fake-db.service';
import { FuseMainModule } from './main/main.module'; import { FuseMainModule } from './main/main.module';
import { PagesModule } from './main/content/pages/pages.module'; import { PagesModule } from './main/content/pages/pages.module';
@@ -17,6 +16,7 @@ import { UIModule } from './main/content/ui/ui.module';
import { ComponentsModule } from './main/content/components/components.module'; import { ComponentsModule } from './main/content/components/components.module';
import { FuseSplashScreenService } from './core/services/splash-screen.service'; import { FuseSplashScreenService } from './core/services/splash-screen.service';
import { FuseConfigService } from './core/services/config.service'; import { FuseConfigService } from './core/services/config.service';
import { FuseNavigationService } from './core/components/navigation/navigation.service';
import { ComponentsThirdPartyModule } from './main/content/components-third-party/components-third-party.module'; import { ComponentsThirdPartyModule } from './main/content/components-third-party/components-third-party.module';
import { ServicesModule } from './main/content/services/services.module'; import { ServicesModule } from './main/content/services/services.module';
@@ -45,6 +45,10 @@ const appRoutes: Routes = [
path : 'apps/contacts', path : 'apps/contacts',
loadChildren: './main/content/apps/contacts/contacts.module#FuseContactsModule' loadChildren: './main/content/apps/contacts/contacts.module#FuseContactsModule'
}, },
{
path : 'apps/scrumboard',
loadChildren: './main/content/apps/scrumboard/scrumboard.module#FuseScrumboardModule'
},
{ {
path : '**', path : '**',
redirectTo: 'apps/dashboards/project' redirectTo: 'apps/dashboards/project'
@@ -65,8 +69,6 @@ const appRoutes: Routes = [
InMemoryWebApiModule.forRoot(FuseFakeDbService, {delay: 0}), InMemoryWebApiModule.forRoot(FuseFakeDbService, {delay: 0}),
PerfectScrollbarModule.forRoot(),
FuseMainModule, FuseMainModule,
ProjectModule, ProjectModule,
@@ -79,7 +81,8 @@ const appRoutes: Routes = [
], ],
providers : [ providers : [
FuseSplashScreenService, FuseSplashScreenService,
FuseConfigService FuseConfigService,
FuseNavigationService
], ],
bootstrap : [ bootstrap : [
AppComponent AppComponent

View File

@@ -1,10 +1,69 @@
import { sequence, trigger, stagger, animate, style, group, query, transition, keyframes, animateChild, state } from '@angular/animations'; import { sequence, trigger, animate, style, group, query, transition, animateChild, state, animation, useAnimation, stagger } from '@angular/animations';
// const query = (s, a, o = {optional: true}) => q(s, a, o); const customAnimation = animation([
style({
opacity : '{{opacity}}',
transform: 'scale({{scale}}) translate3d({{x}}, {{y}}, {{z}})'
}),
animate('{{duration}} {{delay}} cubic-bezier(0.0, 0.0, 0.2, 1)', style('*'))
], {
params: {
duration: '200ms',
delay : '0ms',
opacity : '0',
scale : '1',
x : '0',
y : '0',
z : '0'
}
});
export class Animations export const fuseAnimations = [
{
public static slideInOut = trigger('slideInOut', [ trigger('animate', [transition('void => *', [useAnimation(customAnimation)])]),
trigger('animateStagger', [
state('50', style('*')),
state('100', style('*')),
state('200', style('*')),
transition('void => 50',
query('@*',
[
stagger('50ms', [
animateChild()
])
])),
transition('void => 100',
query('@*',
[
stagger('100ms', [
animateChild()
])
])),
transition('void => 200',
query('@*',
[
stagger('200ms', [
animateChild()
])
]))
]),
trigger('fadeInOut', [
state('0', style({
display: 'none',
opacity: 0
})),
state('1', style({
display: 'block',
opacity: 1
})),
transition('1 => 0', animate('300ms ease-out')),
transition('0 => 1', animate('300ms ease-in'))
]),
trigger('slideInOut', [
state('0', style({ state('0', style({
height : '0px', height : '0px',
display: 'none' display: 'none'
@@ -15,9 +74,9 @@ export class Animations
})), })),
transition('1 => 0', animate('300ms ease-out')), transition('1 => 0', animate('300ms ease-out')),
transition('0 => 1', animate('300ms ease-in')) transition('0 => 1', animate('300ms ease-in'))
]); ]),
public static slideInLeft = trigger('slideInLeft', [ trigger('slideInLeft', [
state('void', style({ state('void', style({
transform: 'translateX(-100%)', transform: 'translateX(-100%)',
display : 'none' display : 'none'
@@ -28,9 +87,9 @@ export class Animations
})), })),
transition('void => *', animate('300ms')), transition('void => *', animate('300ms')),
transition('* => void', animate('300ms')) transition('* => void', animate('300ms'))
]); ]),
public static slideInRight = trigger('slideInRight', [ trigger('slideInRight', [
state('void', style({ state('void', style({
transform: 'translateX(100%)', transform: 'translateX(100%)',
display : 'none' display : 'none'
@@ -41,9 +100,9 @@ export class Animations
})), })),
transition('void => *', animate('300ms')), transition('void => *', animate('300ms')),
transition('* => void', animate('300ms')) transition('* => void', animate('300ms'))
]); ]),
public static slideInTop = trigger('slideInTop', [ trigger('slideInTop', [
state('void', style({ state('void', style({
transform: 'translateY(-100%)', transform: 'translateY(-100%)',
display : 'none' display : 'none'
@@ -54,9 +113,9 @@ export class Animations
})), })),
transition('void => *', animate('300ms')), transition('void => *', animate('300ms')),
transition('* => void', animate('300ms')) transition('* => void', animate('300ms'))
]); ]),
public static slideInBottom = trigger('slideInBottom', [ trigger('slideInBottom', [
state('void', state('void',
style({ style({
transform: 'translateY(100%)', transform: 'translateY(100%)',
@@ -68,9 +127,9 @@ export class Animations
})), })),
transition('void => *', animate('300ms')), transition('void => *', animate('300ms')),
transition('* => void', animate('300ms')) transition('* => void', animate('300ms'))
]); ]),
public static routerTransitionLeft = trigger('routerTransitionLeft', [ trigger('routerTransitionLeft', [
transition('* => *', [ transition('* => *', [
query('fuse-content > :enter, fuse-content > :leave', [ query('fuse-content > :enter, fuse-content > :leave', [
@@ -95,7 +154,7 @@ export class Animations
transform: 'translateX(0)', transform: 'translateX(0)',
opacity : 1 opacity : 1
}), }),
animate('400ms cubic-bezier(0.250, 0.460, 0.450, 0.940)', animate('600ms cubic-bezier(0.0, 0.0, 0.2, 1)',
style({ style({
transform: 'translateX(-100%)', transform: 'translateX(-100%)',
opacity : 0 opacity : 0
@@ -103,7 +162,7 @@ export class Animations
], {optional: true}), ], {optional: true}),
query('fuse-content > :enter', [ query('fuse-content > :enter', [
style({transform: 'translateX(100%)'}), style({transform: 'translateX(100%)'}),
animate('400ms cubic-bezier(0.250, 0.460, 0.450, 0.940)', animate('600ms cubic-bezier(0.0, 0.0, 0.2, 1)',
style({ style({
transform: 'translateX(0%)', transform: 'translateX(0%)',
opacity : 1 opacity : 1
@@ -114,9 +173,9 @@ export class Animations
query('fuse-content > :enter', animateChild(), {optional: true}) query('fuse-content > :enter', animateChild(), {optional: true})
]) ])
]) ])
]); ]),
public static routerTransitionRight = trigger('routerTransitionRight', [ trigger('routerTransitionRight', [
transition('* => *', [ transition('* => *', [
query('fuse-content > :enter, fuse-content > :leave', [ query('fuse-content > :enter, fuse-content > :leave', [
@@ -141,7 +200,7 @@ export class Animations
transform: 'translateX(0)', transform: 'translateX(0)',
opacity : 1 opacity : 1
}), }),
animate('400ms cubic-bezier(0.250, 0.460, 0.450, 0.940)', animate('600ms cubic-bezier(0.0, 0.0, 0.2, 1)',
style({ style({
transform: 'translateX(100%)', transform: 'translateX(100%)',
opacity : 0 opacity : 0
@@ -149,7 +208,7 @@ export class Animations
], {optional: true}), ], {optional: true}),
query('fuse-content > :enter', [ query('fuse-content > :enter', [
style({transform: 'translateX(-100%)'}), style({transform: 'translateX(-100%)'}),
animate('400ms cubic-bezier(0.250, 0.460, 0.450, 0.940)', animate('600ms cubic-bezier(0.0, 0.0, 0.2, 1)',
style({ style({
transform: 'translateX(0%)', transform: 'translateX(0%)',
opacity : 1 opacity : 1
@@ -160,9 +219,9 @@ export class Animations
query('fuse-content > :enter', animateChild(), {optional: true}) query('fuse-content > :enter', animateChild(), {optional: true})
]) ])
]) ])
]); ]),
public static routerTransitionUp = trigger('routerTransitionUp', [ trigger('routerTransitionUp', [
transition('* => *', [ transition('* => *', [
query('fuse-content > :enter, fuse-content > :leave', [ query('fuse-content > :enter, fuse-content > :leave', [
@@ -180,14 +239,13 @@ export class Animations
opacity : 0 opacity : 0
}) })
], {optional: true}), ], {optional: true}),
sequence([
group([ group([
query('fuse-content > :leave', [ query('fuse-content > :leave', [
style({ style({
transform: 'translateY(0)', transform: 'translateY(0)',
opacity : 1 opacity : 1
}), }),
animate('400ms cubic-bezier(0.250, 0.460, 0.450, 0.940)', animate('600ms cubic-bezier(0.0, 0.0, 0.2, 1)',
style({ style({
transform: 'translateY(-100%)', transform: 'translateY(-100%)',
opacity : 0 opacity : 0
@@ -195,7 +253,7 @@ export class Animations
], {optional: true}), ], {optional: true}),
query('fuse-content > :enter', [ query('fuse-content > :enter', [
style({transform: 'translateY(100%)'}), style({transform: 'translateY(100%)'}),
animate('400ms cubic-bezier(0.250, 0.460, 0.450, 0.940)', animate('600ms cubic-bezier(0.0, 0.0, 0.2, 1)',
style({ style({
transform: 'translateY(0%)', transform: 'translateY(0%)',
opacity : 1 opacity : 1
@@ -205,10 +263,9 @@ export class Animations
query('fuse-content > :leave', animateChild(), {optional: true}), query('fuse-content > :leave', animateChild(), {optional: true}),
query('fuse-content > :enter', animateChild(), {optional: true}) query('fuse-content > :enter', animateChild(), {optional: true})
]) ])
]) ]),
]);
public static routerTransitionDown = trigger('routerTransitionDown', [ trigger('routerTransitionDown', [
transition('* => *', [ transition('* => *', [
query('fuse-content > :enter, fuse-content > :leave', [ query('fuse-content > :enter, fuse-content > :leave', [
@@ -233,7 +290,7 @@ export class Animations
transform: 'translateY(0)', transform: 'translateY(0)',
opacity : 1 opacity : 1
}), }),
animate('400ms cubic-bezier(0.250, 0.460, 0.450, 0.940)', animate('600ms cubic-bezier(0.0, 0.0, 0.2, 1)',
style({ style({
transform: 'translateY(100%)', transform: 'translateY(100%)',
opacity : 0 opacity : 0
@@ -241,7 +298,7 @@ export class Animations
], {optional: true}), ], {optional: true}),
query('fuse-content > :enter', [ query('fuse-content > :enter', [
style({transform: 'translateY(-100%)'}), style({transform: 'translateY(-100%)'}),
animate('400ms cubic-bezier(0.250, 0.460, 0.450, 0.940)', animate('600ms cubic-bezier(0.0, 0.0, 0.2, 1)',
style({ style({
transform: 'translateY(0%)', transform: 'translateY(0%)',
opacity : 1 opacity : 1
@@ -252,11 +309,11 @@ export class Animations
query('fuse-content > :enter', animateChild(), {optional: true}) query('fuse-content > :enter', animateChild(), {optional: true})
]) ])
]) ])
]); ]),
public static routerTransitionFade = trigger('routerTransitionFade', [ trigger('routerTransitionFade', [
transition('* => *', [ transition('* => *', group([
query('fuse-content > :enter, fuse-content > :leave ', [ query('fuse-content > :enter, fuse-content > :leave ', [
style({ style({
@@ -267,17 +324,17 @@ export class Animations
right : 0 right : 0
}) })
], {optional: true}), ], {optional: true}),
query('fuse-content > :enter', [ query('fuse-content > :enter', [
style({ style({
opacity: 0 opacity: 0
}) })
], {optional: true}), ], {optional: true}),
// sequence([
query('fuse-content > :leave', [ query('fuse-content > :leave', [
style({ style({
opacity: 1 opacity: 1
}), }),
animate('300ms cubic-bezier(0.250, 0.460, 0.450, 0.940)', animate('300ms cubic-bezier(0.0, 0.0, 0.2, 1)',
style({ style({
opacity: 0 opacity: 0
})) }))
@@ -286,14 +343,13 @@ export class Animations
style({ style({
opacity: 0 opacity: 0
}), }),
animate('300ms cubic-bezier(0.250, 0.460, 0.450, 0.940)', animate('300ms cubic-bezier(0.0, 0.0, 0.2, 1)',
style({ style({
opacity: 1 opacity: 1
})) }))
], {optional: true}), ], {optional: true}),
// ]),
query('fuse-content > :enter', animateChild(), {optional: true}), query('fuse-content > :enter', animateChild(), {optional: true}),
query('fuse-content > :leave', animateChild(), {optional: true}) query('fuse-content > :leave', animateChild(), {optional: true})
]))
]) ])
]); ];
}

View File

@@ -1,4 +1,5 @@
<button md-icon-button <button md-icon-button
type="button"
class="mat-elevation-z1" class="mat-elevation-z1"
[mdMenuTriggerFor]="colorMenu" [mdMenuTriggerFor]="colorMenu"
(onMenuOpen)="onMenuOpen()" (onMenuOpen)="onMenuOpen()"
@@ -44,7 +45,7 @@
<div fxLayout="row" fxLayoutWrap <div fxLayout="row" fxLayoutWrap
fxLayoutAlign="start start" fxLayoutAlign="start start"
class="colors" perfect-scrollbar> class="colors" fusePerfectScrollbar>
<div class="color" <div class="color"
[ngClass]="'md-'+color.key+'-bg'" [ngClass]="'md-'+color.key+'-bg'"
*ngFor="let color of (colors | keys)" *ngFor="let color of (colors | keys)"
@@ -62,7 +63,7 @@
[@slideInRight]> [@slideInRight]>
<div fxLayout="row" fxLayoutWrap <div fxLayout="row" fxLayoutWrap
fxLayoutAlign="start start" fxLayoutAlign="start start"
class="colors" perfect-scrollbar> class="colors" fusePerfectScrollbar>
<div class="color" <div class="color"
*ngFor="let hue of hues" *ngFor="let hue of hues"
[fxHide]="selectedPalette === 'white' && hue !== '500'|| selectedPalette === 'black' && hue !== '500'" [fxHide]="selectedPalette === 'white' && hue !== '500'|| selectedPalette === 'black' && hue !== '500'"

View File

@@ -1,12 +1,12 @@
import { Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewEncapsulation } from '@angular/core'; import { Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewEncapsulation } from '@angular/core';
import { MatColors } from '../../matColors'; import { MatColors } from '../../matColors';
import { Animations } from '../../animations'; import { fuseAnimations } from '../../animations';
@Component({ @Component({
selector : 'fuse-material-color-picker', selector : 'fuse-material-color-picker',
templateUrl : './material-color-picker.component.html', templateUrl : './material-color-picker.component.html',
styleUrls : ['./material-color-picker.component.scss'], styleUrls : ['./material-color-picker.component.scss'],
animations : [Animations.slideInLeft, Animations.slideInRight], animations : fuseAnimations,
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None
}) })
export class FuseMaterialColorPickerComponent implements OnInit, OnChanges export class FuseMaterialColorPickerComponent implements OnInit, OnChanges

View File

@@ -0,0 +1,18 @@
<a class="nav-link" md-ripple>
<md-icon class="nav-link-icon" *ngIf="item.icon">{{item.icon}}</md-icon>
<span class="nav-link-title">{{item.title}}</span>
<md-icon class="collapse-arrow">keyboard_arrow_right</md-icon>
</a>
<div class="children" [ngClass]="{'open': isOpen}">
<div class="{{fuseSettings.colorClasses.navbar}}">
<ng-container *ngFor="let item of item.children">
<fuse-nav-horizontal-item *ngIf="item.type=='item'" [item]="item"></fuse-nav-horizontal-item>
<fuse-nav-horizontal-collapse *ngIf="item.type=='collapse'" [item]="item"></fuse-nav-horizontal-collapse>
</ng-container>
</div>
</div>

View File

@@ -0,0 +1,50 @@
import { Component, HostBinding, HostListener, Input, OnDestroy } from '@angular/core';
import { fuseAnimations } from '../../../../animations';
import { FuseConfigService } from '../../../../services/config.service';
import { Subscription } from 'rxjs/Subscription';
@Component({
selector : 'fuse-nav-horizontal-collapse',
templateUrl: './nav-horizontal-collapse.component.html',
styleUrls : ['./nav-horizontal-collapse.component.scss'],
animations : fuseAnimations
})
export class FuseNavHorizontalCollapseComponent implements OnDestroy
{
onSettingsChanged: Subscription;
fuseSettings: any;
isOpen = false;
@HostBinding('class') classes = 'nav-item nav-collapse';
@Input() item: any;
@HostListener('mouseenter')
open()
{
this.isOpen = true;
}
@HostListener('mouseleave')
close()
{
this.isOpen = false;
}
constructor(
private fuseConfig: FuseConfigService
)
{
this.onSettingsChanged =
this.fuseConfig.onSettingsChanged
.subscribe(
(newSettings) => {
this.fuseSettings = newSettings;
}
);
}
ngOnDestroy()
{
this.onSettingsChanged.unsubscribe();
}
}

View File

@@ -0,0 +1,6 @@
<a class="nav-link" md-ripple
[routerLink]="[item.url]" routerLinkActive="active">
<md-icon class="nav-link-icon" *ngIf="item.icon">{{item.icon}}</md-icon>
<span class="nav-link-title">{{item.title}}</span>
<span class="nav-link-badge" *ngIf="item.badge" [ngStyle]="{'background-color': item.badge.bg,'color': item.badge.fg}">{{item.badge.title}}</span>
</a>

View File

@@ -0,0 +1,12 @@
import { Component, HostBinding, Input } from '@angular/core';
@Component({
selector : 'fuse-nav-horizontal-item',
templateUrl: './nav-horizontal-item.component.html',
styleUrls : ['./nav-horizontal-item.component.scss']
})
export class FuseNavHorizontalItemComponent
{
@HostBinding('class') classes = 'nav-item';
@Input() item: any;
}

View File

@@ -1,147 +0,0 @@
import { Component, HostBinding, Input, OnInit } from '@angular/core';
import { FuseNavigationService } from '../navigation.service';
import { NavigationEnd, Router } from '@angular/router';
import { Animations } from '../../../animations';
@Component({
selector : 'fuse-nav-collapse',
templateUrl: './nav-collapse.component.html',
styleUrls : ['./nav-collapse.component.scss'],
animations : [Animations.slideInOut]
})
export class FuseNavCollapseComponent implements OnInit
{
@Input() item: any;
@HostBinding('class') classes = 'nav-collapse nav-item';
@HostBinding('class.open') public isOpen = false;
constructor(private navigationService: FuseNavigationService, private router: Router)
{
/**
* When navigation changed
*/
router.events.subscribe(
(event) => {
if ( event instanceof NavigationEnd )
{
/**
* Check if the url is child of the collapse
*/
if ( this.isUrlInChildren(this.item, event.urlAfterRedirects) )
{
// console.log(this.item);
this.expand();
}
else
{
this.collapse();
}
}
}
);
/**
* Whenever a navigation collapse item toggled
*/
this.navigationService.onNavCollapseToggled.subscribe(
(clickedItem) => {
if ( clickedItem.children )
{
/**
* if clicked collapse is child of this collapse
* return
*/
if ( this.item.children.indexOf(clickedItem) !== -1 )
{
return;
}
/**
* If collapsed item is not related with this collapse
* collapse
*/
if ( this.item !== clickedItem )
{
this.collapse();
}
}
}
);
}
/**
* Toggle Collapse
* @param ev
*/
toggleOpen(ev)
{
ev.preventDefault();
this.isOpen = !this.isOpen;
this.navigationService.onNavCollapseToggled.emit(this.item);
}
/**
* Expand
*/
expand()
{
if ( this.isOpen )
{
return;
}
this.isOpen = true;
}
/**
* Collapse
*/
collapse()
{
if ( !this.isOpen )
{
return;
}
this.isOpen = false;
}
/**
* Checking the url is in children
* @param arr
* @param url
* @returns {any}
*/
isUrlInChildren(arr, url)
{
if ( !arr.children )
{
return false;
}
for ( let i = 0; i < arr.children.length; i++ )
{
if ( arr.children[i].children )
{
if ( this.isUrlInChildren(arr.children[i], url) )
{
return true;
}
}
if ( arr.children[i].url === url )
{
return true;
}
}
return false;
}
public isCollapsed(): boolean
{
return this.isOpen;
}
ngOnInit()
{
}
}

View File

@@ -1 +0,0 @@
<span class="hint-text">{{ item.title }}</span>

View File

@@ -1,20 +0,0 @@
:host {
.folded:not(.folded-open) & {
&:before {
content: '';
display: block;
position: absolute;
min-width: 1.6rem;
border-top: 2px solid;
opacity: 0.2;
}
> span {
opacity: 0;
transition: opacity 200ms ease;
}
}
}

View File

@@ -1,21 +0,0 @@
import { Component, HostBinding, Input, OnInit } from '@angular/core';
@Component({
selector : 'fuse-nav-subheader',
templateUrl: './nav-subheader.component.html',
styleUrls : ['./nav-subheader.component.scss']
})
export class FuseNavSubheaderComponent implements OnInit
{
@HostBinding('class') classes = 'nav-subheader';
@Input() item: any;
constructor()
{
}
ngOnInit()
{
}
}

View File

@@ -1,11 +1,32 @@
<div id="main-navigation" class="nav"> <div id="main-navigation" class="nav"
<ng-container *ngFor="let item of navigation"> [ngClass]="{'horizontal':layout === 'horizontal', 'vertical':layout === 'vertical'}">
<fuse-nav-subheader *ngIf="item.type=='subheader'" [item]="item"></fuse-nav-subheader> <!-- Vertical Navigation Layout -->
<ng-container *ngIf="layout === 'vertical'">
<fuse-nav-item *ngIf="item.type=='nav-item'" [item]="item"></fuse-nav-item> <ng-container *ngFor="let item of navigationModel">
<fuse-nav-collapse *ngIf="item.type=='nav-collapse'" [item]="item"></fuse-nav-collapse> <fuse-nav-vertical-group *ngIf="item.type=='group'" [item]="item"></fuse-nav-vertical-group>
<fuse-nav-vertical-collapse *ngIf="item.type=='collapse'" [item]="item"></fuse-nav-vertical-collapse>
<fuse-nav-vertical-item *ngIf="item.type=='item'" [item]="item"></fuse-nav-vertical-item>
</ng-container> </ng-container>
</ng-container>
<!-- / Vertical Navigation Layout -->
<!-- Horizontal Navigation Layout -->
<ng-container *ngIf="layout === 'horizontal'">
<ng-container *ngFor="let item of navigationModel">
<fuse-nav-horizontal-collapse *ngIf="item.type=='group'" [item]="item"></fuse-nav-horizontal-collapse>
<fuse-nav-horizontal-collapse *ngIf="item.type=='collapse'" [item]="item"></fuse-nav-horizontal-collapse>
<fuse-nav-horizontal-item *ngIf="item.type=='nav-item'" [item]="item"></fuse-nav-horizontal-item>
</ng-container>
</ng-container>
<!-- / Horizontal Navigation Layout -->
</div> </div>

View File

@@ -1,5 +1,6 @@
import { Component, ViewEncapsulation } from '@angular/core'; import { Component, Input, OnDestroy, ViewEncapsulation } from '@angular/core';
import { FuseNavigationService } from './navigation.service'; import { FuseNavigationService } from './navigation.service';
import { Subscription } from 'rxjs/Subscription';
@Component({ @Component({
selector : 'fuse-navigation', selector : 'fuse-navigation',
@@ -7,13 +8,26 @@ import { FuseNavigationService } from './navigation.service';
styleUrls : ['./navigation.component.scss'], styleUrls : ['./navigation.component.scss'],
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None
}) })
export class FuseNavigationComponent export class FuseNavigationComponent implements OnDestroy
{ {
navigation: any[]; navigationModel: any[];
navigationModelChangeSubscription: Subscription;
constructor(private navigationService: FuseNavigationService) @Input('layout') layout = 'vertical';
constructor(private fuseNavigationService: FuseNavigationService)
{ {
this.navigation = navigationService.getNavigation(); this.navigationModelChangeSubscription =
this.fuseNavigationService.onNavigationModelChange
.subscribe((navigationModel) => {
this.navigationModel = navigationModel;
});
}
ngOnDestroy()
{
console.warn('destroyed');
this.navigationModelChangeSubscription.unsubscribe();
} }
} }

View File

@@ -1,10 +1,12 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { SharedModule } from '../../modules/shared.module'; import { SharedModule } from '../../modules/shared.module';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { FuseNavSubheaderComponent } from './nav-subheader/nav-subheader.component';
import { FuseNavigationComponent } from './navigation.component'; import { FuseNavigationComponent } from './navigation.component';
import { FuseNavItemComponent } from './nav-item/nav-item.component'; import { FuseNavVerticalItemComponent } from './vertical/nav-item/nav-vertical-item.component';
import { FuseNavCollapseComponent } from './nav-collapse/nav-collapse.component'; import { FuseNavVerticalCollapseComponent } from './vertical/nav-collapse/nav-vertical-collapse.component';
import { FuseNavVerticalGroupComponent } from './vertical/nav-group/nav-vertical-group.component';
import { FuseNavHorizontalItemComponent } from './horizontal/nav-item/nav-horizontal-item.component';
import { FuseNavHorizontalCollapseComponent } from './horizontal/nav-collapse/nav-horizontal-collapse.component';
@NgModule({ @NgModule({
imports : [ imports : [
@@ -16,9 +18,11 @@ import { FuseNavCollapseComponent } from './nav-collapse/nav-collapse.component'
], ],
declarations: [ declarations: [
FuseNavigationComponent, FuseNavigationComponent,
FuseNavSubheaderComponent, FuseNavVerticalGroupComponent,
FuseNavItemComponent, FuseNavVerticalItemComponent,
FuseNavCollapseComponent FuseNavVerticalCollapseComponent,
FuseNavHorizontalItemComponent,
FuseNavHorizontalCollapseComponent
] ]
}) })
export class FuseNavigationModule export class FuseNavigationModule

View File

@@ -1,25 +1,43 @@
import { EventEmitter, Injectable } from '@angular/core'; import { EventEmitter, Injectable } from '@angular/core';
import { FuseNavigation } from '../../../navigation.model'; import { NavigationModel } from '../../../navigation.model';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
@Injectable() @Injectable()
export class FuseNavigationService export class FuseNavigationService
{ {
onNavCollapseToggled = new EventEmitter<any>(); onNavCollapseToggled = new EventEmitter<any>();
navigation: any[]; onNavigationModelChange: BehaviorSubject<any> = new BehaviorSubject({});
navigationModel: NavigationModel;
flatNavigation: any[] = []; flatNavigation: any[] = [];
constructor() constructor()
{ {
this.navigation = new FuseNavigation().items; this.navigationModel = new NavigationModel();
this.onNavigationModelChange.next(this.navigationModel.model);
} }
/** /**
* Get navigation array * Get navigation model
* @returns {any[]} * @returns {any[]}
*/ */
getNavigation() getNavigationModel()
{ {
return this.navigation; return this.navigationModel.model;
}
/**
* Set the navigation model
* @param model
*/
setNavigationModel(model)
{
// console.log(model);
this.navigationModel = model;
console.log(this.navigationModel);
this.onNavigationModelChange.next(this.navigationModel.model);
} }
/** /**
@@ -31,7 +49,7 @@ export class FuseNavigationService
{ {
if ( !navigationItems ) if ( !navigationItems )
{ {
navigationItems = this.navigation; navigationItems = this.navigationModel.model;
} }
for ( const navItem of navigationItems ) for ( const navItem of navigationItems )
@@ -41,7 +59,7 @@ export class FuseNavigationService
continue; continue;
} }
if ( navItem.type === 'nav-item' ) if ( navItem.type === 'item' )
{ {
this.flatNavigation.push({ this.flatNavigation.push({
title: navItem.title, title: navItem.title,
@@ -53,7 +71,7 @@ export class FuseNavigationService
continue; continue;
} }
if ( navItem.type === 'nav-collapse' ) if ( navItem.type === 'collapse' || navItem.type === 'group' )
{ {
this.getFlatNavigation(navItem.children); this.getFlatNavigation(navItem.children);
} }

View File

@@ -5,7 +5,7 @@
</a> </a>
<div class="children" [@slideInOut]="isOpen"> <div class="children" [@slideInOut]="isOpen">
<ng-container *ngFor="let item of item.children"> <ng-container *ngFor="let item of item.children">
<fuse-nav-item *ngIf="item.type=='nav-item'" [item]="item"></fuse-nav-item> <fuse-nav-vertical-item *ngIf="item.type=='item'" [item]="item"></fuse-nav-vertical-item>
<fuse-nav-collapse *ngIf="item.type=='nav-collapse'" [item]="item"></fuse-nav-collapse> <fuse-nav-vertical-collapse *ngIf="item.type=='collapse'" [item]="item"></fuse-nav-vertical-collapse>
</ng-container> </ng-container>
</div> </div>

View File

@@ -0,0 +1,179 @@
import { Component, HostBinding, Input, OnInit } from '@angular/core';
import { FuseNavigationService } from '../../navigation.service';
import { NavigationEnd, Router } from '@angular/router';
import { fuseAnimations } from '../../../../animations';
@Component({
selector : 'fuse-nav-vertical-collapse',
templateUrl: './nav-vertical-collapse.component.html',
styleUrls : ['./nav-vertical-collapse.component.scss'],
animations : fuseAnimations
})
export class FuseNavVerticalCollapseComponent implements OnInit
{
@Input() item: any;
@HostBinding('class') classes = 'nav-collapse nav-item';
@HostBinding('class.open') public isOpen = false;
constructor(
private navigationService: FuseNavigationService,
private router: Router
)
{
// Listen for route changes
router.events.subscribe(
(event) => {
if ( event instanceof NavigationEnd )
{
// Check if the url can be found in
// one of the children of this item
if ( this.isUrlInChildren(this.item, event.urlAfterRedirects) )
{
this.expand();
}
else
{
this.collapse();
}
}
}
);
// Listen for collapsing of any navigation item
this.navigationService.onNavCollapseToggled
.subscribe(
(clickedItem) => {
if ( clickedItem.children )
{
// Check if the clicked item is one
// of the children of this item
if ( this.isChildrenOf(this.item, clickedItem) )
{
return;
}
// Check if the url can be found in
// one of the children of this item
if ( this.isUrlInChildren(this.item, this.router.url) )
{
return;
}
// If the clicked item is not this item, collapse...
if ( this.item !== clickedItem )
{
this.collapse();
}
}
}
);
}
/**
* Toggle collapse
*
* @param ev
*/
toggleOpen(ev)
{
ev.preventDefault();
this.isOpen = !this.isOpen;
// Navigation collapse toggled...
this.navigationService.onNavCollapseToggled.emit(this.item);
}
/**
* Expand the collapsable navigation
*/
expand()
{
if ( this.isOpen )
{
return;
}
this.isOpen = true;
}
/**
* Collapse the collapsable navigation
*/
collapse()
{
if ( !this.isOpen )
{
return;
}
this.isOpen = false;
}
/**
* Check if the given parent has the
* given item in one of its children
*
* @param parent
* @param item
* @return {any}
*/
isChildrenOf(parent, item)
{
if ( !parent.children )
{
return false;
}
if ( parent.children.indexOf(item) !== -1 )
{
return true;
}
for ( const children of parent.children )
{
if ( children.children )
{
return this.isChildrenOf(children, item);
}
}
}
/**
* Check if the given url can be found
* in one of the given parent's children
*
* @param parent
* @param url
* @returns {any}
*/
isUrlInChildren(parent, url)
{
if ( !parent.children )
{
return false;
}
for ( let i = 0; i < parent.children.length; i++ )
{
if ( parent.children[i].children )
{
if ( this.isUrlInChildren(parent.children[i], url) )
{
return true;
}
}
if ( parent.children[i].url === url )
{
return true;
}
}
return false;
}
ngOnInit()
{
}
}

View File

@@ -0,0 +1,10 @@
<div class="group-title">
<span class="hint-text">{{ item.title }}</span>
</div>
<div class="group-items">
<ng-container *ngFor="let item of item.children">
<fuse-nav-vertical-group *ngIf="item.type=='group'" [item]="item"></fuse-nav-vertical-group>
<fuse-nav-vertical-collapse *ngIf="item.type=='collapse'" [item]="item"></fuse-nav-vertical-collapse>
<fuse-nav-vertical-item *ngIf="item.type=='item'" [item]="item"></fuse-nav-vertical-item>
</ng-container>
</div>

View File

@@ -0,0 +1,23 @@
:host {
.folded:not(.folded-open) & {
> .group-title {
align-items: center;
> span {
opacity: 0;
transition: opacity 200ms ease;
}
&:before {
content: '';
display: block;
position: absolute;
min-width: 1.6rem;
border-top: 2px solid;
opacity: 0.2;
}
}
}
}

View File

@@ -0,0 +1,21 @@
import { Component, HostBinding, Input, OnInit } from '@angular/core';
@Component({
selector : 'fuse-nav-vertical-group',
templateUrl: './nav-vertical-group.component.html',
styleUrls : ['./nav-vertical-group.component.scss']
})
export class FuseNavVerticalGroupComponent implements OnInit
{
@HostBinding('class') classes = 'nav-group';
@Input() item: any;
constructor()
{
}
ngOnInit()
{
}
}

View File

@@ -1,11 +1,11 @@
import { Component, HostBinding, Input, OnInit } from '@angular/core'; import { Component, HostBinding, Input, OnInit } from '@angular/core';
@Component({ @Component({
selector : 'fuse-nav-item', selector : 'fuse-nav-vertical-item',
templateUrl: './nav-item.component.html', templateUrl: './nav-vertical-item.component.html',
styleUrls : ['./nav-item.component.scss'] styleUrls : ['./nav-vertical-item.component.scss']
}) })
export class FuseNavItemComponent implements OnInit export class FuseNavVerticalItemComponent implements OnInit
{ {
@HostBinding('class') classes = 'nav-item'; @HostBinding('class') classes = 'nav-item';
@Input() item: any; @Input() item: any;

View File

@@ -3,11 +3,14 @@
:host { :host {
.fuse-search-bar { .fuse-search-bar {
min-width: 64px;
height: 64px; height: 64px;
font-size: 13px; font-size: 13px;
@include media-breakpoint-down('xs') {
@include media-breakpoint-down('sm') {
height: 56px; height: 56px;
} }
.fuse-search-bar-expander, .fuse-search-bar-expander,
.fuse-search-bar-collapser { .fuse-search-bar-collapser {
cursor: pointer; cursor: pointer;
@@ -16,7 +19,8 @@
width: 64px !important; width: 64px !important;
height: 64px !important; height: 64px !important;
line-height: 64px !important; line-height: 64px !important;
@include media-breakpoint-down('xs') {
@include media-breakpoint-down('sm') {
height: 56px !important; height: 56px !important;
line-height: 56px !important; line-height: 56px !important;
} }
@@ -26,7 +30,7 @@
width: 64px !important; width: 64px !important;
height: 64px !important; height: 64px !important;
line-height: 64px !important; line-height: 64px !important;
@include media-breakpoint-down('xs') { @include media-breakpoint-down('sm') {
height: 56px !important; height: 56px !important;
line-height: 56px !important; line-height: 56px !important;
} }

View File

@@ -9,7 +9,7 @@
<div class="shortcuts" fxHide fxShow.gt-sm [ngClass]="toolbarColor"> <div class="shortcuts" fxHide fxShow.gt-sm [ngClass]="toolbarColor">
<div fxLayout="row" fxLayoutAlign="space-between center" fxFlex> <div fxLayout="row" fxLayoutAlign="space-between center" fxFlex="0 1 auto">
<div fxLayout="row" fxLayoutAlign="start center"> <div fxLayout="row" fxLayoutAlign="start center">
@@ -47,7 +47,7 @@
</md-input-container> </md-input-container>
<md-divider></md-divider> <md-divider></md-divider>
<md-nav-list *ngIf="!searching" style="max-height: 312px; overflow: auto" perfect-scrollbar> <md-nav-list *ngIf="!searching" style="max-height: 312px; overflow: auto" fusePerfectScrollbar>
<md-list-item *ngFor="let shortcutItem of shortcutItems" <md-list-item *ngFor="let shortcutItem of shortcutItems"
(click)="toggleShortcut($event, shortcutItem)"> (click)="toggleShortcut($event, shortcutItem)">
@@ -68,7 +68,7 @@
</md-list-item> </md-list-item>
</md-nav-list> </md-nav-list>
<md-nav-list *ngIf="searching" style="max-height: 312px; overflow: auto" perfect-scrollbar> <md-nav-list *ngIf="searching" style="max-height: 312px; overflow: auto" fusePerfectScrollbar>
<md-list-item *ngFor="let navigationItem of filteredNavigationItems" <md-list-item *ngFor="let navigationItem of filteredNavigationItems"
(click)="toggleShortcut($event, navigationItem)"> (click)="toggleShortcut($event, navigationItem)">
<div class="w-100-p" fxLayout="row" fxLayoutAlign="start center"> <div class="w-100-p" fxLayout="row" fxLayoutAlign="start center">

View File

@@ -2,73 +2,77 @@
<md-icon>settings</md-icon> <md-icon>settings</md-icon>
</button> </button>
<div #panel class="theme-options-panel md-white-bg mat-elevation-z2 pb-16"> <div class="theme-options-panel-overlay" #overlay [fxHide]="barClosed" [@fadeInOut]="!barClosed"></div>
<div #panel class="theme-options-panel md-white-bg mat-elevation-z8">
<button md-icon-button class="close-button" (click)="closeBar()"> <button md-icon-button class="close-button" (click)="closeBar()">
<md-icon>close</md-icon> <md-icon>close</md-icon>
</button> </button>
<md-list> <div class="theme-options-panel-inner" fxLayout="column" fxLayoutAlign="start start">
<h3 md-subheader>Navigation:</h3>
<md-list-item>
<md-radio-group [(ngModel)]="fuseSettings.layout.navigation" (ngModelChange)="onSettingsChange()">
<md-radio-button class="mr-8" value="left">Left</md-radio-button>
<md-radio-button class="mr-8" value="right">Right</md-radio-button>
<md-radio-button class="mr-8" value="none">None</md-radio-button>
</md-radio-group>
</md-list-item>
<h3 md-subheader>Toolbar:</h3> <h3>Navigation:</h3>
<md-list-item> <md-radio-group [(ngModel)]="fuseSettings.layout.navigation" (ngModelChange)="onSettingsChange()"
<md-radio-group [(ngModel)]="fuseSettings.layout.toolbar" (ngModelChange)="onSettingsChange()"> fxLayout="column" fxLayout.gt-xs="row" fxLayoutAlign="start start" fxLayoutWrap>
<md-radio-button class="mr-8" value="below">Below</md-radio-button> <md-radio-button class="mr-8 mb-8" value="top">Top</md-radio-button>
<md-radio-button class="mr-8" value="above">Above</md-radio-button> <md-radio-button class="mr-8 mb-8" value="left">Left</md-radio-button>
<md-radio-button class="mr-8" value="none">None</md-radio-button> <md-radio-button class="mr-8 mb-8" value="right">Right</md-radio-button>
<md-radio-button class="mr-8 mb-8" value="none">None</md-radio-button>
</md-radio-group> </md-radio-group>
</md-list-item>
<h3 md-subheader>Footer:</h3> <h3 class="mt-24">Toolbar:</h3>
<md-list-item> <md-radio-group [(ngModel)]="fuseSettings.layout.toolbar" (ngModelChange)="onSettingsChange()"
<md-radio-group [(ngModel)]="fuseSettings.layout.footer" (ngModelChange)="onSettingsChange()"> fxLayout="column" fxLayout.gt-xs="row" fxLayoutAlign="start start" fxLayoutWrap>
<md-radio-button class="mr-8" value="below">Below</md-radio-button> <md-radio-button class="mr-8 mb-8" value="below">Below</md-radio-button>
<md-radio-button class="mr-8" value="above">Above</md-radio-button> <md-radio-button class="mr-8 mb-8" value="above">Above</md-radio-button>
<md-radio-button class="mr-8" value="none">None</md-radio-button> <md-radio-button class="mr-8 mb-8" value="none">None</md-radio-button>
</md-radio-group>
<h3 class="mt-24">Footer:</h3>
<md-radio-group [(ngModel)]="fuseSettings.layout.footer" (ngModelChange)="onSettingsChange()"
fxLayout="column" fxLayout.gt-xs="row" fxLayoutAlign="start start" fxLayoutWrap>
<md-radio-button class="mr-8 mb-8" value="below">Below</md-radio-button>
<md-radio-button class="mr-8 mb-8" value="above">Above</md-radio-button>
<md-radio-button class="mr-8 mb-8" value="none">None</md-radio-button>
</md-radio-group>
<h3 class="mt-24">Layout Mode:</h3>
<md-radio-group [(ngModel)]="fuseSettings.layout.mode" (ngModelChange)="onSettingsChange()"
fxLayout="column" fxLayout.gt-xs="row" fxLayoutAlign="start start" fxLayoutWrap>
<md-radio-button class="mr-8 mb-8" value="boxed">Boxed</md-radio-button>
<md-radio-button class="mr-8 mb-8" value="fullwidth">Fullwidth</md-radio-button>
</md-radio-group> </md-radio-group>
</md-list-item>
<md-divider></md-divider> <md-divider></md-divider>
<h3 md-subheader>Colors:</h3> <h3>Colors:</h3>
<div class="colors">
<md-list-item>
<div fxFlex fxLayout="row" fxLayoutAlign="space-between center"> <div fxFlex fxLayout="row" fxLayoutAlign="space-between center">
<h4>Toolbar Color</h4> <h4 class="mr-8">Toolbar Color</h4>
<fuse-material-color-picker [(selectedClass)]="fuseSettings.colorClasses.toolbar" (onValueChange)="onSettingsChange()"></fuse-material-color-picker> <fuse-material-color-picker [(selectedClass)]="fuseSettings.colorClasses.toolbar"
(onValueChange)="onSettingsChange()"></fuse-material-color-picker>
</div> </div>
</md-list-item>
<md-list-item>
<div fxFlex fxLayout="row" fxLayoutAlign="space-between center"> <div fxFlex fxLayout="row" fxLayoutAlign="space-between center">
<h4>Navigation Bar Color</h4> <h4 class="mr-8">Navigation Bar Color</h4>
<fuse-material-color-picker [(selectedClass)]="fuseSettings.colorClasses.navbar" (onValueChange)="onSettingsChange()"></fuse-material-color-picker> <fuse-material-color-picker [(selectedClass)]="fuseSettings.colorClasses.navbar"
(onValueChange)="onSettingsChange()"></fuse-material-color-picker>
</div> </div>
</md-list-item>
<md-list-item>
<div fxFlex fxLayout="row" fxLayoutAlign="space-between center"> <div fxFlex fxLayout="row" fxLayoutAlign="space-between center">
<h4>Footer Color</h4> <h4 class="mr-8">Footer Color</h4>
<fuse-material-color-picker [(selectedClass)]="fuseSettings.colorClasses.footer" (onValueChange)="onSettingsChange()"></fuse-material-color-picker> <fuse-material-color-picker [(selectedClass)]="fuseSettings.colorClasses.footer"
(onValueChange)="onSettingsChange()"></fuse-material-color-picker>
</div>
</div> </div>
</md-list-item>
<md-divider></md-divider> <md-divider></md-divider>
<h3 md-subheader>Animation:</h3> <h3>Router Animation:</h3>
<md-select class="p-0" [(ngModel)]="fuseSettings.routerAnimation">
<md-list-item>
<div fxFlex fxLayout="row" fxLayoutAlign="space-between center">
<h4>Router Animation</h4>
<md-select [(ngModel)]="fuseSettings.routerAnimation">
<md-option value="none"> <md-option value="none">
None None
</md-option> </md-option>
@@ -88,8 +92,7 @@
Fade in Fade in
</md-option> </md-option>
</md-select> </md-select>
</div>
</md-list-item>
</md-list> </div>
</div> </div>

View File

@@ -15,18 +15,67 @@
right: 0; right: 0;
top: 160px; top: 160px;
&.bar-closed .theme-options-panel {
display: none;
}
.theme-options-panel { .theme-options-panel {
position: absolute; position: absolute;
right: 0; right: 0;
top: 0; top: 0;
width: 320px; width: 360px;
transform: translate3d(100%, 0, 0); transform: translate3d(100%, 0, 0);
z-index: 999; z-index: 999;
max-height: calc(100vh - 200px);
padding: 24px;
overflow: auto;
@include media-breakpoint-down('xs') {
top: -120px;
max-height: calc(100vh - 100px);
width: 90vw;
}
.close-button { .close-button {
position: absolute; position: absolute;
top: 8px;
right: 8px;
}
h3 {
font-size: 14px;
font-weight: 500;
color: rgba(0, 0, 0, 0.54);
}
.mat-divider{
display: block !important;
width: 100%;
margin: 24px 0 16px 0;
}
.colors {
display: block !important;
width: 100%;
}
}
.theme-options-panel-overlay {
position: fixed;
display: block;
background: rgba(0, 0, 0, 0);
top: 0; top: 0;
right: 0; right: 0;
left: 0;
bottom: 0;
z-index: 998;
@include media-breakpoint-down('sm') {
background: rgba(0, 0, 0, 0.37);
}
&.hidden {
display: none;
} }
} }
@@ -34,6 +83,10 @@
font-size: 15px; font-size: 15px;
} }
.mat-divider {
margin: 16px;
}
.open-button { .open-button {
position: absolute; position: absolute;
top: 0; top: 0;

View File

@@ -1,28 +1,36 @@
import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { Component, ElementRef, HostBinding, OnDestroy, OnInit, Renderer2, ViewChild } from '@angular/core';
import { style, animate, AnimationBuilder, AnimationPlayer } from '@angular/animations'; import { style, animate, AnimationBuilder, AnimationPlayer } from '@angular/animations';
import { Subscription } from 'rxjs/Subscription'; import { Subscription } from 'rxjs/Subscription';
import { FuseConfigService } from '../../services/config.service'; import { FuseConfigService } from '../../services/config.service';
import { fuseAnimations } from '../../animations';
@Component({ @Component({
selector : 'fuse-theme-options', selector : 'fuse-theme-options',
templateUrl: './theme-options.component.html', templateUrl: './theme-options.component.html',
styleUrls : ['./theme-options.component.scss'] styleUrls : ['./theme-options.component.scss'],
animations : fuseAnimations
}) })
export class FuseThemeOptionsComponent implements OnInit, OnDestroy export class FuseThemeOptionsComponent implements OnInit, OnDestroy
{ {
@ViewChild('openButton') openButton; @ViewChild('openButton') openButton;
@ViewChild('panel') panel; @ViewChild('panel') panel;
@ViewChild('overlay') overlay: ElementRef;
public player: AnimationPlayer; public player: AnimationPlayer;
fuseSettings: any; fuseSettings: any;
onSettingsChanged: Subscription; onSettingsChanged: Subscription;
@HostBinding('class.bar-closed') barClosed: boolean;
constructor( constructor(
private animationBuilder: AnimationBuilder, private animationBuilder: AnimationBuilder,
private fuseConfig: FuseConfigService private fuseConfig: FuseConfigService,
private renderer: Renderer2
) )
{ {
this.barClosed = true;
this.onSettingsChanged = this.onSettingsChanged =
this.fuseConfig.onSettingsChanged this.fuseConfig.onSettingsChanged
.subscribe( .subscribe(
@@ -34,6 +42,9 @@ export class FuseThemeOptionsComponent implements OnInit, OnDestroy
ngOnInit() ngOnInit()
{ {
this.renderer.listen(this.overlay.nativeElement, 'click', () => {
this.closeBar();
});
} }
onSettingsChange() onSettingsChange()
@@ -49,17 +60,25 @@ export class FuseThemeOptionsComponent implements OnInit, OnDestroy
style({transform: 'translate3d(0,0,0)'}), style({transform: 'translate3d(0,0,0)'}),
animate('400ms ease', style({transform: 'translate3d(100%,0,0)'})) animate('400ms ease', style({transform: 'translate3d(100%,0,0)'}))
]).create(this.panel.nativeElement); ]).create(this.panel.nativeElement);
this.player.play(); this.player.play();
this.player.onDone(() => {
this.barClosed = true;
});
} }
openBar() openBar()
{ {
this.barClosed = false;
this.player = this.player =
this.animationBuilder this.animationBuilder
.build([ .build([
style({transform: 'translate3d(100%,0,0)'}), style({transform: 'translate3d(100%,0,0)'}),
animate('400ms ease', style({transform: 'translate3d(0,0,0)'})) animate('400ms ease', style({transform: 'translate3d(0,0,0)'}))
]).create(this.panel.nativeElement); ]).create(this.panel.nativeElement);
this.player.play(); this.player.play();
} }

View File

@@ -21,7 +21,7 @@ export class FuseIfOnDomDirective implements AfterContentChecked
{ {
setTimeout(() => { setTimeout(() => {
this.viewContainer.createEmbeddedView(this.templateRef); this.viewContainer.createEmbeddedView(this.templateRef);
}, 0); }, 350);
this.isCreated = true; this.isCreated = true;
} }
else if ( this.isCreated && !document.body.contains(this.element.nativeElement) ) else if ( this.isCreated && !document.body.contains(this.element.nativeElement) )

View File

@@ -0,0 +1,173 @@
import { AfterViewInit, Directive, ElementRef, NgZone, OnDestroy, OnInit } from '@angular/core';
import * as Ps from 'perfect-scrollbar';
import { FuseConfigService } from '../../services/config.service';
import { Subscription } from 'rxjs/Subscription';
import { Platform } from '@angular/cdk/platform';
@Directive({
selector: '[fusePerfectScrollbar]'
})
export class FusePerfectScrollbarDirective implements OnInit, AfterViewInit, OnDestroy
{
onSettingsChanged: Subscription;
isDisableCustomScrollbars = false;
isMobile = false;
isInitialized = true;
constructor(
private element: ElementRef,
private zone: NgZone,
private fuseConfig: FuseConfigService,
private platform: Platform
)
{
this.onSettingsChanged =
this.fuseConfig.onSettingsChanged
.subscribe(
(settings) => {
this.isDisableCustomScrollbars = !settings.customScrollbars;
}
);
if ( this.platform.ANDROID || this.platform.IOS )
{
this.isMobile = true;
}
}
ngOnInit()
{
}
ngAfterViewInit()
{
if ( this.isMobile || this.isDisableCustomScrollbars )
{
this.isInitialized = false;
return;
}
this.zone.runOutsideAngular(() => {
// Initialize the perfect-scrollbar
Ps.initialize(this.element.nativeElement);
});
}
ngOnDestroy()
{
if ( !this.isInitialized )
{
return;
}
this.onSettingsChanged.unsubscribe();
// Destroy the perfect-scrollbar
Ps.destroy(this.element.nativeElement);
}
update()
{
if ( !this.isInitialized )
{
return;
}
// Update the perfect-scrollbar
Ps.update(this.element.nativeElement);
}
destroy()
{
this.ngOnDestroy();
}
scrollToX(x: number, speed?: number)
{
this.animateScrolling('scrollLeft', x, speed);
}
scrollToY(y: number, speed?: number)
{
this.animateScrolling('scrollTop', y, speed);
}
scrollToTop(offset?: number, speed?: number)
{
this.animateScrolling('scrollTop', (offset || 0), speed);
}
scrollToLeft(offset?: number, speed?: number)
{
this.animateScrolling('scrollLeft', (offset || 0), speed);
}
scrollToRight(offset?: number, speed?: number)
{
const width = this.element.nativeElement.scrollWidth;
this.animateScrolling('scrollLeft', width - (offset || 0), speed);
}
scrollToBottom(offset?: number, speed?: number)
{
const height = this.element.nativeElement.scrollHeight;
this.animateScrolling('scrollTop', height - (offset || 0), speed);
}
animateScrolling(target: string, value: number, speed?: number)
{
if ( !speed )
{
this.element.nativeElement[target] = value;
// PS has weird event sending order, this is a workaround for that
this.update();
this.update();
}
else if ( value !== this.element.nativeElement[target] )
{
let newValue = 0;
let scrollCount = 0;
let oldTimestamp = performance.now();
let oldValue = this.element.nativeElement[target];
const cosParameter = (oldValue - value) / 2;
const step = (newTimestamp) => {
scrollCount += Math.PI / (speed / (newTimestamp - oldTimestamp));
newValue = Math.round(value + cosParameter + cosParameter * Math.cos(scrollCount));
// Only continue animation if scroll position has not changed
if ( this.element.nativeElement[target] === oldValue )
{
if ( scrollCount >= Math.PI )
{
this.element.nativeElement[target] = value;
// PS has weird event sending order, this is a workaround for that
this.update();
this.update();
}
else
{
this.element.nativeElement[target] = oldValue = newValue;
oldTimestamp = newTimestamp;
window.requestAnimationFrame(step);
}
}
};
window.requestAnimationFrame(step);
}
}
}

View File

@@ -1,4 +1,4 @@
import { Directive, Input, OnInit, HostListener, OnDestroy, HostBinding, AfterViewInit } from '@angular/core'; import { Directive, Input, OnInit, HostListener, OnDestroy, HostBinding } from '@angular/core';
import { MdSidenav } from '@angular/material'; import { MdSidenav } from '@angular/material';
import { FuseMdSidenavHelperService } from 'app/core/directives/md-sidenav-helper/md-sidenav-helper.service'; import { FuseMdSidenavHelperService } from 'app/core/directives/md-sidenav-helper/md-sidenav-helper.service';
import { FuseMatchMedia } from '../../services/match-media.service'; import { FuseMatchMedia } from '../../services/match-media.service';
@@ -8,7 +8,7 @@ import { Subscription } from 'rxjs/Subscription';
@Directive({ @Directive({
selector: '[fuseMdSidenavHelper]' selector: '[fuseMdSidenavHelper]'
}) })
export class FuseMdSidenavHelperDirective implements OnInit, AfterViewInit, OnDestroy export class FuseMdSidenavHelperDirective implements OnInit, OnDestroy
{ {
matchMediaSubscription: Subscription; matchMediaSubscription: Subscription;
@@ -33,45 +33,47 @@ export class FuseMdSidenavHelperDirective implements OnInit, AfterViewInit, OnDe
if ( this.observableMedia.isActive(this.mdIsLockedOpenBreakpoint) ) if ( this.observableMedia.isActive(this.mdIsLockedOpenBreakpoint) )
{ {
setTimeout(() => {
this.isLockedOpen = true; this.isLockedOpen = true;
this.mdSidenav.mode = 'side'; this.mdSidenav.mode = 'side';
setTimeout(() => {
this.mdSidenav.open(); this.mdSidenav.open();
}); });
this.stopTransition = false;
} }
else else
{ {
setTimeout(() => {
this.isLockedOpen = false; this.isLockedOpen = false;
this.mdSidenav.mode = 'over'; this.mdSidenav.mode = 'over';
setTimeout(() => {
this.mdSidenav.close(); this.mdSidenav.close();
}); });
setTimeout(() => {
this.stopTransition = false;
}, 3000);
} }
this.matchMediaSubscription = this.fuseMatchMedia.onMediaChange.subscribe(() => { this.matchMediaSubscription = this.fuseMatchMedia.onMediaChange.subscribe(() => {
if ( this.observableMedia.isActive(this.mdIsLockedOpenBreakpoint) ) if ( this.observableMedia.isActive(this.mdIsLockedOpenBreakpoint) )
{ {
setTimeout(() => {
this.isLockedOpen = true; this.isLockedOpen = true;
this.mdSidenav.mode = 'side'; this.mdSidenav.mode = 'side';
this.mdSidenav.open(); this.mdSidenav.open();
});
} }
else else
{ {
setTimeout(() => {
this.isLockedOpen = false; this.isLockedOpen = false;
this.mdSidenav.mode = 'over'; this.mdSidenav.mode = 'over';
this.mdSidenav.close(); this.mdSidenav.close();
});
} }
}); });
} }
ngAfterViewInit()
{
setTimeout(() => {
this.stopTransition = false;
}, 0);
}
ngOnDestroy() ngOnDestroy()
{ {
this.matchMediaSubscription.unsubscribe(); this.matchMediaSubscription.unsubscribe();

View File

@@ -1,6 +1,5 @@
export class FuseUtils export class FuseUtils
{ {
public static filterArrayByString(mainArr, searchText) public static filterArrayByString(mainArr, searchText)
{ {
if ( searchText === '' ) if ( searchText === '' )
@@ -17,7 +16,6 @@ export class FuseUtils
public static searchInObj(itemObj, searchText) public static searchInObj(itemObj, searchText)
{ {
for ( const prop in itemObj ) for ( const prop in itemObj )
{ {
if ( !itemObj.hasOwnProperty(prop) ) if ( !itemObj.hasOwnProperty(prop) )
@@ -29,7 +27,7 @@ export class FuseUtils
if ( typeof value === 'string' ) if ( typeof value === 'string' )
{ {
if ( this.searchInSting(value, searchText) ) if ( this.searchInString(value, searchText) )
{ {
return true; return true;
} }
@@ -41,7 +39,6 @@ export class FuseUtils
{ {
return true; return true;
} }
} }
if ( typeof value === 'object' ) if ( typeof value === 'object' )
@@ -60,7 +57,7 @@ export class FuseUtils
{ {
if ( typeof value === 'string' ) if ( typeof value === 'string' )
{ {
if ( this.searchInSting(value, searchText) ) if ( this.searchInString(value, searchText) )
{ {
return true; return true;
} }
@@ -76,7 +73,7 @@ export class FuseUtils
} }
} }
public static searchInSting(value, searchText) public static searchInString(value, searchText)
{ {
return value.toLowerCase().includes(searchText); return value.toLowerCase().includes(searchText);
} }
@@ -90,4 +87,16 @@ export class FuseUtils
return (S4() + S4()); return (S4() + S4());
} }
public static toggleInArray(item, array)
{
if ( array.indexOf(item) === -1 )
{
array.push(item);
}
else
{
array.splice(array.indexOf(item), 1);
}
}
} }

View File

@@ -4,7 +4,6 @@ import { CommonModule } from '@angular/common';
import { MaterialModule } from './material.module'; import { MaterialModule } from './material.module';
import { FlexLayoutModule } from '@angular/flex-layout'; import { FlexLayoutModule } from '@angular/flex-layout';
import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar';
import { ColorPickerModule } from 'ngx-color-picker'; import { ColorPickerModule } from 'ngx-color-picker';
import { NgxDnDModule } from '@swimlane/ngx-dnd'; import { NgxDnDModule } from '@swimlane/ngx-dnd';
import { NgxDatatableModule } from '@swimlane/ngx-datatable'; import { NgxDatatableModule } from '@swimlane/ngx-datatable';
@@ -13,13 +12,14 @@ import { FuseMdSidenavHelperDirective, FuseMdSidenavTogglerDirective } from '../
import { FusePipesModule } from '../pipes/pipes.module'; import { FusePipesModule } from '../pipes/pipes.module';
import { FuseConfirmDialogComponent } from '../components/confirm-dialog/confirm-dialog.component'; import { FuseConfirmDialogComponent } from '../components/confirm-dialog/confirm-dialog.component';
import { FuseCountdownComponent } from '../components/countdown/countdown.component'; import { FuseCountdownComponent } from '../components/countdown/countdown.component';
import { FuseNavigationService } from '../components/navigation/navigation.service';
import { FuseMatchMedia } from '../services/match-media.service'; import { FuseMatchMedia } from '../services/match-media.service';
import { FuseNavbarService } from '../../main/navbar/navbar.service'; import { FuseNavbarVerticalService } from '../../main/navbar/vertical/navbar-vertical.service';
import { FuseMdSidenavHelperService } from '../directives/md-sidenav-helper/md-sidenav-helper.service'; import { FuseMdSidenavHelperService } from '../directives/md-sidenav-helper/md-sidenav-helper.service';
import { FuseHljsComponent } from '../components/hljs/hljs.component'; import { FuseHljsComponent } from '../components/hljs/hljs.component';
import { FusePerfectScrollbarDirective } from '../directives/fuse-perfect-scrollbar/fuse-perfect-scrollbar.directive';
import { FuseIfOnDomDirective } from '../directives/fuse-if-on-dom/fuse-if-on-dom.directive'; import { FuseIfOnDomDirective } from '../directives/fuse-if-on-dom/fuse-if-on-dom.directive';
import { FuseMaterialColorPickerComponent } from '../components/material-color-picker/material-color-picker.component'; import { FuseMaterialColorPickerComponent } from '../components/material-color-picker/material-color-picker.component';
import { Md2Module } from 'md2';
import { CookieService } from 'ngx-cookie-service'; import { CookieService } from 'ngx-cookie-service';
@NgModule({ @NgModule({
@@ -30,6 +30,7 @@ import { CookieService } from 'ngx-cookie-service';
FuseCountdownComponent, FuseCountdownComponent,
FuseHljsComponent, FuseHljsComponent,
FuseIfOnDomDirective, FuseIfOnDomDirective,
FusePerfectScrollbarDirective,
FuseMaterialColorPickerComponent FuseMaterialColorPickerComponent
], ],
imports : [ imports : [
@@ -38,11 +39,11 @@ import { CookieService } from 'ngx-cookie-service';
CommonModule, CommonModule,
FormsModule, FormsModule,
FusePipesModule, FusePipesModule,
PerfectScrollbarModule,
ReactiveFormsModule, ReactiveFormsModule,
ColorPickerModule, ColorPickerModule,
NgxDnDModule, NgxDnDModule,
NgxDatatableModule NgxDatatableModule,
Md2Module
], ],
exports : [ exports : [
FlexLayoutModule, FlexLayoutModule,
@@ -54,22 +55,22 @@ import { CookieService } from 'ngx-cookie-service';
FusePipesModule, FusePipesModule,
FuseCountdownComponent, FuseCountdownComponent,
FuseHljsComponent, FuseHljsComponent,
PerfectScrollbarModule, FusePerfectScrollbarDirective,
ReactiveFormsModule, ReactiveFormsModule,
ColorPickerModule, ColorPickerModule,
NgxDnDModule, NgxDnDModule,
NgxDatatableModule, NgxDatatableModule,
FuseIfOnDomDirective, FuseIfOnDomDirective,
FuseMaterialColorPickerComponent FuseMaterialColorPickerComponent,
Md2Module
], ],
entryComponents: [ entryComponents: [
FuseConfirmDialogComponent FuseConfirmDialogComponent
], ],
providers : [ providers : [
CookieService, CookieService,
FuseNavigationService,
FuseMatchMedia, FuseMatchMedia,
FuseNavbarService, FuseNavbarVerticalService,
FuseMdSidenavHelperService FuseMdSidenavHelperService
] ]
}) })

View File

@@ -1,6 +1,9 @@
import { Pipe, PipeTransform } from '@angular/core'; import { Pipe, PipeTransform } from '@angular/core';
@Pipe({name: 'getById'}) @Pipe({
name: 'getById',
pure: false
})
export class GetByIdPipe implements PipeTransform export class GetByIdPipe implements PipeTransform
{ {
transform(value: any[], id: number, property: string): any transform(value: any[], id: number, property: string): any

View File

@@ -2,8 +2,8 @@
@import '~@swimlane/ngx-datatable/release/index.css'; @import '~@swimlane/ngx-datatable/release/index.css';
@import '~@swimlane/ngx-datatable/release/themes/material.css'; @import '~@swimlane/ngx-datatable/release/themes/material.css';
@import '~@swimlane/ngx-datatable/release/assets/icons.css'; @import '~@swimlane/ngx-datatable/release/assets/icons.css';
// Perfect Scrollbar // Perfect scrollbar
@import "~perfect-scrollbar/src/css/main"; @import '~perfect-scrollbar/dist/css/perfect-scrollbar.min.css';
// Fuse // Fuse
@import "fuse"; @import "fuse";

View File

@@ -4,3 +4,38 @@
border-radius: 50%; border-radius: 50%;
} }
} }
md-sidenav-container {
md-sidenav {
&[md-is-locked-open].md-stop-transition {
transition: none !important;
transform: translate3d(0, 0, 0) !important;
opacity: 0;
~ .mat-sidenav-content,
~ .mat-drawer-content {
transition: none !important;
}
}
&.mat-sidenav-opened {
&.mat-drawer-side {
~ .mat-sidenav-content,
~ .mat-drawer-content {
transition: none !important;
transform: translate3d(0, 0, 0) !important;
}
}
}
&.mat-drawer-end {
}
}
.mat-drawer-content {
}
}

View File

@@ -54,7 +54,8 @@ $matColorHues: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, A100, A200, A400
&.secondary-text, &.secondary-text,
.secondary-text, .secondary-text,
.mat-icon, .mat-icon,
.icon { .icon,
.md2-datepicker-button {
color: rgba(0, 0, 0, 0.54); color: rgba(0, 0, 0, 0.54);
} }
@@ -79,7 +80,8 @@ $matColorHues: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, A100, A200, A400
@else { @else {
.mat-icon, .mat-icon,
.icon { .icon,
.md2-datepicker-button {
color: rgba(255, 255, 255, 1); color: rgba(255, 255, 255, 1);
} }

View File

@@ -11,6 +11,21 @@
white-space: nowrap; white-space: nowrap;
} }
.nav-group {
> .group-title {
position: relative;
display: flex;
align-items: center;
height: 48px;
font-weight: 500;
padding-left: 24px;
margin-top: 8px;
font-size: 12px;
white-space: nowrap;
}
}
.nav-item { .nav-item {
.nav-link { .nav-link {
@@ -118,4 +133,79 @@
} }
} }
} }
> .nav-group {
> .group-items {
> .nav-collapse {
background: transparent;
transition: background 200ms ease-in-out;
&.open {
background: rgba(0, 0, 0, 0.12);
}
}
}
}
&.vertical {
.nav-group {
.group-title {
text-transform: uppercase;
}
}
}
&.horizontal {
display: flex;
flex-direction: row;
.nav-item {
&.nav-collapse {
position: relative;
.children {
display: none;
position: absolute;
top: 0;
left: 100%;
z-index: 999;
min-width: 200px;
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);
&.open {
display: block;
}
.nav-link {
padding-left: 24px !important;
}
}
}
}
> .nav-item {
&.nav-collapse {
position: relative;
> .nav-link {
height: 56px;
.collapse-arrow {
display: none;
}
}
> .children {
top: 100%;
left: 0;
}
}
}
}
} }

View File

@@ -137,19 +137,10 @@ $top-bg-image: url('assets/images/backgrounds/header-bg.png');
@include mat-elevation(7); @include mat-elevation(7);
&.md-is-locked-open { &.md-is-locked-open {
position: relative;
background: none; background: none;
box-shadow: none; box-shadow: none;
} }
&.md-stop-transition {
~ .mat-sidenav-content,
~ .mat-drawer-content {
transition: none;
}
}
.header { .header {
height: $carded-header-height; height: $carded-header-height;
min-height: $carded-header-height; min-height: $carded-header-height;
@@ -233,7 +224,6 @@ $top-bg-image: url('assets/images/backgrounds/header-bg.png');
~ .mat-sidenav-content, ~ .mat-sidenav-content,
~ .mat-drawer-content { ~ .mat-drawer-content {
margin-left: 0 !important;
.center { .center {
margin-left: 0; margin-left: 0;
@@ -257,7 +247,6 @@ $top-bg-image: url('assets/images/backgrounds/header-bg.png');
~ .mat-sidenav-content, ~ .mat-sidenav-content,
~ .mat-drawer-content { ~ .mat-drawer-content {
margin-right: 0 !important;
.center { .center {
margin-right: 0; margin-right: 0;
@@ -284,6 +273,10 @@ $top-bg-image: url('assets/images/backgrounds/header-bg.png');
} }
// Fullwidth // Fullwidth
&.fullwidth {
overflow: auto;
}
&.fullwidth, &.fullwidth,
&.inner-sidenav { &.inner-sidenav {
min-height: 100%; min-height: 100%;
@@ -309,10 +302,6 @@ $top-bg-image: url('assets/images/backgrounds/header-bg.png');
> .mat-drawer-content { > .mat-drawer-content {
flex: 1 0 auto; flex: 1 0 auto;
max-height: none; max-height: none;
> .center {
overflow: hidden;
}
} }
} }
} }
@@ -352,6 +341,7 @@ $top-bg-image: url('assets/images/backgrounds/header-bg.png');
> md-sidenav-container { > md-sidenav-container {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
//flex-direction: row;
flex: 1; flex: 1;
background: none; background: none;
z-index: 2; z-index: 2;
@@ -372,14 +362,6 @@ $top-bg-image: url('assets/images/backgrounds/header-bg.png');
background: transparent; background: transparent;
} }
&.md-stop-transition {
~ .mat-sidenav-content,
~ .mat-drawer-content {
transition: none;
}
}
.sidenav-content { .sidenav-content {
height: 100%; height: 100%;
} }
@@ -467,7 +449,6 @@ $top-bg-image: url('assets/images/backgrounds/header-bg.png');
&.simple { &.simple {
&.fullwidth { &.fullwidth {
overflow: visible;
> .content { > .content {
flex: 1 0 auto; flex: 1 0 auto;
@@ -483,10 +464,6 @@ $top-bg-image: url('assets/images/backgrounds/header-bg.png');
> .mat-sidenav-content, > .mat-sidenav-content,
> .mat-drawer-content { > .mat-drawer-content {
flex: 1 0 auto; flex: 1 0 auto;
> .center {
overflow: hidden;
}
} }
} }
} }

View File

@@ -1,20 +1,23 @@
::-webkit-scrollbar { body:not(.is-mobile) {
::-webkit-scrollbar {
width: 12px; width: 12px;
height: 12px; height: 12px;
background-color: rgba(0, 0, 0, 0); background-color: rgba(0, 0, 0, 0);
} }
::-webkit-scrollbar:hover { ::-webkit-scrollbar:hover {
background-color: rgba(0, 0, 0, 0.12); background-color: rgba(0, 0, 0, 0.12);
} }
::-webkit-scrollbar-thumb { ::-webkit-scrollbar-thumb {
border: 2px solid transparent; border: 2px solid transparent;
box-shadow: inset 0 0 0 24px rgba(0, 0, 0, 0.37); box-shadow: inset 0 0 0 24px rgba(0, 0, 0, 0.37);
border-radius: 24px; border-radius: 24px;
} }
::-webkit-scrollbar-thumb:active { ::-webkit-scrollbar-thumb:active {
box-shadow: inset 0 0 0 24px rgba(0, 0, 0, 0.54); box-shadow: inset 0 0 0 24px rgba(0, 0, 0, 0.54);
border-radius: 24px; border-radius: 24px;
}
} }

View File

@@ -0,0 +1,360 @@
/*@font-face {
font-family: 'fontello';
src: url('../font/fontello.eot?81091010');
src: url('../font/fontello.eot?81091010#iefix') format('embedded-opentype'),
url('../font/fontello.woff2?81091010') format('woff2'),
url('../font/fontello.woff?81091010') format('woff'),
url('../font/fontello.ttf?81091010') format('truetype'),
url('../font/fontello.svg?81091010#fontello') format('svg');
font-weight: normal;
font-style: normal;
}*/
owl-date-time {
[class^="icon-"]:before, [class*=" icon-"]:before {
font-family: "Material Icons";
font-style: normal;
font-weight: normal;
speak: none;
display: flex;
align-items: center;
justify-content: center;
/* For safety - reset parent styles, that can break glyph codes*/
font-variant: normal;
text-transform: none;
/* Font smoothing. That was taken from TWBS */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-cancel:before {
content: 'close';
}
.icon-up-open:before {
content: 'keyboard_arrow_up';
}
.icon-down-open:before {
content: 'keyboard_arrow_down';
}
.icon-left-open:before {
content: 'chevron_left';
}
.icon-right-open:before {
content: 'chevron_right';
}
$white: #FFFFFF;
$black: #000000;
$grey: #DDDDDD;
$blue: #0070BA;
.owl-widget,
.owl-widget * {
box-sizing: border-box;
}
.owl-widget {
font-size: 1em;
}
.owl-state-focus {
}
.owl-corner-all {
border-radius: 2px;
}
.owl-corner-top {
border-top-left-radius: 2px;
border-top-right-radius: 2px;
}
.owl-state-default {
background: #FFFFFF;
color: rgba(0, 0, 0, 0.87);
}
.owl-dateTime-inputWrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
.owl-dateTime-input {
background: none !important;
padding: 0 !important;
cursor: pointer;
.owl-inputtext {
margin: 0;
padding: 8px;
background: none !important;
color: rgba(0, 0, 0, 0.87);
}
}
.owl-dateTime-cancel {
position: relative !important;
right: 0 !important;
top: 0 !important;
transform: none !important;
font-size: 16px !important;
width: 16px !important;
height: 16px !important;
min-width: 16px !important;
min-height: 16px !important;
line-height: 16px !important;
color: rgba(0, 0, 0, 0.54) !important;
}
}
.owl-dateTime {
position: relative;
width: 140px;
&.owl-dateTime-inline {
width: auto;
.owl-dateTime-dialog {
position: relative;
z-index: auto;
}
}
}
.owl-dateTime-dialog {
width: 256px;
user-select: none;
z-index: 99999;
top: 24px !important;
right: 0 !important;
left: auto !important;
@include mat-elevation(4);
}
.owl-dateTime-dialogHeader {
height: 2.5em;
padding: .25em;
background-color: rgba(0, 0, 0, .1);
overflow-y: auto;
}
.owl-calendar-wrapper {
padding: 16px !important;
}
.owl-calendar-control {
.owl-calendar-controlNav {
display: flex;
align-items: center;
justify-content: center;
.nav-prev,
.nav-next {
display: flex;
&:before {
font-family: "Material Icons";
position: relative !important;
right: 0 !important;
top: 0 !important;
transform: none !important;
font-size: 20px !important;
width: 20px !important;
height: 20px !important;
min-width: 20px !important;
min-height: 20px !important;
line-height: 20px !important;
content: "chevron_left";
color: rgba(0, 0, 0, 0.54);
}
}
.nav-next:before {
content: "chevron_right";
}
}
.owl-calendar-controlContent {
.month-control,
.year-control {
font-size: 14px;
font-weight: 500;
cursor: pointer;
}
.month-control {
margin-right: 8px;
}
.year-control {
}
}
}
.owl-calendar {
table {
border-spacing: 0 !important;
}
tbody td {
&.owl-calendar-selected {
background-color: $blue;
color: $white;
}
&.owl-calendar-invalid {
color: #ACACAC;
}
&.owl-calendar-outFocus {
color: $grey;
}
&.owl-calendar-hidden {
visibility: hidden;
}
&:not(.owl-calendar-selected):not(.owl-calendar-invalid):hover {
background-color: lighten($blue, 50%);
color: $black;
}
}
}
.owl-years,
.owl-months {
td.owl-year,
td.owl-month {
padding: 0;
font-size: 16px;
width: 72px;
height: 48px;
line-height: 48px;
cursor: pointer;
}
}
.owl-calendar-yearArrow {
width: 24px !important;
height: 24px !important;
&.left {
left: -16px !important;
}
&.right {
right: -16px !important;
}
}
.owl-weekdays {
th.owl-weekday {
height: 32px;
line-height: 32px;
text-align: center;
font-size: 12px;
padding: 0;
color: rgba(0, 0, 0, 0.37);
}
}
.owl-days {
td.owl-day {
height: 32px;
width: 32px;
line-height: 32px;
cursor: pointer;
border-radius: 100%;
padding: 0;
&.owl-day-today:before {
content: '';
display: block;
position: absolute;
right: 2px;
top: 2px;
border-top: .5em solid lighten($blue, 20%);
border-left: .5em solid transparent;
}
}
}
.owl-timer-wrapper {
height: 88px;
padding: 8px !important;
background-color: rgba(0, 0, 0, 0.06);
.owl-timer-input {
background: none;
width: 100% !important;
text-align: center;
}
.owl-timer-text {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 40%;
font-size: 20px;
}
.owl-meridian-btn {
font-size: .8em;
color: $blue;
background-image: none;
background-color: transparent;
border-color: $blue;
&:hover {
color: $white;
background-color: $blue;
border-color: $blue;
}
}
}
.owl-timer-divider {
display: inline-block;
position: absolute;
width: 8px;
height: 100%;
left: -2px;
.owl-timer-dot {
display: block;
background: rgba(0, 0, 0, 0.37);
width: 3px;
height: 3px;
position: absolute;
left: 50%;
border-radius: 100%;
transform: translateX(-50%);
&.dot-top {
top: 40%;
}
&.dot-bottom {
bottom: 40%;
}
}
}
}

View File

@@ -1,4 +1,5 @@
.ps { .ps {
position: relative;
> .ps__scrollbar-y-rail { > .ps__scrollbar-y-rail {
z-index: 99999; z-index: 99999;

View File

@@ -22,14 +22,15 @@ export class FuseConfigService
// Set the default settings // Set the default settings
this.defaultSettings = { this.defaultSettings = {
layout : { layout : {
navigation: 'left', // 'right', 'left', 'top', none navigation: 'left', // 'right', 'left', 'top', 'none'
toolbar : 'below', // 'above', 'below', none toolbar : 'below', // 'above', 'below', 'none'
footer : 'none' // 'above', 'below', none footer : 'below', // 'above', 'below', 'none'
mode : 'fullwidth' // 'boxed', 'fullwidth'
}, },
colorClasses : { colorClasses : {
toolbar: 'md-white-500-bg', toolbar: 'md-white-500-bg',
navbar : 'md-fuse-dark-500-bg', navbar : 'md-fuse-dark-500-bg',
footer : 'md-fuse-dark-800-bg' footer : 'md-fuse-dark-700-bg'
}, },
customScrollbars: true, customScrollbars: true,
routerAnimation : 'fadeIn' routerAnimation : 'fadeIn'

View File

@@ -12,6 +12,7 @@ import { SearchFakeDb } from './search';
import { QuickPanelFakeDb } from './quick-panel'; import { QuickPanelFakeDb } from './quick-panel';
import { IconsFakeDb } from './icons'; import { IconsFakeDb } from './icons';
import { ProjectsDashboardDb } from './projects-dashboard'; import { ProjectsDashboardDb } from './projects-dashboard';
import { ScrumboardFakeDb } from './scrumboard';
export class FuseFakeDbService implements InMemoryDbService export class FuseFakeDbService implements InMemoryDbService
{ {
@@ -42,7 +43,8 @@ export class FuseFakeDbService implements InMemoryDbService
'quick-panel-events' : QuickPanelFakeDb.events, 'quick-panel-events' : QuickPanelFakeDb.events,
'icons' : IconsFakeDb.icons, 'icons' : IconsFakeDb.icons,
'projects-dashboard-projects': ProjectsDashboardDb.projects, 'projects-dashboard-projects': ProjectsDashboardDb.projects,
'projects-dashboard-widgets' : ProjectsDashboardDb.widgets 'projects-dashboard-widgets' : ProjectsDashboardDb.widgets,
'scrumboard-boards' : ScrumboardFakeDb.boards
}; };
} }
} }

View File

@@ -0,0 +1,787 @@
export class ScrumboardFakeDb
{
public static boards = [
{
'id' : '32gfhaf2',
'name' : 'ACME Frontend Application',
'uri' : 'acme-frontend-application',
'settings': {
'color' : 'fuse-dark',
'subscribed' : false,
'cardCoverImages': true
},
'lists' : [
{
'id' : '56027cf5a2ca3839a5d36103',
'name' : 'Design',
'idCards': [
'5603a2a3cab0c8300f6096b3',
'44d1.2b51ea6cc2b5d.21f4a3412e857.8ffa2d8b44ad9.ac87215ed53a1.67d4921ad8f8d.9f318bcb2'
]
},
{
'id' : '56127cf2a2ca3539g7d36103',
'name' : 'Development',
'idCards': [
'2837273da9b93dd84243s0f9',
'5787b7e4740c57bf0dffd5b6',
'5637273da9b93bb84743a0f9',
'7987.9740ba532b0d4.f9d12243f7362.507c0738dc561.87fba0a03df6e.75e6508cacf10.7a9835b54'
]
},
{
'id' : 'faf244627326f1249525763d',
'name' : 'Upcoming Features',
'idCards': [
'd9005a4b89ed2aadca48a6ad',
'f6b9d7a9247e5d794a081927',
'80ed.24ad3b18e2668.f28fbbceeeff9.5a834620a42f1.5909be19a2bf2.6c4a54947ce2d.da356b0c1',
'0ad2.7862f947bc456.f42b446df54cb.d1dd9e93601a1.9deb1406d1404.0b3c278fc7001.733341b42',
'bad3.51be8ad33acaf.9540ecb37f7e8.6bee596cfe7d3.44c68bee289c4.b96ed0b9f0af7.e14846035'
]
},
{
'id' : 'ad7d.9fffac5dff412.c83bca6853767.8fd7549b2b1ca.ceda8a01774c4.a5cf3976e87e4.ce79eeeea',
'name' : 'Known Bugs',
'idCards': [
'acc6.9c673cd2f5e35.521e91d8d5991.4b2a95e0539d1.027930c0743c5.7ad1ea7bea476.e8fbe6347',
'3279.3d69b40cc0b75.690252b6bea08.1e1789b0b7c2e.2f264b8661ce2.84d5f56910e23.429be5e8a',
'ba01.8e1a43f92a03a.0022bd5cbb9ba.275c64d911d8c.880e0846a3966.f75ff43e53ad.48ad612e7'
]
}
],
'cards' : [
{
'id' : '2837273da9b93dd84243s0f9',
'name' : 'Update generators',
'description' : 'Current generator doesn\'t support Node.js 6 and above.',
'idAttachmentCover': '',
'idMembers' : [
'26027s1930450d8bf7b10828'
],
'idLabels' : [
'26022e4129ad3a5sc28b36cd'
],
'attachments' : [],
'subscribed' : false,
'checklists' : [],
'checkItems' : 0,
'checkItemsChecked': 0,
'comments' : [
{
'idMember': '36027j1930450d8bf7b10158',
'message' : 'AngularCLI could be a nice alternative.',
'time' : 'now'
}
],
'activities' : [],
'due' : null
},
{
'id' : '5603a2a3cab0c8300f6096b3',
'name' : 'Change background colors',
'description' : '',
'idAttachmentCover': '67027cahbe3b52ecf2dc631c',
'idMembers' : [
'76027g1930450d8bf7b10958'
],
'idLabels' : [
'56027e4119ad3a5dc28b36cd',
'5640635e19ad3a5dc21416b2'
],
'attachments' : [
{
'id' : '67027cahbe3b52ecf2dc631c',
'name': 'mail.jpg',
'src' : 'assets/images/scrumboard/mail.jpg',
'time': 'Added Nov 3 at 15:22AM',
'type': 'image'
},
{
'id' : '56027cfcbe1b72ecf1fc452a',
'name': 'calendar.jpg',
'src' : 'assets/images/scrumboard/calendar.jpg',
'time': 'Added Nov 1 at 12:34PM',
'type': 'image'
}
],
'subscribed' : true,
'checklists' : [
{
'id' : '63021cfdbe1x72wcf1fc451v',
'name' : 'Checklist',
'checkItemsChecked': 1,
'checkItems' : [
{
'name' : 'Implement a calendar library',
'checked': false
},
{
'name' : 'Replace event colors with Material Design colors',
'checked': true
},
{
'name' : 'Replace icons with Material Design icons',
'checked': false
},
{
'name' : 'Use moment.js',
'checked': false
}
]
},
{
'name' : 'Checklist 2',
'id' : '74031cfdbe1x72wcz1dc166z',
'checkItemsChecked': 1,
'checkItems' : [
{
'name' : 'Replace event colors with Material Design colors',
'checked': true
},
{
'name' : 'Replace icons with Material Design icons',
'checked': false
},
{
'name' : 'Use moment.js',
'checked': false
}
]
}
],
'checkItems' : 7,
'checkItemsChecked': 2,
'comments' : [
{
'idMember': '56027c1930450d8bf7b10758',
'message' : 'We should be able to add moment.js without any problems',
'time' : '12 mins. ago'
},
{
'idMember': '36027j1930450d8bf7b10158',
'message' : 'I added a link for a page that might help us deciding the colors',
'time' : '30 mins. ago'
}
],
'activities' : [
{
'idMember': '56027c1930450d8bf7b10758',
'message' : 'added a comment',
'time' : '12 mins. ago'
},
{
'idMember': '36027j1930450d8bf7b10158',
'message' : 'added a comment',
'time' : '30 mins. ago'
},
{
'idMember': '36027j1930450d8bf7b10158',
'message' : 'attached a link',
'time' : '45 mins. ago'
}
],
'due' : 'Tue Aug 29 2017 13:16:34 GMT+0300 (Turkey Standard Time)'
},
{
'id' : '5637273da9b93bb84743a0f9',
'name' : 'Fix splash screen bugs',
'description' : '',
'idAttachmentCover': '',
'idMembers' : [
'56027c1930450d8bf7b10758'
],
'idLabels' : [
'5640635e19ad3a5dc21416b2'
],
'attachments' : [],
'subscribed' : true,
'checklists' : [],
'checkItems' : 0,
'checkItemsChecked': 0,
'comments' : [],
'activities' : [],
'due' : null
},
{
'id' : 'd9005a4b89ed2aadca48a6ad',
'name' : 'Add alternative authentication pages',
'description' : '',
'idAttachmentCover': '',
'idMembers' : [
'36027j1930450d8bf7b10158'
],
'idLabels' : [
'6540635g19ad3s5dc31412b2',
'56027e4119ad3a5dc28b36cd'
],
'attachments' : [],
'subscribed' : false,
'checklists' : [
{
'id' : 'dbfb.99bd0ad37dabc.e05046f0c824d.18f26bb524c96.78bebc8488634.240c0ee6a5e45.4cb872965',
'name' : 'Pages',
'checkItemsChecked': 2,
'checkItems' : [
{
'name' : 'Login',
'checked': true
},
{
'name' : 'Register',
'checked': true
},
{
'name' : 'Lost Password',
'checked': false
},
{
'name' : 'Recover Password',
'checked': false
},
{
'name' : 'Activate Account',
'checked': false
}
]
}
],
'checkItems' : 5,
'checkItemsChecked': 2,
'comments' : [],
'activities' : [],
'due' : null
},
{
'id' : '5787b7e4740c57bf0dffd5b6',
'name' : 'Fix the console',
'description' : 'We need to fix the console asap!',
'idAttachmentCover': '',
'idMembers' : [],
'idLabels' : [
'26022e4129ad3a5sc28b36cd'
],
'attachments' : [],
'subscribed' : true,
'checklists' : [],
'checkItems' : 0,
'checkItemsChecked': 0,
'comments' : [
{
'idMember': '36027j1930450d8bf7b10158',
'message' : 'I\'m on it!',
'time' : 'now'
}
],
'activities' : [],
'due' : 'Fri Sep 07 2018 15:00:00 GMT+0300 (Turkey Standard Time)'
},
{
'id' : 'f6b9d7a9247e5d794a081927',
'name' : 'New media player',
'description' : '',
'idAttachmentCover': '',
'idMembers' : [
'76027g1930450d8bf7b10958',
'56027c1930450d8bf7b10758',
'26027s1930450d8bf7b10828'
],
'idLabels' : [
'5640635e19ad3a5dc21416b2',
'6540635g19ad3s5dc31412b2'
],
'attachments' : [],
'subscribed' : false,
'checklists' : [],
'checkItems' : 0,
'checkItemsChecked': 0,
'comments' : [],
'activities' : [],
'due' : null
},
{
'id' : 'acc6.9c673cd2f5e35.521e91d8d5991.4b2a95e0539d1.027930c0743c5.7ad1ea7bea476.e8fbe6347',
'name' : 'Memory Leak',
'description' : '',
'idAttachmentCover': '',
'idMembers' : [
'36027j1930450d8bf7b10158'
],
'idLabels' : [
'26022e4129ad3a5sc28b36cd',
'5640635e19ad3a5dc21416b2'
],
'attachments' : [],
'subscribed' : false,
'checklists' : [],
'checkItems' : 0,
'checkItemsChecked': 0,
'comments' : [],
'activities' : [],
'due' : null
},
{
'id' : '3279.3d69b40cc0b75.690252b6bea08.1e1789b0b7c2e.2f264b8661ce2.84d5f56910e23.429be5e8a',
'name' : 'Broken toolbar on profile page',
'description' : '',
'idAttachmentCover': '',
'idMembers' : [
'26027s1930450d8bf7b10828'
],
'idLabels' : [
'26022e4129ad3a5sc28b36cd'
],
'attachments' : [],
'subscribed' : false,
'checklists' : [],
'checkItems' : 0,
'checkItemsChecked': 0,
'comments' : [
{
'idMember': '36027j1930450d8bf7b10158',
'message' : 'This should be a medium priority bug, shouldn\'t it?',
'time' : 'now'
}
],
'activities' : [],
'due' : null
},
{
'id' : 'ba01.8e1a43f92a03a.0022bd5cbb9ba.275c64d911d8c.880e0846a3966.f75ff43e53ad.48ad612e7',
'name' : 'Button hover style',
'description' : 'If there are 3 or more buttons in certain page, weird flashing happens when you hover over the red ones.',
'idAttachmentCover': '',
'idMembers' : [
'26027s1930450d8bf7b10828'
],
'idLabels' : [
'26022e4129ad3a5sc28b36cd',
'5640635e19ad3a5dc21416b2'
],
'attachments' : [],
'subscribed' : true,
'checklists' : [],
'checkItems' : 0,
'checkItemsChecked': 0,
'comments' : [],
'activities' : [],
'due' : 'Wed Mar 08 2017 12:00:00 GMT+0300 (Turkey Standard Time)'
},
{
'id' : '80ed.24ad3b18e2668.f28fbbceeeff9.5a834620a42f1.5909be19a2bf2.6c4a54947ce2d.da356b0c1',
'name' : 'New header designs',
'description' : '',
'idAttachmentCover': '12027cafbe3b52ecf2ef632c',
'idMembers' : [],
'idLabels' : [
'56027e4119ad3a5dc28b36cd',
'6540635g19ad3s5dc31412b2',
'5640635e19ad3a5dc21416b2'
],
'attachments' : [
{
'id' : '12027cafbe3b52ecf2ef632c',
'name': 'header-.jpg',
'src' : 'assets/images/scrumboard/header-1.jpg',
'time': 'Added Nov 3 at 15:22AM',
'type': 'image'
},
{
'id' : '55027ced1e1a12ecf1fced2a',
'name': 'header-2.jpg',
'src' : 'assets/images/scrumboard/header-2.jpg',
'time': 'Added Nov 1 at 12:34PM',
'type': 'image'
}
],
'subscribed' : false,
'checklists' : [],
'checkItems' : 0,
'checkItemsChecked': 0,
'comments' : [
{
'idMember': '36027j1930450d8bf7b10158',
'message' : 'Currently we have two new designs ready to ship.',
'time' : 'now'
}
],
'activities' : [],
'due' : null
},
{
'id' : '0ad2.7862f947bc456.f42b446df54cb.d1dd9e93601a1.9deb1406d1404.0b3c278fc7001.733341b42',
'name' : 'Fixed footer',
'description' : '',
'idAttachmentCover': '',
'idMembers' : [
'26027s1930450d8bf7b10828',
'56027c1930450d8bf7b10758'
],
'idLabels' : [
'6540635g19ad3s5dc31412b2'
],
'attachments' : [],
'subscribed' : true,
'checklists' : [],
'checkItems' : 0,
'checkItemsChecked': 0,
'comments' : [],
'activities' : [],
'due' : null
},
{
'id' : 'bad3.51be8ad33acaf.9540ecb37f7e8.6bee596cfe7d3.44c68bee289c4.b96ed0b9f0af7.e14846035',
'name' : 'Collapsable navigation',
'description' : '',
'idAttachmentCover': '',
'idMembers' : [],
'idLabels' : [
'6540635g19ad3s5dc31412b2'
],
'attachments' : [],
'subscribed' : false,
'checklists' : [],
'checkItems' : 0,
'checkItemsChecked': 0,
'comments' : [
{
'idMember': '36027j1930450d8bf7b10158',
'message' : 'I\'m not sure why we re-doing the navigation. The current collapsable navigation works flawlessly.',
'time' : 'now'
}
],
'activities' : [],
'due' : null
},
{
'id' : '44d1.2b51ea6cc2b5d.21f4a3412e857.8ffa2d8b44ad9.ac87215ed53a1.67d4921ad8f8d.9f318bcb2',
'name' : 'Mail app new layout',
'description' : 'Current layout has lots of flaws in mobile. Outlook view should help with that.',
'idAttachmentCover': '',
'idMembers' : [
'56027c1930450d8bf7b10758',
'26027s1930450d8bf7b10828',
'76027g1930450d8bf7b10958',
'36027j1930450d8bf7b10158'
],
'idLabels' : [
'56027e4119ad3a5dc28b36cd',
'26022e4129ad3a5sc28b36cd'
],
'attachments' : [],
'subscribed' : false,
'checklists' : [],
'checkItems' : 0,
'checkItemsChecked': 0,
'comments' : [],
'activities' : [],
'due' : null
},
{
'id' : '7987.9740ba532b0d4.f9d12243f7362.507c0738dc561.87fba0a03df6e.75e6508cacf10.7a9835b54',
'name' : 'API recover and monitoring',
'description' : 'We need a service to monitor and recover failed APIs.',
'idAttachmentCover': '',
'idMembers' : [
'36027j1930450d8bf7b10158',
'76027g1930450d8bf7b10958'
],
'idLabels' : [
'26022e4129ad3a5sc28b36cd',
'5640635e19ad3a5dc21416b2'
],
'attachments' : [],
'subscribed' : true,
'checklists' : [
{
'id' : '6926.2b31d119e4a.889401e0ca7a0.13ad8ce2e569d.976e54e8b5d87.456afccd7e820.d6c77106a',
'name' : 'API Monitoring',
'checkItemsChecked': 2,
'checkItems' : [
{
'name' : 'Simple dashboard design',
'checked': false
},
{
'name' : 'Should be able to see different time periods on the same dashboard',
'checked': true
},
{
'name' : 'Different colors for different clusters',
'checked': true
}
]
},
{
'id' : '7c22.5261c7924387f.248e8b1d32205.003f7a9f501d1.1d48dcdbe8b23.8099dcc5f75a7.29a966196',
'name' : 'API Recovery',
'checkItemsChecked': 1,
'checkItems' : [
{
'name' : 'Warning notifications to all developers',
'checked': false
},
{
'name' : 'Immediate recovery options attached to the notifications',
'checked': true
},
{
'name' : 'Backups every 6hours',
'checked': false
}
]
}
],
'checkItems' : 6,
'checkItemsChecked': 3,
'comments' : [],
'activities' : [],
'due' : 'Fri Feb 02 2017 14:20:34 GMT+0300 (Turkey Standard Time)'
}
],
'members' : [
{
'id' : '56027c1930450d8bf7b10758',
'name' : 'Alice Freeman',
'avatar': 'assets/images/avatars/alice.jpg'
},
{
'id' : '26027s1930450d8bf7b10828',
'name' : 'Danielle Obrien',
'avatar': 'assets/images/avatars/danielle.jpg'
},
{
'id' : '76027g1930450d8bf7b10958',
'name' : 'James Lewis',
'avatar': 'assets/images/avatars/james.jpg'
},
{
'id' : '36027j1930450d8bf7b10158',
'name' : 'Vincent Munoz',
'avatar': 'assets/images/avatars/vincent.jpg'
}
],
'labels' : [
{
'id' : '26022e4129ad3a5sc28b36cd',
'name' : 'High Priority',
'color': 'md-red-500-bg'
},
{
'id' : '56027e4119ad3a5dc28b36cd',
'name' : 'Design',
'color': 'md-orange-400-bg'
},
{
'id' : '5640635e19ad3a5dc21416b2',
'name' : 'App',
'color': 'md-blue-600-bg'
},
{
'id' : '6540635g19ad3s5dc31412b2',
'name' : 'Feature',
'color': 'md-green-400-bg'
}
]
},
{
'id' : '27cfcbe1',
'name' : 'ACME Backend Application',
'uri' : 'acme-backend-application',
'settings': {
'color' : 'blue-grey',
'subscribed' : false,
'cardCoverImages': true
},
'lists' : [
{
'id' : '56027cf5a2ca3839a5d36103',
'name' : 'Designs',
'idCards': [
'5603a2a3cab0c8300f6096b3'
]
},
{
'id' : '56127cf2a2ca3539g7d36103',
'name' : 'Development',
'idCards': [
'5637273da9b93bb84743a0f9'
]
}
],
'cards' : [
{
'id' : '5603a2a3cab0c8300f6096b3',
'name' : 'Calendar App Design',
'description' : '',
'idAttachmentCover': '56027cfcbe1b72ecf1fc452a',
'idMembers' : [
'56027c1930450d8bf7b10758',
'36027j1930450d8bf7b10158'
],
'idLabels' : [
'56027e4119ad3a5dc28b36cd',
'5640635e19ad3a5dc21416b2'
],
'attachments' : [
{
'id' : '56027cfcbe1b72ecf1fc452a',
'name': 'calendar-app-design.jpg',
'src' : 'assets/images/scrumboard/calendar.jpg',
'time': 'Added Nov 1 at 12:34PM',
'type': 'image'
},
{
'id' : '67027cahbe3b52ecf2dc631c',
'url' : 'assets/images/scrumboard/calendar.jpg',
'time': 'Added Nov 3 at 15:22AM',
'type': 'link'
}
],
'subscribed' : true,
'checklists' : [
{
'id' : '63021cfdbe1x72wcf1fc451v',
'name' : 'Checklist',
'checkItemsChecked': 1,
'checkItems' : [
{
'name' : 'Implement a calendar library',
'checked': false
},
{
'name' : 'Replace event colors with Material Design colors',
'checked': true
},
{
'name' : 'Replace icons with Material Design icons',
'checked': false
},
{
'name' : 'Use moment.js',
'checked': false
}
]
},
{
'name' : 'Checklist 2',
'id' : '74031cfdbe1x72wcz1dc166z',
'checkItemsChecked': 1,
'checkItems' : [
{
'name' : 'Replace event colors with Material Design colors',
'checked': true
},
{
'name' : 'Replace icons with Material Design icons',
'checked': false
},
{
'name' : 'Use moment.js',
'checked': false
}
]
}
],
'checkItems' : 7,
'checkItemsChecked': 2,
'comments' : [
{
'idMember': '56027c1930450d8bf7b10758',
'message' : 'We should be able to add moment.js without any problems',
'time' : '12 mins. ago'
},
{
'idMember': '36027j1930450d8bf7b10158',
'message' : 'I added a link for a page that might help us deciding the colors',
'time' : '30 mins. ago'
}
],
'activities' : [
{
'idMember': '56027c1930450d8bf7b10758',
'message' : 'added a comment',
'time' : '12 mins. ago'
},
{
'idMember': '36027j1930450d8bf7b10158',
'message' : 'added a comment',
'time' : '30 mins. ago'
},
{
'idMember': '36027j1930450d8bf7b10158',
'message' : 'attached a link',
'time' : '45 mins. ago'
}
],
'due' : null
},
{
'id' : '5637273da9b93bb84743a0f9',
'name' : 'Fix Splash Screen bugs',
'description' : '',
'idAttachmentCover': '5603a2ae2bbd55bb2db57478',
'idMembers' : [
'56027c1930450d8bf7b10758'
],
'idLabels' : [],
'attachments' : [
{
'id' : '5603a2ae2bbd55bb2db57478',
'name': 'mail-app-design.jpg',
'src' : 'assets/images/scrumboard/mail.jpg',
'time': 'Added Nov 1 at 12:34PM',
'type': 'image'
}
],
'subscribed' : true,
'checklists' : [],
'checkItems' : 0,
'checkItemsChecked': 0,
'comments' : [],
'activities' : [],
'due' : null
}
],
'members' : [
{
'id' : '56027c1930450d8bf7b10758',
'name' : 'Alice Freeman',
'avatar': 'assets/images/avatars/alice.jpg'
},
{
'id' : '26027s1930450d8bf7b10828',
'name' : 'Danielle Obrien',
'avatar': 'assets/images/avatars/danielle.jpg'
},
{
'id' : '76027g1930450d8bf7b10958',
'name' : 'James Lewis',
'avatar': 'assets/images/avatars/james.jpg'
},
{
'id' : '36027j1930450d8bf7b10158',
'name' : 'Vincent Munoz',
'avatar': 'assets/images/avatars/vincent.jpg'
}
],
'labels' : [
{
'id' : '56027e4119ad3a5dc28b36cd',
'name' : 'Design',
'color': 'md-red-500-bg'
},
{
'id' : '5640635e19ad3a5dc21416b2',
'name' : 'App',
'color': 'md-blue-500-bg'
},
{
'id' : '6540635g19ad3s5dc31412b2',
'name' : 'Feature',
'color': 'md-green-400-bg'
}
]
}
];
}

View File

@@ -1,7 +1,7 @@
<div id="calendar" class="page-layout simple fullwidth" perfect-scrollbar> <div id="calendar" class="page-layout simple fullwidth" fusePerfectScrollbar>
<!-- HEADER --> <!-- HEADER -->
<div class="header" [ngClass]="viewDate | date:'MMM'"> <div class="header p-16 p-sm-24" [ngClass]="viewDate | date:'MMM'">
<div class="header-content" fxLayout="column" fxLayoutAlign="space-between"> <div class="header-content" fxLayout="column" fxLayoutAlign="space-between">
@@ -9,9 +9,9 @@
<div class="logo mb-16 mb-sm-0" fxLayout="row" fxLayoutAlign="start center"> <div class="logo mb-16 mb-sm-0" fxLayout="row" fxLayoutAlign="start center">
<md-icon class="logo-icon">today</md-icon> <md-icon class="logo-icon" *fuseIfOnDom [@animate]="{value:'*',params:{delay:'50ms',scale:'0.2'}}">today</md-icon>
<span class="logo-text">Calendar</span> <span class="logo-text" *fuseIfOnDom [@animate]="{value:'*',params:{delay:'100ms',x:'-25px'}}">Calendar</span>
</div> </div>
@@ -50,7 +50,8 @@
<!-- / TOOLBAR --> <!-- / TOOLBAR -->
<!-- HEADER BOTTOM --> <!-- HEADER BOTTOM -->
<div class="header-bottom" fxLayout="row" fxLayoutAlign="center center"> <div class="header-bottom" fxLayout="row" fxLayoutAlign="center center"
*fuseIfOnDom [@animate]="{value:'*',params:{delay:'150ms'}}">
<button md-button class="mat-icon-button arrow" <button md-button class="mat-icon-button arrow"
mwlCalendarPreviousView mwlCalendarPreviousView
@@ -78,7 +79,8 @@
</div> </div>
<!-- ADD EVENT BUTTON --> <!-- ADD EVENT BUTTON -->
<button md-fab class="add-event-button mat-warn" (click)="addEvent()" aria-label="Add event"> <button md-fab class="add-event-button mat-warn" (click)="addEvent()" aria-label="Add event"
*fuseIfOnDom [@animate]="{value:'*',params:{delay:'300ms',scale:'0.2'}}">
<md-icon>add</md-icon> <md-icon>add</md-icon>
</button> </button>
<!-- / ADD EVENT BUTTON --> <!-- / ADD EVENT BUTTON -->
@@ -86,7 +88,7 @@
<!-- / HEADER --> <!-- / HEADER -->
<!-- CONTENT --> <!-- CONTENT -->
<div class="content" perfect-scrollbar> <div class="content" fusePerfectScrollbar *fuseIfOnDom [@animate]="{value:'*',params:{delay:'200ms',y:'50px'}}">
<div [ngSwitch]="view"> <div [ngSwitch]="view">
<mwl-calendar-month-view <mwl-calendar-month-view
*ngSwitchCase="'month'" *ngSwitchCase="'month'"

View File

@@ -26,8 +26,8 @@
} }
.cal-open-day-events { .cal-open-day-events {
background: whitesmoke; background: #455A64;
box-shadow: inset 0 0 15px 0 rgba(0, 0, 0, 0.13); box-shadow: inset 0 0 12px 0 rgba(0, 0, 0, 0.54);
padding: 0; padding: 0;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -44,11 +44,11 @@
transition: box-shadow 300ms ease; transition: box-shadow 300ms ease;
&:first-of-type { &:first-of-type {
margin-top: 24px; margin-top: 16px;
} }
&:last-of-type { &:last-of-type {
margin-bottom: 24px; margin-bottom: 16px;
} }
&:hover { &:hover {
@@ -184,12 +184,13 @@
#calendar { #calendar {
background: #FFFFFF; background: #FFFFFF;
overflow-x: hidden;
overflow-y: auto;
.header { .header {
height: 200px; height: 200px;
min-height: 200px; min-height: 200px;
max-height: 200px; max-height: 200px;
padding: 24px;
position: relative; position: relative;
background-size: 100% auto; background-size: 100% auto;
background-position: 0 50%; background-position: 0 50%;
@@ -197,6 +198,12 @@
background-color: #FAFAFA; background-color: #FAFAFA;
color: #FFFFFF; color: #FFFFFF;
@include media-breakpoint(xs) {
height: 164px;
min-height: 164px;
max-height: 164px;
}
&:before { &:before {
content: ''; content: '';
position: absolute; position: absolute;

View File

@@ -1,5 +1,5 @@
import { startOfDay, endOfDay, subDays, addDays, endOfMonth, isSameDay, isSameMonth, addHours } from 'date-fns'; import { startOfDay, endOfDay, subDays, addDays, endOfMonth, isSameDay, isSameMonth, addHours } from 'date-fns';
import { ChangeDetectionStrategy, Component, OnInit, ViewEncapsulation } from '@angular/core'; import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { Subject } from 'rxjs/Subject'; import { Subject } from 'rxjs/Subject';
import { MdDialog, MdDialogRef } from '@angular/material'; import { MdDialog, MdDialogRef } from '@angular/material';
import { FuseCalendarEventFormDialogComponent } from './event-form/event-form.component'; import { FuseCalendarEventFormDialogComponent } from './event-form/event-form.component';
@@ -13,13 +13,14 @@ import {
CalendarMonthViewDay CalendarMonthViewDay
} from 'angular-calendar'; } from 'angular-calendar';
import { FuseConfirmDialogComponent } from '../../../../core/components/confirm-dialog/confirm-dialog.component'; import { FuseConfirmDialogComponent } from '../../../../core/components/confirm-dialog/confirm-dialog.component';
import { fuseAnimations } from '../../../../core/animations';
@Component({ @Component({
selector : 'fuse-calendar', selector : 'fuse-calendar',
changeDetection: ChangeDetectionStrategy.OnPush,
templateUrl : './calendar.component.html', templateUrl : './calendar.component.html',
styleUrls : ['./calendar.component.scss'], styleUrls : ['./calendar.component.scss'],
encapsulation : ViewEncapsulation.None encapsulation: ViewEncapsulation.None,
animations : fuseAnimations
}) })
export class FuseCalendarComponent implements OnInit export class FuseCalendarComponent implements OnInit
{ {

View File

@@ -1,4 +1,5 @@
<md-toolbar md-dialog-title class="mat-accent m-0"> <div class="dialog-content-wrapper">
<md-toolbar md-dialog-title class="mat-accent m-0">
<div fxFlex fxLayout="row" fxLayoutAlign="space-between center"> <div fxFlex fxLayout="row" fxLayoutAlign="space-between center">
<span class="title dialog-title">{{dialogTitle}}</span> <span class="title dialog-title">{{dialogTitle}}</span>
<button md-button class="mat-icon-button" <button md-button class="mat-icon-button"
@@ -7,13 +8,13 @@
<md-icon>close</md-icon> <md-icon>close</md-icon>
</button> </button>
</div> </div>
</md-toolbar> </md-toolbar>
<div md-dialog-content class="p-24 m-0" perfect-scrollbar> <div md-dialog-content class="p-24 m-0" fusePerfectScrollbar>
<form name="eventForm" [formGroup]="eventForm" class="event-form" fxLayout="column" fxFlex> <form name="eventForm" [formGroup]="eventForm" class="event-form w-100-p" fxLayout="column" fxFlex>
<md-input-container> <md-input-container class="w-100-p">
<input mdInput <input mdInput
name="title" name="title"
formControlName="title" formControlName="title"
@@ -32,7 +33,7 @@
</div> </div>
<div class="py-16" fxFlex="1 0 auto" fxLayout="row" formGroupName="color"> <div class="py-16" fxFlex="1 0 auto" fxLayout="row" formGroupName="color">
<md-input-container class="mr-24"> <md-input-container class="mr-24" fxFlex>
<input mdInput <input mdInput
name="primary color" name="primary color"
formControlName="primary" formControlName="primary"
@@ -43,7 +44,7 @@
[style.background]="event.color.primary" [style.background]="event.color.primary"
(colorPickerChange)="event.color.primary = $event; eventForm.patchValue({color:{primary:$event}})"/> (colorPickerChange)="event.color.primary = $event; eventForm.patchValue({color:{primary:$event}})"/>
</md-input-container> </md-input-container>
<md-input-container> <md-input-container fxFlex>
<input mdInput <input mdInput
name="secondary color" name="secondary color"
formControlName="secondary" formControlName="secondary"
@@ -58,38 +59,40 @@
<div fxFlex="1 0 auto" fxLayout="row"> <div fxFlex="1 0 auto" fxLayout="row">
<md-form-field class="mr-24"> <md-form-field class="mr-24" fxFlex>
<input mdInput [mdDatepicker]="startDatePicker" placeholder="Start Date"> <input mdInput [mdDatepicker]="startDatePicker" placeholder="Start Date">
<md-datepicker-toggle mdSuffix [for]="startDatePicker"></md-datepicker-toggle> <md-datepicker-toggle mdSuffix [for]="startDatePicker"></md-datepicker-toggle>
<md-datepicker #startDatePicker></md-datepicker> <md-datepicker #startDatePicker></md-datepicker>
</md-form-field> </md-form-field>
<md-datepicker #startDatePicker></md-datepicker> <md-input-container class="no-errors-spacer" fxFlex md-no-float>
<input mdInput placeholder="Start Time">
</md-input-container>
</div> </div>
<div fxFlex="1 0 auto" fxLayout="row"> <div fxFlex="1 0 auto" fxLayout="row">
<md-form-field class="mr-24"> <md-form-field class="mr-24" fxFlex>
<input mdInput [mdDatepicker]="endDatePicker" placeholder="End Date"> <input mdInput [mdDatepicker]="endDatePicker" placeholder="End Date">
<md-datepicker-toggle mdSuffix [for]="endDatePicker"></md-datepicker-toggle> <md-datepicker-toggle mdSuffix [for]="endDatePicker"></md-datepicker-toggle>
<md-datepicker #endDatePicker></md-datepicker> <md-datepicker #endDatePicker></md-datepicker>
</md-form-field> </md-form-field>
<md-input-container class="no-errors-spacer" flex md-no-float> <md-input-container class="no-errors-spacer" fxFlex md-no-float>
<input mdInput ng-model="calendarEvent.endTime" placeholder="End Time"> <input mdInput placeholder="End Time">
</md-input-container> </md-input-container>
</div> </div>
<md-input-container formGroupName="meta"> <md-input-container formGroupName="meta" class="w-100-p">
<input mdInput <input mdInput
name="location" name="location"
formControlName="location" formControlName="location"
placeholder="Location"> placeholder="Location">
</md-input-container> </md-input-container>
<md-input-container formGroupName="meta"> <md-input-container formGroupName="meta" class="w-100-p">
<textarea mdInput <textarea mdInput
formControlName="notes" formControlName="notes"
@@ -101,9 +104,9 @@
</form> </form>
</div> </div>
<div md-dialog-actions class="m-0 p-16" fxLayout="row" fxLayoutAlign="space-between center"> <div md-dialog-actions class="m-0 p-16" fxLayout="row" fxLayoutAlign="space-between center">
<button *ngIf="action !=='edit'" <button *ngIf="action !=='edit'"
md-raised-button md-raised-button
@@ -131,5 +134,5 @@
md-tooltip="Delete"> md-tooltip="Delete">
<md-icon>delete</md-icon> <md-icon>delete</md-icon>
</button> </button>
</div>
</div> </div>

View File

@@ -2,11 +2,12 @@
.mat-dialog-container { .mat-dialog-container {
padding: 0; padding: 0;
width: 720px; width: 480px;
} }
}
:host { .dialog-content-wrapper {
max-height: 85vh;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
}
} }

View File

@@ -1,14 +1,15 @@
<div fxFlex fxLayout="column" fxLayoutAlign="center center"> <div fxFlex fxLayout="column" fxLayoutAlign="center center">
<div class="big-circle mat-elevation-z1" fxLayout="column" fxLayoutAlign="center center"> <div class="big-circle mat-elevation-z1 app-logo" fxLayout="column" fxLayoutAlign="center center"
*fuseIfOnDom [@animate]="{value:'*',params:{delay:'50ms',scale:'0.2'}}">
<md-icon class="s-64 s-md-128">chat</md-icon> <md-icon class="s-64 s-md-128">chat</md-icon>
</div> </div>
<span class="app-title my-24">Chat App</span> <span class="app-title my-24" *fuseIfOnDom [@animate]="{value:'*',params:{delay:'100ms',y:'25px'}}">Chat App</span>
<span fxHide fxShow.gt-md class="app-message">Select contact to start the chat!..</span> <span fxHide fxShow.gt-md class="app-message" *fuseIfOnDom [@animate]="{value:'*',params:{delay:'200ms',y:'50px'}}">Select contact to start the chat!..</span>
<button md-raised-button fxHide.gt-md class="" fuseMdSidenavToggler="chat-left-sidenav"> <button md-raised-button fxHide.gt-md class="" fuseMdSidenavToggler="chat-left-sidenav">
Select contact to start the chat!.. Select contact to start the chat!..

View File

@@ -1,9 +1,11 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { fuseAnimations } from '../../../../../core/animations';
@Component({ @Component({
selector : 'fuse-chat-start', selector : 'fuse-chat-start',
templateUrl: './chat-start.component.html', templateUrl: './chat-start.component.html',
styleUrls : ['./chat-start.component.scss'] styleUrls : ['./chat-start.component.scss'],
animations : fuseAnimations
}) })
export class FuseChatStartComponent implements OnInit export class FuseChatStartComponent implements OnInit
{ {

View File

@@ -57,7 +57,7 @@
<!-- / CHAT TOOLBAR --> <!-- / CHAT TOOLBAR -->
<!-- CHAT CONTENT --> <!-- CHAT CONTENT -->
<div id="chat-content" fxFlex perfect-scrollbar> <div id="chat-content" fxFlex fusePerfectScrollbar>
<!-- CHAT MESSAGES --> <!-- CHAT MESSAGES -->
<div class="chat-messages"> <div class="chat-messages">

View File

@@ -3,6 +3,7 @@
flex: 1 0 auto; flex: 1 0 auto;
background: linear-gradient(to bottom, rgba(255, 255, 255, 0.8) 0%, rgba(255, 255, 255, 0.6) 20%, rgba(255, 255, 255, 0.8)); background: linear-gradient(to bottom, rgba(255, 255, 255, 0.8) 0%, rgba(255, 255, 255, 0.6) 20%, rgba(255, 255, 255, 0.8));
overflow: hidden; overflow: hidden;
max-width: 100%;
.chat { .chat {

View File

@@ -1,7 +1,7 @@
import { AfterViewInit, Component, OnInit, ViewChild, ViewChildren } from '@angular/core'; import { AfterViewInit, Component, OnInit, ViewChild, ViewChildren } from '@angular/core';
import { ChatService } from '../chat.service'; import { ChatService } from '../chat.service';
import { NgForm } from '@angular/forms'; import { NgForm } from '@angular/forms';
import { PerfectScrollbarDirective } from 'ngx-perfect-scrollbar'; import { FusePerfectScrollbarDirective } from '../../../../../core/directives/fuse-perfect-scrollbar/fuse-perfect-scrollbar.directive';
@Component({ @Component({
selector : 'fuse-chat-view', selector : 'fuse-chat-view',
@@ -16,7 +16,7 @@ export class FuseChatViewComponent implements OnInit, AfterViewInit
contact: any; contact: any;
replyInput: any; replyInput: any;
selectedChat: any; selectedChat: any;
@ViewChild(PerfectScrollbarDirective) directiveScroll: PerfectScrollbarDirective; @ViewChild(FusePerfectScrollbarDirective) directiveScroll: FusePerfectScrollbarDirective;
@ViewChildren('replyInput') replyInputField; @ViewChildren('replyInput') replyInputField;
@ViewChild('replyForm') replyForm: NgForm; @ViewChild('replyForm') replyForm: NgForm;
@@ -72,11 +72,12 @@ export class FuseChatViewComponent implements OnInit, AfterViewInit
speed = speed || 400; speed = speed || 400;
if ( this.directiveScroll ) if ( this.directiveScroll )
{ {
this.directiveScroll.update();
setTimeout(() => { setTimeout(() => {
this.directiveScroll.scrollToBottom(0, speed); this.directiveScroll.scrollToBottom(0, speed);
}); });
} }
} }
reply(event) reply(event)

View File

@@ -1,4 +1,4 @@
<div id="calendar" class="page-layout carded fullwidth"> <div id="chat" class="page-layout carded fullwidth">
<!-- TOP BACKGROUND --> <!-- TOP BACKGROUND -->
<div class="top-bg md-accent-bg"></div> <div class="top-bg md-accent-bg"></div>

View File

@@ -1,4 +1,6 @@
#calendar { @import "src/app/core/scss/fuse";
#chat {
display: flex; display: flex;
flex: 1; flex: 1;
@@ -7,6 +9,10 @@
max-width: 1400px; max-width: 1400px;
margin: 0 auto; margin: 0 auto;
@include media-breakpoint-down(md) {
padding: 0 !important;
}
.content-card { .content-card {
display: flex; display: flex;
flex: 1; flex: 1;
@@ -22,11 +28,15 @@
> .mat-sidenav-content, > .mat-sidenav-content,
> .mat-drawer-content { > .mat-drawer-content {
display: flex; display: flex;
flex: 1 0 auto; flex: 1 1 auto;
min-height: 100%; min-height: 100%;
height: auto; height: auto;
} }
> .mat-drawer-content {
max-width: 100%;
}
md-sidenav { md-sidenav {
display: flex; display: flex;
flex-direction: column; flex-direction: column;

View File

@@ -1,11 +1,13 @@
import { Component, OnInit, ViewEncapsulation } from '@angular/core'; import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { ChatService } from './chat.service'; import { ChatService } from './chat.service';
import { fuseAnimations } from '../../../../core/animations';
@Component({ @Component({
selector : 'fuse-chat', selector : 'fuse-chat',
templateUrl : './chat.component.html', templateUrl : './chat.component.html',
styleUrls : ['./chat.component.scss'], styleUrls : ['./chat.component.scss'],
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None,
animations : fuseAnimations
}) })
export class FuseChatComponent implements OnInit export class FuseChatComponent implements OnInit
{ {

View File

@@ -98,10 +98,10 @@
<!-- / SIDENAV HEADER --> <!-- / SIDENAV HEADER -->
<!-- SIDENAV CONTENT --> <!-- SIDENAV CONTENT -->
<div class="sidenav-content" perfect-scrollbar fxFlex> <div class="sidenav-content" fusePerfectScrollbar fxFlex>
<!-- CHATS CONTENT --> <!-- CHATS CONTENT -->
<div> <div *fuseIfOnDom [@animateStagger]="{value:'50'}">
<!-- CHATS LIST--> <!-- CHATS LIST-->
<div class="chat-list" fxLayout="column"> <div class="chat-list" fxLayout="column">
@@ -112,7 +112,8 @@
<button md-button class="contact" <button md-button class="contact"
*ngFor="let chat of user.chatList | filter: searchText" *ngFor="let chat of user.chatList | filter: searchText"
(click)="getChat(chat.contactId)" ngClass="{'unread':contact.unread}"> (click)="getChat(chat.contactId)" ngClass="{'unread':contact.unread}"
[@animate]="{value:'*',params:{y:'100%'}}">
<div fxLayout="row" fxLayoutAlign="start center"> <div fxLayout="row" fxLayoutAlign="start center">
@@ -150,9 +151,9 @@
</div> </div>
<button md-button class="contact" <button md-button class="contact"
ng-show="chatSearch"
*ngFor="let contact of contacts| filter: searchText" *ngFor="let contact of contacts| filter: searchText"
(click)="getChat(contact.id)"> (click)="getChat(contact.id)"
[@animate]="{value:'*',params:{y:'100%'}}">
<div fxLayout="row" fxLayoutAlign="start center"> <div fxLayout="row" fxLayoutAlign="start center">
<div class="avatar-wrapper" fxFlex="0 1 auto"> <div class="avatar-wrapper" fxFlex="0 1 auto">

View File

@@ -2,11 +2,13 @@ import { Component, OnInit } from '@angular/core';
import { ChatService } from '../../../chat.service'; import { ChatService } from '../../../chat.service';
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 { ObservableMedia } from '@angular/flex-layout'; import { ObservableMedia } from '@angular/flex-layout';
import { fuseAnimations } from '../../../../../../../core/animations';
@Component({ @Component({
selector : 'fuse-chat-chats-sidenav', selector : 'fuse-chat-chats-sidenav',
templateUrl: './chats.component.html', templateUrl: './chats.component.html',
styleUrls : ['./chats.component.scss'] styleUrls : ['./chats.component.scss'],
animations : fuseAnimations
}) })
export class FuseChatChatsSidenavComponent implements OnInit export class FuseChatChatsSidenavComponent implements OnInit
{ {

View File

@@ -1,12 +1,12 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { Animations } from '../../../../../../core/animations'; import { fuseAnimations } from '../../../../../../core/animations';
import { ChatService } from '../../chat.service'; import { ChatService } from '../../chat.service';
@Component({ @Component({
selector : 'fuse-chat-left-sidenav', selector : 'fuse-chat-left-sidenav',
templateUrl: './left.component.html', templateUrl: './left.component.html',
styleUrls : ['./left.component.scss'], styleUrls : ['./left.component.scss'],
animations : [Animations.slideInLeft, Animations.slideInRight] animations : fuseAnimations
}) })
export class FuseChatLeftSidenavComponent implements OnInit export class FuseChatLeftSidenavComponent implements OnInit
{ {

View File

@@ -29,7 +29,7 @@
</div> </div>
<!-- SIDENAV CONTENT --> <!-- SIDENAV CONTENT -->
<div class="sidenav-content p-16" perfect-scrollbar fxFlex> <div class="sidenav-content p-16" fusePerfectScrollbar fxFlex>
<!-- USER MOOD --> <!-- USER MOOD -->
<md-card> <md-card>

View File

@@ -11,6 +11,10 @@
.toolbar-bottom { .toolbar-bottom {
height: 240px; height: 240px;
@include media-breakpoint-down(md) {
height: 180px;
}
} }
} }

View File

@@ -31,7 +31,7 @@
</div> </div>
<!-- SIDENAV CONTENT --> <!-- SIDENAV CONTENT -->
<div class="sidenav-content p-16" perfect-scrollbar fxFlex *ngIf="contact"> <div class="sidenav-content p-16" fusePerfectScrollbar fxFlex *ngIf="contact">
<!-- CONTACT MOOD --> <!-- CONTACT MOOD -->
<md-card> <md-card>

View File

@@ -11,6 +11,10 @@
.toolbar-bottom { .toolbar-bottom {
height: 240px; height: 240px;
@include media-breakpoint-down(md) {
height: 180px;
}
} }
} }

View File

@@ -1,12 +1,12 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { Animations } from '../../../../../../core/animations'; import { fuseAnimations } from '../../../../../../core/animations';
import { ChatService } from '../../chat.service'; import { ChatService } from '../../chat.service';
@Component({ @Component({
selector : 'fuse-chat-right-sidenav', selector : 'fuse-chat-right-sidenav',
templateUrl: './right.component.html', templateUrl: './right.component.html',
styleUrls : ['./right.component.scss'], styleUrls : ['./right.component.scss'],
animations : [Animations.slideInLeft, Animations.slideInRight] animations : fuseAnimations
}) })
export class FuseChatRightSidenavComponent implements OnInit export class FuseChatRightSidenavComponent implements OnInit
{ {

View File

@@ -1,4 +1,5 @@
<md-toolbar md-dialog-title class="mat-accent m-0"> <div class="dialog-content-wrapper">
<md-toolbar md-dialog-title class="mat-accent m-0">
<div fxFlex fxLayout="row" fxLayoutAlign="space-between center"> <div fxFlex fxLayout="row" fxLayoutAlign="space-between center">
<span class="title dialog-title">{{dialogTitle}}</span> <span class="title dialog-title">{{dialogTitle}}</span>
<button md-button class="mat-icon-button" <button md-button class="mat-icon-button"
@@ -8,14 +9,14 @@
</button> </button>
</div> </div>
<md-toolbar-row class="toolbar-bottom" fxLayout="column" fxLayoutAlign="center center"> <md-toolbar-row class="toolbar-bottom py-8 py-sm-16" fxLayout="column" fxLayoutAlign="center center">
<img [src]="contact.avatar" class=" avatar contact-avatar huge" <img [src]="contact.avatar" class=" avatar contact-avatar huge"
[alt]="contact.name"/> [alt]="contact.name"/>
<div class="contact-name">{{contact.name}}</div> <div class="contact-name">{{contact.name}}</div>
</md-toolbar-row> </md-toolbar-row>
</md-toolbar> </md-toolbar>
<div md-dialog-content class="p-24 m-0" perfect-scrollbar> <div md-dialog-content class="p-24 m-0" fusePerfectScrollbar>
<form [formGroup]="contactForm"> <form [formGroup]="contactForm">
@@ -92,9 +93,9 @@
</form> </form>
</div> </div>
<div md-dialog-actions class="m-0 p-16" fxLayout="row" fxLayoutAlign="space-between center"> <div md-dialog-actions class="m-0 p-16" fxLayout="row" fxLayoutAlign="space-between center">
<button *ngIf="action !=='edit'" <button *ngIf="action !=='edit'"
md-raised-button md-raised-button
@@ -123,4 +124,5 @@
<md-icon>delete</md-icon> <md-icon>delete</md-icon>
</button> </button>
</div>
</div> </div>

View File

@@ -3,14 +3,20 @@
.mat-dialog-container { .mat-dialog-container {
padding: 0; padding: 0;
width: 400px; width: 400px;
overflow: hidden;
.mat-toolbar {
min-height: initial;
}
.toolbar-bottom { .toolbar-bottom {
height: 200px; height: auto;
} }
} }
}
:host { .dialog-content-wrapper {
max-height: 85vh;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
}
} }

View File

@@ -1,5 +1,5 @@
<md-table #table [dataSource]="dataSource"> <md-table #table [dataSource]="dataSource"
[@animateStagger]="{value:'50'}">
<!-- Checkbox Column --> <!-- Checkbox Column -->
<ng-container cdkColumnDef="checkbox"> <ng-container cdkColumnDef="checkbox">
<md-header-cell *cdkHeaderCellDef></md-header-cell> <md-header-cell *cdkHeaderCellDef></md-header-cell>
@@ -95,15 +95,12 @@
<md-header-row *cdkHeaderRowDef="displayedColumns"></md-header-row> <md-header-row *cdkHeaderRowDef="displayedColumns"></md-header-row>
<md-row *cdkRowDef="let contact; columns: displayedColumns;" <md-row *cdkRowDef="let contact; columns: displayedColumns;"
class="contact"
(click)="editContact(contact)" (click)="editContact(contact)"
[ngClass]="{'md-light-blue-50-bg':checkboxes[contact.id]}" [ngClass]="{'md-light-blue-50-bg':checkboxes[contact.id]}"
md-ripple> md-ripple
[@animate]="{value:'*',params:{y:'100%'}}">
</md-row> </md-row>
</md-table> </md-table>
<!-- ADD CONTACT BUTTON -->
<button md-fab class="md-accent-bg" id="add-contact-button" (click)="newContact()" aria-label="add contact">
<md-icon>person_add</md-icon>
</button>
<!-- / ADD CONTACT BUTTON -->

View File

@@ -8,7 +8,7 @@
box-shadow: none; box-shadow: none;
.mat-column-checkbox { .mat-column-checkbox {
flex: 0 1 64px; flex: 0 1 48px;
} }
.mat-column-avatar { .mat-column-avatar {
@@ -22,6 +22,7 @@
.mat-row { .mat-row {
position: relative; position: relative;
cursor: pointer; cursor: pointer;
padding-right: 8px;
.mat-cell { .mat-cell {
min-width: 0; min-width: 0;

View File

@@ -6,11 +6,13 @@ import { MdDialog, MdDialogRef } from '@angular/material';
import { FuseConfirmDialogComponent } from '../../../../../core/components/confirm-dialog/confirm-dialog.component'; import { FuseConfirmDialogComponent } from '../../../../../core/components/confirm-dialog/confirm-dialog.component';
import { FormGroup } from '@angular/forms'; import { FormGroup } from '@angular/forms';
import { DataSource } from '@angular/cdk/collections'; import { DataSource } from '@angular/cdk/collections';
import { fuseAnimations } from '../../../../../core/animations';
@Component({ @Component({
selector : 'fuse-contacts-contact-list', selector : 'fuse-contacts-contact-list',
templateUrl: './contact-list.component.html', templateUrl: './contact-list.component.html',
styleUrls : ['./contact-list.component.scss'] styleUrls : ['./contact-list.component.scss'],
animations : fuseAnimations
}) })
export class FuseContactsContactListComponent implements OnInit export class FuseContactsContactListComponent implements OnInit
{ {
@@ -61,28 +63,6 @@ export class FuseContactsContactListComponent implements OnInit
this.dataSource = new FilesDataSource(this.contactsService); this.dataSource = new FilesDataSource(this.contactsService);
} }
newContact()
{
this.dialogRef = this.dialog.open(FuseContactsContactFormDialogComponent, {
panelClass: 'contact-form-dialog',
data : {
action: 'new'
}
});
this.dialogRef.afterClosed()
.subscribe((response: FormGroup) => {
if ( !response )
{
return;
}
this.contactsService.updateContact(response.getRawValue());
});
}
editContact(contact) editContact(contact)
{ {
this.dialogRef = this.dialog.open(FuseContactsContactFormDialogComponent, { this.dialogRef = this.dialog.open(FuseContactsContactFormDialogComponent, {

View File

@@ -1,7 +1,7 @@
<div id="contacts" class="page-layout simple left-sidenav inner-sidenav" perfect-scrollbar> <div id="contacts" class="page-layout simple left-sidenav inner-sidenav">
<!-- HEADER --> <!-- HEADER -->
<div class="header md-accent-bg p-24" fxLayout="column" fxLayoutAlign="start start" <div class="header md-accent-bg p-16 p-sm-24" fxLayout="column" fxLayoutAlign="start start"
fxLayout.gt-xs="row" fxLayoutAlign.gt-xs="space-between center"> fxLayout.gt-xs="row" fxLayoutAlign.gt-xs="space-between center">
<!-- APP TITLE --> <!-- APP TITLE -->
@@ -14,8 +14,8 @@
</button> </button>
<div class="logo" fxLayout="row" fxLayoutAlign="start center"> <div class="logo" fxLayout="row" fxLayoutAlign="start center">
<md-icon class="logo-icon mr-16">account_box</md-icon> <md-icon class="logo-icon mr-16" *fuseIfOnDom [@animate]="{value:'*',params:{delay:'50ms',scale:'0.2'}}">account_box</md-icon>
<span class="logo-text h1">Contacts</span> <span class="logo-text h1" *fuseIfOnDom [@animate]="{value:'*',params:{delay:'100ms',x:'-25px'}}">Contacts</span>
</div> </div>
</div> </div>
@@ -43,15 +43,15 @@
<!-- SIDENAV --> <!-- SIDENAV -->
<md-sidenav class="sidenav mat-sidenav-opened" align="start" opened="true" mode="side" <md-sidenav class="sidenav mat-sidenav-opened" align="start" opened="true" mode="side"
fuseMdSidenavHelper="contacts-main-sidenav" md-is-locked-open="gt-md"> fuseMdSidenavHelper="contacts-main-sidenav" md-is-locked-open="gt-sm">
<fuse-contacts-main-sidenav></fuse-contacts-main-sidenav> <fuse-contacts-main-sidenav *fuseIfOnDom [@animate]="{value:'*'}"></fuse-contacts-main-sidenav>
</md-sidenav> </md-sidenav>
<!-- / SIDENAV --> <!-- / SIDENAV -->
<!-- CENTER --> <!-- CENTER -->
<div class="center p-24 pr-sm-92" perfect-scrollbar> <div class="center p-24 pb-56 pr-sm-92" fusePerfectScrollbar>
<!-- CONTENT --> <!-- CONTENT -->
<div class="content md-white-bg mat-elevation-z4"> <div class="content md-white-bg mat-elevation-z4">
@@ -67,3 +67,10 @@
</md-sidenav-container> </md-sidenav-container>
</div> </div>
<!-- ADD CONTACT BUTTON -->
<button md-fab class="md-accent-bg" id="add-contact-button" (click)="newContact()" aria-label="add contact"
*fuseIfOnDom [@animate]="{value:'*', params:{delay:'300ms',scale:'.2'}}">
<md-icon>person_add</md-icon>
</button>
<!-- / ADD CONTACT BUTTON -->

View File

@@ -4,3 +4,10 @@
overflow: hidden; overflow: hidden;
} }
} }
#add-contact-button {
position: absolute;
bottom: 12px;
right: 12px;
padding: 0;
z-index: 99;
}

View File

@@ -1,25 +1,53 @@
import { Component, OnInit, ViewEncapsulation } from '@angular/core'; import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { ContactsService } from './contacts.service'; import { ContactsService } from './contacts.service';
import { Animations } from '../../../../core/animations'; import { fuseAnimations } from '../../../../core/animations';
import { FormControl } from '@angular/forms'; import { FormControl, FormGroup } from '@angular/forms';
import { FuseContactsContactFormDialogComponent } from './contact-form/contact-form.component';
import { MdDialog } from '@angular/material';
@Component({ @Component({
selector : 'fuse-contacts', selector : 'fuse-contacts',
templateUrl : './contacts.component.html', templateUrl : './contacts.component.html',
styleUrls : ['./contacts.component.scss'], styleUrls : ['./contacts.component.scss'],
encapsulation: ViewEncapsulation.None, encapsulation: ViewEncapsulation.None,
animations : [Animations.slideInTop] animations : fuseAnimations
}) })
export class FuseContactsComponent implements OnInit export class FuseContactsComponent implements OnInit
{ {
hasSelectedContacts: boolean; hasSelectedContacts: boolean;
searchInput: FormControl; searchInput: FormControl;
dialogRef: any;
constructor(private contactsService: ContactsService) constructor(
private contactsService: ContactsService,
public dialog: MdDialog
)
{ {
this.searchInput = new FormControl(''); this.searchInput = new FormControl('');
} }
newContact()
{
this.dialogRef = this.dialog.open(FuseContactsContactFormDialogComponent, {
panelClass: 'contact-form-dialog',
data : {
action: 'new'
}
});
this.dialogRef.afterClosed()
.subscribe((response: FormGroup) => {
if ( !response )
{
return;
}
this.contactsService.updateContact(response.getRawValue());
});
}
ngOnInit() ngOnInit()
{ {

View File

@@ -1,13 +1,13 @@
<div fxFlex fxLayout="row" fxLayoutAlign="start center" class="p-24"> <div fxFlex fxLayout="row" fxLayoutAlign="start center" class="p-24">
<div class="close-button-wrapper" fxFlex="220px" (click)="deselectAll()"> <div class="close-button-wrapper" fxFlex="0 1 auto" fxFlex.gt-sm="220px" (click)="deselectAll()">
<button class="p-8" md-button fxLayout="row" fxLayoutAlign="start center"> <button class="p-8" md-button fxLayout="row" fxLayoutAlign="start center">
<md-icon class="mr-8">arrow_back</md-icon> <md-icon class="mr-8">arrow_back</md-icon>
<span class="text-uppercase">Back</span> <span class="text-uppercase">Back</span>
</button> </button>
</div> </div>
<div fxFlex fxLayout="row" fxLayoutAlign="space-between center"> <div fxFlex fxLayout="row" fxLayoutAlign="end center" fxLayoutAlign.gt-sm="space-between center">
<div> <div>
<span class="selected-contacts-count"> <span class="selected-contacts-count">

View File

@@ -13,7 +13,7 @@
<!-- / SIDENAV HEADER --> <!-- / SIDENAV HEADER -->
<!-- SIDENAV CONTENT --> <!-- SIDENAV CONTENT -->
<div class="content py-16" perfect-scrollbar> <div class="content py-16" fusePerfectScrollbar>
<div class="nav"> <div class="nav">

View File

@@ -11,7 +11,7 @@
flex-direction: column; flex-direction: column;
padding: 0; padding: 0;
@include media-breakpoint(gt-md) { @include media-breakpoint(gt-sm) {
padding: 24px 4px 24px 24px; padding: 24px 4px 24px 24px;
} }
@@ -21,7 +21,7 @@
flex: 0 1 auto; flex: 0 1 auto;
padding: 0; padding: 0;
@include media-breakpoint(gt-md) { @include media-breakpoint(gt-sm) {
@include mat-elevation(4); @include mat-elevation(4);
} }

View File

@@ -1,16 +1,16 @@
<div id="dashboard-project" class="page-layout simple right-sidenav" fxLayout="row" perfect-scrollbar> <div id="dashboard-project" class="page-layout simple right-sidenav" fxLayout="row">
<md-sidenav-container> <md-sidenav-container>
<!-- CENTER --> <!-- CENTER -->
<div class="center" fxFlex perfect-scrollbar> <div class="center" fxFlex fusePerfectScrollbar>
<!-- HEADER --> <!-- HEADER -->
<div class="header md-accent-bg p-24 pb-0" fxLayout="column" fxLayoutAlign="space-between"> <div class="header md-accent-bg p-24 pb-0" fxLayout="column" fxLayoutAlign="space-between">
<div fxLayout="row" fxLayoutAlign="space-between start"> <div fxLayout="row" fxLayoutAlign="space-between start">
<span class="mat-display-1 mb-0">Welcome back, John!</span> <span class="mat-display-1 mb-0 welcome-message" *fuseIfOnDom [@animate]="{value:'*',params:{x:'50px'}}">Welcome back, John!</span>
<button md-icon-button fuseMdSidenavToggler="dashboards-right-sidenav" fxHide.gt-md> <button md-icon-button fuseMdSidenavToggler="dashboards-right-sidenav" fxHide.gt-md>
<md-icon>menu</md-icon> <md-icon>menu</md-icon>
@@ -41,10 +41,10 @@
<md-tab label="Home"> <md-tab label="Home">
<div class="widget-group p-12" fxLayout="row" fxFlex="100" fxLayoutWrap> <div class="widget-group p-12" fxLayout="row" fxFlex="100" fxLayoutWrap *fuseIfOnDom [@animateStagger]="{value:'50'}">
<!-- WIDGET 1 --> <!-- WIDGET 1 -->
<fuse-widget class="" fxLayout="column" fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25"> <fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25">
<!-- Front --> <!-- Front -->
<div class="fuse-widget-front md-white-bg mat-elevation-z2"> <div class="fuse-widget-front md-white-bg mat-elevation-z2">
@@ -79,7 +79,8 @@
<!-- Back --> <!-- Back -->
<div class="fuse-widget-back p-16 pt-32 md-white-bg mat-elevation-z2"> <div class="fuse-widget-back p-16 pt-32 md-white-bg mat-elevation-z2">
<button md-icon-button fuseWidgetToggle class="fuse-widget-flip-button" ng-click="flipWidget()" aria-label="Flip widget"> <button md-icon-button fuseWidgetToggle class="fuse-widget-flip-button"
aria-label="Flip widget">
<md-icon class="s-16">close</md-icon> <md-icon class="s-16">close</md-icon>
</button> </button>
@@ -93,7 +94,7 @@
<!-- / WIDGET 1 --> <!-- / WIDGET 1 -->
<!-- WIDGET 2 --> <!-- WIDGET 2 -->
<fuse-widget class="" fxLayout="column" fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25"> <fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25">
<!-- Front --> <!-- Front -->
<div class="fuse-widget-front md-white-bg mat-elevation-z2"> <div class="fuse-widget-front md-white-bg mat-elevation-z2">
@@ -121,7 +122,8 @@
<!-- Back --> <!-- Back -->
<div class="fuse-widget-back p-16 pt-32 md-white-bg mat-elevation-z2"> <div class="fuse-widget-back p-16 pt-32 md-white-bg mat-elevation-z2">
<button md-icon-button fuseWidgetToggle class="fuse-widget-flip-button" ng-click="flipWidget()" aria-label="Flip widget"> <button md-icon-button fuseWidgetToggle class="fuse-widget-flip-button"
aria-label="Flip widget">
<md-icon class="s-16">close</md-icon> <md-icon class="s-16">close</md-icon>
</button> </button>
@@ -135,7 +137,7 @@
<!-- / WIDGET 2 --> <!-- / WIDGET 2 -->
<!-- WIDGET 3 --> <!-- WIDGET 3 -->
<fuse-widget class="" fxLayout="column" fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25"> <fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25">
<!-- Front --> <!-- Front -->
<div class="fuse-widget-front md-white-bg mat-elevation-z2"> <div class="fuse-widget-front md-white-bg mat-elevation-z2">
@@ -163,7 +165,8 @@
<!-- Back --> <!-- Back -->
<div class="fuse-widget-back p-16 pt-32 md-white-bg mat-elevation-z2"> <div class="fuse-widget-back p-16 pt-32 md-white-bg mat-elevation-z2">
<button md-icon-button fuseWidgetToggle class="fuse-widget-flip-button" ng-click="flipWidget()" aria-label="Flip widget"> <button md-icon-button fuseWidgetToggle class="fuse-widget-flip-button"
aria-label="Flip widget">
<md-icon class="s-16">close</md-icon> <md-icon class="s-16">close</md-icon>
</button> </button>
@@ -177,7 +180,7 @@
<!-- / WIDGET 3 --> <!-- / WIDGET 3 -->
<!-- WIDGET 4 --> <!-- WIDGET 4 -->
<fuse-widget class="" fxLayout="column" fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25"> <fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25">
<!-- Front --> <!-- Front -->
<div class="fuse-widget-front md-white-bg mat-elevation-z2"> <div class="fuse-widget-front md-white-bg mat-elevation-z2">
@@ -204,7 +207,8 @@
<!-- Back --> <!-- Back -->
<div class="fuse-widget-back p-16 pt-32 md-white-bg mat-elevation-z2"> <div class="fuse-widget-back p-16 pt-32 md-white-bg mat-elevation-z2">
<button md-icon-button fuseWidgetToggle class="fuse-widget-flip-button" ng-click="flipWidget()" aria-label="Flip widget"> <button md-icon-button fuseWidgetToggle class="fuse-widget-flip-button"
aria-label="Flip widget">
<md-icon class="s-16">close</md-icon> <md-icon class="s-16">close</md-icon>
</button> </button>
@@ -219,7 +223,7 @@
<!-- WIDGET 5 --> <!-- WIDGET 5 -->
<fuse-widget class="" fxLayout="row" fxFlex="100"> <fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="row" fxFlex="100">
<!-- Front --> <!-- Front -->
<div class="fuse-widget-front md-white-bg mat-elevation-z2"> <div class="fuse-widget-front md-white-bg mat-elevation-z2">
@@ -282,7 +286,6 @@
[xAxisLabel]="widget5.supporting.xAxisLabel" [xAxisLabel]="widget5.supporting.xAxisLabel"
[yAxisLabel]="widget5.supporting.yAxisLabel" [yAxisLabel]="widget5.supporting.yAxisLabel"
[curve]="widget5.supporting.curve"> [curve]="widget5.supporting.curve">
>
</ngx-charts-area-chart> </ngx-charts-area-chart>
</div> </div>
</div> </div>
@@ -296,7 +299,7 @@
<!-- WIDGET 6 --> <!-- WIDGET 6 -->
<fuse-widget class="" fxLayout="column" fxFlex="100" fxFlex.gt-sm="50"> <fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-sm="50">
<!-- Front --> <!-- Front -->
<div class="fuse-widget-front md-white-bg mat-elevation-z2"> <div class="fuse-widget-front md-white-bg mat-elevation-z2">
@@ -346,7 +349,7 @@
<!-- / WIDGET 6 --> <!-- / WIDGET 6 -->
<!-- WIDGET 7 --> <!-- WIDGET 7 -->
<fuse-widget class="" fxLayout="column" fxFlex="100" fxFlex.gt-sm="50"> <fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-sm="50">
<!-- Front --> <!-- Front -->
<div class="fuse-widget-front md-white-bg mat-elevation-z2"> <div class="fuse-widget-front md-white-bg mat-elevation-z2">
@@ -395,10 +398,10 @@
<md-tab label="Budget Summary"> <md-tab label="Budget Summary">
<!-- WIDGET GROUP --> <!-- WIDGET GROUP -->
<div class="widget-group" fxLayout="row" fxFlex="100" fxLayoutWrap> <div class="widget-group" fxLayout="row" fxFlex="100" fxLayoutWrap *fuseIfOnDom [@animateStagger]="{value:'50'}">
<!-- WIDGET 8 --> <!-- WIDGET 8 -->
<fuse-widget class="" fxLayout="column" fxFlex="100" fxFlex.gt-sm="50"> <fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-sm="50">
<!-- Front --> <!-- Front -->
<div class="fuse-widget-front md-white-bg mat-elevation-z2"> <div class="fuse-widget-front md-white-bg mat-elevation-z2">
@@ -429,7 +432,7 @@
<!-- / WIDGET 8 --> <!-- / WIDGET 8 -->
<!-- WIDGET 9 --> <!-- WIDGET 9 -->
<fuse-widget class="" fxLayout="column" fxFlex="100" fxFlex.gt-sm="50"> <fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-sm="50">
<!-- Front --> <!-- Front -->
<div class="fuse-widget-front md-white-bg mat-elevation-z2"> <div class="fuse-widget-front md-white-bg mat-elevation-z2">
@@ -543,7 +546,7 @@
<!-- / WIDGET 9 --> <!-- / WIDGET 9 -->
<!-- WIDGET 10 --> <!-- WIDGET 10 -->
<fuse-widget class="" fxLayout="row" fxFlex="100"> <fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="row" fxFlex="100">
<!-- Front --> <!-- Front -->
<div class="fuse-widget-front md-white-bg mat-elevation-z2"> <div class="fuse-widget-front md-white-bg mat-elevation-z2">
@@ -590,10 +593,10 @@
<md-tab label="Team Members"> <md-tab label="Team Members">
<!-- WIDGET GROUP --> <!-- WIDGET GROUP -->
<div class="widget-group" fxLayout="row" fxFlex="100" fxLayoutWrap> <div class="widget-group" fxLayout="row" fxFlex="100" fxLayoutWrap *fuseIfOnDom [@animateStagger]="{value:'50'}">
<!-- WIDGET 11 --> <!-- WIDGET 11 -->
<fuse-widget class="" fxLayout="row" fxFlex="100"> <fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="row" fxFlex="100">
<!-- Front --> <!-- Front -->
<div class="fuse-widget-front md-white-bg mat-elevation-z2"> <div class="fuse-widget-front md-white-bg mat-elevation-z2">
@@ -688,14 +691,15 @@
<!-- / CENTER --> <!-- / CENTER -->
<!-- SIDENAV --> <!-- SIDENAV -->
<md-sidenav class="sidenav mat-sidenav-opened" align="end" opened="true" mode="side" fuseMdSidenavHelper="dashboards-right-sidenav" md-is-locked-open="gt-md"> <md-sidenav class="sidenav mat-sidenav-opened" align="end" mode="side" opened="true" fuseMdSidenavHelper="dashboards-right-sidenav" md-is-locked-open="gt-md">
<div class="sidenav-content" fusePerfectScrollbar>
<div class="sidenav-content" perfect-scrollbar>
<!-- WIDGET GROUP --> <!-- WIDGET GROUP -->
<div class="widget-group" fxLayout="column" fxFlex="100"> <div class="widget-group" fxLayout="column" fxFlex="100" *fuseIfOnDom [@animateStagger]="{value:'50'}">
<!-- NOW WIDGET --> <!-- NOW WIDGET -->
<fuse-widget class="sidenav-widget p-0"> <fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="sidenav-widget p-0">
<!-- Front --> <!-- Front -->
<div class="fuse-widget-front"> <div class="fuse-widget-front">
@@ -738,9 +742,8 @@
</fuse-widget> </fuse-widget>
<!-- / NOW WIDGET --> <!-- / NOW WIDGET -->
<!-- WEATHER WIDGET --> <!-- WEATHER WIDGET -->
<fuse-widget class="sidenav-widget p-0"> <fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="sidenav-widget p-0">
<!-- Front --> <!-- Front -->
<div class="fuse-widget-front"> <div class="fuse-widget-front">

View File

@@ -30,6 +30,15 @@
} }
> .content { > .content {
flex: 1;
md-tab-group {
height: 100%;
.mat-tab-body-wrapper {
flex-grow: 1;
}
}
.mat-tab-label-container { .mat-tab-label-container {
padding: 0 24px; padding: 0 24px;

View File

@@ -4,12 +4,14 @@ import * as shape from 'd3-shape';
import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Observable } from 'rxjs/Observable'; import { Observable } from 'rxjs/Observable';
import { DataSource } from '@angular/cdk/collections'; import { DataSource } from '@angular/cdk/collections';
import { fuseAnimations } from '../../../../../core/animations';
@Component({ @Component({
selector : 'fuse-project', selector : 'fuse-project',
templateUrl : './project.component.html', templateUrl : './project.component.html',
styleUrls : ['./project.component.scss'], styleUrls : ['./project.component.scss'],
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None,
animations : fuseAnimations
}) })
export class FuseProjectComponent implements OnInit, OnDestroy export class FuseProjectComponent implements OnInit, OnDestroy
{ {

View File

@@ -1,4 +1,4 @@
<md-table #table [dataSource]="dataSource"> <md-table #table [dataSource]="dataSource" *fuseIfOnDom [@animateStagger]="{value:'50'}">
<!-- Type Column --> <!-- Type Column -->
<ng-container cdkColumnDef="icon"> <ng-container cdkColumnDef="icon">
@@ -53,6 +53,8 @@
<md-row *cdkRowDef="let row; columns: displayedColumns;" <md-row *cdkRowDef="let row; columns: displayedColumns;"
(click)="onSelect(row)" (click)="onSelect(row)"
[ngClass]="{'md-light-blue-50-bg':row == selected}" [ngClass]="{'md-light-blue-50-bg':row == selected}"
md-ripple> md-ripple
[@animate]="{value:'*',params:{y:'100%'}}"
>
</md-row> </md-row>
</md-table> </md-table>

View File

@@ -10,6 +10,7 @@
.mat-row { .mat-row {
position: relative; position: relative;
cursor: pointer; cursor: pointer;
min-height: 64px;
.mat-cell { .mat-cell {

View File

@@ -2,11 +2,13 @@ import { Component, OnInit } from '@angular/core';
import { FileManagerService } from '../file-manager.service'; import { FileManagerService } from '../file-manager.service';
import { Observable } from 'rxjs/Observable'; import { Observable } from 'rxjs/Observable';
import { DataSource } from '@angular/cdk/collections'; import { DataSource } from '@angular/cdk/collections';
import { fuseAnimations } from '../../../../../core/animations';
@Component({ @Component({
selector : 'fuse-file-list', selector : 'fuse-file-list',
templateUrl: './file-list.component.html', templateUrl: './file-list.component.html',
styleUrls : ['./file-list.component.scss'] styleUrls : ['./file-list.component.scss'],
animations : fuseAnimations
}) })
export class FuseFileManagerFileListComponent implements OnInit export class FuseFileManagerFileListComponent implements OnInit
{ {

View File

@@ -1,4 +1,4 @@
<div id="file-manager" class="page-layout simple right-sidenav" perfect-scrollbar> <div id="file-manager" class="page-layout simple right-sidenav" fusePerfectScrollbar>
<md-sidenav-container> <md-sidenav-container>
@@ -34,7 +34,8 @@
<!-- / TOOLBAR --> <!-- / TOOLBAR -->
<!-- BREADCRUMB --> <!-- BREADCRUMB -->
<div class="breadcrumb text-truncate h1 pl-72" fxLayout="row" fxLayoutAlign="start center"> <div class="breadcrumb text-truncate h1 pl-72" fxLayout="row" fxLayoutAlign="start center"
*fuseIfOnDom [@animate]="{value:'*',params:{x:'50px'}}">
<div *ngFor="let path of pathArr; last as isLast" fxLayout="row" fxLayoutAlign="start center"> <div *ngFor="let path of pathArr; last as isLast" fxLayout="row" fxLayoutAlign="start center">
<span>{{path}}</span> <span>{{path}}</span>
<md-icon *ngIf="!isLast" class="separator">chevron_right</md-icon> <md-icon *ngIf="!isLast" class="separator">chevron_right</md-icon>
@@ -48,7 +49,8 @@
<button md-fab <button md-fab
class="add-file-button mat-warn" class="add-file-button mat-warn"
(click)="fileInput.click()" (click)="fileInput.click()"
aria-label="Add file"> aria-label="Add file"
*fuseIfOnDom [@animate]="{value:'*', params:{delay:'300ms',scale:'0.2'}}">
<md-icon>add</md-icon> <md-icon>add</md-icon>
</button> </button>
</div> </div>
@@ -58,7 +60,7 @@
<!-- / HEADER --> <!-- / HEADER -->
<!-- CONTENT --> <!-- CONTENT -->
<div class="content md-white-bg" perfect-scrollbar> <div class="content md-white-bg" fusePerfectScrollbar>
<fuse-file-list></fuse-file-list> <fuse-file-list></fuse-file-list>
</div> </div>
<!-- / CONTENT --> <!-- / CONTENT -->

View File

@@ -1,11 +1,13 @@
import { Component, OnInit, ViewEncapsulation } from '@angular/core'; import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { FileManagerService } from './file-manager.service'; import { FileManagerService } from './file-manager.service';
import { fuseAnimations } from '../../../../core/animations';
@Component({ @Component({
selector : 'fuse-file-manager', selector : 'fuse-file-manager',
templateUrl : './file-manager.component.html', templateUrl : './file-manager.component.html',
styleUrls : ['./file-manager.component.scss'], styleUrls : ['./file-manager.component.scss'],
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None,
animations : fuseAnimations
}) })
export class FuseFileManagerComponent implements OnInit export class FuseFileManagerComponent implements OnInit
{ {
@@ -15,7 +17,6 @@ export class FuseFileManagerComponent implements OnInit
constructor(private fileManagerService: FileManagerService) constructor(private fileManagerService: FileManagerService)
{ {
} }
ngOnInit() ngOnInit()

View File

@@ -27,9 +27,10 @@
<!-- / SIDENAV HEADER --> <!-- / SIDENAV HEADER -->
<!-- SIDENAV CONTENT --> <!-- SIDENAV CONTENT -->
<div class="content p-24 md-white-bg" perfect-scrollbar> <div class="content p-24 md-white-bg" fusePerfectScrollbar>
<div class="file-details"> <div class="file-details"
*fuseIfOnDom [@animate]="{value:'*',params:{delay:'200ms'}}">
<div class="preview file-icon" fxLayout="row" fxLayoutAlign="center center"> <div class="preview file-icon" fxLayout="row" fxLayoutAlign="center center">
<md-icon class="type-icon s-48" [class]="selected.type"></md-icon> <md-icon class="type-icon s-48" [class]="selected.type"></md-icon>

View File

@@ -1,10 +1,12 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { FileManagerService } from '../../file-manager.service'; import { FileManagerService } from '../../file-manager.service';
import { fuseAnimations } from '../../../../../../core/animations';
@Component({ @Component({
selector : 'fuse-file-manager-details-sidenav', selector : 'fuse-file-manager-details-sidenav',
templateUrl: './details.component.html', templateUrl: './details.component.html',
styleUrls : ['./details.component.scss'] styleUrls : ['./details.component.scss'],
animations : fuseAnimations
}) })
export class FuseFileManagerDetailsSidenavComponent implements OnInit export class FuseFileManagerDetailsSidenavComponent implements OnInit
{ {

View File

@@ -10,7 +10,7 @@
<!-- / SIDENAV HEADER --> <!-- / SIDENAV HEADER -->
<!-- SIDENAV CONTENT --> <!-- SIDENAV CONTENT -->
<div class="content py-16" perfect-scrollbar> <div class="content py-16" fusePerfectScrollbar>
<div class="nav"> <div class="nav">

View File

@@ -1,4 +1,5 @@
<md-toolbar md-dialog-title class="mat-accent m-0"> <div class="dialog-content-wrapper">
<md-toolbar md-dialog-title class="mat-accent m-0">
<div fxFlex fxLayout="row" fxLayoutAlign="space-between center"> <div fxFlex fxLayout="row" fxLayoutAlign="space-between center">
<span class="title dialog-title">New Message</span> <span class="title dialog-title">New Message</span>
<button md-button class="mat-icon-button" <button md-button class="mat-icon-button"
@@ -7,9 +8,9 @@
<md-icon>close</md-icon> <md-icon>close</md-icon>
</button> </button>
</div> </div>
</md-toolbar> </md-toolbar>
<div md-dialog-content class="p-24 m-0" perfect-scrollbar> <div md-dialog-content class="p-24 m-0" fusePerfectScrollbar>
<form name="composeForm" [formGroup]="composeForm" class="compose-form" fxLayout="column" fxFlex> <form name="composeForm" [formGroup]="composeForm" class="compose-form" fxLayout="column" fxFlex>
@@ -20,7 +21,7 @@
type="email"> type="email">
</md-input-container> </md-input-container>
<md-input-container ng-class="{'hidden-cc': vm.hiddenCC, 'hidden-bcc': vm.hiddenBCC}"> <md-input-container>
<input mdInput name="to" <input mdInput name="to"
placeholder="To" placeholder="To"
formControlName="to" formControlName="to"
@@ -52,7 +53,8 @@
<md-input-container> <md-input-container>
<textarea mdInput name="message" <textarea mdInput name="message"
placeholder="Message" placeholder="Message"
formControlName="message"> formControlName="message"
rows="6">
</textarea> </textarea>
</md-input-container> </md-input-container>
@@ -81,9 +83,9 @@
</div> </div>
</div> </div>
</form> </form>
</div> </div>
<div md-dialog-actions class="m-0 p-16" fxLayout="row" fxLayoutAlign="space-between center"> <div md-dialog-actions class="m-0 p-16" fxLayout="row" fxLayoutAlign="space-between center">
<div> <div>
<button md-raised-button <button md-raised-button
(click)="dialogRef.close(['send',composeForm])" (click)="dialogRef.close(['send',composeForm])"
@@ -105,4 +107,5 @@
md-tooltip="Delete"> md-tooltip="Delete">
<md-icon>delete</md-icon> <md-icon>delete</md-icon>
</button> </button>
</div>
</div> </div>

View File

@@ -1,13 +1,14 @@
:host {
display: flex;
flex-direction: column;
}
.mail-compose-dialog { .mail-compose-dialog {
.mat-dialog-container { .mat-dialog-container {
padding: 0; padding: 0;
width: 720px; width: 720px;
.compose-form {
.mat-input-container {
width: 100%;
}
.attachment-list { .attachment-list {
font-size: 13px; font-size: 13px;
padding-top: 16px; padding-top: 16px;
@@ -29,4 +30,11 @@
} }
} }
} }
}
.dialog-content-wrapper {
max-height: 85vh;
display: flex;
flex-direction: column;
}
} }

View File

@@ -1,6 +1,6 @@
<div *ngIf="!mail" fxLayout="column" fxLayoutAlign="center center" fxFlex> <div *ngIf="!mail" fxLayout="column" fxLayoutAlign="center center" fxFlex>
<md-icon class="s-128 mb-16">email</md-icon> <md-icon class="s-128 mb-16 select-message-icon" *fuseIfOnDom [@animate]="{value:'*',params:{delay:'300ms',scale:'0.2'}}">email</md-icon>
<span class="select-message-text hint-text">Select a message to read</span> <span class="select-message-text hint-text" *fuseIfOnDom [@animate]="{value:'*',params:{delay:'400ms'}}">Select a message to read</span>
</div> </div>
<div *ngIf="mail"> <div *ngIf="mail">
@@ -85,7 +85,7 @@
</div> </div>
<button md-button [mdMenuTriggerFor]="moreMenu" aria-label="More" class="mat-icon-button" <button md-button [mdMenuTriggerFor]="moreMenu" aria-label="More" class="mat-icon-button"
ng-click="$mdOpenMenu($event)"> (click)="$event.stopPropagation()">
<md-icon>more_vert</md-icon> <md-icon>more_vert</md-icon>
</button> </button>

View File

@@ -2,11 +2,13 @@ import { Component, OnDestroy, OnInit } from '@angular/core';
import { MailService } from '../mail.service'; import { MailService } from '../mail.service';
import { Mail } from '../mail.model'; import { Mail } from '../mail.model';
import { Subscription } from 'rxjs/Subscription'; import { Subscription } from 'rxjs/Subscription';
import { fuseAnimations } from '../../../../../core/animations';
@Component({ @Component({
selector : 'fuse-mail-details', selector : 'fuse-mail-details',
templateUrl: './mail-details.component.html', templateUrl: './mail-details.component.html',
styleUrls : ['./mail-details.component.scss'] styleUrls : ['./mail-details.component.scss'],
animations : fuseAnimations
}) })
export class FuseMailDetailsComponent implements OnInit, OnDestroy export class FuseMailDetailsComponent implements OnInit, OnDestroy
{ {

Some files were not shown because too many files have changed in this diff Show More