mirror of
https://github.com/richard-loafle/fuse-angular.git
synced 2025-12-22 12:27:09 +00:00
Compare commits
65 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f800dc3286 | ||
|
|
619433f101 | ||
|
|
3e9ae83aae | ||
|
|
9400c3d748 | ||
|
|
5e4940fed9 | ||
|
|
8910e6f5dc | ||
|
|
52c5e6a18b | ||
|
|
3d9ded9a44 | ||
|
|
1be3f0066b | ||
|
|
21c96c76da | ||
|
|
5e2e2b7d53 | ||
|
|
dcff423943 | ||
|
|
6747610771 | ||
|
|
e6ee5d017e | ||
|
|
cb2b544526 | ||
|
|
5ace09f782 | ||
|
|
678dde8c0e | ||
|
|
236cf1eb06 | ||
|
|
f4efbe07f7 | ||
|
|
671287b55a | ||
|
|
19c85c964b | ||
|
|
e5cf4fdafb | ||
|
|
098dacf2a5 | ||
|
|
2f8539e987 | ||
|
|
f688a58656 | ||
|
|
9cb8c0c96b | ||
|
|
05575d3f82 | ||
|
|
b9198e3717 | ||
|
|
769e67c2f3 | ||
|
|
32960abd7c | ||
|
|
126e32d9e7 | ||
|
|
d6d74cb998 | ||
|
|
6d20c1d62d | ||
|
|
b55bce2de4 | ||
|
|
6f4dc36a3d | ||
|
|
fe7e6d173b | ||
|
|
b377d99c66 | ||
|
|
d4374e6df0 | ||
|
|
c74fad84b6 | ||
|
|
e09ef05e02 | ||
|
|
2c0fc76b8a | ||
|
|
752660f5dc | ||
|
|
01f00121ba | ||
|
|
dde2333c8a | ||
|
|
babf6dc47b | ||
|
|
55288bbbd4 | ||
|
|
7297a9b4a4 | ||
|
|
4cbbd3a1d6 | ||
|
|
2f4ce6221e | ||
|
|
44cdadaec9 | ||
|
|
d5b6dea1a2 | ||
|
|
31087186f7 | ||
|
|
48a47a0876 | ||
|
|
e0a85a19db | ||
|
|
b21526410a | ||
|
|
ce6797a80b | ||
|
|
7d5693421f | ||
|
|
9106fcd066 | ||
|
|
58bdf07da0 | ||
|
|
58291058ae | ||
|
|
9ae746a3ed | ||
|
|
a7549a1770 | ||
|
|
0bf158f8a5 | ||
|
|
a0da9bd81e | ||
|
|
cd99fbf77a |
@@ -9,6 +9,7 @@
|
|||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"assets": [
|
"assets": [
|
||||||
"assets",
|
"assets",
|
||||||
|
"app/main/content/components/angular-material",
|
||||||
"favicon.ico"
|
"favicon.ico"
|
||||||
],
|
],
|
||||||
"index": "index.html",
|
"index": "index.html",
|
||||||
@@ -25,6 +26,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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).
|
|
||||||
|
|||||||
2188
package-lock.json
generated
2188
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
79
package.json
79
package.json
@@ -1,69 +1,76 @@
|
|||||||
{
|
{
|
||||||
"name": "fuse2",
|
"name": "fuse2",
|
||||||
"version": "1.0.2",
|
"version": "1.1.1",
|
||||||
"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.11",
|
||||||
"@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.11",
|
||||||
"@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",
|
||||||
"angular-calendar": "0.19.0",
|
"angular-calendar": "0.19.0",
|
||||||
"angular-in-memory-web-api": "0.3.2",
|
"angular-in-memory-web-api": "0.4.6",
|
||||||
|
"angular2-markdown": "1.6.0",
|
||||||
"classlist.js": "1.1.20150312",
|
"classlist.js": "1.1.20150312",
|
||||||
"core-js": "2.5.0",
|
"core-js": "2.5.0",
|
||||||
"d3": "4.10.0",
|
"d3": "4.10.0",
|
||||||
"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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,8 +16,11 @@ 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';
|
||||||
|
import { FuseAngularMaterialModule } from './main/content/components/angular-material/angular-material.module';
|
||||||
|
import { MarkdownModule } from 'angular2-markdown';
|
||||||
|
|
||||||
const appRoutes: Routes = [
|
const appRoutes: Routes = [
|
||||||
{
|
{
|
||||||
@@ -45,6 +47,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'
|
||||||
@@ -62,10 +68,12 @@ const appRoutes: Routes = [
|
|||||||
BrowserAnimationsModule,
|
BrowserAnimationsModule,
|
||||||
RouterModule.forRoot(appRoutes),
|
RouterModule.forRoot(appRoutes),
|
||||||
SharedModule,
|
SharedModule,
|
||||||
|
MarkdownModule.forRoot(),
|
||||||
|
|
||||||
InMemoryWebApiModule.forRoot(FuseFakeDbService, {delay: 0}),
|
InMemoryWebApiModule.forRoot(FuseFakeDbService, {
|
||||||
|
delay : 0,
|
||||||
PerfectScrollbarModule.forRoot(),
|
passThruUnknownUrl: true
|
||||||
|
}),
|
||||||
|
|
||||||
FuseMainModule,
|
FuseMainModule,
|
||||||
|
|
||||||
@@ -75,11 +83,13 @@ const appRoutes: Routes = [
|
|||||||
UIModule,
|
UIModule,
|
||||||
ServicesModule,
|
ServicesModule,
|
||||||
ComponentsModule,
|
ComponentsModule,
|
||||||
|
FuseAngularMaterialModule,
|
||||||
ComponentsThirdPartyModule
|
ComponentsThirdPartyModule
|
||||||
],
|
],
|
||||||
providers : [
|
providers : [
|
||||||
FuseSplashScreenService,
|
FuseSplashScreenService,
|
||||||
FuseConfigService
|
FuseConfigService,
|
||||||
|
FuseNavigationService
|
||||||
],
|
],
|
||||||
bootstrap : [
|
bootstrap : [
|
||||||
AppComponent
|
AppComponent
|
||||||
|
|||||||
@@ -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,35 +239,33 @@ export class Animations
|
|||||||
opacity : 0
|
opacity : 0
|
||||||
})
|
})
|
||||||
], {optional: true}),
|
], {optional: true}),
|
||||||
sequence([
|
group([
|
||||||
group([
|
query('fuse-content > :leave', [
|
||||||
query('fuse-content > :leave', [
|
style({
|
||||||
|
transform: 'translateY(0)',
|
||||||
|
opacity : 1
|
||||||
|
}),
|
||||||
|
animate('600ms cubic-bezier(0.0, 0.0, 0.2, 1)',
|
||||||
style({
|
style({
|
||||||
transform: 'translateY(0)',
|
transform: 'translateY(-100%)',
|
||||||
|
opacity : 0
|
||||||
|
}))
|
||||||
|
], {optional: true}),
|
||||||
|
query('fuse-content > :enter', [
|
||||||
|
style({transform: 'translateY(100%)'}),
|
||||||
|
animate('600ms cubic-bezier(0.0, 0.0, 0.2, 1)',
|
||||||
|
style({
|
||||||
|
transform: 'translateY(0%)',
|
||||||
opacity : 1
|
opacity : 1
|
||||||
}),
|
}))
|
||||||
animate('400ms cubic-bezier(0.250, 0.460, 0.450, 0.940)',
|
], {optional: true})
|
||||||
style({
|
]),
|
||||||
transform: 'translateY(-100%)',
|
query('fuse-content > :leave', animateChild(), {optional: true}),
|
||||||
opacity : 0
|
query('fuse-content > :enter', animateChild(), {optional: true})
|
||||||
}))
|
|
||||||
], {optional: true}),
|
|
||||||
query('fuse-content > :enter', [
|
|
||||||
style({transform: 'translateY(100%)'}),
|
|
||||||
animate('400ms cubic-bezier(0.250, 0.460, 0.450, 0.940)',
|
|
||||||
style({
|
|
||||||
transform: 'translateY(0%)',
|
|
||||||
opacity : 1
|
|
||||||
}))
|
|
||||||
], {optional: true})
|
|
||||||
]),
|
|
||||||
query('fuse-content > :leave', 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,33 +324,32 @@ 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.0, 0.0, 0.2, 1)',
|
||||||
animate('300ms cubic-bezier(0.250, 0.460, 0.450, 0.940)',
|
|
||||||
style({
|
|
||||||
opacity: 0
|
|
||||||
}))
|
|
||||||
], {optional: true}),
|
|
||||||
query('fuse-content > :enter', [
|
|
||||||
style({
|
style({
|
||||||
opacity: 0
|
opacity: 0
|
||||||
}),
|
}))
|
||||||
animate('300ms cubic-bezier(0.250, 0.460, 0.450, 0.940)',
|
], {optional: true}),
|
||||||
style({
|
query('fuse-content > :enter', [
|
||||||
opacity: 1
|
style({
|
||||||
}))
|
opacity: 0
|
||||||
], {optional: true}),
|
}),
|
||||||
// ]),
|
animate('300ms cubic-bezier(0.0, 0.0, 0.2, 1)',
|
||||||
|
style({
|
||||||
|
opacity: 1
|
||||||
|
}))
|
||||||
|
], {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})
|
||||||
])
|
]))
|
||||||
]);
|
])
|
||||||
}
|
];
|
||||||
|
|||||||
60
src/app/core/components/copier/copier.service.ts
Normal file
60
src/app/core/components/copier/copier.service.ts
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/**
|
||||||
|
* This class is based on the code in the following projects:
|
||||||
|
*
|
||||||
|
* - https://github.com/zenorocha/select
|
||||||
|
* - https://github.com/zenorocha/clipboard.js/
|
||||||
|
*
|
||||||
|
* Both released under MIT license - © Zeno Rocha
|
||||||
|
*/
|
||||||
|
import {Injectable} from '@angular/core';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class CopierService {
|
||||||
|
|
||||||
|
private textarea: HTMLTextAreaElement;
|
||||||
|
|
||||||
|
/** Copy the text value to the clipboard. */
|
||||||
|
copyText(text: string): boolean {
|
||||||
|
this.createTextareaAndSelect(text);
|
||||||
|
|
||||||
|
const copySuccessful = document.execCommand('copy');
|
||||||
|
this.removeFake();
|
||||||
|
|
||||||
|
return copySuccessful;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a hidden textarea element, sets its value from `text` property,
|
||||||
|
* and makes a selection on it.
|
||||||
|
*/
|
||||||
|
private createTextareaAndSelect(text: string) {
|
||||||
|
// Create a fake element to hold the contents to copy
|
||||||
|
this.textarea = document.createElement('textarea');
|
||||||
|
|
||||||
|
// Prevent zooming on iOS
|
||||||
|
this.textarea.style.fontSize = '12pt';
|
||||||
|
|
||||||
|
// Hide the element
|
||||||
|
this.textarea.classList.add('cdk-visually-hidden');
|
||||||
|
|
||||||
|
// Move element to the same position vertically
|
||||||
|
const yPosition = window.pageYOffset || document.documentElement.scrollTop;
|
||||||
|
this.textarea.style.top = yPosition + 'px';
|
||||||
|
|
||||||
|
this.textarea.setAttribute('readonly', '');
|
||||||
|
this.textarea.value = text;
|
||||||
|
|
||||||
|
document.body.appendChild(this.textarea);
|
||||||
|
|
||||||
|
this.textarea.select();
|
||||||
|
this.textarea.setSelectionRange(0, this.textarea.value.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Remove the text area from the DOM. */
|
||||||
|
private removeFake() {
|
||||||
|
if (this.textarea) {
|
||||||
|
document.body.removeChild(this.textarea);
|
||||||
|
this.textarea = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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'"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<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>
|
||||||
|
<fuse-nav-horizontal-collapse *ngIf="item.type=='group'" [item]="item"></fuse-nav-horizontal-collapse>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
:host {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
:host {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<span class="hint-text">{{ item.title }}</span>
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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,25 @@ 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()
|
||||||
|
{
|
||||||
|
this.navigationModelChangeSubscription.unsubscribe();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1,25 +1,44 @@
|
|||||||
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
|
||||||
{
|
{
|
||||||
|
onNavCollapseToggle = new EventEmitter<any>();
|
||||||
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 +50,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 +60,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 +72,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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,8 @@
|
|||||||
</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>
|
||||||
|
<fuse-nav-vertical-group *ngIf="item.type=='group'" [item]="item"></fuse-nav-vertical-group>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</div>
|
</div>
|
||||||
@@ -0,0 +1,182 @@
|
|||||||
|
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 && 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);
|
||||||
|
this.navigationService.onNavCollapseToggle.emit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expand the collapsable navigation
|
||||||
|
*/
|
||||||
|
expand()
|
||||||
|
{
|
||||||
|
if ( this.isOpen )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.isOpen = true;
|
||||||
|
this.navigationService.onNavCollapseToggle.emit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collapse the collapsable navigation
|
||||||
|
*/
|
||||||
|
collapse()
|
||||||
|
{
|
||||||
|
if ( !this.isOpen )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.isOpen = false;
|
||||||
|
this.navigationService.onNavCollapseToggle.emit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 nav-item';
|
||||||
|
@Input() item: any;
|
||||||
|
|
||||||
|
constructor()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -70,4 +74,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -2,94 +2,97 @@
|
|||||||
<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-group>
|
<md-radio-button class="mr-8 mb-8" value="none">None</md-radio-button>
|
||||||
</md-list-item>
|
</md-radio-group>
|
||||||
|
|
||||||
<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>
|
</md-radio-group>
|
||||||
</md-list-item>
|
|
||||||
|
<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-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>
|
||||||
</md-list-item>
|
|
||||||
|
</div>
|
||||||
|
|
||||||
<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-option value="none">
|
||||||
|
None
|
||||||
|
</md-option>
|
||||||
|
<md-option value="slideUp">
|
||||||
|
Slide up
|
||||||
|
</md-option>
|
||||||
|
<md-option value="slideDown">
|
||||||
|
Slide down
|
||||||
|
</md-option>
|
||||||
|
<md-option value="slideRight">
|
||||||
|
Slide right
|
||||||
|
</md-option>
|
||||||
|
<md-option value="slideLeft">
|
||||||
|
Slide left
|
||||||
|
</md-option>
|
||||||
|
<md-option value="fadeIn">
|
||||||
|
Fade in
|
||||||
|
</md-option>
|
||||||
|
</md-select>
|
||||||
|
|
||||||
<md-list-item>
|
</div>
|
||||||
<div fxFlex fxLayout="row" fxLayoutAlign="space-between center">
|
|
||||||
<h4>Router Animation</h4>
|
|
||||||
<md-select [(ngModel)]="fuseSettings.routerAnimation">
|
|
||||||
<md-option value="none">
|
|
||||||
None
|
|
||||||
</md-option>
|
|
||||||
<md-option value="slideUp">
|
|
||||||
Slide up
|
|
||||||
</md-option>
|
|
||||||
<md-option value="slideDown">
|
|
||||||
Slide down
|
|
||||||
</md-option>
|
|
||||||
<md-option value="slideRight">
|
|
||||||
Slide right
|
|
||||||
</md-option>
|
|
||||||
<md-option value="slideLeft">
|
|
||||||
Slide left
|
|
||||||
</md-option>
|
|
||||||
<md-option value="fadeIn">
|
|
||||||
Fade in
|
|
||||||
</md-option>
|
|
||||||
</md-select>
|
|
||||||
</div>
|
|
||||||
</md-list-item>
|
|
||||||
|
|
||||||
</md-list>
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -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: 0;
|
top: 8px;
|
||||||
right: 0;
|
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;
|
||||||
|
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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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) )
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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) )
|
||||||
{
|
{
|
||||||
this.isLockedOpen = true;
|
|
||||||
this.mdSidenav.mode = 'side';
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
this.isLockedOpen = true;
|
||||||
|
this.mdSidenav.mode = 'side';
|
||||||
this.mdSidenav.open();
|
this.mdSidenav.open();
|
||||||
});
|
});
|
||||||
|
this.stopTransition = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.isLockedOpen = false;
|
|
||||||
this.mdSidenav.mode = 'over';
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
this.isLockedOpen = false;
|
||||||
|
this.mdSidenav.mode = 'over';
|
||||||
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) )
|
||||||
{
|
{
|
||||||
this.isLockedOpen = true;
|
setTimeout(() => {
|
||||||
this.mdSidenav.mode = 'side';
|
this.isLockedOpen = true;
|
||||||
this.mdSidenav.open();
|
this.mdSidenav.mode = 'side';
|
||||||
|
this.mdSidenav.open();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.isLockedOpen = false;
|
setTimeout(() => {
|
||||||
this.mdSidenav.mode = 'over';
|
this.isLockedOpen = false;
|
||||||
this.mdSidenav.close();
|
this.mdSidenav.mode = 'over';
|
||||||
|
this.mdSidenav.close();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngAfterViewInit()
|
|
||||||
{
|
|
||||||
setTimeout(() => {
|
|
||||||
this.stopTransition = false;
|
|
||||||
}, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ngOnDestroy()
|
ngOnDestroy()
|
||||||
{
|
{
|
||||||
this.matchMediaSubscription.unsubscribe();
|
this.matchMediaSubscription.unsubscribe();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import {
|
|||||||
MdTooltipModule,
|
MdTooltipModule,
|
||||||
MdCardModule,
|
MdCardModule,
|
||||||
MdChipsModule,
|
MdChipsModule,
|
||||||
MdCoreModule,
|
|
||||||
MdDatepickerModule,
|
MdDatepickerModule,
|
||||||
MdDialogModule,
|
MdDialogModule,
|
||||||
MdExpansionModule,
|
MdExpansionModule,
|
||||||
@@ -28,6 +27,7 @@ import {
|
|||||||
MdSliderModule,
|
MdSliderModule,
|
||||||
MdSlideToggleModule,
|
MdSlideToggleModule,
|
||||||
MdSnackBarModule,
|
MdSnackBarModule,
|
||||||
|
MdStepperModule,
|
||||||
MdSortModule,
|
MdSortModule,
|
||||||
MdTableModule,
|
MdTableModule,
|
||||||
MdTabsModule
|
MdTabsModule
|
||||||
@@ -42,7 +42,6 @@ import { CdkTableModule } from '@angular/cdk/table';
|
|||||||
MdCardModule,
|
MdCardModule,
|
||||||
MdCheckboxModule,
|
MdCheckboxModule,
|
||||||
MdChipsModule,
|
MdChipsModule,
|
||||||
MdCoreModule,
|
|
||||||
MdDatepickerModule,
|
MdDatepickerModule,
|
||||||
MdDialogModule,
|
MdDialogModule,
|
||||||
MdExpansionModule,
|
MdExpansionModule,
|
||||||
@@ -62,6 +61,7 @@ import { CdkTableModule } from '@angular/cdk/table';
|
|||||||
MdSliderModule,
|
MdSliderModule,
|
||||||
MdSlideToggleModule,
|
MdSlideToggleModule,
|
||||||
MdSnackBarModule,
|
MdSnackBarModule,
|
||||||
|
MdStepperModule,
|
||||||
MdSortModule,
|
MdSortModule,
|
||||||
MdTableModule,
|
MdTableModule,
|
||||||
MdTabsModule,
|
MdTabsModule,
|
||||||
@@ -76,7 +76,6 @@ import { CdkTableModule } from '@angular/cdk/table';
|
|||||||
MdCardModule,
|
MdCardModule,
|
||||||
MdCheckboxModule,
|
MdCheckboxModule,
|
||||||
MdChipsModule,
|
MdChipsModule,
|
||||||
MdCoreModule,
|
|
||||||
MdDatepickerModule,
|
MdDatepickerModule,
|
||||||
MdDialogModule,
|
MdDialogModule,
|
||||||
MdExpansionModule,
|
MdExpansionModule,
|
||||||
@@ -96,6 +95,7 @@ import { CdkTableModule } from '@angular/cdk/table';
|
|||||||
MdSliderModule,
|
MdSliderModule,
|
||||||
MdSlideToggleModule,
|
MdSlideToggleModule,
|
||||||
MdSnackBarModule,
|
MdSnackBarModule,
|
||||||
|
MdStepperModule,
|
||||||
MdSortModule,
|
MdSortModule,
|
||||||
MdTableModule,
|
MdTableModule,
|
||||||
MdTabsModule,
|
MdTabsModule,
|
||||||
|
|||||||
@@ -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,14 +12,16 @@ 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';
|
||||||
|
import { MarkdownModule } from 'angular2-markdown';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations : [
|
declarations : [
|
||||||
@@ -30,6 +31,7 @@ import { CookieService } from 'ngx-cookie-service';
|
|||||||
FuseCountdownComponent,
|
FuseCountdownComponent,
|
||||||
FuseHljsComponent,
|
FuseHljsComponent,
|
||||||
FuseIfOnDomDirective,
|
FuseIfOnDomDirective,
|
||||||
|
FusePerfectScrollbarDirective,
|
||||||
FuseMaterialColorPickerComponent
|
FuseMaterialColorPickerComponent
|
||||||
],
|
],
|
||||||
imports : [
|
imports : [
|
||||||
@@ -38,11 +40,12 @@ import { CookieService } from 'ngx-cookie-service';
|
|||||||
CommonModule,
|
CommonModule,
|
||||||
FormsModule,
|
FormsModule,
|
||||||
FusePipesModule,
|
FusePipesModule,
|
||||||
PerfectScrollbarModule,
|
|
||||||
ReactiveFormsModule,
|
ReactiveFormsModule,
|
||||||
ColorPickerModule,
|
ColorPickerModule,
|
||||||
NgxDnDModule,
|
NgxDnDModule,
|
||||||
NgxDatatableModule
|
NgxDatatableModule,
|
||||||
|
Md2Module,
|
||||||
|
MarkdownModule
|
||||||
],
|
],
|
||||||
exports : [
|
exports : [
|
||||||
FlexLayoutModule,
|
FlexLayoutModule,
|
||||||
@@ -54,22 +57,23 @@ 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,
|
||||||
|
MarkdownModule
|
||||||
],
|
],
|
||||||
entryComponents: [
|
entryComponents: [
|
||||||
FuseConfirmDialogComponent
|
FuseConfirmDialogComponent
|
||||||
],
|
],
|
||||||
providers : [
|
providers : [
|
||||||
CookieService,
|
CookieService,
|
||||||
FuseNavigationService,
|
|
||||||
FuseMatchMedia,
|
FuseMatchMedia,
|
||||||
FuseNavbarService,
|
FuseNavbarVerticalService,
|
||||||
FuseMdSidenavHelperService
|
FuseMdSidenavHelperService
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,22 @@
|
|||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.nav-group {
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
> .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 {
|
||||||
@@ -88,7 +104,9 @@
|
|||||||
|
|
||||||
> .nav-item {
|
> .nav-item {
|
||||||
|
|
||||||
> .nav-link {
|
> .nav-link,
|
||||||
|
&.nav-group > .group-title,
|
||||||
|
&.nav-group > .group-items > .nav-item > .nav-link {
|
||||||
padding-left: 56px;
|
padding-left: 56px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,7 +114,9 @@
|
|||||||
|
|
||||||
> .nav-item {
|
> .nav-item {
|
||||||
|
|
||||||
> .nav-link {
|
> .nav-link,
|
||||||
|
&.nav-group > .group-title,
|
||||||
|
&.nav-group > .group-items > .nav-item > .nav-link {
|
||||||
padding-left: 72px;
|
padding-left: 72px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -118,4 +138,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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,23 @@
|
|||||||
::-webkit-scrollbar {
|
body:not(.is-mobile) {
|
||||||
width: 12px;
|
|
||||||
height: 12px;
|
|
||||||
background-color: rgba(0, 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar:hover {
|
::-webkit-scrollbar {
|
||||||
background-color: rgba(0, 0, 0, 0.12);
|
width: 12px;
|
||||||
}
|
height: 12px;
|
||||||
|
background-color: rgba(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb {
|
::-webkit-scrollbar:hover {
|
||||||
border: 2px solid transparent;
|
background-color: rgba(0, 0, 0, 0.12);
|
||||||
box-shadow: inset 0 0 0 24px rgba(0, 0, 0, 0.37);
|
}
|
||||||
border-radius: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb:active {
|
::-webkit-scrollbar-thumb {
|
||||||
box-shadow: inset 0 0 0 24px rgba(0, 0, 0, 0.54);
|
border: 2px solid transparent;
|
||||||
border-radius: 24px;
|
box-shadow: inset 0 0 0 24px rgba(0, 0, 0, 0.37);
|
||||||
|
border-radius: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb:active {
|
||||||
|
box-shadow: inset 0 0 0 24px rgba(0, 0, 0, 0.54);
|
||||||
|
border-radius: 24px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
360
src/app/core/scss/partials/plugins/_ng-pick-datetime.scss
Normal file
360
src/app/core/scss/partials/plugins/_ng-pick-datetime.scss
Normal 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%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
.ps {
|
.ps {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
> .ps__scrollbar-y-rail {
|
> .ps__scrollbar-y-rail {
|
||||||
z-index: 99999;
|
z-index: 99999;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
@import "highlight";
|
@import "highlight";
|
||||||
|
@import "prism";
|
||||||
@import "perfect-scrollbar";
|
@import "perfect-scrollbar";
|
||||||
@import "ngx-datatable";
|
@import "ngx-datatable";
|
||||||
@import "ngx-color-picker";
|
@import "ngx-color-picker";
|
||||||
|
|||||||
269
src/app/core/scss/partials/plugins/_prism.scss
Normal file
269
src/app/core/scss/partials/plugins/_prism.scss
Normal file
@@ -0,0 +1,269 @@
|
|||||||
|
// Edit the sixteen color-value variables, and create your own syntax highlighter colorscheme
|
||||||
|
|
||||||
|
$base00: #263238;
|
||||||
|
$base01: #2C393F;
|
||||||
|
$base02: #37474F;
|
||||||
|
$base03: #707880;
|
||||||
|
$base04: #C9CCD3;
|
||||||
|
$base05: #CDD3DE;
|
||||||
|
$base06: #D5DBE5;
|
||||||
|
$base07: #FFFFFF;
|
||||||
|
$base08: #EC5F67;
|
||||||
|
$base09: #EA9560;
|
||||||
|
$base0A: #FFCC00;
|
||||||
|
$base0B: #8BD649;
|
||||||
|
$base0C: #80CBC4;
|
||||||
|
$base0D: #89DDFF;
|
||||||
|
$base0E: #82AAFF;
|
||||||
|
$base0F: #EC5F67;
|
||||||
|
|
||||||
|
$red: $base08;
|
||||||
|
$orange: $base09;
|
||||||
|
$yellow: $base0A;
|
||||||
|
$green: $base0B;
|
||||||
|
$cyan: $base0C;
|
||||||
|
$blue: $base0D;
|
||||||
|
$violet: $base0E;
|
||||||
|
$magenta: $base0F;
|
||||||
|
|
||||||
|
$code-font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace;
|
||||||
|
$code-font-size: 14px;
|
||||||
|
$code-line-height: 1.6;
|
||||||
|
$code-background: $base00;
|
||||||
|
$code-color: $base05;
|
||||||
|
$code-color-fade: $base05;
|
||||||
|
// $code-text-shadow: none;
|
||||||
|
$code-color-comment: $base02;
|
||||||
|
$code-color-keyword: $base0B;
|
||||||
|
$code-color-value: $base0C;
|
||||||
|
$code-color-attr-name: $base09;
|
||||||
|
$code-color-string: $base0C;
|
||||||
|
$code-color-name: $base0A;
|
||||||
|
$code-color-number: $base09;
|
||||||
|
$code-color-variable: $base0D;
|
||||||
|
$code-color-selector: $base0E;
|
||||||
|
$code-color-property: $base0A;
|
||||||
|
$code-color-important: $base08;
|
||||||
|
$code-color-tag: $base0D;
|
||||||
|
$code-color-atrule: $base0C;
|
||||||
|
|
||||||
|
// @import "../partials/prism";
|
||||||
|
/**
|
||||||
|
* Prism base code highlighter theme using Sass
|
||||||
|
*
|
||||||
|
* @author @MoOx
|
||||||
|
* https://github.com/MoOx/sass-prism-theme-base/blob/master/_prism.scss
|
||||||
|
* slightly adapted by me, Bram de Haan
|
||||||
|
*/
|
||||||
|
|
||||||
|
// prism selector
|
||||||
|
$code-selector: "code[class*=\"language-\"], pre[class*=\"language-\"]";
|
||||||
|
$code-selector-block: "pre[class*=\"language-\"]";
|
||||||
|
$code-selector-inline: ":not(pre) > code[class*=\"language-\"]";
|
||||||
|
|
||||||
|
// generic stuff
|
||||||
|
$code-font-family: Menlo, Monaco, "Courier New", monospace !default;
|
||||||
|
$code-font-size: 14px !default;
|
||||||
|
$code-line-height: 1.6 !default;
|
||||||
|
|
||||||
|
$code-tab-size: 4 !default;
|
||||||
|
$code-hyphens: none !default;
|
||||||
|
|
||||||
|
$code-block-padding: 12px !default;
|
||||||
|
$code-inline-padding: 2px 6px !default;
|
||||||
|
$code-border-radius: 0 !default;
|
||||||
|
|
||||||
|
$code-border: none !default;
|
||||||
|
$code-background: #2A2A2A !default;
|
||||||
|
$code-color: #FFF !default;
|
||||||
|
$code-color-fade: #BEBEC5 !default;
|
||||||
|
// $code-text-shadow: 0 1px 0 #000 !default;
|
||||||
|
$code-box-shadow: none !default;
|
||||||
|
$code-color-property: #B58900 !default;
|
||||||
|
$code-color-important: #CB4B16 !default;
|
||||||
|
$code-color-tag: #268BD2 !default;
|
||||||
|
$code-color-atrule: #2AA198 !default;
|
||||||
|
$code-color-attr-name: #B65611 !default;
|
||||||
|
|
||||||
|
// $code-linenums-padding: 7px !default;
|
||||||
|
// $code-linenums-width: 40px !default;
|
||||||
|
// $code-linenums-background: #444 !default;
|
||||||
|
// $code-linenums-border-color: #555 !default;
|
||||||
|
// $code-linenums-border-width: 1px !default;
|
||||||
|
|
||||||
|
@if $code-selector != null {
|
||||||
|
#{$code-selector} {
|
||||||
|
-moz-tab-size: $code-tab-size;
|
||||||
|
-o-tab-size: $code-tab-size;
|
||||||
|
tab-size: $code-tab-size;
|
||||||
|
|
||||||
|
-webkit-hyphens: $code-hyphens;
|
||||||
|
-moz-hyphens: $code-hyphens;
|
||||||
|
-ms-hyphens: $code-hyphens;
|
||||||
|
hyphens: $code-hyphens;
|
||||||
|
|
||||||
|
// whitespace management
|
||||||
|
white-space: pre; // fallback
|
||||||
|
white-space: pre-wrap;
|
||||||
|
word-break: break-all;
|
||||||
|
word-wrap: break-word;
|
||||||
|
|
||||||
|
font-family: $code-font-family;
|
||||||
|
font-size: $code-font-size;
|
||||||
|
line-height: $code-line-height;
|
||||||
|
|
||||||
|
color: $code-color;
|
||||||
|
// text-shadow: $code-text-shadow;
|
||||||
|
background: $code-background;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
%code-background {
|
||||||
|
border-radius: $code-border-radius;
|
||||||
|
border: $code-border;
|
||||||
|
box-shadow: $code-box-shadow;
|
||||||
|
}
|
||||||
|
|
||||||
|
@if $code-selector-block != null {
|
||||||
|
#{$code-selector-block} {
|
||||||
|
@extend %code-background;
|
||||||
|
padding: $code-block-padding;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@if $code-selector-inline != null {
|
||||||
|
#{$code-selector-inline} {
|
||||||
|
@extend %code-background;
|
||||||
|
padding: $code-inline-padding;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// pre[class*="language-"],
|
||||||
|
// :not(pre) > code[class*="language-"] {
|
||||||
|
// background: $code-background;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// prism tokens
|
||||||
|
//
|
||||||
|
$code-color-comment: null !default;
|
||||||
|
$code-color-keyword: null !default;
|
||||||
|
$code-color-value: null !default;
|
||||||
|
$code-color-string: null !default;
|
||||||
|
$code-color-name: null !default;
|
||||||
|
$code-color-number: null !default;
|
||||||
|
$code-color-variable: null !default;
|
||||||
|
$code-color-selector: null !default;
|
||||||
|
$code-color-punctuation: $code-color-fade !default;
|
||||||
|
|
||||||
|
#{$code-selector} {
|
||||||
|
.namespace {
|
||||||
|
opacity: .7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token {
|
||||||
|
&.comment,
|
||||||
|
&.prolog,
|
||||||
|
&.doctype,
|
||||||
|
&.cdata {
|
||||||
|
color: $code-color-comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.null,
|
||||||
|
&.operator,
|
||||||
|
&.boolean,
|
||||||
|
&.number {
|
||||||
|
color: $code-color-number;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.string {
|
||||||
|
color: $code-color-string;
|
||||||
|
}
|
||||||
|
&.attr-name {
|
||||||
|
color: $code-color-attr-name;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.entity,
|
||||||
|
&.url,
|
||||||
|
.language-css &.string,
|
||||||
|
.style &.string {
|
||||||
|
color: $code-color-string;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.selector {
|
||||||
|
color: $code-color-selector;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.attr-value,
|
||||||
|
&.keyword,
|
||||||
|
&.control,
|
||||||
|
&.directive,
|
||||||
|
&.unit {
|
||||||
|
color: $code-color-keyword;
|
||||||
|
}
|
||||||
|
&.important {
|
||||||
|
color: $code-color-important;
|
||||||
|
}
|
||||||
|
&.atrule {
|
||||||
|
color: $code-color-atrule;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.regex,
|
||||||
|
&.statement {
|
||||||
|
color: $code-color-value;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.placeholder,
|
||||||
|
&.variable {
|
||||||
|
color: $code-color-variable;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.property,
|
||||||
|
&.tag {
|
||||||
|
// font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.property {
|
||||||
|
color: $code-color-property;
|
||||||
|
}
|
||||||
|
&.tag {
|
||||||
|
color: $code-color-tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.important,
|
||||||
|
&.statement {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
// todo ?
|
||||||
|
// &.mixin
|
||||||
|
// &.gradient
|
||||||
|
// &.abslength
|
||||||
|
// &.easing
|
||||||
|
// &.time
|
||||||
|
// &.angle
|
||||||
|
// &.fontfamily
|
||||||
|
|
||||||
|
// ruby/vim https://github.com/LeaVerou/prism/pull/18
|
||||||
|
// &.inst-var
|
||||||
|
// &.builtin
|
||||||
|
// &.const
|
||||||
|
// &.symbol
|
||||||
|
//
|
||||||
|
// php https://github.com/LeaVerou/prism/pull/20
|
||||||
|
// &.deliminator
|
||||||
|
// &.function
|
||||||
|
|
||||||
|
&.punctuation {
|
||||||
|
color: $code-color-punctuation;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.entity {
|
||||||
|
cursor: help;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for dev :)
|
||||||
|
&.debug {
|
||||||
|
color: red
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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'
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
787
src/app/fuse-fake-db/scrumboard.ts
Normal file
787
src/app/fuse-fake-db/scrumboard.ts
Normal 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'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -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'"
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
|
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
|
||||||
import { Observable } from 'rxjs/Observable';
|
import { Observable } from 'rxjs/Observable';
|
||||||
import { Http } from '@angular/http';
|
|
||||||
import { Subject } from 'rxjs/Subject';
|
import { Subject } from 'rxjs/Subject';
|
||||||
|
import { HttpClient } from '@angular/common/http';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class CalendarService implements Resolve<any>
|
export class CalendarService implements Resolve<any>
|
||||||
@@ -10,7 +10,7 @@ export class CalendarService implements Resolve<any>
|
|||||||
events: any;
|
events: any;
|
||||||
onEventsUpdated = new Subject<any>();
|
onEventsUpdated = new Subject<any>();
|
||||||
|
|
||||||
constructor(private http: Http)
|
constructor(private http: HttpClient)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -34,8 +34,8 @@ export class CalendarService implements Resolve<any>
|
|||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
this.http.get('api/calendar/events')
|
this.http.get('api/calendar/events')
|
||||||
.subscribe(response => {
|
.subscribe((response: any) => {
|
||||||
this.events = response.json().data.data;
|
this.events = response.data.data;
|
||||||
this.onEventsUpdated.next(this.events);
|
this.onEventsUpdated.next(this.events);
|
||||||
resolve(this.events);
|
resolve(this.events);
|
||||||
}, reject);
|
}, reject);
|
||||||
@@ -49,7 +49,7 @@ export class CalendarService implements Resolve<any>
|
|||||||
id : 'events',
|
id : 'events',
|
||||||
data: [...events]
|
data: [...events]
|
||||||
})
|
})
|
||||||
.subscribe(response => {
|
.subscribe((response: any) => {
|
||||||
this.getEvents();
|
this.getEvents();
|
||||||
}, reject);
|
}, reject);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,95 +1,98 @@
|
|||||||
<md-toolbar md-dialog-title class="mat-accent m-0">
|
<div class="dialog-content-wrapper">
|
||||||
<div fxFlex fxLayout="row" fxLayoutAlign="space-between center">
|
<md-toolbar md-dialog-title class="mat-accent m-0">
|
||||||
<span class="title dialog-title">{{dialogTitle}}</span>
|
<div fxFlex fxLayout="row" fxLayoutAlign="space-between center">
|
||||||
<button md-button class="mat-icon-button"
|
<span class="title dialog-title">{{dialogTitle}}</span>
|
||||||
(click)="dialogRef.close()"
|
<button md-button class="mat-icon-button"
|
||||||
aria-label="Close dialog">
|
(click)="dialogRef.close()"
|
||||||
<md-icon>close</md-icon>
|
aria-label="Close dialog">
|
||||||
</button>
|
<md-icon>close</md-icon>
|
||||||
</div>
|
</button>
|
||||||
</md-toolbar>
|
|
||||||
|
|
||||||
<div md-dialog-content class="p-24 m-0" perfect-scrollbar>
|
|
||||||
|
|
||||||
<form name="eventForm" [formGroup]="eventForm" class="event-form" fxLayout="column" fxFlex>
|
|
||||||
|
|
||||||
<md-input-container>
|
|
||||||
<input mdInput
|
|
||||||
name="title"
|
|
||||||
formControlName="title"
|
|
||||||
placeholder="Title"
|
|
||||||
required>
|
|
||||||
</md-input-container>
|
|
||||||
|
|
||||||
<div class="py-16" fxFlex="1 0 auto" fxLayout="row">
|
|
||||||
<md-slide-toggle
|
|
||||||
name="allDay"
|
|
||||||
formControlName="allDay"
|
|
||||||
class="mr-24"
|
|
||||||
aria-label="All day">
|
|
||||||
All Day
|
|
||||||
</md-slide-toggle>
|
|
||||||
</div>
|
</div>
|
||||||
|
</md-toolbar>
|
||||||
|
|
||||||
<div class="py-16" fxFlex="1 0 auto" fxLayout="row" formGroupName="color">
|
<div md-dialog-content class="p-24 m-0" fusePerfectScrollbar>
|
||||||
<md-input-container class="mr-24">
|
|
||||||
|
<form name="eventForm" [formGroup]="eventForm" class="event-form w-100-p" fxLayout="column" fxFlex>
|
||||||
|
|
||||||
|
<md-input-container class="w-100-p">
|
||||||
<input mdInput
|
<input mdInput
|
||||||
name="primary color"
|
name="title"
|
||||||
formControlName="primary"
|
formControlName="title"
|
||||||
placeholder="Primary color"
|
placeholder="Title"
|
||||||
[(colorPicker)]="event.color.primary"
|
required>
|
||||||
cpWidth="290px"
|
|
||||||
[cpPresetColors]="presetColors"
|
|
||||||
[style.background]="event.color.primary"
|
|
||||||
(colorPickerChange)="event.color.primary = $event; eventForm.patchValue({color:{primary:$event}})"/>
|
|
||||||
</md-input-container>
|
</md-input-container>
|
||||||
<md-input-container>
|
|
||||||
|
<div class="py-16" fxFlex="1 0 auto" fxLayout="row">
|
||||||
|
<md-slide-toggle
|
||||||
|
name="allDay"
|
||||||
|
formControlName="allDay"
|
||||||
|
class="mr-24"
|
||||||
|
aria-label="All day">
|
||||||
|
All Day
|
||||||
|
</md-slide-toggle>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="py-16" fxFlex="1 0 auto" fxLayout="row" formGroupName="color">
|
||||||
|
<md-input-container class="mr-24" fxFlex>
|
||||||
|
<input mdInput
|
||||||
|
name="primary color"
|
||||||
|
formControlName="primary"
|
||||||
|
placeholder="Primary color"
|
||||||
|
[(colorPicker)]="event.color.primary"
|
||||||
|
cpWidth="290px"
|
||||||
|
[cpPresetColors]="presetColors"
|
||||||
|
[style.background]="event.color.primary"
|
||||||
|
(colorPickerChange)="event.color.primary = $event; eventForm.patchValue({color:{primary:$event}})"/>
|
||||||
|
</md-input-container>
|
||||||
|
<md-input-container fxFlex>
|
||||||
|
<input mdInput
|
||||||
|
name="secondary color"
|
||||||
|
formControlName="secondary"
|
||||||
|
placeholder="Secondary color"
|
||||||
|
[(colorPicker)]="event.color.secondary"
|
||||||
|
cpWidth="290px"
|
||||||
|
[cpPresetColors]="presetColors"
|
||||||
|
[style.background]="event.color.secondary"
|
||||||
|
(colorPickerChange)="event.color.secondary = $event; eventForm.patchValue({color:{secondary:$event}})"/>
|
||||||
|
</md-input-container>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div fxFlex="1 0 auto" fxLayout="row">
|
||||||
|
|
||||||
|
<md-form-field class="mr-24" fxFlex>
|
||||||
|
<input mdInput [mdDatepicker]="startDatePicker" placeholder="Start Date">
|
||||||
|
<md-datepicker-toggle mdSuffix [for]="startDatePicker"></md-datepicker-toggle>
|
||||||
|
<md-datepicker #startDatePicker></md-datepicker>
|
||||||
|
</md-form-field>
|
||||||
|
|
||||||
|
<md-input-container class="no-errors-spacer" fxFlex md-no-float>
|
||||||
|
<input mdInput placeholder="Start Time">
|
||||||
|
</md-input-container>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div fxFlex="1 0 auto" fxLayout="row">
|
||||||
|
|
||||||
|
<md-form-field class="mr-24" fxFlex>
|
||||||
|
<input mdInput [mdDatepicker]="endDatePicker" placeholder="End Date">
|
||||||
|
<md-datepicker-toggle mdSuffix [for]="endDatePicker"></md-datepicker-toggle>
|
||||||
|
<md-datepicker #endDatePicker></md-datepicker>
|
||||||
|
</md-form-field>
|
||||||
|
|
||||||
|
<md-input-container class="no-errors-spacer" fxFlex md-no-float>
|
||||||
|
<input mdInput placeholder="End Time">
|
||||||
|
</md-input-container>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<md-input-container formGroupName="meta" class="w-100-p">
|
||||||
<input mdInput
|
<input mdInput
|
||||||
name="secondary color"
|
name="location"
|
||||||
formControlName="secondary"
|
formControlName="location"
|
||||||
placeholder="Secondary color"
|
placeholder="Location">
|
||||||
[(colorPicker)]="event.color.secondary"
|
|
||||||
cpWidth="290px"
|
|
||||||
[cpPresetColors]="presetColors"
|
|
||||||
[style.background]="event.color.secondary"
|
|
||||||
(colorPickerChange)="event.color.secondary = $event; eventForm.patchValue({color:{secondary:$event}})"/>
|
|
||||||
</md-input-container>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div fxFlex="1 0 auto" fxLayout="row">
|
|
||||||
|
|
||||||
<md-form-field class="mr-24">
|
|
||||||
<input mdInput [mdDatepicker]="startDatePicker" placeholder="Start Date">
|
|
||||||
<md-datepicker-toggle mdSuffix [for]="startDatePicker"></md-datepicker-toggle>
|
|
||||||
<md-datepicker #startDatePicker></md-datepicker>
|
|
||||||
</md-form-field>
|
|
||||||
|
|
||||||
<md-datepicker #startDatePicker></md-datepicker>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div fxFlex="1 0 auto" fxLayout="row">
|
|
||||||
|
|
||||||
<md-form-field class="mr-24">
|
|
||||||
<input mdInput [mdDatepicker]="endDatePicker" placeholder="End Date">
|
|
||||||
<md-datepicker-toggle mdSuffix [for]="endDatePicker"></md-datepicker-toggle>
|
|
||||||
<md-datepicker #endDatePicker></md-datepicker>
|
|
||||||
</md-form-field>
|
|
||||||
|
|
||||||
<md-input-container class="no-errors-spacer" flex md-no-float>
|
|
||||||
<input mdInput ng-model="calendarEvent.endTime" placeholder="End Time">
|
|
||||||
</md-input-container>
|
</md-input-container>
|
||||||
|
|
||||||
</div>
|
<md-input-container formGroupName="meta" class="w-100-p">
|
||||||
|
|
||||||
<md-input-container formGroupName="meta">
|
|
||||||
<input mdInput
|
|
||||||
name="location"
|
|
||||||
formControlName="location"
|
|
||||||
placeholder="Location">
|
|
||||||
</md-input-container>
|
|
||||||
|
|
||||||
<md-input-container formGroupName="meta">
|
|
||||||
|
|
||||||
<textarea mdInput
|
<textarea mdInput
|
||||||
formControlName="notes"
|
formControlName="notes"
|
||||||
@@ -97,39 +100,39 @@
|
|||||||
md-maxlength="250"
|
md-maxlength="250"
|
||||||
max-rows="4">
|
max-rows="4">
|
||||||
</textarea>
|
</textarea>
|
||||||
</md-input-container>
|
</md-input-container>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div md-dialog-actions class="m-0 p-16" fxLayout="row" fxLayoutAlign="space-between center">
|
|
||||||
|
|
||||||
<button *ngIf="action !=='edit'"
|
|
||||||
md-raised-button
|
|
||||||
(click)="dialogRef.close(eventForm)"
|
|
||||||
class="save-button mat-accent"
|
|
||||||
[disabled]="eventForm.invalid"
|
|
||||||
aria-label="SAVE">
|
|
||||||
SAVE
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button *ngIf="action ==='edit'"
|
|
||||||
md-raised-button
|
|
||||||
(click)="dialogRef.close(['save',eventForm])"
|
|
||||||
class="save-button mat-accent"
|
|
||||||
[disabled]="eventForm.invalid"
|
|
||||||
aria-label="SAVE">
|
|
||||||
SAVE
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button *ngIf="action ==='edit'"
|
|
||||||
md-button
|
|
||||||
class="mat-icon-button"
|
|
||||||
(click)="dialogRef.close(['delete',eventForm])"
|
|
||||||
aria-label="Delete"
|
|
||||||
md-tooltip="Delete">
|
|
||||||
<md-icon>delete</md-icon>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div md-dialog-actions class="m-0 p-16" fxLayout="row" fxLayoutAlign="space-between center">
|
||||||
|
|
||||||
|
<button *ngIf="action !=='edit'"
|
||||||
|
md-raised-button
|
||||||
|
(click)="dialogRef.close(eventForm)"
|
||||||
|
class="save-button mat-accent"
|
||||||
|
[disabled]="eventForm.invalid"
|
||||||
|
aria-label="SAVE">
|
||||||
|
SAVE
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button *ngIf="action ==='edit'"
|
||||||
|
md-raised-button
|
||||||
|
(click)="dialogRef.close(['save',eventForm])"
|
||||||
|
class="save-button mat-accent"
|
||||||
|
[disabled]="eventForm.invalid"
|
||||||
|
aria-label="SAVE">
|
||||||
|
SAVE
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button *ngIf="action ==='edit'"
|
||||||
|
md-button
|
||||||
|
class="mat-icon-button"
|
||||||
|
(click)="dialogRef.close(['delete',eventForm])"
|
||||||
|
aria-label="Delete"
|
||||||
|
md-tooltip="Delete">
|
||||||
|
<md-icon>delete</md-icon>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,11 +2,12 @@
|
|||||||
|
|
||||||
.mat-dialog-container {
|
.mat-dialog-container {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
width: 720px;
|
width: 480px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-content-wrapper {
|
||||||
|
max-height: 85vh;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
:host {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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!..
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
|
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
|
||||||
import { Observable } from 'rxjs/Observable';
|
import { Observable } from 'rxjs/Observable';
|
||||||
import { Http } from '@angular/http';
|
import { HttpClient } from '@angular/common/http';
|
||||||
import { Subject } from 'rxjs/Subject';
|
import { Subject } from 'rxjs/Subject';
|
||||||
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
|
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
|
||||||
import { FuseUtils } from '../../../../core/fuseUtils';
|
import { FuseUtils } from '../../../../core/fuseUtils';
|
||||||
@@ -19,7 +19,7 @@ export class ChatService implements Resolve<any>
|
|||||||
onLeftSidenavViewChanged = new Subject<any>();
|
onLeftSidenavViewChanged = new Subject<any>();
|
||||||
onRightSidenavViewChanged = new Subject<any>();
|
onRightSidenavViewChanged = new Subject<any>();
|
||||||
|
|
||||||
constructor(private http: Http)
|
constructor(private http: HttpClient)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,8 +47,8 @@ export class ChatService implements Resolve<any>
|
|||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.http.get('api/chat-chats/' + chatItem.id)
|
this.http.get('api/chat-chats/' + chatItem.id)
|
||||||
.subscribe(response => {
|
.subscribe((response: any) => {
|
||||||
const chat = response.json().data;
|
const chat = response.data;
|
||||||
|
|
||||||
const chatContact = this.contacts.find((contact) => {
|
const chatContact = this.contacts.find((contact) => {
|
||||||
return contact.id === contactId;
|
return contact.id === contactId;
|
||||||
@@ -105,7 +105,7 @@ export class ChatService implements Resolve<any>
|
|||||||
* Post the created chat
|
* Post the created chat
|
||||||
*/
|
*/
|
||||||
this.http.post('api/chat-chats', {...chat})
|
this.http.post('api/chat-chats', {...chat})
|
||||||
.subscribe(response => {
|
.subscribe((response: any) => {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Post the new the user data
|
* Post the new the user data
|
||||||
@@ -150,7 +150,7 @@ export class ChatService implements Resolve<any>
|
|||||||
updateUserData(userData)
|
updateUserData(userData)
|
||||||
{
|
{
|
||||||
this.http.post('api/chat-user/' + this.user.id, userData)
|
this.http.post('api/chat-user/' + this.user.id, userData)
|
||||||
.subscribe(response => {
|
.subscribe((response: any) => {
|
||||||
this.user = userData;
|
this.user = userData;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -211,8 +211,8 @@ export class ChatService implements Resolve<any>
|
|||||||
{
|
{
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.http.get('api/chat-contacts')
|
this.http.get('api/chat-contacts')
|
||||||
.subscribe(response => {
|
.subscribe((response: any) => {
|
||||||
resolve(response.json().data);
|
resolve(response.data);
|
||||||
}, reject);
|
}, reject);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -225,8 +225,8 @@ export class ChatService implements Resolve<any>
|
|||||||
{
|
{
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.http.get('api/chat-chats')
|
this.http.get('api/chat-chats')
|
||||||
.subscribe(response => {
|
.subscribe((response: any) => {
|
||||||
resolve(response.json().data);
|
resolve(response.data);
|
||||||
}, reject);
|
}, reject);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -239,8 +239,8 @@ export class ChatService implements Resolve<any>
|
|||||||
{
|
{
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.http.get('api/chat-user')
|
this.http.get('api/chat-user')
|
||||||
.subscribe(response => {
|
.subscribe((response: any) => {
|
||||||
resolve(response.json().data[0]);
|
resolve(response.data[0]);
|
||||||
}, reject);
|
}, reject);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -11,6 +11,10 @@
|
|||||||
|
|
||||||
.toolbar-bottom {
|
.toolbar-bottom {
|
||||||
height: 240px;
|
height: 240px;
|
||||||
|
|
||||||
|
@include media-breakpoint-down(md) {
|
||||||
|
height: 180px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -11,6 +11,10 @@
|
|||||||
|
|
||||||
.toolbar-bottom {
|
.toolbar-bottom {
|
||||||
height: 240px;
|
height: 240px;
|
||||||
|
|
||||||
|
@include media-breakpoint-down(md) {
|
||||||
|
height: 180px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,126 +1,128 @@
|
|||||||
<md-toolbar md-dialog-title class="mat-accent m-0">
|
<div class="dialog-content-wrapper">
|
||||||
<div fxFlex fxLayout="row" fxLayoutAlign="space-between center">
|
<md-toolbar md-dialog-title class="mat-accent m-0">
|
||||||
<span class="title dialog-title">{{dialogTitle}}</span>
|
<div fxFlex fxLayout="row" fxLayoutAlign="space-between center">
|
||||||
<button md-button class="mat-icon-button"
|
<span class="title dialog-title">{{dialogTitle}}</span>
|
||||||
(click)="dialogRef.close()"
|
<button md-button class="mat-icon-button"
|
||||||
aria-label="Close dialog">
|
(click)="dialogRef.close()"
|
||||||
<md-icon>close</md-icon>
|
aria-label="Close dialog">
|
||||||
</button>
|
<md-icon>close</md-icon>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<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"
|
||||||
|
[alt]="contact.name"/>
|
||||||
|
<div class="contact-name">{{contact.name}}</div>
|
||||||
|
</md-toolbar-row>
|
||||||
|
</md-toolbar>
|
||||||
|
|
||||||
|
<div md-dialog-content class="p-24 m-0" fusePerfectScrollbar>
|
||||||
|
|
||||||
|
<form [formGroup]="contactForm">
|
||||||
|
|
||||||
|
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
||||||
|
<md-icon class="mr-12 mt-12">account_circle</md-icon>
|
||||||
|
<md-input-container fxFlex>
|
||||||
|
<input name="name" formControlName="name" placeholder="Name" mdInput required>
|
||||||
|
</md-input-container>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
||||||
|
<md-icon class="mr-12 mt-12"></md-icon>
|
||||||
|
<md-input-container fxFlex>
|
||||||
|
<input name="lastName" formControlName="lastName" placeholder="Lastname" mdInput>
|
||||||
|
</md-input-container>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
||||||
|
<md-icon class="mr-12 mt-12">star</md-icon>
|
||||||
|
<md-input-container fxFlex>
|
||||||
|
<input name="nickname" formControlName="nickname" mdInput placeholder="Nickname">
|
||||||
|
</md-input-container>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
||||||
|
<md-icon class="mr-12 mt-12">phone</md-icon>
|
||||||
|
<md-input-container fxFlex>
|
||||||
|
<input formControlName="phone" mdInput placeholder="Phone number">
|
||||||
|
</md-input-container>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
||||||
|
<md-icon class="mr-12 mt-12">email</md-icon>
|
||||||
|
<md-input-container fxFlex>
|
||||||
|
<input name="email" formControlName="email" mdInput type="email" placeholder="Email">
|
||||||
|
</md-input-container>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
||||||
|
<md-icon class="mr-12 mt-12">domain</md-icon>
|
||||||
|
<md-input-container fxFlex>
|
||||||
|
<input name="company" formControlName="company" mdInput placeholder="Company">
|
||||||
|
</md-input-container>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
||||||
|
<md-icon class="mr-12 mt-12">work</md-icon>
|
||||||
|
<md-input-container fxFlex>
|
||||||
|
<input name="jobTitle" formControlName="jobTitle" mdInput placeholder="Job title">
|
||||||
|
</md-input-container>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
||||||
|
<md-form-field class="mr-24" fxFlex>
|
||||||
|
<input mdInput [mdDatepicker]="birthdayDatePicker" placeholder="Birthday">
|
||||||
|
<md-datepicker-toggle mdSuffix [for]="birthdayDatePicker"></md-datepicker-toggle>
|
||||||
|
<md-datepicker #birthdayDatePicker></md-datepicker>
|
||||||
|
</md-form-field>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
||||||
|
<md-icon class="mr-12 mt-12">home</md-icon>
|
||||||
|
<md-input-container fxFlex>
|
||||||
|
<input name="address" formControlName="address" mdInput placeholder="Address">
|
||||||
|
</md-input-container>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div fxLayout="row" class="textarea-wrapper" fxLayoutAlign="start start">
|
||||||
|
<md-icon class="mr-12 mt-12">note</md-icon>
|
||||||
|
<md-input-container fxFlex>
|
||||||
|
<textarea name="notes" formControlName="notes" placeholder="Notes" mdInput type="text" max-rows="4"></textarea>
|
||||||
|
</md-input-container>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<md-toolbar-row class="toolbar-bottom" fxLayout="column" fxLayoutAlign="center center">
|
<div md-dialog-actions class="m-0 p-16" fxLayout="row" fxLayoutAlign="space-between center">
|
||||||
<img [src]="contact.avatar" class=" avatar contact-avatar huge"
|
|
||||||
[alt]="contact.name"/>
|
|
||||||
<div class="contact-name">{{contact.name}}</div>
|
|
||||||
</md-toolbar-row>
|
|
||||||
</md-toolbar>
|
|
||||||
|
|
||||||
<div md-dialog-content class="p-24 m-0" perfect-scrollbar>
|
<button *ngIf="action !=='edit'"
|
||||||
|
md-raised-button
|
||||||
|
(click)="dialogRef.close(contactForm)"
|
||||||
|
class="save-button mat-accent"
|
||||||
|
[disabled]="contactForm.invalid"
|
||||||
|
aria-label="SAVE">
|
||||||
|
SAVE
|
||||||
|
</button>
|
||||||
|
|
||||||
<form [formGroup]="contactForm">
|
<button *ngIf="action ==='edit'"
|
||||||
|
md-raised-button
|
||||||
|
(click)="dialogRef.close(['save',contactForm])"
|
||||||
|
class="save-button mat-accent"
|
||||||
|
[disabled]="contactForm.invalid"
|
||||||
|
aria-label="SAVE">
|
||||||
|
SAVE
|
||||||
|
</button>
|
||||||
|
|
||||||
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
<button *ngIf="action ==='edit'"
|
||||||
<md-icon class="mr-12 mt-12">account_circle</md-icon>
|
md-button
|
||||||
<md-input-container fxFlex>
|
class="mat-icon-button"
|
||||||
<input name="name" formControlName="name" placeholder="Name" mdInput required>
|
(click)="dialogRef.close(['delete',contactForm])"
|
||||||
</md-input-container>
|
aria-label="Delete"
|
||||||
</div>
|
md-tooltip="Delete">
|
||||||
|
<md-icon>delete</md-icon>
|
||||||
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
</button>
|
||||||
<md-icon class="mr-12 mt-12"></md-icon>
|
|
||||||
<md-input-container fxFlex>
|
|
||||||
<input name="lastName" formControlName="lastName" placeholder="Lastname" mdInput>
|
|
||||||
</md-input-container>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
|
||||||
<md-icon class="mr-12 mt-12">star</md-icon>
|
|
||||||
<md-input-container fxFlex>
|
|
||||||
<input name="nickname" formControlName="nickname" mdInput placeholder="Nickname">
|
|
||||||
</md-input-container>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
|
||||||
<md-icon class="mr-12 mt-12">phone</md-icon>
|
|
||||||
<md-input-container fxFlex>
|
|
||||||
<input formControlName="phone" mdInput placeholder="Phone number">
|
|
||||||
</md-input-container>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
|
||||||
<md-icon class="mr-12 mt-12">email</md-icon>
|
|
||||||
<md-input-container fxFlex>
|
|
||||||
<input name="email" formControlName="email" mdInput type="email" placeholder="Email">
|
|
||||||
</md-input-container>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
|
||||||
<md-icon class="mr-12 mt-12">domain</md-icon>
|
|
||||||
<md-input-container fxFlex>
|
|
||||||
<input name="company" formControlName="company" mdInput placeholder="Company">
|
|
||||||
</md-input-container>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
|
||||||
<md-icon class="mr-12 mt-12">work</md-icon>
|
|
||||||
<md-input-container fxFlex>
|
|
||||||
<input name="jobTitle" formControlName="jobTitle" mdInput placeholder="Job title">
|
|
||||||
</md-input-container>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
|
||||||
<md-form-field class="mr-24" fxFlex>
|
|
||||||
<input mdInput [mdDatepicker]="birthdayDatePicker" placeholder="Birthday">
|
|
||||||
<md-datepicker-toggle mdSuffix [for]="birthdayDatePicker"></md-datepicker-toggle>
|
|
||||||
<md-datepicker #birthdayDatePicker></md-datepicker>
|
|
||||||
</md-form-field>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-24" fxLayout="row" fxLayoutAlign="start start">
|
|
||||||
<md-icon class="mr-12 mt-12">home</md-icon>
|
|
||||||
<md-input-container fxFlex>
|
|
||||||
<input name="address" formControlName="address" mdInput placeholder="Address">
|
|
||||||
</md-input-container>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div fxLayout="row" class="textarea-wrapper" fxLayoutAlign="start start">
|
|
||||||
<md-icon class="mr-12 mt-12">note</md-icon>
|
|
||||||
<md-input-container fxFlex>
|
|
||||||
<textarea name="notes" formControlName="notes" placeholder="Notes" mdInput type="text" max-rows="4"></textarea>
|
|
||||||
</md-input-container>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</form>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div md-dialog-actions class="m-0 p-16" fxLayout="row" fxLayoutAlign="space-between center">
|
|
||||||
|
|
||||||
<button *ngIf="action !=='edit'"
|
|
||||||
md-raised-button
|
|
||||||
(click)="dialogRef.close(contactForm)"
|
|
||||||
class="save-button mat-accent"
|
|
||||||
[disabled]="contactForm.invalid"
|
|
||||||
aria-label="SAVE">
|
|
||||||
SAVE
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button *ngIf="action ==='edit'"
|
|
||||||
md-raised-button
|
|
||||||
(click)="dialogRef.close(['save',contactForm])"
|
|
||||||
class="save-button mat-accent"
|
|
||||||
[disabled]="contactForm.invalid"
|
|
||||||
aria-label="SAVE">
|
|
||||||
SAVE
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button *ngIf="action ==='edit'"
|
|
||||||
md-button
|
|
||||||
class="mat-icon-button"
|
|
||||||
(click)="dialogRef.close(['delete',contactForm])"
|
|
||||||
aria-label="Delete"
|
|
||||||
md-tooltip="Delete">
|
|
||||||
<md-icon>delete</md-icon>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -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 {
|
||||||
display: flex;
|
max-height: 85vh;
|
||||||
flex-direction: column;
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 -->
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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, {
|
||||||
|
|||||||
@@ -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 -->
|
||||||
|
|||||||
@@ -4,3 +4,10 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#add-contact-button {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 12px;
|
||||||
|
right: 12px;
|
||||||
|
padding: 0;
|
||||||
|
z-index: 99;
|
||||||
|
}
|
||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
|
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
|
||||||
import { Observable } from 'rxjs/Observable';
|
import { Observable } from 'rxjs/Observable';
|
||||||
import { Http } from '@angular/http';
|
import { HttpClient } from '@angular/common/http';
|
||||||
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
|
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
|
||||||
import { Contact } from './contact.model';
|
import { Contact } from './contact.model';
|
||||||
import { FuseUtils } from '../../../../core/fuseUtils';
|
import { FuseUtils } from '../../../../core/fuseUtils';
|
||||||
@@ -23,7 +23,7 @@ export class ContactsService implements Resolve<any>
|
|||||||
searchText: string;
|
searchText: string;
|
||||||
filterBy: string;
|
filterBy: string;
|
||||||
|
|
||||||
constructor(private http: Http)
|
constructor(private http: HttpClient)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,9 +65,9 @@ export class ContactsService implements Resolve<any>
|
|||||||
{
|
{
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.http.get('api/contacts-contacts')
|
this.http.get('api/contacts-contacts')
|
||||||
.subscribe(response => {
|
.subscribe((response: any) => {
|
||||||
|
|
||||||
this.contacts = response.json().data;
|
this.contacts = response.data;
|
||||||
|
|
||||||
if ( this.filterBy === 'starred' )
|
if ( this.filterBy === 'starred' )
|
||||||
{
|
{
|
||||||
@@ -103,8 +103,8 @@ export class ContactsService implements Resolve<any>
|
|||||||
{
|
{
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.http.get('api/contacts-user/5725a6802d10e277a0f35724')
|
this.http.get('api/contacts-user/5725a6802d10e277a0f35724')
|
||||||
.subscribe(response => {
|
.subscribe((response: any) => {
|
||||||
this.user = response.json().data;
|
this.user = response.data;
|
||||||
this.onUserDataChanged.next(this.user);
|
this.onUserDataChanged.next(this.user);
|
||||||
resolve(this.user);
|
resolve(this.user);
|
||||||
}, reject);
|
}, reject);
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
|
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
|
||||||
import { Observable } from 'rxjs/Observable';
|
import { Observable } from 'rxjs/Observable';
|
||||||
import { Http } from '@angular/http';
|
import { HttpClient } from '@angular/common/http';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class ProjectsDashboardService implements Resolve<any>
|
export class ProjectsDashboardService implements Resolve<any>
|
||||||
@@ -10,7 +10,7 @@ export class ProjectsDashboardService implements Resolve<any>
|
|||||||
widgets: any[];
|
widgets: any[];
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private http: Http
|
private http: HttpClient
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -42,9 +42,9 @@ export class ProjectsDashboardService implements Resolve<any>
|
|||||||
{
|
{
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.http.get('api/projects-dashboard-projects')
|
this.http.get('api/projects-dashboard-projects')
|
||||||
.subscribe(response => {
|
.subscribe((response: any) => {
|
||||||
this.projects = response.json().data;
|
this.projects = response.data;
|
||||||
resolve(response.json().data);
|
resolve(response.data);
|
||||||
}, reject);
|
}, reject);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -53,9 +53,9 @@ export class ProjectsDashboardService implements Resolve<any>
|
|||||||
{
|
{
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.http.get('api/projects-dashboard-widgets')
|
this.http.get('api/projects-dashboard-widgets')
|
||||||
.subscribe(response => {
|
.subscribe((response: any) => {
|
||||||
this.widgets = response.json().data;
|
this.widgets = response.data;
|
||||||
resolve(response.json().data);
|
resolve(response.data);
|
||||||
}, reject);
|
}, reject);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
.mat-row {
|
.mat-row {
|
||||||
position: relative;
|
position: relative;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
min-height: 64px;
|
||||||
|
|
||||||
.mat-cell {
|
.mat-cell {
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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 -->
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user