diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..b631642 --- /dev/null +++ b/bower.json @@ -0,0 +1,33 @@ +{ + "name": "imigrationcrm-ui", + "description": "Smart-Office", + "homepage": "https://github.com/micrum/angular-material-admin", + "license": "MIT", + "version": "1.2.0", + "dependencies": { + "AngularJS-Toaster": "angularjs-toaster#~1.2.0", + "angular": "1.4.9", + "angular-animate": "~1.4.9", + "angular-cookies": "~1.4.9", + "angular-material": "1.0.0", + "angular-material-data-table": "~0.9.14", + "angular-messages": "~1.5.2", + "angular-nvd3": "1.0.0-rc.2", + "angular-resource": "~1.5.0", + "angular-sanitize": "~1.4.9", + "angular-touch": "~1.4.9", + "angular-ui-router": "~0.2.17", + "components-font-awesome": "~4.5.0", + "jquery": "~2.1.1", + "angular-chart.js": "^1.0.3", + "alasql": "0.2.7", + "angular-web-notification": "^1.2.7", + "angular-live-set": "*" + }, + "devDependencies": { + "angular-mocks": "~1.4.9" + }, + "resolutions": { + "angular": "~1.4.9" + } +} diff --git a/e2e/main.po.js b/e2e/main.po.js new file mode 100644 index 0000000..2a637c9 --- /dev/null +++ b/e2e/main.po.js @@ -0,0 +1,11 @@ +/** + * This file uses the Page Object pattern to define the main page for tests + * https://docs.google.com/presentation/d/1B6manhG0zEXkC-H-tPo2vwU06JhL8w9-XCF9oehXzAQ + */ + +'use strict'; + +var MainPage = function() { +}; + +module.exports = new MainPage(); diff --git a/e2e/main.spec.js b/e2e/main.spec.js new file mode 100644 index 0000000..c98bfac --- /dev/null +++ b/e2e/main.spec.js @@ -0,0 +1,11 @@ +'use strict'; + +describe('The main view', function () { + var page; + + beforeEach(function () { + browser.get('http://localhost:3000/index.html'); + page = require('./main.po'); + }); + +}); diff --git a/gulp/build.js b/gulp/build.js new file mode 100644 index 0000000..015efd2 --- /dev/null +++ b/gulp/build.js @@ -0,0 +1,86 @@ +'use strict'; + +var gulp = require('gulp'); + +var paths = gulp.paths; + +var $ = require('gulp-load-plugins')({ + pattern: ['gulp-*', 'main-bower-files', 'uglify-save-license', 'del'] +}); + +gulp.task('partials', function () { + return gulp.src([ + paths.src + '/{app,components}/**/*.html', + paths.tmp + '/{app,components}/**/*.html' + ]) + .pipe($.minifyHtml({ + empty: true, + spare: true, + quotes: true + })) + .pipe($.angularTemplatecache('templateCacheHtml.js', { + module: 'didPanelApp' + })) + .pipe(gulp.dest(paths.tmp + '/partials/')) +}); + +gulp.task('html', ['inject', 'partials'], function () { + var partialsInjectFile = gulp.src(paths.tmp + '/partials/templateCacheHtml.js', { read: false }); + var partialsInjectOptions = { + starttag: '', + ignorePath: paths.tmp + '/partials', + addRootSlash: false + }; + + var htmlFilter = $.filter('*.html'); + var jsFilter = $.filter('**/*.js'); + var cssFilter = $.filter('**/*.css'); + var assets; + + return gulp.src(paths.tmp + '/serve/*.html') + .pipe($.inject(partialsInjectFile, partialsInjectOptions)) + .pipe(assets = $.useref.assets()) + .pipe($.rev()) + .pipe(jsFilter) + .pipe($.ngAnnotate()) + .pipe($.uglify({preserveComments: $.uglifySaveLicense})) + .pipe(jsFilter.restore()) + .pipe(cssFilter) + .pipe($.csso()) + .pipe(cssFilter.restore()) + .pipe(assets.restore()) + .pipe($.useref()) + .pipe($.revReplace()) + .pipe(htmlFilter) + .pipe($.minifyHtml({ + empty: true, + spare: true, + quotes: true + })) + .pipe(htmlFilter.restore()) + .pipe(gulp.dest(paths.dist + '/')) + .pipe($.size({ title: paths.dist + '/', showFiles: true })); +}); + +gulp.task('images', function () { + return gulp.src(paths.src + '/assets/images/**/*') + .pipe(gulp.dest(paths.dist + '/assets/images/')); +}); + +gulp.task('fonts', function () { + return gulp.src($.mainBowerFiles()) + .pipe($.filter('**/*.{eot,svg,ttf,woff}')) + .pipe($.flatten()) + .pipe(gulp.dest(paths.dist + '/fonts/')); +}); + +gulp.task('misc', function () { + return gulp.src(paths.src + '/**/*.ico') + .pipe(gulp.dest(paths.dist + '/')); +}); + +gulp.task('clean', function (done) { + $.del([paths.dist + '/', paths.tmp + '/'], done); +}); + +gulp.task('build', ['html', 'images', 'fonts', 'misc']); diff --git a/gulp/deploy.js b/gulp/deploy.js new file mode 100644 index 0000000..e7c1d38 --- /dev/null +++ b/gulp/deploy.js @@ -0,0 +1,9 @@ +'use strict'; + +var gulp = require('gulp'); +var ghPages = require('gulp-gh-pages'); + +gulp.task('deploy', function() { + return gulp.src('./dist/**/*') + .pipe(ghPages()); +}); diff --git a/gulp/e2e-tests.js b/gulp/e2e-tests.js new file mode 100644 index 0000000..99ab2c5 --- /dev/null +++ b/gulp/e2e-tests.js @@ -0,0 +1,35 @@ +'use strict'; + +var gulp = require('gulp'); + +var $ = require('gulp-load-plugins')(); + +var browserSync = require('browser-sync'); + +var paths = gulp.paths; + +// Downloads the selenium webdriver +gulp.task('webdriver-update', $.protractor.webdriver_update); + +gulp.task('webdriver-standalone', $.protractor.webdriver_standalone); + +function runProtractor (done) { + + gulp.src(paths.e2e + '/**/*.js') + .pipe($.protractor.protractor({ + configFile: 'protractor.conf.js', + })) + .on('error', function (err) { + // Make sure failed tests cause gulp to exit non-zero + throw err; + }) + .on('end', function () { + // Close browser sync server + browserSync.exit(); + done(); + }); +} + +gulp.task('protractor', ['protractor:src']); +gulp.task('protractor:src', ['serve:e2e', 'webdriver-update'], runProtractor); +gulp.task('protractor:dist', ['serve:e2e-dist', 'webdriver-update'], runProtractor); diff --git a/gulp/inject.js b/gulp/inject.js new file mode 100644 index 0000000..93e13de --- /dev/null +++ b/gulp/inject.js @@ -0,0 +1,40 @@ +'use strict'; + +var gulp = require('gulp'); + +var paths = gulp.paths; + +var $ = require('gulp-load-plugins')(); + +var wiredep = require('wiredep').stream; + +gulp.task('inject', ['styles'], function () { + + var injectStyles = gulp.src([ + paths.tmp + '/serve/{app,components}/**/*.css', + '!' + paths.tmp + '/serve/app/vendor.css' + ], { read: false }); + + var injectScripts = gulp.src([ + paths.src + '/{app,components}/**/*.js', + '!' + paths.src + '/{app,components}/**/*.spec.js', + '!' + paths.src + '/{app,components}/**/*.mock.js' + ]).pipe($.angularFilesort()); + + var injectOptions = { + ignorePath: [paths.src, paths.tmp + '/serve'], + addRootSlash: false + }; + + var wiredepOptions = { + directory: 'bower_components', + exclude: [/bootstrap\.css/, /foundation\.css/] + }; + + return gulp.src(paths.src + '/*.html') + .pipe($.inject(injectStyles, injectOptions)) + .pipe($.inject(injectScripts, injectOptions)) + .pipe(wiredep(wiredepOptions)) + .pipe(gulp.dest(paths.tmp + '/serve')); + +}); diff --git a/gulp/proxy.js b/gulp/proxy.js new file mode 100644 index 0000000..2fcd734 --- /dev/null +++ b/gulp/proxy.js @@ -0,0 +1,65 @@ + /*jshint unused:false */ + +/*************** + + This file allow to configure a proxy system plugged into BrowserSync + in order to redirect backend requests while still serving and watching + files from the web project + + IMPORTANT: The proxy is disabled by default. + + If you want to enable it, watch at the configuration options and finally + change the `module.exports` at the end of the file + +***************/ + +'use strict'; + +var httpProxy = require('http-proxy'); +var chalk = require('chalk'); + +/* + * Location of your backend server + */ +var proxyTarget = 'http://server/context/'; + +var proxy = httpProxy.createProxyServer({ + target: proxyTarget +}); + +proxy.on('error', function(error, req, res) { + res.writeHead(500, { + 'Content-Type': 'text/plain' + }); + + console.error(chalk.red('[Proxy]'), error); +}); + +/* + * The proxy middleware is an Express middleware added to BrowserSync to + * handle backend request and proxy them to your backend. + */ +function proxyMiddleware(req, res, next) { + /* + * This test is the switch of each request to determine if the request is + * for a static file to be handled by BrowserSync or a backend request to proxy. + * + * The existing test is a standard check on the files extensions but it may fail + * for your needs. If you can, you could also check on a context in the url which + * may be more reliable but can't be generic. + */ + 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)) { + next(); + } else { + proxy.web(req, res); + } +} + +/* + * This is where you activate or not your proxy. + * + * The first line activate if and the second one ignored it + */ + +//module.exports = [proxyMiddleware]; +module.exports = []; diff --git a/gulp/server.js b/gulp/server.js new file mode 100644 index 0000000..5740a54 --- /dev/null +++ b/gulp/server.js @@ -0,0 +1,58 @@ +'use strict'; + +var gulp = require('gulp'); + +var paths = gulp.paths; + +var util = require('util'); + +var browserSync = require('browser-sync'); + +var middleware = require('./proxy'); + +function browserSyncInit(baseDir, files, browser) { + browser = browser === undefined ? 'default' : browser; + + var routes = null; + if(baseDir === paths.src || (util.isArray(baseDir) && baseDir.indexOf(paths.src) !== -1)) { + routes = { + '/bower_components': 'bower_components' + }; + } + + browserSync.instance = browserSync.init(files, { + startPath: '/', + server: { + baseDir: baseDir, + middleware: middleware, + routes: routes + }, + browser: browser + }); +} + +gulp.task('serve', ['watch'], function () { + browserSyncInit([ + paths.tmp + '/serve', + paths.src + ], [ + paths.tmp + '/serve/{app,components}/**/*.css', + paths.src + '/{app,components}/**/*.js', + paths.src + 'src/assets/images/**/*', + paths.tmp + '/serve/*.html', + paths.tmp + '/serve/{app,components}/**/*.html', + paths.src + '/{app,components}/**/*.html' + ]); +}); + +gulp.task('serve:dist', ['build'], function () { + browserSyncInit(paths.dist); +}); + +gulp.task('serve:e2e', ['inject'], function () { + browserSyncInit([paths.tmp + '/serve', paths.src], null, []); +}); + +gulp.task('serve:e2e-dist', ['build'], function () { + browserSyncInit(paths.dist, null, []); +}); diff --git a/gulp/styles.js b/gulp/styles.js new file mode 100644 index 0000000..e34a731 --- /dev/null +++ b/gulp/styles.js @@ -0,0 +1,53 @@ +'use strict'; + +var gulp = require('gulp'); + +var paths = gulp.paths; + +var $ = require('gulp-load-plugins')(); + +gulp.task('styles', function () { + + var sassOptions = { + style: 'expanded' + }; + + var injectFiles = gulp.src([ + paths.src + '/{app,components}/**/*.scss', + '!' + paths.src + '/app/index.scss', + '!' + paths.src + '/app/vendor.scss' + ], { read: false }); + + var injectOptions = { + transform: function(filePath) { + filePath = filePath.replace(paths.src + '/app/', ''); + filePath = filePath.replace(paths.src + '/components/', '../components/'); + return '@import \'' + filePath + '\';'; + }, + starttag: '// injector', + endtag: '// endinjector', + addRootSlash: false + }; + + var indexFilter = $.filter('index.scss'); + + return gulp.src([ + paths.src + '/app/index.scss', + paths.src + '/app/vendor.scss' + ]) + .pipe(indexFilter) + .pipe($.inject(injectFiles, injectOptions)) + .pipe(indexFilter.restore()) + .pipe($.rubySass(sassOptions) + .on('error', function (err) { + console.error('Error!', err.message); + }) + ) + + .pipe($.autoprefixer()) + .on('error', function handleError(err) { + console.error(err.toString()); + this.emit('end'); + }) + .pipe(gulp.dest(paths.tmp + '/serve/app/')); +}); diff --git a/gulp/unit-tests.js b/gulp/unit-tests.js new file mode 100644 index 0000000..f13a9c0 --- /dev/null +++ b/gulp/unit-tests.js @@ -0,0 +1,35 @@ +'use strict'; + +var gulp = require('gulp'); + +var $ = require('gulp-load-plugins')(); + +var wiredep = require('wiredep'); + +var paths = gulp.paths; + +function runTests (singleRun, done) { + var bowerDeps = wiredep({ + directory: 'bower_components', + exclude: ['bootstrap-sass-official'], + dependencies: true, + devDependencies: true + }); + + var testFiles = bowerDeps.js.concat([ + paths.src + '/{app,components}/**/*.js' + ]); + + gulp.src(testFiles) + .pipe($.karma({ + configFile: 'karma.conf.js', + action: (singleRun)? 'run': 'watch' + })) + .on('error', function (err) { + // Make sure failed tests cause gulp to exit non-zero + throw err; + }); +} + +gulp.task('test', function (done) { runTests(true /* singleRun */, done) }); +gulp.task('test:auto', function (done) { runTests(false /* singleRun */, done) }); diff --git a/gulp/watch.js b/gulp/watch.js new file mode 100644 index 0000000..48ba133 --- /dev/null +++ b/gulp/watch.js @@ -0,0 +1,14 @@ +'use strict'; + +var gulp = require('gulp'); + +var paths = gulp.paths; + +gulp.task('watch', ['inject'], function () { + gulp.watch([ + paths.src + '/*.html', + paths.src + '/{app,components}/**/*.scss', + paths.src + '/{app,components}/**/*.js', + 'bower.json' + ], ['inject']); +}); diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..19e88c5 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,16 @@ +'use strict'; + +var gulp = require('gulp'); + +gulp.paths = { + src: 'src', + dist: 'dist', + tmp: '.tmp', + e2e: 'e2e' +}; + +require('require-dir')('./gulp'); + +gulp.task('default', ['clean'], function () { + gulp.start('build'); +}); diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000..12e3ff3 --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,17 @@ +'use strict'; + +module.exports = function(config) { + + config.set({ + autoWatch : false, + + frameworks: ['jasmine'], + + browsers : ['PhantomJS'], + + plugins : [ + 'karma-phantomjs-launcher', + 'karma-jasmine' + ] + }); +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..d647d68 --- /dev/null +++ b/package.json @@ -0,0 +1,53 @@ +{ + "name": "imigrationCrm-ui", + "version": "1.2.0", + "dependencies": { + "angular-chart.js": "^1.0.3", + "lodash": "~4.6.1" + }, + "devDependencies": { + "browser-sync": "~1.7.1", + "chalk": "~0.5.1", + "del": "~0.1.3", + "gulp": "~3.9.0", + "gulp-angular-filesort": "~1.0.4", + "gulp-angular-templatecache": "~1.4.2", + "gulp-autoprefixer": "~2.0.0", + "gulp-consolidate": "~0.1.2", + "gulp-csso": "~0.2.9", + "gulp-filter": "~1.0.2", + "gulp-flatten": "~0.0.4", + "gulp-gh-pages": "^0.5.4", + "gulp-inject": "~1.0.2", + "gulp-jshint": "~1.9.0", + "gulp-karma": "~0.0.4", + "gulp-load-plugins": "~0.7.1", + "gulp-minify-html": "~0.1.7", + "gulp-ng-annotate": "~1.0.0", + "gulp-protractor": "~0.0.11", + "gulp-rename": "~1.2.0", + "gulp-replace": "~0.5.0", + "gulp-rev": "~2.0.1", + "gulp-rev-replace": "~0.3.1", + "gulp-ruby-sass": "~0.7.1", + "gulp-size": "~1.1.0", + "gulp-uglify": "~1.0.1", + "gulp-useref": "~1.0.2", + "http-proxy": "~1.7.0", + "jshint-stylish": "~1.0.0", + "karma-jasmine": "~0.3.1", + "karma-phantomjs-launcher": "~0.1.4", + "main-bower-files": "~2.4.0", + "protractor": "~1.4.0", + "require-dir": "~0.1.0", + "uglify-save-license": "~0.4.1", + "wiredep": "~2.2.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "init": "npm install", + "install": "bower install" + } +} diff --git a/protractor.conf.js b/protractor.conf.js new file mode 100644 index 0000000..0f43a9e --- /dev/null +++ b/protractor.conf.js @@ -0,0 +1,25 @@ +'use strict'; + +var paths = require('./.yo-rc.json')['generator-gulp-angular'].props.paths; + +// An example configuration file. +exports.config = { + // The address of a running selenium server. + //seleniumAddress: 'http://localhost:4444/wd/hub', + //seleniumServerJar: deprecated, this should be set on node_modules/protractor/config.json + + // Capabilities to be passed to the webdriver instance. + capabilities: { + 'browserName': 'chrome' + }, + + // Spec patterns are relative to the current working directly when + // protractor is called. + specs: [paths.e2e + '/**/*.js'], + + // Options to be passed to Jasmine-node. + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000 + } +}; diff --git a/src/404.html b/src/404.html new file mode 100644 index 0000000..fdace4a --- /dev/null +++ b/src/404.html @@ -0,0 +1,157 @@ + + + + + Page Not Found :( + + + +
+

