From 56b30d8d277b124e5b4667bd44f7924ce264f983 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Tue, 28 Mar 2017 20:09:06 -0700 Subject: [PATCH 01/36] structure complete --- lab-regan/.babelrc | 3 + lab-regan/.eslintrc | 24 ++++ lab-regan/.gitignore | 132 ++++++++++++++++++ lab-regan/app/component/login/_login.scss | 0 lab-regan/app/component/login/login.html | 0 lab-regan/app/component/login/login.js | 0 lab-regan/app/component/signup/_signup.scss | 0 lab-regan/app/component/signup/signup.html | 0 lab-regan/app/component/signup/signup.js | 0 lab-regan/app/config/router-config.js | 0 lab-regan/app/entry.js | 0 lab-regan/app/index.html | 0 lab-regan/app/scss/lib/base/_base.scss | 0 lab-regan/app/scss/lib/base/_reset.scss | 0 lab-regan/app/scss/lib/layout/_footer.scss | 0 lab-regan/app/scss/lib/layout/_header.scss | 0 lab-regan/app/scss/lib/layout/_main.scss | 0 lab-regan/app/scss/lib/theme/_vars.scss | 0 lab-regan/app/scss/main.scss | 0 lab-regan/app/service/auth-service.js | 0 lab-regan/app/view/home/_home.scss | 0 lab-regan/app/view/home/home-controller.js | 0 lab-regan/app/view/home/home.html | 0 lab-regan/app/view/landing/_landing.scss | 0 .../app/view/landing/landing-controller.js | 0 lab-regan/app/view/landing/landing.html | 0 lab-regan/assets/cfLogo.png | Bin 0 -> 6821 bytes lab-regan/package.json | 38 +++++ lab-regan/webpack.config.js | 42 ++++++ 29 files changed, 239 insertions(+) create mode 100644 lab-regan/.babelrc create mode 100644 lab-regan/.eslintrc create mode 100644 lab-regan/.gitignore create mode 100644 lab-regan/app/component/login/_login.scss create mode 100644 lab-regan/app/component/login/login.html create mode 100644 lab-regan/app/component/login/login.js create mode 100644 lab-regan/app/component/signup/_signup.scss create mode 100644 lab-regan/app/component/signup/signup.html create mode 100644 lab-regan/app/component/signup/signup.js create mode 100644 lab-regan/app/config/router-config.js create mode 100644 lab-regan/app/entry.js create mode 100644 lab-regan/app/index.html create mode 100644 lab-regan/app/scss/lib/base/_base.scss create mode 100644 lab-regan/app/scss/lib/base/_reset.scss create mode 100644 lab-regan/app/scss/lib/layout/_footer.scss create mode 100644 lab-regan/app/scss/lib/layout/_header.scss create mode 100644 lab-regan/app/scss/lib/layout/_main.scss create mode 100644 lab-regan/app/scss/lib/theme/_vars.scss create mode 100644 lab-regan/app/scss/main.scss create mode 100644 lab-regan/app/service/auth-service.js create mode 100644 lab-regan/app/view/home/_home.scss create mode 100644 lab-regan/app/view/home/home-controller.js create mode 100644 lab-regan/app/view/home/home.html create mode 100644 lab-regan/app/view/landing/_landing.scss create mode 100644 lab-regan/app/view/landing/landing-controller.js create mode 100644 lab-regan/app/view/landing/landing.html create mode 100644 lab-regan/assets/cfLogo.png create mode 100644 lab-regan/package.json create mode 100644 lab-regan/webpack.config.js diff --git a/lab-regan/.babelrc b/lab-regan/.babelrc new file mode 100644 index 00000000..c13c5f62 --- /dev/null +++ b/lab-regan/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["es2015"] +} diff --git a/lab-regan/.eslintrc b/lab-regan/.eslintrc new file mode 100644 index 00000000..633c96de --- /dev/null +++ b/lab-regan/.eslintrc @@ -0,0 +1,24 @@ +{ + "rules": { + "no-console": "off", + "indent": [ "error", 2 ], + "quotes": [ "error", "single" ], + "semi": ["error", "always"], + "linebreak-style": [ "error", "unix" ] + }, + "env": { + "es6": true, + "node": true, + +Error: Parse error on line 11: +... "node": true, }, "ecmaFeatures": +----------------------^ +Expecting 'STRING' +}, + "ecmaFeatures": { + "modules": true, + "experimentalObjectRestSpread": true, + "impliedStrict": true + }, + "extends": "eslint:recommended" +} diff --git a/lab-regan/.gitignore b/lab-regan/.gitignore new file mode 100644 index 00000000..d6f86b4e --- /dev/null +++ b/lab-regan/.gitignore @@ -0,0 +1,132 @@ + +# Created by https://www.gitignore.io/api/osx,node,linux,windows + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +###Local Files### +build + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + + +### OSX ### +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.gitignore.io/api/osx,node,linux,windows diff --git a/lab-regan/app/component/login/_login.scss b/lab-regan/app/component/login/_login.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/component/login/login.html b/lab-regan/app/component/login/login.html new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/component/login/login.js b/lab-regan/app/component/login/login.js new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/component/signup/_signup.scss b/lab-regan/app/component/signup/_signup.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/component/signup/signup.html b/lab-regan/app/component/signup/signup.html new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/component/signup/signup.js b/lab-regan/app/component/signup/signup.js new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/config/router-config.js b/lab-regan/app/config/router-config.js new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/entry.js b/lab-regan/app/entry.js new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/index.html b/lab-regan/app/index.html new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/scss/lib/base/_base.scss b/lab-regan/app/scss/lib/base/_base.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/scss/lib/base/_reset.scss b/lab-regan/app/scss/lib/base/_reset.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/scss/lib/layout/_footer.scss b/lab-regan/app/scss/lib/layout/_footer.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/scss/lib/layout/_header.scss b/lab-regan/app/scss/lib/layout/_header.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/scss/lib/layout/_main.scss b/lab-regan/app/scss/lib/layout/_main.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/scss/lib/theme/_vars.scss b/lab-regan/app/scss/lib/theme/_vars.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/scss/main.scss b/lab-regan/app/scss/main.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/service/auth-service.js b/lab-regan/app/service/auth-service.js new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/view/home/_home.scss b/lab-regan/app/view/home/_home.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/view/home/home-controller.js b/lab-regan/app/view/home/home-controller.js new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/view/home/home.html b/lab-regan/app/view/home/home.html new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/view/landing/_landing.scss b/lab-regan/app/view/landing/_landing.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/view/landing/landing-controller.js b/lab-regan/app/view/landing/landing-controller.js new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/view/landing/landing.html b/lab-regan/app/view/landing/landing.html new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/assets/cfLogo.png b/lab-regan/assets/cfLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..38a23b2d1d0dc6944768b2f98fae55197b0155b7 GIT binary patch literal 6821 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 literal 0 HcmV?d00001 diff --git a/lab-regan/package.json b/lab-regan/package.json new file mode 100644 index 00000000..b08d161f --- /dev/null +++ b/lab-regan/package.json @@ -0,0 +1,38 @@ +{ + "name": "lab-regan", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "angular": "^1.6.3", + "angular-ui-router": "^0.4.2", + "babel-core": "^6.24.0", + "babel-loader": "^6.4.1", + "babel-preset-es2015": "^6.24.0", + "camelcase": "^4.0.0", + "clean-webpack-plugin": "^0.1.16", + "css-loader": "^0.27.3", + "dotenv": "^4.0.0", + "extract-text-webpack-plugin": "^2.1.0", + "file-loader": "^0.10.1", + "html-loader": "^0.4.5", + "html-webpack-plugin": "^2.28.0", + "node-sass": "^4.5.1", + "pascalcase": "^0.1.1", + "resolve-url-loader": "^2.0.2", + "sass-loader": "^6.0.3", + "style-loader": "^0.16.1", + "ui-router": "^1.0.0-alpha.3", + "url-loader": "^0.5.8", + "webpack": "^2.3.2" + }, + "devDependencies": { + "webpack-dev-server": "^2.4.2" + } +} diff --git a/lab-regan/webpack.config.js b/lab-regan/webpack.config.js new file mode 100644 index 00000000..5125b9f7 --- /dev/null +++ b/lab-regan/webpack.config.js @@ -0,0 +1,42 @@ +'use strict'; + +require('dotenv').load(); + +const webpack = require('webpack'); +const HTMLPlugin = require('html-webpack-plugin'); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); + +module.exports = { + devtool: 'eval', + entry: `${__dirname}/app/entry.js`, + output: { + filename: 'bundle.js', + path: `${__dirname}/build` + }, + plugins: [ + new HTMLPlugin({ + template: `${__dirname}/app/index.html` + }), + new ExtractTextPlugin('bundle.css'), + new webpack.DefinePlugin({ + __API_URL__: JSON.stringify(process.env.API_URL) + }) + ], + module: { + rules: [ + { + test: /\.js$/, + exclude: /node_modules/, + loader: 'babel-loader' + }, + { + test: /\.html$/, + loader: 'html-loader' + }, + { + test: /\.scss$/, + loader: ExtractTextPlugin.extract(['css-loader', 'sass-loader']) + } + ] + } +}; From 7ed28983c776aa80cfa1b4b231a2cf24f9077115 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Tue, 28 Mar 2017 21:18:32 -0700 Subject: [PATCH 02/36] webpack hates svg --- lab-regan/app/assets/cfLogo.svg | 16 ++++ lab-regan/app/component/login/login.html | 31 ++++++ lab-regan/app/component/login/login.js | 27 ++++++ lab-regan/app/component/signup/signup.html | 25 +++++ lab-regan/app/component/signup/signup.js | 25 +++++ lab-regan/app/config/router-config.js | 31 ++++++ lab-regan/app/entry.js | 39 ++++++++ lab-regan/app/index.html | 22 +++++ lab-regan/app/scss/lib/base/_reset.scss | 48 ++++++++++ lab-regan/app/scss/lib/layout/_footer.scss | 7 ++ lab-regan/app/scss/lib/layout/_header.scss | 18 ++++ lab-regan/app/scss/lib/layout/_main.scss | 4 + lab-regan/app/scss/lib/theme/_vars.scss | 6 ++ lab-regan/app/scss/main.scss | 10 ++ lab-regan/app/service/auth-service.js | 88 ++++++++++++++++++ lab-regan/app/view/home/home-controller.js | 9 ++ lab-regan/app/view/home/home.html | 3 + .../app/view/landing/landing-controller.js | 10 ++ lab-regan/app/view/landing/landing.html | 25 +++++ lab-regan/assets/cfLogo.png | Bin 6821 -> 0 bytes lab-regan/assets/cfLogo.svg | 16 ++++ lab-regan/package.json | 6 +- lab-regan/webpack.config.js | 4 + 23 files changed, 469 insertions(+), 1 deletion(-) create mode 100644 lab-regan/app/assets/cfLogo.svg delete mode 100644 lab-regan/assets/cfLogo.png create mode 100644 lab-regan/assets/cfLogo.svg diff --git a/lab-regan/app/assets/cfLogo.svg b/lab-regan/app/assets/cfLogo.svg new file mode 100644 index 00000000..1108a137 --- /dev/null +++ b/lab-regan/app/assets/cfLogo.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/lab-regan/app/component/login/login.html b/lab-regan/app/component/login/login.html index e69de29b..8addd906 100644 --- a/lab-regan/app/component/login/login.html +++ b/lab-regan/app/component/login/login.html @@ -0,0 +1,31 @@ + diff --git a/lab-regan/app/component/login/login.js b/lab-regan/app/component/login/login.js index e69de29b..dec7c927 100644 --- a/lab-regan/app/component/login/login.js +++ b/lab-regan/app/component/login/login.js @@ -0,0 +1,27 @@ +'use strict'; + +require('./_login.scss'); + +module.exports = { + template: require('./login.html'), + controller: ['$log', '$location', 'authService', LoginController], + controllerAs: 'loginCtrl' +}; + +function LoginController($log, $location, authService) { + $log.debug('LoginController'); + + authService.getToken() + .then( () => { + $location.url('/home'); + }); + + this.login = function() { + $log.debug('loginCtrl.login'); + + authService.login(this.user) + .then( () => { + $location.url('/home'); + }); + }; +}; diff --git a/lab-regan/app/component/signup/signup.html b/lab-regan/app/component/signup/signup.html index e69de29b..44bc8764 100644 --- a/lab-regan/app/component/signup/signup.html +++ b/lab-regan/app/component/signup/signup.html @@ -0,0 +1,25 @@ + diff --git a/lab-regan/app/component/signup/signup.js b/lab-regan/app/component/signup/signup.js index e69de29b..b5923714 100644 --- a/lab-regan/app/component/signup/signup.js +++ b/lab-regan/app/component/signup/signup.js @@ -0,0 +1,25 @@ +'use strict'; + +module.exports = { + template: require('./signup.html'), + controller: ['$log', '$location', 'authService', SignupController], + controllerAs: 'signupCtrl' +}; + +function SignupController($log, $location, authService) { + $log.debug('SignupController'); + + authService.getToken() + .then( () => { + $location.url('/home'); + }); + + this.signup = function(user) { + $log.debug('signupCtrl.signup'); + + authService.signup(user) + .then( () => { + $location.url('/home') + }); + }; +}; diff --git a/lab-regan/app/config/router-config.js b/lab-regan/app/config/router-config.js index e69de29b..5357c24b 100644 --- a/lab-regan/app/config/router-config.js +++ b/lab-regan/app/config/router-config.js @@ -0,0 +1,31 @@ +'use strict'; + +module.exports = ['$stateProvider', '$urlRouterProvider', routerConfig]; + +function routerConfig($stateProvider, $urlRouterProvider) { + $urlRouterProvider.when('', '/join#signup'); + $urlRouterProvider.when('/', '/join#signup'); + $urlRouterProvider.when('/signup', '/join#signup'); + $urlRouterProvider.when('/login', '/join#login'); + + let states = [ + { + name: 'home', + url: '/home', + template: require('../view/home/home.html'), + controller: 'HomeController', + controllerAs: 'homeCtrl' + }, + { + name: 'landing', + url: '/join', + template: require('../view/landing/landing.html'), + controller: 'LandingController', + controllerAs: 'landingCtrl' + } + ]; + + states.forEach( state => { + $stateProvider.state(state); + }); +}; diff --git a/lab-regan/app/entry.js b/lab-regan/app/entry.js index e69de29b..358681e9 100644 --- a/lab-regan/app/entry.js +++ b/lab-regan/app/entry.js @@ -0,0 +1,39 @@ +'use strict'; + +require('./scss/main.scss'); + +const path = require('path'); +const angular = require('angular'); +const camelcase = require('camelcase'); +const pascalcase = require('pascalcase'); +const uiRouter = require('angular-ui-router'); +const ngTouch = require('angular-touch'); +const ngAnimate = require('angular-animate'); + +const cfgram = angular.module('cfgram', [ngTouch, ngAnimate, uiRouter]); + +let context = require.context('./config/', true, /\.js$/); +context.keys().forEach( key => { + cfgram.config(context(key)); +}); + +context = require.context('./view/', true, /\.js$/); +context.keys().forEach( key => { + let name = pascalcase(path.basename(key, '.js')); + let module = context(key); + cfgram.controller(name, module); +}); + +context = require.context('./service/', true, /\.js$/); +context.keys().forEach( key => { + let name = camelcase(path.basename(key, '.js')); + let module = context(key); + cfgram.service(name, module); +}); + +context = require.context('./component/', true, /\.js$/); +context.keys().forEach( key => { + let name = camelcase(path.basename(key, '.js')); + let module = context(key); + cfgram.component(name, module); +}); diff --git a/lab-regan/app/index.html b/lab-regan/app/index.html index e69de29b..97e92e56 100644 --- a/lab-regan/app/index.html +++ b/lab-regan/app/index.html @@ -0,0 +1,22 @@ + + + + + + cfgram + + +
+
    +
  • + +
  • +
  • +

    cf gram

    +
  • +
+
+ +
+ + diff --git a/lab-regan/app/scss/lib/base/_reset.scss b/lab-regan/app/scss/lib/base/_reset.scss index e69de29b..ed11813c 100644 --- a/lab-regan/app/scss/lib/base/_reset.scss +++ b/lab-regan/app/scss/lib/base/_reset.scss @@ -0,0 +1,48 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/lab-regan/app/scss/lib/layout/_footer.scss b/lab-regan/app/scss/lib/layout/_footer.scss index e69de29b..a4d8c569 100644 --- a/lab-regan/app/scss/lib/layout/_footer.scss +++ b/lab-regan/app/scss/lib/layout/_footer.scss @@ -0,0 +1,7 @@ +@import "../theme/vars"; + footer { + position: fixed; + height: 6em; + width: 100%; + background: $site-primary; + } diff --git a/lab-regan/app/scss/lib/layout/_header.scss b/lab-regan/app/scss/lib/layout/_header.scss index e69de29b..d3fa09d1 100644 --- a/lab-regan/app/scss/lib/layout/_header.scss +++ b/lab-regan/app/scss/lib/layout/_header.scss @@ -0,0 +1,18 @@ +@import "../theme/vars"; + +header { + width: 100%; + height: 4em; + background: $site-primary; + img{ + width: 3em; + height: 3em; + outline: red dotted 2px; + } + ul { + li { + display: inline-block; + border: 1px yellow solid; + } + } +} diff --git a/lab-regan/app/scss/lib/layout/_main.scss b/lab-regan/app/scss/lib/layout/_main.scss index e69de29b..8f0980bb 100644 --- a/lab-regan/app/scss/lib/layout/_main.scss +++ b/lab-regan/app/scss/lib/layout/_main.scss @@ -0,0 +1,4 @@ +@import "../theme/vars"; +main { + min-height: 14em; +} diff --git a/lab-regan/app/scss/lib/theme/_vars.scss b/lab-regan/app/scss/lib/theme/_vars.scss index e69de29b..0db04823 100644 --- a/lab-regan/app/scss/lib/theme/_vars.scss +++ b/lab-regan/app/scss/lib/theme/_vars.scss @@ -0,0 +1,6 @@ +$site-primary: #444; +$site-secondary: #888; +$black: #000; +$white: #fff; +$grey: #ccc; +$gutter: 1vw; diff --git a/lab-regan/app/scss/main.scss b/lab-regan/app/scss/main.scss index e69de29b..69b937ae 100644 --- a/lab-regan/app/scss/main.scss +++ b/lab-regan/app/scss/main.scss @@ -0,0 +1,10 @@ +// base +@import "lib/base/reset"; +@import "lib/base/base"; +// layout +@import "lib/layout/header"; +@import "lib/layout/footer"; +@import "lib/layout/main"; +// components +@import "../component/login/login"; +@import "../component/signup/signup"; diff --git a/lab-regan/app/service/auth-service.js b/lab-regan/app/service/auth-service.js index e69de29b..41fe4c15 100644 --- a/lab-regan/app/service/auth-service.js +++ b/lab-regan/app/service/auth-service.js @@ -0,0 +1,88 @@ +'use strict'; + +module.exports = ['$q', '$log', '$http', '$window', authService]; + +function authService($q, $log, $http, $window) { + $log.debug('authService'); + + let service = {}; + let token = null; + + function setToken(_token) { + $log.debug('authService.setToken'); + + if (! _token) { + return $q.reject(new Error('no token')); + }; + + $window.localStorage.setItem('token', _token); + token = _token; + return $q.resolve(token); + } + + service.getToken = function() { + $log.debug('authService.getToken'); + if (token) { + return $q.resolve(token); + }; + + token = $window.localStorage.getItem('token'); + if (token) return $q.resolve(token); + return $q.reject(new Error('token not found')); + }; + + service.signup = function(user) { + $log.debug('authService.signup'); + + let url = `${__API_URL__}/api/signup`; + let config = { + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + } + }; + + return $http.post(url, user, config) + .then( res => { + $log.log('success:', res.data); + return setToken(res.data); + }) + .catch( err => { + $log.error('failure:', err.message); + return $q.reject(err); + }); + }; + + service.logout = function() { + $log.debug('authService.logout'); + + $window.localStorage.removeItem('token'); + token = null; + return $q.resolve(); + }; + + service.login = function(user) { + $log.debug('authService.login'); + + let url = `${__API_URL__}/api/login`; + let base64 = $window.btoa(`${user.username}:${user.password}`); + let config = { + headers: { + Accept: 'application/json', + Authorization: `Basic ${base64}` + } + }; + + return $http.get(url, config) + .then( res => { + $log.log('success', res.data); + return setToken(res.data); + }) + .catch( err => { + $log.error(err.message); + return $q.reject(err); + }); + }; + + return service; +}; diff --git a/lab-regan/app/view/home/home-controller.js b/lab-regan/app/view/home/home-controller.js index e69de29b..7f48d88b 100644 --- a/lab-regan/app/view/home/home-controller.js +++ b/lab-regan/app/view/home/home-controller.js @@ -0,0 +1,9 @@ +'use strict'; + +require('./_home.scss'); + +module.exports = ['$log', HomeController]; + +function HomeController($log) { + $log.debug('HomeController'); +}; diff --git a/lab-regan/app/view/home/home.html b/lab-regan/app/view/home/home.html index e69de29b..eeeb0858 100644 --- a/lab-regan/app/view/home/home.html +++ b/lab-regan/app/view/home/home.html @@ -0,0 +1,3 @@ +
+

welcome home!

