├── .editorconfig
├── .gitignore
├── LICENSE
├── README.md
├── angular.json
├── e2e
├── app.e2e-spec.ts
├── app.po.ts
└── tsconfig.e2e.json
├── karma.conf.js
├── package-lock.json
├── package.json
├── protractor.conf.js
├── screenshot
├── dashboard.png
├── lock.png
├── login.png
├── notification.gif
├── panel.png
├── price.png
├── profile.png
├── register.png
├── settings.gif
├── sweetalert.gif
└── table.png
├── src
├── app
│ ├── app.component.css
│ ├── app.component.html
│ ├── app.component.ts
│ ├── app.module.ts
│ ├── app.routes.ts
│ ├── dashboard
│ │ ├── component
│ │ │ ├── panels
│ │ │ │ ├── panels.component.css
│ │ │ │ ├── panels.component.html
│ │ │ │ └── panels.component.ts
│ │ │ ├── pricetable
│ │ │ │ ├── pricetable.component.css
│ │ │ │ ├── pricetable.component.html
│ │ │ │ └── pricetable.component.ts
│ │ │ └── wizard
│ │ │ │ ├── wizard.component.css
│ │ │ │ ├── wizard.component.html
│ │ │ │ └── wizard.component.ts
│ │ ├── home
│ │ │ ├── home.component.css
│ │ │ ├── home.component.html
│ │ │ └── home.component.ts
│ │ ├── notification
│ │ │ ├── notification.component.css
│ │ │ ├── notification.component.html
│ │ │ └── notification.component.ts
│ │ ├── profile
│ │ │ ├── profile.component.css
│ │ │ ├── profile.component.html
│ │ │ └── profile.component.ts
│ │ ├── root
│ │ │ ├── root.component.css
│ │ │ ├── root.component.html
│ │ │ └── root.component.ts
│ │ ├── settings
│ │ │ ├── settings.component.css
│ │ │ ├── settings.component.html
│ │ │ └── settings.component.ts
│ │ ├── sweetalert
│ │ │ ├── sweetalert.component.css
│ │ │ ├── sweetalert.component.html
│ │ │ └── sweetalert.component.ts
│ │ └── table
│ │ │ ├── table.component.css
│ │ │ ├── table.component.html
│ │ │ └── table.component.ts
│ ├── page
│ │ ├── lock
│ │ │ ├── lock.component.css
│ │ │ ├── lock.component.html
│ │ │ └── lock.component.ts
│ │ ├── login
│ │ │ ├── login.component.css
│ │ │ ├── login.component.html
│ │ │ └── login.component.ts
│ │ └── register
│ │ │ ├── register.component.css
│ │ │ ├── register.component.html
│ │ │ └── register.component.ts
│ ├── services
│ │ └── settings.service.ts
│ ├── shared
│ │ ├── figurecard
│ │ │ ├── figurecard.component.css
│ │ │ ├── figurecard.component.html
│ │ │ └── figurecard.component.ts
│ │ ├── footer
│ │ │ ├── footer.component.css
│ │ │ ├── footer.component.html
│ │ │ └── footer.component.ts
│ │ ├── header
│ │ │ ├── header.component.css
│ │ │ ├── header.component.html
│ │ │ └── header.component.ts
│ │ ├── imagecard
│ │ │ ├── imagecard.component.css
│ │ │ ├── imagecard.component.html
│ │ │ └── imagecard.component.ts
│ │ ├── msgiconbtn
│ │ │ ├── msgiconbtn.component.css
│ │ │ ├── msgiconbtn.component.html
│ │ │ └── msgiconbtn.component.ts
│ │ └── navbar
│ │ │ ├── navbar.component.css
│ │ │ ├── navbar.component.html
│ │ │ └── navbar.component.ts
│ └── sidebar
│ │ ├── sidebar-routes.config.ts
│ │ ├── sidebar.component.css
│ │ ├── sidebar.component.html
│ │ └── sidebar.component.ts
├── assets
│ ├── img
│ │ ├── angular2-logo.png
│ │ ├── avatar.jpg
│ │ ├── card-1.jpeg
│ │ ├── card-2.jpeg
│ │ ├── card-3.jpeg
│ │ ├── lock_bg.jpg
│ │ ├── login_bg.jpg
│ │ ├── marc.jpg
│ │ ├── register_bg.jpg
│ │ ├── sidebar-1.jpg
│ │ ├── sidebar-2.jpg
│ │ ├── sidebar-3.jpg
│ │ └── sidebar-4.jpg
│ └── js
│ │ └── bootstrap-notify.min.js
├── environments
│ ├── environment.prod.ts
│ └── environment.ts
├── favicon.ico
├── index.html
├── main.ts
├── polyfills.ts
├── styles.css
├── test.ts
├── tsconfig.app.json
├── tsconfig.spec.json
└── typings.d.ts
├── tsconfig.json
└── tslint.json
/.editorconfig:
--------------------------------------------------------------------------------
1 | # Editor configuration, see http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
11 | [*.md]
12 | max_line_length = off
13 | trim_trailing_whitespace = false
14 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See http://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # compiled output
4 | /html
5 | /dist
6 | /tmp
7 | /out-tsc
8 |
9 | # dependencies
10 | /node_modules
11 |
12 | # IDEs and editors
13 | /.idea
14 | .project
15 | .classpath
16 | .c9/
17 | *.launch
18 | .settings/
19 | *.sublime-workspace
20 |
21 | # IDE - VSCode
22 | .vscode/*
23 | !.vscode/settings.json
24 | !.vscode/tasks.json
25 | !.vscode/launch.json
26 | !.vscode/extensions.json
27 |
28 | # misc
29 | /.sass-cache
30 | /connect.lock
31 | /coverage
32 | /libpeerconnection.log
33 | npm-debug.log
34 | testem.log
35 | /typings
36 |
37 | # e2e
38 | /e2e/*.js
39 | /e2e/*.map
40 |
41 | # System Files
42 | .DS_Store
43 | Thumbs.db
44 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Di Wang
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Angular2 Material Dashboard Pro
2 |
3 | Material-design Dashboard
4 |
5 | ## How to run it
6 |
7 | **- please ensure you have installed angular cli, otherwise `npm install -g @angular/cli`**
8 |
9 | 1. git clone https://github.com/wangdicoder/angular-material-dashboard
10 | 2. cd angular-material-dashboard
11 | 3. npm install
12 | 4. ng serve -o (it will automatically open localhost:4200)
13 |
14 | ## Further Plan
15 | - [x] Add Wizard Component
16 | - [ ] Responsive Sidebar
17 | - [ ] Consolidate form elements, like switch
18 |
19 | ## Screenshot
20 |
21 | ### Dashboard
22 |
23 | 
24 |
25 | ### Login
26 |
27 | 
28 |
29 | ### Register
30 | 
31 |
32 | ### Lock
33 | 
34 |
35 | ### User Profile
36 | 
37 |
38 | ### Sweet Alert
39 | 
40 |
41 | ### Notification
42 | 
43 |
44 | ### Settings
45 | 
46 |
47 | ### Table
48 | 
49 |
50 | ### Price
51 | 
52 |
53 | ### Panels
54 | 
55 |
56 | ## Acknowledge
57 |
58 | - [Creative Tim](https://github.com/creativetimofficial)
59 | - [Sweet Alert 2](https://github.com/limonte/sweetalert2)
60 | - [Bootstrap Notify](http://bootstrap-notify.remabledesigns.com)
61 |
62 | ## License
63 |
64 | MIT
65 |
--------------------------------------------------------------------------------
/angular.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
3 | "version": 1,
4 | "newProjectRoot": "projects",
5 | "projects": {
6 | "angular2-material-dashboard-pro": {
7 | "root": "",
8 | "sourceRoot": "src",
9 | "projectType": "application",
10 | "architect": {
11 | "build": {
12 | "builder": "@angular-devkit/build-angular:browser",
13 | "options": {
14 | "outputPath": "dist",
15 | "index": "src/index.html",
16 | "main": "src/main.ts",
17 | "tsConfig": "src/tsconfig.app.json",
18 | "polyfills": "src/polyfills.ts",
19 | "assets": [
20 | "src/assets",
21 | "src/favicon.ico"
22 | ],
23 | "styles": [
24 | "src/styles.css"
25 | ],
26 | "scripts": []
27 | },
28 | "configurations": {
29 | "production": {
30 | "optimization": true,
31 | "outputHashing": "all",
32 | "sourceMap": false,
33 | "extractCss": true,
34 | "namedChunks": false,
35 | "aot": true,
36 | "extractLicenses": true,
37 | "vendorChunk": false,
38 | "buildOptimizer": true,
39 | "fileReplacements": [
40 | {
41 | "replace": "src/environments/environment.ts",
42 | "with": "src/environments/environment.prod.ts"
43 | }
44 | ]
45 | }
46 | }
47 | },
48 | "serve": {
49 | "builder": "@angular-devkit/build-angular:dev-server",
50 | "options": {
51 | "browserTarget": "angular2-material-dashboard-pro:build"
52 | },
53 | "configurations": {
54 | "production": {
55 | "browserTarget": "angular2-material-dashboard-pro:build:production"
56 | }
57 | }
58 | },
59 | "extract-i18n": {
60 | "builder": "@angular-devkit/build-angular:extract-i18n",
61 | "options": {
62 | "browserTarget": "angular2-material-dashboard-pro:build"
63 | }
64 | },
65 | "test": {
66 | "builder": "@angular-devkit/build-angular:karma",
67 | "options": {
68 | "main": "src/test.ts",
69 | "karmaConfig": "./karma.conf.js",
70 | "polyfills": "src/polyfills.ts",
71 | "tsConfig": "src/tsconfig.spec.json",
72 | "scripts": [],
73 | "styles": [
74 | "src/styles.css"
75 | ],
76 | "assets": [
77 | "src/assets",
78 | "src/favicon.ico"
79 | ]
80 | }
81 | },
82 | "lint": {
83 | "builder": "@angular-devkit/build-angular:tslint",
84 | "options": {
85 | "tsConfig": [
86 | "src/tsconfig.app.json",
87 | "src/tsconfig.spec.json"
88 | ],
89 | "exclude": []
90 | }
91 | }
92 | }
93 | },
94 | "angular2-material-dashboard-pro-e2e": {
95 | "root": "e2e",
96 | "sourceRoot": "e2e",
97 | "projectType": "application",
98 | "architect": {
99 | "e2e": {
100 | "builder": "@angular-devkit/build-angular:protractor",
101 | "options": {
102 | "protractorConfig": "./protractor.conf.js",
103 | "devServerTarget": "angular2-material-dashboard-pro:serve"
104 | }
105 | },
106 | "lint": {
107 | "builder": "@angular-devkit/build-angular:tslint",
108 | "options": {
109 | "tsConfig": [
110 | "e2e/tsconfig.e2e.json"
111 | ],
112 | "exclude": []
113 | }
114 | }
115 | }
116 | }
117 | },
118 | "defaultProject": "angular2-material-dashboard-pro",
119 | "schematics": {
120 | "@schematics/angular:component": {
121 | "prefix": "app",
122 | "styleext": "css"
123 | },
124 | "@schematics/angular:directive": {
125 | "prefix": "app"
126 | }
127 | }
128 | }
--------------------------------------------------------------------------------
/e2e/app.e2e-spec.ts:
--------------------------------------------------------------------------------
1 | import { Angular2MaterialDashboardProPage } from './app.po';
2 |
3 | describe('angular2-material-dashboard-pro App', () => {
4 | let page: Angular2MaterialDashboardProPage;
5 |
6 | beforeEach(() => {
7 | page = new Angular2MaterialDashboardProPage();
8 | });
9 |
10 | it('should display message saying app works', () => {
11 | page.navigateTo();
12 | expect(page.getParagraphText()).toEqual('app works!');
13 | });
14 | });
15 |
--------------------------------------------------------------------------------
/e2e/app.po.ts:
--------------------------------------------------------------------------------
1 | import { browser, by, element } from 'protractor';
2 |
3 | export class Angular2MaterialDashboardProPage {
4 | navigateTo() {
5 | return browser.get('/');
6 | }
7 |
8 | getParagraphText() {
9 | return element(by.css('app-root h1')).getText();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/e2e/tsconfig.e2e.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "../out-tsc/e2e",
5 | "module": "commonjs",
6 | "target": "es5",
7 | "types": [
8 | "jasmine",
9 | "node"
10 | ]
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/karma.conf.js:
--------------------------------------------------------------------------------
1 | // Karma configuration file, see link for more information
2 | // https://karma-runner.github.io/0.13/config/configuration-file.html
3 |
4 | module.exports = function (config) {
5 | config.set({
6 | basePath: '',
7 | frameworks: ['jasmine', '@angular-devkit/build-angular'],
8 | plugins: [
9 | require('karma-jasmine'),
10 | require('karma-chrome-launcher'),
11 | require('karma-jasmine-html-reporter'),
12 | require('karma-coverage-istanbul-reporter'),
13 | require('@angular-devkit/build-angular/plugins/karma')
14 | ],
15 | client:{
16 | clearContext: false // leave Jasmine Spec Runner output visible in browser
17 | },
18 | files: [
19 |
20 | ],
21 | preprocessors: {
22 |
23 | },
24 | mime: {
25 | 'text/x-typescript': ['ts','tsx']
26 | },
27 | coverageIstanbulReporter: {
28 | dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ],
29 | fixWebpackSourcePaths: true
30 | },
31 |
32 | reporters: config.angularCli && config.angularCli.codeCoverage
33 | ? ['progress', 'coverage-istanbul']
34 | : ['progress', 'kjhtml'],
35 | port: 9876,
36 | colors: true,
37 | logLevel: config.LOG_INFO,
38 | autoWatch: true,
39 | browsers: ['Chrome'],
40 | singleRun: false
41 | });
42 | };
43 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular2-material-dashboard-pro",
3 | "version": "0.0.0",
4 | "license": "MIT",
5 | "scripts": {
6 | "ng": "ng",
7 | "start": "ng serve",
8 | "build": "ng build",
9 | "test": "ng test",
10 | "lint": "ng lint",
11 | "e2e": "ng e2e"
12 | },
13 | "private": true,
14 | "dependencies": {
15 | "@angular/animations": "~7.0.0",
16 | "@angular/cdk": "^7.0.2",
17 | "@angular/common": "~7.0.0",
18 | "@angular/compiler": "~7.0.0",
19 | "@angular/core": "~7.0.0",
20 | "@angular/forms": "~7.0.0",
21 | "@angular/http": "~7.0.0",
22 | "@angular/material": "^7.0.2",
23 | "@angular/platform-browser": "~7.0.0",
24 | "@angular/platform-browser-dynamic": "~7.0.0",
25 | "@angular/router": "~7.0.0",
26 | "core-js": "^2.5.4",
27 | "hammerjs": "^2.0.8",
28 | "rxjs": "~6.3.3",
29 | "zone.js": "~0.8.26"
30 | },
31 | "devDependencies": {
32 | "@angular-devkit/build-angular": "~0.10.0",
33 | "@angular/cli": "~7.0.3",
34 | "@angular/compiler-cli": "~7.0.0",
35 | "@angular/language-service": "~7.0.0",
36 | "@types/node": "~8.9.4",
37 | "@types/jasmine": "~2.8.8",
38 | "@types/jasminewd2": "~2.0.3",
39 | "codelyzer": "~4.5.0",
40 | "jasmine-core": "~2.99.1",
41 | "jasmine-spec-reporter": "~4.2.1",
42 | "karma": "~3.0.0",
43 | "karma-chrome-launcher": "~2.2.0",
44 | "karma-coverage-istanbul-reporter": "~2.0.1",
45 | "karma-jasmine": "~1.1.2",
46 | "karma-jasmine-html-reporter": "^0.2.2",
47 | "protractor": "~5.4.0",
48 | "ts-node": "~7.0.0",
49 | "tslint": "~5.11.0",
50 | "typescript": "~3.1.1"
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/protractor.conf.js:
--------------------------------------------------------------------------------
1 | // Protractor configuration file, see link for more information
2 | // https://github.com/angular/protractor/blob/master/lib/config.ts
3 |
4 | const { SpecReporter } = require('jasmine-spec-reporter');
5 |
6 | exports.config = {
7 | allScriptsTimeout: 11000,
8 | specs: [
9 | './e2e/**/*.e2e-spec.ts'
10 | ],
11 | capabilities: {
12 | 'browserName': 'chrome'
13 | },
14 | directConnect: true,
15 | baseUrl: 'http://localhost:4200/',
16 | framework: 'jasmine',
17 | jasmineNodeOpts: {
18 | showColors: true,
19 | defaultTimeoutInterval: 30000,
20 | print: function() {}
21 | },
22 | onPrepare() {
23 | require('ts-node').register({
24 | project: 'e2e/tsconfig.e2e.json'
25 | });
26 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/screenshot/dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/dashboard.png
--------------------------------------------------------------------------------
/screenshot/lock.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/lock.png
--------------------------------------------------------------------------------
/screenshot/login.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/login.png
--------------------------------------------------------------------------------
/screenshot/notification.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/notification.gif
--------------------------------------------------------------------------------
/screenshot/panel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/panel.png
--------------------------------------------------------------------------------
/screenshot/price.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/price.png
--------------------------------------------------------------------------------
/screenshot/profile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/profile.png
--------------------------------------------------------------------------------
/screenshot/register.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/register.png
--------------------------------------------------------------------------------
/screenshot/settings.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/settings.gif
--------------------------------------------------------------------------------
/screenshot/sweetalert.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/sweetalert.gif
--------------------------------------------------------------------------------
/screenshot/table.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/screenshot/table.png
--------------------------------------------------------------------------------
/src/app/app.component.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/app/app.component.css
--------------------------------------------------------------------------------
/src/app/app.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/app/app.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-root',
5 | templateUrl: './app.component.html',
6 | styleUrls: ['./app.component.css']
7 | })
8 | export class AppComponent {
9 | title = 'app works!';
10 | }
11 |
--------------------------------------------------------------------------------
/src/app/app.module.ts:
--------------------------------------------------------------------------------
1 | import { BrowserModule } from '@angular/platform-browser';
2 | import { NgModule } from '@angular/core';
3 | import { FormsModule } from '@angular/forms';
4 | import { HttpModule } from '@angular/http';
5 | import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
6 | import { routing } from './app.routes';
7 | import { MatButtonModule, MatRadioModule, MatInputModule, MatMenuModule, MatCheckboxModule } from '@angular/material';
8 |
9 | import { AppComponent } from './app.component';
10 | import { SidebarComponent } from './sidebar/sidebar.component';
11 | import { HomeComponent } from './dashboard/home/home.component';
12 | import { ProfileComponent } from './dashboard/profile/profile.component';
13 | import 'hammerjs';
14 | import { NavbarComponent } from './shared/navbar/navbar.component';
15 | import { FigurecardComponent } from './shared/figurecard/figurecard.component';
16 | import { ImagecardComponent } from './shared/imagecard/imagecard.component';
17 | import { TableComponent } from './dashboard/table/table.component';
18 | import { NotificationComponent } from './dashboard/notification/notification.component';
19 | import { MsgIconBtnComponent } from './shared/msgiconbtn/msgiconbtn.component';
20 | import { SweetAlertComponent } from './dashboard/sweetalert/sweetalert.component';
21 | import { LoginComponent } from './page/login/login.component';
22 | import { RootComponent } from './dashboard/root/root.component';
23 | import { RegisterComponent } from './page/register/register.component';
24 | import { LockComponent } from './page/lock/lock.component';
25 | import { HeaderComponent } from './shared/header/header.component';
26 | import { FooterComponent } from './shared/footer/footer.component';
27 | import { SettingsComponent } from './dashboard/settings/settings.component';
28 | import { PriceTableComponent } from './dashboard/component/pricetable/pricetable.component';
29 | import { PanelsComponent } from './dashboard/component/panels/panels.component';
30 |
31 | import { SettingsService } from './services/settings.service';
32 | import { WizardComponent } from './dashboard/component/wizard/wizard.component';
33 |
34 | @NgModule({
35 | declarations: [
36 | AppComponent,
37 | SidebarComponent,
38 | HomeComponent,
39 | ProfileComponent,
40 | NavbarComponent,
41 | FigurecardComponent,
42 | ImagecardComponent,
43 | TableComponent,
44 | NotificationComponent,
45 | MsgIconBtnComponent,
46 | SweetAlertComponent,
47 | LoginComponent,
48 | RootComponent,
49 | RegisterComponent,
50 | LockComponent,
51 | HeaderComponent,
52 | FooterComponent,
53 | SettingsComponent,
54 | PriceTableComponent,
55 | PanelsComponent,
56 | WizardComponent
57 | ],
58 | imports: [
59 | BrowserModule,
60 | FormsModule,
61 | HttpModule,
62 | routing,
63 | BrowserAnimationsModule,
64 | MatButtonModule,
65 | MatRadioModule,
66 | MatInputModule,
67 | MatMenuModule,
68 | MatCheckboxModule
69 | ],
70 | providers: [SettingsService],
71 | bootstrap: [AppComponent]
72 | })
73 | export class AppModule { }
74 |
--------------------------------------------------------------------------------
/src/app/app.routes.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by wangdi on 26/5/17.
3 | */
4 | import { RouterModule, Routes } from '@angular/router';
5 | import { HomeComponent } from './dashboard/home/home.component';
6 | import { ProfileComponent } from './dashboard/profile/profile.component';
7 | import { TableComponent } from './dashboard/table/table.component';
8 | import { NotificationComponent } from './dashboard/notification/notification.component';
9 | import { SweetAlertComponent } from './dashboard/sweetalert/sweetalert.component';
10 | import { SettingsComponent } from './dashboard/settings/settings.component';
11 | import { PriceTableComponent } from './dashboard/component/pricetable/pricetable.component';
12 | import { PanelsComponent} from './dashboard/component/panels/panels.component';
13 | import { WizardComponent } from './dashboard/component/wizard/wizard.component';
14 |
15 | import { RootComponent } from './dashboard/root/root.component';
16 | import { LoginComponent } from './page/login/login.component';
17 | import { LockComponent } from './page/lock/lock.component';
18 | import { RegisterComponent } from './page/register/register.component';
19 |
20 | const routes: Routes = [
21 | {path: '', component: LoginComponent},
22 | {path: 'lock', component: LockComponent},
23 | {path: 'register', component: RegisterComponent},
24 | {path: 'dashboard', component: RootComponent, children: [
25 | {path: '', component: HomeComponent},
26 | {path: 'profile', component: ProfileComponent},
27 | {path: 'table', component: TableComponent},
28 | {path: 'notification', component: NotificationComponent},
29 | {path: 'alert', component: SweetAlertComponent},
30 | {path: 'settings', component: SettingsComponent},
31 | {path: 'components/price-table', component: PriceTableComponent},
32 | {path: 'components/panels', component: PanelsComponent},
33 | {path: 'components/wizard', component: WizardComponent}
34 | ]}
35 | ];
36 |
37 | export const routing = RouterModule.forRoot(routes);
38 |
39 |
--------------------------------------------------------------------------------
/src/app/dashboard/component/panels/panels.component.css:
--------------------------------------------------------------------------------
1 | .card{
2 | padding: 20px 20px 15px 20px;
3 | }
4 |
5 | .card small{
6 | font-weight: 300;
7 | }
8 |
9 | .h-tab{
10 | margin-top: 35px;
11 | }
12 |
13 | .tab-content{
14 | display: none;
15 | }
16 |
17 | .h-tab .tab-link.active{
18 | background-color: #ff9800 !important;
19 | color: #FFF !important;
20 | box-shadow: 0 14px 26px -12px rgba(255, 152, 0, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(255, 152, 0, 0.2) !important;
21 | }
22 |
23 | .v-tab .tab-link.active{
24 | background-color: #00bcd4 !important;
25 | color: #FFF !important;
26 | box-shadow: 0 14px 26px -12px rgba(0, 188, 212, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 188, 212, 0.2) !important;
27 | }
28 |
29 | .v-tab .tab-link{
30 | margin-bottom: 10px;
31 | }
32 |
33 | .h-tab .tab-link, .v-tab .tab-link{
34 | box-shadow: none !important;
35 | background-color: transparent !important;
36 | color: #555 !important;
37 | }
38 |
39 | .h-tab .tab-link:hover, .v-tab .tab-link:hover{
40 | background-color: rgba(200, 200, 200, 0.2) !important;
41 | }
42 |
43 | .h-tab .tab-link.active:hover{
44 | background-color: #ff9800 !important;
45 | }
46 |
47 | .v-tab .tab-link.active:hover{
48 | background-color: #00bcd4 !important;
49 | }
50 |
51 | .h-tab .tab-content{
52 | padding-top: 20px;
53 | }
54 |
--------------------------------------------------------------------------------
/src/app/dashboard/component/panels/panels.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
Navigation Pills - Horizontal Tabs
7 |
8 |
9 | PROFILE
10 | SETTINGS
11 | OPTIONS
12 |
13 |
14 | Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base benefits.
15 | Dramatically visualize customer directed convergence without revolutionary ROI. Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base benefits.
16 | This is very nice.
17 |
18 |
19 | Efficiently unleash cross-media information without cross-media value. Quickly maximize timely deliverables for real-time schemas.
20 | Dramatically maintain clicks-and-mortar solutions without functional solutions.
21 |
22 |
23 | Completely synergize resource taxing relationships via premier niche markets. Professionally cultivate one-to-one customer service with robust ideas.
24 | Dynamically innovate resource-leveling customer service for state of the art customer service.
25 |
26 |
27 |
28 |
29 |
30 |
31 |
Navigation Pills - Vertical Tabs
32 |
33 |
34 | PROFILE
35 | SETTINGS
36 | OPTIONS
37 |
38 |
39 |
40 | Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base benefits.
41 | Dramatically visualize customer directed convergence without revolutionary ROI. Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base benefits.
42 | This is very nice.
43 |
44 |
45 | Efficiently unleash cross-media information without cross-media value. Quickly maximize timely deliverables for real-time schemas.
46 | Dramatically maintain clicks-and-mortar solutions without functional solutions.
47 |
48 |
49 | Completely synergize resource taxing relationships via premier niche markets. Professionally cultivate one-to-one customer service with robust ideas.
50 | Dynamically innovate resource-leveling customer service for state of the art customer service.
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/src/app/dashboard/component/panels/panels.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit, AfterViewInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-panels',
5 | templateUrl: './panels.component.html',
6 | styleUrls: ['./panels.component.css']
7 | })
8 | export class PanelsComponent implements OnInit, AfterViewInit {
9 | constructor() {
10 | }
11 |
12 | ngOnInit() {
13 | }
14 | ngAfterViewInit() {
15 | const activeTabs = document.getElementsByClassName('default-active');
16 | for (let i = 0; i < activeTabs.length; i++) {
17 | (activeTabs[i]).click();
18 | }
19 | }
20 |
21 | tabClick(evt, id) {
22 | const tabcontents = document.querySelectorAll('.h-tab .tab-content');
23 | for (let i = 0; i < tabcontents.length; i++) {
24 | (tabcontents[i]).style.display = 'none';
25 | }
26 | const tablinks = document.querySelectorAll('.h-tab .tab-link');
27 | for (let i = 0; i < tablinks.length; i++) {
28 | const tablink = tablinks[i];
29 | tablink.className = tablink.className.replace(' active', '');
30 | }
31 | document.getElementById(id).style.display = 'block';
32 | evt.currentTarget.className += ' active';
33 | }
34 | vTabClick(evt, id) {
35 | const tabcontents = document.querySelectorAll('.v-tab .tab-content');
36 | for (let i = 0; i < tabcontents.length; i++) {
37 | (tabcontents[i]).style.display = 'none';
38 | }
39 | const tablinks = document.querySelectorAll('.v-tab .tab-link');
40 | for (let i = 0; i < tablinks.length; i++) {
41 | const tablink = tablinks[i];
42 | tablink.className = tablink.className.replace(' active', '');
43 | }
44 | document.getElementById(id).style.display = 'block';
45 | evt.currentTarget.className += ' active';
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/app/dashboard/component/pricetable/pricetable.component.css:
--------------------------------------------------------------------------------
1 | .card{
2 | padding: 25px 20px 20px 20px;
3 | display: flex;
4 | flex-direction: column;
5 | align-items: center;
6 | }
7 |
8 | .card h6, p {
9 | color: #999;
10 | }
11 |
12 | .icon{
13 | margin-top: 20px;
14 | width: 130px;
15 | height: 130px;
16 | border: 1px solid #e5e5e5;
17 | border-radius: 50%;
18 | display: flex;
19 | justify-content: center;
20 | align-items: center;
21 | }
22 |
23 | .icon i{
24 | font-size: 55px;
25 | color: #e91e63;
26 | }
27 |
28 | .card-title{
29 | margin-top: 30px;
30 | margin-bottom: 3px;
31 | }
32 |
33 | .card-description{
34 | margin-bottom: 20px;
35 | }
36 |
--------------------------------------------------------------------------------
/src/app/dashboard/component/pricetable/pricetable.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
Individual
9 |
10 | person
11 |
12 |
Free
13 |
14 | This is good if your company size is between 2 and 10 Persons.
15 |
16 |
CHOOSE PLAN
17 |
18 |
19 |
20 |
21 |
Small Company
22 |
23 | weekend
24 |
25 |
$29 / m
26 |
27 | This is good if your company size is between 2 and 10 Persons.
28 |
29 |
CHOOSE PLAN
30 |
31 |
32 |
33 |
34 |
Enterprise
35 |
36 | home
37 |
38 |
$79 / m
39 |
40 | This is good if your company size is between 2 and 10 Persons.
41 |
42 |
CHOOSE PLAN
43 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/src/app/dashboard/component/pricetable/pricetable.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-pricetable',
5 | templateUrl: './pricetable.component.html',
6 | styleUrls: ['./pricetable.component.css']
7 | })
8 | export class PriceTableComponent implements OnInit {
9 |
10 | constructor() { }
11 |
12 | ngOnInit() {
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/dashboard/component/wizard/wizard.component.css:
--------------------------------------------------------------------------------
1 | .wizard-panel{
2 |
3 | }
4 |
5 | .wizard-header{
6 | padding: 25px 0 35px;
7 | }
8 |
9 | .wizard-navigation{
10 | position: relative;
11 | }
12 |
13 | .nav-pills{
14 | background-color: rgba(200, 200, 200, 0.2);
15 | width: 100%;
16 | }
17 |
18 | .nav-pills li{
19 | width: 33.3333%;
20 | float: left;
21 | margin-left: 0;
22 | font-size: 12px;
23 | font-weight: 500;
24 | min-width: 100px;
25 | color: #555;
26 | padding: 10px 0;
27 | }
28 |
29 | .move-tab{
30 | position: absolute;
31 | background-color: #f44336;
32 | box-shadow: 0 16px 26px -10px rgba(244, 67, 54, 0.56), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(244, 67, 54, 0.2);
33 | font-weight: 500;
34 | border-radius: 4px;
35 | color: #fff;
36 | top: -2px;
37 | left: -1vw;
38 | width: calc((100% - 260px) / 2);
39 | height: 114%;
40 | display: flex;
41 | justify-content: center;
42 | align-items: center;
43 | transition: all 500ms cubic-bezier(0.29, 1.42, 0.79, 1);
44 | }
45 |
46 | .wizard-body{
47 | min-height: 350px;
48 | padding: 15px;
49 | }
50 |
51 | .wizard-footer{
52 | display: flex;
53 | padding: 10px;
54 | justify-content: space-between;
55 | }
56 |
--------------------------------------------------------------------------------
/src/app/dashboard/component/wizard/wizard.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
10 |
11 |
12 | About
13 | Account
14 | Address
15 |
16 |
About
17 |
18 |
19 |
20 | tab 1
21 |
22 |
23 | tab 2
24 |
25 |
26 | tab 3
27 |
28 |
29 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/src/app/dashboard/component/wizard/wizard.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit, AfterViewInit } from '@angular/core';
2 | declare const $: any;
3 |
4 | @Component({
5 | selector: 'app-wizard',
6 | templateUrl: './wizard.component.html',
7 | styleUrls: ['./wizard.component.css']
8 | })
9 | export class WizardComponent implements OnInit, AfterViewInit {
10 | tabIndex = 0;
11 | constructor() { }
12 |
13 | ngOnInit() {
14 | }
15 | ngAfterViewInit() {
16 | const preBtn = document.getElementById('preBtn');
17 | const moveTab = document.querySelector('.move-tab');
18 | preBtn.style.visibility = 'hidden';
19 | // to ensure moveTab can stay correct position
20 | $(window).resize(() => {
21 | const screenWidth = document.body.clientWidth;
22 | if (screenWidth > 990) {
23 | moveTab.style.width = 'calc((100% - 260px) / 2)';
24 | if (this.tabIndex === 1) {
25 | moveTab.style.left = '20vw';
26 | } else if (this.tabIndex === 2) {
27 | moveTab.style.left = '42vw';
28 | }
29 | } else {
30 | moveTab.style.width = '34%';
31 | if (this.tabIndex === 1) {
32 | moveTab.style.left = '30vw';
33 | } else if (this.tabIndex === 2) {
34 | moveTab.style.left = '61.5vw';
35 | }
36 | }
37 | });
38 | const tabs = document.getElementsByClassName('wizard-tab');
39 | for (let i = 1; i < tabs.length; i++) {
40 | (tabs[i]).style.display = 'none';
41 | }
42 | }
43 |
44 | preOnClick() {
45 | const moveTab = document.querySelector('.move-tab');
46 | const nextBtn = document.getElementById('nextBtn');
47 | const preBtn = document.getElementById('preBtn');
48 | const tabs = document.getElementsByClassName('wizard-tab');
49 | const screenWidth = document.body.clientWidth;
50 | for (let i = 0; i < tabs.length; i++) {
51 | (tabs[i]).style.display = 'none';
52 | }
53 | if (this.tabIndex === 2) {
54 | this.tabIndex--;
55 | moveTab.style.left = screenWidth > 990 ? '20vw' : '30vw';
56 | nextBtn.style.visibility = 'visible';
57 | moveTab.innerHTML = 'Account';
58 | }else if (this.tabIndex === 1) {
59 | this.tabIndex--;
60 | moveTab.style.left = '-1vw';
61 | preBtn.style.visibility = 'hidden';
62 | moveTab.innerHTML = 'About';
63 | }
64 | (tabs[this.tabIndex]).style.display = 'inherit';
65 | }
66 |
67 | nextOnClick() {
68 | const moveTab = document.querySelector('.move-tab');
69 | const nextBtn = document.getElementById('nextBtn');
70 | const preBtn = document.getElementById('preBtn');
71 | const tabs = document.getElementsByClassName('wizard-tab');
72 | const screenWidth = document.body.clientWidth;
73 | for (let i = 0; i < tabs.length; i++) {
74 | (tabs[i]).style.display = 'none';
75 | }
76 | if (this.tabIndex === 0) {
77 | this.tabIndex++;
78 | moveTab.style.left = screenWidth > 990 ? '20vw' : '30vw';
79 | preBtn.style.visibility = 'visible';
80 | moveTab.innerHTML = 'Account';
81 | }else if (this.tabIndex === 1) {
82 | this.tabIndex++;
83 | moveTab.style.left = screenWidth > 990 ? '42vw' : '61.5vw';
84 | nextBtn.style.visibility = 'hidden';
85 | moveTab.innerHTML = 'Address';
86 | }
87 | (tabs[this.tabIndex]).style.display = 'inherit';
88 | }
89 |
90 | }
91 |
--------------------------------------------------------------------------------
/src/app/dashboard/home/home.component.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/app/dashboard/home/home.component.css
--------------------------------------------------------------------------------
/src/app/dashboard/home/home.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
49 |
78 |
79 |
80 |
81 |
--------------------------------------------------------------------------------
/src/app/dashboard/home/home.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-home',
5 | templateUrl: './home.component.html',
6 | styleUrls: ['./home.component.css']
7 | })
8 | export class HomeComponent implements OnInit {
9 | constructor() {
10 | }
11 |
12 | ngOnInit() {
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/dashboard/notification/notification.component.css:
--------------------------------------------------------------------------------
1 | .notification-card{
2 | padding: 23px 20px 18px 20px;
3 | }
4 |
5 | .notification-card h4{
6 | margin-bottom: 15px;
7 | }
8 |
9 | .place{
10 | padding: 20px;
11 | }
12 |
--------------------------------------------------------------------------------
/src/app/dashboard/notification/notification.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
Notifications
5 |
6 |
9 |
10 |
11 |
12 |
Notifications Style
13 |
14 | This is a plain notification
15 |
16 |
17 | close
18 | This is a plain notification
19 |
20 |
21 | notifications
22 | close
23 | This is a notification with close button and icon and have many lines. You can see that the icon and the close button are always vertically aligned. This is a beautiful notification. So you don't have to worry about the style.
24 |
25 |
26 | notifications
27 | close
28 | This is a notification with close button and icon and have many lines. You can see that the icon and the close button are always vertically aligned. This is a beautiful notification. So you don't have to worry about the style.
29 |
30 |
31 |
32 |
33 |
34 |
Notification States
35 |
36 | close
37 | INFO - This is a regular notification made with ".alert-info"
38 |
39 |
40 | close
41 | SUCCESS - This is a regular notification made with ".alert-success"
42 |
43 |
44 | close
45 | WARNING - This is a regular notification made with ".alert-warning"
46 |
47 |
48 | close
49 | DANGER - This is a regular notification made with ".alert-danger"
50 |
51 |
52 | close
53 | PRIMARY - This is a regular notification made with ".alert-primary"
54 |
55 |
56 | close
57 | ROSE - This is a regular notification made with ".alert-rose"
58 |
59 |
60 |
61 |
62 |
63 |
64 |
Notifications Places
65 |
Click to view notifications
66 |
67 |
68 |
69 | TOP LEFT
70 |
71 |
72 | TOP CENTER
73 |
74 |
75 | TOP RIGHT
76 |
77 |
78 |
79 |
80 |
81 |
82 | BOTTOM LEFT
83 |
84 |
85 | BOTTOM CENTER
86 |
87 |
88 | BOTTOM RIGHT
89 |
90 |
91 |
92 |
93 |
94 |
95 |
--------------------------------------------------------------------------------
/src/app/dashboard/notification/notification.component.ts:
--------------------------------------------------------------------------------
1 | import {Component, OnInit} from '@angular/core';
2 | declare const $: any;
3 |
4 | @Component({
5 | selector: 'app-notification',
6 | templateUrl: './notification.component.html',
7 | styleUrls: ['./notification.component.css']
8 | })
9 | export class NotificationComponent implements OnInit {
10 |
11 | constructor() {
12 | }
13 |
14 | ngOnInit() {
15 | }
16 |
17 | btnClick(position) {
18 | let from = 'top';
19 | let align = 'right';
20 | let type = 'info';
21 | switch (position) {
22 | case 'top-left':
23 | align = 'left';
24 | type = 'rose';
25 | break;
26 | case 'top-center':
27 | align = 'center';
28 | type = 'success';
29 | break;
30 | case 'bottom-left':
31 | align = 'left';
32 | from = 'bottom';
33 | type = 'primary';
34 | break;
35 | case 'bottom-center':
36 | align = 'center';
37 | from = 'bottom';
38 | type = 'warning';
39 | break;
40 | case 'bottom-right':
41 | from = 'bottom';
42 | type = 'danger';
43 | break;
44 | }
45 | $.notify({
46 | message: 'Welcome to MATERIAL DASHBOARD - a beautiful dashboard for every web developer.',
47 | }, {
48 | placement: {from, align},
49 | offset: {x: 20, y: 35},
50 | type,
51 | template: `
52 | notifications
53 | close
54 | {2}
55 |
`
56 | });
57 | }
58 |
59 | }
60 |
--------------------------------------------------------------------------------
/src/app/dashboard/profile/profile.component.css:
--------------------------------------------------------------------------------
1 | .right-profile{
2 | display: flex;
3 | flex-direction: column;
4 | align-items: center;
5 | padding: 25px;
6 | position: relative;
7 | /*margin-top: 60px;*/
8 | }
9 |
10 | .profile{
11 | position: absolute;
12 | top: -40px;
13 | }
14 |
15 | .profile img{
16 | border-radius: 50%;
17 | width: 130px;
18 | box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2);
19 | }
20 |
21 | .right-profile h6{
22 | margin-top: 100px;
23 | margin-bottom: 8px;
24 | color: #999;
25 | }
26 |
27 | .right-profile h4{
28 | margin-bottom: 5px;
29 | }
30 |
31 | .right-profile p{
32 | color: #999;
33 | }
34 |
35 | .right-profile button {
36 | margin-top: 15px;
37 | }
38 |
39 | .card{
40 | display: flex;
41 | flex-direction: column;
42 | padding: 20px;
43 | position: relative;
44 | margin-top: 40px;
45 | }
46 |
47 | .card-header {
48 | position: absolute;
49 | text-align: center;
50 | background: linear-gradient(60deg, #ec407a, #d81b60);
51 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(233, 30, 99, 0.4);
52 | /*margin: -20px 15px 0;*/
53 | border-radius: 3px;
54 | padding: 15px;
55 | top: -23px;
56 | }
57 |
58 | .card-header i {
59 | font-size: 24px;
60 | width: 33px;
61 | height: 33px;
62 | line-height: 33px;
63 | color: #fff;
64 | }
65 |
66 | .card-content{
67 | position: relative;
68 | }
69 |
70 | .card-title{
71 | padding-left: 80px;
72 | }
73 |
74 | .mat-input-container{
75 | width: 100%;
76 | }
77 |
78 | .category{
79 | font-weight: 300;
80 | }
81 |
82 | form{
83 | margin-top: 30px;
84 | }
85 |
86 | .row{
87 | margin-top: 15px;
88 | }
89 |
90 | .mat-input-container textarea{
91 | height: 90px;
92 | }
93 |
94 | .textarea-label{
95 | color: #aaa;
96 | margin-bottom: 10px;
97 | }
98 |
99 | .action-btn{
100 | display: flex;
101 | justify-content: flex-end;
102 | padding-right: 15px;
103 | }
104 |
--------------------------------------------------------------------------------
/src/app/dashboard/profile/profile.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
9 |
10 |
Edit Profile -
11 | Complete your profile
12 |
13 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
CEO / CO-FOUNDER
71 |
{{ firstName }} {{ lastName }}
72 |
Don't be scared of the truth because we need to restart the human foundation in truth And I love you like
73 | Kanye loves Kanye I love Rick Owens’ bed design but the back is...
74 |
CHANGE
75 |
76 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/src/app/dashboard/profile/profile.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-profile',
5 | templateUrl: './profile.component.html',
6 | styleUrls: ['./profile.component.css']
7 | })
8 | export class ProfileComponent implements OnInit {
9 | firstName: string;
10 | lastName: string;
11 | constructor() { }
12 |
13 | ngOnInit() {
14 | this.firstName = 'Alec';
15 | this.lastName = 'Thompson';
16 | }
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/src/app/dashboard/root/root.component.css:
--------------------------------------------------------------------------------
1 | .wrapper {
2 | position: relative;
3 | top: 0;
4 | height: 100vh;
5 | display: flex;
6 | width: 100%;
7 | flex: 1;
8 | }
9 |
10 | .sidebar-panel{
11 | width: 260px;
12 | position: fixed;
13 | height: 100%;
14 | /*background-color: #D80B0B;*/
15 | box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2);
16 | -webkit-transition: all 500ms;
17 | -moz-transition: all 500ms;
18 | -ms-transition: all 500ms;
19 | -o-transition: all 500ms;
20 | transition: all 500ms;
21 | }
22 |
23 | .main-panel{
24 | width: 100%;
25 | flex: 1;
26 | padding-left: 260px;
27 | }
28 |
29 | .sidebar-background{
30 | position: absolute;
31 | z-index: 0;
32 | height: 100%;
33 | width: 100%;
34 | display: block;
35 | top: 0;
36 | left: 0;
37 | background-size: cover;
38 | background-position: center center;
39 | opacity: 0.2;
40 | filter: alpha(opacity=10);
41 | -webkit-transition: all 500ms;
42 | -moz-transition: all 500ms;
43 | -ms-transition: all 500ms;
44 | -o-transition: all 500ms;
45 | transition: all 500ms;
46 | }
47 |
48 |
--------------------------------------------------------------------------------
/src/app/dashboard/root/root.component.html:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/src/app/dashboard/root/root.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit, OnDestroy } from '@angular/core';
2 | import { SettingsService } from '../../services/settings.service';
3 |
4 | @Component({
5 | selector: 'app-root',
6 | templateUrl: './root.component.html',
7 | styleUrls: ['./root.component.css']
8 | })
9 | export class RootComponent implements OnInit, OnDestroy {
10 | public id: number;
11 | public backgroundColor: string;
12 | constructor(public settingService: SettingsService) {
13 | this.id = settingService.getSidebarImageIndex() + 1;
14 | this.backgroundColor = settingService.getSidebarColor();
15 | }
16 |
17 | ngOnInit() {
18 | this.settingService.sidebarImageIndexUpdate.subscribe((id: number) => {
19 | this.id = id + 1;
20 | });
21 | this.settingService.sidebarColorUpdate.subscribe((color: string) => {
22 | this.backgroundColor = color;
23 | });
24 | }
25 |
26 | ngOnDestroy() {
27 | this.settingService.sidebarImageIndexUpdate.unsubscribe();
28 | this.settingService.sidebarColorUpdate.unsubscribe();
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/app/dashboard/settings/settings.component.css:
--------------------------------------------------------------------------------
1 | .sidebar-btn{
2 | background-color: transparent;
3 | border: none;
4 | outline: none;
5 | }
6 |
7 | .sidebar-img{
8 | max-width: 100%;
9 | border-radius: 10px;
10 | margin-top: 10px;
11 | cursor: pointer;
12 | -webkit-transition: all 400ms;
13 | -moz-transition: all 400ms;
14 | -ms-transition: all 400ms;
15 | -o-transition: all 400ms;
16 | transition: all 400ms;
17 | border: 4px solid transparent;
18 | }
19 |
20 | .btn-hover:hover{
21 | border-color: rgba(0, 187, 255, 0.5);
22 | -webkit-transition: all 400ms;
23 | -moz-transition: all 400ms;
24 | -ms-transition: all 400ms;
25 | -o-transition: all 400ms;
26 | transition: all 400ms;
27 | }
28 |
29 | .active{
30 | border-color: #00bbff;
31 | }
32 |
33 | .dot-row{
34 | display: flex;
35 | justify-content: center;
36 | margin: 20px 0 40px 0;
37 | }
38 |
39 | .dot{
40 | border: 3px solid transparent;
41 | border-radius: 50%;
42 | width: 23px;
43 | height: 23px;
44 | margin: 0 10px;
45 | cursor: pointer;
46 | }
47 |
48 | .purple{
49 | background-color: #9c27b0;
50 | }
51 |
52 | .blue{
53 | background-color: #00bcd4;
54 | }
55 |
56 | .dodgerblue{
57 | background-color: dodgerblue;
58 | }
59 |
60 | .green{
61 | background-color: #4caf50;
62 | }
63 |
64 | .orange{
65 | background-color: #ff9800;
66 | }
67 |
68 | .red{
69 | background-color: #f44336;
70 | }
71 |
72 | .white{
73 | background-color: rgba(200, 200, 200, 0.2);
74 | }
75 |
76 | .rose{
77 | background-color: #e91e63;
78 | }
79 |
80 | .black{
81 | background-color: #000;
82 | }
83 |
--------------------------------------------------------------------------------
/src/app/dashboard/settings/settings.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
Sidebar Filters
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
Sidebar Background
19 |
25 |
26 |
27 |
28 |
SideBar Background Image
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/src/app/dashboard/settings/settings.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 | import { SettingsService } from '../../services/settings.service';
3 |
4 | @Component({
5 | selector: 'app-settings',
6 | templateUrl: './settings.component.html',
7 | styleUrls: ['./settings.component.css']
8 | })
9 | export class SettingsComponent implements OnInit {
10 |
11 | constructor(public settingService: SettingsService) { }
12 |
13 | ngOnInit() {
14 | const defaultId = this.settingService.getSidebarImageIndex();
15 | const sidebarImgs: HTMLCollection = document.getElementsByClassName('sidebar-img');
16 | sidebarImgs[defaultId].className = sidebarImgs[defaultId].className + ' active';
17 | }
18 |
19 | bgChooseClick(id) {
20 | this.settingService.setSidebarImageIndex(id);
21 | const sidebarImgs: HTMLCollection = document.getElementsByClassName('sidebar-img');
22 | for (let i = 0; i < sidebarImgs.length; i++) {
23 | sidebarImgs[i].className = sidebarImgs[i].className.replace(' active', '');
24 | }
25 | sidebarImgs[id].className = sidebarImgs[id].className + ' active';
26 | }
27 |
28 | filterChooseClick(color) {
29 | this.settingService.setSidebarFilter(color);
30 | }
31 |
32 | bgColorChooseClick(color) {
33 | this.settingService.setSidebarColor(color);
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/app/dashboard/sweetalert/sweetalert.component.css:
--------------------------------------------------------------------------------
1 | .card{
2 | display: flex;
3 | flex-direction: column;
4 | padding: 25px 20px 22px 20px;
5 | align-items: center;
6 | margin-top: 30px;
7 | }
8 |
9 | .card h5{
10 | margin-bottom: 20px;
11 | text-align: center;
12 | }
13 |
--------------------------------------------------------------------------------
/src/app/dashboard/sweetalert/sweetalert.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
Sweet Alert 2
5 |
6 |
9 |
10 |
11 |
12 |
Basic example
13 | TRY ME!
14 |
15 |
16 |
17 |
18 |
A title with a text under
19 | TRY ME!
20 |
21 |
22 |
23 |
24 |
A success message
25 | TRY ME!
26 |
27 |
28 |
29 |
30 |
Custom HTML description
31 | TRY ME!
32 |
33 |
34 |
35 |
36 |
37 |
38 |
A warning message, with a function attached to the "Confirm" Button...
39 | TRY ME!
40 |
41 |
42 |
43 |
44 |
...and by passing a parameter, you can execute something else for "Cancel"
45 | TRY ME!
46 |
47 |
48 |
49 |
50 |
A message with auto close timer set to 2 seconds
51 | TRY ME!
52 |
53 |
54 |
55 |
56 |
Modal window with input field
57 | TRY ME!
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/src/app/dashboard/sweetalert/sweetalert.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 | declare const swal: any;
3 |
4 | @Component({
5 | selector: 'app-sweetalert',
6 | templateUrl: './sweetalert.component.html',
7 | styleUrls: ['./sweetalert.component.css']
8 | })
9 | export class SweetAlertComponent implements OnInit {
10 |
11 | constructor() { }
12 |
13 | ngOnInit() {
14 | }
15 |
16 | openAlert(type) {
17 | switch (type) {
18 | case 'basic':
19 | swal({
20 | title: 'Here\'s a message!',
21 | confirmButtonClass: 'btn btn-success'
22 | });
23 | break;
24 | case 'text':
25 | swal({
26 | title: 'Good job!',
27 | text: 'It\'s pretty, isn\'t it?',
28 | confirmButtonClass: 'btn btn-info'
29 | });
30 | break;
31 | case 'success':
32 | swal({
33 | title: 'Good job!',
34 | text: 'You clicked the button!',
35 | type: 'success',
36 | confirmButtonClass: 'btn btn-success'
37 | });
38 | break;
39 | case 'html':
40 | swal({
41 | title: 'HTML example ',
42 | type: 'info',
43 | html:
44 | `You can use bold text links and other HTML tags`,
45 | showCloseButton: true,
46 | showCancelButton: true,
47 | confirmButtonText: ' Great!',
48 | cancelButtonText: ' ',
49 | confirmButtonClass: 'btn btn-primary',
50 | cancelButtonClass: 'btn btn-warning'
51 | });
52 | break;
53 | case 'confirm':
54 | swal({
55 | title: 'Are you sure?',
56 | text: 'You won\'t be able to revert this!',
57 | type: 'warning',
58 | showCancelButton: true,
59 | confirmButtonClass: 'btn btn-success',
60 | cancelButtonClass: 'btn btn-danger',
61 | confirmButtonText: 'YES, DELETE IT!'
62 | }).then(function () {
63 | swal({
64 | title: 'Deleted!',
65 | text: 'Your file has been deleted.',
66 | type: 'success',
67 | confirmButtonClass: 'btn btn-info'
68 | });
69 | });
70 | break;
71 | case 'cancel':
72 | swal({
73 | title: 'Are you sure?',
74 | text: 'You won\'t be able to revert this!',
75 | type: 'warning',
76 | showCancelButton: true,
77 | confirmButtonText: 'YES, DELETE IT!',
78 | cancelButtonText: 'NO, CANCEL!',
79 | confirmButtonClass: 'btn btn-success',
80 | cancelButtonClass: 'btn btn-danger',
81 | buttonsStyling: false
82 | }).then(function () {
83 | swal({
84 | title: 'Deleted!',
85 | text: 'Your file has been deleted.',
86 | type: 'success',
87 | confirmButtonClass: 'btn btn-info'
88 | });
89 | }, function (dismiss) {
90 | // dismiss can be 'cancel', 'overlay',
91 | // 'close', and 'timer'
92 | if (dismiss === 'cancel') {
93 | swal({
94 | title: 'Cancelled',
95 | text: 'Your imaginary file is safe :)',
96 | type: 'error',
97 | confirmButtonClass: 'btn btn-info'
98 | });
99 | }
100 | });
101 | break;
102 | case 'close':
103 | swal({
104 | title: 'Auto close alert!',
105 | text: 'I will close in 2 seconds.',
106 | timer: 2000,
107 | showConfirmButton: false
108 | }).then(
109 | function () {},
110 | // handling the promise rejection
111 | function (dismiss) {
112 | if (dismiss === 'timer') {
113 | console.log('I was closed by the timer');
114 | }
115 | }
116 | );
117 | break;
118 | case 'input':
119 | swal({
120 | title: 'Input something',
121 | input: 'text',
122 | inputClass: 'mat-input-container',
123 | showCancelButton: true,
124 | confirmButtonText: 'OK',
125 | confirmButtonClass: 'btn btn-success',
126 | cancelButtonClass: 'btn btn-danger',
127 | showLoaderOnConfirm: true,
128 | preConfirm: function (text) {
129 | swal({
130 | text: 'Your entered: ' + text,
131 | type: 'success',
132 | confirmButtonClass: 'btn btn-info'
133 | });
134 | },
135 | allowOutsideClick: false
136 | });
137 | break;
138 | }
139 | }
140 |
141 | }
142 |
--------------------------------------------------------------------------------
/src/app/dashboard/table/table.component.css:
--------------------------------------------------------------------------------
1 | .row{
2 | margin-top: 10px;
3 | }
4 |
5 | .card{
6 | display: flex;
7 | flex-direction: column;
8 | padding: 20px;
9 | position: relative;
10 | margin-top: 40px;
11 | }
12 |
13 | .card-header {
14 | position: absolute;
15 | text-align: center;
16 | background: linear-gradient(60deg, #ec407a, #d81b60);
17 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(233, 30, 99, 0.4);
18 | /*margin: -20px 15px 0;*/
19 | border-radius: 3px;
20 | padding: 15px;
21 | top: -23px;
22 | }
23 |
24 | .card-header i {
25 | font-size: 24px;
26 | width: 33px;
27 | height: 33px;
28 | line-height: 33px;
29 | color: #fff;
30 | }
31 |
32 | .card-content{
33 | position: relative;
34 | }
35 |
36 | .card-title{
37 | padding-left: 80px;
38 | }
39 |
--------------------------------------------------------------------------------
/src/app/dashboard/table/table.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
9 |
10 |
Simple Table
11 |
12 |
13 |
14 |
15 | First Name
16 | Country
17 | City
18 | Salary
19 |
20 |
21 |
22 |
23 | Dakota Rice
24 | Niger
25 | Oud-Turnhout
26 | $36,738
27 |
28 |
29 | Minerva Hooper
30 | Curaçao
31 | Sinaai-Waas
32 | $23,789
33 |
34 |
35 | Sage Rodriguez
36 | Netherlands
37 | Baileux
38 | $56,142
39 |
40 |
41 | Philip Chaney
42 | Korea, South
43 | Overland Park
44 | $38,735
45 |
46 |
47 | Doris Greene
48 | Malawi
49 | Feldkirchen in Kärnten
50 | $63,542
51 |
52 |
53 | Mason Porter
54 | Chile
55 | Gloucester
56 | $78,615
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
71 |
72 |
Striped Table
73 |
74 |
75 |
76 |
77 | #
78 |
79 | Product Name
80 | Type
81 | Quantity
82 | Price
83 | Amount
84 |
85 |
86 |
87 |
88 | 1
89 |
90 | Moleskine Agenda
91 | Oud-Office
92 | 25
93 | € 49
94 | € 1,225
95 |
96 |
97 | 2
98 |
99 | Stabilo Pen
100 | Office
101 | 35
102 | € 10
103 | € 300
104 |
105 |
106 | 3
107 |
108 | A4 Paper Pack
109 | Office
110 | 50
111 | € 599.00
112 | € 109
113 |
114 |
115 | 4
116 |
117 | Apple iPad
118 | Meeting
119 | 20
120 | € 10.99
121 | € 4,999
122 |
123 |
124 | 5
125 |
126 | Apple iPhone
127 | Communication
128 | 10
129 | € 499.00
130 | € 5,999
131 |
132 |
133 |
134 | Total
135 | €12,999
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
--------------------------------------------------------------------------------
/src/app/dashboard/table/table.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-table',
5 | templateUrl: './table.component.html',
6 | styleUrls: ['./table.component.css']
7 | })
8 | export class TableComponent implements OnInit {
9 |
10 | constructor() { }
11 |
12 | ngOnInit() {
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/page/lock/lock.component.css:
--------------------------------------------------------------------------------
1 | .container{
2 | height: 100%;
3 | position: relative;
4 | z-index: 1;
5 | }
6 |
7 | .background{
8 | background: url("../../../assets/img/lock_bg.jpg") no-repeat center center;
9 | background-size: cover;
10 | }
11 |
12 | .card{
13 | position: relative;
14 | display: flex;
15 | flex-direction: column;
16 | align-items: center;
17 | width: 100%;
18 | padding: 20px;
19 | margin-top: 70px;
20 | top: -60px;
21 | -webkit-animation-name: card;
22 | -moz-animation-name: card;
23 | -o-animation-name: card;
24 | animation-name: card;
25 | -webkit-animation-duration: 600ms;
26 | -moz-animation-duration: 600ms;
27 | -o-animation-duration: 600ms;
28 | animation-duration: 600ms;
29 | -webkit-animation-fill-mode: forwards;
30 | -moz-animation-fill-mode: forwards;
31 | -o-animation-fill-mode: forwards;
32 | animation-fill-mode: forwards;
33 | }
34 |
35 | @-webkit-keyframes card {
36 | from {top: -40px;}
37 | to {top: 0;}
38 | }
39 |
40 | @keyframes card {
41 | from {top: -40px;}
42 | to {top: 0;}
43 | }
44 |
45 | .card-header img{
46 | position: relative;
47 | top: -60px;
48 | border-radius: 50%;
49 | width: 90px;
50 | box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0 rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2);
51 | }
52 |
53 | .card h4{
54 | margin-top: -30px;
55 | margin-bottom: 20px;
56 | }
57 |
58 | .card-body, .card-body .mat-form-field{
59 | width: 100%;
60 | }
61 |
62 | .card-footer{
63 | margin: 15px 0 5px 0;
64 | }
65 |
--------------------------------------------------------------------------------
/src/app/page/lock/lock.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
10 |
13 |
Tania Andrew
14 |
15 |
16 |
17 |
18 |
19 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/src/app/page/lock/lock.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-lock',
5 | templateUrl: './lock.component.html',
6 | styleUrls: ['./lock.component.css']
7 | })
8 | export class LockComponent implements OnInit {
9 |
10 | constructor() { }
11 |
12 | ngOnInit() {
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/page/login/login.component.css:
--------------------------------------------------------------------------------
1 | .container{
2 | height: 100%;
3 | position: relative;
4 | z-index: 1;
5 | }
6 | .background{
7 | background: url("../../../assets/img/lock_bg.jpg") no-repeat center center;
8 | -webkit-background-size: cover;
9 | -moz-background-size: cover;
10 | -o-background-size: cover;
11 | background-size: cover;
12 | width: 100%;
13 | height: 100%;
14 | }
15 |
16 | .card{
17 | position: relative;
18 | padding: 20px;
19 | display: flex;
20 | flex-direction: column;
21 | align-items: center;
22 | -webkit-animation-name: card;
23 | -moz-animation-name: card;
24 | -o-animation-name: card;
25 | animation-name: card;
26 | -webkit-animation-duration: 600ms;
27 | -moz-animation-duration: 600ms;
28 | -o-animation-duration: 600ms;
29 | animation-duration: 600ms;
30 | -webkit-animation-fill-mode: forwards;
31 | -moz-animation-fill-mode: forwards;
32 | -o-animation-fill-mode: forwards;
33 | animation-fill-mode: forwards;
34 | }
35 |
36 | @-webkit-keyframes card {
37 | from {top: -40px;}
38 | to {top: 0;}
39 | }
40 |
41 | @keyframes card {
42 | from {top: -40px;}
43 | to {top: 0;}
44 | }
45 |
46 | .card-header{
47 | position: relative;
48 | overflow: hidden;
49 | top: -40px;
50 | width: 100%;
51 | padding: 25px;
52 | border-radius: 3px;
53 | background: linear-gradient(60deg, #ec407a, #d81b60);
54 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(233, 30, 99, 0.4);
55 | display: flex;
56 | flex-direction: column;
57 | align-items: center;
58 | }
59 |
60 | .card-header h4{
61 | font-weight: 400;
62 | color: #fff;
63 | margin-bottom: 25px;
64 | margin-top: 5px;
65 | }
66 |
67 | .social-btns i{
68 | font-size: 21px;
69 | color: #fff;
70 | }
71 |
72 | .social-btns button{
73 | margin: 0 8px;
74 | }
75 |
76 | .tip{
77 | margin-top: -20px;
78 | }
79 |
80 | .form-row, .card-form, .mat-form-field{
81 | width: 100%;
82 | }
83 |
84 | .card-form{
85 | padding: 5px;
86 | }
87 |
88 | .form-row{
89 | position: relative;
90 | display: flex;
91 | align-items: center;
92 | margin-top: 13px;
93 | }
94 |
95 | .form-row i{
96 | position: relative;
97 | top: -5px;
98 | margin-right: 15px;
99 | color: #555;
100 | }
101 |
102 | .card-footer{
103 | margin: 10px;
104 | }
105 |
106 | .card-footer button{
107 | color: #e91e63;
108 | }
109 |
--------------------------------------------------------------------------------
/src/app/page/login/login.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
10 |
18 |
Or Be Classical
19 |
39 |
42 |
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/src/app/page/login/login.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-login',
5 | templateUrl: './login.component.html',
6 | styleUrls: ['./login.component.css']
7 | })
8 | export class LoginComponent implements OnInit {
9 |
10 | constructor() { }
11 |
12 | ngOnInit() {
13 | }
14 |
15 | loginBtn() {
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/app/page/register/register.component.css:
--------------------------------------------------------------------------------
1 | .container{
2 | height: 100%;
3 | position: relative;
4 | z-index: 1;
5 | }
6 |
7 | .background {
8 | background: url("../../../assets/img/register_bg.jpg") center center;
9 | background-size: cover;
10 | }
11 |
12 | .register-panel{
13 | margin-top: 25px;
14 | }
15 |
16 | .card{
17 | padding: 40px 0 30px;
18 | }
19 |
20 | .card h2{
21 | text-align: center;
22 | }
23 |
24 | .feature{
25 | display: flex;
26 | /*width: 100%;*/
27 | flex: 1;
28 | margin-top: 50px;
29 | }
30 |
31 | .feature .icon{
32 | width: 40px;
33 | }
34 |
35 | .feature .icon i{
36 | font-size: 2.6em;
37 | }
38 |
39 | .feature .desc{
40 | flex: 1;
41 | margin-left: 10px;
42 | }
43 |
44 | .feature .desc p{
45 | margin-top: 17px;
46 | }
47 |
48 | .feature .desc h4{
49 | margin-top: 8px;
50 | }
51 |
52 | .form-part{
53 | display: flex;
54 | flex-direction: column;
55 | align-items: center;
56 | width: 100%;
57 | padding-left: 25px;
58 | }
59 |
60 | .form-part .row{
61 | width: 100%;
62 | display: flex;
63 | position: relative;
64 | margin-top: 17px;
65 | }
66 |
67 | .form-part .row .mat-input-container{
68 | width: 100%;
69 | }
70 |
71 | .form-part .row i{
72 | margin-right: 13px;
73 | position: relative;
74 | top: 8px;
75 | color: #555;
76 | }
77 |
78 | .form-part .socials{
79 | margin-top: 40px;
80 | margin-bottom: 25px;
81 | }
82 |
83 | .form-part .row button{
84 | margin-top: 15px;
85 | }
86 |
--------------------------------------------------------------------------------
/src/app/page/register/register.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
10 |
Register
11 |
12 |
13 |
14 |
15 | timeline
16 |
17 |
18 |
Marking
19 |
We've created the marketing campaign of the website. It was a very interesting collaboration.
20 |
21 |
22 |
23 |
24 | code
25 |
26 |
27 |
Fully Coded in HTML5
28 |
We've developed the website with HTML5 and CSS3. The client has access to the code using GitHub.
29 |
30 |
31 |
32 |
33 | group
34 |
35 |
36 |
Built Audience
37 |
There is also a Fully Customizable CMS Admin Dashboard for this product.
38 |
39 |
40 |
41 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
--------------------------------------------------------------------------------
/src/app/page/register/register.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-register',
5 | templateUrl: './register.component.html',
6 | styleUrls: ['./register.component.css']
7 | })
8 | export class RegisterComponent implements OnInit {
9 |
10 | constructor() { }
11 |
12 | ngOnInit() {
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/services/settings.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable, EventEmitter } from '@angular/core';
2 |
3 | @Injectable()
4 | export class SettingsService {
5 | public sidebarImageIndex = 0;
6 | public sidebarImageIndexUpdate: EventEmitter = new EventEmitter();
7 | public sidebarFilter = '#fff';
8 | public sidebarFilterUpdate: EventEmitter = new EventEmitter();
9 | public sidebarColor = '#D80B0B';
10 | public sidebarColorUpdate: EventEmitter = new EventEmitter();
11 |
12 | constructor() { }
13 |
14 | getSidebarImageIndex(): number {
15 | return this.sidebarImageIndex;
16 | }
17 | setSidebarImageIndex(id) {
18 | this.sidebarImageIndex = id;
19 | this.sidebarImageIndexUpdate.emit(this.sidebarImageIndex);
20 | }
21 | getSidebarFilter(): string {
22 | return this.sidebarFilter;
23 | }
24 | setSidebarFilter(color: string) {
25 | this.sidebarFilter = color;
26 | this.sidebarFilterUpdate.emit(this.sidebarFilter);
27 | }
28 | getSidebarColor(): string {
29 | return this.sidebarColor;
30 | }
31 | setSidebarColor(color: string) {
32 | this.sidebarColor = color;
33 | this.sidebarColorUpdate.emit(this.sidebarColor);
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/app/shared/figurecard/figurecard.component.css:
--------------------------------------------------------------------------------
1 | .figure-card{
2 | display: inline-block;
3 | position: relative;
4 | width: 100%;
5 | margin: 25px 0;
6 | }
7 |
8 | .card-content{
9 | text-align: right;
10 | padding: 15px 20px 13px 20px;
11 | }
12 |
13 | .card-header {
14 | float: left;
15 | text-align: center;
16 | /*background: linear-gradient(60deg, #ffa726, #fb8c00);*/
17 | /*box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(255, 152, 0, 0.4);*/
18 | margin: -20px 15px 0;
19 | border-radius: 3px;
20 | padding: 15px;
21 | position: relative;
22 | }
23 |
24 | .card-header i {
25 | font-size: 36px;
26 | line-height: 56px;
27 | width: 56px;
28 | height: 56px;
29 | color: #fff;
30 | }
31 |
32 | .category{
33 | color: #999;
34 | }
35 |
36 | .card-footer{
37 | margin: 0 20px 10px;
38 | padding-top: 10px;
39 | border-top: 1px solid #eee;
40 | color: #999;
41 | font-size: 12px;
42 | position: relative;
43 | }
44 |
45 | .card-footer i {
46 | font-size: 16px;
47 | position: relative;
48 | top: 4px;
49 | color: #999;
50 | }
51 |
--------------------------------------------------------------------------------
/src/app/shared/figurecard/figurecard.component.html:
--------------------------------------------------------------------------------
1 |
13 |
--------------------------------------------------------------------------------
/src/app/shared/figurecard/figurecard.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit, Input } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-figurecard',
5 | templateUrl: './figurecard.component.html',
6 | styleUrls: ['./figurecard.component.css']
7 | })
8 | export class FigurecardComponent implements OnInit {
9 | @Input() headerIcon: string;
10 | @Input() category: string;
11 | @Input() title: string;
12 | @Input() footerIcon: string;
13 | @Input() footContent: string;
14 | @Input() linearColor: string;
15 | @Input() boxShadow: string;
16 | constructor() { }
17 |
18 | ngOnInit() {
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/src/app/shared/footer/footer.component.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/app/shared/footer/footer.component.css
--------------------------------------------------------------------------------
/src/app/shared/footer/footer.component.html:
--------------------------------------------------------------------------------
1 |
2 | footer works!
3 |
4 |
--------------------------------------------------------------------------------
/src/app/shared/footer/footer.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-footer',
5 | templateUrl: './footer.component.html',
6 | styleUrls: ['./footer.component.css']
7 | })
8 | export class FooterComponent implements OnInit {
9 |
10 | constructor() { }
11 |
12 | ngOnInit() {
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/shared/header/header.component.css:
--------------------------------------------------------------------------------
1 | header{
2 | display: flex;
3 | justify-content: space-between;
4 | align-items: center;
5 | }
6 |
7 | .left *{
8 | color: #fff;
9 | }
10 |
11 | .right{
12 | display: flex;
13 | }
14 |
15 | .right a{
16 | display: flex;
17 | align-items: center;
18 | text-decoration: none;
19 | color: #fff;
20 | cursor: pointer;
21 | margin-right: 25px;
22 | }
23 |
24 | .right p{
25 | margin-left: 5px;
26 | font-size: 12px;
27 | line-height: normal;
28 | color: #fff;
29 | }
30 |
31 | .right i{
32 | font-size: 20px;
33 | }
34 |
35 | .router-active{
36 | background-color: rgba(255,255,255,.1);
37 | padding: 15px 18px 15px 15px;
38 | border-radius: 3px;
39 | }
40 |
--------------------------------------------------------------------------------
/src/app/shared/header/header.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
MD Pro Angular
4 |
5 |
11 |
12 |
--------------------------------------------------------------------------------
/src/app/shared/header/header.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-header',
5 | templateUrl: './header.component.html',
6 | styleUrls: ['./header.component.css']
7 | })
8 | export class HeaderComponent implements OnInit {
9 |
10 | constructor() { }
11 |
12 | ngOnInit() {
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/shared/imagecard/imagecard.component.css:
--------------------------------------------------------------------------------
1 | .image-card{
2 | position: relative;
3 | width: 100%;
4 | margin: 25px 0;
5 | padding: 15px;
6 | }
7 |
8 | .header{
9 | position: relative;
10 | overflow: hidden;
11 | margin-top: -40px;
12 | border-radius: 6px;
13 | z-index: 3;
14 | box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0 rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2);
15 | }
16 |
17 | .header img{
18 | position: relative;
19 | max-width: 100%;
20 | border-radius: 6px;
21 | }
22 |
23 | .body{
24 | text-align: center;
25 | padding: 10px 10px 13px 10px;
26 | margin-top: 7px;
27 | }
28 |
29 | .body p{
30 | margin-top: 5px;
31 | color: #999;
32 | font-weight: 100;
33 | padding-bottom: 15px;
34 | border-bottom: 1px solid #eee;
35 | }
36 |
37 | .footer{
38 | display: flex;
39 | justify-content: space-between;
40 | align-items: center;
41 | padding: 0 8px 2px 8px;
42 | }
43 |
44 | .footer .position{
45 | display: flex;
46 | align-items: center;
47 | color: #999;
48 | font-weight: 100;
49 | }
50 |
51 | .footer i{
52 | font-size: 17px;
53 | margin-right: 3px;
54 | }
55 |
56 | .footer h4{
57 | color: rgba(0,0,0, 0.87);
58 | }
59 |
--------------------------------------------------------------------------------
/src/app/shared/imagecard/imagecard.component.html:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
{{ title }}
7 |
{{ desc }}
8 |
9 |
13 |
14 |
--------------------------------------------------------------------------------
/src/app/shared/imagecard/imagecard.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit, Input } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-imagecard',
5 | templateUrl: './imagecard.component.html',
6 | styleUrls: ['./imagecard.component.css']
7 | })
8 | export class ImagecardComponent implements OnInit {
9 | @Input() title: string;
10 | @Input() desc: string;
11 | @Input() footerTitle: string;
12 | @Input() position: string;
13 | @Input() image: string;
14 | constructor() { }
15 |
16 | ngOnInit() {
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/src/app/shared/msgiconbtn/msgiconbtn.component.css:
--------------------------------------------------------------------------------
1 | .msg-btn{
2 | position: relative;
3 | }
4 |
5 | .msg-btn i{
6 | font-size: 19px;
7 | color: #555;
8 | }
9 |
10 | .msg-btn span{
11 | position: absolute;
12 | top: 2px;
13 | border: 1px solid #FFF;
14 | right: 2px;
15 | font-size: 9px;
16 | background: #f44336;
17 | color: #FFF;
18 | min-width: 20px;
19 | padding: 0px 5px;
20 | height: 20px;
21 | border-radius: 10px;
22 | text-align: center;
23 | line-height: 19px;
24 | vertical-align: middle;
25 | }
26 |
--------------------------------------------------------------------------------
/src/app/shared/msgiconbtn/msgiconbtn.component.html:
--------------------------------------------------------------------------------
1 |
2 | {{ number }}
3 | {{ icon }}
4 |
5 |
--------------------------------------------------------------------------------
/src/app/shared/msgiconbtn/msgiconbtn.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit, Input } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-msgiconbtn',
5 | templateUrl: './msgiconbtn.component.html',
6 | styleUrls: ['./msgiconbtn.component.css']
7 | })
8 | export class MsgIconBtnComponent implements OnInit {
9 | @Input() number: string;
10 | @Input() icon: string;
11 | constructor() { }
12 |
13 | ngOnInit() {
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/app/shared/navbar/navbar.component.css:
--------------------------------------------------------------------------------
1 | .nav-bar{
2 | display: flex;
3 | align-items: center;
4 | justify-content: space-between;
5 | }
6 |
7 | .left-part, .right-part{
8 | display: flex;
9 | align-items: center;
10 | }
11 |
12 | .nav-bar h4{
13 | color: #555;
14 | }
15 |
16 | .mat-mini-fab{
17 | box-shadow: 0 2px 2px 0 rgba(153, 153, 153, 0.14), 0 3px 1px -2px rgba(153, 153, 153, 0.2), 0 1px 5px 0 rgba(153, 153, 153, 0.12);
18 | background-color: #fefefe;
19 | color: #999;
20 | margin-right: 15px;
21 | }
22 |
23 | .mat-mini-fab:hover{
24 | color: #999 !important;
25 | box-shadow: 0 14px 26px -12px rgba(153, 153, 153, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(153, 153, 153, 0.2) !important;
26 | }
27 |
28 | .mat-mini-fab:focus{
29 | color: #999 !important;
30 | }
31 |
32 | .search-btn{
33 | margin: 0 5px 0 7px;
34 | }
35 |
36 | .icon-btn{
37 | font-size: 19px;
38 | color: #555;
39 | }
40 |
41 | .mat-icon-button{
42 | margin-left: 7px;
43 | }
44 |
--------------------------------------------------------------------------------
/src/app/shared/navbar/navbar.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | more_vert
4 |
{{ title }}
5 |
6 |
7 |
8 |
9 |
10 |
11 |
search
12 |
dashboard
13 |
14 |
person
15 |
16 | Mike John responded to your email
17 | You have 5 new tasks
18 | You're now friend with Andrew
19 | Another Notification
20 | Another One
21 |
22 |
23 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/src/app/shared/navbar/navbar.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit, Input } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-navbar',
5 | templateUrl: './navbar.component.html',
6 | styleUrls: ['./navbar.component.css']
7 | })
8 | export class NavbarComponent implements OnInit {
9 | @Input() title: string;
10 | constructor() {}
11 |
12 | ngOnInit() {
13 | }
14 |
15 | menuClick() {
16 | // document.getElementById('main-panel').style.marginRight = '260px';
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/app/sidebar/sidebar-routes.config.ts:
--------------------------------------------------------------------------------
1 | export const ROUTES = [
2 | { path: '/dashboard', title: 'Dashboard', icon: 'dashboard', children: null },
3 | { path: 'profile', title: 'User Profile', icon: 'person', children: null },
4 | { path: 'table', title: 'Table List', icon: 'content_paste', children: null },
5 | { path: '#component', id: 'component', title: 'Component', icon: 'apps', children: [
6 | {path: 'components/price-table', title: 'Price Table', icon: 'PT'},
7 | {path: 'components/panels', title: 'Panels', icon: 'P'},
8 | {path: 'components/wizard', title: 'Wizard', icon: 'W'},
9 | ]},
10 | { path: 'notification', title: 'Notification', icon: 'notifications', children: null },
11 | { path: 'alert', title: 'Sweet Alert', icon: 'warning', children: null },
12 | { path: 'settings', title: 'Settings', icon: 'settings', children: null },
13 | ];
14 |
--------------------------------------------------------------------------------
/src/app/sidebar/sidebar.component.css:
--------------------------------------------------------------------------------
1 | .logo{
2 | padding: 25px 0 20px 0;
3 | color: #fff;
4 | font-size: 18px;
5 | text-align: center;
6 | position: relative;
7 | }
8 |
9 | .logo img{
10 | width: 42px;
11 | position: absolute;
12 | top: 16px;
13 | left: 13px;
14 | }
15 |
16 | .divider{
17 | content: '';
18 | position: relative;
19 | height: 1px;
20 | left: 15px;
21 | width: calc(100% - 30px);
22 | background-color: rgba(255, 255, 255, 0.5);
23 | }
24 |
25 | .sidebar-wrapper{
26 | overflow-y: auto;
27 | padding-bottom: 30px;
28 | width: 260px;
29 | position: relative;
30 | height: 100%;
31 | }
32 |
33 | .nav-container{
34 | position: relative;
35 | }
36 |
37 | .nav{
38 | padding-top: 15px;
39 | }
40 |
41 | .nav li{
42 | margin-bottom: 9px;
43 | }
44 |
45 | .nav li a{
46 | display: flex;
47 | align-items: center;
48 | color: rgba(255,255,255,.8);
49 | margin: 0 15px;
50 | border-radius: 3px;
51 | -webkit-transition: all 400ms;
52 | -moz-transition: all 400ms;
53 | -ms-transition: all 400ms;
54 | -o-transition: all 400ms;
55 | transition: all 400ms;
56 | height: 50px;
57 | text-decoration: none;
58 | }
59 |
60 | .nav li a:hover, .parent-active{
61 | background-color: rgba(255,255,255,.1);
62 | }
63 |
64 | .nav li a span{
65 | margin-left: 20px;
66 | }
67 |
68 | .active a, .active a:hover{
69 | /*color: rgba(0,0,0,.6) !important;*/
70 | /*background-color: #fff !important;*/
71 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(60, 72, 88, 0.4);
72 | -webkit-transition: all 400ms;
73 | -moz-transition: all 400ms;
74 | -ms-transition: all 400ms;
75 | -o-transition: all 400ms;
76 | transition: all 400ms;
77 | }
78 |
79 | .collapse-a{
80 | position: relative;
81 | }
82 |
83 | .collapse-a .caret{
84 | position: absolute;
85 | right: 21px;
86 | top: 23px;
87 | color: #fff;
88 | -webkit-transform: rotate(180deg);
89 | -moz-transform: rotate(180deg);
90 | -ms-transform: rotate(180deg);
91 | -o-transform: rotate(180deg);
92 | transform: rotate(180deg);
93 | -webkit-transition: all 200ms;
94 | -moz-transition: all 200ms;
95 | -ms-transition: all 200ms;
96 | -o-transition: all 200ms;
97 | transition: all 200ms;
98 | }
99 |
100 | .collapsed .caret{
101 | position: absolute;
102 | right: 21px;
103 | top: 23px;
104 | -webkit-transform: rotate(0deg);
105 | -moz-transform: rotate(0deg);
106 | -ms-transform: rotate(0deg);
107 | -o-transform: rotate(0deg);
108 | transform: rotate(0deg);
109 | }
110 |
111 |
112 |
--------------------------------------------------------------------------------
/src/app/sidebar/sidebar.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Dashboard Pro
4 |
5 |
6 |
35 |
--------------------------------------------------------------------------------
/src/app/sidebar/sidebar.component.ts:
--------------------------------------------------------------------------------
1 | import {AfterViewInit, Component, OnInit, OnDestroy} from '@angular/core';
2 | import { SettingsService } from '../services/settings.service';
3 | import { ROUTES } from './sidebar-routes.config';
4 |
5 | @Component({
6 | selector: 'app-sidebar',
7 | templateUrl: './sidebar.component.html',
8 | styleUrls: ['./sidebar.component.css']
9 | })
10 | export class SidebarComponent implements OnInit, AfterViewInit, OnDestroy {
11 | public color: string;
12 | public menuItems: object;
13 | public activeFontColor: string;
14 | public normalFontColor: string;
15 | public dividerBgColor: string;
16 | constructor(public settingsService: SettingsService) {
17 | this.menuItems = ROUTES;
18 | this.activeFontColor = 'rgba(0,0,0,.6)';
19 | this.normalFontColor = 'rgba(255,255,255,.8)';
20 | this.dividerBgColor = 'rgba(255, 255, 255, 0.5)';
21 | }
22 |
23 | ngOnInit() {
24 | this.color = this.settingsService.getSidebarFilter();
25 | this.settingsService.sidebarFilterUpdate.subscribe((filter: string) => {
26 | this.color = filter;
27 | if (filter === '#fff') {
28 | this.activeFontColor = 'rgba(0,0,0,.6)';
29 | }else {
30 | this.activeFontColor = 'rgba(255,255,255,.8)';
31 | }
32 | });
33 | this.settingsService.sidebarColorUpdate.subscribe((color: string) => {
34 | if (color === '#fff') {
35 | this.normalFontColor = 'rgba(0,0,0,.6)';
36 | this.dividerBgColor = 'rgba(0,0,0,.1)';
37 | }else {
38 | this.normalFontColor = 'rgba(255,255,255,.8)';
39 | this.dividerBgColor = 'rgba(255, 255, 255, 0.5)';
40 | }
41 | });
42 | }
43 | ngOnDestroy() {
44 | this.settingsService.sidebarFilterUpdate.unsubscribe();
45 | this.settingsService.sidebarColorUpdate.unsubscribe();
46 | }
47 |
48 | ngAfterViewInit() {
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/assets/img/angular2-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/angular2-logo.png
--------------------------------------------------------------------------------
/src/assets/img/avatar.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/avatar.jpg
--------------------------------------------------------------------------------
/src/assets/img/card-1.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/card-1.jpeg
--------------------------------------------------------------------------------
/src/assets/img/card-2.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/card-2.jpeg
--------------------------------------------------------------------------------
/src/assets/img/card-3.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/card-3.jpeg
--------------------------------------------------------------------------------
/src/assets/img/lock_bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/lock_bg.jpg
--------------------------------------------------------------------------------
/src/assets/img/login_bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/login_bg.jpg
--------------------------------------------------------------------------------
/src/assets/img/marc.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/marc.jpg
--------------------------------------------------------------------------------
/src/assets/img/register_bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/register_bg.jpg
--------------------------------------------------------------------------------
/src/assets/img/sidebar-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/sidebar-1.jpg
--------------------------------------------------------------------------------
/src/assets/img/sidebar-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/sidebar-2.jpg
--------------------------------------------------------------------------------
/src/assets/img/sidebar-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/sidebar-3.jpg
--------------------------------------------------------------------------------
/src/assets/img/sidebar-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/assets/img/sidebar-4.jpg
--------------------------------------------------------------------------------
/src/assets/js/bootstrap-notify.min.js:
--------------------------------------------------------------------------------
1 | /* Project: Bootstrap Growl = v3.1.3 | Description: Turns standard Bootstrap alerts into "Growl-like" notifications. | Author: Mouse0270 aka Robert McIntosh | License: MIT License | Website: https://github.com/mouse0270/bootstrap-growl */
2 | !function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t("object"==typeof exports?require("jquery"):jQuery)}(function(t){function e(e,i,n){var i={content:{message:"object"==typeof i?i.message:i,title:i.title?i.title:"",icon:i.icon?i.icon:"",url:i.url?i.url:"#",target:i.target?i.target:"-"}};n=t.extend(!0,{},i,n),this.settings=t.extend(!0,{},s,n),this._defaults=s,"-"==this.settings.content.target&&(this.settings.content.target=this.settings.url_target),this.animations={start:"webkitAnimationStart oanimationstart MSAnimationStart animationstart",end:"webkitAnimationEnd oanimationend MSAnimationEnd animationend"},"number"==typeof this.settings.offset&&(this.settings.offset={x:this.settings.offset,y:this.settings.offset}),this.init()}var s={element:"body",position:null,type:"info",allow_dismiss:!0,newest_on_top:!1,showProgressbar:!1,placement:{from:"top",align:"right"},offset:20,spacing:10,z_index:1031,delay:5e3,timer:1e3,url_target:"_blank",mouse_over:null,animate:{enter:"animated fadeInDown",exit:"animated fadeOutUp"},onShow:null,onShown:null,onClose:null,onClosed:null,icon_type:"class",template:''};String.format=function(){for(var t=arguments[0],e=1;e .progress-bar').removeClass("progress-bar-"+t.settings.type),t.settings.type=i[e],this.$ele.addClass("alert-"+i[e]).find('[data-notify="progressbar"] > .progress-bar').addClass("progress-bar-"+i[e]);break;case"icon":var n=this.$ele.find('[data-notify="icon"]');"class"==t.settings.icon_type.toLowerCase()?n.removeClass(t.settings.content.icon).addClass(i[e]):(n.is("img")||n.find("img"),n.attr("src",i[e]));break;case"progress":var a=t.settings.delay-t.settings.delay*(i[e]/100);this.$ele.data("notify-delay",a),this.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i[e]).css("width",i[e]+"%");break;case"url":this.$ele.find('[data-notify="url"]').attr("href",i[e]);break;case"target":this.$ele.find('[data-notify="url"]').attr("target",i[e]);break;default:this.$ele.find('[data-notify="'+e+'"]').html(i[e])}var o=this.$ele.outerHeight()+parseInt(t.settings.spacing)+parseInt(t.settings.offset.y);t.reposition(o)},close:function(){t.close()}}},buildNotify:function(){var e=this.settings.content;this.$ele=t(String.format(this.settings.template,this.settings.type,e.title,e.message,e.url,e.target)),this.$ele.attr("data-notify-position",this.settings.placement.from+"-"+this.settings.placement.align),this.settings.allow_dismiss||this.$ele.find('[data-notify="dismiss"]').css("display","none"),(this.settings.delay<=0&&!this.settings.showProgressbar||!this.settings.showProgressbar)&&this.$ele.find('[data-notify="progressbar"]').remove()},setIcon:function(){"class"==this.settings.icon_type.toLowerCase()?this.$ele.find('[data-notify="icon"]').addClass(this.settings.content.icon):this.$ele.find('[data-notify="icon"]').is("img")?this.$ele.find('[data-notify="icon"]').attr("src",this.settings.content.icon):this.$ele.find('[data-notify="icon"]').append(' ')},styleURL:function(){this.$ele.find('[data-notify="url"]').css({backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)",height:"100%",left:"0px",position:"absolute",top:"0px",width:"100%",zIndex:this.settings.z_index+1}),this.$ele.find('[data-notify="dismiss"]').css({position:"absolute",right:"10px",top:"5px",zIndex:this.settings.z_index+2})},placement:function(){var e=this,s=this.settings.offset.y,i={display:"inline-block",margin:"0px auto",position:this.settings.position?this.settings.position:"body"===this.settings.element?"fixed":"absolute",transition:"all .5s ease-in-out",zIndex:this.settings.z_index},n=!1,a=this.settings;switch(t('[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])').each(function(){return s=Math.max(s,parseInt(t(this).css(a.placement.from))+parseInt(t(this).outerHeight())+parseInt(a.spacing))}),1==this.settings.newest_on_top&&(s=this.settings.offset.y),i[this.settings.placement.from]=s+"px",this.settings.placement.align){case"left":case"right":i[this.settings.placement.align]=this.settings.offset.x+"px";break;case"center":i.left=0,i.right=0}this.$ele.css(i).addClass(this.settings.animate.enter),t.each(Array("webkit","moz","o","ms",""),function(t,s){e.$ele[0].style[s+"AnimationIterationCount"]=1}),t(this.settings.element).append(this.$ele),1==this.settings.newest_on_top&&(s=parseInt(s)+parseInt(this.settings.spacing)+this.$ele.outerHeight(),this.reposition(s)),t.isFunction(e.settings.onShow)&&e.settings.onShow.call(this.$ele),this.$ele.one(this.animations.start,function(){n=!0}).one(this.animations.end,function(){t.isFunction(e.settings.onShown)&&e.settings.onShown.call(this)}),setTimeout(function(){n||t.isFunction(e.settings.onShown)&&e.settings.onShown.call(this)},600)},bind:function(){var e=this;if(this.$ele.find('[data-notify="dismiss"]').on("click",function(){e.close()}),this.$ele.mouseover(function(){t(this).data("data-hover","true")}).mouseout(function(){t(this).data("data-hover","false")}),this.$ele.data("data-hover","false"),this.settings.delay>0){e.$ele.data("notify-delay",e.settings.delay);var s=setInterval(function(){var t=parseInt(e.$ele.data("notify-delay"))-e.settings.timer;if("false"===e.$ele.data("data-hover")&&"pause"==e.settings.mouse_over||"pause"!=e.settings.mouse_over){var i=(e.settings.delay-t)/e.settings.delay*100;e.$ele.data("notify-delay",t),e.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i).css("width",i+"%")}t<=-e.settings.timer&&(clearInterval(s),e.close())},e.settings.timer)}},close:function(){var e=this,s=parseInt(this.$ele.css(this.settings.placement.from)),i=!1;this.$ele.data("closing","true").addClass(this.settings.animate.exit),e.reposition(s),t.isFunction(e.settings.onClose)&&e.settings.onClose.call(this.$ele),this.$ele.one(this.animations.start,function(){i=!0}).one(this.animations.end,function(){t(this).remove(),t.isFunction(e.settings.onClosed)&&e.settings.onClosed.call(this)}),setTimeout(function(){i||(e.$ele.remove(),e.settings.onClosed&&e.settings.onClosed(e.$ele))},600)},reposition:function(e){var s=this,i='[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])',n=this.$ele.nextAll(i);1==this.settings.newest_on_top&&(n=this.$ele.prevAll(i)),n.each(function(){t(this).css(s.settings.placement.from,e),e=parseInt(e)+parseInt(s.settings.spacing)+t(this).outerHeight()})}}),t.notify=function(t,s){var i=new e(this,t,s);return i.notify},t.notifyDefaults=function(e){return s=t.extend(!0,{},s,e)},t.notifyClose=function(e){"undefined"==typeof e||"all"==e?t("[data-notify]").find('[data-notify="dismiss"]').trigger("click"):t('[data-notify-position="'+e+'"]').find('[data-notify="dismiss"]').trigger("click")}});
--------------------------------------------------------------------------------
/src/environments/environment.prod.ts:
--------------------------------------------------------------------------------
1 | export const environment = {
2 | production: true
3 | };
4 |
--------------------------------------------------------------------------------
/src/environments/environment.ts:
--------------------------------------------------------------------------------
1 | // The file contents for the current environment will overwrite these during build.
2 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do
3 | // `ng build --env=prod` then `environment.prod.ts` will be used instead.
4 | // The list of which env maps to which file can be found in `.angular-cli.json`.
5 |
6 | export const environment = {
7 | production: false
8 | };
9 |
--------------------------------------------------------------------------------
/src/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangdicoder/angular-material-dashboard/e40feef059b65997122c73cee3b260aafa29bdaa/src/favicon.ico
--------------------------------------------------------------------------------
/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Angular2 Material Dashboard Pro
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
Loading...
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import { enableProdMode } from '@angular/core';
2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
3 |
4 | import { AppModule } from './app/app.module';
5 | import { environment } from './environments/environment';
6 |
7 | if (environment.production) {
8 | enableProdMode();
9 | }
10 |
11 | platformBrowserDynamic().bootstrapModule(AppModule);
12 |
--------------------------------------------------------------------------------
/src/polyfills.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * This file includes polyfills needed by Angular and is loaded before the app.
3 | * You can add your own extra polyfills to this file.
4 | *
5 | * This file is divided into 2 sections:
6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main
8 | * file.
9 | *
10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
13 | *
14 | * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
15 | */
16 |
17 | /***************************************************************************************************
18 | * BROWSER POLYFILLS
19 | */
20 |
21 | /** IE9, IE10 and IE11 requires all of the following polyfills. **/
22 | // import 'core-js/es6/symbol';
23 | // import 'core-js/es6/object';
24 | // import 'core-js/es6/function';
25 | // import 'core-js/es6/parse-int';
26 | // import 'core-js/es6/parse-float';
27 | // import 'core-js/es6/number';
28 | // import 'core-js/es6/math';
29 | // import 'core-js/es6/string';
30 | // import 'core-js/es6/date';
31 | // import 'core-js/es6/array';
32 | // import 'core-js/es6/regexp';
33 | // import 'core-js/es6/map';
34 | // import 'core-js/es6/set';
35 |
36 | /** IE10 and IE11 requires the following for NgClass support on SVG elements */
37 | // import 'classlist.js'; // Run `npm install --save classlist.js`.
38 |
39 | /** IE10 and IE11 requires the following to support `@angular/animation`. */
40 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`.
41 |
42 |
43 | /** Evergreen browsers require these. **/
44 | import 'core-js/es6/reflect';
45 |
46 |
47 |
48 | /** ALL Firefox browsers require the following to support `@angular/animation`. **/
49 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`.
50 |
51 |
52 |
53 | /***************************************************************************************************
54 | * Zone JS is required by Angular itself.
55 | */
56 | import 'zone.js/dist/zone'; // Included with Angular CLI.
57 |
58 |
59 |
60 | /***************************************************************************************************
61 | * APPLICATION IMPORTS
62 | */
63 |
64 | /**
65 | * Date, currency, decimal and percent pipes.
66 | * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10
67 | */
68 | // import 'intl'; // Run `npm install --save intl`.
69 | /**
70 | * Need to import at least one locale-data with intl.
71 | */
72 | // import 'intl/locale-data/jsonp/en';
73 |
--------------------------------------------------------------------------------
/src/styles.css:
--------------------------------------------------------------------------------
1 | /* You can add global styles to this file, and also import other style files */
2 | @import '~@angular/material/prebuilt-themes/indigo-pink.css';
3 |
4 | html, body {
5 | padding: 0;
6 | margin: 0;
7 | height: 100%;
8 | }
9 |
10 | body {
11 | background-color: #eee;
12 | }
13 |
14 | * {
15 | margin: 0;
16 | box-sizing: border-box;
17 | }
18 |
19 | h1, h2, h3, h4, h5, h6, p, a, button, div, label, small {
20 | font-family: "Roboto", "Helvetica", "Arial", sans-serif;
21 | font-weight: 300;
22 | /*line-height: 1.5em;*/
23 | margin: 0;
24 | }
25 |
26 | h1, .h1 {
27 | font-size: 3.8em;
28 | }
29 |
30 | h2, .h2 {
31 | font-size: 2.6em;
32 | }
33 |
34 | h3, .h3 {
35 | font-size: 1.825em;
36 | }
37 |
38 | h4, .h4 {
39 | font-size: 1.3em;
40 | }
41 |
42 | h5, .h5 {
43 | font-size: 1.25em;
44 | line-height: 1.5em;
45 | }
46 |
47 | h6, .h6 {
48 | font-size: 1em;
49 | text-transform: uppercase;
50 | }
51 |
52 | p {
53 | margin: 0;
54 | color: #999;
55 | }
56 |
57 | a {
58 | color: #9c27b0;
59 | text-decoration: none;
60 | }
61 |
62 | a:hover{
63 | color: #89229b;
64 | text-decoration: none;
65 | }
66 |
67 | b{
68 | font-weight: 300;
69 | }
70 |
71 | .subtitle{
72 | margin-top: 15px;
73 | color: #3C4858;
74 | }
75 |
76 | .container{
77 | padding: 15px 30px;
78 | }
79 |
80 | .card{
81 | box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.14);
82 | border-radius: 6px;
83 | color: rgba(0,0,0, 0.87);
84 | background: #fff;
85 | }
86 |
87 | .card-raised{
88 | box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2);
89 | }
90 |
91 | .page-title{
92 | margin-top: 40px;
93 | }
94 |
95 | @media (min-width: 1200px) {
96 | .container {
97 | width: 100%;
98 | }
99 | }
100 |
101 | @media (min-width: 992px) {
102 | .container {
103 | width: 100%;
104 | }
105 | }
106 |
107 | @media (min-width: 768px) {
108 | .container {
109 | width: 100%;
110 | }
111 | }
112 |
113 | .background{
114 | background: url("./assets/img/login_bg.jpg") no-repeat center center;
115 | height: 100%;
116 | background-size: cover;
117 | filter: brightness(40%);
118 | position: absolute;
119 | top: 0;
120 | left: 0;
121 | width: 100%;
122 | z-index: 0;
123 | }
124 |
125 | .swal2-modal{
126 | outline: none;
127 | }
128 |
129 | /* loading style*/
130 | .loader {
131 | margin: 0 auto;
132 | width: 60px;
133 | position: absolute;
134 | display: block;
135 | left: 0;
136 | right: 0;
137 | z-index: 1;
138 | -webkit-transform: translate3d(0, -50%, 0);
139 | -moz-transform: translate3d(0, -50%, 0);
140 | -o-transform: translate3d(0, -50%, 0);
141 | -ms-transform: translate3d(0, -50%, 0);
142 | transform: translate3d(0, -50%, 0);
143 | text-align: center;
144 | top: 50%;
145 | }
146 |
147 | .loader:before {
148 | content: '';
149 | display: block;
150 | padding-top: 100%;
151 | }
152 |
153 | .circular {
154 | animation: rotate 2s linear infinite;
155 | height: 100%;
156 | transform-origin: center center;
157 | width: 100%;
158 | position: absolute;
159 | top: 0;
160 | bottom: 0;
161 | left: 0;
162 | right: 0;
163 | margin: auto;
164 | }
165 |
166 | .path {
167 | stroke-dasharray: 1, 200;
168 | stroke-dashoffset: 0;
169 | animation: dash 1.5s ease-in-out infinite, color 2s ease-in-out infinite;
170 | stroke-linecap: round;
171 | }
172 |
173 | @keyframes rotate {
174 | 100% {
175 | transform: rotate(360deg);
176 | }
177 | }
178 | @keyframes dash {
179 | 0% {
180 | stroke-dasharray: 1, 200;
181 | stroke-dashoffset: 0;
182 | }
183 | 50% {
184 | stroke-dasharray: 89, 200;
185 | stroke-dashoffset: -35px;
186 | }
187 | 100% {
188 | stroke-dasharray: 89, 200;
189 | stroke-dashoffset: -124px;
190 | }
191 | }
192 | @keyframes color {
193 | 100%,
194 | 0% {
195 | stroke: #9c27b0;
196 | }
197 | 50% {
198 | stroke: #ff9800;
199 | }
200 | 100% {
201 | stroke: #9c27b0;
202 | }
203 | }
204 |
205 | @media screen and (min-width: 991px){
206 | #menu{
207 | display: none;
208 | }
209 | }
210 |
211 | @media screen and (max-width: 990px){
212 | #sidebar, #nav-right, #nav-left-button{
213 | display: none;
214 | }
215 | #menu{
216 | display: inline;
217 | }
218 | #main-panel{
219 | padding-left: 0;
220 | -webkit-transition: all 400ms;
221 | -moz-transition: all 400ms;
222 | -ms-transition: all 400ms;
223 | -o-transition: all 400ms;
224 | transition: all 400ms;
225 | }
226 | }
227 |
228 | /* input text style */
229 | .mat-input-underline .mat-input-ripple {
230 | background-color: #9c27b0 !important;
231 | }
232 |
233 | .mat-focused .mat-input-placeholder{
234 | color: #aaa !important;
235 | }
236 |
237 | /* drop down menu */
238 | .mat-menu-panel{
239 | border-radius: 3px;
240 | }
241 |
242 | .mat-menu-content{
243 | padding: 5px !important;
244 | }
245 |
246 | .mat-menu-content .mat-menu-item{
247 | font-size: 13px;
248 | border-radius: 2px;
249 | line-height: 38px;
250 | height: 38px;
251 | -webkit-transition: all 400ms;
252 | -moz-transition: all 400ms;
253 | -ms-transition: all 400ms;
254 | -o-transition: all 400ms;
255 | transition: all 400ms;
256 | }
257 |
258 | .mat-menu-content .mat-menu-item:hover{
259 | background-color: #9c27b0 !important;
260 | color: #FFFFFF !important;
261 | box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(156, 39, 176, 0.4) !important;
262 | -webkit-transition: all 400ms;
263 | -moz-transition: all 400ms;
264 | -ms-transition: all 400ms;
265 | -o-transition: all 400ms;
266 | transition: all 400ms;
267 | }
268 |
269 | /* circle button style */
270 | .mat-mini-fab{
271 | font-size: 20px !important;
272 | outline: none !important;
273 | box-shadow: 0 2px 2px 0 rgba(153, 153, 153, 0.14), 0 3px 1px -2px rgba(153, 153, 153, 0.2), 0 1px 5px 0 rgba(153, 153, 153, 0.12) !important;
274 | }
275 |
276 | .mat-mini-fab:hover{
277 | color: #fff !important;
278 | box-shadow: 0 14px 26px -12px rgba(153, 153, 153, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(153, 153, 153, 0.2) !important;
279 | }
280 |
281 | .mat-mini-fab:focus{
282 | color: #fff !important;
283 | }
284 |
285 | /* btn style */
286 | .btn{
287 | font-size: 12px !important;
288 | padding: 12px 30px !important;
289 | line-height: inherit !important;
290 | outline: none !important;
291 | font-weight: 300 !important;
292 | border-radius: 3px !important;
293 | margin: 0 1px;
294 | border: none !important;
295 | }
296 |
297 | .btn .mat-ripple{
298 | -webkit-border-radius: 3px;
299 | -moz-border-radius: 3px;
300 | border-radius: 3px;
301 | }
302 |
303 | .btn-round{
304 | border-radius: 30px !important;
305 | }
306 |
307 | .btn-round .mat-ripple{
308 | -webkit-border-radius: 30px;
309 | -moz-border-radius: 30px;
310 | border-radius: 30px;
311 | }
312 |
313 | .btn-primary{
314 | background-color: #9c27b0 !important;
315 | color: #FFF !important;
316 | box-shadow: 0 2px 2px 0 rgba(156, 39, 176, 0.14), 0 3px 1px -2px rgba(156, 39, 176, 0.2), 0 1px 5px 0 rgba(156, 39, 176, 0.12) !important;
317 | }
318 |
319 | .btn-primary:hover{
320 | box-shadow: 0 14px 26px -12px rgba(156, 39, 176, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(156, 39, 176, 0.2) !important;
321 | }
322 |
323 | .btn-rose{
324 | background-color: #e91e63 !important;
325 | color: #FFF !important;
326 | box-shadow: 0 2px 2px 0 rgba(233, 30, 99, 0.14), 0 3px 1px -2px rgba(233, 30, 99, 0.2), 0 1px 5px 0 rgba(233, 30, 99, 0.12) !important;
327 | }
328 |
329 | .btn-rose:hover{
330 | box-shadow: 0 14px 26px -12px rgba(233, 30, 99, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(233, 30, 99, 0.2) !important;
331 | }
332 |
333 | .btn-success{
334 | background-color: #4caf50 !important;
335 | color: #FFF !important;
336 | box-shadow: 0 2px 2px 0 rgba(76, 175, 80, 0.14), 0 3px 1px -2px rgba(76, 175, 80, 0.2), 0 1px 5px 0 rgba(76, 175, 80, 0.12) !important;
337 | }
338 |
339 | .btn-success:hover{
340 | box-shadow: 0 14px 26px -12px rgba(76, 175, 80, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(76, 175, 80, 0.2) !important;
341 | }
342 |
343 | .btn-warning{
344 | background-color: #ff9800 !important;
345 | color: #FFF !important;
346 | box-shadow: 0 2px 2px 0 rgba(255, 152, 0, 0.14), 0 3px 1px -2px rgba(255, 152, 0, 0.2), 0 1px 5px 0 rgba(255, 152, 0, 0.12) !important;
347 | }
348 |
349 | .btn-warning:hover{
350 | box-shadow: 0 14px 26px -12px rgba(255, 152, 0, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(255, 152, 0, 0.2) !important;
351 | }
352 |
353 | .btn-danger{
354 | background-color: #f44336 !important;
355 | color: #FFF !important;
356 | box-shadow: 0 2px 2px 0 rgba(244, 67, 54, 0.14), 0 3px 1px -2px rgba(244, 67, 54, 0.2), 0 1px 5px 0 rgba(244, 67, 54, 0.12) !important;
357 | }
358 |
359 | .btn-danger:hover{
360 | box-shadow: 0 14px 26px -12px rgba(244, 67, 54, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(244, 67, 54, 0.2) !important;
361 | }
362 |
363 | .btn-info{
364 | background-color: #00bcd4 !important;
365 | color: #FFF !important;
366 | box-shadow: 0 2px 2px 0 rgba(0, 188, 212, 0.14), 0 3px 1px -2px rgba(0, 188, 212, 0.2), 0 1px 5px 0 rgba(0, 188, 212, 0.12) !important;
367 | }
368 |
369 | .btn-info:hover{
370 | box-shadow: 0 14px 26px -12px rgba(0, 188, 212, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 188, 212, 0.2) !important;
371 | }
372 |
373 | /* checkbox */
374 | .mat-checkbox-checkmark-path { /* stick */
375 | stroke: #9c27b0 !important;
376 | }
377 |
378 | .mat-checkbox-checked.mat-accent .mat-checkbox-background, .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background {
379 | background-color: transparent;
380 | }
381 |
382 | .mat-checkbox-frame {
383 | border-width: 1px !important;
384 | }
385 |
386 | .mat-checkbox-anim-unchecked-checked .mat-checkbox-checkmark-path {
387 | animation: 300ms linear 0s mat-checkbox-unchecked-checked-checkmark-path !important;
388 | }
389 |
390 | /* table */
391 | .table-responsive{
392 | border: none;
393 | margin: 0;
394 | }
395 |
396 | .table{
397 | width: 100%;
398 | max-width: 100%;
399 | margin: 20px 0 0 0;
400 | }
401 |
402 | .table > thead > tr > th, .table > tbody > tr > th, .table > thead > tr > td, .table > tbody > tr > td{
403 | padding: 12px 8px;
404 | vertical-align: middle;
405 | }
406 |
407 | .table > thead > tr > th {
408 | font-size: 1.25em;
409 | font-weight: 300;
410 | border-bottom-width: 1px;
411 | }
412 |
413 | /* text color */
414 | .text-primary, .alert-primary .alert-icon{
415 | color: #9c27b0;
416 | }
417 |
418 | .text-danger, .alert-danger .alert-icon{
419 | color: #f44336;
420 | }
421 |
422 | .text-info, .alert-info .alert-icon{
423 | color: #00bcd4;
424 | }
425 |
426 | .text-warning, .alert-warning .alert-icon{
427 | color: #ff9800;
428 | }
429 |
430 | .text-rose, .alert-rose .alert-icon{
431 | color: #e91e63;
432 | }
433 |
434 | .text-success, .alert-success .alert-icon{
435 | color: #4caf50;
436 | }
437 |
438 | /** alert **/
439 | .alert{
440 | border: none;
441 | position: relative;
442 | padding: 20px 15px;
443 | color: #ffffff;
444 | border-radius: 3px;
445 | }
446 |
447 | .alert span{
448 | font-weight: 100;
449 | width: 93%;
450 | display: block;
451 | }
452 |
453 | .alert .close{
454 | text-shadow: none;
455 | opacity: 1;
456 | color: #fff;
457 | position: relative;
458 | top: -6px;
459 | outline: none;
460 | }
461 |
462 | .alert .close i{
463 | font-size: 11px;
464 | }
465 |
466 | .alert-primary{
467 | background-color: #af2cc5;
468 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(156, 39, 176, 0.4);
469 | }
470 |
471 | .alert-info{
472 | background-color: #00bcd4;
473 | box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(0, 188, 212, 0.4);
474 | }
475 |
476 | .alert-rose{
477 | background-color: #eb3573;
478 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(233, 30, 99, 0.4);
479 | }
480 |
481 | .alert-success{
482 | background-color: #5cb860;
483 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(76, 175, 80, 0.4);
484 | }
485 |
486 | .alert-warning{
487 | background-color: #ffa21a;
488 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(255, 152, 0, 0.4);
489 | }
490 |
491 | .alert-danger{
492 | background-color: #f55a4e;
493 | box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(244, 67, 54, 0.4);
494 | }
495 |
496 | .alert-with-icon{
497 | margin-top: 43px;
498 | }
499 |
500 | .alert-with-icon span{
501 | padding-left: 55px;
502 | }
503 |
504 | .alert-with-icon .alert-icon{
505 | position: absolute;
506 | top: -17px;
507 | left: 17px;
508 | background-color: #fff;
509 | border-radius: 50%;
510 | font-size: 20px;
511 | padding: 9px;
512 | box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2);
513 | }
514 |
--------------------------------------------------------------------------------
/src/test.ts:
--------------------------------------------------------------------------------
1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files
2 |
3 | import 'zone.js/dist/long-stack-trace-zone';
4 | import 'zone.js/dist/proxy.js';
5 | import 'zone.js/dist/sync-test';
6 | import 'zone.js/dist/jasmine-patch';
7 | import 'zone.js/dist/async-test';
8 | import 'zone.js/dist/fake-async-test';
9 | import { getTestBed } from '@angular/core/testing';
10 | import {
11 | BrowserDynamicTestingModule,
12 | platformBrowserDynamicTesting
13 | } from '@angular/platform-browser-dynamic/testing';
14 |
15 | // Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
16 | declare var __karma__: any;
17 | declare var require: any;
18 |
19 | // Prevent Karma from running prematurely.
20 | __karma__.loaded = function () {};
21 |
22 | // First, initialize the Angular testing environment.
23 | getTestBed().initTestEnvironment(
24 | BrowserDynamicTestingModule,
25 | platformBrowserDynamicTesting()
26 | );
27 | // Then we find all the tests.
28 | const context = require.context('./', true, /\.spec\.ts$/);
29 | // And load the modules.
30 | context.keys().map(context);
31 | // Finally, start Karma to run the tests.
32 | __karma__.start();
33 |
--------------------------------------------------------------------------------
/src/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "../out-tsc/app",
5 | "module": "es2015",
6 | "baseUrl": "",
7 | "types": []
8 | },
9 | "exclude": [
10 | "test.ts",
11 | "**/*.spec.ts"
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/src/tsconfig.spec.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "../out-tsc/spec",
5 | "module": "commonjs",
6 | "target": "es5",
7 | "baseUrl": "",
8 | "types": [
9 | "jasmine",
10 | "node"
11 | ]
12 | },
13 | "files": [
14 | "test.ts",
15 | "polyfills.ts"
16 | ],
17 | "include": [
18 | "**/*.spec.ts",
19 | "**/*.d.ts"
20 | ]
21 | }
22 |
--------------------------------------------------------------------------------
/src/typings.d.ts:
--------------------------------------------------------------------------------
1 | /* SystemJS module definition */
2 | declare var module: NodeModule;
3 | interface NodeModule {
4 | id: string;
5 | }
6 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compileOnSave": false,
3 | "compilerOptions": {
4 | "outDir": "./dist/out-tsc",
5 | "baseUrl": "src",
6 | "sourceMap": true,
7 | "declaration": false,
8 | "moduleResolution": "node",
9 | "emitDecoratorMetadata": true,
10 | "experimentalDecorators": true,
11 | "target": "es5",
12 | "typeRoots": [
13 | "node_modules/@types"
14 | ],
15 | "lib": [
16 | "es2016",
17 | "dom"
18 | ],
19 | "module": "es2015"
20 | }
21 | }
--------------------------------------------------------------------------------
/tslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "rulesDirectory": [
3 | "node_modules/codelyzer"
4 | ],
5 | "rules": {
6 | "callable-types": true,
7 | "class-name": true,
8 | "comment-format": [
9 | true,
10 | "check-space"
11 | ],
12 | "curly": true,
13 | "eofline": true,
14 | "forin": true,
15 | "import-blacklist": [
16 | true
17 | ],
18 | "import-spacing": true,
19 | "indent": [
20 | true,
21 | "spaces"
22 | ],
23 | "interface-over-type-literal": true,
24 | "label-position": true,
25 | "max-line-length": [
26 | true,
27 | 140
28 | ],
29 | "member-access": false,
30 | "member-ordering": [
31 | true,
32 | "static-before-instance",
33 | "variables-before-functions"
34 | ],
35 | "no-arg": true,
36 | "no-bitwise": true,
37 | "no-console": [
38 | true,
39 | "debug",
40 | "info",
41 | "time",
42 | "timeEnd",
43 | "trace"
44 | ],
45 | "no-construct": true,
46 | "no-debugger": true,
47 | "no-empty": false,
48 | "no-empty-interface": true,
49 | "no-eval": true,
50 | "no-inferrable-types": [
51 | true,
52 | "ignore-params"
53 | ],
54 | "no-shadowed-variable": true,
55 | "no-string-literal": false,
56 | "no-string-throw": true,
57 | "no-switch-case-fall-through": true,
58 | "no-trailing-whitespace": true,
59 | "no-unused-expression": true,
60 | "no-use-before-declare": true,
61 | "no-var-keyword": true,
62 | "object-literal-sort-keys": false,
63 | "one-line": [
64 | true,
65 | "check-open-brace",
66 | "check-catch",
67 | "check-else",
68 | "check-whitespace"
69 | ],
70 | "prefer-const": true,
71 | "quotemark": [
72 | true,
73 | "single"
74 | ],
75 | "radix": true,
76 | "semicolon": [
77 | "always"
78 | ],
79 | "triple-equals": [
80 | true,
81 | "allow-null-check"
82 | ],
83 | "typedef-whitespace": [
84 | true,
85 | {
86 | "call-signature": "nospace",
87 | "index-signature": "nospace",
88 | "parameter": "nospace",
89 | "property-declaration": "nospace",
90 | "variable-declaration": "nospace"
91 | }
92 | ],
93 | "typeof-compare": true,
94 | "unified-signatures": true,
95 | "variable-name": false,
96 | "whitespace": [
97 | true,
98 | "check-branch",
99 | "check-decl",
100 | "check-operator",
101 | "check-separator",
102 | "check-type"
103 | ],
104 | "directive-selector": [
105 | true,
106 | "attribute",
107 | "app",
108 | "camelCase"
109 | ],
110 | "component-selector": [
111 | true,
112 | "element",
113 | "app",
114 | "kebab-case"
115 | ],
116 | "use-input-property-decorator": true,
117 | "use-output-property-decorator": true,
118 | "use-host-property-decorator": true,
119 | "no-input-rename": true,
120 | "no-output-rename": true,
121 | "use-life-cycle-interface": true,
122 | "use-pipe-transform-interface": true,
123 | "component-class-suffix": true,
124 | "directive-class-suffix": true,
125 | "no-access-missing-member": true,
126 | "templates-use-public": true,
127 | "invoke-injectable": true
128 | }
129 | }
130 |
--------------------------------------------------------------------------------