Not found :(

+

Sorry, but the page you were trying to view does not exist.

+

It looks like this was the result of either:

+ + + +
+ + diff --git a/src/app/app.config.js b/src/app/app.config.js new file mode 100644 index 0000000..86be91d --- /dev/null +++ b/src/app/app.config.js @@ -0,0 +1,147 @@ +(function (){ + 'use strict'; + + angular.module('sbAdminApp') + + .config(function ($mdThemingProvider, $mdIconProvider, $httpProvider, USER_ROLES, AUTH_EVENTS) { + + $mdThemingProvider + .theme('default') + .primaryPalette('blue', { + 'default': '600' + }) + .accentPalette('teal', { + 'default': '500' + }) + .warnPalette('defaultPrimary'); + + $mdThemingProvider + .theme('dark', 'default') + .primaryPalette('defaultPrimary') + .dark(); + + $mdThemingProvider + .theme('grey', 'default') + .primaryPalette('grey'); + + $mdThemingProvider + .theme('custom', 'default') + .primaryPalette('defaultPrimary', { + 'hue-1': '50' + }); + + $mdThemingProvider + .definePalette('defaultPrimary', { + '50': '#FFFFFF', + '100': 'rgb(255, 198, 197)', + '200': '#E75753', + '300': '#E75753', + '400': '#E75753', + '500': '#E75753', + '600': '#E75753', + '700': '#E75753', + '800': '#E75753', + '900': '#E75753', + 'A100': '#E75753', + 'A200': '#E75753', + 'A400': '#E75753', + 'A700': '#E75753' + }); + $mdIconProvider + .icon('user', 'assets/images/user.svg', 64); + }) + + .run(['$rootScope', function($rootScope) { + $rootScope.userDetails = {}; + $rootScope.userDetails.partyDetail = {}; + if(localStorage.getItem("userDetails")){ + $rootScope.userDetails = JSON.parse(localStorage.getItem("userDetails")); + $rootScope.auth = localStorage.getItem("auth"); + } + }]) + + .config(function ($httpProvider) { + $httpProvider.interceptors.push('httpRequestInterceptor'); + }) + + .factory('httpRequestInterceptor', ['$q', '$rootScope', '$location', function($q, $rootScope, $location) { + return { + request: function($config) { + //$config.headers['Authorization'] = 'Basic ' + $rootScope.auth; + return $config; + }, + responseError: function(rejection) { + if (rejection.status === 401) { + //localStorage.clear(); + //window.location.reload(); + } + return $q.reject(rejection); + } + } + }]) + .run(function($rootScope, $window, $state, LoginService, AUTH_EVENTS) { + $rootScope.$on('$stateChangeStart', function (event, next, nextParams, fromState) { + if ('data' in next && 'authorizedRoles' in next.data) { + var authorizedRoles = next.data.authorizedRoles; + if (!LoginService.isAuthorized(authorizedRoles)) { + event.preventDefault(); + if($state.current.name.length == 0) { + $state.go('login') + } else { + $state.go($state.current, {}, {reload: true}); + $rootScope.$broadcast(AUTH_EVENTS.notAuthorized); + $("background").remove(); + } + } + } + if (LoginService.isAuthenticated()) { + if (next.name == 'login') { + event.preventDefault(); + if($state.current.name.length == 0) { + $state.go('app.user'); + } else { + $state.go($state.current, {}, {reload: true}); + $rootScope.$broadcast(AUTH_EVENTS.notAuthorized); + } + } + } + }); + }) + + // .directive('apsUploadFile', apsUploadFile); + + // function apsUploadFile() { + // var directive = { + // restrict: 'E', + // template: ' attach_file ', + // link: apsUploadFileLink + // }; + // return directive; + // } + + // function apsUploadFileLink(scope, element, attrs) { + // var input = $(element[0].querySelector('#fileInput')); + // var button = $(element[0].querySelector('#uploadButton')); + // var textInput = $(element[0].querySelector('#textInput')); + + // if (input.length && button.length && textInput.length) { + // button.click(function(e) { + // input.click(); + // }); + // textInput.click(function(e) { + // input.click(); + // }); + // } + + // input.on('change', function(e) { + // var files = e.target.files; + // if (files[0]) { + // scope.fileName = files[0].name; + // } else { + // scope.fileName = null; + // } + // scope.$apply(); + // }); + // } + +})(); \ No newline at end of file diff --git a/src/app/app.constant.js b/src/app/app.constant.js new file mode 100644 index 0000000..e447b9a --- /dev/null +++ b/src/app/app.constant.js @@ -0,0 +1,20 @@ +(function(){ + 'use strict'; + + angular.module('sbAdminApp') + + .constant("BASE_URL", "http://localhost:3002/api") + //.constant("BASE_URL", "http://192.168.1.131:4000/api") + + .constant('AUTH_EVENTS', { + updateUser: 'update-user', + notAuthorized: 'auth-not-authorized', + notAuthenticated: 'auth-not-authenticated' + }) + + .constant('USER_ROLES', { + admin: 'ADMIN', + user: 'USER', + }); + +})(); diff --git a/src/app/app.module.js b/src/app/app.module.js new file mode 100644 index 0000000..5a13931 --- /dev/null +++ b/src/app/app.module.js @@ -0,0 +1,26 @@ +(function () { + 'use strict'; + + angular.module('sbAdminApp', [ + + //Angular module + 'ngAnimate', + 'ngCookies' + ,'ngSanitize' + ,'ngResource' + ,'ui.router' + ,'ngMaterial' + ,'nvd3' + ,'toaster' + ,'md.data.table' + ,'ngMessages' + ,'chart.js' + ,'ls.ChangeStream' + ,'angular-web-notification' + + // Custom module + ,'sbAdminApp.authentication' + ,'sbAdminApp.navigation' + ,'sbAdminApp.user' + ]); +})(); \ No newline at end of file diff --git a/src/app/app.route.js b/src/app/app.route.js new file mode 100644 index 0000000..71f8eca --- /dev/null +++ b/src/app/app.route.js @@ -0,0 +1,42 @@ +(function (){ + 'use strict'; + + angular.module('sbAdminApp') + .config(function ($stateProvider, $urlRouterProvider, USER_ROLES){ + $urlRouterProvider.otherwise('/login'); + $stateProvider + .state('app', { + url: '/app', + abstract: true, + templateUrl: 'app/components/navigation/template/navigation.html', + controller: 'MainController', + controllerAs: 'vm' + }) + .state('login', { + url: '/login', + controller: 'LoginCtrl', + templateUrl: 'app/components/authentication/template/login.html', + data: { + title: 'Login' + } + }) + .state('app.user', { + url: '/user', + controller: 'userCtrl', + templateUrl: 'app/components/user/template/user.html', + data: { + title: 'user', + authorizedRoles: [USER_ROLES.admin , USER_ROLES.user], + } + }) + .state('app.startUp', { + url: '/startUp', + controller: 'userCtrl', + templateUrl: 'app/components/user/template/startUp.html', + data: { + title: 'user', + authorizedRoles: [USER_ROLES.admin , USER_ROLES.user], + } + }) + }) +})(); diff --git a/src/app/components/authentication/authentication.controller.js b/src/app/components/authentication/authentication.controller.js new file mode 100644 index 0000000..68e027a --- /dev/null +++ b/src/app/components/authentication/authentication.controller.js @@ -0,0 +1,59 @@ +(function(){ + 'use strict'; + + angular.module('sbAdminApp') + .controller('LoginCtrl', ['$scope', '$rootScope', '$state','$mdDialog','$log', 'AUTH_EVENTS', 'LoginService', 'toaster', loginCtrl]); + + function loginCtrl($scope, $rootScope, $state, $mdDialog,$log, AUTH_EVENTS, LoginService ,toaster) { + $scope.doLogin = function() { + $rootScope.auth = window.btoa($scope.loginData.email + ':' + $scope.loginData.password); + LoginService.doLogin().save($scope.loginData).$promise.then(function(result) { + console.log("result",result); + if(result){ + $rootScope.$broadcast(AUTH_EVENTS.updateUser); + LoginService.setUser(result); + /*if(result.role === 'admin'){ + $state.go("app.user"); + } else { + $state.go("app."); + } */ + $state.go("app.user"); + } + if (Notification.permission !== 'denied') { + Notification.requestPermission(function(permission) { + // If the user accepts, let's create a notification + if (permission === "granted") { + /*var notification = new Notification("Hello!");*/ + } + }); + } + }, + function error(error) { + console.log("ererrorror",error); + if(error){ + toaster.error("server error"); + } + }); + + } + $scope.signUp=function(){ + + LoginService.signUp().save($scope.signupData).$promise.then(function(result) { + console.log("result",result); + // toaster.success("signed up successfully") + $mdDialog.show( + $mdDialog.alert() + .clickOutsideToClose(true) + .title() + .textContent("Please check your email and click on the verification link before logging in.") + .ariaLabel('Alert') + .ok('ok') + ); + + }); + + + } + + } +})(); \ No newline at end of file diff --git a/src/app/components/authentication/authentication.module.js b/src/app/components/authentication/authentication.module.js new file mode 100644 index 0000000..d2dc124 --- /dev/null +++ b/src/app/components/authentication/authentication.module.js @@ -0,0 +1,5 @@ +(function () { + + angular.module('sbAdminApp.authentication', []); + +})(); diff --git a/src/app/components/authentication/authentication.service.js b/src/app/components/authentication/authentication.service.js new file mode 100644 index 0000000..dce30ff --- /dev/null +++ b/src/app/components/authentication/authentication.service.js @@ -0,0 +1,70 @@ +(function(){ + 'use strict'; + + angular.module('sbAdminApp') + .service('LoginService', ['$q', '$http', '$rootScope', '$resource', 'BASE_URL', 'USER_ROLES', LoginService]); + + function LoginService($q, $http, $rootScope, $resource, BASE_URL, USER_ROLES) { + + var authService = {}, + admin = '', + user = '', + role = '', + isAuthenticated = false; + + if (window.localStorage.getItem("loginStatus")) { + isAuthenticated = true; + $rootScope.userDetails = JSON.parse(localStorage.getItem("userDetails")); + role = $rootScope.userDetails.role.toUpperCase(); + } + + this.setUser = function (res) { + localStorage.setItem('loginStatus', true); + localStorage.setItem('userDetails', JSON.stringify(res)); + isAuthenticated = true; + $rootScope.userDetails = JSON.parse(localStorage.getItem("userDetails")); + role = $rootScope.userDetails.role.toUpperCase(); + } + + this.isAuthenticated = function () { + return isAuthenticated; + }; + + this.role = function () { + return role; + }; + + this.getUser = function () { + return JSON.parse(window.localStorage.getItem("userDetails")); + } + + this.isAuthorized = function (authorizedRoles) { + if (!angular.isArray(authorizedRoles)) { + authorizedRoles = [authorizedRoles]; + } + return (this.isAuthenticated() && authorizedRoles.indexOf(role) !== -1); + } + + this.signUp = function() { + return $resource(BASE_URL+'/users/signUp'); + } + + //Resource for REST APIs + this.doLogin = function() { + return $resource(BASE_URL+'/users/login'); + } + + this.logOut = function(){ + return $resource(BASE_URL+'/users/logout', + {access_token:$rootScope.userDetails.id}) + } + + this.deleteUser = function () { + isAuthenticated = false; + $rootScope.$loginStatus = false; + localStorage.clear(); + } + + } + +})(); \ No newline at end of file diff --git a/src/app/components/authentication/template/login.html b/src/app/components/authentication/template/login.html new file mode 100644 index 0000000..910e8a0 --- /dev/null +++ b/src/app/components/authentication/template/login.html @@ -0,0 +1,64 @@ +

Startup Jalsa

+ + + + + Login + + + +
+
+ + + + + + + + + + +
+ Login +
+
+
+
+
+ + + + + Sign Up + + +
+ + + + + + + + + + + + + + + + + + + + +
+ sign up +
+
+ +
+
+ \ No newline at end of file diff --git a/src/app/components/navigation/navigation.controller.js b/src/app/components/navigation/navigation.controller.js new file mode 100644 index 0000000..1945c3d --- /dev/null +++ b/src/app/components/navigation/navigation.controller.js @@ -0,0 +1,119 @@ +(function(){ + 'use strict'; + + angular.module('sbAdminApp') + .controller('con',['$scope',con]) + .controller('MainController', ['navService','$rootScope','$mdSidenav', '$mdBottomSheet', '$log', '$q', '$state', '$mdToast', '$scope', '$mdMedia', '$mdDialog','LoginService', 'toaster', MainController]); + + function MainController(navService,$rootScope, $mdSidenav, $mdBottomSheet, $log, $q, $state, $mdToast, $scope, $mdMedia, $mdDialog, LoginService, toaster) { + var vm = this; + //vm.menuItems = [ ]; + vm.selectItem = selectItem; + vm.toggleItemsList = toggleItemsList; + vm.showActions = showActions; + vm.title = $state.current.data.title; + vm.showSimpleToast = showSimpleToast; + vm.toggleRightSidebar = toggleRightSidebar; + vm.autoFocusContent = false; + vm.isOpen = isOpen; + vm.toggleOpen = toggleOpen; + + vm.menu = navService; + + $scope.companyName = localStorage.getItem("companyName"); + + /*navService.loadAllItems().then(function(menuItems) { + vm.menuItems = [].concat(menuItems); + });*/ + + function toggleRightSidebar() { + $mdSidenav('right').toggle(); + } + + function toggleItemsList() { + var pending = $mdBottomSheet.hide() || $q.when(true); + pending.then(function(){ + $mdSidenav('left').toggle(); + }); + } + + function isOpen(section) { + return navService.isSectionSelected(section); + } + + function toggleOpen(section) { + navService.toggleSelectSection(section); + } + + function selectItem (item) { + /*$scope.searchDID = false; + if(item.name == 'DID'){ + $scope.searchDID = true; + }*/ + vm.title = item.name; + vm.toggleItemsList(); + vm.showSimpleToast(vm.title); + } + + function showActions($event) { + $mdBottomSheet.show({ + parent: angular.element(document.getElementById('content')), + templateUrl: 'app/views/partials/bottomSheet.html', + controller: [ '$mdBottomSheet', SheetController], + controllerAs: "vm", + bindToController : true, + targetEvent: $event + }).then(function(clickedItem) { + clickedItem && $log.debug( clickedItem.name + ' clicked!'); + }); + + function SheetController( $mdBottomSheet ) { + var vm = this; + + vm.actions = [ + { name: 'Share', icon: 'share', url: 'https://twitter.com/intent/tweet?text=Angular%20Material%20Dashboard%20https://github.com/flatlogic/angular-material-dashboard%20via%20@flatlogicinc' }, + { name: 'Star', icon: 'star', url: 'https://github.com/flatlogic/angular-material-dashboard/stargazers' } + ]; + + vm.performAction = function(action) { + $mdBottomSheet.hide(action); + }; + } + } + + function showSimpleToast(title) { + $mdToast.show( + $mdToast.simple() + .content(title) + .hideDelay(2000) + .position('bottom right') + ); + } + + $scope.logout = function() { + LoginService.logOut().save().$promise.then(function(result){ + window.location.reload(); + LoginService.deleteUser(); + $state.go("login"); + + }, function(error){ + if(error){ + toaster.error("server error"); + } + }); + } + } + + function con($scope){ + $scope.class = "sidebar-full"; + $scope.changeClass = function(){ + if ($scope.class === "sidebar-full"){ + $scope.class = "sidebar-mini"; + } + else{ + $scope.class = "sidebar-full"; + } + + }; + } +})(); \ No newline at end of file diff --git a/src/app/components/navigation/navigation.module.js b/src/app/components/navigation/navigation.module.js new file mode 100644 index 0000000..1ee765b --- /dev/null +++ b/src/app/components/navigation/navigation.module.js @@ -0,0 +1,5 @@ +(function () { + + angular.module('sbAdminApp.navigation', []); + +})(); diff --git a/src/app/components/navigation/navigation.service.js b/src/app/components/navigation/navigation.service.js new file mode 100644 index 0000000..5596711 --- /dev/null +++ b/src/app/components/navigation/navigation.service.js @@ -0,0 +1,57 @@ +(function(){ + + 'use strict'; + + angular.module('sbAdminApp').factory('navService', [ '$location', '$rootScope', function ($location, $rootScope) { + + + var section = []; + + section.push({ + name: 'Recommend a Startup', + type: 'link', + sref: '.user', + role: ['user'], + }); + + section.push({ + name: 'Apply Late as Startup', + type: 'link', + sref: '.startUp', + role: ['user'], + }); + + var sections = []; + for(var i = 0; i < section.length; i++) { + if(section[i].role.indexOf($rootScope.userDetails.role) !== -1){ + sections.push(section[i]); + } + } + + var self; + + return self = { + sections: sections, + + toggleSelectSection: function (section) { + self.openedSection = (self.openedSection === section ? null : section); + }, + isSectionSelected: function (section) { + return self.openedSection === section; + }, + + selectPage: function (section, page) { + page && page.url && $location.path(page.url); + self.currentSection = section; + self.currentPage = page; + } + }; + + function sortByHumanName(a, b) { + return (a.humanName < b.humanName) ? -1 : + (a.humanName > b.humanName) ? 1 : 0; + } + + }]) + +})(); \ No newline at end of file diff --git a/src/app/components/navigation/template/navigation.html b/src/app/components/navigation/template/navigation.html new file mode 100644 index 0000000..b76cf6a --- /dev/null +++ b/src/app/components/navigation/template/navigation.html @@ -0,0 +1,73 @@ + + +

+ WELCOME TO YC APPLY +

+
+ + + + + + +
+ +
+ + + + + + + + + +
+

My Profile

+
+
+
+ + +
+

Change Password

+
+
+
+ + +
+

Logout

+
+
+
+
+
+
+ + + + +
+
+
\ No newline at end of file diff --git a/src/app/components/user/template/startUp.html b/src/app/components/user/template/startUp.html new file mode 100644 index 0000000..6368058 --- /dev/null +++ b/src/app/components/user/template/startUp.html @@ -0,0 +1,8 @@ +

Startup Jalsa:



+
+
+ + +
+
+ \ No newline at end of file diff --git a/src/app/components/user/template/user.html b/src/app/components/user/template/user.html new file mode 100644 index 0000000..3a1f140 --- /dev/null +++ b/src/app/components/user/template/user.html @@ -0,0 +1,5 @@ +

YC Recommendations:


+
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.

+
You can recommend as many founders as you like, and then use this page to keep track of their applications.

+
Thank you!

+
Y Combinator
diff --git a/src/app/components/user/user.controller.js b/src/app/components/user/user.controller.js new file mode 100644 index 0000000..1650393 --- /dev/null +++ b/src/app/components/user/user.controller.js @@ -0,0 +1,12 @@ +(function(){ + 'use strict'; + + angular.module('sbAdminApp') + .controller('userCtrl', ['$scope', '$rootScope', '$state','$log', 'AUTH_EVENTS', 'userService', 'toaster', userCtrl]); + + function userCtrl($scope, $rootScope, $state,$log, AUTH_EVENTS, userService ,toaster) { + + + } + + })(); \ No newline at end of file diff --git a/src/app/components/user/user.module.js b/src/app/components/user/user.module.js new file mode 100644 index 0000000..7eb8467 --- /dev/null +++ b/src/app/components/user/user.module.js @@ -0,0 +1,5 @@ +(function () { + + angular.module('sbAdminApp.user', []); + +})(); diff --git a/src/app/components/user/user.service.js b/src/app/components/user/user.service.js new file mode 100644 index 0000000..e992da1 --- /dev/null +++ b/src/app/components/user/user.service.js @@ -0,0 +1,11 @@ +(function(){ + 'use strict'; + + angular.module('sbAdminApp') + .service('userService', ['$q', '$http', '$rootScope', '$resource', 'BASE_URL', 'USER_ROLES', userService]); + + function userService($q, $http, $rootScope, $resource, BASE_URL, USER_ROLES) { + + } + + })(); diff --git a/src/app/directive/menu_toggle.directive.js b/src/app/directive/menu_toggle.directive.js new file mode 100644 index 0000000..459962a --- /dev/null +++ b/src/app/directive/menu_toggle.directive.js @@ -0,0 +1,44 @@ +angular.module('sbAdminApp') + .run(['$templateCache', function ($templateCache) { + $templateCache.put('partials/menu-toggle.tmpl.html', + '\n' + + ' {{section.icon}}\n' + + ' {{section.name}}\n' + + ' \n' + + '\n' + + '\n' + + ''); + }]) + .directive('menuToggle', ['$timeout', function ($timeout ) { + return { + scope: { + section: '=' + }, + templateUrl: 'partials/menu-toggle.tmpl.html', + link: function (scope, element) { + var controller = element.parent().controller(); + + scope.isOpen = function () { + return controller.isOpen(scope.section); + }; + scope.toggle = function () { + controller.toggleOpen(scope.section); + }; + + var parentNode = element[0].parentNode.parentNode.parentNode; + if (parentNode.classList.contains('parent-list-item')) { + var heading = parentNode.querySelector('h2'); + element[0].firstChild.setAttribute('aria-describedby', heading.id); + } + } + }; + }]) \ No newline at end of file diff --git a/src/app/directive/menulink.directive.js b/src/app/directive/menulink.directive.js new file mode 100644 index 0000000..99a9c34 --- /dev/null +++ b/src/app/directive/menulink.directive.js @@ -0,0 +1,36 @@ +(function(){ + 'use strict'; + + angular.module('sbAdminApp') + .run(['$templateCache', function ($templateCache) { + $templateCache.put('partials/menu-link.tmpl.html', + '\n' + + ' {{section.icon}}\n' + + ' {{section.name}}\n' + + ' \n' + + ' current page\n' + + ' \n' + + '\n' + + ''); + }]) + .directive('menuLink', function () { + return { + scope: { + section: '=' + }, + templateUrl: 'partials/menu-link.tmpl.html', + link: function ($scope, $element) { + var controller = $element.parent().controller(); + + $scope.focusSection = function () { + // set flag to be used later when + // $locationChangeSuccess calls openPage() + controller.autoFocusContent = true; + }; + } + }; + }) +})(); + diff --git a/src/app/index.scss b/src/app/index.scss new file mode 100644 index 0000000..6a70604 --- /dev/null +++ b/src/app/index.scss @@ -0,0 +1,16 @@ +// injector +// endinjector + + +/* Custom CSS */ + + +body{ + color:#000; +} + +.iframe{ + width:100% ; + height:800px ; + border:0; +} \ No newline at end of file diff --git a/src/app/stylesheets/_custom.scss b/src/app/stylesheets/_custom.scss new file mode 100644 index 0000000..26f9e8d --- /dev/null +++ b/src/app/stylesheets/_custom.scss @@ -0,0 +1,509 @@ +// COLORS +$main-bg-color: #ECECEC; +$text-color: #7A7A7A; +$accent-color: rgb(0, 150, 136); +$warning-color: #E75753; + + +// VARIABLES +$left-sidenav-width: 200px; +$widget-height: 310px; +$font-weight-bold: 600; +$font-size-large: 20px; + + +// LAYOUT +body { + color: $text-color; +} + +.toolbar-button { + min-width: 20px; +} + +.share-label { + vert-align: middle; + margin-left: 10px; +} + +.page-content { + background-color: $main-bg-color; +} + +.widget-progress { + width: 95% !important; + margin-left: 10px; +} + + +// UTILS +.capitalize { + text-transform: capitalize; +} + +.img-circle { + height: 50px; + border-radius: 50%; + margin: 0 10px; +} + + +// COMPONENTS +.messages { + position: relative; + + &-content { + height: 100vh; + } +} + +.notifications-label { + width: 16px; + height: 16px; + line-height: 16px; + text-align: center; + border-radius: 50%; + position: absolute; + font-size: 12px; + top: 2px; + right: 2px; + background-color: $warning-color; +} + +// panel-widget +.panel-widget { + background-color: white; + + &-toolbar { + box-shadow: none; + } + + &-tittle { + color: $text-color; + } +} + +.options { + -webkit-transition:all linear 0.5s; + transition:all linear 0.5s; +} + +.options.ng-hide { + opacity:0; +} + +.fixed-height-widget { + height: $widget-height; +} + +// charts +.donut-chart-title{ + text-align: center; +} + +.custom-tooltip { + font-size: $font-size-large; + color: $text-color; + text-align: center; +} + + +// OVERRIDES +// angular material overrides +md-radio-group { + border: none; +} + +md-icon { + height: auto; +} + +md-sidenav.md-locked-open.md-sidenav-left { + width: $left-sidenav-width; + min-width: $left-sidenav-width; + max-width: $left-sidenav-width; +} + +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 { + color: white; +} + +md-radio-button.md-accent.md-checked .md-label span { + color: $accent-color; +} + +.md-toolbar-tools h1 { + font-size: $font-size-large; +} + + +md-backdrop.md-sidenav-backdrop { + position: fixed; +} + +// libs overrides +.material-icons { + vertical-align: middle; +} + +.material-icons.md-18 { font-size: 18px; } +.material-icons.md-24 { font-size: 24px; } +.material-icons.md-36 { font-size: 36px; } +.material-icons.md-48 { font-size: 48px; } + +.nvd3.nv-pie .nv-pie-title { + fill: rgb(68, 68, 68); + font-weight: $font-weight-bold; + font-size: $font-size-large !important; +} + +.nvtooltip { + background-color: transparent; + border: none; + font-weight: $font-weight-bold; +} + +.orange .md-bar2 { + background-color: orange; +} + +.orange .md-container { + background-color: rgb(255, 236, 201) +} + + +/* Custom by Anurag */ + +//variables +$sidenav-mobile-width: 190px; + +md-sidenav { + width: $sidenav-mobile-width; +} + +.vertical { + padding-right: 5px; + border-right-style: groove; +} + +md-toolbar .md-menu { + margin: 0 !important; +} + +/*form validation*/ + +.help-block { + color: red; + font-size: 11px; +} + + + + + +/* Styles go here */ + +body { + font-family: 'Ubuntu', sans-serif; + color: orangered; +} + +.fill-height{ + display: flex; + flex: 1; + min-height: 100%; +} + +.fill-height > div{ + min-height: 100%; + display: flex; +} + +md-sidenav { + overflow: visible; + +} +.side-menu, .side-menu ul { + list-style: none; + padding: 0; + margin-top: 0; +} + +.side-menu .md-button.active { + color: rgb(30,136,229); +} + +.side-menu .menu-toggle-list a.md-button { + display: block; + padding: 0 16px 0 32px; + text-transform: none; + text-rendering: optimizeLegibility; + font-weight: 500; +} + +.side-menu .menu-toggle-list .md-button { + display: block; + padding: 0 16px 0 32px; + text-transform: none; +} + +.side-menu > li { + border-top: 1px solid rgba(0, 0, 0, 0.12); +} + +.md-button-toggle .md-toggle-icon.toggled { + transform: rotateZ(180deg); + -webkit-transform: rotateZ(180deg); +} + +.side-menu .md-button-toggle .md-toggle-icon { + background-size: 100% auto; + display: inline-block; + margin: auto 0 auto auto; + width: 15px; + color: darkgray; + transition: transform .3s ease-in-out; + -webkit-transition: -webkit-transform .3s ease-in-out; +} + +.menu-toggle-list.ng-hide { + max-height: 0; +} + +.side-menu .md-button { + border-radius: 0; + color: inherit; + cursor: pointer; + font-weight: 400; + line-height: 40px; + margin: 0; + max-height: 40px; + overflow: hidden; + padding: 0px 16px; + text-align: left; + text-decoration: none; + white-space: normal; + width: 100%; +} + +.menu-toggle-list { + background: #fff; + max-height: 1300px; + overflow: hidden; + position: relative; + z-index: 1; + -webkit-transition: 0.75s cubic-bezier(0.35, 0, 0.25, 1); + -webkit-transition-property: max-height; + -moz-transition: 0.75s cubic-bezier(0.35, 0, 0.25, 1); + -moz-transition-property: max-height; + transition: 0.75s cubic-bezier(0.35, 0, 0.25, 1); + transition-property: max-height; +} + + +.side-menu menu-toggle span{ + padding-top: 12px; + padding-bottom: 12px; +} + + + + + +.noShadow{ + box-shadow:none; +} +.borderNew{ + border-bottom:1px solid; + border-color:rgba(128, 128, 128, 0.25); +} +.noMargin{ + margin:0px; +} +.height25{ + height:25px; +} +.carrierBtn{ + width:300px; + height:200px; + background-color:#fff; + box-shadow:0px 0px 10px #666; + text-align:center; + line-height:200px; + font-size:30px; + float:left; + cursor:pointer; + -webkit-transition:0.2s; +} +.carrierBtn:first-child{ + margin-right:50px; +} +.carrierBtn:hover{ + background-color:rgb(30,136,229); + color:#fff; +} +.carrierBtnSelected{ + background-color:rgb(30,136,229); + color:#fff; +} +.myWrapper{ + min-height:500px; +} +.popWrapper{ + padding:20px; +} +.popTitle{ + color:#333; +} +.popContent{ + color:#333; + font-weight:normal; +} +.myBtnPrimary{ + box-shadow:0 2px 5px 0 rgba(0,0,0,.26); + color: rgba(255,255,255,0.87); + background-color: rgb(16,108,200); + float:left; +} +.myBtnPrimary:hover{ + box-shadow:0 2px 5px 0 rgba(0,0,0,.26); + color: rgba(255,255,255,0.87); + background-color: rgb(16,108,200) !important; + float:left; +} +.myBtnDefault{ + box-shadow:0 2px 5px 0 rgba(0,0,0,.26); + color:#333; +} +.cl{clear:both;} + +.widthstyle{ + width: 400px !important; + height:200px !important; + } +.panel-green { + border-color: #5cb85c; +} + +.panel-green .panel-heading { + border-color: #5cb85c; + color: #fff; + background-color: #5cb85c; +} + +.panel-green a { + color: #5cb85c; +} + +.panel-green a:hover { + color: #3d8b3d; +} + +.panel-red { + border-color: #d9534f; +} + +.panel-red .panel-heading { + border-color: #d9534f; + color: #fff; + background-color: #d9534f; +} + +.panel-red a { + color: #d9534f; +} + +.panel-red a:hover { + color: #b52b27; +} + +.panel-yellow { + border-color: #f0ad4e; +} + +.panel-yellow .panel-heading { + border-color: #f0ad4e; + color: #fff; + background-color: #f0ad4e; +} + +.panel-yellow a { + color: #f0ad4e; +} + +.panel-yellow a:hover { + color: #df8a13; +} + +.camelCase { + text-transform: none; +} + +background{ + z-index: 0; + position:absolute; + left:0px; + right:0px; + top:-21px; + bottom:0px; + background-size: cover; +} + +.panel-Content { + padding:0px +} + +.gridListdemoBasicUsage md-grid-list { + margin: 8px; } + +.gridListdemoBasicUsage .orangered { + background: #A66866; } + +.gridListdemoBasicUsage .green { + background: #337ab7; } + +.gridListdemoBasicUsage .yellow { + background: #f0ad4e; } + +.gridListdemoBasicUsage .blue { + background: #84ffff; } + +.gridListdemoBasicUsage .purple { + background: #b388ff; } + +.gridListdemoBasicUsage .red { + background: #ff8a80; } + +.gridListdemoBasicUsage md-grid-tile { + transition: all 400ms ease-out 50ms; } + +/* Custom css */ + +.gridContent{ + width:100%; + height:auto; + padding:10%; + color:#fff; +} +.fl{ + float:left; +} +.fr{ + float:right; +} +.cl{ + clear:both; +} + +.selectFont{ + font-size: 17px; +} + +.heading{ + color:#757575; + position:absolute; + z-index:9; + left:0; + right:0; + top:0; +} \ No newline at end of file diff --git a/src/app/stylesheets/_table.scss b/src/app/stylesheets/_table.scss new file mode 100644 index 0000000..58d9adb --- /dev/null +++ b/src/app/stylesheets/_table.scss @@ -0,0 +1,212 @@ +// This file based on http://codepen.io/zavoloklom/pen/IGkDz + +// VARIABLES +$table-header-font-weight: 400; +$table-header-font-color: #757575; + +$table-cell-padding: 1.2rem; + +$table-bg: #fff; +$table-bg-accent: #f5f5f5; +$table-bg-hover: rgba(0,0,0,.12); +$table-bg-active: $table-bg-hover; +$table-border-color: #e0e0e0; + + +// MIXINS +@mixin transition($transition-property, $transition-time, $method) { + -webkit-transition: $transition-property $transition-time $method; + -moz-transition: $transition-property $transition-time $method; + -ms-transition: $transition-property $transition-time $method; + -o-transition: $transition-property $transition-time $method; + transition: $transition-property $transition-time $method; +} + + +//TABLES +.table { + border-spacing: 0; + width: 100%; + max-width: 100%; + margin-bottom: 2rem; + background-color: $table-bg; + > thead, + > tbody, + > tfoot { + > tr { + @include transition(all, 0.3s, ease); + > th, + > td { + text-align: left; + padding: $table-cell-padding; + vertical-align: top; + border-top: 0; + @include transition(all, 0.3s, ease); + } + } + } + > thead > tr > th { + font-weight: $table-header-font-weight; + color: $table-header-font-color; + vertical-align: bottom; + border-bottom: 1px solid rgba(0,0,0,.12); + } + > caption + thead, + > colgroup + thead, + > thead:first-child { + > tr:first-child { + > th, + > td { + border-top: 0; + } + } + } + > tbody + tbody { + border-top: 1px solid rgba(0,0,0,.12); + } + + // Nesting + .table { + background-color: $table-bg; + } + + // Remove border + .no-border { + border: 0; + } +} + +// Bordered version +// +// Add horizontal borders between columns. +.table-bordered { + border: 0; + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + border: 0; + border-bottom: 1px solid $table-border-color; + } + } + } + > thead > tr { + > th, + > td { + border-bottom-width: 2px; + } + } +} + + +// Hover effect +// +.table-hover { + > tbody > tr:hover { + > td, + > th { + background-color: $table-bg-hover; + } + } +} + +// Responsive tables (vertical) +// +// Wrap your tables in `.table-responsive-vertical` and we'll make them mobile friendly +// by vertical table-cell display. Only applies <768px. Everything above that will display normally. +// For correct display you must add 'data-title' to each 'td' +.table-responsive-vertical { + + @media screen and (max-width: 768px) { + + // Tighten up spacing + > .table { + margin-bottom: 0; + background-color: transparent; + > thead, + > tfoot { + display: none; + } + + > tbody { + display: block; + + > tr { + display: block; + border: 1px solid $table-border-color; + border-radius: 2px; + margin-bottom: $table-cell-padding; + + > td { + background-color: $table-bg; + display: block; + vertical-align: middle; + text-align: right; + } + > td[data-title]:before { + content: attr(data-title); + float: left; + font-size: inherit; + font-weight: $table-header-font-weight; + color: $table-header-font-color; + padding-right: 10px; + } + } + } + } + + // Special overrides for shadows + &.shadow-z-1 { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + > .table > tbody > tr { + border: none; + } + } + + // Special overrides for the bordered tables + > .table-bordered { + border: 0; + + // Nuke the appropriate borders so that the parent can handle them + > tbody { + > tr { + > td { + border: 0; + border-bottom: 1px solid $table-border-color; + } + > td:last-child { + border-bottom: 0; + } + } + } + } + + // Special overrides for the striped tables + > .table-striped { + > tbody > tr > td, + > tbody > tr:nth-child(odd) { + background-color: $table-bg; + } + > tbody > tr > td:nth-child(odd) { + background-color: $table-bg-accent; + } + } + + // Special overrides for hover tables + > .table-hover { + > tbody { + > tr:hover > td, + > tr:hover { + background-color: $table-bg; + } + > tr > td:hover { + background-color: $table-bg-hover; + } + } + } + } +} diff --git a/src/assets/images/cart.png b/src/assets/images/cart.png new file mode 100644 index 0000000000000000000000000000000000000000..33f21feb4f206e71c5f89ff6293748919a388f22 GIT binary patch literal 273 zcmV+s0q*{ZP)F;1Vy^MAih9zug9=Rwo60lV;G+1RR^0>dUwMXiTKr>Z8Z + + + \ No newline at end of file diff --git a/src/assets/images/ic_clear_white_24px.svg b/src/assets/images/ic_clear_white_24px.svg new file mode 100644 index 0000000..5704800 --- /dev/null +++ b/src/assets/images/ic_clear_white_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_close_black_24px.svg b/src/assets/images/ic_close_black_24px.svg new file mode 100644 index 0000000..ec8d116 --- /dev/null +++ b/src/assets/images/ic_close_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_close_white_24px.svg b/src/assets/images/ic_close_white_24px.svg new file mode 100644 index 0000000..5704800 --- /dev/null +++ b/src/assets/images/ic_close_white_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_domain_black_24px.svg b/src/assets/images/ic_domain_black_24px.svg new file mode 100644 index 0000000..1f43cd5 --- /dev/null +++ b/src/assets/images/ic_domain_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_done_black_24px.svg b/src/assets/images/ic_done_black_24px.svg new file mode 100644 index 0000000..9bba7f8 --- /dev/null +++ b/src/assets/images/ic_done_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_email_black_24px.svg b/src/assets/images/ic_email_black_24px.svg new file mode 100644 index 0000000..855c7cc --- /dev/null +++ b/src/assets/images/ic_email_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_extension_black_24px.svg b/src/assets/images/ic_extension_black_24px.svg new file mode 100644 index 0000000..91b12d5 --- /dev/null +++ b/src/assets/images/ic_extension_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_functions_black_24px.svg b/src/assets/images/ic_functions_black_24px.svg new file mode 100644 index 0000000..acd915a --- /dev/null +++ b/src/assets/images/ic_functions_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_home_black_24px.svg b/src/assets/images/ic_home_black_24px.svg new file mode 100644 index 0000000..676d2d3 --- /dev/null +++ b/src/assets/images/ic_home_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_location_city_black_24px.svg b/src/assets/images/ic_location_city_black_24px.svg new file mode 100644 index 0000000..bd03326 --- /dev/null +++ b/src/assets/images/ic_location_city_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_open_in_new_black_24px.svg b/src/assets/images/ic_open_in_new_black_24px.svg new file mode 100644 index 0000000..ca89ba8 --- /dev/null +++ b/src/assets/images/ic_open_in_new_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_person_black_24px.svg b/src/assets/images/ic_person_black_24px.svg new file mode 100644 index 0000000..5fbd2b2 --- /dev/null +++ b/src/assets/images/ic_person_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_person_white_18px.svg b/src/assets/images/ic_person_white_18px.svg new file mode 100644 index 0000000..3a615e4 --- /dev/null +++ b/src/assets/images/ic_person_white_18px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_person_white_24px.svg b/src/assets/images/ic_person_white_24px.svg new file mode 100644 index 0000000..9d68e15 --- /dev/null +++ b/src/assets/images/ic_person_white_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_phone_black_24px.svg b/src/assets/images/ic_phone_black_24px.svg new file mode 100644 index 0000000..eca33f1 --- /dev/null +++ b/src/assets/images/ic_phone_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_phone_missed_black_24px.svg b/src/assets/images/ic_phone_missed_black_24px.svg new file mode 100644 index 0000000..8256a7f --- /dev/null +++ b/src/assets/images/ic_phone_missed_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_pin_drop_black_24px.svg b/src/assets/images/ic_pin_drop_black_24px.svg new file mode 100644 index 0000000..5388073 --- /dev/null +++ b/src/assets/images/ic_pin_drop_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_public_black_24px.svg b/src/assets/images/ic_public_black_24px.svg new file mode 100644 index 0000000..d07df45 --- /dev/null +++ b/src/assets/images/ic_public_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_remove_red_eye_black_24px.svg b/src/assets/images/ic_remove_red_eye_black_24px.svg new file mode 100644 index 0000000..2e21adb --- /dev/null +++ b/src/assets/images/ic_remove_red_eye_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_room_black_24px.svg b/src/assets/images/ic_room_black_24px.svg new file mode 100644 index 0000000..d7844b2 --- /dev/null +++ b/src/assets/images/ic_room_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/images/ic_transfer_within_a_station_black_18px.svg b/src/assets/images/ic_transfer_within_a_station_black_18px.svg new file mode 100644 index 0000000..23b0235 --- /dev/null +++ b/src/assets/images/ic_transfer_within_a_station_black_18px.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/ic_trending_flat_white_24px.svg b/src/assets/images/ic_trending_flat_white_24px.svg new file mode 100644 index 0000000..218dc82 --- /dev/null +++ b/src/assets/images/ic_trending_flat_white_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/favicon.ico b/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6527905307f19ba00762f9241f7eb535fa84a2f9 GIT binary patch literal 4286 zcmchaPe@cz6vpqQW1y54B@{_hhFD-kWPgyXjSGVaf);_51TESOlSPOdvy}@W5Q+** zs6~RrtlR}7(V|sCkP&1f7!5{Hixw@4+x@+HXSm*Z^WGalm2d8S=brO@=iGm9MyZ7P zPo)%}YN|=8W~EfSfibDm2H3qnGq$y%h@zqVv#zn@@WvhIGJ8*ECePe@roq(*vwGys z4?Q;bI~MRIM&jXu6Yg@wqQ#8&8x#z55E}ONd3<&rw_h!5AbBx{CcZ%&z736jHxFa0 zsBLqly3+dQ%MZGH{QU}GW6bsq=@$a@sXtac^<8>8uP>*+d!Qdtv&&mnKlvE_T-+SC z*QNCVwcvq%+&DDc+T}Uf(2_FavDN{-&hCpIs?aW=A$mcrzyD+9(025i1~K&uVf&w4 zItQLK9T{7k?s@bnU*&p+<^UI*aHA1aH+Fo^PAzM|xjNK09?2V(Cme7IFB(BP?7#at z(>DB3w`AUFS~=(LUBdZ>v-SG4J~%Mrfj&05Z)oj13l5tbEq4x>8+;FC0Dvr zbJY#7PS$+yE_Cf7gxqQEC@RoZX5J^}71l+`Q~qnOF4D za`lhjUuqZa-sj)EHDleV2i|mc!Ly-@7IwzPM{?pBUt(+@IHi8HTz#Iq9)9h|hrL3) zfOT#@|5$JCxmRjsOj>&kUt(m8*57|W(FoE`CX*8edYv%j=3sR5>!hvglJ#@8K6j$g z&IuUbRC_{)p}sbyx%UD6Fki;t6nDk0gT5&6Q_at7FbVVOu?4VK{oR#!kyYbCc;<4+LITzoZ8-~O5L+9MiLHL4NyME>! z;Ky7<)UR!gN_~GXhMvPMHNB;EmmIK}eHD&~cRx89jth}IM#tU%ablw0|GxfE9IjRR zl-)b-IvC#UD!IewzPL77SI>R+?}<2ERr|R2o~zCC8rJUR8>DI5*0O$6+k~wZ)Mt;b z(Hul-OFl+F))}lK&&Yi*+S2kJmHDbdBWOQnaSA6S|#* + + + + Startup Jalsa + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file