mirror of
https://github.com/richard-loafle/fuse-angular.git
synced 2025-12-23 09:17:05 +00:00
Compare commits
107 Commits
v8.0.0
...
v6.2.4-ske
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b08ab47715 | ||
|
|
0ccb4211c5 | ||
|
|
d25ce3601a | ||
|
|
4642b730cb | ||
|
|
0982d5369b | ||
|
|
fe7fdf0a00 | ||
|
|
adc93d5d40 | ||
|
|
77f6062a55 | ||
|
|
cef9e8a9c0 | ||
|
|
2f0d1e406f | ||
|
|
b7ab5ea273 | ||
|
|
d7e65460bf | ||
|
|
d4d57480a1 | ||
|
|
0d6d08aa85 | ||
|
|
8e5fdb1d31 | ||
|
|
2eb952e9bc | ||
|
|
b418049d94 | ||
|
|
34d77c1d1a | ||
|
|
723c289a47 | ||
|
|
23f8547be5 | ||
|
|
b54bbc8abe | ||
|
|
41a93857b6 | ||
|
|
0e2dca00c0 | ||
|
|
c93cecdddd | ||
|
|
3bd2ad9519 | ||
|
|
eb231c5ca8 | ||
|
|
954d61b73a | ||
|
|
46c37042a2 | ||
|
|
47ee65a980 | ||
|
|
5f974c4ed2 | ||
|
|
605f4d9463 | ||
|
|
4be77a19ed | ||
|
|
8374c7d059 | ||
|
|
da615585d0 | ||
|
|
7c50487164 | ||
|
|
97c7f136bf | ||
|
|
1cddda02b1 | ||
|
|
c178eeedaa | ||
|
|
43b22e609e | ||
|
|
a914ad6dc1 | ||
|
|
b2e840cb60 | ||
|
|
d7c67ca5a8 | ||
|
|
cf7ab3861d | ||
|
|
ab4ed81cfc | ||
|
|
2022b7307e | ||
|
|
46de82a7fa | ||
|
|
bc2b2c75fa | ||
|
|
02653cd0f4 | ||
|
|
ff14879a94 | ||
|
|
49c49c46d1 | ||
|
|
915e9203ef | ||
|
|
33d295f42c | ||
|
|
91e277ce3f | ||
|
|
b7a3d35eb8 | ||
|
|
f29f11232f | ||
|
|
16ffb09350 | ||
|
|
643a129a46 | ||
|
|
de16f4f866 | ||
|
|
415d7cebfa | ||
|
|
f7d1995f63 | ||
|
|
3741abc063 | ||
|
|
54ccdd7de2 | ||
|
|
8b2e6b95b1 | ||
|
|
e86cea1e73 | ||
|
|
b81638690e | ||
|
|
20ac3abb25 | ||
|
|
f634cb06a7 | ||
|
|
7d67a481ff | ||
|
|
4659da7390 | ||
|
|
2a5d15694c | ||
|
|
8e6024c3ee | ||
|
|
f4c47daadc | ||
|
|
381bc6c0fe | ||
|
|
b5a139f81d | ||
|
|
914477da41 | ||
|
|
410802808e | ||
|
|
56dbc58d5e | ||
|
|
d7c6b2d617 | ||
|
|
80627bdde9 | ||
|
|
6595975f2b | ||
|
|
dcb8032758 | ||
|
|
fb214da5fe | ||
|
|
e20687034f | ||
|
|
f9bda99deb | ||
|
|
1d81e37a0f | ||
|
|
83f0ed5ec1 | ||
|
|
e486413872 | ||
|
|
576e167ef1 | ||
|
|
cf9e9fc209 | ||
|
|
ff0f2933d9 | ||
|
|
62467c8ddf | ||
|
|
024ab15b25 | ||
|
|
915ad52863 | ||
|
|
97bfaa9979 | ||
|
|
6ae3e154c3 | ||
|
|
49b6ff7292 | ||
|
|
903688ab43 | ||
|
|
19f822cbab | ||
|
|
1d21a14d0e | ||
|
|
4bf2ba73ad | ||
|
|
6a3972fff8 | ||
|
|
dca16238eb | ||
|
|
2b91119d00 | ||
|
|
ff4899e8d2 | ||
|
|
e818c53f1d | ||
|
|
ca96fffadf | ||
|
|
d7003711ee |
16
CREDITS
16
CREDITS
@@ -1,16 +0,0 @@
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Image/Vector/Icon Credits
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
Avatars - https://uifaces.co/
|
||||
Flag icons - http://www.famfamfam.com/lab/icons/flags/
|
||||
Frame vector created by Freepik - https://www.freepik.com/free-photos-vectors/frame
|
||||
A Walk Amongst Friends - Photo by Kristin Ellis on Unsplash - https://unsplash.com/photos/CbZOGbazDWQ
|
||||
Sunrise at Moraine Lake - Photo by Marlon Martinez on Unsplash - https://unsplash.com/photos/woNYcfrnp9M
|
||||
Braies Lake - Photo by Luca Nicoletti on Unsplash - https://unsplash.com/photos/dH-L5zPcv3E
|
||||
Lago di Sorapis - Photo by eberhard grossgasteiger on Unsplash - https://unsplash.com/photos/6uDg_zb20EM
|
||||
Lago di Braies - Photo by Salmen Bejaoui on Unsplash - https://unsplash.com/photos/uXTozY3CcQg
|
||||
Reaching - Photo by Justin Novello on Unsplash - https://unsplash.com/photos/Y14TNvIDllM
|
||||
Yosemite - Photo by Tim Mossholder on Unsplash - https://unsplash.com/photos/ZCrtRSSUpGI
|
||||
Never Stop Changing - Photo by John Westrock on Unsplash - https://unsplash.com/photos/_GY56uSG70U
|
||||
Fall glow - Photo by Casey Horner on Unsplash - https://unsplash.com/photos/gz19zOdgN7w
|
||||
First snow - Photo by eberhard grossgasteiger on Unsplash - https://unsplash.com/photos/LRrGf6dBjA4
|
||||
3
LICENSE
3
LICENSE
@@ -1,2 +1 @@
|
||||
This project is protected by Envato's Regular License. For more information,
|
||||
check the official license page at https://themeforest.net/licenses/terms/regular
|
||||
https://themeforest.net/licenses/terms/regular
|
||||
@@ -1,6 +1,6 @@
|
||||
# Fuse - Angular
|
||||
|
||||
Material Design Admin Template with Angular 8 and Angular Material
|
||||
Material Design Admin Template with Angular 6+ and Angular Material
|
||||
|
||||
## The Community
|
||||
|
||||
|
||||
76
angular.json
76
angular.json
@@ -4,34 +4,32 @@
|
||||
"newProjectRoot": "projects",
|
||||
"projects": {
|
||||
"fuse": {
|
||||
"projectType": "application",
|
||||
"schematics": {
|
||||
"@schematics/angular:component": {
|
||||
"style": "scss"
|
||||
}
|
||||
},
|
||||
"root": "",
|
||||
"sourceRoot": "src",
|
||||
"projectType": "application",
|
||||
"prefix": "app",
|
||||
"schematics": {
|
||||
"@schematics/angular:component": {
|
||||
"styleext": "scss"
|
||||
}
|
||||
},
|
||||
"architect": {
|
||||
"build": {
|
||||
"builder": "@angular-devkit/build-angular:browser",
|
||||
"options": {
|
||||
"outputPath": "dist/fuse",
|
||||
"outputPath": "dist",
|
||||
"index": "src/index.html",
|
||||
"main": "src/main.ts",
|
||||
"polyfills": "src/polyfills.ts",
|
||||
"tsConfig": "tsconfig.app.json",
|
||||
"tsConfig": "src/tsconfig.app.json",
|
||||
"assets": [
|
||||
"src/favicon.ico",
|
||||
"src/assets",
|
||||
"src/app/main/angular-material-elements"
|
||||
"src/assets"
|
||||
],
|
||||
"styles": [
|
||||
"src/styles.scss"
|
||||
],
|
||||
"scripts": [],
|
||||
"showCircularDependencies": false
|
||||
"scripts": []
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
@@ -49,14 +47,7 @@
|
||||
"aot": true,
|
||||
"extractLicenses": true,
|
||||
"vendorChunk": false,
|
||||
"buildOptimizer": true,
|
||||
"budgets": [
|
||||
{
|
||||
"type": "initial",
|
||||
"maximumWarning": "4mb",
|
||||
"maximumError": "6mb"
|
||||
}
|
||||
]
|
||||
"buildOptimizer": true
|
||||
},
|
||||
"ec": {
|
||||
"sourceMap": true,
|
||||
@@ -101,43 +92,50 @@
|
||||
"options": {
|
||||
"main": "src/test.ts",
|
||||
"polyfills": "src/polyfills.ts",
|
||||
"tsConfig": "tsconfig.spec.json",
|
||||
"karmaConfig": "karma.conf.js",
|
||||
"tsConfig": "src/tsconfig.spec.json",
|
||||
"karmaConfig": "src/karma.conf.js",
|
||||
"styles": [
|
||||
"styles.scss"
|
||||
],
|
||||
"scripts": [],
|
||||
"assets": [
|
||||
"src/favicon.ico",
|
||||
"src/assets"
|
||||
],
|
||||
"styles": [
|
||||
"src/styles.scss"
|
||||
],
|
||||
"scripts": []
|
||||
]
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"builder": "@angular-devkit/build-angular:tslint",
|
||||
"options": {
|
||||
"tsConfig": [
|
||||
"tsconfig.app.json",
|
||||
"tsconfig.spec.json",
|
||||
"e2e/tsconfig.json"
|
||||
"src/tsconfig.app.json",
|
||||
"src/tsconfig.spec.json"
|
||||
],
|
||||
"exclude": [
|
||||
"**/node_modules/**",
|
||||
"**/src/app/fake-db/**/*",
|
||||
"**/src/assets/angular-material-examples/**/*"
|
||||
"**/node_modules/**"
|
||||
]
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
},
|
||||
"fuse-e2e": {
|
||||
"root": "e2e/",
|
||||
"projectType": "application",
|
||||
"architect": {
|
||||
"e2e": {
|
||||
"builder": "@angular-devkit/build-angular:protractor",
|
||||
"options": {
|
||||
"protractorConfig": "e2e/protractor.conf.js",
|
||||
"devServerTarget": "fuse:serve"
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"devServerTarget": "fuse:serve:production"
|
||||
}
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"builder": "@angular-devkit/build-angular:tslint",
|
||||
"options": {
|
||||
"tsConfig": "e2e/tsconfig.e2e.json",
|
||||
"exclude": [
|
||||
"**/node_modules/**"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
16
browserslist
16
browserslist
@@ -1,16 +0,0 @@
|
||||
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
|
||||
# For additional information regarding the format and rule options, please see:
|
||||
# https://github.com/browserslist/browserslist#queries
|
||||
|
||||
# You can see what browsers were selected by your queries by running:
|
||||
# npx browserslist
|
||||
|
||||
# Googlebot uses an older version of Chrome
|
||||
# For additional information see: https://developers.google.com/search/docs/guides/rendering
|
||||
|
||||
> 0.5%
|
||||
last 2 versions
|
||||
Firefox ESR
|
||||
Chrome 41 # Support for Googlebot
|
||||
not dead
|
||||
not IE 9-11 # For IE 9-11 support, remove 'not'.
|
||||
@@ -1,14 +1,14 @@
|
||||
import { FusePage } from './app.po';
|
||||
import { Fuse2Page } from './app.po';
|
||||
|
||||
describe('Fuse App', () => {
|
||||
let page: FusePage;
|
||||
describe('Fuse2 App', () => {
|
||||
let page: Fuse2Page;
|
||||
|
||||
beforeEach(() => {
|
||||
page = new FusePage();
|
||||
page = new Fuse2Page();
|
||||
});
|
||||
|
||||
it('should display welcome message', () => {
|
||||
page.navigateTo();
|
||||
expect(page.getParagraphText()).toEqual('Welcome to Fuse!');
|
||||
expect(page.getParagraphText()).toEqual('Welcome to Fuse2!');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { browser, by, element } from 'protractor';
|
||||
|
||||
export class FusePage {
|
||||
navigateTo(): any {
|
||||
export class Fuse2Page {
|
||||
navigateTo() {
|
||||
return browser.get('/');
|
||||
}
|
||||
|
||||
getParagraphText(): any {
|
||||
return element(by.css('app #main')).getText();
|
||||
getParagraphText() {
|
||||
return element(by.css('app-root h1')).getText();
|
||||
}
|
||||
}
|
||||
|
||||
25974
package-lock.json
generated
25974
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
172
package.json
172
package.json
@@ -1,88 +1,88 @@
|
||||
{
|
||||
"name": "fuse",
|
||||
"version": "8.0.0",
|
||||
"license": "https://themeforest.net/licenses/terms/regular",
|
||||
"scripts": {
|
||||
"ng": "ng",
|
||||
"start": "ng serve --open",
|
||||
"start-hmr": "ng serve --configuration hmr --source-map=false --hmr-warning=false",
|
||||
"start-hmr-sourcemaps": "ng serve --configuration hmr --source-map=true --hmr-warning=false",
|
||||
"build": "node --max_old_space_size=6144 ./node_modules/@angular/cli/bin/ng build --dev",
|
||||
"build-stats": "node --max_old_space_size=6144 ./node_modules/@angular/cli/bin/ng build --dev --stats-json",
|
||||
"build-prod": "node --max_old_space_size=6144 ./node_modules/@angular/cli/bin/ng build --prod",
|
||||
"build-prod-stats": "node --max_old_space_size=6144 ./node_modules/@angular/cli/bin/ng build --prod --stats-json",
|
||||
"test": "ng test",
|
||||
"lint": "ng lint",
|
||||
"e2e": "ng e2e",
|
||||
"bundle-report": "webpack-bundle-analyzer dist/stats.json"
|
||||
},
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@agm/core": "1.0.0-beta.5",
|
||||
"@angular/animations": "8.0.0",
|
||||
"@angular/cdk": "8.0.0",
|
||||
"@angular/common": "8.0.0",
|
||||
"@angular/compiler": "8.0.0",
|
||||
"@angular/core": "8.0.0",
|
||||
"@angular/flex-layout": "8.0.0-beta.26",
|
||||
"@angular/forms": "8.0.0",
|
||||
"@angular/material": "8.0.0",
|
||||
"@angular/material-moment-adapter": "8.0.0",
|
||||
"@angular/platform-browser": "8.0.0",
|
||||
"@angular/platform-browser-dynamic": "8.0.0",
|
||||
"@angular/router": "8.0.0",
|
||||
"@ngrx/effects": "8.0.0-beta.2",
|
||||
"@ngrx/router-store": "8.0.0-beta.2",
|
||||
"@ngrx/store": "8.0.0-beta.2",
|
||||
"@ngrx/store-devtools": "8.0.0-beta.2",
|
||||
"@ngx-translate/core": "11.0.1",
|
||||
"@swimlane/dragula": "3.8.0",
|
||||
"@swimlane/ngx-charts": "11.1.0",
|
||||
"@swimlane/ngx-datatable": "15.0.0",
|
||||
"@swimlane/ngx-dnd": "7.0.0",
|
||||
"@types/prismjs": "1.16.0",
|
||||
"angular-calendar": "0.27.8",
|
||||
"angular-in-memory-web-api": "0.8.0",
|
||||
"chart.js": "2.8.0",
|
||||
"classlist.js": "1.1.20150312",
|
||||
"d3": "5.9.2",
|
||||
"date-fns": "1.30.1",
|
||||
"hammerjs": "2.0.8",
|
||||
"lodash": "4.17.11",
|
||||
"moment": "2.24.0",
|
||||
"ng2-charts": "2.2.4",
|
||||
"ngrx-store-freeze": "0.2.4",
|
||||
"ngx-color-picker": "7.5.0",
|
||||
"ngx-cookie-service": "2.2.0",
|
||||
"perfect-scrollbar": "1.4.0",
|
||||
"prismjs": "1.16.0",
|
||||
"rxjs": "6.5.2",
|
||||
"web-animations-js": "github:angular/web-animations-js#release_pr208",
|
||||
"zone.js": "0.9.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular/cli": "8.0.0",
|
||||
"@angular/compiler-cli": "8.0.0",
|
||||
"@angular/language-service": "8.0.0",
|
||||
"@angular-devkit/build-angular": "0.800.0",
|
||||
"@angularclass/hmr": "2.1.3",
|
||||
"@types/jasmine": "3.3.13",
|
||||
"@types/jasminewd2": "2.0.6",
|
||||
"@types/lodash": "4.14.132",
|
||||
"@types/node": "8.9.5",
|
||||
"codelyzer": "5.0.1",
|
||||
"jasmine-core": "3.4.0",
|
||||
"jasmine-spec-reporter": "4.2.1",
|
||||
"karma": "4.1.0",
|
||||
"karma-chrome-launcher": "2.2.0",
|
||||
"karma-coverage-istanbul-reporter": "2.0.5",
|
||||
"karma-jasmine": "2.0.1",
|
||||
"karma-jasmine-html-reporter": "1.4.2",
|
||||
"protractor": "5.4.2",
|
||||
"ts-node": "7.0.1",
|
||||
"tslib": "1.9.3",
|
||||
"tslint": "5.15.0",
|
||||
"typescript": "3.4.5",
|
||||
"webpack-bundle-analyzer": "3.3.2"
|
||||
}
|
||||
"name": "fuse",
|
||||
"version": "6.2.4",
|
||||
"license": "https://themeforest.net/licenses/terms/regular",
|
||||
"scripts": {
|
||||
"ng": "ng",
|
||||
"start": "ng serve --open",
|
||||
"start-hmr": "ng serve --configuration hmr --source-map=false --hmr-warning=false",
|
||||
"start-hmr-sourcemaps": "ng serve --configuration hmr --source-map=true --hmr-warning=false",
|
||||
"build": "node --max_old_space_size=6144 ./node_modules/@angular/cli/bin/ng build --dev",
|
||||
"build-stats": "node --max_old_space_size=6144 ./node_modules/@angular/cli/bin/ng build --dev --stats-json",
|
||||
"build-prod": "node --max_old_space_size=6144 ./node_modules/@angular/cli/bin/ng build --prod",
|
||||
"build-prod-stats": "node --max_old_space_size=6144 ./node_modules/@angular/cli/bin/ng build --prod --stats-json",
|
||||
"test": "ng test",
|
||||
"lint": "ng lint",
|
||||
"e2e": "ng e2e",
|
||||
"bundle-report": "webpack-bundle-analyzer dist/stats.json"
|
||||
},
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@agm/core": "1.0.0-beta.3",
|
||||
"@angular/animations": "6.0.9",
|
||||
"@angular/cdk": "6.3.3",
|
||||
"@angular/common": "6.0.9",
|
||||
"@angular/compiler": "6.0.9",
|
||||
"@angular/core": "6.0.9",
|
||||
"@angular/flex-layout": "6.0.0-beta.16",
|
||||
"@angular/forms": "6.0.9",
|
||||
"@angular/http": "6.0.9",
|
||||
"@angular/material": "6.3.3",
|
||||
"@angular/material-moment-adapter": "6.3.3",
|
||||
"@angular/platform-browser": "6.0.9",
|
||||
"@angular/platform-browser-dynamic": "6.0.9",
|
||||
"@angular/router": "6.0.9",
|
||||
"@ngrx/effects": "6.0.1",
|
||||
"@ngrx/router-store": "6.0.1",
|
||||
"@ngrx/store": "6.0.1",
|
||||
"@ngrx/store-devtools": "6.0.1",
|
||||
"@ngx-translate/core": "10.0.2",
|
||||
"@swimlane/ngx-charts": "8.1.0",
|
||||
"@swimlane/ngx-datatable": "13.0.1",
|
||||
"@swimlane/ngx-dnd": "4.0.0",
|
||||
"@types/prismjs": "1.9.0",
|
||||
"angular-calendar": "0.25.2",
|
||||
"angular-in-memory-web-api": "0.6.0",
|
||||
"chart.js": "2.7.2",
|
||||
"classlist.js": "1.1.20150312",
|
||||
"core-js": "2.5.7",
|
||||
"d3": "5.5.0",
|
||||
"hammerjs": "2.0.8",
|
||||
"lodash": "4.17.10",
|
||||
"moment": "2.22.2",
|
||||
"ng2-charts": "1.6.0",
|
||||
"ngrx-store-freeze": "0.2.4",
|
||||
"ngx-color-picker": "6.5.0",
|
||||
"ngx-cookie-service": "1.0.10",
|
||||
"perfect-scrollbar": "1.4.0",
|
||||
"prismjs": "1.15.0",
|
||||
"rxjs": "6.2.1",
|
||||
"rxjs-compat": "6.2.1",
|
||||
"web-animations-js": "2.3.1",
|
||||
"zone.js": "0.8.26"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular/cli": "6.0.8",
|
||||
"@angular/compiler-cli": "6.0.9",
|
||||
"@angular/language-service": "6.0.9",
|
||||
"@angular-devkit/build-angular": "0.6.8",
|
||||
"@angularclass/hmr": "2.1.3",
|
||||
"@types/jasmine": "2.8.8",
|
||||
"@types/jasminewd2": "2.0.3",
|
||||
"@types/lodash": "4.14.111",
|
||||
"@types/node": "8.9.5",
|
||||
"codelyzer": "4.2.1",
|
||||
"jasmine-core": "2.99.1",
|
||||
"jasmine-spec-reporter": "4.2.1",
|
||||
"karma": "1.7.1",
|
||||
"karma-chrome-launcher": "2.2.0",
|
||||
"karma-coverage-istanbul-reporter": "2.0.1",
|
||||
"karma-jasmine": "1.1.2",
|
||||
"karma-jasmine-html-reporter": "0.2.2",
|
||||
"protractor": "5.3.2",
|
||||
"ts-node": "5.0.1",
|
||||
"tslint": "5.9.1",
|
||||
"typescript": "2.7.2",
|
||||
"webpack-bundle-analyzer": "2.13.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,23 +51,26 @@ export const fuseAnimations = [
|
||||
]),
|
||||
|
||||
trigger('fadeInOut', [
|
||||
state('0, void', style({
|
||||
state('0', style({
|
||||
display: 'none',
|
||||
opacity: 0
|
||||
})),
|
||||
state('1, *', style({
|
||||
state('1', style({
|
||||
display: 'block',
|
||||
opacity: 1
|
||||
})),
|
||||
transition('1 => 0', animate('300ms ease-out')),
|
||||
transition('0 => 1', animate('300ms ease-in')),
|
||||
transition('void <=> *', animate('300ms ease-in'))
|
||||
transition('0 => 1', animate('300ms ease-in'))
|
||||
]),
|
||||
|
||||
trigger('slideInOut', [
|
||||
state('0', style({
|
||||
height: '0px'
|
||||
height : '0px',
|
||||
display: 'none'
|
||||
})),
|
||||
state('1', style({
|
||||
height: '*'
|
||||
height : '*',
|
||||
display: 'block'
|
||||
})),
|
||||
transition('1 => 0', animate('300ms ease-out')),
|
||||
transition('0 => 1', animate('300ms ease-in'))
|
||||
@@ -117,15 +120,17 @@ export const fuseAnimations = [
|
||||
})
|
||||
)
|
||||
]
|
||||
)
|
||||
),
|
||||
]),
|
||||
|
||||
trigger('slideInLeft', [
|
||||
state('void', style({
|
||||
transform: 'translateX(-100%)',
|
||||
display : 'none'
|
||||
})),
|
||||
state('*', style({
|
||||
transform: 'translateX(0)',
|
||||
display : 'flex'
|
||||
})),
|
||||
transition('void => *', animate('300ms')),
|
||||
transition('* => void', animate('300ms'))
|
||||
@@ -134,9 +139,11 @@ export const fuseAnimations = [
|
||||
trigger('slideInRight', [
|
||||
state('void', style({
|
||||
transform: 'translateX(100%)',
|
||||
display : 'none'
|
||||
})),
|
||||
state('*', style({
|
||||
transform: 'translateX(0)',
|
||||
display : 'flex'
|
||||
})),
|
||||
transition('void => *', animate('300ms')),
|
||||
transition('* => void', animate('300ms'))
|
||||
@@ -145,9 +152,11 @@ export const fuseAnimations = [
|
||||
trigger('slideInTop', [
|
||||
state('void', style({
|
||||
transform: 'translateY(-100%)',
|
||||
display : 'none'
|
||||
})),
|
||||
state('*', style({
|
||||
transform: 'translateY(0)',
|
||||
display : 'flex'
|
||||
})),
|
||||
transition('void => *', animate('300ms')),
|
||||
transition('* => void', animate('300ms'))
|
||||
@@ -157,9 +166,11 @@ export const fuseAnimations = [
|
||||
state('void',
|
||||
style({
|
||||
transform: 'translateY(100%)',
|
||||
display : 'none'
|
||||
})),
|
||||
state('*', style({
|
||||
transform: 'translateY(0)',
|
||||
display : 'flex'
|
||||
})),
|
||||
transition('void => *', animate('300ms')),
|
||||
transition('* => void', animate('300ms'))
|
||||
@@ -179,7 +190,7 @@ export const fuseAnimations = [
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Router animations
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
trigger('routerTransitionLeft', [
|
||||
|
||||
transition('* => *', [
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { MatDialogRef } from '@angular/material/dialog';
|
||||
import { MatDialogRef } from '@angular/material';
|
||||
|
||||
@Component({
|
||||
selector : 'fuse-confirm-dialog',
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatDialogModule } from '@angular/material/dialog';
|
||||
import { MatButtonModule, MatDialogModule } from '@angular/material';
|
||||
|
||||
import { FuseConfirmDialogComponent } from '@fuse/components/confirm-dialog/confirm-dialog.component';
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
fuse-countdown {
|
||||
:host {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Component, Input, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
|
||||
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
|
||||
import { interval, Subject } from 'rxjs';
|
||||
import { map, takeUntil } from 'rxjs/operators';
|
||||
import * as moment from 'moment';
|
||||
@@ -6,8 +6,7 @@ import * as moment from 'moment';
|
||||
@Component({
|
||||
selector : 'fuse-countdown',
|
||||
templateUrl: './countdown.component.html',
|
||||
styleUrls : ['./countdown.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
styleUrls : ['./countdown.component.scss']
|
||||
})
|
||||
export class FuseCountdownComponent implements OnInit, OnDestroy
|
||||
{
|
||||
@@ -49,13 +48,9 @@ export class FuseCountdownComponent implements OnInit, OnDestroy
|
||||
const currDate = moment();
|
||||
const eventDate = moment(this.eventDate);
|
||||
|
||||
// Get the difference in between the current date and event date in seconds
|
||||
// Get the difference in between the current date and event date
|
||||
let diff = eventDate.diff(currDate, 'seconds');
|
||||
|
||||
// Calculate the remaining time for the first time so there will be no
|
||||
// delay on the countdown
|
||||
this.countdown = this._secondsToRemaining(diff);
|
||||
|
||||
// Create a subscribable interval
|
||||
const countDown = interval(1000)
|
||||
.pipe(
|
||||
@@ -63,7 +58,14 @@ export class FuseCountdownComponent implements OnInit, OnDestroy
|
||||
return diff = diff - 1;
|
||||
}),
|
||||
map(value => {
|
||||
return this._secondsToRemaining(value);
|
||||
const timeLeft = moment.duration(value, 'seconds');
|
||||
|
||||
return {
|
||||
days : timeLeft.asDays().toFixed(0),
|
||||
hours : timeLeft.hours(),
|
||||
minutes: timeLeft.minutes(),
|
||||
seconds: timeLeft.seconds()
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
@@ -84,27 +86,4 @@ export class FuseCountdownComponent implements OnInit, OnDestroy
|
||||
this._unsubscribeAll.next();
|
||||
this._unsubscribeAll.complete();
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Private methods
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Converts given seconds to a remaining time
|
||||
*
|
||||
* @param seconds
|
||||
* @private
|
||||
*/
|
||||
private _secondsToRemaining(seconds): any
|
||||
{
|
||||
const timeLeft = moment.duration(seconds, 'seconds');
|
||||
|
||||
return {
|
||||
days : timeLeft.asDays().toFixed(0),
|
||||
hours : timeLeft.hours(),
|
||||
minutes: timeLeft.minutes(),
|
||||
seconds: timeLeft.seconds()
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
@mixin fuse-countdown-theme($theme) {
|
||||
|
||||
$foreground: map-get($theme, foreground);
|
||||
|
||||
fuse-countdown {
|
||||
|
||||
.fuse-countdown {
|
||||
|
||||
.time {
|
||||
|
||||
.title {
|
||||
color: map-get($foreground, secondary-text);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,10 @@
|
||||
<!-- DEMO CONTENT -->
|
||||
<div class="demo-content line-height-1.75">
|
||||
<div class="demo-content">
|
||||
|
||||
<h1 class="m-0">Early Sunrise in Winter</h1>
|
||||
<h4 class="mt-0 secondary-text">Demo Content</h4>
|
||||
<img src="assets/images/beach.jpg" alt="beach" style="max-width: 640px; width: 100%;">
|
||||
|
||||
<h1>Early Sunrise</h1>
|
||||
<h4 class="secondary-text">Demo Content</h4>
|
||||
|
||||
<p>
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse tortor nibh, convallis sed purus nec,
|
||||
@@ -10,7 +12,7 @@
|
||||
vestibulum. Suspendisse euismod in urna eu posuere.
|
||||
</p>
|
||||
|
||||
<blockquote class="my-24">
|
||||
<blockquote>
|
||||
<p>
|
||||
Nunc vel lacinia lorem. Nullam tincidunt sed purus eu placerat. Donec id dictum erat. Etiam enim ex, dapibus
|
||||
et tortor id, posuere pretium est. Maecenas fringilla ipsum vitae neque elementum, at eleifend ante
|
||||
@@ -22,12 +24,16 @@
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
Ut ornare sit amet velit vel congue. Ut nec tristique eros. Lorem ipsum dolor sit amet, consectetur
|
||||
<b>adipiscing elit</b>. Vivamus sed lorem quis nibh porta iaculis. Vestibulum ut eleifend ante, at semper mi.
|
||||
Nam imperdiet est nisi, quis hendrerit tellus convallis et. Morbi in luctus neque. Curabitur elementum ut est et
|
||||
gravida. In hac habitasse platea dictumst. In et placerat eros, eu tempor turpis. Curabitur ac felis finibus,
|
||||
elementum lectus vitae, venenatis est. Integer mollis nisl a eros scelerisque varius. Etiam venenatis lectus vel
|
||||
erat condimentum tristique vel vel mi. Nulla id euismod mi, et mollis tellus.
|
||||
Ut ornare sit amet velit vel congue. Ut nec tristique eros. Lorem ipsum dolor sit amet, consectetur adipiscing
|
||||
elit. Vivamus sed lorem quis nibh porta iaculis. Vestibulum ut eleifend ante, at semper mi. Nam imperdiet est
|
||||
nisi, quis hendrerit tellus convallis et. Morbi in luctus neque. Curabitur elementum ut est et gravida. In hac
|
||||
habitasse platea dictumst.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
In et placerat eros, eu tempor turpis. Curabitur ac felis finibus, elementum lectus vitae, venenatis est.
|
||||
Integer mollis nisl a eros scelerisque varius. Etiam venenatis lectus vel erat condimentum tristique vel vel mi.
|
||||
Nulla id euismod mi, et mollis tellus.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
@@ -37,12 +43,6 @@
|
||||
velit.
|
||||
</p>
|
||||
|
||||
<img class="mt-24 w-100-p" src="assets/images/demo-content/morain-lake.jpg" style="max-width: 640px">
|
||||
|
||||
<p class="mt-8 mb-24 secondary-text">
|
||||
<em>Nullam tincidunt sed purus eu placerat. Donec id dictum erat. Etiam enim ex, dapibus et tortor id.</em>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Quisque sit amet risus enim. Aliquam sit amet interdum justo, at ultricies sapien. Suspendisse et semper urna,
|
||||
in gravida eros. Quisque id nibh iaculis, euismod urna sed, egestas nisi. Donec eros metus, congue a imperdiet
|
||||
@@ -52,18 +52,10 @@
|
||||
<p>
|
||||
Ut auctor, metus sed dapibus tempus, urna diam auctor odio, in malesuada odio risus vitae nisi. Etiam blandit
|
||||
ante urna, vitae placerat massa mollis in. Duis nec urna ac purus semper dictum ut eget justo. Aenean non
|
||||
sagittis augue. Sed venenatis rhoncus enim eget ornare. <a href="#">Donec viverra sed felis at venenatis.</a>
|
||||
Mauris aliquam fringilla nulla, sit amet congue felis dignissim at.
|
||||
sagittis augue. Sed venenatis rhoncus enim eget ornare. Donec viverra sed felis at venenatis. Mauris aliquam
|
||||
fringilla nulla, sit amet congue felis dignissim at.
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>Orci varius</li>
|
||||
<li>Magnis dis</li>
|
||||
<li>Conubia nostra</li>
|
||||
<li>Semper urna</li>
|
||||
<li>Donec viverra</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
Quisque accumsan augue tempor ante mollis, sed placerat diam porttitor. Vestibulum dignissim sem vel velit
|
||||
eleifend, non pellentesque quam convallis. Pellentesque est dolor, dignissim ac tortor tristique, hendrerit
|
||||
@@ -77,7 +69,7 @@
|
||||
Etiam blandit nunc arcu, et consectetur orci blandit a. Aliquam condimentum pharetra quam at ultricies. Nunc vel
|
||||
lacinia lorem. Nullam tincidunt sed purus eu placerat. Donec id dictum erat. Etiam enim ex, dapibus et tortor
|
||||
id, posuere pretium est. Maecenas fringilla ipsum vitae neque elementum, at eleifend ante sollicitudin. Donec
|
||||
viverra augue dolor, a venenatis tellus consectetur sit amet.
|
||||
viverra augue dolor, a venenatis tellus consectetur sit amet...
|
||||
</p>
|
||||
</div>
|
||||
<!-- / DEMO CONTENT -->
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { RouterModule } from '@angular/router';
|
||||
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatListModule } from '@angular/material/list';
|
||||
import { MatDividerModule, MatListModule } from '@angular/material';
|
||||
|
||||
import { FuseDemoContentComponent } from './demo-content/demo-content.component';
|
||||
import { FuseDemoSidebarComponent } from './demo-sidebar/demo-sidebar.component';
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
:host {
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding: 8px;
|
||||
background: #263238;
|
||||
cursor: text;
|
||||
|
||||
@@ -13,7 +13,7 @@ import '@fuse/components/highlight/prism-languages';
|
||||
export class FuseHighlightComponent implements OnInit, OnDestroy
|
||||
{
|
||||
// Source
|
||||
@ContentChild('source', {static: true})
|
||||
@ContentChild('source')
|
||||
source: ElementRef;
|
||||
|
||||
// Lang
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
<button mat-icon-button
|
||||
type="button"
|
||||
class="mat-elevation-z1"
|
||||
[matMenuTriggerFor]="colorMenu"
|
||||
(menuOpened)="onMenuOpen()"
|
||||
[ngClass]="selectedPalette + '-' + selectedHue">
|
||||
[ngClass]="'mat-'+selectedPalette+'-'+selectedHue+'-bg'">
|
||||
<mat-icon>palette</mat-icon>
|
||||
</button>
|
||||
|
||||
<mat-menu #colorMenu="matMenu" class="fuse-material-color-picker-menu mat-elevation-z8">
|
||||
<mat-menu #colorMenu="matMenu" class="fuse-material-color-picker-menu">
|
||||
|
||||
<header [ngClass]="selectedColor?.class || 'accent'" class="mat-elevation-z4"
|
||||
<header [ngClass]="selectedColor?.class || 'mat-accent-bg'" class="mat-elevation-z4"
|
||||
fxLayout="row" fxLayoutAlign="space-between center">
|
||||
|
||||
<button mat-icon-button
|
||||
class="secondary-text"
|
||||
[style.visibility]="view === 'hues' ? 'visible' : 'hidden'"
|
||||
(click)="goToPalettesView($event)" aria-label="Palette">
|
||||
[style.visibility]="view==='hues'?'visible':'hidden'"
|
||||
(click)="$event.stopPropagation();backToPaletteSelection()" aria-label="Palette">
|
||||
<mat-icon class="s-20">arrow_back</mat-icon>
|
||||
</button>
|
||||
|
||||
@@ -23,40 +23,45 @@
|
||||
</span>
|
||||
|
||||
<span *ngIf="!selectedColor?.palette">
|
||||
Select a Color
|
||||
Select Color
|
||||
</span>
|
||||
|
||||
<button mat-icon-button
|
||||
class="remove-color-button secondary-text"
|
||||
(click)="removeColor($event)"
|
||||
aria-label="Remove color"
|
||||
matTooltip="Remove color">
|
||||
class="remove-color-button"
|
||||
(click)="$event.stopPropagation();removeColor()"
|
||||
aria-label="Remove Color">
|
||||
<mat-icon class="s-20">delete</mat-icon>
|
||||
</button>
|
||||
</header>
|
||||
|
||||
|
||||
<div [ngSwitch]="view" class="views">
|
||||
|
||||
<div class="view" *ngSwitchCase="'palettes'">
|
||||
|
||||
<div fxLayout="row wrap" fxLayoutAlign="start start" class="colors" fusePerfectScrollbar>
|
||||
<div class="color" fxLayout="row" fxLayoutAlign="center center"
|
||||
<div class="color"
|
||||
[ngClass]="'mat-'+color.key+'-bg'"
|
||||
*ngFor="let color of (colors | keys)"
|
||||
[ngClass]="color.key"
|
||||
[class.selected]="selectedPalette === color.key"
|
||||
(click)="selectPalette($event, color.key)">
|
||||
(click)="$event.stopPropagation();selectPalette(color.key)"
|
||||
fxLayout="row" fxLayoutAlign="start end" mat-ink-ripple>
|
||||
<span class="label">
|
||||
{{color.key}}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="view" *ngSwitchCase="'hues'">
|
||||
<div class="view" *ngSwitchCase="'hues'" >
|
||||
<div fxLayout="row wrap" fxLayoutAlign="start start" class="colors" fusePerfectScrollbar>
|
||||
<div class="color" fxLayout="row" fxLayoutAlign="center center"
|
||||
*ngFor="let hue of hues"
|
||||
[fxHide]="selectedPalette === 'fuse-white' && hue !== '500' || selectedPalette === 'fuse-black' && hue !== '500'"
|
||||
[ngClass]="selectedPalette + '-' + hue"
|
||||
[class.selected]="selectedHue === hue"
|
||||
(click)="selectHue($event, hue)">
|
||||
<div class="color" *ngFor="let hue of hues"
|
||||
[fxHide]="selectedPalette === 'white' && hue !== '500'|| selectedPalette === 'black' && hue !== '500'"
|
||||
[ngClass]="'mat-'+selectedPalette+'-'+hue+'-bg'"
|
||||
(click)="selectHue(hue)" fxLayout="row" fxLayoutAlign="start end" mat-ink-ripple>
|
||||
<span class="label">
|
||||
{{hue}}
|
||||
</span>
|
||||
<mat-icon *ngIf="selectedHue === hue" class="s-16">check</mat-icon>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
.fuse-material-color-picker-menu {
|
||||
width: 245px;
|
||||
width: 208px;
|
||||
|
||||
.mat-menu-content {
|
||||
padding: 0;
|
||||
@@ -7,29 +7,44 @@
|
||||
.views {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-height: 165px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
min-height: 258px;
|
||||
height: 308px;
|
||||
background-color: #F7F7F7;
|
||||
|
||||
.view {
|
||||
overflow: hidden;
|
||||
position: absolute;
|
||||
width: 208px;
|
||||
height: 100%;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
|
||||
.colors {
|
||||
padding: 1px 0 0 0;
|
||||
margin-left: -1px;
|
||||
position: relative;
|
||||
padding: 4px;
|
||||
|
||||
.color {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
margin: 0 0 1px 1px;
|
||||
position: relative;
|
||||
width: 46px;
|
||||
height: 46px;
|
||||
margin: 2px;
|
||||
border-radius: 0;
|
||||
cursor: pointer;
|
||||
transition: border-radius .4s cubic-bezier(.25, .8, .25, 1);
|
||||
|
||||
&:hover {
|
||||
border-radius: 20%;
|
||||
.label {
|
||||
padding: 2px;
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
&.selected {
|
||||
border-radius: 50% !important;
|
||||
mat-icon {
|
||||
position: absolute;
|
||||
top: 2px;
|
||||
right: 2px;
|
||||
font-size: 16px;
|
||||
opacity: 0.7;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,40 +1,55 @@
|
||||
import { Component, EventEmitter, forwardRef, Input, Output, ViewEncapsulation } from '@angular/core';
|
||||
import { Component, EventEmitter, Input, OnChanges, Output, ViewEncapsulation } from '@angular/core';
|
||||
|
||||
import { fuseAnimations } from '@fuse/animations';
|
||||
import { MatColors } from '@fuse/mat-colors';
|
||||
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
|
||||
|
||||
export const FUSE_MATERIAL_COLOR_PICKER_VALUE_ACCESSOR: any = {
|
||||
provide : NG_VALUE_ACCESSOR,
|
||||
useExisting: forwardRef(() => FuseMaterialColorPickerComponent),
|
||||
multi : true
|
||||
};
|
||||
|
||||
@Component({
|
||||
selector : 'fuse-material-color-picker',
|
||||
templateUrl : './material-color-picker.component.html',
|
||||
styleUrls : ['./material-color-picker.component.scss'],
|
||||
animations : fuseAnimations,
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
providers : [FUSE_MATERIAL_COLOR_PICKER_VALUE_ACCESSOR]
|
||||
encapsulation: ViewEncapsulation.None
|
||||
})
|
||||
export class FuseMaterialColorPickerComponent implements ControlValueAccessor
|
||||
export class FuseMaterialColorPickerComponent implements OnChanges
|
||||
{
|
||||
colors: any;
|
||||
hues: string[];
|
||||
view: string;
|
||||
selectedColor: any;
|
||||
view: string;
|
||||
|
||||
@Input()
|
||||
selectedPalette: string;
|
||||
|
||||
@Input()
|
||||
selectedHue: string;
|
||||
|
||||
// Color changed
|
||||
@Input()
|
||||
selectedFg: string;
|
||||
|
||||
@Input()
|
||||
value: any;
|
||||
|
||||
@Output()
|
||||
colorChanged: EventEmitter<any>;
|
||||
onValueChange: EventEmitter<any>;
|
||||
|
||||
@Output()
|
||||
selectedPaletteChange: EventEmitter<any>;
|
||||
|
||||
@Output()
|
||||
selectedHueChange: EventEmitter<any>;
|
||||
|
||||
@Output()
|
||||
selectedClassChange: EventEmitter<any>;
|
||||
|
||||
@Output()
|
||||
selectedBgChange: EventEmitter<any>;
|
||||
|
||||
@Output()
|
||||
selectedFgChange: EventEmitter<any>;
|
||||
|
||||
// Private
|
||||
private _color: string;
|
||||
private _modelChange: (value: any) => void;
|
||||
private _modelTouched: (value: any) => void;
|
||||
_selectedClass: string;
|
||||
_selectedBg: string;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
@@ -42,18 +57,23 @@ export class FuseMaterialColorPickerComponent implements ControlValueAccessor
|
||||
constructor()
|
||||
{
|
||||
// Set the defaults
|
||||
this.colorChanged = new EventEmitter();
|
||||
this.colors = MatColors.all;
|
||||
this.hues = ['50', '100', '200', '300', '400', '500', '600', '700', '800', '900', 'A100', 'A200', 'A400', 'A700'];
|
||||
this.selectedHue = '500';
|
||||
this.selectedFg = '';
|
||||
this.selectedHue = '';
|
||||
this.selectedPalette = '';
|
||||
this.view = 'palettes';
|
||||
|
||||
this.onValueChange = new EventEmitter();
|
||||
this.selectedPaletteChange = new EventEmitter();
|
||||
this.selectedHueChange = new EventEmitter();
|
||||
this.selectedClassChange = new EventEmitter();
|
||||
this.selectedBgChange = new EventEmitter();
|
||||
this.selectedFgChange = new EventEmitter();
|
||||
|
||||
// Set the private defaults
|
||||
this._color = '';
|
||||
this._modelChange = () => {
|
||||
};
|
||||
this._modelTouched = () => {
|
||||
};
|
||||
this._selectedClass = '';
|
||||
this._selectedBg = '';
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@@ -66,76 +86,88 @@ export class FuseMaterialColorPickerComponent implements ControlValueAccessor
|
||||
* @param value
|
||||
*/
|
||||
@Input()
|
||||
set color(value)
|
||||
set selectedClass(value)
|
||||
{
|
||||
if ( !value || value === '' || this._color === value )
|
||||
if ( value && value !== '' && this._selectedClass !== value )
|
||||
{
|
||||
return;
|
||||
const color = value.split('-');
|
||||
if ( color.length >= 5 )
|
||||
{
|
||||
this.selectedPalette = color[1] + '-' + color[2];
|
||||
this.selectedHue = color[3];
|
||||
}
|
||||
else
|
||||
{
|
||||
this.selectedPalette = color[1];
|
||||
this.selectedHue = color[2];
|
||||
}
|
||||
}
|
||||
|
||||
// Split the color value (red-400, blue-500, fuse-navy-700 etc.)
|
||||
const colorParts = value.split('-');
|
||||
|
||||
// Take the very last part as the selected hue value
|
||||
this.selectedHue = colorParts[colorParts.length - 1];
|
||||
|
||||
// Remove the last part
|
||||
colorParts.pop();
|
||||
|
||||
// Rejoin the remaining parts as the selected palette name
|
||||
this.selectedPalette = colorParts.join('-');
|
||||
|
||||
// Store the color value
|
||||
this._color = value;
|
||||
this._selectedClass = value;
|
||||
}
|
||||
|
||||
get color(): string
|
||||
get selectedClass(): string
|
||||
{
|
||||
return this._color;
|
||||
return this._selectedClass;
|
||||
}
|
||||
|
||||
/**
|
||||
* Selected bg
|
||||
*
|
||||
* @param value
|
||||
*/
|
||||
@Input()
|
||||
set selectedBg(value)
|
||||
{
|
||||
if ( value && value !== '' && this._selectedBg !== value )
|
||||
{
|
||||
for ( const palette in this.colors )
|
||||
{
|
||||
if ( !this.colors.hasOwnProperty(palette) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
for ( const hue of this.hues )
|
||||
{
|
||||
if ( this.colors[palette][hue] === value )
|
||||
{
|
||||
this.selectedPalette = palette;
|
||||
this.selectedHue = hue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this._selectedBg = value;
|
||||
}
|
||||
|
||||
get selectedBg(): string
|
||||
{
|
||||
return this._selectedBg;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Control Value Accessor implementation
|
||||
// @ Lifecycle hooks
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Register on change function
|
||||
* On changes
|
||||
*
|
||||
* @param fn
|
||||
* @param changes
|
||||
*/
|
||||
registerOnChange(fn: any): void
|
||||
ngOnChanges(changes: any): void
|
||||
{
|
||||
this._modelChange = fn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register on touched function
|
||||
*
|
||||
* @param fn
|
||||
*/
|
||||
registerOnTouched(fn: any): void
|
||||
{
|
||||
this._modelTouched = fn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write value to the view from model
|
||||
*
|
||||
* @param color
|
||||
*/
|
||||
writeValue(color: any): void
|
||||
{
|
||||
// Return if null
|
||||
if ( !color )
|
||||
if ( changes.selectedBg && changes.selectedBg.currentValue === '' ||
|
||||
changes.selectedClass && changes.selectedClass.currentValue === '' ||
|
||||
changes.selectedPalette && changes.selectedPalette.currentValue === '' )
|
||||
{
|
||||
this.removeColor();
|
||||
return;
|
||||
}
|
||||
|
||||
// Set the color
|
||||
this.color = color;
|
||||
|
||||
// Update the selected color
|
||||
this.updateSelectedColor();
|
||||
if ( changes.selectedPalette || changes.selectedHue || changes.selectedClass || changes.selectedBg )
|
||||
{
|
||||
this.updateSelectedColor();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@@ -145,61 +177,35 @@ export class FuseMaterialColorPickerComponent implements ControlValueAccessor
|
||||
/**
|
||||
* Select palette
|
||||
*
|
||||
* @param event
|
||||
* @param palette
|
||||
*/
|
||||
selectPalette(event, palette): void
|
||||
selectPalette(palette): void
|
||||
{
|
||||
// Stop propagation
|
||||
event.stopPropagation();
|
||||
|
||||
// Go to 'hues' view
|
||||
this.view = 'hues';
|
||||
|
||||
// Update the selected palette
|
||||
this.selectedPalette = palette;
|
||||
|
||||
// Update the selected color
|
||||
this.updateSelectedColor();
|
||||
this.view = 'hues';
|
||||
}
|
||||
|
||||
/**
|
||||
* Select hue
|
||||
*
|
||||
* @param event
|
||||
* @param hue
|
||||
*/
|
||||
selectHue(event, hue): void
|
||||
selectHue(hue): void
|
||||
{
|
||||
// Stop propagation
|
||||
event.stopPropagation();
|
||||
|
||||
// Update the selected huse
|
||||
this.selectedHue = hue;
|
||||
|
||||
// Update the selected color
|
||||
this.updateSelectedColor();
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove color
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
removeColor(event): void
|
||||
removeColor(): void
|
||||
{
|
||||
// Stop propagation
|
||||
event.stopPropagation();
|
||||
|
||||
// Return to the 'palettes' view
|
||||
this.view = 'palettes';
|
||||
|
||||
// Clear the selected palette and hue
|
||||
this.selectedPalette = '';
|
||||
this.selectedHue = '';
|
||||
|
||||
// Update the selected color
|
||||
this.updateSelectedColor();
|
||||
this.view = 'palettes';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -207,40 +213,49 @@ export class FuseMaterialColorPickerComponent implements ControlValueAccessor
|
||||
*/
|
||||
updateSelectedColor(): void
|
||||
{
|
||||
if ( this.selectedColor && this.selectedColor.palette === this.selectedPalette && this.selectedColor.hue === this.selectedHue )
|
||||
{
|
||||
return;
|
||||
}
|
||||
setTimeout(() => {
|
||||
|
||||
// Set the selected color object
|
||||
this.selectedColor = {
|
||||
palette: this.selectedPalette,
|
||||
hue : this.selectedHue,
|
||||
class : this.selectedPalette + '-' + this.selectedHue,
|
||||
bg : this.selectedPalette === '' ? '' : MatColors.getColor(this.selectedPalette)[this.selectedHue],
|
||||
fg : this.selectedPalette === '' ? '' : MatColors.getColor(this.selectedPalette).contrast[this.selectedHue]
|
||||
};
|
||||
if ( this.selectedColor && this.selectedPalette === this.selectedColor.palette && this.selectedHue === this.selectedColor.hue )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Emit the color changed event
|
||||
this.colorChanged.emit(this.selectedColor);
|
||||
if ( this.selectedPalette !== '' && this.selectedHue !== '' )
|
||||
{
|
||||
this.selectedBg = MatColors.getColor(this.selectedPalette)[this.selectedHue];
|
||||
this.selectedFg = MatColors.getColor(this.selectedPalette).contrast[this.selectedHue];
|
||||
this.selectedClass = 'mat-' + this.selectedPalette + '-' + this.selectedHue + '-bg';
|
||||
}
|
||||
else
|
||||
{
|
||||
this.selectedBg = '';
|
||||
this.selectedFg = '';
|
||||
}
|
||||
|
||||
// Mark the model as touched
|
||||
this._modelTouched(this.selectedColor.class);
|
||||
this.selectedColor = {
|
||||
palette: this.selectedPalette,
|
||||
hue : this.selectedHue,
|
||||
class : this.selectedClass,
|
||||
bg : this.selectedBg,
|
||||
fg : this.selectedFg
|
||||
};
|
||||
|
||||
// Update the model
|
||||
this._modelChange(this.selectedColor.class);
|
||||
this.selectedPaletteChange.emit(this.selectedPalette);
|
||||
this.selectedHueChange.emit(this.selectedHue);
|
||||
this.selectedClassChange.emit(this.selectedClass);
|
||||
this.selectedBgChange.emit(this.selectedBg);
|
||||
this.selectedFgChange.emit(this.selectedFg);
|
||||
|
||||
this.value = this.selectedColor;
|
||||
this.onValueChange.emit(this.selectedColor);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Go to palettes view
|
||||
*
|
||||
* @param event
|
||||
* Go back to palette selection
|
||||
*/
|
||||
goToPalettesView(event): void
|
||||
backToPaletteSelection(): void
|
||||
{
|
||||
// Stop propagation
|
||||
event.stopPropagation();
|
||||
|
||||
this.view = 'palettes';
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { FlexLayoutModule } from '@angular/flex-layout';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatMenuModule } from '@angular/material/menu';
|
||||
import { MatTooltipModule } from '@angular/material/tooltip';
|
||||
import { MatButtonModule, MatIconModule, MatMenuModule, MatRippleModule } from '@angular/material';
|
||||
|
||||
import { FusePipesModule } from '@fuse/pipes/pipes.module';
|
||||
|
||||
@@ -22,7 +19,7 @@ import { FuseMaterialColorPickerComponent } from '@fuse/components/material-colo
|
||||
MatButtonModule,
|
||||
MatIconModule,
|
||||
MatMenuModule,
|
||||
MatTooltipModule,
|
||||
MatRippleModule,
|
||||
|
||||
FusePipesModule
|
||||
],
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
@mixin fuse-material-color-picker-theme($theme) {
|
||||
|
||||
$background: map-get($theme, background);
|
||||
|
||||
.fuse-material-color-picker-menu {
|
||||
|
||||
.mat-menu-content {
|
||||
|
||||
.views {
|
||||
background: #303030;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,42 +1,42 @@
|
||||
<ng-container *ngIf="!item.hidden">
|
||||
|
||||
<!-- normal collapse -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="!item.url && !item.function">
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="!item.url && !item.function" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
<!-- item.url -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && !item.externalUrl && !item.function"
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'accent']"
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'mat-accent-bg']"
|
||||
[routerLinkActiveOptions]="{exact: item.exactMatch || false}"
|
||||
[target]="item.openInNewTab ? '_blank' : '_self'">
|
||||
[target]="item.openInNewTab ? '_blank' : '_self'" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
<!-- item.externalUrl -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && item.externalUrl && !item.function"
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'">
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
<!-- item.function -->
|
||||
<span class="nav-link" [ngClass]="item.classes" *ngIf="!item.url && item.function"
|
||||
(click)="item.function()">
|
||||
(click)="item.function()" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</span>
|
||||
|
||||
<!-- item.url && item.function -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && !item.externalUrl && item.function"
|
||||
(click)="item.function()"
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'accent']"
|
||||
[routerLinkActiveOptions]="{exact: item.exactMatch || false}">
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'mat-accent-bg']"
|
||||
[routerLinkActiveOptions]="{exact: item.exactMatch || false}" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
<!-- item.externalUrl && item.function -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && item.externalUrl && item.function"
|
||||
(click)="item.function()"
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'">
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
|
||||
<div class="children" [ngClass]="{'open': isOpen}">
|
||||
|
||||
<div class="{{fuseConfig.layout.navbar.primaryBackground}}">
|
||||
<div class="{{fuseConfig.layout.navbar.background}}">
|
||||
|
||||
<ng-container *ngFor="let item of item.children">
|
||||
<fuse-nav-horizontal-item *ngIf="item.type=='item'" [item]="item"></fuse-nav-horizontal-item>
|
||||
|
||||
@@ -2,37 +2,37 @@
|
||||
|
||||
<!-- item.url -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && !item.externalUrl && !item.function"
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'accent']"
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'mat-accent-bg']"
|
||||
[routerLinkActiveOptions]="{exact: item.exactMatch || false}"
|
||||
[target]="item.openInNewTab ? '_blank' : '_self'">
|
||||
[target]="item.openInNewTab ? '_blank' : '_self'" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
<!-- item.externalUrl -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && item.externalUrl && !item.function"
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'">
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
<!-- item.function -->
|
||||
<span class="nav-link" [ngClass]="item.classes" *ngIf="!item.url && item.function"
|
||||
(click)="item.function()">
|
||||
(click)="item.function()" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</span>
|
||||
|
||||
<!-- item.url && item.function -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && !item.externalUrl && item.function"
|
||||
(click)="item.function()"
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'accent']"
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'mat-accent-bg']"
|
||||
[routerLinkActiveOptions]="{exact: item.exactMatch || false}"
|
||||
[target]="item.openInNewTab ? '_blank' : '_self'">
|
||||
[target]="item.openInNewTab ? '_blank' : '_self'" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
<!-- item.externalUrl && item.function -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && item.externalUrl && item.function"
|
||||
(click)="item.function()"
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'">
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
|
||||
@@ -6,8 +6,7 @@
|
||||
<ng-container *ngFor="let item of navigation">
|
||||
|
||||
<fuse-nav-vertical-group *ngIf="item.type=='group'" [item]="item"></fuse-nav-vertical-group>
|
||||
<fuse-nav-vertical-collapsable *ngIf="item.type=='collapsable'"
|
||||
[item]="item"></fuse-nav-vertical-collapsable>
|
||||
<fuse-nav-vertical-collapsable *ngIf="item.type=='collapse'" [item]="item"></fuse-nav-vertical-collapsable>
|
||||
<fuse-nav-vertical-item *ngIf="item.type=='item'" [item]="item"></fuse-nav-vertical-item>
|
||||
|
||||
</ng-container>
|
||||
@@ -21,7 +20,7 @@
|
||||
<ng-container *ngFor="let item of navigation">
|
||||
|
||||
<fuse-nav-horizontal-collapsable *ngIf="item.type=='group'" [item]="item"></fuse-nav-horizontal-collapsable>
|
||||
<fuse-nav-horizontal-collapsable *ngIf="item.type=='collapsable'"
|
||||
<fuse-nav-horizontal-collapsable *ngIf="item.type=='collapse'"
|
||||
[item]="item"></fuse-nav-horizontal-collapsable>
|
||||
<fuse-nav-horizontal-item *ngIf="item.type=='item'" [item]="item"></fuse-nav-horizontal-item>
|
||||
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit, ViewEncapsulation } from '@angular/core';
|
||||
import { merge, Subject } from 'rxjs';
|
||||
import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core';
|
||||
import { Subject } from 'rxjs';
|
||||
import { takeUntil } from 'rxjs/operators';
|
||||
|
||||
import { FuseNavigationService } from '@fuse/components/navigation/navigation.service';
|
||||
|
||||
@Component({
|
||||
selector : 'fuse-navigation',
|
||||
templateUrl : './navigation.component.html',
|
||||
styleUrls : ['./navigation.component.scss'],
|
||||
encapsulation : ViewEncapsulation.None,
|
||||
changeDetection: ChangeDetectionStrategy.OnPush
|
||||
selector : 'fuse-navigation',
|
||||
templateUrl : './navigation.component.html',
|
||||
styleUrls : ['./navigation.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
})
|
||||
export class FuseNavigationComponent implements OnInit
|
||||
{
|
||||
@@ -23,12 +22,9 @@ export class FuseNavigationComponent implements OnInit
|
||||
private _unsubscribeAll: Subject<any>;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {ChangeDetectorRef} _changeDetectorRef
|
||||
* @param {FuseNavigationService} _fuseNavigationService
|
||||
* Constructor
|
||||
*/
|
||||
constructor(
|
||||
private _changeDetectorRef: ChangeDetectorRef,
|
||||
private _fuseNavigationService: FuseNavigationService
|
||||
)
|
||||
{
|
||||
@@ -52,24 +48,7 @@ export class FuseNavigationComponent implements OnInit
|
||||
this._fuseNavigationService.onNavigationChanged
|
||||
.pipe(takeUntil(this._unsubscribeAll))
|
||||
.subscribe(() => {
|
||||
|
||||
// Load the navigation
|
||||
this.navigation = this._fuseNavigationService.getCurrentNavigation();
|
||||
|
||||
// Mark for check
|
||||
this._changeDetectorRef.markForCheck();
|
||||
});
|
||||
|
||||
// Subscribe to navigation item
|
||||
merge(
|
||||
this._fuseNavigationService.onNavigationItemAdded,
|
||||
this._fuseNavigationService.onNavigationItemUpdated,
|
||||
this._fuseNavigationService.onNavigationItemRemoved
|
||||
).pipe(takeUntil(this._unsubscribeAll))
|
||||
.subscribe(() => {
|
||||
|
||||
// Mark for check
|
||||
this._changeDetectorRef.markForCheck();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { MatRippleModule } from '@angular/material/core';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatIconModule, MatRippleModule } from '@angular/material';
|
||||
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { BehaviorSubject, Observable, Subject } from 'rxjs';
|
||||
import * as _ from 'lodash';
|
||||
|
||||
import { FuseNavigationItem } from '@fuse/types';
|
||||
|
||||
@@ -16,9 +15,6 @@ export class FuseNavigationService
|
||||
private _onNavigationChanged: BehaviorSubject<any>;
|
||||
private _onNavigationRegistered: BehaviorSubject<any>;
|
||||
private _onNavigationUnregistered: BehaviorSubject<any>;
|
||||
private _onNavigationItemAdded: BehaviorSubject<any>;
|
||||
private _onNavigationItemUpdated: BehaviorSubject<any>;
|
||||
private _onNavigationItemRemoved: BehaviorSubject<any>;
|
||||
|
||||
private _currentNavigationKey: string;
|
||||
private _registry: { [key: string]: any } = {};
|
||||
@@ -37,9 +33,6 @@ export class FuseNavigationService
|
||||
this._onNavigationChanged = new BehaviorSubject(null);
|
||||
this._onNavigationRegistered = new BehaviorSubject(null);
|
||||
this._onNavigationUnregistered = new BehaviorSubject(null);
|
||||
this._onNavigationItemAdded = new BehaviorSubject(null);
|
||||
this._onNavigationItemUpdated = new BehaviorSubject(null);
|
||||
this._onNavigationItemRemoved = new BehaviorSubject(null);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@@ -76,36 +69,6 @@ export class FuseNavigationService
|
||||
return this._onNavigationUnregistered.asObservable();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get onNavigationItemAdded
|
||||
*
|
||||
* @returns {Observable<any>}
|
||||
*/
|
||||
get onNavigationItemAdded(): Observable<any>
|
||||
{
|
||||
return this._onNavigationItemAdded.asObservable();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get onNavigationItemUpdated
|
||||
*
|
||||
* @returns {Observable<any>}
|
||||
*/
|
||||
get onNavigationItemUpdated(): Observable<any>
|
||||
{
|
||||
return this._onNavigationItemUpdated.asObservable();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get onNavigationItemRemoved
|
||||
*
|
||||
* @returns {Observable<any>}
|
||||
*/
|
||||
get onNavigationItemRemoved(): Observable<any>
|
||||
{
|
||||
return this._onNavigationItemRemoved.asObservable();
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Public methods
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@@ -332,9 +295,6 @@ export class FuseNavigationService
|
||||
{
|
||||
navigation.push(item);
|
||||
|
||||
// Trigger the observable
|
||||
this._onNavigationItemAdded.next(true);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -342,11 +302,6 @@ export class FuseNavigationService
|
||||
if ( id === 'start' )
|
||||
{
|
||||
navigation.unshift(item);
|
||||
|
||||
// Trigger the observable
|
||||
this._onNavigationItemAdded.next(true);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Add it to a specific location
|
||||
@@ -364,33 +319,6 @@ export class FuseNavigationService
|
||||
// Add the item
|
||||
parent.children.push(item);
|
||||
}
|
||||
|
||||
// Trigger the observable
|
||||
this._onNavigationItemAdded.next(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update navigation item with the given id
|
||||
*
|
||||
* @param id
|
||||
* @param properties
|
||||
*/
|
||||
updateNavigationItem(id, properties): void
|
||||
{
|
||||
// Get the navigation item
|
||||
const navigationItem = this.getNavigationItem(id);
|
||||
|
||||
// If there is no navigation with the give id, return
|
||||
if ( !navigationItem )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Merge the navigation properties
|
||||
_.merge(navigationItem, properties);
|
||||
|
||||
// Trigger the observable
|
||||
this._onNavigationItemUpdated.next(true);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -418,8 +346,5 @@ export class FuseNavigationService
|
||||
|
||||
// Remove the item
|
||||
parent.splice(parent.indexOf(item), 1);
|
||||
|
||||
// Trigger the observable
|
||||
this._onNavigationItemRemoved.next(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,45 +1,45 @@
|
||||
<ng-container *ngIf="!item.hidden">
|
||||
|
||||
<!-- normal collapsable -->
|
||||
<!-- normal collapse -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="!item.url && !item.function"
|
||||
(click)="toggleOpen($event)">
|
||||
(click)="toggleOpen($event)" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
<!-- item.url -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && !item.externalUrl && !item.function"
|
||||
(click)="toggleOpen($event)"
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'accent']"
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'mat-accent-bg']"
|
||||
[routerLinkActiveOptions]="{exact: item.exactMatch || false}"
|
||||
[target]="item.openInNewTab ? '_blank' : '_self'">
|
||||
[target]="item.openInNewTab ? '_blank' : '_self'" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
<!-- item.externalUrl -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && item.externalUrl && !item.function"
|
||||
(click)="toggleOpen($event)"
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'">
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
<!-- item.function -->
|
||||
<span class="nav-link" [ngClass]="item.classes" *ngIf="!item.url && item.function"
|
||||
(click)="toggleOpen($event);item.function()">
|
||||
(click)="toggleOpen($event);item.function()" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</span>
|
||||
|
||||
<!-- item.url && item.function -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && !item.externalUrl && item.function"
|
||||
(click)="toggleOpen($event);item.function()"
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'accent']"
|
||||
[routerLinkActiveOptions]="{exact: item.exactMatch || false}">
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'mat-accent-bg']"
|
||||
[routerLinkActiveOptions]="{exact: item.exactMatch || false}" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
<!-- item.externalUrl && item.function -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && item.externalUrl && item.function"
|
||||
(click)="toggleOpen($event);item.function()"
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'">
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { ChangeDetectorRef, Component, HostBinding, Input, OnDestroy, OnInit } from '@angular/core';
|
||||
import { Component, HostBinding, Input, OnDestroy, OnInit } from '@angular/core';
|
||||
import { NavigationEnd, Router } from '@angular/router';
|
||||
import { merge, Subject } from 'rxjs';
|
||||
import { Subject } from 'rxjs';
|
||||
import { filter, takeUntil } from 'rxjs/operators';
|
||||
|
||||
import { FuseNavigationItem } from '@fuse/types';
|
||||
@@ -30,12 +30,10 @@ export class FuseNavVerticalCollapsableComponent implements OnInit, OnDestroy
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param {ChangeDetectorRef} _changeDetectorRef
|
||||
* @param {FuseNavigationService} _fuseNavigationService
|
||||
* @param {Router} _router
|
||||
*/
|
||||
constructor(
|
||||
private _changeDetectorRef: ChangeDetectorRef,
|
||||
private _fuseNavigationService: FuseNavigationService,
|
||||
private _router: Router
|
||||
)
|
||||
@@ -113,18 +111,6 @@ export class FuseNavVerticalCollapsableComponent implements OnInit, OnDestroy
|
||||
{
|
||||
this.collapse();
|
||||
}
|
||||
|
||||
// Subscribe to navigation item
|
||||
merge(
|
||||
this._fuseNavigationService.onNavigationItemAdded,
|
||||
this._fuseNavigationService.onNavigationItemUpdated,
|
||||
this._fuseNavigationService.onNavigationItemRemoved
|
||||
).pipe(takeUntil(this._unsubscribeAll))
|
||||
.subscribe(() => {
|
||||
|
||||
// Mark for check
|
||||
this._changeDetectorRef.markForCheck();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -168,10 +154,6 @@ export class FuseNavVerticalCollapsableComponent implements OnInit, OnDestroy
|
||||
}
|
||||
|
||||
this.isOpen = true;
|
||||
|
||||
// Mark for check
|
||||
this._changeDetectorRef.markForCheck();
|
||||
|
||||
this._fuseNavigationService.onItemCollapseToggled.next();
|
||||
}
|
||||
|
||||
@@ -186,10 +168,6 @@ export class FuseNavVerticalCollapsableComponent implements OnInit, OnDestroy
|
||||
}
|
||||
|
||||
this.isOpen = false;
|
||||
|
||||
// Mark for check
|
||||
this._changeDetectorRef.markForCheck();
|
||||
|
||||
this._fuseNavigationService.onItemCollapseToggled.next();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,16 +1,13 @@
|
||||
import { ChangeDetectorRef, Component, HostBinding, Input, OnDestroy, OnInit } from '@angular/core';
|
||||
import { merge, Subject } from 'rxjs';
|
||||
import { takeUntil } from 'rxjs/operators';
|
||||
import { Component, HostBinding, Input } from '@angular/core';
|
||||
|
||||
import { FuseNavigationItem } from '@fuse/types';
|
||||
import { FuseNavigationService } from '@fuse/components/navigation/navigation.service';
|
||||
|
||||
@Component({
|
||||
selector : 'fuse-nav-vertical-group',
|
||||
templateUrl: './group.component.html',
|
||||
styleUrls : ['./group.component.scss']
|
||||
})
|
||||
export class FuseNavVerticalGroupComponent implements OnInit, OnDestroy
|
||||
export class FuseNavVerticalGroupComponent
|
||||
{
|
||||
@HostBinding('class')
|
||||
classes = 'nav-group nav-item';
|
||||
@@ -18,57 +15,11 @@ export class FuseNavVerticalGroupComponent implements OnInit, OnDestroy
|
||||
@Input()
|
||||
item: FuseNavigationItem;
|
||||
|
||||
// Private
|
||||
private _unsubscribeAll: Subject<any>;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {ChangeDetectorRef} _changeDetectorRef
|
||||
* @param {FuseNavigationService} _fuseNavigationService
|
||||
*/
|
||||
constructor(
|
||||
private _changeDetectorRef: ChangeDetectorRef,
|
||||
private _fuseNavigationService: FuseNavigationService
|
||||
)
|
||||
constructor()
|
||||
{
|
||||
// Set the private defaults
|
||||
this._unsubscribeAll = new Subject();
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Lifecycle hooks
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* On init
|
||||
*/
|
||||
ngOnInit(): void
|
||||
{
|
||||
// Subscribe to navigation item
|
||||
merge(
|
||||
this._fuseNavigationService.onNavigationItemAdded,
|
||||
this._fuseNavigationService.onNavigationItemUpdated,
|
||||
this._fuseNavigationService.onNavigationItemRemoved
|
||||
).pipe(takeUntil(this._unsubscribeAll))
|
||||
.subscribe(() => {
|
||||
|
||||
// Mark for check
|
||||
this._changeDetectorRef.markForCheck();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* On destroy
|
||||
*/
|
||||
ngOnDestroy(): void
|
||||
{
|
||||
// Unsubscribe from all subscriptions
|
||||
this._unsubscribeAll.next();
|
||||
this._unsubscribeAll.complete();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,37 +2,37 @@
|
||||
|
||||
<!-- item.url -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && !item.externalUrl && !item.function"
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'accent']"
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'mat-accent-bg']"
|
||||
[routerLinkActiveOptions]="{exact: item.exactMatch || false}"
|
||||
[target]="item.openInNewTab ? '_blank' : '_self'">
|
||||
[target]="item.openInNewTab ? '_blank' : '_self'" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
<!-- item.externalUrl -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && item.externalUrl && !item.function"
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'">
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
<!-- item.function -->
|
||||
<span class="nav-link" [ngClass]="item.classes" *ngIf="!item.url && item.function"
|
||||
(click)="item.function()">
|
||||
(click)="item.function()" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</span>
|
||||
|
||||
<!-- item.url && item.function -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && !item.externalUrl && item.function"
|
||||
(click)="item.function()"
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'accent']"
|
||||
[routerLink]="[item.url]" [routerLinkActive]="['active', 'mat-accent-bg']"
|
||||
[routerLinkActiveOptions]="{exact: item.exactMatch || false}"
|
||||
[target]="item.openInNewTab ? '_blank' : '_self'">
|
||||
[target]="item.openInNewTab ? '_blank' : '_self'" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
<!-- item.externalUrl && item.function -->
|
||||
<a class="nav-link" [ngClass]="item.classes" *ngIf="item.url && item.externalUrl && item.function"
|
||||
(click)="item.function()"
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'">
|
||||
[href]="item.url" [target]="item.openInNewTab ? '_blank' : '_self'" matRipple>
|
||||
<ng-container *ngTemplateOutlet="itemContent"></ng-container>
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1,16 +1,13 @@
|
||||
import { ChangeDetectorRef, Component, HostBinding, Input, OnDestroy, OnInit } from '@angular/core';
|
||||
import { merge, Subject } from 'rxjs';
|
||||
import { takeUntil } from 'rxjs/operators';
|
||||
import { Component, HostBinding, Input } from '@angular/core';
|
||||
|
||||
import { FuseNavigationItem } from '@fuse/types';
|
||||
import { FuseNavigationService } from '@fuse/components/navigation/navigation.service';
|
||||
|
||||
@Component({
|
||||
selector : 'fuse-nav-vertical-item',
|
||||
templateUrl: './item.component.html',
|
||||
styleUrls : ['./item.component.scss']
|
||||
})
|
||||
export class FuseNavVerticalItemComponent implements OnInit, OnDestroy
|
||||
export class FuseNavVerticalItemComponent
|
||||
{
|
||||
@HostBinding('class')
|
||||
classes = 'nav-item';
|
||||
@@ -18,56 +15,10 @@ export class FuseNavVerticalItemComponent implements OnInit, OnDestroy
|
||||
@Input()
|
||||
item: FuseNavigationItem;
|
||||
|
||||
// Private
|
||||
private _unsubscribeAll: Subject<any>;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {ChangeDetectorRef} _changeDetectorRef
|
||||
* @param {FuseNavigationService} _fuseNavigationService
|
||||
*/
|
||||
constructor(
|
||||
private _changeDetectorRef: ChangeDetectorRef,
|
||||
private _fuseNavigationService: FuseNavigationService
|
||||
)
|
||||
constructor()
|
||||
{
|
||||
// Set the private defaults
|
||||
this._unsubscribeAll = new Subject();
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Lifecycle hooks
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* On init
|
||||
*/
|
||||
ngOnInit(): void
|
||||
{
|
||||
// Subscribe to navigation item
|
||||
merge(
|
||||
this._fuseNavigationService.onNavigationItemAdded,
|
||||
this._fuseNavigationService.onNavigationItemUpdated,
|
||||
this._fuseNavigationService.onNavigationItemRemoved
|
||||
).pipe(takeUntil(this._unsubscribeAll))
|
||||
.subscribe(() => {
|
||||
|
||||
// Mark for check
|
||||
this._changeDetectorRef.markForCheck();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* On destroy
|
||||
*/
|
||||
ngOnDestroy(): void
|
||||
{
|
||||
// Unsubscribe from all subscriptions
|
||||
this._unsubscribeAll.next();
|
||||
this._unsubscribeAll.complete();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,9 +2,7 @@ import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { RouterModule } from '@angular/router';
|
||||
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
||||
import { MatButtonModule, MatIconModule, MatProgressBarModule } from '@angular/material';
|
||||
|
||||
import { FuseProgressBarComponent } from './progress-bar.component';
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router } from '@angular/router';
|
||||
import { NavigationEnd, NavigationStart, Router } from '@angular/router';
|
||||
import { BehaviorSubject, Observable } from 'rxjs';
|
||||
import { filter } from 'rxjs/operators';
|
||||
|
||||
@@ -103,7 +103,7 @@ export class FuseProgressBarService
|
||||
});
|
||||
|
||||
this._router.events
|
||||
.pipe(filter((event) => event instanceof NavigationEnd || event instanceof NavigationError || event instanceof NavigationCancel))
|
||||
.pipe(filter((event) => event instanceof NavigationEnd))
|
||||
.subscribe(() => {
|
||||
this.hide();
|
||||
});
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
<div class="fuse-search-bar" [ngClass]="{'expanded':!collapsed}">
|
||||
|
||||
<div class="fuse-search-bar-content">
|
||||
<div class="fuse-search-bar-content" [ngClass]="fuseConfig.layout.toolbar.background">
|
||||
|
||||
<label for="fuse-search-bar-input">
|
||||
<button mat-icon-button class="fuse-search-bar-expander" aria-label="Expand Search Bar" (click)="expand()"
|
||||
*ngIf="collapsed">
|
||||
<mat-icon class="s-24 secondary-text">search</mat-icon>
|
||||
</button>
|
||||
<!--<span class="fuse-search-bar-loader" fxLayout="row" fxLayoutAlign="center center" *ngIf="!collapsed">
|
||||
<mat-progress-spinner color="mat-accent" mode="indeterminate"></mat-progress-spinner>
|
||||
</span>-->
|
||||
</label>
|
||||
|
||||
<input id="fuse-search-bar-input" class="ml-24" type="text" placeholder="Search" (input)="search($event)"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
height: 64px;
|
||||
font-size: 13px;
|
||||
|
||||
@include media-breakpoint('xs') {
|
||||
@include media-breakpoint-down('xs') {
|
||||
height: 56px;
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
height: 64px !important;
|
||||
line-height: 64px !important;
|
||||
|
||||
@include media-breakpoint('xs') {
|
||||
@include media-breakpoint-down('xs') {
|
||||
height: 56px !important;
|
||||
line-height: 56px !important;
|
||||
}
|
||||
@@ -39,7 +39,7 @@
|
||||
height: 64px !important;
|
||||
line-height: 64px !important;
|
||||
|
||||
@include media-breakpoint('xs') {
|
||||
@include media-breakpoint-down('xs') {
|
||||
height: 56px !important;
|
||||
line-height: 56px !important;
|
||||
}
|
||||
@@ -53,9 +53,8 @@
|
||||
display: none;
|
||||
flex: 1 0 auto;
|
||||
min-height: 64px;
|
||||
font-size: 16px;
|
||||
background-color: transparent;
|
||||
color: currentColor;
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,8 +2,7 @@ import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { RouterModule } from '@angular/router';
|
||||
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatButtonModule, MatIconModule } from '@angular/material';
|
||||
|
||||
import { FuseSearchBarComponent } from './search-bar.component';
|
||||
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
@mixin fuse-search-bar-theme($theme) {
|
||||
|
||||
$background: map-get($theme, background);
|
||||
|
||||
.fuse-search-bar {
|
||||
|
||||
&.expanded {
|
||||
background-color: map-get($background, background);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="shortcuts" fxLayout="row" fxHide fxShow.gt-sm>
|
||||
<div class="shortcuts" fxHide fxShow.gt-sm>
|
||||
|
||||
<div fxLayout="row" fxLayoutAlign="space-between center" fxFlex="0 1 auto">
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
:host {
|
||||
|
||||
@include media-breakpoint('lt-md') {
|
||||
@include media-breakpoint-down('sm') {
|
||||
|
||||
#fuse-shortcuts {
|
||||
|
||||
@@ -19,10 +19,6 @@
|
||||
display: flex !important;
|
||||
flex: 1;
|
||||
height: 100%;
|
||||
|
||||
> div {
|
||||
flex: 1 1 auto !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { AfterViewInit, Component, ElementRef, Input, OnDestroy, OnInit, Renderer2, ViewChild } from '@angular/core';
|
||||
import { MediaObserver } from '@angular/flex-layout';
|
||||
import { Component, ElementRef, Input, OnDestroy, OnInit, Renderer2, ViewChild } from '@angular/core';
|
||||
import { ObservableMedia } from '@angular/flex-layout';
|
||||
import { CookieService } from 'ngx-cookie-service';
|
||||
import { Subject } from 'rxjs';
|
||||
import { takeUntil } from 'rxjs/operators';
|
||||
@@ -12,7 +12,7 @@ import { FuseNavigationService } from '@fuse/components/navigation/navigation.se
|
||||
templateUrl: './shortcuts.component.html',
|
||||
styleUrls : ['./shortcuts.component.scss']
|
||||
})
|
||||
export class FuseShortcutsComponent implements OnInit, AfterViewInit, OnDestroy
|
||||
export class FuseShortcutsComponent implements OnInit, OnDestroy
|
||||
{
|
||||
shortcutItems: any[];
|
||||
navigationItems: any[];
|
||||
@@ -23,10 +23,10 @@ export class FuseShortcutsComponent implements OnInit, AfterViewInit, OnDestroy
|
||||
@Input()
|
||||
navigation: any;
|
||||
|
||||
@ViewChild('searchInput', {static: false})
|
||||
@ViewChild('searchInput')
|
||||
searchInputField;
|
||||
|
||||
@ViewChild('shortcuts', {static: false})
|
||||
@ViewChild('shortcuts')
|
||||
shortcutsEl: ElementRef;
|
||||
|
||||
// Private
|
||||
@@ -35,17 +35,17 @@ export class FuseShortcutsComponent implements OnInit, AfterViewInit, OnDestroy
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param {Renderer2} _renderer
|
||||
* @param {CookieService} _cookieService
|
||||
* @param {FuseMatchMediaService} _fuseMatchMediaService
|
||||
* @param {FuseNavigationService} _fuseNavigationService
|
||||
* @param {MediaObserver} _mediaObserver
|
||||
* @param {Renderer2} _renderer
|
||||
* @param {ObservableMedia} _observableMedia
|
||||
*/
|
||||
constructor(
|
||||
private _cookieService: CookieService,
|
||||
private _fuseMatchMediaService: FuseMatchMediaService,
|
||||
private _fuseNavigationService: FuseNavigationService,
|
||||
private _mediaObserver: MediaObserver,
|
||||
private _observableMedia: ObservableMedia,
|
||||
private _renderer: Renderer2
|
||||
)
|
||||
{
|
||||
@@ -70,7 +70,9 @@ export class FuseShortcutsComponent implements OnInit, AfterViewInit, OnDestroy
|
||||
// Get the navigation items and flatten them
|
||||
this.filteredNavigationItems = this.navigationItems = this._fuseNavigationService.getFlatNavigation(this.navigation);
|
||||
|
||||
if ( this._cookieService.check('FUSE2.shortcuts') )
|
||||
const cookieExists = this._cookieService.check('FUSE2.shortcuts');
|
||||
|
||||
if ( cookieExists )
|
||||
{
|
||||
this.shortcutItems = JSON.parse(this._cookieService.get('FUSE2.shortcuts'));
|
||||
}
|
||||
@@ -79,41 +81,36 @@ export class FuseShortcutsComponent implements OnInit, AfterViewInit, OnDestroy
|
||||
// User's shortcut items
|
||||
this.shortcutItems = [
|
||||
{
|
||||
title: 'Calendar',
|
||||
type : 'item',
|
||||
icon : 'today',
|
||||
url : '/apps/calendar'
|
||||
'title': 'Calendar',
|
||||
'type' : 'item',
|
||||
'icon' : 'today',
|
||||
'url' : '/apps/calendar'
|
||||
},
|
||||
{
|
||||
title: 'Mail',
|
||||
type : 'item',
|
||||
icon : 'email',
|
||||
url : '/apps/mail'
|
||||
'title': 'Mail',
|
||||
'type' : 'item',
|
||||
'icon' : 'email',
|
||||
'url' : '/apps/mail'
|
||||
},
|
||||
{
|
||||
title: 'Contacts',
|
||||
type : 'item',
|
||||
icon : 'account_box',
|
||||
url : '/apps/contacts'
|
||||
'title': 'Contacts',
|
||||
'type' : 'item',
|
||||
'icon' : 'account_box',
|
||||
'url' : '/apps/contacts'
|
||||
},
|
||||
{
|
||||
title: 'To-Do',
|
||||
type : 'item',
|
||||
icon : 'check_box',
|
||||
url : '/apps/todo'
|
||||
'title': 'To-Do',
|
||||
'type' : 'item',
|
||||
'icon' : 'check_box',
|
||||
'url' : '/apps/todo'
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ngAfterViewInit(): void
|
||||
{
|
||||
// Subscribe to media changes
|
||||
this._fuseMatchMediaService.onMediaChange
|
||||
.pipe(takeUntil(this._unsubscribeAll))
|
||||
.subscribe(() => {
|
||||
if ( this._mediaObserver.isActive('gt-sm') )
|
||||
if ( this._observableMedia.isActive('gt-sm') )
|
||||
{
|
||||
this.hideMobileShortcutsPanel();
|
||||
}
|
||||
|
||||
@@ -2,14 +2,7 @@ import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { FlexLayoutModule } from '@angular/flex-layout';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatListModule } from '@angular/material/list';
|
||||
import { MatMenuModule } from '@angular/material/menu';
|
||||
import { MatTooltipModule } from '@angular/material/tooltip';
|
||||
import { MatButtonModule, MatDividerModule, MatFormFieldModule, MatIconModule, MatInputModule, MatListModule, MatMenuModule, MatTooltipModule } from '@angular/material';
|
||||
import { CookieService } from 'ngx-cookie-service';
|
||||
|
||||
import { FuseShortcutsComponent } from './shortcuts.component';
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
@mixin fuse-shortcuts-theme($theme) {
|
||||
|
||||
$background: map-get($theme, background);
|
||||
|
||||
#fuse-shortcuts {
|
||||
|
||||
&.show-mobile-panel {
|
||||
background-color: map-get($background, background);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,8 +15,9 @@ fuse-sidebar {
|
||||
max-width: 280px;
|
||||
z-index: 1000;
|
||||
box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.35);
|
||||
background: white;
|
||||
|
||||
@include media-breakpoint('xs') {
|
||||
@include media-breakpoint-down('xs') {
|
||||
min-width: 0 !important;
|
||||
max-width: 80vw !important;
|
||||
width: 80vw !important;
|
||||
@@ -61,5 +62,10 @@ fuse-sidebar {
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: 999;
|
||||
background-color: rgba(0, 0, 0, 0.6);
|
||||
opacity: 0;
|
||||
|
||||
&.fuse-sidebar-overlay-invisible {
|
||||
background-color: transparent;
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,6 @@
|
||||
import {
|
||||
ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, OnDestroy, OnInit, Output, Renderer2, ViewEncapsulation
|
||||
} from '@angular/core';
|
||||
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, OnDestroy, OnInit, Output, Renderer2, RendererStyleFlags2, ViewEncapsulation } from '@angular/core';
|
||||
import { animate, AnimationBuilder, AnimationPlayer, style } from '@angular/animations';
|
||||
import { MediaObserver } from '@angular/flex-layout';
|
||||
import { ObservableMedia } from '@angular/flex-layout';
|
||||
import { Subject } from 'rxjs';
|
||||
import { takeUntil } from 'rxjs/operators';
|
||||
|
||||
@@ -87,7 +85,7 @@ export class FuseSidebarComponent implements OnInit, OnDestroy
|
||||
* @param {FuseConfigService} _fuseConfigService
|
||||
* @param {FuseMatchMediaService} _fuseMatchMediaService
|
||||
* @param {FuseSidebarService} _fuseSidebarService
|
||||
* @param {MediaObserver} _mediaObserver
|
||||
* @param {ObservableMedia} _observableMedia
|
||||
* @param {Renderer2} _renderer
|
||||
*/
|
||||
constructor(
|
||||
@@ -97,7 +95,7 @@ export class FuseSidebarComponent implements OnInit, OnDestroy
|
||||
private _fuseConfigService: FuseConfigService,
|
||||
private _fuseMatchMediaService: FuseMatchMediaService,
|
||||
private _fuseSidebarService: FuseSidebarService,
|
||||
private _mediaObserver: MediaObserver,
|
||||
private _observableMedia: ObservableMedia,
|
||||
private _renderer: Renderer2
|
||||
)
|
||||
{
|
||||
@@ -174,7 +172,7 @@ export class FuseSidebarComponent implements OnInit, OnDestroy
|
||||
this._renderer.setStyle(this._elementRef.nativeElement, 'max-width', styleValue);
|
||||
|
||||
// Set the style and class
|
||||
this._renderer.setStyle(sibling, styleRule, styleValue);
|
||||
this._renderer.setStyle(sibling, styleRule, styleValue, RendererStyleFlags2.Important + RendererStyleFlags2.DashCase);
|
||||
this._renderer.addClass(this._elementRef.nativeElement, 'folded');
|
||||
}
|
||||
// If unfolded...
|
||||
@@ -319,7 +317,7 @@ export class FuseSidebarComponent implements OnInit, OnDestroy
|
||||
.subscribe(() => {
|
||||
|
||||
// Get the active status
|
||||
const isActive = this._mediaObserver.isActive(this.lockedOpen);
|
||||
const isActive = this._observableMedia.isActive(this.lockedOpen);
|
||||
|
||||
// If the both status are the same, don't act
|
||||
if ( this._wasActive === isActive )
|
||||
@@ -435,7 +433,7 @@ export class FuseSidebarComponent implements OnInit, OnDestroy
|
||||
this._renderer.setStyle(this._elementRef.nativeElement, 'max-width', styleValue);
|
||||
|
||||
// Set the style and class
|
||||
this._renderer.setStyle(sibling, styleRule, styleValue);
|
||||
this._renderer.setStyle(sibling, styleRule, styleValue, RendererStyleFlags2.Important + RendererStyleFlags2.DashCase);
|
||||
this._renderer.addClass(this._elementRef.nativeElement, 'folded');
|
||||
}
|
||||
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
@mixin fuse-sidebar-theme($theme) {
|
||||
|
||||
$background: map-get($theme, background);
|
||||
|
||||
fuse-sidebar {
|
||||
background: map-get($background, background);
|
||||
}
|
||||
|
||||
.fuse-sidebar-overlay {
|
||||
background-color: rgba(0, 0, 0, 0.6);
|
||||
|
||||
&.fuse-sidebar-overlay-invisible {
|
||||
background-color: transparent;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,20 +12,6 @@
|
||||
|
||||
<form [formGroup]="form">
|
||||
|
||||
<!-- COLOR THEME -->
|
||||
<div class="group">
|
||||
|
||||
<h2>Color themes</h2>
|
||||
|
||||
<mat-radio-group fxLayout="column" fxLayoutAlign="start start" formControlName="colorTheme">
|
||||
<mat-radio-button class="mb-12" value="theme-default">Default Light</mat-radio-button>
|
||||
<mat-radio-button class="mb-12" value="theme-yellow-light">Yellow Light</mat-radio-button>
|
||||
<mat-radio-button class="mb-12" value="theme-blue-gray-dark">Blue-Gray Dark</mat-radio-button>
|
||||
<mat-radio-button class="mb-12" value="theme-pink-dark">Pink Dark</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- LAYOUT STYLES -->
|
||||
<div class="group" formGroupName="layout">
|
||||
|
||||
@@ -93,13 +79,10 @@
|
||||
<mat-radio-button class="mb-16" value="vertical-style-2">Style 2</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
||||
<h3 class="mt-16 mb-8">Primary background:</h3>
|
||||
<h3 class="mt-24 mb-8">Color:</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="primaryBackground"></fuse-material-color-picker>
|
||||
|
||||
<h3 class="mt-16 mb-8">Secondary background:</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="secondaryBackground"></fuse-material-color-picker>
|
||||
[(selectedClass)]="fuseConfig.layout.navbar.background">
|
||||
</fuse-material-color-picker>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -119,13 +102,10 @@
|
||||
<mat-radio-button class="mb-12" value="below-fixed">Below Fixed</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
||||
<mat-checkbox class="mt-24" formControlName="customBackgroundColor">
|
||||
Use custom background color
|
||||
</mat-checkbox>
|
||||
|
||||
<h3 class="mt-24 mb-8">Background color:</h3>
|
||||
<h3 class="mt-24 mb-8">Color:</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="background"></fuse-material-color-picker>
|
||||
[(selectedClass)]="fuseConfig.layout.toolbar.background">
|
||||
</fuse-material-color-picker>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -145,13 +125,10 @@
|
||||
<mat-radio-button class="mb-12" value="below-fixed">Below Fixed</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
||||
<mat-checkbox class="mt-24" formControlName="customBackgroundColor">
|
||||
Use custom background color
|
||||
</mat-checkbox>
|
||||
|
||||
<h3 class="mt-24 mb-8">Color:</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="background"></fuse-material-color-picker>
|
||||
[(selectedClass)]="fuseConfig.layout.footer.background">
|
||||
</fuse-material-color-picker>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -213,13 +190,10 @@
|
||||
<mat-radio-button class="mb-16" value="vertical-style-2">Style 2</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
||||
<h3 class="mt-16 mb-8">Primary background:</h3>
|
||||
<h3 class="mt-24 mb-8">Color:</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="primaryBackground"></fuse-material-color-picker>
|
||||
|
||||
<h3 class="mt-16 mb-8">Secondary background:</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="secondaryBackground"></fuse-material-color-picker>
|
||||
[(selectedClass)]="fuseConfig.layout.navbar.background">
|
||||
</fuse-material-color-picker>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -239,13 +213,10 @@
|
||||
<mat-radio-button class="mb-12" value="below">Below</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
||||
<mat-checkbox class="mt-24" formControlName="customBackgroundColor">
|
||||
Use custom background color
|
||||
</mat-checkbox>
|
||||
|
||||
<h3 class="mt-24 mb-8">Background color:</h3>
|
||||
<h3 class="mt-24 mb-8">Color:</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="background"></fuse-material-color-picker>
|
||||
[(selectedClass)]="fuseConfig.layout.toolbar.background">
|
||||
</fuse-material-color-picker>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -265,13 +236,10 @@
|
||||
<mat-radio-button class="mb-12" value="below">Below</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
||||
<mat-checkbox class="mt-24" formControlName="customBackgroundColor">
|
||||
Use custom background color
|
||||
</mat-checkbox>
|
||||
|
||||
<h3 class="mt-24 mb-8">Background color:</h3>
|
||||
<h3 class="mt-24 mb-8">Color:</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="background"></fuse-material-color-picker>
|
||||
[(selectedClass)]="fuseConfig.layout.footer.background">
|
||||
</fuse-material-color-picker>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -333,13 +301,10 @@
|
||||
<mat-radio-button class="mb-16" value="vertical-style-2">Style 2</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
||||
<h3 class="mt-16 mb-8">Primary background:</h3>
|
||||
<h3 class="mt-24 mb-8">Color:</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="primaryBackground"></fuse-material-color-picker>
|
||||
|
||||
<h3 class="mt-16 mb-8">Secondary background:</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="secondaryBackground"></fuse-material-color-picker>
|
||||
[(selectedClass)]="fuseConfig.layout.navbar.background">
|
||||
</fuse-material-color-picker>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -358,13 +323,10 @@
|
||||
<mat-radio-button class="mb-12" value="above-fixed">Above Fixed</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
||||
<mat-checkbox class="mt-24" formControlName="customBackgroundColor">
|
||||
Use custom background color
|
||||
</mat-checkbox>
|
||||
|
||||
<h3 class="mt-24 mb-8">Background color:</h3>
|
||||
<h3 class="mt-24 mb-8">Color:</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="background"></fuse-material-color-picker>
|
||||
[(selectedClass)]="fuseConfig.layout.toolbar.background">
|
||||
</fuse-material-color-picker>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -383,13 +345,10 @@
|
||||
<mat-radio-button class="mb-12" value="above-fixed">Above Fixed</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
||||
<mat-checkbox class="mt-24" formControlName="customBackgroundColor">
|
||||
Use custom background color
|
||||
</mat-checkbox>
|
||||
|
||||
<h3 class="mt-24 mb-8">Background color:</h3>
|
||||
<h3 class="mt-24 mb-8">Color:</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="background"></fuse-material-color-picker>
|
||||
[(selectedClass)]="fuseConfig.layout.footer.background">
|
||||
</fuse-material-color-picker>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -446,14 +405,9 @@
|
||||
<mat-radio-button class="mb-16" value="vertical-style-2">Style 2</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
||||
<h3 class="mt-16 mb-8">Primary background:</h3>
|
||||
<h3 class="mt-24 mb-8">Color:</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="primaryBackground">
|
||||
</fuse-material-color-picker>
|
||||
|
||||
<h3 class="mt-16 mb-8">Secondary background (Vertical):</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="secondaryBackground">
|
||||
[(selectedClass)]="fuseConfig.layout.navbar.background">
|
||||
</fuse-material-color-picker>
|
||||
|
||||
</div>
|
||||
@@ -473,13 +427,10 @@
|
||||
<mat-radio-button class="mb-12" value="below">Below</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
||||
<mat-checkbox class="mt-24" formControlName="customBackgroundColor">
|
||||
Use custom background color
|
||||
</mat-checkbox>
|
||||
|
||||
<h3 class="mt-24 mb-8">Background color:</h3>
|
||||
<h3 class="mt-24 mb-8">Color:</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="background"></fuse-material-color-picker>
|
||||
[(selectedClass)]="fuseConfig.layout.toolbar.background">
|
||||
</fuse-material-color-picker>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -498,13 +449,10 @@
|
||||
<mat-radio-button class="mb-12" value="above-static">Above Static</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
||||
<mat-checkbox class="mt-24" formControlName="customBackgroundColor">
|
||||
Use custom background color
|
||||
</mat-checkbox>
|
||||
|
||||
<h3 class="mt-24 mb-8">Background color:</h3>
|
||||
<h3 class="mt-24 mb-8">Color:</h3>
|
||||
<fuse-material-color-picker class="mb-16"
|
||||
formControlName="background"></fuse-material-color-picker>
|
||||
[(selectedClass)]="fuseConfig.layout.footer.background">
|
||||
</fuse-material-color-picker>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
fuse-theme-options {
|
||||
:host {
|
||||
display: flex;
|
||||
overflow: hidden;
|
||||
|
||||
@@ -30,7 +30,7 @@ fuse-theme-options {
|
||||
|
||||
.title {
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
padding-left: 4px;
|
||||
}
|
||||
}
|
||||
@@ -45,6 +45,7 @@ fuse-theme-options {
|
||||
flex: 1 0 auto;
|
||||
flex-direction: column;
|
||||
position: relative;
|
||||
border: 1px solid rgba(0, 0, 0, 0.12);
|
||||
border-radius: 2px;
|
||||
padding: 28px 16px 8px 16px;
|
||||
margin: 16px 0;
|
||||
@@ -56,12 +57,15 @@ fuse-theme-options {
|
||||
margin: 0;
|
||||
padding: 0 8px;
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
background: white;
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
margin: 24px 0 16px 0;
|
||||
padding: 0;
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { Component, HostBinding, Inject, OnDestroy, OnInit, Renderer2, ViewEncapsulation } from '@angular/core';
|
||||
import { Component, HostBinding, OnDestroy, OnInit, Renderer2 } from '@angular/core';
|
||||
import { FormBuilder, FormControl, FormGroup } from '@angular/forms';
|
||||
import { DOCUMENT } from '@angular/common';
|
||||
import { Subject } from 'rxjs';
|
||||
import { takeUntil } from 'rxjs/operators';
|
||||
|
||||
@@ -10,11 +9,10 @@ import { FuseNavigationService } from '@fuse/components/navigation/navigation.se
|
||||
import { FuseSidebarService } from '@fuse/components/sidebar/sidebar.service';
|
||||
|
||||
@Component({
|
||||
selector : 'fuse-theme-options',
|
||||
templateUrl : './theme-options.component.html',
|
||||
styleUrls : ['./theme-options.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
animations : fuseAnimations
|
||||
selector : 'fuse-theme-options',
|
||||
templateUrl: './theme-options.component.html',
|
||||
styleUrls : ['./theme-options.component.scss'],
|
||||
animations : fuseAnimations
|
||||
})
|
||||
export class FuseThemeOptionsComponent implements OnInit, OnDestroy
|
||||
{
|
||||
@@ -30,7 +28,6 @@ export class FuseThemeOptionsComponent implements OnInit, OnDestroy
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param {DOCUMENT} document
|
||||
* @param {FormBuilder} _formBuilder
|
||||
* @param {FuseConfigService} _fuseConfigService
|
||||
* @param {FuseNavigationService} _fuseNavigationService
|
||||
@@ -38,7 +35,6 @@ export class FuseThemeOptionsComponent implements OnInit, OnDestroy
|
||||
* @param {Renderer2} _renderer
|
||||
*/
|
||||
constructor(
|
||||
@Inject(DOCUMENT) private document: any,
|
||||
private _formBuilder: FormBuilder,
|
||||
private _fuseConfigService: FuseConfigService,
|
||||
private _fuseNavigationService: FuseNavigationService,
|
||||
@@ -65,36 +61,32 @@ export class FuseThemeOptionsComponent implements OnInit, OnDestroy
|
||||
// Build the config form
|
||||
// noinspection TypeScriptValidateTypes
|
||||
this.form = this._formBuilder.group({
|
||||
colorTheme : new FormControl(),
|
||||
customScrollbars: new FormControl(),
|
||||
layout : this._formBuilder.group({
|
||||
style : new FormControl(),
|
||||
width : new FormControl(),
|
||||
navbar : this._formBuilder.group({
|
||||
primaryBackground : new FormControl(),
|
||||
secondaryBackground: new FormControl(),
|
||||
folded : new FormControl(),
|
||||
hidden : new FormControl(),
|
||||
position : new FormControl(),
|
||||
variant : new FormControl()
|
||||
background: new FormControl(),
|
||||
folded : new FormControl(),
|
||||
hidden : new FormControl(),
|
||||
position : new FormControl(),
|
||||
variant : new FormControl()
|
||||
}),
|
||||
toolbar : this._formBuilder.group({
|
||||
background : new FormControl(),
|
||||
customBackgroundColor: new FormControl(),
|
||||
hidden : new FormControl(),
|
||||
position : new FormControl()
|
||||
background: new FormControl(),
|
||||
hidden : new FormControl(),
|
||||
position : new FormControl()
|
||||
}),
|
||||
footer : this._formBuilder.group({
|
||||
background : new FormControl(),
|
||||
customBackgroundColor: new FormControl(),
|
||||
hidden : new FormControl(),
|
||||
position : new FormControl()
|
||||
background: new FormControl(),
|
||||
hidden : new FormControl(),
|
||||
position : new FormControl()
|
||||
}),
|
||||
sidepanel: this._formBuilder.group({
|
||||
hidden : new FormControl(),
|
||||
position: new FormControl()
|
||||
hidden: new FormControl(),
|
||||
position : new FormControl()
|
||||
})
|
||||
})
|
||||
}),
|
||||
customScrollbars: new FormControl()
|
||||
});
|
||||
|
||||
// Subscribe to the config changes
|
||||
@@ -118,6 +110,7 @@ export class FuseThemeOptionsComponent implements OnInit, OnDestroy
|
||||
// Reset the form values based on the
|
||||
// selected layout style
|
||||
this._resetFormValues(value);
|
||||
|
||||
});
|
||||
|
||||
// Subscribe to the form value changes
|
||||
@@ -131,17 +124,17 @@ export class FuseThemeOptionsComponent implements OnInit, OnDestroy
|
||||
|
||||
// Add customize nav item that opens the bar programmatically
|
||||
const customFunctionNavItem = {
|
||||
id : 'custom-function',
|
||||
title : 'Custom Function',
|
||||
type : 'group',
|
||||
icon : 'settings',
|
||||
children: [
|
||||
'id' : 'custom-function',
|
||||
'title' : 'Custom Function',
|
||||
'type' : 'group',
|
||||
'icon' : 'settings',
|
||||
'children': [
|
||||
{
|
||||
id : 'customize',
|
||||
title : 'Customize',
|
||||
type : 'item',
|
||||
icon : 'settings',
|
||||
function: () => {
|
||||
'id' : 'customize',
|
||||
'title' : 'Customize',
|
||||
'type' : 'item',
|
||||
'icon' : 'settings',
|
||||
'function': () => {
|
||||
this.toggleSidebarOpen('themeOptionsPanel');
|
||||
}
|
||||
}
|
||||
@@ -184,30 +177,23 @@ export class FuseThemeOptionsComponent implements OnInit, OnDestroy
|
||||
{
|
||||
this.form.patchValue({
|
||||
layout: {
|
||||
width : 'fullwidth',
|
||||
navbar : {
|
||||
primaryBackground : 'fuse-navy-700',
|
||||
secondaryBackground: 'fuse-navy-900',
|
||||
folded : false,
|
||||
hidden : false,
|
||||
position : 'left',
|
||||
variant : 'vertical-style-1'
|
||||
width : 'fullwidth',
|
||||
navbar : {
|
||||
background: 'mat-fuse-dark-700-bg',
|
||||
folded : false,
|
||||
hidden : false,
|
||||
position : 'left',
|
||||
variant : 'vertical-style-1'
|
||||
},
|
||||
toolbar : {
|
||||
background : 'fuse-white-500',
|
||||
customBackgroundColor: false,
|
||||
hidden : false,
|
||||
position : 'below-static'
|
||||
toolbar: {
|
||||
background: 'mat-white-500-bg',
|
||||
hidden : false,
|
||||
position : 'below-static'
|
||||
},
|
||||
footer : {
|
||||
background : 'fuse-navy-900',
|
||||
customBackgroundColor: true,
|
||||
hidden : false,
|
||||
position : 'below-static'
|
||||
},
|
||||
sidepanel: {
|
||||
hidden : false,
|
||||
position: 'right'
|
||||
footer : {
|
||||
background: 'mat-fuse-dark-900-bg',
|
||||
hidden : false,
|
||||
position : 'below-static'
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -220,30 +206,23 @@ export class FuseThemeOptionsComponent implements OnInit, OnDestroy
|
||||
{
|
||||
this.form.patchValue({
|
||||
layout: {
|
||||
width : 'fullwidth',
|
||||
navbar : {
|
||||
primaryBackground : 'fuse-navy-700',
|
||||
secondaryBackground: 'fuse-navy-900',
|
||||
folded : false,
|
||||
hidden : false,
|
||||
position : 'left',
|
||||
variant : 'vertical-style-1'
|
||||
width : 'fullwidth',
|
||||
navbar : {
|
||||
background: 'mat-fuse-dark-700-bg',
|
||||
folded : false,
|
||||
hidden : false,
|
||||
position : 'left',
|
||||
variant : 'vertical-style-1'
|
||||
},
|
||||
toolbar : {
|
||||
background : 'fuse-white-500',
|
||||
customBackgroundColor: false,
|
||||
hidden : false,
|
||||
position : 'below'
|
||||
toolbar: {
|
||||
background: 'mat-white-500-bg',
|
||||
hidden : false,
|
||||
position : 'below'
|
||||
},
|
||||
footer : {
|
||||
background : 'fuse-navy-900',
|
||||
customBackgroundColor: true,
|
||||
hidden : false,
|
||||
position : 'below'
|
||||
},
|
||||
sidepanel: {
|
||||
hidden : false,
|
||||
position: 'right'
|
||||
footer : {
|
||||
background: 'mat-fuse-dark-900-bg',
|
||||
hidden : false,
|
||||
position : 'below'
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -256,30 +235,23 @@ export class FuseThemeOptionsComponent implements OnInit, OnDestroy
|
||||
{
|
||||
this.form.patchValue({
|
||||
layout: {
|
||||
width : 'fullwidth',
|
||||
navbar : {
|
||||
primaryBackground : 'fuse-navy-700',
|
||||
secondaryBackground: 'fuse-navy-900',
|
||||
folded : false,
|
||||
hidden : false,
|
||||
position : 'left',
|
||||
layout : 'vertical-style-1'
|
||||
width : 'fullwidth',
|
||||
navbar : {
|
||||
background: 'mat-fuse-dark-700-bg',
|
||||
folded : false,
|
||||
hidden : false,
|
||||
position : 'left',
|
||||
layout : 'vertical-style-1'
|
||||
},
|
||||
toolbar : {
|
||||
background : 'fuse-white-500',
|
||||
customBackgroundColor: false,
|
||||
hidden : false,
|
||||
position : 'above-static'
|
||||
toolbar: {
|
||||
background: 'mat-white-500-bg',
|
||||
hidden : false,
|
||||
position : 'above-static'
|
||||
},
|
||||
footer : {
|
||||
background : 'fuse-navy-900',
|
||||
customBackgroundColor: true,
|
||||
hidden : false,
|
||||
position : 'above-static'
|
||||
},
|
||||
sidepanel: {
|
||||
hidden : false,
|
||||
position: 'right'
|
||||
footer : {
|
||||
background: 'mat-fuse-dark-900-bg',
|
||||
hidden : false,
|
||||
position : 'above-static'
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -292,30 +264,23 @@ export class FuseThemeOptionsComponent implements OnInit, OnDestroy
|
||||
{
|
||||
this.form.patchValue({
|
||||
layout: {
|
||||
width : 'fullwidth',
|
||||
navbar : {
|
||||
primaryBackground : 'fuse-navy-700',
|
||||
secondaryBackground: 'fuse-navy-900',
|
||||
folded : false,
|
||||
hidden : false,
|
||||
position : 'top',
|
||||
variant : 'vertical-style-1'
|
||||
width : 'fullwidth',
|
||||
navbar : {
|
||||
background: 'mat-fuse-dark-700-bg',
|
||||
folded : false,
|
||||
hidden : false,
|
||||
position : 'top',
|
||||
variant : 'vertical-style-1'
|
||||
},
|
||||
toolbar : {
|
||||
background : 'fuse-white-500',
|
||||
customBackgroundColor: false,
|
||||
hidden : false,
|
||||
position : 'above'
|
||||
toolbar: {
|
||||
background: 'mat-white-500-bg',
|
||||
hidden : false,
|
||||
position : 'above'
|
||||
},
|
||||
footer : {
|
||||
background : 'fuse-navy-900',
|
||||
customBackgroundColor: true,
|
||||
hidden : false,
|
||||
position : 'above-fixed'
|
||||
},
|
||||
sidepanel: {
|
||||
hidden : false,
|
||||
position: 'right'
|
||||
footer : {
|
||||
background: 'mat-fuse-dark-900-bg',
|
||||
hidden : false,
|
||||
position : 'above-fixed'
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -338,4 +303,5 @@ export class FuseThemeOptionsComponent implements OnInit, OnDestroy
|
||||
{
|
||||
this._fuseSidebarService.getSidebar(key).toggleOpen();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,19 +2,11 @@ import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { FlexLayoutModule } from '@angular/flex-layout';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatCheckboxModule } from '@angular/material/checkbox';
|
||||
import { MatOptionModule } from '@angular/material/core';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatRadioModule } from '@angular/material/radio';
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
||||
import { MatButtonModule, MatDividerModule, MatFormFieldModule, MatIconModule, MatOptionModule, MatRadioModule, MatSelectModule, MatSlideToggleModule } from '@angular/material';
|
||||
|
||||
import { FuseDirectivesModule } from '@fuse/directives/directives';
|
||||
import { FuseMaterialColorPickerModule } from '@fuse/components/material-color-picker/material-color-picker.module';
|
||||
import { FuseSidebarModule } from '@fuse/components/sidebar/sidebar.module';
|
||||
import { FuseMaterialColorPickerModule } from '@fuse/components/material-color-picker/material-color-picker.module';
|
||||
|
||||
import { FuseThemeOptionsComponent } from '@fuse/components/theme-options/theme-options.component';
|
||||
|
||||
@@ -30,7 +22,6 @@ import { FuseThemeOptionsComponent } from '@fuse/components/theme-options/theme-
|
||||
FlexLayoutModule,
|
||||
|
||||
MatButtonModule,
|
||||
MatCheckboxModule,
|
||||
MatDividerModule,
|
||||
MatFormFieldModule,
|
||||
MatIconModule,
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
@mixin fuse-theme-options-theme($theme) {
|
||||
|
||||
$background: map-get($theme, background);
|
||||
$foreground: map-get($theme, foreground);
|
||||
|
||||
fuse-theme-options {
|
||||
|
||||
.theme-options-panel {
|
||||
|
||||
form {
|
||||
|
||||
.group {
|
||||
border: 1px solid map-get($foreground, divider);
|
||||
|
||||
h2 {
|
||||
background: map-get($background, background);
|
||||
color: map-get($foreground, secondary-text);
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: map-get($foreground, secondary-text);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,13 +20,11 @@ fuse-widget {
|
||||
width: 100%;
|
||||
opacity: 1;
|
||||
z-index: 10;
|
||||
border-radius: 8px;
|
||||
border-radius: 2px;
|
||||
transition: transform 0.5s ease-out 0s, visibility 0s ease-in 0.2s, opacity 0s ease-in 0.2s;
|
||||
transform: rotateY(0deg);
|
||||
backface-visibility: hidden;
|
||||
border: 1px solid;
|
||||
}
|
||||
|
||||
> .fuse-widget-back {
|
||||
display: block;
|
||||
position: absolute;
|
||||
@@ -38,11 +36,9 @@ fuse-widget {
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
z-index: 10;
|
||||
border-radius: 8px;
|
||||
transition: transform 0.5s ease-out 0s, visibility 0s ease-in 0.2s, opacity 0s ease-in 0.2s;
|
||||
transform: rotateY(180deg);
|
||||
backface-visibility: hidden;
|
||||
border: 1px solid;
|
||||
|
||||
[fuseWidgetToggle] {
|
||||
position: absolute;
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
@mixin fuse-widget-theme($theme) {
|
||||
|
||||
$background: map-get($theme, background);
|
||||
$foreground: map-get($theme, foreground);
|
||||
|
||||
fuse-widget {
|
||||
|
||||
> .fuse-widget-front,
|
||||
> .fuse-widget-back {
|
||||
background: map-get($background, card);
|
||||
border-color: map-get($foreground, divider);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Directive, Input, OnInit, HostListener, OnDestroy, HostBinding } from '@angular/core';
|
||||
import { MatSidenav } from '@angular/material/sidenav';
|
||||
import { MediaObserver } from '@angular/flex-layout';
|
||||
import { MatSidenav } from '@angular/material';
|
||||
import { ObservableMedia } from '@angular/flex-layout';
|
||||
import { Subject } from 'rxjs';
|
||||
import { takeUntil } from 'rxjs/operators';
|
||||
|
||||
@@ -15,11 +15,11 @@ export class FuseMatSidenavHelperDirective implements OnInit, OnDestroy
|
||||
@HostBinding('class.mat-is-locked-open')
|
||||
isLockedOpen: boolean;
|
||||
|
||||
@Input()
|
||||
fuseMatSidenavHelper: string;
|
||||
@Input('fuseMatSidenavHelper')
|
||||
id: string;
|
||||
|
||||
@Input()
|
||||
matIsLockedOpen: string;
|
||||
@Input('mat-is-locked-open')
|
||||
matIsLockedOpenBreakpoint: string;
|
||||
|
||||
// Private
|
||||
private _unsubscribeAll: Subject<any>;
|
||||
@@ -30,13 +30,13 @@ export class FuseMatSidenavHelperDirective implements OnInit, OnDestroy
|
||||
* @param {FuseMatchMediaService} _fuseMatchMediaService
|
||||
* @param {FuseMatSidenavHelperService} _fuseMatSidenavHelperService
|
||||
* @param {MatSidenav} _matSidenav
|
||||
* @param {MediaObserver} _mediaObserver
|
||||
* @param {ObservableMedia} _observableMedia
|
||||
*/
|
||||
constructor(
|
||||
private _fuseMatchMediaService: FuseMatchMediaService,
|
||||
private _fuseMatSidenavHelperService: FuseMatSidenavHelperService,
|
||||
private _matSidenav: MatSidenav,
|
||||
private _mediaObserver: MediaObserver
|
||||
private _observableMedia: ObservableMedia
|
||||
)
|
||||
{
|
||||
// Set the defaults
|
||||
@@ -56,9 +56,9 @@ export class FuseMatSidenavHelperDirective implements OnInit, OnDestroy
|
||||
ngOnInit(): void
|
||||
{
|
||||
// Register the sidenav to the service
|
||||
this._fuseMatSidenavHelperService.setSidenav(this.fuseMatSidenavHelper, this._matSidenav);
|
||||
this._fuseMatSidenavHelperService.setSidenav(this.id, this._matSidenav);
|
||||
|
||||
if ( this.matIsLockedOpen && this._mediaObserver.isActive(this.matIsLockedOpen) )
|
||||
if ( this._observableMedia.isActive(this.matIsLockedOpenBreakpoint) )
|
||||
{
|
||||
this.isLockedOpen = true;
|
||||
this._matSidenav.mode = 'side';
|
||||
@@ -74,7 +74,7 @@ export class FuseMatSidenavHelperDirective implements OnInit, OnDestroy
|
||||
this._fuseMatchMediaService.onMediaChange
|
||||
.pipe(takeUntil(this._unsubscribeAll))
|
||||
.subscribe(() => {
|
||||
if ( this.matIsLockedOpen && this._mediaObserver.isActive(this.matIsLockedOpen) )
|
||||
if ( this._observableMedia.isActive(this.matIsLockedOpenBreakpoint) )
|
||||
{
|
||||
this.isLockedOpen = true;
|
||||
this._matSidenav.mode = 'side';
|
||||
@@ -105,8 +105,8 @@ export class FuseMatSidenavHelperDirective implements OnInit, OnDestroy
|
||||
})
|
||||
export class FuseMatSidenavTogglerDirective
|
||||
{
|
||||
@Input()
|
||||
fuseMatSidenavToggler: string;
|
||||
@Input('fuseMatSidenavToggler')
|
||||
id;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
@@ -126,8 +126,8 @@ export class FuseMatSidenavTogglerDirective
|
||||
* On click
|
||||
*/
|
||||
@HostListener('click')
|
||||
onClick(): void
|
||||
onClick()
|
||||
{
|
||||
this._fuseMatSidenavHelperService.getSidenav(this.fuseMatSidenavToggler).toggle();
|
||||
this._fuseMatSidenavHelperService.getSidenav(this.id).toggle();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { MatSidenav } from '@angular/material/sidenav';
|
||||
import { MatSidenav } from '@angular/material';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
|
||||
@@ -1,24 +1,23 @@
|
||||
import { AfterViewInit, Directive, ElementRef, HostListener, Input, OnDestroy, OnInit } from '@angular/core';
|
||||
import { AfterViewInit, Directive, ElementRef, HostListener, Input, OnDestroy } from '@angular/core';
|
||||
import { NavigationEnd, Router } from '@angular/router';
|
||||
import { Platform } from '@angular/cdk/platform';
|
||||
import { fromEvent, Subject } from 'rxjs';
|
||||
import { debounceTime, filter, takeUntil } from 'rxjs/operators';
|
||||
import { Subject } from 'rxjs';
|
||||
import { filter, takeUntil } from 'rxjs/operators';
|
||||
import PerfectScrollbar from 'perfect-scrollbar';
|
||||
import * as _ from 'lodash';
|
||||
import { FusePerfectScrollbarGeometry, FusePerfectScrollbarPosition } from '@fuse/directives/fuse-perfect-scrollbar/fuse-perfect-scrollbar.interfaces';
|
||||
|
||||
import { FuseConfigService } from '@fuse/services/config.service';
|
||||
|
||||
@Directive({
|
||||
selector: '[fusePerfectScrollbar]'
|
||||
})
|
||||
export class FusePerfectScrollbarDirective implements OnInit, AfterViewInit, OnDestroy
|
||||
export class FusePerfectScrollbarDirective implements AfterViewInit, OnDestroy
|
||||
{
|
||||
isInitialized: boolean;
|
||||
isMobile: boolean;
|
||||
ps: PerfectScrollbar | any;
|
||||
ps: PerfectScrollbar;
|
||||
|
||||
// Private
|
||||
private _animation: number | null;
|
||||
private _enabled: boolean | '';
|
||||
private _debouncedUpdate: any;
|
||||
private _options: any;
|
||||
@@ -44,7 +43,6 @@ export class FusePerfectScrollbarDirective implements OnInit, AfterViewInit, OnD
|
||||
this.isMobile = false;
|
||||
|
||||
// Set the private defaults
|
||||
this._animation = null;
|
||||
this._enabled = false;
|
||||
this._debouncedUpdate = _.debounce(this.update, 150);
|
||||
this._options = {
|
||||
@@ -67,15 +65,6 @@ export class FusePerfectScrollbarDirective implements OnInit, AfterViewInit, OnD
|
||||
{
|
||||
// Merge the options
|
||||
this._options = _.merge({}, this._options, value);
|
||||
|
||||
// Destroy and re-init the PerfectScrollbar to update its options
|
||||
setTimeout(() => {
|
||||
this._destroy();
|
||||
});
|
||||
|
||||
setTimeout(() => {
|
||||
this._init();
|
||||
});
|
||||
}
|
||||
|
||||
get fusePerfectScrollbarOptions(): any
|
||||
@@ -131,24 +120,6 @@ export class FusePerfectScrollbarDirective implements OnInit, AfterViewInit, OnD
|
||||
// @ Lifecycle hooks
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* On init
|
||||
*/
|
||||
ngOnInit(): void
|
||||
{
|
||||
// Subscribe to window resize event
|
||||
fromEvent(window, 'resize')
|
||||
.pipe(
|
||||
takeUntil(this._unsubscribeAll),
|
||||
debounceTime(150)
|
||||
)
|
||||
.subscribe(() => {
|
||||
|
||||
// Update the PerfectScrollbar
|
||||
this.update();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* After view init
|
||||
*/
|
||||
@@ -229,19 +200,6 @@ export class FusePerfectScrollbarDirective implements OnInit, AfterViewInit, OnD
|
||||
this.ps = new PerfectScrollbar(this.elementRef.nativeElement, {
|
||||
...this.fusePerfectScrollbarOptions
|
||||
});
|
||||
|
||||
// Unbind 'keydown' events of PerfectScrollbar since it causes an extremely
|
||||
// high CPU usage on Angular Material inputs.
|
||||
// Loop through all the event elements of this PerfectScrollbar instance
|
||||
this.ps.event.eventElements.forEach((eventElement) => {
|
||||
|
||||
// If we hit to the element with a 'keydown' event...
|
||||
if ( typeof eventElement.handlers['keydown'] !== 'undefined' )
|
||||
{
|
||||
// Unbind it
|
||||
eventElement.element.removeEventListener('keydown', eventElement.handlers['keydown'][0]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -321,71 +279,6 @@ export class FusePerfectScrollbarDirective implements OnInit, AfterViewInit, OnD
|
||||
this.ngOnDestroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the geometry of the scrollable element
|
||||
*
|
||||
* @param prefix
|
||||
*/
|
||||
geometry(prefix: string = 'scroll'): FusePerfectScrollbarGeometry
|
||||
{
|
||||
return new FusePerfectScrollbarGeometry(
|
||||
this.elementRef.nativeElement[prefix + 'Left'],
|
||||
this.elementRef.nativeElement[prefix + 'Top'],
|
||||
this.elementRef.nativeElement[prefix + 'Width'],
|
||||
this.elementRef.nativeElement[prefix + 'Height']
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the position of the scrollable element
|
||||
*
|
||||
* @param absolute
|
||||
*/
|
||||
position(absolute: boolean = false): FusePerfectScrollbarPosition
|
||||
{
|
||||
if ( !absolute && this.ps )
|
||||
{
|
||||
return new FusePerfectScrollbarPosition(
|
||||
this.ps.reach.x || 0,
|
||||
this.ps.reach.y || 0
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
return new FusePerfectScrollbarPosition(
|
||||
this.elementRef.nativeElement.scrollLeft,
|
||||
this.elementRef.nativeElement.scrollTop
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Scroll to
|
||||
*
|
||||
* @param x
|
||||
* @param y
|
||||
* @param speed
|
||||
*/
|
||||
scrollTo(x: number, y?: number, speed?: number): void
|
||||
{
|
||||
if ( y == null && speed == null )
|
||||
{
|
||||
this.animateScrolling('scrollTop', x, speed);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( x != null )
|
||||
{
|
||||
this.animateScrolling('scrollLeft', x, speed);
|
||||
}
|
||||
|
||||
if ( y != null )
|
||||
{
|
||||
this.animateScrolling('scrollTop', y, speed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Scroll to X
|
||||
*
|
||||
@@ -438,8 +331,9 @@ export class FusePerfectScrollbarDirective implements OnInit, AfterViewInit, OnD
|
||||
*/
|
||||
scrollToRight(offset?: number, speed?: number): void
|
||||
{
|
||||
const left = this.elementRef.nativeElement.scrollWidth - this.elementRef.nativeElement.clientWidth;
|
||||
this.animateScrolling('scrollLeft', left - (offset || 0), speed);
|
||||
const width = this.elementRef.nativeElement.scrollWidth;
|
||||
|
||||
this.animateScrolling('scrollLeft', width - (offset || 0), speed);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -450,64 +344,27 @@ export class FusePerfectScrollbarDirective implements OnInit, AfterViewInit, OnD
|
||||
*/
|
||||
scrollToBottom(offset?: number, speed?: number): void
|
||||
{
|
||||
const top = this.elementRef.nativeElement.scrollHeight - this.elementRef.nativeElement.clientHeight;
|
||||
this.animateScrolling('scrollTop', top - (offset || 0), speed);
|
||||
}
|
||||
const height = this.elementRef.nativeElement.scrollHeight;
|
||||
|
||||
/**
|
||||
* Scroll to element
|
||||
*
|
||||
* @param qs
|
||||
* @param offset
|
||||
* @param speed
|
||||
*/
|
||||
scrollToElement(qs: string, offset?: number, speed?: number): void
|
||||
{
|
||||
const element = this.elementRef.nativeElement.querySelector(qs);
|
||||
|
||||
if ( !element )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const elementPos = element.getBoundingClientRect();
|
||||
const scrollerPos = this.elementRef.nativeElement.getBoundingClientRect();
|
||||
|
||||
if ( this.elementRef.nativeElement.classList.contains('ps--active-x') )
|
||||
{
|
||||
const currentPos = this.elementRef.nativeElement['scrollLeft'];
|
||||
const position = elementPos.left - scrollerPos.left + currentPos;
|
||||
|
||||
this.animateScrolling('scrollLeft', position + (offset || 0), speed);
|
||||
}
|
||||
|
||||
if ( this.elementRef.nativeElement.classList.contains('ps--active-y') )
|
||||
{
|
||||
const currentPos = this.elementRef.nativeElement['scrollTop'];
|
||||
const position = elementPos.top - scrollerPos.top + currentPos;
|
||||
|
||||
this.animateScrolling('scrollTop', position + (offset || 0), speed);
|
||||
}
|
||||
this.animateScrolling('scrollTop', height - (offset || 0), speed);
|
||||
}
|
||||
|
||||
/**
|
||||
* Animate scrolling
|
||||
*
|
||||
* @param target
|
||||
* @param value
|
||||
* @param speed
|
||||
* @param {string} target
|
||||
* @param {number} value
|
||||
* @param {number} speed
|
||||
*/
|
||||
animateScrolling(target: string, value: number, speed?: number): void
|
||||
{
|
||||
if ( this._animation )
|
||||
{
|
||||
window.cancelAnimationFrame(this._animation);
|
||||
this._animation = null;
|
||||
}
|
||||
|
||||
if ( !speed || typeof window === 'undefined' )
|
||||
if ( !speed )
|
||||
{
|
||||
this.elementRef.nativeElement[target] = value;
|
||||
|
||||
// PS has weird event sending order, this is a workaround for that
|
||||
this.update();
|
||||
this.update();
|
||||
}
|
||||
else if ( value !== this.elementRef.nativeElement[target] )
|
||||
{
|
||||
@@ -519,8 +376,9 @@ export class FusePerfectScrollbarDirective implements OnInit, AfterViewInit, OnD
|
||||
|
||||
const cosParameter = (oldValue - value) / 2;
|
||||
|
||||
const step = (newTimestamp: number) => {
|
||||
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
|
||||
@@ -528,17 +386,20 @@ export class FusePerfectScrollbarDirective implements OnInit, AfterViewInit, OnD
|
||||
{
|
||||
if ( scrollCount >= Math.PI )
|
||||
{
|
||||
this.animateScrolling(target, value, 0);
|
||||
this.elementRef.nativeElement[target] = value;
|
||||
|
||||
// PS has weird event sending order, this is a workaround for that
|
||||
this.update();
|
||||
|
||||
this.update();
|
||||
}
|
||||
else
|
||||
{
|
||||
this.elementRef.nativeElement[target] = newValue;
|
||||
this.elementRef.nativeElement[target] = oldValue = newValue;
|
||||
|
||||
// On a zoomed out page the resulting offset may differ
|
||||
oldValue = this.elementRef.nativeElement[target];
|
||||
oldTimestamp = newTimestamp;
|
||||
|
||||
this._animation = window.requestAnimationFrame(step);
|
||||
window.requestAnimationFrame(step);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
export class FusePerfectScrollbarGeometry
|
||||
{
|
||||
public x: number;
|
||||
public y: number;
|
||||
|
||||
public w: number;
|
||||
public h: number;
|
||||
|
||||
constructor(x: number, y: number, w: number, h: number)
|
||||
{
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.w = w;
|
||||
this.h = h;
|
||||
}
|
||||
}
|
||||
|
||||
export class FusePerfectScrollbarPosition
|
||||
{
|
||||
public x: number | 'start' | 'end';
|
||||
public y: number | 'start' | 'end';
|
||||
|
||||
constructor(x: number | 'start' | 'end', y: number | 'start' | 'end')
|
||||
{
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,6 @@ const black12 = 'rgba(black, 0.12)';
|
||||
const white12 = 'rgba(white, 0.12)';
|
||||
const black6 = 'rgba(black, 0.06)';
|
||||
const white6 = 'rgba(white, 0.06)';
|
||||
|
||||
const matColors = {
|
||||
'red': {
|
||||
50 : '#ffebee',
|
||||
@@ -636,8 +635,7 @@ const matColors = {
|
||||
A700: white87
|
||||
}
|
||||
},
|
||||
|
||||
'fuse-navy': {
|
||||
'fuse-dark': {
|
||||
50 : '#ECECEE',
|
||||
100 : '#C5C6CB',
|
||||
200 : '#9EA1A9',
|
||||
@@ -669,15 +667,13 @@ const matColors = {
|
||||
A700: white87
|
||||
}
|
||||
},
|
||||
|
||||
'fuse-white': {
|
||||
white : {
|
||||
500 : 'white',
|
||||
contrast: {
|
||||
500: black87
|
||||
}
|
||||
},
|
||||
|
||||
'fuse-black': {
|
||||
black : {
|
||||
500 : 'black',
|
||||
contrast: {
|
||||
500: 'white'
|
||||
@@ -687,23 +683,7 @@ const matColors = {
|
||||
|
||||
// tslint:disable-next-line
|
||||
const matPresetColors = [
|
||||
'#ffebee', '#ffcdd2', '#ef9a9a', '#e57373', '#ef5350', '#f44336', '#e53935', '#d32f2f', '#c62828', '#b71c1c', '#ff8a80', '#ff5252', '#ff1744', '#d50000', '#fce4ec', '#f8bbd0',
|
||||
'#f48fb1', '#f06292', '#ec407a', '#e91e63', '#d81b60', '#c2185b', '#ad1457', '#880e4f', '#ff80ab', '#ff4081', '#f50057', '#c51162', '#f3e5f5', '#e1bee7', '#ce93d8', '#ba68c8',
|
||||
'#ab47bc', '#9c27b0', '#8e24aa', '#7b1fa2', '#6a1b9a', '#4a148c', '#ea80fc', '#e040fb', '#d500f9', '#aa00ff', '#ede7f6', '#d1c4e9', '#b39ddb', '#9575cd', '#7e57c2', '#673ab7',
|
||||
'#5e35b1', '#512da8', '#4527a0', '#311b92', '#b388ff', '#7c4dff', '#651fff', '#6200ea', '#e8eaf6', '#c5cae9', '#9fa8da', '#7986cb', '#5c6bc0', '#3f51b5', '#3949ab', '#303f9f',
|
||||
'#283593', '#1a237e', '#8c9eff', '#536dfe', '#3d5afe', '#304ffe', '#e3f2fd', '#bbdefb', '#90caf9', '#64b5f6', '#42a5f5', '#2196f3', '#1e88e5', '#1976d2', '#1565c0', '#0d47a1',
|
||||
'#82b1ff', '#448aff', '#2979ff', '#2962ff', '#e1f5fe', '#b3e5fc', '#81d4fa', '#4fc3f7', '#29b6f6', '#03a9f4', '#039be5', '#0288d1', '#0277bd', '#01579b', '#80d8ff', '#40c4ff',
|
||||
'#00b0ff', '#0091ea', '#e0f7fa', '#b2ebf2', '#80deea', '#4dd0e1', '#26c6da', '#00bcd4', '#00acc1', '#0097a7', '#00838f', '#006064', '#84ffff', '#18ffff', '#00e5ff', '#00b8d4',
|
||||
'#e0f2f1', '#b2dfdb', '#80cbc4', '#4db6ac', '#26a69a', '#009688', '#00897b', '#00796b', '#00695c', '#004d40', '#a7ffeb', '#64ffda', '#1de9b6', '#00bfa5', '#e8f5e9', '#c8e6c9',
|
||||
'#a5d6a7', '#81c784', '#66bb6a', '#4caf50', '#43a047', '#388e3c', '#2e7d32', '#1b5e20', '#b9f6ca', '#69f0ae', '#00e676', '#00c853', '#f1f8e9', '#dcedc8', '#c5e1a5', '#aed581',
|
||||
'#9ccc65', '#8bc34a', '#7cb342', '#689f38', '#558b2f', '#33691e', '#ccff90', '#b2ff59', '#76ff03', '#64dd17', '#f9fbe7', '#f0f4c3', '#e6ee9c', '#dce775', '#d4e157', '#cddc39',
|
||||
'#c0ca33', '#afb42b', '#9e9d24', '#827717', '#f4ff81', '#eeff41', '#c6ff00', '#aeea00', '#fffde7', '#fff9c4', '#fff59d', '#fff176', '#ffee58', '#ffeb3b', '#fdd835', '#fbc02d',
|
||||
'#f9a825', '#f57f17', '#ffff8d', '#ffff00', '#ffea00', '#ffd600', '#fff8e1', '#ffecb3', '#ffe082', '#ffd54f', '#ffca28', '#ffc107', '#ffb300', '#ffa000', '#ff8f00', '#ff6f00',
|
||||
'#ffe57f', '#ffd740', '#ffc400', '#ffab00', '#fff3e0', '#ffe0b2', '#ffcc80', '#ffb74d', '#ffa726', '#ff9800', '#fb8c00', '#f57c00', '#ef6c00', '#e65100', '#ffd180', '#ffab40',
|
||||
'#ff9100', '#ff6d00', '#fbe9e7', '#ffccbc', '#ffab91', '#ff8a65', '#ff7043', '#ff5722', '#f4511e', '#e64a19', '#d84315', '#bf360c', '#ff9e80', '#ff6e40', '#ff3d00', '#dd2c00',
|
||||
'#efebe9', '#d7ccc8', '#bcaaa4', '#a1887f', '#8d6e63', '#795548', '#6d4c41', '#5d4037', '#4e342e', '#3e2723', '#d7ccc8', '#bcaaa4', '#8d6e63', '#5d4037', '#fafafa', '#f5f5f5',
|
||||
'#eeeeee', '#e0e0e0', '#bdbdbd', '#9e9e9e', '#757575', '#616161', '#424242', '#212121', '#ffffff', '#eeeeee', '#bdbdbd', '#616161', '#eceff1', '#cfd8dc', '#b0bec5', '#90a4ae',
|
||||
'#78909c', '#607d8b', '#546e7a', '#455a64', '#37474f', '#263238', '#cfd8dc', '#b0bec5', '#78909c', '#455a64'
|
||||
'#ffebee', '#ffcdd2', '#ef9a9a', '#e57373', '#ef5350', '#f44336', '#e53935', '#d32f2f', '#c62828', '#b71c1c', '#ff8a80', '#ff5252', '#ff1744', '#d50000', '#fce4ec', '#f8bbd0', '#f48fb1', '#f06292', '#ec407a', '#e91e63', '#d81b60', '#c2185b', '#ad1457', '#880e4f', '#ff80ab', '#ff4081', '#f50057', '#c51162', '#f3e5f5', '#e1bee7', '#ce93d8', '#ba68c8', '#ab47bc', '#9c27b0', '#8e24aa', '#7b1fa2', '#6a1b9a', '#4a148c', '#ea80fc', '#e040fb', '#d500f9', '#aa00ff', '#ede7f6', '#d1c4e9', '#b39ddb', '#9575cd', '#7e57c2', '#673ab7', '#5e35b1', '#512da8', '#4527a0', '#311b92', '#b388ff', '#7c4dff', '#651fff', '#6200ea', '#e8eaf6', '#c5cae9', '#9fa8da', '#7986cb', '#5c6bc0', '#3f51b5', '#3949ab', '#303f9f', '#283593', '#1a237e', '#8c9eff', '#536dfe', '#3d5afe', '#304ffe', '#e3f2fd', '#bbdefb', '#90caf9', '#64b5f6', '#42a5f5', '#2196f3', '#1e88e5', '#1976d2', '#1565c0', '#0d47a1', '#82b1ff', '#448aff', '#2979ff', '#2962ff', '#e1f5fe', '#b3e5fc', '#81d4fa', '#4fc3f7', '#29b6f6', '#03a9f4', '#039be5', '#0288d1', '#0277bd', '#01579b', '#80d8ff', '#40c4ff', '#00b0ff', '#0091ea', '#e0f7fa', '#b2ebf2', '#80deea', '#4dd0e1', '#26c6da', '#00bcd4', '#00acc1', '#0097a7', '#00838f', '#006064', '#84ffff', '#18ffff', '#00e5ff', '#00b8d4', '#e0f2f1', '#b2dfdb', '#80cbc4', '#4db6ac', '#26a69a', '#009688', '#00897b', '#00796b', '#00695c', '#004d40', '#a7ffeb', '#64ffda', '#1de9b6', '#00bfa5', '#e8f5e9', '#c8e6c9', '#a5d6a7', '#81c784', '#66bb6a', '#4caf50', '#43a047', '#388e3c', '#2e7d32', '#1b5e20', '#b9f6ca', '#69f0ae', '#00e676', '#00c853', '#f1f8e9', '#dcedc8', '#c5e1a5', '#aed581', '#9ccc65', '#8bc34a', '#7cb342', '#689f38', '#558b2f', '#33691e', '#ccff90', '#b2ff59', '#76ff03', '#64dd17', '#f9fbe7', '#f0f4c3', '#e6ee9c', '#dce775', '#d4e157', '#cddc39', '#c0ca33', '#afb42b', '#9e9d24', '#827717', '#f4ff81', '#eeff41', '#c6ff00', '#aeea00', '#fffde7', '#fff9c4', '#fff59d', '#fff176', '#ffee58', '#ffeb3b', '#fdd835', '#fbc02d', '#f9a825', '#f57f17', '#ffff8d', '#ffff00', '#ffea00', '#ffd600', '#fff8e1', '#ffecb3', '#ffe082', '#ffd54f', '#ffca28', '#ffc107', '#ffb300', '#ffa000', '#ff8f00', '#ff6f00', '#ffe57f', '#ffd740', '#ffc400', '#ffab00', '#fff3e0', '#ffe0b2', '#ffcc80', '#ffb74d', '#ffa726', '#ff9800', '#fb8c00', '#f57c00', '#ef6c00', '#e65100', '#ffd180', '#ffab40', '#ff9100', '#ff6d00', '#fbe9e7', '#ffccbc', '#ffab91', '#ff8a65', '#ff7043', '#ff5722', '#f4511e', '#e64a19', '#d84315', '#bf360c', '#ff9e80', '#ff6e40', '#ff3d00', '#dd2c00', '#efebe9', '#d7ccc8', '#bcaaa4', '#a1887f', '#8d6e63', '#795548', '#6d4c41', '#5d4037', '#4e342e', '#3e2723', '#d7ccc8', '#bcaaa4', '#8d6e63', '#5d4037', '#fafafa', '#f5f5f5', '#eeeeee', '#e0e0e0', '#bdbdbd', '#9e9e9e', '#757575', '#616161', '#424242', '#212121', '#ffffff', '#eeeeee', '#bdbdbd', '#616161', '#eceff1', '#cfd8dc', '#b0bec5', '#90a4ae', '#78909c', '#607d8b', '#546e7a', '#455a64', '#37474f', '#263238', '#cfd8dc', '#b0bec5', '#78909c', '#455a64'
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -713,15 +693,15 @@ const matPresetColors = [
|
||||
export class MatColors
|
||||
{
|
||||
public static all = matColors;
|
||||
|
||||
public static presets = matPresetColors;
|
||||
|
||||
public static getColor(colorName): any
|
||||
public static getColor(colorName)
|
||||
{
|
||||
if ( matColors[colorName] )
|
||||
{
|
||||
return matColors[colorName];
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,17 +10,21 @@
|
||||
// Fuse
|
||||
@import "fuse";
|
||||
|
||||
// Theme
|
||||
@import "theme";
|
||||
|
||||
// Include core Angular Material styles
|
||||
@include mat-core();
|
||||
|
||||
// Setup the typography
|
||||
@include angular-material-typography($typography);
|
||||
|
||||
// Create an Angular Material theme from the $theme map
|
||||
@include angular-material-theme($theme);
|
||||
|
||||
// Partials
|
||||
@import "partials/reset";
|
||||
@import "partials/normalize";
|
||||
@import "partials/scrollbars";
|
||||
@import "partials/helpers";
|
||||
@import "partials/general";
|
||||
@import "partials/global";
|
||||
@import "partials/icons";
|
||||
@import "partials/colors";
|
||||
@import "partials/material";
|
||||
@@ -31,6 +35,7 @@
|
||||
@import "partials/cards";
|
||||
@import "partials/navigation";
|
||||
@import "partials/forms";
|
||||
@import "partials/toolbar";
|
||||
@import "partials/print";
|
||||
|
||||
// Plugins
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// Material theming tools
|
||||
@import '~@angular/material/theming';
|
||||
// Material theming
|
||||
@import "theming";
|
||||
|
||||
// Breakpoint mixins
|
||||
@import "partials/breakpoints";
|
||||
@import "mixins/breakpoints";
|
||||
|
||||
126
src/@fuse/scss/mixins/_breakpoints.scss
Normal file
126
src/@fuse/scss/mixins/_breakpoints.scss
Normal file
@@ -0,0 +1,126 @@
|
||||
// Media step breakpoint mixin based on Angular Material lib
|
||||
$breakpoints: (
|
||||
xs: 'screen and (max-width: 599px)',
|
||||
sm: 'screen and (min-width: 600px) and (max-width: 959px)',
|
||||
md: 'screen and (min-width: 960px) and (max-width: 1279px)',
|
||||
lg: 'screen and (min-width: 1280px) and (max-width: 1919px)',
|
||||
xl: 'screen and (min-width: 1920px) and (max-width: 5000px)',
|
||||
lt-sm: 'screen and (max-width: 599px)',
|
||||
lt-md: 'screen and (max-width: 959px)',
|
||||
lt-lg: 'screen and (max-width: 1279px)',
|
||||
lt-xl: 'screen and (max-width: 1919px)',
|
||||
gt-xs: 'screen and (min-width: 600px)',
|
||||
gt-sm: 'screen and (min-width: 960px)',
|
||||
gt-md: 'screen and (min-width: 1280px)',
|
||||
gt-lg: 'screen and (min-width: 1920px)'
|
||||
) !default;
|
||||
|
||||
$grid-breakpoints: (
|
||||
xs: 0,
|
||||
sm: 600px,
|
||||
md: 960px,
|
||||
lg: 1280px,
|
||||
xl: 1920px
|
||||
) !default;
|
||||
|
||||
@mixin media-breakpoint($breakpointName) {
|
||||
|
||||
$mediaQuery: map_get($breakpoints, $breakpointName);
|
||||
|
||||
@if ($mediaQuery != null) {
|
||||
|
||||
@media #{$mediaQuery} {
|
||||
@content
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// >> breakpoint-next(sm)
|
||||
// md
|
||||
// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
|
||||
// md
|
||||
// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))
|
||||
// md
|
||||
@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {
|
||||
$n: index($breakpoint-names, $name);
|
||||
@return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);
|
||||
}
|
||||
|
||||
// Minimum breakpoint width. Null for the smallest (first) breakpoint.
|
||||
//
|
||||
// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
|
||||
// 576px
|
||||
@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {
|
||||
$min: map-get($breakpoints, $name);
|
||||
@return if($min != 0, $min, null);
|
||||
}
|
||||
|
||||
// Maximum breakpoint width. Null for the largest (last) breakpoint.
|
||||
// The maximum value is calculated as the minimum of the next one less 0.1.
|
||||
//
|
||||
// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
|
||||
// 767px
|
||||
@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {
|
||||
$next: breakpoint-next($name, $breakpoints);
|
||||
@return if($next, breakpoint-min($next, $breakpoints) - 1px, null);
|
||||
}
|
||||
|
||||
// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash infront.
|
||||
// Useful for making responsive utilities.
|
||||
//
|
||||
// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
|
||||
// "" (Returns a blank string)
|
||||
// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
|
||||
// "-sm"
|
||||
@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {
|
||||
@return if(breakpoint-min($name, $breakpoints) == null, "", "-#{$name}");
|
||||
}
|
||||
|
||||
// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.
|
||||
// Makes the @content apply to the given breakpoint and wider.
|
||||
@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {
|
||||
$min: breakpoint-min($name, $breakpoints);
|
||||
@if $min {
|
||||
@media (min-width: $min) {
|
||||
@content;
|
||||
}
|
||||
} @else {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
// Media of at most the maximum breakpoint width. No query for the largest breakpoint.
|
||||
// Makes the @content apply to the given breakpoint and narrower.
|
||||
@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {
|
||||
$max: breakpoint-max($name, $breakpoints);
|
||||
@if $max {
|
||||
@media (max-width: $max) {
|
||||
@content;
|
||||
}
|
||||
} @else {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
// Media that spans multiple breakpoint widths.
|
||||
// Makes the @content apply between the min and max breakpoints
|
||||
@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {
|
||||
$min: breakpoint-max($lower, $breakpoints);
|
||||
$max: breakpoint-max($upper, $breakpoints);
|
||||
|
||||
@media (min-width: $min) and (max-width: $max) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
// Media between the breakpoint's minimum and maximum widths.
|
||||
// No minimum for the smallest breakpoint, and no maximum for the largest one.
|
||||
// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.
|
||||
@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {
|
||||
$min: breakpoint-min($name, $breakpoints);
|
||||
$max: breakpoint-max($name, $breakpoints);
|
||||
|
||||
@media (min-width: $min) and (max-width: $max) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
@@ -1,31 +1,3 @@
|
||||
// Fix: "Remove the cdk-global-scrollblock effects from the HTML"
|
||||
// Fuse already blocks the body scroll so it doesn't need this feature. We are disabling it
|
||||
// because on Windows, it causes a scrollbar to show up.
|
||||
html {
|
||||
|
||||
&.cdk-global-scrollblock {
|
||||
position: relative !important;
|
||||
overflow: hidden !important;
|
||||
}
|
||||
}
|
||||
|
||||
// Fix: "Inconsistent button heights due to inconsistent line heights"
|
||||
button {
|
||||
|
||||
.mat-button-wrapper {
|
||||
line-height: normal;
|
||||
}
|
||||
}
|
||||
|
||||
.mat-icon {
|
||||
|
||||
// Fix: "Font-weight config affecting the icons"
|
||||
font-weight: 400 !important;
|
||||
|
||||
// Fix: "Inconsistent positioning on custom font icons"
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
// Fix: "Icon button ripple radius is not correct on Edge & Safari"
|
||||
.mat-icon-button {
|
||||
|
||||
@@ -40,6 +12,10 @@ button {
|
||||
}
|
||||
|
||||
// Fix: "Inconsistent font sizes across elements"
|
||||
.mat-form-field-wrapper {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.mat-checkbox {
|
||||
font-size: 16px;
|
||||
}
|
||||
@@ -58,9 +34,9 @@ button {
|
||||
background-color: rgba(0, 0, 0, 0.12);
|
||||
}
|
||||
|
||||
// Fix: "Some idiots using table-cell and inline-table in mat-select"
|
||||
.mat-form-field {
|
||||
|
||||
// Fix: "Table-cell and inline-table in mat-select"
|
||||
&.mat-form-field-type-mat-select {
|
||||
|
||||
.mat-form-field-infix {
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
// Media step breakpoint mixin based on Angular Material lib
|
||||
$breakpoints: (
|
||||
xs: 'screen and (max-width: 599px)',
|
||||
sm: 'screen and (min-width: 600px) and (max-width: 959px)',
|
||||
md: 'screen and (min-width: 960px) and (max-width: 1279px)',
|
||||
lg: 'screen and (min-width: 1280px) and (max-width: 1919px)',
|
||||
xl: 'screen and (min-width: 1920px) and (max-width: 5000px)',
|
||||
lt-sm: 'screen and (max-width: 599px)',
|
||||
lt-md: 'screen and (max-width: 959px)',
|
||||
lt-lg: 'screen and (max-width: 1279px)',
|
||||
lt-xl: 'screen and (max-width: 1919px)',
|
||||
gt-xs: 'screen and (min-width: 600px)',
|
||||
gt-sm: 'screen and (min-width: 960px)',
|
||||
gt-md: 'screen and (min-width: 1280px)',
|
||||
gt-lg: 'screen and (min-width: 1920px)'
|
||||
) !default;
|
||||
|
||||
// Re-map the breakpoints for the helper classes
|
||||
$helper-breakpoints: (
|
||||
xs: null,
|
||||
sm: 'gt-xs',
|
||||
md: 'gt-sm',
|
||||
lg: 'gt-md',
|
||||
xl: 'gt-lg'
|
||||
);
|
||||
|
||||
@mixin media-breakpoint($breakpointName) {
|
||||
|
||||
$mediaQuery: map-get($breakpoints, $breakpointName);
|
||||
|
||||
@if ($mediaQuery == null) {
|
||||
@content
|
||||
} @else {
|
||||
@media #{$mediaQuery} {
|
||||
@content
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,29 +1,9 @@
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Theming
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@mixin cards-theme($theme) {
|
||||
|
||||
$background: map-get($theme, background);
|
||||
$foreground: map-get($theme, foreground);
|
||||
|
||||
.fuse-card {
|
||||
background: map-get($background, card);
|
||||
border-color: map-get($foreground, divider);
|
||||
|
||||
.card-divider {
|
||||
border-top: 1px solid map-get($foreground, divider);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Cards
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
.fuse-card {
|
||||
max-width: 320px;
|
||||
min-width: 320px;
|
||||
border-radius: 8px;
|
||||
border: 1px solid;
|
||||
background: white;
|
||||
border-radius: 2px;
|
||||
@include mat-elevation(2);
|
||||
|
||||
&.variable-width {
|
||||
min-width: 0;
|
||||
@@ -57,8 +37,13 @@
|
||||
|
||||
// Divider
|
||||
.card-divider {
|
||||
border-top: 1px solid rgba(0, 0, 0, 0.12);
|
||||
margin: 16px;
|
||||
|
||||
&.light {
|
||||
border-top-color: rgba(255, 255, 255, 0.12);
|
||||
}
|
||||
|
||||
&.full-width {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
@@ -1,80 +1,52 @@
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Theming
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@mixin colors-theme($theme) {
|
||||
|
||||
$is-dark: map-get($theme, is-dark);
|
||||
$background: map-get($theme, background);
|
||||
$foreground: map-get($theme, foreground);
|
||||
|
||||
// Base colors
|
||||
& {
|
||||
color: map-get($foreground, text);
|
||||
|
||||
// If it's a light theme, use a darker background
|
||||
// color other than the default #fafafa
|
||||
@if ($is-dark) {
|
||||
background: map-get($background, background);
|
||||
} @else {
|
||||
background: #F5F5F5;
|
||||
}
|
||||
}
|
||||
|
||||
.secondary-text {
|
||||
color: map-get($foreground, secondary-text);
|
||||
}
|
||||
|
||||
.icon,
|
||||
i {
|
||||
color: map-get($foreground, icon);
|
||||
}
|
||||
|
||||
.hint-text {
|
||||
color: map-get($foreground, hint-text);
|
||||
}
|
||||
|
||||
.disabled-text {
|
||||
color: map-get($foreground, disabled-text);
|
||||
}
|
||||
|
||||
.fade-text,
|
||||
.divider {
|
||||
color: map-get($foreground, divider);
|
||||
}
|
||||
.secondary-text,
|
||||
.icon,
|
||||
i {
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Material colors map
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
.hint-text,
|
||||
.disabled-text {
|
||||
color: rgba(0, 0, 0, 0.38);
|
||||
}
|
||||
|
||||
.divider {
|
||||
color: rgba(0, 0, 0, 0.12);
|
||||
}
|
||||
|
||||
// Material colors map
|
||||
$matPalettes: (
|
||||
'red': $mat-red,
|
||||
'pink': $mat-pink,
|
||||
'purple': $mat-purple,
|
||||
'deep-purple': $mat-deep-purple,
|
||||
'indigo': $mat-indigo,
|
||||
'blue': $mat-blue,
|
||||
'light-blue': $mat-light-blue,
|
||||
'cyan': $mat-cyan,
|
||||
'teal': $mat-teal,
|
||||
'green': $mat-green,
|
||||
'light-green': $mat-light-green,
|
||||
'lime': $mat-lime,
|
||||
'yellow': $mat-yellow,
|
||||
'amber': $mat-amber,
|
||||
'orange': $mat-orange,
|
||||
'deep-orange': $mat-deep-orange,
|
||||
'brown': $mat-brown,
|
||||
'grey': $mat-grey,
|
||||
'blue-grey': $mat-blue-grey
|
||||
primary: $primary,
|
||||
accent: $accent,
|
||||
warn: $warn,
|
||||
red: $mat-red,
|
||||
pink: $mat-pink,
|
||||
purple: $mat-purple,
|
||||
deep-purple: $mat-deep-purple,
|
||||
indigo: $mat-indigo,
|
||||
blue: $mat-blue,
|
||||
light-blue: $mat-light-blue,
|
||||
cyan: $mat-cyan,
|
||||
teal: $mat-teal,
|
||||
green: $mat-green,
|
||||
light-green: $mat-light-green,
|
||||
lime: $mat-lime,
|
||||
yellow: $mat-yellow,
|
||||
amber: $mat-amber,
|
||||
orange: $mat-orange,
|
||||
deep-orange: $mat-deep-orange,
|
||||
brown: $mat-brown,
|
||||
grey: $mat-grey,
|
||||
blue-grey: $mat-blue-grey,
|
||||
white: $mat-white,
|
||||
black: $mat-black,
|
||||
fuse-dark: $mat-fusedark
|
||||
);
|
||||
|
||||
// Material color hues list
|
||||
$matHues: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, A100, A200, A400, A700;
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Text color levels generator
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@mixin generate-text-color-levels($classes, $contrast) {
|
||||
// Text color levels generator mixin
|
||||
@mixin generateTextColorLevels($classes, $contrast) {
|
||||
|
||||
// If the contrast is dark...
|
||||
@if ($contrast == 'dark') {
|
||||
@@ -153,10 +125,7 @@ $matHues: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, A100, A200, A400, A70
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Material element colors generator
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@mixin generate-material-element-colors($classes, $contrast) {
|
||||
@mixin generateMaterialElementColors($classes, $contrast) {
|
||||
|
||||
// If the contrast color is light...
|
||||
$fuseForeground: (
|
||||
@@ -181,55 +150,53 @@ $matHues: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, A100, A200, A400, A70
|
||||
|
||||
// Native Input
|
||||
input[type="text"] {
|
||||
color: map-get($fuseForeground, base);
|
||||
color: map_get($fuseForeground, base);
|
||||
}
|
||||
|
||||
// Input
|
||||
.mat-form-field-label {
|
||||
color: map-get($fuseForeground, hint-text);
|
||||
color: map_get($fuseForeground, hint-text);
|
||||
}
|
||||
|
||||
.mat-form-field-underline {
|
||||
background-color: map-get($fuseForeground, divider);
|
||||
background-color: map_get($fuseForeground, divider);
|
||||
}
|
||||
|
||||
// Select
|
||||
.mat-select-trigger,
|
||||
.mat-select-arrow {
|
||||
color: map-get($fuseForeground, hint-text);
|
||||
color: map_get($fuseForeground, hint-text);
|
||||
}
|
||||
|
||||
.mat-select-underline {
|
||||
background-color: map-get($fuseForeground, divider);
|
||||
background-color: map_get($fuseForeground, divider);
|
||||
}
|
||||
|
||||
.mat-select-disabled .mat-select-value,
|
||||
.mat-select-arrow,
|
||||
.mat-select-trigger {
|
||||
color: map-get($fuseForeground, hint-text);
|
||||
color: map_get($fuseForeground, hint-text);
|
||||
}
|
||||
|
||||
.mat-select-content,
|
||||
.mat-select-panel-done-animating {
|
||||
//background: map-get($background, card);
|
||||
background: map_get($background, card);
|
||||
}
|
||||
|
||||
.mat-select-value {
|
||||
color: map-get($fuseForeground, text);
|
||||
color: map_get($fuseForeground, text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Color classes generator
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@mixin generate-color-classes($colorName, $color, $contrastColor, $hue) {
|
||||
// Color classes generator mixin
|
||||
@mixin generateColorClasses($colorName, $color, $contrastColor, $hue) {
|
||||
|
||||
.#{$colorName}#{$hue}-bg {
|
||||
background-color: $color !important;
|
||||
}
|
||||
|
||||
.#{$colorName}#{$hue} {
|
||||
.mat-#{$colorName}#{$hue}-bg {
|
||||
background-color: $color !important;
|
||||
color: $contrastColor !important;
|
||||
|
||||
@@ -264,10 +231,13 @@ $matHues: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, A100, A200, A400, A70
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Fuse color classes
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@mixin fuse-color-classes($palettes) {
|
||||
@mixin generateFuseColorClasses($primary, $accent, $warn) {
|
||||
|
||||
$palettes: (
|
||||
primary: $primary,
|
||||
accent: $accent,
|
||||
warn: $warn
|
||||
);
|
||||
|
||||
// Define contrast lists
|
||||
$light-contrasting-classes: ();
|
||||
@@ -288,74 +258,101 @@ $matHues: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, A100, A200, A400, A70
|
||||
@if ($color != null and $contrast != null) {
|
||||
|
||||
// Generate color classes
|
||||
@include generate-color-classes($paletteName, $color, $contrast, '-#{$hue}');
|
||||
@include generateColorClasses($paletteName, $color, $contrast, '-#{$hue}');
|
||||
|
||||
// If the contrast color is dark
|
||||
@if (rgba(black, 1) == rgba($contrast, 1)) {
|
||||
$dark-contrasting-classes: append($dark-contrasting-classes, unquote('.#{$paletteName}-#{$hue}'), 'comma');
|
||||
$dark-contrasting-classes: append($dark-contrasting-classes, unquote('.mat-#{$paletteName}-#{$hue}-bg'), 'comma');
|
||||
}
|
||||
// if the contrast color is light
|
||||
@else {
|
||||
$light-contrasting-classes: append($light-contrasting-classes, unquote('.#{$paletteName}-#{$hue}'), 'comma');
|
||||
$light-contrasting-classes: append($light-contrasting-classes, unquote('.mat-#{$paletteName}-#{$hue}-bg'), 'comma');
|
||||
}
|
||||
|
||||
// Run the generator one more time for default values (500)
|
||||
// if we are not working with primary, accent or warn palettes
|
||||
@if ($hue == 500 and $paletteName != 'primary' and $paletteName != 'accent' and $paletteName != 'warn') {
|
||||
@if ($hue == 500) {
|
||||
|
||||
// Generate color classes
|
||||
@include generate-color-classes($paletteName, $color, $contrast, '');
|
||||
@include generateColorClasses($paletteName, $color, $contrast, '');
|
||||
|
||||
// Add color to the correct list depending on the contrasting color
|
||||
|
||||
// If the contrast color is dark
|
||||
@if (rgba(black, 1) == rgba($contrast, 1)) {
|
||||
$dark-contrasting-classes: append($dark-contrasting-classes, unquote('.#{$paletteName}'), 'comma');
|
||||
$dark-contrasting-classes: append($dark-contrasting-classes, unquote('.mat-#{$paletteName}-bg'), 'comma');
|
||||
}
|
||||
// if the contrast color is light
|
||||
@else {
|
||||
$light-contrasting-classes: append($light-contrasting-classes, unquote('.#{$paletteName}'), 'comma');
|
||||
$light-contrasting-classes: append($light-contrasting-classes, unquote('.mat-#{$paletteName}-bg'), 'comma');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Run the generator again for the selected default hue values for
|
||||
// primary, accent and warn palettes
|
||||
//
|
||||
// We are doing this because the default hue value can be changed
|
||||
// by the user when the Material theme being generated.
|
||||
@if ($paletteName == 'primary' or $paletteName == 'accent' or $paletteName == 'warn') {
|
||||
|
||||
// Get the color and the contrasting color for the selected
|
||||
// default hue
|
||||
$color: map-get($palette, 'default');
|
||||
$contrast: map-get($palette, 'default-contrast');
|
||||
|
||||
// Generate color classes
|
||||
@include generate-color-classes($paletteName, $color, $contrast, '');
|
||||
|
||||
// Add color to the correct list depending on the contrasting color
|
||||
|
||||
// If the contrast color is dark
|
||||
@if (rgba(black, 1) == rgba($contrast, 1)) {
|
||||
$dark-contrasting-classes: append($dark-contrasting-classes, unquote('.#{$paletteName}'), 'comma');
|
||||
}
|
||||
// if the contrast color is light
|
||||
@else {
|
||||
$light-contrasting-classes: append($light-contrasting-classes, unquote('.#{$paletteName}'), 'comma');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Generate contrasting colors
|
||||
@include generate-text-color-levels($dark-contrasting-classes, 'dark');
|
||||
@include generate-text-color-levels($light-contrasting-classes, 'light');
|
||||
@include generate-material-element-colors($dark-contrasting-classes, 'dark');
|
||||
@include generate-material-element-colors($light-contrasting-classes, 'light');
|
||||
@include generateTextColorLevels($dark-contrasting-classes, 'dark');
|
||||
@include generateTextColorLevels($light-contrasting-classes, 'light');
|
||||
@include generateMaterialElementColors($dark-contrasting-classes, 'dark');
|
||||
@include generateMaterialElementColors($light-contrasting-classes, 'light');
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Generate Fuse color classes for default Material palettes
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@include fuse-color-classes($matPalettes);
|
||||
// Generate the color classes...
|
||||
|
||||
// Define contrast lists
|
||||
$light-contrasting-classes: ();
|
||||
$dark-contrasting-classes: ();
|
||||
|
||||
@each $paletteName, $palette in $matPalettes {
|
||||
|
||||
// Get the contrasts map
|
||||
$contrasts: map-get($palette, 'contrast');
|
||||
|
||||
@each $hue in $matHues {
|
||||
|
||||
// Get the color and the contrasting color
|
||||
$color: map-get($palette, $hue);
|
||||
$contrast: map-get($contrasts, $hue);
|
||||
|
||||
@if ($color != null and $contrast != null) {
|
||||
|
||||
// Generate color classes
|
||||
@include generateColorClasses($paletteName, $color, $contrast, '-#{$hue}');
|
||||
|
||||
// Add color to the correct list depending on the contrasting color
|
||||
|
||||
// If the contrast color is dark
|
||||
@if (rgba(black, 1) == rgba($contrast, 1)) {
|
||||
$dark-contrasting-classes: append($dark-contrasting-classes, unquote('.mat-#{$paletteName}-#{$hue}-bg'), 'comma');
|
||||
}
|
||||
// if the contrast color is light
|
||||
@else {
|
||||
$light-contrasting-classes: append($light-contrasting-classes, unquote('.mat-#{$paletteName}-#{$hue}-bg'), 'comma');
|
||||
}
|
||||
|
||||
// Run the generator one more time for default values (500)
|
||||
@if ($hue == 500) {
|
||||
|
||||
// Generate color classes
|
||||
@include generateColorClasses($paletteName, $color, $contrast, '');
|
||||
|
||||
// Add color to the correct list depending on the contrasting color
|
||||
|
||||
// If the contrast color is dark
|
||||
@if (rgba(black, 1) == rgba($contrast, 1)) {
|
||||
$dark-contrasting-classes: append($dark-contrasting-classes, unquote('.mat-#{$paletteName}-bg'), 'comma');
|
||||
}
|
||||
// if the contrast color is light
|
||||
@else {
|
||||
$light-contrasting-classes: append($light-contrasting-classes, unquote('.mat-#{$paletteName}-bg'), 'comma');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Generate contrasting colors
|
||||
@include generateTextColorLevels($dark-contrasting-classes, 'dark');
|
||||
@include generateTextColorLevels($light-contrasting-classes, 'light');
|
||||
@include generateMaterialElementColors($dark-contrasting-classes, 'dark');
|
||||
@include generateMaterialElementColors($light-contrasting-classes, 'light');
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Body scroll lock
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
html,
|
||||
body {
|
||||
display: flex;
|
||||
flex: 1 0 auto;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
max-height: 100%;
|
||||
min-height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Boxed body
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
body {
|
||||
|
||||
// Boxed
|
||||
&.boxed {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
|
||||
@include mat-elevation(8);
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*/
|
||||
/* @ Text rendering & box sizing
|
||||
/*----------------------------------------------------------------*/
|
||||
* {
|
||||
text-rendering: optimizeLegibility;
|
||||
-o-text-rendering: optimizeLegibility;
|
||||
-ms-text-rendering: optimizeLegibility;
|
||||
-moz-text-rendering: optimizeLegibility;
|
||||
-webkit-text-rendering: optimizeLegibility;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
box-sizing: border-box;
|
||||
|
||||
&:before, &:after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
// Remove focus outline
|
||||
&:focus {
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Responsive images
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
vertical-align: top;
|
||||
border: none;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Input
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
input {
|
||||
border: none;
|
||||
padding: 0 16px;
|
||||
}
|
||||
24
src/@fuse/scss/partials/_global.scss
Normal file
24
src/@fuse/scss/partials/_global.scss
Normal file
@@ -0,0 +1,24 @@
|
||||
html,
|
||||
body {
|
||||
display: flex;
|
||||
flex: 1 0 auto;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
max-height: 100%;
|
||||
min-height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
background: #F5F5F5;
|
||||
}
|
||||
|
||||
body {
|
||||
|
||||
// Boxed
|
||||
&.boxed {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
|
||||
@include mat-elevation(8);
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Position helpers
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@each $breakpoint, $materialBreakpoint in $helper-breakpoints {
|
||||
// ######################
|
||||
// POSITION HELPERS
|
||||
// ######################
|
||||
@each $breakpoint in map-keys($grid-breakpoints) {
|
||||
|
||||
@include media-breakpoint($materialBreakpoint) {
|
||||
@include media-breakpoint-up($breakpoint) {
|
||||
|
||||
$infix: if($materialBreakpoint == null, "", "-#{$breakpoint}");
|
||||
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
|
||||
|
||||
.position#{$infix}-relative {
|
||||
position: relative;
|
||||
@@ -21,14 +21,14 @@
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Absolute position alignment helpers
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@each $breakpoint, $materialBreakpoint in $helper-breakpoints {
|
||||
// ####################################
|
||||
// ABSOLUTE POSITION ALIGNMENT HELPERS
|
||||
// ####################################
|
||||
@each $breakpoint in map-keys($grid-breakpoints) {
|
||||
|
||||
@include media-breakpoint($materialBreakpoint) {
|
||||
@include media-breakpoint-up($breakpoint) {
|
||||
|
||||
$infix: if($materialBreakpoint == null, "", "-#{$breakpoint}");
|
||||
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
|
||||
|
||||
.align#{$infix}-top {
|
||||
top: 0;
|
||||
@@ -48,9 +48,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Size helpers
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// ######################
|
||||
// SIZE HELPERS
|
||||
// ######################
|
||||
@each $prop, $abbrev in (height: h, width: w) {
|
||||
|
||||
@for $index from 0 through 180 {
|
||||
@@ -75,14 +75,14 @@
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Spacing helpers
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@each $breakpoint, $materialBreakpoint in $helper-breakpoints {
|
||||
// ######################
|
||||
// SPACING HELPERS
|
||||
// ######################
|
||||
@each $breakpoint in map-keys($grid-breakpoints) {
|
||||
|
||||
@include media-breakpoint($materialBreakpoint) {
|
||||
@include media-breakpoint-up($breakpoint) {
|
||||
|
||||
$infix: if($materialBreakpoint == null, "", "-#{$breakpoint}");
|
||||
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
|
||||
|
||||
@each $prop, $abbrev in (margin: m, padding: p) {
|
||||
|
||||
@@ -168,9 +168,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Border helpers
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// ######################
|
||||
// BORDER HELPERS
|
||||
// ######################
|
||||
$border-style: 1px solid rgba(0, 0, 0, 0.12);
|
||||
|
||||
.border,
|
||||
@@ -199,7 +199,7 @@ $border-style: 1px solid rgba(0, 0, 0, 0.12);
|
||||
}
|
||||
|
||||
.border-horizontal,
|
||||
.bx {
|
||||
.b-x {
|
||||
border-left: $border-style;
|
||||
border-right: $border-style;
|
||||
}
|
||||
@@ -210,9 +210,9 @@ $border-style: 1px solid rgba(0, 0, 0, 0.12);
|
||||
border-bottom: $border-style;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Border radius helpers
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// ######################
|
||||
// BORDER RADIUS HELPERS
|
||||
// ######################
|
||||
.border-radius-100 {
|
||||
border-radius: 100%;
|
||||
}
|
||||
@@ -233,9 +233,9 @@ $border-style: 1px solid rgba(0, 0, 0, 0.12);
|
||||
border-radius: 16px;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Cursor helpers
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// ######################
|
||||
// CURSOR HELPERS
|
||||
// ######################
|
||||
.cursor-pointer {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
@@ -7,11 +7,11 @@ mat-icon {
|
||||
min-height: 24px;
|
||||
line-height: 24px;
|
||||
|
||||
@each $breakpoint, $materialBreakpoint in $helper-breakpoints {
|
||||
@each $breakpoint in map-keys($grid-breakpoints) {
|
||||
|
||||
@include media-breakpoint($materialBreakpoint) {
|
||||
@include media-breakpoint-up($breakpoint) {
|
||||
|
||||
$infix: if($materialBreakpoint == null, "", "-#{$breakpoint}");
|
||||
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
|
||||
|
||||
@for $size from 2 through 128 {
|
||||
|
||||
|
||||
@@ -1,169 +1,6 @@
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Theming
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@mixin material-theme($theme) {
|
||||
|
||||
$background: map-get($theme, background);
|
||||
$foreground: map-get($theme, foreground);
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Avatar
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
.avatar {
|
||||
color: map-get($foreground, text);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Forms
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
.form-wrapper {
|
||||
background-color: map-get($background, card);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Navigation - Simple
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
.navigation-simple {
|
||||
|
||||
.item {
|
||||
|
||||
&.selected {
|
||||
background-color: map-get($background, hover);
|
||||
}
|
||||
}
|
||||
|
||||
.subheader {
|
||||
border-top: 1px solid map-get($foreground, divider);
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Pagination - Simple
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
.simple-pagination {
|
||||
background: map-get($background, card);
|
||||
|
||||
.pagination-item {
|
||||
color: map-get($foreground, secondary-text);
|
||||
|
||||
&:hover {
|
||||
color: map-get($foreground, text);
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
color: map-get($foreground, disabled-text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Price tables
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
.price-tables {
|
||||
|
||||
.price-table {
|
||||
background: map-get($background, card);
|
||||
|
||||
&.style-1 {
|
||||
|
||||
.price {
|
||||
|
||||
.currency {
|
||||
color: map-get($foreground, secondary-text);
|
||||
}
|
||||
|
||||
.period {
|
||||
color: map-get($foreground, secondary-text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.style-2 {
|
||||
|
||||
.price {
|
||||
|
||||
.currency {
|
||||
color: map-get($foreground, secondary-text);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.period {
|
||||
color: map-get($foreground, secondary-text);
|
||||
}
|
||||
}
|
||||
|
||||
&.style-3 {
|
||||
|
||||
.package-type {
|
||||
|
||||
.subtitle {
|
||||
color: map-get($foreground, secondary-text);
|
||||
}
|
||||
}
|
||||
|
||||
.terms {
|
||||
color: map-get($foreground, secondary-text);
|
||||
}
|
||||
|
||||
.note {
|
||||
color: map-get($foreground, secondary-text);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
// @ Table - Simple
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
.simple-table-container {
|
||||
background: map-get($background, card);
|
||||
}
|
||||
|
||||
table {
|
||||
|
||||
&.simple {
|
||||
|
||||
thead {
|
||||
|
||||
tr {
|
||||
|
||||
th {
|
||||
color: map-get($foreground, secondary-text);
|
||||
border-bottom: 1px solid map-get($foreground, divider);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tbody {
|
||||
|
||||
tr {
|
||||
|
||||
td {
|
||||
border-bottom: 1px solid map-get($foreground, divider);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.clickable {
|
||||
|
||||
tbody {
|
||||
|
||||
tr {
|
||||
|
||||
&:hover {
|
||||
background-color: map-get($background, hover);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Avatar
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
/*----------------------------------------------------------------*/
|
||||
/* Avatars
|
||||
/*----------------------------------------------------------------*/
|
||||
.avatar {
|
||||
width: 40px;
|
||||
min-width: 40px;
|
||||
@@ -172,8 +9,9 @@
|
||||
margin: 0 8px 0 0;
|
||||
border-radius: 50%;
|
||||
font-size: 17px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
text-align: center;
|
||||
color: #FFFFFF;
|
||||
|
||||
&.square {
|
||||
border-radius: 0;
|
||||
@@ -220,7 +58,6 @@ mat-icon.status {
|
||||
|
||||
&.online {
|
||||
color: #4CAF50;
|
||||
|
||||
&:before {
|
||||
content: "check_circle";
|
||||
}
|
||||
@@ -228,15 +65,14 @@ mat-icon.status {
|
||||
|
||||
&.do-not-disturb {
|
||||
color: #F44336;
|
||||
|
||||
&:before {
|
||||
content: "remove_circle_outline";
|
||||
content: "do_not_disturb_on";
|
||||
}
|
||||
}
|
||||
|
||||
&.away {
|
||||
color: #FFC107;
|
||||
|
||||
background-color: #FFC107;
|
||||
color: #FFFFFF;
|
||||
&:before {
|
||||
content: "access_time";
|
||||
}
|
||||
@@ -244,17 +80,18 @@ mat-icon.status {
|
||||
|
||||
&.offline {
|
||||
color: #646464;
|
||||
|
||||
background-color: #FFFFFF;
|
||||
&:before {
|
||||
content: "not_interested";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Forms
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
/*----------------------------------------------------------------*/
|
||||
/* Forms
|
||||
/*----------------------------------------------------------------*/
|
||||
.form-wrapper {
|
||||
background: #FFFFFF;
|
||||
padding: 16px;
|
||||
|
||||
.form-title {
|
||||
@@ -263,9 +100,9 @@ mat-icon.status {
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Navigation - Simple
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
/*----------------------------------------------------------------*/
|
||||
/* Navigation - Simple
|
||||
/*----------------------------------------------------------------*/
|
||||
.navigation-simple {
|
||||
|
||||
.item {
|
||||
@@ -285,15 +122,24 @@ mat-icon.status {
|
||||
|
||||
.title {
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
&.selected {
|
||||
background-color: rgba(0, 0, 0, 0.06);
|
||||
}
|
||||
}
|
||||
|
||||
.subheader {
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
border-top: 1px solid rgba(0, 0, 0, 0.12);
|
||||
font-weight: 500;
|
||||
margin-top: 8px;
|
||||
|
||||
&.light {
|
||||
border-top: 1px solid rgba(255, 255, 255, 0.12);
|
||||
}
|
||||
}
|
||||
|
||||
mat-divider {
|
||||
@@ -301,16 +147,16 @@ mat-icon.status {
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Pagination - Simple
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
/*----------------------------------------------------------------*/
|
||||
/* Pagination
|
||||
/*----------------------------------------------------------------*/
|
||||
.simple-pagination {
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
flex-direction: row;
|
||||
padding: 0 8px;
|
||||
border-radius: 4px;
|
||||
@include mat-elevation(1);
|
||||
background-color: #FFFFFF;
|
||||
padding: 0 8px;
|
||||
|
||||
.pagination-item {
|
||||
display: flex;
|
||||
@@ -322,24 +168,32 @@ mat-icon.status {
|
||||
border-radius: 0;
|
||||
margin: 0;
|
||||
font-weight: normal;
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
|
||||
&:hover {
|
||||
color: rgba(0, 0, 0, 0.87);
|
||||
}
|
||||
|
||||
&.active {
|
||||
cursor: default;
|
||||
color: rgba(0, 0, 0, 0.87);
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
cursor: default;
|
||||
color: rgba(0, 0, 0, 0.26);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Price tables
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
/*----------------------------------------------------------------*/
|
||||
/* Price Tables
|
||||
/*----------------------------------------------------------------*/
|
||||
.price-tables {
|
||||
|
||||
.price-table {
|
||||
position: relative;
|
||||
background-color: #FFFFFF;
|
||||
width: 280px;
|
||||
border-radius: 2px;
|
||||
margin: 12px;
|
||||
@@ -363,7 +217,8 @@ mat-icon.status {
|
||||
.currency {
|
||||
padding-right: 4px;
|
||||
font-size: 24px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
}
|
||||
|
||||
.value {
|
||||
@@ -375,6 +230,7 @@ mat-icon.status {
|
||||
.period {
|
||||
padding: 0 0 5px 4px;
|
||||
font-size: 17px;
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -405,14 +261,14 @@ mat-icon.status {
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
padding: 6px 8px;
|
||||
}
|
||||
|
||||
.package-type {
|
||||
padding: 48px 32px 24px 32px;
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@@ -422,7 +278,8 @@ mat-icon.status {
|
||||
.currency {
|
||||
padding-right: 4px;
|
||||
font-size: 24px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
}
|
||||
|
||||
.value {
|
||||
@@ -435,7 +292,8 @@ mat-icon.status {
|
||||
.period {
|
||||
padding: 0 32px;
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@@ -470,7 +328,8 @@ mat-icon.status {
|
||||
|
||||
.subtitle {
|
||||
font-size: 17px;
|
||||
font-weight: 600;
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
font-weight: 500;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -480,7 +339,7 @@ mat-icon.status {
|
||||
.currency {
|
||||
padding-right: 4px;
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.value {
|
||||
@@ -498,6 +357,7 @@ mat-icon.status {
|
||||
.terms {
|
||||
margin: 32px;
|
||||
font-size: 15px;
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
|
||||
.term {
|
||||
padding-bottom: 16px;
|
||||
@@ -515,15 +375,17 @@ mat-icon.status {
|
||||
.note {
|
||||
padding: 8px 32px 16px 32px;
|
||||
text-align: center;
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Table - Simple
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
/*----------------------------------------------------------------*/
|
||||
/* Table - Simple
|
||||
/*----------------------------------------------------------------*/
|
||||
.simple-table-container {
|
||||
background: #FFFFFF;
|
||||
|
||||
.table-title {
|
||||
font-size: 20px;
|
||||
@@ -545,7 +407,9 @@ table {
|
||||
|
||||
th {
|
||||
padding: 16px 8px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.12);
|
||||
white-space: nowrap;
|
||||
|
||||
&:first-child {
|
||||
@@ -565,6 +429,7 @@ table {
|
||||
|
||||
td {
|
||||
padding: 16px 8px;
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.12);
|
||||
|
||||
&:first-child {
|
||||
padding-left: 24px;
|
||||
@@ -590,8 +455,12 @@ table {
|
||||
|
||||
tr {
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
background: rgba(0, 0, 0, 0.03);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
display: flex;
|
||||
align-items: center;
|
||||
height: 48px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
padding-left: 24px;
|
||||
margin-top: 8px;
|
||||
font-size: 12px;
|
||||
@@ -19,7 +19,7 @@
|
||||
display: flex;
|
||||
align-items: center;
|
||||
height: 48px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
padding-left: 24px;
|
||||
margin-top: 8px;
|
||||
font-size: 12px;
|
||||
@@ -53,7 +53,7 @@
|
||||
height: 20px;
|
||||
padding: 0 7px;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
border-radius: 20px;
|
||||
transition: opacity 0.2s ease-in-out 0.1s;
|
||||
margin-left: 8px;
|
||||
@@ -64,11 +64,11 @@
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background-color: rgba(0, 0, 0, 0.04);
|
||||
background-color: map-get($background, hover);
|
||||
}
|
||||
|
||||
.mat-ripple-element {
|
||||
background-color: rgba(0, 0, 0, 0.04);
|
||||
background-color: map-get($background, hover);
|
||||
}
|
||||
|
||||
&.active {
|
||||
@@ -85,6 +85,7 @@
|
||||
|
||||
.nav-link-icon {
|
||||
margin-right: 16px;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.nav-link-icon,
|
||||
@@ -219,27 +220,24 @@
|
||||
}
|
||||
}
|
||||
|
||||
// Material 2 style
|
||||
&.material2,
|
||||
.material2 & {
|
||||
// Material style
|
||||
&.material {
|
||||
|
||||
.nav-subheader {
|
||||
height: 40px;
|
||||
}
|
||||
border-top: 1px solid rgba(0, 0, 0, 0.12);
|
||||
|
||||
.nav-group {
|
||||
|
||||
> .group-title {
|
||||
height: 40px;
|
||||
&:first-child {
|
||||
border-top: none;
|
||||
}
|
||||
}
|
||||
|
||||
.nav-item {
|
||||
|
||||
.nav-link {
|
||||
height: 40px;
|
||||
padding: 0 12px 0 24px;
|
||||
border-radius: 0 20px 20px 0;
|
||||
margin-right: 16px;
|
||||
padding: 0 16px;
|
||||
margin: 4px 8px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,91 +1,14 @@
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Theming
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@mixin page-layouts-theme($theme) {
|
||||
|
||||
$background: map-get($theme, background);
|
||||
$foreground: map-get($theme, foreground);
|
||||
|
||||
.page-layout {
|
||||
|
||||
// Carded layout
|
||||
&.carded {
|
||||
|
||||
// Fullwidth
|
||||
&.fullwidth {
|
||||
|
||||
> .center {
|
||||
|
||||
> .content-card {
|
||||
background: map-get($background, card);
|
||||
border-radius: 8px 8px 0 0;
|
||||
|
||||
> .toolbar {
|
||||
border-bottom-color: map-get($foreground, divider);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Left / Right sidebar
|
||||
&.left-sidebar,
|
||||
&.right-sidebar {
|
||||
|
||||
> .center {
|
||||
|
||||
> .content-card {
|
||||
background: map-get($background, card);
|
||||
border-radius: 8px 8px 0 0;
|
||||
|
||||
> .toolbar {
|
||||
border-bottom-color: map-get($foreground, divider);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Simple layout
|
||||
&.simple {
|
||||
|
||||
// Left / Right sidebar
|
||||
&.left-sidebar,
|
||||
&.right-sidebar {
|
||||
|
||||
> .center {
|
||||
|
||||
> .content {
|
||||
background: map-get($background, card);
|
||||
}
|
||||
}
|
||||
|
||||
// Inner sidebar
|
||||
&.inner-sidebar {
|
||||
|
||||
> .content {
|
||||
|
||||
> .center {
|
||||
|
||||
> .content {
|
||||
background: map-get($background, card);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Page Layouts
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// Page Layouts
|
||||
$carded-header-height: 200px !default;
|
||||
$carded-header-height-sm: 160px !default;
|
||||
$carded-toolbar-height: 64px !default;
|
||||
$header-height: 120px !default;
|
||||
|
||||
// Calculate toolbar-less carded header height
|
||||
$header-height: 120px !default;
|
||||
$header-height-sm: 100px !default;
|
||||
|
||||
// Calculate toolbarless header height
|
||||
$carded-header-height-without-toolbar: $carded-header-height - $carded-toolbar-height;
|
||||
$carded-header-height-without-toolbar-sm: $carded-header-height-sm - $carded-toolbar-height;
|
||||
|
||||
.page-layout {
|
||||
position: relative;
|
||||
@@ -107,6 +30,10 @@ $carded-header-height-without-toolbar: $carded-header-height - $carded-toolbar-h
|
||||
right: 0;
|
||||
left: 0;
|
||||
height: $carded-header-height;
|
||||
|
||||
@include media-breakpoint-down('sm') {
|
||||
height: $carded-header-height-sm;
|
||||
}
|
||||
}
|
||||
|
||||
// Fullwidth
|
||||
@@ -123,13 +50,18 @@ $carded-header-height-without-toolbar: $carded-header-height - $carded-toolbar-h
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
max-width: 100%;
|
||||
height: 100%;
|
||||
max-height: 100%;
|
||||
|
||||
> .header {
|
||||
height: $carded-header-height-without-toolbar !important;
|
||||
min-height: $carded-header-height-without-toolbar !important;
|
||||
max-height: $carded-header-height-without-toolbar !important;
|
||||
|
||||
@include media-breakpoint-down('sm') {
|
||||
height: $carded-header-height-without-toolbar-sm !important;
|
||||
min-height: $carded-header-height-without-toolbar-sm !important;
|
||||
max-height: $carded-header-height-without-toolbar-sm !important;
|
||||
}
|
||||
}
|
||||
|
||||
> .content-card {
|
||||
@@ -137,13 +69,13 @@ $carded-header-height-without-toolbar: $carded-header-height - $carded-toolbar-h
|
||||
flex-direction: column;
|
||||
flex: 1 0 auto;
|
||||
overflow: hidden;
|
||||
@include mat-elevation(1);
|
||||
@include mat-elevation(7);
|
||||
|
||||
> .toolbar {
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
align-items: center;
|
||||
border-bottom: 1px solid;
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.12);
|
||||
height: $carded-toolbar-height;
|
||||
min-height: $carded-toolbar-height;
|
||||
max-height: $carded-toolbar-height;
|
||||
@@ -173,7 +105,6 @@ $carded-header-height-without-toolbar: $carded-header-height - $carded-toolbar-h
|
||||
|
||||
> .mat-tab-group {
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
|
||||
.mat-tab-header {
|
||||
|
||||
@@ -292,6 +223,12 @@ $carded-header-height-without-toolbar: $carded-header-height - $carded-toolbar-h
|
||||
height: $carded-header-height;
|
||||
min-height: $carded-header-height;
|
||||
max-height: $carded-header-height;
|
||||
|
||||
@include media-breakpoint-down('sm') {
|
||||
height: $carded-header-height-sm;
|
||||
min-height: $carded-header-height-sm;
|
||||
max-height: $carded-header-height-sm;
|
||||
}
|
||||
}
|
||||
|
||||
.content {
|
||||
@@ -309,7 +246,6 @@ $carded-header-height-without-toolbar: $carded-header-height - $carded-toolbar-h
|
||||
z-index: 3;
|
||||
margin-left: 32px;
|
||||
margin-right: 32px;
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
|
||||
> .header {
|
||||
@@ -317,6 +253,12 @@ $carded-header-height-without-toolbar: $carded-header-height - $carded-toolbar-h
|
||||
height: $carded-header-height-without-toolbar;
|
||||
min-height: $carded-header-height-without-toolbar;
|
||||
max-height: $carded-header-height-without-toolbar;
|
||||
|
||||
@include media-breakpoint-down('sm') {
|
||||
height: $carded-header-height-without-toolbar-sm;
|
||||
min-height: $carded-header-height-without-toolbar-sm;
|
||||
max-height: $carded-header-height-without-toolbar-sm;
|
||||
}
|
||||
}
|
||||
|
||||
> .content-card {
|
||||
@@ -324,14 +266,14 @@ $carded-header-height-without-toolbar: $carded-header-height - $carded-toolbar-h
|
||||
flex-direction: column;
|
||||
flex: 1 1 auto;
|
||||
overflow: hidden;
|
||||
@include mat-elevation(1);
|
||||
@include mat-elevation(7);
|
||||
|
||||
> .toolbar {
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
align-items: center;
|
||||
flex: 1 1 auto;
|
||||
border-bottom: 1px solid;
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.12);
|
||||
height: $carded-toolbar-height;
|
||||
min-height: $carded-toolbar-height;
|
||||
max-height: $carded-toolbar-height;
|
||||
@@ -356,7 +298,7 @@ $carded-header-height-without-toolbar: $carded-header-height - $carded-toolbar-h
|
||||
width: calc(100% - 32px);
|
||||
min-width: 0;
|
||||
|
||||
@include media-breakpoint('lt-lg') {
|
||||
@include media-breakpoint-down('md') {
|
||||
width: calc(100% - 64px);
|
||||
}
|
||||
|
||||
@@ -542,8 +484,7 @@ $carded-header-height-without-toolbar: $carded-header-height - $carded-toolbar-h
|
||||
flex: 1 1 auto;
|
||||
z-index: 3;
|
||||
min-width: 0;
|
||||
width: 100%;
|
||||
@include mat-elevation(1);
|
||||
@include mat-elevation(7);
|
||||
|
||||
> .header {
|
||||
height: $header-height;
|
||||
@@ -575,7 +516,7 @@ $carded-header-height-without-toolbar: $carded-header-height - $carded-toolbar-h
|
||||
}
|
||||
}
|
||||
|
||||
// Inner sidebar
|
||||
// Inner Sidebar
|
||||
&.inner-sidebar {
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
@@ -602,11 +543,6 @@ $carded-header-height-without-toolbar: $carded-header-height - $carded-toolbar-h
|
||||
flex: 1 1 auto;
|
||||
overflow: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
|
||||
> .content {
|
||||
border-radius: 8px;
|
||||
@include mat-elevation(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -667,7 +603,7 @@ $carded-header-height-without-toolbar: $carded-header-height - $carded-toolbar-h
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
@include media-breakpoint('xs') {
|
||||
@include media-breakpoint-down('xs') {
|
||||
|
||||
// Smaller margins
|
||||
&.carded {
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
.page-break-before {
|
||||
display: none;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media print {
|
||||
@@ -46,13 +47,6 @@
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
#main,
|
||||
#container-1,
|
||||
#container-2,
|
||||
#container-3 {
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
.ps {
|
||||
overflow: visible !important;
|
||||
}
|
||||
|
||||
83
src/@fuse/scss/partials/_reset.scss
Normal file
83
src/@fuse/scss/partials/_reset.scss
Normal file
@@ -0,0 +1,83 @@
|
||||
/*----------------------------------------------------------------*/
|
||||
/* Reset
|
||||
/*----------------------------------------------------------------*/
|
||||
* {
|
||||
text-rendering: optimizeLegibility;
|
||||
-o-text-rendering: optimizeLegibility;
|
||||
-ms-text-rendering: optimizeLegibility;
|
||||
-moz-text-rendering: optimizeLegibility;
|
||||
-webkit-text-rendering: optimizeLegibility;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
box-sizing: border-box;
|
||||
|
||||
&:before, &:after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
// Remove focus outline
|
||||
&:focus {
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
|
||||
html, body {
|
||||
margin: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
// Reset non angular-material input's default browser/os styles
|
||||
*:not(mat-form-field) {
|
||||
|
||||
> input {
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
> input[type="text"],
|
||||
> input[type="tel"],
|
||||
> input[type="email"],
|
||||
> input[type="search"],
|
||||
> input[type="password"],
|
||||
> input[type="button"],
|
||||
> button,
|
||||
> input[type="submit"],
|
||||
> input[type="image"],
|
||||
> textarea {
|
||||
appearance: none;
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
*:not(mat-form-field) {
|
||||
|
||||
> input[type="button"],
|
||||
> button,
|
||||
> input[type="submit"] {
|
||||
background: none;
|
||||
}
|
||||
}
|
||||
|
||||
button {
|
||||
border-radius: 0;
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
appearance: none;
|
||||
-moz-appearance: none;
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
vertical-align: top;
|
||||
border: none;
|
||||
}
|
||||
@@ -12,12 +12,12 @@ body:not(.is-mobile) {
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
border: 2px solid transparent;
|
||||
box-shadow: inset 0 0 0 12px rgba(0, 0, 0, 0.37);
|
||||
border-radius: 12px;
|
||||
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 12px rgba(0, 0, 0, 0.54);
|
||||
border-radius: 12px;
|
||||
box-shadow: inset 0 0 0 24px rgba(0, 0, 0, 0.54);
|
||||
border-radius: 24px;
|
||||
}
|
||||
}
|
||||
9
src/@fuse/scss/partials/_toolbar.scss
Normal file
9
src/@fuse/scss/partials/_toolbar.scss
Normal file
@@ -0,0 +1,9 @@
|
||||
.toolbar {
|
||||
|
||||
.toolbar-separator {
|
||||
height: 48px;
|
||||
width: 1px;
|
||||
border-right: 1px solid rgba(0, 0, 0, 0.12);
|
||||
margin: 0 12px;
|
||||
}
|
||||
}
|
||||
@@ -1,47 +1,6 @@
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Theming
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@mixin typography-theme($theme) {
|
||||
|
||||
$background: map-get($theme, background);
|
||||
$accent: map-get($theme, accent);
|
||||
$is-dark: map-get($theme, is-dark);
|
||||
|
||||
a {
|
||||
color: map-get($accent, default);
|
||||
}
|
||||
|
||||
code {
|
||||
|
||||
&:not(.highlight) {
|
||||
background-color: map-get($background, app-bar);
|
||||
}
|
||||
}
|
||||
|
||||
.changelog {
|
||||
|
||||
.entry {
|
||||
background-color: map-get($background, card);
|
||||
}
|
||||
}
|
||||
|
||||
.text-boxed {
|
||||
@if ($is-dark) {
|
||||
background-color: rgba(255, 255, 255, 0.12);
|
||||
color: rgba(255, 255, 255, 0.54);
|
||||
} @else {
|
||||
background-color: rgba(0, 0, 0, 0.12);
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Typography
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
html {
|
||||
font-size: 62.5%;
|
||||
font-family: 'Muli', 'Helvetica Neue', 'Arial', sans-serif;
|
||||
font-family: 'Roboto', 'Helvetica Neue', 'Arial', sans-serif;
|
||||
line-height: 1.4 !important;
|
||||
letter-spacing: -0.1px !important;
|
||||
}
|
||||
@@ -87,9 +46,10 @@ h6, .h6 {
|
||||
|
||||
// Links
|
||||
a {
|
||||
color: mat-color($accent);
|
||||
text-decoration: none;
|
||||
|
||||
&:not(.mat-button):not(.mat-raised-button):not(.mat-flat-button):not(.mat-stroked-button):not(.mat-icon-button):not(.mat-fab):not(.mat-mini-fab) {
|
||||
&:not(.mat-button):not(.mat-raised-button):not(.mat-icon-button) {
|
||||
|
||||
&:hover, &:active {
|
||||
text-decoration: underline;
|
||||
@@ -143,10 +103,11 @@ code {
|
||||
font-family: 'Monaco', 'Menlo', 'Consolas', 'Ubuntu Mono', monospace;;
|
||||
|
||||
&:not(.highlight) {
|
||||
background: rgba(0, 0, 0, 0.065);
|
||||
color: #106CC8;
|
||||
margin: 0 1px;
|
||||
padding: 2px 3px;
|
||||
border-radius: 2px;
|
||||
line-height: 1.7;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,7 +237,6 @@ strong {
|
||||
line-height: 1.25;
|
||||
}
|
||||
|
||||
.line-height-1\.5,
|
||||
.line-height-1\.50 {
|
||||
line-height: 1.5;
|
||||
}
|
||||
@@ -285,29 +245,24 @@ strong {
|
||||
line-height: 1.75;
|
||||
}
|
||||
|
||||
// Letter spacing helpers
|
||||
.letter-spacing-condensed {
|
||||
letter-spacing: -0.02em;
|
||||
}
|
||||
|
||||
.letter-spacing-normal {
|
||||
letter-spacing: normal;
|
||||
}
|
||||
|
||||
.letter-spacing-relaxed {
|
||||
letter-spacing: 0.02em;
|
||||
}
|
||||
|
||||
// Boxed text
|
||||
.text-boxed {
|
||||
border-radius: 2px;
|
||||
padding: 4px 8px;
|
||||
margin: 0 8px;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
font-weight: 500;
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
background-color: rgba(0, 0, 0, 0.12);
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
// Boxed text light
|
||||
.text-boxed-light {
|
||||
@extend .text-boxed;
|
||||
background-color: rgba(255, 255, 255, 0.7);
|
||||
}
|
||||
|
||||
// Truncate
|
||||
.text-truncate {
|
||||
display: block;
|
||||
@@ -325,6 +280,7 @@ strong {
|
||||
.changelog {
|
||||
|
||||
.entry {
|
||||
background: white;
|
||||
margin-bottom: 24px;
|
||||
padding: 24px 32px;
|
||||
@include mat-elevation(2);
|
||||
@@ -399,10 +355,6 @@ strong {
|
||||
li {
|
||||
margin-bottom: 6px;
|
||||
letter-spacing: 0.015em;
|
||||
|
||||
ul {
|
||||
margin-top: 6px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -437,4 +389,4 @@ strong {
|
||||
border-left-color: #03A9F4;
|
||||
color: rgba(0, 0, 0, 0.87);
|
||||
}
|
||||
}
|
||||
}
|
||||
361
src/@fuse/scss/partials/plugins/_ng-pick-datetime.scss
Normal file
361
src/@fuse/scss/partials/plugins/_ng-pick-datetime.scss
Normal file
@@ -0,0 +1,361 @@
|
||||
/*@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;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
|
||||
.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,76 +1,3 @@
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Theming
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
@mixin ngx-datatable-theme($theme) {
|
||||
|
||||
$background: map-get($theme, background);
|
||||
$foreground: map-get($theme, foreground);
|
||||
|
||||
ngx-datatable {
|
||||
|
||||
&.material {
|
||||
background: map-get($background, card);
|
||||
color: map-get($foreground, text);
|
||||
|
||||
.datatable-header {
|
||||
|
||||
.datatable-header-cell {
|
||||
color: map-get($foreground, secondary-text);
|
||||
}
|
||||
}
|
||||
|
||||
.datatable-body {
|
||||
|
||||
.datatable-row-wrapper {
|
||||
border-bottom-color: map-get($foreground, divider);
|
||||
|
||||
&:first-child {
|
||||
border-top-color: map-get($foreground, divider);
|
||||
}
|
||||
|
||||
.datatable-body-row {
|
||||
|
||||
.datatable-body-cell {
|
||||
color: map-get($foreground, text);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.datatable-footer {
|
||||
color: map-get($foreground, secondary-text);
|
||||
|
||||
.datatable-pager {
|
||||
|
||||
a {
|
||||
color: map-get($foreground, secondary-text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&:not(.cell-selection) {
|
||||
|
||||
.datatable-body {
|
||||
|
||||
.datatable-row-wrapper {
|
||||
|
||||
.datatable-body-row {
|
||||
|
||||
&:hover {
|
||||
background-color: map-get($background, hover);
|
||||
|
||||
.datatable-row-group {
|
||||
background-color: map-get($background, hover);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ngx-datatable {
|
||||
|
||||
&.material {
|
||||
@@ -95,11 +22,6 @@
|
||||
min-height: 48px;
|
||||
font-size: 13px;
|
||||
padding: 0 24px;
|
||||
|
||||
.datatable-header-cell-template-wrap {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,11 +42,12 @@
|
||||
}
|
||||
|
||||
.datatable-row-wrapper {
|
||||
border-bottom: 1px solid;
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.12);
|
||||
|
||||
&:first-child {
|
||||
border-top: 1px solid;
|
||||
border-top: 1px solid rgba(0, 0, 0, 0.12);
|
||||
}
|
||||
|
||||
.datatable-body-cell {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
@@ -177,7 +100,7 @@
|
||||
}
|
||||
|
||||
[class*="datatable-icon-"] {
|
||||
font-family: 'material-outline-icons';
|
||||
font-family: 'Material Icons';
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
font-size: 24px;
|
||||
@@ -195,63 +118,48 @@
|
||||
.datatable-icon-filter:before {
|
||||
content: "filter_list";
|
||||
}
|
||||
|
||||
.datatable-icon-collapse:before {
|
||||
content: "unfold_less";
|
||||
}
|
||||
|
||||
.datatable-icon-expand:before {
|
||||
content: "unfold_more";
|
||||
}
|
||||
|
||||
.datatable-icon-close:before {
|
||||
content: "close";
|
||||
}
|
||||
|
||||
.datatable-icon-up:before {
|
||||
content: "arrow_drop_up";
|
||||
content: "keyboard_arrow_up";
|
||||
}
|
||||
|
||||
.datatable-icon-down:before {
|
||||
content: "arrow_drop_down";
|
||||
content: "keyboard_arrow_down";
|
||||
}
|
||||
|
||||
.datatable-icon-sort:before {
|
||||
content: "sort";
|
||||
}
|
||||
|
||||
.datatable-icon-done:before {
|
||||
content: "done";
|
||||
}
|
||||
|
||||
.datatable-icon-done-all:before {
|
||||
content: "done_all";
|
||||
}
|
||||
|
||||
.datatable-icon-search:before {
|
||||
content: "search";
|
||||
}
|
||||
|
||||
.datatable-icon-pin:before {
|
||||
content: "lock";
|
||||
}
|
||||
|
||||
.datatable-icon-add:before {
|
||||
content: "add";
|
||||
}
|
||||
|
||||
.datatable-icon-left:before {
|
||||
content: "chevron_left";
|
||||
}
|
||||
|
||||
.datatable-icon-right:before {
|
||||
content: "chevron_right";
|
||||
}
|
||||
|
||||
.datatable-icon-skip:before {
|
||||
content: "skip_next";
|
||||
}
|
||||
|
||||
.datatable-icon-prev:before {
|
||||
content: "skip_previous";
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
@import "src/@fuse/components/countdown/countdown.theme";
|
||||
@import "src/@fuse/components/material-color-picker/material-color-picker.theme";
|
||||
@import "src/@fuse/components/search-bar/search-bar.theme";
|
||||
@import "src/@fuse/components/shortcuts/shortcuts.theme";
|
||||
@import "src/@fuse/components/sidebar/sidebar.theme";
|
||||
@import "src/@fuse/components/theme-options/theme-options.theme";
|
||||
@import "src/@fuse/components/widget/widget.theme";
|
||||
|
||||
@mixin fuse-core-theme($theme) {
|
||||
|
||||
// Theming for Fuse core styles
|
||||
@include colors-theme($theme);
|
||||
@include cards-theme($theme);
|
||||
@include material-theme($theme);
|
||||
@include page-layouts-theme($theme);
|
||||
@include typography-theme($theme);
|
||||
|
||||
// Theming for Fuse components
|
||||
@include fuse-countdown-theme($theme);
|
||||
@include fuse-search-bar-theme($theme);
|
||||
@include fuse-shortcuts-theme($theme);
|
||||
@include fuse-sidebar-theme($theme);
|
||||
@include fuse-theme-options-theme($theme);
|
||||
@include fuse-material-color-picker-theme($theme);
|
||||
@include fuse-widget-theme($theme);
|
||||
|
||||
// Theming for 3rd party components
|
||||
@include ngx-datatable-theme($theme);
|
||||
}
|
||||
|
||||
66
src/@fuse/scss/theming.scss
Normal file
66
src/@fuse/scss/theming.scss
Normal file
@@ -0,0 +1,66 @@
|
||||
@import '~@angular/material/theming';
|
||||
|
||||
// Custom color maps
|
||||
$mat-white: (
|
||||
500: white,
|
||||
contrast: (
|
||||
500: $black-87-opacity
|
||||
)
|
||||
);
|
||||
|
||||
$mat-black: (
|
||||
500: black,
|
||||
contrast: (
|
||||
500: white,
|
||||
)
|
||||
);
|
||||
|
||||
$mat-fusedark: (
|
||||
50: #ECECEE,
|
||||
100: #C5C6CB,
|
||||
200: #9EA1A9,
|
||||
300: #7D818C,
|
||||
400: #5C616F,
|
||||
500: #3C4252,
|
||||
600: #353A48,
|
||||
700: #2D323E,
|
||||
800: #262933,
|
||||
900: #1E2129,
|
||||
A100: #C5C6CB,
|
||||
A200: #9EA1A9,
|
||||
A400: #5C616F,
|
||||
A700: #2D323E,
|
||||
contrast: (
|
||||
50: $black-87-opacity,
|
||||
100: $black-87-opacity,
|
||||
200: $black-87-opacity,
|
||||
300: white,
|
||||
400: white,
|
||||
500: $white-87-opacity,
|
||||
600: $white-87-opacity,
|
||||
700: $white-87-opacity,
|
||||
800: $white-87-opacity,
|
||||
900: $white-87-opacity,
|
||||
A100: $black-87-opacity,
|
||||
A200: $white-87-opacity,
|
||||
A400: $white-87-opacity,
|
||||
A700: $white-87-opacity,
|
||||
)
|
||||
);
|
||||
|
||||
// Define the Material palettes
|
||||
$primary: mat-palette($mat-fusedark);
|
||||
$accent: mat-palette($mat-light-blue, 600, 400, 700);
|
||||
$warn: mat-palette($mat-red);
|
||||
|
||||
// Create the Material theme object
|
||||
$theme: mat-light-theme($primary, $accent, $warn);
|
||||
|
||||
// Store the background and foreground colors for easier access
|
||||
$background: map-get($theme, background);
|
||||
$foreground: map-get($theme, foreground);
|
||||
|
||||
// Force the input field font sizes to 16px
|
||||
$typography: mat-typography-config(
|
||||
$input: mat-typography-level(16px, 1.125, 400)
|
||||
)
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Inject, Injectable, InjectionToken } from '@angular/core';
|
||||
import { ResolveEnd, Router } from '@angular/router';
|
||||
import { NavigationStart, Router } from '@angular/router';
|
||||
import { Platform } from '@angular/cdk/platform';
|
||||
import { BehaviorSubject, Observable } from 'rxjs';
|
||||
import { filter } from 'rxjs/operators';
|
||||
@@ -93,18 +93,15 @@ export class FuseConfigService
|
||||
// Set the config from the default config
|
||||
this._configSubject = new BehaviorSubject(_.cloneDeep(this._defaultConfig));
|
||||
|
||||
// Reload the default layout config on every RoutesRecognized event
|
||||
// if the current layout config is different from the default one
|
||||
// Reload the default config on every navigation start if
|
||||
// the current config is different from the default one
|
||||
this._router.events
|
||||
.pipe(filter(event => event instanceof ResolveEnd))
|
||||
.pipe(filter(event => event instanceof NavigationStart))
|
||||
.subscribe(() => {
|
||||
if ( !_.isEqual(this._configSubject.getValue().layout, this._defaultConfig.layout) )
|
||||
if ( !_.isEqual(this._configSubject.getValue(), this._defaultConfig) )
|
||||
{
|
||||
// Clone the current config
|
||||
const config = _.cloneDeep(this._configSubject.getValue());
|
||||
|
||||
// Reset the layout from the default config
|
||||
config.layout = _.cloneDeep(this._defaultConfig.layout);
|
||||
// Clone the default config
|
||||
const config = _.cloneDeep(this._defaultConfig);
|
||||
|
||||
// Set the config
|
||||
this._configSubject.next(config);
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { MediaChange, MediaObserver } from '@angular/flex-layout';
|
||||
import { MediaChange, ObservableMedia } from '@angular/flex-layout';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
@@ -14,10 +13,10 @@ export class FuseMatchMediaService
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param {MediaObserver} _mediaObserver
|
||||
* @param {ObservableMedia} _observableMedia
|
||||
*/
|
||||
constructor(
|
||||
private _mediaObserver: MediaObserver
|
||||
private _observableMedia: ObservableMedia
|
||||
)
|
||||
{
|
||||
// Set the defaults
|
||||
@@ -39,11 +38,7 @@ export class FuseMatchMediaService
|
||||
*/
|
||||
private _init(): void
|
||||
{
|
||||
this._mediaObserver.media$
|
||||
.pipe(
|
||||
debounceTime(500),
|
||||
distinctUntilChanged()
|
||||
)
|
||||
this._observableMedia
|
||||
.subscribe((change: MediaChange) => {
|
||||
if ( this.activeMediaQuery !== change.mqAlias )
|
||||
{
|
||||
|
||||
@@ -3,8 +3,6 @@ import { DOCUMENT } from '@angular/common';
|
||||
import { animate, AnimationBuilder, AnimationPlayer, style } from '@angular/animations';
|
||||
import { NavigationEnd, Router } from '@angular/router';
|
||||
|
||||
import { filter, take } from 'rxjs/operators';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
@@ -48,16 +46,19 @@ export class FuseSplashScreenService
|
||||
if ( this.splashScreenEl )
|
||||
{
|
||||
// Hide it on the first NavigationEnd event
|
||||
this._router.events
|
||||
.pipe(
|
||||
filter((event => event instanceof NavigationEnd)),
|
||||
take(1)
|
||||
)
|
||||
.subscribe(() => {
|
||||
setTimeout(() => {
|
||||
this.hide();
|
||||
});
|
||||
});
|
||||
const hideOnLoad = this._router.events.subscribe((event) => {
|
||||
if ( event instanceof NavigationEnd )
|
||||
{
|
||||
setTimeout(() => {
|
||||
this.hide();
|
||||
|
||||
// Unsubscribe from this event so it
|
||||
// won't get triggered again
|
||||
hideOnLoad.unsubscribe();
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,26 +1,21 @@
|
||||
export interface FuseConfig
|
||||
{
|
||||
colorTheme: string;
|
||||
customScrollbars: boolean;
|
||||
layout: {
|
||||
style: string,
|
||||
width: 'fullwidth' | 'boxed',
|
||||
navbar: {
|
||||
primaryBackground: string,
|
||||
secondaryBackground: string,
|
||||
background: string,
|
||||
hidden: boolean,
|
||||
folded: boolean,
|
||||
position: 'left' | 'right' | 'top',
|
||||
variant: string
|
||||
},
|
||||
toolbar: {
|
||||
customBackgroundColor: boolean,
|
||||
background: string,
|
||||
hidden: boolean,
|
||||
position: 'above' | 'above-static' | 'above-fixed' | 'below' | 'below-static' | 'below-fixed'
|
||||
}
|
||||
footer: {
|
||||
customBackgroundColor: boolean,
|
||||
background: string,
|
||||
hidden: boolean,
|
||||
position: 'above' | 'above-static' | 'above-fixed' | 'below' | 'below-static' | 'below-fixed'
|
||||
@@ -30,4 +25,5 @@ export interface FuseConfig
|
||||
position: 'left' | 'right'
|
||||
}
|
||||
};
|
||||
customScrollbars: boolean;
|
||||
}
|
||||
|
||||
@@ -27,9 +27,7 @@
|
||||
<!-- / HORIZONTAL LAYOUT 1 -->
|
||||
|
||||
<!-- THEME OPTIONS PANEL -->
|
||||
<button mat-icon-button class="warn mat-elevation-z2 theme-options-button"
|
||||
[ngClass]="{'right-side-panel': fuseConfig.layout.sidepanel.position === 'right',
|
||||
'side-panel-hidden': fuseConfig.layout.sidepanel.hidden === true}"
|
||||
<button mat-icon-button class="mat-primary-bg mat-elevation-z2 theme-options-button"
|
||||
(click)="toggleSidebarOpen('themeOptionsPanel')">
|
||||
<mat-icon>settings</mat-icon>
|
||||
</button>
|
||||
@@ -37,4 +35,4 @@
|
||||
<fuse-sidebar name="themeOptionsPanel" class="theme-options-sidebar" position="right" [invisibleOverlay]="true">
|
||||
<fuse-theme-options></fuse-theme-options>
|
||||
</fuse-sidebar>
|
||||
<!-- / THEME OPTIONS PANEL -->
|
||||
<!-- / THEME OPTIONS PANEL -->
|
||||
|
||||
@@ -23,17 +23,6 @@
|
||||
opacity: .90;
|
||||
z-index: 998;
|
||||
|
||||
&.right-side-panel {
|
||||
|
||||
@include media-breakpoint('gt-md') {
|
||||
right: 70px;
|
||||
}
|
||||
}
|
||||
|
||||
&.side-panel-hidden {
|
||||
right: 0 !important;
|
||||
}
|
||||
|
||||
mat-icon {
|
||||
animation: rotating 3s linear infinite;
|
||||
}
|
||||
|
||||
@@ -72,39 +72,6 @@ export class AppComponent implements OnInit, OnDestroy
|
||||
// Use a language
|
||||
this._translateService.use('en');
|
||||
|
||||
/**
|
||||
* ----------------------------------------------------------------------------------------------------
|
||||
* ngxTranslate Fix Start
|
||||
* ----------------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* If you are using a language other than the default one, i.e. Turkish in this case,
|
||||
* you may encounter an issue where some of the components are not actually being
|
||||
* translated when your app first initialized.
|
||||
*
|
||||
* This is related to ngxTranslate module and below there is a temporary fix while we
|
||||
* are moving the multi language implementation over to the Angular's core language
|
||||
* service.
|
||||
**/
|
||||
|
||||
// Set the default language to 'en' and then back to 'tr'.
|
||||
// '.use' cannot be used here as ngxTranslate won't switch to a language that's already
|
||||
// been selected and there is no way to force it, so we overcome the issue by switching
|
||||
// the default language back and forth.
|
||||
/**
|
||||
setTimeout(() => {
|
||||
this._translateService.setDefaultLang('en');
|
||||
this._translateService.setDefaultLang('tr');
|
||||
});
|
||||
*/
|
||||
|
||||
/**
|
||||
* ----------------------------------------------------------------------------------------------------
|
||||
* ngxTranslate Fix End
|
||||
* ----------------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
// Add is-mobile class to the body if the platform is mobile
|
||||
if ( this._platform.ANDROID || this._platform.IOS )
|
||||
{
|
||||
@@ -128,10 +95,8 @@ export class AppComponent implements OnInit, OnDestroy
|
||||
this._fuseConfigService.config
|
||||
.pipe(takeUntil(this._unsubscribeAll))
|
||||
.subscribe((config) => {
|
||||
|
||||
this.fuseConfig = config;
|
||||
|
||||
// Boxed
|
||||
if ( this.fuseConfig.layout.width === 'boxed' )
|
||||
{
|
||||
this.document.body.classList.add('boxed');
|
||||
@@ -140,19 +105,6 @@ export class AppComponent implements OnInit, OnDestroy
|
||||
{
|
||||
this.document.body.classList.remove('boxed');
|
||||
}
|
||||
|
||||
// Color theme - Use normal for loop for IE11 compatibility
|
||||
for ( let i = 0; i < this.document.body.classList.length; i++ )
|
||||
{
|
||||
const className = this.document.body.classList[i];
|
||||
|
||||
if ( className.startsWith('theme-') )
|
||||
{
|
||||
this.document.body.classList.remove(className);
|
||||
}
|
||||
}
|
||||
|
||||
this.document.body.classList.add(this.fuseConfig.colorTheme);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -4,9 +4,7 @@ import { HttpClientModule } from '@angular/common/http';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { RouterModule, Routes } from '@angular/router';
|
||||
import { MatMomentDateModule } from '@angular/material-moment-adapter';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { InMemoryWebApiModule } from 'angular-in-memory-web-api';
|
||||
import { MatButtonModule, MatIconModule } from '@angular/material';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import 'hammerjs';
|
||||
|
||||
@@ -16,35 +14,14 @@ import { FuseProgressBarModule, FuseSidebarModule, FuseThemeOptionsModule } from
|
||||
|
||||
import { fuseConfig } from 'app/fuse-config';
|
||||
|
||||
import { FakeDbService } from 'app/fake-db/fake-db.service';
|
||||
import { AppComponent } from 'app/app.component';
|
||||
import { AppStoreModule } from 'app/store/store.module';
|
||||
import { LayoutModule } from 'app/layout/layout.module';
|
||||
import { SampleModule } from 'app/main/sample/sample.module';
|
||||
|
||||
const appRoutes: Routes = [
|
||||
{
|
||||
path : 'apps',
|
||||
loadChildren: './main/apps/apps.module#AppsModule'
|
||||
},
|
||||
{
|
||||
path : 'pages',
|
||||
loadChildren: './main/pages/pages.module#PagesModule'
|
||||
},
|
||||
{
|
||||
path : 'ui',
|
||||
loadChildren: './main/ui/ui.module#UIModule'
|
||||
},
|
||||
{
|
||||
path : 'documentation',
|
||||
loadChildren: './main/documentation/documentation.module#DocumentationModule'
|
||||
},
|
||||
{
|
||||
path : 'angular-material-elements',
|
||||
loadChildren: './main/angular-material-elements/angular-material-elements.module#AngularMaterialElementsModule'
|
||||
},
|
||||
{
|
||||
path : '**',
|
||||
redirectTo: 'apps/dashboards/analytics'
|
||||
redirectTo: 'sample'
|
||||
}
|
||||
];
|
||||
|
||||
@@ -59,10 +36,6 @@ const appRoutes: Routes = [
|
||||
RouterModule.forRoot(appRoutes),
|
||||
|
||||
TranslateModule.forRoot(),
|
||||
InMemoryWebApiModule.forRoot(FakeDbService, {
|
||||
delay : 0,
|
||||
passThruUnknownUrl: true
|
||||
}),
|
||||
|
||||
// Material moment date module
|
||||
MatMomentDateModule,
|
||||
@@ -80,7 +53,7 @@ const appRoutes: Routes = [
|
||||
|
||||
// App modules
|
||||
LayoutModule,
|
||||
AppStoreModule
|
||||
SampleModule
|
||||
],
|
||||
bootstrap : [
|
||||
AppComponent
|
||||
|
||||
@@ -1,318 +0,0 @@
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Custom color maps for Fuse
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
$fuse-white: (
|
||||
500: white,
|
||||
contrast: (
|
||||
500: $dark-primary-text
|
||||
)
|
||||
);
|
||||
|
||||
$fuse-black: (
|
||||
500: black,
|
||||
contrast: (
|
||||
500: $light-primary-text,
|
||||
)
|
||||
);
|
||||
|
||||
$fuse-navy: (
|
||||
50: #ECECEE,
|
||||
100: #C5C6CB,
|
||||
200: #9EA1A9,
|
||||
300: #7D818C,
|
||||
400: #5C616F,
|
||||
500: #3C4252,
|
||||
600: #353A48,
|
||||
700: #2D323E,
|
||||
800: #262933,
|
||||
900: #1E2129,
|
||||
A100: #C5C6CB,
|
||||
A200: #9EA1A9,
|
||||
A400: #5C616F,
|
||||
A700: #2D323E,
|
||||
contrast: (
|
||||
50: $dark-primary-text,
|
||||
100: $dark-primary-text,
|
||||
200: $dark-primary-text,
|
||||
300: $light-primary-text,
|
||||
400: $light-primary-text,
|
||||
500: $light-primary-text,
|
||||
600: $light-primary-text,
|
||||
700: $light-primary-text,
|
||||
800: $light-primary-text,
|
||||
900: $light-primary-text,
|
||||
A100: $dark-primary-text,
|
||||
A200: $light-primary-text,
|
||||
A400: $light-primary-text,
|
||||
A700: $light-primary-text,
|
||||
)
|
||||
);
|
||||
|
||||
// Generate Fuse color classes for custom palettes
|
||||
$custom_palettes: (
|
||||
fuse-white: $fuse-white,
|
||||
fuse-black: $fuse-black,
|
||||
fuse-navy: $fuse-navy
|
||||
);
|
||||
|
||||
@include fuse-color-classes($custom_palettes);
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Typography
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
|
||||
// Angular Material typography
|
||||
$typography: mat-typography-config(
|
||||
$font-family: 'Muli, Helvetica Neue, Arial, sans-serif',
|
||||
$title: mat-typography-level(20px, 32px, 600),
|
||||
$body-2: mat-typography-level(14px, 24px, 600),
|
||||
$button: mat-typography-level(14px, 14px, 600),
|
||||
$input: mat-typography-level(16px, 1.125, 400) // line-height must be unitless !!!
|
||||
);
|
||||
|
||||
// Setup the typography
|
||||
@include angular-material-typography($typography);
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Component theming
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
|
||||
// Import app and page component themes here to enable theming for them
|
||||
@import "src/app/layout/components/chat-panel/chat-panel.theme";
|
||||
@import "src/app/layout/components/toolbar/toolbar.theme";
|
||||
|
||||
@import "src/app/main/apps/academy/academy.theme";
|
||||
@import "src/app/main/apps/calendar/calendar.theme";
|
||||
@import "src/app/main/apps/chat/chat.theme";
|
||||
@import "src/app/main/apps/contacts/contacts.theme";
|
||||
@import "src/app/main/apps/dashboards/project/project.theme";
|
||||
@import "src/app/main/apps/e-commerce/orders/orders.theme";
|
||||
@import "src/app/main/apps/e-commerce/products/products.theme";
|
||||
@import "src/app/main/apps/file-manager/file-manager.theme";
|
||||
@import "src/app/main/apps/mail/mail.theme";
|
||||
@import "src/app/main/apps/mail-ngrx/mail.theme";
|
||||
@import "src/app/main/apps/scrumboard/scrumboard.theme";
|
||||
@import "src/app/main/apps/todo/todo.theme";
|
||||
|
||||
@import "src/app/main/pages/authentication/login/login.theme";
|
||||
@import "src/app/main/pages/authentication/login-2/login-2.theme";
|
||||
@import "src/app/main/pages/authentication/register/register.theme";
|
||||
@import "src/app/main/pages/authentication/register-2/register-2.theme";
|
||||
@import "src/app/main/pages/authentication/reset-password/reset-password.theme";
|
||||
@import "src/app/main/pages/authentication/reset-password-2/reset-password-2.theme";
|
||||
@import "src/app/main/pages/authentication/forgot-password/forgot-password.theme";
|
||||
@import "src/app/main/pages/authentication/forgot-password-2/forgot-password-2.theme";
|
||||
@import "src/app/main/pages/authentication/lock/lock.theme";
|
||||
@import "src/app/main/pages/authentication/mail-confirm/mail-confirm.theme";
|
||||
@import "src/app/main/pages/coming-soon/coming-soon.theme";
|
||||
@import "src/app/main/pages/errors/404/error-404.theme";
|
||||
@import "src/app/main/pages/errors/500/error-500.theme";
|
||||
@import "src/app/main/pages/maintenance/maintenance.theme";
|
||||
@import "src/app/main/pages/pricing/style-1/style-1.theme";
|
||||
@import "src/app/main/pages/pricing/style-2/style-2.theme";
|
||||
@import "src/app/main/pages/pricing/style-3/style-3.theme";
|
||||
@import "src/app/main/pages/profile/tabs/about/about.theme";
|
||||
@import "src/app/main/pages/profile/tabs/photos-videos/photos-videos.theme";
|
||||
@import "src/app/main/pages/profile/tabs/timeline/timeline.theme";
|
||||
@import "src/app/main/pages/search/classic/search-classic.theme";
|
||||
@import "src/app/main/pages/search/modern/search-modern.theme";
|
||||
@import "src/app/main/pages/faq/faq.theme";
|
||||
@import "src/app/main/pages/knowledge-base/knowledge-base.theme";
|
||||
|
||||
@import "src/app/main/ui/cards/cards.theme";
|
||||
|
||||
@import "src/app/main/angular-material-elements/example-viewer/example-viewer.theme";
|
||||
|
||||
// Define a mixin for easier access
|
||||
@mixin components-theme($theme) {
|
||||
|
||||
// Layout components
|
||||
@include chat-panel-theme($theme);
|
||||
@include toolbar-theme($theme);
|
||||
|
||||
// Apps
|
||||
@include academy-theme($theme);
|
||||
@include calendar-theme($theme);
|
||||
@include chat-theme($theme);
|
||||
@include contacts-theme($theme);
|
||||
@include dashboards-project-theme($theme);
|
||||
@include e-commerce-orders-theme($theme);
|
||||
@include e-commerce-products-theme($theme);
|
||||
@include file-manager-theme($theme);
|
||||
@include mail-theme($theme);
|
||||
@include mail-ngrx-theme($theme);
|
||||
@include scrumboard-theme($theme);
|
||||
@include todo-theme($theme);
|
||||
|
||||
// Pages
|
||||
@include login-theme($theme);
|
||||
@include login-2-theme($theme);
|
||||
@include register-theme($theme);
|
||||
@include register-2-theme($theme);
|
||||
@include reset-password-theme($theme);
|
||||
@include reset-password-2-theme($theme);
|
||||
@include forgot-password-theme($theme);
|
||||
@include forgot-password-2-theme($theme);
|
||||
@include lock-theme($theme);
|
||||
@include mail-confirm-theme($theme);
|
||||
@include coming-soon-theme($theme);
|
||||
@include error-404-theme($theme);
|
||||
@include error-500-theme($theme);
|
||||
@include maintenance-theme($theme);
|
||||
@include pricing-style-1-theme($theme);
|
||||
@include pricing-style-2-theme($theme);
|
||||
@include pricing-style-3-theme($theme);
|
||||
@include profile-about-theme($theme);
|
||||
@include profile-photos-videos-theme($theme);
|
||||
@include profile-timeline-theme($theme);
|
||||
@include search-classic-theme($theme);
|
||||
@include search-modern-theme($theme);
|
||||
@include faq-theme($theme);
|
||||
@include knowledge-base-theme($theme);
|
||||
|
||||
// UI
|
||||
@include ui-cards-theme($theme);
|
||||
|
||||
// Example Viewer
|
||||
@include example-viewer-theme($theme);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Define the default theme
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
|
||||
// Define the primary, accent and warn palettes
|
||||
$default-primary-palette: mat-palette($fuse-navy);
|
||||
$default-accent-palette: mat-palette($mat-light-blue, 600, 400, 700);
|
||||
$default-warn-palette: mat-palette($mat-red);
|
||||
|
||||
// Create the Material theme object
|
||||
$theme: mat-light-theme($default-primary-palette, $default-accent-palette, $default-warn-palette);
|
||||
|
||||
// Add ".theme-default" class to the body to activate this theme.
|
||||
// Class name must start with "theme-" !!!
|
||||
body.theme-default {
|
||||
|
||||
// Create an Angular Material theme from the $theme map
|
||||
@include angular-material-theme($theme);
|
||||
|
||||
// Apply the theme to the Fuse Core
|
||||
@include fuse-core-theme($theme);
|
||||
|
||||
// Apply the theme to the user components
|
||||
@include components-theme($theme);
|
||||
|
||||
// Generate Fuse color classes for primary, accent and warn colors
|
||||
$palettes: (
|
||||
primary: $default-primary-palette,
|
||||
accent: $default-accent-palette,
|
||||
warn: $default-warn-palette
|
||||
);
|
||||
|
||||
@include fuse-color-classes($palettes);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Define a yellow light theme
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
|
||||
// Define the primary, accent and warn palettes
|
||||
$yellow-light-theme-primary-palette: mat-palette($fuse-navy, 600, 400, 700);
|
||||
$yellow-light-theme-accent-palette: mat-palette($mat-yellow, 600, 400, 700);
|
||||
$yellow-light-theme-warn-palette: mat-palette($mat-red);
|
||||
|
||||
// Create the Material theme object
|
||||
$yellow-light-theme: mat-light-theme($yellow-light-theme-primary-palette, $yellow-light-theme-accent-palette, $yellow-light-theme-warn-palette);
|
||||
|
||||
// Add ".theme-yellow-light" class to the body to activate this theme.
|
||||
// Class name must start with "theme-" !!!
|
||||
body.theme-yellow-light {
|
||||
|
||||
// Generate the Angular Material theme
|
||||
@include angular-material-theme($yellow-light-theme);
|
||||
|
||||
// Apply the theme to the Fuse Core
|
||||
@include fuse-core-theme($yellow-light-theme);
|
||||
|
||||
// Apply the theme to the user components
|
||||
@include components-theme($yellow-light-theme);
|
||||
|
||||
// Generate Fuse color classes for primary, accent and warn colors
|
||||
$palettes: (
|
||||
primary: $yellow-light-theme-primary-palette,
|
||||
accent: $yellow-light-theme-accent-palette,
|
||||
warn: $yellow-light-theme-warn-palette
|
||||
);
|
||||
|
||||
@include fuse-color-classes($palettes);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Define a blue-gray dark theme
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
|
||||
// Define the primary, accent and warn palettes
|
||||
$blue-gray-dark-theme-primary-palette: mat-palette($mat-blue);
|
||||
$blue-gray-dark-theme-accent-palette: mat-palette($mat-blue-gray);
|
||||
$blue-gray-dark-theme-warn-palette: mat-palette($mat-red);
|
||||
|
||||
// Create the Material theme object
|
||||
$blue-gray-dark-theme: mat-dark-theme($blue-gray-dark-theme-primary-palette, $blue-gray-dark-theme-accent-palette, $blue-gray-dark-theme-warn-palette);
|
||||
|
||||
// Add ".theme-blue-gray-dark" class to the body to activate this theme.
|
||||
// Class name must start with "theme-" !!!
|
||||
body.theme-blue-gray-dark {
|
||||
|
||||
// Generate the Angular Material theme
|
||||
@include angular-material-theme($blue-gray-dark-theme);
|
||||
|
||||
// Apply the theme to the Fuse Core
|
||||
@include fuse-core-theme($blue-gray-dark-theme);
|
||||
|
||||
// Apply the theme to the user components
|
||||
@include components-theme($blue-gray-dark-theme);
|
||||
|
||||
// Generate Fuse color classes for primary, accent and warn colors
|
||||
$palettes: (
|
||||
primary: $blue-gray-dark-theme-primary-palette,
|
||||
accent: $blue-gray-dark-theme-accent-palette,
|
||||
warn: $blue-gray-dark-theme-warn-palette
|
||||
);
|
||||
|
||||
@include fuse-color-classes($palettes);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
// @ Define a pink dark theme
|
||||
// -----------------------------------------------------------------------------------------------------
|
||||
|
||||
// Define the primary, accent and warn palettes
|
||||
$pink-dark-theme-primary-palette: mat-palette($mat-pink);
|
||||
$pink-dark-theme-accent-palette: mat-palette($mat-pink);
|
||||
$pink-dark-theme-warn-palette: mat-palette($mat-red);
|
||||
|
||||
// Create the Material theme object
|
||||
$pink-dark-theme: mat-dark-theme($pink-dark-theme-primary-palette, $pink-dark-theme-accent-palette, $pink-dark-theme-warn-palette);
|
||||
|
||||
// Add ".theme-pink-dark" class to the body to activate this theme.
|
||||
// Class name must start with "theme-" !!!
|
||||
body.theme-pink-dark {
|
||||
|
||||
// Generate the Angular Material theme
|
||||
@include angular-material-theme($pink-dark-theme);
|
||||
|
||||
// Apply the theme to the Fuse Core
|
||||
@include fuse-core-theme($pink-dark-theme);
|
||||
|
||||
// Apply the theme to the user components
|
||||
@include components-theme($pink-dark-theme);
|
||||
|
||||
// Generate Fuse color classes for primary, accent and warn colors
|
||||
$palettes: (
|
||||
primary: $pink-dark-theme-primary-palette,
|
||||
accent: $pink-dark-theme-accent-palette,
|
||||
warn: $pink-dark-theme-warn-palette
|
||||
);
|
||||
|
||||
@include fuse-color-classes($palettes);
|
||||
}
|
||||
@@ -1,773 +0,0 @@
|
||||
export class AcademyFakeDb
|
||||
{
|
||||
public static courses = [
|
||||
{
|
||||
'id' : '15459251a6d6b397565',
|
||||
'title' : 'Basics of Angular',
|
||||
'slug' : 'basics-of-angular',
|
||||
'category': 'web',
|
||||
'length' : 30,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '154588a0864d2881124',
|
||||
'title' : 'Basics of TypeScript',
|
||||
'slug' : 'basics-of-typeScript',
|
||||
'category': 'web',
|
||||
'length' : 60,
|
||||
'updated' : 'Nov 01, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '15453ba60d3baa5daaf',
|
||||
'title' : 'Android N: Quick Settings',
|
||||
'slug' : 'android-n-quick-settings',
|
||||
'category': 'android',
|
||||
'length' : 120,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '15453a06c08fb021776',
|
||||
'title' : 'Keep Sensitive Data Safe and Private',
|
||||
'slug' : 'keep-sensitive-data-safe-and-private',
|
||||
'category': 'android',
|
||||
'length' : 45,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '15427f4c1b7f3953234',
|
||||
'title' : 'Building a gRPC Service with Java',
|
||||
'slug' : 'building-a-grpc-service-with-java',
|
||||
'category': 'cloud',
|
||||
'length' : 30,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '1542d75d929a603125',
|
||||
'title' : 'Build a PWA Using Workbox',
|
||||
'slug' : 'build-a-pwa-using-workbox',
|
||||
'category': 'web',
|
||||
'length' : 120,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '1543ee3a5b43e0f9f45',
|
||||
'title' : 'Build an App for the Google Assistant with Firebase and Dialogflow',
|
||||
'slug' : 'build-an-app-for-the-google-assistant-with-firebase-and-dialogflow',
|
||||
'category': 'firebase',
|
||||
'length' : 30,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '1543cc4515df3146112',
|
||||
'title' : 'Cloud Functions for Firebase',
|
||||
'slug' : 'cloud-functions-for-firebase',
|
||||
'category': 'firebase',
|
||||
'length' : 45,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '154398a4770d7aaf9a2',
|
||||
'title' : 'Manage Your Pivotal Cloud Foundry App\'s Using Apigee Edge',
|
||||
'slug' : 'manage-your-pivotal-cloud-foundry-apps-using-apigee-Edge',
|
||||
'category': 'cloud',
|
||||
'length' : 90,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '15438351f87dcd68567',
|
||||
'title' : 'Building Beautiful UIs with Flutter',
|
||||
'your' : 'building-beautiful-uis-with-flutter',
|
||||
'category': 'web',
|
||||
'length' : 90,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '1544e43dcdae6ebf876',
|
||||
'title' : 'Cloud Firestore',
|
||||
'slug' : 'cloud-firestore',
|
||||
'category': 'firebase',
|
||||
'length' : 90,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '1541ca7af66da284177',
|
||||
'title' : 'Customize Network Topology with Subnetworks',
|
||||
'slug' : 'customize-network-topology-with-subnetworks',
|
||||
'category': 'web',
|
||||
'length' : 45,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '154297167e781781745',
|
||||
'title' : 'Looking at Campaign Finance with BigQuery',
|
||||
'slug' : 'looking-at-campaign-finance-with-bigquery',
|
||||
'category': 'cloud',
|
||||
'length' : 60,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '154537435d5b32bf11a',
|
||||
'title' : 'Firebase Android',
|
||||
'slug' : 'firebase-android',
|
||||
'category': 'android',
|
||||
'length' : 45,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '154204e45a59b168453',
|
||||
'title' : 'Simulating a Thread Network Using OpenThread',
|
||||
'slug' : 'simulating-a-thread-network-using-openthread',
|
||||
'category': 'web',
|
||||
'length' : 45,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '1541dd1e05dfc439216',
|
||||
'title' : 'Your First Progressive Web App',
|
||||
'slug' : 'your-first-progressive-web-app',
|
||||
'category': 'web',
|
||||
'length' : 30,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '1532dfc67e704e48515',
|
||||
'title' : 'Launch Cloud Datalab',
|
||||
'slug' : 'launch-cloud-datalab',
|
||||
'category': 'cloud',
|
||||
'length' : 60,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
},
|
||||
{
|
||||
'id' : '1542e43dfaae6ebf226',
|
||||
'title' : 'Personalize Your iOS App with Firebase User Management',
|
||||
'slug' : 'personalize-your-ios-app-with-firebase-user-management',
|
||||
'category': 'firebase',
|
||||
'length' : 90,
|
||||
'updated' : 'Jun 28, 2017'
|
||||
}
|
||||
];
|
||||
|
||||
public static categories = [
|
||||
{
|
||||
'id' : 0,
|
||||
'value': 'web',
|
||||
'label': 'Web'
|
||||
},
|
||||
{
|
||||
'id' : 1,
|
||||
'value': 'firebase',
|
||||
'label': 'Firebase'
|
||||
},
|
||||
{
|
||||
'id' : 2,
|
||||
'value': 'cloud',
|
||||
'label': 'Cloud'
|
||||
},
|
||||
{
|
||||
'id' : 3,
|
||||
'value': 'android',
|
||||
'label': 'Android'
|
||||
}
|
||||
];
|
||||
|
||||
private static demoSteps = [
|
||||
{
|
||||
'title' : 'Introduction',
|
||||
'content': '<h1>Step 1 - Introduction</h1>' +
|
||||
'<br>' +
|
||||
'This is an example step of the course. You can put anything in here from example codes to videos.' +
|
||||
'<br><br>' +
|
||||
'To install the CLI you need to have installed <b>npm</b> which typically comes with <b>NodeJS</b>.' +
|
||||
'To install or upgrade the CLI run the following <b>npm</b> command:' +
|
||||
'<br><br>' +
|
||||
'<code>npm -g install @angular/cli</code>' +
|
||||
'<br><br>' +
|
||||
'To verify that the CLI has been installed correctly, open a console and run:' +
|
||||
'<br><br>' +
|
||||
'<code>ng version</code>' +
|
||||
'<br><br>' +
|
||||
'<h2>Install dependencies</h2>' +
|
||||
'<br>' +
|
||||
'To moderate the images we\'ll need a few Node.js packages:' +
|
||||
'<br><br>' +
|
||||
'<ul>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Vision Client Library for Node.js: @google-cloud/vision to run the image through the Cloud Vision API to detect inappropriate images.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Storage Client Library for Node.js: @google-cloud/storage to download and upload the images from Cloud Storage.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'A Node.js library allowing us to run processes: child-process-promise to run ImageMagick since the ImageMagick command-line tool comes pre-installed on all Functions instances.' +
|
||||
'</li>' +
|
||||
'</ul>' +
|
||||
'<br>' +
|
||||
'To install these three packages into your Cloud Functions app, run the following npm install --save command. Make sure that you do this from the functions directory.' +
|
||||
'<br><br>' +
|
||||
'<code>npm install --save @google-cloud/vision @google-cloud/storage child-process-promise</code>' +
|
||||
'<br><br>' +
|
||||
'This will install the three packages locally and add them as declared dependencies in your package.js file.'
|
||||
},
|
||||
{
|
||||
'title' : 'Get the sample code',
|
||||
'content': '<h1>Step 2 - Get the sample code</h1>' +
|
||||
'<br>' +
|
||||
'This is an example step of the course. You can put anything in here from example codes to videos.' +
|
||||
'<br><br>' +
|
||||
'To install the CLI you need to have installed <b>npm</b> which typically comes with <b>NodeJS</b>.' +
|
||||
'To install or upgrade the CLI run the following <b>npm</b> command:' +
|
||||
'<br><br>' +
|
||||
'<code>npm -g install @angular/cli</code>' +
|
||||
'<br><br>' +
|
||||
'To verify that the CLI has been installed correctly, open a console and run:' +
|
||||
'<br><br>' +
|
||||
'<code>ng version</code>' +
|
||||
'<br><br>' +
|
||||
'<h2>Install dependencies</h2>' +
|
||||
'<br>' +
|
||||
'To moderate the images we\'ll need a few Node.js packages:' +
|
||||
'<br><br>' +
|
||||
'<ul>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Vision Client Library for Node.js: @google-cloud/vision to run the image through the Cloud Vision API to detect inappropriate images.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Storage Client Library for Node.js: @google-cloud/storage to download and upload the images from Cloud Storage.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'A Node.js library allowing us to run processes: child-process-promise to run ImageMagick since the ImageMagick command-line tool comes pre-installed on all Functions instances.' +
|
||||
'</li>' +
|
||||
'</ul>' +
|
||||
'<br>' +
|
||||
'To install these three packages into your Cloud Functions app, run the following npm install --save command. Make sure that you do this from the functions directory.' +
|
||||
'<br><br>' +
|
||||
'<code>npm install --save @google-cloud/vision @google-cloud/storage child-process-promise</code>' +
|
||||
'<br><br>' +
|
||||
'This will install the three packages locally and add them as declared dependencies in your package.js file.'
|
||||
},
|
||||
{
|
||||
'title' : 'Create a Firebase project and Set up your app',
|
||||
'content': '<h1>Step 3 - Create a Firebase project and Set up your app</h1>' +
|
||||
'<br>' +
|
||||
'This is an example step of the course. You can put anything in here from example codes to videos.' +
|
||||
'<br><br>' +
|
||||
'To install the CLI you need to have installed <b>npm</b> which typically comes with <b>NodeJS</b>.' +
|
||||
'To install or upgrade the CLI run the following <b>npm</b> command:' +
|
||||
'<br><br>' +
|
||||
'<code>npm -g install @angular/cli</code>' +
|
||||
'<br><br>' +
|
||||
'To verify that the CLI has been installed correctly, open a console and run:' +
|
||||
'<br><br>' +
|
||||
'<code>ng version</code>' +
|
||||
'<br><br>' +
|
||||
'<h2>Install dependencies</h2>' +
|
||||
'<br>' +
|
||||
'To moderate the images we\'ll need a few Node.js packages:' +
|
||||
'<br><br>' +
|
||||
'<ul>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Vision Client Library for Node.js: @google-cloud/vision to run the image through the Cloud Vision API to detect inappropriate images.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Storage Client Library for Node.js: @google-cloud/storage to download and upload the images from Cloud Storage.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'A Node.js library allowing us to run processes: child-process-promise to run ImageMagick since the ImageMagick command-line tool comes pre-installed on all Functions instances.' +
|
||||
'</li>' +
|
||||
'</ul>' +
|
||||
'<br>' +
|
||||
'To install these three packages into your Cloud Functions app, run the following npm install --save command. Make sure that you do this from the functions directory.' +
|
||||
'<br><br>' +
|
||||
'<code>npm install --save @google-cloud/vision @google-cloud/storage child-process-promise</code>' +
|
||||
'<br><br>' +
|
||||
'This will install the three packages locally and add them as declared dependencies in your package.js file.'
|
||||
},
|
||||
{
|
||||
'title' : 'Install the Firebase Command Line Interface',
|
||||
'content': '<h1>Step 4 - Install the Firebase Command Line Interface</h1>' +
|
||||
'<br>' +
|
||||
'This is an example step of the course. You can put anything in here from example codes to videos.' +
|
||||
'<br><br>' +
|
||||
'To install the CLI you need to have installed <b>npm</b> which typically comes with <b>NodeJS</b>.' +
|
||||
'To install or upgrade the CLI run the following <b>npm</b> command:' +
|
||||
'<br><br>' +
|
||||
'<code>npm -g install @angular/cli</code>' +
|
||||
'<br><br>' +
|
||||
'To verify that the CLI has been installed correctly, open a console and run:' +
|
||||
'<br><br>' +
|
||||
'<code>ng version</code>' +
|
||||
'<br><br>' +
|
||||
'<h2>Install dependencies</h2>' +
|
||||
'<br>' +
|
||||
'To moderate the images we\'ll need a few Node.js packages:' +
|
||||
'<br><br>' +
|
||||
'<ul>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Vision Client Library for Node.js: @google-cloud/vision to run the image through the Cloud Vision API to detect inappropriate images.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Storage Client Library for Node.js: @google-cloud/storage to download and upload the images from Cloud Storage.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'A Node.js library allowing us to run processes: child-process-promise to run ImageMagick since the ImageMagick command-line tool comes pre-installed on all Functions instances.' +
|
||||
'</li>' +
|
||||
'</ul>' +
|
||||
'<br>' +
|
||||
'To install these three packages into your Cloud Functions app, run the following npm install --save command. Make sure that you do this from the functions directory.' +
|
||||
'<br><br>' +
|
||||
'<code>npm install --save @google-cloud/vision @google-cloud/storage child-process-promise</code>' +
|
||||
'<br><br>' +
|
||||
'This will install the three packages locally and add them as declared dependencies in your package.js file.'
|
||||
},
|
||||
{
|
||||
'title' : 'Deploy and run the web app',
|
||||
'content': '<h1>Step 5 - Deploy and run the web app</h1>' +
|
||||
'<br>' +
|
||||
'This is an example step of the course. You can put anything in here from example codes to videos.' +
|
||||
'<br><br>' +
|
||||
'To install the CLI you need to have installed <b>npm</b> which typically comes with <b>NodeJS</b>.' +
|
||||
'To install or upgrade the CLI run the following <b>npm</b> command:' +
|
||||
'<br><br>' +
|
||||
'<code>npm -g install @angular/cli</code>' +
|
||||
'<br><br>' +
|
||||
'To verify that the CLI has been installed correctly, open a console and run:' +
|
||||
'<br><br>' +
|
||||
'<code>ng version</code>' +
|
||||
'<br><br>' +
|
||||
'<h2>Install dependencies</h2>' +
|
||||
'<br>' +
|
||||
'To moderate the images we\'ll need a few Node.js packages:' +
|
||||
'<br><br>' +
|
||||
'<ul>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Vision Client Library for Node.js: @google-cloud/vision to run the image through the Cloud Vision API to detect inappropriate images.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Storage Client Library for Node.js: @google-cloud/storage to download and upload the images from Cloud Storage.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'A Node.js library allowing us to run processes: child-process-promise to run ImageMagick since the ImageMagick command-line tool comes pre-installed on all Functions instances.' +
|
||||
'</li>' +
|
||||
'</ul>' +
|
||||
'<br>' +
|
||||
'To install these three packages into your Cloud Functions app, run the following npm install --save command. Make sure that you do this from the functions directory.' +
|
||||
'<br><br>' +
|
||||
'<code>npm install --save @google-cloud/vision @google-cloud/storage child-process-promise</code>' +
|
||||
'<br><br>' +
|
||||
'This will install the three packages locally and add them as declared dependencies in your package.js file.'
|
||||
},
|
||||
{
|
||||
'title' : 'The Functions Directory',
|
||||
'content': '<h1>Step 6 - The Functions Directory</h1>' +
|
||||
'<br>' +
|
||||
'This is an example step of the course. You can put anything in here from example codes to videos.' +
|
||||
'<br><br>' +
|
||||
'To install the CLI you need to have installed <b>npm</b> which typically comes with <b>NodeJS</b>.' +
|
||||
'To install or upgrade the CLI run the following <b>npm</b> command:' +
|
||||
'<br><br>' +
|
||||
'<code>npm -g install @angular/cli</code>' +
|
||||
'<br><br>' +
|
||||
'To verify that the CLI has been installed correctly, open a console and run:' +
|
||||
'<br><br>' +
|
||||
'<code>ng version</code>' +
|
||||
'<br><br>' +
|
||||
'<h2>Install dependencies</h2>' +
|
||||
'<br>' +
|
||||
'To moderate the images we\'ll need a few Node.js packages:' +
|
||||
'<br><br>' +
|
||||
'<ul>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Vision Client Library for Node.js: @google-cloud/vision to run the image through the Cloud Vision API to detect inappropriate images.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Storage Client Library for Node.js: @google-cloud/storage to download and upload the images from Cloud Storage.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'A Node.js library allowing us to run processes: child-process-promise to run ImageMagick since the ImageMagick command-line tool comes pre-installed on all Functions instances.' +
|
||||
'</li>' +
|
||||
'</ul>' +
|
||||
'<br>' +
|
||||
'To install these three packages into your Cloud Functions app, run the following npm install --save command. Make sure that you do this from the functions directory.' +
|
||||
'<br><br>' +
|
||||
'<code>npm install --save @google-cloud/vision @google-cloud/storage child-process-promise</code>' +
|
||||
'<br><br>' +
|
||||
'This will install the three packages locally and add them as declared dependencies in your package.js file.'
|
||||
},
|
||||
{
|
||||
'title' : 'Import the Cloud Functions and Firebase Admin modules',
|
||||
'content': '<h1>Step 7 - Import the Cloud Functions and Firebase Admin modules</h1>' +
|
||||
'<br>' +
|
||||
'This is an example step of the course. You can put anything in here from example codes to videos.' +
|
||||
'<br><br>' +
|
||||
'To install the CLI you need to have installed <b>npm</b> which typically comes with <b>NodeJS</b>.' +
|
||||
'To install or upgrade the CLI run the following <b>npm</b> command:' +
|
||||
'<br><br>' +
|
||||
'<code>npm -g install @angular/cli</code>' +
|
||||
'<br><br>' +
|
||||
'To verify that the CLI has been installed correctly, open a console and run:' +
|
||||
'<br><br>' +
|
||||
'<code>ng version</code>' +
|
||||
'<br><br>' +
|
||||
'<h2>Install dependencies</h2>' +
|
||||
'<br>' +
|
||||
'To moderate the images we\'ll need a few Node.js packages:' +
|
||||
'<br><br>' +
|
||||
'<ul>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Vision Client Library for Node.js: @google-cloud/vision to run the image through the Cloud Vision API to detect inappropriate images.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Storage Client Library for Node.js: @google-cloud/storage to download and upload the images from Cloud Storage.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'A Node.js library allowing us to run processes: child-process-promise to run ImageMagick since the ImageMagick command-line tool comes pre-installed on all Functions instances.' +
|
||||
'</li>' +
|
||||
'</ul>' +
|
||||
'<br>' +
|
||||
'To install these three packages into your Cloud Functions app, run the following npm install --save command. Make sure that you do this from the functions directory.' +
|
||||
'<br><br>' +
|
||||
'<code>npm install --save @google-cloud/vision @google-cloud/storage child-process-promise</code>' +
|
||||
'<br><br>' +
|
||||
'This will install the three packages locally and add them as declared dependencies in your package.js file.'
|
||||
},
|
||||
{
|
||||
'title' : 'Welcome New Users',
|
||||
'content': '<h1>Step 8 - Welcome New Users</h1>' +
|
||||
'<br>' +
|
||||
'This is an example step of the course. You can put anything in here from example codes to videos.' +
|
||||
'<br><br>' +
|
||||
'To install the CLI you need to have installed <b>npm</b> which typically comes with <b>NodeJS</b>.' +
|
||||
'To install or upgrade the CLI run the following <b>npm</b> command:' +
|
||||
'<br><br>' +
|
||||
'<code>npm -g install @angular/cli</code>' +
|
||||
'<br><br>' +
|
||||
'To verify that the CLI has been installed correctly, open a console and run:' +
|
||||
'<br><br>' +
|
||||
'<code>ng version</code>' +
|
||||
'<br><br>' +
|
||||
'<h2>Install dependencies</h2>' +
|
||||
'<br>' +
|
||||
'To moderate the images we\'ll need a few Node.js packages:' +
|
||||
'<br><br>' +
|
||||
'<ul>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Vision Client Library for Node.js: @google-cloud/vision to run the image through the Cloud Vision API to detect inappropriate images.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Storage Client Library for Node.js: @google-cloud/storage to download and upload the images from Cloud Storage.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'A Node.js library allowing us to run processes: child-process-promise to run ImageMagick since the ImageMagick command-line tool comes pre-installed on all Functions instances.' +
|
||||
'</li>' +
|
||||
'</ul>' +
|
||||
'<br>' +
|
||||
'To install these three packages into your Cloud Functions app, run the following npm install --save command. Make sure that you do this from the functions directory.' +
|
||||
'<br><br>' +
|
||||
'<code>npm install --save @google-cloud/vision @google-cloud/storage child-process-promise</code>' +
|
||||
'<br><br>' +
|
||||
'This will install the three packages locally and add them as declared dependencies in your package.js file.'
|
||||
},
|
||||
{
|
||||
'title' : 'Images moderation',
|
||||
'content': '<h1>Step 9 - Images moderation</h1>' +
|
||||
'<br>' +
|
||||
'This is an example step of the course. You can put anything in here from example codes to videos.' +
|
||||
'<br><br>' +
|
||||
'To install the CLI you need to have installed <b>npm</b> which typically comes with <b>NodeJS</b>.' +
|
||||
'To install or upgrade the CLI run the following <b>npm</b> command:' +
|
||||
'<br><br>' +
|
||||
'<code>npm -g install @angular/cli</code>' +
|
||||
'<br><br>' +
|
||||
'To verify that the CLI has been installed correctly, open a console and run:' +
|
||||
'<br><br>' +
|
||||
'<code>ng version</code>' +
|
||||
'<br><br>' +
|
||||
'<h2>Install dependencies</h2>' +
|
||||
'<br>' +
|
||||
'To moderate the images we\'ll need a few Node.js packages:' +
|
||||
'<br><br>' +
|
||||
'<ul>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Vision Client Library for Node.js: @google-cloud/vision to run the image through the Cloud Vision API to detect inappropriate images.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Storage Client Library for Node.js: @google-cloud/storage to download and upload the images from Cloud Storage.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'A Node.js library allowing us to run processes: child-process-promise to run ImageMagick since the ImageMagick command-line tool comes pre-installed on all Functions instances.' +
|
||||
'</li>' +
|
||||
'</ul>' +
|
||||
'<br>' +
|
||||
'To install these three packages into your Cloud Functions app, run the following npm install --save command. Make sure that you do this from the functions directory.' +
|
||||
'<br><br>' +
|
||||
'<code>npm install --save @google-cloud/vision @google-cloud/storage child-process-promise</code>' +
|
||||
'<br><br>' +
|
||||
'This will install the three packages locally and add them as declared dependencies in your package.js file.'
|
||||
},
|
||||
{
|
||||
'title' : 'New Message Notifications',
|
||||
'content': '<h1>Step 10 - New Message Notifications</h1>' +
|
||||
'<br>' +
|
||||
'This is an example step of the course. You can put anything in here from example codes to videos.' +
|
||||
'<br><br>' +
|
||||
'To install the CLI you need to have installed <b>npm</b> which typically comes with <b>NodeJS</b>.' +
|
||||
'To install or upgrade the CLI run the following <b>npm</b> command:' +
|
||||
'<br><br>' +
|
||||
'<code>npm -g install @angular/cli</code>' +
|
||||
'<br><br>' +
|
||||
'To verify that the CLI has been installed correctly, open a console and run:' +
|
||||
'<br><br>' +
|
||||
'<code>ng version</code>' +
|
||||
'<br><br>' +
|
||||
'<h2>Install dependencies</h2>' +
|
||||
'<br>' +
|
||||
'To moderate the images we\'ll need a few Node.js packages:' +
|
||||
'<br><br>' +
|
||||
'<ul>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Vision Client Library for Node.js: @google-cloud/vision to run the image through the Cloud Vision API to detect inappropriate images.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'The Google Cloud Storage Client Library for Node.js: @google-cloud/storage to download and upload the images from Cloud Storage.' +
|
||||
'</li>' +
|
||||
'<br>' +
|
||||
'<li>' +
|
||||
'A Node.js library allowing us to run processes: child-process-promise to run ImageMagick since the ImageMagick command-line tool comes pre-installed on all Functions instances.' +
|
||||
'</li>' +
|
||||
'</ul>' +
|
||||
'<br>' +
|
||||
'To install these three packages into your Cloud Functions app, run the following npm install --save command. Make sure that you do this from the functions directory.' +
|
||||
'<br><br>' +
|
||||
'<code>npm install --save @google-cloud/vision @google-cloud/storage child-process-promise</code>' +
|
||||
'<br><br>' +
|
||||
'This will install the three packages locally and add them as declared dependencies in your package.js file.'
|
||||
},
|
||||
{
|
||||
'title' : 'Congratulations!',
|
||||
'content': '<h1>Step 11 - Congratulations!</h1>' +
|
||||
'<br>' +
|
||||
'You\'ve built a full-fidelity, offline-capable progressive web app by leveraging the power of reusable Web Components and Firebase. Why bother with a native app when you know how to do all that?!'
|
||||
}
|
||||
];
|
||||
|
||||
public static course = [
|
||||
{
|
||||
'id' : '15459251a6d6b397565',
|
||||
'title' : 'Basics of Angular',
|
||||
'slug' : 'basics-of-angular',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'web',
|
||||
'length' : 30,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '154588a0864d2881124',
|
||||
'title' : 'Basics of TypeScript',
|
||||
'slug' : 'basics-of-typeScript',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'web',
|
||||
'length' : 60,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Nov 01, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '15453ba60d3baa5daaf',
|
||||
'title' : 'Android N: Quick Settings',
|
||||
'slug' : 'android-n-quick-settings',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'android',
|
||||
'length' : 120,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '15453a06c08fb021776',
|
||||
'title' : 'Keep Sensitive Data Safe and Private',
|
||||
'slug' : 'keep-sensitive-data-safe-and-private',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'android',
|
||||
'length' : 45,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '15427f4c1b7f3953234',
|
||||
'title' : 'Building a gRPC Service with Java',
|
||||
'slug' : 'building-a-grpc-service-with-java',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'cloud',
|
||||
'length' : 30,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '1542d75d929a603125',
|
||||
'title' : 'Build a PWA Using Workbox',
|
||||
'slug' : 'build-a-pwa-using-workbox',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'web',
|
||||
'length' : 120,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '1543ee3a5b43e0f9f45',
|
||||
'title' : 'Build an App for the Google Assistant with Firebase and Dialogflow',
|
||||
'slug' : 'build-an-app-for-the-google-assistant-with-firebase-and-dialogflow',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'firebase',
|
||||
'length' : 30,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '1543cc4515df3146112',
|
||||
'title' : 'Cloud Functions for Firebase',
|
||||
'slug' : 'cloud-functions-for-firebase',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'firebase',
|
||||
'length' : 45,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '154398a4770d7aaf9a2',
|
||||
'title' : 'Manage Your Pivotal Cloud Foundry App\'s Using Apigee Edge',
|
||||
'slug' : 'manage-your-pivotal-cloud-foundry-apps-using-apigee-Edge',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'cloud',
|
||||
'length' : 90,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '15438351f87dcd68567',
|
||||
'title' : 'Building Beautiful UIs with Flutter',
|
||||
'your' : 'building-beautiful-uis-with-flutter',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'web',
|
||||
'length' : 90,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '1544e43dcdae6ebf876',
|
||||
'title' : 'Cloud Firestore',
|
||||
'slug' : 'cloud-firestore',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'firebase',
|
||||
'length' : 90,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '1541ca7af66da284177',
|
||||
'title' : 'Customize Network Topology with Subnetworks',
|
||||
'slug' : 'customize-network-topology-with-subnetworks',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'web',
|
||||
'length' : 45,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '154297167e781781745',
|
||||
'title' : 'Looking at Campaign Finance with BigQuery',
|
||||
'slug' : 'looking-at-campaign-finance-with-bigquery',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'cloud',
|
||||
'length' : 60,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '154537435d5b32bf11a',
|
||||
'title' : 'Firebase Android',
|
||||
'slug' : 'firebase-android',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'android',
|
||||
'length' : 45,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '154204e45a59b168453',
|
||||
'title' : 'Simulating a Thread Network Using OpenThread',
|
||||
'slug' : 'simulating-a-thread-network-using-openthread',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'web',
|
||||
'length' : 45,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '1541dd1e05dfc439216',
|
||||
'title' : 'Your First Progressive Web App',
|
||||
'slug' : 'your-first-progressive-web-app',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'web',
|
||||
'length' : 30,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '1532dfc67e704e48515',
|
||||
'title' : 'Launch Cloud Datalab',
|
||||
'slug' : 'launch-cloud-datalab',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'cloud',
|
||||
'length' : 60,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
},
|
||||
{
|
||||
'id' : '1542e43dfaae6ebf226',
|
||||
'title' : 'Personalize Your iOS App with Firebase User Management',
|
||||
'slug' : 'personalize-your-ios-app-with-firebase-user-management',
|
||||
'description': 'Commits that need to be pushed lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'category' : 'firebase',
|
||||
'length' : 90,
|
||||
'totalSteps' : 11,
|
||||
'updated' : 'Jun 28, 2017',
|
||||
'steps' : AcademyFakeDb.demoSteps
|
||||
}
|
||||
];
|
||||
|
||||
}
|
||||
@@ -1,97 +0,0 @@
|
||||
import {
|
||||
startOfDay,
|
||||
endOfDay,
|
||||
subDays,
|
||||
addDays,
|
||||
endOfMonth,
|
||||
isSameDay,
|
||||
isSameMonth,
|
||||
addHours
|
||||
} from 'date-fns';
|
||||
|
||||
export class CalendarFakeDb
|
||||
{
|
||||
|
||||
public static data = [
|
||||
{
|
||||
id : 'events',
|
||||
data: [
|
||||
{
|
||||
start : subDays(startOfDay(new Date()), 1),
|
||||
end : addDays(new Date(), 1),
|
||||
title : 'A 3 day event',
|
||||
allDay : true,
|
||||
color : {
|
||||
primary : '#F44336',
|
||||
secondary: '#FFCDD2'
|
||||
},
|
||||
resizable: {
|
||||
beforeStart: true,
|
||||
afterEnd : true
|
||||
},
|
||||
draggable: true,
|
||||
meta : {
|
||||
location: 'Los Angeles',
|
||||
notes : 'Eos eu verear adipiscing, ex ornatus denique iracundia sed, quodsi oportere appellantur an pri.'
|
||||
}
|
||||
},
|
||||
{
|
||||
start : startOfDay(new Date()),
|
||||
title : 'An event with no end date',
|
||||
allDay : false,
|
||||
color : {
|
||||
primary : '#FF9800',
|
||||
secondary: '#FFE0B2'
|
||||
},
|
||||
resizable: {
|
||||
beforeStart: true,
|
||||
afterEnd : true
|
||||
},
|
||||
draggable: true,
|
||||
meta : {
|
||||
location: 'Los Angeles',
|
||||
notes : 'Eos eu verear adipiscing, ex ornatus denique iracundia sed, quodsi oportere appellantur an pri.'
|
||||
}
|
||||
},
|
||||
{
|
||||
start : subDays(endOfMonth(new Date()), 3),
|
||||
end : addDays(endOfMonth(new Date()), 3),
|
||||
title : 'A long event that spans 2 months',
|
||||
allDay : false,
|
||||
color : {
|
||||
primary : '#1E90FF',
|
||||
secondary: '#D1E8FF'
|
||||
},
|
||||
resizable: {
|
||||
beforeStart: true,
|
||||
afterEnd : true
|
||||
},
|
||||
draggable: true,
|
||||
meta : {
|
||||
location: 'Los Angeles',
|
||||
notes : 'Eos eu verear adipiscing, ex ornatus denique iracundia sed, quodsi oportere appellantur an pri.'
|
||||
}
|
||||
},
|
||||
{
|
||||
start : addHours(startOfDay(new Date()), 2),
|
||||
end : new Date(),
|
||||
title : 'A draggable and resizable event',
|
||||
allDay : false,
|
||||
color : {
|
||||
primary : '#673AB7',
|
||||
secondary: '#D1C4E9'
|
||||
},
|
||||
resizable: {
|
||||
beforeStart: true,
|
||||
afterEnd : true
|
||||
},
|
||||
draggable: true,
|
||||
meta : {
|
||||
location: 'Los Angeles',
|
||||
notes : 'Eos eu verear adipiscing, ex ornatus denique iracundia sed, quodsi oportere appellantur an pri.'
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
}
|
||||
@@ -1,343 +0,0 @@
|
||||
export class ChatPanelFakeDb
|
||||
{
|
||||
public static contacts = [
|
||||
{
|
||||
'id' : '5725a680b3249760ea21de52',
|
||||
'name' : 'Alice Freeman',
|
||||
'avatar': 'assets/images/avatars/alice.jpg',
|
||||
'status': 'online',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...',
|
||||
'unread': '2'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680606588342058356d',
|
||||
'name' : 'Arnold',
|
||||
'avatar': 'assets/images/avatars/Arnold.jpg',
|
||||
'status': 'do-not-disturb',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a68009e20d0a9e9acf2a',
|
||||
'name' : 'Barrera',
|
||||
'avatar': 'assets/images/avatars/Barrera.jpg',
|
||||
'status': 'do-not-disturb',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a6809fdd915739187ed5',
|
||||
'name' : 'Blair',
|
||||
'avatar': 'assets/images/avatars/Blair.jpg',
|
||||
'status': 'offline',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...',
|
||||
'unread': '3'
|
||||
},
|
||||
{
|
||||
'id' : '5725a68007920cf75051da64',
|
||||
'name' : 'Boyle',
|
||||
'avatar': 'assets/images/avatars/Boyle.jpg',
|
||||
'status': 'offline',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...',
|
||||
'unread': '1'
|
||||
},
|
||||
{
|
||||
'id' : '5725a68031fdbb1db2c1af47',
|
||||
'name' : 'Christy',
|
||||
'avatar': 'assets/images/avatars/Christy.jpg',
|
||||
'status': 'offline',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680bc670af746c435e2',
|
||||
'name' : 'Copeland',
|
||||
'avatar': 'assets/images/avatars/Copeland.jpg',
|
||||
'status': 'online',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680e7eb988a58ddf303',
|
||||
'name' : 'Estes',
|
||||
'avatar': 'assets/images/avatars/Estes.jpg',
|
||||
'status': 'away',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680dcb077889f758961',
|
||||
'name' : 'Harper',
|
||||
'avatar': 'assets/images/avatars/Harper.jpg',
|
||||
'status': 'offline',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a6806acf030f9341e925',
|
||||
'name' : 'Helen',
|
||||
'avatar': 'assets/images/avatars/Helen.jpg',
|
||||
'status': 'away',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680ae1ae9a3c960d487',
|
||||
'name' : 'Henderson',
|
||||
'avatar': 'assets/images/avatars/Henderson.jpg',
|
||||
'status': 'offline',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680b8d240c011dd224b',
|
||||
'name' : 'Josefina',
|
||||
'avatar': 'assets/images/avatars/Josefina.jpg',
|
||||
'status': 'online',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a68034cb3968e1f79eac',
|
||||
'name' : 'Katina',
|
||||
'avatar': 'assets/images/avatars/Katina.jpg',
|
||||
'status': 'away',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a6801146cce777df2a08',
|
||||
'name' : 'Lily',
|
||||
'avatar': 'assets/images/avatars/Lily.jpg',
|
||||
'status': 'do-not-disturb',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...',
|
||||
'unread': '10'
|
||||
},
|
||||
{
|
||||
'id' : '5725a6808a178bfd034d6ecf',
|
||||
'name' : 'Mai',
|
||||
'avatar': 'assets/images/avatars/Mai.jpg',
|
||||
'status': 'away',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680653c265f5c79b5a9',
|
||||
'name' : 'Nancy',
|
||||
'avatar': 'assets/images/avatars/Nancy.jpg',
|
||||
'status': 'do-not-disturb',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680bbcec3cc32a8488a',
|
||||
'name' : 'Nora',
|
||||
'avatar': 'assets/images/avatars/Nora.jpg',
|
||||
'status': 'do-not-disturb',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...',
|
||||
'unread': '7'
|
||||
},
|
||||
{
|
||||
'id' : '5725a6803d87f1b77e17b62b',
|
||||
'name' : 'Odessa',
|
||||
'avatar': 'assets/images/avatars/Odessa.jpg',
|
||||
'status': 'away',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...',
|
||||
'unread': '1'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680e87cb319bd9bd673',
|
||||
'name' : 'Reyna',
|
||||
'avatar': 'assets/images/avatars/Reyna.jpg',
|
||||
'status': 'offline',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a6802d10e277a0f35775',
|
||||
'name' : 'Shauna',
|
||||
'avatar': 'assets/images/avatars/Shauna.jpg',
|
||||
'status': 'online',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680aef1e5cf26dd3d1f',
|
||||
'name' : 'Shepard',
|
||||
'avatar': 'assets/images/avatars/Shepard.jpg',
|
||||
'status': 'online',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680cd7efa56a45aea5d',
|
||||
'name' : 'Tillman',
|
||||
'avatar': 'assets/images/avatars/Tillman.jpg',
|
||||
'status': 'do-not-disturb',
|
||||
'mood' : '',
|
||||
'unread': '99+'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680fb65c91a82cb35e2',
|
||||
'name' : 'Trevino',
|
||||
'avatar': 'assets/images/avatars/Trevino.jpg',
|
||||
'status': 'away',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a68018c663044be49cbf',
|
||||
'name' : 'Tyson',
|
||||
'avatar': 'assets/images/avatars/Tyson.jpg',
|
||||
'status': 'do-not-disturb',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
},
|
||||
{
|
||||
'id' : '5725a6809413bf8a0a5272b1',
|
||||
'name' : 'Velazquez',
|
||||
'avatar': 'assets/images/avatars/Velazquez.jpg',
|
||||
'status': 'online',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
|
||||
}
|
||||
];
|
||||
|
||||
public static chats = [
|
||||
{
|
||||
'id' : '1725a680b3249760ea21de52',
|
||||
'dialog': [
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'Quickly come to the meeting room 1B, we have a big server issue',
|
||||
'time' : '2017-03-22T08:54:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a6802d10e277a0f35724',
|
||||
'message': 'I’m having breakfast right now, can’t you wait for 10 minutes?',
|
||||
'time' : '2017-03-22T08:55:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a6802d10e277a0f35724',
|
||||
'message': 'I’m having breakfast right now, can’t you wait for 10 minutes?',
|
||||
'time' : '2017-03-22T08:55:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'We are losing money! Quick!',
|
||||
'time' : '2017-03-22T09:00:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a6802d10e277a0f35724',
|
||||
'message': 'It’s not my money, you know. I will eat my breakfast and then I will come to the meeting room.',
|
||||
'time' : '2017-03-22T09:02:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'You are the worst!',
|
||||
'time' : '2017-03-22T09:05:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'We are losing money! Quick!',
|
||||
'time' : '2017-03-22T09:15:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'You are the worst!',
|
||||
'time' : '2017-03-22T09:05:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'We are losing money! Quick!',
|
||||
'time' : '2017-03-22T09:15:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a6802d10e277a0f35724',
|
||||
'message': 'It’s not my money, you know. I will eat my breakfast and then I will come to the meeting room.',
|
||||
'time' : '2017-03-22T09:20:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'You are the worst!',
|
||||
'time' : '2017-03-22T09:22:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'We are losing money! Quick!',
|
||||
'time' : '2017-03-22T09:25:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a6802d10e277a0f35724',
|
||||
'message': 'It’s not my money, you know. I will eat my breakfast and then I will come to the meeting room.',
|
||||
'time' : '2017-03-22T09:27:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'You are the worst!',
|
||||
'time' : '2017-03-22T09:33:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'You are the worst!',
|
||||
'time' : '2017-03-22T09:33:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'We are losing money! Quick!',
|
||||
'time' : '2017-03-22T09:35:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a6802d10e277a0f35724',
|
||||
'message': 'It’s not my money, you know. I will eat my breakfast and then I will come to the meeting room.',
|
||||
'time' : '2017-03-22T09:45:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'You are the worst!',
|
||||
'time' : '2017-03-22T10:00:28.299Z'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'id' : '2725a680b8d240c011dd2243',
|
||||
'dialog': [
|
||||
{
|
||||
'who' : '5725a680606588342058356d',
|
||||
'message': 'Quickly come to the meeting room 1B, we have a big server issue',
|
||||
'time' : '2017-04-22T01:00:00.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a6802d10e277a0f35724',
|
||||
'message': 'I’m having breakfast right now, can’t you wait for 10 minutes?',
|
||||
'time' : '2017-04-22T01:05:00.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680606588342058356d',
|
||||
'message': 'We are losing money! Quick!',
|
||||
'time' : '2017-04-22T01:10:00.299Z'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'id' : '3725a6809413bf8a0a5272b4',
|
||||
'dialog': [
|
||||
{
|
||||
'who' : '5725a68009e20d0a9e9acf2a',
|
||||
'message': 'Quickly come to the meeting room 1B, we have a big server issue',
|
||||
'time' : '2017-04-22T02:10:00.299Z'
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
public static user = [
|
||||
{
|
||||
'id' : '5725a6802d10e277a0f35724',
|
||||
'name' : 'John Doe',
|
||||
'avatar' : 'assets/images/avatars/profile.jpg',
|
||||
'status' : 'online',
|
||||
'mood' : '',
|
||||
'chatList': [
|
||||
{
|
||||
'chatId' : '1725a680b3249760ea21de52',
|
||||
'contactId' : '5725a680b3249760ea21de52',
|
||||
'lastMessageTime': '2017-06-12T02:10:18.931Z'
|
||||
},
|
||||
{
|
||||
'chatId' : '2725a680b8d240c011dd2243',
|
||||
'contactId' : '5725a680606588342058356d',
|
||||
'lastMessageTime': '2017-02-18T10:30:18.931Z'
|
||||
},
|
||||
{
|
||||
'chatId' : '3725a6809413bf8a0a5272b4',
|
||||
'contactId' : '5725a68009e20d0a9e9acf2a',
|
||||
'lastMessageTime': '2017-03-18T12:30:18.931Z'
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
}
|
||||
@@ -1,328 +0,0 @@
|
||||
export class ChatFakeDb
|
||||
{
|
||||
public static contacts = [
|
||||
{
|
||||
'id' : '5725a680b3249760ea21de52',
|
||||
'name' : 'Alice Freeman',
|
||||
'avatar': 'assets/images/avatars/alice.jpg',
|
||||
'status': 'online',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680606588342058356d',
|
||||
'name' : 'Arnold',
|
||||
'avatar': 'assets/images/avatars/Arnold.jpg',
|
||||
'status': 'do-not-disturb',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a68009e20d0a9e9acf2a',
|
||||
'name' : 'Barrera',
|
||||
'avatar': 'assets/images/avatars/Barrera.jpg',
|
||||
'status': 'do-not-disturb',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'unread': null
|
||||
},
|
||||
{
|
||||
'id' : '5725a6809fdd915739187ed5',
|
||||
'name' : 'Blair',
|
||||
'avatar': 'assets/images/avatars/Blair.jpg',
|
||||
'status': 'offline',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'unread': 3
|
||||
},
|
||||
{
|
||||
'id' : '5725a68007920cf75051da64',
|
||||
'name' : 'Boyle',
|
||||
'avatar': 'assets/images/avatars/Boyle.jpg',
|
||||
'status': 'offline',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a68031fdbb1db2c1af47',
|
||||
'name' : 'Christy',
|
||||
'avatar': 'assets/images/avatars/Christy.jpg',
|
||||
'status': 'offline',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680bc670af746c435e2',
|
||||
'name' : 'Copeland',
|
||||
'avatar': 'assets/images/avatars/Copeland.jpg',
|
||||
'status': 'online',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680e7eb988a58ddf303',
|
||||
'name' : 'Estes',
|
||||
'avatar': 'assets/images/avatars/Estes.jpg',
|
||||
'status': 'away',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680dcb077889f758961',
|
||||
'name' : 'Harper',
|
||||
'avatar': 'assets/images/avatars/Harper.jpg',
|
||||
'status': 'offline',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a6806acf030f9341e925',
|
||||
'name' : 'Helen',
|
||||
'avatar': 'assets/images/avatars/Helen.jpg',
|
||||
'status': 'away',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680ae1ae9a3c960d487',
|
||||
'name' : 'Henderson',
|
||||
'avatar': 'assets/images/avatars/Henderson.jpg',
|
||||
'status': 'offline',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680b8d240c011dd224b',
|
||||
'name' : 'Josefina',
|
||||
'avatar': 'assets/images/avatars/Josefina.jpg',
|
||||
'status': 'online',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a68034cb3968e1f79eac',
|
||||
'name' : 'Katina',
|
||||
'avatar': 'assets/images/avatars/Katina.jpg',
|
||||
'status': 'away',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a6801146cce777df2a08',
|
||||
'name' : 'Lily',
|
||||
'avatar': 'assets/images/avatars/Lily.jpg',
|
||||
'status': 'do-not-disturb',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a6808a178bfd034d6ecf',
|
||||
'name' : 'Mai',
|
||||
'avatar': 'assets/images/avatars/Mai.jpg',
|
||||
'status': 'away',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680653c265f5c79b5a9',
|
||||
'name' : 'Nancy',
|
||||
'avatar': 'assets/images/avatars/Nancy.jpg',
|
||||
'status': 'do-not-disturb',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680bbcec3cc32a8488a',
|
||||
'name' : 'Nora',
|
||||
'avatar': 'assets/images/avatars/Nora.jpg',
|
||||
'status': 'do-not-disturb',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a6803d87f1b77e17b62b',
|
||||
'name' : 'Odessa',
|
||||
'avatar': 'assets/images/avatars/Odessa.jpg',
|
||||
'status': 'away',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680e87cb319bd9bd673',
|
||||
'name' : 'Reyna',
|
||||
'avatar': 'assets/images/avatars/Reyna.jpg',
|
||||
'status': 'offline',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a6802d10e277a0f35775',
|
||||
'name' : 'Shauna',
|
||||
'avatar': 'assets/images/avatars/Shauna.jpg',
|
||||
'status': 'online',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||
'unread': null
|
||||
},
|
||||
{
|
||||
'id' : '5725a680aef1e5cf26dd3d1f',
|
||||
'name' : 'Shepard',
|
||||
'avatar': 'assets/images/avatars/Shepard.jpg',
|
||||
'status': 'online',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a680cd7efa56a45aea5d',
|
||||
'name' : 'Tillman',
|
||||
'avatar': 'assets/images/avatars/Tillman.jpg',
|
||||
'status': 'do-not-disturb',
|
||||
'mood' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a680fb65c91a82cb35e2',
|
||||
'name' : 'Trevino',
|
||||
'avatar': 'assets/images/avatars/Trevino.jpg',
|
||||
'status': 'away',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a68018c663044be49cbf',
|
||||
'name' : 'Tyson',
|
||||
'avatar': 'assets/images/avatars/Tyson.jpg',
|
||||
'status': 'do-not-disturb',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
},
|
||||
{
|
||||
'id' : '5725a6809413bf8a0a5272b1',
|
||||
'name' : 'Velazquez',
|
||||
'avatar': 'assets/images/avatars/Velazquez.jpg',
|
||||
'status': 'online',
|
||||
'mood' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
|
||||
}
|
||||
];
|
||||
|
||||
public static chats = [
|
||||
{
|
||||
'id' : '1725a680b3249760ea21de52',
|
||||
'dialog': [
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'Quickly come to the meeting room 1B, we have a big server issue',
|
||||
'time' : '2017-03-22T08:54:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a6802d10e277a0f35724',
|
||||
'message': 'I’m having breakfast right now, can’t you wait for 10 minutes?',
|
||||
'time' : '2017-03-22T08:55:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'We are losing money! Quick!',
|
||||
'time' : '2017-03-22T09:00:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a6802d10e277a0f35724',
|
||||
'message': 'It’s not my money, you know. I will eat my breakfast and then I will come to the meeting room.',
|
||||
'time' : '2017-03-22T09:02:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'You are the worst!',
|
||||
'time' : '2017-03-22T09:05:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'We are losing money! Quick!',
|
||||
'time' : '2017-03-22T09:15:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a6802d10e277a0f35724',
|
||||
'message': 'It’s not my money, you know. I will eat my breakfast and then I will come to the meeting room.',
|
||||
'time' : '2017-03-22T09:20:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'You are the worst!',
|
||||
'time' : '2017-03-22T09:22:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'We are losing money! Quick!',
|
||||
'time' : '2017-03-22T09:25:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a6802d10e277a0f35724',
|
||||
'message': 'It’s not my money, you know. I will eat my breakfast and then I will come to the meeting room.',
|
||||
'time' : '2017-03-22T09:27:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'You are the worst!',
|
||||
'time' : '2017-03-22T09:33:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'We are losing money! Quick!',
|
||||
'time' : '2017-03-22T09:35:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a6802d10e277a0f35724',
|
||||
'message': 'It’s not my money, you know. I will eat my breakfast and then I will come to the meeting room.',
|
||||
'time' : '2017-03-22T09:45:28.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b3249760ea21de52',
|
||||
'message': 'You are the worst!',
|
||||
'time' : '2017-03-22T10:00:28.299Z'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'id' : '2725a680b8d240c011dd2243',
|
||||
'dialog': [
|
||||
{
|
||||
'who' : '5725a680b8d240c011dd224b',
|
||||
'message': 'Quickly come to the meeting room 1B, we have a big server issue',
|
||||
'time' : '2017-04-22T01:00:00.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a6802d10e277a0f35724',
|
||||
'message': 'I’m having breakfast right now, can’t you wait for 10 minutes?',
|
||||
'time' : '2017-04-22T01:05:00.299Z'
|
||||
},
|
||||
{
|
||||
'who' : '5725a680b8d240c011dd224b',
|
||||
'message': 'We are losing money! Quick!',
|
||||
'time' : '2017-04-22T01:10:00.299Z'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'id' : '3725a6809413bf8a0a5272b4',
|
||||
'dialog': [
|
||||
{
|
||||
'who' : '5725a6809413bf8a0a5272b1',
|
||||
'message': 'Quickly come to the meeting room 1B, we have a big server issue',
|
||||
'time' : '2017-04-22T02:10:00.299Z'
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
public static user = [
|
||||
{
|
||||
'id' : '5725a6802d10e277a0f35724',
|
||||
'name' : 'John Doe',
|
||||
'avatar' : 'assets/images/avatars/profile.jpg',
|
||||
'status' : 'online',
|
||||
'mood' : 'it\'s a status....not your diary...',
|
||||
'chatList': [
|
||||
{
|
||||
'id' : '1725a680b3249760ea21de52',
|
||||
'contactId' : '5725a680b3249760ea21de52',
|
||||
'name' : 'Alice Freeman',
|
||||
'unread' : 4,
|
||||
'lastMessage' : 'You are the worst!',
|
||||
'lastMessageTime': '2017-06-12T02:10:18.931Z'
|
||||
},
|
||||
{
|
||||
'id' : '2725a680b8d240c011dd2243',
|
||||
'contactId' : '5725a680b8d240c011dd224b',
|
||||
'name' : 'Josefina',
|
||||
'unread' : null,
|
||||
'lastMessage' : 'We are losing money! Quick!',
|
||||
'lastMessageTime': '2017-02-18T10:30:18.931Z'
|
||||
},
|
||||
{
|
||||
'id' : '3725a6809413bf8a0a5272b4',
|
||||
'contactId' : '5725a6809413bf8a0a5272b1',
|
||||
'name' : 'Velazquez',
|
||||
'unread' : 2,
|
||||
'lastMessage' : 'Quickly come to the meeting room 1B, we have a big server issue',
|
||||
'lastMessageTime': '2017-03-18T12:30:18.931Z'
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
}
|
||||
@@ -1,411 +0,0 @@
|
||||
export class ContactsFakeDb
|
||||
{
|
||||
public static contacts = [
|
||||
{
|
||||
'id' : '5725a680b3249760ea21de52',
|
||||
'name' : 'Abbott',
|
||||
'lastName': 'Keitch',
|
||||
'avatar' : 'assets/images/avatars/Abbott.jpg',
|
||||
'nickname': 'Royalguard',
|
||||
'company' : 'Saois',
|
||||
'jobTitle': 'Digital Archivist',
|
||||
'email' : 'abbott@withinpixels.com',
|
||||
'phone' : '+1-202-555-0175',
|
||||
'address' : '933 8th Street Stamford, CT 06902',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a680606588342058356d',
|
||||
'name' : 'Arnold',
|
||||
'lastName': 'Matlock',
|
||||
'avatar' : 'assets/images/avatars/Arnold.jpg',
|
||||
'nickname': 'Wanderer',
|
||||
'company' : 'Laotcone',
|
||||
'jobTitle': 'Graphic Artist',
|
||||
'email' : 'arnold@withinpixels.com',
|
||||
'phone' : '+1-202-555-0141',
|
||||
'address' : '906 Valley Road Michigan City, IN 46360',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a68009e20d0a9e9acf2a',
|
||||
'name' : 'Barrera',
|
||||
'lastName': 'Bradbury',
|
||||
'avatar' : 'assets/images/avatars/Barrera.jpg',
|
||||
'nickname': 'Jackal',
|
||||
'company' : 'Unizim',
|
||||
'jobTitle': 'Graphic Designer',
|
||||
'email' : 'barrera@withinpixels.com',
|
||||
'phone' : '+1-202-555-0196',
|
||||
'address' : '183 River Street Passaic, NJ 07055',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a6809fdd915739187ed5',
|
||||
'name' : 'Blair',
|
||||
'lastName': 'Strangeway',
|
||||
'avatar' : 'assets/images/avatars/Blair.jpg',
|
||||
'nickname': 'Knight',
|
||||
'company' : 'Conedubdax',
|
||||
'jobTitle': 'Visual Designer',
|
||||
'email' : 'blair@withinpixels.com',
|
||||
'phone' : '+1-202-555-0118',
|
||||
'address' : '143 Jones Street Eau Claire, WI 54701',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a68007920cf75051da64',
|
||||
'name' : 'Boyle',
|
||||
'lastName': 'Winters',
|
||||
'avatar' : 'assets/images/avatars/Boyle.jpg',
|
||||
'nickname': 'Jester',
|
||||
'company' : 'Newo',
|
||||
'jobTitle': 'Catalogue Illustrator',
|
||||
'email' : 'boyle@withinpixels.com',
|
||||
'phone' : '+1-202-555-0177',
|
||||
'address' : '218 Pearl Street Brandon, FL 33510',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a68031fdbb1db2c1af47',
|
||||
'name' : 'Christy',
|
||||
'lastName': 'Camacho',
|
||||
'avatar' : 'assets/images/avatars/Christy.jpg',
|
||||
'nickname': 'Mist',
|
||||
'company' : 'uniway',
|
||||
'jobTitle': '3D Animator',
|
||||
'email' : 'christy@withinpixels.com',
|
||||
'phone' : '+1-202-555-0136',
|
||||
'address' : '329 Bridge Street Desoto, TX 75115',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a680bc670af746c435e2',
|
||||
'name' : 'Copeland',
|
||||
'lastName': 'Redcliff',
|
||||
'avatar' : 'assets/images/avatars/Copeland.jpg',
|
||||
'nickname': 'Cloudlaw',
|
||||
'company' : 'Tempron',
|
||||
'jobTitle': 'Multimedia Artist',
|
||||
'email' : 'copeland@withinpixels.com',
|
||||
'phone' : '+1-202-555-0107',
|
||||
'address' : '956 6th Avenue North Bergen, NJ 0704',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a680e7eb988a58ddf303',
|
||||
'name' : 'Estes',
|
||||
'lastName': 'Stevens',
|
||||
'avatar' : 'assets/images/avatars/Estes.jpg',
|
||||
'nickname': 'Roamer',
|
||||
'company' : 'nam-dex',
|
||||
'jobTitle': 'Special Effects Artist',
|
||||
'email' : 'estes@withinpixels.com',
|
||||
'phone' : '+1-202-555-0113',
|
||||
'address' : '664 York Street Cambridge, MA 02138',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a680dcb077889f758961',
|
||||
'name' : 'Harper',
|
||||
'lastName': 'MacGuffin',
|
||||
'avatar' : 'assets/images/avatars/Harper.jpg',
|
||||
'nickname': 'Tempest',
|
||||
'company' : 'runcane',
|
||||
'jobTitle': 'Application Developer',
|
||||
'email' : 'harper@withinpixels.com',
|
||||
'phone' : '+1-202-555-0173',
|
||||
'address' : '738 Route 11 Cornelius, NC 28031',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a6806acf030f9341e925',
|
||||
'name' : 'Helen',
|
||||
'lastName': 'Sheridan',
|
||||
'avatar' : 'assets/images/avatars/Helen.jpg',
|
||||
'nickname': 'Magicbattler',
|
||||
'company' : 'Subhow',
|
||||
'jobTitle': 'Content Developer',
|
||||
'email' : 'helen@withinpixels.com',
|
||||
'phone' : '+1-202-555-0163',
|
||||
'address' : '194 Washington Avenue Saint Petersburg, FL 33702',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a680ae1ae9a3c960d487',
|
||||
'name' : 'Henderson',
|
||||
'lastName': 'Cambias',
|
||||
'avatar' : 'assets/images/avatars/Henderson.jpg',
|
||||
'nickname': 'Blizzard',
|
||||
'company' : 'Howcom',
|
||||
'jobTitle': 'Web Designer',
|
||||
'email' : 'henderson@withinpixels.com',
|
||||
'phone' : '+1-202-555-0151',
|
||||
'address' : '686 Roosevelt Avenue Oviedo, FL 32765',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a680b8d240c011dd224b',
|
||||
'name' : 'Josefina',
|
||||
'lastName': 'Lakefield',
|
||||
'avatar' : 'assets/images/avatars/Josefina.jpg',
|
||||
'nickname': 'Violet',
|
||||
'company' : 'Gecko',
|
||||
'jobTitle': 'Web Developer',
|
||||
'email' : 'josefina@withinpixels.com',
|
||||
'phone' : '+1-202-555-0160',
|
||||
'address' : '202 Hartford Road Lynchburg, VA 24502',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a68034cb3968e1f79eac',
|
||||
'name' : 'Katina',
|
||||
'lastName': 'Bletchley',
|
||||
'avatar' : 'assets/images/avatars/Katina.jpg',
|
||||
'nickname': 'Rose',
|
||||
'company' : 'Lexicom',
|
||||
'jobTitle': 'Software Designer',
|
||||
'email' : 'katina@withinpixels.com',
|
||||
'phone' : '+1-202-555-0186',
|
||||
'address' : '219 Woodland Road Valrico, FL 33594',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a6801146cce777df2a08',
|
||||
'name' : 'Lily',
|
||||
'lastName': 'Peasegood',
|
||||
'avatar' : 'assets/images/avatars/Lily.jpg',
|
||||
'nickname': 'Star',
|
||||
'company' : 'zooflex',
|
||||
'jobTitle': 'Software Specialist',
|
||||
'email' : 'lily@withinpixels.com',
|
||||
'phone' : '+1-202-555-0115',
|
||||
'address' : '305 Willow Drive Superior, WI 54880',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a6808a178bfd034d6ecf',
|
||||
'name' : 'Mai',
|
||||
'lastName': 'Nox',
|
||||
'avatar' : 'assets/images/avatars/Mai.jpg',
|
||||
'nickname': 'Violetmage',
|
||||
'company' : 'quadzone',
|
||||
'jobTitle': 'Software Engineer',
|
||||
'email' : 'mai@withinpixels.com',
|
||||
'phone' : '+1-202-555-0199',
|
||||
'address' : '148 Heather Lane Mcminnville, TN 37110',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a680653c265f5c79b5a9',
|
||||
'name' : 'Nancy',
|
||||
'lastName': 'Jaggers',
|
||||
'avatar' : 'assets/images/avatars/Nancy.jpg',
|
||||
'nickname': 'Silverwarden',
|
||||
'company' : 'Opetamnix',
|
||||
'jobTitle': 'Software Architect',
|
||||
'email' : 'nancy@withinpixels.com',
|
||||
'phone' : '+1-202-555-0120',
|
||||
'address' : '345 Laurel Lane Union City, NJ 07087',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a680bbcec3cc32a8488a',
|
||||
'name' : 'Nora',
|
||||
'lastName': 'Franklin',
|
||||
'avatar' : 'assets/images/avatars/Nora.jpg',
|
||||
'nickname': 'Katanachanter',
|
||||
'company' : 'Saoway',
|
||||
'jobTitle': 'Database Coordinator',
|
||||
'email' : 'nora@withinpixels.com',
|
||||
'phone' : '+1-202-555-0172',
|
||||
'address' : '572 Rose Street Summerfield, FL 34491',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a6803d87f1b77e17b62b',
|
||||
'name' : 'Odessa',
|
||||
'lastName': 'Goodman',
|
||||
'avatar' : 'assets/images/avatars/Odessa.jpg',
|
||||
'nickname': 'Rose',
|
||||
'company' : 'transace',
|
||||
'jobTitle': 'Database Administration Manager',
|
||||
'email' : 'odessa@withinpixels.com',
|
||||
'phone' : '+1-202-555-0190',
|
||||
'address' : '527 Jefferson Court Conyers, GA 30012',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a680e87cb319bd9bd673',
|
||||
'name' : 'Reyna',
|
||||
'lastName': 'Preece',
|
||||
'avatar' : 'assets/images/avatars/Reyna.jpg',
|
||||
'nickname': 'Holydawn',
|
||||
'company' : 'Dingex',
|
||||
'jobTitle': 'Data Processing Planner',
|
||||
'email' : 'reyna@withinpixels.com',
|
||||
'phone' : '+1-202-555-0116',
|
||||
'address' : '297 Strawberry Lane Faribault, MN 55021',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a6802d10e277a0f35775',
|
||||
'name' : 'Shauna',
|
||||
'lastName': 'Atherton',
|
||||
'avatar' : 'assets/images/avatars/Shauna.jpg',
|
||||
'nickname': 'Faunasoul',
|
||||
'company' : 'Vivaflex',
|
||||
'jobTitle': 'Art Director',
|
||||
'email' : 'shauna@withinpixels.com',
|
||||
'phone' : '+1-202-555-0159',
|
||||
'address' : '928 Canterbury Court Pittsburgh, PA 15206',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a680aef1e5cf26dd3d1f',
|
||||
'name' : 'Shepard',
|
||||
'lastName': 'Rosco',
|
||||
'avatar' : 'assets/images/avatars/Shepard.jpg',
|
||||
'nickname': 'Fireking',
|
||||
'company' : 'Goldenla',
|
||||
'jobTitle': 'Magazine Designer',
|
||||
'email' : 'shepard@withinpixels.com',
|
||||
'phone' : '+1-202-555-0173',
|
||||
'address' : '904 Ridge Road Pickerington, OH 43147',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a680cd7efa56a45aea5d',
|
||||
'name' : 'Tillman',
|
||||
'lastName': 'Lee',
|
||||
'avatar' : 'assets/images/avatars/Tillman.jpg',
|
||||
'nickname': 'Gust',
|
||||
'company' : 'K-techno',
|
||||
'jobTitle': 'News Photographer',
|
||||
'email' : 'tillman@withinpixels.com',
|
||||
'phone' : '+1-202-555-0183',
|
||||
'address' : '447 Charles Street Dorchester, MA 02125',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a680fb65c91a82cb35e2',
|
||||
'name' : 'Trevino',
|
||||
'lastName': 'Bush',
|
||||
'avatar' : 'assets/images/avatars/Trevino.jpg',
|
||||
'nickname': 'Wolf',
|
||||
'company' : 'Dalthex',
|
||||
'jobTitle': 'Photojournalist',
|
||||
'email' : 'trevino@withinpixels.com',
|
||||
'phone' : '+1-202-555-0138',
|
||||
'address' : '84 Valley View Road Norman, OK 73072',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a68018c663044be49cbf',
|
||||
'name' : 'Tyson',
|
||||
'lastName': 'Marshall',
|
||||
'avatar' : 'assets/images/avatars/Tyson.jpg',
|
||||
'nickname': 'Honordread',
|
||||
'company' : 'Geocon',
|
||||
'jobTitle': 'Manuscript Editor',
|
||||
'email' : 'tyson@withinpixels.com',
|
||||
'phone' : '+1-202-555-0146',
|
||||
'address' : '204 Clark Street Monsey, NY 10952',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
},
|
||||
{
|
||||
'id' : '5725a6809413bf8a0a5272b1',
|
||||
'name' : 'Velazquez',
|
||||
'lastName': 'Smethley',
|
||||
'avatar' : 'assets/images/avatars/Velazquez.jpg',
|
||||
'nickname': 'Strifedream',
|
||||
'company' : 'ranex',
|
||||
'jobTitle': 'Publications Editor',
|
||||
'email' : 'velezquez@withinpixels.com',
|
||||
'phone' : '+1-202-555-0146',
|
||||
'address' : '261 Cleveland Street Riverside, NJ 08075',
|
||||
'birthday': '',
|
||||
'notes' : ''
|
||||
}
|
||||
];
|
||||
|
||||
public static user = [
|
||||
{
|
||||
'id' : '5725a6802d10e277a0f35724',
|
||||
'name' : 'John Doe',
|
||||
'avatar' : 'assets/images/avatars/profile.jpg',
|
||||
'starred' : [
|
||||
'5725a680ae1ae9a3c960d487',
|
||||
'5725a6801146cce777df2a08',
|
||||
'5725a680bbcec3cc32a8488a',
|
||||
'5725a680bc670af746c435e2',
|
||||
'5725a68009e20d0a9e9acf2a'
|
||||
],
|
||||
'frequentContacts': [
|
||||
'5725a6809fdd915739187ed5',
|
||||
'5725a68031fdbb1db2c1af47',
|
||||
'5725a680606588342058356d',
|
||||
'5725a680e7eb988a58ddf303',
|
||||
'5725a6806acf030f9341e925',
|
||||
'5725a68034cb3968e1f79eac',
|
||||
'5725a6801146cce777df2a08',
|
||||
'5725a680653c265f5c79b5a9'
|
||||
],
|
||||
'groups' : [
|
||||
{
|
||||
'id' : '5725a6802d10e277a0f35739',
|
||||
'name' : 'Friends',
|
||||
'contactIds': [
|
||||
'5725a680bbcec3cc32a8488a',
|
||||
'5725a680e87cb319bd9bd673',
|
||||
'5725a6802d10e277a0f35775'
|
||||
]
|
||||
},
|
||||
{
|
||||
'id' : '5725a6802d10e277a0f35749',
|
||||
'name' : 'Clients',
|
||||
'contactIds': [
|
||||
'5725a680cd7efa56a45aea5d',
|
||||
'5725a68018c663044be49cbf',
|
||||
'5725a6809413bf8a0a5272b1',
|
||||
'5725a6803d87f1b77e17b62b'
|
||||
]
|
||||
},
|
||||
{
|
||||
'id' : '5725a6802d10e277a0f35329',
|
||||
'name' : 'Recent Workers',
|
||||
'contactIds': [
|
||||
'5725a680bbcec3cc32a8488a',
|
||||
'5725a680653c265f5c79b5a9',
|
||||
'5725a6808a178bfd034d6ecf',
|
||||
'5725a6801146cce777df2a08'
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
}
|
||||
@@ -1,602 +0,0 @@
|
||||
export class AnalyticsDashboardDb
|
||||
{
|
||||
public static widgets = {
|
||||
widget1: {
|
||||
chartType: 'line',
|
||||
datasets : {
|
||||
'2016': [
|
||||
{
|
||||
label: 'Sales',
|
||||
data : [1.9, 3, 3.4, 2.2, 2.9, 3.9, 2.5, 3.8, 4.1, 3.8, 3.2, 2.9],
|
||||
fill : 'start'
|
||||
|
||||
}
|
||||
],
|
||||
'2017': [
|
||||
{
|
||||
label: 'Sales',
|
||||
data : [2.2, 2.9, 3.9, 2.5, 3.8, 3.2, 2.9, 1.9, 3, 3.4, 4.1, 3.8],
|
||||
fill : 'start'
|
||||
|
||||
}
|
||||
],
|
||||
'2018': [
|
||||
{
|
||||
label: 'Sales',
|
||||
data : [3.9, 2.5, 3.8, 4.1, 1.9, 3, 3.8, 3.2, 2.9, 3.4, 2.2, 2.9],
|
||||
fill : 'start'
|
||||
|
||||
}
|
||||
]
|
||||
|
||||
},
|
||||
labels : ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'],
|
||||
colors : [
|
||||
{
|
||||
borderColor : '#42a5f5',
|
||||
backgroundColor : '#42a5f5',
|
||||
pointBackgroundColor : '#1e88e5',
|
||||
pointHoverBackgroundColor: '#1e88e5',
|
||||
pointBorderColor : '#ffffff',
|
||||
pointHoverBorderColor : '#ffffff'
|
||||
}
|
||||
],
|
||||
options : {
|
||||
spanGaps : false,
|
||||
legend : {
|
||||
display: false
|
||||
},
|
||||
maintainAspectRatio: false,
|
||||
layout : {
|
||||
padding: {
|
||||
top : 32,
|
||||
left : 32,
|
||||
right: 32
|
||||
}
|
||||
},
|
||||
elements : {
|
||||
point: {
|
||||
radius : 4,
|
||||
borderWidth : 2,
|
||||
hoverRadius : 4,
|
||||
hoverBorderWidth: 2
|
||||
},
|
||||
line : {
|
||||
tension: 0
|
||||
}
|
||||
},
|
||||
scales : {
|
||||
xAxes: [
|
||||
{
|
||||
gridLines: {
|
||||
display : false,
|
||||
drawBorder : false,
|
||||
tickMarkLength: 18
|
||||
},
|
||||
ticks : {
|
||||
fontColor: '#ffffff'
|
||||
}
|
||||
}
|
||||
],
|
||||
yAxes: [
|
||||
{
|
||||
display: false,
|
||||
ticks : {
|
||||
min : 1.5,
|
||||
max : 5,
|
||||
stepSize: 0.5
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
plugins : {
|
||||
filler : {
|
||||
propagate: false
|
||||
},
|
||||
xLabelsOnTop: {
|
||||
active: true
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
widget2: {
|
||||
conversion: {
|
||||
value : 492,
|
||||
ofTarget: 13
|
||||
},
|
||||
chartType : 'bar',
|
||||
datasets : [
|
||||
{
|
||||
label: 'Conversion',
|
||||
data : [221, 428, 492, 471, 413, 344, 294]
|
||||
}
|
||||
],
|
||||
labels : ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
|
||||
colors : [
|
||||
{
|
||||
borderColor : '#42a5f5',
|
||||
backgroundColor: '#42a5f5'
|
||||
}
|
||||
],
|
||||
options : {
|
||||
spanGaps : false,
|
||||
legend : {
|
||||
display: false
|
||||
},
|
||||
maintainAspectRatio: false,
|
||||
layout : {
|
||||
padding: {
|
||||
top : 24,
|
||||
left : 16,
|
||||
right : 16,
|
||||
bottom: 16
|
||||
}
|
||||
},
|
||||
scales : {
|
||||
xAxes: [
|
||||
{
|
||||
display: false
|
||||
}
|
||||
],
|
||||
yAxes: [
|
||||
{
|
||||
display: false,
|
||||
ticks : {
|
||||
min: 100,
|
||||
max: 500
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
widget3: {
|
||||
impressions: {
|
||||
value : '87k',
|
||||
ofTarget: 12
|
||||
},
|
||||
chartType : 'line',
|
||||
datasets : [
|
||||
{
|
||||
label: 'Impression',
|
||||
data : [67000, 54000, 82000, 57000, 72000, 57000, 87000, 72000, 89000, 98700, 112000, 136000, 110000, 149000, 98000],
|
||||
fill : false
|
||||
}
|
||||
],
|
||||
labels : ['Jan 1', 'Jan 2', 'Jan 3', 'Jan 4', 'Jan 5', 'Jan 6', 'Jan 7', 'Jan 8', 'Jan 9', 'Jan 10', 'Jan 11', 'Jan 12', 'Jan 13', 'Jan 14', 'Jan 15'],
|
||||
colors : [
|
||||
{
|
||||
borderColor: '#5c84f1'
|
||||
}
|
||||
],
|
||||
options : {
|
||||
spanGaps : false,
|
||||
legend : {
|
||||
display: false
|
||||
},
|
||||
maintainAspectRatio: false,
|
||||
elements : {
|
||||
point: {
|
||||
radius : 2,
|
||||
borderWidth : 1,
|
||||
hoverRadius : 2,
|
||||
hoverBorderWidth: 1
|
||||
},
|
||||
line : {
|
||||
tension: 0
|
||||
}
|
||||
},
|
||||
layout : {
|
||||
padding: {
|
||||
top : 24,
|
||||
left : 16,
|
||||
right : 16,
|
||||
bottom: 16
|
||||
}
|
||||
},
|
||||
scales : {
|
||||
xAxes: [
|
||||
{
|
||||
display: false
|
||||
}
|
||||
],
|
||||
yAxes: [
|
||||
{
|
||||
display: false,
|
||||
ticks : {
|
||||
// min: 100,
|
||||
// max: 500
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
widget4: {
|
||||
visits : {
|
||||
value : 882,
|
||||
ofTarget: -9
|
||||
},
|
||||
chartType: 'bar',
|
||||
datasets : [
|
||||
{
|
||||
label: 'Visits',
|
||||
data : [432, 428, 327, 363, 456, 267, 231]
|
||||
}
|
||||
],
|
||||
labels : ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
|
||||
colors : [
|
||||
{
|
||||
borderColor : '#f44336',
|
||||
backgroundColor: '#f44336'
|
||||
}
|
||||
],
|
||||
options : {
|
||||
spanGaps : false,
|
||||
legend : {
|
||||
display: false
|
||||
},
|
||||
maintainAspectRatio: false,
|
||||
layout : {
|
||||
padding: {
|
||||
top : 24,
|
||||
left : 16,
|
||||
right : 16,
|
||||
bottom: 16
|
||||
}
|
||||
},
|
||||
scales : {
|
||||
xAxes: [
|
||||
{
|
||||
display: false
|
||||
}
|
||||
],
|
||||
yAxes: [
|
||||
{
|
||||
display: false,
|
||||
ticks : {
|
||||
min: 150,
|
||||
max: 500
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
widget5: {
|
||||
chartType: 'line',
|
||||
datasets : {
|
||||
'yesterday': [
|
||||
{
|
||||
label: 'Visitors',
|
||||
data : [190, 300, 340, 220, 290, 390, 250, 380, 410, 380, 320, 290],
|
||||
fill : 'start'
|
||||
|
||||
},
|
||||
{
|
||||
label: 'Page views',
|
||||
data : [2200, 2900, 3900, 2500, 3800, 3200, 2900, 1900, 3000, 3400, 4100, 3800],
|
||||
fill : 'start'
|
||||
}
|
||||
],
|
||||
'today' : [
|
||||
{
|
||||
label: 'Visitors',
|
||||
data : [410, 380, 320, 290, 190, 390, 250, 380, 300, 340, 220, 290],
|
||||
fill : 'start'
|
||||
},
|
||||
{
|
||||
label: 'Page Views',
|
||||
data : [3000, 3400, 4100, 3800, 2200, 3200, 2900, 1900, 2900, 3900, 2500, 3800],
|
||||
fill : 'start'
|
||||
|
||||
}
|
||||
]
|
||||
},
|
||||
labels : ['12am', '2am', '4am', '6am', '8am', '10am', '12pm', '2pm', '4pm', '6pm', '8pm', '10pm'],
|
||||
colors : [
|
||||
{
|
||||
borderColor : '#3949ab',
|
||||
backgroundColor : '#3949ab',
|
||||
pointBackgroundColor : '#3949ab',
|
||||
pointHoverBackgroundColor: '#3949ab',
|
||||
pointBorderColor : '#ffffff',
|
||||
pointHoverBorderColor : '#ffffff'
|
||||
},
|
||||
{
|
||||
borderColor : 'rgba(30, 136, 229, 0.87)',
|
||||
backgroundColor : 'rgba(30, 136, 229, 0.87)',
|
||||
pointBackgroundColor : 'rgba(30, 136, 229, 0.87)',
|
||||
pointHoverBackgroundColor: 'rgba(30, 136, 229, 0.87)',
|
||||
pointBorderColor : '#ffffff',
|
||||
pointHoverBorderColor : '#ffffff'
|
||||
}
|
||||
],
|
||||
options : {
|
||||
spanGaps : false,
|
||||
legend : {
|
||||
display: false
|
||||
},
|
||||
maintainAspectRatio: false,
|
||||
tooltips : {
|
||||
position : 'nearest',
|
||||
mode : 'index',
|
||||
intersect: false
|
||||
},
|
||||
layout : {
|
||||
padding: {
|
||||
left : 24,
|
||||
right: 32
|
||||
}
|
||||
},
|
||||
elements : {
|
||||
point: {
|
||||
radius : 4,
|
||||
borderWidth : 2,
|
||||
hoverRadius : 4,
|
||||
hoverBorderWidth: 2
|
||||
}
|
||||
},
|
||||
scales : {
|
||||
xAxes: [
|
||||
{
|
||||
gridLines: {
|
||||
display: false
|
||||
},
|
||||
ticks : {
|
||||
fontColor: 'rgba(0,0,0,0.54)'
|
||||
}
|
||||
}
|
||||
],
|
||||
yAxes: [
|
||||
{
|
||||
gridLines: {
|
||||
tickMarkLength: 16
|
||||
},
|
||||
ticks : {
|
||||
stepSize: 1000
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
plugins : {
|
||||
filler: {
|
||||
propagate: false
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
widget6: {
|
||||
markers: [
|
||||
{
|
||||
lat : 52,
|
||||
lng : -73,
|
||||
label: '120'
|
||||
},
|
||||
{
|
||||
lat : 37,
|
||||
lng : -104,
|
||||
label: '498'
|
||||
},
|
||||
{
|
||||
lat : 21,
|
||||
lng : -7,
|
||||
label: '443'
|
||||
},
|
||||
{
|
||||
lat : 55,
|
||||
lng : 75,
|
||||
label: '332'
|
||||
},
|
||||
{
|
||||
lat : 51,
|
||||
lng : 7,
|
||||
label: '50'
|
||||
},
|
||||
{
|
||||
lat : 31,
|
||||
lng : 12,
|
||||
label: '221'
|
||||
},
|
||||
{
|
||||
lat : 45,
|
||||
lng : 44,
|
||||
label: '455'
|
||||
},
|
||||
{
|
||||
lat : -26,
|
||||
lng : 134,
|
||||
label: '231'
|
||||
},
|
||||
{
|
||||
lat : -9,
|
||||
lng : -60,
|
||||
label: '67'
|
||||
},
|
||||
{
|
||||
lat : 33,
|
||||
lng : 104,
|
||||
label: '665'
|
||||
}
|
||||
],
|
||||
styles : [
|
||||
{
|
||||
'featureType': 'administrative',
|
||||
'elementType': 'labels.text.fill',
|
||||
'stylers' : [
|
||||
{
|
||||
'color': '#444444'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'featureType': 'landscape',
|
||||
'elementType': 'all',
|
||||
'stylers' : [
|
||||
{
|
||||
'color': '#f2f2f2'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'featureType': 'poi',
|
||||
'elementType': 'all',
|
||||
'stylers' : [
|
||||
{
|
||||
'visibility': 'off'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'featureType': 'road',
|
||||
'elementType': 'all',
|
||||
'stylers' : [
|
||||
{
|
||||
'saturation': -100
|
||||
},
|
||||
{
|
||||
'lightness': 45
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'featureType': 'road.highway',
|
||||
'elementType': 'all',
|
||||
'stylers' : [
|
||||
{
|
||||
'visibility': 'simplified'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'featureType': 'road.arterial',
|
||||
'elementType': 'labels.icon',
|
||||
'stylers' : [
|
||||
{
|
||||
'visibility': 'off'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'featureType': 'transit',
|
||||
'elementType': 'all',
|
||||
'stylers' : [
|
||||
{
|
||||
'visibility': 'off'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'featureType': 'water',
|
||||
'elementType': 'all',
|
||||
'stylers' : [
|
||||
{
|
||||
'color': '#039be5'
|
||||
},
|
||||
{
|
||||
'visibility': 'on'
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
widget7: {
|
||||
scheme : {
|
||||
domain: ['#4867d2', '#5c84f1', '#89a9f4']
|
||||
},
|
||||
devices: [
|
||||
{
|
||||
name : 'Desktop',
|
||||
value : 92.8,
|
||||
change: -0.6
|
||||
},
|
||||
{
|
||||
name : 'Mobile',
|
||||
value : 6.1,
|
||||
change: 0.7
|
||||
},
|
||||
{
|
||||
name : 'Tablet',
|
||||
value : 1.1,
|
||||
change: 0.1
|
||||
}
|
||||
]
|
||||
},
|
||||
widget8: {
|
||||
scheme : {
|
||||
domain: ['#5c84f1']
|
||||
},
|
||||
today : '12,540',
|
||||
change : {
|
||||
value : 321,
|
||||
percentage: 2.05
|
||||
},
|
||||
data : [
|
||||
{
|
||||
name : 'Sales',
|
||||
series: [
|
||||
{
|
||||
name : 'Jan 1',
|
||||
value: 540
|
||||
},
|
||||
{
|
||||
name : 'Jan 2',
|
||||
value: 539
|
||||
},
|
||||
{
|
||||
name : 'Jan 3',
|
||||
value: 538
|
||||
},
|
||||
{
|
||||
name : 'Jan 4',
|
||||
value: 539
|
||||
},
|
||||
{
|
||||
name : 'Jan 5',
|
||||
value: 540
|
||||
},
|
||||
{
|
||||
name : 'Jan 6',
|
||||
value: 539
|
||||
},
|
||||
{
|
||||
name : 'Jan 7',
|
||||
value: 540
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
dataMin: 538,
|
||||
dataMax: 541
|
||||
},
|
||||
widget9: {
|
||||
rows: [
|
||||
{
|
||||
title : 'Holiday Travel',
|
||||
clicks : 3621,
|
||||
conversion: 90
|
||||
},
|
||||
{
|
||||
title : 'Get Away Deals',
|
||||
clicks : 703,
|
||||
conversion: 7
|
||||
},
|
||||
{
|
||||
title : 'Airfare',
|
||||
clicks : 532,
|
||||
conversion: 0
|
||||
},
|
||||
{
|
||||
title : 'Vacation',
|
||||
clicks : 201,
|
||||
conversion: 8
|
||||
},
|
||||
{
|
||||
title : 'Hotels',
|
||||
clicks : 94,
|
||||
conversion: 4
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user