Commit 66ee5529fa54890e5aed7d863edda0c7d69f2851
0 parents
Exists in
master
initial commit
Showing
65 changed files
with
2413 additions
and
0 deletions
Show diff stats
bower.json
... | ... | @@ -0,0 +1,33 @@ |
1 | +{ | |
2 | + "name": "imigrationcrm-ui", | |
3 | + "description": "Smart-Office", | |
4 | + "homepage": "https://github.com/micrum/angular-material-admin", | |
5 | + "license": "MIT", | |
6 | + "version": "1.2.0", | |
7 | + "dependencies": { | |
8 | + "AngularJS-Toaster": "angularjs-toaster#~1.2.0", | |
9 | + "angular": "1.4.9", | |
10 | + "angular-animate": "~1.4.9", | |
11 | + "angular-cookies": "~1.4.9", | |
12 | + "angular-material": "1.0.0", | |
13 | + "angular-material-data-table": "~0.9.14", | |
14 | + "angular-messages": "~1.5.2", | |
15 | + "angular-nvd3": "1.0.0-rc.2", | |
16 | + "angular-resource": "~1.5.0", | |
17 | + "angular-sanitize": "~1.4.9", | |
18 | + "angular-touch": "~1.4.9", | |
19 | + "angular-ui-router": "~0.2.17", | |
20 | + "components-font-awesome": "~4.5.0", | |
21 | + "jquery": "~2.1.1", | |
22 | + "angular-chart.js": "^1.0.3", | |
23 | + "alasql": "0.2.7", | |
24 | + "angular-web-notification": "^1.2.7", | |
25 | + "angular-live-set": "*" | |
26 | + }, | |
27 | + "devDependencies": { | |
28 | + "angular-mocks": "~1.4.9" | |
29 | + }, | |
30 | + "resolutions": { | |
31 | + "angular": "~1.4.9" | |
32 | + } | |
33 | +} | ... | ... |
e2e/main.po.js
... | ... | @@ -0,0 +1,11 @@ |
1 | +/** | |
2 | + * This file uses the Page Object pattern to define the main page for tests | |
3 | + * https://docs.google.com/presentation/d/1B6manhG0zEXkC-H-tPo2vwU06JhL8w9-XCF9oehXzAQ | |
4 | + */ | |
5 | + | |
6 | +'use strict'; | |
7 | + | |
8 | +var MainPage = function() { | |
9 | +}; | |
10 | + | |
11 | +module.exports = new MainPage(); | ... | ... |
e2e/main.spec.js
gulp/build.js
... | ... | @@ -0,0 +1,86 @@ |
1 | +'use strict'; | |
2 | + | |
3 | +var gulp = require('gulp'); | |
4 | + | |
5 | +var paths = gulp.paths; | |
6 | + | |
7 | +var $ = require('gulp-load-plugins')({ | |
8 | + pattern: ['gulp-*', 'main-bower-files', 'uglify-save-license', 'del'] | |
9 | +}); | |
10 | + | |
11 | +gulp.task('partials', function () { | |
12 | + return gulp.src([ | |
13 | + paths.src + '/{app,components}/**/*.html', | |
14 | + paths.tmp + '/{app,components}/**/*.html' | |
15 | + ]) | |
16 | + .pipe($.minifyHtml({ | |
17 | + empty: true, | |
18 | + spare: true, | |
19 | + quotes: true | |
20 | + })) | |
21 | + .pipe($.angularTemplatecache('templateCacheHtml.js', { | |
22 | + module: 'didPanelApp' | |
23 | + })) | |
24 | + .pipe(gulp.dest(paths.tmp + '/partials/')) | |
25 | +}); | |
26 | + | |
27 | +gulp.task('html', ['inject', 'partials'], function () { | |
28 | + var partialsInjectFile = gulp.src(paths.tmp + '/partials/templateCacheHtml.js', { read: false }); | |
29 | + var partialsInjectOptions = { | |
30 | + starttag: '<!-- inject:partials -->', | |
31 | + ignorePath: paths.tmp + '/partials', | |
32 | + addRootSlash: false | |
33 | + }; | |
34 | + | |
35 | + var htmlFilter = $.filter('*.html'); | |
36 | + var jsFilter = $.filter('**/*.js'); | |
37 | + var cssFilter = $.filter('**/*.css'); | |
38 | + var assets; | |
39 | + | |
40 | + return gulp.src(paths.tmp + '/serve/*.html') | |
41 | + .pipe($.inject(partialsInjectFile, partialsInjectOptions)) | |
42 | + .pipe(assets = $.useref.assets()) | |
43 | + .pipe($.rev()) | |
44 | + .pipe(jsFilter) | |
45 | + .pipe($.ngAnnotate()) | |
46 | + .pipe($.uglify({preserveComments: $.uglifySaveLicense})) | |
47 | + .pipe(jsFilter.restore()) | |
48 | + .pipe(cssFilter) | |
49 | + .pipe($.csso()) | |
50 | + .pipe(cssFilter.restore()) | |
51 | + .pipe(assets.restore()) | |
52 | + .pipe($.useref()) | |
53 | + .pipe($.revReplace()) | |
54 | + .pipe(htmlFilter) | |
55 | + .pipe($.minifyHtml({ | |
56 | + empty: true, | |
57 | + spare: true, | |
58 | + quotes: true | |
59 | + })) | |
60 | + .pipe(htmlFilter.restore()) | |
61 | + .pipe(gulp.dest(paths.dist + '/')) | |
62 | + .pipe($.size({ title: paths.dist + '/', showFiles: true })); | |
63 | +}); | |
64 | + | |
65 | +gulp.task('images', function () { | |
66 | + return gulp.src(paths.src + '/assets/images/**/*') | |
67 | + .pipe(gulp.dest(paths.dist + '/assets/images/')); | |
68 | +}); | |
69 | + | |
70 | +gulp.task('fonts', function () { | |
71 | + return gulp.src($.mainBowerFiles()) | |
72 | + .pipe($.filter('**/*.{eot,svg,ttf,woff}')) | |
73 | + .pipe($.flatten()) | |
74 | + .pipe(gulp.dest(paths.dist + '/fonts/')); | |
75 | +}); | |
76 | + | |
77 | +gulp.task('misc', function () { | |
78 | + return gulp.src(paths.src + '/**/*.ico') | |
79 | + .pipe(gulp.dest(paths.dist + '/')); | |
80 | +}); | |
81 | + | |
82 | +gulp.task('clean', function (done) { | |
83 | + $.del([paths.dist + '/', paths.tmp + '/'], done); | |
84 | +}); | |
85 | + | |
86 | +gulp.task('build', ['html', 'images', 'fonts', 'misc']); | ... | ... |
gulp/deploy.js
gulp/e2e-tests.js
... | ... | @@ -0,0 +1,35 @@ |
1 | +'use strict'; | |
2 | + | |
3 | +var gulp = require('gulp'); | |
4 | + | |
5 | +var $ = require('gulp-load-plugins')(); | |
6 | + | |
7 | +var browserSync = require('browser-sync'); | |
8 | + | |
9 | +var paths = gulp.paths; | |
10 | + | |
11 | +// Downloads the selenium webdriver | |
12 | +gulp.task('webdriver-update', $.protractor.webdriver_update); | |
13 | + | |
14 | +gulp.task('webdriver-standalone', $.protractor.webdriver_standalone); | |
15 | + | |
16 | +function runProtractor (done) { | |
17 | + | |
18 | + gulp.src(paths.e2e + '/**/*.js') | |
19 | + .pipe($.protractor.protractor({ | |
20 | + configFile: 'protractor.conf.js', | |
21 | + })) | |
22 | + .on('error', function (err) { | |
23 | + // Make sure failed tests cause gulp to exit non-zero | |
24 | + throw err; | |
25 | + }) | |
26 | + .on('end', function () { | |
27 | + // Close browser sync server | |
28 | + browserSync.exit(); | |
29 | + done(); | |
30 | + }); | |
31 | +} | |
32 | + | |
33 | +gulp.task('protractor', ['protractor:src']); | |
34 | +gulp.task('protractor:src', ['serve:e2e', 'webdriver-update'], runProtractor); | |
35 | +gulp.task('protractor:dist', ['serve:e2e-dist', 'webdriver-update'], runProtractor); | ... | ... |
gulp/inject.js
... | ... | @@ -0,0 +1,40 @@ |
1 | +'use strict'; | |
2 | + | |
3 | +var gulp = require('gulp'); | |
4 | + | |
5 | +var paths = gulp.paths; | |
6 | + | |
7 | +var $ = require('gulp-load-plugins')(); | |
8 | + | |
9 | +var wiredep = require('wiredep').stream; | |
10 | + | |
11 | +gulp.task('inject', ['styles'], function () { | |
12 | + | |
13 | + var injectStyles = gulp.src([ | |
14 | + paths.tmp + '/serve/{app,components}/**/*.css', | |
15 | + '!' + paths.tmp + '/serve/app/vendor.css' | |
16 | + ], { read: false }); | |
17 | + | |
18 | + var injectScripts = gulp.src([ | |
19 | + paths.src + '/{app,components}/**/*.js', | |
20 | + '!' + paths.src + '/{app,components}/**/*.spec.js', | |
21 | + '!' + paths.src + '/{app,components}/**/*.mock.js' | |
22 | + ]).pipe($.angularFilesort()); | |
23 | + | |
24 | + var injectOptions = { | |
25 | + ignorePath: [paths.src, paths.tmp + '/serve'], | |
26 | + addRootSlash: false | |
27 | + }; | |
28 | + | |
29 | + var wiredepOptions = { | |
30 | + directory: 'bower_components', | |
31 | + exclude: [/bootstrap\.css/, /foundation\.css/] | |
32 | + }; | |
33 | + | |
34 | + return gulp.src(paths.src + '/*.html') | |
35 | + .pipe($.inject(injectStyles, injectOptions)) | |
36 | + .pipe($.inject(injectScripts, injectOptions)) | |
37 | + .pipe(wiredep(wiredepOptions)) | |
38 | + .pipe(gulp.dest(paths.tmp + '/serve')); | |
39 | + | |
40 | +}); | ... | ... |
gulp/proxy.js
... | ... | @@ -0,0 +1,65 @@ |
1 | + /*jshint unused:false */ | |
2 | + | |
3 | +/*************** | |
4 | + | |
5 | + This file allow to configure a proxy system plugged into BrowserSync | |
6 | + in order to redirect backend requests while still serving and watching | |
7 | + files from the web project | |
8 | + | |
9 | + IMPORTANT: The proxy is disabled by default. | |
10 | + | |
11 | + If you want to enable it, watch at the configuration options and finally | |
12 | + change the `module.exports` at the end of the file | |
13 | + | |
14 | +***************/ | |
15 | + | |
16 | +'use strict'; | |
17 | + | |
18 | +var httpProxy = require('http-proxy'); | |
19 | +var chalk = require('chalk'); | |
20 | + | |
21 | +/* | |
22 | + * Location of your backend server | |
23 | + */ | |
24 | +var proxyTarget = 'http://server/context/'; | |
25 | + | |
26 | +var proxy = httpProxy.createProxyServer({ | |
27 | + target: proxyTarget | |
28 | +}); | |
29 | + | |
30 | +proxy.on('error', function(error, req, res) { | |
31 | + res.writeHead(500, { | |
32 | + 'Content-Type': 'text/plain' | |
33 | + }); | |
34 | + | |
35 | + console.error(chalk.red('[Proxy]'), error); | |
36 | +}); | |
37 | + | |
38 | +/* | |
39 | + * The proxy middleware is an Express middleware added to BrowserSync to | |
40 | + * handle backend request and proxy them to your backend. | |
41 | + */ | |
42 | +function proxyMiddleware(req, res, next) { | |
43 | + /* | |
44 | + * This test is the switch of each request to determine if the request is | |
45 | + * for a static file to be handled by BrowserSync or a backend request to proxy. | |
46 | + * | |
47 | + * The existing test is a standard check on the files extensions but it may fail | |
48 | + * for your needs. If you can, you could also check on a context in the url which | |
49 | + * may be more reliable but can't be generic. | |
50 | + */ | |
51 | + if (/\.(html|css|js|png|jpg|jpeg|gif|ico|xml|rss|txt|eot|svg|ttf|woff|cur)(\?((r|v|rel|rev)=[\-\.\w]*)?)?$/.test(req.url)) { | |
52 | + next(); | |
53 | + } else { | |
54 | + proxy.web(req, res); | |
55 | + } | |
56 | +} | |
57 | + | |
58 | +/* | |
59 | + * This is where you activate or not your proxy. | |
60 | + * | |
61 | + * The first line activate if and the second one ignored it | |
62 | + */ | |
63 | + | |
64 | +//module.exports = [proxyMiddleware]; | |
65 | +module.exports = []; | ... | ... |
gulp/server.js
... | ... | @@ -0,0 +1,58 @@ |
1 | +'use strict'; | |
2 | + | |
3 | +var gulp = require('gulp'); | |
4 | + | |
5 | +var paths = gulp.paths; | |
6 | + | |
7 | +var util = require('util'); | |
8 | + | |
9 | +var browserSync = require('browser-sync'); | |
10 | + | |
11 | +var middleware = require('./proxy'); | |
12 | + | |
13 | +function browserSyncInit(baseDir, files, browser) { | |
14 | + browser = browser === undefined ? 'default' : browser; | |
15 | + | |
16 | + var routes = null; | |
17 | + if(baseDir === paths.src || (util.isArray(baseDir) && baseDir.indexOf(paths.src) !== -1)) { | |
18 | + routes = { | |
19 | + '/bower_components': 'bower_components' | |
20 | + }; | |
21 | + } | |
22 | + | |
23 | + browserSync.instance = browserSync.init(files, { | |
24 | + startPath: '/', | |
25 | + server: { | |
26 | + baseDir: baseDir, | |
27 | + middleware: middleware, | |
28 | + routes: routes | |
29 | + }, | |
30 | + browser: browser | |
31 | + }); | |
32 | +} | |
33 | + | |
34 | +gulp.task('serve', ['watch'], function () { | |
35 | + browserSyncInit([ | |
36 | + paths.tmp + '/serve', | |
37 | + paths.src | |
38 | + ], [ | |
39 | + paths.tmp + '/serve/{app,components}/**/*.css', | |
40 | + paths.src + '/{app,components}/**/*.js', | |
41 | + paths.src + 'src/assets/images/**/*', | |
42 | + paths.tmp + '/serve/*.html', | |
43 | + paths.tmp + '/serve/{app,components}/**/*.html', | |
44 | + paths.src + '/{app,components}/**/*.html' | |
45 | + ]); | |
46 | +}); | |
47 | + | |
48 | +gulp.task('serve:dist', ['build'], function () { | |
49 | + browserSyncInit(paths.dist); | |
50 | +}); | |
51 | + | |
52 | +gulp.task('serve:e2e', ['inject'], function () { | |
53 | + browserSyncInit([paths.tmp + '/serve', paths.src], null, []); | |
54 | +}); | |
55 | + | |
56 | +gulp.task('serve:e2e-dist', ['build'], function () { | |
57 | + browserSyncInit(paths.dist, null, []); | |
58 | +}); | ... | ... |
gulp/styles.js
... | ... | @@ -0,0 +1,53 @@ |
1 | +'use strict'; | |
2 | + | |
3 | +var gulp = require('gulp'); | |
4 | + | |
5 | +var paths = gulp.paths; | |
6 | + | |
7 | +var $ = require('gulp-load-plugins')(); | |
8 | + | |
9 | +gulp.task('styles', function () { | |
10 | + | |
11 | + var sassOptions = { | |
12 | + style: 'expanded' | |
13 | + }; | |
14 | + | |
15 | + var injectFiles = gulp.src([ | |
16 | + paths.src + '/{app,components}/**/*.scss', | |
17 | + '!' + paths.src + '/app/index.scss', | |
18 | + '!' + paths.src + '/app/vendor.scss' | |
19 | + ], { read: false }); | |
20 | + | |
21 | + var injectOptions = { | |
22 | + transform: function(filePath) { | |
23 | + filePath = filePath.replace(paths.src + '/app/', ''); | |
24 | + filePath = filePath.replace(paths.src + '/components/', '../components/'); | |
25 | + return '@import \'' + filePath + '\';'; | |
26 | + }, | |
27 | + starttag: '// injector', | |
28 | + endtag: '// endinjector', | |
29 | + addRootSlash: false | |
30 | + }; | |
31 | + | |
32 | + var indexFilter = $.filter('index.scss'); | |
33 | + | |
34 | + return gulp.src([ | |
35 | + paths.src + '/app/index.scss', | |
36 | + paths.src + '/app/vendor.scss' | |
37 | + ]) | |
38 | + .pipe(indexFilter) | |
39 | + .pipe($.inject(injectFiles, injectOptions)) | |
40 | + .pipe(indexFilter.restore()) | |
41 | + .pipe($.rubySass(sassOptions) | |
42 | + .on('error', function (err) { | |
43 | + console.error('Error!', err.message); | |
44 | + }) | |
45 | + ) | |
46 | + | |
47 | + .pipe($.autoprefixer()) | |
48 | + .on('error', function handleError(err) { | |
49 | + console.error(err.toString()); | |
50 | + this.emit('end'); | |
51 | + }) | |
52 | + .pipe(gulp.dest(paths.tmp + '/serve/app/')); | |
53 | +}); | ... | ... |
gulp/unit-tests.js
... | ... | @@ -0,0 +1,35 @@ |
1 | +'use strict'; | |
2 | + | |
3 | +var gulp = require('gulp'); | |
4 | + | |
5 | +var $ = require('gulp-load-plugins')(); | |
6 | + | |
7 | +var wiredep = require('wiredep'); | |
8 | + | |
9 | +var paths = gulp.paths; | |
10 | + | |
11 | +function runTests (singleRun, done) { | |
12 | + var bowerDeps = wiredep({ | |
13 | + directory: 'bower_components', | |
14 | + exclude: ['bootstrap-sass-official'], | |
15 | + dependencies: true, | |
16 | + devDependencies: true | |
17 | + }); | |
18 | + | |
19 | + var testFiles = bowerDeps.js.concat([ | |
20 | + paths.src + '/{app,components}/**/*.js' | |
21 | + ]); | |
22 | + | |
23 | + gulp.src(testFiles) | |
24 | + .pipe($.karma({ | |
25 | + configFile: 'karma.conf.js', | |
26 | + action: (singleRun)? 'run': 'watch' | |
27 | + })) | |
28 | + .on('error', function (err) { | |
29 | + // Make sure failed tests cause gulp to exit non-zero | |
30 | + throw err; | |
31 | + }); | |
32 | +} | |
33 | + | |
34 | +gulp.task('test', function (done) { runTests(true /* singleRun */, done) }); | |
35 | +gulp.task('test:auto', function (done) { runTests(false /* singleRun */, done) }); | ... | ... |
gulp/watch.js
... | ... | @@ -0,0 +1,14 @@ |
1 | +'use strict'; | |
2 | + | |
3 | +var gulp = require('gulp'); | |
4 | + | |
5 | +var paths = gulp.paths; | |
6 | + | |
7 | +gulp.task('watch', ['inject'], function () { | |
8 | + gulp.watch([ | |
9 | + paths.src + '/*.html', | |
10 | + paths.src + '/{app,components}/**/*.scss', | |
11 | + paths.src + '/{app,components}/**/*.js', | |
12 | + 'bower.json' | |
13 | + ], ['inject']); | |
14 | +}); | ... | ... |
gulpfile.js
... | ... | @@ -0,0 +1,16 @@ |
1 | +'use strict'; | |
2 | + | |
3 | +var gulp = require('gulp'); | |
4 | + | |
5 | +gulp.paths = { | |
6 | + src: 'src', | |
7 | + dist: 'dist', | |
8 | + tmp: '.tmp', | |
9 | + e2e: 'e2e' | |
10 | +}; | |
11 | + | |
12 | +require('require-dir')('./gulp'); | |
13 | + | |
14 | +gulp.task('default', ['clean'], function () { | |
15 | + gulp.start('build'); | |
16 | +}); | ... | ... |
karma.conf.js
... | ... | @@ -0,0 +1,17 @@ |
1 | +'use strict'; | |
2 | + | |
3 | +module.exports = function(config) { | |
4 | + | |
5 | + config.set({ | |
6 | + autoWatch : false, | |
7 | + | |
8 | + frameworks: ['jasmine'], | |
9 | + | |
10 | + browsers : ['PhantomJS'], | |
11 | + | |
12 | + plugins : [ | |
13 | + 'karma-phantomjs-launcher', | |
14 | + 'karma-jasmine' | |
15 | + ] | |
16 | + }); | |
17 | +}; | ... | ... |
package.json
... | ... | @@ -0,0 +1,53 @@ |
1 | +{ | |
2 | + "name": "imigrationCrm-ui", | |
3 | + "version": "1.2.0", | |
4 | + "dependencies": { | |
5 | + "angular-chart.js": "^1.0.3", | |
6 | + "lodash": "~4.6.1" | |
7 | + }, | |
8 | + "devDependencies": { | |
9 | + "browser-sync": "~1.7.1", | |
10 | + "chalk": "~0.5.1", | |
11 | + "del": "~0.1.3", | |
12 | + "gulp": "~3.9.0", | |
13 | + "gulp-angular-filesort": "~1.0.4", | |
14 | + "gulp-angular-templatecache": "~1.4.2", | |
15 | + "gulp-autoprefixer": "~2.0.0", | |
16 | + "gulp-consolidate": "~0.1.2", | |
17 | + "gulp-csso": "~0.2.9", | |
18 | + "gulp-filter": "~1.0.2", | |
19 | + "gulp-flatten": "~0.0.4", | |
20 | + "gulp-gh-pages": "^0.5.4", | |
21 | + "gulp-inject": "~1.0.2", | |
22 | + "gulp-jshint": "~1.9.0", | |
23 | + "gulp-karma": "~0.0.4", | |
24 | + "gulp-load-plugins": "~0.7.1", | |
25 | + "gulp-minify-html": "~0.1.7", | |
26 | + "gulp-ng-annotate": "~1.0.0", | |
27 | + "gulp-protractor": "~0.0.11", | |
28 | + "gulp-rename": "~1.2.0", | |
29 | + "gulp-replace": "~0.5.0", | |
30 | + "gulp-rev": "~2.0.1", | |
31 | + "gulp-rev-replace": "~0.3.1", | |
32 | + "gulp-ruby-sass": "~0.7.1", | |
33 | + "gulp-size": "~1.1.0", | |
34 | + "gulp-uglify": "~1.0.1", | |
35 | + "gulp-useref": "~1.0.2", | |
36 | + "http-proxy": "~1.7.0", | |
37 | + "jshint-stylish": "~1.0.0", | |
38 | + "karma-jasmine": "~0.3.1", | |
39 | + "karma-phantomjs-launcher": "~0.1.4", | |
40 | + "main-bower-files": "~2.4.0", | |
41 | + "protractor": "~1.4.0", | |
42 | + "require-dir": "~0.1.0", | |
43 | + "uglify-save-license": "~0.4.1", | |
44 | + "wiredep": "~2.2.0" | |
45 | + }, | |
46 | + "engines": { | |
47 | + "node": ">=0.10.0" | |
48 | + }, | |
49 | + "scripts": { | |
50 | + "init": "npm install", | |
51 | + "install": "bower install" | |
52 | + } | |
53 | +} | ... | ... |
protractor.conf.js
... | ... | @@ -0,0 +1,25 @@ |
1 | +'use strict'; | |
2 | + | |
3 | +var paths = require('./.yo-rc.json')['generator-gulp-angular'].props.paths; | |
4 | + | |
5 | +// An example configuration file. | |
6 | +exports.config = { | |
7 | + // The address of a running selenium server. | |
8 | + //seleniumAddress: 'http://localhost:4444/wd/hub', | |
9 | + //seleniumServerJar: deprecated, this should be set on node_modules/protractor/config.json | |
10 | + | |
11 | + // Capabilities to be passed to the webdriver instance. | |
12 | + capabilities: { | |
13 | + 'browserName': 'chrome' | |
14 | + }, | |
15 | + | |
16 | + // Spec patterns are relative to the current working directly when | |
17 | + // protractor is called. | |
18 | + specs: [paths.e2e + '/**/*.js'], | |
19 | + | |
20 | + // Options to be passed to Jasmine-node. | |
21 | + jasmineNodeOpts: { | |
22 | + showColors: true, | |
23 | + defaultTimeoutInterval: 30000 | |
24 | + } | |
25 | +}; | ... | ... |
src/404.html
... | ... | @@ -0,0 +1,157 @@ |
1 | +<!DOCTYPE html> | |
2 | +<html lang="en"> | |
3 | + <head> | |
4 | + <meta charset="utf-8"> | |
5 | + <title>Page Not Found :(</title> | |
6 | + <style> | |
7 | + ::-moz-selection { | |
8 | + background: #b3d4fc; | |
9 | + text-shadow: none; | |
10 | + } | |
11 | + | |
12 | + ::selection { | |
13 | + background: #b3d4fc; | |
14 | + text-shadow: none; | |
15 | + } | |
16 | + | |
17 | + html { | |
18 | + padding: 30px 10px; | |
19 | + font-size: 20px; | |
20 | + line-height: 1.4; | |
21 | + color: #737373; | |
22 | + background: #f0f0f0; | |
23 | + -webkit-text-size-adjust: 100%; | |
24 | + -ms-text-size-adjust: 100%; | |
25 | + } | |
26 | + | |
27 | + html, | |
28 | + input { | |
29 | + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; | |
30 | + } | |
31 | + | |
32 | + body { | |
33 | + max-width: 500px; | |
34 | + _width: 500px; | |
35 | + padding: 30px 20px 50px; | |
36 | + border: 1px solid #b3b3b3; | |
37 | + border-radius: 4px; | |
38 | + margin: 0 auto; | |
39 | + box-shadow: 0 1px 10px #a7a7a7, inset 0 1px 0 #fff; | |
40 | + background: #fcfcfc; | |
41 | + } | |
42 | + | |
43 | + h1 { | |
44 | + margin: 0 10px; | |
45 | + font-size: 50px; | |
46 | + text-align: center; | |
47 | + } | |
48 | + | |
49 | + h1 span { | |
50 | + color: #bbb; | |
51 | + } | |
52 | + | |
53 | + h3 { | |
54 | + margin: 1.5em 0 0.5em; | |
55 | + } | |
56 | + | |
57 | + p { | |
58 | + margin: 1em 0; | |
59 | + } | |
60 | + | |
61 | + ul { | |
62 | + padding: 0 0 0 40px; | |
63 | + margin: 1em 0; | |
64 | + } | |
65 | + | |
66 | + .container { | |
67 | + max-width: 380px; | |
68 | + _width: 380px; | |
69 | + margin: 0 auto; | |
70 | + } | |
71 | + | |
72 | + /* google search */ | |
73 | + | |
74 | + #goog-fixurl ul { | |
75 | + list-style: none; | |
76 | + padding: 0; | |
77 | + margin: 0; | |
78 | + } | |
79 | + | |
80 | + #goog-fixurl form { | |
81 | + margin: 0; | |
82 | + } | |
83 | + | |
84 | + #goog-wm-qt, | |
85 | + #goog-wm-sb { | |
86 | + border: 1px solid #bbb; | |
87 | + font-size: 16px; | |
88 | + line-height: normal; | |
89 | + vertical-align: top; | |
90 | + color: #444; | |
91 | + border-radius: 2px; | |
92 | + } | |
93 | + | |
94 | + #goog-wm-qt { | |
95 | + width: 220px; | |
96 | + height: 20px; | |
97 | + padding: 5px; | |
98 | + margin: 5px 10px 0 0; | |
99 | + box-shadow: inset 0 1px 1px #ccc; | |
100 | + } | |
101 | + | |
102 | + #goog-wm-sb { | |
103 | + display: inline-block; | |
104 | + height: 32px; | |
105 | + padding: 0 10px; | |
106 | + margin: 5px 0 0; | |
107 | + white-space: nowrap; | |
108 | + cursor: pointer; | |
109 | + background-color: #f5f5f5; | |
110 | + background-image: -webkit-linear-gradient(rgba(255,255,255,0), #f1f1f1); | |
111 | + background-image: -moz-linear-gradient(rgba(255,255,255,0), #f1f1f1); | |
112 | + background-image: -ms-linear-gradient(rgba(255,255,255,0), #f1f1f1); | |
113 | + background-image: -o-linear-gradient(rgba(255,255,255,0), #f1f1f1); | |
114 | + -webkit-appearance: none; | |
115 | + -moz-appearance: none; | |
116 | + appearance: none; | |
117 | + *overflow: visible; | |
118 | + *display: inline; | |
119 | + *zoom: 1; | |
120 | + } | |
121 | + | |
122 | + #goog-wm-sb:hover, | |
123 | + #goog-wm-sb:focus { | |
124 | + border-color: #aaa; | |
125 | + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); | |
126 | + background-color: #f8f8f8; | |
127 | + } | |
128 | + | |
129 | + #goog-wm-qt:hover, | |
130 | + #goog-wm-qt:focus { | |
131 | + border-color: #105cb6; | |
132 | + outline: 0; | |
133 | + color: #222; | |
134 | + } | |
135 | + | |
136 | + input::-moz-focus-inner { | |
137 | + padding: 0; | |
138 | + border: 0; | |
139 | + } | |
140 | + </style> | |
141 | + </head> | |
142 | + <body> | |
143 | + <div class="container"> | |
144 | + <h1>Not found <span>:(</span></h1> | |
145 | + <p>Sorry, but the page you were trying to view does not exist.</p> | |
146 | + <p>It looks like this was the result of either:</p> | |
147 | + <ul> | |
148 | + <li>a mistyped address</li> | |
149 | + <li>an out-of-date link</li> | |
150 | + </ul> | |
151 | + <script> | |
152 | + var GOOG_FIXURL_LANG = (navigator.language || '').slice(0,2),GOOG_FIXURL_SITE = location.host; | |
153 | + </script> | |
154 | + <script src="//linkhelp.clients.google.com/tbproxy/lh/wm/fixurl.js"></script> | |
155 | + </div> | |
156 | + </body> | |
157 | +</html> | ... | ... |
src/app/app.config.js
... | ... | @@ -0,0 +1,147 @@ |
1 | +(function (){ | |
2 | + 'use strict'; | |
3 | + | |
4 | + angular.module('sbAdminApp') | |
5 | + | |
6 | + .config(function ($mdThemingProvider, $mdIconProvider, $httpProvider, USER_ROLES, AUTH_EVENTS) { | |
7 | + | |
8 | + $mdThemingProvider | |
9 | + .theme('default') | |
10 | + .primaryPalette('blue', { | |
11 | + 'default': '600' | |
12 | + }) | |
13 | + .accentPalette('teal', { | |
14 | + 'default': '500' | |
15 | + }) | |
16 | + .warnPalette('defaultPrimary'); | |
17 | + | |
18 | + $mdThemingProvider | |
19 | + .theme('dark', 'default') | |
20 | + .primaryPalette('defaultPrimary') | |
21 | + .dark(); | |
22 | + | |
23 | + $mdThemingProvider | |
24 | + .theme('grey', 'default') | |
25 | + .primaryPalette('grey'); | |
26 | + | |
27 | + $mdThemingProvider | |
28 | + .theme('custom', 'default') | |
29 | + .primaryPalette('defaultPrimary', { | |
30 | + 'hue-1': '50' | |
31 | + }); | |
32 | + | |
33 | + $mdThemingProvider | |
34 | + .definePalette('defaultPrimary', { | |
35 | + '50': '#FFFFFF', | |
36 | + '100': 'rgb(255, 198, 197)', | |
37 | + '200': '#E75753', | |
38 | + '300': '#E75753', | |
39 | + '400': '#E75753', | |
40 | + '500': '#E75753', | |
41 | + '600': '#E75753', | |
42 | + '700': '#E75753', | |
43 | + '800': '#E75753', | |
44 | + '900': '#E75753', | |
45 | + 'A100': '#E75753', | |
46 | + 'A200': '#E75753', | |
47 | + 'A400': '#E75753', | |
48 | + 'A700': '#E75753' | |
49 | + }); | |
50 | + $mdIconProvider | |
51 | + .icon('user', 'assets/images/user.svg', 64); | |
52 | + }) | |
53 | + | |
54 | + .run(['$rootScope', function($rootScope) { | |
55 | + $rootScope.userDetails = {}; | |
56 | + $rootScope.userDetails.partyDetail = {}; | |
57 | + if(localStorage.getItem("userDetails")){ | |
58 | + $rootScope.userDetails = JSON.parse(localStorage.getItem("userDetails")); | |
59 | + $rootScope.auth = localStorage.getItem("auth"); | |
60 | + } | |
61 | + }]) | |
62 | + | |
63 | + .config(function ($httpProvider) { | |
64 | + $httpProvider.interceptors.push('httpRequestInterceptor'); | |
65 | + }) | |
66 | + | |
67 | + .factory('httpRequestInterceptor', ['$q', '$rootScope', '$location', function($q, $rootScope, $location) { | |
68 | + return { | |
69 | + request: function($config) { | |
70 | + //$config.headers['Authorization'] = 'Basic ' + $rootScope.auth; | |
71 | + return $config; | |
72 | + }, | |
73 | + responseError: function(rejection) { | |
74 | + if (rejection.status === 401) { | |
75 | + //localStorage.clear(); | |
76 | + //window.location.reload(); | |
77 | + } | |
78 | + return $q.reject(rejection); | |
79 | + } | |
80 | + } | |
81 | + }]) | |
82 | + .run(function($rootScope, $window, $state, LoginService, AUTH_EVENTS) { | |
83 | + $rootScope.$on('$stateChangeStart', function (event, next, nextParams, fromState) { | |
84 | + if ('data' in next && 'authorizedRoles' in next.data) { | |
85 | + var authorizedRoles = next.data.authorizedRoles; | |
86 | + if (!LoginService.isAuthorized(authorizedRoles)) { | |
87 | + event.preventDefault(); | |
88 | + if($state.current.name.length == 0) { | |
89 | + $state.go('login') | |
90 | + } else { | |
91 | + $state.go($state.current, {}, {reload: true}); | |
92 | + $rootScope.$broadcast(AUTH_EVENTS.notAuthorized); | |
93 | + $("background").remove(); | |
94 | + } | |
95 | + } | |
96 | + } | |
97 | + if (LoginService.isAuthenticated()) { | |
98 | + if (next.name == 'login') { | |
99 | + event.preventDefault(); | |
100 | + if($state.current.name.length == 0) { | |
101 | + $state.go('app.user'); | |
102 | + } else { | |
103 | + $state.go($state.current, {}, {reload: true}); | |
104 | + $rootScope.$broadcast(AUTH_EVENTS.notAuthorized); | |
105 | + } | |
106 | + } | |
107 | + } | |
108 | + }); | |
109 | + }) | |
110 | + | |
111 | + // .directive('apsUploadFile', apsUploadFile); | |
112 | + | |
113 | + // function apsUploadFile() { | |
114 | + // var directive = { | |
115 | + // restrict: 'E', | |
116 | + // template: '<input id="fileInput" type="file" class="ng-hide"> <md-icon class="material-icons" id="uploadButton">attach_file</md-icon> </md-button><md-input-container flex="100" md-no-float> <input id="textInput" ng-model="fileName" type="text" placeholder="choose file" ng-readonly="true"></md-input-container>', | |
117 | + // link: apsUploadFileLink | |
118 | + // }; | |
119 | + // return directive; | |
120 | + // } | |
121 | + | |
122 | + // function apsUploadFileLink(scope, element, attrs) { | |
123 | + // var input = $(element[0].querySelector('#fileInput')); | |
124 | + // var button = $(element[0].querySelector('#uploadButton')); | |
125 | + // var textInput = $(element[0].querySelector('#textInput')); | |
126 | + | |
127 | + // if (input.length && button.length && textInput.length) { | |
128 | + // button.click(function(e) { | |
129 | + // input.click(); | |
130 | + // }); | |
131 | + // textInput.click(function(e) { | |
132 | + // input.click(); | |
133 | + // }); | |
134 | + // } | |
135 | + | |
136 | + // input.on('change', function(e) { | |
137 | + // var files = e.target.files; | |
138 | + // if (files[0]) { | |
139 | + // scope.fileName = files[0].name; | |
140 | + // } else { | |
141 | + // scope.fileName = null; | |
142 | + // } | |
143 | + // scope.$apply(); | |
144 | + // }); | |
145 | + // } | |
146 | + | |
147 | +})(); | |
0 | 148 | \ No newline at end of file | ... | ... |
src/app/app.constant.js
... | ... | @@ -0,0 +1,20 @@ |
1 | +(function(){ | |
2 | + 'use strict'; | |
3 | + | |
4 | + angular.module('sbAdminApp') | |
5 | + | |
6 | + .constant("BASE_URL", "http://localhost:3002/api") | |
7 | + //.constant("BASE_URL", "http://192.168.1.131:4000/api") | |
8 | + | |
9 | + .constant('AUTH_EVENTS', { | |
10 | + updateUser: 'update-user', | |
11 | + notAuthorized: 'auth-not-authorized', | |
12 | + notAuthenticated: 'auth-not-authenticated' | |
13 | + }) | |
14 | + | |
15 | + .constant('USER_ROLES', { | |
16 | + admin: 'ADMIN', | |
17 | + user: 'USER', | |
18 | + }); | |
19 | + | |
20 | +})(); | ... | ... |
src/app/app.module.js
... | ... | @@ -0,0 +1,26 @@ |
1 | +(function () { | |
2 | + 'use strict'; | |
3 | + | |
4 | + angular.module('sbAdminApp', [ | |
5 | + | |
6 | + //Angular module | |
7 | + 'ngAnimate', | |
8 | + 'ngCookies' | |
9 | + ,'ngSanitize' | |
10 | + ,'ngResource' | |
11 | + ,'ui.router' | |
12 | + ,'ngMaterial' | |
13 | + ,'nvd3' | |
14 | + ,'toaster' | |
15 | + ,'md.data.table' | |
16 | + ,'ngMessages' | |
17 | + ,'chart.js' | |
18 | + ,'ls.ChangeStream' | |
19 | + ,'angular-web-notification' | |
20 | + | |
21 | + // Custom module | |
22 | + ,'sbAdminApp.authentication' | |
23 | + ,'sbAdminApp.navigation' | |
24 | + ,'sbAdminApp.user' | |
25 | + ]); | |
26 | +})(); | |
0 | 27 | \ No newline at end of file | ... | ... |
src/app/app.route.js
... | ... | @@ -0,0 +1,42 @@ |
1 | +(function (){ | |
2 | + 'use strict'; | |
3 | + | |
4 | + angular.module('sbAdminApp') | |
5 | + .config(function ($stateProvider, $urlRouterProvider, USER_ROLES){ | |
6 | + $urlRouterProvider.otherwise('/login'); | |
7 | + $stateProvider | |
8 | + .state('app', { | |
9 | + url: '/app', | |
10 | + abstract: true, | |
11 | + templateUrl: 'app/components/navigation/template/navigation.html', | |
12 | + controller: 'MainController', | |
13 | + controllerAs: 'vm' | |
14 | + }) | |
15 | + .state('login', { | |
16 | + url: '/login', | |
17 | + controller: 'LoginCtrl', | |
18 | + templateUrl: 'app/components/authentication/template/login.html', | |
19 | + data: { | |
20 | + title: 'Login' | |
21 | + } | |
22 | + }) | |
23 | + .state('app.user', { | |
24 | + url: '/user', | |
25 | + controller: 'userCtrl', | |
26 | + templateUrl: 'app/components/user/template/user.html', | |
27 | + data: { | |
28 | + title: 'user', | |
29 | + authorizedRoles: [USER_ROLES.admin , USER_ROLES.user], | |
30 | + } | |
31 | + }) | |
32 | + .state('app.startUp', { | |
33 | + url: '/startUp', | |
34 | + controller: 'userCtrl', | |
35 | + templateUrl: 'app/components/user/template/startUp.html', | |
36 | + data: { | |
37 | + title: 'user', | |
38 | + authorizedRoles: [USER_ROLES.admin , USER_ROLES.user], | |
39 | + } | |
40 | + }) | |
41 | + }) | |
42 | +})(); | ... | ... |
src/app/components/authentication/authentication.controller.js
... | ... | @@ -0,0 +1,59 @@ |
1 | +(function(){ | |
2 | + 'use strict'; | |
3 | + | |
4 | + angular.module('sbAdminApp') | |
5 | + .controller('LoginCtrl', ['$scope', '$rootScope', '$state','$mdDialog','$log', 'AUTH_EVENTS', 'LoginService', 'toaster', loginCtrl]); | |
6 | + | |
7 | + function loginCtrl($scope, $rootScope, $state, $mdDialog,$log, AUTH_EVENTS, LoginService ,toaster) { | |
8 | + $scope.doLogin = function() { | |
9 | + $rootScope.auth = window.btoa($scope.loginData.email + ':' + $scope.loginData.password); | |
10 | + LoginService.doLogin().save($scope.loginData).$promise.then(function(result) { | |
11 | + console.log("result",result); | |
12 | + if(result){ | |
13 | + $rootScope.$broadcast(AUTH_EVENTS.updateUser); | |
14 | + LoginService.setUser(result); | |
15 | + /*if(result.role === 'admin'){ | |
16 | + $state.go("app.user"); | |
17 | + } else { | |
18 | + $state.go("app."); | |
19 | + } */ | |
20 | + $state.go("app.user"); | |
21 | + } | |
22 | + if (Notification.permission !== 'denied') { | |
23 | + Notification.requestPermission(function(permission) { | |
24 | + // If the user accepts, let's create a notification | |
25 | + if (permission === "granted") { | |
26 | + /*var notification = new Notification("Hello!");*/ | |
27 | + } | |
28 | + }); | |
29 | + } | |
30 | + }, | |
31 | + function error(error) { | |
32 | + console.log("ererrorror",error); | |
33 | + if(error){ | |
34 | + toaster.error("server error"); | |
35 | + } | |
36 | + }); | |
37 | + | |
38 | + } | |
39 | + $scope.signUp=function(){ | |
40 | + | |
41 | + LoginService.signUp().save($scope.signupData).$promise.then(function(result) { | |
42 | + console.log("result",result); | |
43 | + // toaster.success("signed up successfully") | |
44 | + $mdDialog.show( | |
45 | + $mdDialog.alert() | |
46 | + .clickOutsideToClose(true) | |
47 | + .title() | |
48 | + .textContent("Please check your email and click on the verification link before logging in.") | |
49 | + .ariaLabel('Alert') | |
50 | + .ok('ok') | |
51 | + ); | |
52 | + | |
53 | + }); | |
54 | + | |
55 | + | |
56 | + } | |
57 | + | |
58 | + } | |
59 | +})(); | |
0 | 60 | \ No newline at end of file | ... | ... |
src/app/components/authentication/authentication.module.js
src/app/components/authentication/authentication.service.js
... | ... | @@ -0,0 +1,70 @@ |
1 | +(function(){ | |
2 | + 'use strict'; | |
3 | + | |
4 | + angular.module('sbAdminApp') | |
5 | + .service('LoginService', ['$q', '$http', '$rootScope', '$resource', 'BASE_URL', 'USER_ROLES', LoginService]); | |
6 | + | |
7 | + function LoginService($q, $http, $rootScope, $resource, BASE_URL, USER_ROLES) { | |
8 | + | |
9 | + var authService = {}, | |
10 | + admin = '', | |
11 | + user = '', | |
12 | + role = '', | |
13 | + isAuthenticated = false; | |
14 | + | |
15 | + if (window.localStorage.getItem("loginStatus")) { | |
16 | + isAuthenticated = true; | |
17 | + $rootScope.userDetails = JSON.parse(localStorage.getItem("userDetails")); | |
18 | + role = $rootScope.userDetails.role.toUpperCase(); | |
19 | + } | |
20 | + | |
21 | + this.setUser = function (res) { | |
22 | + localStorage.setItem('loginStatus', true); | |
23 | + localStorage.setItem('userDetails', JSON.stringify(res)); | |
24 | + isAuthenticated = true; | |
25 | + $rootScope.userDetails = JSON.parse(localStorage.getItem("userDetails")); | |
26 | + role = $rootScope.userDetails.role.toUpperCase(); | |
27 | + } | |
28 | + | |
29 | + this.isAuthenticated = function () { | |
30 | + return isAuthenticated; | |
31 | + }; | |
32 | + | |
33 | + this.role = function () { | |
34 | + return role; | |
35 | + }; | |
36 | + | |
37 | + this.getUser = function () { | |
38 | + return JSON.parse(window.localStorage.getItem("userDetails")); | |
39 | + } | |
40 | + | |
41 | + this.isAuthorized = function (authorizedRoles) { | |
42 | + if (!angular.isArray(authorizedRoles)) { | |
43 | + authorizedRoles = [authorizedRoles]; | |
44 | + } | |
45 | + return (this.isAuthenticated() && authorizedRoles.indexOf(role) !== -1); | |
46 | + } | |
47 | + | |
48 | + this.signUp = function() { | |
49 | + return $resource(BASE_URL+'/users/signUp'); | |
50 | + } | |
51 | + | |
52 | + //Resource for REST APIs | |
53 | + this.doLogin = function() { | |
54 | + return $resource(BASE_URL+'/users/login'); | |
55 | + } | |
56 | + | |
57 | + this.logOut = function(){ | |
58 | + return $resource(BASE_URL+'/users/logout', | |
59 | + {access_token:$rootScope.userDetails.id}) | |
60 | + } | |
61 | + | |
62 | + this.deleteUser = function () { | |
63 | + isAuthenticated = false; | |
64 | + $rootScope.$loginStatus = false; | |
65 | + localStorage.clear(); | |
66 | + } | |
67 | + | |
68 | + } | |
69 | + | |
70 | +})(); | |
0 | 71 | \ No newline at end of file | ... | ... |
src/app/components/authentication/template/login.html
... | ... | @@ -0,0 +1,64 @@ |
1 | +<h1 class="heading" style="text-align:center;">Startup Jalsa</h1> | |
2 | +<md-content class="md-padding" layout="row" layout-wrap layout-align="end center" style="width: 100%;background-color: #e0e0e0;"> | |
3 | + <md-card style="padding: 0px 20px;width:55%;margin-top: -180px;"> | |
4 | + <md-card-title> | |
5 | + <md-card-title-text style="text-align: center;color: dodgerblue;"> | |
6 | + <span class="md-headline">Login</span> | |
7 | + </md-card-title-text> | |
8 | + </md-card-title> | |
9 | + | |
10 | + <form name="loginForm"> | |
11 | + <div layout="column"> | |
12 | + <md-input-container class="md-block md-icon-float"> | |
13 | + <label>Email</label> | |
14 | + <md-icon md-svg-src="assets/images/ic_email_black_24px.svg" class="name"></md-icon> | |
15 | + <input ng-model="loginData.email"> | |
16 | + </md-input-container> | |
17 | + <md-input-container class="md-block md-icon-float"> | |
18 | + <label>Password</label> | |
19 | + <md-icon md-svg-src="assets/images/ic_remove_red_eye_black_24px.svg" class="password"></md-icon> | |
20 | + <input type="password" ng-model="loginData.password"> | |
21 | + </md-input-container> | |
22 | + <section layout="column" layout-align="start"> | |
23 | + <md-button class="md-primary md-raised" ng-click="doLogin()">Login</md-button> | |
24 | + </section> | |
25 | + </div> | |
26 | + </form> | |
27 | +</md-card> | |
28 | +</md-content> | |
29 | +<md-content class="md-padding" layout="row" layout-wrap layout-align="start center" style="width: 100%;background-color:#e0e0e0;"> | |
30 | + <md-card style="padding: 0px 20px;width:60%;"> | |
31 | + <md-card-title> | |
32 | + <md-card-title-text style="text-align: center;color: dodgerblue;"> | |
33 | + <span class="md-headline">Sign Up</span> | |
34 | + </md-card-title-text> | |
35 | + </md-card-title> | |
36 | + <div layout="column"> | |
37 | + <md-input-container class="md-block md-icon-float"> | |
38 | + <label>Username</label> | |
39 | + <md-icon md-svg-src="assets/images/ic_person_black_24px.svg" class="name"></md-icon> | |
40 | + <input ng-model="signupData.username"> | |
41 | + </md-input-container> | |
42 | + <md-input-container class="md-block md-icon-float"> | |
43 | + <label>Email</label> | |
44 | + <md-icon md-svg-src="assets/images/ic_email_black_24px.svg" class="email"></md-icon> | |
45 | + <input ng-model="signupData.email"> | |
46 | + </md-input-container> | |
47 | + <md-input-container class="md-block md-icon-float"> | |
48 | + <label>Password</label> | |
49 | + <md-icon md-svg-src="assets/images/ic_remove_red_eye_black_24px.svg" class="password"></md-icon> | |
50 | + <input type="password" ng-model="signupData.password"> | |
51 | + </md-input-container> | |
52 | + <md-input-container class="md-block md-icon-float"> | |
53 | + <label>Confirm Password</label> | |
54 | + <md-icon md-svg-src="assets/images/ic_remove_red_eye_black_24px.svg" class="confirmPassword"></md-icon> | |
55 | + <input type="password" ng-model="signupData.confirmPassword"> | |
56 | + </md-input-container> | |
57 | + <section layout="column" layout-align="start"> | |
58 | + <md-button class="md-primary md-raised" ng-click="signUp()">sign up</md-button> | |
59 | + </section> | |
60 | + </div> | |
61 | + </form> | |
62 | + </md-card> | |
63 | +</md-content> | |
64 | +<toaster-container toaster-options="{'time-out': 2000, 'close-button':true, 'animation-class': 'toast-top-right'}"></toaster-container> | |
0 | 65 | \ No newline at end of file | ... | ... |
src/app/components/navigation/navigation.controller.js
... | ... | @@ -0,0 +1,119 @@ |
1 | +(function(){ | |
2 | + 'use strict'; | |
3 | + | |
4 | + angular.module('sbAdminApp') | |
5 | + .controller('con',['$scope',con]) | |
6 | + .controller('MainController', ['navService','$rootScope','$mdSidenav', '$mdBottomSheet', '$log', '$q', '$state', '$mdToast', '$scope', '$mdMedia', '$mdDialog','LoginService', 'toaster', MainController]); | |
7 | + | |
8 | + function MainController(navService,$rootScope, $mdSidenav, $mdBottomSheet, $log, $q, $state, $mdToast, $scope, $mdMedia, $mdDialog, LoginService, toaster) { | |
9 | + var vm = this; | |
10 | + //vm.menuItems = [ ]; | |
11 | + vm.selectItem = selectItem; | |
12 | + vm.toggleItemsList = toggleItemsList; | |
13 | + vm.showActions = showActions; | |
14 | + vm.title = $state.current.data.title; | |
15 | + vm.showSimpleToast = showSimpleToast; | |
16 | + vm.toggleRightSidebar = toggleRightSidebar; | |
17 | + vm.autoFocusContent = false; | |
18 | + vm.isOpen = isOpen; | |
19 | + vm.toggleOpen = toggleOpen; | |
20 | + | |
21 | + vm.menu = navService; | |
22 | + | |
23 | + $scope.companyName = localStorage.getItem("companyName"); | |
24 | + | |
25 | + /*navService.loadAllItems().then(function(menuItems) { | |
26 | + vm.menuItems = [].concat(menuItems); | |
27 | + });*/ | |
28 | + | |
29 | + function toggleRightSidebar() { | |
30 | + $mdSidenav('right').toggle(); | |
31 | + } | |
32 | + | |
33 | + function toggleItemsList() { | |
34 | + var pending = $mdBottomSheet.hide() || $q.when(true); | |
35 | + pending.then(function(){ | |
36 | + $mdSidenav('left').toggle(); | |
37 | + }); | |
38 | + } | |
39 | + | |
40 | + function isOpen(section) { | |
41 | + return navService.isSectionSelected(section); | |
42 | + } | |
43 | + | |
44 | + function toggleOpen(section) { | |
45 | + navService.toggleSelectSection(section); | |
46 | + } | |
47 | + | |
48 | + function selectItem (item) { | |
49 | + /*$scope.searchDID = false; | |
50 | + if(item.name == 'DID'){ | |
51 | + $scope.searchDID = true; | |
52 | + }*/ | |
53 | + vm.title = item.name; | |
54 | + vm.toggleItemsList(); | |
55 | + vm.showSimpleToast(vm.title); | |
56 | + } | |
57 | + | |
58 | + function showActions($event) { | |
59 | + $mdBottomSheet.show({ | |
60 | + parent: angular.element(document.getElementById('content')), | |
61 | + templateUrl: 'app/views/partials/bottomSheet.html', | |
62 | + controller: [ '$mdBottomSheet', SheetController], | |
63 | + controllerAs: "vm", | |
64 | + bindToController : true, | |
65 | + targetEvent: $event | |
66 | + }).then(function(clickedItem) { | |
67 | + clickedItem && $log.debug( clickedItem.name + ' clicked!'); | |
68 | + }); | |
69 | + | |
70 | + function SheetController( $mdBottomSheet ) { | |
71 | + var vm = this; | |
72 | + | |
73 | + vm.actions = [ | |
74 | + { name: 'Share', icon: 'share', url: 'https://twitter.com/intent/tweet?text=Angular%20Material%20Dashboard%20https://github.com/flatlogic/angular-material-dashboard%20via%20@flatlogicinc' }, | |
75 | + { name: 'Star', icon: 'star', url: 'https://github.com/flatlogic/angular-material-dashboard/stargazers' } | |
76 | + ]; | |
77 | + | |
78 | + vm.performAction = function(action) { | |
79 | + $mdBottomSheet.hide(action); | |
80 | + }; | |
81 | + } | |
82 | + } | |
83 | + | |
84 | + function showSimpleToast(title) { | |
85 | + $mdToast.show( | |
86 | + $mdToast.simple() | |
87 | + .content(title) | |
88 | + .hideDelay(2000) | |
89 | + .position('bottom right') | |
90 | + ); | |
91 | + } | |
92 | + | |
93 | + $scope.logout = function() { | |
94 | + LoginService.logOut().save().$promise.then(function(result){ | |
95 | + window.location.reload(); | |
96 | + LoginService.deleteUser(); | |
97 | + $state.go("login"); | |
98 | + | |
99 | + }, function(error){ | |
100 | + if(error){ | |
101 | + toaster.error("server error"); | |
102 | + } | |
103 | + }); | |
104 | + } | |
105 | + } | |
106 | + | |
107 | + function con($scope){ | |
108 | + $scope.class = "sidebar-full"; | |
109 | + $scope.changeClass = function(){ | |
110 | + if ($scope.class === "sidebar-full"){ | |
111 | + $scope.class = "sidebar-mini"; | |
112 | + } | |
113 | + else{ | |
114 | + $scope.class = "sidebar-full"; | |
115 | + } | |
116 | + | |
117 | + }; | |
118 | + } | |
119 | +})(); | |
0 | 120 | \ No newline at end of file | ... | ... |
src/app/components/navigation/navigation.module.js
src/app/components/navigation/navigation.service.js
... | ... | @@ -0,0 +1,57 @@ |
1 | +(function(){ | |
2 | + | |
3 | + 'use strict'; | |
4 | + | |
5 | + angular.module('sbAdminApp').factory('navService', [ '$location', '$rootScope', function ($location, $rootScope) { | |
6 | + | |
7 | + | |
8 | + var section = []; | |
9 | + | |
10 | + section.push({ | |
11 | + name: 'Recommend a Startup', | |
12 | + type: 'link', | |
13 | + sref: '.user', | |
14 | + role: ['user'], | |
15 | + }); | |
16 | + | |
17 | + section.push({ | |
18 | + name: 'Apply Late as Startup', | |
19 | + type: 'link', | |
20 | + sref: '.startUp', | |
21 | + role: ['user'], | |
22 | + }); | |
23 | + | |
24 | + var sections = []; | |
25 | + for(var i = 0; i < section.length; i++) { | |
26 | + if(section[i].role.indexOf($rootScope.userDetails.role) !== -1){ | |
27 | + sections.push(section[i]); | |
28 | + } | |
29 | + } | |
30 | + | |
31 | + var self; | |
32 | + | |
33 | + return self = { | |
34 | + sections: sections, | |
35 | + | |
36 | + toggleSelectSection: function (section) { | |
37 | + self.openedSection = (self.openedSection === section ? null : section); | |
38 | + }, | |
39 | + isSectionSelected: function (section) { | |
40 | + return self.openedSection === section; | |
41 | + }, | |
42 | + | |
43 | + selectPage: function (section, page) { | |
44 | + page && page.url && $location.path(page.url); | |
45 | + self.currentSection = section; | |
46 | + self.currentPage = page; | |
47 | + } | |
48 | + }; | |
49 | + | |
50 | + function sortByHumanName(a, b) { | |
51 | + return (a.humanName < b.humanName) ? -1 : | |
52 | + (a.humanName > b.humanName) ? 1 : 0; | |
53 | + } | |
54 | + | |
55 | + }]) | |
56 | + | |
57 | +})(); | |
0 | 58 | \ No newline at end of file | ... | ... |
src/app/components/navigation/template/navigation.html
... | ... | @@ -0,0 +1,73 @@ |
1 | +<md-sidenav class="md-sidenav-left md-whiteframe-z2" md-component-id="left" md-is-locked-open="$mdMedia('gt-sm')"> | |
2 | + <md-toolbar md-theme="default" class="md-theme-indigo"> | |
3 | + <h1 class="md-toolbar-tools" style="white-space: pre; | |
4 | + font-size: 14px"> | |
5 | + WELCOME TO YC APPLY | |
6 | + </h1> | |
7 | + </md-toolbar> | |
8 | + | |
9 | + <div class="navigation-container"> | |
10 | + <div class="toggle-box"> | |
11 | + <!-- <md-button hide-sm hide-xs ng-click="changeClass()" class="size-toggle toggle-left"> | |
12 | + <i class="material-icons">menu</i> | |
13 | + </md-button> --> | |
14 | +<!-- <md-button hide-sm hide-xs ng-click="logout()" class="size-toggle toggle-right"> | |
15 | + <i class="material-icons">power_settings_new</i> | |
16 | + </md-button> --> | |
17 | + </div> | |
18 | + </div> | |
19 | + | |
20 | + <md-content class="custom-md-content" role="navigation"> | |
21 | + <ul class="side-menu"> | |
22 | + <li ng-repeat="item in vm.menu.sections" class="parent-list-item hover-link" ng-class="{'parentActive' : vm.isSectionSelected(item)}" ui-sref-active="md-warn"> | |
23 | + <h2 class="menu-heading" ng-if="item.type === 'heading'" id="heading_{{ item.name }}"> | |
24 | + {{item}} | |
25 | + </h2> | |
26 | + <menu-link section="item" ng-if="item.type === 'link'"></menu-link> | |
27 | + <menu-toggle section="item" ng-if="item.type === 'toggle'"></menu-toggle> | |
28 | + </li> | |
29 | + </ul> | |
30 | + </md-content> | |
31 | +</md-sidenav> | |
32 | + | |
33 | +<div layout="column" flex> | |
34 | + <md-toolbar md-theme="default" layout="row" layout-align="end center"> | |
35 | + <!-- <i class="material-icons" style="cursor: pointer;" ng-click="c2c(customer.phone)">phone | |
36 | + <md-tooltip>Click To Call</md-tooltip> | |
37 | + </i>     --> | |
38 | + <md-menu md-position-mode="target-right target"> | |
39 | + <md-button aria-label="Open logout menu" class="md-icon-button" ng-click="$mdOpenMenu($event)"> | |
40 | + <md-icon md-menu-origin md-svg-src="assets/images/ic_person_white_24px.svg"></md-icon> | |
41 | + </md-button> | |
42 | + <md-menu-content width="3" style="background-color:#ffffff";> | |
43 | + <md-menu-item> | |
44 | + <md-button ui-sref="app.myProfile"> | |
45 | + <div layout="row" style="color:#000";> | |
46 | + <p flex>My Profile</p> | |
47 | + </div> | |
48 | + </md-button> | |
49 | + </md-menu-item> | |
50 | + <md-menu-item> | |
51 | + <md-button ui-sref="app.changePassword"> | |
52 | + <div layout="row" style="color:#000";> | |
53 | + <p flex>Change Password</p> | |
54 | + </div> | |
55 | + </md-button> | |
56 | + </md-menu-item> | |
57 | + <md-menu-item> | |
58 | + <md-button ng-click="logout();"> | |
59 | + <div layout="row" style="color:#000";> | |
60 | + <p flex>Logout</p> | |
61 | + </div> | |
62 | + </md-button> | |
63 | + </md-menu-item> | |
64 | + </md-menu-content> | |
65 | + </md-menu> | |
66 | + </md-toolbar> | |
67 | + | |
68 | + <toaster-container toaster-options="{'time-out': 2000, 'close-button':true, 'animation-class': 'toast-top-right'}"></toaster-container> | |
69 | + | |
70 | + <md-content flex class="md-padding page-content"> | |
71 | + <div ui-view></div> | |
72 | + </md-content> | |
73 | +</div> | |
0 | 74 | \ No newline at end of file | ... | ... |
src/app/components/user/template/startUp.html
... | ... | @@ -0,0 +1,8 @@ |
1 | +<h1 class="md-title headline">Startup Jalsa:</h1><br></br> | |
2 | +<form name="awardsForm" novalidate> | |
3 | + <div> | |
4 | + <label>Company name:</label> | |
5 | + <input ng-model="data.heading" type="text" name="heading" required> | |
6 | + </div> | |
7 | +</form> | |
8 | + | |
0 | 9 | \ No newline at end of file | ... | ... |
src/app/components/user/template/user.html
... | ... | @@ -0,0 +1,5 @@ |
1 | +<h3>YC Recommendations:</h3><br> | |
2 | +<div>Do you know a startup founder who should apply to YC? Recommend them here and weโll send them an email encouraging them to apply.</div><br> | |
3 | +<div>You can recommend as many founders as you like, and then use this page to keep track of their applications.</div><br> | |
4 | +<div>Thank you!</div><br> | |
5 | +<div>Y Combinator</div> | ... | ... |
src/app/components/user/user.controller.js
... | ... | @@ -0,0 +1,12 @@ |
1 | +(function(){ | |
2 | + 'use strict'; | |
3 | + | |
4 | + angular.module('sbAdminApp') | |
5 | + .controller('userCtrl', ['$scope', '$rootScope', '$state','$log', 'AUTH_EVENTS', 'userService', 'toaster', userCtrl]); | |
6 | + | |
7 | + function userCtrl($scope, $rootScope, $state,$log, AUTH_EVENTS, userService ,toaster) { | |
8 | + | |
9 | + | |
10 | + } | |
11 | + | |
12 | + })(); | |
0 | 13 | \ No newline at end of file | ... | ... |
src/app/components/user/user.module.js
src/app/components/user/user.service.js
... | ... | @@ -0,0 +1,11 @@ |
1 | +(function(){ | |
2 | + 'use strict'; | |
3 | + | |
4 | + angular.module('sbAdminApp') | |
5 | + .service('userService', ['$q', '$http', '$rootScope', '$resource', 'BASE_URL', 'USER_ROLES', userService]); | |
6 | + | |
7 | + function userService($q, $http, $rootScope, $resource, BASE_URL, USER_ROLES) { | |
8 | + | |
9 | + } | |
10 | + | |
11 | + })(); | ... | ... |
src/app/directive/menu_toggle.directive.js
... | ... | @@ -0,0 +1,44 @@ |
1 | +angular.module('sbAdminApp') | |
2 | + .run(['$templateCache', function ($templateCache) { | |
3 | + $templateCache.put('partials/menu-toggle.tmpl.html', | |
4 | + '<md-button class="md-button-toggle"\n' + | |
5 | + ' ng-click="toggle()"\n' + | |
6 | + ' aria-controls="docs-menu-{{section.name}}"\n' + | |
7 | + ' flex layout="row"\n' + | |
8 | + ' aria-expanded="{{isOpen()}}">\n' + | |
9 | + ' <i class="material-icons">{{section.icon}}</i>\n' + | |
10 | + ' {{section.name}}\n' + | |
11 | + ' <span aria-hidden="true" class=" pull-right fa fa-chevron-down md-toggle-icon"\n' + | |
12 | + ' ng-class="{\'toggled\' : isOpen()}"></span>\n' + | |
13 | + '</md-button>\n' + | |
14 | + '<ul ng-show="isOpen()" id="docs-menu-{{section.name}}" class="menu-toggle-list">\n' + | |
15 | + ' <li ng-repeat="page in section.pages">\n' + | |
16 | + ' <menu-link section="page"></menu-link>\n' + | |
17 | + ' </li>\n' + | |
18 | + '</ul>\n' + | |
19 | + ''); | |
20 | + }]) | |
21 | + .directive('menuToggle', ['$timeout', function ($timeout ) { | |
22 | + return { | |
23 | + scope: { | |
24 | + section: '=' | |
25 | + }, | |
26 | + templateUrl: 'partials/menu-toggle.tmpl.html', | |
27 | + link: function (scope, element) { | |
28 | + var controller = element.parent().controller(); | |
29 | + | |
30 | + scope.isOpen = function () { | |
31 | + return controller.isOpen(scope.section); | |
32 | + }; | |
33 | + scope.toggle = function () { | |
34 | + controller.toggleOpen(scope.section); | |
35 | + }; | |
36 | + | |
37 | + var parentNode = element[0].parentNode.parentNode.parentNode; | |
38 | + if (parentNode.classList.contains('parent-list-item')) { | |
39 | + var heading = parentNode.querySelector('h2'); | |
40 | + element[0].firstChild.setAttribute('aria-describedby', heading.id); | |
41 | + } | |
42 | + } | |
43 | + }; | |
44 | + }]) | |
0 | 45 | \ No newline at end of file | ... | ... |
src/app/directive/menulink.directive.js
... | ... | @@ -0,0 +1,36 @@ |
1 | +(function(){ | |
2 | + 'use strict'; | |
3 | + | |
4 | + angular.module('sbAdminApp') | |
5 | + .run(['$templateCache', function ($templateCache) { | |
6 | + $templateCache.put('partials/menu-link.tmpl.html', | |
7 | + '<md-button ng-class="{\'{{section.icon}}\' : true}" ui-sref-active="active" \n' + | |
8 | + ' ui-sref="{{section.sref}}" style=" text-transform: capitalize; " ng-click="focusSection()">\n' + | |
9 | + ' <i class="material-icons">{{section.icon}}</i>\n' + | |
10 | + ' {{section.name}}\n' + | |
11 | + ' <span class="md-visually-hidden "\n' + | |
12 | + ' ng-if="isSelected()">\n' + | |
13 | + ' current page\n' + | |
14 | + ' </span>\n' + | |
15 | + '</md-button>\n' + | |
16 | + ''); | |
17 | + }]) | |
18 | + .directive('menuLink', function () { | |
19 | + return { | |
20 | + scope: { | |
21 | + section: '=' | |
22 | + }, | |
23 | + templateUrl: 'partials/menu-link.tmpl.html', | |
24 | + link: function ($scope, $element) { | |
25 | + var controller = $element.parent().controller(); | |
26 | + | |
27 | + $scope.focusSection = function () { | |
28 | + // set flag to be used later when | |
29 | + // $locationChangeSuccess calls openPage() | |
30 | + controller.autoFocusContent = true; | |
31 | + }; | |
32 | + } | |
33 | + }; | |
34 | + }) | |
35 | +})(); | |
36 | + | ... | ... |
src/app/index.scss
src/app/stylesheets/_custom.scss
... | ... | @@ -0,0 +1,509 @@ |
1 | +// COLORS | |
2 | +$main-bg-color: #ECECEC; | |
3 | +$text-color: #7A7A7A; | |
4 | +$accent-color: rgb(0, 150, 136); | |
5 | +$warning-color: #E75753; | |
6 | + | |
7 | + | |
8 | +// VARIABLES | |
9 | +$left-sidenav-width: 200px; | |
10 | +$widget-height: 310px; | |
11 | +$font-weight-bold: 600; | |
12 | +$font-size-large: 20px; | |
13 | + | |
14 | + | |
15 | +// LAYOUT | |
16 | +body { | |
17 | + color: $text-color; | |
18 | +} | |
19 | + | |
20 | +.toolbar-button { | |
21 | + min-width: 20px; | |
22 | +} | |
23 | + | |
24 | +.share-label { | |
25 | + vert-align: middle; | |
26 | + margin-left: 10px; | |
27 | +} | |
28 | + | |
29 | +.page-content { | |
30 | + background-color: $main-bg-color; | |
31 | +} | |
32 | + | |
33 | +.widget-progress { | |
34 | + width: 95% !important; | |
35 | + margin-left: 10px; | |
36 | +} | |
37 | + | |
38 | + | |
39 | +// UTILS | |
40 | +.capitalize { | |
41 | + text-transform: capitalize; | |
42 | +} | |
43 | + | |
44 | +.img-circle { | |
45 | + height: 50px; | |
46 | + border-radius: 50%; | |
47 | + margin: 0 10px; | |
48 | +} | |
49 | + | |
50 | + | |
51 | +// COMPONENTS | |
52 | +.messages { | |
53 | + position: relative; | |
54 | + | |
55 | + &-content { | |
56 | + height: 100vh; | |
57 | + } | |
58 | +} | |
59 | + | |
60 | +.notifications-label { | |
61 | + width: 16px; | |
62 | + height: 16px; | |
63 | + line-height: 16px; | |
64 | + text-align: center; | |
65 | + border-radius: 50%; | |
66 | + position: absolute; | |
67 | + font-size: 12px; | |
68 | + top: 2px; | |
69 | + right: 2px; | |
70 | + background-color: $warning-color; | |
71 | +} | |
72 | + | |
73 | +// panel-widget | |
74 | +.panel-widget { | |
75 | + background-color: white; | |
76 | + | |
77 | + &-toolbar { | |
78 | + box-shadow: none; | |
79 | + } | |
80 | + | |
81 | + &-tittle { | |
82 | + color: $text-color; | |
83 | + } | |
84 | +} | |
85 | + | |
86 | +.options { | |
87 | + -webkit-transition:all linear 0.5s; | |
88 | + transition:all linear 0.5s; | |
89 | +} | |
90 | + | |
91 | +.options.ng-hide { | |
92 | + opacity:0; | |
93 | +} | |
94 | + | |
95 | +.fixed-height-widget { | |
96 | + height: $widget-height; | |
97 | +} | |
98 | + | |
99 | +// charts | |
100 | +.donut-chart-title{ | |
101 | + text-align: center; | |
102 | +} | |
103 | + | |
104 | +.custom-tooltip { | |
105 | + font-size: $font-size-large; | |
106 | + color: $text-color; | |
107 | + text-align: center; | |
108 | +} | |
109 | + | |
110 | + | |
111 | +// OVERRIDES | |
112 | +// angular material overrides | |
113 | +md-radio-group { | |
114 | + border: none; | |
115 | +} | |
116 | + | |
117 | +md-icon { | |
118 | + height: auto; | |
119 | +} | |
120 | + | |
121 | +md-sidenav.md-locked-open.md-sidenav-left { | |
122 | + width: $left-sidenav-width; | |
123 | + min-width: $left-sidenav-width; | |
124 | + max-width: $left-sidenav-width; | |
125 | +} | |
126 | + | |
127 | +a.md-button.md-warn.md-raised, a.md-button.md-warn.md-fab, .md-button.md-warn.md-raised, .md-button.md-warn.md-fab { | |
128 | + color: white; | |
129 | +} | |
130 | + | |
131 | +md-radio-button.md-accent.md-checked .md-label span { | |
132 | + color: $accent-color; | |
133 | +} | |
134 | + | |
135 | +.md-toolbar-tools h1 { | |
136 | + font-size: $font-size-large; | |
137 | +} | |
138 | + | |
139 | + | |
140 | +md-backdrop.md-sidenav-backdrop { | |
141 | + position: fixed; | |
142 | +} | |
143 | + | |
144 | +// libs overrides | |
145 | +.material-icons { | |
146 | + vertical-align: middle; | |
147 | +} | |
148 | + | |
149 | +.material-icons.md-18 { font-size: 18px; } | |
150 | +.material-icons.md-24 { font-size: 24px; } | |
151 | +.material-icons.md-36 { font-size: 36px; } | |
152 | +.material-icons.md-48 { font-size: 48px; } | |
153 | + | |
154 | +.nvd3.nv-pie .nv-pie-title { | |
155 | + fill: rgb(68, 68, 68); | |
156 | + font-weight: $font-weight-bold; | |
157 | + font-size: $font-size-large !important; | |
158 | +} | |
159 | + | |
160 | +.nvtooltip { | |
161 | + background-color: transparent; | |
162 | + border: none; | |
163 | + font-weight: $font-weight-bold; | |
164 | +} | |
165 | + | |
166 | +.orange .md-bar2 { | |
167 | + background-color: orange; | |
168 | +} | |
169 | + | |
170 | +.orange .md-container { | |
171 | + background-color: rgb(255, 236, 201) | |
172 | +} | |
173 | + | |
174 | + | |
175 | +/* Custom by Anurag */ | |
176 | + | |
177 | +//variables | |
178 | +$sidenav-mobile-width: 190px; | |
179 | + | |
180 | +md-sidenav { | |
181 | + width: $sidenav-mobile-width; | |
182 | +} | |
183 | + | |
184 | +.vertical { | |
185 | + padding-right: 5px; | |
186 | + border-right-style: groove; | |
187 | +} | |
188 | + | |
189 | +md-toolbar .md-menu { | |
190 | + margin: 0 !important; | |
191 | +} | |
192 | + | |
193 | +/*form validation*/ | |
194 | + | |
195 | +.help-block { | |
196 | + color: red; | |
197 | + font-size: 11px; | |
198 | +} | |
199 | + | |
200 | + | |
201 | + | |
202 | + | |
203 | + | |
204 | +/* Styles go here */ | |
205 | + | |
206 | +body { | |
207 | + font-family: 'Ubuntu', sans-serif; | |
208 | + color: orangered; | |
209 | +} | |
210 | + | |
211 | +.fill-height{ | |
212 | + display: flex; | |
213 | + flex: 1; | |
214 | + min-height: 100%; | |
215 | +} | |
216 | + | |
217 | +.fill-height > div{ | |
218 | + min-height: 100%; | |
219 | + display: flex; | |
220 | +} | |
221 | + | |
222 | +md-sidenav { | |
223 | + overflow: visible; | |
224 | + | |
225 | +} | |
226 | +.side-menu, .side-menu ul { | |
227 | + list-style: none; | |
228 | + padding: 0; | |
229 | + margin-top: 0; | |
230 | +} | |
231 | + | |
232 | +.side-menu .md-button.active { | |
233 | + color: rgb(30,136,229); | |
234 | +} | |
235 | + | |
236 | +.side-menu .menu-toggle-list a.md-button { | |
237 | + display: block; | |
238 | + padding: 0 16px 0 32px; | |
239 | + text-transform: none; | |
240 | + text-rendering: optimizeLegibility; | |
241 | + font-weight: 500; | |
242 | +} | |
243 | + | |
244 | +.side-menu .menu-toggle-list .md-button { | |
245 | + display: block; | |
246 | + padding: 0 16px 0 32px; | |
247 | + text-transform: none; | |
248 | +} | |
249 | + | |
250 | +.side-menu > li { | |
251 | + border-top: 1px solid rgba(0, 0, 0, 0.12); | |
252 | +} | |
253 | + | |
254 | +.md-button-toggle .md-toggle-icon.toggled { | |
255 | + transform: rotateZ(180deg); | |
256 | + -webkit-transform: rotateZ(180deg); | |
257 | +} | |
258 | + | |
259 | +.side-menu .md-button-toggle .md-toggle-icon { | |
260 | + background-size: 100% auto; | |
261 | + display: inline-block; | |
262 | + margin: auto 0 auto auto; | |
263 | + width: 15px; | |
264 | + color: darkgray; | |
265 | + transition: transform .3s ease-in-out; | |
266 | + -webkit-transition: -webkit-transform .3s ease-in-out; | |
267 | +} | |
268 | + | |
269 | +.menu-toggle-list.ng-hide { | |
270 | + max-height: 0; | |
271 | +} | |
272 | + | |
273 | +.side-menu .md-button { | |
274 | + border-radius: 0; | |
275 | + color: inherit; | |
276 | + cursor: pointer; | |
277 | + font-weight: 400; | |
278 | + line-height: 40px; | |
279 | + margin: 0; | |
280 | + max-height: 40px; | |
281 | + overflow: hidden; | |
282 | + padding: 0px 16px; | |
283 | + text-align: left; | |
284 | + text-decoration: none; | |
285 | + white-space: normal; | |
286 | + width: 100%; | |
287 | +} | |
288 | + | |
289 | +.menu-toggle-list { | |
290 | + background: #fff; | |
291 | + max-height: 1300px; | |
292 | + overflow: hidden; | |
293 | + position: relative; | |
294 | + z-index: 1; | |
295 | + -webkit-transition: 0.75s cubic-bezier(0.35, 0, 0.25, 1); | |
296 | + -webkit-transition-property: max-height; | |
297 | + -moz-transition: 0.75s cubic-bezier(0.35, 0, 0.25, 1); | |
298 | + -moz-transition-property: max-height; | |
299 | + transition: 0.75s cubic-bezier(0.35, 0, 0.25, 1); | |
300 | + transition-property: max-height; | |
301 | +} | |
302 | + | |
303 | + | |
304 | +.side-menu menu-toggle span{ | |
305 | + padding-top: 12px; | |
306 | + padding-bottom: 12px; | |
307 | +} | |
308 | + | |
309 | + | |
310 | + | |
311 | + | |
312 | + | |
313 | +.noShadow{ | |
314 | + box-shadow:none; | |
315 | +} | |
316 | +.borderNew{ | |
317 | + border-bottom:1px solid; | |
318 | + border-color:rgba(128, 128, 128, 0.25); | |
319 | +} | |
320 | +.noMargin{ | |
321 | + margin:0px; | |
322 | +} | |
323 | +.height25{ | |
324 | + height:25px; | |
325 | +} | |
326 | +.carrierBtn{ | |
327 | + width:300px; | |
328 | + height:200px; | |
329 | + background-color:#fff; | |
330 | + box-shadow:0px 0px 10px #666; | |
331 | + text-align:center; | |
332 | + line-height:200px; | |
333 | + font-size:30px; | |
334 | + float:left; | |
335 | + cursor:pointer; | |
336 | + -webkit-transition:0.2s; | |
337 | +} | |
338 | +.carrierBtn:first-child{ | |
339 | + margin-right:50px; | |
340 | +} | |
341 | +.carrierBtn:hover{ | |
342 | + background-color:rgb(30,136,229); | |
343 | + color:#fff; | |
344 | +} | |
345 | +.carrierBtnSelected{ | |
346 | + background-color:rgb(30,136,229); | |
347 | + color:#fff; | |
348 | +} | |
349 | +.myWrapper{ | |
350 | + min-height:500px; | |
351 | +} | |
352 | +.popWrapper{ | |
353 | + padding:20px; | |
354 | +} | |
355 | +.popTitle{ | |
356 | + color:#333; | |
357 | +} | |
358 | +.popContent{ | |
359 | + color:#333; | |
360 | + font-weight:normal; | |
361 | +} | |
362 | +.myBtnPrimary{ | |
363 | + box-shadow:0 2px 5px 0 rgba(0,0,0,.26); | |
364 | + color: rgba(255,255,255,0.87); | |
365 | + background-color: rgb(16,108,200); | |
366 | + float:left; | |
367 | +} | |
368 | +.myBtnPrimary:hover{ | |
369 | + box-shadow:0 2px 5px 0 rgba(0,0,0,.26); | |
370 | + color: rgba(255,255,255,0.87); | |
371 | + background-color: rgb(16,108,200) !important; | |
372 | + float:left; | |
373 | +} | |
374 | +.myBtnDefault{ | |
375 | + box-shadow:0 2px 5px 0 rgba(0,0,0,.26); | |
376 | + color:#333; | |
377 | +} | |
378 | +.cl{clear:both;} | |
379 | + | |
380 | +.widthstyle{ | |
381 | + width: 400px !important; | |
382 | + height:200px !important; | |
383 | + } | |
384 | +.panel-green { | |
385 | + border-color: #5cb85c; | |
386 | +} | |
387 | + | |
388 | +.panel-green .panel-heading { | |
389 | + border-color: #5cb85c; | |
390 | + color: #fff; | |
391 | + background-color: #5cb85c; | |
392 | +} | |
393 | + | |
394 | +.panel-green a { | |
395 | + color: #5cb85c; | |
396 | +} | |
397 | + | |
398 | +.panel-green a:hover { | |
399 | + color: #3d8b3d; | |
400 | +} | |
401 | + | |
402 | +.panel-red { | |
403 | + border-color: #d9534f; | |
404 | +} | |
405 | + | |
406 | +.panel-red .panel-heading { | |
407 | + border-color: #d9534f; | |
408 | + color: #fff; | |
409 | + background-color: #d9534f; | |
410 | +} | |
411 | + | |
412 | +.panel-red a { | |
413 | + color: #d9534f; | |
414 | +} | |
415 | + | |
416 | +.panel-red a:hover { | |
417 | + color: #b52b27; | |
418 | +} | |
419 | + | |
420 | +.panel-yellow { | |
421 | + border-color: #f0ad4e; | |
422 | +} | |
423 | + | |
424 | +.panel-yellow .panel-heading { | |
425 | + border-color: #f0ad4e; | |
426 | + color: #fff; | |
427 | + background-color: #f0ad4e; | |
428 | +} | |
429 | + | |
430 | +.panel-yellow a { | |
431 | + color: #f0ad4e; | |
432 | +} | |
433 | + | |
434 | +.panel-yellow a:hover { | |
435 | + color: #df8a13; | |
436 | +} | |
437 | + | |
438 | +.camelCase { | |
439 | + text-transform: none; | |
440 | +} | |
441 | + | |
442 | +background{ | |
443 | + z-index: 0; | |
444 | + position:absolute; | |
445 | + left:0px; | |
446 | + right:0px; | |
447 | + top:-21px; | |
448 | + bottom:0px; | |
449 | + background-size: cover; | |
450 | +} | |
451 | + | |
452 | +.panel-Content { | |
453 | + padding:0px | |
454 | +} | |
455 | + | |
456 | +.gridListdemoBasicUsage md-grid-list { | |
457 | + margin: 8px; } | |
458 | + | |
459 | +.gridListdemoBasicUsage .orangered { | |
460 | + background: #A66866; } | |
461 | + | |
462 | +.gridListdemoBasicUsage .green { | |
463 | + background: #337ab7; } | |
464 | + | |
465 | +.gridListdemoBasicUsage .yellow { | |
466 | + background: #f0ad4e; } | |
467 | + | |
468 | +.gridListdemoBasicUsage .blue { | |
469 | + background: #84ffff; } | |
470 | + | |
471 | +.gridListdemoBasicUsage .purple { | |
472 | + background: #b388ff; } | |
473 | + | |
474 | +.gridListdemoBasicUsage .red { | |
475 | + background: #ff8a80; } | |
476 | + | |
477 | +.gridListdemoBasicUsage md-grid-tile { | |
478 | + transition: all 400ms ease-out 50ms; } | |
479 | + | |
480 | +/* Custom css */ | |
481 | + | |
482 | +.gridContent{ | |
483 | + width:100%; | |
484 | + height:auto; | |
485 | + padding:10%; | |
486 | + color:#fff; | |
487 | +} | |
488 | +.fl{ | |
489 | + float:left; | |
490 | +} | |
491 | +.fr{ | |
492 | + float:right; | |
493 | +} | |
494 | +.cl{ | |
495 | + clear:both; | |
496 | +} | |
497 | + | |
498 | +.selectFont{ | |
499 | + font-size: 17px; | |
500 | +} | |
501 | + | |
502 | +.heading{ | |
503 | + color:#757575; | |
504 | + position:absolute; | |
505 | + z-index:9; | |
506 | + left:0; | |
507 | + right:0; | |
508 | + top:0; | |
509 | +} | |
0 | 510 | \ No newline at end of file | ... | ... |
src/app/stylesheets/_table.scss
... | ... | @@ -0,0 +1,212 @@ |
1 | +// This file based on http://codepen.io/zavoloklom/pen/IGkDz | |
2 | + | |
3 | +// VARIABLES | |
4 | +$table-header-font-weight: 400; | |
5 | +$table-header-font-color: #757575; | |
6 | + | |
7 | +$table-cell-padding: 1.2rem; | |
8 | + | |
9 | +$table-bg: #fff; | |
10 | +$table-bg-accent: #f5f5f5; | |
11 | +$table-bg-hover: rgba(0,0,0,.12); | |
12 | +$table-bg-active: $table-bg-hover; | |
13 | +$table-border-color: #e0e0e0; | |
14 | + | |
15 | + | |
16 | +// MIXINS | |
17 | +@mixin transition($transition-property, $transition-time, $method) { | |
18 | + -webkit-transition: $transition-property $transition-time $method; | |
19 | + -moz-transition: $transition-property $transition-time $method; | |
20 | + -ms-transition: $transition-property $transition-time $method; | |
21 | + -o-transition: $transition-property $transition-time $method; | |
22 | + transition: $transition-property $transition-time $method; | |
23 | +} | |
24 | + | |
25 | + | |
26 | +//TABLES | |
27 | +.table { | |
28 | + border-spacing: 0; | |
29 | + width: 100%; | |
30 | + max-width: 100%; | |
31 | + margin-bottom: 2rem; | |
32 | + background-color: $table-bg; | |
33 | + > thead, | |
34 | + > tbody, | |
35 | + > tfoot { | |
36 | + > tr { | |
37 | + @include transition(all, 0.3s, ease); | |
38 | + > th, | |
39 | + > td { | |
40 | + text-align: left; | |
41 | + padding: $table-cell-padding; | |
42 | + vertical-align: top; | |
43 | + border-top: 0; | |
44 | + @include transition(all, 0.3s, ease); | |
45 | + } | |
46 | + } | |
47 | + } | |
48 | + > thead > tr > th { | |
49 | + font-weight: $table-header-font-weight; | |
50 | + color: $table-header-font-color; | |
51 | + vertical-align: bottom; | |
52 | + border-bottom: 1px solid rgba(0,0,0,.12); | |
53 | + } | |
54 | + > caption + thead, | |
55 | + > colgroup + thead, | |
56 | + > thead:first-child { | |
57 | + > tr:first-child { | |
58 | + > th, | |
59 | + > td { | |
60 | + border-top: 0; | |
61 | + } | |
62 | + } | |
63 | + } | |
64 | + > tbody + tbody { | |
65 | + border-top: 1px solid rgba(0,0,0,.12); | |
66 | + } | |
67 | + | |
68 | + // Nesting | |
69 | + .table { | |
70 | + background-color: $table-bg; | |
71 | + } | |
72 | + | |
73 | + // Remove border | |
74 | + .no-border { | |
75 | + border: 0; | |
76 | + } | |
77 | +} | |
78 | + | |
79 | +// Bordered version | |
80 | +// | |
81 | +// Add horizontal borders between columns. | |
82 | +.table-bordered { | |
83 | + border: 0; | |
84 | + > thead, | |
85 | + > tbody, | |
86 | + > tfoot { | |
87 | + > tr { | |
88 | + > th, | |
89 | + > td { | |
90 | + border: 0; | |
91 | + border-bottom: 1px solid $table-border-color; | |
92 | + } | |
93 | + } | |
94 | + } | |
95 | + > thead > tr { | |
96 | + > th, | |
97 | + > td { | |
98 | + border-bottom-width: 2px; | |
99 | + } | |
100 | + } | |
101 | +} | |
102 | + | |
103 | + | |
104 | +// Hover effect | |
105 | +// | |
106 | +.table-hover { | |
107 | + > tbody > tr:hover { | |
108 | + > td, | |
109 | + > th { | |
110 | + background-color: $table-bg-hover; | |
111 | + } | |
112 | + } | |
113 | +} | |
114 | + | |
115 | +// Responsive tables (vertical) | |
116 | +// | |
117 | +// Wrap your tables in `.table-responsive-vertical` and we'll make them mobile friendly | |
118 | +// by vertical table-cell display. Only applies <768px. Everything above that will display normally. | |
119 | +// For correct display you must add 'data-title' to each 'td' | |
120 | +.table-responsive-vertical { | |
121 | + | |
122 | + @media screen and (max-width: 768px) { | |
123 | + | |
124 | + // Tighten up spacing | |
125 | + > .table { | |
126 | + margin-bottom: 0; | |
127 | + background-color: transparent; | |
128 | + > thead, | |
129 | + > tfoot { | |
130 | + display: none; | |
131 | + } | |
132 | + | |
133 | + > tbody { | |
134 | + display: block; | |
135 | + | |
136 | + > tr { | |
137 | + display: block; | |
138 | + border: 1px solid $table-border-color; | |
139 | + border-radius: 2px; | |
140 | + margin-bottom: $table-cell-padding; | |
141 | + | |
142 | + > td { | |
143 | + background-color: $table-bg; | |
144 | + display: block; | |
145 | + vertical-align: middle; | |
146 | + text-align: right; | |
147 | + } | |
148 | + > td[data-title]:before { | |
149 | + content: attr(data-title); | |
150 | + float: left; | |
151 | + font-size: inherit; | |
152 | + font-weight: $table-header-font-weight; | |
153 | + color: $table-header-font-color; | |
154 | + padding-right: 10px; | |
155 | + } | |
156 | + } | |
157 | + } | |
158 | + } | |
159 | + | |
160 | + // Special overrides for shadows | |
161 | + &.shadow-z-1 { | |
162 | + -webkit-box-shadow: none; | |
163 | + -moz-box-shadow: none; | |
164 | + box-shadow: none; | |
165 | + > .table > tbody > tr { | |
166 | + border: none; | |
167 | + } | |
168 | + } | |
169 | + | |
170 | + // Special overrides for the bordered tables | |
171 | + > .table-bordered { | |
172 | + border: 0; | |
173 | + | |
174 | + // Nuke the appropriate borders so that the parent can handle them | |
175 | + > tbody { | |
176 | + > tr { | |
177 | + > td { | |
178 | + border: 0; | |
179 | + border-bottom: 1px solid $table-border-color; | |
180 | + } | |
181 | + > td:last-child { | |
182 | + border-bottom: 0; | |
183 | + } | |
184 | + } | |
185 | + } | |
186 | + } | |
187 | + | |
188 | + // Special overrides for the striped tables | |
189 | + > .table-striped { | |
190 | + > tbody > tr > td, | |
191 | + > tbody > tr:nth-child(odd) { | |
192 | + background-color: $table-bg; | |
193 | + } | |
194 | + > tbody > tr > td:nth-child(odd) { | |
195 | + background-color: $table-bg-accent; | |
196 | + } | |
197 | + } | |
198 | + | |
199 | + // Special overrides for hover tables | |
200 | + > .table-hover { | |
201 | + > tbody { | |
202 | + > tr:hover > td, | |
203 | + > tr:hover { | |
204 | + background-color: $table-bg; | |
205 | + } | |
206 | + > tr > td:hover { | |
207 | + background-color: $table-bg-hover; | |
208 | + } | |
209 | + } | |
210 | + } | |
211 | + } | |
212 | +} | ... | ... |
src/assets/images/cart.png
273 Bytes
src/assets/images/ic_business_black_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M0 0h24v24H0z" fill="none"/> | |
3 | + <path d="M12 7V3H2v18h20V7H12zM6 19H4v-2h2v2zm0-4H4v-2h2v2zm0-4H4V9h2v2zm0-4H4V5h2v2zm4 12H8v-2h2v2zm0-4H8v-2h2v2zm0-4H8V9h2v2zm0-4H8V5h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2V9h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_clear_white_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/> | |
3 | + <path d="M0 0h24v24H0z" fill="none"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_close_black_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/> | |
3 | + <path d="M0 0h24v24H0z" fill="none"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_close_white_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/> | |
3 | + <path d="M0 0h24v24H0z" fill="none"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_domain_black_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M0 0h24v24H0z" fill="none"/> | |
3 | + <path d="M12 7V3H2v18h20V7H12zM6 19H4v-2h2v2zm0-4H4v-2h2v2zm0-4H4V9h2v2zm0-4H4V5h2v2zm4 12H8v-2h2v2zm0-4H8v-2h2v2zm0-4H8V9h2v2zm0-4H8V5h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2V9h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_done_black_24px.svg
src/assets/images/ic_email_black_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/> | |
3 | + <path d="M0 0h24v24H0z" fill="none"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_extension_black_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M0 0h24v24H0z" fill="none"/> | |
3 | + <path d="M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5C13 2.12 11.88 1 10.5 1S8 2.12 8 3.5V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5S21.88 11 20.5 11z"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_functions_black_24px.svg
src/assets/images/ic_home_black_24px.svg
src/assets/images/ic_location_city_black_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M15 11V5l-3-3-3 3v2H3v14h18V11h-6zm-8 8H5v-2h2v2zm0-4H5v-2h2v2zm0-4H5V9h2v2zm6 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2V9h2v2zm0-4h-2V5h2v2zm6 12h-2v-2h2v2zm0-4h-2v-2h2v2z"/> | |
3 | + <path d="M0 0h24v24H0z" fill="none"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_open_in_new_black_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M0 0h24v24H0z" fill="none"/> | |
3 | + <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_person_black_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/> | |
3 | + <path d="M0 0h24v24H0z" fill="none"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_person_white_18px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#FFFFFF" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/> | |
3 | + <path d="M0 0h24v24H0z" fill="none"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_person_white_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/> | |
3 | + <path d="M0 0h24v24H0z" fill="none"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_phone_black_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M0 0h24v24H0z" fill="none"/> | |
3 | + <path d="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_phone_missed_black_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M0 0h24v24H0z" fill="none"/> | |
3 | + <path d="M6.5 5.5L12 11l7-7-1-1-6 6-4.5-4.5H11V3H5v6h1.5V5.5zm17.21 11.17C20.66 13.78 16.54 12 12 12 7.46 12 3.34 13.78.29 16.67c-.18.18-.29.43-.29.71s.11.53.29.71l2.48 2.48c.18.18.43.29.71.29.27 0 .52-.11.7-.28.79-.74 1.69-1.36 2.66-1.85.33-.16.56-.5.56-.9v-3.1c1.45-.48 3-.73 4.6-.73 1.6 0 3.15.25 4.6.72v3.1c0 .39.23.74.56.9.98.49 1.87 1.12 2.67 1.85.18.18.43.28.7.28.28 0 .53-.11.71-.29l2.48-2.48c.18-.18.29-.43.29-.71s-.12-.52-.3-.7z"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_pin_drop_black_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M18 8c0-3.31-2.69-6-6-6S6 4.69 6 8c0 4.5 6 11 6 11s6-6.5 6-11zm-8 0c0-1.1.9-2 2-2s2 .9 2 2-.89 2-2 2c-1.1 0-2-.9-2-2zM5 20v2h14v-2H5z"/> | |
3 | + <path d="M0 0h24v24H0z" fill="none"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_public_black_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M0 0h24v24H0z" fill="none"/> | |
3 | + <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_remove_red_eye_black_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M0 0h24v24H0z" fill="none"/> | |
3 | + <path d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_room_black_24px.svg
... | ... | @@ -0,0 +1,4 @@ |
1 | +<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z"/> | |
3 | + <path d="M0 0h24v24H0z" fill="none"/> | |
4 | +</svg> | |
0 | 5 | \ No newline at end of file | ... | ... |
src/assets/images/ic_transfer_within_a_station_black_18px.svg
... | ... | @@ -0,0 +1,10 @@ |
1 | +<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | |
2 | + <g> | |
3 | + <path d="M0 0h24v24H0z" fill="none"/> | |
4 | + <path d="M16.49 15.5v-1.75L14 16.25l2.49 2.5V17H22v-1.5z"/> | |
5 | + <path d="M19.51 19.75H14v1.5h5.51V23L22 20.5 19.51 18z"/> | |
6 | + <g> | |
7 | + <path d="M9.5 5.5c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zM5.75 8.9L3 23h2.1l1.75-8L9 17v6h2v-7.55L8.95 13.4l.6-3C10.85 12 12.8 13 15 13v-2c-1.85 0-3.45-1-4.35-2.45l-.95-1.6C9.35 6.35 8.7 6 8 6c-.25 0-.5.05-.75.15L2 8.3V13h2V9.65l1.75-.75"/> | |
8 | + </g> | |
9 | + </g> | |
10 | +</svg> | |
0 | 11 | \ No newline at end of file | ... | ... |
src/assets/images/ic_trending_flat_white_24px.svg
src/favicon.ico
No preview for this file type
src/index.html
... | ... | @@ -0,0 +1,52 @@ |
1 | +<!doctype html> | |
2 | +<html class="no-js" ng-app="sbAdminApp"> | |
3 | + <head> | |
4 | + <meta charset="utf-8"> | |
5 | + <title>Startup Jalsa</title> | |
6 | + <meta name="description" content="Startup Jalsa"> | |
7 | + <meta name="author" content="Shyam Kumar"> | |
8 | + <meta name="viewport" content="width=device-width"> | |
9 | + <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> | |
10 | + | |
11 | + <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js"></script> | |
12 | + <!-- Place favicon.ico and apple-touch-icon.png in the root directory --> | |
13 | + | |
14 | + <!-- build:css({.tmp/serve,src}) styles/vendor.css --> | |
15 | + <!-- bower:css --> | |
16 | + <!-- run `gulp wiredep` to automaticaly populate bower styles dependencies --> | |
17 | + <!-- endbower --> | |
18 | + <!-- endbuild --> | |
19 | + | |
20 | + <!-- build:css({.tmp/serve,src}) styles/app.css --> | |
21 | + <!-- inject:css --> | |
22 | + <!-- css files will be automaticaly insert here --> | |
23 | + <!-- endinject --> | |
24 | + <!-- endbuild --> | |
25 | + </head> | |
26 | + <body> | |
27 | + <!--[if lt IE 10]> | |
28 | + <p>You are using an <strong>outdated</strong> browser. Please | |
29 | + <a href="http://browsehappy.com/">upgrade your browser</a> | |
30 | + to improve your experience.</p> | |
31 | + <![endif]--> | |
32 | + | |
33 | + <div ui-view layout="row" layout-fill></div> | |
34 | + | |
35 | + <!-- build:js(src) scripts/vendor.js --> | |
36 | + <!-- bower:js --> | |
37 | + <!-- run `gulp wiredep` to automaticaly populate bower script dependencies --> | |
38 | + <!-- endbower --> | |
39 | + <!-- endbuild --> | |
40 | + | |
41 | + <!-- build:js({.tmp/serve,.tmp/partials,src}) scripts/app.js --> | |
42 | + <!-- inject:js --> | |
43 | + <!-- js files will be automaticaly insert here --> | |
44 | + <!-- endinject --> | |
45 | + | |
46 | + <!-- inject:partials --> | |
47 | + <!-- angular templates will be automatically converted in js and inserted here --> | |
48 | + <!-- endinject --> | |
49 | + <!-- endbuild --> | |
50 | + | |
51 | + </body> | |
52 | +</html> | |
0 | 53 | \ No newline at end of file | ... | ... |