From 328b8e3da0de72ab74d9391cc6550e3ce9a361ee Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Thu, 21 Apr 2016 13:56:54 -0400 Subject: [PATCH] got user CRUD unit tests to pass --- ; | 121 +++++++++++++ .../users.authorization.server.controller.js | 1 - app/tests/form.server.routes.test.js | 52 +++--- app/tests/user.server.routes.test.js | 160 +++++------------- gruntfile.js | 3 +- public/dist/application.min.css | 2 +- 6 files changed, 196 insertions(+), 143 deletions(-) create mode 100644 ; diff --git a/; b/; new file mode 100644 index 00000000..c27c196d --- /dev/null +++ b/; @@ -0,0 +1,121 @@ +'use strict'; + +var should = require('should'), + _ = require('lodash'), + app = require('../../server'), + request = require('supertest'), + Session = require('supertest-session'), + mongoose = require('mongoose'), + User = mongoose.model('User'), + config = require('../../config/config'), + tmpUser = mongoose.model(config.tempUserCollection), + url = require('url'); + +/** + * Globals + */ +var credentials, _User; +var _tmpUser, activateToken; +var username, userSession; + +username = 'testActiveAccount1.be1e58fb@mailosaur.in'; + +/** + * Form routes tests + */ +describe('User CRUD tests', function() { + this.timeout(30000); + + beforeEach(function() { + // Create user credentials + credentials = { + username: 'test7@test.com', + password: 'password' + }; + + //Create a new user + _User = { + firstName: 'Full', + lastName: 'Name', + email: credentials.username, + username: credentials.username, + password: credentials.password, + provider: 'local' + }; + + //Initialize Session + userSession = Session(app); + }); + + describe(' > Create, Verify and Activate a User > ', function() { + //this.timeout(15000); + + it('should be able to create a temporary (non-activated) User', function(done) { + userSession.post('/auth/signup') + .send(_User) + .expect(200) + .end(function(FormSaveErr, FormSaveRes) { + // Handle error + should.not.exist(FormSaveErr); + + tmpUser.findOne({username: _User.username}, function (err, user) { + should.not.exist(err); + should.exist(user); + _tmpUser = user; + + _User.username.should.equal(user.username); + _User.firstName.should.equal(user.firstName); + _User.lastName.should.equal(user.lastName); + activateToken = user.GENERATED_VERIFYING_URL; + console.log('activateToken: '+activateToken); + + userSession.get('/auth/verify/'+activateToken) + .expect(200) + .end(function(VerifyErr, VerifyRes) { + // Handle error + if (VerifyErr) return done(VerifyErr); + (VerifyRes.text).should.equal('User successfully verified'); + + userSession.post('/auth/signin') + .send(credentials) + .expect('Content-Type', /json/) + .expect(200) + .end(function(signinErr, signinRes) { + // Handle signin error + if (signinErr) return done(signinErr); + + var user = signinRes.body; + (user.username).should.equal(credentials.username); + + userSession.get('/auth/signout') + .expect(200) + .end(function(signoutErr, signoutRes) { + + // Handle signout error + if (signoutErr) return done(signoutErr); + + (signoutRes.text).should.equal('Successfully logged out''); + + done(); + }); + }); + }); + }); + }); + }); + + }); + + it(' > should be able to reset a User\'s password'); + + it(' > should be able to delete a User account without any problems'); + + afterEach(function(done) { + User.remove().exec(function () { + tmpUser.remove().exec(function(){ + userSession.destroy(); + done(); + }); + }); + }); +}); diff --git a/app/controllers/users/users.authorization.server.controller.js b/app/controllers/users/users.authorization.server.controller.js index 0926bd36..89495965 100755 --- a/app/controllers/users/users.authorization.server.controller.js +++ b/app/controllers/users/users.authorization.server.controller.js @@ -36,7 +36,6 @@ exports.userByID = function (req, res, next, id) { */ exports.requiresLogin = function(req, res, next) { if (!req.isAuthenticated()) { - console.log('\n\nSENDING 401 STATUS\n\n'); return res.status(401).send({ message: 'User is not logged in' }); diff --git a/app/tests/form.server.routes.test.js b/app/tests/form.server.routes.test.js index 3bca8cd3..07d3d125 100644 --- a/app/tests/form.server.routes.test.js +++ b/app/tests/form.server.routes.test.js @@ -9,8 +9,7 @@ var should = require('should'), User = mongoose.model('User'), Form = mongoose.model('Form'), Field = mongoose.model('Field'), - FormSubmission = mongoose.model('FormSubmission'), - agent = request.agent(app); + FormSubmission = mongoose.model('FormSubmission'); /** @@ -25,12 +24,10 @@ describe('Form Routes Unit tests', function() { beforeEach(function(done) { - //Initialize Session - userSession = Session(app); - // Create user credentials credentials = { - username: 'test1@test.com', + username: 'test@test.com', + email: 'test@test.com', password: 'password' }; @@ -39,7 +36,7 @@ describe('Form Routes Unit tests', function() { firstName: 'Full', lastName: 'Name', displayName: 'Full Name', - email: 'test5@test.com', + email: 'test@test.com', username: credentials.username, password: credentials.password, provider: 'local' @@ -58,6 +55,10 @@ describe('Form Routes Unit tests', function() { new Field({'fieldType':'checkbox', 'title':'hockey', 'fieldValue': ''}) ] }; + + //Initialize Session + userSession = Session(app); + done(); }); }); @@ -116,14 +117,13 @@ describe('Form Routes Unit tests', function() { // Handle signout error if (signoutErr) return done(signoutErr); - userSession.destroy(); - done(); + done(); }); }); }); it(' > should not be able to create a Form if not logged in', function(done) { - agent.post('/forms') + userSession.post('/forms') .send({form: myForm}) .expect(401) .end(function(FormSaveErr, FormSaveRes) { @@ -134,7 +134,7 @@ describe('Form Routes Unit tests', function() { }); it(' > should not be able to get list of users\' Forms if not logged in', function(done) { - agent.get('/forms') + userSession.get('/forms') .expect(401) .end(function(FormSaveErr, FormSaveRes) { (FormSaveRes.body.message).should.equal('User is not logged in'); @@ -147,24 +147,23 @@ describe('Form Routes Unit tests', function() { // Set Form with a invalid title field myForm.title = ''; - agent.post('http://localhost:3001/auth/signin') + userSession.post('/auth/signin') .send(credentials) .expect('Content-Type', /json/) .expect(200) .end(function(signinErr, signinRes) { should.not.exist(signinErr); - done(); // Save a new Form - // userSession.post('/forms') - // .send({form: myForm}) - // .expect(400) - // .end(function(FormSaveErr, FormSaveRes) { - // // Set message assertion - // (FormSaveRes.body.message).should.equal('Form Title cannot be blank'); + userSession.post('/forms') + .send({form: myForm}) + .expect(400) + .end(function(FormSaveErr, FormSaveRes) { + // Set message assertion + (FormSaveRes.body.message).should.equal('Form Title cannot be blank'); - // done(); - // }); + done(); + }); }); }); @@ -217,7 +216,7 @@ describe('Form Routes Unit tests', function() { FormObj.save(function(err, form) { if(err) return done(err); - agent.get('/forms/' + form._id) + userSession.get('/forms/' + form._id) .expect('Content-Type', /json/) .expect(200) .end(function(err, res) { @@ -261,7 +260,7 @@ describe('Form Routes Unit tests', function() { if (FormDeleteErr) return done(FormDeleteErr); // Set assertions - (FormDeleteRes.body).should.exist(); + should.exist(FormDeleteRes.body); // (FormDeleteRes.body._id).should.equal(FormSaveRes.body._id); // Call the assertion callback @@ -282,7 +281,7 @@ describe('Form Routes Unit tests', function() { // Save the Form FormObj.save(function() { // Try deleting Form - agent.delete('/forms/' + FormObj._id) + userSession.delete('/forms/' + FormObj._id) .expect(401) .end(function(FormDeleteErr, FormDeleteRes) { // Set message assertion @@ -295,7 +294,7 @@ describe('Form Routes Unit tests', function() { }); }); - it(' > should be able to upload a PDF an Form if logged in', function(done) { + it(' > should be able to upload a PDF to Form if signed in', function(done) { userSession.post('/auth/signin') .send(credentials) .expect('Content-Type', /json/) @@ -322,7 +321,8 @@ describe('Form Routes Unit tests', function() { .expect('Content-Type', /json/) .expect(200) .end(function(FormsGetErr, FormsGetRes) { - // Handle Form save error + console.log('get forms'); + // Handle Form save error if (FormsGetErr) return done(FormsGetErr); // Get Forms list diff --git a/app/tests/user.server.routes.test.js b/app/tests/user.server.routes.test.js index b032e410..3b52e64a 100644 --- a/app/tests/user.server.routes.test.js +++ b/app/tests/user.server.routes.test.js @@ -10,11 +10,6 @@ var should = require('should'), config = require('../../config/config'), tmpUser = mongoose.model(config.tempUserCollection), url = require('url'); -// -// var mailosaur = require('mailosaur')(config.mailosaur.key), -// mailbox = new mailosaur.Mailbox(config.mailosaur.mailbox_id); -// -// var mandrill = require('node-mandrill')(config.mailer.options.auth.pass); /** * Globals @@ -25,19 +20,16 @@ var username, userSession; username = 'testActiveAccount1.be1e58fb@mailosaur.in'; -//Initialize Session -userSession = Session(app); - /** * Form routes tests */ describe('User CRUD tests', function() { - //this.timeout(15000); + this.timeout(30000); beforeEach(function() { // Create user credentials credentials = { - username: 'be1e58fb@mailosaur.in', + username: 'test7@test.com', password: 'password' }; @@ -50,124 +42,69 @@ describe('User CRUD tests', function() { password: credentials.password, provider: 'local' }; - + + //Initialize Session + userSession = Session(app); }); - //describe(' > Create, Verify and Activate a User > ', function() { + describe(' > Create, Verify and Activate a User > ', function() { //this.timeout(15000); it('should be able to create a temporary (non-activated) User', function(done) { - //_User.email = _User.username = username; userSession.post('/auth/signup') .send(_User) .expect(200) .end(function(FormSaveErr, FormSaveRes) { // Handle error should.not.exist(FormSaveErr); - done(); + + tmpUser.findOne({username: _User.username}, function (err, user) { + should.not.exist(err); + should.exist(user); + _tmpUser = user; - // // mandrill('/messages/search', { - // // query: "subject:Confirm", - // // senders: [ - // // "test@forms.polydaic.com" - // // ], - // // limit: 1 - // // }, function(error, emails) { - // // if (error) console.log( JSON.stringify(error) ); + _User.username.should.equal(user.username); + _User.firstName.should.equal(user.firstName); + _User.lastName.should.equal(user.lastName); + activateToken = user.GENERATED_VERIFYING_URL; + console.log('activateToken: '+activateToken); + + userSession.get('/auth/verify/'+activateToken) + .expect(200) + .end(function(VerifyErr, VerifyRes) { + // Handle error + if (VerifyErr) return done(VerifyErr); + (VerifyRes.text).should.equal('User successfully verified'); + + userSession.post('/auth/signin') + .send(credentials) + .expect('Content-Type', /json/) + .expect(200) + .end(function(signinErr, signinRes) { + // Handle signin error + if (signinErr) return done(signinErr); - // // var confirmation_email = emails[0]; + var user = signinRes.body; + (user.username).should.equal(credentials.username); - // // mandrill('/messages/content', { - // // id: confirmation_email._id - // // }, function(error, email) { - // // if (error) console.log( JSON.stringify(error) ); + userSession.get('/auth/signout') + .expect(200) + .end(function(signoutErr, signoutRes) { - // // // console.log(email); - // // var link = _(email.text.split('\n')).reverse().value()[1]; - // // console.log(link); - // // activateToken = _(url.parse(link).hash.split('/')).reverse().value()[0]; - // // console.log('actual activateToken: '+ activateToken); - // // console.log('expected activateToken: ' + user.GENERATED_VERIFYING_URL); + // Handle signout error + if (signoutErr) return done(signoutErr); - // // done(); + (signoutRes.text).should.equal('You have successfully logged out.'); - // // }); - // // }); - - // // mailbox.getEmails(function(err, _emails) { - // // if(err) done(err); - - // // var emails = _emails; - - // // console.log('mailbox.getEmails:'); - // // console.log(emails[0].text.links); - - // // var link = emails[0].text.links[0].href; - // // activateToken = _(url.parse(link).hash.split('/')).reverse().value()[0]; - // // console.log('actual activateToken: '+ activateToken); - // // console.log('expected activateToken: ' + user.GENERATED_VERIFYING_URL); - // // (activateToken).should.equal(user.GENERATED_VERIFYING_URL); - - // // done(); - // // }); - // }); + done(); + }); + }); + }); + }); }); }); - it('should produce valid activation token', function(done) { - console.log('activation token'); - tmpUser.findOne({username: _User.username}, function (err, user) { - should.not.exist(err); - should.exist(user); - _tmpUser = user; - - _User.username.should.equal(user.username); - _User.firstName.should.equal(user.firstName); - _User.lastName.should.equal(user.lastName); - activateToken = user.GENERATED_VERIFYING_URL; - - done(); - }); - }); - - it('should be able to verify a User Account', function(done) { - //console.log('activateToken: '+activateToken); - userSession.get('/auth/verify/'+activateToken) - .expect(200) - .end(function(VerifyErr, VerifyRes) { - // Handle error - if (VerifyErr) return done(VerifyErr); - (VerifyRes.text).should.equal('User successfully verified'); - done(); - }); - }); - - it('should be able to login and logout a verified User Account', function(done) { - userSession.post('/auth/signin') - .send(credentials) - .expect('Content-Type', /json/) - .expect(200) - .end(function(signinErr, signinRes) { - // Handle signin error - if (signinErr) return done(signinErr); - - var user = signinRes.body; - (user.username).should.equal(credentials.username); - - userSession.get('/auth/signout') - .expect(200) - .end(function(signoutErr, signoutRes) { - - // Handle signout error - if (signoutErr) return done(signoutErr); - - (signoutRes.text).should.equal('Successfully logged out'); - - done(); - }); - }); - }); - //}); + }); it(' > should be able to reset a User\'s password'); @@ -176,11 +113,8 @@ describe('User CRUD tests', function() { afterEach(function(done) { User.remove().exec(function () { tmpUser.remove().exec(function(){ - // mailbox.deleteAllEmail(function (err, body) { - // if(err) throw err; - //userSession.destroy(); - done(); - // }); + userSession.destroy(); + done(); }); }); }); diff --git a/gruntfile.js b/gruntfile.js index d24128da..0277285d 100755 --- a/gruntfile.js +++ b/gruntfile.js @@ -3,8 +3,6 @@ module.exports = function(grunt) { require('jit-grunt')(grunt); - grunt.loadNpmTasks('grunt-env'); - // Unified Watch Object var watchFiles = { serverViews: ['app/views/**/*.*'], @@ -145,6 +143,7 @@ module.exports = function(grunt) { env: { test: { NODE_ENV: 'test', + src: '/opt/deploy/.env' }, secure: { NODE_ENV: 'secure', diff --git a/public/dist/application.min.css b/public/dist/application.min.css index 9613e238..230d264d 100644 --- a/public/dist/application.min.css +++ b/public/dist/application.min.css @@ -1,4 +1,4 @@ .image-background,.opacity-background{position:fixed;width:100%;height:100%;top:0;left:0}body{overflow-x:hidden}.navbar-inverse{background-color:#fafafa;border:0}.navbar .navbar-brand{font-size:1.6em;font-weight:900;color:#ff8383}.navbar .navbar-brand:hover,.navbar .navbar-brand:visited{color:#FA787E}.navbar li.dropdown a.dropdown-toggle:hover>*{color:#000}.navbar li.dropdown.open a.dropdown-toggle:hover>*{color:#fff}.navbar .navbar-brand span{text-decoration:underline}.admin-form .panel-heading a:hover,.current-fields .tool-panel>.panel-default .panel-heading a:hover,.undecorated-link:hover{text-decoration:none}.nav.navbar-nav.navbar-right li{padding-right:20px}.navbar li.dropdown a.dropdown-toggle>*,.navbar-inverse .navbar-nav>li>a{color:#838383}.navbar li.dropdown.open a.dropdown-toggle>*,.navbar-inverse .navbar-nav .active>a,.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#838383;color:#fff!important}.navbar-inverse .navbar-toggle{background-color:#ddd;border:none}.navbar-inverse .navbar-collapse{border:none}.content{margin-top:70px}.ng-cloak,.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}.browsehappy.jumbotron.hide,body.ng-cloak{display:block}section.hero-section{width:100%}section.hero-section .jumbotron{background-color:transparent;color:#fff}.image-background{z-index:-98;background-image:url(http://yourplaceandmine.ie/wp-content/uploads/2014/09/Daingean-meeting-048_13-1080x675.jpg);background-repeat:no-repeat;background-position:0 50%;background-size:cover}.opacity-background{background-color:#000;background-color:rgba(0,0,0,.5);z-index:-97}section.hero-section .jumbotron .signup-btn{background-color:#FA787E;border:none;font-size:2em;padding:.3em .9em;color:#fff}.row-height{display:table;table-layout:fixed;height:100%;width:100%}.col-height{display:table-cell;float:none;height:100%}.col-top{vertical-align:top}.col-middle{vertical-align:middle}.col-bottom{vertical-align:bottom}@media (min-width:480px){.row-xs-height{display:table;table-layout:fixed;height:100%;width:100%}.col-xs-height{display:table-cell;float:none;height:100%}.col-xs-top{vertical-align:top}.col-xs-middle{vertical-align:middle}.col-xs-bottom{vertical-align:bottom}}@media (min-width:768px){.row-sm-height{display:table;table-layout:fixed;height:100%;width:100%}.col-sm-height{display:table-cell;float:none;height:100%}.col-sm-top{vertical-align:top}.col-sm-middle{vertical-align:middle}.col-sm-bottom{vertical-align:bottom}}@media (min-width:992px){.row-md-height{display:table;table-layout:fixed;height:100%;width:100%}.col-md-height{display:table-cell;float:none;height:100%}.col-md-top{vertical-align:top}.col-md-middle{vertical-align:middle}.col-md-bottom{vertical-align:bottom}}@media (min-width:1200px){.row-lg-height{display:table;table-layout:fixed;height:100%;width:100%}.col-lg-height{display:table-cell;float:none;height:100%}.col-lg-top{vertical-align:top}.col-lg-middle{vertical-align:middle}.col-lg-bottom{vertical-align:bottom}}/*! * "Fork me on GitHub" CSS ribbon v0.1.1 | MIT License * https://github.com/simonwhitaker/github-fork-ribbon-css -*/.github-fork-ribbon{position:absolute;padding:2px 0;background-color:#a00;background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,0)),to(rgba(0,0,0,.15)));background-image:-webkit-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-moz-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-ms-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-o-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:linear-gradient(to bottom,rgba(0,0,0,0),rgba(0,0,0,.15));-webkit-box-shadow:0 2px 3px 0 rgba(0,0,0,.5);-moz-box-shadow:0 2px 3px 0 rgba(0,0,0,.5);box-shadow:0 2px 3px 0 rgba(0,0,0,.5);font:700 13px "Helvetica Neue",Helvetica,Arial,sans-serif;z-index:9999;pointer-events:auto}.github-fork-ribbon a,.github-fork-ribbon a:hover{color:#fff;text-decoration:none;text-shadow:0 -1px rgba(0,0,0,.5);text-align:center;width:200px;line-height:20px;display:inline-block;padding:2px 0;border-width:1px 0;border-style:dotted;border-color:#fff;border-color:rgba(255,255,255,.7)}.github-fork-ribbon-wrapper{width:150px;height:150px;position:absolute;overflow:hidden;top:0;z-index:9998;pointer-events:none}.github-fork-ribbon-wrapper.fixed{position:fixed}.github-fork-ribbon-wrapper.left{left:0}.github-fork-ribbon-wrapper.right{right:0}.github-fork-ribbon-wrapper.left-bottom{position:fixed;top:inherit;bottom:0;left:0}.github-fork-ribbon-wrapper.right-bottom{position:fixed;top:inherit;bottom:0;right:0}.github-fork-ribbon-wrapper.right .github-fork-ribbon{top:42px;right:-43px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.github-fork-ribbon-wrapper.left .github-fork-ribbon{top:42px;left:-43px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.github-fork-ribbon-wrapper.left-bottom .github-fork-ribbon{top:80px;left:-43px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.github-fork-ribbon-wrapper.right-bottom .github-fork-ribbon{top:80px;right:-43px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.custom-select{position:relative;display:block;padding:0}.custom-select select{width:100%;margin:0;background:0 0;border:1px solid transparent;border-radius:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;appearance:none;-webkit-appearance:none;-moz-appearance:none;font-size:1em;font-family:helvetica,sans-serif;font-weight:700;color:#444;padding:.6em 1.9em .5em .8em;line-height:1.3}.custom-select option,.modal-header{font-weight:400}.custom-select::after{content:"";position:absolute;width:9px;height:8px;top:50%;right:1em;margin-top:-4px;background-image:url(http://filamentgroup.com/files/select-arrow.png);background-repeat:no-repeat;background-size:100%;z-index:2;pointer-events:none}.custom-select:hover{border:1px solid #888}.custom-select select:focus{outline:0;box-shadow:0 0 1px 3px rgba(180,222,250,1);background-color:transparent;color:#222;border:1px solid #aaa}.custom-select::after,x:-o-prefocus{display:none}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.custom-select select::-ms-expand{display:none}.custom-select select:focus::-ms-value{background:0 0;color:#222}}.custom-select select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}.panel-default.startPage{border-style:dashed;border-color:#a9a9a9;border-width:3px}.busy-updating-wrapper{text-align:center;font-size:20px;position:fixed;bottom:0;right:55px;z-index:1}.busy-submitting-wrapper{position:fixed;top:50%;left:0;right:0;bottom:0}.form-item,.letter,div.form-fields{position:relative}section.public-form{margin-top:-70px}section.content p.breakwords{word-break:break-all}.btn{border:1px solid #c6c6c6}.btn[type=submit]{font-size:1.5em;padding:.35em 1.2em}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;font-size:18px}.input-block{display:block;width:100%}.modal-footer input[type=text]{min-height:34px;padding:7px 8px;font-size:13px;color:#333;vertical-align:middle;background-color:#fff;background-repeat:no-repeat;background-position:right 8px center;border:1px solid #ccc;border-radius:3px;box-shadow:inset 0 1px 2px rgba(0,0,0,.075)}.modal-footer input[type=text]:focus{outline:0}.modal-body>.modal-body-alert{color:#796620;background-color:#f8eec7;border-color:#f2e09a;margin:-16px -15px 15px;padding:10px 15px;border-style:solid;border-width:1px 0}div.form-fields{margin-top:25vh}.letter{display:-moz-inline-stack;display:inline-block;vertical-align:top;zoom:1;width:16px;padding:0;height:17px;font-size:12px;line-height:19px;border:1px solid #000;border:1px solid rgba(0,0,0,.2);margin-right:7px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;text-align:center;font-weight:700}div.form-submitted>.field.row{padding-bottom:10%;padding-top:2%}div.form-submitted>.field.row>div{font-size:1.7em}form .accordion-edit{width:inherit}.ui-datepicker.ui-widget{z-index:99!important}form .row.field{padding:1em 0 0;width:inherit}form .row.field>.field-title{margin-top:.5em;font-size:1.2em;padding-bottom:1.8em;width:inherit}form .row.field>.field-input{font-size:1.4em;color:#777}form.submission-form .row.field.statement>.field-title{font-size:1.7em}form.submission-form .row.field.statement>.field-input{font-size:1em;color:#ddd}form.submission-form .select.radio>.field-input input,form.submission-form .select>.field-input input{width:20%}form.submission-form .field.row.radio .btn.activeBtn{background-color:#000!important;background-color:rgba(0,0,0,.7)!important;color:#fff}form.submission-form .field.row.radio .btn{margin-right:1.2em}form.submission-form .select>.field-input .btn{text-align:left;margin-bottom:.7em}form.submission-form .select>.field-input .btn>span{font-size:1.1em}form .field-input>textarea{padding:.45em .9em;width:100%;line-height:160%;border:3px dashed #ddd}form .field-input>input.hasDatepicker{padding:.45em .9em;width:50%;line-height:160%;border:3px dashed #ddd}form .field-input>input.text-field-input{padding:.45em .9em;width:100%;line-height:160%;border:2px dashed #ddd!important}form .field-input>input.text-field-input:focus{border:0}form .required-error{color:#ddd;font-size:.8em}form .row.field.dropdown>.field-input input{height:34px;border-width:0 0 2px;border-radius:5px}form .row.field.dropdown>.field-input input:focus{border:none}form .row.field.dropdown>.field-input .ui-select-match{border:0 solid grey;border-width:0 0 2px;border-radius:5px}form .dropdown>.field-input .ui-select-choices-row-inner{border-radius:3px;margin:5px;padding:10px;background-color:rgba(0,0,0,.05)}form .dropdown>.field-input .ui-select-choices-row-inner.active,form .dropdown>.field-input .ui-select-choices-row-inner.active:focus{background-color:rgba(0,0,0,.1)}.config-form{max-width:100%}.config-form>.row{padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}div.config-form .row.field{padding-top:1.5em}div.config-form>.row>.container:nth-of-type(odd){border-right:1px #ddd solid}div.config-form.design>.row>.container:nth-of-type(odd){border-right:none}div.config-form .row>.field-input{padding-left:.1em}div.config-form .row>.field-input label{padding-left:1.3em;display:block}.admin-form>.page-header{padding-bottom:0;margin-bottom:40px}.admin-form>.page-header h1{margin-bottom:0;margin-top:0}.admin-form>.page-header>.col-xs-3{padding-top:1.4em}.admin-form .form-controls .row{padding:5px}.admin-form .page-header{border:none}.admin-form .tab-content{padding-top:3em}.admin-form .panel-heading{background-color:#f1f1f1}.admin-form .panel-heading:hover{background-color:#fff;cursor:pointer}.current-fields .panel-body .row.description textarea,.current-fields .panel-body .row.question input[type=text]{width:100%}.current-fields .panel-body .row.options input[type=text]{width:80%}.current-fields .tool-panel>.panel-default:hover{border-color:#9d9d9d;cursor:pointer}.current-fields .tool-panel>.panel-default .panel-heading{background-color:#fff;color:#9d9d9d!important}.current-fields .tool-panel>.panel-default .panel-heading:hover{background-color:#eee;color:#000!important;cursor:pointer}.current-fields .tool-panel>.panel-default .panel-heading a{color:inherit}.submissions-table .table-outer.row{margin:1.5em 0 2em!important}.submissions-table .table-outer .col-xs-12{padding-left:0!important;border:1px solid #ddd;overflow-x:scroll;border-radius:3px}.submissions-table .table>thead>tr>th{min-width:8em}.submissions-table .table>tbody>tr.selected{background-color:#efefef}.admin-form .add-field{background-color:#ddd;padding:0 2%;border-radius:3px}.admin-form .add-field .col-xs-6{padding:.25em .4em}.admin-form .add-field .col-xs-6 .panel-heading{border-width:1px;border-style:solid;border-color:#bbb;border-radius:4px}.admin-form .oscar-field-select{margin:10px 0}.view-form-btn.span{padding-right:.6em}.status-light.status-light-off{color:#BE0000}.status-light.status-light-on{color:#3C0}section>section.public-form{padding:0 10% 10%}.form-item{text-align:center;border-bottom:6px inset #ccc;background-color:#eee;width:180px;height:215px;margin-bottom:45px}.form-item.create-new input[type=text]{width:inherit;color:#000;border:none}.form-item.create-new{background-color:#838383;color:#fff}.form-item.create-new.new-form{background-color:#ff8383;z-index:11}.form-item.create-new.new-form:hover{background-color:#ff6464}.form-item.new-form input[type=text]{margin-top:.2em;width:inherit;color:#000;border:none;padding:.3em .6em}.form-item.new-form .custom-select{margin-top:.2em}.form-item.new-form .custom-select select{background-color:#fff}.form-item.new-form .details-row{margin-top:1em}.form-item.new-form .details-row.submit{margin-top:1.7em}.form-item.new-form .details-row.submit .btn{font-size:.95em}.form-item.new-form .title-row{margin-top:1em;top:0}.overlay{position:fixed;top:0;left:0;height:100%;width:100%;background-color:#000;background-color:rgba(0,0,0,.5);z-index:10}.overlay.submitform{background-color:#fff;background-color:rgba(256,256,256,.8)}.activeField,.activeField input{background-color:transparent}.field-directive{z-index:9;padding:10% 10% 10% 0;border:25px solid transparent;position:relative}.activeField{z-index:11;position:relative}.activeField.field-directive{display:inline-block;border-radius:7px;width:100%;border:25px solid transparent}.form-item.create-new:hover,.form-item:hover{border-bottom:8px inset #ccc;background-color:#d9d9d9}.form-item.create-new:hover{background-color:#515151}.form-item>.row.footer{position:absolute;bottom:0;left:30%}.form-item .title-row{position:relative;top:15px;padding-top:3em;padding-bottom:3.65em}.form-item .title-row h4{font-size:1.3em}.form-item.create-new .title-row{padding:0}.form-item.create-new .title-row h4{font-size:7em}.form-item .details-row{margin-top:3.2em}.form-item .details-row small{font-size:.6em}.form-item.create-new .details-row small{font-size:.95em}.row.auth form .field-input select{padding:.45em .9em;width:100%;background:0 0;font-size:16px;border:1px solid #ccc;height:34px}@media (min-width:992px){.nav-users{position:fixed}}.remove-account-container{display:inline-block;position:relative}.btn-remove-account{top:10px;right:10px;position:absolute}section.auth{margin-top:5em}section.auth>h3{font-size:3em;font-weight:500;color:#777}section.auth.signup-view>h3{font-size:4.4em;padding-bottom:.5em} \ No newline at end of file +*/.github-fork-ribbon{position:absolute;padding:2px 0;background-color:#a00;background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,0)),to(rgba(0,0,0,.15)));background-image:-webkit-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-moz-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-ms-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-o-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:linear-gradient(to bottom,rgba(0,0,0,0),rgba(0,0,0,.15));-webkit-box-shadow:0 2px 3px 0 rgba(0,0,0,.5);-moz-box-shadow:0 2px 3px 0 rgba(0,0,0,.5);box-shadow:0 2px 3px 0 rgba(0,0,0,.5);font:700 13px "Helvetica Neue",Helvetica,Arial,sans-serif;z-index:9999;pointer-events:auto}.github-fork-ribbon a,.github-fork-ribbon a:hover{color:#fff;text-decoration:none;text-shadow:0 -1px rgba(0,0,0,.5);text-align:center;width:200px;line-height:20px;display:inline-block;padding:2px 0;border-width:1px 0;border-style:dotted;border-color:#fff;border-color:rgba(255,255,255,.7)}.github-fork-ribbon-wrapper{width:150px;height:150px;position:absolute;overflow:hidden;top:0;z-index:9998;pointer-events:none}.github-fork-ribbon-wrapper.fixed{position:fixed}.github-fork-ribbon-wrapper.left{left:0}.github-fork-ribbon-wrapper.right{right:0}.github-fork-ribbon-wrapper.left-bottom{position:fixed;top:inherit;bottom:0;left:0}.github-fork-ribbon-wrapper.right-bottom{position:fixed;top:inherit;bottom:0;right:0}.github-fork-ribbon-wrapper.right .github-fork-ribbon{top:42px;right:-43px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.github-fork-ribbon-wrapper.left .github-fork-ribbon{top:42px;left:-43px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.github-fork-ribbon-wrapper.left-bottom .github-fork-ribbon{top:80px;left:-43px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.github-fork-ribbon-wrapper.right-bottom .github-fork-ribbon{top:80px;right:-43px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.custom-select{position:relative;display:block;padding:0}.custom-select select{width:100%;margin:0;background:0 0;border:1px solid transparent;border-radius:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;appearance:none;-webkit-appearance:none;-moz-appearance:none;font-size:1em;font-family:helvetica,sans-serif;font-weight:700;color:#444;padding:.6em 1.9em .5em .8em;line-height:1.3}.custom-select option,.modal-header{font-weight:400}.custom-select::after{content:"";position:absolute;width:9px;height:8px;top:50%;right:1em;margin-top:-4px;background-image:url(http://filamentgroup.com/files/select-arrow.png);background-repeat:no-repeat;background-size:100%;z-index:2;pointer-events:none}.custom-select:hover{border:1px solid #888}.custom-select select:focus{outline:0;box-shadow:0 0 1px 3px rgba(180,222,250,1);background-color:transparent;color:#222;border:1px solid #aaa}.custom-select::after,x:-o-prefocus{display:none}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.custom-select select::-ms-expand{display:none}.custom-select select:focus::-ms-value{background:0 0;color:#222}}.custom-select select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}.panel-default.startPage{border-style:dashed;border-color:#a9a9a9;border-width:3px}.busy-updating-wrapper{text-align:center;font-size:20px;position:fixed;bottom:0;right:55px;z-index:1}.busy-submitting-wrapper{position:fixed;top:50%;left:0;right:0;bottom:0}.form-item,.letter,div.form-fields{position:relative}section.public-form{margin-top:-70px}section.content p.breakwords{word-break:break-all}.btn{border:1px solid #c6c6c6}.btn[type=submit]{font-size:1.5em;padding:.35em 1.2em}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;font-size:18px}.input-block{display:block;width:100%}.modal-footer input[type=text]{min-height:34px;padding:7px 8px;font-size:13px;color:#333;vertical-align:middle;background-color:#fff;background-repeat:no-repeat;background-position:right 8px center;border:1px solid #ccc;border-radius:3px;box-shadow:inset 0 1px 2px rgba(0,0,0,.075)}.modal-footer input[type=text]:focus{outline:0}.modal-body>.modal-body-alert{color:#796620;background-color:#f8eec7;border-color:#f2e09a;margin:-16px -15px 15px;padding:10px 15px;border-style:solid;border-width:1px 0}div.form-fields{margin-top:25vh}.letter{display:-moz-inline-stack;display:inline-block;vertical-align:top;zoom:1;width:16px;padding:0;height:17px;font-size:12px;line-height:19px;border:1px solid #000;border:1px solid rgba(0,0,0,.2);margin-right:7px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;text-align:center;font-weight:700}div.form-submitted>.field.row{padding-bottom:2%;margin-top:35vh}div.form-submitted>.field.row>div{font-size:1.7em}form .accordion-edit{width:inherit}.ui-datepicker.ui-widget{z-index:99!important}form .row.field{padding:1em 0 0;width:inherit}form .row.field>.field-title{margin-top:.5em;font-size:1.2em;padding-bottom:1.8em;width:inherit}form .row.field>.field-input{font-size:1.4em;color:#777}form.submission-form .row.field.statement>.field-title{font-size:1.7em}form.submission-form .row.field.statement>.field-input{font-size:1em;color:#ddd}form.submission-form .select.radio>.field-input input,form.submission-form .select>.field-input input{width:20%}form.submission-form .field.row.radio .btn.activeBtn{background-color:#000!important;background-color:rgba(0,0,0,.7)!important;color:#fff}form.submission-form .field.row.radio .btn{margin-right:1.2em}form.submission-form .select>.field-input .btn{text-align:left;margin-bottom:.7em}form.submission-form .select>.field-input .btn>span{font-size:1.1em}form .field-input>textarea{padding:.45em .9em;width:100%;line-height:160%;border:3px dashed #ddd}form .field-input>input.hasDatepicker{padding:.45em .9em;width:50%;line-height:160%;border:3px dashed #ddd}form .field-input>input.text-field-input{padding:.45em .9em;width:100%;line-height:160%;border:2px dashed #ddd!important}form .field-input>input.text-field-input:focus{border:0}form .required-error{color:#ddd;font-size:.8em}form .row.field.dropdown>.field-input input{height:34px;border-width:0 0 2px;border-radius:5px}form .row.field.dropdown>.field-input input:focus{border:none}form .row.field.dropdown>.field-input .ui-select-match{border:0 solid grey;border-width:0 0 2px;border-radius:5px}form .dropdown>.field-input .ui-select-choices-row-inner{border-radius:3px;margin:5px;padding:10px;background-color:rgba(0,0,0,.05)}form .dropdown>.field-input .ui-select-choices-row-inner.active,form .dropdown>.field-input .ui-select-choices-row-inner.active:focus{background-color:rgba(0,0,0,.1)}.config-form{max-width:100%}.config-form>.row{padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}div.config-form .row.field{padding-top:1.5em}div.config-form>.row>.container:nth-of-type(odd){border-right:1px #ddd solid}div.config-form.design>.row>.container:nth-of-type(odd){border-right:none}div.config-form .row>.field-input{padding-left:.1em}div.config-form .row>.field-input label{padding-left:1.3em;display:block}.admin-form>.page-header{padding-bottom:0;margin-bottom:40px}.admin-form>.page-header h1{margin-bottom:0;margin-top:0}.admin-form>.page-header>.col-xs-3{padding-top:1.4em}.admin-form .form-controls .row{padding:5px}.admin-form .page-header{border:none}.admin-form .tab-content{padding-top:3em}.admin-form .panel-heading{background-color:#f1f1f1}.admin-form .panel-heading:hover{background-color:#fff;cursor:pointer}.current-fields .panel-body .row.description textarea,.current-fields .panel-body .row.question input[type=text]{width:100%}.current-fields .panel-body .row.options input[type=text]{width:80%}.current-fields .tool-panel>.panel-default:hover{border-color:#9d9d9d;cursor:pointer}.current-fields .tool-panel>.panel-default .panel-heading{background-color:#fff;color:#9d9d9d!important}.current-fields .tool-panel>.panel-default .panel-heading:hover{background-color:#eee;color:#000!important;cursor:pointer}.current-fields .tool-panel>.panel-default .panel-heading a{color:inherit}.submissions-table .table-outer.row{margin:1.5em 0 2em!important}.submissions-table .table-outer .col-xs-12{padding-left:0!important;border:1px solid #ddd;overflow-x:scroll;border-radius:3px}.submissions-table .table>thead>tr>th{min-width:8em}.submissions-table .table>tbody>tr.selected{background-color:#efefef}.admin-form .add-field{background-color:#ddd;padding:0 2%;border-radius:3px}.admin-form .add-field .col-xs-6{padding:.25em .4em}.admin-form .add-field .col-xs-6 .panel-heading{border-width:1px;border-style:solid;border-color:#bbb;border-radius:4px}.admin-form .oscar-field-select{margin:10px 0}.view-form-btn.span{padding-right:.6em}.status-light.status-light-off{color:#BE0000}.status-light.status-light-on{color:#3C0}section>section.public-form{padding:0 10% 10%}.form-item{text-align:center;border-bottom:6px inset #ccc;background-color:#eee;width:180px;height:215px;margin-bottom:45px}.form-item.create-new input[type=text]{width:inherit;color:#000;border:none}.form-item.create-new{background-color:#838383;color:#fff}.form-item.create-new.new-form{background-color:#ff8383;z-index:11}.form-item.create-new.new-form:hover{background-color:#ff6464}.form-item.new-form input[type=text]{margin-top:.2em;width:inherit;color:#000;border:none;padding:.3em .6em}.form-item.new-form .custom-select{margin-top:.2em}.form-item.new-form .custom-select select{background-color:#fff}.form-item.new-form .details-row{margin-top:1em}.form-item.new-form .details-row.submit{margin-top:1.7em}.form-item.new-form .details-row.submit .btn{font-size:.95em}.form-item.new-form .title-row{margin-top:1em;top:0}.overlay{position:fixed;top:0;left:0;height:100%;width:100%;background-color:#000;background-color:rgba(0,0,0,.5);z-index:10}.overlay.submitform{background-color:#fff;background-color:rgba(256,256,256,.8)}.activeField,.activeField input{background-color:transparent}.field-directive{z-index:9;padding:10% 10% 10% 0;border:25px solid transparent;position:relative}.activeField{z-index:11;position:relative}.activeField.field-directive{display:inline-block;border-radius:7px;width:100%;border:25px solid transparent}.form-item.create-new:hover,.form-item:hover{border-bottom:8px inset #ccc;background-color:#d9d9d9}.form-item.create-new:hover{background-color:#515151}.form-item>.row.footer{position:absolute;bottom:0;left:30%}.form-item .title-row{position:relative;top:15px;padding-top:3em;padding-bottom:3.65em}.form-item .title-row h4{font-size:1.3em}.form-item.create-new .title-row{padding:0}.form-item.create-new .title-row h4{font-size:7em}.form-item .details-row{margin-top:3.2em}.form-item .details-row small{font-size:.6em}.form-item.create-new .details-row small{font-size:.95em}.row.auth form .field-input select{padding:.45em .9em;width:100%;background:0 0;font-size:16px;border:1px solid #ccc;height:34px}@media (min-width:992px){.nav-users{position:fixed}}.remove-account-container{display:inline-block;position:relative}.btn-remove-account{top:10px;right:10px;position:absolute}section.auth{margin-top:5em}section.auth>h3{font-size:3em;font-weight:500;color:#777}section.auth.signup-view>h3{font-size:4.4em;padding-bottom:.5em} \ No newline at end of file