+
diff --git a/lab-regan/app/view/landing/landing-controller.js b/lab-regan/app/view/landing/landing-controller.js index e69de29b..783dfec3 100644 --- a/lab-regan/app/view/landing/landing-controller.js +++ b/lab-regan/app/view/landing/landing-controller.js @@ -0,0 +1,10 @@ +'use strict'; + +require('./_landing.scss'); + +module.exports = ['$log', '$location', '$rootScope', 'authService', LandingController]; + +function LandingController($log, $location, authService) { + let url = $location.url(); + this.showSignup = url === '/join#signup' || url === '/join'; +}; diff --git a/lab-regan/app/view/landing/landing.html b/lab-regan/app/view/landing/landing.html index e69de29b..efa4547a 100644 --- a/lab-regan/app/view/landing/landing.html +++ b/lab-regan/app/view/landing/landing.html @@ -0,0 +1,25 @@ +
+
+
+ +

already a member?

+ + sign in here. + +
+
+ +
+
+ +

want to sign up?

+ + sign up here. + +
+
+
diff --git a/lab-regan/assets/cfLogo.png b/lab-regan/assets/cfLogo.png deleted file mode 100644 index 38a23b2d1d0dc6944768b2f98fae55197b0155b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6821 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 diff --git a/lab-regan/assets/cfLogo.svg b/lab-regan/assets/cfLogo.svg new file mode 100644 index 00000000..1108a137 --- /dev/null +++ b/lab-regan/assets/cfLogo.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/lab-regan/package.json b/lab-regan/package.json index b08d161f..e3f9721f 100644 --- a/lab-regan/package.json +++ b/lab-regan/package.json @@ -4,13 +4,16 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "build": "./node_modules/webpack/bin/webpack.js", + "watch": "./node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "angular": "^1.6.3", + "angular-animate": "^1.6.3", + "angular-touch": "^1.6.3", "angular-ui-router": "^0.4.2", "babel-core": "^6.24.0", "babel-loader": "^6.4.1", @@ -28,6 +31,7 @@ "resolve-url-loader": "^2.0.2", "sass-loader": "^6.0.3", "style-loader": "^0.16.1", + "svg-loader": "0.0.2", "ui-router": "^1.0.0-alpha.3", "url-loader": "^0.5.8", "webpack": "^2.3.2" diff --git a/lab-regan/webpack.config.js b/lab-regan/webpack.config.js index 5125b9f7..bf11764c 100644 --- a/lab-regan/webpack.config.js +++ b/lab-regan/webpack.config.js @@ -36,6 +36,10 @@ module.exports = { { test: /\.scss$/, loader: ExtractTextPlugin.extract(['css-loader', 'sass-loader']) + }, + { + test: /\.svg$/, + loader: 'svg-loader' } ] } From c85e205a128c541ec7f39f90c856f5d484bb818b Mon Sep 17 00:00:00 2001 From: reganoneill Date: Tue, 28 Mar 2017 22:19:47 -0700 Subject: [PATCH 03/36] layout complete --- lab-regan/app/component/signup/_signup.scss | 15 +++++++++++++++ lab-regan/app/component/signup/signup.html | 3 ++- lab-regan/app/scss/lib/base/_base.scss | 17 +++++++++++++++++ lab-regan/app/scss/lib/layout/_footer.scss | 3 ++- lab-regan/app/scss/lib/layout/_main.scss | 18 +++++++++++++++++- lab-regan/app/view/landing/landing.html | 5 ++--- 6 files changed, 55 insertions(+), 6 deletions(-) diff --git a/lab-regan/app/component/signup/_signup.scss b/lab-regan/app/component/signup/_signup.scss index e69de29b..f87c3c8d 100644 --- a/lab-regan/app/component/signup/_signup.scss +++ b/lab-regan/app/component/signup/_signup.scss @@ -0,0 +1,15 @@ +h3 { + margin-left: 10%; + margin-bottom: 1.5%; +} +p { + width: 23%; + margin-left: 80%; +} + +.signup { + div { + width: 80%; + margin: auto; + } +} diff --git a/lab-regan/app/component/signup/signup.html b/lab-regan/app/component/signup/signup.html index 44bc8764..f08172c9 100644 --- a/lab-regan/app/component/signup/signup.html +++ b/lab-regan/app/component/signup/signup.html @@ -2,7 +2,7 @@ +

already a member?sign in here

