mirror of
https://github.com/richard-loafle/fuse-angular.git
synced 2025-12-22 09:37:10 +00:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
43b85ca3b6 | ||
|
|
99696cabf7 | ||
|
|
f246fab1f4 | ||
|
|
b0101a1f8c | ||
|
|
8f5e947c28 | ||
|
|
dfd430712d | ||
|
|
8431c19133 | ||
|
|
6ee6934e0d | ||
|
|
3253fbfaf4 |
@@ -2,6 +2,12 @@
|
||||
|
||||
Material Design Admin Template with Angular 5+ and Angular Material 2
|
||||
|
||||
## The Community
|
||||
|
||||
Share your ideas, discuss Fuse and help each other.
|
||||
|
||||
[Click here](https://join.slack.com/t/fuse-theme/shared_invite/enQtMzA1NDE4NzYwMjcyLWQxODE4ODM1MWU4MWJjMDhlMGEwYzM4Mzg3N2E4YzVlZThhZjNlOTQ1Y2Q5OTBlNDNkMzJhZDIwMjgxOWQ3YWU) to join our Slack workspace.
|
||||
|
||||
## Development server
|
||||
|
||||
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
|
||||
|
||||
493
package-lock.json
generated
493
package-lock.json
generated
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "fuse2",
|
||||
"version": "1.3.5",
|
||||
"version": "1.3.6",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@@ -9,76 +9,34 @@
|
||||
"resolved": "https://registry.npmjs.org/@agm/core/-/core-1.0.0-beta.2.tgz",
|
||||
"integrity": "sha512-3bdfvkWDmJszpj/F6Fzgv7sks0cs/cUEQPfs37tcJFz3jc62SsXy4TGb/WJT8FpH2nSGE6DonP8lXuFxB0lblQ=="
|
||||
},
|
||||
"@angular-devkit/build-optimizer": {
|
||||
"version": "0.0.41",
|
||||
"resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.41.tgz",
|
||||
"integrity": "sha512-TYolYpR3cb3rZGMqHBc1Q4r6SwhvuTF9sDt3gARy9Tli5R3BwY8bRA3evHQhhM0cb4AbBaJVgQYdJm5FURNn6g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"loader-utils": "1.1.0",
|
||||
"source-map": "0.5.7",
|
||||
"typescript": "2.6.2",
|
||||
"webpack-sources": "1.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"typescript": {
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz",
|
||||
"integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"@angular-devkit/core": {
|
||||
"version": "0.0.28",
|
||||
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.28.tgz",
|
||||
"integrity": "sha512-rfGRVdpx080zZq9NGZ3RNG+cmoq/ZPaCzpM4dAbosEM46ficUkwr/JKjhjZUUoSyb9ItrT1lp9C33GfE/YpSVQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ajv": "5.5.2",
|
||||
"chokidar": "1.7.0",
|
||||
"rxjs": "5.5.6",
|
||||
"source-map": "0.5.7"
|
||||
}
|
||||
},
|
||||
"@angular-devkit/schematics": {
|
||||
"version": "0.0.51",
|
||||
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.51.tgz",
|
||||
"integrity": "sha512-KGYiJpPgLqPvXeJzaHw/9JHAt8dL3EzyeYOAZ/gMKnPDA+7WypAta2n9ZuPVchY3G9p1XcqB5STJLvk7HQw3Cw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@ngtools/json-schema": "1.1.0",
|
||||
"rxjs": "5.5.6"
|
||||
}
|
||||
},
|
||||
"@angular/animations": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.1.tgz",
|
||||
"integrity": "sha512-f8viyt1xDC2NC2ap0lczw+AiL3S1WVSDOmNp3UKwA66gm+Hs9AdDX0PjpxgMR9KQY8c4P7mztNax55jj2Sbe1Q==",
|
||||
"version": "5.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.3.tgz",
|
||||
"integrity": "sha512-K9rOsRGwt7Zmp/rNdvBmgBKqvEdgCyZF0kvwxrmZfq1Zj0GAkfTAKPL007493O6XFd+icfu/+kmYeqXBGB4gKA==",
|
||||
"requires": {
|
||||
"tslib": "1.9.0"
|
||||
}
|
||||
},
|
||||
"@angular/cdk": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.1.0.tgz",
|
||||
"integrity": "sha512-xDCVx65SvxoGDMpQhaQvfP7bZhQDuX65Uk+JntPlLTiwFr7v82a+71RnzOCzNKyaNXGoIgUGcrLZpozlyqNgFg==",
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.1.1.tgz",
|
||||
"integrity": "sha512-V8kQmwf1PhtxiiE0cS1x9SW7/VFrJ7LcL9RqxUOMmJMl8kVR43dQBEeuVOOYJlGo9LAR5ctfemlJHwd9+PoHew==",
|
||||
"requires": {
|
||||
"tslib": "1.9.0"
|
||||
}
|
||||
},
|
||||
"@angular/cli": {
|
||||
"version": "1.6.5",
|
||||
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.6.5.tgz",
|
||||
"integrity": "sha512-YyGdq7rM1xduSdxviKfbd9NsYloEIeK3T+WEftsHSlViKuNQh8jIUoMzTGypjCmTieE2Gtg5BnukaxuUo1G+bQ==",
|
||||
"version": "1.6.7",
|
||||
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.6.7.tgz",
|
||||
"integrity": "sha512-TprSjnQrEdrTsCAB5K/lCLuXZUH/y+l/BAR0aZLpubpZP8Ldgmq7q56trxL5wNSs3o6A8Vh43ZKNYOuKtnzlXQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@angular-devkit/build-optimizer": "0.0.41",
|
||||
"@angular-devkit/core": "0.0.28",
|
||||
"@angular-devkit/schematics": "0.0.51",
|
||||
"@angular-devkit/build-optimizer": "0.0.42",
|
||||
"@angular-devkit/core": "0.0.29",
|
||||
"@angular-devkit/schematics": "0.0.52",
|
||||
"@ngtools/json-schema": "1.1.0",
|
||||
"@ngtools/webpack": "1.9.5",
|
||||
"@schematics/angular": "0.1.16",
|
||||
"@ngtools/webpack": "1.9.7",
|
||||
"@schematics/angular": "0.1.17",
|
||||
"autoprefixer": "7.2.5",
|
||||
"chalk": "2.2.2",
|
||||
"circular-dependency-plugin": "4.4.0",
|
||||
@@ -118,7 +76,6 @@
|
||||
"sass-loader": "6.0.6",
|
||||
"semver": "5.5.0",
|
||||
"silent-error": "1.1.0",
|
||||
"source-map-loader": "0.2.3",
|
||||
"source-map-support": "0.4.18",
|
||||
"style-loader": "0.13.2",
|
||||
"stylus": "0.54.5",
|
||||
@@ -131,28 +88,95 @@
|
||||
"webpack-merge": "4.1.1",
|
||||
"webpack-sources": "1.1.0",
|
||||
"webpack-subresource-integrity": "1.0.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@angular-devkit/build-optimizer": {
|
||||
"version": "0.0.42",
|
||||
"resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.42.tgz",
|
||||
"integrity": "sha512-BAYCVZ10ro6mgZQDZiNiVbX8ppygw4q7z/stpwG8WjMswgMRIcxsxYoC1VFuWcUPAf4UyfTIav6e8UZWA5+xnQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"loader-utils": "1.1.0",
|
||||
"source-map": "0.5.7",
|
||||
"typescript": "2.6.2",
|
||||
"webpack-sources": "1.1.0"
|
||||
}
|
||||
},
|
||||
"@angular-devkit/core": {
|
||||
"version": "0.0.29",
|
||||
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.29.tgz",
|
||||
"integrity": "sha512-jtUBA0pIrkdXcVqDmDrGlniqwM7NFOKdo7vWFDmCVLBbC9rZHeYW5Xv/+4HyBhGLJ4wxsAkUjsHKWGJINPPpiw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ajv": "5.5.2",
|
||||
"chokidar": "1.7.0",
|
||||
"rxjs": "5.5.6",
|
||||
"source-map": "0.5.7"
|
||||
}
|
||||
},
|
||||
"@angular-devkit/schematics": {
|
||||
"version": "0.0.52",
|
||||
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.52.tgz",
|
||||
"integrity": "sha512-NtG8VB5aWtg0cw1Y7EJinJMuAnXsNdkQkkVe/i7CO6TPLyFQSFQCN1YojCr43l8jTWTRebRslrBawPCMOxsOgw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@ngtools/json-schema": "1.1.0",
|
||||
"rxjs": "5.5.6"
|
||||
}
|
||||
},
|
||||
"@ngtools/webpack": {
|
||||
"version": "1.9.7",
|
||||
"resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.9.7.tgz",
|
||||
"integrity": "sha512-D5QuaT9wENeM2j9g2qvW9Ls1tGqRz26Lp+jxwb2ZGFep7Ik1fFOX3ROLfgkxNlxZGVmbxJjsfrYUCyGlzj8gWg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"chalk": "2.2.2",
|
||||
"enhanced-resolve": "3.4.1",
|
||||
"loader-utils": "1.1.0",
|
||||
"magic-string": "0.22.4",
|
||||
"semver": "5.5.0",
|
||||
"source-map": "0.5.7",
|
||||
"tree-kill": "1.2.0",
|
||||
"webpack-sources": "1.1.0"
|
||||
}
|
||||
},
|
||||
"@schematics/angular": {
|
||||
"version": "0.1.17",
|
||||
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.17.tgz",
|
||||
"integrity": "sha512-PHE5gk/ogPY/aN94dbbtauHMCq+/7w4Kdcl7tGmSS8mPKEI0wa6XJi//Wq/tHi55lb2fP58oEZU6n6w/wQascw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"typescript": "2.6.2"
|
||||
}
|
||||
},
|
||||
"typescript": {
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz",
|
||||
"integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"@angular/common": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.1.tgz",
|
||||
"integrity": "sha512-O7FA4Qpcu6GYMzlsNTHtUsAl6W0SXepP7qEMx83fC1Xje2GEtulp/99Pg6bvpFKiZYdCjJDhjbUZhIO5x0UncQ==",
|
||||
"version": "5.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.3.tgz",
|
||||
"integrity": "sha512-RwQ/IjmpDdMecTz/wwQlKpHgF4Crr8kyqV9FJ+c+cHR8Riqlu2DOXSU7LIfDdGoo6Mpixdxd1rtHYfs7l9YBSA==",
|
||||
"requires": {
|
||||
"tslib": "1.9.0"
|
||||
}
|
||||
},
|
||||
"@angular/compiler": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.1.tgz",
|
||||
"integrity": "sha512-c/HDfbDr8yDUCoVCbGHgoae3YCoWG3EuM/l7jfHflE8sbdppiFVxCRd3VkygkwfPGpUZbZaW2x/OK4Z1dQa34g==",
|
||||
"version": "5.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.3.tgz",
|
||||
"integrity": "sha512-OynSzUdEHwajQMoV2JuYq5IdiR2dlTCTAHhTLzrym85wOihvTvovEQwVhYYHyKERu85JIoaF1sXA42KIjMGfkw==",
|
||||
"requires": {
|
||||
"tslib": "1.9.0"
|
||||
}
|
||||
},
|
||||
"@angular/compiler-cli": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.1.tgz",
|
||||
"integrity": "sha512-9Yud6euknHKPQhh/noho0/xNgYeCyly0Ugkgh0306/RNLW5ngcWE876wdUweU13LJgWQ9+SHqFI5rJbsseqkZw==",
|
||||
"version": "5.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.3.tgz",
|
||||
"integrity": "sha512-uoCxeyQSd8R/cwEbd0FIUXjnbPq0HXEsyu3WSu9Ek2jt52HL+x/gZQdFCRtjW/mvQNOqxrgrTtEkhJ398+VkXg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"chokidar": "1.7.0",
|
||||
@@ -170,9 +194,9 @@
|
||||
}
|
||||
},
|
||||
"@angular/core": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.1.tgz",
|
||||
"integrity": "sha512-2kyXVl+OK/LRUisSfILkRyWiD2BGXysQkN2dwxfwYZwDciH7o8wGSlDDZw0lXIBt0Ly0stYiorIIJGVs5TffaA==",
|
||||
"version": "5.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.3.tgz",
|
||||
"integrity": "sha512-tL9O8KA6KGjnlxqjuTytpC2OeKbxe/yHev0kmwo5CK0lDZU4UFetcItAzUXU1dyRuILTcBkbnFt9+nr1SZs/cQ==",
|
||||
"requires": {
|
||||
"tslib": "1.9.0"
|
||||
}
|
||||
@@ -186,63 +210,63 @@
|
||||
}
|
||||
},
|
||||
"@angular/forms": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.1.tgz",
|
||||
"integrity": "sha512-DeTpReZcK93FBxTdXqtmuzuW5blMu4fWe7JtmDXWD9UhTw7DwRbPO+7yFRbbfSDd3UzfGfqYBqOlSOdPh9dLbg==",
|
||||
"version": "5.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.3.tgz",
|
||||
"integrity": "sha512-PsMGbj/Slvsxxyl61QSSSFDCGHN1XK6kNxVQTVmAlVhP1LlaYqBOIgQy4K9CYWUeHqU/YCdhVaFb5quzZLtPYA==",
|
||||
"requires": {
|
||||
"tslib": "1.9.0"
|
||||
}
|
||||
},
|
||||
"@angular/http": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.1.tgz",
|
||||
"integrity": "sha512-wMX7rnZcanYT2uVeqr1V9k9lduxZprVjvgetUlj6IuO7kbr22SAJN7phuubI0uAd7MUb7uDXBG8cJ00Q/NH6zw==",
|
||||
"version": "5.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.3.tgz",
|
||||
"integrity": "sha512-3kAj7YYws8J2zRu46fEXk6lYrgSK9s5YA6O4REZkLox/suK0wb6TsDIIhoMzScGctSzZESVyuWsvYMrDYCflPA==",
|
||||
"requires": {
|
||||
"tslib": "1.9.0"
|
||||
}
|
||||
},
|
||||
"@angular/language-service": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.2.1.tgz",
|
||||
"integrity": "sha512-NsPDxsIRwltuvd6GzwPyY9yfU1+kUrRv211zL+CLeDlLA5om0ifbTYTjogbhExG62aW+EVP/UkS37zHU2CFgNA==",
|
||||
"version": "5.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.2.3.tgz",
|
||||
"integrity": "sha512-yBi8i2rUdq6WgYn2J+82QxqhKsl2ldH7/8Lk4ZQDbKgTBx5LmYLpNGg3TJGnZEUGtKhu8Rd1E3SBmc4qqrGXsQ==",
|
||||
"dev": true
|
||||
},
|
||||
"@angular/material": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@angular/material/-/material-5.1.0.tgz",
|
||||
"integrity": "sha512-F+dM2xGbyWK3f+j5ZiWMOCBK1Jnv4RAlFRwezJVnzcWaAjwhO2YBHUQGZcnwsVJpwf5Vrihix8N+sWiPvVw+jw==",
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@angular/material/-/material-5.1.1.tgz",
|
||||
"integrity": "sha512-RC3xkbX35daNq4w+XBmm+Vgi16TJvLbSkw5xkdxCqLSysFx9ymwDOjUbLeHt2nJtvYWvnSjuVukdSAeaBknTFg==",
|
||||
"requires": {
|
||||
"tslib": "1.9.0"
|
||||
}
|
||||
},
|
||||
"@angular/material-moment-adapter": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-5.1.0.tgz",
|
||||
"integrity": "sha512-PVFU6fCYacMTqBM3M6s1E+9R2a0F5k83hzBgvlBIoqFJ31WGZ9LUvxYQ9gYe50UghkO3UT4Mdl6CJneWnkOVzA==",
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-5.1.1.tgz",
|
||||
"integrity": "sha512-1wpISrZOHmcC2o0tmOHX2Lt726WFUZxQs0iYe3x2yHVuxoV2W8gy0unfPkSyaZQ9v68o9xQ3DQEhSByPhr0tZg==",
|
||||
"requires": {
|
||||
"tslib": "1.9.0"
|
||||
}
|
||||
},
|
||||
"@angular/platform-browser": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.1.tgz",
|
||||
"integrity": "sha512-+cE7FM6/WIMZWpxf+LxYhfTPBbxSvLNZv5+RnGcOeg4nEG3x0Ny1dr14r5HyudvKfu/A+xTlVCNY7RjZ6HsWVw==",
|
||||
"version": "5.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.3.tgz",
|
||||
"integrity": "sha512-60LgA4KK3BufBR7vwwcn3zTYuLlfDG3jFip7bvdgsDpURrUB0j6/pL5cbGElww4jnnxZ72uJzJRzSiGEofjc3g==",
|
||||
"requires": {
|
||||
"tslib": "1.9.0"
|
||||
}
|
||||
},
|
||||
"@angular/platform-browser-dynamic": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.1.tgz",
|
||||
"integrity": "sha512-S73suoYfGIj7eQlOBXvj3BO8mW8TUUZEUZ/nvFgB/jsb6PtYk1ByIVIWjcV5yttd4TXf7ZhaEYZPm1vBjIN0pA==",
|
||||
"version": "5.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.3.tgz",
|
||||
"integrity": "sha512-PheS+KJQJiyvQg1lr+eX0/1b/rjLnDjgI1qvzwikrvGYymb2JdZ+rjllHBs1iotzQ+tG+hRnlktvgdFN134x/g==",
|
||||
"requires": {
|
||||
"tslib": "1.9.0"
|
||||
}
|
||||
},
|
||||
"@angular/router": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.1.tgz",
|
||||
"integrity": "sha512-NS8ttrfpjETfIt8Wn4oCP5KQ55UKuj6g3iG/yduoDMWel19KOINUYqz5ujL1gHha4A4Tgs1tBZKQKr0LmapTdA==",
|
||||
"version": "5.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.3.tgz",
|
||||
"integrity": "sha512-XVEpwNZta76FYas1gZSSGvkQoiGgQjvXfab6CwOh958d4c0C+9pJsykqsv6X/n8TSTShQt7wjs/vp/copXeuoA==",
|
||||
"requires": {
|
||||
"tslib": "1.9.0"
|
||||
}
|
||||
@@ -279,44 +303,11 @@
|
||||
"integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=",
|
||||
"dev": true
|
||||
},
|
||||
"@ngtools/webpack": {
|
||||
"version": "1.9.5",
|
||||
"resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.9.5.tgz",
|
||||
"integrity": "sha512-scio7dKdorM6wgFz8ELm0MDl2To9ax6a36rfmD+h6hcgSn+7dKZmSr3qUnQE1ymydyzlBwS+4IODpWqHPS9cwQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"chalk": "2.2.2",
|
||||
"enhanced-resolve": "3.4.1",
|
||||
"loader-utils": "1.1.0",
|
||||
"magic-string": "0.22.4",
|
||||
"semver": "5.5.0",
|
||||
"source-map": "0.5.7",
|
||||
"tree-kill": "1.2.0",
|
||||
"webpack-sources": "1.1.0"
|
||||
}
|
||||
},
|
||||
"@ngx-translate/core": {
|
||||
"version": "9.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-9.1.1.tgz",
|
||||
"integrity": "sha1-rhA5KINrip4Gn9Li52+iGYzH5ig="
|
||||
},
|
||||
"@schematics/angular": {
|
||||
"version": "0.1.16",
|
||||
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.16.tgz",
|
||||
"integrity": "sha512-SLzs5TmDLEO2/oU83uDw/x9jgBQTktNlO202kbawcqDKLekqgcZXnsl7UhoNdeCFOU9BE9dw07wWwuIzAhj9gQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"typescript": "2.6.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"typescript": {
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz",
|
||||
"integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"@swimlane/ngx-charts": {
|
||||
"version": "7.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@swimlane/ngx-charts/-/ngx-charts-7.0.1.tgz",
|
||||
@@ -349,9 +340,9 @@
|
||||
}
|
||||
},
|
||||
"@types/jasmine": {
|
||||
"version": "2.8.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.5.tgz",
|
||||
"integrity": "sha512-mkrHFZTgOXkZhau36K628iKFkjbp11t/bHCkY4Mefu4R6McMg2FD9P3naBv/0Ygyn4sz8baColJp2gdmSekgiw==",
|
||||
"version": "2.8.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.6.tgz",
|
||||
"integrity": "sha512-clg9raJTY0EOo5pVZKX3ZlMjlYzVU73L71q5OV1jhE2Uezb7oF94jh4CvwrW6wInquQAdhOxJz5VDF2TLUGmmA==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/jasminewd2": {
|
||||
@@ -360,7 +351,7 @@
|
||||
"integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/jasmine": "2.8.5"
|
||||
"@types/jasmine": "2.8.6"
|
||||
}
|
||||
},
|
||||
"@types/node": {
|
||||
@@ -569,15 +560,22 @@
|
||||
}
|
||||
},
|
||||
"angular-calendar": {
|
||||
"version": "0.23.2",
|
||||
"resolved": "https://registry.npmjs.org/angular-calendar/-/angular-calendar-0.23.2.tgz",
|
||||
"integrity": "sha512-Ai6dDg0UfW1h0PcioIwgBwvKNcUwrA5e91P3lDDhVdIPe6E1SAcCAYT+zgxjMnCKFkhA5CozSxCwAJJgumBGIw==",
|
||||
"version": "0.23.3",
|
||||
"resolved": "https://registry.npmjs.org/angular-calendar/-/angular-calendar-0.23.3.tgz",
|
||||
"integrity": "sha512-MMUb4e6XmFJVv2FPqAdLlQWDtoklVxQ0wxeaZstwaUXXpzQ3sHFMMBhHADZcYcRkGDQsgoK39+sONeJB7RPvvg==",
|
||||
"requires": {
|
||||
"angular-draggable-droppable": "2.0.0",
|
||||
"angular-resizable-element": "2.0.0",
|
||||
"calendar-utils": "0.1.0",
|
||||
"calendar-utils": "0.1.1",
|
||||
"date-fns": "1.29.0",
|
||||
"positioning": "1.3.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"calendar-utils": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/calendar-utils/-/calendar-utils-0.1.1.tgz",
|
||||
"integrity": "sha512-75JPgUK7l7OTg4ZptJMuuIoQzLndc4tcGhBCFtEONr0AMlD7zFVZthOC6Sf29K8r81A1+BJ/tDIFlElgY4XFFw=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"angular-draggable-droppable": {
|
||||
@@ -586,9 +584,9 @@
|
||||
"integrity": "sha512-/b8LIGamjOKnDI2uG1jRUErTIHeQ3w2WqHn4cbeiUTy+6eNHjkQI32DNhvxl0nVxr2gF5QluECNB4uWjMMyzQg=="
|
||||
},
|
||||
"angular-in-memory-web-api": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/angular-in-memory-web-api/-/angular-in-memory-web-api-0.5.2.tgz",
|
||||
"integrity": "sha1-/y6mZqv9BN19FslT7JcuExigmCQ="
|
||||
"version": "0.5.3",
|
||||
"resolved": "https://registry.npmjs.org/angular-in-memory-web-api/-/angular-in-memory-web-api-0.5.3.tgz",
|
||||
"integrity": "sha512-1QPwwXG8R/2s7EbHh13HDiJYsk4sdBHNxHJHZHJ/Kxb4T9OG+bb1kGcXzY9UrJkEVxOtUW0ozvL4p/HmeIEszg=="
|
||||
},
|
||||
"angular-resizable-element": {
|
||||
"version": "2.0.0",
|
||||
@@ -1123,6 +1121,17 @@
|
||||
"callsite": "1.0.0"
|
||||
}
|
||||
},
|
||||
"bfj-node4": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/bfj-node4/-/bfj-node4-5.2.0.tgz",
|
||||
"integrity": "sha512-shYA6rXr1mlAzJT8R96TscvicMyV9GJTMDFRii9HlgxLXT7HD3aDfsEHkQzIHYghh4jLI3+oouXDHqI+pnR3zA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"bluebird": "3.5.1",
|
||||
"check-types": "7.3.0",
|
||||
"tryer": "1.0.0"
|
||||
}
|
||||
},
|
||||
"big.js": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
|
||||
@@ -1641,11 +1650,6 @@
|
||||
"integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=",
|
||||
"dev": true
|
||||
},
|
||||
"calendar-utils": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/calendar-utils/-/calendar-utils-0.1.0.tgz",
|
||||
"integrity": "sha512-vWAp4m2I2PV9nrizBoACsXQ2GJiQVlc9EDOEPpzG6vRrTkQ4NCttUhglnQioMMXF8NYM+kJyjZGF1mRk/SSESQ=="
|
||||
},
|
||||
"callsite": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
|
||||
@@ -1749,6 +1753,52 @@
|
||||
"supports-color": "4.5.0"
|
||||
}
|
||||
},
|
||||
"chart.js": {
|
||||
"version": "2.7.1",
|
||||
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.7.1.tgz",
|
||||
"integrity": "sha512-pX1oQAY86MiuyZ2hY593Acbl4MLHKrBBhhmZ1YqSadzQbbsBE2rnd6WISoHjIsdf0WDeC0hbePYCz2ZxkV8L+g==",
|
||||
"requires": {
|
||||
"chartjs-color": "2.2.0",
|
||||
"moment": "2.18.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"moment": {
|
||||
"version": "2.18.1",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz",
|
||||
"integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8="
|
||||
}
|
||||
}
|
||||
},
|
||||
"chartjs-color": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.2.0.tgz",
|
||||
"integrity": "sha1-hKL7dVeH7YXDndbdjHsdiEKbrq4=",
|
||||
"requires": {
|
||||
"chartjs-color-string": "0.5.0",
|
||||
"color-convert": "0.5.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"color-convert": {
|
||||
"version": "0.5.3",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz",
|
||||
"integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0="
|
||||
}
|
||||
}
|
||||
},
|
||||
"chartjs-color-string": {
|
||||
"version": "0.5.0",
|
||||
"resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.5.0.tgz",
|
||||
"integrity": "sha512-amWNvCOXlOUYxZVDSa0YOab5K/lmEhbFNKI55PWc4mlv28BDzA7zaoQTGxSBgJMHIW+hGX8YUrvw/FH4LyhwSQ==",
|
||||
"requires": {
|
||||
"color-name": "1.1.3"
|
||||
}
|
||||
},
|
||||
"check-types": {
|
||||
"version": "7.3.0",
|
||||
"resolved": "https://registry.npmjs.org/check-types/-/check-types-7.3.0.tgz",
|
||||
"integrity": "sha1-Ro9XGkQ1wkJI9f0MsOjYfDw0Hn0=",
|
||||
"dev": true
|
||||
},
|
||||
"chokidar": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
|
||||
@@ -2049,8 +2099,7 @@
|
||||
"color-name": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
|
||||
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
|
||||
"dev": true
|
||||
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
|
||||
},
|
||||
"color-string": {
|
||||
"version": "0.3.0",
|
||||
@@ -2789,9 +2838,9 @@
|
||||
}
|
||||
},
|
||||
"d3": {
|
||||
"version": "4.12.2",
|
||||
"resolved": "https://registry.npmjs.org/d3/-/d3-4.12.2.tgz",
|
||||
"integrity": "sha512-aKAlpgTmpuGeEpezB+GvPpX1x+gCMs/PHpuse6sCpkgw4Un3ZeqUobIc87eIy9adcl+wxPAnEyKyO5oulH3MOw==",
|
||||
"version": "4.13.0",
|
||||
"resolved": "https://registry.npmjs.org/d3/-/d3-4.13.0.tgz",
|
||||
"integrity": "sha512-l8c4+0SldjVKLaE2WG++EQlqD7mh/dmQjvi2L2lKPadAVC+TbJC4ci7Uk9bRi+To0+ansgsS0iWfPjD7DBy+FQ==",
|
||||
"requires": {
|
||||
"d3-array": "1.2.1",
|
||||
"d3-axis": "1.0.8",
|
||||
@@ -2804,7 +2853,7 @@
|
||||
"d3-dsv": "1.0.8",
|
||||
"d3-ease": "1.0.3",
|
||||
"d3-force": "1.1.0",
|
||||
"d3-format": "1.2.1",
|
||||
"d3-format": "1.2.2",
|
||||
"d3-geo": "1.9.1",
|
||||
"d3-hierarchy": "1.1.5",
|
||||
"d3-interpolate": "1.1.6",
|
||||
@@ -2815,7 +2864,7 @@
|
||||
"d3-random": "1.1.0",
|
||||
"d3-request": "1.0.6",
|
||||
"d3-scale": "1.0.7",
|
||||
"d3-selection": "1.2.0",
|
||||
"d3-selection": "1.3.0",
|
||||
"d3-shape": "1.2.0",
|
||||
"d3-time": "1.0.8",
|
||||
"d3-time-format": "2.1.1",
|
||||
@@ -2825,10 +2874,10 @@
|
||||
"d3-zoom": "1.7.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"d3-format": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.1.tgz",
|
||||
"integrity": "sha512-U4zRVLDXW61bmqoo+OJ/V687e1T5nVd3TAKAJKgtpZ/P1JsMgyod0y9br+mlQOryTAACdiXI3wCjuERHFNp91w=="
|
||||
"d3-selection": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.0.tgz",
|
||||
"integrity": "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA=="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -5466,15 +5515,6 @@
|
||||
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
|
||||
"dev": true
|
||||
},
|
||||
"gzip-size": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz",
|
||||
"integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"duplexer": "0.1.1"
|
||||
}
|
||||
},
|
||||
"hammerjs": {
|
||||
"version": "2.0.8",
|
||||
"resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz",
|
||||
@@ -6992,19 +7032,10 @@
|
||||
"which": "1.3.0"
|
||||
}
|
||||
},
|
||||
"karma-cli": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz",
|
||||
"integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"resolve": "1.5.0"
|
||||
}
|
||||
},
|
||||
"karma-coverage-istanbul-reporter": {
|
||||
"version": "1.3.3",
|
||||
"resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.3.3.tgz",
|
||||
"integrity": "sha512-MFkB6bh11J8nKygUdqyHb9sMz17XoBRYR4tiNxnSpi/UtDk0wk8eRGa0jRSJaILgCl4xyq1TL6Jidww1OWly/Q==",
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.1.tgz",
|
||||
"integrity": "sha512-5og0toMjgLvsL9+TzGH4Rk1D0nr7pMIRJBg29xP4mHMKy/1KUJ12UzoqI6mBNCRFa4nDvZS2MRrN7p+RkZNWxQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"istanbul-api": "1.2.1",
|
||||
@@ -8012,18 +8043,26 @@
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"ng2-charts": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-1.6.0.tgz",
|
||||
"integrity": "sha512-9w0WH69x5/nuqC1og2WaY39NbaBqTGIP1+5gZaH7/KPN6UEPonNg/pYnsIVklLj1DWPWXKa8+XXIJZ1jy5nLxg==",
|
||||
"requires": {
|
||||
"chart.js": "2.7.1"
|
||||
}
|
||||
},
|
||||
"ngrx-store-freeze": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/ngrx-store-freeze/-/ngrx-store-freeze-0.2.0.tgz",
|
||||
"integrity": "sha1-dMIxlHu+GTivci9qcmJNxpeI058=",
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/ngrx-store-freeze/-/ngrx-store-freeze-0.2.1.tgz",
|
||||
"integrity": "sha512-nQZJoyR03OqGR0dWWqIJgzkMj+99xnFgIY35Z5UXVhLEIfvk4HjuQ/iIeQU1dLHmZ8NnUDRFcrEthCSvE4eAWQ==",
|
||||
"requires": {
|
||||
"deep-freeze-strict": "1.1.1"
|
||||
}
|
||||
},
|
||||
"ngx-color-picker": {
|
||||
"version": "5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ngx-color-picker/-/ngx-color-picker-5.3.0.tgz",
|
||||
"integrity": "sha512-9pSkVg5UhXiqyclERCSRHqQiPMHl6fHnmZQwQ2tSNfeGSKX2Ykt55cLbQWo6++XgJORTUyI6z+k7fD1KGPZAmA=="
|
||||
"version": "5.3.1",
|
||||
"resolved": "https://registry.npmjs.org/ngx-color-picker/-/ngx-color-picker-5.3.1.tgz",
|
||||
"integrity": "sha512-03rrkv718RbeuHfEpr6PHnRy8xI2ncg0i3fW6jBPfNoHZQLDXh+7bY7xcdDKc9m52OtsPkvhriEwXbuY4EeckQ=="
|
||||
},
|
||||
"ngx-cookie-service": {
|
||||
"version": "1.0.10",
|
||||
@@ -10929,9 +10968,9 @@
|
||||
}
|
||||
},
|
||||
"prismjs": {
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.10.0.tgz",
|
||||
"integrity": "sha1-d+UYfCrmsyU/zDEwKc8l/lN3hyE=",
|
||||
"version": "1.11.0",
|
||||
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.11.0.tgz",
|
||||
"integrity": "sha1-KXrvM+t5Qhv9sZJzpQkspRWXDSk=",
|
||||
"requires": {
|
||||
"clipboard": "1.7.1"
|
||||
}
|
||||
@@ -12399,37 +12438,6 @@
|
||||
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
|
||||
"dev": true
|
||||
},
|
||||
"source-map-loader": {
|
||||
"version": "0.2.3",
|
||||
"resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.3.tgz",
|
||||
"integrity": "sha512-MYbFX9DYxmTQFfy2v8FC1XZwpwHKYxg3SK8Wb7VPBKuhDjz8gi9re2819MsG4p49HDyiOSUKlmZ+nQBArW5CGw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"async": "2.6.0",
|
||||
"loader-utils": "0.2.17",
|
||||
"source-map": "0.6.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"loader-utils": {
|
||||
"version": "0.2.17",
|
||||
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
|
||||
"integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"big.js": "3.2.0",
|
||||
"emojis-list": "2.1.0",
|
||||
"json5": "0.5.1",
|
||||
"object-assign": "4.1.1"
|
||||
}
|
||||
},
|
||||
"source-map": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"source-map-resolve": {
|
||||
"version": "0.5.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
|
||||
@@ -13227,6 +13235,12 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"tryer": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.0.tgz",
|
||||
"integrity": "sha1-Antp+oIyJeVRys4+8DsR9qs3wdc=",
|
||||
"dev": true
|
||||
},
|
||||
"ts-node": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz",
|
||||
@@ -13421,9 +13435,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"typescript": {
|
||||
"version": "2.5.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz",
|
||||
"integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==",
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz",
|
||||
"integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=",
|
||||
"dev": true
|
||||
},
|
||||
"uglify-js": {
|
||||
@@ -14280,48 +14294,45 @@
|
||||
}
|
||||
},
|
||||
"webpack-bundle-analyzer": {
|
||||
"version": "2.9.2",
|
||||
"resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.9.2.tgz",
|
||||
"integrity": "sha1-Y+2G63HMTNqG9o5oWoRTC6ASZEk=",
|
||||
"version": "2.10.0",
|
||||
"resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.10.0.tgz",
|
||||
"integrity": "sha512-eA/9F/ZLFlVXfCLYqefHFbelJ3JcvyeFdmpAG6Vu3iJNcisj3KWNPqu00lCqK9caeaesipVrGb9alUSi2lEvAg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"acorn": "5.3.0",
|
||||
"chalk": "1.1.3",
|
||||
"bfj-node4": "5.2.0",
|
||||
"chalk": "2.3.0",
|
||||
"commander": "2.13.0",
|
||||
"ejs": "2.5.7",
|
||||
"express": "4.16.2",
|
||||
"filesize": "3.5.11",
|
||||
"gzip-size": "3.0.0",
|
||||
"gzip-size": "4.1.0",
|
||||
"lodash": "4.17.4",
|
||||
"mkdirp": "0.5.1",
|
||||
"opener": "1.4.3",
|
||||
"ws": "4.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"ansi-styles": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
|
||||
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
|
||||
"dev": true
|
||||
},
|
||||
"chalk": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
|
||||
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
|
||||
"integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ansi-styles": "2.2.1",
|
||||
"ansi-styles": "3.2.0",
|
||||
"escape-string-regexp": "1.0.5",
|
||||
"has-ansi": "2.0.0",
|
||||
"strip-ansi": "3.0.1",
|
||||
"supports-color": "2.0.0"
|
||||
"supports-color": "4.5.0"
|
||||
}
|
||||
},
|
||||
"supports-color": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
|
||||
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
|
||||
"dev": true
|
||||
"gzip-size": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz",
|
||||
"integrity": "sha1-iuCWJX6r59acRb4rZ8RIEk/7UXw=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"duplexer": "0.1.1",
|
||||
"pify": "3.0.0"
|
||||
}
|
||||
},
|
||||
"ws": {
|
||||
"version": "4.0.0",
|
||||
|
||||
55
package.json
55
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "fuse2",
|
||||
"version": "1.3.5",
|
||||
"version": "1.3.6",
|
||||
"license": "https://themeforest.net/licenses/terms/regular",
|
||||
"scripts": {
|
||||
"ng": "ng",
|
||||
@@ -19,19 +19,19 @@
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@agm/core": "1.0.0-beta.2",
|
||||
"@angular/animations": "5.2.1",
|
||||
"@angular/cdk": "5.1.0",
|
||||
"@angular/common": "5.2.1",
|
||||
"@angular/compiler": "5.2.1",
|
||||
"@angular/core": "5.2.1",
|
||||
"@angular/animations": "5.2.3",
|
||||
"@angular/cdk": "5.1.1",
|
||||
"@angular/common": "5.2.3",
|
||||
"@angular/compiler": "5.2.3",
|
||||
"@angular/core": "5.2.3",
|
||||
"@angular/flex-layout": "2.0.0-beta.12",
|
||||
"@angular/forms": "5.2.1",
|
||||
"@angular/http": "5.2.1",
|
||||
"@angular/material": "5.1.0",
|
||||
"@angular/material-moment-adapter": "5.1.0",
|
||||
"@angular/platform-browser": "5.2.1",
|
||||
"@angular/platform-browser-dynamic": "5.2.1",
|
||||
"@angular/router": "5.2.1",
|
||||
"@angular/forms": "5.2.3",
|
||||
"@angular/http": "5.2.3",
|
||||
"@angular/material": "5.1.1",
|
||||
"@angular/material-moment-adapter": "5.1.1",
|
||||
"@angular/platform-browser": "5.2.3",
|
||||
"@angular/platform-browser-dynamic": "5.2.3",
|
||||
"@angular/router": "5.2.3",
|
||||
"@ngrx/effects": "5.0.0",
|
||||
"@ngrx/router-store": "5.0.0",
|
||||
"@ngrx/store": "5.0.0",
|
||||
@@ -41,29 +41,31 @@
|
||||
"@swimlane/ngx-datatable": "11.1.7",
|
||||
"@swimlane/ngx-dnd": "3.1.0",
|
||||
"@types/prismjs": "1.9.0",
|
||||
"angular-calendar": "0.23.2",
|
||||
"angular-in-memory-web-api": "0.5.2",
|
||||
"angular-calendar": "0.23.3",
|
||||
"angular-in-memory-web-api": "0.5.3",
|
||||
"chart.js": "2.7.1",
|
||||
"classlist.js": "1.1.20150312",
|
||||
"core-js": "2.5.3",
|
||||
"d3": "4.12.2",
|
||||
"d3": "4.13.0",
|
||||
"hammerjs": "2.0.8",
|
||||
"intl": "1.2.5",
|
||||
"moment": "2.20.1",
|
||||
"ngrx-store-freeze": "0.2.0",
|
||||
"ngx-color-picker": "5.3.0",
|
||||
"ng2-charts": "1.6.0",
|
||||
"ngrx-store-freeze": "0.2.1",
|
||||
"ngx-color-picker": "5.3.1",
|
||||
"ngx-cookie-service": "1.0.10",
|
||||
"perfect-scrollbar": "1.3.0",
|
||||
"prismjs": "1.10.0",
|
||||
"prismjs": "1.11.0",
|
||||
"rxjs": "5.5.6",
|
||||
"web-animations-js": "2.3.1",
|
||||
"zone.js": "0.8.20"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular/cli": "1.6.5",
|
||||
"@angular/compiler-cli": "5.2.1",
|
||||
"@angular/language-service": "5.2.1",
|
||||
"@angular/cli": "1.6.7",
|
||||
"@angular/compiler-cli": "5.2.3",
|
||||
"@angular/language-service": "5.2.3",
|
||||
"@angularclass/hmr": "2.1.3",
|
||||
"@types/jasmine": "2.8.5",
|
||||
"@types/jasmine": "2.8.6",
|
||||
"@types/jasminewd2": "2.0.3",
|
||||
"@types/node": "6.0.96",
|
||||
"codelyzer": "4.1.0",
|
||||
@@ -71,14 +73,13 @@
|
||||
"jasmine-spec-reporter": "4.2.1",
|
||||
"karma": "2.0.0",
|
||||
"karma-chrome-launcher": "2.2.0",
|
||||
"karma-cli": "1.0.1",
|
||||
"karma-coverage-istanbul-reporter": "1.3.3",
|
||||
"karma-coverage-istanbul-reporter": "1.4.1",
|
||||
"karma-jasmine": "1.1.1",
|
||||
"karma-jasmine-html-reporter": "0.2.2",
|
||||
"protractor": "5.1.2",
|
||||
"ts-node": "4.1.0",
|
||||
"tslint": "5.9.1",
|
||||
"typescript": "2.5.3",
|
||||
"webpack-bundle-analyzer": "2.9.2"
|
||||
"typescript": "2.6.2",
|
||||
"webpack-bundle-analyzer": "2.10.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ const appRoutes: Routes = [
|
||||
},
|
||||
{
|
||||
path : '**',
|
||||
redirectTo: 'apps/dashboards/project'
|
||||
redirectTo: 'apps/dashboards/analytics'
|
||||
}
|
||||
];
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ import { FuseMaterialColorPickerComponent } from '../components/material-color-p
|
||||
import { FuseTranslationLoaderService } from '../services/translation-loader.service';
|
||||
import { CookieService } from 'ngx-cookie-service';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { ChartsModule } from 'ng2-charts';
|
||||
|
||||
@NgModule({
|
||||
declarations : [
|
||||
@@ -43,7 +44,8 @@ import { TranslateModule } from '@ngx-translate/core';
|
||||
ReactiveFormsModule,
|
||||
ColorPickerModule,
|
||||
NgxDnDModule,
|
||||
NgxDatatableModule
|
||||
NgxDatatableModule,
|
||||
ChartsModule
|
||||
],
|
||||
exports : [
|
||||
FlexLayoutModule,
|
||||
@@ -62,7 +64,8 @@ import { TranslateModule } from '@ngx-translate/core';
|
||||
NgxDatatableModule,
|
||||
FuseIfOnDomDirective,
|
||||
FuseMaterialColorPickerComponent,
|
||||
TranslateModule
|
||||
TranslateModule,
|
||||
ChartsModule
|
||||
],
|
||||
entryComponents: [
|
||||
FuseConfirmDialogComponent
|
||||
|
||||
@@ -9,6 +9,11 @@
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
&.auto-width {
|
||||
min-width: 0;
|
||||
max-width: none;
|
||||
}
|
||||
|
||||
// Buttons
|
||||
.mat-button {
|
||||
min-width: 0 !important;
|
||||
|
||||
@@ -215,4 +215,31 @@ $border-style: 1px solid rgba(0, 0, 0, 0.12);
|
||||
// ######################
|
||||
.border-radius-100 {
|
||||
border-radius: 100%;
|
||||
}
|
||||
|
||||
.border-radius-2 {
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.border-radius-4 {
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.border-radius-8 {
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.border-radius-16 {
|
||||
border-radius: 16px;
|
||||
}
|
||||
|
||||
// ######################
|
||||
// CURSOR HELPERS
|
||||
// ######################
|
||||
.cursor-pointer {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.cursor-default {
|
||||
cursor: default;
|
||||
}
|
||||
@@ -15,18 +15,27 @@ export class FuseSplashScreenService
|
||||
private router: Router
|
||||
)
|
||||
{
|
||||
// Get the splash screen element
|
||||
this.splashScreenEl = this.document.body.querySelector('#fuse-splash-screen');
|
||||
|
||||
const hideOnLoad = this.router.events.subscribe((event) => {
|
||||
if ( event instanceof NavigationEnd )
|
||||
{
|
||||
setTimeout(() => {
|
||||
this.hide();
|
||||
hideOnLoad.unsubscribe();
|
||||
}, 0);
|
||||
// If the splash screen element exists...
|
||||
if ( this.splashScreenEl )
|
||||
{
|
||||
// Hide it on the first NavigationEnd event
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
show()
|
||||
|
||||
602
src/app/fuse-fake-db/dashboard-analytics.ts
Normal file
602
src/app/fuse-fake-db/dashboard-analytics.ts
Normal file
@@ -0,0 +1,602 @@
|
||||
export class AnalyticsDashboardDb
|
||||
{
|
||||
public static widgets = {
|
||||
widget1: {
|
||||
chartType: 'line',
|
||||
datasets : {
|
||||
'2015': [
|
||||
{
|
||||
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'
|
||||
|
||||
}
|
||||
],
|
||||
'2016': [
|
||||
{
|
||||
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'
|
||||
|
||||
}
|
||||
],
|
||||
'2017': [
|
||||
{
|
||||
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
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
export class ProjectsDashboardDb
|
||||
export class ProjectDashboardDb
|
||||
{
|
||||
public static projects = [
|
||||
{
|
||||
@@ -1,62 +1,97 @@
|
||||
import { InMemoryDbService } from 'angular-in-memory-web-api';
|
||||
|
||||
import { MailFakeDb } from './mail';
|
||||
import { ChatFakeDb } from './chat';
|
||||
import { ProjectDashboardDb } from './dashboard-project';
|
||||
import { AnalyticsDashboardDb } from './dashboard-analytics';
|
||||
import { CalendarFakeDb } from './calendar';
|
||||
import { TodoFakeDb } from './todo';
|
||||
import { ProfileFakeDb } from './profile';
|
||||
import { ContactsFakeDb } from './contacts';
|
||||
import { InvoiceFakeDb } from './invoice';
|
||||
import { FileManagerFakeDb } from './file-manager';
|
||||
import { SearchFakeDb } from './search';
|
||||
import { QuickPanelFakeDb } from './quick-panel';
|
||||
import { IconsFakeDb } from './icons';
|
||||
import { ProjectsDashboardDb } from './projects-dashboard';
|
||||
import { ScrumboardFakeDb } from './scrumboard';
|
||||
import { FaqFakeDb } from './faq';
|
||||
import { KnowledgeBaseFakeDb } from './knowledge-base';
|
||||
import { ECommerceFakeDb } from './e-commerce';
|
||||
import { AcademyFakeDb } from './academy';
|
||||
import { MailFakeDb } from './mail';
|
||||
import { ChatFakeDb } from './chat';
|
||||
import { FileManagerFakeDb } from './file-manager';
|
||||
import { ContactsFakeDb } from './contacts';
|
||||
import { TodoFakeDb } from './todo';
|
||||
import { ScrumboardFakeDb } from './scrumboard';
|
||||
import { InvoiceFakeDb } from './invoice';
|
||||
import { ProfileFakeDb } from './profile';
|
||||
import { SearchFakeDb } from './search';
|
||||
import { FaqFakeDb } from './faq';
|
||||
import { KnowledgeBaseFakeDb } from './knowledge-base';
|
||||
import { IconsFakeDb } from './icons';
|
||||
import { QuickPanelFakeDb } from './quick-panel';
|
||||
|
||||
export class FuseFakeDbService implements InMemoryDbService
|
||||
{
|
||||
createDb()
|
||||
{
|
||||
return {
|
||||
'mail-mails' : MailFakeDb.mails,
|
||||
'mail-folders' : MailFakeDb.folders,
|
||||
'mail-filters' : MailFakeDb.filters,
|
||||
'mail-labels' : MailFakeDb.labels,
|
||||
'chat-contacts' : ChatFakeDb.contacts,
|
||||
'chat-chats' : ChatFakeDb.chats,
|
||||
'chat-user' : ChatFakeDb.user,
|
||||
'calendar' : CalendarFakeDb.data,
|
||||
'todo-todos' : TodoFakeDb.todos,
|
||||
'todo-filters' : TodoFakeDb.filters,
|
||||
'todo-tags' : TodoFakeDb.tags,
|
||||
'profile-timeline' : ProfileFakeDb.timeline,
|
||||
'profile-photos-videos' : ProfileFakeDb.photosVideos,
|
||||
'profile-about' : ProfileFakeDb.about,
|
||||
'contacts-contacts' : ContactsFakeDb.contacts,
|
||||
'contacts-user' : ContactsFakeDb.user,
|
||||
'invoice' : InvoiceFakeDb.invoice,
|
||||
'file-manager' : FileManagerFakeDb.files,
|
||||
'search-classic' : SearchFakeDb.classic,
|
||||
'search-table' : SearchFakeDb.table,
|
||||
'quick-panel-notes' : QuickPanelFakeDb.notes,
|
||||
'quick-panel-events' : QuickPanelFakeDb.events,
|
||||
'icons' : IconsFakeDb.icons,
|
||||
'projects-dashboard-projects': ProjectsDashboardDb.projects,
|
||||
'projects-dashboard-widgets' : ProjectsDashboardDb.widgets,
|
||||
'scrumboard-boards' : ScrumboardFakeDb.boards,
|
||||
'faq' : FaqFakeDb.data,
|
||||
'knowledge-base' : KnowledgeBaseFakeDb.data,
|
||||
'e-commerce-dashboard' : ECommerceFakeDb.dashboard,
|
||||
'e-commerce-products' : ECommerceFakeDb.products,
|
||||
'e-commerce-orders' : ECommerceFakeDb.orders,
|
||||
'academy-categories' : AcademyFakeDb.categories,
|
||||
'academy-courses' : AcademyFakeDb.courses,
|
||||
'academy-course' : AcademyFakeDb.course
|
||||
// Dashboards
|
||||
'project-dashboard-projects' : ProjectDashboardDb.projects,
|
||||
'project-dashboard-widgets' : ProjectDashboardDb.widgets,
|
||||
'analytics-dashboard-widgets': AnalyticsDashboardDb.widgets,
|
||||
|
||||
// Calendar
|
||||
'calendar': CalendarFakeDb.data,
|
||||
|
||||
// E-Commerce
|
||||
'e-commerce-dashboard': ECommerceFakeDb.dashboard,
|
||||
'e-commerce-products' : ECommerceFakeDb.products,
|
||||
'e-commerce-orders' : ECommerceFakeDb.orders,
|
||||
|
||||
// Academy
|
||||
'academy-categories': AcademyFakeDb.categories,
|
||||
'academy-courses' : AcademyFakeDb.courses,
|
||||
'academy-course' : AcademyFakeDb.course,
|
||||
|
||||
// Mail
|
||||
'mail-mails' : MailFakeDb.mails,
|
||||
'mail-folders': MailFakeDb.folders,
|
||||
'mail-filters': MailFakeDb.filters,
|
||||
'mail-labels' : MailFakeDb.labels,
|
||||
|
||||
// Chat
|
||||
'chat-contacts': ChatFakeDb.contacts,
|
||||
'chat-chats' : ChatFakeDb.chats,
|
||||
'chat-user' : ChatFakeDb.user,
|
||||
|
||||
// File Manager
|
||||
'file-manager': FileManagerFakeDb.files,
|
||||
|
||||
// Contacts
|
||||
'contacts-contacts': ContactsFakeDb.contacts,
|
||||
'contacts-user' : ContactsFakeDb.user,
|
||||
|
||||
// Todo
|
||||
'todo-todos' : TodoFakeDb.todos,
|
||||
'todo-filters': TodoFakeDb.filters,
|
||||
'todo-tags' : TodoFakeDb.tags,
|
||||
|
||||
// Scrumboard
|
||||
'scrumboard-boards': ScrumboardFakeDb.boards,
|
||||
|
||||
// Invoice
|
||||
'invoice': InvoiceFakeDb.invoice,
|
||||
|
||||
// Profile
|
||||
'profile-timeline' : ProfileFakeDb.timeline,
|
||||
'profile-photos-videos': ProfileFakeDb.photosVideos,
|
||||
'profile-about' : ProfileFakeDb.about,
|
||||
|
||||
// Search
|
||||
'search-classic': SearchFakeDb.classic,
|
||||
'search-table' : SearchFakeDb.table,
|
||||
|
||||
// FAQ
|
||||
'faq': FaqFakeDb.data,
|
||||
|
||||
// Knowledge base
|
||||
'knowledge-base': KnowledgeBaseFakeDb.data,
|
||||
|
||||
// Icons
|
||||
'icons': IconsFakeDb.icons,
|
||||
|
||||
// Quick Panel
|
||||
'quick-panel-notes' : QuickPanelFakeDb.notes,
|
||||
'quick-panel-events': QuickPanelFakeDb.events
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,10 @@ const routes = [
|
||||
path : 'dashboards/project',
|
||||
loadChildren: './dashboards/project/project.module#FuseProjectDashboardModule'
|
||||
},
|
||||
{
|
||||
path : 'dashboards/analytics',
|
||||
loadChildren: './dashboards/analytics/analytics.module#FuseAnalyticsDashboardModule'
|
||||
},
|
||||
{
|
||||
path : 'mail',
|
||||
loadChildren: './mail/mail.module#FuseMailModule'
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { Component, OnDestroy, OnInit } from '@angular/core';
|
||||
import { ChatService } from '../../../chat.service';
|
||||
import { FormControl, FormGroup } from '@angular/forms';
|
||||
import 'rxjs/add/operator/debounceTime';
|
||||
import 'rxjs/add/operator/distinctUntilChanged';
|
||||
|
||||
@Component({
|
||||
|
||||
@@ -4,6 +4,7 @@ import { fuseAnimations } from '../../../../core/animations';
|
||||
import { FormControl, FormGroup } from '@angular/forms';
|
||||
import { FuseContactsContactFormDialogComponent } from './contact-form/contact-form.component';
|
||||
import { MatDialog } from '@angular/material';
|
||||
import 'rxjs/add/operator/debounceTime';
|
||||
import 'rxjs/add/operator/distinctUntilChanged';
|
||||
import { Subscription } from 'rxjs/Subscription';
|
||||
|
||||
|
||||
@@ -0,0 +1,510 @@
|
||||
<div id="dashboard-analytics" class="page-layout blank grey-100-bg" fusePerfectScrollbar>
|
||||
|
||||
<div class="main-widget">
|
||||
|
||||
<div class="position-relative p-24 mat-blue-600-bg"
|
||||
fxLayout="row" fxLayoutAlign="space-between center">
|
||||
<div fxLayout="column" fxLayoutAlign="start start">
|
||||
<span class="h2">Visitors</span>
|
||||
<span class="h5 secondary-text">Unique visitors by month</span>
|
||||
</div>
|
||||
<div fxLayout="row" fxLayoutAlign="start center">
|
||||
<div class="py-8 px-12 border-radius-2 line-height-1 mr-8 cursor-pointer"
|
||||
(click)="widget1SelectedYear = '2015'"
|
||||
[ngClass]="{'blue-300-bg': widget1SelectedYear === '2015'}">
|
||||
2015
|
||||
</div>
|
||||
<div class="py-8 px-12 border-radius-2 line-height-1 mr-8 cursor-pointer"
|
||||
(click)="widget1SelectedYear = '2016'"
|
||||
[ngClass]="{'blue-300-bg': widget1SelectedYear === '2016'}">
|
||||
2016
|
||||
</div>
|
||||
<div class="py-8 px-12 border-radius-2 line-height-1 cursor-pointer"
|
||||
(click)="widget1SelectedYear = '2017'"
|
||||
[ngClass]="{'blue-300-bg': widget1SelectedYear === '2017'}">
|
||||
2017
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="position-relative h-256 pb-16 mat-blue-600-bg">
|
||||
<canvas baseChart
|
||||
[datasets]="widgets.widget1.datasets[widget1SelectedYear]"
|
||||
[labels]="widgets.widget1.labels"
|
||||
[colors]="widgets.widget1.colors"
|
||||
[options]="widgets.widget1.options"
|
||||
[chartType]="widgets.widget1.chartType">
|
||||
</canvas>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="content">
|
||||
|
||||
<div class="left mr-32">
|
||||
|
||||
<div class="pb-24 font-size-18 font-weight-300">
|
||||
How are your active users trending over time?
|
||||
</div>
|
||||
|
||||
<div fxLayout="column" fxLayoutAlign="start"
|
||||
fxLayout.gt-sm="row" fxLayoutAlign.gt-sm="start start">
|
||||
|
||||
<!-- Widget 2 -->
|
||||
<div class="widget" fxFlex="100" fxFlex.gt-sm="33">
|
||||
|
||||
<div class="fuse-card auto-width mb-32" [ngClass.gt-sm]="'mb-0 mr-32'">
|
||||
|
||||
<div class="p-16 pb-0" fxLayout="row" fxLayoutAlign="start end" fxLayoutWrap>
|
||||
|
||||
<div class="pr-16">
|
||||
<div class="h3 secondary-text">Conversion</div>
|
||||
<div class="font-size-54 font-weight-300 line-height-1 mt-8">
|
||||
{{widgets.widget2.conversion.value}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="py-4 font-size-16" fxLayout="row" fxLayoutAlign="start center">
|
||||
<div fxFlex="row" fxLayoutAlign="start center" class="green-fg"
|
||||
*ngIf="widgets.widget2.conversion.ofTarget > 0">
|
||||
<mat-icon class="green-fg mr-4">trending_up</mat-icon>
|
||||
<span>{{widgets.widget2.conversion.ofTarget}}%</span>
|
||||
</div>
|
||||
<div fxFlex="row" fxLayoutAlign="start center" class="red-fg"
|
||||
*ngIf="widgets.widget2.conversion.ofTarget < 0">
|
||||
<mat-icon class="red-fg mr-4">trending_down</mat-icon>
|
||||
<span>{{widgets.widget2.conversion.ofTarget}}%</span>
|
||||
</div>
|
||||
<div class="ml-4 text-nowrap">of target</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="h-96 w-100-p">
|
||||
<canvas baseChart
|
||||
[datasets]="widgets.widget2.datasets"
|
||||
[labels]="widgets.widget2.labels"
|
||||
[colors]="widgets.widget2.colors"
|
||||
[options]="widgets.widget2.options"
|
||||
[chartType]="widgets.widget2.chartType">
|
||||
</canvas>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- / Widget 2 -->
|
||||
|
||||
<!-- Widget 3 -->
|
||||
<div class="widget" fxFlex="100" fxFlex.gt-sm="34">
|
||||
|
||||
<div class="fuse-card auto-width mb-32" [ngClass.gt-sm]="'mb-0 mr-32'">
|
||||
|
||||
<div class="p-16 pb-0" fxLayout="row" fxLayoutAlign="start end" fxLayoutWrap>
|
||||
|
||||
<div class="pr-16">
|
||||
<div class="h3 secondary-text">Impressions</div>
|
||||
<div class="font-size-54 font-weight-300 line-height-1 mt-8">
|
||||
{{widgets.widget3.impressions.value}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="py-4 font-size-16" fxLayout="row" fxLayoutAlign="start center">
|
||||
<div fxFlex="row" fxLayoutAlign="start center" class="green-fg"
|
||||
*ngIf="widgets.widget3.impressions.ofTarget > 0">
|
||||
<mat-icon class="green-fg mr-4">trending_up</mat-icon>
|
||||
<span>{{widgets.widget3.impressions.ofTarget}}%</span>
|
||||
</div>
|
||||
<div fxFlex="row" fxLayoutAlign="start center" class="red-fg"
|
||||
*ngIf="widgets.widget3.impressions.ofTarget < 0">
|
||||
<mat-icon class="red-fg mr-4">trending_down</mat-icon>
|
||||
<span>{{widgets.widget3.impressions.ofTarget}}%</span>
|
||||
</div>
|
||||
<div class="ml-4 text-nowrap">of target</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="h-96 w-100-p">
|
||||
<canvas baseChart
|
||||
[datasets]="widgets.widget3.datasets"
|
||||
[labels]="widgets.widget3.labels"
|
||||
[colors]="widgets.widget3.colors"
|
||||
[options]="widgets.widget3.options"
|
||||
[chartType]="widgets.widget3.chartType">
|
||||
</canvas>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- / Widget 3 -->
|
||||
|
||||
<!-- Widget 4 -->
|
||||
<div class="widget" fxFlex="100" fxFlex.gt-sm="33">
|
||||
|
||||
<div class="fuse-card auto-width">
|
||||
|
||||
<div class="p-16 pb-0" fxLayout="row" fxLayoutAlign="start end" fxLayoutWrap>
|
||||
|
||||
<div class="pr-16">
|
||||
<div class="h3 secondary-text">Visits</div>
|
||||
<div class="font-size-54 font-weight-300 line-height-1 mt-8">
|
||||
{{widgets.widget4.visits.value}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="py-4 font-size-16" fxLayout="row" fxLayoutAlign="start center">
|
||||
<div fxFlex="row" fxLayoutAlign="start center" class="green-fg"
|
||||
*ngIf="widgets.widget4.visits.ofTarget > 0">
|
||||
<mat-icon class="green-fg mr-4">trending_up</mat-icon>
|
||||
<span>{{widgets.widget4.visits.ofTarget}}%</span>
|
||||
</div>
|
||||
<div fxFlex="row" fxLayoutAlign="start center" class="red-fg"
|
||||
*ngIf="widgets.widget4.visits.ofTarget < 0">
|
||||
<mat-icon class="red-fg mr-4">trending_down</mat-icon>
|
||||
<span>{{widgets.widget4.visits.ofTarget}}%</span>
|
||||
</div>
|
||||
<div class="ml-4 text-nowrap">of target</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="h-96 w-100-p">
|
||||
<canvas baseChart
|
||||
[datasets]="widgets.widget4.datasets"
|
||||
[labels]="widgets.widget4.labels"
|
||||
[colors]="widgets.widget4.colors"
|
||||
[options]="widgets.widget4.options"
|
||||
[chartType]="widgets.widget4.chartType">
|
||||
</canvas>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- / Widget 4 -->
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Widget 5 -->
|
||||
<div class="pt-48 pb-24 font-size-18 font-weight-300">
|
||||
How many pages your users visit?
|
||||
</div>
|
||||
|
||||
<div class="fuse-card auto-width">
|
||||
|
||||
<div class="position-relative p-24"
|
||||
fxLayout="row" fxLayoutAlign="space-between center">
|
||||
<div fxLayout="column" fxLayoutAlign="start start">
|
||||
<span class="h2">Visitors & Page views</span>
|
||||
</div>
|
||||
<div fxLayout="row" fxLayoutAlign="start center">
|
||||
<div class="py-8 px-12 border-radius-2 line-height-1 mr-8 cursor-pointer"
|
||||
(click)="widget5SelectedDay = 'yesterday'"
|
||||
[ngClass]="{'grey-300-bg': widget5SelectedDay === 'yesterday'}">
|
||||
Yesterday
|
||||
</div>
|
||||
<div class="py-8 px-12 border-radius-2 line-height-1 mr-8 cursor-pointer"
|
||||
(click)="widget5SelectedDay = 'today'"
|
||||
[ngClass]="{'grey-300-bg': widget5SelectedDay === 'today'}">
|
||||
Today
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="position-relative h-368 pb-16">
|
||||
<canvas baseChart
|
||||
[datasets]="widgets.widget5.datasets[widget5SelectedDay]"
|
||||
[labels]="widgets.widget5.labels"
|
||||
[colors]="widgets.widget5.colors"
|
||||
[options]="widgets.widget5.options"
|
||||
[chartType]="widgets.widget5.chartType">
|
||||
</canvas>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- / Widget 5 -->
|
||||
|
||||
<!-- Widget 6 -->
|
||||
<div class="pt-48 pb-24 font-size-18 font-weight-300">
|
||||
Where are your users?
|
||||
</div>
|
||||
|
||||
<div class="fuse-card auto-width p-16">
|
||||
|
||||
<agm-map class="h-640 w-100-p"
|
||||
[minZoom]="2"
|
||||
[maxZoom]="2"
|
||||
[fullscreenControl]="false"
|
||||
[rotateControl]="false"
|
||||
[zoomControl]="false"
|
||||
[scaleControl]="false"
|
||||
[streetViewControl]="false"
|
||||
[scrollwheel]="false"
|
||||
[styles]="widgets.widget6.styles">
|
||||
<agm-marker
|
||||
*ngFor="let marker of widgets.widget6.markers"
|
||||
[latitude]="marker.lat"
|
||||
[longitude]="marker.lng">
|
||||
|
||||
<agm-info-window>
|
||||
<strong>{{marker.label}}</strong>
|
||||
</agm-info-window>
|
||||
|
||||
</agm-marker>
|
||||
</agm-map>
|
||||
|
||||
</div>
|
||||
<!-- / Widget 6 -->
|
||||
|
||||
</div>
|
||||
|
||||
<div class="right">
|
||||
|
||||
<div fxLayout="row" fxLayoutWrap
|
||||
fxLayout.gt-md="column">
|
||||
|
||||
<!-- Widget 7 -->
|
||||
<div class="mb-48" [ngClass.lt-lg]="'mr-32'">
|
||||
|
||||
<div class="pb-24 font-size-18 font-weight-300">
|
||||
What are your top devices?
|
||||
</div>
|
||||
|
||||
<div class="fuse-card">
|
||||
|
||||
<div class="p-16">
|
||||
<div class="h1 font-weight-300">Sessions by device</div>
|
||||
</div>
|
||||
|
||||
<div class="h-200">
|
||||
<ngx-charts-pie-chart
|
||||
*fuseIfOnDom
|
||||
[scheme]="widgets.widget7.scheme"
|
||||
[results]="widgets.widget7.devices"
|
||||
[doughnut]="true">
|
||||
</ngx-charts-pie-chart>
|
||||
</div>
|
||||
|
||||
<div class="p-16" fxLayout="row" fxLayoutAlign="center center">
|
||||
|
||||
<div class="px-16" fxLayout="column" fxLayoutAlign="start center"
|
||||
*ngFor="let device of widgets.widget7.devices">
|
||||
|
||||
<div class="h4 secondary-text">{{device.name}}</div>
|
||||
<div class="h2 font-weight-300 py-8">{{device.value}}%</div>
|
||||
|
||||
<div fxLayout="row" fxLayoutAlign="center center">
|
||||
<mat-icon class="s-18 pr-4 red-fg"
|
||||
*ngIf="device.change < 0">
|
||||
arrow_downward
|
||||
</mat-icon>
|
||||
|
||||
<mat-icon class="s-18 pr-4 green-fg"
|
||||
*ngIf="device.change > 0">
|
||||
arrow_upward
|
||||
</mat-icon>
|
||||
|
||||
<div class="h5 red-fg"
|
||||
[ngClass]="{'red-fg': device.change < 0, 'green-fg': device.change > 0}">
|
||||
{{device.change}}%
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="card-divider mb-0"></div>
|
||||
|
||||
<div class="px-16" fxLayout="row" fxLayoutAlign="space-between center">
|
||||
<mat-form-field>
|
||||
<mat-select class="simplified" value="7days">
|
||||
<mat-option value="today">Today</mat-option>
|
||||
<mat-option value="yesterday">Yesterday</mat-option>
|
||||
<mat-option value="7days">Last 7 days</mat-option>
|
||||
<mat-option value="28days">Last 28 days</mat-option>
|
||||
<mat-option value="90days">Last 90 days</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<button mat-button color="accent">OVERVIEW</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- / Widget 7 -->
|
||||
|
||||
<!-- Widget 8 -->
|
||||
<div class="mb-48" [ngClass.lt-lg]="'mr-32'">
|
||||
|
||||
<div class="pb-24 font-size-18 font-weight-300">
|
||||
How are your sales?
|
||||
</div>
|
||||
|
||||
<div class="fuse-card">
|
||||
|
||||
<div class="mat-light-blue-600-bg">
|
||||
|
||||
<div class="p-16" fxLayout="row" fxLayoutAlign="space-between center">
|
||||
<div class="pr-16">
|
||||
<div class="h1 font-weight-300">Sales</div>
|
||||
<div class="h5 secondary-text">Lifetime sum of your sales</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<button mat-icon-button [matMenuTriggerFor]="card19Menu" aria-label="more">
|
||||
<mat-icon>more_vert</mat-icon>
|
||||
</button>
|
||||
|
||||
<mat-menu #card19Menu="matMenu">
|
||||
<button mat-menu-item>
|
||||
<mat-icon>trending_up</mat-icon>
|
||||
<span>Trend</span>
|
||||
</button>
|
||||
<button mat-menu-item>
|
||||
<mat-icon>history</mat-icon>
|
||||
<span>History</span>
|
||||
</button>
|
||||
<button mat-menu-item>
|
||||
<mat-icon>notifications_off</mat-icon>
|
||||
<span>Disable alerts</span>
|
||||
</button>
|
||||
</mat-menu>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-16 pt-8" fxLayout="row" fxLayoutAlign="space-between end">
|
||||
<div class="font-size-48 font-weight-300 line-height-1">{{widgets.widget8.today}}</div>
|
||||
<div fxLayout="row" fxLayoutAlign="start center">
|
||||
<mat-icon *ngIf="widgets.widget8.change.value > 0">trending_up</mat-icon>
|
||||
<mat-icon *ngIf="widgets.widget8.change.value < 0">trending_down</mat-icon>
|
||||
<div class="ml-8">{{widgets.widget8.change.value}}
|
||||
({{widgets.widget8.change.percentage}}%)
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<mat-tab-group backgroundColor="accent">
|
||||
<mat-tab label="1DAY">
|
||||
<div class="h-200 my-16">
|
||||
<ngx-charts-line-chart
|
||||
*fuseIfOnDom
|
||||
[scheme]="widgets.widget8.scheme"
|
||||
[results]="widgets.widget8.data"
|
||||
[xAxis]="false"
|
||||
[yAxis]="true"
|
||||
[yScaleMin]="widgets.widget8.dataMin"
|
||||
[yScaleMax]="widgets.widget8.dataMax">
|
||||
</ngx-charts-line-chart>
|
||||
</div>
|
||||
</mat-tab>
|
||||
|
||||
<mat-tab label="1WEEK">
|
||||
<div class="h-200 my-16">
|
||||
<ngx-charts-line-chart
|
||||
*fuseIfOnDom
|
||||
[scheme]="widgets.widget8.scheme"
|
||||
[results]="widgets.widget8.data"
|
||||
[xAxis]="false"
|
||||
[yAxis]="true"
|
||||
[yScaleMin]="widgets.widget8.dataMin"
|
||||
[yScaleMax]="widgets.widget8.dataMax">
|
||||
</ngx-charts-line-chart>
|
||||
</div>
|
||||
</mat-tab>
|
||||
|
||||
<mat-tab label="1MONTH">
|
||||
<div class="h-200 my-16">
|
||||
<ngx-charts-line-chart
|
||||
*fuseIfOnDom
|
||||
[scheme]="widgets.widget8.scheme"
|
||||
[results]="widgets.widget8.data"
|
||||
[xAxis]="false"
|
||||
[yAxis]="true"
|
||||
[yScaleMin]="widgets.widget8.dataMin"
|
||||
[yScaleMax]="widgets.widget8.dataMax">
|
||||
</ngx-charts-line-chart>
|
||||
</div>
|
||||
</mat-tab>
|
||||
</mat-tab-group>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- / Widget 8 -->
|
||||
|
||||
<!-- Widget 9 -->
|
||||
<div class="mb-48" [ngClass.lt-lg]="'mr-32'">
|
||||
|
||||
<div class="pb-24 font-size-18 font-weight-300" [ngClass.lt-lg]="'pt-0'">
|
||||
What are your top campaigns?
|
||||
</div>
|
||||
|
||||
<div class="fuse-card">
|
||||
|
||||
<div class="p-16" fxLayout="row" fxLayoutAlign="space-between center">
|
||||
<div class="h1 pr-16">Top campaigns</div>
|
||||
|
||||
<div>
|
||||
<button mat-icon-button [matMenuTriggerFor]="card20Menu" aria-label="more">
|
||||
<mat-icon>more_vert</mat-icon>
|
||||
</button>
|
||||
|
||||
<mat-menu #card20Menu="matMenu">
|
||||
<button fxLayout="row" fxLayoutAlign="start center" mat-menu-item>
|
||||
<mat-icon color="accent">check_box</mat-icon>
|
||||
<span>Show Clicks</span>
|
||||
</button>
|
||||
<button fxLayout="row" fxLayoutAlign="start center" mat-menu-item>
|
||||
<mat-icon color="accent">check_box</mat-icon>
|
||||
<span>Show Conversion</span>
|
||||
</button>
|
||||
<button fxLayout="row" fxLayoutAlign="start center" mat-menu-item>
|
||||
<mat-icon>check_box_outline_blank</mat-icon>
|
||||
<span>Show CPC</span>
|
||||
</button>
|
||||
</mat-menu>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="simple clickable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th class="text-right">Clicks</th>
|
||||
<th class="text-right">Conv</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr *ngFor="let row of widgets.widget9.rows">
|
||||
<td>{{row.title}}</td>
|
||||
<td class="text-right">{{row.clicks}}</td>
|
||||
<td class="text-right">{{row.conversion}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div class="card-divider full-width"></div>
|
||||
|
||||
<div class="p-8 pt-16" fxLayout="row" fxLayoutAlign="start center">
|
||||
<button mat-button color="accent">GO TO CAMPAIGNS</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- / widget 9 -->
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,49 @@
|
||||
@import "src/app/core/scss/fuse";
|
||||
|
||||
#dashboard-analytics {
|
||||
|
||||
.main-widget {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.content {
|
||||
display: flex;
|
||||
flex: 1 1 auto;
|
||||
padding: 32px;
|
||||
min-width: 0;
|
||||
|
||||
@include media-breakpoint-down('md') {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.left {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 1 1 auto;
|
||||
min-width: 0;
|
||||
|
||||
.widget {
|
||||
flex: 1 1 auto;
|
||||
min-width: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.right {
|
||||
display: flex;
|
||||
flex: 0 0 auto;
|
||||
width: 320px;
|
||||
min-width: 320px;
|
||||
max-width: 320px;
|
||||
|
||||
@include media-breakpoint-down('md') {
|
||||
flex: 1 0 100%;
|
||||
margin-top: 32px;
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
max-width: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
import { Component, ViewEncapsulation } from '@angular/core';
|
||||
|
||||
import { AnalyticsDashboardService } from './analytics.service';
|
||||
import { fuseAnimations } from '../../../../../core/animations';
|
||||
|
||||
@Component({
|
||||
selector : 'fuse-analytics-dashboard',
|
||||
templateUrl : './analytics.component.html',
|
||||
styleUrls : ['./analytics.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
animations : fuseAnimations
|
||||
})
|
||||
export class FuseAnalyticsDashboardComponent
|
||||
{
|
||||
widgets: any;
|
||||
widget1SelectedYear = '2016';
|
||||
widget5SelectedDay = 'today';
|
||||
|
||||
constructor(
|
||||
private analyticsDashboardService: AnalyticsDashboardService
|
||||
)
|
||||
{
|
||||
// Get the widgets from the service
|
||||
this.widgets = this.analyticsDashboardService.widgets;
|
||||
|
||||
// Register the custom chart.js plugin
|
||||
this.registerCustomChartJSPlugin();
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a custom plugin
|
||||
*/
|
||||
registerCustomChartJSPlugin()
|
||||
{
|
||||
(<any>window).Chart.plugins.register({
|
||||
afterDatasetsDraw: function (chart, easing) {
|
||||
// Only activate the plugin if it's made available
|
||||
// in the options
|
||||
if (
|
||||
!chart.options.plugins.xLabelsOnTop ||
|
||||
(chart.options.plugins.xLabelsOnTop && chart.options.plugins.xLabelsOnTop.active === false)
|
||||
)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// To only draw at the end of animation, check for easing === 1
|
||||
const ctx = chart.ctx;
|
||||
|
||||
chart.data.datasets.forEach(function (dataset, i) {
|
||||
const meta = chart.getDatasetMeta(i);
|
||||
if ( !meta.hidden )
|
||||
{
|
||||
meta.data.forEach(function (element, index) {
|
||||
|
||||
// Draw the text in black, with the specified font
|
||||
ctx.fillStyle = 'rgba(255, 255, 255, 0.7)';
|
||||
const fontSize = 13;
|
||||
const fontStyle = 'normal';
|
||||
const fontFamily = 'Roboto, Helvetica Neue, Arial';
|
||||
ctx.font = (<any>window).Chart.helpers.fontString(fontSize, fontStyle, fontFamily);
|
||||
|
||||
// Just naively convert to string for now
|
||||
const dataString = dataset.data[index].toString() + 'k';
|
||||
|
||||
// Make sure alignment settings are correct
|
||||
ctx.textAlign = 'center';
|
||||
ctx.textBaseline = 'middle';
|
||||
const padding = 15;
|
||||
const startY = 24;
|
||||
const position = element.tooltipPosition();
|
||||
ctx.fillText(dataString, position.x, startY);
|
||||
|
||||
ctx.save();
|
||||
|
||||
ctx.beginPath();
|
||||
ctx.setLineDash([5, 3]);
|
||||
ctx.moveTo(position.x, startY + padding);
|
||||
ctx.lineTo(position.x, position.y - padding);
|
||||
ctx.strokeStyle = 'rgba(255,255,255,0.12)';
|
||||
ctx.stroke();
|
||||
|
||||
ctx.restore();
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { RouterModule, Routes } from '@angular/router';
|
||||
import { SharedModule } from '../../../../../core/modules/shared.module';
|
||||
import { NgxChartsModule } from '@swimlane/ngx-charts';
|
||||
import { AgmCoreModule } from '@agm/core';
|
||||
|
||||
import { FuseAnalyticsDashboardComponent } from './analytics.component';
|
||||
import { AnalyticsDashboardService } from './analytics.service';
|
||||
import { FuseWidgetModule } from '../../../../../core/components/widget/widget.module';
|
||||
|
||||
const routes: Routes = [
|
||||
{
|
||||
path : '**',
|
||||
component: FuseAnalyticsDashboardComponent,
|
||||
resolve : {
|
||||
data: AnalyticsDashboardService
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
@NgModule({
|
||||
imports : [
|
||||
SharedModule,
|
||||
RouterModule.forChild(routes),
|
||||
FuseWidgetModule,
|
||||
NgxChartsModule,
|
||||
AgmCoreModule.forRoot({
|
||||
apiKey: 'AIzaSyD81ecsCj4yYpcXSLFcYU97PvRsE_X8Bx8'
|
||||
})
|
||||
],
|
||||
declarations: [
|
||||
FuseAnalyticsDashboardComponent
|
||||
],
|
||||
providers : [
|
||||
AnalyticsDashboardService
|
||||
]
|
||||
})
|
||||
export class FuseAnalyticsDashboardModule
|
||||
{
|
||||
}
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
|
||||
import { Observable } from 'rxjs/Observable';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
|
||||
@Injectable()
|
||||
export class AnalyticsDashboardService implements Resolve<any>
|
||||
{
|
||||
widgets: any[];
|
||||
|
||||
constructor(
|
||||
private http: HttpClient
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve
|
||||
* @param {ActivatedRouteSnapshot} route
|
||||
* @param {RouterStateSnapshot} state
|
||||
* @returns {Observable<any> | Promise<any> | any}
|
||||
*/
|
||||
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> | Promise<any> | any
|
||||
{
|
||||
return new Promise((resolve, reject) => {
|
||||
|
||||
Promise.all([
|
||||
this.getWidgets()
|
||||
]).then(
|
||||
() => {
|
||||
resolve();
|
||||
},
|
||||
reject
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
getWidgets(): Promise<any>
|
||||
{
|
||||
return new Promise((resolve, reject) => {
|
||||
this.http.get('api/analytics-dashboard-widgets')
|
||||
.subscribe((response: any) => {
|
||||
this.widgets = response;
|
||||
resolve(response);
|
||||
}, reject);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,9 @@
|
||||
|
||||
<div fxLayout="row" fxLayoutAlign="space-between start">
|
||||
|
||||
<span class="mat-display-1 mb-0 welcome-message" *fuseIfOnDom [@animate]="{value:'*',params:{x:'50px'}}">Welcome back, John!</span>
|
||||
<span class="mat-display-1 mb-0 welcome-message" *fuseIfOnDom
|
||||
[@animate]="{value:'*',params:{x:'50px'}}">Welcome back, John!
|
||||
</span>
|
||||
|
||||
<button mat-icon-button fuseMatSidenavToggler="dashboards-right-sidenav" fxHide.gt-md>
|
||||
<mat-icon>menu</mat-icon>
|
||||
@@ -21,7 +23,8 @@
|
||||
|
||||
<div class="selected-project">{{selectedProject.name}}</div>
|
||||
|
||||
<button mat-icon-button class="project-selector" [matMenuTriggerFor]="projectsMenu" aria-label="Select project">
|
||||
<button mat-icon-button class="project-selector" [matMenuTriggerFor]="projectsMenu"
|
||||
aria-label="Select project">
|
||||
<mat-icon>more_horiz</mat-icon>
|
||||
</button>
|
||||
|
||||
@@ -41,16 +44,20 @@
|
||||
|
||||
<mat-tab label="Home">
|
||||
|
||||
<div class="widget-group p-12" fxLayout="row" fxFlex="100" fxLayoutWrap *fuseIfOnDom [@animateStagger]="{value:'50'}">
|
||||
<div class="widget-group grey-100-bg p-12" fxLayout="row" fxFlex="100" fxLayoutWrap *fuseIfOnDom
|
||||
[@animateStagger]="{value:'50'}">
|
||||
|
||||
<!-- WIDGET 1 -->
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25">
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column"
|
||||
fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25">
|
||||
|
||||
<!-- Front -->
|
||||
<div class="fuse-widget-front mat-white-bg mat-elevation-z2">
|
||||
<div class="pl-16 pr-8 py-16 h-52" fxLayout="row" fxLayoutAlign="space-between center">
|
||||
<div class="pl-16 pr-8 py-16 h-52" fxLayout="row"
|
||||
fxLayoutAlign="space-between center">
|
||||
<mat-form-field>
|
||||
<mat-select class="simplified font-size-16" [(ngModel)]="widgets.widget1.currentRange"
|
||||
<mat-select class="simplified font-size-16"
|
||||
[(ngModel)]="widgets.widget1.currentRange"
|
||||
aria-label="Change range">
|
||||
<mat-option *ngFor="let range of widgets.widget1.ranges | keys"
|
||||
[value]="range.key">
|
||||
@@ -67,12 +74,17 @@
|
||||
<div class="light-blue-fg font-size-72 line-height-72">
|
||||
{{widgets.widget1.data.count[widgets.widget1.currentRange]}}
|
||||
</div>
|
||||
<div class="h3 secondary-text font-weight-500">{{widgets.widget1.data.label}}</div>
|
||||
<div class="h3 secondary-text font-weight-500">{{widgets.widget1.data.label}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-16 grey-50-bg border-top" fxLayout="row" fxLayoutAlign="start center">
|
||||
<span class="h4 secondary-text text-truncate">{{widgets.widget1.data.extra.label}}:</span>
|
||||
<span class="h4 ml-8">{{widgets.widget1.data.extra.count[widgets.widget1.currentRange]}}</span>
|
||||
<span class="h4 secondary-text text-truncate">
|
||||
{{widgets.widget1.data.extra.label}}:
|
||||
</span>
|
||||
<span class="h4 ml-8">
|
||||
{{widgets.widget1.data.extra.count[widgets.widget1.currentRange]}}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- / Front -->
|
||||
@@ -94,14 +106,17 @@
|
||||
<!-- / WIDGET 1 -->
|
||||
|
||||
<!-- WIDGET 2 -->
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25">
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column"
|
||||
fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25">
|
||||
|
||||
<!-- Front -->
|
||||
<div class="fuse-widget-front mat-white-bg mat-elevation-z2">
|
||||
<div class="pl-16 pr-8 py-16 h-52" fxLayout="row" fxLayoutAlign="space-between center">
|
||||
<div class="pl-16 pr-8 py-16 h-52" fxLayout="row"
|
||||
fxLayoutAlign="space-between center">
|
||||
<div class="h3">{{widgets.widget2.title}}</div>
|
||||
|
||||
<button mat-icon-button fuseWidgetToggle class="fuse-widget-flip-button" aria-label="more">
|
||||
<button mat-icon-button fuseWidgetToggle class="fuse-widget-flip-button"
|
||||
aria-label="more">
|
||||
<mat-icon>more_vert</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
@@ -110,11 +125,14 @@
|
||||
<div class="red-fg font-size-72 line-height-72">
|
||||
{{widgets.widget2.data.count}}
|
||||
</div>
|
||||
<div class="h3 secondary-text font-weight-500">{{widgets.widget2.data.label}}</div>
|
||||
<div class="h3 secondary-text font-weight-500">{{widgets.widget2.data.label}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-16 grey-50-bg border-top" fxLayout="row" fxLayoutAlign="start center">
|
||||
<span class="h4 secondary-text text-truncate">{{widgets.widget2.data.extra.label}}:</span>
|
||||
<span class="h4 secondary-text text-truncate">
|
||||
{{widgets.widget2.data.extra.label}}:
|
||||
</span>
|
||||
<span class="h4 ml-8">{{widgets.widget2.data.extra.count}}</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -137,14 +155,17 @@
|
||||
<!-- / WIDGET 2 -->
|
||||
|
||||
<!-- WIDGET 3 -->
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25">
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column"
|
||||
fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25">
|
||||
|
||||
<!-- Front -->
|
||||
<div class="fuse-widget-front mat-white-bg mat-elevation-z2">
|
||||
<div class="pl-16 pr-8 py-16 h-52" fxLayout="row" fxLayoutAlign="space-between center">
|
||||
<div class="pl-16 pr-8 py-16 h-52" fxLayout="row"
|
||||
fxLayoutAlign="space-between center">
|
||||
<div class="h3">{{widgets.widget3.title}}</div>
|
||||
|
||||
<button mat-icon-button fuseWidgetToggle class="fuse-widget-flip-button" aria-label="more">
|
||||
<button mat-icon-button fuseWidgetToggle class="fuse-widget-flip-button"
|
||||
aria-label="more">
|
||||
<mat-icon>more_vert</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
@@ -153,11 +174,14 @@
|
||||
<div class="orange-fg font-size-72 line-height-72">
|
||||
{{widgets.widget3.data.count}}
|
||||
</div>
|
||||
<div class="h3 secondary-text font-weight-500">{{widgets.widget3.data.label}}</div>
|
||||
<div class="h3 secondary-text font-weight-500">{{widgets.widget3.data.label}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-16 grey-50-bg border-top" fxLayout="row" fxLayoutAlign="start center">
|
||||
<span class="h4 secondary-text text-truncate">{{widgets.widget3.data.extra.label}}:</span>
|
||||
<span class="h4 secondary-text text-truncate">
|
||||
{{widgets.widget3.data.extra.label}}:
|
||||
</span>
|
||||
<span class="h4 ml-8">{{widgets.widget3.data.extra.count}}</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -180,26 +204,33 @@
|
||||
<!-- / WIDGET 3 -->
|
||||
|
||||
<!-- WIDGET 4 -->
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25">
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column"
|
||||
fxFlex="100" fxFlex.gt-xs="50" fxFlex.gt-md="25">
|
||||
|
||||
<!-- Front -->
|
||||
<div class="fuse-widget-front mat-white-bg mat-elevation-z2">
|
||||
<div class="pl-16 pr-8 py-16 h-52" fxLayout="row" fxLayoutAlign="space-between center">
|
||||
<div class="pl-16 pr-8 py-16 h-52" fxLayout="row"
|
||||
fxLayoutAlign="space-between center">
|
||||
<div class="h3">{{widgets.widget4.title}}</div>
|
||||
|
||||
<button mat-icon-button fuseWidgetToggle class="fuse-widget-flip-button" aria-label="more">
|
||||
<button mat-icon-button fuseWidgetToggle class="fuse-widget-flip-button"
|
||||
aria-label="more">
|
||||
<mat-icon>more_vert</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="pt-8 pb-32" fxLayout="column" fxLayoutAlign="center center">
|
||||
<div class="blue-grey-fg font-size-72 line-height-72">{{widgets.widget4.data.count}}
|
||||
<div class="blue-grey-fg font-size-72 line-height-72">
|
||||
{{widgets.widget4.data.count}}
|
||||
</div>
|
||||
<div class="h3 secondary-text font-weight-500">{{widgets.widget4.data.label}}
|
||||
</div>
|
||||
<div class="h3 secondary-text font-weight-500">{{widgets.widget4.data.label}}</div>
|
||||
</div>
|
||||
|
||||
<div class="p-16 grey-50-bg border-top" fxLayout="row" fxLayoutAlign="start center">
|
||||
<span class="h4 secondary-text text-truncate">{{widgets.widget4.data.extra.label}}:</span>
|
||||
<span class="h4 secondary-text text-truncate">
|
||||
{{widgets.widget4.data.extra.label}}:
|
||||
</span>
|
||||
<span class="h4 ml-8">{{widgets.widget4.data.extra.count}}</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -221,18 +252,19 @@
|
||||
</fuse-widget>
|
||||
<!-- / WIDGET 4 -->
|
||||
|
||||
|
||||
<!-- WIDGET 5 -->
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="row" fxFlex="100">
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" fxLayout="row" fxFlex="100"
|
||||
class="widget widget5">
|
||||
|
||||
<!-- Front -->
|
||||
<div class="fuse-widget-front mat-white-bg mat-elevation-z2">
|
||||
|
||||
<div class="px-16 border-bottom" fxLayout="row" fxLayoutAlign="space-between center" fxLayoutWrap>
|
||||
<div class="px-16 border-bottom" fxLayout="row" fxLayoutAlign="space-between center"
|
||||
fxLayoutWrap>
|
||||
|
||||
<div fxFlex class="py-8 h3">{{widgets.widget5.title}}</div>
|
||||
<div fxFlex class="py-16 h3">{{widgets.widget5.title}}</div>
|
||||
|
||||
<div fxFlex="0 1 auto" class="py-8" fxLayout="row">
|
||||
<div fxFlex="0 1 auto" class="py-16" fxLayout="row">
|
||||
<button mat-button class="px-16"
|
||||
*ngFor="let range of widgets.widget5.ranges | keys"
|
||||
(click)="widget5.currentRange = range.key"
|
||||
@@ -242,8 +274,9 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div fxLayout="row" fxLayoutAlign="start end" fxLayoutWrap>
|
||||
<div class="h-420 mb-16" fxLayout="row" fxFlex="100" fxFlex.gt-sm="50">
|
||||
<div fxLayout="row" fxLayoutAlign="start start" fxLayoutWrap>
|
||||
|
||||
<div class="h-420 my-16" fxLayout="row" fxFlex="100" fxFlex.gt-sm="50">
|
||||
<ngx-charts-bar-vertical-stacked
|
||||
*fuseIfOnDom
|
||||
[scheme]="widget5.scheme"
|
||||
@@ -260,10 +293,12 @@
|
||||
</ngx-charts-bar-vertical-stacked>
|
||||
</div>
|
||||
|
||||
<div class="mb-16" fxFlex="100" fxFlex.gt-sm="50" fxLayoutAlign="row" fxLayoutWrap>
|
||||
<div class="my-16" fxFlex="100" fxFlex.gt-sm="50" fxLayoutAlign="row"
|
||||
fxLayoutWrap>
|
||||
|
||||
<div fxLayout="column" fxFlex="100" fxFlex.gt-sm="50" fxLayoutAlign="center"
|
||||
*ngFor="let widget of widgets.widget5.supporting | keys">
|
||||
*ngFor="let widget of widgets.widget5.supporting | keys"
|
||||
class="mb-24">
|
||||
|
||||
<div class="px-24">
|
||||
<div class="h4 secondary-text">{{widget.value.label}}</div>
|
||||
@@ -297,17 +332,19 @@
|
||||
</fuse-widget>
|
||||
<!-- / WIDGET 5 -->
|
||||
|
||||
|
||||
<!-- WIDGET 6 -->
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-sm="50">
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column"
|
||||
fxFlex="100" fxFlex.gt-sm="50">
|
||||
|
||||
<!-- Front -->
|
||||
<div class="fuse-widget-front mat-white-bg mat-elevation-z2">
|
||||
|
||||
<div class="px-16 border-bottom" fxLayout="row" fxLayoutAlign="space-between center">
|
||||
<div class="px-16 py-8 border-bottom" fxLayout="row"
|
||||
fxLayoutAlign="space-between center">
|
||||
<div class="h3">{{widgets.widget6.title}}</div>
|
||||
<mat-form-field>
|
||||
<mat-select class="simplified" [(ngModel)]="widget6.currentRange" aria-label="Change range">
|
||||
<mat-select class="simplified" [(ngModel)]="widget6.currentRange"
|
||||
aria-label="Change range">
|
||||
<mat-option *ngFor="let range of widgets.widget6.ranges | keys"
|
||||
[value]="range.key">
|
||||
{{range.value}}
|
||||
@@ -330,14 +367,21 @@
|
||||
</ngx-charts-pie-chart>
|
||||
</div>
|
||||
|
||||
<div class="py-8 mh-16 border-top" fxLayout="row" fxLayoutAlign="start center" fxLayoutWrap>
|
||||
<div class="py-8 border-right" fxLayout="column" fxLayoutAlign="center center" fxFlex="100" fxFlex.gt-sm="50">
|
||||
<span class="mat-display-1 mb-0">{{widgets.widget6.footerLeft.count[widget6.currentRange]}}</span>
|
||||
<div class="py-8 mh-16 border-top" fxLayout="row" fxLayoutAlign="start center"
|
||||
fxLayoutWrap>
|
||||
<div class="py-8 border-right" fxLayout="column" fxLayoutAlign="center center"
|
||||
fxFlex="100" fxFlex.gt-sm="50">
|
||||
<span class="mat-display-1 mb-0">
|
||||
{{widgets.widget6.footerLeft.count[widget6.currentRange]}}
|
||||
</span>
|
||||
<span class="h4">{{widgets.widget6.footerLeft.title}}</span>
|
||||
</div>
|
||||
|
||||
<div class="py-8" fxLayout="column" fxLayoutAlign="center center" fxFlex="100" fxFlex.gt-sm="50">
|
||||
<span class="mat-display-1 mb-0">{{widgets.widget6.footerRight.count[widget6.currentRange]}}</span>
|
||||
<div class="py-8" fxLayout="column" fxLayoutAlign="center center" fxFlex="100"
|
||||
fxFlex.gt-sm="50">
|
||||
<span class="mat-display-1 mb-0">
|
||||
{{widgets.widget6.footerRight.count[widget6.currentRange]}}
|
||||
</span>
|
||||
<span class="h4">{{widgets.widget6.footerRight.title}}</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -349,12 +393,14 @@
|
||||
<!-- / WIDGET 6 -->
|
||||
|
||||
<!-- WIDGET 7 -->
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-sm="50">
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column"
|
||||
fxFlex="100" fxFlex.gt-sm="50">
|
||||
|
||||
<!-- Front -->
|
||||
<div class="fuse-widget-front mat-white-bg mat-elevation-z2">
|
||||
|
||||
<div class="px-16 border-bottom" fxLayout="row" fxLayoutAlign="space-between center">
|
||||
<div class="px-16 py-8 border-bottom" fxLayout="row"
|
||||
fxLayoutAlign="space-between center">
|
||||
<div class="h3">{{widgets.widget7.title}}</div>
|
||||
<mat-form-field>
|
||||
<mat-select class="simplified" [(ngModel)]="widget7.currentRange"
|
||||
@@ -391,20 +437,21 @@
|
||||
</div>
|
||||
<!-- / WIDGET GROUP -->
|
||||
|
||||
|
||||
</mat-tab>
|
||||
|
||||
<mat-tab label="Budget Summary">
|
||||
|
||||
<!-- WIDGET GROUP -->
|
||||
<div class="widget-group" fxLayout="row" fxFlex="100" fxLayoutWrap *fuseIfOnDom [@animateStagger]="{value:'50'}">
|
||||
<div class="widget-group grey-100-bg" fxLayout="row" fxFlex="100" fxLayoutWrap *fuseIfOnDom
|
||||
[@animateStagger]="{value:'50'}">
|
||||
|
||||
<!-- WIDGET 8 -->
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-sm="50">
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column"
|
||||
fxFlex="100" fxFlex.gt-sm="50">
|
||||
|
||||
<!-- Front -->
|
||||
<div class="fuse-widget-front mat-white-bg mat-elevation-z2">
|
||||
<div class="h3 p-16">
|
||||
<div class="h3 px-16 py-24">
|
||||
{{widgets.widget8.title}}
|
||||
</div>
|
||||
|
||||
@@ -431,11 +478,13 @@
|
||||
<!-- / WIDGET 8 -->
|
||||
|
||||
<!-- WIDGET 9 -->
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column" fxFlex="100" fxFlex.gt-sm="50">
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="column"
|
||||
fxFlex="100" fxFlex.gt-sm="50">
|
||||
|
||||
<!-- Front -->
|
||||
<div class="fuse-widget-front mat-white-bg mat-elevation-z2">
|
||||
<div class="px-16 border-bottom" fxLayout="row" fxLayoutAlign="space-between center">
|
||||
<div class="px-16 py-12 border-bottom" fxLayout="row"
|
||||
fxLayoutAlign="space-between center">
|
||||
<div class="h3">{{widgets.widget9.title}}</div>
|
||||
<mat-form-field>
|
||||
<mat-select [(ngModel)]="widget9.currentRange" aria-label="Change range">
|
||||
@@ -447,7 +496,7 @@
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<div class="p-16" fxLayout="column" fxLayoutAlign="center" fxLayout.gt-xs="row"
|
||||
<div class="px-16 py-24" fxLayout="column" fxLayoutAlign="center" fxLayout.gt-xs="row"
|
||||
fxLayoutAlign.gt-xs="space-between end">
|
||||
<div fxFlex="0 1 auto">
|
||||
<div class="h4 secondary-text">{{widgets.widget9.weeklySpent.title}}</div>
|
||||
@@ -474,7 +523,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-16" fxLayout="column" fxLayoutAlign="center" fxLayout.gt-xs="row"
|
||||
<div class="px-16 py-24" fxLayout="column" fxLayoutAlign="center" fxLayout.gt-xs="row"
|
||||
fxLayoutAlign.gt-xs="space-between end">
|
||||
<div fxFlex="0 1 auto">
|
||||
<div class="h4 secondary-text">{{widgets.widget9.totalSpent.title}}</div>
|
||||
@@ -501,7 +550,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-16" fxLayout="column" fxLayoutAlign="center" fxLayout.gt-xs="row"
|
||||
<div class="px-16 py-24" fxLayout="column" fxLayoutAlign="center" fxLayout.gt-xs="row"
|
||||
fxLayoutAlign.gt-xs="space-between end">
|
||||
<div fxFlex="0 1 auto">
|
||||
<div class="h4 secondary-text">{{widgets.widget9.remaining.title}}</div>
|
||||
@@ -528,7 +577,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-16 border-top">
|
||||
<div class="px-16 py-24 border-top">
|
||||
<div class="h4 secondary-text">{{widgets.widget9.totalBudget.title}}</div>
|
||||
<div class="pt-8 mat-display-1 m-0 font-weight-300">
|
||||
<span class="secondary-text">$</span>
|
||||
@@ -543,7 +592,8 @@
|
||||
<!-- / WIDGET 9 -->
|
||||
|
||||
<!-- WIDGET 10 -->
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="row" fxFlex="100">
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="row"
|
||||
fxFlex="100">
|
||||
|
||||
<!-- Front -->
|
||||
<div class="fuse-widget-front mat-white-bg mat-elevation-z2">
|
||||
@@ -569,7 +619,8 @@
|
||||
<span class="p-4" [ngClass]="cell.classes">
|
||||
{{cell.value}}
|
||||
</span>
|
||||
<mat-icon *ngIf="cell.icon" class="s-16">{{cell.icon}}</mat-icon>
|
||||
<mat-icon *ngIf="cell.icon" class="s-16">{{cell.icon}}
|
||||
</mat-icon>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@@ -590,17 +641,21 @@
|
||||
<mat-tab label="Team Members">
|
||||
|
||||
<!-- WIDGET GROUP -->
|
||||
<div class="widget-group" fxLayout="row" fxFlex="100" fxLayoutWrap *fuseIfOnDom [@animateStagger]="{value:'50'}">
|
||||
<div class="widget-group grey-100-bg" fxLayout="row" fxFlex="100" fxLayoutWrap *fuseIfOnDom
|
||||
[@animateStagger]="{value:'50'}">
|
||||
|
||||
<!-- WIDGET 11 -->
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="row" fxFlex="100">
|
||||
<fuse-widget [@animate]="{value:'*',params:{y:'100%'}}" class="widget" fxLayout="row"
|
||||
fxFlex="100">
|
||||
|
||||
<!-- Front -->
|
||||
<div class="fuse-widget-front mat-white-bg mat-elevation-z2">
|
||||
|
||||
<div class="p-24 mb-8 border-bottom" fxLayout="row" fxLayoutAlign="space-between center">
|
||||
<div class="p-24 mb-8 border-bottom" fxLayout="row"
|
||||
fxLayoutAlign="space-between center">
|
||||
<div class="h2">{{widgets.widget11.title}}</div>
|
||||
<div class="text-boxed red-bg white-fg m-0">{{widgets.widget11.table.rows.length}}
|
||||
<div class="text-boxed red-bg white-fg m-0">
|
||||
{{widgets.widget11.table.rows.length}}
|
||||
members
|
||||
</div>
|
||||
</div>
|
||||
@@ -620,13 +675,15 @@
|
||||
<ng-container cdkColumnDef="name">
|
||||
<mat-header-cell *cdkHeaderCellDef>Name</mat-header-cell>
|
||||
<mat-cell *cdkCellDef="let contact">
|
||||
<p class="text-truncate font-weight-600">{{contact.name}} {{contact.lastName}}</p>
|
||||
<p class="text-truncate font-weight-600">{{contact.name}}
|
||||
{{contact.lastName}}</p>
|
||||
</mat-cell>
|
||||
</ng-container>
|
||||
|
||||
<!-- Position Column -->
|
||||
<ng-container cdkColumnDef="position">
|
||||
<mat-header-cell *cdkHeaderCellDef fxHide fxShow.gt-sm>Position</mat-header-cell>
|
||||
<mat-header-cell *cdkHeaderCellDef fxHide fxShow.gt-sm>Position
|
||||
</mat-header-cell>
|
||||
<mat-cell *cdkCellDef="let contact" fxHide fxShow.gt-sm>
|
||||
<p class="position text-truncate">
|
||||
{{contact.position}}
|
||||
@@ -636,7 +693,8 @@
|
||||
|
||||
<!-- Office Column -->
|
||||
<ng-container cdkColumnDef="office">
|
||||
<mat-header-cell *cdkHeaderCellDef fxHide fxShow.gt-md>Office</mat-header-cell>
|
||||
<mat-header-cell *cdkHeaderCellDef fxHide fxShow.gt-md>Office
|
||||
</mat-header-cell>
|
||||
<mat-cell *cdkCellDef="let contact" fxHide fxShow.gt-md>
|
||||
<p class="office text-truncate">
|
||||
{{contact.office}}
|
||||
@@ -644,10 +702,10 @@
|
||||
</mat-cell>
|
||||
</ng-container>
|
||||
|
||||
|
||||
<!-- Email Column -->
|
||||
<ng-container cdkColumnDef="email">
|
||||
<mat-header-cell *cdkHeaderCellDef fxHide fxShow.gt-sm>Email</mat-header-cell>
|
||||
<mat-header-cell *cdkHeaderCellDef fxHide fxShow.gt-sm>Email
|
||||
</mat-header-cell>
|
||||
<mat-cell *cdkCellDef="let contact" fxHide fxShow.gt-sm>
|
||||
<p class="email text-truncate">
|
||||
{{contact.email}}
|
||||
@@ -657,7 +715,8 @@
|
||||
|
||||
<!-- Phone Column -->
|
||||
<ng-container cdkColumnDef="phone">
|
||||
<mat-header-cell *cdkHeaderCellDef fxHide fxShow.gt-md>Phone</mat-header-cell>
|
||||
<mat-header-cell *cdkHeaderCellDef fxHide fxShow.gt-md>Phone
|
||||
</mat-header-cell>
|
||||
<mat-cell *cdkCellDef="let contact" fxHide fxShow.gt-md>
|
||||
<p class="phone text-truncate">
|
||||
{{contact.phone}}
|
||||
@@ -665,7 +724,8 @@
|
||||
</mat-cell>
|
||||
</ng-container>
|
||||
|
||||
<mat-header-row *cdkHeaderRowDef="widgets.widget11.table.columns"></mat-header-row>
|
||||
<mat-header-row
|
||||
*cdkHeaderRowDef="widgets.widget11.table.columns"></mat-header-row>
|
||||
<mat-row *cdkRowDef="let contact; columns: widgets.widget11.table.columns;">
|
||||
</mat-row>
|
||||
</mat-table>
|
||||
@@ -688,7 +748,8 @@
|
||||
<!-- / CENTER -->
|
||||
|
||||
<!-- SIDENAV -->
|
||||
<mat-sidenav class="sidenav" align="end" mode="side" opened="true" fuseMatSidenavHelper="dashboards-right-sidenav" mat-is-locked-open="gt-md">
|
||||
<mat-sidenav class="sidenav" align="end" mode="side" opened="true"
|
||||
fuseMatSidenavHelper="dashboards-right-sidenav" mat-is-locked-open="gt-md">
|
||||
|
||||
<div class="sidenav-content" fusePerfectScrollbar>
|
||||
|
||||
@@ -768,7 +829,8 @@
|
||||
<div class="p-16 pb-32" fxLayout="column" fxLayoutAlign="center center">
|
||||
|
||||
<div fxLayout="row" fxLayoutAlign="center center">
|
||||
<mat-icon fontSet="meteocons" [fontIcon]="widgets.weatherWidget.locations[widgets.weatherWidget.currentLocation].icon"
|
||||
<mat-icon fontSet="meteocons"
|
||||
[fontIcon]="widgets.weatherWidget.locations[widgets.weatherWidget.currentLocation].icon"
|
||||
class="icon s-40 mr-16"></mat-icon>
|
||||
<span class="mat-display-2 m-0 font-weight-300 secondary-text">
|
||||
{{widgets.weatherWidget.locations[widgets.weatherWidget.currentLocation].temp[widgets.weatherWidget.tempUnit]}}
|
||||
@@ -789,12 +851,16 @@
|
||||
|
||||
<div fxLayout="row" fxLayoutAlign="start center">
|
||||
<mat-icon fontSet="meteocons" fontIcon="icon-compass" class="mr-8 s-16"></mat-icon>
|
||||
<span>{{widgets.weatherWidget.locations[widgets.weatherWidget.currentLocation].windDirection}}</span>
|
||||
<span>
|
||||
{{widgets.weatherWidget.locations[widgets.weatherWidget.currentLocation].windDirection}}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div fxLayout="row" fxLayoutAlign="start center">
|
||||
<mat-icon fontSet="meteocons" fontIcon="icon-rainy" class="mr-8 s-16"></mat-icon>
|
||||
<span>{{widgets.weatherWidget.locations[widgets.weatherWidget.currentLocation].rainProbability}}</span>
|
||||
<span>
|
||||
{{widgets.weatherWidget.locations[widgets.weatherWidget.currentLocation].rainProbability}}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -806,7 +872,9 @@
|
||||
<mat-icon fontSet="meteocons" [fontIcon]="day.icon" class="mr-16"></mat-icon>
|
||||
<span class="h2">{{day.temp[widgets.weatherWidget.tempUnit]}}</span>
|
||||
<span class="h2 font-weight-300 secondary-text text-super">°</span>
|
||||
<span class="h2 font-weight-300 secondary-text">{{widgets.weatherWidget.tempUnit}}</span>
|
||||
<span class="h2 font-weight-300 secondary-text">
|
||||
{{widgets.weatherWidget.tempUnit}}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -56,5 +56,15 @@
|
||||
min-width: 250px !important;
|
||||
max-width: 250px !important;
|
||||
}
|
||||
|
||||
.widget {
|
||||
|
||||
&.widget5 {
|
||||
|
||||
.gridline-path.gridline-path-horizontal {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,20 @@
|
||||
import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
|
||||
import { ProjectsDashboardService } from './projects.service';
|
||||
import * as shape from 'd3-shape';
|
||||
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
|
||||
import { Observable } from 'rxjs/Observable';
|
||||
import { DataSource } from '@angular/cdk/collections';
|
||||
|
||||
import { ProjectDashboardService } from './project.service';
|
||||
import { fuseAnimations } from '../../../../../core/animations';
|
||||
|
||||
@Component({
|
||||
selector : 'fuse-project',
|
||||
selector : 'fuse-project-dashboard',
|
||||
templateUrl : './project.component.html',
|
||||
styleUrls : ['./project.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
animations : fuseAnimations
|
||||
})
|
||||
export class FuseProjectComponent implements OnInit, OnDestroy
|
||||
export class FuseProjectDashboardComponent implements OnInit, OnDestroy
|
||||
{
|
||||
projects: any[];
|
||||
selectedProject: any;
|
||||
@@ -28,13 +29,11 @@ export class FuseProjectComponent implements OnInit, OnDestroy
|
||||
|
||||
dateNow = Date.now();
|
||||
|
||||
constructor(private projectsDashboardService: ProjectsDashboardService)
|
||||
constructor(private projectDashboardService: ProjectDashboardService)
|
||||
{
|
||||
this.projects = this.projectsDashboardService.projects;
|
||||
|
||||
this.projects = this.projectDashboardService.projects;
|
||||
this.selectedProject = this.projects[0];
|
||||
|
||||
this.widgets = this.projectsDashboardService.widgets;
|
||||
this.widgets = this.projectDashboardService.widgets;
|
||||
|
||||
/**
|
||||
* Widget 5
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { RouterModule, Routes } from '@angular/router';
|
||||
import { FuseProjectComponent } from './project.component';
|
||||
import { SharedModule } from '../../../../../core/modules/shared.module';
|
||||
import { ProjectsDashboardService } from './projects.service';
|
||||
|
||||
import { FuseProjectDashboardComponent } from './project.component';
|
||||
import { ProjectDashboardService } from './project.service';
|
||||
import { FuseWidgetModule } from '../../../../../core/components/widget/widget.module';
|
||||
import { NgxChartsModule } from '@swimlane/ngx-charts';
|
||||
|
||||
const routes: Routes = [
|
||||
{
|
||||
path : '**',
|
||||
component: FuseProjectComponent,
|
||||
component: FuseProjectDashboardComponent,
|
||||
resolve : {
|
||||
data: ProjectsDashboardService
|
||||
data: ProjectDashboardService
|
||||
}
|
||||
}
|
||||
];
|
||||
@@ -24,10 +25,10 @@ const routes: Routes = [
|
||||
NgxChartsModule
|
||||
],
|
||||
declarations: [
|
||||
FuseProjectComponent
|
||||
FuseProjectDashboardComponent
|
||||
],
|
||||
providers : [
|
||||
ProjectsDashboardService
|
||||
ProjectDashboardService
|
||||
]
|
||||
})
|
||||
export class FuseProjectDashboardModule
|
||||
|
||||
@@ -4,7 +4,7 @@ import { Observable } from 'rxjs/Observable';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
|
||||
@Injectable()
|
||||
export class ProjectsDashboardService implements Resolve<any>
|
||||
export class ProjectDashboardService implements Resolve<any>
|
||||
{
|
||||
projects: any[];
|
||||
widgets: any[];
|
||||
@@ -41,7 +41,7 @@ export class ProjectsDashboardService implements Resolve<any>
|
||||
getProjects(): Promise<any>
|
||||
{
|
||||
return new Promise((resolve, reject) => {
|
||||
this.http.get('api/projects-dashboard-projects')
|
||||
this.http.get('api/project-dashboard-projects')
|
||||
.subscribe((response: any) => {
|
||||
this.projects = response;
|
||||
resolve(response);
|
||||
@@ -52,7 +52,7 @@ export class ProjectsDashboardService implements Resolve<any>
|
||||
getWidgets(): Promise<any>
|
||||
{
|
||||
return new Promise((resolve, reject) => {
|
||||
this.http.get('api/projects-dashboard-widgets')
|
||||
this.http.get('api/project-dashboard-widgets')
|
||||
.subscribe((response: any) => {
|
||||
this.widgets = response;
|
||||
resolve(response);
|
||||
@@ -41,7 +41,7 @@ export class EcommerceDashboardService implements Resolve<any>
|
||||
getProjects(): Promise<any>
|
||||
{
|
||||
return new Promise((resolve, reject) => {
|
||||
this.http.get('api/projects-dashboard-projects')
|
||||
this.http.get('api/project-dashboard-projects')
|
||||
.subscribe((response: any) => {
|
||||
this.projects = response;
|
||||
resolve(response);
|
||||
|
||||
@@ -5,6 +5,7 @@ import { Subscription } from 'rxjs/Subscription';
|
||||
import { FormBuilder, FormGroup } from '@angular/forms';
|
||||
import { FuseUtils } from '../../../../../core/fuseUtils';
|
||||
import { fuseAnimations } from '../../../../../core/animations';
|
||||
import 'rxjs/add/operator/debounceTime';
|
||||
import 'rxjs/add/operator/distinctUntilChanged';
|
||||
|
||||
@Component({
|
||||
|
||||
@@ -4,6 +4,7 @@ import { TodoService } from './todo.service';
|
||||
import { FormControl } from '@angular/forms';
|
||||
import { Todo } from './todo.model';
|
||||
import { fuseAnimations } from '../../../../core/animations';
|
||||
import 'rxjs/add/operator/debounceTime';
|
||||
import 'rxjs/add/operator/distinctUntilChanged';
|
||||
|
||||
@Component({
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
|
||||
// i18n/tr.ts
|
||||
export const locale = {
|
||||
lang: 'en',
|
||||
lang: 'tr',
|
||||
data: {
|
||||
'MAIL': {
|
||||
'COMPOSE': 'YENİ E-POSTA'
|
||||
|
||||
@@ -3,6 +3,7 @@ import { FormControl } from '@angular/forms';
|
||||
import { Subscription } from 'rxjs/Subscription';
|
||||
import { FaqService } from './faq.service';
|
||||
import { FuseUtils } from '../../../../core/fuseUtils';
|
||||
import 'rxjs/add/operator/debounceTime';
|
||||
import 'rxjs/add/operator/distinctUntilChanged';
|
||||
|
||||
@Component({
|
||||
|
||||
@@ -21,12 +21,18 @@ export class FuseNavigationModel implements FuseNavigationModelInterface
|
||||
'type' : 'collapse',
|
||||
'icon' : 'dashboard',
|
||||
'children' : [
|
||||
{
|
||||
'id' : 'analytics',
|
||||
'title': 'Analytics',
|
||||
'type' : 'item',
|
||||
'url' : '/apps/dashboards/analytics'
|
||||
},
|
||||
{
|
||||
'id' : 'project',
|
||||
'title': 'Project',
|
||||
'type' : 'item',
|
||||
'url' : '/apps/dashboards/project'
|
||||
}
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user