From 321a2765fad6420c117cbc2021ba3744965b3dc6 Mon Sep 17 00:00:00 2001 From: jedireza Date: Sun, 1 Dec 2013 20:46:50 -0800 Subject: [PATCH] trailing spaces cleanup, closes #82 --- .jshintrc-client | 10 +- .jshintrc-server | 10 +- Gruntfile.js | 4 +- app.js | 10 +- layouts/account.jade | 10 +- layouts/admin.jade | 14 +- layouts/default.jade | 10 +- models.js | 2 +- node_modules/drywall-sendmail/index.js | 20 +- node_modules/drywall-workflow/index.js | 10 +- passport.js | 20 +- public/layouts/admin.js | 62 ++--- public/layouts/admin.less | 2 +- public/layouts/core.js | 6 +- public/layouts/core.less | 10 +- public/views/account/index.js | 2 +- public/views/account/settings/index.js | 36 +-- public/views/account/verification/index.js | 10 +- public/views/admin/accounts/details.js | 80 +++---- public/views/admin/accounts/details.less | 6 +- public/views/admin/accounts/index.js | 46 ++-- public/views/admin/accounts/index.less | 4 +- public/views/admin/admin-groups/details.js | 40 ++-- public/views/admin/admin-groups/index.js | 46 ++-- public/views/admin/admin-groups/index.less | 4 +- public/views/admin/administrators/details.js | 62 ++--- public/views/admin/administrators/index.js | 46 ++-- public/views/admin/administrators/index.less | 4 +- public/views/admin/categories/details.js | 24 +- public/views/admin/categories/index.js | 46 ++-- public/views/admin/categories/index.less | 8 +- public/views/admin/statuses/details.js | 24 +- public/views/admin/statuses/index.js | 46 ++-- public/views/admin/statuses/index.less | 8 +- public/views/admin/users/details.js | 44 ++-- public/views/admin/users/index.js | 46 ++-- public/views/admin/users/index.less | 4 +- public/views/contact/index.js | 10 +- public/views/index.less | 4 +- public/views/login/forgot/index.js | 10 +- public/views/login/index.js | 10 +- public/views/login/reset/index.js | 12 +- public/views/signup/index.js | 10 +- public/views/signup/social.js | 10 +- routes.js | 34 +-- schema/Admin.js | 8 +- schema/User.js | 8 +- schema/plugins/pagedFind.js | 34 +-- views/about/index.jade | 6 +- views/account/settings/index.jade | 8 +- views/account/settings/index.js | 114 +++++----- views/account/verification/email-text.jade | 20 +- views/account/verification/index.jade | 4 +- views/account/verification/index.js | 48 ++-- views/admin/accounts/details.jade | 30 +-- views/admin/accounts/index.jade | 16 +- views/admin/accounts/index.js | 152 ++++++------- views/admin/admin-groups/details.jade | 12 +- views/admin/admin-groups/index.jade | 16 +- views/admin/admin-groups/index.js | 66 +++--- views/admin/administrators/details.jade | 16 +- views/admin/administrators/index.jade | 16 +- views/admin/administrators/index.js | 148 ++++++------ views/admin/categories/details.jade | 10 +- views/admin/categories/index.jade | 16 +- views/admin/categories/index.js | 54 ++--- views/admin/index.js | 10 +- views/admin/search/index.js | 18 +- views/admin/statuses/details.jade | 10 +- views/admin/statuses/index.jade | 16 +- views/admin/statuses/index.js | 58 ++--- views/admin/users/details.jade | 14 +- views/admin/users/index.jade | 16 +- views/admin/users/index.js | 224 +++++++++---------- views/contact/email-text.jade | 11 +- views/contact/index.jade | 2 +- views/contact/index.js | 14 +- views/index.jade | 2 +- views/login/forgot/email-html.jade | 2 +- views/login/forgot/email-text.jade | 17 +- views/login/forgot/index.jade | 4 +- views/login/forgot/index.js | 18 +- views/login/index.jade | 6 +- views/login/index.js | 36 +-- views/login/reset/index.jade | 4 +- views/login/reset/index.js | 24 +- views/signup/email-text.jade | 20 +- views/signup/index.jade | 6 +- views/signup/index.js | 96 ++++---- views/signup/social.jade | 4 +- 90 files changed, 1191 insertions(+), 1179 deletions(-) diff --git a/.jshintrc-client b/.jshintrc-client index 014070537..cbc6b9369 100644 --- a/.jshintrc-client +++ b/.jshintrc-client @@ -1,6 +1,6 @@ { "maxerr" : 50, // {int} Maximum error before stopping - + // Enforcing "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) "camelcase" : false, // true: Identifiers must be in camelCase @@ -29,7 +29,7 @@ "maxstatements" : false, // {int} Max number statements per function "maxcomplexity" : false, // {int} Max cyclomatic complexity per function "maxlen" : false, // {int} Max number of characters per line - + // Relaxing "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) "boss" : false, // true: Tolerate assignments where comparisons would be expected @@ -56,7 +56,7 @@ "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` "validthis" : false, // true: Tolerate using this in a non-constructor function - + // Environments "browser" : true, // Web Browser (window, document, etc) "couch" : false, // CouchDB @@ -71,13 +71,13 @@ "worker" : false, // Web Workers "wsh" : false, // Windows Scripting Host "yui" : false, // Yahoo User Interface - + // Legacy "nomen" : false, // true: Prohibit dangling `_` in variables "onevar" : false, // true: Allow only one `var` statement per function "passfail" : false, // true: Stop on first error "white" : false, // true: Check against strict whitespace and indentation rules - + // Custom Globals "predef" : ["$", "_", "Backbone", "moment", "app"] // additional predefined global variables } diff --git a/.jshintrc-server b/.jshintrc-server index 1c285e643..89bc9fe36 100644 --- a/.jshintrc-server +++ b/.jshintrc-server @@ -1,6 +1,6 @@ { "maxerr" : 50, // {int} Maximum error before stopping - + // Enforcing "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) "camelcase" : false, // true: Identifiers must be in camelCase @@ -29,7 +29,7 @@ "maxstatements" : false, // {int} Max number statements per function "maxcomplexity" : false, // {int} Max cyclomatic complexity per function "maxlen" : false, // {int} Max number of characters per line - + // Relaxing "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) "boss" : false, // true: Tolerate assignments where comparisons would be expected @@ -56,7 +56,7 @@ "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` "validthis" : false, // true: Tolerate using this in a non-constructor function - + // Environments "browser" : false, // Web Browser (window, document, etc) "couch" : false, // CouchDB @@ -71,13 +71,13 @@ "worker" : false, // Web Workers "wsh" : false, // Windows Scripting Host "yui" : false, // Yahoo User Interface - + // Legacy "nomen" : false, // true: Prohibit dangling `_` in variables "onevar" : false, // true: Allow only one `var` statement per function "passfail" : false, // true: Stop on first error "white" : false, // true: Check against strict whitespace and indentation rules - + // Custom Globals "predef" : [ ] // additional predefined global variables } diff --git a/Gruntfile.js b/Gruntfile.js index b7d2b4697..661838f23 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -159,7 +159,7 @@ module.exports = function(grunt) { } } }); - + grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-less'); @@ -168,7 +168,7 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-concurrent'); grunt.loadNpmTasks('grunt-nodemon'); grunt.loadNpmTasks('grunt-newer'); - + grunt.registerTask('default', ['newer:uglify', 'newer:less', 'concurrent']); grunt.registerTask('build', ['uglify', 'less']); grunt.registerTask('lint', ['jshint']); diff --git a/app.js b/app.js index ea3a97c50..f7ae2a9df 100644 --- a/app.js +++ b/app.js @@ -50,15 +50,15 @@ app.configure(function(){ //twitter settings app.set('twitter-oauth-key', config.oauth.twitter.key); app.set('twitter-oauth-secret', config.oauth.twitter.secret); - + //github settings app.set('github-oauth-key', config.oauth.github.key); app.set('github-oauth-secret', config.oauth.github.secret); - + //facebook settings app.set('facebook-oauth-key', config.oauth.facebook.key); app.set('facebook-oauth-secret', config.oauth.facebook.secret); - + //middleware app.use(express.favicon(__dirname + '/public/favicon.ico')); app.use(express.logger('dev')); @@ -73,10 +73,10 @@ app.configure(function(){ app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); - + //error handler app.use(require('./views/http/index').http500); - + //global locals app.locals.projectName = app.get('project-name'); app.locals.copyrightYear = new Date().getFullYear(); diff --git a/layouts/account.jade b/layouts/account.jade index 52214440f..83a68295b 100644 --- a/layouts/account.jade +++ b/layouts/account.jade @@ -25,11 +25,11 @@ html li: a(href='/logout/') i.fa.fa-user | Sign Out - + div.page div.container block body - + div.footer div.container div.inner @@ -39,12 +39,12 @@ html li: a(href='/') Home li: a(href='/logout/') Sign Out div.clearfix - + div.ajax-spinner img(src='/media/ajax-pulse.gif') - + //if lte IE 9 script(src='/layouts/ie-sucks.min.js?#{cacheBreaker}') script(src='/layouts/core.min.js?#{cacheBreaker}') - + block feet diff --git a/layouts/admin.jade b/layouts/admin.jade index 46aa3b600..c53c958a5 100644 --- a/layouts/admin.jade +++ b/layouts/admin.jade @@ -22,7 +22,7 @@ html ul.nav.navbar-nav li.dropdown a.dropdown-toggle(href='#', data-toggle='dropdown') - | System + | System  span.caret ul.dropdown-menu li.dropdown-header Pivoted Settings @@ -35,11 +35,11 @@ html li: a(href='/admin/administrators/') Administrators li: a(href='/admin/admin-groups/') Admin Groups form.navbar-form.pull-right#_search - + div.page div.container block body - + div.footer div.container div.inner @@ -49,10 +49,10 @@ html li: a(href='/') Home li: a(href='/logout/') Sign Out div.clearfix - + div.ajax-spinner img(src='/media/ajax-pulse.gif') - + script(type='text/template', id='tmpl-_search') div.dropdown input.form-control(name='_search', type='text', placeholder='search', tab-index='1') @@ -65,10 +65,10 @@ html |<% } %> script(type='text/template', id='tmpl-_search-results-empty-row') li.dropdown-header no docs matched - + //if lte IE 9 script(src='/layouts/ie-sucks.min.js?#{cacheBreaker}') script(src='/layouts/core.min.js?#{cacheBreaker}') script(src='/layouts/admin.min.js?#{cacheBreaker}') - + block feet diff --git a/layouts/default.jade b/layouts/default.jade index 6432ee68f..30fdd179e 100644 --- a/layouts/default.jade +++ b/layouts/default.jade @@ -27,11 +27,11 @@ html li: a(href='/login/') i.fa.fa-user | Sign In - + div.page div.container block body - + div.footer div.container span.copyright.pull-right @@ -40,12 +40,12 @@ html li: a(href='/') Home li: a(href='/contact/') Contact div.clearfix - + div.ajax-spinner img(src='/media/ajax-pulse.gif') - + //if lte IE 9 script(src='/layouts/ie-sucks.min.js?#{cacheBreaker}') script(src='/layouts/core.min.js?#{cacheBreaker}') - + block feet diff --git a/models.js b/models.js index 64fbe7940..202a2dbd9 100644 --- a/models.js +++ b/models.js @@ -6,7 +6,7 @@ exports = module.exports = function(app, mongoose) { require('./schema/Status')(app, mongoose); require('./schema/StatusLog')(app, mongoose); require('./schema/Category')(app, mongoose); - + //then regular docs require('./schema/User')(app, mongoose); require('./schema/Admin')(app, mongoose); diff --git a/node_modules/drywall-sendmail/index.js b/node_modules/drywall-sendmail/index.js index 405697a90..5482e1a82 100644 --- a/node_modules/drywall-sendmail/index.js +++ b/node_modules/drywall-sendmail/index.js @@ -2,7 +2,7 @@ exports = module.exports = function(req, res, options) { /* options = { - from: String, + from: String, to: String, cc: String, bcc: String, @@ -14,7 +14,7 @@ exports = module.exports = function(req, res, options) { success: Function, error: Function } */ - + var renderText = function(callback) { res.render(options.textPath, options.locals, function(err, text) { if (err) { @@ -26,7 +26,7 @@ exports = module.exports = function(req, res, options) { } }); }; - + var renderHtml = function(callback) { res.render(options.htmlPath, options.locals, function(err, html) { if (err) { @@ -38,16 +38,16 @@ exports = module.exports = function(req, res, options) { } }); }; - + var renderers = []; if (options.textPath) { renderers.push(renderText); } - + if (options.htmlPath) { renderers.push(renderHtml); } - + require('async').parallel( renderers, function(err, results){ @@ -55,19 +55,19 @@ exports = module.exports = function(req, res, options) { options.error('Email template render failed. '+ err); return; } - + var attachements = []; - + if (options.html) { attachements.push({ data: options.html, alternative: true }); } - + if (options.attachments) { for (var i = 0 ; i < options.attachments.length ; i++) { attachements.push(options.attachments[i]); } } - + var emailjs = require('emailjs/email'); var emailer = emailjs.server.connect( req.app.get('smtp-credentials') ); emailer.send({ diff --git a/node_modules/drywall-workflow/index.js b/node_modules/drywall-workflow/index.js index d23c77d6f..267696c5a 100644 --- a/node_modules/drywall-workflow/index.js +++ b/node_modules/drywall-workflow/index.js @@ -2,26 +2,26 @@ exports = module.exports = function(req, res) { var workflow = new (require('events').EventEmitter)(); - + workflow.outcome = { success: false, errors: [], errfor: {} }; - + workflow.hasErrors = function() { return Object.keys(workflow.outcome.errfor).length !== 0 || workflow.outcome.errors.length !== 0; }; - + workflow.on('exception', function(err) { workflow.outcome.errors.push('Exception: '+ err); return workflow.emit('response'); }); - + workflow.on('response', function() { workflow.outcome.success = !workflow.hasErrors(); res.send(workflow.outcome); }); - + return workflow; }; diff --git a/passport.js b/passport.js index 86547a8f9..995c7a39b 100644 --- a/passport.js +++ b/passport.js @@ -5,7 +5,7 @@ exports = module.exports = function(app, passport) { TwitterStrategy = require('passport-twitter').Strategy, GitHubStrategy = require('passport-github').Strategy, FacebookStrategy = require('passport-facebook').Strategy; - + passport.use(new LocalStrategy( function(username, password, done) { var conditions = { isActive: 'yes' }; @@ -15,26 +15,26 @@ exports = module.exports = function(app, passport) { else { conditions.email = username; } - + app.db.models.User.findOne(conditions, function(err, user) { if (err) { return done(err); } - + if (!user) { return done(null, false, { message: 'Unknown user' }); } - + var encryptedPassword = app.db.models.User.encryptPassword(password); if (user.password !== encryptedPassword) { return done(null, false, { message: 'Invalid password' }); } - + return done(null, user); }); } )); - + if (app.get('twitter-oauth-key')) { passport.use(new TwitterStrategy({ consumerKey: app.get('twitter-oauth-key'), @@ -49,7 +49,7 @@ exports = module.exports = function(app, passport) { } )); } - + if (app.get('github-oauth-key')) { passport.use(new GitHubStrategy({ clientID: app.get('github-oauth-key'), @@ -65,7 +65,7 @@ exports = module.exports = function(app, passport) { } )); } - + if (app.get('facebook-oauth-key')) { passport.use(new FacebookStrategy({ clientID: app.get('facebook-oauth-key'), @@ -80,11 +80,11 @@ exports = module.exports = function(app, passport) { } )); } - + passport.serializeUser(function(user, done) { done(null, user._id); }); - + passport.deserializeUser(function(id, done) { app.db.models.User.findOne({ _id: id }).populate('roles.admin').populate('roles.account').exec(function(err, user) { if (user.roles && user.roles.admin) { diff --git a/public/layouts/admin.js b/public/layouts/admin.js index 36657f823..fb4053dcc 100644 --- a/public/layouts/admin.js +++ b/public/layouts/admin.js @@ -2,9 +2,9 @@ (function() { 'use strict'; - + app = app || {}; - + app._SearchResult = Backbone.Model.extend({ defaults: { _id: undefined, @@ -13,41 +13,41 @@ type: 'result' } }); - + app._SearchCollection = Backbone.Collection.extend({ model: app._SearchResult, url: '/admin/search/', parse: function(response) { var outcome = []; - + if (response.users.length) { outcome.push({name: 'Users', type: 'header'}); } - + _.each(response.users, function(user) { outcome.push({name: user.username, url: '/admin/users/'+ user._id +'/'}); }); - + if (response.accounts.length) { outcome.push({name: 'Accounts', type: 'header'}); } - + _.each(response.accounts, function(account) { outcome.push({name: account.name.full, url: '/admin/accounts/'+ account._id +'/'}); }); - + if (response.administrators.length) { outcome.push({name: 'Administrators', type: 'header'}); } - + _.each(response.administrators, function(administrator) { outcome.push({name: administrator.name.full, url: '/admin/administrators/'+ administrator._id +'/'}); }); - + return outcome; } }); - + app._SearchView = Backbone.View.extend({ el: '#_search', template: _.template( $('#tmpl-_search').html() ), @@ -59,13 +59,13 @@ selectedResult: undefined, startKeyBuffer: function(event) { app._searchView.timeLastKeyPressed = (new Date()); - + //esc key if (parseInt(event.keyCode, null) === 27) { this.clearResults(); return; } - + //enter key if (parseInt(event.keyCode, null) === 13) { if (this.selectedResult !== undefined) { @@ -76,18 +76,18 @@ } return false; } - + //up and down keys if (parseInt(event.keyCode, null) === 38 || parseInt(event.keyCode, null) === 40) { this.navigateResults(event); return false; } - + //ignore non-alphanumeric, except backspace if (!/[a-zA-Z0-9\-_ ]/.test(String.fromCharCode(parseInt(event.keyCode, null))) && parseInt(event.keyCode, null) !== 8) { return; } - + this.keyBuffer(); }, keyBuffer: function() { @@ -99,7 +99,7 @@ if (app._searchView.lastTimeoutID) { clearTimeout(app._searchView.lastTimeoutID); } - + app._searchView.lastTimeoutID = setTimeout(app._searchView.keyBuffer, 50); } }, @@ -109,41 +109,41 @@ this.clearResults(); return; } - + this.collection.fetch({ data: {q: query}, reset: true }); }, navigateResults: function(event) { var arrLinkResults = this.$el.find('li a').get(); - + var movingUp = (parseInt(event.keyCode, null) === 38); var movingDown = (parseInt(event.keyCode, null) === 40); - + if (this.selectedResult === undefined && this.$el.find('li a').get(0)) { this.selectedResult = -1; } - + if (movingUp && this.selectedResult === 0) { this.selectedResult = arrLinkResults.length - 1; } else if (movingUp) { this.selectedResult -= 1; } - + if (movingDown && this.selectedResult === (arrLinkResults.length - 1)) { this.selectedResult = 0; } else if (movingDown) { this.selectedResult += 1; } - + if (this.selectedResult > arrLinkResults.length) { this.selectedResult = 0; } - + if (arrLinkResults.length === 0) { this.selectedResult = undefined; } - + this.selectResult(); }, selectResult: function() { @@ -171,20 +171,20 @@ else { this.$el.find('.dropdown').addClass('open'); } - + $('#_search-results-rows').empty(); - + this.collection.each(function(record) { var view = new app._SearchResultView({ model: record }); $('#_search-results-rows').append( view.render().$el ); }, this); - + if (this.collection.length === 0) { $('#_search-results-rows').append( $('#tmpl-_search-results-empty-row').html() ); } } }); - + app._SearchResultView = Backbone.View.extend({ tagName: 'li', template: _.template( $('#tmpl-_search-results-row').html() ), @@ -199,11 +199,11 @@ if (this.model.get('type') === 'header') { this.$el.addClass('dropdown-header'); } - + return this; } }); - + $(document).ready(function() { app._searchView = new app._SearchView(); }); diff --git a/public/layouts/admin.less b/public/layouts/admin.less index 9ff9d9d01..639e77dd6 100644 --- a/public/layouts/admin.less +++ b/public/layouts/admin.less @@ -2,7 +2,7 @@ .navbar-brand { color: #eee; } - + .navbar-form .dropdown { position: relative; } diff --git a/public/layouts/core.js b/public/layouts/core.js index 03ca6b362..72d00f33c 100644 --- a/public/layouts/core.js +++ b/public/layouts/core.js @@ -5,15 +5,15 @@ var app; //the main declaration (function() { 'use strict'; - + $(document).ready(function() { //active (selected) navigation elements $('.nav [href="'+ window.location.pathname +'"]').closest('li').toggleClass('active'); - + //register global ajax handlers $(document).ajaxStart(function(){ $('.ajax-spinner').show(); }); $(document).ajaxStop(function(){ $('.ajax-spinner').hide(); }); - + //ajax spinner follows mouse $(document).bind('mousemove', function(e) { $('.ajax-spinner').css({ diff --git a/public/layouts/core.less b/public/layouts/core.less index 3c3957241..9cd52a94b 100644 --- a/public/layouts/core.less +++ b/public/layouts/core.less @@ -33,13 +33,13 @@ select, textarea, input, .form-control { .navbar { .box-shadow(0 2px 5px rgba(0,0,0,.125)); - + .navbar-brand { font-weight: bold; color: #003d5f; position: relative; display: inline-block; - + .navbar-logo { position: absolute; top: 10px; @@ -55,7 +55,7 @@ select, textarea, input, .form-control { .footer { margin-top: 50px; color: #999; - + .container { border-top: 1px solid #ccc; padding: 20px 5px 20px 5px; @@ -67,7 +67,7 @@ select, textarea, input, .form-control { .links { margin: 0; padding: 0; - + li { display: inline-block; padding-right: 10px; @@ -92,7 +92,7 @@ select, textarea, input, .form-control { line-height: 11px; background-color: #ccc; border-radius: 4px; - + img { width: inherit; height: inherit; diff --git a/public/views/account/index.js b/public/views/account/index.js index 606b94a5d..f69784334 100644 --- a/public/views/account/index.js +++ b/public/views/account/index.js @@ -1,6 +1,6 @@ (function() { 'use strict'; - + $('.day-of-year').text(moment().format('DDD')); $('.day-of-month').text(moment().format('D')); $('.week-of-year').text(moment().format('w')); diff --git a/public/views/account/settings/index.js b/public/views/account/settings/index.js index ef181bbd6..b08d56400 100644 --- a/public/views/account/settings/index.js +++ b/public/views/account/settings/index.js @@ -2,19 +2,19 @@ (function() { 'use strict'; - + app = app || {}; - + app.Account = Backbone.Model.extend({ idAttribute: '_id', url: '/account/settings/' }); - + app.User = Backbone.Model.extend({ idAttribute: '_id', url: '/account/settings/' }); - + app.Details = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -34,11 +34,11 @@ app.mainView.account.set(response.account); delete response.account; } - + return response; } }); - + app.Identity = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -54,11 +54,11 @@ app.mainView.user.set(response.user); delete response.user; } - + return response; } }); - + app.Password = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -74,11 +74,11 @@ app.mainView.user.set(response.user); delete response.user; } - + return response; } }); - + app.DetailsView = Backbone.View.extend({ el: '#details', template: _.template( $('#tmpl-details').html() ), @@ -105,7 +105,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -123,7 +123,7 @@ }); } }); - + app.IdentityView = Backbone.View.extend({ el: '#identity', template: _.template( $('#tmpl-identity').html() ), @@ -146,7 +146,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -160,7 +160,7 @@ }); } }); - + app.PasswordView = Backbone.View.extend({ el: '#password', template: _.template( $('#tmpl-password').html() ), @@ -174,7 +174,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -188,20 +188,20 @@ }); } }); - + app.MainView = Backbone.View.extend({ el: '.page .container', initialize: function() { app.mainView = this; this.account = new app.Account( JSON.parse( unescape($('#data-account').html()) ) ); this.user = new app.User( JSON.parse( unescape($('#data-user').html()) ) ); - + app.detailsView = new app.DetailsView(); app.identityView = new app.IdentityView(); app.passwordView = new app.PasswordView(); } }); - + $(document).ready(function() { app.mainView = new app.MainView(); }); diff --git a/public/views/account/verification/index.js b/public/views/account/verification/index.js index 10f72025c..680ef60fb 100644 --- a/public/views/account/verification/index.js +++ b/public/views/account/verification/index.js @@ -2,9 +2,9 @@ (function() { 'use strict'; - + app = app || {}; - + app.Verify = Backbone.Model.extend({ url: '/account/verification/', defaults: { @@ -15,7 +15,7 @@ email: '' } }); - + app.VerifyView = Backbone.View.extend({ el: '#verify', template: _.template( $('#tmpl-verify').html() ), @@ -42,13 +42,13 @@ }, verify: function() { this.$el.find('.btn-verify').attr('disabled', true); - + this.model.save({ email: this.$el.find('[name="email"]').val() }); } }); - + $(document).ready(function() { app.verifyView = new app.VerifyView(); }); diff --git a/public/views/admin/accounts/details.js b/public/views/admin/accounts/details.js index 3cc23eda4..fb374da61 100644 --- a/public/views/admin/accounts/details.js +++ b/public/views/admin/accounts/details.js @@ -2,16 +2,16 @@ (function() { 'use strict'; - + app = app || {}; - + app.Account = Backbone.Model.extend({ idAttribute: '_id', url: function() { return '/admin/accounts/'+ this.id +'/'; } }); - + app.Delete = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -23,7 +23,7 @@ return '/admin/accounts/'+ app.mainView.model.id +'/'; } }); - + app.Details = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -45,11 +45,11 @@ app.mainView.model.set(response.account); delete response.account; } - + return response; } }); - + app.Login = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -68,11 +68,11 @@ app.mainView.model.set(response.account); delete response.account; } - + return response; } }); - + app.Note = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -89,15 +89,15 @@ app.mainView.model.set(response.account); delete response.account; } - + return response; } }); - + app.NoteCollection = Backbone.Collection.extend({ model: app.Note }); - + app.Status = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -114,15 +114,15 @@ app.mainView.model.set(response.account); delete response.account; } - + return response; } }); - + app.StatusCollection = Backbone.Collection.extend({ model: app.Status }); - + app.HeaderView = Backbone.View.extend({ el: '#header', template: _.template( $('#tmpl-header').html() ), @@ -135,7 +135,7 @@ this.$el.html(this.template( this.model.attributes )); } }); - + app.DetailsView = Backbone.View.extend({ el: '#details', template: _.template( $('#tmpl-details').html() ), @@ -162,7 +162,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -180,7 +180,7 @@ }); } }); - + app.DeleteView = Backbone.View.extend({ el: '#delete', template: _.template( $('#tmpl-delete').html() ), @@ -210,7 +210,7 @@ } } }); - + app.LoginView = Backbone.View.extend({ el: '#login', template: _.template( $('#tmpl-login').html() ), @@ -235,7 +235,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -258,14 +258,14 @@ app.mainView.model.set(response.account); delete response.account; } - + app.loginView.model.set(response); } }); } } }); - + app.NewNoteView = Backbone.View.extend({ el: '#notes-new', template: _.template( $('#tmpl-notes-new').html() ), @@ -285,12 +285,12 @@ if (this.$el.find('[name="data"]').val() === '') { errors.push('Please enter some notes.'); } - + if (errors.length > 0) { this.model.set({ errors: errors }); return false; } - + return true; }, addNew: function() { @@ -301,7 +301,7 @@ } } }); - + app.NoteCollectionView = Backbone.View.extend({ el: '#notes-collection', template: _.template( $('#tmpl-notes-collection').html() ), @@ -317,7 +317,7 @@ }, render: function() { this.$el.html(this.template()); - + var frag = document.createDocumentFragment(); var last = document.createTextNode(''); frag.appendChild(last); @@ -328,20 +328,20 @@ last = newEl; }, this); $('#notes-items').append(frag); - + if (this.collection.length === 0) { $('#notes-items').append( $('#tmpl-notes-none').html() ); } } }); - + app.NotesItemView = Backbone.View.extend({ tagName: 'div', className: 'note', template: _.template( $('#tmpl-notes-item').html() ), render: function() { this.$el.html( this.template(this.model.attributes) ); - + this.$el.find('.timeago').each(function(index, indexValue) { if (indexValue.innerText) { var myMoment = moment(indexValue.innerText); @@ -351,7 +351,7 @@ return this; } }); - + app.NewStatusView = Backbone.View.extend({ el: '#status-new', template: _.template( $('#tmpl-status-new').html() ), @@ -373,7 +373,7 @@ }, render: function() { this.$el.html( this.template(this.model.attributes) ); - + if (app.mainView.model.get('status') && app.mainView.model.get('status').id) { this.$el.find('[name="status"]').val(app.mainView.model.get('status').id); } @@ -383,16 +383,16 @@ if (this.$el.find('[name="status"]').val() === '') { errors.push('Please choose a status.'); } - + if (this.$el.find('[name="status"]').val() === app.mainView.model.get('status').id) { errors.push('That is the current status.'); } - + if (errors.length > 0) { this.model.set({ errors: errors }); return false; } - + return true; }, addNew: function() { @@ -404,7 +404,7 @@ } } }); - + app.StatusCollectionView = Backbone.View.extend({ el: '#status-collection', template: _.template( $('#tmpl-status-collection').html() ), @@ -420,7 +420,7 @@ }, render: function() { this.$el.html( this.template() ); - + var frag = document.createDocumentFragment(); var last = document.createTextNode(''); frag.appendChild(last); @@ -433,14 +433,14 @@ $('#status-items').append(frag); } }); - + app.StatusItemView = Backbone.View.extend({ tagName: 'div', className: 'status', template: _.template( $('#tmpl-status-item').html() ), render: function() { this.$el.html( this.template(this.model.attributes) ); - + this.$el.find('.timeago').each(function(index, indexValue) { if (indexValue.innerText) { var myMoment = moment(indexValue.innerText); @@ -450,13 +450,13 @@ return this; } }); - + app.MainView = Backbone.View.extend({ el: '.page .container', initialize: function() { app.mainView = this; this.model = new app.Account( JSON.parse( unescape($('#data-record').html()) ) ); - + app.headerView = new app.HeaderView(); app.detailsView = new app.DetailsView(); app.deleteView = new app.DeleteView(); @@ -467,7 +467,7 @@ app.statusCollectionView = new app.StatusCollectionView(); } }); - + $(document).ready(function() { app.mainView = new app.MainView(); }); diff --git a/public/views/admin/accounts/details.less b/public/views/admin/accounts/details.less index 3bd6b9293..1a09b11c2 100644 --- a/public/views/admin/accounts/details.less +++ b/public/views/admin/accounts/details.less @@ -2,12 +2,12 @@ .status-items { overflow: scroll; - + .status { padding: 10px 5px; font-size: 12px; border-bottom: 1px solid #ccc; - + .author { font-weight: normal; color: #999; @@ -37,7 +37,7 @@ padding: 10px 5px; font-size: 12px; border-bottom: 1px solid #ccc; - + .author { font-weight: normal; color: #999; diff --git a/public/views/admin/accounts/index.js b/public/views/admin/accounts/index.js index 7223ff82a..8b8b4476c 100644 --- a/public/views/admin/accounts/index.js +++ b/public/views/admin/accounts/index.js @@ -2,9 +2,9 @@ (function() { 'use strict'; - + app = app || {}; - + app.Record = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -24,7 +24,7 @@ return '/admin/accounts/'+ (this.isNew() ? '' : this.id +'/'); } }); - + app.RecordCollection = Backbone.Collection.extend({ model: app.Record, url: '/admin/accounts/', @@ -37,7 +37,7 @@ return results.data; } }); - + app.Filter = Backbone.Model.extend({ defaults: { search: '', @@ -46,14 +46,14 @@ limit: '' } }); - + app.Paging = Backbone.Model.extend({ defaults: { pages: {}, items: {} } }); - + app.HeaderView = Backbone.View.extend({ el: '#header', template: _.template( $('#tmpl-header').html() ), @@ -99,7 +99,7 @@ } } }); - + app.ResultsView = Backbone.View.extend({ el: '#results-table', template: _.template( $('#tmpl-results-table').html() ), @@ -110,20 +110,20 @@ }, render: function() { this.$el.html( this.template() ); - + var frag = document.createDocumentFragment(); this.collection.each(function(record) { var view = new app.ResultsRowView({ model: record }); frag.appendChild(view.render().el); }, this); $('#results-rows').append(frag); - + if (this.collection.length === 0) { $('#results-rows').append( $('#tmpl-results-empty-row').html() ); } } }); - + app.ResultsRowView = Backbone.View.extend({ tagName: 'tr', template: _.template( $('#tmpl-results-row').html() ), @@ -147,7 +147,7 @@ return this; } }); - + app.FilterView = Backbone.View.extend({ el: '#filters', template: _.template( $('#tmpl-filters').html() ), @@ -163,7 +163,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -177,12 +177,12 @@ if (event.keyCode !== 13) { return; } this.filter(); }, - filter: function() { + filter: function() { var query = $('#filters form').serialize(); - Backbone.history.navigate('q/'+ query, { trigger: true }); + Backbone.history.navigate('q/'+ query, { trigger: true }); } }); - + app.PagingView = Backbone.View.extend({ el: '#results-paging', template: _.template( $('#tmpl-results-paging').html() ), @@ -197,11 +197,11 @@ render: function() { if (this.model.get('pages').total > 1) { this.$el.html(this.template( this.model.attributes )); - + if (!this.model.get('pages').hasPrev) { this.$el.find('.btn-prev').attr('disabled', 'disabled'); } - + if (!this.model.get('pages').hasNext) { this.$el.find('.btn-next').attr('disabled', 'disabled'); } @@ -212,24 +212,24 @@ }, goToPage: function(event) { var query = $('#filters form').serialize() +'&page='+ $(event.target).data('page'); - Backbone.history.navigate('q/'+ query, { trigger: true }); + Backbone.history.navigate('q/'+ query, { trigger: true }); $('body').scrollTop(0); } }); - + app.MainView = Backbone.View.extend({ el: '.page .container', initialize: function() { app.mainView = this; this.results = JSON.parse( unescape($('#data-results').html()) ); - + app.headerView = new app.HeaderView(); app.resultsView = new app.ResultsView(); app.filterView = new app.FilterView(); app.pagingView = new app.PagingView(); } }); - + app.Router = Backbone.Router.extend({ routes: { '': 'default', @@ -242,7 +242,7 @@ if (!app.firstLoad) { app.resultsView.collection.fetch({ reset: true }); } - + app.firstLoad = false; }, query: function(params) { @@ -250,7 +250,7 @@ app.firstLoad = false; } }); - + $(document).ready(function() { app.firstLoad = true; app.router = new app.Router(); diff --git a/public/views/admin/accounts/index.less b/public/views/admin/accounts/index.less index 42f068702..489d7abd6 100644 --- a/public/views/admin/accounts/index.less +++ b/public/views/admin/accounts/index.less @@ -2,11 +2,11 @@ .input-group { margin-bottom: 20px; - + input { width: 200px !important; } - + .btn { .border-left-radius(0); } diff --git a/public/views/admin/admin-groups/details.js b/public/views/admin/admin-groups/details.js index 3eecdadf5..4a4c8bfd6 100644 --- a/public/views/admin/admin-groups/details.js +++ b/public/views/admin/admin-groups/details.js @@ -2,16 +2,16 @@ (function() { 'use strict'; - + app = app || {}; - + app.AdminGroup = Backbone.Model.extend({ idAttribute: '_id', url: function() { return '/admin/admin-groups/'+ this.id +'/'; } }); - + app.Delete = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -23,7 +23,7 @@ return '/admin/admin-groups/'+ app.mainView.model.id +'/'; } }); - + app.Details = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -40,11 +40,11 @@ app.mainView.model.set(response.adminGroup); delete response.adminGroup; } - + return response; } }); - + app.Permissions = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -62,11 +62,11 @@ app.mainView.model.set(response.adminGroup); delete response.adminGroup; } - + return response; } }); - + app.HeaderView = Backbone.View.extend({ el: '#header', template: _.template( $('#tmpl-header').html() ), @@ -79,7 +79,7 @@ this.$el.html(this.template( this.model.attributes )); } }); - + app.DetailsView = Backbone.View.extend({ el: '#details', template: _.template( $('#tmpl-details').html() ), @@ -101,7 +101,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -114,7 +114,7 @@ }); } }); - + app.DeleteView = Backbone.View.extend({ el: '#delete', template: _.template( $('#tmpl-delete').html() ), @@ -144,7 +144,7 @@ } } }); - + app.PermissionsView = Backbone.View.extend({ el: '#permissions', template: _.template( $('#tmpl-permissions').html() ), @@ -170,7 +170,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -190,21 +190,21 @@ alreadyAdded = true; } }); - + if (alreadyAdded) { alert('That name already exists.'); return; } } - + this.model.get('permissions').push({ name: newPermission, permit: true }); - + var sorted = this.model.get('permissions'); sorted.sort(function(a, b) { return a.name.toLowerCase() > b.name.toLowerCase(); }); this.model.set('permissions', sorted); - + this.render(); }, allow: function(event) { @@ -228,20 +228,20 @@ this.model.save(); } }); - + app.MainView = Backbone.View.extend({ el: '.page .container', initialize: function() { app.mainView = this; this.model = new app.AdminGroup( JSON.parse( unescape($('#data-record').html()) ) ); - + app.headerView = new app.HeaderView(); app.detailsView = new app.DetailsView(); app.deleteView = new app.DeleteView(); app.permissionsView = new app.PermissionsView(); } }); - + $(document).ready(function() { app.mainView = new app.MainView(); }); diff --git a/public/views/admin/admin-groups/index.js b/public/views/admin/admin-groups/index.js index cc216e93e..faa67d58a 100644 --- a/public/views/admin/admin-groups/index.js +++ b/public/views/admin/admin-groups/index.js @@ -2,9 +2,9 @@ (function() { 'use strict'; - + app = app || {}; - + app.Record = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -15,7 +15,7 @@ return '/admin/admin-groups/'+ (this.isNew() ? '' : this.id +'/'); } }); - + app.RecordCollection = Backbone.Collection.extend({ model: app.Record, url: '/admin/admin-groups/', @@ -28,7 +28,7 @@ return results.data; } }); - + app.Filter = Backbone.Model.extend({ defaults: { name: '', @@ -36,14 +36,14 @@ limit: '' } }); - + app.Paging = Backbone.Model.extend({ defaults: { pages: {}, items: {} } }); - + app.HeaderView = Backbone.View.extend({ el: '#header', template: _.template( $('#tmpl-header').html() ), @@ -89,7 +89,7 @@ } } }); - + app.ResultsView = Backbone.View.extend({ el: '#results-table', template: _.template( $('#tmpl-results-table').html() ), @@ -100,20 +100,20 @@ }, render: function() { this.$el.html( this.template() ); - + var frag = document.createDocumentFragment(); this.collection.each(function(record) { var view = new app.ResultsRowView({ model: record }); frag.appendChild(view.render().el); }, this); $('#results-rows').append(frag); - + if (this.collection.length === 0) { $('#results-rows').append( $('#tmpl-results-empty-row').html() ); } } }); - + app.ResultsRowView = Backbone.View.extend({ tagName: 'tr', template: _.template( $('#tmpl-results-row').html() ), @@ -128,7 +128,7 @@ return this; } }); - + app.FilterView = Backbone.View.extend({ el: '#filters', template: _.template( $('#tmpl-filters').html() ), @@ -144,7 +144,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -158,12 +158,12 @@ if (event.keyCode !== 13) { return; } this.filter(); }, - filter: function() { + filter: function() { var query = $('#filters form').serialize(); - Backbone.history.navigate('q/'+ query, { trigger: true }); + Backbone.history.navigate('q/'+ query, { trigger: true }); } }); - + app.PagingView = Backbone.View.extend({ el: '#results-paging', template: _.template( $('#tmpl-results-paging').html() ), @@ -178,11 +178,11 @@ render: function() { if (this.model.get('pages').total > 1) { this.$el.html(this.template( this.model.attributes )); - + if (!this.model.get('pages').hasPrev) { this.$el.find('.btn-prev').attr('disabled', 'disabled'); } - + if (!this.model.get('pages').hasNext) { this.$el.find('.btn-next').attr('disabled', 'disabled'); } @@ -193,24 +193,24 @@ }, goToPage: function(event) { var query = $('#filters form').serialize() +'&page='+ $(event.target).data('page'); - Backbone.history.navigate('q/'+ query, { trigger: true }); + Backbone.history.navigate('q/'+ query, { trigger: true }); $('body').scrollTop(0); } }); - + app.MainView = Backbone.View.extend({ el: '.page .container', initialize: function() { app.mainView = this; this.results = JSON.parse( unescape($('#data-results').html()) ); - + app.headerView = new app.HeaderView(); app.resultsView = new app.ResultsView(); app.filterView = new app.FilterView(); app.pagingView = new app.PagingView(); } }); - + app.Router = Backbone.Router.extend({ routes: { '': 'default', @@ -223,7 +223,7 @@ if (!app.firstLoad) { app.resultsView.collection.fetch({ reset: true }); } - + app.firstLoad = false; }, query: function(params) { @@ -231,7 +231,7 @@ app.firstLoad = false; } }); - + $(document).ready(function() { app.firstLoad = true; app.router = new app.Router(); diff --git a/public/views/admin/admin-groups/index.less b/public/views/admin/admin-groups/index.less index 42f068702..489d7abd6 100644 --- a/public/views/admin/admin-groups/index.less +++ b/public/views/admin/admin-groups/index.less @@ -2,11 +2,11 @@ .input-group { margin-bottom: 20px; - + input { width: 200px !important; } - + .btn { .border-left-radius(0); } diff --git a/public/views/admin/administrators/details.js b/public/views/admin/administrators/details.js index b6c87efe2..9adf8f5ea 100644 --- a/public/views/admin/administrators/details.js +++ b/public/views/admin/administrators/details.js @@ -2,16 +2,16 @@ (function() { 'use strict'; - + app = app || {}; - + app.Admin = Backbone.Model.extend({ idAttribute: '_id', url: function() { return '/admin/administrators/'+ this.id +'/'; } }); - + app.Delete = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -23,7 +23,7 @@ return '/admin/administrators/'+ app.mainView.model.id +'/'; } }); - + app.Details = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -42,11 +42,11 @@ app.mainView.model.set(response.admin); delete response.admin; } - + return response; } }); - + app.Login = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -65,11 +65,11 @@ app.mainView.model.set(response.admin); delete response.admin; } - + return response; } }); - + app.Groups = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -87,11 +87,11 @@ app.mainView.model.set(response.admin); delete response.admin; } - + return response; } }); - + app.Permissions = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -109,11 +109,11 @@ app.mainView.model.set(response.admin); delete response.admin; } - + return response; } }); - + app.HeaderView = Backbone.View.extend({ el: '#header', template: _.template( $('#tmpl-header').html() ), @@ -126,7 +126,7 @@ this.$el.html(this.template( this.model.attributes )); } }); - + app.DetailsView = Backbone.View.extend({ el: '#details', template: _.template( $('#tmpl-details').html() ), @@ -150,7 +150,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -165,7 +165,7 @@ }); } }); - + app.DeleteView = Backbone.View.extend({ el: '#delete', template: _.template( $('#tmpl-delete').html() ), @@ -195,7 +195,7 @@ } } }); - + app.LoginView = Backbone.View.extend({ el: '#login', template: _.template( $('#tmpl-login').html() ), @@ -220,7 +220,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -249,7 +249,7 @@ } } }); - + app.GroupsView = Backbone.View.extend({ el: '#groups', template: _.template( $('#tmpl-groups').html() ), @@ -273,7 +273,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -294,21 +294,21 @@ alreadyAdded = true; } }); - + if (alreadyAdded) { alert('That group already exists.'); return; } } - + this.model.get('groups').push({ _id: newMembership, name: newMembershipName }); - + var sorted = this.model.get('groups'); sorted.sort(function(a, b) { return a.name.toLowerCase() > b.name.toLowerCase(); }); this.model.set('groups', sorted); - + this.render(); }, delete: function(event) { @@ -322,7 +322,7 @@ this.model.save(); } }); - + app.PermissionsView = Backbone.View.extend({ el: '#permissions', template: _.template( $('#tmpl-permissions').html() ), @@ -348,7 +348,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -373,15 +373,15 @@ return; } } - + this.model.get('permissions').push({ name: newPermission, permit: true }); - + var sorted = this.model.get('permissions'); sorted.sort(function(a, b) { return a.name.toLowerCase() > b.name.toLowerCase(); }); this.model.set('permissions', sorted); - + this.render(); }, allow: function(event) { @@ -405,13 +405,13 @@ this.model.save(); } }); - + app.MainView = Backbone.View.extend({ el: '.page .container', initialize: function() { app.mainView = this; this.model = new app.Admin( JSON.parse( unescape($('#data-record').html()) ) ); - + app.headerView = new app.HeaderView(); app.detailsView = new app.DetailsView(); app.deleteView = new app.DeleteView(); @@ -420,7 +420,7 @@ app.permissionsView = new app.PermissionsView(); } }); - + $(document).ready(function() { app.mainView = new app.MainView(); }); diff --git a/public/views/admin/administrators/index.js b/public/views/admin/administrators/index.js index 051c6d614..652860a6e 100644 --- a/public/views/admin/administrators/index.js +++ b/public/views/admin/administrators/index.js @@ -2,9 +2,9 @@ (function() { 'use strict'; - + app = app || {}; - + app.Record = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -15,7 +15,7 @@ return '/admin/administrators/'+ (this.isNew() ? '' : this.id +'/'); } }); - + app.RecordCollection = Backbone.Collection.extend({ model: app.Record, url: '/admin/administrators/', @@ -28,7 +28,7 @@ return results.data; } }); - + app.Filter = Backbone.Model.extend({ defaults: { name: '', @@ -36,14 +36,14 @@ limit: '' } }); - + app.Paging = Backbone.Model.extend({ defaults: { pages: {}, items: {} } }); - + app.HeaderView = Backbone.View.extend({ el: '#header', template: _.template( $('#tmpl-header').html() ), @@ -89,7 +89,7 @@ } } }); - + app.ResultsView = Backbone.View.extend({ el: '#results-table', template: _.template( $('#tmpl-results-table').html() ), @@ -100,20 +100,20 @@ }, render: function() { this.$el.html( this.template() ); - + var frag = document.createDocumentFragment(); this.collection.each(function(record) { var view = new app.ResultsRowView({ model: record }); frag.appendChild(view.render().el); }, this); $('#results-rows').append(frag); - + if (this.collection.length === 0) { $('#results-rows').append( $('#tmpl-results-empty-row').html() ); } } }); - + app.ResultsRowView = Backbone.View.extend({ tagName: 'tr', template: _.template( $('#tmpl-results-row').html() ), @@ -128,7 +128,7 @@ return this; } }); - + app.FilterView = Backbone.View.extend({ el: '#filters', template: _.template( $('#tmpl-filters').html() ), @@ -144,7 +144,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -158,12 +158,12 @@ if (event.keyCode !== 13) { return; } this.filter(); }, - filter: function() { + filter: function() { var query = $('#filters form').serialize(); - Backbone.history.navigate('q/'+ query, { trigger: true }); + Backbone.history.navigate('q/'+ query, { trigger: true }); } }); - + app.PagingView = Backbone.View.extend({ el: '#results-paging', template: _.template( $('#tmpl-results-paging').html() ), @@ -178,11 +178,11 @@ render: function() { if (this.model.get('pages').total > 1) { this.$el.html(this.template( this.model.attributes )); - + if (!this.model.get('pages').hasPrev) { this.$el.find('.btn-prev').attr('disabled', 'disabled'); } - + if (!this.model.get('pages').hasNext) { this.$el.find('.btn-next').attr('disabled', 'disabled'); } @@ -193,24 +193,24 @@ }, goToPage: function(event) { var query = $('#filters form').serialize() +'&page='+ $(event.target).data('page'); - Backbone.history.navigate('q/'+ query, { trigger: true }); + Backbone.history.navigate('q/'+ query, { trigger: true }); $('body').scrollTop(0); } }); - + app.MainView = Backbone.View.extend({ el: '.page .container', initialize: function() { app.mainView = this; this.results = JSON.parse( unescape($('#data-results').html()) ); - + app.headerView = new app.HeaderView(); app.resultsView = new app.ResultsView(); app.filterView = new app.FilterView(); app.pagingView = new app.PagingView(); } }); - + app.Router = Backbone.Router.extend({ routes: { '': 'default', @@ -223,7 +223,7 @@ if (!app.firstLoad) { app.resultsView.collection.fetch({ reset: true }); } - + app.firstLoad = false; }, query: function(params) { @@ -231,7 +231,7 @@ app.firstLoad = false; } }); - + $(document).ready(function() { app.firstLoad = true; app.router = new app.Router(); diff --git a/public/views/admin/administrators/index.less b/public/views/admin/administrators/index.less index 42f068702..489d7abd6 100644 --- a/public/views/admin/administrators/index.less +++ b/public/views/admin/administrators/index.less @@ -2,11 +2,11 @@ .input-group { margin-bottom: 20px; - + input { width: 200px !important; } - + .btn { .border-left-radius(0); } diff --git a/public/views/admin/categories/details.js b/public/views/admin/categories/details.js index 8c743e886..e8787c5a9 100644 --- a/public/views/admin/categories/details.js +++ b/public/views/admin/categories/details.js @@ -2,16 +2,16 @@ (function() { 'use strict'; - + app = app || {}; - + app.Category = Backbone.Model.extend({ idAttribute: '_id', url: function() { return '/admin/categories/'+ this.id +'/'; } }); - + app.Delete = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -23,7 +23,7 @@ return '/admin/categories/'+ app.mainView.model.id +'/'; } }); - + app.Details = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -41,11 +41,11 @@ app.mainView.model.set(response.category); delete response.category; } - + return response; } }); - + app.HeaderView = Backbone.View.extend({ el: '#header', template: _.template( $('#tmpl-header').html() ), @@ -58,7 +58,7 @@ this.$el.html(this.template( this.model.attributes )); } }); - + app.DetailsView = Backbone.View.extend({ el: '#details', template: _.template( $('#tmpl-details').html() ), @@ -81,7 +81,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -95,7 +95,7 @@ }); } }); - + app.DeleteView = Backbone.View.extend({ el: '#delete', template: _.template( $('#tmpl-delete').html() ), @@ -125,19 +125,19 @@ } } }); - + app.MainView = Backbone.View.extend({ el: '.page .container', initialize: function() { app.mainView = this; this.model = new app.Category( JSON.parse( unescape($('#data-record').html()) ) ); - + app.headerView = new app.HeaderView(); app.detailsView = new app.DetailsView(); app.deleteView = new app.DeleteView(); } }); - + $(document).ready(function() { app.mainView = new app.MainView(); }); diff --git a/public/views/admin/categories/index.js b/public/views/admin/categories/index.js index f2e5320ae..063081d81 100644 --- a/public/views/admin/categories/index.js +++ b/public/views/admin/categories/index.js @@ -2,9 +2,9 @@ (function() { 'use strict'; - + app = app || {}; - + app.Record = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -16,7 +16,7 @@ return '/admin/categories/'+ (this.isNew() ? '' : this.id +'/'); } }); - + app.RecordCollection = Backbone.Collection.extend({ model: app.Record, url: '/admin/categories/', @@ -29,7 +29,7 @@ return results.data; } }); - + app.Filter = Backbone.Model.extend({ defaults: { pivot: '', @@ -38,14 +38,14 @@ limit: '' } }); - + app.Paging = Backbone.Model.extend({ defaults: { pages: {}, items: {} } }); - + app.HeaderView = Backbone.View.extend({ el: '#header', template: _.template( $('#tmpl-header').html() ), @@ -96,7 +96,7 @@ } } }); - + app.ResultsView = Backbone.View.extend({ el: '#results-table', template: _.template( $('#tmpl-results-table').html() ), @@ -107,20 +107,20 @@ }, render: function() { this.$el.html( this.template() ); - + var frag = document.createDocumentFragment(); this.collection.each(function(record) { var view = new app.ResultsRowView({ model: record }); frag.appendChild(view.render().el); }, this); $('#results-rows').append(frag); - + if (this.collection.length === 0) { $('#results-rows').append( $('#tmpl-results-empty-row').html() ); } } }); - + app.ResultsRowView = Backbone.View.extend({ tagName: 'tr', template: _.template( $('#tmpl-results-row').html() ), @@ -135,7 +135,7 @@ return this; } }); - + app.FilterView = Backbone.View.extend({ el: '#filters', template: _.template( $('#tmpl-filters').html() ), @@ -151,7 +151,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -165,12 +165,12 @@ if (event.keyCode !== 13) { return; } this.filter(); }, - filter: function() { + filter: function() { var query = $('#filters form').serialize(); - Backbone.history.navigate('q/'+ query, { trigger: true }); + Backbone.history.navigate('q/'+ query, { trigger: true }); } }); - + app.PagingView = Backbone.View.extend({ el: '#results-paging', template: _.template( $('#tmpl-results-paging').html() ), @@ -185,11 +185,11 @@ render: function() { if (this.model.get('pages').total > 1) { this.$el.html(this.template( this.model.attributes )); - + if (!this.model.get('pages').hasPrev) { this.$el.find('.btn-prev').attr('disabled', 'disabled'); } - + if (!this.model.get('pages').hasNext) { this.$el.find('.btn-next').attr('disabled', 'disabled'); } @@ -200,24 +200,24 @@ }, goToPage: function(event) { var query = $('#filters form').serialize() +'&page='+ $(event.target).data('page'); - Backbone.history.navigate('q/'+ query, { trigger: true }); + Backbone.history.navigate('q/'+ query, { trigger: true }); $('body').scrollTop(0); } }); - + app.MainView = Backbone.View.extend({ el: '.page .container', initialize: function() { app.mainView = this; this.results = JSON.parse( unescape($('#data-results').html()) ); - + app.headerView = new app.HeaderView(); app.resultsView = new app.ResultsView(); app.filterView = new app.FilterView(); app.pagingView = new app.PagingView(); } }); - + app.Router = Backbone.Router.extend({ routes: { '': 'default', @@ -230,7 +230,7 @@ if (!app.firstLoad) { app.resultsView.collection.fetch({ reset: true }); } - + app.firstLoad = false; }, query: function(params) { @@ -238,7 +238,7 @@ app.firstLoad = false; } }); - + $(document).ready(function() { app.firstLoad = true; app.router = new app.Router(); diff --git a/public/views/admin/categories/index.less b/public/views/admin/categories/index.less index ed4d68eef..201e54a55 100644 --- a/public/views/admin/categories/index.less +++ b/public/views/admin/categories/index.less @@ -3,19 +3,19 @@ .input-group { margin-bottom: 20px; - + input { width: 100px !important; - + @media screen and (min-width: @grid-float-breakpoint) { width: 160px !important; } } - + input:nth-child(2) { border-left: none; } - + .btn { .border-left-radius(0) } diff --git a/public/views/admin/statuses/details.js b/public/views/admin/statuses/details.js index d93709d1c..af117041a 100644 --- a/public/views/admin/statuses/details.js +++ b/public/views/admin/statuses/details.js @@ -2,16 +2,16 @@ (function() { 'use strict'; - + app = app || {}; - + app.Status = Backbone.Model.extend({ idAttribute: '_id', url: function() { return '/admin/statuses/'+ this.id +'/'; } }); - + app.Delete = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -23,7 +23,7 @@ return '/admin/statuses/'+ app.mainView.model.id +'/'; } }); - + app.Details = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -41,11 +41,11 @@ app.mainView.model.set(response.status); delete response.status; } - + return response; } }); - + app.HeaderView = Backbone.View.extend({ el: '#header', template: _.template( $('#tmpl-header').html() ), @@ -58,7 +58,7 @@ this.$el.html(this.template( this.model.attributes )); } }); - + app.DetailsView = Backbone.View.extend({ el: '#details', template: _.template( $('#tmpl-details').html() ), @@ -81,7 +81,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -95,7 +95,7 @@ }); } }); - + app.DeleteView = Backbone.View.extend({ el: '#delete', template: _.template( $('#tmpl-delete').html() ), @@ -125,19 +125,19 @@ } } }); - + app.MainView = Backbone.View.extend({ el: '.page .container', initialize: function() { app.mainView = this; this.model = new app.Status( JSON.parse( unescape($('#data-record').html()) ) ); - + app.headerView = new app.HeaderView(); app.detailsView = new app.DetailsView(); app.deleteView = new app.DeleteView(); } }); - + $(document).ready(function() { app.mainView = new app.MainView(); }); diff --git a/public/views/admin/statuses/index.js b/public/views/admin/statuses/index.js index 43b6f485c..39693bd3d 100644 --- a/public/views/admin/statuses/index.js +++ b/public/views/admin/statuses/index.js @@ -2,9 +2,9 @@ (function() { 'use strict'; - + app = app || {}; - + app.Record = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -16,7 +16,7 @@ return '/admin/statuses/'+ (this.isNew() ? '' : this.id +'/'); } }); - + app.RecordCollection = Backbone.Collection.extend({ model: app.Record, url: '/admin/statuses/', @@ -29,7 +29,7 @@ return results.data; } }); - + app.Filter = Backbone.Model.extend({ defaults: { pivot: '', @@ -38,14 +38,14 @@ limit: '' } }); - + app.Paging = Backbone.Model.extend({ defaults: { pages: {}, items: {} } }); - + app.HeaderView = Backbone.View.extend({ el: '#header', template: _.template( $('#tmpl-header').html() ), @@ -96,7 +96,7 @@ } } }); - + app.ResultsView = Backbone.View.extend({ el: '#results-table', template: _.template( $('#tmpl-results-table').html() ), @@ -107,20 +107,20 @@ }, render: function() { this.$el.html( this.template() ); - + var frag = document.createDocumentFragment(); this.collection.each(function(record) { var view = new app.ResultsRowView({ model: record }); frag.appendChild(view.render().el); }, this); $('#results-rows').append(frag); - + if (this.collection.length === 0) { $('#results-rows').append( $('#tmpl-results-empty-row').html() ); } } }); - + app.ResultsRowView = Backbone.View.extend({ tagName: 'tr', template: _.template( $('#tmpl-results-row').html() ), @@ -135,7 +135,7 @@ return this; } }); - + app.FilterView = Backbone.View.extend({ el: '#filters', template: _.template( $('#tmpl-filters').html() ), @@ -151,7 +151,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -165,12 +165,12 @@ if (event.keyCode !== 13) { return; } this.filter(); }, - filter: function() { + filter: function() { var query = $('#filters form').serialize(); - Backbone.history.navigate('q/'+ query, { trigger: true }); + Backbone.history.navigate('q/'+ query, { trigger: true }); } }); - + app.PagingView = Backbone.View.extend({ el: '#results-paging', template: _.template( $('#tmpl-results-paging').html() ), @@ -185,11 +185,11 @@ render: function() { if (this.model.get('pages').total > 1) { this.$el.html(this.template( this.model.attributes )); - + if (!this.model.get('pages').hasPrev) { this.$el.find('.btn-prev').attr('disabled', 'disabled'); } - + if (!this.model.get('pages').hasNext) { this.$el.find('.btn-next').attr('disabled', 'disabled'); } @@ -200,24 +200,24 @@ }, goToPage: function(event) { var query = $('#filters form').serialize() +'&page='+ $(event.target).data('page'); - Backbone.history.navigate('q/'+ query, { trigger: true }); + Backbone.history.navigate('q/'+ query, { trigger: true }); $('body').scrollTop(0); } }); - + app.MainView = Backbone.View.extend({ el: '.page .container', initialize: function() { app.mainView = this; this.results = JSON.parse( unescape($('#data-results').html()) ); - + app.headerView = new app.HeaderView(); app.resultsView = new app.ResultsView(); app.filterView = new app.FilterView(); app.pagingView = new app.PagingView(); } }); - + app.Router = Backbone.Router.extend({ routes: { '': 'default', @@ -230,7 +230,7 @@ if (!app.firstLoad) { app.resultsView.collection.fetch({ reset: true }); } - + app.firstLoad = false; }, query: function(params) { @@ -238,7 +238,7 @@ app.firstLoad = false; } }); - + $(document).ready(function() { app.firstLoad = true; app.router = new app.Router(); diff --git a/public/views/admin/statuses/index.less b/public/views/admin/statuses/index.less index ed4d68eef..201e54a55 100644 --- a/public/views/admin/statuses/index.less +++ b/public/views/admin/statuses/index.less @@ -3,19 +3,19 @@ .input-group { margin-bottom: 20px; - + input { width: 100px !important; - + @media screen and (min-width: @grid-float-breakpoint) { width: 160px !important; } } - + input:nth-child(2) { border-left: none; } - + .btn { .border-left-radius(0) } diff --git a/public/views/admin/users/details.js b/public/views/admin/users/details.js index 13ef78031..a7345209c 100644 --- a/public/views/admin/users/details.js +++ b/public/views/admin/users/details.js @@ -2,16 +2,16 @@ (function() { 'use strict'; - + app = app || {}; - + app.User = Backbone.Model.extend({ idAttribute: '_id', url: function() { return '/admin/users/'+ this.id +'/'; } }); - + app.Delete = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -23,7 +23,7 @@ return '/admin/users/'+ app.mainView.model.id +'/'; } }); - + app.Identity = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -42,11 +42,11 @@ app.mainView.model.set(response.user); delete response.user; } - + return response; } }); - + app.Roles = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -65,11 +65,11 @@ app.mainView.model.set(response.user); delete response.user; } - + return response; } }); - + app.Password = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -87,11 +87,11 @@ app.mainView.model.set(response.user); delete response.user; } - + return response; } }); - + app.HeaderView = Backbone.View.extend({ el: '#header', template: _.template( $('#tmpl-header').html() ), @@ -104,7 +104,7 @@ this.$el.html(this.template( this.model.attributes )); } }); - + app.IdentityView = Backbone.View.extend({ el: '#identity', template: _.template( $('#tmpl-identity').html() ), @@ -128,7 +128,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -143,7 +143,7 @@ }); } }); - + app.RolesView = Backbone.View.extend({ el: '#roles', template: _.template( $('#tmpl-roles').html() ), @@ -170,7 +170,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -196,7 +196,7 @@ app.mainView.model.set(response.user); delete response.user; } - + app.rolesView.model.set(response); } }); @@ -221,14 +221,14 @@ app.mainView.model.set(response.user); delete response.user; } - + app.rolesView.model.set(response); } }); } } }); - + app.PasswordView = Backbone.View.extend({ el: '#password', template: _.template( $('#tmpl-password').html() ), @@ -242,7 +242,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -256,7 +256,7 @@ }); } }); - + app.DeleteView = Backbone.View.extend({ el: '#delete', template: _.template( $('#tmpl-delete').html() ), @@ -286,13 +286,13 @@ } } }); - + app.MainView = Backbone.View.extend({ el: '.page .container', initialize: function() { app.mainView = this; this.model = new app.User( JSON.parse( unescape($('#data-record').html())) ); - + app.headerView = new app.HeaderView(); app.identityView = new app.IdentityView(); app.passwordView = new app.PasswordView(); @@ -300,7 +300,7 @@ app.deleteView = new app.DeleteView(); } }); - + $(document).ready(function() { app.mainView = new app.MainView(); }); diff --git a/public/views/admin/users/index.js b/public/views/admin/users/index.js index 08f30d2ca..b651d782d 100644 --- a/public/views/admin/users/index.js +++ b/public/views/admin/users/index.js @@ -2,9 +2,9 @@ (function() { 'use strict'; - + app = app || {}; - + app.Record = Backbone.Model.extend({ idAttribute: '_id', defaults: { @@ -17,7 +17,7 @@ return '/admin/users/'+ (this.isNew() ? '' : this.id +'/'); } }); - + app.RecordCollection = Backbone.Collection.extend({ model: app.Record, url: '/admin/users/', @@ -30,7 +30,7 @@ return results.data; } }); - + app.Filter = Backbone.Model.extend({ defaults: { username: '', @@ -40,14 +40,14 @@ limit: '' } }); - + app.Paging = Backbone.Model.extend({ defaults: { pages: {}, items: {} } }); - + app.HeaderView = Backbone.View.extend({ el: '#header', template: _.template( $('#tmpl-header').html() ), @@ -93,7 +93,7 @@ } } }); - + app.ResultsView = Backbone.View.extend({ el: '#results-table', template: _.template( $('#tmpl-results-table').html() ), @@ -104,20 +104,20 @@ }, render: function() { this.$el.html( this.template() ); - + var frag = document.createDocumentFragment(); this.collection.each(function(record) { var view = new app.ResultsRowView({ model: record }); frag.appendChild(view.render().el); }, this); $('#results-rows').append(frag); - + if (this.collection.length === 0) { $('#results-rows').append( $('#tmpl-results-empty-row').html() ); } } }); - + app.ResultsRowView = Backbone.View.extend({ tagName: 'tr', template: _.template( $('#tmpl-results-row').html() ), @@ -132,7 +132,7 @@ return this; } }); - + app.FilterView = Backbone.View.extend({ el: '#filters', template: _.template( $('#tmpl-filters').html() ), @@ -148,7 +148,7 @@ }, render: function() { this.$el.html(this.template( this.model.attributes )); - + for (var key in this.model.attributes) { if (this.model.attributes.hasOwnProperty(key)) { this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); @@ -162,12 +162,12 @@ if (event.keyCode !== 13) { return; } this.filter(); }, - filter: function() { + filter: function() { var query = $('#filters form').serialize(); - Backbone.history.navigate('q/'+ query, { trigger: true }); + Backbone.history.navigate('q/'+ query, { trigger: true }); } }); - + app.PagingView = Backbone.View.extend({ el: '#results-paging', template: _.template( $('#tmpl-results-paging').html() ), @@ -182,11 +182,11 @@ render: function() { if (this.model.get('pages').total > 1) { this.$el.html(this.template( this.model.attributes )); - + if (!this.model.get('pages').hasPrev) { this.$el.find('.btn-prev').attr('disabled', 'disabled'); } - + if (!this.model.get('pages').hasNext) { this.$el.find('.btn-next').attr('disabled', 'disabled'); } @@ -197,24 +197,24 @@ }, goToPage: function(event) { var query = $('#filters form').serialize() +'&page='+ $(event.target).data('page'); - Backbone.history.navigate('q/'+ query, { trigger: true }); + Backbone.history.navigate('q/'+ query, { trigger: true }); $('body').scrollTop(0); } }); - + app.MainView = Backbone.View.extend({ el: '.page .container', initialize: function() { app.mainView = this; this.results = JSON.parse( $('#data-results').html() ); - + app.headerView = new app.HeaderView(); app.resultsView = new app.ResultsView(); app.filterView = new app.FilterView(); app.pagingView = new app.PagingView(); } }); - + app.Router = Backbone.Router.extend({ routes: { '': 'default', @@ -227,7 +227,7 @@ if (!app.firstLoad) { app.resultsView.collection.fetch({ reset: true }); } - + app.firstLoad = false; }, query: function(params) { @@ -235,7 +235,7 @@ app.firstLoad = false; } }); - + $(document).ready(function() { app.firstLoad = true; app.router = new app.Router(); diff --git a/public/views/admin/users/index.less b/public/views/admin/users/index.less index 42f068702..489d7abd6 100644 --- a/public/views/admin/users/index.less +++ b/public/views/admin/users/index.less @@ -2,11 +2,11 @@ .input-group { margin-bottom: 20px; - + input { width: 200px !important; } - + .btn { .border-left-radius(0); } diff --git a/public/views/contact/index.js b/public/views/contact/index.js index bd260ccf9..e777ec1b7 100644 --- a/public/views/contact/index.js +++ b/public/views/contact/index.js @@ -2,9 +2,9 @@ (function() { 'use strict'; - + app = app || {}; - + app.Contact = Backbone.Model.extend({ url: '/contact/', defaults: { @@ -16,7 +16,7 @@ message: '' } }); - + app.ContactView = Backbone.View.extend({ el: '#contact', template: _.template( $('#tmpl-contact').html() ), @@ -38,7 +38,7 @@ }, contact: function() { this.$el.find('.btn-contact').attr('disabled', true); - + this.model.save({ name: this.$el.find('[name="name"]').val(), email: this.$el.find('[name="email"]').val(), @@ -46,7 +46,7 @@ }); } }); - + $(document).ready(function() { app.contactView = new app.ContactView(); }); diff --git a/public/views/index.less b/public/views/index.less index 9a5289a76..91f25dc0d 100644 --- a/public/views/index.less +++ b/public/views/index.less @@ -4,11 +4,11 @@ background-color: transparent; text-align: center; padding: 30px 60px; - + h1 { font-weight: bold; } - + @media (max-width: @screen-tablet) { h1 { font-size: (@font-size-base * 3.5); diff --git a/public/views/login/forgot/index.js b/public/views/login/forgot/index.js index 12ee4656a..7d570d686 100644 --- a/public/views/login/forgot/index.js +++ b/public/views/login/forgot/index.js @@ -2,9 +2,9 @@ (function() { 'use strict'; - + app = app || {}; - + app.Forgot = Backbone.Model.extend({ url: '/login/forgot/', defaults: { @@ -14,7 +14,7 @@ email: '', } }); - + app.ForgotView = Backbone.View.extend({ el: '#forgot', template: _.template( $('#tmpl-forgot').html() ), @@ -43,13 +43,13 @@ }, forgot: function() { this.$el.find('.btn-forgot').attr('disabled', true); - + this.model.save({ email: this.$el.find('[name="email"]').val() }); } }); - + $(document).ready(function() { app.forgotView = new app.ForgotView(); }); diff --git a/public/views/login/index.js b/public/views/login/index.js index 5119c3ddd..f3eb15231 100644 --- a/public/views/login/index.js +++ b/public/views/login/index.js @@ -2,9 +2,9 @@ (function() { 'use strict'; - + app = app || {}; - + app.Login = Backbone.Model.extend({ url: '/login/', defaults: { @@ -14,7 +14,7 @@ password: '' } }); - + app.LoginView = Backbone.View.extend({ el: '#login', template: _.template( $('#tmpl-login').html() ), @@ -43,7 +43,7 @@ }, login: function() { this.$el.find('.btn-login').attr('disabled', true); - + this.model.save({ username: this.$el.find('[name="username"]').val(), password: this.$el.find('[name="password"]').val() @@ -63,7 +63,7 @@ }); } }); - + $(document).ready(function() { app.loginView = new app.LoginView(); }); diff --git a/public/views/login/reset/index.js b/public/views/login/reset/index.js index ba899e4ed..a5e645a5b 100644 --- a/public/views/login/reset/index.js +++ b/public/views/login/reset/index.js @@ -2,9 +2,9 @@ (function() { 'use strict'; - + app = app || {}; - + app.Reset = Backbone.Model.extend({ defaults: { success: false, @@ -18,7 +18,7 @@ return '/login/reset/'+ this.id +'/'; } }); - + app.ResetView = Backbone.View.extend({ el: '#reset', template: _.template( $('#tmpl-reset').html() ), @@ -46,14 +46,14 @@ }, reset: function() { this.$el.find('.btn-reset').attr('disabled', true); - + this.model.save({ password: this.$el.find('[name="password"]').val(), confirm: this.$el.find('[name="confirm"]').val() }); } }); - + app.Router = Backbone.Router.extend({ routes: { 'login/reset/': 'start', @@ -63,7 +63,7 @@ app.resetView = new app.ResetView({ model: new app.Reset({ id: token }) }); } }); - + $(document).ready(function() { app.router = new app.Router(); Backbone.history.start({ pushState: true }); diff --git a/public/views/signup/index.js b/public/views/signup/index.js index ba2074740..b3644b671 100644 --- a/public/views/signup/index.js +++ b/public/views/signup/index.js @@ -2,9 +2,9 @@ (function() { 'use strict'; - + app = app || {}; - + app.Signup = Backbone.Model.extend({ url: '/signup/', defaults: { @@ -15,7 +15,7 @@ password: '' } }); - + app.SignupView = Backbone.View.extend({ el: '#signup', template: _.template( $('#tmpl-signup').html() ), @@ -44,7 +44,7 @@ }, signup: function() { this.$el.find('.btn-signup').attr('disabled', true); - + this.model.save({ username: this.$el.find('[name="username"]').val(), email: this.$el.find('[name="email"]').val(), @@ -61,7 +61,7 @@ }); } }); - + $(document).ready(function() { app.signupView = new app.SignupView(); }); diff --git a/public/views/signup/social.js b/public/views/signup/social.js index 1d24fcd4d..e26fe9051 100644 --- a/public/views/signup/social.js +++ b/public/views/signup/social.js @@ -2,9 +2,9 @@ (function() { 'use strict'; - + app = app || {}; - + app.Signup = Backbone.Model.extend({ url: '/signup/social/', defaults: { @@ -13,7 +13,7 @@ email: '' } }); - + app.SignupView = Backbone.View.extend({ el: '#signup', template: _.template( $('#tmpl-signup').html() ), @@ -42,7 +42,7 @@ }, signup: function() { this.$el.find('.btn-signup').attr('disabled', true); - + this.model.save({ email: this.$el.find('[name="email"]').val() },{ @@ -57,7 +57,7 @@ }); } }); - + $(document).ready(function() { app.signupView = new app.SignupView(); }); diff --git a/routes.js b/routes.js index 3803382fe..02362346b 100644 --- a/routes.js +++ b/routes.js @@ -33,11 +33,11 @@ exports = module.exports = function(app, passport) { app.get('/about/', require('./views/about/index').init); app.get('/contact/', require('./views/contact/index').init); app.post('/contact/', require('./views/contact/index').sendMessage); - + //sign up app.get('/signup/', require('./views/signup/index').init); app.post('/signup/', require('./views/signup/index').signup); - + //social sign up app.post('/signup/social/', require('./views/signup/index').signupSocial); app.get('/signup/twitter/', passport.authenticate('twitter', { callbackURL: '/signup/twitter/callback/' })); @@ -46,7 +46,7 @@ exports = module.exports = function(app, passport) { app.get('/signup/github/callback/', require('./views/signup/index').signupGitHub); app.get('/signup/facebook/', passport.authenticate('facebook', { callbackURL: '/signup/facebook/callback/' })); app.get('/signup/facebook/callback/', require('./views/signup/index').signupFacebook); - + //login/out app.get('/login/', require('./views/login/index').init); app.post('/login/', require('./views/login/index').login); @@ -56,7 +56,7 @@ exports = module.exports = function(app, passport) { app.get('/login/reset/:token/', require('./views/login/reset/index').init); app.put('/login/reset/:token/', require('./views/login/reset/index').set); app.get('/logout/', require('./views/logout/index').init); - + //social login app.get('/login/twitter/', passport.authenticate('twitter', { callbackURL: '/login/twitter/callback/' })); app.get('/login/twitter/callback/', require('./views/login/index').loginTwitter); @@ -64,12 +64,12 @@ exports = module.exports = function(app, passport) { app.get('/login/github/callback/', require('./views/login/index').loginGitHub); app.get('/login/facebook/', passport.authenticate('facebook', { callbackURL: '/login/facebook/callback/' })); app.get('/login/facebook/callback/', require('./views/login/index').loginFacebook); - + //admin app.all('/admin*', ensureAuthenticated); app.all('/admin*', ensureAdmin); app.get('/admin/', require('./views/admin/index').init); - + //admin > users app.get('/admin/users/', require('./views/admin/users/index').find); app.post('/admin/users/', require('./views/admin/users/index').create); @@ -81,7 +81,7 @@ exports = module.exports = function(app, passport) { app.put('/admin/users/:id/role-account/', require('./views/admin/users/index').linkAccount); app.delete('/admin/users/:id/role-account/', require('./views/admin/users/index').unlinkAccount); app.delete('/admin/users/:id/', require('./views/admin/users/index').delete); - + //admin > administrators app.get('/admin/administrators/', require('./views/admin/administrators/index').find); app.post('/admin/administrators/', require('./views/admin/administrators/index').create); @@ -92,7 +92,7 @@ exports = module.exports = function(app, passport) { app.put('/admin/administrators/:id/user/', require('./views/admin/administrators/index').linkUser); app.delete('/admin/administrators/:id/user/', require('./views/admin/administrators/index').unlinkUser); app.delete('/admin/administrators/:id/', require('./views/admin/administrators/index').delete); - + //admin > admin groups app.get('/admin/admin-groups/', require('./views/admin/admin-groups/index').find); app.post('/admin/admin-groups/', require('./views/admin/admin-groups/index').create); @@ -100,7 +100,7 @@ exports = module.exports = function(app, passport) { app.put('/admin/admin-groups/:id/', require('./views/admin/admin-groups/index').update); app.put('/admin/admin-groups/:id/permissions/', require('./views/admin/admin-groups/index').permissions); app.delete('/admin/admin-groups/:id/', require('./views/admin/admin-groups/index').delete); - + //admin > accounts app.get('/admin/accounts/', require('./views/admin/accounts/index').find); app.post('/admin/accounts/', require('./views/admin/accounts/index').create); @@ -111,40 +111,40 @@ exports = module.exports = function(app, passport) { app.post('/admin/accounts/:id/notes/', require('./views/admin/accounts/index').newNote); app.post('/admin/accounts/:id/status/', require('./views/admin/accounts/index').newStatus); app.delete('/admin/accounts/:id/', require('./views/admin/accounts/index').delete); - + //admin > statuses app.get('/admin/statuses/', require('./views/admin/statuses/index').find); app.post('/admin/statuses/', require('./views/admin/statuses/index').create); app.get('/admin/statuses/:id/', require('./views/admin/statuses/index').read); app.put('/admin/statuses/:id/', require('./views/admin/statuses/index').update); app.delete('/admin/statuses/:id/', require('./views/admin/statuses/index').delete); - + //admin > categories app.get('/admin/categories/', require('./views/admin/categories/index').find); app.post('/admin/categories/', require('./views/admin/categories/index').create); app.get('/admin/categories/:id/', require('./views/admin/categories/index').read); app.put('/admin/categories/:id/', require('./views/admin/categories/index').update); app.delete('/admin/categories/:id/', require('./views/admin/categories/index').delete); - + //admin > search app.get('/admin/search/', require('./views/admin/search/index').find); - + //account app.all('/account*', ensureAuthenticated); app.all('/account*', ensureAccount); app.get('/account/', require('./views/account/index').init); - + //account > verification app.get('/account/verification/', require('./views/account/verification/index').init); app.post('/account/verification/', require('./views/account/verification/index').resendVerification); app.get('/account/verification/:token/', require('./views/account/verification/index').verify); - + //account > settings app.get('/account/settings/', require('./views/account/settings/index').init); app.put('/account/settings/', require('./views/account/settings/index').update); app.put('/account/settings/identity/', require('./views/account/settings/index').identity); app.put('/account/settings/password/', require('./views/account/settings/index').password); - + //account > settings > social app.get('/account/settings/twitter/', passport.authenticate('twitter', { callbackURL: '/account/settings/twitter/callback/' })); app.get('/account/settings/twitter/callback/', require('./views/account/settings/index').connectTwitter); @@ -155,7 +155,7 @@ exports = module.exports = function(app, passport) { app.get('/account/settings/facebook/', passport.authenticate('facebook', { callbackURL: '/account/settings/facebook/callback/' })); app.get('/account/settings/facebook/callback/', require('./views/account/settings/index').connectFacebook); app.get('/account/settings/facebook/disconnect/', require('./views/account/settings/index').disconnectFacebook); - + //route not found app.all('*', require('./views/http/index').http404); }; diff --git a/schema/Admin.js b/schema/Admin.js index 621f0d866..706eb7798 100644 --- a/schema/Admin.js +++ b/schema/Admin.js @@ -32,18 +32,18 @@ exports = module.exports = function(app, mongoose) { } } } - + //check admin permissions for (var k = 0 ; k < this.permissions.length ; k++) { if (this.permissions[k].name === something) { if (this.permissions[k].permit) { return true; } - + return false; } } - + return groupHasPermission; }; adminSchema.methods.isMemberOf = function(group) { @@ -52,7 +52,7 @@ exports = module.exports = function(app, mongoose) { return true; } } - + return false; }; adminSchema.plugin(require('./plugins/pagedFind')); diff --git a/schema/User.js b/schema/User.js index e18af6319..f1b1a1a9a 100644 --- a/schema/User.js +++ b/schema/User.js @@ -21,11 +21,11 @@ exports = module.exports = function(app, mongoose) { if (role === "admin" && this.roles.admin) { return true; } - + if (role === "account" && this.roles.account) { return true; } - + return false; }; userSchema.methods.defaultReturnUrl = function() { @@ -33,11 +33,11 @@ exports = module.exports = function(app, mongoose) { if (this.canPlayRoleOf('account')) { returnUrl = '/account/'; } - + if (this.canPlayRoleOf('admin')) { returnUrl = '/admin/'; } - + return returnUrl; }; userSchema.statics.encryptPassword = function(password) { diff --git a/schema/plugins/pagedFind.js b/schema/plugins/pagedFind.js index 529690eff..15971a497 100644 --- a/schema/plugins/pagedFind.js +++ b/schema/plugins/pagedFind.js @@ -3,30 +3,30 @@ module.exports = exports = function pagedFindPlugin (schema) { schema.statics.pagedFind = function(options, cb) { var thisSchema = this; - + if (!options.filters) { options.filters = {}; } - + if (!options.keys) { options.keys = ''; } - + if (!options.limit) { options.limit = 20; } - + if (!options.page) { options.page = 1; } - + if (!options.sort) { options.sort = {}; } - + var output = { data: null, - pages: { + pages: { current: options.page, prev: 0, hasPrev: false, @@ -34,20 +34,20 @@ module.exports = exports = function pagedFindPlugin (schema) { hasNext: false, total: 0 }, - items: { - begin: ((options.page * options.limit) - options.limit) + 1, - end: options.page * options.limit, - total: 0 + items: { + begin: ((options.page * options.limit) - options.limit) + 1, + end: options.page * options.limit, + total: 0 } }; - + var countResults = function(callback) { thisSchema.count(options.filters, function(err, count) { output.items.total = count; callback(null, 'done counting'); }); }; - + var getResults = function(callback) { var query = thisSchema.find(options.filters, options.keys); query.skip((options.page - 1) * options.limit); @@ -58,16 +58,16 @@ module.exports = exports = function pagedFindPlugin (schema) { callback(null, 'done getting records'); }); }; - + require('async').parallel([ - countResults, + countResults, getResults ], function(err, results){ if (err) { cb(err, null); } - + //final paging math output.pages.total = Math.ceil(output.items.total / options.limit); output.pages.next = ((output.pages.current + 1) > output.pages.total ? 0 : output.pages.current + 1); @@ -77,7 +77,7 @@ module.exports = exports = function pagedFindPlugin (schema) { if (output.items.end > output.items.total) { output.items.end = output.items.total; } - + cb(null, output); }); }; diff --git a/views/about/index.jade b/views/about/index.jade index 3380d49cf..0552d7f5c 100644 --- a/views/about/index.jade +++ b/views/about/index.jade @@ -15,19 +15,19 @@ block body a.pull-left(href='#') img.media-object(src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAG/0lEQVR4Xu2d+U8USxDHC+VQQLmRQ+NPBhGIQCB4Rf92jngggkpAIMYQBIyigHiDwnvfzut9s8Muu9ayO5vqbycmMDPVdtX3M91VNSZWbG9vHwlHsBGoIADBau8cJwBh608AAtefABAAJoFBM8AcIGj5mQQGLj8BIADsA4TNAHOAsPVnGRi4/gSAALAPEDQDzAGClp9lYODyEwACwD5A2AwwBwhbf5aBgetPAAgA+wBBM8AcIGj5WQYGLj8BIADsA4TNAHOAsPVnGRi4/gSAALAPEDQDzAGClp9lYODyEwACwD5A2AwwBwhbf5aBgetPAAgA+wBBM8AcIGj5WQYGLj8BIADsA4TNAHOAsPVnGRi4/gSAALAPEDQDzAGClp9lYODyEwACwD5A2AwwBwhbf5aBgetPAAgA+wBBM1BWOcDPnz9lY2ND/k1MnShnz56VpqYmuXLlilRWVuYUCrZ//vxJPdfW1ibnz5/PaZfPA+W8tnzWn+2ZsgFgfX1dlpaWsvrS398vHR0dWe9D/FevXqXdv3HjhnR1dRUSH2dbzmsr1LmyAODjx4/y/PnznL6Mjo5KQ0PDsed+//4tExMTcnh4mHavr69POjs7c8570gPlvLaCHPvPOHEAsGVPTk4KRPQD23Z7e7usra3J0dH//69lS0uLDA0NHfN7fn5e3r9/f+x6oQCU89pOQ3zMkTgA8Tesurpa7t27J2fOnJGvX7/K48ePU74iJ3jw4IG758fu7q7MzMy4a9l2AFzf2dmRiooKZ4bfL1y4IDU1Nal5cN/D5u9/+fIlbWcqxtpOS0jtPIkDgHMfZ6wfIyMj0tjYmPr927dvLrGDOFVVVVJbW5u6h2sPHz6UHz9+uGu49/3799R9vwPs7++7XSa6m5w7d07u3r3roHj37p0sLCykxRD5w97eXtHXphXutOwSB+DRo0cCkTGQ6Q8PDwvearz9EOzixYsukcPbHx9v376V5eVldxlvJ0SL5hLRI2Bzc1MWFxfTpujp6ZHLly/L+Ph42hEEAAFiqdZ2WmJq5kkcAGzxEDvTFh51aGBgQC5dupS6hLd6amoqte3fvHnTQfD06dNjO4C/8OzZM3cU+AHgUCpiB/ADO8L9+/fdblPKtWnEOw2bRAE4ODhwIkZr95OcGhwclNbWVvfIixcvZGtry/1cX18vt27dcv2D2dnZrADEocn0d/ldo9RrOw0xNXMkCkA2QXCW44z2DSHvGK7duXNHPn/+LHib/YD4gCAXAHg+U7/Az9Pc3OyOIIwk1qYRsFCbsgMAXT+czRgfPnyQly9fpvkIACD+r1+/3PXu7m7p7e11P8cBiB8bfqK5uTn59OlT2rw4DlB9+I5jJgBKsbZCBf1b+0QBiGfxyANw/kbbvtPT0y4b9wMdQSRz0ZIPOwMGegnRfgLmwx+AgB6CH+gvrKyspMUKuw7g8iOptf2tgIU+nygAWHw0046WZt4xiI0M3g9k+igd4zX/SYGIVgPo6aN0zGR/7do1uXr1amqqUq+tUDE19okDEO/i3b59W+rq6pwveAuRJPrtHtfGxsYEu0K0ps/lePSbAKoE5BCZBioA9Ab8jlLqteXyoxj3Ewcgfs5jK0YNjpJudXVVXr9+nfLbl2goG+NvMO6hf/DmzZvU88gPUDqil4BjJdo3yBZMJJOADPOVcm3FEDefORMHAG9yvBGDhaMORykWHdGEL5Nzvi3s70WTQHQLsfVHdw4kdcgN4h+i/FFQqrXlI1SxnkkcADgWz94zOQsgkKVn6gj657OVgRDyyZMnruHkB95wfFfAzhA963Ef91Ba4igq9tqKJWy+85YFAFgsPgqh5MuUnOEfheArYPQjUCYHs5WB6P5F+wawvX79umsDY6DKQF4RHfiMjOSx2GvLV6hiPVc2AHgHkaDh24AHAeL7pLBYQch33nJeW74+xJ8rOwC0jtBOFwECoIubGSsCYEZKnSMEQBc3M1YEwIyUOkcIgC5uZqwIgBkpdY4QAF3czFgRADNS6hwhALq4mbEiAGak1DlCAHRxM2NFAMxIqXOEAOjiZsaKAJiRUucIAdDFzYwVATAjpc4RAqCLmxkrAmBGSp0jBEAXNzNWBMCMlDpHCIAubmasCIAZKXWOEABd3MxYEQAzUuocIQC6uJmxIgBmpNQ5QgB0cTNjRQDMSKlzhADo4mbGigCYkVLnCAHQxc2MFQEwI6XOEQKgi5sZKwJgRkqdIwRAFzczVgTAjJQ6RwiALm5mrAiAGSl1jhAAXdzMWBEAM1LqHCEAuriZsSIAZqTUOUIAdHEzY0UAzEipc4QA6OJmxooAmJFS5wgB0MXNjBUBMCOlzhECoIubGSsCYEZKnSMEQBc3M1YEwIyUOkcIgC5uZqwIgBkpdY78A7hAWkz2lAp/AAAAAElFTkSuQmCC', style='width: 64px; height: 64px;') div.media-body - h4.media-heading Leo Damon + h4.media-heading Leo Damon p Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. div.media.text-right a.pull-right(href='#') img.media-object(src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAG/0lEQVR4Xu2d+U8USxDHC+VQQLmRQ+NPBhGIQCB4Rf92jngggkpAIMYQBIyigHiDwnvfzut9s8Muu9ayO5vqbycmMDPVdtX3M91VNSZWbG9vHwlHsBGoIADBau8cJwBh608AAtefABAAJoFBM8AcIGj5mQQGLj8BIADsA4TNAHOAsPVnGRi4/gSAALAPEDQDzAGClp9lYODyEwACwD5A2AwwBwhbf5aBgetPAAgA+wBBM8AcIGj5WQYGLj8BIADsA4TNAHOAsPVnGRi4/gSAALAPEDQDzAGClp9lYODyEwACwD5A2AwwBwhbf5aBgetPAAgA+wBBM8AcIGj5WQYGLj8BIADsA4TNAHOAsPVnGRi4/gSAALAPEDQDzAGClp9lYODyEwACwD5A2AwwBwhbf5aBgetPAAgA+wBBM1BWOcDPnz9lY2ND/k1MnShnz56VpqYmuXLlilRWVuYUCrZ//vxJPdfW1ibnz5/PaZfPA+W8tnzWn+2ZsgFgfX1dlpaWsvrS398vHR0dWe9D/FevXqXdv3HjhnR1dRUSH2dbzmsr1LmyAODjx4/y/PnznL6Mjo5KQ0PDsed+//4tExMTcnh4mHavr69POjs7c8570gPlvLaCHPvPOHEAsGVPTk4KRPQD23Z7e7usra3J0dH//69lS0uLDA0NHfN7fn5e3r9/f+x6oQCU89pOQ3zMkTgA8Tesurpa7t27J2fOnJGvX7/K48ePU74iJ3jw4IG758fu7q7MzMy4a9l2AFzf2dmRiooKZ4bfL1y4IDU1Nal5cN/D5u9/+fIlbWcqxtpOS0jtPIkDgHMfZ6wfIyMj0tjYmPr927dvLrGDOFVVVVJbW5u6h2sPHz6UHz9+uGu49/3799R9vwPs7++7XSa6m5w7d07u3r3roHj37p0sLCykxRD5w97eXtHXphXutOwSB+DRo0cCkTGQ6Q8PDwvearz9EOzixYsukcPbHx9v376V5eVldxlvJ0SL5hLRI2Bzc1MWFxfTpujp6ZHLly/L+Ph42hEEAAFiqdZ2WmJq5kkcAGzxEDvTFh51aGBgQC5dupS6hLd6amoqte3fvHnTQfD06dNjO4C/8OzZM3cU+AHgUCpiB/ADO8L9+/fdblPKtWnEOw2bRAE4ODhwIkZr95OcGhwclNbWVvfIixcvZGtry/1cX18vt27dcv2D2dnZrADEocn0d/ldo9RrOw0xNXMkCkA2QXCW44z2DSHvGK7duXNHPn/+LHib/YD4gCAXAHg+U7/Az9Pc3OyOIIwk1qYRsFCbsgMAXT+czRgfPnyQly9fpvkIACD+r1+/3PXu7m7p7e11P8cBiB8bfqK5uTn59OlT2rw4DlB9+I5jJgBKsbZCBf1b+0QBiGfxyANw/kbbvtPT0y4b9wMdQSRz0ZIPOwMGegnRfgLmwx+AgB6CH+gvrKyspMUKuw7g8iOptf2tgIU+nygAWHw0046WZt4xiI0M3g9k+igd4zX/SYGIVgPo6aN0zGR/7do1uXr1amqqUq+tUDE19okDEO/i3b59W+rq6pwveAuRJPrtHtfGxsYEu0K0ps/lePSbAKoE5BCZBioA9Ab8jlLqteXyoxj3Ewcgfs5jK0YNjpJudXVVXr9+nfLbl2goG+NvMO6hf/DmzZvU88gPUDqil4BjJdo3yBZMJJOADPOVcm3FEDefORMHAG9yvBGDhaMORykWHdGEL5Nzvi3s70WTQHQLsfVHdw4kdcgN4h+i/FFQqrXlI1SxnkkcADgWz94zOQsgkKVn6gj657OVgRDyyZMnruHkB95wfFfAzhA963Ef91Ba4igq9tqKJWy+85YFAFgsPgqh5MuUnOEfheArYPQjUCYHs5WB6P5F+wawvX79umsDY6DKQF4RHfiMjOSx2GvLV6hiPVc2AHgHkaDh24AHAeL7pLBYQch33nJeW74+xJ8rOwC0jtBOFwECoIubGSsCYEZKnSMEQBc3M1YEwIyUOkcIgC5uZqwIgBkpdY4QAF3czFgRADNS6hwhALq4mbEiAGak1DlCAHRxM2NFAMxIqXOEAOjiZsaKAJiRUucIAdDFzYwVATAjpc4RAqCLmxkrAmBGSp0jBEAXNzNWBMCMlDpHCIAubmasCIAZKXWOEABd3MxYEQAzUuocIQC6uJmxIgBmpNQ5QgB0cTNjRQDMSKlzhADo4mbGigCYkVLnCAHQxc2MFQEwI6XOEQKgi5sZKwJgRkqdIwRAFzczVgTAjJQ6RwiALm5mrAiAGSl1jhAAXdzMWBEAM1LqHCEAuriZsSIAZqTUOUIAdHEzY0UAzEipc4QA6OJmxooAmJFS5wgB0MXNjBUBMCOlzhECoIubGSsCYEZKnSMEQBc3M1YEwIyUOkcIgC5uZqwIgBkpdY78A7hAWkz2lAp/AAAAAElFTkSuQmCC', style='width: 64px; height: 64px;') div.media-body - h4.media-heading Mathew DiCaprio + h4.media-heading Mathew DiCaprio p Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. div.media a.pull-left(href='#') img.media-object(src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAG/0lEQVR4Xu2d+U8USxDHC+VQQLmRQ+NPBhGIQCB4Rf92jngggkpAIMYQBIyigHiDwnvfzut9s8Muu9ayO5vqbycmMDPVdtX3M91VNSZWbG9vHwlHsBGoIADBau8cJwBh608AAtefABAAJoFBM8AcIGj5mQQGLj8BIADsA4TNAHOAsPVnGRi4/gSAALAPEDQDzAGClp9lYODyEwACwD5A2AwwBwhbf5aBgetPAAgA+wBBM8AcIGj5WQYGLj8BIADsA4TNAHOAsPVnGRi4/gSAALAPEDQDzAGClp9lYODyEwACwD5A2AwwBwhbf5aBgetPAAgA+wBBM8AcIGj5WQYGLj8BIADsA4TNAHOAsPVnGRi4/gSAALAPEDQDzAGClp9lYODyEwACwD5A2AwwBwhbf5aBgetPAAgA+wBBM1BWOcDPnz9lY2ND/k1MnShnz56VpqYmuXLlilRWVuYUCrZ//vxJPdfW1ibnz5/PaZfPA+W8tnzWn+2ZsgFgfX1dlpaWsvrS398vHR0dWe9D/FevXqXdv3HjhnR1dRUSH2dbzmsr1LmyAODjx4/y/PnznL6Mjo5KQ0PDsed+//4tExMTcnh4mHavr69POjs7c8570gPlvLaCHPvPOHEAsGVPTk4KRPQD23Z7e7usra3J0dH//69lS0uLDA0NHfN7fn5e3r9/f+x6oQCU89pOQ3zMkTgA8Tesurpa7t27J2fOnJGvX7/K48ePU74iJ3jw4IG758fu7q7MzMy4a9l2AFzf2dmRiooKZ4bfL1y4IDU1Nal5cN/D5u9/+fIlbWcqxtpOS0jtPIkDgHMfZ6wfIyMj0tjYmPr927dvLrGDOFVVVVJbW5u6h2sPHz6UHz9+uGu49/3799R9vwPs7++7XSa6m5w7d07u3r3roHj37p0sLCykxRD5w97eXtHXphXutOwSB+DRo0cCkTGQ6Q8PDwvearz9EOzixYsukcPbHx9v376V5eVldxlvJ0SL5hLRI2Bzc1MWFxfTpujp6ZHLly/L+Ph42hEEAAFiqdZ2WmJq5kkcAGzxEDvTFh51aGBgQC5dupS6hLd6amoqte3fvHnTQfD06dNjO4C/8OzZM3cU+AHgUCpiB/ADO8L9+/fdblPKtWnEOw2bRAE4ODhwIkZr95OcGhwclNbWVvfIixcvZGtry/1cX18vt27dcv2D2dnZrADEocn0d/ldo9RrOw0xNXMkCkA2QXCW44z2DSHvGK7duXNHPn/+LHib/YD4gCAXAHg+U7/Az9Pc3OyOIIwk1qYRsFCbsgMAXT+czRgfPnyQly9fpvkIACD+r1+/3PXu7m7p7e11P8cBiB8bfqK5uTn59OlT2rw4DlB9+I5jJgBKsbZCBf1b+0QBiGfxyANw/kbbvtPT0y4b9wMdQSRz0ZIPOwMGegnRfgLmwx+AgB6CH+gvrKyspMUKuw7g8iOptf2tgIU+nygAWHw0046WZt4xiI0M3g9k+igd4zX/SYGIVgPo6aN0zGR/7do1uXr1amqqUq+tUDE19okDEO/i3b59W+rq6pwveAuRJPrtHtfGxsYEu0K0ps/lePSbAKoE5BCZBioA9Ab8jlLqteXyoxj3Ewcgfs5jK0YNjpJudXVVXr9+nfLbl2goG+NvMO6hf/DmzZvU88gPUDqil4BjJdo3yBZMJJOADPOVcm3FEDefORMHAG9yvBGDhaMORykWHdGEL5Nzvi3s70WTQHQLsfVHdw4kdcgN4h+i/FFQqrXlI1SxnkkcADgWz94zOQsgkKVn6gj657OVgRDyyZMnruHkB95wfFfAzhA963Ef91Ba4igq9tqKJWy+85YFAFgsPgqh5MuUnOEfheArYPQjUCYHs5WB6P5F+wawvX79umsDY6DKQF4RHfiMjOSx2GvLV6hiPVc2AHgHkaDh24AHAeL7pLBYQch33nJeW74+xJ8rOwC0jtBOFwECoIubGSsCYEZKnSMEQBc3M1YEwIyUOkcIgC5uZqwIgBkpdY4QAF3czFgRADNS6hwhALq4mbEiAGak1DlCAHRxM2NFAMxIqXOEAOjiZsaKAJiRUucIAdDFzYwVATAjpc4RAqCLmxkrAmBGSp0jBEAXNzNWBMCMlDpHCIAubmasCIAZKXWOEABd3MxYEQAzUuocIQC6uJmxIgBmpNQ5QgB0cTNjRQDMSKlzhADo4mbGigCYkVLnCAHQxc2MFQEwI6XOEQKgi5sZKwJgRkqdIwRAFzczVgTAjJQ6RwiALm5mrAiAGSl1jhAAXdzMWBEAM1LqHCEAuriZsSIAZqTUOUIAdHEzY0UAzEipc4QA6OJmxooAmJFS5wgB0MXNjBUBMCOlzhECoIubGSsCYEZKnSMEQBc3M1YEwIyUOkcIgC5uZqwIgBkpdY78A7hAWkz2lAp/AAAAAElFTkSuQmCC', style='width: 64px; height: 64px;') div.media-body - h4.media-heading Nick Jackson + h4.media-heading Nick Jackson p Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. div.col-sm-6.special div.page-header diff --git a/views/account/settings/index.jade b/views/account/settings/index.jade index cd4400f6f..da9a68de2 100644 --- a/views/account/settings/index.jade +++ b/views/account/settings/index.jade @@ -51,7 +51,7 @@ block body a.btn.btn-block.btn-default(href='/account/settings/facebook/') i.fa.fa-facebook-square.fa-lg | Connect Facebook - + script(type='text/template', id='tmpl-details') fieldset legend Contact Info @@ -91,7 +91,7 @@ block body span.help-block <%= errfor.zip %> div.control-group button.btn.btn-primary.btn-update(type='button') Update - + script(type='text/template', id='tmpl-identity') fieldset legend Identity @@ -116,7 +116,7 @@ block body span.help-block <%= errfor.email %> div.control-group button.btn.btn-primary.btn-update(type='button') Update - + script(type='text/template', id='tmpl-password') fieldset legend Set Password @@ -141,6 +141,6 @@ block body span.help-block <%= errfor.confirm %> div.control-group button.btn.btn-primary.btn-password(type='button') Set Password - + script(type='text/template', id='data-account') !{data.account} script(type='text/template', id='data-user') !{data.user} diff --git a/views/account/settings/index.js b/views/account/settings/index.js index 061aea4f5..8709a3b27 100644 --- a/views/account/settings/index.js +++ b/views/account/settings/index.js @@ -2,34 +2,34 @@ var renderSettings = function(req, res, next, oauthMessage) { var outcome = {}; - + var getAccountData = function(callback) { req.app.db.models.Account.findById(req.user.roles.account.id, 'name company phone zip').exec(function(err, account) { if (err) { return callback(err, null); } - + outcome.account = account; callback(null, 'done'); }); }; - + var getUserData = function(callback) { req.app.db.models.User.findById(req.user.id, 'username email twitter.id github.id facebook.id').exec(function(err, user) { if (err) { callback(err, null); } - + outcome.user = user; return callback(null, 'done'); }); }; - + var asyncFinally = function(err, results) { if (err) { return next(err); } - + res.render('account/settings/index', { data: { account: escape(JSON.stringify(outcome.account)), @@ -44,7 +44,7 @@ var renderSettings = function(req, res, next, oauthMessage) { oauthFacebookActive: outcome.user.facebook ? !!outcome.user.facebook.id : false }); }; - + require('async').parallel([getAccountData, getUserData], asyncFinally); }; @@ -57,12 +57,12 @@ exports.connectTwitter = function(req, res, next){ if (!info || !info.profile) { return res.redirect('/account/settings/'); } - + req.app.db.models.User.findOne({ 'twitter.id': info.profile._json.id, _id: { $ne: req.user.id } }, function(err, user) { if (err) { return next(err); } - + if (user) { renderSettings(req, res, next, 'Another user has already connected with that Twitter account.'); } @@ -71,7 +71,7 @@ exports.connectTwitter = function(req, res, next){ if (err) { return next(err); } - + res.redirect('/account/settings/'); }); } @@ -84,12 +84,12 @@ exports.connectGitHub = function(req, res, next){ if (!info || !info.profile) { return res.redirect('/account/settings/'); } - + req.app.db.models.User.findOne({ 'github.id': info.profile._json.id, _id: { $ne: req.user.id } }, function(err, user) { if (err) { return next(err); } - + if (user) { renderSettings(req, res, next, 'Another user has already connected with that GitHub account.'); } @@ -98,7 +98,7 @@ exports.connectGitHub = function(req, res, next){ if (err) { return next(err); } - + res.redirect('/account/settings/'); }); } @@ -111,12 +111,12 @@ exports.connectFacebook = function(req, res, next){ if (!info || !info.profile) { return res.redirect('/account/settings/'); } - + req.app.db.models.User.findOne({ 'facebook.id': info.profile._json.id, _id: { $ne: req.user.id } }, function(err, user) { if (err) { return next(err); } - + if (user) { renderSettings(req, res, next, 'Another user has already connected with that Facebook account.'); } @@ -125,7 +125,7 @@ exports.connectFacebook = function(req, res, next){ if (err) { return next(err); } - + res.redirect('/account/settings/'); }); } @@ -138,7 +138,7 @@ exports.disconnectTwitter = function(req, res, next){ if (err) { return next(err); } - + res.redirect('/account/settings/'); }); }; @@ -148,7 +148,7 @@ exports.disconnectGitHub = function(req, res, next){ if (err) { return next(err); } - + res.redirect('/account/settings/'); }); }; @@ -158,30 +158,30 @@ exports.disconnectFacebook = function(req, res, next){ if (err) { return next(err); } - + res.redirect('/account/settings/'); }); }; exports.update = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.first) { workflow.outcome.errfor.first = 'required'; } - + if (!req.body.last) { workflow.outcome.errfor.last = 'required'; } - + if (workflow.hasErrors()) { return workflow.emit('response'); } - + workflow.emit('patchAccount'); }); - + workflow.on('patchAccount', function() { var fieldsToSet = { name: { @@ -202,23 +202,23 @@ exports.update = function(req, res, next){ req.body.zip ] }; - + req.app.db.models.Account.findByIdAndUpdate(req.user.roles.account.id, fieldsToSet, function(err, account) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.account = account; return workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.identity = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.username) { workflow.outcome.errfor.username = 'required'; @@ -226,51 +226,51 @@ exports.identity = function(req, res, next){ else if (!/^[a-zA-Z0-9\-\_]+$/.test(req.body.username)) { workflow.outcome.errfor.username = 'only use letters, numbers, \'-\', \'_\''; } - + if (!req.body.email) { workflow.outcome.errfor.email = 'required'; } else if (!/^[a-zA-Z0-9\-\_\.\+]+@[a-zA-Z0-9\-\_\.]+\.[a-zA-Z0-9\-\_]+$/.test(req.body.email)) { workflow.outcome.errfor.email = 'invalid email format'; } - + if (workflow.hasErrors()) { return workflow.emit('response'); } - + workflow.emit('duplicateUsernameCheck'); }); - + workflow.on('duplicateUsernameCheck', function() { req.app.db.models.User.findOne({ username: req.body.username, _id: { $ne: req.user.id } }, function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (user) { workflow.outcome.errfor.username = 'username already taken'; return workflow.emit('response'); } - + workflow.emit('duplicateEmailCheck'); }); }); - + workflow.on('duplicateEmailCheck', function() { req.app.db.models.User.findOne({ email: req.body.email.toLowerCase(), _id: { $ne: req.user.id } }, function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (user) { workflow.outcome.errfor.email = 'email already taken'; return workflow.emit('response'); } - + workflow.emit('patchUser'); }); }); - + workflow.on('patchUser', function() { var fieldsToSet = { username: req.body.username, @@ -280,16 +280,16 @@ exports.identity = function(req, res, next){ req.body.email ] }; - + req.app.db.models.User.findByIdAndUpdate(req.user.id, fieldsToSet, function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.emit('patchAdmin', user); }); }); - + workflow.on('patchAdmin', function(user) { if (user.roles.admin) { var fieldsToSet = { @@ -302,7 +302,7 @@ exports.identity = function(req, res, next){ if (err) { return workflow.emit('exception', err); } - + workflow.emit('patchAccount', user); }); } @@ -310,7 +310,7 @@ exports.identity = function(req, res, next){ workflow.emit('patchAccount', user); } }); - + workflow.on('patchAccount', function(user) { if (user.roles.account) { var fieldsToSet = { @@ -323,7 +323,7 @@ exports.identity = function(req, res, next){ if (err) { return workflow.emit('exception', err); } - + workflow.emit('populateRoles', user); }); } @@ -331,59 +331,59 @@ exports.identity = function(req, res, next){ workflow.emit('populateRoles', user); } }); - + workflow.on('populateRoles', function(user) { user.populate('roles.admin roles.account', 'name.full', function(err, populatedUser) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.user = populatedUser; workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.password = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.newPassword) { workflow.outcome.errfor.newPassword = 'required'; } - + if (!req.body.confirm) { workflow.outcome.errfor.confirm = 'required'; } - + if (req.body.newPassword !== req.body.confirm) { workflow.outcome.errors.push('Passwords do not match.'); } - + if (workflow.hasErrors()) { return workflow.emit('response'); } - + workflow.emit('patchUser'); }); - + workflow.on('patchUser', function() { var fieldsToSet = { password: req.app.db.models.User.encryptPassword(req.body.newPassword) }; - + req.app.db.models.User.findByIdAndUpdate(req.user.id, fieldsToSet, function(err, user) { if (err) { return workflow.emit('exception', err); } - + user.populate('roles.admin roles.account', 'name.full', function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.user = user; workflow.outcome.newPassword = ''; workflow.outcome.confirm = ''; @@ -391,6 +391,6 @@ exports.password = function(req, res, next){ }); }); }); - + workflow.emit('validate'); }; diff --git a/views/account/verification/email-text.jade b/views/account/verification/email-text.jade index 394a3e9ff..674ebcdc4 100644 --- a/views/account/verification/email-text.jade +++ b/views/account/verification/email-text.jade @@ -1,15 +1,19 @@ // - | - | + = '\n' + = '\n' | #{projectName} Email Verification - | + = '\n' + = '\n' | Your #{projectName} account is nearly ready. Please visit the link below to confirm your email address. - | + = '\n' + = '\n' | #{verifyURL} - | + = '\n' + = '\n' | Note: If you did not sign for a #{projectName} account, don't worry. You can ignore this email. - | + = '\n' + = '\n' | Thanks, | #{projectName} - | - | \ No newline at end of file + = '\n' + = '\n' diff --git a/views/account/verification/index.jade b/views/account/verification/index.jade index 2e6fe4bfc..50871a2b8 100644 --- a/views/account/verification/index.jade +++ b/views/account/verification/index.jade @@ -20,7 +20,7 @@ block body div.page-header h1 You're Almost Done i.fa.fa-key.super-awesome - + script(type='text/template', id='tmpl-verify') form div.alerts @@ -45,5 +45,5 @@ block body div.form-group button.btn.btn-primary.btn-verify(type='button') Re-Send Verification |<% } %> - + script(type='text/template', id='data-user') !{data.user} diff --git a/views/account/verification/index.js b/views/account/verification/index.js index 2a2ff42ff..9a4791b9e 100644 --- a/views/account/verification/index.js +++ b/views/account/verification/index.js @@ -21,16 +21,16 @@ var sendVerificationEmail = function(req, res, options) { }; exports.init = function(req, res, next){ - if (req.user.roles.account.isVerified === 'yes') { + if (req.user.roles.account.isVerified === 'yes') { return res.redirect(req.user.defaultReturnUrl()); } - + var renderPage = function() { req.app.db.models.User.findById(req.user.id, 'email').exec(function(err, user) { if (err) { return next(err); } - + res.render('account/verification/index', { data: { user: JSON.stringify(user) @@ -38,17 +38,17 @@ exports.init = function(req, res, next){ }); }); }; - + if (req.user.roles.account.verificationToken === '') { var fieldsToSet = { verificationToken: require('crypto').createHash('md5').update(Math.random().toString()).digest('hex') }; - + req.app.db.models.Account.findByIdAndUpdate(req.user.roles.account.id, fieldsToSet, function(err, account) { if (err) { return next(err); } - + sendVerificationEmail(req, res, { email: req.user.email, verificationToken: account.verificationToken, @@ -67,12 +67,12 @@ exports.init = function(req, res, next){ }; exports.resendVerification = function(req, res){ - if (req.user.roles.account.isVerified === 'yes') { + if (req.user.roles.account.isVerified === 'yes') { return res.redirect(req.user.defaultReturnUrl()); } - + var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.email) { workflow.outcome.errfor.email = 'required'; @@ -80,54 +80,54 @@ exports.resendVerification = function(req, res){ else if (!/^[a-zA-Z0-9\-\_\.\+]+@[a-zA-Z0-9\-\_\.]+\.[a-zA-Z0-9\-\_]+$/.test(req.body.email)) { workflow.outcome.errfor.email = 'invalid email format'; } - + if (workflow.hasErrors()) { return workflow.emit('response'); } - + workflow.emit('duplicateEmailCheck'); }); - + workflow.on('duplicateEmailCheck', function() { req.app.db.models.User.findOne({ email: req.body.email.toLowerCase(), _id: { $ne: req.user.id } }, function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (user) { workflow.outcome.errfor.email = 'email already taken'; return workflow.emit('response'); } - + workflow.emit('patchUser'); }); }); - + workflow.on('patchUser', function() { var fieldsToSet = { email: req.body.email.toLowerCase() }; - + req.app.db.models.User.findByIdAndUpdate(req.user.id, fieldsToSet, function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.user = user; workflow.emit('patchAccount'); }); }); - + workflow.on('patchAccount', function() { var fieldsToSet = { verificationToken: require('crypto').createHash('md5').update(Math.random().toString()).digest('hex') }; - + req.app.db.models.Account.findByIdAndUpdate(req.user.roles.account.id, fieldsToSet, function(err, account) { if (err) { return workflow.emit('exception', err); } - + sendVerificationEmail(req, res, { email: workflow.user.email, verificationToken: account.verificationToken, @@ -141,7 +141,7 @@ exports.resendVerification = function(req, res){ }); }); }); - + workflow.emit('validate'); }; @@ -150,17 +150,17 @@ exports.verify = function(req, res, next){ _id: req.user.roles.account.id, verificationToken: req.params.token }; - + var fieldsToSet = { isVerified: 'yes', verificationToken: '' }; - + req.app.db.models.Account.findOneAndUpdate(conditions, fieldsToSet, function(err, account) { if (err) { return next(err); } - + return res.redirect(req.user.defaultReturnUrl()); }); }; diff --git a/views/admin/accounts/details.jade b/views/admin/accounts/details.jade index 0a2a1dfb3..3057b8c39 100644 --- a/views/admin/accounts/details.jade +++ b/views/admin/accounts/details.jade @@ -25,13 +25,13 @@ block body fieldset div#notes-new.notes-new div#notes-collection - + script(type='text/template', id='tmpl-header') div.page-header h1 a(href='/admin/accounts/') Accounts | / <%- name.full %> - + script(type='text/template', id='tmpl-details') fieldset legend Contact Info @@ -71,7 +71,7 @@ block body span.help-block <%= errfor.zip %> div.control-group button.btn.btn-primary.btn-update(type='button') Update - + script(type='text/template', id='tmpl-login') fieldset legend Login @@ -95,7 +95,7 @@ block body button.btn.btn-success.btn-user-link(type='button') Link |<% } %> span.help-block <%= errfor.newUsername %> - + script(type='text/template', id='tmpl-status-new') legend Status div.alerts @@ -111,18 +111,18 @@ block body option(value='#{status._id}') #{status.name} div.input-group-btn button.btn.btn-default.btn-add Change - + script(type='text/template', id='tmpl-status-collection') div#status-items.status-items - + script(type='text/template', id='tmpl-status-item') div.pull-right.badge.author |<%= userCreated.name %> - | - + | -  span.timeago <%= userCreated.time %> div <%- name %> div.clearfix - + script(type='text/template', id='tmpl-notes-new') legend Notes div.alerts @@ -133,21 +133,21 @@ block body |<% }); %> textarea.form-control(rows='3', name='data', placeholder='enter notes') button.btn.btn-default.btn-block.btn-add Add New Note - + script(type='text/template', id='tmpl-notes-collection') div#notes-items.notes-items - + script(type='text/template', id='tmpl-notes-item') div.force-wrap <%- data %> div.pull-right.badge.author |<%= userCreated.name %> - | - + | -  span.timeago <%= userCreated.time %> div.clearfix - + script(type='text/template', id='tmpl-notes-none') div.note.text-muted no notes found - + script(type='text/template', id='tmpl-delete') fieldset legend Danger Zone @@ -160,9 +160,9 @@ block body div.control-group span.help-block span.label.label-danger If you do this, it cannot be undone. - | + |  span.text-muted You may also create orphaned document relationships too. div.control-group button.btn.btn-danger.btn-delete(type='button') Delete - + script(type='text/template', id='data-record') !{data.record} diff --git a/views/admin/accounts/index.jade b/views/admin/accounts/index.jade index c00a3dc45..fc2a8a565 100644 --- a/views/admin/accounts/index.jade +++ b/views/admin/accounts/index.jade @@ -16,7 +16,7 @@ block body div#filters div#results-table div#results-paging - + script(type='text/template', id='tmpl-header') div.page-header form.form-inline.pull-right @@ -24,7 +24,7 @@ block body input.form-control(name='name', type='text', placeholder='enter a name', value!='<%- name.full %>') button.btn.btn-primary.btn-add(type='button') Add New h1 Accounts - + script(type='text/template', id='tmpl-filters') form.filters div.row @@ -53,19 +53,19 @@ block body option(value='20', selected='selected') 20 items option(value='50') 50 items option(value='100') 100 items - + script(type='text/template', id='tmpl-results-table') table.table.table-striped thead tr - th + th th | name span.pull-right.timeago.muted age th phone th status tbody#results-rows - + script(type='text/template', id='tmpl-results-row') td input.btn.btn-default.btn-sm.btn-details(type='button', value='Edit') @@ -76,11 +76,11 @@ block body td.nowrap div <%- status.name %> div.timeago.muted <%= status.userCreated.time %> - + script(type='text/template', id='tmpl-results-empty-row') tr td(colspan='4') no documents matched - + script(type='text/template', id='tmpl-results-paging') div.well div.btn-group.pull-left @@ -90,5 +90,5 @@ block body button.btn.btn-default.btn-page.btn-prev(data-page!='<%= pages.prev %>') Prev button.btn.btn-default.btn-page.btn-next(data-page!='<%= pages.next %>') Next div.clearfix - + script(type='text/template', id='data-results') !{data.results} diff --git a/views/admin/accounts/index.js b/views/admin/accounts/index.js index 0895d0f38..a98077609 100644 --- a/views/admin/accounts/index.js +++ b/views/admin/accounts/index.js @@ -2,34 +2,34 @@ exports.find = function(req, res, next){ var outcome = {}; - + var getStatusOptions = function(callback) { req.app.db.models.Status.find({ pivot: 'Account' }, 'name').sort('name').exec(function(err, statuses) { if (err) { return callback(err, null); } - + outcome.statuses = statuses; return callback(null, 'done'); }); }; - + var getResults = function(callback) { req.query.search = req.query.search ? req.query.search : ''; req.query.status = req.query.status ? req.query.status : ''; req.query.limit = req.query.limit ? parseInt(req.query.limit, null) : 20; req.query.page = req.query.page ? parseInt(req.query.page, null) : 1; req.query.sort = req.query.sort ? req.query.sort : '_id'; - + var filters = {}; if (req.query.search) { filters.search = new RegExp('^.*?'+ req.query.search +'.*$', 'i'); } - + if (req.query.status) { filters['status.id'] = req.query.status; } - + req.app.db.models.Account.pagedFind({ filters: filters, keys: 'name company phone zip userCreated status', @@ -40,17 +40,17 @@ exports.find = function(req, res, next){ if (err) { return callback(err, null); } - + outcome.results = results; return callback(null, 'done'); }); }; - + var asyncFinally = function(err, results) { if (err) { return next(err); } - + if (req.xhr) { res.header('Cache-Control', 'no-cache, no-store, must-revalidate'); outcome.results.filters = req.query; @@ -58,48 +58,48 @@ exports.find = function(req, res, next){ } else { outcome.results.filters = req.query; - res.render('admin/accounts/index', { - data: { + res.render('admin/accounts/index', { + data: { results: escape(JSON.stringify(outcome.results)), statuses: outcome.statuses } }); } }; - + require('async').parallel([getStatusOptions, getResults], asyncFinally); }; exports.read = function(req, res, next){ var outcome = {}; - + var getStatusOptions = function(callback) { req.app.db.models.Status.find({ pivot: 'Account' }, 'name').sort('name').exec(function(err, statuses) { if (err) { return callback(err, null); } - + outcome.statuses = statuses; return callback(null, 'done'); }); }; - + var getRecord = function(callback) { req.app.db.models.Account.findById(req.params.id).exec(function(err, record) { if (err) { return callback(err, null); } - + outcome.record = record; return callback(null, 'done'); }); }; - + var asyncFinally = function(err, results) { if (err) { return next(err); } - + if (req.xhr) { res.send(outcome.record); } @@ -112,22 +112,22 @@ exports.read = function(req, res, next){ }); } }; - + require('async').parallel([getStatusOptions, getRecord], asyncFinally); }; exports.create = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body['name.full']) { workflow.outcome.errors.push('Please enter a name.'); return workflow.emit('response'); } - + workflow.emit('createAccount'); }); - + workflow.on('createAccount', function() { var nameParts = req.body['name.full'].trim().split(/\s/); var fieldsToSet = { @@ -148,39 +148,39 @@ exports.create = function(req, res, next){ fieldsToSet.name.middle, fieldsToSet.name.last ]; - + req.app.db.models.Account.create(fieldsToSet, function(err, account) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.record = account; return workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.update = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.first) { workflow.outcome.errfor.first = 'required'; } - + if (!req.body.last) { workflow.outcome.errfor.last = 'required'; } - + if (workflow.hasErrors()) { return workflow.emit('response'); } - + workflow.emit('patchAccount'); }); - + workflow.on('patchAccount', function() { var fieldsToSet = { name: { @@ -201,43 +201,43 @@ exports.update = function(req, res, next){ req.body.zip ] }; - + req.app.db.models.Account.findByIdAndUpdate(req.params.id, fieldsToSet, function(err, account) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.account = account; return workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.linkUser = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not link accounts to users.'); return workflow.emit('response'); } - + if (!req.body.newUsername) { workflow.outcome.errfor.newUsername = 'required'; return workflow.emit('response'); } - + workflow.emit('verifyUser'); }); - + workflow.on('verifyUser', function(callback) { req.app.db.models.User.findOne({ username: req.body.newUsername }).exec(function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (!user) { workflow.outcome.errors.push('User not found.'); return workflow.emit('response'); @@ -246,124 +246,124 @@ exports.linkUser = function(req, res, next){ workflow.outcome.errors.push('User is already linked to a different account.'); return workflow.emit('response'); } - + workflow.user = user; workflow.emit('duplicateLinkCheck'); }); }); - + workflow.on('duplicateLinkCheck', function(callback) { req.app.db.models.Account.findOne({ 'user.id': workflow.user._id, _id: {$ne: req.params.id} }).exec(function(err, account) { if (err) { return workflow.emit('exception', err); } - + if (account) { workflow.outcome.errors.push('Another account is already linked to that user.'); return workflow.emit('response'); } - + workflow.emit('patchUser'); }); }); - + workflow.on('patchUser', function() { req.app.db.models.User.findByIdAndUpdate(workflow.user._id, { 'roles.account': req.params.id }).exec(function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.emit('patchAccount'); }); }); - + workflow.on('patchAccount', function(callback) { req.app.db.models.Account.findByIdAndUpdate(req.params.id, { user: { id: workflow.user._id, name: workflow.user.username } }).exec(function(err, account) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.account = account; workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.unlinkUser = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not unlink users from accounts.'); return workflow.emit('response'); } - + workflow.emit('patchAccount'); }); - + workflow.on('patchAccount', function() { req.app.db.models.Account.findById(req.params.id).exec(function(err, account) { if (err) { return workflow.emit('exception', err); } - + if (!account) { workflow.outcome.errors.push('Account was not found.'); return workflow.emit('response'); } - + var userId = account.user.id; account.user = { id: undefined, name: '' }; account.save(function(err, account) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.account = account; workflow.emit('patchUser', userId); }); }); }); - + workflow.on('patchUser', function(id) { req.app.db.models.User.findById(id).exec(function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (!user) { workflow.outcome.errors.push('User was not found.'); return workflow.emit('response'); } - + user.roles.account = undefined; user.save(function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.emit('response'); }); }); }); - + workflow.emit('validate'); }; exports.newNote = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.data) { workflow.outcome.errors.push('Data is required.'); return workflow.emit('response'); } - + workflow.emit('addNote'); }); - + workflow.on('addNote', function() { var noteToAdd = { data: req.body.data, @@ -373,35 +373,35 @@ exports.newNote = function(req, res, next){ time: new Date().toISOString() } }; - + req.app.db.models.Account.findByIdAndUpdate(req.params.id, { $push: { notes: noteToAdd } }, function(err, account) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.account = account; return workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.newStatus = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.id) { workflow.outcome.errors.push('Please choose a status.'); } - + if (workflow.hasErrors()) { return workflow.emit('response'); } - + workflow.emit('addStatus'); }); - + workflow.on('addStatus', function() { var statusToAdd = { id: req.body.id, @@ -412,42 +412,42 @@ exports.newStatus = function(req, res, next){ time: new Date().toISOString() } }; - + req.app.db.models.Account.findByIdAndUpdate(req.params.id, { status: statusToAdd, $push: { statusLog: statusToAdd } }, function(err, account) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.account = account; return workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.delete = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not delete accounts.'); return workflow.emit('response'); } - + workflow.emit('deleteAccount'); }); - + workflow.on('deleteAccount', function(err) { req.app.db.models.Account.findByIdAndRemove(req.params.id, function(err, account) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.account = account; workflow.emit('response'); }); }); - + workflow.emit('validate'); }; diff --git a/views/admin/admin-groups/details.jade b/views/admin/admin-groups/details.jade index 7058975e4..774797ce2 100644 --- a/views/admin/admin-groups/details.jade +++ b/views/admin/admin-groups/details.jade @@ -14,13 +14,13 @@ block body div#details div#permissions div#delete - + script(type='text/template', id='tmpl-header') div.page-header h1 a(href='/admin/admin-groups/') Admin Groups | / <%- name %> - + script(type='text/template', id='tmpl-details') fieldset legend Details @@ -41,7 +41,7 @@ block body span.help-block <%= errfor.name %> div.control-group button.btn.btn-primary.btn-update(type='button') Update - + script(type='text/template', id='tmpl-permissions') fieldset legend Permissions @@ -87,7 +87,7 @@ block body span.help-block <%= errfor.settings %> div.control-group button.btn.btn-primary.btn-set(type='button') Save Settings - + script(type='text/template', id='tmpl-delete') fieldset legend Danger Zone @@ -100,9 +100,9 @@ block body div.control-group span.help-block span.label.label-danger If you do this, it cannot be undone. - | + |  span.text-muted You may also create orphaned document relationships too. div.control-group button.btn.btn-danger.btn-delete(type='button') Delete - + script(type='text/template', id='data-record') !{data.record} diff --git a/views/admin/admin-groups/index.jade b/views/admin/admin-groups/index.jade index c5de34250..786d8f17f 100644 --- a/views/admin/admin-groups/index.jade +++ b/views/admin/admin-groups/index.jade @@ -16,7 +16,7 @@ block body div#filters div#results-table div#results-paging - + script(type='text/template', id='tmpl-header') div.page-header form.form-inline.pull-right @@ -24,7 +24,7 @@ block body input.form-control(name='name', type='text', placeholder='enter a name', value!='<%= name %>') button.btn.btn-primary.btn-add(type='button') Add New h1 Admin Groups - + script(type='text/template', id='tmpl-filters') form.filters div.row @@ -45,26 +45,26 @@ block body option(value='20', selected='selected') 20 items option(value='50') 50 items option(value='100') 100 items - + script(type='text/template', id='tmpl-results-table') table.table.table-striped thead tr - th + th th.stretch name th id tbody#results-rows - + script(type='text/template', id='tmpl-results-row') td input.btn.btn-default.btn-sm.btn-details(type='button', value='Edit') td <%- name %> td.nowrap <%= _id %> - + script(type='text/template', id='tmpl-results-empty-row') tr td(colspan='3') no documents matched - + script(type='text/template', id='tmpl-results-paging') div.well div.btn-group.pull-left @@ -74,5 +74,5 @@ block body button.btn.btn-default.btn-page.btn-prev(data-page!='<%= pages.prev %>') Prev button.btn.btn-default.btn-page.btn-next(data-page!='<%= pages.next %>') Next div.clearfix - + script(type='text/template', id='data-results') !{data.results} diff --git a/views/admin/admin-groups/index.js b/views/admin/admin-groups/index.js index cbfeff6bf..c3d699522 100644 --- a/views/admin/admin-groups/index.js +++ b/views/admin/admin-groups/index.js @@ -5,12 +5,12 @@ exports.find = function(req, res, next){ req.query.limit = req.query.limit ? parseInt(req.query.limit, null) : 20; req.query.page = req.query.page ? parseInt(req.query.page, null) : 1; req.query.sort = req.query.sort ? req.query.sort : '_id'; - + var filters = {}; if (req.query.name) { filters.name = new RegExp('^.*?'+ req.query.name +'.*$', 'i'); } - + req.app.db.models.AdminGroup.pagedFind({ filters: filters, keys: 'name', @@ -21,7 +21,7 @@ exports.find = function(req, res, next){ if (err) { return next(err); } - + if (req.xhr) { res.header('Cache-Control', 'no-cache, no-store, must-revalidate'); results.filters = req.query; @@ -39,7 +39,7 @@ exports.read = function(req, res, next){ if (err) { return next(err); } - + if (req.xhr) { res.send(adminGroup); } @@ -51,146 +51,146 @@ exports.read = function(req, res, next){ exports.create = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not create admin groups.'); return workflow.emit('response'); } - + if (!req.body.name) { workflow.outcome.errors.push('Please enter a name.'); return workflow.emit('response'); } - + workflow.emit('duplicateAdminGroupCheck'); }); - + workflow.on('duplicateAdminGroupCheck', function() { req.app.db.models.AdminGroup.findById(req.app.utility.slugify(req.body.name)).exec(function(err, adminGroup) { if (err) { return workflow.emit('exception', err); } - + if (adminGroup) { workflow.outcome.errors.push('That group already exists.'); return workflow.emit('response'); } - + workflow.emit('createAdminGroup'); }); }); - + workflow.on('createAdminGroup', function() { var fieldsToSet = { _id: req.app.utility.slugify(req.body.name), name: req.body.name }; - + req.app.db.models.AdminGroup.create(fieldsToSet, function(err, adminGroup) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.record = adminGroup; return workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.update = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not update admin groups.'); return workflow.emit('response'); } - + if (!req.body.name) { workflow.outcome.errfor.name = 'required'; return workflow.emit('response'); } - + workflow.emit('patchAdminGroup'); }); - + workflow.on('patchAdminGroup', function() { var fieldsToSet = { name: req.body.name }; - + req.app.db.models.AdminGroup.findByIdAndUpdate(req.params.id, fieldsToSet, function(err, adminGroup) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.adminGroup = adminGroup; return workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.permissions = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not change the permissions of admin groups.'); return workflow.emit('response'); } - + if (!req.body.permissions) { workflow.outcome.errfor.permissions = 'required'; return workflow.emit('response'); } - + workflow.emit('patchAdminGroup'); }); - + workflow.on('patchAdminGroup', function() { var fieldsToSet = { permissions: req.body.permissions }; - + req.app.db.models.AdminGroup.findByIdAndUpdate(req.params.id, fieldsToSet, function(err, adminGroup) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.adminGroup = adminGroup; return workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.delete = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not delete admin groups.'); return workflow.emit('response'); } - + workflow.emit('deleteAdminGroup'); }); - + workflow.on('deleteAdminGroup', function(err) { req.app.db.models.AdminGroup.findByIdAndRemove(req.params.id, function(err, adminGroup) { if (err) { return workflow.emit('exception', err); } - + workflow.emit('response'); }); }); - + workflow.emit('validate'); }; diff --git a/views/admin/administrators/details.jade b/views/admin/administrators/details.jade index 858e0e48b..e63baad23 100644 --- a/views/admin/administrators/details.jade +++ b/views/admin/administrators/details.jade @@ -18,13 +18,13 @@ block body div#groups div#permissions div#delete - + script(type='text/template', id='tmpl-header') div.page-header h1 a(href='/admin/administrators/') Administrators | / <%- name.full %> - + script(type='text/template', id='tmpl-details') fieldset legend Contact Info @@ -53,7 +53,7 @@ block body span.help-block <%= errfor.last %> div.control-group button.btn.btn-primary.btn-update(type='button') Update - + script(type='text/template', id='tmpl-login') fieldset legend Login @@ -77,7 +77,7 @@ block body button.btn.btn-success.btn-user-link(type='button') Link |<% } %> span.help-block <%= errfor.newUsername %> - + script(type='text/template', id='tmpl-groups') fieldset legend Groups @@ -117,7 +117,7 @@ block body span.help-block <%= errfor.memberships %> div.control-group button.btn.btn-primary.btn-save(type='button') Save Groups - + script(type='text/template', id='tmpl-permissions') fieldset legend Permissions @@ -162,7 +162,7 @@ block body span.help-block <%= errfor.settings %> div.control-group button.btn.btn-primary.btn-set(type='button') Save Settings - + script(type='text/template', id='tmpl-delete') fieldset legend Danger Zone @@ -175,9 +175,9 @@ block body div.control-group span.help-block span.label.label-danger If you do this, it cannot be undone. - | + |  span.text-muted You may also create orphaned document relationships too. div.control-group button.btn.btn-danger.btn-delete(type='button') Delete - + script(type='text/template', id='data-record') !{data.record} diff --git a/views/admin/administrators/index.jade b/views/admin/administrators/index.jade index 670148838..a20f811ff 100644 --- a/views/admin/administrators/index.jade +++ b/views/admin/administrators/index.jade @@ -16,7 +16,7 @@ block body div#filters div#results-table div#results-paging - + script(type='text/template', id='tmpl-header') div.page-header form.form-inline.pull-right @@ -24,7 +24,7 @@ block body input.form-control(name='name', type='text', placeholder='enter a name', value!='<%= name.full %>') button.btn.btn-primary.btn-add(type='button') Add New h1 Administrators - + script(type='text/template', id='tmpl-filters') form.filters div.row @@ -45,26 +45,26 @@ block body option(value='20', selected='selected') 20 items option(value='50') 50 items option(value='100') 100 items - + script(type='text/template', id='tmpl-results-table') table.table.table-striped thead tr - th + th th.stretch name th id tbody#results-rows - + script(type='text/template', id='tmpl-results-row') td input.btn.btn-default.btn-sm.btn-details(type='button', value='Edit') td.nowrap <%- name.full %> td <%= _id %> - + script(type='text/template', id='tmpl-results-empty-row') tr td(colspan='3') no documents matched - + script(type='text/template', id='tmpl-results-paging') div.well div.btn-group.pull-left @@ -74,5 +74,5 @@ block body button.btn.btn-default.btn-page.btn-prev(data-page!='<%= pages.prev %>') Prev button.btn.btn-default.btn-page.btn-next(data-page!='<%= pages.next %>') Next div.clearfix - + script(type='text/template', id='data-results') !{data.results} diff --git a/views/admin/administrators/index.js b/views/admin/administrators/index.js index 9ecdeed60..45cae2971 100644 --- a/views/admin/administrators/index.js +++ b/views/admin/administrators/index.js @@ -5,12 +5,12 @@ exports.find = function(req, res, next){ req.query.limit = req.query.limit ? parseInt(req.query.limit, null) : 20; req.query.page = req.query.page ? parseInt(req.query.page, null) : 1; req.query.sort = req.query.sort ? req.query.sort : '_id'; - + var filters = {}; if (req.query.search) { filters.search = new RegExp('^.*?'+ req.query.search +'.*$', 'i'); } - + req.app.db.models.Admin.pagedFind({ filters: filters, keys: 'name.full', @@ -21,7 +21,7 @@ exports.find = function(req, res, next){ if (err) { return next(err); } - + if (req.xhr) { res.header('Cache-Control', 'no-cache, no-store, must-revalidate'); results.filters = req.query; @@ -36,34 +36,34 @@ exports.find = function(req, res, next){ exports.read = function(req, res, next){ var outcome = {}; - + var getAdminGroups = function(callback) { req.app.db.models.AdminGroup.find({}, 'name').sort('name').exec(function(err, adminGroups) { if (err) { return callback(err, null); } - + outcome.adminGroups = adminGroups; return callback(null, 'done'); }); }; - + var getRecord = function(callback) { req.app.db.models.Admin.findById(req.params.id).populate('groups', 'name').exec(function(err, record) { if (err) { return callback(err, null); } - + outcome.record = record; return callback(null, 'done'); }); }; - + var asyncFinally = function(err, results) { if (err) { return next(err); } - + if (req.xhr) { res.send(outcome.record); } @@ -76,22 +76,22 @@ exports.read = function(req, res, next){ }); } }; - + require('async').parallel([getAdminGroups, getRecord], asyncFinally); }; exports.create = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body['name.full']) { workflow.outcome.errors.push('Please enter a name.'); return workflow.emit('response'); } - + workflow.emit('createAdministrator'); }); - + workflow.on('createAdministrator', function() { var nameParts = req.body['name.full'].trim().split(/\s/); var fieldsToSet = { @@ -107,39 +107,39 @@ exports.create = function(req, res, next){ fieldsToSet.name.middle, fieldsToSet.name.last ]; - + req.app.db.models.Admin.create(fieldsToSet, function(err, admin) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.record = admin; return workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.update = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.first) { workflow.outcome.errfor.first = 'required'; } - + if (!req.body.last) { workflow.outcome.errfor.last = 'required'; } - + if (workflow.hasErrors()) { return workflow.emit('response'); } - + workflow.emit('patchAdministrator'); }); - + workflow.on('patchAdministrator', function() { var fieldsToSet = { name: { @@ -154,131 +154,131 @@ exports.update = function(req, res, next){ req.body.last ] }; - + req.app.db.models.Admin.findByIdAndUpdate(req.params.id, fieldsToSet, function(err, admin) { if (err) { return workflow.emit('exception', err); } - + admin.populate('groups', 'name', function(err, admin) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.admin = admin; workflow.emit('response'); }); }); }); - + workflow.emit('validate'); }; exports.groups = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not change the group memberships of admins.'); return workflow.emit('response'); } - + if (!req.body.groups) { workflow.outcome.errfor.groups = 'required'; return workflow.emit('response'); } - + workflow.emit('patchAdministrator'); }); - + workflow.on('patchAdministrator', function() { var fieldsToSet = { groups: req.body.groups }; - + req.app.db.models.Admin.findByIdAndUpdate(req.params.id, fieldsToSet, function(err, admin) { if (err) { return workflow.emit('exception', err); } - + admin.populate('groups', 'name', function(err, admin) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.admin = admin; workflow.emit('response'); }); }); }); - + workflow.emit('validate'); }; exports.permissions = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not change the permissions of admins.'); return workflow.emit('response'); } - + if (!req.body.permissions) { workflow.outcome.errfor.permissions = 'required'; return workflow.emit('response'); } - + workflow.emit('patchAdministrator'); }); - + workflow.on('patchAdministrator', function() { var fieldsToSet = { permissions: req.body.permissions }; - + req.app.db.models.Admin.findByIdAndUpdate(req.params.id, fieldsToSet, function(err, admin) { if (err) { return workflow.emit('exception', err); } - + admin.populate('groups', 'name', function(err, admin) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.admin = admin; workflow.emit('response'); }); }); }); - + workflow.emit('validate'); }; exports.linkUser = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not link admins to users.'); return workflow.emit('response'); } - + if (!req.body.newUsername) { workflow.outcome.errfor.newUsername = 'required'; return workflow.emit('response'); } - + workflow.emit('verifyUser'); }); - + workflow.on('verifyUser', function(callback) { req.app.db.models.User.findOne({ username: req.body.newUsername }, 'username').exec(function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (!user) { workflow.outcome.errors.push('User not found.'); return workflow.emit('response'); @@ -287,27 +287,27 @@ exports.linkUser = function(req, res, next){ workflow.outcome.errors.push('User is already linked to a different admin.'); return workflow.emit('response'); } - + workflow.user = user; workflow.emit('duplicateLinkCheck'); }); }); - + workflow.on('duplicateLinkCheck', function(callback) { req.app.db.models.Admin.findOne({ 'user.id': workflow.user._id, _id: { $ne: req.params.id } }).exec(function(err, admin) { if (err) { return workflow.emit('exception', err); } - + if (admin) { workflow.outcome.errors.push('Another admin is already linked to that user.'); return workflow.emit('response'); } - + workflow.emit('patchUser'); }); }); - + workflow.on('patchUser', function() { req.app.db.models.User.findByIdAndUpdate(workflow.user._id, { 'roles.admin': req.params.id }).exec(function(err, user) { if (err) { @@ -316,125 +316,125 @@ exports.linkUser = function(req, res, next){ workflow.emit('patchAdministrator'); }); }); - + workflow.on('patchAdministrator', function(callback) { req.app.db.models.Admin.findByIdAndUpdate(req.params.id, { user: { id: workflow.user._id, name: workflow.user.username } }).exec(function(err, admin) { if (err) { return workflow.emit('exception', err); } - + admin.populate('groups', 'name', function(err, admin) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.admin = admin; workflow.emit('response'); }); }); }); - + workflow.emit('validate'); }; exports.unlinkUser = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not unlink users from admins.'); return workflow.emit('response'); } - + if (req.user.roles.admin._id === req.params.id) { workflow.outcome.errors.push('You may not unlink yourself from admin.'); return workflow.emit('response'); } - + workflow.emit('patchAdministrator'); }); - + workflow.on('patchAdministrator', function() { req.app.db.models.Admin.findById(req.params.id).exec(function(err, admin) { if (err) { return workflow.emit('exception', err); } - + if (!admin) { workflow.outcome.errors.push('Administrator was not found.'); return workflow.emit('response'); } - + var userId = admin.user.id; admin.user = { id: undefined, name: ''}; admin.save(function(err, admin) { if (err) { return workflow.emit('exception', err); } - + admin.populate('groups', 'name', function(err, admin) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.admin = admin; workflow.emit('patchUser', userId); }); }); }); }); - + workflow.on('patchUser', function(id) { req.app.db.models.User.findById(id).exec(function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (!user) { workflow.outcome.errors.push('User was not found.'); return workflow.emit('response'); } - + user.roles.admin = undefined; user.save(function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.emit('response'); }); }); }); - + workflow.emit('validate'); }; exports.delete = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not delete admins.'); return workflow.emit('response'); } - + if (req.user.roles.admin._id === req.params.id) { workflow.outcome.errors.push('You may not delete your own admin record.'); return workflow.emit('response'); } - + workflow.emit('deleteAdministrator'); }); - + workflow.on('deleteAdministrator', function(err) { req.app.db.models.Admin.findByIdAndRemove(req.params.id, function(err, admin) { if (err) { return workflow.emit('exception', err); } - + workflow.emit('response'); }); }); - + workflow.emit('validate'); }; diff --git a/views/admin/categories/details.jade b/views/admin/categories/details.jade index 32ec2d201..8b9e8891e 100644 --- a/views/admin/categories/details.jade +++ b/views/admin/categories/details.jade @@ -12,13 +12,13 @@ block body div#header div#details div#delete - + script(type='text/template', id='tmpl-header') div.page-header h1 a(href='/admin/categories/') Categories | / <%- name %> - + script(type='text/template', id='tmpl-details') fieldset legend Details @@ -43,7 +43,7 @@ block body span.help-block <%= errfor.name %> div.control-group button.btn.btn-primary.btn-update(type='button') Update - + script(type='text/template', id='tmpl-delete') fieldset legend Danger Zone @@ -56,9 +56,9 @@ block body div.control-group span.help-block span.label.label-danger If you do this, it cannot be undone. - | + |  span.text-muted You may also create orphaned document relationships too. div.control-group button.btn.btn-danger.btn-delete(type='button') Delete - + script(type='text/template', id='data-record') !{data.record} diff --git a/views/admin/categories/index.jade b/views/admin/categories/index.jade index 8ed3a509a..9940253df 100644 --- a/views/admin/categories/index.jade +++ b/views/admin/categories/index.jade @@ -16,7 +16,7 @@ block body div#filters div#results-table div#results-paging - + script(type='text/template', id='tmpl-header') div.page-header form.form-inline.pull-right @@ -25,7 +25,7 @@ block body input.form-control(name='name', type='text', placeholder='name', value!='<%= name %>') button.btn.btn-primary.btn-add(type='button') Add New h1 Categories - + script(type='text/template', id='tmpl-filters') form.filters div.row @@ -49,28 +49,28 @@ block body option(value='20', selected='selected') 20 items option(value='50') 50 items option(value='100') 100 items - + script(type='text/template', id='tmpl-results-table') table.table.table-striped thead tr - th + th th pivot th.stretch name th id tbody#results-rows - + script(type='text/template', id='tmpl-results-row') td input.btn.btn-default.btn-sm.btn-details(type='button', value='Edit') td <%- pivot %> td <%- name %> td.nowrap <%= _id %> - + script(type='text/template', id='tmpl-results-empty-row') tr td(colspan='4') no documents matched - + script(type='text/template', id='tmpl-results-paging') div.well div.btn-group.pull-left @@ -80,5 +80,5 @@ block body button.btn.btn-default.btn-page.btn-prev(data-page!='<%= pages.prev %>') Prev button.btn.btn-default.btn-page.btn-next(data-page!='<%= pages.next %>') Next div.clearfix - + script(type='text/template', id='data-results') !{data.results} diff --git a/views/admin/categories/index.js b/views/admin/categories/index.js index ffda4aafb..c275a6fca 100644 --- a/views/admin/categories/index.js +++ b/views/admin/categories/index.js @@ -6,7 +6,7 @@ exports.find = function(req, res, next){ req.query.limit = req.query.limit ? parseInt(req.query.limit, null) : 20; req.query.page = req.query.page ? parseInt(req.query.page, null) : 1; req.query.sort = req.query.sort ? req.query.sort : '_id'; - + var filters = {}; if (req.query.pivot) { filters.pivot = new RegExp('^.*?'+ req.query.pivot +'.*$', 'i'); @@ -14,7 +14,7 @@ exports.find = function(req, res, next){ if (req.query.name) { filters.name = new RegExp('^.*?'+ req.query.name +'.*$', 'i'); } - + req.app.db.models.Category.pagedFind({ filters: filters, keys: 'pivot name', @@ -25,7 +25,7 @@ exports.find = function(req, res, next){ if (err) { return next(err); } - + if (req.xhr) { res.header('Cache-Control', 'no-cache, no-store, must-revalidate'); results.filters = req.query; @@ -43,7 +43,7 @@ exports.read = function(req, res, next){ if (err) { return next(err); } - + if (req.xhr) { res.send(category); } @@ -55,114 +55,114 @@ exports.read = function(req, res, next){ exports.create = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not create categories.'); return workflow.emit('response'); } - + if (!req.body.pivot) { workflow.outcome.errors.push('A name is required.'); return workflow.emit('response'); } - + if (!req.body.name) { workflow.outcome.errors.push('A name is required.'); return workflow.emit('response'); } - + workflow.emit('duplicateCategoryCheck'); }); - + workflow.on('duplicateCategoryCheck', function() { req.app.db.models.Category.findById(req.app.utility.slugify(req.body.pivot +' '+ req.body.name)).exec(function(err, category) { if (err) { return workflow.emit('exception', err); } - + if (category) { workflow.outcome.errors.push('That category+pivot is already taken.'); return workflow.emit('response'); } - + workflow.emit('createCategory'); }); }); - + workflow.on('createCategory', function() { var fieldsToSet = { _id: req.app.utility.slugify(req.body.pivot +' '+ req.body.name), pivot: req.body.pivot, name: req.body.name }; - + req.app.db.models.Category.create(fieldsToSet, function(err, category) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.record = category; return workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.update = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not update categories.'); return workflow.emit('response'); } - + if (!req.body.pivot) { workflow.outcome.errfor.pivot = 'pivot'; return workflow.emit('response'); } - + if (!req.body.name) { workflow.outcome.errfor.name = 'required'; return workflow.emit('response'); } - + workflow.emit('patchCategory'); }); - + workflow.on('patchCategory', function() { var fieldsToSet = { pivot: req.body.pivot, name: req.body.name }; - + req.app.db.models.Category.findByIdAndUpdate(req.params.id, fieldsToSet, function(err, category) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.category = category; return workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.delete = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not delete categories.'); return workflow.emit('response'); } - + workflow.emit('deleteCategory'); }); - + workflow.on('deleteCategory', function(err) { req.app.db.models.Category.findByIdAndRemove(req.params.id, function(err, category) { if (err) { @@ -171,6 +171,6 @@ exports.delete = function(req, res, next){ workflow.emit('response'); }); }); - + workflow.emit('validate'); }; diff --git a/views/admin/index.js b/views/admin/index.js index e8c9cb214..f9b0729b4 100644 --- a/views/admin/index.js +++ b/views/admin/index.js @@ -4,27 +4,27 @@ exports.init = function(req, res, next){ var sigma = {}; var collections = ['User', 'Account', 'Admin', 'AdminGroup', 'Category', 'Status']; var queries = []; - + collections.forEach(function(el, i, arr) { queries.push(function(done) { req.app.db.models[el].count({}, function(err, count) { if (err) { return done(err, null); } - + sigma['count'+ el] = count; done(null, el); }); }); }); - + var asyncFinally = function(err, results) { if (err) { return next(err); } - + res.render('admin/index', sigma); }; - + require('async').parallel(queries, asyncFinally); }; diff --git a/views/admin/search/index.js b/views/admin/search/index.js index fa7907a3e..9d216ef72 100644 --- a/views/admin/search/index.js +++ b/views/admin/search/index.js @@ -4,47 +4,47 @@ exports.find = function(req, res, next){ req.query.q = req.query.q ? req.query.q : ''; var regexQuery = new RegExp('^.*?'+ req.query.q +'.*$', 'i'); var outcome = {}; - + var searchUsers = function(done) { req.app.db.models.User.find({search: regexQuery}, 'username').sort('username').limit(10).lean().exec(function(err, results) { if (err) { return done(err, null); } - + outcome.users = results; done(null, 'searchUsers'); }); }; - + var searchAccounts = function(done) { req.app.db.models.Account.find({search: regexQuery}, 'name.full').sort('name.full').limit(10).lean().exec(function(err, results) { if (err) { return done(err, null); } - + outcome.accounts = results; return done(null, 'searchAccounts'); }); }; - + var searchAdministrators = function(done) { req.app.db.models.Admin.find({search: regexQuery}, 'name.full').sort('name.full').limit(10).lean().exec(function(err, results) { if (err) { return done(err, null); } - + outcome.administrators = results; return done(null, 'searchAdministrators'); }); }; - + var asyncFinally = function(err, results) { if (err) { return next(err, null); } - + res.send(outcome); }; - + require('async').parallel([searchUsers, searchAccounts, searchAdministrators], asyncFinally); }; diff --git a/views/admin/statuses/details.jade b/views/admin/statuses/details.jade index 7921038a9..80da9d232 100644 --- a/views/admin/statuses/details.jade +++ b/views/admin/statuses/details.jade @@ -12,13 +12,13 @@ block body div#header div#details div#delete - + script(type='text/template', id='tmpl-header') div.page-header h1 a(href='/admin/statuses/') Statuses | / <%- name %> - + script(type='text/template', id='tmpl-details') fieldset legend Details @@ -43,7 +43,7 @@ block body span.help-block <%= errfor.name %> div.control-group button.btn.btn-primary.btn-update(type='button') Update - + script(type='text/template', id='tmpl-delete') fieldset legend Danger Zone @@ -56,9 +56,9 @@ block body div.control-group span.help-block span.label.label-danger If you do this, it cannot be undone. - | + |  span.text-muted You may also create orphaned document relationships too. div.control-group button.btn.btn-danger.btn-delete(type='button') Delete - + script(type='text/template', id='data-record') !{data.record} diff --git a/views/admin/statuses/index.jade b/views/admin/statuses/index.jade index 05764f4ee..ef0c389de 100644 --- a/views/admin/statuses/index.jade +++ b/views/admin/statuses/index.jade @@ -16,7 +16,7 @@ block body div#filters div#results-table div#results-paging - + script(type='text/template', id='tmpl-header') div.page-header form.form-inline.pull-right @@ -25,7 +25,7 @@ block body input.form-control(name='name', type='text', placeholder='name', value!='<%= name %>') button.btn.btn-primary.btn-add(type='button') Add New h1 Statuses - + script(type='text/template', id='tmpl-filters') form.filters div.row @@ -49,28 +49,28 @@ block body option(value='20', selected='selected') 20 items option(value='50') 50 items option(value='100') 100 items - + script(type='text/template', id='tmpl-results-table') table.table.table-striped thead tr - th + th th pivot th.stretch name th id tbody#results-rows - + script(type='text/template', id='tmpl-results-row') td input.btn.btn-default.btn-sm.btn-details(type='button', value='Edit') td <%- pivot %> td <%- name %> td.nowrap <%= _id %> - + script(type='text/template', id='tmpl-results-empty-row') tr td(colspan='4') no documents matched - + script(type='text/template', id='tmpl-results-paging') div.well div.btn-group.pull-left @@ -80,5 +80,5 @@ block body button.btn.btn-default.btn-page.btn-prev(data-page!='<%= pages.prev %>') Prev button.btn.btn-default.btn-page.btn-next(data-page!='<%= pages.next %>') Next div.clearfix - + script(type='text/template', id='data-results') !{data.results} diff --git a/views/admin/statuses/index.js b/views/admin/statuses/index.js index c3ac3a078..19008a7c8 100644 --- a/views/admin/statuses/index.js +++ b/views/admin/statuses/index.js @@ -6,16 +6,16 @@ exports.find = function(req, res, next){ req.query.limit = req.query.limit ? parseInt(req.query.limit, null) : 20; req.query.page = req.query.page ? parseInt(req.query.page, null) : 1; req.query.sort = req.query.sort ? req.query.sort : '_id'; - + var filters = {}; if (req.query.pivot) { filters.pivot = new RegExp('^.*?'+ req.query.pivot +'.*$', 'i'); } - + if (req.query.name) { filters.name = new RegExp('^.*?'+ req.query.name +'.*$', 'i'); } - + req.app.db.models.Status.pagedFind({ filters: filters, keys: 'pivot name', @@ -26,7 +26,7 @@ exports.find = function(req, res, next){ if (err) { return next(err); } - + if (req.xhr) { res.header('Cache-Control', 'no-cache, no-store, must-revalidate'); results.filters = req.query; @@ -44,7 +44,7 @@ exports.read = function(req, res, next){ if (err) { return next(err); } - + if (req.xhr) { res.send(status); } @@ -56,123 +56,123 @@ exports.read = function(req, res, next){ exports.create = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not create statuses.'); return workflow.emit('response'); } - + if (!req.body.pivot) { workflow.outcome.errors.push('A name is required.'); return workflow.emit('response'); } - + if (!req.body.name) { workflow.outcome.errors.push('A name is required.'); return workflow.emit('response'); } - + workflow.emit('duplicateStatusCheck'); }); - + workflow.on('duplicateStatusCheck', function() { req.app.db.models.Status.findById(req.app.utility.slugify(req.body.pivot +' '+ req.body.name)).exec(function(err, status) { if (err) { return workflow.emit('exception', err); } - + if (status) { workflow.outcome.errors.push('That status+pivot is already taken.'); return workflow.emit('response'); } - + workflow.emit('createStatus'); }); }); - + workflow.on('createStatus', function() { var fieldsToSet = { _id: req.app.utility.slugify(req.body.pivot +' '+ req.body.name), pivot: req.body.pivot, name: req.body.name }; - + req.app.db.models.Status.create(fieldsToSet, function(err, status) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.record = status; return workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.update = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not update statuses.'); return workflow.emit('response'); } - + if (!req.body.pivot) { workflow.outcome.errfor.pivot = 'pivot'; return workflow.emit('response'); } - + if (!req.body.name) { workflow.outcome.errfor.name = 'required'; return workflow.emit('response'); } - + workflow.emit('patchStatus'); }); - + workflow.on('patchStatus', function() { var fieldsToSet = { pivot: req.body.pivot, name: req.body.name }; - + req.app.db.models.Status.findByIdAndUpdate(req.params.id, fieldsToSet, function(err, status) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.status = status; return workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.delete = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not delete statuses.'); return workflow.emit('response'); } - + workflow.emit('deleteStatus'); }); - + workflow.on('deleteStatus', function(err) { req.app.db.models.Status.findByIdAndRemove(req.params.id, function(err, status) { if (err) { return workflow.emit('exception', err); } - + workflow.emit('response'); }); }); - + workflow.emit('validate'); }; diff --git a/views/admin/users/details.jade b/views/admin/users/details.jade index 4075922a7..b06c68fd2 100644 --- a/views/admin/users/details.jade +++ b/views/admin/users/details.jade @@ -14,13 +14,13 @@ block body div#roles div#password div#delete - + script(type='text/template', id='tmpl-header') div.page-header h1 a(href='/admin/users/') Users | / <%= username %> - + script(type='text/template', id='tmpl-identity') fieldset legend Identity @@ -51,7 +51,7 @@ block body span.help-block <%= errfor.email %> div.control-group button.btn.btn-primary.btn-update(type='button') Update - + script(type='text/template', id='tmpl-roles') fieldset legend Roles @@ -90,7 +90,7 @@ block body button.btn.btn-success.btn-account-link(type='button') Link |<% } %> span.help-block <%= errfor.newAccountId %> - + script(type='text/template', id='tmpl-password') fieldset legend Set Password @@ -115,7 +115,7 @@ block body span.help-block <%= errfor.confirm %> div.control-group button.btn.btn-primary.btn-password(type='button') Set Password - + script(type='text/template', id='tmpl-delete') fieldset legend Danger Zone @@ -128,9 +128,9 @@ block body div.control-group span.help-block span.label.label-danger If you do this, it cannot be undone. - | + |  span.text-muted You may also create orphaned document relationships too. div.control-group button.btn.btn-danger.btn-delete(type='button') Delete - + script(type='text/template', id='data-record') !{data.record} diff --git a/views/admin/users/index.jade b/views/admin/users/index.jade index 09205222f..623ef6e5c 100644 --- a/views/admin/users/index.jade +++ b/views/admin/users/index.jade @@ -16,7 +16,7 @@ block body div#filters div#results-table div#results-paging - + script(type='text/template', id='tmpl-header') div.page-header form.form-inline.pull-right @@ -24,7 +24,7 @@ block body input.form-control(name='username', type='text', placeholder='enter a username', value!='<%= username %>') button.btn.btn-primary.btn-add(type='button') Add New h1 Users - + script(type='text/template', id='tmpl-filters') form.filters div.row @@ -59,18 +59,18 @@ block body option(value='20', selected='selected') 20 items option(value='50') 50 items option(value='100') 100 items - + script(type='text/template', id='tmpl-results-table') table.table.table-striped thead tr - th + th th username th.stretch email th active th id tbody#results-rows - + script(type='text/template', id='tmpl-results-row') td input.btn.btn-default.btn-sm.btn-details(type='button', value='Edit') @@ -78,11 +78,11 @@ block body td <%= email %> td <%= isActive %> td <%= _id %> - + script(type='text/template', id='tmpl-results-empty-row') tr td(colspan='5') no documents matched - + script(type='text/template', id='tmpl-results-paging') div.well div.btn-group.pull-left @@ -92,5 +92,5 @@ block body button.btn.btn-default.btn-page.btn-prev(data-page!='<%= pages.prev %>') Prev button.btn.btn-default.btn-page.btn-next(data-page!='<%= pages.next %>') Next div.clearfix - + script(type='text/template', id='data-results') !{data.results} diff --git a/views/admin/users/index.js b/views/admin/users/index.js index 76a08a57c..b5e5dc75b 100644 --- a/views/admin/users/index.js +++ b/views/admin/users/index.js @@ -5,24 +5,24 @@ exports.find = function(req, res, next){ req.query.limit = req.query.limit ? parseInt(req.query.limit, null) : 20; req.query.page = req.query.page ? parseInt(req.query.page, null) : 1; req.query.sort = req.query.sort ? req.query.sort : '_id'; - + var filters = {}; if (req.query.username) { filters.username = new RegExp('^.*?'+ req.query.username +'.*$', 'i'); } - + if (req.query.isActive) { filters.isActive = req.query.isActive; } - + if (req.query.roles && req.query.roles === 'admin') { filters['roles.admin'] = { $exists: true }; } - + if (req.query.roles && req.query.roles === 'account') { filters['roles.account'] = { $exists: true }; } - + req.app.db.models.User.pagedFind({ filters: filters, keys: 'username email isActive', @@ -33,7 +33,7 @@ exports.find = function(req, res, next){ if (err) { return next(err); } - + if (req.xhr) { res.header("Cache-Control", "no-cache, no-store, must-revalidate"); results.filters = req.query; @@ -51,7 +51,7 @@ exports.read = function(req, res, next){ if (err) { return next(err); } - + if (req.xhr) { res.send(user); } @@ -63,36 +63,36 @@ exports.read = function(req, res, next){ exports.create = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.username) { workflow.outcome.errors.push('Please enter a username.'); return workflow.emit('response'); } - + if (!/^[a-zA-Z0-9\-\_]+$/.test(req.body.username)) { workflow.outcome.errors.push('only use letters, numbers, -, _'); return workflow.emit('response'); } - + workflow.emit('duplicateUsernameCheck'); }); - + workflow.on('duplicateUsernameCheck', function() { req.app.db.models.User.findOne({ username: req.body.username }, function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (user) { workflow.outcome.errors.push('That username is already taken.'); return workflow.emit('response'); } - + workflow.emit('createUser'); }); }); - + workflow.on('createUser', function() { var fieldsToSet = { username: req.body.username, @@ -104,74 +104,74 @@ exports.create = function(req, res, next){ if (err) { return workflow.emit('exception', err); } - + workflow.outcome.record = user; return workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.update = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.isActive) { req.body.isActive = 'no'; } - + if (!req.body.username) { workflow.outcome.errfor.username = 'required'; } else if (!/^[a-zA-Z0-9\-\_]+$/.test(req.body.username)) { workflow.outcome.errfor.username = 'only use letters, numbers, \'-\', \'_\''; } - + if (!req.body.email) { workflow.outcome.errfor.email = 'required'; } else if (!/^[a-zA-Z0-9\-\_\.\+]+@[a-zA-Z0-9\-\_\.]+\.[a-zA-Z0-9\-\_]+$/.test(req.body.email)) { workflow.outcome.errfor.email = 'invalid email format'; } - + if (workflow.hasErrors()) { return workflow.emit('response'); } - + workflow.emit('duplicateUsernameCheck'); }); - + workflow.on('duplicateUsernameCheck', function() { req.app.db.models.User.findOne({ username: req.body.username, _id: { $ne: req.params.id } }, function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (user) { workflow.outcome.errfor.username = 'username already taken'; return workflow.emit('response'); } - + workflow.emit('duplicateEmailCheck'); }); }); - + workflow.on('duplicateEmailCheck', function() { req.app.db.models.User.findOne({ email: req.body.email.toLowerCase(), _id: { $ne: req.params.id } }, function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (user) { workflow.outcome.errfor.email = 'email already taken'; return workflow.emit('response'); } - + workflow.emit('patchUser'); }); }); - + workflow.on('patchUser', function() { var fieldsToSet = { isActive: req.body.isActive, @@ -182,16 +182,16 @@ exports.update = function(req, res, next){ req.body.email ] }; - + req.app.db.models.User.findByIdAndUpdate(req.params.id, fieldsToSet, function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.emit('patchAdmin', user); }); }); - + workflow.on('patchAdmin', function(user) { if (user.roles.admin) { var fieldsToSet = { @@ -204,7 +204,7 @@ exports.update = function(req, res, next){ if (err) { return workflow.emit('exception', err); } - + workflow.emit('patchAccount', user); }); } @@ -212,7 +212,7 @@ exports.update = function(req, res, next){ workflow.emit('patchAccount', user); } }); - + workflow.on('patchAccount', function(user) { if (user.roles.account) { var fieldsToSet = { @@ -225,7 +225,7 @@ exports.update = function(req, res, next){ if (err) { return workflow.emit('exception', err); } - + workflow.emit('populateRoles', user); }); } @@ -233,59 +233,59 @@ exports.update = function(req, res, next){ workflow.emit('populateRoles', user); } }); - + workflow.on('populateRoles', function(user) { user.populate('roles.admin roles.account', 'name.full', function(err, populatedUser) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.user = populatedUser; workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.password = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.newPassword) { workflow.outcome.errfor.newPassword = 'required'; } - + if (!req.body.confirm) { workflow.outcome.errfor.confirm = 'required'; } - + if (req.body.newPassword !== req.body.confirm) { workflow.outcome.errors.push('Passwords do not match.'); } - + if (workflow.hasErrors()) { return workflow.emit('response'); } - + workflow.emit('patchUser'); }); - + workflow.on('patchUser', function() { var fieldsToSet = { password: req.app.db.models.User.encryptPassword(req.body.newPassword) }; - + req.app.db.models.User.findByIdAndUpdate(req.params.id, fieldsToSet, function(err, user) { if (err) { return workflow.emit('exception', err); } - + user.populate('roles.admin roles.account', 'name.full', function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.user = user; workflow.outcome.newPassword = ''; workflow.outcome.confirm = ''; @@ -293,357 +293,357 @@ exports.password = function(req, res, next){ }); }); }); - + workflow.emit('validate'); }; exports.linkAdmin = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not link users to admins.'); return workflow.emit('response'); } - + if (!req.body.newAdminId) { workflow.outcome.errfor.newAdminId = 'required'; return workflow.emit('response'); } - + workflow.emit('verifyAdmin'); }); - + workflow.on('verifyAdmin', function(callback) { req.app.db.models.Admin.findById(req.body.newAdminId).exec(function(err, admin) { if (err) { return workflow.emit('exception', err); } - + if (!admin) { workflow.outcome.errors.push('Admin not found.'); return workflow.emit('response'); } - + if (admin.user.id && admin.user.id !== req.params.id) { workflow.outcome.errors.push('Admin is already linked to a different user.'); return workflow.emit('response'); } - + workflow.admin = admin; workflow.emit('duplicateLinkCheck'); }); }); - + workflow.on('duplicateLinkCheck', function(callback) { req.app.db.models.User.findOne({ 'roles.admin': req.body.newAdminId, _id: {$ne: req.params.id} }).exec(function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (user) { workflow.outcome.errors.push('Another user is already linked to that admin.'); return workflow.emit('response'); } - + workflow.emit('patchUser'); }); }); - + workflow.on('patchUser', function(callback) { req.app.db.models.User.findById(req.params.id).exec(function(err, user) { if (err) { return workflow.emit('exception', err); } - + user.roles.admin = req.body.newAdminId; user.save(function(err, user) { if (err) { return workflow.emit('exception', err); } - + user.populate('roles.admin roles.account', 'name.full', function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.user = user; workflow.emit('patchAdmin'); }); }); }); }); - + workflow.on('patchAdmin', function() { workflow.admin.user = { id: req.params.id, name: workflow.outcome.user.username }; workflow.admin.save(function(err, admin) { if (err) { return workflow.emit('exception', err); } - + workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.unlinkAdmin = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not unlink users from admins.'); return workflow.emit('response'); } - + if (req.user._id === req.params.id) { workflow.outcome.errors.push('You may not unlink yourself from admin.'); return workflow.emit('response'); } - + workflow.emit('patchUser'); }); - + workflow.on('patchUser', function() { req.app.db.models.User.findById(req.params.id).exec(function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (!user) { workflow.outcome.errors.push('User was not found.'); return workflow.emit('response'); } - + var adminId = user.roles.admin; user.roles.admin = null; user.save(function(err, user) { if (err) { return workflow.emit('exception', err); } - + user.populate('roles.admin roles.account', 'name.full', function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.user = user; workflow.emit('patchAdmin', adminId); }); }); }); }); - + workflow.on('patchAdmin', function(id) { req.app.db.models.Admin.findById(id).exec(function(err, admin) { if (err) { return workflow.emit('exception', err); } - + if (!admin) { workflow.outcome.errors.push('Admin was not found.'); return workflow.emit('response'); } - + admin.user = undefined; admin.save(function(err, admin) { if (err) { return workflow.emit('exception', err); } - + workflow.emit('response'); }); }); }); - + workflow.emit('validate'); }; exports.linkAccount = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not link users to accounts.'); return workflow.emit('response'); } - + if (!req.body.newAccountId) { workflow.outcome.errfor.newAccountId = 'required'; return workflow.emit('response'); } - + workflow.emit('verifyAccount'); }); - + workflow.on('verifyAccount', function(callback) { req.app.db.models.Account.findById(req.body.newAccountId).exec(function(err, account) { if (err) { return workflow.emit('exception', err); } - + if (!account) { workflow.outcome.errors.push('Account not found.'); return workflow.emit('response'); } - + if (account.user.id && account.user.id !== req.params.id) { workflow.outcome.errors.push('Account is already linked to a different user.'); return workflow.emit('response'); } - + workflow.account = account; workflow.emit('duplicateLinkCheck'); }); }); - + workflow.on('duplicateLinkCheck', function(callback) { req.app.db.models.User.findOne({ 'roles.account': req.body.newAccountId, _id: {$ne: req.params.id} }).exec(function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (user) { workflow.outcome.errors.push('Another user is already linked to that account.'); return workflow.emit('response'); } - + workflow.emit('patchUser'); }); }); - + workflow.on('patchUser', function(callback) { req.app.db.models.User.findById(req.params.id).exec(function(err, user) { if (err) { return workflow.emit('exception', err); } - + user.roles.account = req.body.newAccountId; user.save(function(err, user) { if (err) { return workflow.emit('exception', err); } - + user.populate('roles.admin roles.account', 'name.full', function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.user = user; workflow.emit('patchAccount'); }); }); }); }); - + workflow.on('patchAccount', function() { workflow.account.user = { id: req.params.id, name: workflow.outcome.user.username }; workflow.account.save(function(err, account) { if (err) { return workflow.emit('exception', err); } - + workflow.emit('response'); }); }); - + workflow.emit('validate'); }; exports.unlinkAccount = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not unlink users from accounts.'); return workflow.emit('response'); } - + workflow.emit('patchUser'); }); - + workflow.on('patchUser', function() { req.app.db.models.User.findById(req.params.id).exec(function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (!user) { workflow.outcome.errors.push('User was not found.'); return workflow.emit('response'); } - + var accountId = user.roles.account; user.roles.account = null; user.save(function(err, user) { if (err) { return workflow.emit('exception', err); } - + user.populate('roles.admin roles.account', 'name.full', function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.outcome.user = user; workflow.emit('patchAccount', accountId); }); }); }); }); - + workflow.on('patchAccount', function(id) { req.app.db.models.Account.findById(id).exec(function(err, account) { if (err) { return workflow.emit('exception', err); } - + if (!account) { workflow.outcome.errors.push('Account was not found.'); return workflow.emit('response'); } - + account.user = undefined; account.save(function(err, account) { if (err) { return workflow.emit('exception', err); } - + workflow.emit('response'); }); }); }); - + workflow.emit('validate'); }; exports.delete = function(req, res, next){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.user.roles.admin.isMemberOf('root')) { workflow.outcome.errors.push('You may not delete users.'); return workflow.emit('response'); } - + if (req.user._id === req.params.id) { workflow.outcome.errors.push('You may not delete yourself from user.'); return workflow.emit('response'); } - + workflow.emit('deleteUser'); }); - + workflow.on('deleteUser', function(err) { req.app.db.models.User.findByIdAndRemove(req.params.id, function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.emit('response'); }); }); - + workflow.emit('validate'); }; diff --git a/views/contact/email-text.jade b/views/contact/email-text.jade index 934eb05ca..0e00fb390 100644 --- a/views/contact/email-text.jade +++ b/views/contact/email-text.jade @@ -1,11 +1,12 @@ // - | - | + = '\n' + = '\n' | #{projectName} Contact Form - | + = '\n' + = '\n' | Name: #{name} | Email: #{email} | Message: | #{message} - | - | + = '\n' + = '\n' diff --git a/views/contact/index.jade b/views/contact/index.jade index f67d4e362..0ed5b28b3 100644 --- a/views/contact/index.jade +++ b/views/contact/index.jade @@ -21,7 +21,7 @@ block body p.lead Freddy can't wait to hear from you. i.fa.fa-reply-all.super-awesome address 1428 Elm Street • San Francisco, CA 94122 - + script(type='text/template', id='tmpl-contact') form div.alerts diff --git a/views/contact/index.js b/views/contact/index.js index 3749d9d30..dbc61799f 100644 --- a/views/contact/index.js +++ b/views/contact/index.js @@ -6,27 +6,27 @@ exports.init = function(req, res){ exports.sendMessage = function(req, res){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.name) { workflow.outcome.errfor.name = 'required'; } - + if (!req.body.email) { workflow.outcome.errfor.email = 'required'; } - + if (!req.body.message) { workflow.outcome.errfor.message = 'required'; } - + if (workflow.hasErrors()) { return workflow.emit('response'); } - + workflow.emit('sendEmail'); }); - + workflow.on('sendEmail', function() { req.app.utility.sendmail(req, res, { from: req.app.get('smtp-from-name') +' <'+ req.app.get('smtp-from-address') +'>', @@ -50,6 +50,6 @@ exports.sendMessage = function(req, res){ } }); }); - + workflow.emit('validate'); }; diff --git a/views/index.jade b/views/index.jade index decdf2e8e..404e3860d 100644 --- a/views/index.jade +++ b/views/index.jade @@ -13,7 +13,7 @@ block body | Your Node.js website and user system is running. May the force be with you. div a.btn.btn-primary.btn-lg(href='/signup/') Create an Account - | or + | or  a.btn.btn-warning.btn-lg(href='/login/forgot/') Reset Your Password div.clearfix div.row diff --git a/views/login/forgot/email-html.jade b/views/login/forgot/email-html.jade index dc59f3494..29319d592 100644 --- a/views/login/forgot/email-html.jade +++ b/views/login/forgot/email-html.jade @@ -2,7 +2,7 @@ h3 Forgot your password? p | We received a request to reset the password for your account (#{username}). p - | To reset your password, click on the link below (or copy and paste the URL into your browser): + | To reset your password, click on the link below (or copy and paste the URL into your browser): a(href='#{resetLink}') #{resetLink} p | Thanks, diff --git a/views/login/forgot/email-text.jade b/views/login/forgot/email-text.jade index 59ff97222..89308144d 100644 --- a/views/login/forgot/email-text.jade +++ b/views/login/forgot/email-text.jade @@ -1,14 +1,17 @@ // - | - | + = '\n' + = '\n' | Forgot your password? - | + = '\n' + = '\n' | We received a request to reset the password for your account (#{username}). - | + = '\n' + = '\n' | To reset your password, click on the link below (or copy and paste the URL into your browser): | #{resetLink} - | + = '\n' + = '\n' | Thanks, | #{projectName} - | - | + = '\n' + = '\n' diff --git a/views/login/forgot/index.jade b/views/login/forgot/index.jade index 07c5f19a3..29d4532eb 100644 --- a/views/login/forgot/index.jade +++ b/views/login/forgot/index.jade @@ -12,7 +12,7 @@ block body div.page-header h1 Forgot Your Password? div#forgot - + script(type='text/template', id='tmpl-forgot') form div.alerts @@ -36,5 +36,5 @@ block body |<% if (!success) { %> button.btn.btn-primary.btn-forgot(type='button') Send Reset |<% } %> - | + |  a.btn.btn-link(href='/login/') Back to Login diff --git a/views/login/forgot/index.js b/views/login/forgot/index.js index 7867f45bf..6fbd91c33 100644 --- a/views/login/forgot/index.js +++ b/views/login/forgot/index.js @@ -1,7 +1,7 @@ 'use strict'; exports.init = function(req, res){ - if (req.isAuthenticated()) { + if (req.isAuthenticated()) { res.redirect(req.user.defaultReturnUrl()); } else { @@ -11,33 +11,33 @@ exports.init = function(req, res){ exports.send = function(req, res){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.email) { workflow.outcome.errfor.email = 'required'; return workflow.emit('response'); } - + workflow.emit('patchUser'); }); - + workflow.on('patchUser', function() { var token = require('crypto').createHash('md5').update(Math.random().toString()).digest('hex'); - + req.app.db.models.User.findOneAndUpdate({ email: req.body.email.toLowerCase() }, { resetPasswordToken: token }, function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (!user) { workflow.outcome.errors.push('Email address not found.'); return workflow.emit('response'); } - + workflow.emit('sendEmail', token, user); }); }); - + workflow.on('sendEmail', function(token, user) { req.app.utility.sendmail(req, res, { from: req.app.get('smtp-from-name') +' <'+ req.app.get('smtp-from-address') +'>', @@ -59,6 +59,6 @@ exports.send = function(req, res){ } }); }); - + workflow.emit('validate'); }; diff --git a/views/login/index.jade b/views/login/index.jade index 2b0dfff87..24b50ae41 100644 --- a/views/login/index.jade +++ b/views/login/index.jade @@ -19,7 +19,7 @@ block body div.alerts div.alert.alert-info.alert-dismissable button.close(type='button', data-dismiss='alert') × - |#{oauthMessage} + |#{oauthMessage}  b a(href='/signup/') Sign Up Here div.form-actions @@ -36,7 +36,7 @@ block body a.btn.btn-info(href='/login/facebook/') i.fa.fa-facebook-square.fa-lg | Facebook - + script(type='text/template', id='tmpl-login') form div.alerts @@ -55,6 +55,6 @@ block body span.help-block <%= errfor.password %> div.form-actions button.btn.btn-primary.btn-login(type='button') Sign In - | + |  a.btn.btn-link(href='/login/forgot/') Forget your password? input(type='hidden', name='returnUrl', value=returnUrl) diff --git a/views/login/index.js b/views/login/index.js index b142eabc6..c35f16c67 100644 --- a/views/login/index.js +++ b/views/login/index.js @@ -1,7 +1,7 @@ 'use strict'; exports.init = function(req, res){ - if (req.isAuthenticated()) { + if (req.isAuthenticated()) { res.redirect(req.user.defaultReturnUrl()); } else { @@ -17,29 +17,29 @@ exports.init = function(req, res){ exports.login = function(req, res){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.username) { workflow.outcome.errfor.username = 'required'; } - + if (!req.body.password) { workflow.outcome.errfor.password = 'required'; } - + if (workflow.hasErrors()) { return workflow.emit('response'); } - + workflow.emit('attemptLogin'); }); - + workflow.on('attemptLogin', function() { req._passport.instance.authenticate('local', function(err, user, info) { if (err) { return workflow.emit('exception', err); } - + if (!user) { workflow.outcome.errors.push('Username and password combination not found or your account is inactive.'); return workflow.emit('response'); @@ -49,14 +49,14 @@ exports.login = function(req, res){ if (err) { return workflow.emit('exception', err); } - + workflow.outcome.defaultReturnUrl = user.defaultReturnUrl(); workflow.emit('response'); }); } })(req, res); }); - + workflow.emit('validate'); }; @@ -67,12 +67,12 @@ exports.loginTwitter = function(req, res, next){ if (!info || !info.profile) { return res.redirect('/login/'); } - + req.app.db.models.User.findOne({ 'twitter.id': info.profile._json.id }, function(err, user) { if (err) { return next(err); } - + if (!user) { res.render('login/index', { returnUrl: req.query.returnUrl || '/', @@ -87,7 +87,7 @@ exports.loginTwitter = function(req, res, next){ if (err) { return next(err); } - + res.redirect(user.defaultReturnUrl()); }); } @@ -100,12 +100,12 @@ exports.loginGitHub = function(req, res, next){ if (!info || !info.profile) { return res.redirect('/login/'); } - + req.app.db.models.User.findOne({ 'github.id': info.profile._json.id }, function(err, user) { if (err) { return next(err); } - + if (!user) { res.render('login/index', { returnUrl: req.query.returnUrl || '/', @@ -120,7 +120,7 @@ exports.loginGitHub = function(req, res, next){ if (err) { return next(err); } - + res.redirect(user.defaultReturnUrl()); }); } @@ -133,12 +133,12 @@ exports.loginFacebook = function(req, res, next){ if (!info || !info.profile) { return res.redirect('/login/'); } - + req.app.db.models.User.findOne({ 'facebook.id': info.profile._json.id }, function(err, user) { if (err) { return next(err); } - + if (!user) { res.render('login/index', { returnUrl: req.query.returnUrl || '/', @@ -153,7 +153,7 @@ exports.loginFacebook = function(req, res, next){ if (err) { return next(err); } - + res.redirect(user.defaultReturnUrl()); }); } diff --git a/views/login/reset/index.jade b/views/login/reset/index.jade index d8f2c90aa..31fdd7ef6 100644 --- a/views/login/reset/index.jade +++ b/views/login/reset/index.jade @@ -12,7 +12,7 @@ block body div.page-header h1 Reset Your Password div#reset - + script(type='text/template', id='tmpl-reset') form div.alerts @@ -45,5 +45,5 @@ block body |<% if (!success && id != undefined) { %> button.btn.btn-primary.btn-reset(type='button') Set Password |<% } %> - | + |  a.btn.btn-link(href='/login/') Back to Login diff --git a/views/login/reset/index.js b/views/login/reset/index.js index 0466d3aa0..d5945abfd 100644 --- a/views/login/reset/index.js +++ b/views/login/reset/index.js @@ -1,7 +1,7 @@ 'use strict'; exports.init = function(req, res){ - if (req.isAuthenticated()) { + if (req.isAuthenticated()) { res.redirect(req.user.defaultReturnUrl()); } else { @@ -11,47 +11,47 @@ exports.init = function(req, res){ exports.set = function(req, res){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.password) { workflow.outcome.errfor.password = 'required'; } - + if (!req.body.confirm) { workflow.outcome.errfor.confirm = 'required'; } - + if (req.body.password !== req.body.confirm) { workflow.outcome.errors.push('Passwords do not match.'); } - + if (workflow.hasErrors()) { return workflow.emit('response'); } - + workflow.emit('patchUser'); }); - + workflow.on('patchUser', function() { var encryptedPassword = req.app.db.models.User.encryptPassword(req.body.password); - + req.app.db.models.User.findOneAndUpdate( { resetPasswordToken: req.params.token }, - { password: encryptedPassword, resetPasswordToken: '' }, + { password: encryptedPassword, resetPasswordToken: '' }, function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (!user) { workflow.outcome.errors.push('Invalid reset token.'); return workflow.emit('response'); } - + workflow.emit('response'); } ); }); - + workflow.emit('validate'); }; diff --git a/views/signup/email-text.jade b/views/signup/email-text.jade index 287db7e7e..3b62f445f 100644 --- a/views/signup/email-text.jade +++ b/views/signup/email-text.jade @@ -1,16 +1,20 @@ // - | - | + = '\n' + = '\n' | Welcome to #{projectName} - | + = '\n' + = '\n' | Thanks for signing up. As requested, your account has been created. Here are your login credentials: - | + = '\n' + = '\n' | Username: #{username} | Email: #{email} - | + = '\n' + = '\n' | Login Here: #{loginURL} - | + = '\n' + = '\n' | Thanks, | #{projectName} - | - | + = '\n' + = '\n' diff --git a/views/signup/index.jade b/views/signup/index.jade index 8df3acd55..ee65db6a6 100644 --- a/views/signup/index.jade +++ b/views/signup/index.jade @@ -13,7 +13,7 @@ block body div.row div.col-sm-6 div.page-header - h1 Sign Up + h1 Sign Up div#signup if oauthTwitter || oauthGitHub || oauthFacebook hr @@ -22,7 +22,7 @@ block body div.alerts div.alert.alert-info.alert-dismissable button.close(type='button', data-dismiss='alert') × - |#{oauthMessage} + |#{oauthMessage}  b a(href='/login/') Login Here div.btn-group.btn-group-justified @@ -43,7 +43,7 @@ block body h1 Campy Benefits p.lead Really, you will love it inside. It's super great! i.fa.fa-thumbs-o-up.super-awesome - + script(type='text/template', id='tmpl-signup') form div.alerts diff --git a/views/signup/index.js b/views/signup/index.js index f36806944..2e9f522b6 100644 --- a/views/signup/index.js +++ b/views/signup/index.js @@ -1,7 +1,7 @@ 'use strict'; exports.init = function(req, res){ - if (req.isAuthenticated()) { + if (req.isAuthenticated()) { res.redirect(req.user.defaultReturnUrl()); } else { @@ -16,7 +16,7 @@ exports.init = function(req, res){ exports.signup = function(req, res){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.username) { workflow.outcome.errfor.username = 'required'; @@ -24,55 +24,55 @@ exports.signup = function(req, res){ else if (!/^[a-zA-Z0-9\-\_]+$/.test(req.body.username)) { workflow.outcome.errfor.username = 'only use letters, numbers, \'-\', \'_\''; } - + if (!req.body.email) { workflow.outcome.errfor.email = 'required'; } else if (!/^[a-zA-Z0-9\-\_\.\+]+@[a-zA-Z0-9\-\_\.]+\.[a-zA-Z0-9\-\_]+$/.test(req.body.email)) { workflow.outcome.errfor.email = 'invalid email format'; } - + if (!req.body.password) { workflow.outcome.errfor.password = 'required'; } - + if (workflow.hasErrors()) { return workflow.emit('response'); } - + workflow.emit('duplicateUsernameCheck'); }); - + workflow.on('duplicateUsernameCheck', function() { req.app.db.models.User.findOne({ username: req.body.username }, function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (user) { workflow.outcome.errfor.username = 'username already taken'; return workflow.emit('response'); } - + workflow.emit('duplicateEmailCheck'); }); }); - + workflow.on('duplicateEmailCheck', function() { req.app.db.models.User.findOne({ email: req.body.email.toLowerCase() }, function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (user) { workflow.outcome.errfor.email = 'email already registered'; return workflow.emit('response'); } - + workflow.emit('createUser'); }); }); - + workflow.on('createUser', function() { var fieldsToSet = { isActive: 'yes', @@ -88,12 +88,12 @@ exports.signup = function(req, res){ if (err) { return workflow.emit('exception', err); } - + workflow.user = user; workflow.emit('createAccount'); }); }); - + workflow.on('createAccount', function() { var fieldsToSet = { isVerified: req.app.get('require-account-verification') ? 'no' : 'yes', @@ -106,24 +106,24 @@ exports.signup = function(req, res){ workflow.user.username ] }; - + req.app.db.models.Account.create(fieldsToSet, function(err, account) { if (err) { return workflow.emit('exception', err); } - + //update user with account workflow.user.roles.account = account._id; workflow.user.save(function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.emit('sendWelcomeEmail'); }); }); }); - + workflow.on('sendWelcomeEmail', function() { req.app.utility.sendmail(req, res, { from: req.app.get('smtp-from-name') +' <'+ req.app.get('smtp-from-address') +'>', @@ -146,13 +146,13 @@ exports.signup = function(req, res){ } }); }); - + workflow.on('logUserIn', function() { req._passport.instance.authenticate('local', function(err, user, info) { if (err) { return workflow.emit('exception', err); } - + if (!user) { workflow.outcome.errors.push('Login failed. That is strange.'); return workflow.emit('response'); @@ -162,14 +162,14 @@ exports.signup = function(req, res){ if (err) { return workflow.emit('exception', err); } - + workflow.outcome.defaultReturnUrl = user.defaultReturnUrl(); workflow.emit('response'); }); } })(req, res); }); - + workflow.emit('validate'); }; @@ -178,12 +178,12 @@ exports.signupTwitter = function(req, res, next) { if (!info || !info.profile) { return res.redirect('/signup/'); } - + req.app.db.models.User.findOne({ 'twitter.id': info.profile._json.id }, function(err, user) { if (err) { return next(err); } - + if (!user) { req.session.socialProfile = info.profile; res.render('signup/social', { email: '' }); @@ -205,12 +205,12 @@ exports.signupGitHub = function(req, res, next) { if (!info || !info.profile) { return res.redirect('/signup/'); } - + req.app.db.models.User.findOne({ 'github.id': info.profile._json.id }, function(err, user) { if (err) { return next(err); } - + if (!user) { req.session.socialProfile = info.profile; res.render('signup/social', { email: info.profile.emails[0].value || '' }); @@ -232,7 +232,7 @@ exports.signupFacebook = function(req, res, next) { if (!info || !info.profile) { return res.redirect('/signup/'); } - + req.app.db.models.User.findOne({ 'facebook.id': info.profile._json.id }, function(err, user) { if (err) { return next(err); @@ -256,7 +256,7 @@ exports.signupFacebook = function(req, res, next) { exports.signupSocial = function(req, res){ var workflow = req.app.utility.workflow(req, res); - + workflow.on('validate', function() { if (!req.body.email) { workflow.outcome.errfor.email = 'required'; @@ -264,51 +264,51 @@ exports.signupSocial = function(req, res){ else if (!/^[a-zA-Z0-9\-\_\.\+]+@[a-zA-Z0-9\-\_\.]+\.[a-zA-Z0-9\-\_]+$/.test(req.body.email)) { workflow.outcome.errfor.email = 'invalid email format'; } - + if (workflow.hasErrors()) { return workflow.emit('response'); } - + workflow.emit('duplicateUsernameCheck'); }); - + workflow.on('duplicateUsernameCheck', function() { workflow.username = req.session.socialProfile.username; if (!/^[a-zA-Z0-9\-\_]+$/.test(workflow.username)) { workflow.username = workflow.username.replace(/[^a-zA-Z0-9\-\_]/g, ''); } - + req.app.db.models.User.findOne({ username: workflow.username }, function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (user) { workflow.username = workflow.username + req.session.socialProfile.id; } else { workflow.username = workflow.username; } - + workflow.emit('duplicateEmailCheck'); }); }); - + workflow.on('duplicateEmailCheck', function() { req.app.db.models.User.findOne({ email: req.body.email.toLowerCase() }, function(err, user) { if (err) { return workflow.emit('exception', err); } - + if (user) { workflow.outcome.errfor.email = 'email already registered'; return workflow.emit('response'); } - + workflow.emit('createUser'); }); }); - + workflow.on('createUser', function() { var fieldsToSet = { isActive: 'yes', @@ -320,17 +320,17 @@ exports.signupSocial = function(req, res){ ] }; fieldsToSet[req.session.socialProfile.provider] = req.session.socialProfile._json; - + req.app.db.models.User.create(fieldsToSet, function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.user = user; workflow.emit('createAccount'); }); }); - + workflow.on('createAccount', function() { var displayName = req.session.socialProfile.displayName || ''; var nameParts = displayName.split(' '); @@ -352,19 +352,19 @@ exports.signupSocial = function(req, res){ if (err) { return workflow.emit('exception', err); } - + //update user with account workflow.user.roles.account = account._id; workflow.user.save(function(err, user) { if (err) { return workflow.emit('exception', err); } - + workflow.emit('sendWelcomeEmail'); }); }); }); - + workflow.on('sendWelcomeEmail', function() { req.app.utility.sendmail(req, res, { from: req.app.get('smtp-from-name') +' <'+ req.app.get('smtp-from-address') +'>', @@ -387,18 +387,18 @@ exports.signupSocial = function(req, res){ } }); }); - + workflow.on('logUserIn', function() { req.login(workflow.user, function(err) { if (err) { return workflow.emit('exception', err); } - + delete req.session.socialProfile; workflow.outcome.defaultReturnUrl = workflow.user.defaultReturnUrl(); workflow.emit('response'); }); }); - + workflow.emit('validate'); }; diff --git a/views/signup/social.jade b/views/signup/social.jade index 2d1023717..959fb4d0b 100644 --- a/views/signup/social.jade +++ b/views/signup/social.jade @@ -12,7 +12,7 @@ block body div.page-header h1 Complete Sign Up div#signup - + script(type='text/template', id='tmpl-signup') form div.alerts @@ -27,5 +27,5 @@ block body span.help-block <%= errfor.email %> div.form-group button.btn.btn-primary.btn-signup(type='button') Create My Account - + script(type='text/template', id='data-email') !{email}