diff --git a/lab-regan/app/scss/lib/base/_base.scss b/lab-regan/app/scss/lib/base/_base.scss index e69de29b..5b3a9147 100644 --- a/lab-regan/app/scss/lib/base/_base.scss +++ b/lab-regan/app/scss/lib/base/_base.scss @@ -0,0 +1,17 @@ +@import "../theme/vars"; + +*{ + box-sizing: border-box; +} + +button { + padding: 3em; + width: 20%; + margin-right: 10em; + background: $site-primary; + color: $black; +} + +body { + background: $site-secondary; +} diff --git a/lab-regan/app/scss/lib/layout/_footer.scss b/lab-regan/app/scss/lib/layout/_footer.scss index a4d8c569..7ecd0721 100644 --- a/lab-regan/app/scss/lib/layout/_footer.scss +++ b/lab-regan/app/scss/lib/layout/_footer.scss @@ -1,7 +1,8 @@ @import "../theme/vars"; footer { position: fixed; + bottom: 0; height: 6em; width: 100%; - background: $site-primary; + background: $grey; } diff --git a/lab-regan/app/scss/lib/layout/_main.scss b/lab-regan/app/scss/lib/layout/_main.scss index 8f0980bb..7d460d99 100644 --- a/lab-regan/app/scss/lib/layout/_main.scss +++ b/lab-regan/app/scss/lib/layout/_main.scss @@ -1,4 +1,20 @@ @import "../theme/vars"; -main { + +section { min-height: 14em; + form { + width: 100%; + padding-top: 2.5em; + input { + display: block; + width: 80%; + height: 4em; + margin: auto; + margin-bottom: 3em; + &:last-child{ + width: 20%; + margin-right: 10%; + } + } + } } diff --git a/lab-regan/app/view/landing/landing.html b/lab-regan/app/view/landing/landing.html index efa4547a..f88894d9 100644 --- a/lab-regan/app/view/landing/landing.html +++ b/lab-regan/app/view/landing/landing.html @@ -3,10 +3,9 @@ ng-if="landingCtrl.showSignup">
-

already a member?

- sign in here. +
@@ -18,7 +17,7 @@

want to sign up?

- sign up here. + From 08728bfe42a0dd9b05fb04fbc801473eff76f82f Mon Sep 17 00:00:00 2001 From: reganoneill Date: Tue, 28 Mar 2017 23:28:09 -0700 Subject: [PATCH 04/36] submitlab --- lab-regan/app/assets/cfLogo.png | Bin 0 -> 6821 bytes lab-regan/app/index.html | 2 +- lab-regan/app/scss/lib/layout/_header.scss | 15 +++++++++++++-- lab-regan/package.json | 1 + lab-regan/webpack.config.js | 4 ++++ 5 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 lab-regan/app/assets/cfLogo.png diff --git a/lab-regan/app/assets/cfLogo.png b/lab-regan/app/assets/cfLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..38a23b2d1d0dc6944768b2f98fae55197b0155b7 GIT binary patch literal 6821 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 literal 0 HcmV?d00001 diff --git a/lab-regan/app/index.html b/lab-regan/app/index.html index 97e92e56..58465b95 100644 --- a/lab-regan/app/index.html +++ b/lab-regan/app/index.html @@ -9,7 +9,7 @@
  • - +
  • cf gram

    diff --git a/lab-regan/app/scss/lib/layout/_header.scss b/lab-regan/app/scss/lib/layout/_header.scss index d3fa09d1..f5bb2054 100644 --- a/lab-regan/app/scss/lib/layout/_header.scss +++ b/lab-regan/app/scss/lib/layout/_header.scss @@ -7,12 +7,23 @@ header { img{ width: 3em; height: 3em; - outline: red dotted 2px; + margin: auto; } ul { + height: 100%; + width: 80%; + margin: auto; li { + float: left; + height: 100%; display: inline-block; - border: 1px yellow solid; + padding: auto 0; + &:first-child { + padding-top: 0.5em; + } + &:last-child { + padding: 1.5em; + } } } } diff --git a/lab-regan/package.json b/lab-regan/package.json index e3f9721f..126a939d 100644 --- a/lab-regan/package.json +++ b/lab-regan/package.json @@ -26,6 +26,7 @@ "file-loader": "^0.10.1", "html-loader": "^0.4.5", "html-webpack-plugin": "^2.28.0", + "image-webpack-loader": "^3.3.0", "node-sass": "^4.5.1", "pascalcase": "^0.1.1", "resolve-url-loader": "^2.0.2", diff --git a/lab-regan/webpack.config.js b/lab-regan/webpack.config.js index bf11764c..c170af20 100644 --- a/lab-regan/webpack.config.js +++ b/lab-regan/webpack.config.js @@ -40,6 +40,10 @@ module.exports = { { test: /\.svg$/, loader: 'svg-loader' + }, + { + test: /\.png$/, + loader: 'image-webpack-loader' } ] } From b53441d9e1ae9df0b6f5876e5d3c841015615f13 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Wed, 29 Mar 2017 13:01:30 -0700 Subject: [PATCH 05/36] log config and gallery service built --- lab-regan/app/config/log-config.js | 7 +++ lab-regan/app/service/gallery-service.js | 64 ++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 lab-regan/app/config/log-config.js create mode 100644 lab-regan/app/service/gallery-service.js diff --git a/lab-regan/app/config/log-config.js b/lab-regan/app/config/log-config.js new file mode 100644 index 00000000..683171b9 --- /dev/null +++ b/lab-regan/app/config/log-config.js @@ -0,0 +1,7 @@ +'use strict'; + +module.exports = ['$logProvider', logConfig]; + +function logConfig($logProvider){ + $logProvider.debugEnabled(__DEBUG__); +} diff --git a/lab-regan/app/service/gallery-service.js b/lab-regan/app/service/gallery-service.js new file mode 100644 index 00000000..d76a161b --- /dev/null +++ b/lab-regan/app/service/gallery-service.js @@ -0,0 +1,64 @@ +'use strict'; + +module.exports = ['$q', '$log', '$http', 'authService', galleryService]; + +function galleryService($q, $log, $http, authService){ + $log.debug('galleryService'); + + let service = {}; + service.galleries = []; + + service.createGallery = function(gallery){ + $log.debug('galleryService.createGallery'); + + return authService.getToken() + .then( token => { + let url = `${__API_URL__}/api/gallery`; + let config = { + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + } + }; + return $http.post(url, gallery, config); + }) + .then( res => { + $log.log('gallery created'); + let gallery = res.data; + service.galleries.unshift(gallery); + return gallery; + }) + .catch(err => { + $log.error(err.message); + return $q.reject(err); + }); + }; + + service.fetchGalleries = function(){ + $log.debug('galleryService.fetchGalleries'); + + return authService.getToken() + .then( token => { + let url = `${__API_URL__}/api/gallery`; + let config = { + headers: { + 'Accept': 'application/json', + 'Authorization': `Bearer ${token}` + } + }; + return $http.get(url, config); + }) + .then( res => { + $log.log('galleries retrieved'); + + service.galleries = res.data; + return service.galleries; + }) + .catch(err => { + $log.error(err.message); + return $q.reject(err); + }); + }; + return service; +}; From 8593b67c730c9c67b10a0e3fc7bcfcf3ac0845ef Mon Sep 17 00:00:00 2001 From: reganoneill Date: Wed, 29 Mar 2017 15:09:48 -0700 Subject: [PATCH 06/36] markdown and js mostly complete --- .../create-gallery/_create-gallery.scss} | 0 .../create-gallery/create-gallery.html | 17 ++++++++ .../gallery/create-gallery/create-gallery.js | 20 +++++++++ .../app/component/landing/login/_login.scss | 0 .../component/{ => landing}/login/login.html | 0 .../component/{ => landing}/login/login.js | 0 .../{ => landing}/signup/_signup.scss | 0 .../{ => landing}/signup/signup.html | 0 .../component/{ => landing}/signup/signup.js | 0 lab-regan/app/component/navbar/_navbar.scss | 0 lab-regan/app/component/navbar/navbar.html | 11 +++++ lab-regan/app/component/navbar/navbar.js | 42 +++++++++++++++++++ lab-regan/app/scss/main.scss | 4 +- 13 files changed, 92 insertions(+), 2 deletions(-) rename lab-regan/app/component/{login/_login.scss => gallery/create-gallery/_create-gallery.scss} (100%) create mode 100644 lab-regan/app/component/gallery/create-gallery/create-gallery.html create mode 100644 lab-regan/app/component/gallery/create-gallery/create-gallery.js create mode 100644 lab-regan/app/component/landing/login/_login.scss rename lab-regan/app/component/{ => landing}/login/login.html (100%) rename lab-regan/app/component/{ => landing}/login/login.js (100%) rename lab-regan/app/component/{ => landing}/signup/_signup.scss (100%) rename lab-regan/app/component/{ => landing}/signup/signup.html (100%) rename lab-regan/app/component/{ => landing}/signup/signup.js (100%) create mode 100644 lab-regan/app/component/navbar/_navbar.scss create mode 100644 lab-regan/app/component/navbar/navbar.html create mode 100644 lab-regan/app/component/navbar/navbar.js diff --git a/lab-regan/app/component/login/_login.scss b/lab-regan/app/component/gallery/create-gallery/_create-gallery.scss similarity index 100% rename from lab-regan/app/component/login/_login.scss rename to lab-regan/app/component/gallery/create-gallery/_create-gallery.scss diff --git a/lab-regan/app/component/gallery/create-gallery/create-gallery.html b/lab-regan/app/component/gallery/create-gallery/create-gallery.html new file mode 100644 index 00000000..d36fca41 --- /dev/null +++ b/lab-regan/app/component/gallery/create-gallery/create-gallery.html @@ -0,0 +1,17 @@ + diff --git a/lab-regan/app/component/gallery/create-gallery/create-gallery.js b/lab-regan/app/component/gallery/create-gallery/create-gallery.js new file mode 100644 index 00000000..f5e34d7d --- /dev/null +++ b/lab-regan/app/component/gallery/create-gallery/create-gallery.js @@ -0,0 +1,20 @@ +'use strict'; + +module.exports = { + template: require('./create-gallery.html'), + controller:['$log', 'galleryService', CreateGalleryController], + controllerAs: 'createGalleryCtrl' +}; + +function CreateGalleryController($log, galleryService){ + $log.debug('CreateGalleryController'); + + this.gallery = {}; + this.createGallery= function(){ + galleryService.createGallery(this.gallery) + .then( () => { + this.gallery.name = null; + this.gallery.desc = null; + }); + }; +}; diff --git a/lab-regan/app/component/landing/login/_login.scss b/lab-regan/app/component/landing/login/_login.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/component/login/login.html b/lab-regan/app/component/landing/login/login.html similarity index 100% rename from lab-regan/app/component/login/login.html rename to lab-regan/app/component/landing/login/login.html diff --git a/lab-regan/app/component/login/login.js b/lab-regan/app/component/landing/login/login.js similarity index 100% rename from lab-regan/app/component/login/login.js rename to lab-regan/app/component/landing/login/login.js diff --git a/lab-regan/app/component/signup/_signup.scss b/lab-regan/app/component/landing/signup/_signup.scss similarity index 100% rename from lab-regan/app/component/signup/_signup.scss rename to lab-regan/app/component/landing/signup/_signup.scss diff --git a/lab-regan/app/component/signup/signup.html b/lab-regan/app/component/landing/signup/signup.html similarity index 100% rename from lab-regan/app/component/signup/signup.html rename to lab-regan/app/component/landing/signup/signup.html diff --git a/lab-regan/app/component/signup/signup.js b/lab-regan/app/component/landing/signup/signup.js similarity index 100% rename from lab-regan/app/component/signup/signup.js rename to lab-regan/app/component/landing/signup/signup.js diff --git a/lab-regan/app/component/navbar/_navbar.scss b/lab-regan/app/component/navbar/_navbar.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/component/navbar/navbar.html b/lab-regan/app/component/navbar/navbar.html new file mode 100644 index 00000000..e15836dc --- /dev/null +++ b/lab-regan/app/component/navbar/navbar.html @@ -0,0 +1,11 @@ + diff --git a/lab-regan/app/component/navbar/navbar.js b/lab-regan/app/component/navbar/navbar.js new file mode 100644 index 00000000..514de319 --- /dev/null +++ b/lab-regan/app/component/navbar/navbar.js @@ -0,0 +1,42 @@ +'use strict'; + +require('./_navbar.scss'); + +module.exports = { + template: require('./navbar.html'), + controller: ['$log', '$location', '$rootScope', 'authService', NavbarController], + controllerAs: 'navbarCtrl' +}; + +function NavbarController($log, $location, $rootScope, authService){ + $log.debug('NavbarController'); + + this.checkPath = function(){ + let path = $location.path(); + if(path === '/join'){ + this.hideButtons = true; + }; + if(path !== '/join'){ + this.hideButtons = false; + authService.getToken() + .catch( () => { + $location.url('/join#login'); + }); + }; + }; + this.checkPath(); + + $rootScope.$on('$locationChangeSuccess', () => { + this.checkPath(); + }); + + this.logout = function(){ + $log.log('navbarCtrl.logout'); + + this.hideButtons = true; + authService.logout() + .then( () => { + $location.url('/'); + }); + }; +}; diff --git a/lab-regan/app/scss/main.scss b/lab-regan/app/scss/main.scss index 69b937ae..7a6e755a 100644 --- a/lab-regan/app/scss/main.scss +++ b/lab-regan/app/scss/main.scss @@ -6,5 +6,5 @@ @import "lib/layout/footer"; @import "lib/layout/main"; // components -@import "../component/login/login"; -@import "../component/signup/signup"; +@import "../component/landing/login/login"; +@import "../component/landing/signup/signup"; From 7d1ccb87f5e4c69621710da0c6e0cc1536a467d2 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Wed, 29 Mar 2017 15:57:37 -0700 Subject: [PATCH 07/36] mvp met --- lab-regan/app/config/log-config.js | 4 ++-- lab-regan/app/view/home/home.html | 9 ++++++++- lab-regan/webpack.config.js | 10 +++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/lab-regan/app/config/log-config.js b/lab-regan/app/config/log-config.js index 683171b9..c84d58c8 100644 --- a/lab-regan/app/config/log-config.js +++ b/lab-regan/app/config/log-config.js @@ -2,6 +2,6 @@ module.exports = ['$logProvider', logConfig]; -function logConfig($logProvider){ +function logConfig($logProvider) { $logProvider.debugEnabled(__DEBUG__); -} +}; diff --git a/lab-regan/app/view/home/home.html b/lab-regan/app/view/home/home.html index eeeb0858..2ba7e9ec 100644 --- a/lab-regan/app/view/home/home.html +++ b/lab-regan/app/view/home/home.html @@ -1,3 +1,10 @@
    -

    welcome home!

    + +
      +
    • + name: {{gallery.name}} + description: {{gallery.desc}} + id: {{gallery._id}} +
    • +
    diff --git a/lab-regan/webpack.config.js b/lab-regan/webpack.config.js index c170af20..26434386 100644 --- a/lab-regan/webpack.config.js +++ b/lab-regan/webpack.config.js @@ -1,11 +1,14 @@ 'use strict'; -require('dotenv').load(); - +const dotenv = require('dotenv'); const webpack = require('webpack'); const HTMLPlugin = require('html-webpack-plugin'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); +const production = process.env.NODE_ENV === 'production'; + +dotenv.load(); + module.exports = { devtool: 'eval', entry: `${__dirname}/app/entry.js`, @@ -19,7 +22,8 @@ module.exports = { }), new ExtractTextPlugin('bundle.css'), new webpack.DefinePlugin({ - __API_URL__: JSON.stringify(process.env.API_URL) + __API_URL__: JSON.stringify(process.env.API_URL), + __DEBUG__: JSON.stringify(!production) }) ], module: { From fdac0d6fb204d9ffe48b4474b6f17f4224389c55 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Wed, 29 Mar 2017 16:51:12 -0700 Subject: [PATCH 08/36] landing refactor complete --- .../app/component/landing/login/login.html | 2 +- .../app/component/landing/signup/_signup.scss | 14 -------- .../app/component/landing/signup/signup.html | 2 +- lab-regan/app/component/navbar/_navbar.scss | 24 +++++++++++++ lab-regan/app/component/navbar/navbar.html | 9 ++++- lab-regan/app/index.html | 9 +---- lab-regan/app/scss/lib/base/_base.scss | 14 ++++---- lab-regan/app/scss/lib/layout/_header.scss | 22 ------------ lab-regan/app/scss/lib/layout/_main.scss | 36 +++++++++---------- lab-regan/app/scss/main.scss | 3 +- lab-regan/app/view/landing/_landing.scss | 27 ++++++++++++++ lab-regan/webpack.config.js | 8 ----- 12 files changed, 89 insertions(+), 81 deletions(-) diff --git a/lab-regan/app/component/landing/login/login.html b/lab-regan/app/component/landing/login/login.html index 8addd906..0dea6f46 100644 --- a/lab-regan/app/component/landing/login/login.html +++ b/lab-regan/app/component/landing/login/login.html @@ -26,6 +26,6 @@ ng-model="loginCtrl.user.password" required> - + diff --git a/lab-regan/app/component/landing/signup/_signup.scss b/lab-regan/app/component/landing/signup/_signup.scss index f87c3c8d..8b137891 100644 --- a/lab-regan/app/component/landing/signup/_signup.scss +++ b/lab-regan/app/component/landing/signup/_signup.scss @@ -1,15 +1 @@ -h3 { - margin-left: 10%; - margin-bottom: 1.5%; -} -p { - width: 23%; - margin-left: 80%; -} -.signup { - div { - width: 80%; - margin: auto; - } -} diff --git a/lab-regan/app/component/landing/signup/signup.html b/lab-regan/app/component/landing/signup/signup.html index f08172c9..e1e1b7aa 100644 --- a/lab-regan/app/component/landing/signup/signup.html +++ b/lab-regan/app/component/landing/signup/signup.html @@ -22,5 +22,5 @@

    sign up

    -

    already a member?sign in here

    + diff --git a/lab-regan/app/component/navbar/_navbar.scss b/lab-regan/app/component/navbar/_navbar.scss index e69de29b..3bc4f452 100644 --- a/lab-regan/app/component/navbar/_navbar.scss +++ b/lab-regan/app/component/navbar/_navbar.scss @@ -0,0 +1,24 @@ +.navbar { + img{ + width: 3em; + height: 3em; + margin: auto; + } + ul { + height: 100%; + width: 80%; + margin: auto; + li { + float: left; + height: 100%; + display: inline-block; + padding: auto 0; + &:first-child { + padding-top: 0.5em; + } + &:last-child { + padding: 1.5em; + } + } + } +} diff --git a/lab-regan/app/component/navbar/navbar.html b/lab-regan/app/component/navbar/navbar.html index e15836dc..8deb1c26 100644 --- a/lab-regan/app/component/navbar/navbar.html +++ b/lab-regan/app/component/navbar/navbar.html @@ -1,5 +1,12 @@ diff --git a/lab-regan/app/index.html b/lab-regan/app/index.html index f59ca48a..1b24412b 100644 --- a/lab-regan/app/index.html +++ b/lab-regan/app/index.html @@ -9,7 +9,9 @@
    - +
    + +
    diff --git a/lab-regan/app/scss/lib/base/_base.scss b/lab-regan/app/scss/lib/base/_base.scss index b0171170..139ca63a 100644 --- a/lab-regan/app/scss/lib/base/_base.scss +++ b/lab-regan/app/scss/lib/base/_base.scss @@ -4,14 +4,6 @@ box-sizing: border-box; } -// button { -// padding: 3em; -// width: 20%; -// margin-right: 10em; -// background: $site-primary; -// color: $black; -// } - body { background: $site-secondary; } diff --git a/lab-regan/app/scss/lib/layout/_footer.scss b/lab-regan/app/scss/lib/layout/_footer.scss index 7ecd0721..2521e114 100644 --- a/lab-regan/app/scss/lib/layout/_footer.scss +++ b/lab-regan/app/scss/lib/layout/_footer.scss @@ -2,7 +2,7 @@ footer { position: fixed; bottom: 0; - height: 6em; + height: 1em; width: 100%; background: $grey; } diff --git a/lab-regan/app/scss/lib/layout/_header.scss b/lab-regan/app/scss/lib/layout/_header.scss index 88894bd9..cc38d31e 100644 --- a/lab-regan/app/scss/lib/layout/_header.scss +++ b/lab-regan/app/scss/lib/layout/_header.scss @@ -4,4 +4,10 @@ header { width: 100%; height: 4em; background: $site-primary; + + .btn-std { + float: right; + margin-right: 10%; + margin-top: 2em; + } } diff --git a/lab-regan/app/scss/lib/layout/_main.scss b/lab-regan/app/scss/lib/layout/_main.scss index 4bb57e5b..8ebc30ae 100644 --- a/lab-regan/app/scss/lib/layout/_main.scss +++ b/lab-regan/app/scss/lib/layout/_main.scss @@ -1,20 +1,22 @@ @import "../theme/vars"; -// section { -// min-height: 14em; -// form { -// width: 100%; -// padding-top: 2.5em; -// input { -// display: block; -// width: 80%; -// height: 4em; -// margin: auto; -// margin-bottom: 3em; -// &:last-child{ -// width: 20%; -// margin-right: 10%; -// } -// } -// } -// } +form { + width: 100%; + padding-top: 2.5em; + h3 { + margin-left: 10%; + margin-bottom: 1.5%; + } + input { + display: block; + width: 80%; + height: 4em; + margin: auto; + margin-bottom: 3em; + border-radius: 8px; + } +.btn-std { + width: 25%; + margin-right: 10%; +} +} diff --git a/lab-regan/app/scss/main.scss b/lab-regan/app/scss/main.scss index 5f2791e8..aa38f761 100644 --- a/lab-regan/app/scss/main.scss +++ b/lab-regan/app/scss/main.scss @@ -9,3 +9,4 @@ @import "../component/navbar/navbar"; @import "../component/landing/signup/signup"; @import "../component/landing/login/login"; +@import "../component/gallery/create-gallery/create-gallery"; diff --git a/lab-regan/app/view/home/_home.scss b/lab-regan/app/view/home/_home.scss index e69de29b..82afdfad 100644 --- a/lab-regan/app/view/home/_home.scss +++ b/lab-regan/app/view/home/_home.scss @@ -0,0 +1,29 @@ +@import "../../scss/lib/theme/vars"; + +.home { + background: $grey; + + ul { + width: 100%; + li { + width: 80%; + margin: 2em auto; + background: $site-secondary; + padding: 0.75em; + border-radius: 8px; + + span:nth-child(even){ + display: block; + } + & > span { + margin: 1em 0; + } + // &:last-child::after { + // margin-bottom: 15em; + // } + } +.bolden { + font-weight: bold; + } + } +} diff --git a/lab-regan/app/view/home/home-controller.js b/lab-regan/app/view/home/home-controller.js index 7f48d88b..9bddd600 100644 --- a/lab-regan/app/view/home/home-controller.js +++ b/lab-regan/app/view/home/home-controller.js @@ -2,8 +2,23 @@ require('./_home.scss'); -module.exports = ['$log', HomeController]; +module.exports = ['$log', '$rootScope', 'galleryService', HomeController]; -function HomeController($log) { +function HomeController($log, $rootScope, galleryService) { $log.debug('HomeController'); + + this.galleries = []; + + this.fetchGalleries = function() { + galleryService.fetchGalleries() + .then( galleries => { + this.galleries = galleries; + }); + }; + + this.fetchGalleries(); + + $rootScope.$on('$locationChangeSuccess', () => { + this.fetchGalleries(); + }); }; diff --git a/lab-regan/app/view/home/home.html b/lab-regan/app/view/home/home.html index 2ba7e9ec..b2b0734a 100644 --- a/lab-regan/app/view/home/home.html +++ b/lab-regan/app/view/home/home.html @@ -1,10 +1,11 @@
    +
    • - name: {{gallery.name}} - description: {{gallery.desc}} - id: {{gallery._id}} + name: {{gallery.name}} + description: {{gallery.desc}} + id: {{gallery._id}}
    diff --git a/lab-regan/app/view/landing/_landing.scss b/lab-regan/app/view/landing/_landing.scss index bd416243..49b4e18e 100644 --- a/lab-regan/app/view/landing/_landing.scss +++ b/lab-regan/app/view/landing/_landing.scss @@ -1,25 +1,5 @@ .landing { min-height: 14em; - form { - width: 100%; - padding-top: 2.5em; - h3 { - margin-left: 10%; - margin-bottom: 1.5%; - } - input { - display: block; - width: 80%; - height: 4em; - margin: auto; - margin-bottom: 3em; - } - .btn-std { - width: 20%; - margin-right: 10%; - } -} - p { width: 23%; margin-left: 80%; From 8b526c83feb881c6594ba8bead7ccfd86d5ad029 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Thu, 30 Mar 2017 20:42:17 -0700 Subject: [PATCH 10/36] core functionality --- .../gallery/edit-gallery/_edit-gallery.scss | 24 ++++++++ .../gallery/edit-gallery/edit-gallery.html | 22 +++++++ .../gallery/edit-gallery/edit-gallery.js | 21 +++++++ .../gallery/gallery-item/_gallery-item.scss | 39 ++++++++++++ .../gallery/gallery-item/gallery-item.html | 22 +++++++ .../gallery/gallery-item/gallery-item.js | 21 +++++++ lab-regan/app/scss/main.scss | 2 + lab-regan/app/service/gallery-service.js | 59 +++++++++++++++++++ lab-regan/app/view/home/_home.scss | 26 ++------ lab-regan/app/view/home/home.html | 5 +- lab-regan/assets/cfLogo.svg | 16 ----- 11 files changed, 218 insertions(+), 39 deletions(-) create mode 100644 lab-regan/app/component/gallery/edit-gallery/_edit-gallery.scss create mode 100644 lab-regan/app/component/gallery/edit-gallery/edit-gallery.html create mode 100644 lab-regan/app/component/gallery/edit-gallery/edit-gallery.js create mode 100644 lab-regan/app/component/gallery/gallery-item/_gallery-item.scss create mode 100644 lab-regan/app/component/gallery/gallery-item/gallery-item.html create mode 100644 lab-regan/app/component/gallery/gallery-item/gallery-item.js delete mode 100644 lab-regan/assets/cfLogo.svg diff --git a/lab-regan/app/component/gallery/edit-gallery/_edit-gallery.scss b/lab-regan/app/component/gallery/edit-gallery/_edit-gallery.scss new file mode 100644 index 00000000..257afdec --- /dev/null +++ b/lab-regan/app/component/gallery/edit-gallery/_edit-gallery.scss @@ -0,0 +1,24 @@ +@import "../../../scss/lib/theme/vars"; + + +edit-gallery { + .edit{ + form{ + fieldset { + background: $site-secondary; + width: 80%; + margin: auto; + span { + float: left; + font-weight: bold; + } + input { + float: right; + } + } + } + } + .btn-std { + height: 2.5em; + } +} diff --git a/lab-regan/app/component/gallery/edit-gallery/edit-gallery.html b/lab-regan/app/component/gallery/edit-gallery/edit-gallery.html new file mode 100644 index 00000000..82c2b0e9 --- /dev/null +++ b/lab-regan/app/component/gallery/edit-gallery/edit-gallery.html @@ -0,0 +1,22 @@ +
    + +
    diff --git a/lab-regan/app/component/gallery/edit-gallery/edit-gallery.js b/lab-regan/app/component/gallery/edit-gallery/edit-gallery.js new file mode 100644 index 00000000..5f660b4a --- /dev/null +++ b/lab-regan/app/component/gallery/edit-gallery/edit-gallery.js @@ -0,0 +1,21 @@ +'use strict'; + +require('./_edit-gallery.scss'); + +module.exports = { + template: require('./edit-gallery.html'), + controller: ['$log', 'galleryService', EditGalleryController], + controllerAs: 'editGalleryCtrl', + //this is a reserved property name + bindings: { + gallery: '<' + } +}; + +function EditGalleryController($log, galleryService){ + $log.debug('EditGalleryController'); + + this.updateGallery = function(){ + galleryService.updateGallery(this.gallery._id, this.gallery); + }; +}; diff --git a/lab-regan/app/component/gallery/gallery-item/_gallery-item.scss b/lab-regan/app/component/gallery/gallery-item/_gallery-item.scss new file mode 100644 index 00000000..84aa6e7c --- /dev/null +++ b/lab-regan/app/component/gallery/gallery-item/_gallery-item.scss @@ -0,0 +1,39 @@ +@import "../../../scss/lib/theme/vars"; + +.gallery-item { + .current-item { + width: 80%; + margin: 0 auto; + background: $site-secondary; + padding: 0.75em; + border-radius: 8px; + color: $site-primary; + div{ + span{ + &:first-child{ + font-weight: bold; + } + } + } + & > span { + margin: 1em 0; + } + } + .edit-container { + width: 100%; + div{ + width: 80%; + margin: auto; + text-align: right; + span { + display: inline-block; + background: $site-primary; + color: $white; + padding: 0.25em 2em; + border-radius: 8px; + margin: 0.5em 0; + margin-bottom: 1.5em; + } + } + } +} diff --git a/lab-regan/app/component/gallery/gallery-item/gallery-item.html b/lab-regan/app/component/gallery/gallery-item/gallery-item.html new file mode 100644 index 00000000..c02c0f8e --- /dev/null +++ b/lab-regan/app/component/gallery/gallery-item/gallery-item.html @@ -0,0 +1,22 @@ +
  • diff --git a/lab-regan/app/component/gallery/gallery-item/gallery-item.js b/lab-regan/app/component/gallery/gallery-item/gallery-item.js new file mode 100644 index 00000000..eca39d2a --- /dev/null +++ b/lab-regan/app/component/gallery/gallery-item/gallery-item.js @@ -0,0 +1,21 @@ +'use strict'; + +require('./_gallery-item.scss'); + +module.exports = { + template: require('./gallery-item.html'), + controller: ['$log', 'galleryService', GalleryItemController], + controllerAs: 'galleryItemCtrl', + bindings: { + gallery: '<' + } +}; + +function GalleryItemController($log, galleryService){ + $log.debug('GalleryItemController'); + + this.showEditGallery = false; + this.deleteGallery = function(){ + galleryService.deleteGallery(this.gallery._id); + }; +}; diff --git a/lab-regan/app/scss/main.scss b/lab-regan/app/scss/main.scss index aa38f761..ac456a3c 100644 --- a/lab-regan/app/scss/main.scss +++ b/lab-regan/app/scss/main.scss @@ -9,4 +9,6 @@ @import "../component/navbar/navbar"; @import "../component/landing/signup/signup"; @import "../component/landing/login/login"; +@import "../component/gallery/gallery-item/gallery-item"; +@import "../component/gallery/edit-gallery/edit-gallery"; @import "../component/gallery/create-gallery/create-gallery"; diff --git a/lab-regan/app/service/gallery-service.js b/lab-regan/app/service/gallery-service.js index d76a161b..a0be1fcb 100644 --- a/lab-regan/app/service/gallery-service.js +++ b/lab-regan/app/service/gallery-service.js @@ -60,5 +60,64 @@ function galleryService($q, $log, $http, authService){ return $q.reject(err); }); }; + + service.updateGallery = function(galleryID, galleryData){ + $log.debug('galleryService.updateGallery'); + + return authService.getToken() + .then( token => { + let url = `${__API_URL__}/api/gallery/${galleryID}` + let config = { + headers: { + 'Accept': 'application/json', + 'Authorization': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }; + return $http.put(url, galleryData, config); + }) + .then( res => { + for( let i=0; i < service.galleries.length; i++){ + let current = service.galleries[i]; + if(current._id === galleryID){ + service.galleries[i] = res.data; + break; + }; + }; + return res.data; + }) + .catch(err => { + $log.error(err.message); + return $q.reject(err); + }); + }; + + service.deleteGallery = function(galleryID){ + $log.debug('galleryService.deleteGallery'); + return authService.getToken() + .then( token => { + let url = `${__API_URL__}/api/gallery/${galleryID}`; + let config = { + headers: { + 'Authorization': `Bearer ${token}` + } + }; + return $http.delete(url, config); + }) + .then( res => { + for(let i =0; i < service.galleries.length; i++){ + let current = service.galleries[i]; + if(current._id === galleryID){ + service.galleries.splice(i, 1); + break; + }; + }; + }) + .catch( err => { + $log.error(err.message); + return $q.reject(err); + }); + }; + return service; }; diff --git a/lab-regan/app/view/home/_home.scss b/lab-regan/app/view/home/_home.scss index 82afdfad..f950a3ac 100644 --- a/lab-regan/app/view/home/_home.scss +++ b/lab-regan/app/view/home/_home.scss @@ -5,25 +5,9 @@ ul { width: 100%; - li { - width: 80%; - margin: 2em auto; - background: $site-secondary; - padding: 0.75em; - border-radius: 8px; - - span:nth-child(even){ - display: block; - } - & > span { - margin: 1em 0; - } - // &:last-child::after { - // margin-bottom: 15em; - // } - } -.bolden { - font-weight: bold; - } - } + padding-bottom: 15em; + .bolden { + font-weight: bold; + } + } } diff --git a/lab-regan/app/view/home/home.html b/lab-regan/app/view/home/home.html index b2b0734a..8827cf65 100644 --- a/lab-regan/app/view/home/home.html +++ b/lab-regan/app/view/home/home.html @@ -2,10 +2,11 @@
      -
    • + +
    diff --git a/lab-regan/assets/cfLogo.svg b/lab-regan/assets/cfLogo.svg deleted file mode 100644 index 1108a137..00000000 --- a/lab-regan/assets/cfLogo.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - From 34974f166cc657f833b457033b124654899602a1 Mon Sep 17 00:00:00 2001 From: Regan O'Neill Date: Thu, 30 Mar 2017 21:40:56 -0700 Subject: [PATCH 11/36] fixed page load issue --- lab-regan/app/component/navbar/navbar.js | 3 ++- lab-regan/app/service/auth-service.js | 1 + lab-regan/app/view/landing/landing.html | 8 ++++---- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lab-regan/app/component/navbar/navbar.js b/lab-regan/app/component/navbar/navbar.js index 514de319..7307ff2c 100644 --- a/lab-regan/app/component/navbar/navbar.js +++ b/lab-regan/app/component/navbar/navbar.js @@ -20,7 +20,8 @@ function NavbarController($log, $location, $rootScope, authService){ this.hideButtons = false; authService.getToken() .catch( () => { - $location.url('/join#login'); + // $location.url('/join#login'); + $location.url('/join#signup'); }); }; }; diff --git a/lab-regan/app/service/auth-service.js b/lab-regan/app/service/auth-service.js index 41fe4c15..95ad39e7 100644 --- a/lab-regan/app/service/auth-service.js +++ b/lab-regan/app/service/auth-service.js @@ -42,6 +42,7 @@ function authService($q, $log, $http, $window) { } }; + return $http.post(url, user, config) .then( res => { $log.log('success:', res.data); diff --git a/lab-regan/app/view/landing/landing.html b/lab-regan/app/view/landing/landing.html index f88894d9..76a71302 100644 --- a/lab-regan/app/view/landing/landing.html +++ b/lab-regan/app/view/landing/landing.html @@ -3,8 +3,8 @@ ng-if="landingCtrl.showSignup">
    - +
    @@ -15,8 +15,8 @@

    want to sign up?

    - +
    From b970d72fe61924321b93e627a1319949f709b5cf Mon Sep 17 00:00:00 2001 From: Regan O'Neill Date: Thu, 30 Mar 2017 23:20:55 -0700 Subject: [PATCH 12/36] angular dom manipulation --- .../gallery/edit-gallery/_edit-gallery.scss | 52 +++++++++++++------ .../gallery/edit-gallery/edit-gallery.html | 29 ++++++----- .../gallery/gallery-item/_gallery-item.scss | 6 +++ .../gallery/gallery-item/gallery-item.html | 4 +- lab-regan/app/scss/lib/theme/_vars.scss | 1 + 5 files changed, 59 insertions(+), 33 deletions(-) diff --git a/lab-regan/app/component/gallery/edit-gallery/_edit-gallery.scss b/lab-regan/app/component/gallery/edit-gallery/_edit-gallery.scss index 257afdec..d525478a 100644 --- a/lab-regan/app/component/gallery/edit-gallery/_edit-gallery.scss +++ b/lab-regan/app/component/gallery/edit-gallery/_edit-gallery.scss @@ -1,24 +1,42 @@ @import "../../../scss/lib/theme/vars"; +.edit { + width: 80%; + margin: 0 auto; + padding: 0.75em; + border-radius: 8px; + color: $site-primary; + div { + &:first-child{ + background: $site-secondary; + border-radius: 6px; + }, + &:nth-child(2){ + text-align: right; + } + .btn-std{ + margin-right: 0; + } + } + fieldset{ + margin: 0.75em 0; -edit-gallery { - .edit{ - form{ - fieldset { - background: $site-secondary; - width: 80%; - margin: auto; - span { - float: left; - font-weight: bold; + span{ + float: left; + &:first-child{ + font-weight: bold; } - input { - float: right; + } + input .input-std { + float: left; + display: inline-block; + &:first-child { + border: 1px red dotted; + margin-left: 4%; } } + } } - } - .btn-std { - height: 2.5em; - } -} + // & > span { + // margin: 1em 0; + // } diff --git a/lab-regan/app/component/gallery/edit-gallery/edit-gallery.html b/lab-regan/app/component/gallery/edit-gallery/edit-gallery.html index 82c2b0e9..82d1b5ae 100644 --- a/lab-regan/app/component/gallery/edit-gallery/edit-gallery.html +++ b/lab-regan/app/component/gallery/edit-gallery/edit-gallery.html @@ -3,20 +3,21 @@ name="edit-gallery" ng-submit="editGalleryCtrl.updateGallery()" novalidate> +
    +
    + name: + +
    -
    - name: - -
    - -
    - description - -
    - - - +
    + description + +
    +
    +
    + +
    diff --git a/lab-regan/app/component/gallery/gallery-item/_gallery-item.scss b/lab-regan/app/component/gallery/gallery-item/_gallery-item.scss index 84aa6e7c..fd396bc4 100644 --- a/lab-regan/app/component/gallery/gallery-item/_gallery-item.scss +++ b/lab-regan/app/component/gallery/gallery-item/_gallery-item.scss @@ -9,6 +9,8 @@ border-radius: 8px; color: $site-primary; div{ + margin: 0.75em 0; + span{ &:first-child{ font-weight: bold; @@ -33,6 +35,10 @@ border-radius: 8px; margin: 0.5em 0; margin-bottom: 1.5em; + &:last-child{ + background: $site-tertiary; + color: $black; + } } } } diff --git a/lab-regan/app/component/gallery/gallery-item/gallery-item.html b/lab-regan/app/component/gallery/gallery-item/gallery-item.html index c02c0f8e..3444a362 100644 --- a/lab-regan/app/component/gallery/gallery-item/gallery-item.html +++ b/lab-regan/app/component/gallery/gallery-item/gallery-item.html @@ -10,10 +10,10 @@ {{ galleryItemCtrl.gallery.desc }} - +
    -
    +
    edit delete
    diff --git a/lab-regan/app/scss/lib/theme/_vars.scss b/lab-regan/app/scss/lib/theme/_vars.scss index 0db04823..6b6f5b70 100644 --- a/lab-regan/app/scss/lib/theme/_vars.scss +++ b/lab-regan/app/scss/lib/theme/_vars.scss @@ -1,5 +1,6 @@ $site-primary: #444; $site-secondary: #888; +$site-tertiary: #aaa; $black: #000; $white: #fff; $grey: #ccc; From d26339139f75e4f382a5a210bc92185bf5cc5552 Mon Sep 17 00:00:00 2001 From: Regan O'Neill Date: Thu, 30 Mar 2017 23:41:43 -0700 Subject: [PATCH 13/36] submission --- .../component/gallery/create-gallery/_create-gallery.scss | 8 +++++++- .../component/gallery/create-gallery/create-gallery.html | 1 + lab-regan/app/view/home/_home.scss | 4 ++++ lab-regan/app/view/home/home.html | 2 +- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lab-regan/app/component/gallery/create-gallery/_create-gallery.scss b/lab-regan/app/component/gallery/create-gallery/_create-gallery.scss index 8b137891..df781bcb 100644 --- a/lab-regan/app/component/gallery/create-gallery/_create-gallery.scss +++ b/lab-regan/app/component/gallery/create-gallery/_create-gallery.scss @@ -1 +1,7 @@ - +.create-gallery{ + h2{ + padding-left: 10%; + margin-bottom: -2em; + padding-top: 2em; + } +} diff --git a/lab-regan/app/component/gallery/create-gallery/create-gallery.html b/lab-regan/app/component/gallery/create-gallery/create-gallery.html index 97c8fe70..12b89bf3 100644 --- a/lab-regan/app/component/gallery/create-gallery/create-gallery.html +++ b/lab-regan/app/component/gallery/create-gallery/create-gallery.html @@ -1,4 +1,5 @@
    - diff --git a/lab-regan/app/component/gallery/thumbnail-container/_thumbnail-container.scss b/lab-regan/app/component/gallery/thumbnail-container/_thumbnail-container.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html new file mode 100644 index 00000000..45059623 --- /dev/null +++ b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html @@ -0,0 +1,7 @@ +
    +

    {{thumbnailCtrl.gallery.name}}

    + +
    + +
    +
    diff --git a/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.js b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.js new file mode 100644 index 00000000..07648f29 --- /dev/null +++ b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.js @@ -0,0 +1,11 @@ +'use strict'; + +require('./_thumbnail-container.scss'); + +module.exports = { + template: require('./thumbnail-container.html'), + controllerAs: 'thumbnailContainerCtrl' + bindings: { + gallery: '<' + } +}; diff --git a/lab-regan/app/component/gallery/thumbnail/_thumbnail.scss b/lab-regan/app/component/gallery/thumbnail/_thumbnail.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/component/gallery/thumbnail/thumbnail.html b/lab-regan/app/component/gallery/thumbnail/thumbnail.html new file mode 100644 index 00000000..3600ac4e --- /dev/null +++ b/lab-regan/app/component/gallery/thumbnail/thumbnail.html @@ -0,0 +1,4 @@ +
    + {{ thumbnailCtrl.pic.desc }} + delete +
    diff --git a/lab-regan/app/component/gallery/thumbnail/thumbnail.js b/lab-regan/app/component/gallery/thumbnail/thumbnail.js new file mode 100644 index 00000000..37d50766 --- /dev/null +++ b/lab-regan/app/component/gallery/thumbnail/thumbnail.js @@ -0,0 +1,20 @@ +'use strict'; + +require('./_thumbnail.scss'); + +module.exports = { + template: require('./thumbnail.html'), + controller: ['$log', 'picService', ThumbnailController], + controllerAs: 'thumbnailCtrl', + bindings: { + pic: '<' + } +}; + +function ThumbnailController($log, picService){ + $log.debug('ThumbnailController'); + + this.deletePic = function(){ + $log.debug('thumbnailCtrl.deletePic'); + } +}; diff --git a/lab-regan/app/component/gallery/upload-pic/_upload-pic.scss b/lab-regan/app/component/gallery/upload-pic/_upload-pic.scss new file mode 100644 index 00000000..e69de29b diff --git a/lab-regan/app/component/gallery/upload-pic/upload-pic.html b/lab-regan/app/component/gallery/upload-pic/upload-pic.html new file mode 100644 index 00000000..0cc8b412 --- /dev/null +++ b/lab-regan/app/component/gallery/upload-pic/upload-pic.html @@ -0,0 +1,16 @@ +
    + +

    upload a new pic

    +
    + + +
    +
    +

    + select a pic to upload!

    + +
    + +
    diff --git a/lab-regan/app/component/gallery/upload-pic/upload-pic.js b/lab-regan/app/component/gallery/upload-pic/upload-pic.js new file mode 100644 index 00000000..4abdcace --- /dev/null +++ b/lab-regan/app/component/gallery/upload-pic/upload-pic.js @@ -0,0 +1,26 @@ +'use strict'; + +require('./_upload-pic.scss'); + +module.exports = { + template: require('./upload-pic.html'), + controller: ['$log', 'picService', UploadPicController], + controllerAs: 'uploadPicCtrl', + bindings: { + gallery: '<' + } +}; + +function UploadPicController($log, picService){ + $log.debug('UploadPicController'); + + this.pic = {}; + this.uploadPic = function(){ + picService.uploadGalleryPic(this.gallery, this.pic) + .then( () => { + this.pic.name = null; + this.pic.desc = null; + this.pic.file = null; + }); + }; +}; diff --git a/lab-regan/app/service/pic-service.js b/lab-regan/app/service/pic-service.js new file mode 100644 index 00000000..2370e3fd --- /dev/null +++ b/lab-regan/app/service/pic-service.js @@ -0,0 +1,41 @@ +'use strict'; + +module.exports = ['$q', '$log', '$http', 'Upload', 'authService', picService]; + +function picService($q, $log, $http, Upload, authService){ + $log.debug('picService'); + + let service = {}; + + service.uploadGalleryPic = function(galleryData, picData){ + $log.debug('service.uploadGalleryPic'); + + return authService.getToken() + .then( token => { + let url = `${__API_URL__}/api/gallery${galleryData._id}/pic`; + let headers = { + 'Authorization': `Bearer ${token}`, + 'Accept': 'application/json' + }; + return Upload.upload({ + url, + headers, + method: 'POST', + data: { + name: picData.name, + desc: picData.desc, + file picData.file + } + }); + }) + .then( res => { + galleryData.pics.unshift(res.data); + return res.data; + }) + .catch( err => { + $log.error(err.message); + return $q.reject(err); + }); + }; + return service; +}; diff --git a/lab-regan/app/view/home/home.html b/lab-regan/app/view/home/home.html index 0dabaf94..3d89cbec 100644 --- a/lab-regan/app/view/home/home.html +++ b/lab-regan/app/view/home/home.html @@ -4,4 +4,8 @@

    Galleries

    + + From 73123fc1d38c6a24201d8a9275dcaf7807885281 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Mon, 3 Apr 2017 16:33:27 -0700 Subject: [PATCH 16/36] local deploy image upload working --- .../gallery/thumbnail-container/thumbnail-container.html | 2 +- .../gallery/thumbnail-container/thumbnail-container.js | 2 +- lab-regan/app/component/gallery/upload-pic/upload-pic.html | 3 ++- lab-regan/app/entry.js | 3 ++- lab-regan/app/service/pic-service.js | 7 ++++--- lab-regan/app/view/home/home.html | 4 +++- lab-regan/package.json | 1 + 7 files changed, 14 insertions(+), 8 deletions(-) diff --git a/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html index 45059623..103c9f1b 100644 --- a/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html +++ b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html @@ -1,5 +1,5 @@
    -

    {{thumbnailCtrl.gallery.name}}

    +

    {{thumbnailContainerCtrl.gallery.name}}

    diff --git a/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.js b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.js index 07648f29..18bf16d4 100644 --- a/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.js +++ b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.js @@ -4,7 +4,7 @@ require('./_thumbnail-container.scss'); module.exports = { template: require('./thumbnail-container.html'), - controllerAs: 'thumbnailContainerCtrl' + controllerAs: 'thumbnailContainerCtrl', bindings: { gallery: '<' } diff --git a/lab-regan/app/component/gallery/upload-pic/upload-pic.html b/lab-regan/app/component/gallery/upload-pic/upload-pic.html index 0cc8b412..a39a1085 100644 --- a/lab-regan/app/component/gallery/upload-pic/upload-pic.html +++ b/lab-regan/app/component/gallery/upload-pic/upload-pic.html @@ -9,7 +9,8 @@

    upload a new pic

    - select a pic to upload!

    + select a pic to upload! +

    diff --git a/lab-regan/app/entry.js b/lab-regan/app/entry.js index 358681e9..f8762a51 100644 --- a/lab-regan/app/entry.js +++ b/lab-regan/app/entry.js @@ -9,8 +9,9 @@ const pascalcase = require('pascalcase'); const uiRouter = require('angular-ui-router'); const ngTouch = require('angular-touch'); const ngAnimate = require('angular-animate'); +const ngFileUpload = require('ng-file-upload'); -const cfgram = angular.module('cfgram', [ngTouch, ngAnimate, uiRouter]); +const cfgram = angular.module('cfgram', [ngTouch, ngAnimate, uiRouter, ngFileUpload]); let context = require.context('./config/', true, /\.js$/); context.keys().forEach( key => { diff --git a/lab-regan/app/service/pic-service.js b/lab-regan/app/service/pic-service.js index 2370e3fd..2f6dd177 100644 --- a/lab-regan/app/service/pic-service.js +++ b/lab-regan/app/service/pic-service.js @@ -12,11 +12,12 @@ function picService($q, $log, $http, Upload, authService){ return authService.getToken() .then( token => { - let url = `${__API_URL__}/api/gallery${galleryData._id}/pic`; + let url = `${__API_URL__}/api/gallery/${galleryData._id}/pic`; let headers = { 'Authorization': `Bearer ${token}`, 'Accept': 'application/json' }; + console.log(`${token}`, '<----TOKEN'); return Upload.upload({ url, headers, @@ -24,7 +25,7 @@ function picService($q, $log, $http, Upload, authService){ data: { name: picData.name, desc: picData.desc, - file picData.file + file: picData.file } }); }) @@ -33,7 +34,7 @@ function picService($q, $log, $http, Upload, authService){ return res.data; }) .catch( err => { - $log.error(err.message); + $log.error(err.message, 'you lose!!!!!!!!!'); return $q.reject(err); }); }; diff --git a/lab-regan/app/view/home/home.html b/lab-regan/app/view/home/home.html index 3d89cbec..d22f2e3f 100644 --- a/lab-regan/app/view/home/home.html +++ b/lab-regan/app/view/home/home.html @@ -2,7 +2,9 @@

    Galleries

      - + + +
    - - +
- From 4f16d594d0cd7e8b0b1f71a307a3511910b985d8 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Tue, 4 Apr 2017 12:53:13 -0700 Subject: [PATCH 18/36] basic test structure --- .../gallery/thumbnail/thumbnail.html | 1 + lab-regan/karma.conf.js | 72 +++++++++++++++++++ lab-regan/package.json | 11 ++- lab-regan/test/auth-service-test.js | 29 ++++++++ lab-regan/test/example-test.js | 7 ++ lab-regan/test/gallery-service-test.js | 41 +++++++++++ 6 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 lab-regan/karma.conf.js create mode 100644 lab-regan/test/auth-service-test.js create mode 100644 lab-regan/test/example-test.js create mode 100644 lab-regan/test/gallery-service-test.js diff --git a/lab-regan/app/component/gallery/thumbnail/thumbnail.html b/lab-regan/app/component/gallery/thumbnail/thumbnail.html index 27a44836..a59ac900 100644 --- a/lab-regan/app/component/gallery/thumbnail/thumbnail.html +++ b/lab-regan/app/component/gallery/thumbnail/thumbnail.html @@ -1,4 +1,5 @@
+ {{ thumbnailCtrl.pic.desc }} delete
diff --git a/lab-regan/karma.conf.js b/lab-regan/karma.conf.js new file mode 100644 index 00000000..9371846a --- /dev/null +++ b/lab-regan/karma.conf.js @@ -0,0 +1,72 @@ +// Karma configuration +// Generated on Tue Apr 04 2017 10:16:36 GMT-0700 (PDT) +const webpack = require('./webpack.config.js'); + +module.exports = function(config) { + config.set({ + webpack, + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '', + + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['jasmine'], + + + // list of files / patterns to load in the browser + files: [ + 'app/entry.js', 'test/**/*-.js', 'node_modules/angular-mocks/angular-mocks.js' + ], + + + // list of files to exclude + exclude: [ + ], + + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + 'test/**/*-test.js': ['webpack'], + 'app/entry.js': ['webpack'] + }, + + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['mocha'], + + + // web server port + port: 9876, + + + // enable / disable colors in the output (reporters and logs) + colors: true, + + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['Chrome'], + + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: false, + + // Concurrency level + // how many browser should be started simultaneous + concurrency: Infinity + }) +} diff --git a/lab-regan/package.json b/lab-regan/package.json index 81cd75b4..05806e0d 100644 --- a/lab-regan/package.json +++ b/lab-regan/package.json @@ -5,7 +5,9 @@ "main": "index.js", "scripts": { "build": "./node_modules/webpack/bin/webpack.js", - "watch": "./node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot" + "watch": "./node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot", + "test": "./node_modules/karma/bin/karma start --single-run", + "test-watch": "./node_modules/karma/bin/karma start" }, "keywords": [], "author": "", @@ -39,6 +41,13 @@ "webpack": "^2.3.2" }, "devDependencies": { + "angular-mocks": "^1.6.4", + "jasmine-core": "^2.5.2", + "karma": "^1.5.0", + "karma-chrome-launcher": "^2.0.0", + "karma-jasmine": "^1.1.0", + "karma-mocha-reporter": "^2.2.3", + "karma-webpack": "^2.0.3", "webpack-dev-server": "^2.4.2" } } diff --git a/lab-regan/test/auth-service-test.js b/lab-regan/test/auth-service-test.js new file mode 100644 index 00000000..7825a6ea --- /dev/null +++ b/lab-regan/test/auth-service-test.js @@ -0,0 +1,29 @@ +'use strict'; + +describe('Auth Service', function(){ + beforeEach( () => { + angular.mock.module('cfgram'); + angular.mock.inject(($rootScope, authService, $window, $httpBackend) => { + this.$window = $window; + this.$rootScope = $rootScope; + this.authService = authService; + this.$httpBackend = $httpBackend; + }); + }); + + describe('authService.getToken', () => { + it('should return a token', () => { + this.authService.token = null; + this.$window.localStorage.setItem('token', 'test toker-e-no'); + this.authService.getToken() + .then( token => { + expect(token).toEqual('test toker-e-no'); + }) + .catch( err => { + expect(err).toEqual(null); + }); + //this should be at the bottom of *most* test files + this.$rootScope.$apply(); + }); + }); +}); diff --git a/lab-regan/test/example-test.js b/lab-regan/test/example-test.js new file mode 100644 index 00000000..f3bc6b1a --- /dev/null +++ b/lab-regan/test/example-test.js @@ -0,0 +1,7 @@ +'use strict'; + +describe('Example Test', function(){ + it('should pass this test', ()=>{ + expect(true).toEqual(true); + }); +}); diff --git a/lab-regan/test/gallery-service-test.js b/lab-regan/test/gallery-service-test.js new file mode 100644 index 00000000..2b151ccf --- /dev/null +++ b/lab-regan/test/gallery-service-test.js @@ -0,0 +1,41 @@ +'use strict'; + +describe('Gallery Service', function(){ + beforeEach(() => { + angular.mock.module('cfgram'); + angular.mock.inject(($rootScope, authService, galleryService, $window, $httpBackend) => { + this.$window = $window; + this.$rootScope = $rootScope; + this.authService = authService; + this.galleryService = galleryService; + this.$httpBackend = $httpBackend; + }); + }); + describe('galleryService.createGallery', () => { + it('should create a new gallery', () => { + let galleryData = { + name: 'example gallery', + desc: 'example description' + }; + let headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': 'Bearer test token' + }; + this.$httpBackend.expectPOST('http://localhost:8000/api/gallery', galleryData, headers) + .respond(200, { + _id: '1234' + username: 'test user', + name: galleryData.name, + desc: galleryData.desc, + pics: [] + }); + this.galleryService.createGallery(galleryData); + this.$httpBackend.flush(); + this.$rootScope.$apply(); + }); + }); + + //todo: write a delete test (use expectDELETE like we used expectPOST up above) + +}); From 9e07f6824513da5b064011392326cd04075da080 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Tue, 4 Apr 2017 18:48:35 -0700 Subject: [PATCH 19/36] delete pic working --- .../thumbnail-container.html | 2 +- .../thumbnail-container.js | 7 ----- .../gallery/thumbnail/thumbnail.html | 1 - .../component/gallery/thumbnail/thumbnail.js | 6 ++-- .../gallery/upload-pic/upload-pic.js | 2 +- lab-regan/app/service/gallery-service.js | 1 - lab-regan/app/service/pic-service.js | 29 +++++++------------ lab-regan/app/view/home/home-controller.js | 2 +- 8 files changed, 18 insertions(+), 32 deletions(-) diff --git a/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html index 103c9f1b..e7d383b4 100644 --- a/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html +++ b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html @@ -2,6 +2,6 @@

{{thumbnailContainerCtrl.gallery.name}}

- +
diff --git a/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.js b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.js index 40d51021..18bf16d4 100644 --- a/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.js +++ b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.js @@ -4,15 +4,8 @@ require('./_thumbnail-container.scss'); module.exports = { template: require('./thumbnail-container.html'), - // controller: ['$log', 'picService', ThumbnailContainerController], controllerAs: 'thumbnailContainerCtrl', bindings: { gallery: '<' } }; - -// function thumbnailContainerController($log, picService){ -// $log.debug('ThumbnailContainerController'); -// -// -// }; diff --git a/lab-regan/app/component/gallery/thumbnail/thumbnail.html b/lab-regan/app/component/gallery/thumbnail/thumbnail.html index a59ac900..27a44836 100644 --- a/lab-regan/app/component/gallery/thumbnail/thumbnail.html +++ b/lab-regan/app/component/gallery/thumbnail/thumbnail.html @@ -1,5 +1,4 @@
- {{ thumbnailCtrl.pic.desc }} delete
diff --git a/lab-regan/app/component/gallery/thumbnail/thumbnail.js b/lab-regan/app/component/gallery/thumbnail/thumbnail.js index 7e5d436c..eaf924e0 100644 --- a/lab-regan/app/component/gallery/thumbnail/thumbnail.js +++ b/lab-regan/app/component/gallery/thumbnail/thumbnail.js @@ -7,7 +7,8 @@ module.exports = { controller: ['$log', 'picService', ThumbnailController], controllerAs: 'thumbnailCtrl', bindings: { - pic: '<' + pic: '<', + gallery: '<' } }; @@ -16,6 +17,7 @@ function ThumbnailController($log, picService){ this.deletePic = function(){ $log.debug('thumbnailCtrl.deletePic'); - picService.deletePic(this.pic._id); + + picService.deletePic(this.gallery, this.pic._id); } }; diff --git a/lab-regan/app/component/gallery/upload-pic/upload-pic.js b/lab-regan/app/component/gallery/upload-pic/upload-pic.js index 4abdcace..e4dcb1d4 100644 --- a/lab-regan/app/component/gallery/upload-pic/upload-pic.js +++ b/lab-regan/app/component/gallery/upload-pic/upload-pic.js @@ -17,7 +17,7 @@ function UploadPicController($log, picService){ this.pic = {}; this.uploadPic = function(){ picService.uploadGalleryPic(this.gallery, this.pic) - .then( () => { + .then( (returnobj) => { this.pic.name = null; this.pic.desc = null; this.pic.file = null; diff --git a/lab-regan/app/service/gallery-service.js b/lab-regan/app/service/gallery-service.js index a0be1fcb..f3ca61ea 100644 --- a/lab-regan/app/service/gallery-service.js +++ b/lab-regan/app/service/gallery-service.js @@ -51,7 +51,6 @@ function galleryService($q, $log, $http, authService){ }) .then( res => { $log.log('galleries retrieved'); - service.galleries = res.data; return service.galleries; }) diff --git a/lab-regan/app/service/pic-service.js b/lab-regan/app/service/pic-service.js index df0f52e7..c29e3bbe 100644 --- a/lab-regan/app/service/pic-service.js +++ b/lab-regan/app/service/pic-service.js @@ -17,7 +17,6 @@ function picService($q, $log, $http, Upload, authService){ 'Authorization': `Bearer ${token}`, 'Accept': 'application/json' }; - console.log(`${token}`, '<----TOKEN'); return Upload.upload({ url, headers, @@ -34,19 +33,17 @@ function picService($q, $log, $http, Upload, authService){ return res.data; }) .catch( err => { - $log.error(err.message, 'you lose!!!!!!!!!'); + $log.error(err.message); return $q.reject(err); }); }; - - - - service.deletePic = function(picID){ + service.deletePic = function(galleryData, picID){ $log.debug('galleryService.deletePic'); + console.log(galleryData.pics, 'WOW THERE IS THE pic array!'); return authService.getToken() .then( token => { - let url = `${__API_URL__}/api/gallery/${galleryID}/pic/${picID}`; + let url = `${__API_URL__}/api/gallery/${galleryData._id}/pic/${picID}`; let config = { headers: { 'Authorization': `Bearer ${token}` @@ -55,14 +52,13 @@ function picService($q, $log, $http, Upload, authService){ return $http.delete(url, config); }) .then( res => { - // for(let i =0; i < service.galleries.length; i++){ - // let current = service.galleries[i]; - // if(current._id === galleryID){ - // service.galleries.splice(i, 1); - // break; - // }; - // }; - $log.debug('------------ PICSERVICE.DELETEPIC -----------') + for(let i = 0; i < galleryData.pics.length; i++){ + let current = galleryData.pics[i]; + if(current._id === picID){ + galleryData.pics.splice(i, 1); + break; + }; + }; }) .catch( err => { $log.error(err.message); @@ -70,8 +66,5 @@ function picService($q, $log, $http, Upload, authService){ }); }; - - - return service; }; diff --git a/lab-regan/app/view/home/home-controller.js b/lab-regan/app/view/home/home-controller.js index fc9836c0..aac11dac 100644 --- a/lab-regan/app/view/home/home-controller.js +++ b/lab-regan/app/view/home/home-controller.js @@ -14,6 +14,7 @@ function HomeController($log, $rootScope, galleryService) { .then( galleries => { this.galleries = galleries; this.currentGallery = galleries[0]; + }); }; @@ -25,7 +26,6 @@ function HomeController($log, $rootScope, galleryService) { this.fetchGalleries(); -//TODO: shouldn't this be causing the gallery thumbnail container to show once a gallery item gets generated/displayed onto the page? How can I make this happen? $rootScope.$on('$locationChangeSuccess', () => { this.fetchGalleries(); }); From a4740f14403db3e5346a845d9e307a139f346add Mon Sep 17 00:00:00 2001 From: reganoneill Date: Tue, 4 Apr 2017 21:28:36 -0700 Subject: [PATCH 20/36] submission --- lab-regan/karma.conf.js | 3 ++- lab-regan/test/gallery-service-test.js | 23 ++++++++++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lab-regan/karma.conf.js b/lab-regan/karma.conf.js index 9371846a..6daf147a 100644 --- a/lab-regan/karma.conf.js +++ b/lab-regan/karma.conf.js @@ -16,7 +16,8 @@ module.exports = function(config) { // list of files / patterns to load in the browser files: [ - 'app/entry.js', 'test/**/*-.js', 'node_modules/angular-mocks/angular-mocks.js' + 'app/entry.js', + 'test/**/*-test.js', 'node_modules/angular-mocks/angular-mocks.js' ], diff --git a/lab-regan/test/gallery-service-test.js b/lab-regan/test/gallery-service-test.js index 2b151ccf..20a87976 100644 --- a/lab-regan/test/gallery-service-test.js +++ b/lab-regan/test/gallery-service-test.js @@ -20,11 +20,11 @@ describe('Gallery Service', function(){ let headers = { 'Content-Type': 'application/json', 'Accept': 'application/json', - 'Authorization': 'Bearer test token' + 'Authorization': 'Bearer test toker-e-no' }; this.$httpBackend.expectPOST('http://localhost:8000/api/gallery', galleryData, headers) .respond(200, { - _id: '1234' + _id: '1234', username: 'test user', name: galleryData.name, desc: galleryData.desc, @@ -36,6 +36,23 @@ describe('Gallery Service', function(){ }); }); - //todo: write a delete test (use expectDELETE like we used expectPOST up above) + describe('galleryService.deleteGallery', () => { + it('should delete agallery', () => { + let galleryData = { + _id: '1234', + name: 'example gallery', + desc: 'example description' + }; + let headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': 'Bearer test toker-e-no' + }; + + this.$httpBackend.expectDELETE(`http://localhost:8000/api/gallery/${galleryData._id}`, headers) + .respond(204); + this.galleryService.deleteGallery(galleryData); + }); + }); }); From 229f4297b3d65e2cc212a9267eecc6a46b6be1e1 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Wed, 5 Apr 2017 17:40:18 -0700 Subject: [PATCH 21/36] update test works --- lab-regan/app/service/gallery-service.js | 2 +- lab-regan/karma.conf.js | 1 + lab-regan/test/edit-gallery-component-test.js | 65 +++++++++++++++++++ lab-regan/test/gallery-item-component-test.js | 0 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 lab-regan/test/edit-gallery-component-test.js create mode 100644 lab-regan/test/gallery-item-component-test.js diff --git a/lab-regan/app/service/gallery-service.js b/lab-regan/app/service/gallery-service.js index f3ca61ea..daf835f9 100644 --- a/lab-regan/app/service/gallery-service.js +++ b/lab-regan/app/service/gallery-service.js @@ -76,7 +76,7 @@ function galleryService($q, $log, $http, authService){ return $http.put(url, galleryData, config); }) .then( res => { - for( let i=0; i < service.galleries.length; i++){ + for( let i = 0; i < service.galleries.length; i++){ let current = service.galleries[i]; if(current._id === galleryID){ service.galleries[i] = res.data; diff --git a/lab-regan/karma.conf.js b/lab-regan/karma.conf.js index 6daf147a..e93869bb 100644 --- a/lab-regan/karma.conf.js +++ b/lab-regan/karma.conf.js @@ -1,6 +1,7 @@ // Karma configuration // Generated on Tue Apr 04 2017 10:16:36 GMT-0700 (PDT) const webpack = require('./webpack.config.js'); +delete webpack.entry; module.exports = function(config) { config.set({ diff --git a/lab-regan/test/edit-gallery-component-test.js b/lab-regan/test/edit-gallery-component-test.js new file mode 100644 index 00000000..a3e42796 --- /dev/null +++ b/lab-regan/test/edit-gallery-component-test.js @@ -0,0 +1,65 @@ +'use strict'; + +describe('Edit Gallery Component', function(){ + beforeEach( () => { + angular.mock.module('cfgram'); + angular.mock.inject(($rootScope, $componentController, $httpBackend, authService) => { + this.$rootScope = $rootScope; + this.$componentController = $componentController; + this.$httpBackend = $httpBackend; + this.authService = authService; + }); + }); + + it('should contain proper component bindings', () => { + let mockBindings = { + gallery: { + name: "test gallery name", + desc: "test gallery description" + } + }; + + let editGalleryCtrl = this.$componentController('editGallery', null, mockBindings); + expect(editGalleryCtrl.gallery.name).toEqual(mockBindings.gallery.name); + expect(editGalleryCtrl.gallery.desc).toEqual(mockBindings.gallery.desc); + this.$rootScope.$apply(); + }); + + describe('editGalleryCtrl.updateGallery', () => { + it('should make a valid PUT request', () => { + let url = "http://localhost:8000/api/gallery/9999"; + let headers = { + "Accept": "application/json", + "Authorization": "Bearer test toker-e-no", + "Content-Type": "application/json" + }; + + this.$httpBackend.expectPUT(url, { + _id: '9999', + name: 'updated name', + desc: 'updated description' + }, headers).respond(200); + + let mockBindings = { + gallery: { + _id: '9999', + name: 'yarr name', + desc: 'yarr desc' + } + }; + + let editGalleryCtrl = this.$componentController('editGallery', null, mockBindings); + this.$componentController('editGallery', null, mockBindings); + editGalleryCtrl.gallery.name = 'updated name'; + editGalleryCtrl.gallery.desc = 'updated description'; + editGalleryCtrl.updateGallery(); + // .then( gallery => { + expect(editGalleryCtrl.gallery.name).toEqual('updated name'); + expect(editGalleryCtrl.gallery.desc).toEqual('updated description'); + // }) + + // this.$httpBackend.flush(); + this.$rootScope.$apply(); + }); + }); +}); diff --git a/lab-regan/test/gallery-item-component-test.js b/lab-regan/test/gallery-item-component-test.js new file mode 100644 index 00000000..e69de29b From ee46c88427d0a713f0f6fed6203a682c3a3bd67e Mon Sep 17 00:00:00 2001 From: reganoneill Date: Wed, 5 Apr 2017 23:08:14 -0700 Subject: [PATCH 22/36] completed tests --- lab-regan/test/edit-gallery-component-test.js | 9 ++- lab-regan/test/gallery-item-component-test.js | 67 +++++++++++++++++++ 2 files changed, 71 insertions(+), 5 deletions(-) diff --git a/lab-regan/test/edit-gallery-component-test.js b/lab-regan/test/edit-gallery-component-test.js index a3e42796..6bc0f02d 100644 --- a/lab-regan/test/edit-gallery-component-test.js +++ b/lab-regan/test/edit-gallery-component-test.js @@ -53,12 +53,11 @@ describe('Edit Gallery Component', function(){ editGalleryCtrl.gallery.name = 'updated name'; editGalleryCtrl.gallery.desc = 'updated description'; editGalleryCtrl.updateGallery(); - // .then( gallery => { - expect(editGalleryCtrl.gallery.name).toEqual('updated name'); - expect(editGalleryCtrl.gallery.desc).toEqual('updated description'); - // }) + expect(editGalleryCtrl.gallery.name).toEqual('updated name'); + expect(editGalleryCtrl.gallery.desc).toEqual('updated description'); - // this.$httpBackend.flush(); + + this.$httpBackend.flush(); this.$rootScope.$apply(); }); }); diff --git a/lab-regan/test/gallery-item-component-test.js b/lab-regan/test/gallery-item-component-test.js index e69de29b..55527d17 100644 --- a/lab-regan/test/gallery-item-component-test.js +++ b/lab-regan/test/gallery-item-component-test.js @@ -0,0 +1,67 @@ + + + +//workin + + + +'use strict'; + +describe('Gallery Item Component', function(){ + beforeEach( () => { + angular.mock.module('cfgram'); + angular.mock.inject(($rootScope, $componentController, $httpBackend, authService) => { + this.$rootScope = $rootScope; + this.$componentController = $componentController; + this.$httpBackend = $httpBackend; + this.authService = authService; + }); + }); + + it('should contain proper component bindings', () => { + let mockBindings = { + gallery: { + _id: '9999', + name: "test gallery name", + desc: "test gallery description" + } + }; + + let galleryItemCtrl = this.$componentController('galleryItem', null, mockBindings); + expect(galleryItemCtrl.gallery.name).toEqual(mockBindings.gallery.name); + expect(galleryItemCtrl.gallery.desc).toEqual(mockBindings.gallery.desc); + this.$rootScope.$apply(); + }); + + describe('galleryItemCtrl.deleteGallery', () => { + it('should make a valid DELETE request', () => { + let url = "http://localhost:8000/api/gallery/9999"; + let headers = { + "Authorization": "Bearer test toker-e-no", + "Accept": "application/json, text/plain, */*" + }; + + this.$httpBackend.expectDELETE(url, headers).respond(204); + + let mockBindings = { + gallery: { + _id: '9999', + name: 'yarr name', + desc: 'yarr desc' + } + }; + + let galleryItemCtrl = this.$componentController('galleryItem', null, mockBindings); + this.$componentController('galleryItem', null, mockBindings); + galleryItemCtrl.gallery.name = 'updated name'; + galleryItemCtrl.gallery.desc = 'updated description'; + galleryItemCtrl.deleteGallery(); + expect(galleryItemCtrl.gallery.name).toEqual('updated name'); + expect(galleryItemCtrl.gallery.desc).toEqual('updated description'); + + + this.$httpBackend.flush(); + this.$rootScope.$apply(); + }); + }); +}); From a8a1b48de06e40c399885a5af3037dc86b55d87e Mon Sep 17 00:00:00 2001 From: reganoneill Date: Thu, 6 Apr 2017 19:07:01 -0700 Subject: [PATCH 23/36] icons, custom directive, filter --- lab-regan/app/assets/fourIcons.png | Bin 0 -> 10668 bytes lab-regan/app/assets/spritesheet-icons.png | Bin 0 -> 12616 bytes lab-regan/app/directive/_social-icons.scss | 14 +++++++++++++ lab-regan/app/directive/social-icons.html | 6 ++++++ lab-regan/app/directive/social-icons.js | 20 +++++++++++++++++++ lab-regan/app/entry.js | 14 +++++++++++++ lab-regan/app/filter/gallery-search.js | 16 +++++++++++++++ lab-regan/app/index.html | 4 +++- lab-regan/app/scss/lib/layout/_footer.scss | 22 +++++++++++++-------- lab-regan/app/scss/main.scss | 1 + lab-regan/app/view/home/home.html | 5 ++++- lab-regan/assets/fourIcons.png | Bin 0 -> 10668 bytes lab-regan/assets/spritesheet-icons.png | Bin 0 -> 12616 bytes lab-regan/webpack.config.js | 4 ++++ 14 files changed, 96 insertions(+), 10 deletions(-) create mode 100644 lab-regan/app/assets/fourIcons.png create mode 100644 lab-regan/app/assets/spritesheet-icons.png create mode 100644 lab-regan/app/directive/_social-icons.scss create mode 100644 lab-regan/app/directive/social-icons.html create mode 100644 lab-regan/app/directive/social-icons.js create mode 100644 lab-regan/app/filter/gallery-search.js create mode 100644 lab-regan/assets/fourIcons.png create mode 100644 lab-regan/assets/spritesheet-icons.png diff --git a/lab-regan/app/assets/fourIcons.png b/lab-regan/app/assets/fourIcons.png new file mode 100644 index 0000000000000000000000000000000000000000..a0eaf23ce2f07820c203136ef8431705b9294ea6 GIT binary patch literal 10668 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 yuS6K;v-u|*Ns!d|+S}Iudp+ +

{{socialIconsCtrl.tester}}

+
    + +
+ diff --git a/lab-regan/app/directive/social-icons.js b/lab-regan/app/directive/social-icons.js new file mode 100644 index 00000000..b35c8e31 --- /dev/null +++ b/lab-regan/app/directive/social-icons.js @@ -0,0 +1,20 @@ +'use strict'; + +require('./_social-icons.scss'); + +module.exports = function(){ + return { + restrict: 'EAC', + template: require('./social-icons.html'), + controller: ['$log', SocialIconsController], + bindToController: true, + controllerAs: 'socialIconsCtrl', + scope: { + tester: '@' + } + }; +}; + +function SocialIconsController(){ + this.icons = ['youtube', 'snapchat', 'instagram'] +}; diff --git a/lab-regan/app/entry.js b/lab-regan/app/entry.js index f8762a51..8ecfd5f0 100644 --- a/lab-regan/app/entry.js +++ b/lab-regan/app/entry.js @@ -38,3 +38,17 @@ context.keys().forEach( key => { let module = context(key); cfgram.component(name, module); }); + +context = require.context('./filter/', true, /\.js$/); +context.keys().forEach( key => { + let name = camelcase(path.basename(key, '.js')); + let module = context(key); + cfgram.filter(name, module); +}); + +context = require.context('./directive/', true, /\.js$/); +context.keys().forEach( key => { + let name = camelcase(path.basename(key, '.js')); + let module = context(key); + cfgram.directive(name, module); +}); diff --git a/lab-regan/app/filter/gallery-search.js b/lab-regan/app/filter/gallery-search.js new file mode 100644 index 00000000..5dff6e13 --- /dev/null +++ b/lab-regan/app/filter/gallery-search.js @@ -0,0 +1,16 @@ +'use strict'; + +module.exports = function(){ + return function(galleries, searchTerm){ + let fuzzyRegEx = generateFuzzyRegex(searchTerm); + return galleries.filter(gallery => { + return fuzzyRegEx.test(gallery.name.toUpperCase()); + }); + }; +}; + +function generateFuzzyRegex(input){ + if(!input) return /.*/; + let fuzzyString = '.*' + input.toUpperCase().split('').join('.*') + '.*'; + return new RegExp(fuzzyString); +}; diff --git a/lab-regan/app/index.html b/lab-regan/app/index.html index 1b24412b..1971dc59 100644 --- a/lab-regan/app/index.html +++ b/lab-regan/app/index.html @@ -12,6 +12,8 @@
-
+
+ +
diff --git a/lab-regan/app/scss/lib/layout/_footer.scss b/lab-regan/app/scss/lib/layout/_footer.scss index 3b78083f..6efa3cd5 100644 --- a/lab-regan/app/scss/lib/layout/_footer.scss +++ b/lab-regan/app/scss/lib/layout/_footer.scss @@ -1,10 +1,16 @@ @import "../theme/vars"; -//TODO: REWORK SO IT DOESN'T INTERFERE WITH CONTENT - // footer { - // position: fixed; - // bottom: 0; - // height: 1em; - // width: 100%; - // background: $grey; - // } +// footer { +// div{ +// ul{ +// li{ +// &:first-child{ +// // background: blue; +// background-image: url('../../../assets/fourIcons.png') no-repeat -268px -252px; +// width: 128px; +// height: 128px; +// } +// } +// } +// } +// } diff --git a/lab-regan/app/scss/main.scss b/lab-regan/app/scss/main.scss index ebe842f7..270f25d6 100644 --- a/lab-regan/app/scss/main.scss +++ b/lab-regan/app/scss/main.scss @@ -13,3 +13,4 @@ @import "../component/gallery/edit-gallery/edit-gallery"; @import "../component/gallery/create-gallery/create-gallery"; @import "../component/gallery/thumbnail-container/thumbnail-container"; +@import "../directive/social-icons"; diff --git a/lab-regan/app/view/home/home.html b/lab-regan/app/view/home/home.html index 83474211..b1ade4ee 100644 --- a/lab-regan/app/view/home/home.html +++ b/lab-regan/app/view/home/home.html @@ -1,8 +1,11 @@
+ + +

Galleries

    - +
diff --git a/lab-regan/assets/fourIcons.png b/lab-regan/assets/fourIcons.png new file mode 100644 index 0000000000000000000000000000000000000000..a0eaf23ce2f07820c203136ef8431705b9294ea6 GIT binary patch literal 10668 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 yuS6K;v-u|*Ns!d|+S}Iudp+ Date: Thu, 6 Apr 2017 21:39:22 -0700 Subject: [PATCH 24/36] reformatted and resized sprite sheet content --- lab-regan/app/assets/fourIcons.png | Bin 10668 -> 0 bytes lab-regan/app/assets/labicons9.png | Bin 0 -> 9837 bytes lab-regan/app/assets/spritesheet-icons.png | Bin 12616 -> 0 bytes lab-regan/app/directive/_social-icons.scss | 31 +++++++++++++++++---- lab-regan/app/directive/social-icons.html | 2 +- lab-regan/app/directive/social-icons.js | 2 +- lab-regan/app/index.html | 2 +- lab-regan/assets/fourIcons.png | Bin 10668 -> 0 bytes lab-regan/assets/spritesheet-icons.png | Bin 12616 -> 0 bytes 9 files changed, 28 insertions(+), 9 deletions(-) delete mode 100644 lab-regan/app/assets/fourIcons.png create mode 100644 lab-regan/app/assets/labicons9.png delete mode 100644 lab-regan/app/assets/spritesheet-icons.png delete mode 100644 lab-regan/assets/fourIcons.png delete mode 100644 lab-regan/assets/spritesheet-icons.png diff --git a/lab-regan/app/assets/fourIcons.png b/lab-regan/app/assets/fourIcons.png deleted file mode 100644 index a0eaf23ce2f07820c203136ef8431705b9294ea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10668 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 Q{{e$uF}hrS$sy|h0pKx13;+NC literal 0 HcmV?d00001 diff --git a/lab-regan/app/assets/spritesheet-icons.png b/lab-regan/app/assets/spritesheet-icons.png deleted file mode 100644 index 393787ee63adf59796d8ab7c094083b68e909429..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12616 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 yuS6K;v-u|*Ns!d|+S}Iudp+

{{socialIconsCtrl.tester}}

diff --git a/lab-regan/app/directive/social-icons.js b/lab-regan/app/directive/social-icons.js index b35c8e31..d14562fe 100644 --- a/lab-regan/app/directive/social-icons.js +++ b/lab-regan/app/directive/social-icons.js @@ -16,5 +16,5 @@ module.exports = function(){ }; function SocialIconsController(){ - this.icons = ['youtube', 'snapchat', 'instagram'] + this.icons = ['snapchat', 'github', 'google', 'youtube'] }; diff --git a/lab-regan/app/index.html b/lab-regan/app/index.html index 1971dc59..c6929e9b 100644 --- a/lab-regan/app/index.html +++ b/lab-regan/app/index.html @@ -13,7 +13,7 @@
- +
diff --git a/lab-regan/assets/fourIcons.png b/lab-regan/assets/fourIcons.png deleted file mode 100644 index a0eaf23ce2f07820c203136ef8431705b9294ea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10668 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 yuS6K;v-u|*Ns!d|+S}Iudp+ Date: Thu, 6 Apr 2017 22:24:46 -0700 Subject: [PATCH 25/36] added native filter in thumbnail cont --- .../gallery/thumbnail-container/thumbnail-container.html | 2 +- lab-regan/app/directive/_social-icons.scss | 4 +++- lab-regan/app/directive/social-icons.html | 2 +- lab-regan/app/view/home/home.html | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html index e7d383b4..5e32c32c 100644 --- a/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html +++ b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html @@ -1,5 +1,5 @@
-

{{thumbnailContainerCtrl.gallery.name}}

+

{{thumbnailContainerCtrl.gallery.name | uppercase}}

diff --git a/lab-regan/app/directive/_social-icons.scss b/lab-regan/app/directive/_social-icons.scss index c9a63124..51264751 100644 --- a/lab-regan/app/directive/_social-icons.scss +++ b/lab-regan/app/directive/_social-icons.scss @@ -1,6 +1,7 @@ .social-media-icons { ul { - li { + li{ + a { float: left; width: 128px; height: 128px; @@ -31,3 +32,4 @@ } } } +} diff --git a/lab-regan/app/directive/social-icons.html b/lab-regan/app/directive/social-icons.html index 8dc6263b..95b07574 100644 --- a/lab-regan/app/directive/social-icons.html +++ b/lab-regan/app/directive/social-icons.html @@ -1,6 +1,6 @@ diff --git a/lab-regan/app/view/home/home.html b/lab-regan/app/view/home/home.html index b1ade4ee..1e3f98ba 100644 --- a/lab-regan/app/view/home/home.html +++ b/lab-regan/app/view/home/home.html @@ -1,7 +1,7 @@
- +

Galleries

    From 02f2477f2c3a993d989edf992104580386906ba8 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Thu, 6 Apr 2017 22:48:58 -0700 Subject: [PATCH 26/36] improved formatting --- .../gallery/thumbnail-container/_thumbnail-container.scss | 2 +- lab-regan/app/directive/_social-icons.scss | 4 ++++ lab-regan/app/scss/lib/layout/_footer.scss | 3 +++ lab-regan/app/view/home/_home.scss | 7 +++++++ lab-regan/app/view/home/home.html | 2 +- 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lab-regan/app/component/gallery/thumbnail-container/_thumbnail-container.scss b/lab-regan/app/component/gallery/thumbnail-container/_thumbnail-container.scss index 5c9221f9..251b99fb 100644 --- a/lab-regan/app/component/gallery/thumbnail-container/_thumbnail-container.scss +++ b/lab-regan/app/component/gallery/thumbnail-container/_thumbnail-container.scss @@ -1,3 +1,3 @@ .thumbnail-container { - margin: -10em 3em 5em 3em; + margin: -15em 3em 1em 3em; } diff --git a/lab-regan/app/directive/_social-icons.scss b/lab-regan/app/directive/_social-icons.scss index 51264751..fb36502d 100644 --- a/lab-regan/app/directive/_social-icons.scss +++ b/lab-regan/app/directive/_social-icons.scss @@ -1,10 +1,14 @@ .social-media-icons { ul { li{ + margin-top: 1em; + margin-left: 10%; a { float: left; width: 128px; height: 128px; + margin-right: 8px; + &:first-child{ background: url('../assets/labicons9.png') no-repeat 0 0; width: 52px; diff --git a/lab-regan/app/scss/lib/layout/_footer.scss b/lab-regan/app/scss/lib/layout/_footer.scss index 6efa3cd5..fc441b69 100644 --- a/lab-regan/app/scss/lib/layout/_footer.scss +++ b/lab-regan/app/scss/lib/layout/_footer.scss @@ -14,3 +14,6 @@ // } // } // } +footer { + height: 4em; +} diff --git a/lab-regan/app/view/home/_home.scss b/lab-regan/app/view/home/_home.scss index d71f5b45..fbb35988 100644 --- a/lab-regan/app/view/home/_home.scss +++ b/lab-regan/app/view/home/_home.scss @@ -14,4 +14,11 @@ font-weight: bold; } } + .fuzzy-input { + margin-left: 10%; + margin-bottom: 2em; + width: 35%; + height: 3em; + border-radius: 8px; + } } diff --git a/lab-regan/app/view/home/home.html b/lab-regan/app/view/home/home.html index 1e3f98ba..a40a9e34 100644 --- a/lab-regan/app/view/home/home.html +++ b/lab-regan/app/view/home/home.html @@ -1,7 +1,7 @@
    - +

    Galleries

      From f88532553d2a78d2303e451699b2c68d1d1ef38e Mon Sep 17 00:00:00 2001 From: reganoneill Date: Thu, 6 Apr 2017 23:45:22 -0700 Subject: [PATCH 27/36] submission --- lab-regan/app/component/gallery/upload-pic/upload-pic.html | 4 ++-- lab-regan/app/view/home/home.html | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lab-regan/app/component/gallery/upload-pic/upload-pic.html b/lab-regan/app/component/gallery/upload-pic/upload-pic.html index 6d55f558..0fff7540 100644 --- a/lab-regan/app/component/gallery/upload-pic/upload-pic.html +++ b/lab-regan/app/component/gallery/upload-pic/upload-pic.html @@ -2,8 +2,8 @@

      upload a new pic

      - - + +

      Galleries

      +

      {{homeCtrl.galleries[0]}}

        - +
      - +
    From 756ad5cdc94090cbc5adfe5fbbcf0c1a143c7b34 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Sun, 9 Apr 2017 23:09:59 -0700 Subject: [PATCH 28/36] footer links active --- lab-regan/app/directive/social-icons.html | 2 +- lab-regan/app/service/pic-service.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lab-regan/app/directive/social-icons.html b/lab-regan/app/directive/social-icons.html index 95b07574..5300df0a 100644 --- a/lab-regan/app/directive/social-icons.html +++ b/lab-regan/app/directive/social-icons.html @@ -1,6 +1,6 @@ diff --git a/lab-regan/app/service/pic-service.js b/lab-regan/app/service/pic-service.js index c29e3bbe..521b1964 100644 --- a/lab-regan/app/service/pic-service.js +++ b/lab-regan/app/service/pic-service.js @@ -9,7 +9,7 @@ function picService($q, $log, $http, Upload, authService){ service.uploadGalleryPic = function(galleryData, picData){ $log.debug('service.uploadGalleryPic'); - + console.log(galleryData); return authService.getToken() .then( token => { let url = `${__API_URL__}/api/gallery/${galleryData._id}/pic`; From ed6f44a2fe93fc835cf1730cee6722b4be5d5653 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Mon, 10 Apr 2017 12:19:09 -0700 Subject: [PATCH 29/36] updated styles for bootstrap implementation --- .../gallery/create-gallery/_create-gallery.scss | 15 +++++++++++++-- .../gallery/gallery-item/_gallery-item.scss | 2 +- .../component/gallery/upload-pic/_upload-pic.scss | 7 +++++++ lab-regan/app/scss/lib/layout/_main.scss | 13 ++++++------- lab-regan/app/view/home/_home.scss | 2 +- lab-regan/app/view/home/home.html | 1 - 6 files changed, 28 insertions(+), 12 deletions(-) diff --git a/lab-regan/app/component/gallery/create-gallery/_create-gallery.scss b/lab-regan/app/component/gallery/create-gallery/_create-gallery.scss index df781bcb..4b850800 100644 --- a/lab-regan/app/component/gallery/create-gallery/_create-gallery.scss +++ b/lab-regan/app/component/gallery/create-gallery/_create-gallery.scss @@ -1,7 +1,18 @@ .create-gallery{ + margin-bottom: 2.5em; h2{ padding-left: 10%; - margin-bottom: -2em; - padding-top: 2em; + margin-bottom: -1em; + padding-top: 1.5em; + } + form { + width: 90%; + margin: auto; + input { + width: 100%; + } + .btn-std { + width: 10%; + } } } diff --git a/lab-regan/app/component/gallery/gallery-item/_gallery-item.scss b/lab-regan/app/component/gallery/gallery-item/_gallery-item.scss index fd396bc4..e85b610d 100644 --- a/lab-regan/app/component/gallery/gallery-item/_gallery-item.scss +++ b/lab-regan/app/component/gallery/gallery-item/_gallery-item.scss @@ -2,7 +2,7 @@ .gallery-item { .current-item { - width: 80%; + width: 90%; margin: 0 auto; background: $site-secondary; padding: 0.75em; diff --git a/lab-regan/app/component/gallery/upload-pic/_upload-pic.scss b/lab-regan/app/component/gallery/upload-pic/_upload-pic.scss index e69de29b..256064e6 100644 --- a/lab-regan/app/component/gallery/upload-pic/_upload-pic.scss +++ b/lab-regan/app/component/gallery/upload-pic/_upload-pic.scss @@ -0,0 +1,7 @@ +.upload-pic { + form{ + input{ + margin: none; + } + } +} diff --git a/lab-regan/app/scss/lib/layout/_main.scss b/lab-regan/app/scss/lib/layout/_main.scss index 8ebc30ae..67c93c9a 100644 --- a/lab-regan/app/scss/lib/layout/_main.scss +++ b/lab-regan/app/scss/lib/layout/_main.scss @@ -2,21 +2,20 @@ form { width: 100%; - padding-top: 2.5em; + padding-top: 1em; h3 { - margin-left: 10%; - margin-bottom: 1.5%; + margin-bottom: 1.25%; } input { display: block; width: 80%; - height: 4em; - margin: auto; - margin-bottom: 3em; + height: 2.5em; + // margin: auto; + margin-bottom: 0.5em; border-radius: 8px; } .btn-std { - width: 25%; + // width: 25%; margin-right: 10%; } } diff --git a/lab-regan/app/view/home/_home.scss b/lab-regan/app/view/home/_home.scss index fbb35988..ed8751fd 100644 --- a/lab-regan/app/view/home/_home.scss +++ b/lab-regan/app/view/home/_home.scss @@ -3,7 +3,7 @@ .home { background: $grey; h2{ - padding-left: 10%; + padding-left: 5%; font-weight: bold; } diff --git a/lab-regan/app/view/home/home.html b/lab-regan/app/view/home/home.html index 05cf7335..109767f8 100644 --- a/lab-regan/app/view/home/home.html +++ b/lab-regan/app/view/home/home.html @@ -4,7 +4,6 @@

    Galleries

    -

    {{homeCtrl.galleries[0]}}

    From e7332c153c51cf6647a0aca5e411cabe2907c19c Mon Sep 17 00:00:00 2001 From: reganoneill Date: Mon, 10 Apr 2017 13:46:12 -0700 Subject: [PATCH 30/36] implemented bootstrap ui and further styling --- .../lib/bootstrap/_custom-bootstrap-vars.scss | 883 ++++++++++++++++++ .../scss/lib/bootstrap/_custom-bootstrap.scss | 50 + 2 files changed, 933 insertions(+) create mode 100644 lab-regan/app/scss/lib/bootstrap/_custom-bootstrap-vars.scss create mode 100644 lab-regan/app/scss/lib/bootstrap/_custom-bootstrap.scss diff --git a/lab-regan/app/scss/lib/bootstrap/_custom-bootstrap-vars.scss b/lab-regan/app/scss/lib/bootstrap/_custom-bootstrap-vars.scss new file mode 100644 index 00000000..ce8ef272 --- /dev/null +++ b/lab-regan/app/scss/lib/bootstrap/_custom-bootstrap-vars.scss @@ -0,0 +1,883 @@ +$bootstrap-sass-asset-helper: true !default; +// +// Variables +// -------------------------------------------------- +$app-primary: #a7f7fa; +$app-secondary: #7fa7af; +$app-disabled: #abeaeb; +$app-active: #fa7fa7; +$app-success: #a7ff7a; +$app-error: #ff7a7a; +$app-warn: #ffa77a; +$app-info: #7aa7ff; +$app-white: #fff; +$app-black: #000; + +//== Colors +// +//## Gray and brand colors for use across Bootstrap. + +$gray-base: #000 !default; +$gray-darker: lighten($gray-base, 13.5%) !default; // #222 +$gray-dark: lighten($gray-base, 20%) !default; // #333 +$gray: lighten($gray-base, 33.5%) !default; // #555 +$gray-light: lighten($gray-base, 46.7%) !default; // #777 +$gray-lighter: lighten($gray-base, 93.5%) !default; // #eee + +$brand-primary: darken(#428bca, 6.5%) !default; // #337ab7 +$brand-success: #5cb85c !default; +$brand-info: #5bc0de !default; +$brand-warning: #f0ad4e !default; +$brand-danger: #d9534f !default; + + +//== Scaffolding +// +//## Settings for some of the most global styles. + +//** Background color for ``. +$body-bg: #fff !default; +//** Global text color on ``. +$text-color: $gray-dark !default; + +//** Global textual link color. +$link-color: $brand-primary !default; +//** Link hover color set via `darken()` function. +$link-hover-color: darken($link-color, 15%) !default; +//** Link hover decoration. +$link-hover-decoration: underline !default; + + +//== Typography +// +//## Font, line-height, and color for body text, headings, and more. + +$font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif !default; +$font-family-serif: Georgia, "Times New Roman", Times, serif !default; +//** Default monospace fonts for ``, ``, and `
    `.
    +$font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace !default;
    +$font-family-base:        $font-family-sans-serif !default;
    +
    +$font-size-base:          14px !default;
    +$font-size-large:         ceil(($font-size-base * 1.25)) !default; // ~18px
    +$font-size-small:         ceil(($font-size-base * 0.85)) !default; // ~12px
    +
    +$font-size-h1:            floor(($font-size-base * 2.6)) !default; // ~36px
    +$font-size-h2:            floor(($font-size-base * 1.15)) !default; // 
    +$font-size-h3:            ceil(($font-size-base * 1)) !default; // ~24px
    +$font-size-h4:            ceil(($font-size-base * 1.25)) !default; // ~18px
    +$font-size-h5:            $font-size-base !default;
    +$font-size-h6:            ceil(($font-size-base * 0.85)) !default; // ~12px
    +
    +//** Unit-less `line-height` for use in components like buttons.
    +$line-height-base:        1.428571429 !default; // 20/14
    +//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
    +$line-height-computed:    floor(($font-size-base * $line-height-base)) !default; // ~20px
    +
    +//** By default, this inherits from the ``.
    +$headings-font-family:    inherit !default;
    +$headings-font-weight:    500 !default;
    +$headings-line-height:    1.1 !default;
    +$headings-color:          inherit !default;
    +
    +
    +//== Iconography
    +//
    +//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
    +
    +//** Load fonts from this directory.
    +
    +// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.
    +// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.
    +$icon-font-path: if($bootstrap-sass-asset-helper, "bootstrap/", "../fonts/bootstrap/") !default;
    +
    +//** File name for all font files.
    +$icon-font-name:          "glyphicons-halflings-regular" !default;
    +//** Element ID within SVG icon file.
    +$icon-font-svg-id:        "glyphicons_halflingsregular" !default;
    +
    +
    +//== Components
    +//
    +//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
    +
    +$padding-base-vertical:     6px !default;
    +$padding-base-horizontal:   12px !default;
    +
    +$padding-large-vertical:    10px !default;
    +$padding-large-horizontal:  16px !default;
    +
    +$padding-small-vertical:    5px !default;
    +$padding-small-horizontal:  10px !default;
    +
    +$padding-xs-vertical:       1px !default;
    +$padding-xs-horizontal:     5px !default;
    +
    +$line-height-large:         1.3333333 !default; // extra decimals for Win 8.1 Chrome
    +$line-height-small:         1.5 !default;
    +
    +$border-radius-base:        4px !default;
    +$border-radius-large:       6px !default;
    +$border-radius-small:       3px !default;
    +
    +//** Global color for active items (e.g., navs or dropdowns).
    +$component-active-color:    #fff !default;
    +//** Global background color for active items (e.g., navs or dropdowns).
    +$component-active-bg:       $brand-primary !default;
    +
    +//** Width of the `border` for generating carets that indicate dropdowns.
    +$caret-width-base:          4px !default;
    +//** Carets increase slightly in size for larger components.
    +$caret-width-large:         5px !default;
    +
    +
    +//== Tables
    +//
    +//## Customizes the `.table` component with basic values, each used across all table variations.
    +
    +//** Padding for ``s and ``s.
    +$table-cell-padding:            8px !default;
    +//** Padding for cells in `.table-condensed`.
    +$table-condensed-cell-padding:  5px !default;
    +
    +//** Default background color used for all tables.
    +$table-bg:                      transparent !default;
    +//** Background color used for `.table-striped`.
    +$table-bg-accent:               #f9f9f9 !default;
    +//** Background color used for `.table-hover`.
    +$table-bg-hover:                #f5f5f5 !default;
    +$table-bg-active:               $table-bg-hover !default;
    +
    +//** Border color for table and cell borders.
    +$table-border-color:            #ddd !default;
    +
    +
    +//== Buttons
    +//
    +//## For each of Bootstrap's buttons, define text, background and border color.
    +
    +$btn-font-weight:                normal !default;
    +
    +$btn-default-color:              #333 !default;
    +$btn-default-bg:                 #fff !default;
    +$btn-default-border:             #ccc !default;
    +
    +$btn-primary-color:              #fff !default;
    +$btn-primary-bg:                 $brand-primary !default;
    +$btn-primary-border:             darken($btn-primary-bg, 5%) !default;
    +
    +$btn-success-color:              #fff !default;
    +$btn-success-bg:                 $brand-success !default;
    +$btn-success-border:             darken($btn-success-bg, 5%) !default;
    +
    +$btn-info-color:                 #fff !default;
    +$btn-info-bg:                    $brand-info !default;
    +$btn-info-border:                darken($btn-info-bg, 5%) !default;
    +
    +$btn-warning-color:              #fff !default;
    +$btn-warning-bg:                 $brand-warning !default;
    +$btn-warning-border:             darken($btn-warning-bg, 5%) !default;
    +
    +$btn-danger-color:               #fff !default;
    +$btn-danger-bg:                  $brand-danger !default;
    +$btn-danger-border:              darken($btn-danger-bg, 5%) !default;
    +
    +$btn-link-disabled-color:        $gray-light !default;
    +
    +// Allows for customizing button radius independently from global border radius
    +$btn-border-radius-base:         $border-radius-base !default;
    +$btn-border-radius-large:        $border-radius-large !default;
    +$btn-border-radius-small:        $border-radius-small !default;
    +
    +
    +//== Forms
    +//
    +//##
    +
    +//** `` background color
    +$input-bg:                       #fff !default;
    +//** `` background color
    +$input-bg-disabled:              $gray-lighter !default;
    +
    +//** Text color for ``s
    +$input-color:                    $gray !default;
    +//** `` border color
    +$input-border:                   #ccc !default;
    +
    +// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
    +//** Default `.form-control` border radius
    +// This has no effect on ``s in CSS.
    +$input-border-radius:            $border-radius-base !default;
    +//** Large `.form-control` border radius
    +$input-border-radius-large:      $border-radius-large !default;
    +//** Small `.form-control` border radius
    +$input-border-radius-small:      $border-radius-small !default;
    +
    +//** Border color for inputs on focus
    +$input-border-focus:             #66afe9 !default;
    +
    +//** Placeholder text color
    +$input-color-placeholder:        #999 !default;
    +
    +//** Default `.form-control` height
    +$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
    +//** Large `.form-control` height
    +$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;
    +//** Small `.form-control` height
    +$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;
    +
    +//** `.form-group` margin
    +$form-group-margin-bottom:       15px !default;
    +
    +$legend-color:                   $gray-dark !default;
    +$legend-border-color:            #e5e5e5 !default;
    +
    +//** Background color for textual input addons
    +$input-group-addon-bg:           $gray-lighter !default;
    +//** Border color for textual input addons
    +$input-group-addon-border-color: $input-border !default;
    +
    +//** Disabled cursor for form controls and buttons.
    +$cursor-disabled:                not-allowed !default;
    +
    +
    +//== Dropdowns
    +//
    +//## Dropdown menu container and contents.
    +
    +//** Background for the dropdown menu.
    +$dropdown-bg:                    #fff !default;
    +//** Dropdown menu `border-color`.
    +$dropdown-border:                rgba(0,0,0,.15) !default;
    +//** Dropdown menu `border-color` **for IE8**.
    +$dropdown-fallback-border:       #ccc !default;
    +//** Divider color for between dropdown items.
    +$dropdown-divider-bg:            #e5e5e5 !default;
    +
    +//** Dropdown link text color.
    +$dropdown-link-color:            $gray-dark !default;
    +//** Hover color for dropdown links.
    +$dropdown-link-hover-color:      darken($gray-dark, 5%) !default;
    +//** Hover background for dropdown links.
    +$dropdown-link-hover-bg:         #f5f5f5 !default;
    +
    +//** Active dropdown menu item text color.
    +$dropdown-link-active-color:     $component-active-color !default;
    +//** Active dropdown menu item background color.
    +$dropdown-link-active-bg:        $component-active-bg !default;
    +
    +//** Disabled dropdown menu item background color.
    +$dropdown-link-disabled-color:   $gray-light !default;
    +
    +//** Text color for headers within dropdown menus.
    +$dropdown-header-color:          $gray-light !default;
    +
    +//** Deprecated `$dropdown-caret-color` as of v3.1.0
    +$dropdown-caret-color:           #000 !default;
    +
    +
    +//-- Z-index master list
    +//
    +// Warning: Avoid customizing these values. They're used for a bird's eye view
    +// of components dependent on the z-axis and are designed to all work together.
    +//
    +// Note: These variables are not generated into the Customizer.
    +
    +$zindex-navbar:            1000 !default;
    +$zindex-dropdown:          1000 !default;
    +$zindex-popover:           1060 !default;
    +$zindex-tooltip:           1070 !default;
    +$zindex-navbar-fixed:      1030 !default;
    +$zindex-modal-background:  1040 !default;
    +$zindex-modal:             1050 !default;
    +
    +
    +//== Media queries breakpoints
    +//
    +//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
    +
    +// Extra small screen / phone
    +//** Deprecated `$screen-xs` as of v3.0.1
    +$screen-xs:                  480px !default;
    +//** Deprecated `$screen-xs-min` as of v3.2.0
    +$screen-xs-min:              $screen-xs !default;
    +//** Deprecated `$screen-phone` as of v3.0.1
    +$screen-phone:               $screen-xs-min !default;
    +
    +// Small screen / tablet
    +//** Deprecated `$screen-sm` as of v3.0.1
    +$screen-sm:                  768px !default;
    +$screen-sm-min:              $screen-sm !default;
    +//** Deprecated `$screen-tablet` as of v3.0.1
    +$screen-tablet:              $screen-sm-min !default;
    +
    +// Medium screen / desktop
    +//** Deprecated `$screen-md` as of v3.0.1
    +$screen-md:                  992px !default;
    +$screen-md-min:              $screen-md !default;
    +//** Deprecated `$screen-desktop` as of v3.0.1
    +$screen-desktop:             $screen-md-min !default;
    +
    +// Large screen / wide desktop
    +//** Deprecated `$screen-lg` as of v3.0.1
    +$screen-lg:                  1200px !default;
    +$screen-lg-min:              $screen-lg !default;
    +//** Deprecated `$screen-lg-desktop` as of v3.0.1
    +$screen-lg-desktop:          $screen-lg-min !default;
    +
    +// So media queries don't overlap when required, provide a maximum
    +$screen-xs-max:              ($screen-sm-min - 1) !default;
    +$screen-sm-max:              ($screen-md-min - 1) !default;
    +$screen-md-max:              ($screen-lg-min - 1) !default;
    +
    +
    +//== Grid system
    +//
    +//## Define your custom responsive grid.
    +
    +//** Number of columns in the grid.
    +$grid-columns:              12 !default;
    +//** Padding between columns. Gets divided in half for the left and right.
    +$grid-gutter-width:         30px !default;
    +// Navbar collapse
    +//** Point at which the navbar becomes uncollapsed.
    +$grid-float-breakpoint:     $screen-sm-min !default;
    +//** Point at which the navbar begins collapsing.
    +$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
    +
    +
    +//== Container sizes
    +//
    +//## Define the maximum width of `.container` for different screen sizes.
    +
    +// Small screen / tablet
    +$container-tablet:             (720px + $grid-gutter-width) !default;
    +//** For `$screen-sm-min` and up.
    +$container-sm:                 $container-tablet !default;
    +
    +// Medium screen / desktop
    +$container-desktop:            (940px + $grid-gutter-width) !default;
    +//** For `$screen-md-min` and up.
    +$container-md:                 $container-desktop !default;
    +
    +// Large screen / wide desktop
    +$container-large-desktop:      (1140px + $grid-gutter-width) !default;
    +//** For `$screen-lg-min` and up.
    +$container-lg:                 $container-large-desktop !default;
    +
    +
    +//== Navbar
    +//
    +//##
    +
    +// Basics of a navbar
    +$navbar-height:                    50px !default;
    +$navbar-margin-bottom:             $line-height-computed !default;
    +$navbar-border-radius:             $border-radius-base !default;
    +$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;
    +$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;
    +$navbar-collapse-max-height:       340px !default;
    +
    +$navbar-default-color:             #777 !default;
    +$navbar-default-bg:                #f8f8f8 !default;
    +$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;
    +
    +// Navbar links
    +$navbar-default-link-color:                #777 !default;
    +$navbar-default-link-hover-color:          #333 !default;
    +$navbar-default-link-hover-bg:             transparent !default;
    +$navbar-default-link-active-color:         #555 !default;
    +$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;
    +$navbar-default-link-disabled-color:       #ccc !default;
    +$navbar-default-link-disabled-bg:          transparent !default;
    +
    +// Navbar brand label
    +$navbar-default-brand-color:               $navbar-default-link-color !default;
    +$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;
    +$navbar-default-brand-hover-bg:            transparent !default;
    +
    +// Navbar toggle
    +$navbar-default-toggle-hover-bg:           #ddd !default;
    +$navbar-default-toggle-icon-bar-bg:        #888 !default;
    +$navbar-default-toggle-border-color:       #ddd !default;
    +
    +
    +//=== Inverted navbar
    +// Reset inverted navbar basics
    +$navbar-inverse-color:                      lighten($gray-light, 15%) !default;
    +$navbar-inverse-bg:                         #222 !default;
    +$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;
    +
    +// Inverted navbar links
    +$navbar-inverse-link-color:                 lighten($gray-light, 15%) !default;
    +$navbar-inverse-link-hover-color:           #fff !default;
    +$navbar-inverse-link-hover-bg:              transparent !default;
    +$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;
    +$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;
    +$navbar-inverse-link-disabled-color:        #444 !default;
    +$navbar-inverse-link-disabled-bg:           transparent !default;
    +
    +// Inverted navbar brand label
    +$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;
    +$navbar-inverse-brand-hover-color:          #fff !default;
    +$navbar-inverse-brand-hover-bg:             transparent !default;
    +
    +// Inverted navbar toggle
    +$navbar-inverse-toggle-hover-bg:            #333 !default;
    +$navbar-inverse-toggle-icon-bar-bg:         #fff !default;
    +$navbar-inverse-toggle-border-color:        #333 !default;
    +
    +
    +//== Navs
    +//
    +//##
    +
    +//=== Shared nav styles
    +$nav-link-padding:                          10px 15px !default;
    +$nav-link-hover-bg:                         $gray-lighter !default;
    +
    +$nav-disabled-link-color:                   $gray-light !default;
    +$nav-disabled-link-hover-color:             $gray-light !default;
    +
    +//== Tabs
    +$nav-tabs-border-color:                     #ddd !default;
    +
    +$nav-tabs-link-hover-border-color:          $gray-lighter !default;
    +
    +$nav-tabs-active-link-hover-bg:             $body-bg !default;
    +$nav-tabs-active-link-hover-color:          $gray !default;
    +$nav-tabs-active-link-hover-border-color:   #ddd !default;
    +
    +$nav-tabs-justified-link-border-color:            #ddd !default;
    +$nav-tabs-justified-active-link-border-color:     $body-bg !default;
    +
    +//== Pills
    +$nav-pills-border-radius:                   $border-radius-base !default;
    +$nav-pills-active-link-hover-bg:            $component-active-bg !default;
    +$nav-pills-active-link-hover-color:         $component-active-color !default;
    +
    +
    +//== Pagination
    +//
    +//##
    +
    +$pagination-color:                     $link-color !default;
    +$pagination-bg:                        #fff !default;
    +$pagination-border:                    #ddd !default;
    +
    +$pagination-hover-color:               $link-hover-color !default;
    +$pagination-hover-bg:                  $gray-lighter !default;
    +$pagination-hover-border:              #ddd !default;
    +
    +$pagination-active-color:              #fff !default;
    +$pagination-active-bg:                 $brand-primary !default;
    +$pagination-active-border:             $brand-primary !default;
    +
    +$pagination-disabled-color:            $gray-light !default;
    +$pagination-disabled-bg:               #fff !default;
    +$pagination-disabled-border:           #ddd !default;
    +
    +
    +//== Pager
    +//
    +//##
    +
    +$pager-bg:                             $pagination-bg !default;
    +$pager-border:                         $pagination-border !default;
    +$pager-border-radius:                  15px !default;
    +
    +$pager-hover-bg:                       $pagination-hover-bg !default;
    +
    +$pager-active-bg:                      $pagination-active-bg !default;
    +$pager-active-color:                   $pagination-active-color !default;
    +
    +$pager-disabled-color:                 $pagination-disabled-color !default;
    +
    +
    +//== Jumbotron
    +//
    +//##
    +
    +$jumbotron-padding:              30px !default;
    +$jumbotron-color:                inherit !default;
    +$jumbotron-bg:                   $gray-lighter !default;
    +$jumbotron-heading-color:        inherit !default;
    +$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;
    +$jumbotron-heading-font-size:    ceil(($font-size-base * 4.5)) !default;
    +
    +
    +//== Form states and alerts
    +//
    +//## Define colors for form feedback states and, by default, alerts.
    +
    +$state-success-text:             #3c763d !default;
    +$state-success-bg:               #dff0d8 !default;
    +$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%) !default;
    +
    +$state-info-text:                #31708f !default;
    +$state-info-bg:                  #d9edf7 !default;
    +$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%) !default;
    +
    +$state-warning-text:             #8a6d3b !default;
    +$state-warning-bg:               #fcf8e3 !default;
    +$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%) !default;
    +
    +$state-danger-text:              #a94442 !default;
    +$state-danger-bg:                #f2dede !default;
    +$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%) !default;
    +
    +
    +//== Tooltips
    +//
    +//##
    +
    +//** Tooltip max width
    +$tooltip-max-width:           200px !default;
    +//** Tooltip text color
    +$tooltip-color:               #fff !default;
    +//** Tooltip background color
    +$tooltip-bg:                  #000 !default;
    +$tooltip-opacity:             .9 !default;
    +
    +//** Tooltip arrow width
    +$tooltip-arrow-width:         5px !default;
    +//** Tooltip arrow color
    +$tooltip-arrow-color:         $tooltip-bg !default;
    +
    +
    +//== Popovers
    +//
    +//##
    +
    +//** Popover body background color
    +$popover-bg:                          #fff !default;
    +//** Popover maximum width
    +$popover-max-width:                   276px !default;
    +//** Popover border color
    +$popover-border-color:                rgba(0,0,0,.2) !default;
    +//** Popover fallback border color
    +$popover-fallback-border-color:       #ccc !default;
    +
    +//** Popover title background color
    +$popover-title-bg:                    darken($popover-bg, 3%) !default;
    +
    +//** Popover arrow width
    +$popover-arrow-width:                 10px !default;
    +//** Popover arrow color
    +$popover-arrow-color:                 $popover-bg !default;
    +
    +//** Popover outer arrow width
    +$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;
    +//** Popover outer arrow color
    +$popover-arrow-outer-color:           fade_in($popover-border-color, 0.05) !default;
    +//** Popover outer arrow fallback color
    +$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;
    +
    +
    +//== Labels
    +//
    +//##
    +
    +//** Default label background color
    +$label-default-bg:            $gray-light !default;
    +//** Primary label background color
    +$label-primary-bg:            $brand-primary !default;
    +//** Success label background color
    +$label-success-bg:            $brand-success !default;
    +//** Info label background color
    +$label-info-bg:               $brand-info !default;
    +//** Warning label background color
    +$label-warning-bg:            $brand-warning !default;
    +//** Danger label background color
    +$label-danger-bg:             $brand-danger !default;
    +
    +//** Default label text color
    +$label-color:                 #fff !default;
    +//** Default text color of a linked label
    +$label-link-hover-color:      #fff !default;
    +
    +
    +//== Modals
    +//
    +//##
    +
    +//** Padding applied to the modal body
    +$modal-inner-padding:         15px !default;
    +
    +//** Padding applied to the modal title
    +$modal-title-padding:         15px !default;
    +//** Modal title line-height
    +$modal-title-line-height:     $line-height-base !default;
    +
    +//** Background color of modal content area
    +$modal-content-bg:                             #fff !default;
    +//** Modal content border color
    +$modal-content-border-color:                   rgba(0,0,0,.2) !default;
    +//** Modal content border color **for IE8**
    +$modal-content-fallback-border-color:          #999 !default;
    +
    +//** Modal backdrop background color
    +$modal-backdrop-bg:           #000 !default;
    +//** Modal backdrop opacity
    +$modal-backdrop-opacity:      .5 !default;
    +//** Modal header border color
    +$modal-header-border-color:   #e5e5e5 !default;
    +//** Modal footer border color
    +$modal-footer-border-color:   $modal-header-border-color !default;
    +
    +$modal-lg:                    900px !default;
    +$modal-md:                    600px !default;
    +$modal-sm:                    300px !default;
    +
    +
    +//== Alerts
    +//
    +//## Define alert colors, border radius, and padding.
    +
    +$alert-padding:               15px !default;
    +$alert-border-radius:         $border-radius-base !default;
    +$alert-link-font-weight:      bold !default;
    +
    +$alert-success-bg:            $state-success-bg !default;
    +$alert-success-text:          $state-success-text !default;
    +$alert-success-border:        $state-success-border !default;
    +
    +$alert-info-bg:               $state-info-bg !default;
    +$alert-info-text:             $state-info-text !default;
    +$alert-info-border:           $state-info-border !default;
    +
    +$alert-warning-bg:            $state-warning-bg !default;
    +$alert-warning-text:          $state-warning-text !default;
    +$alert-warning-border:        $state-warning-border !default;
    +
    +$alert-danger-bg:             $state-danger-bg !default;
    +$alert-danger-text:           $state-danger-text !default;
    +$alert-danger-border:         $state-danger-border !default;
    +
    +
    +//== Progress bars
    +//
    +//##
    +
    +//** Background color of the whole progress component
    +$progress-bg:                 #f5f5f5 !default;
    +//** Progress bar text color
    +$progress-bar-color:          #fff !default;
    +//** Variable for setting rounded corners on progress bar.
    +$progress-border-radius:      $border-radius-base !default;
    +
    +//** Default progress bar color
    +$progress-bar-bg:             $brand-primary !default;
    +//** Success progress bar color
    +$progress-bar-success-bg:     $brand-success !default;
    +//** Warning progress bar color
    +$progress-bar-warning-bg:     $brand-warning !default;
    +//** Danger progress bar color
    +$progress-bar-danger-bg:      $brand-danger !default;
    +//** Info progress bar color
    +$progress-bar-info-bg:        $brand-info !default;
    +
    +
    +//== List group
    +//
    +//##
    +
    +//** Background color on `.list-group-item`
    +$list-group-bg:                 #fff !default;
    +//** `.list-group-item` border color
    +$list-group-border:             #ddd !default;
    +//** List group border radius
    +$list-group-border-radius:      $border-radius-base !default;
    +
    +//** Background color of single list items on hover
    +$list-group-hover-bg:           #f5f5f5 !default;
    +//** Text color of active list items
    +$list-group-active-color:       $component-active-color !default;
    +//** Background color of active list items
    +$list-group-active-bg:          $component-active-bg !default;
    +//** Border color of active list elements
    +$list-group-active-border:      $list-group-active-bg !default;
    +//** Text color for content within active list items
    +$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;
    +
    +//** Text color of disabled list items
    +$list-group-disabled-color:      $gray-light !default;
    +//** Background color of disabled list items
    +$list-group-disabled-bg:         $gray-lighter !default;
    +//** Text color for content within disabled list items
    +$list-group-disabled-text-color: $list-group-disabled-color !default;
    +
    +$list-group-link-color:         #555 !default;
    +$list-group-link-hover-color:   $list-group-link-color !default;
    +$list-group-link-heading-color: #333 !default;
    +
    +
    +//== Panels
    +//
    +//##
    +
    +$panel-bg:                    #fff !default;
    +$panel-body-padding:          15px !default;
    +$panel-heading-padding:       10px 15px !default;
    +$panel-footer-padding:        $panel-heading-padding !default;
    +$panel-border-radius:         $border-radius-base !default;
    +
    +//** Border color for elements within panels
    +$panel-inner-border:          #ddd !default;
    +$panel-footer-bg:             #f5f5f5 !default;
    +
    +$panel-default-text:          $gray-dark !default;
    +$panel-default-border:        #ddd !default;
    +$panel-default-heading-bg:    #f5f5f5 !default;
    +
    +$panel-primary-text:          #fff !default;
    +$panel-primary-border:        $brand-primary !default;
    +$panel-primary-heading-bg:    $brand-primary !default;
    +
    +$panel-success-text:          $state-success-text !default;
    +$panel-success-border:        $state-success-border !default;
    +$panel-success-heading-bg:    $state-success-bg !default;
    +
    +$panel-info-text:             $state-info-text !default;
    +$panel-info-border:           $state-info-border !default;
    +$panel-info-heading-bg:       $state-info-bg !default;
    +
    +$panel-warning-text:          $state-warning-text !default;
    +$panel-warning-border:        $state-warning-border !default;
    +$panel-warning-heading-bg:    $state-warning-bg !default;
    +
    +$panel-danger-text:           $state-danger-text !default;
    +$panel-danger-border:         $state-danger-border !default;
    +$panel-danger-heading-bg:     $state-danger-bg !default;
    +
    +
    +//== Thumbnails
    +//
    +//##
    +
    +//** Padding around the thumbnail image
    +$thumbnail-padding:           4px !default;
    +//** Thumbnail background color
    +$thumbnail-bg:                $body-bg !default;
    +//** Thumbnail border color
    +$thumbnail-border:            #ddd !default;
    +//** Thumbnail border radius
    +$thumbnail-border-radius:     $border-radius-base !default;
    +
    +//** Custom text color for thumbnail captions
    +$thumbnail-caption-color:     $text-color !default;
    +//** Padding around the thumbnail caption
    +$thumbnail-caption-padding:   9px !default;
    +
    +
    +//== Wells
    +//
    +//##
    +
    +$well-bg:                     #f5f5f5 !default;
    +$well-border:                 darken($well-bg, 7%) !default;
    +
    +
    +//== Badges
    +//
    +//##
    +
    +$badge-color:                 #fff !default;
    +//** Linked badge text color on hover
    +$badge-link-hover-color:      #fff !default;
    +$badge-bg:                    $gray-light !default;
    +
    +//** Badge text color in active nav link
    +$badge-active-color:          $link-color !default;
    +//** Badge background color in active nav link
    +$badge-active-bg:             #fff !default;
    +
    +$badge-font-weight:           bold !default;
    +$badge-line-height:           1 !default;
    +$badge-border-radius:         10px !default;
    +
    +
    +//== Breadcrumbs
    +//
    +//##
    +
    +$breadcrumb-padding-vertical:   8px !default;
    +$breadcrumb-padding-horizontal: 15px !default;
    +//** Breadcrumb background color
    +$breadcrumb-bg:                 #f5f5f5 !default;
    +//** Breadcrumb text color
    +$breadcrumb-color:              #ccc !default;
    +//** Text color of current page in the breadcrumb
    +$breadcrumb-active-color:       $gray-light !default;
    +//** Textual separator for between breadcrumb elements
    +$breadcrumb-separator:          "/" !default;
    +
    +
    +//== Carousel
    +//
    +//##
    +
    +$carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6) !default;
    +
    +$carousel-control-color:                      #fff !default;
    +$carousel-control-width:                      15% !default;
    +$carousel-control-opacity:                    .5 !default;
    +$carousel-control-font-size:                  20px !default;
    +
    +$carousel-indicator-active-bg:                #fff !default;
    +$carousel-indicator-border-color:             #fff !default;
    +
    +$carousel-caption-color:                      #fff !default;
    +
    +
    +//== Close
    +//
    +//##
    +
    +$close-font-weight:           bold !default;
    +$close-color:                 #000 !default;
    +$close-text-shadow:           0 1px 0 #fff !default;
    +
    +
    +//== Code
    +//
    +//##
    +
    +$code-color:                  #c7254e !default;
    +$code-bg:                     #f9f2f4 !default;
    +
    +$kbd-color:                   #fff !default;
    +$kbd-bg:                      #333 !default;
    +
    +$pre-bg:                      #f5f5f5 !default;
    +$pre-color:                   $gray-dark !default;
    +$pre-border-color:            #ccc !default;
    +$pre-scrollable-max-height:   340px !default;
    +
    +
    +//== Type
    +//
    +//##
    +
    +//** Horizontal offset for forms and lists.
    +$component-offset-horizontal: 180px !default;
    +//** Text muted color
    +$text-muted:                  $gray-light !default;
    +//** Abbreviations and acronyms border color
    +$abbr-border-color:           $gray-light !default;
    +//** Headings small color
    +$headings-small-color:        $gray-light !default;
    +//** Blockquote small color
    +$blockquote-small-color:      $gray-light !default;
    +//** Blockquote font size
    +$blockquote-font-size:        ($font-size-base * 1.25) !default;
    +//** Blockquote border color
    +$blockquote-border-color:     $gray-lighter !default;
    +//** Page header border color
    +$page-header-border-color:    $gray-lighter !default;
    +//** Width of horizontal description list titles
    +$dl-horizontal-offset:        $component-offset-horizontal !default;
    +//** Point at which .dl-horizontal becomes horizontal
    +$dl-horizontal-breakpoint:    $grid-float-breakpoint !default;
    +//** Horizontal line color.
    +$hr-border:                   $gray-lighter !default;
    diff --git a/lab-regan/app/scss/lib/bootstrap/_custom-bootstrap.scss b/lab-regan/app/scss/lib/bootstrap/_custom-bootstrap.scss
    new file mode 100644
    index 00000000..0eda4f9f
    --- /dev/null
    +++ b/lab-regan/app/scss/lib/bootstrap/_custom-bootstrap.scss
    @@ -0,0 +1,50 @@
    +@import "custom-bootstrap-vars";
    +
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/mixins";
    +
    +// Reset and dependencies
    +
    +// @import "~bootstrap-sass/assets/stylesheets/bootstrap/print";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/glyphicons";
    +
    +//Core CSS
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/scaffolding";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/type";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/code";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/grid";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/tables";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/forms";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/buttons";
    +
    +// Components
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/component-animations";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/dropdowns";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/button-groups";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/input-groups";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/navs";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/navbar";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/breadcrumbs";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/pagination";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/pager";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/labels";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/badges";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/jumbotron";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/thumbnails";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/alerts";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/progress-bars";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/media";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/list-group";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/panels";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/responsive-embed";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/wells";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/close";
    +
    +// Components w/ JavaScript
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/modals";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/tooltip";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/popovers";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/carousel";
    +
    +// Utility classes
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/utilities";
    +@import "~bootstrap-sass/assets/stylesheets/bootstrap/responsive-utilities";
    
    From f285d9b0c959d38654c508d04517d1796ddff837 Mon Sep 17 00:00:00 2001
    From: reganoneill 
    Date: Mon, 10 Apr 2017 15:22:40 -0700
    Subject: [PATCH 31/36] further improvements with uib
    
    ---
     .../gallery/create-gallery/_create-gallery.scss        |  3 ++-
     .../component/gallery/edit-gallery/_edit-gallery.scss  |  9 ++++++---
     .../component/gallery/edit-gallery/edit-gallery.html   |  6 +++---
     .../thumbnail-container/_thumbnail-container.scss      |  3 +++
     .../app/component/gallery/thumbnail/thumbnail.html     |  3 +++
     .../app/component/gallery/upload-pic/_upload-pic.scss  |  5 +++++
     .../app/component/gallery/upload-pic/upload-pic.html   |  8 +++++++-
     lab-regan/app/component/landing/signup/_signup.scss    | 10 ++++++++++
     lab-regan/app/component/landing/signup/signup.html     |  3 ++-
     lab-regan/app/component/navbar/_navbar.scss            |  3 +++
     lab-regan/app/entry.js                                 |  3 ++-
     lab-regan/app/scss/lib/layout/_header.scss             |  2 +-
     lab-regan/app/scss/main.scss                           |  7 +++++++
     lab-regan/app/view/home/_home.scss                     |  1 +
     lab-regan/package.json                                 |  2 ++
     lab-regan/webpack.config.js                            |  6 +++++-
     16 files changed, 62 insertions(+), 12 deletions(-)
    
    diff --git a/lab-regan/app/component/gallery/create-gallery/_create-gallery.scss b/lab-regan/app/component/gallery/create-gallery/_create-gallery.scss
    index 4b850800..ac74b832 100644
    --- a/lab-regan/app/component/gallery/create-gallery/_create-gallery.scss
    +++ b/lab-regan/app/component/gallery/create-gallery/_create-gallery.scss
    @@ -1,8 +1,9 @@
     .create-gallery{
         margin-bottom: 2.5em;
       h2{
    +      margin-top: 0;
           padding-left: 10%;
    -      margin-bottom: -1em;
    +      margin-bottom: -0.5em;
           padding-top: 1.5em;
       }
       form {
    diff --git a/lab-regan/app/component/gallery/edit-gallery/_edit-gallery.scss b/lab-regan/app/component/gallery/edit-gallery/_edit-gallery.scss
    index d525478a..340f7197 100644
    --- a/lab-regan/app/component/gallery/edit-gallery/_edit-gallery.scss
    +++ b/lab-regan/app/component/gallery/edit-gallery/_edit-gallery.scss
    @@ -1,6 +1,7 @@
     @import "../../../scss/lib/theme/vars";
     
     .edit {
    + form{
       width: 80%;
       margin: 0 auto;
       padding: 0.75em;
    @@ -20,15 +21,16 @@
        }
         fieldset{
           margin: 0.75em 0;
    -
    +      padding: 0.5em;
           span{
    +        margin-top: 0.75em; 
             float: left;
             &:first-child{
               font-weight: bold;
             }
           }
    -      input .input-std {
    -        float: left;
    +      input{
    +        // float: left;
             display: inline-block;
             &:first-child {
               border: 1px red dotted;
    @@ -37,6 +39,7 @@
           }
           }
         }
    +  }
         // & > span {
         //   margin: 1em 0;
         // }
    diff --git a/lab-regan/app/component/gallery/edit-gallery/edit-gallery.html b/lab-regan/app/component/gallery/edit-gallery/edit-gallery.html
    index 82d1b5ae..ab9a8bd8 100644
    --- a/lab-regan/app/component/gallery/edit-gallery/edit-gallery.html
    +++ b/lab-regan/app/component/gallery/edit-gallery/edit-gallery.html
    @@ -6,13 +6,13 @@
         
    name: -
    - description - description: +
    diff --git a/lab-regan/app/component/gallery/thumbnail-container/_thumbnail-container.scss b/lab-regan/app/component/gallery/thumbnail-container/_thumbnail-container.scss index 251b99fb..df792a75 100644 --- a/lab-regan/app/component/gallery/thumbnail-container/_thumbnail-container.scss +++ b/lab-regan/app/component/gallery/thumbnail-container/_thumbnail-container.scss @@ -1,3 +1,6 @@ .thumbnail-container { margin: -15em 3em 1em 3em; + h3 { + margin: 0; + } } diff --git a/lab-regan/app/component/gallery/thumbnail/thumbnail.html b/lab-regan/app/component/gallery/thumbnail/thumbnail.html index 27a44836..42554b8e 100644 --- a/lab-regan/app/component/gallery/thumbnail/thumbnail.html +++ b/lab-regan/app/component/gallery/thumbnail/thumbnail.html @@ -1,4 +1,7 @@
    + {{ thumbnailCtrl.pic.desc }} delete + +
diff --git a/lab-regan/app/component/gallery/upload-pic/_upload-pic.scss b/lab-regan/app/component/gallery/upload-pic/_upload-pic.scss index 256064e6..5eb3c3ab 100644 --- a/lab-regan/app/component/gallery/upload-pic/_upload-pic.scss +++ b/lab-regan/app/component/gallery/upload-pic/_upload-pic.scss @@ -1,5 +1,10 @@ .upload-pic { + margin-bottom: 3em; form{ + .img-grabber { + text-decoration: underline; + cursor: pointer; + } input{ margin: none; } diff --git a/lab-regan/app/component/gallery/upload-pic/upload-pic.html b/lab-regan/app/component/gallery/upload-pic/upload-pic.html index 0fff7540..ed1f478a 100644 --- a/lab-regan/app/component/gallery/upload-pic/upload-pic.html +++ b/lab-regan/app/component/gallery/upload-pic/upload-pic.html @@ -1,6 +1,9 @@
+ +
+ + -

upload a new pic

@@ -14,4 +17,7 @@

upload a new pic

+ +
+ diff --git a/lab-regan/app/component/landing/signup/_signup.scss b/lab-regan/app/component/landing/signup/_signup.scss index 8b137891..6321f73f 100644 --- a/lab-regan/app/component/landing/signup/_signup.scss +++ b/lab-regan/app/component/landing/signup/_signup.scss @@ -1 +1,11 @@ +.signup { + h3{ + margin-left: 10%; + } + form { + input { + margin: auto; + } + } +} diff --git a/lab-regan/app/component/landing/signup/signup.html b/lab-regan/app/component/landing/signup/signup.html index e1e1b7aa..6f4a174f 100644 --- a/lab-regan/app/component/landing/signup/signup.html +++ b/lab-regan/app/component/landing/signup/signup.html @@ -17,7 +17,8 @@

sign up

diff --git a/lab-regan/app/component/navbar/_navbar.scss b/lab-regan/app/component/navbar/_navbar.scss index 3bc4f452..f0b05d9f 100644 --- a/lab-regan/app/component/navbar/_navbar.scss +++ b/lab-regan/app/component/navbar/_navbar.scss @@ -9,6 +9,9 @@ width: 80%; margin: auto; li { + h2 { + margin: 0; + } float: left; height: 100%; display: inline-block; diff --git a/lab-regan/app/entry.js b/lab-regan/app/entry.js index 8ecfd5f0..6c47e9ba 100644 --- a/lab-regan/app/entry.js +++ b/lab-regan/app/entry.js @@ -10,8 +10,9 @@ const uiRouter = require('angular-ui-router'); const ngTouch = require('angular-touch'); const ngAnimate = require('angular-animate'); const ngFileUpload = require('ng-file-upload'); +const uiBootstrap = require('angular-ui-bootstrap'); -const cfgram = angular.module('cfgram', [ngTouch, ngAnimate, uiRouter, ngFileUpload]); +const cfgram = angular.module('cfgram', [ngTouch, ngAnimate, uiRouter, ngFileUpload, uiBootstrap]); let context = require.context('./config/', true, /\.js$/); context.keys().forEach( key => { diff --git a/lab-regan/app/scss/lib/layout/_header.scss b/lab-regan/app/scss/lib/layout/_header.scss index cc38d31e..74235c16 100644 --- a/lab-regan/app/scss/lib/layout/_header.scss +++ b/lab-regan/app/scss/lib/layout/_header.scss @@ -8,6 +8,6 @@ header { .btn-std { float: right; margin-right: 10%; - margin-top: 2em; + margin-top: 1em; } } diff --git a/lab-regan/app/scss/main.scss b/lab-regan/app/scss/main.scss index 270f25d6..9594e46f 100644 --- a/lab-regan/app/scss/main.scss +++ b/lab-regan/app/scss/main.scss @@ -1,10 +1,15 @@ // base @import "lib/base/reset"; +//bootstrap +@import "lib/bootstrap/custom-bootstrap"; @import "lib/base/base"; + + // layout @import "lib/layout/header"; @import "lib/layout/footer"; @import "lib/layout/main"; + // components @import "../component/navbar/navbar"; @import "../component/landing/signup/signup"; @@ -13,4 +18,6 @@ @import "../component/gallery/edit-gallery/edit-gallery"; @import "../component/gallery/create-gallery/create-gallery"; @import "../component/gallery/thumbnail-container/thumbnail-container"; + +// directive @import "../directive/social-icons"; diff --git a/lab-regan/app/view/home/_home.scss b/lab-regan/app/view/home/_home.scss index ed8751fd..1806f253 100644 --- a/lab-regan/app/view/home/_home.scss +++ b/lab-regan/app/view/home/_home.scss @@ -2,6 +2,7 @@ .home { background: $grey; + padding-bottom: 4em; h2{ padding-left: 5%; font-weight: bold; diff --git a/lab-regan/package.json b/lab-regan/package.json index 05806e0d..1fddb95f 100644 --- a/lab-regan/package.json +++ b/lab-regan/package.json @@ -16,10 +16,12 @@ "angular": "^1.6.3", "angular-animate": "^1.6.3", "angular-touch": "^1.6.3", + "angular-ui-bootstrap": "^2.5.0", "angular-ui-router": "^0.4.2", "babel-core": "^6.24.0", "babel-loader": "^6.4.1", "babel-preset-es2015": "^6.24.0", + "bootstrap-sass": "^3.3.7", "camelcase": "^4.0.0", "clean-webpack-plugin": "^0.1.16", "css-loader": "^0.27.3", diff --git a/lab-regan/webpack.config.js b/lab-regan/webpack.config.js index 129cad88..d5cffbba 100644 --- a/lab-regan/webpack.config.js +++ b/lab-regan/webpack.config.js @@ -44,7 +44,11 @@ module.exports = { { test: /\.png$/, loader: 'url-loader' - } + }, + { + test: /\.(woff|woff2|tt|svg|eot).*/, + loader: 'url?limit=10000&name=image/[hash].[ext]' + } ] } }; From 345eb93db5fcf2dceecf99d6ef282393f9bea45b Mon Sep 17 00:00:00 2001 From: reganoneill Date: Mon, 10 Apr 2017 15:57:38 -0700 Subject: [PATCH 32/36] bootstrap ui buttons and hover actions --- .../gallery/gallery-item/_gallery-item.scss | 15 +++++++++++++-- .../gallery/gallery-item/gallery-item.html | 6 +++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lab-regan/app/component/gallery/gallery-item/_gallery-item.scss b/lab-regan/app/component/gallery/gallery-item/_gallery-item.scss index e85b610d..44374539 100644 --- a/lab-regan/app/component/gallery/gallery-item/_gallery-item.scss +++ b/lab-regan/app/component/gallery/gallery-item/_gallery-item.scss @@ -24,10 +24,11 @@ .edit-container { width: 100%; div{ - width: 80%; + width: 90%; margin: auto; + margin-top: 0.25em; text-align: right; - span { + button { display: inline-block; background: $site-primary; color: $white; @@ -35,9 +36,19 @@ border-radius: 8px; margin: 0.5em 0; margin-bottom: 1.5em; + &:first-child{ + &:hover{ + background: $white; + color: $black; + } + } &:last-child{ background: $site-tertiary; color: $black; + &:hover{ + background: $black; + color: $white; + } } } } diff --git a/lab-regan/app/component/gallery/gallery-item/gallery-item.html b/lab-regan/app/component/gallery/gallery-item/gallery-item.html index be9a1255..8025ae11 100644 --- a/lab-regan/app/component/gallery/gallery-item/gallery-item.html +++ b/lab-regan/app/component/gallery/gallery-item/gallery-item.html @@ -12,10 +12,10 @@ -
+
- edit - delete + +
From f87d5cf722750ad788760fc0c8c3648ef4f07a9c Mon Sep 17 00:00:00 2001 From: reganoneill Date: Mon, 10 Apr 2017 20:39:24 -0700 Subject: [PATCH 33/36] added more form validation and ngMessages --- lab-regan/app/component/landing/signup/signup.html | 10 ++++++++-- lab-regan/app/entry.js | 3 ++- lab-regan/package.json | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lab-regan/app/component/landing/signup/signup.html b/lab-regan/app/component/landing/signup/signup.html index 6f4a174f..e29cb391 100644 --- a/lab-regan/app/component/landing/signup/signup.html +++ b/lab-regan/app/component/landing/signup/signup.html @@ -1,5 +1,6 @@ diff --git a/lab-regan/app/entry.js b/lab-regan/app/entry.js index 6c47e9ba..5a0f7e3e 100644 --- a/lab-regan/app/entry.js +++ b/lab-regan/app/entry.js @@ -10,9 +10,10 @@ const uiRouter = require('angular-ui-router'); const ngTouch = require('angular-touch'); const ngAnimate = require('angular-animate'); const ngFileUpload = require('ng-file-upload'); +const ngMessages = require('angular-messages'); const uiBootstrap = require('angular-ui-bootstrap'); -const cfgram = angular.module('cfgram', [ngTouch, ngAnimate, uiRouter, ngFileUpload, uiBootstrap]); +const cfgram = angular.module('cfgram', [ngTouch, ngAnimate, uiRouter, ngFileUpload, uiBootstrap, ngMessages]); let context = require.context('./config/', true, /\.js$/); context.keys().forEach( key => { diff --git a/lab-regan/package.json b/lab-regan/package.json index 1fddb95f..f825d9ac 100644 --- a/lab-regan/package.json +++ b/lab-regan/package.json @@ -15,6 +15,7 @@ "dependencies": { "angular": "^1.6.3", "angular-animate": "^1.6.3", + "angular-messages": "^1.6.4", "angular-touch": "^1.6.3", "angular-ui-bootstrap": "^2.5.0", "angular-ui-router": "^0.4.2", From 32b567df3577c4277672bb5f7c773ef7a1417bf7 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Mon, 10 Apr 2017 21:47:42 -0700 Subject: [PATCH 34/36] super badass accordion view functionality --- .../thumbnail-container.html | 2 +- .../gallery/upload-pic/upload-pic.html | 2 +- .../gallery/upload-pic/upload-pic.js | 2 ++ .../app/component/landing/signup/_signup.scss | 8 +++++++ .../app/component/landing/signup/signup.html | 21 +++++++++++++------ 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html index 5e32c32c..e0631b88 100644 --- a/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html +++ b/lab-regan/app/component/gallery/thumbnail-container/thumbnail-container.html @@ -1,5 +1,5 @@
-

{{thumbnailContainerCtrl.gallery.name | uppercase}}

+
diff --git a/lab-regan/app/component/gallery/upload-pic/upload-pic.html b/lab-regan/app/component/gallery/upload-pic/upload-pic.html index ed1f478a..40e8acd4 100644 --- a/lab-regan/app/component/gallery/upload-pic/upload-pic.html +++ b/lab-regan/app/component/gallery/upload-pic/upload-pic.html @@ -1,6 +1,6 @@
-
+
diff --git a/lab-regan/app/component/gallery/upload-pic/upload-pic.js b/lab-regan/app/component/gallery/upload-pic/upload-pic.js index e4dcb1d4..cdef4d8e 100644 --- a/lab-regan/app/component/gallery/upload-pic/upload-pic.js +++ b/lab-regan/app/component/gallery/upload-pic/upload-pic.js @@ -15,7 +15,9 @@ function UploadPicController($log, picService){ $log.debug('UploadPicController'); this.pic = {}; + this.accOpen = false; this.uploadPic = function(){ + this.accOpen = false; picService.uploadGalleryPic(this.gallery, this.pic) .then( (returnobj) => { this.pic.name = null; diff --git a/lab-regan/app/component/landing/signup/_signup.scss b/lab-regan/app/component/landing/signup/_signup.scss index 6321f73f..692fea83 100644 --- a/lab-regan/app/component/landing/signup/_signup.scss +++ b/lab-regan/app/component/landing/signup/_signup.scss @@ -6,6 +6,14 @@ form { input { margin: auto; + margin-top: 2.5em; + } + .formChecker { + p { + width: initial; + margin-left: 10%; + color: red; + } } } } diff --git a/lab-regan/app/component/landing/signup/signup.html b/lab-regan/app/component/landing/signup/signup.html index e29cb391..08fc7db5 100644 --- a/lab-regan/app/component/landing/signup/signup.html +++ b/lab-regan/app/component/landing/signup/signup.html @@ -6,28 +6,37 @@

sign up

- +
+

Must be at least 4 characters

+

Must be less than 8 characters

+
+
+

Must be a valid email

+
+ - +
+

Password must be at least 8 characters

+
-
-

Password must be at least 8 characters

-
+
From 9dd024bf92447fa2ef47d34c32917c0f18b0ea32 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Mon, 10 Apr 2017 22:43:08 -0700 Subject: [PATCH 35/36] deletion improvements and ui tweaks --- lab-regan/app/component/gallery/gallery-item/gallery-item.js | 2 ++ lab-regan/app/component/gallery/upload-pic/upload-pic.html | 2 +- lab-regan/app/component/gallery/upload-pic/upload-pic.js | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lab-regan/app/component/gallery/gallery-item/gallery-item.js b/lab-regan/app/component/gallery/gallery-item/gallery-item.js index eca39d2a..a84d1653 100644 --- a/lab-regan/app/component/gallery/gallery-item/gallery-item.js +++ b/lab-regan/app/component/gallery/gallery-item/gallery-item.js @@ -17,5 +17,7 @@ function GalleryItemController($log, galleryService){ this.showEditGallery = false; this.deleteGallery = function(){ galleryService.deleteGallery(this.gallery._id); + this.gallery.pics = []; + this.gallery.name = null; }; }; diff --git a/lab-regan/app/component/gallery/upload-pic/upload-pic.html b/lab-regan/app/component/gallery/upload-pic/upload-pic.html index 40e8acd4..902a0ea6 100644 --- a/lab-regan/app/component/gallery/upload-pic/upload-pic.html +++ b/lab-regan/app/component/gallery/upload-pic/upload-pic.html @@ -1,6 +1,6 @@
-
+
diff --git a/lab-regan/app/component/gallery/upload-pic/upload-pic.js b/lab-regan/app/component/gallery/upload-pic/upload-pic.js index cdef4d8e..aff2ad86 100644 --- a/lab-regan/app/component/gallery/upload-pic/upload-pic.js +++ b/lab-regan/app/component/gallery/upload-pic/upload-pic.js @@ -17,12 +17,12 @@ function UploadPicController($log, picService){ this.pic = {}; this.accOpen = false; this.uploadPic = function(){ - this.accOpen = false; picService.uploadGalleryPic(this.gallery, this.pic) .then( (returnobj) => { this.pic.name = null; this.pic.desc = null; this.pic.file = null; + this.accOpen = false; }); }; }; From 63bf7e3e904ede765b344d3d42775a5bc2337f03 Mon Sep 17 00:00:00 2001 From: reganoneill Date: Mon, 10 Apr 2017 23:12:33 -0700 Subject: [PATCH 36/36] cleaned up delete --- lab-regan/app/component/gallery/gallery-item/gallery-item.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/lab-regan/app/component/gallery/gallery-item/gallery-item.js b/lab-regan/app/component/gallery/gallery-item/gallery-item.js index a84d1653..eca39d2a 100644 --- a/lab-regan/app/component/gallery/gallery-item/gallery-item.js +++ b/lab-regan/app/component/gallery/gallery-item/gallery-item.js @@ -17,7 +17,5 @@ function GalleryItemController($log, galleryService){ this.showEditGallery = false; this.deleteGallery = function(){ galleryService.deleteGallery(this.gallery._id); - this.gallery.pics = []; - this.gallery.name = null; }; };