From 5abbebb1179220a591e7a3d4669d8e32c2436e8c Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 28 Jul 2015 15:29:07 -0700 Subject: [PATCH] fixed autosaving --- app/controllers/forms.server.controller.js | 11 +- .../users.authentication.server.controller.js | 4 +- .../users/users.profile.server.controller.js | 2 +- app/models/form.server.model.js | 68 +++-- app/models/form_field.server.model.js | 2 +- app/models/user.server.model.js | 9 +- app/tests/form.server.model.test.js | 103 +++++--- app/views/layout.server.view.html | 5 +- bower.json | 7 +- config/env/development.js | 1 + config/env/production.js | 1 + config/env/secure.js | 1 + config/env/test.js | 1 + public/application.js | 37 +-- public/config.js | 2 +- public/dist/application.js | 238 +++++++----------- public/dist/application.min.css | 2 +- public/dist/application.min.js | 4 +- .../controllers/header.client.controller.js | 50 +--- .../controllers/home.client.controller.js | 8 - .../controllers/index.client.controller.js | 25 -- .../core/views/header.client.view.html | 122 ++++----- .../forms/config/forms.client.routes.js | 3 + .../submit-form.client.controller.js | 32 ++- .../view-form-submission.client.controller.js | 36 --- .../view-form.client.controller.js | 36 +-- public/modules/forms/css/form.css | 24 +- .../directives/auto-save.client.directive.js | 25 +- .../on-finish-render.client.directive.js | 7 +- .../forms/services/forms.client.service.js | 1 - .../views/directiveViews/form/edit-form.html | 4 +- .../forms/views/list-forms.client.view.html | 4 +- .../forms/views/view-form.client.view.html | 10 +- .../users/config/users.client.config.js | 3 +- .../authentication.client.controller.js | 11 +- .../controllers/password.client.controller.js | 62 ++--- .../controllers/verify.client.controller.js | 4 +- public/modules/users/services/auth.js | 6 +- .../authentication/signin.client.view.html | 2 +- .../signup-success.client.view.html | 10 +- .../password/forgot-password.client.view.html | 2 +- .../resend-verify-email.client.view.html | 58 +++-- .../verify/verify-account.client.view.html | 4 +- 43 files changed, 498 insertions(+), 549 deletions(-) delete mode 100644 public/modules/core/controllers/index.client.controller.js delete mode 100644 public/modules/forms/controllers/view-form-submission.client.controller.js diff --git a/app/controllers/forms.server.controller.js b/app/controllers/forms.server.controller.js index ae20ad36..98fba335 100644 --- a/app/controllers/forms.server.controller.js +++ b/app/controllers/forms.server.controller.js @@ -290,24 +290,25 @@ exports.formByID = function(req, res, next, id) { }); } - Form.findById(id).populate('admin', 'submissions').exec(function(err, form) { + Form.findById(id).populate('admin').exec(function(err, form) { if (err) { return next(err); - } else if (!form || form === null) { - res.status(404).send({ + } else if (form === undefined || form === null) { + res.status(400).send({ message: 'Form not found' }); } else { - if(!form.username){ + if(!form.admin.username){ form.admin = req.user; } - // console.log(creaform.admin); + console.log(form.admin); //Remove sensitive information from User object form.admin.password = null; form.admin.created = null; form.admin.salt = null; + form.provider = null; req.form = form; next(); diff --git a/app/controllers/users/users.authentication.server.controller.js b/app/controllers/users/users.authentication.server.controller.js index a71e71b1..553a5b90 100755 --- a/app/controllers/users/users.authentication.server.controller.js +++ b/app/controllers/users/users.authentication.server.controller.js @@ -20,7 +20,7 @@ var smtpTransport = nodemailer.createTransport(config.mailer.options); // NEV configuration ===================== nev.configure({ persistentUserModel: User, - expirationTime: 600, // 10 minutes + expirationTime: 1800, // 30 minutes verificationURL: config.baseUrl+'/#!/verify/${URL}', transportOptions: config.mailer.options, @@ -56,7 +56,7 @@ exports.signup = function(req, res) { // Add missing user fields user.provider = 'local'; user.username = user.email; - user.displayName = user.firstName + ' ' + user.lastName; + // user.displayName = user.firstName + ' ' + user.lastName; // Then save the temporary user nev.createTempUser(user, function(newTempUser) { diff --git a/app/controllers/users/users.profile.server.controller.js b/app/controllers/users/users.profile.server.controller.js index e9d53509..8a0ba640 100755 --- a/app/controllers/users/users.profile.server.controller.js +++ b/app/controllers/users/users.profile.server.controller.js @@ -24,7 +24,7 @@ exports.update = function(req, res) { // Merge existing user user = _.extend(user, req.body); user.updated = Date.now(); - user.displayName = user.firstName + ' ' + user.lastName; + // user.displayName = user.firstName + ' ' + user.lastName; user.save(function(err) { if (err) { diff --git a/app/models/form.server.model.js b/app/models/form.server.model.js index 18de5f98..619b1802 100644 --- a/app/models/form.server.model.js +++ b/app/models/form.server.model.js @@ -14,8 +14,7 @@ var mongoose = require('mongoose'), fs = require('fs-extra'), async = require('async'), Field = mongoose.model('Field', FieldSchema), - FormSubmission = mongoose.model('FormSubmission', FormSubmissionSchema), - _original; + FormSubmission = mongoose.model('FormSubmission', FormSubmissionSchema); /** @@ -33,8 +32,7 @@ var FormSchema = new Schema({ title: { type: String, trim: true, - unique: true, - required: 'Title cannot be blank', + required: 'Form Title cannot be blank', }, language: { type: String, @@ -84,8 +82,13 @@ var FormSchema = new Schema({ type: Boolean, default: false, }, + saveCount: { + type: Number, + default: 0, + } }); + //Delete template PDF of current Form FormSchema.pre('remove', function (next) { if(this.pdf){ @@ -96,20 +99,45 @@ FormSchema.pre('remove', function (next) { }); } }); +var _original; +// FormSchema.post( 'init', function() { +// _original = this.toObject(); +// console.log(this); +// } ); +// FormSchema.virtual('_original').get(function () { +// this.constructor // ≈ mongoose.model('…', FieldSchema).findById +// .findOne({_id: this._id}).exec(function(err, original){ +// if(err) { +// console.log(err); +// throw err; +// } else { +// console.log(original); +// if(original) return original.toObject(); +// else return null; + +// } +// }); +// }); //Set _original FormSchema.pre('save', function (next) { - console.log(this.constructor.modelName); + this.saveCount = this.saveCount++; + console.log('saveCount: '+this.saveCount); + // console.log(this.constructor.model); + // console.log(FormModel); this.constructor // ≈ mongoose.model('…', FieldSchema).findById - .findOne({title: this.title}, function(err, original){ - if(err) next(err); - else { - console.log(original); + .findOne({_id: this._id}).exec(function(err, original){ + if(err) { + console.log(err); + next(err); + } else { + _original = original; + // console.log('_original'); + // console.log(_original); next(); } - - }); + }); }); //Update lastModified and created everytime we save @@ -137,7 +165,6 @@ function getDeletedIndexes(needle, haystack){ //Move PDF to permanent location after new template is uploaded FormSchema.pre('save', function (next) { - if(this.pdf){ var that = this; async.series([ @@ -246,20 +273,18 @@ FormSchema.pre('save', function (next) { next(); }); } - }else{ - next(); } + next(); }); FormSchema.pre('save', function (next) { - // console.log(this.form_fields); - - // console.log('_original\n------------\n\n'); + // var _original = this._original; + // console.log('_original\n------------'); // console.log(_original); + // console.log('field has been deleted: '); // console.log(this.isModified('form_fields') && !!this.form_fields && !!_original); - console.log(_original) - if(this.isModified('form_fields') && this.form_fields && _original){ + if(this.isModified('form_fields') && this.form_fields.length >= 0 && _original){ var old_form_fields = _original.form_fields, new_ids = _.map(_.pluck(this.form_fields, '_id'), function(id){ return ''+id;}), @@ -330,7 +355,7 @@ FormSchema.pre('save', function (next) { // console.log('modifiedSubmissions\n---------\n\n'); // console.log(modifiedSubmissions); - // console.log('preserved deleted fields'); + console.log('preserved deleted fields'); // console.log(submissions); async.forEachOfSeries(modifiedSubmissions, function (submission, key, callback) { @@ -403,5 +428,4 @@ FormSchema.methods.generateFDFTemplate = function() { return jsonObj; }; - -mongoose.model('Form', FormSchema); + mongoose.model('Form', FormSchema); diff --git a/app/models/form_field.server.model.js b/app/models/form_field.server.model.js index 8a034b40..1b92f731 100644 --- a/app/models/form_field.server.model.js +++ b/app/models/form_field.server.model.js @@ -53,7 +53,7 @@ var FormFieldSchema = new Schema({ type: String, default: '', trim: true, - required: 'Title cannot be blank' + required: 'Field title cannot be blank' }, description: { type: String, diff --git a/app/models/user.server.model.js b/app/models/user.server.model.js index e97e385a..4c593cf4 100755 --- a/app/models/user.server.model.js +++ b/app/models/user.server.model.js @@ -40,10 +40,6 @@ var UserSchema = new Schema({ default: '', validate: [validateLocalStrategyProperty, 'Please fill in your last name'] }, - displayName: { - type: String, - trim: true - }, email: { type: String, trim: true, @@ -103,6 +99,11 @@ var UserSchema = new Schema({ token: String }); +UserSchema.virtual('displayName').get(function () { + return this.firstName + ' ' + this.lastName; +}); + + //Create folder for user's pdfs UserSchema.pre('save', function (next) { if(!this.username || this.username !== this.email){ diff --git a/app/tests/form.server.model.test.js b/app/tests/form.server.model.test.js index 7b0b1613..f5cdda48 100644 --- a/app/tests/form.server.model.test.js +++ b/app/tests/form.server.model.test.js @@ -13,7 +13,7 @@ var should = require('should'), /** * Globals */ -var user, myForm, mySubmission, FormFDF; +var user, myForm, mySubmission; /** * Unit tests @@ -54,26 +54,44 @@ describe('Form Model Unit Tests:', function() { }); it('should be able to show an error when try to save without title', function(done) { - myForm.title = ''; + var _form = myForm; + _form.title = ''; - return myForm.save(function(err) { + return _form.save(function(err) { should.exist(err); - should.equal(err.errors.title.message, 'Title cannot be blank'); + should.equal(err.errors.title.message, 'Form Title cannot be blank'); done(); }); }); }); - describe('Test FormField and Submission Logic', function() { - var new_form_fields_add1, new_form_fields_del, submission_fields, old_fields; + describe('Method Find', function(){ + beforeEach(function(done){ + myForm.save(function(err) { + done(); + }); + }); + it('should be able to findOne my form without problems', function(done) { + return Form.findOne({_id: myForm._id}, function(err,form) { + should.not.exist(err); + should.exist(form); + should.deepEqual(form.toObject(), myForm.toObject()); + done(); + }); + }); + }); - before(function(done){ - new_form_fields_add1 = _.clone(myForm.form_fields); + + describe('Test FormField and Submission Logic', function() { + var new_form_fields_add1, new_form_fields_del, submission_fields, old_fields, form; + + before(function(){ + new_form_fields_add1 = _.clone(myForm.toObject().form_fields); new_form_fields_add1.push( {'fieldType':'textfield', 'title':'Last Name', 'fieldValue': ''} ); - new_form_fields_del = _.clone(myForm.form_fields); + new_form_fields_del = _.clone(myForm.toObject().form_fields); new_form_fields_del.splice(0, 1); submission_fields = _.clone(myForm.toObject().form_fields); @@ -87,45 +105,50 @@ describe('Form Model Unit Tests:', function() { form: myForm, timeElapsed: 17.55 }); + + }); - mySubmission.save(function(){ - done(); + beforeEach(function(done){ + myForm.save(function(){ + mySubmission.save(function(){ + done(); + }); }); }); - after(function(done){ + afterEach(function(done){ mySubmission.remove(function(){ done(); }); }); - beforeEach(function(done){ - old_fields = myForm.toObject().form_fields; - // console.log(old_fields); - done(); - }); - it('should preserve deleted form_fields that have submissions without any problems', function(done) { - var expected_fields = old_fields.slice(1,3).concat(old_fields.slice(0,1)); - + old_fields = myForm.toObject().form_fields; // console.log(old_fields); - myForm.form_fields = new_form_fields_del; - return myForm.save(function(err, form) { - should.not.exist(err); - var actual_fields = form.toObject().form_fields; - // console.log(actual_fields); + // var expected_fields = old_fields.slice(1,3).concat(old_fields.slice(0,1)); - should.deepEqual(form.toObject().form_fields, expected_fields, 'old form_fields not equal to newly saved form_fields'); + myForm.form_fields = new_form_fields_del; + + myForm.save(function(err, _form) { + + should.not.exist(err); + should.exist(_form); + + // var actual_fields = _.map(_form.toObject().form_fields, function(o){ _.omit(o, '_id')}); + // old_fields = _.map(old_fields, function(o){ _.omit(o, '_id')}); + + // console.log(old_fields); + should.deepEqual(JSON.stringify(_form.toObject().form_fields), JSON.stringify(old_fields), 'old form_fields not equal to newly saved form_fields'); done(); }); }); - // it('should delete \'preseved\' form_fields whose submissions have been removed without any problems', function(done) { + // it('should delete \'preserved\' form_fields whose submissions have been removed without any problems', function(done) { // myForm.form_fields = new_form_fields_del; - // myForm.save(function(err, form) { + // myForm.save(function(err, form // should.not.exist(err); // (form.form_fields).should.be.eql(old_fields, 'old form_fields not equal to newly saved form_fields'); @@ -136,28 +159,30 @@ describe('Form Model Unit Tests:', function() { // }); // }); // }); - }); describe('Method generateFDFTemplate', function() { - beforeEach(function(done){ - FormFDF = { - 'First Name': '', - 'nascar': '', - 'hockey': '' - }; - done(); + var FormFDF; + before(function(done){ + return myForm.save(function(err, form){ + + FormFDF = { + 'First Name': '', + 'nascar': '', + 'hockey': '' + }; + done(); + }); }); - it('should be able to generate a FDF template without any problems', function(done) { + it('should be able to generate a FDF template without any problems', function() { var fdfTemplate = myForm.generateFDFTemplate(); (fdfTemplate).should.be.eql(FormFDF); - done(); }); }); afterEach(function(done) { - Form.remove().exec(function() { + Form.remove({}, function() { User.remove().exec(done); }); }); diff --git a/app/views/layout.server.view.html b/app/views/layout.server.view.html index a6853f6e..bfd4ced4 100755 --- a/app/views/layout.server.view.html +++ b/app/views/layout.server.view.html @@ -57,9 +57,8 @@
- - - {% block content %}{% endblock %} + + {% block content %}{% endblock %}
diff --git a/bower.json b/bower.json index 618c184b..408795aa 100755 --- a/bower.json +++ b/bower.json @@ -11,7 +11,7 @@ "appPath": "public/modules", "dependencies": { "bootstrap": "~3", - "angular": "~1.2", + "angular": "1.3.17", "angular-resource": "~1.2", "angular-animate": "~1.2", "angular-mocks": "~1.2", @@ -26,10 +26,11 @@ "angular-raven": "~0.5.11", "angular-ui-date": "~0.0.8", "lodash": "~3.10.0", - "angular-ui-sortable": "~0.13.4" + "angular-ui-sortable": "~0.13.4", + "angular-busy": "~4.1.3" }, "resolutions": { - "angular": "^1.2.21", + "angular": "^1.3.17", "angular-resource": "~1.2", "ng-file-upload": "~5.0.9" } diff --git a/config/env/development.js b/config/env/development.js index 4433b42b..bc681063 100755 --- a/config/env/development.js +++ b/config/env/development.js @@ -1,6 +1,7 @@ 'use strict'; module.exports = { + baseUrl: 'http://localhost:3000', db: { uri: 'mongodb://localhost/mean-dev', options: { diff --git a/config/env/production.js b/config/env/production.js index 6751a569..f7222eb1 100755 --- a/config/env/production.js +++ b/config/env/production.js @@ -1,6 +1,7 @@ 'use strict'; module.exports = { + baseUrl: 'http://forms.polydaic.com', db: { uri: process.env.MONGOHQ_URL || process.env.MONGOLAB_URI || 'mongodb://' + (process.env.DB_1_PORT_27017_TCP_ADDR || 'localhost') + '/mean', options: { diff --git a/config/env/secure.js b/config/env/secure.js index cfc2da98..408c216f 100755 --- a/config/env/secure.js +++ b/config/env/secure.js @@ -1,6 +1,7 @@ 'use strict'; module.exports = { + baseUrl: 'https://forms.polydaic.com', port: 8443, db: { uri: process.env.MONGOHQ_URL || process.env.MONGOLAB_URI || 'mongodb://localhost/mean', diff --git a/config/env/test.js b/config/env/test.js index 02e10172..3b0605c4 100755 --- a/config/env/test.js +++ b/config/env/test.js @@ -1,6 +1,7 @@ 'use strict'; module.exports = { + baseUrl: 'http://localhost:3000', db: { uri: 'mongodb://localhost/mean-test', options: { diff --git a/public/application.js b/public/application.js index 3e394fce..2c9db1ce 100755 --- a/public/application.js +++ b/public/application.js @@ -34,13 +34,19 @@ angular.module(ApplicationConfiguration.applicationModuleName).run(['$rootScope' $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState) { $state.previous = fromState; - //Redirect home to listForms if user is authenticated - if(toState.name === 'home'){ - if(Auth.isAuthenticated()){ - event.preventDefault(); // stop current execution - $state.go('listForms'); // go to login - } - } + //Redirect to listForms if user is authenticated + if(toState.name === 'home' || toState.name === 'signin' || toState.name === 'resendVerifyEmail' || toState.name === 'verify' || toState.name === 'signup' || toState.name === 'signup-success'){ + if(Auth.isAuthenticated()){ + event.preventDefault(); // stop current execution + $state.go('listForms'); // go to listForms page + } + } + //Redirect to 'home' route if user is not authenticated + else if(toState.name !== 'access_denied' && !Auth.isAuthenticated() ){ + event.preventDefault(); // stop current execution + $state.go('home'); // go to listForms page + } + }); } @@ -56,17 +62,14 @@ angular.module(ApplicationConfiguration.applicationModuleName).run(['$rootScope' Auth.ensureHasCurrentUser(User); user = Auth.currentUser; - if(user){ - authenticator = new Authorizer(user); + if(user){ + authenticator = new Authorizer(user); - // console.log('Permissions'); - // console.log(permissions); - - if( (permissions !== null) && !authenticator.canAccess(permissions) ){ - event.preventDefault(); - console.log('access denied') - $state.go('access_denied'); - } + if( (permissions !== null) && !authenticator.canAccess(permissions) ){ + event.preventDefault(); + console.log('access denied') + $state.go('access_denied'); + } } }); }]); diff --git a/public/config.js b/public/config.js index f487c3ae..f52ea5b8 100755 --- a/public/config.js +++ b/public/config.js @@ -4,7 +4,7 @@ var ApplicationConfiguration = (function() { // Init module configuration options var applicationModuleName = 'medform'; - var applicationModuleVendorDependencies = ['ngResource', 'ngAnimate', 'ui.router', 'ui.bootstrap', 'ui.utils', 'ngRaven']; + var applicationModuleVendorDependencies = ['ngResource', 'ngAnimate', 'ui.router', 'ui.bootstrap', 'ui.utils', 'ngRaven', 'cgBusy']; // Add a new vertical module var registerModule = function(moduleName, dependencies) { diff --git a/public/dist/application.js b/public/dist/application.js index 9c80e3e9..e6d7d0f5 100644 --- a/public/dist/application.js +++ b/public/dist/application.js @@ -4,7 +4,7 @@ var ApplicationConfiguration = (function() { // Init module configuration options var applicationModuleName = 'medform'; - var applicationModuleVendorDependencies = ['ngResource', 'ngAnimate', 'ui.router', 'ui.bootstrap', 'ui.utils', 'ngRaven']; + var applicationModuleVendorDependencies = ['ngResource', 'ngAnimate', 'ui.router', 'ui.bootstrap', 'ui.utils', 'ngRaven', 'cgBusy']; // Add a new vertical module var registerModule = function(moduleName, dependencies) { @@ -142,11 +142,16 @@ angular.module('core').config(['$stateProvider', '$urlRouterProvider', angular.module('core').controller('HeaderController', ['$rootScope','$scope','Menus', '$state', 'Auth', 'User', function ($rootScope, $scope, Menus, $state, Auth, User) { $scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User); + $scope.authentication = $rootScope.authentication = Auth; + if(!$scope.user.username){ + $scope.user = $rootScope.user = User.getCurrent(); + $scope.authentication.currentUser = $rootScope.authentication.currentUser = $scope.user; + } $rootScope.languages = $scope.languages = ['english', 'french', 'spanish']; $scope.isCollapsed = false; - $scope.hideNav = false; + $rootScope.hideNav = false; $scope.menu = Menus.getMenu('topbar'); $scope.signout = function() { @@ -169,48 +174,15 @@ angular.module('core').controller('HeaderController', ['$rootScope','$scope','Me // Collapsing the menu after navigation $scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) { $scope.isCollapsed = false; - $scope.hideNav = false; + $rootScope.hideNav = false; if ( angular.isDefined( toState.data ) ) { if ( angular.isDefined( toState.data.hideNav ) ) { - $scope.hideNav = toState.data.hideNav; + $rootScope.hideNav = toState.data.hideNav; } } }); - // Principal.identity().then(function(user){ - // $rootScope.user = user; - // console.log('topbar') - // console.log($scope.user); - // }, - // function(error){ - // console.log(error); - // }).then(function(){ - // $scope.signout = function() { - // $http.get('/auth/signout').success(function(response) { - // $state.go('home'); - // }).error(function(error) { - // $scope.error = (error.message || error); - // }); - - // Principal.signout().then( - // function(result){ - // $state.go('home'); - // }, - // function(error){ - // $scope.error = (error.message || error); - // } - // ); - // if( angular.isDefined(response_obj.error) ){ - // $scope.error = response_obj.error; - // } else{ - // $state.go('home'); - // } - - // }; - - // }); - } ]); 'use strict'; @@ -229,32 +201,6 @@ angular.module('core').controller('HomeController', ['$rootScope', '$scope', 'Us } ]); -// 'use strict'; - -// /** -// * @ngdoc function -// * @name medform.controller:IndexCtrl -// * @description -// * # IndexCtrl -// * Controller of core -// */ -// angular.module('medform').controller('IndexCtrl', function ($scope, $rootScope, $location, User, Auth, $state) { -// $rootScope.user = Auth.ensureHasCurrentUser(User); -// // $rootScope.user = Auth.getUserState(User).user; -// $rootScope.authentication = Auth; - -// $scope.signout = function() { -// User.logout(function() { -// Auth.logout(); -// $rootScope.user = null; -// $state.go('home'); -// // $scope.$apply(); -// }); -// }; - - -// }); - 'use strict'; //Menu service used for managing menus @@ -499,49 +445,33 @@ angular.module('forms').config(['$stateProvider', 'use strict'; // Forms controller -angular.module('forms').controller('SubmitFormController', ['$scope', '$stateParams', '$state', 'Forms', 'CurrentForm', - function($scope, $stateParams, $state, Forms, CurrentForm) { - - $scope.form = Forms.get({ +angular.module('forms').controller('SubmitFormController', ['$scope', '$rootScope', '$stateParams', '$state', 'Forms', 'CurrentForm', + function($scope, $rootScope, $stateParams, $state, Forms, CurrentForm) { + + Forms.get({ formId: $stateParams.formId - }); - CurrentForm.setForm($scope.form); - } -]); -'use strict'; + }).$promise.then( + //success + function(form){ + $scope.form = form; -// submissions controller -angular.module('forms').controller('ViewSubmissionController', ['$scope', '$stateParams', '$state', 'Submissions','$http', - function($scope, $stateParams, $state, Submissions, $http) { - $scope.submissionId = undefined; - - // Return all form's submissions - $scope.findAll = function() { - $scope.submissions = Submissions.query({ - formId: $stateParams.formId - }); - }; - - // Find a specific submission - $scope.findOne = function() { - $scope.submission = Submissions.get({ - submissionId: $scope.submissionId, - formId: $stateParams.formId - }); - }; - - - // Remove existing submission - $scope.remove = function(submission) { - if (!submission) { - submission = $scope.submission; - } - $http.delete('/forms/'+$stateParams.formId+'/submissions/'+submission._id). - success(function(data, status, headers){ - console.log('submission deleted successfully'); - alert('submission deleted..'); - }); - }; + //Show navbar if form is not public AND user is loggedin + if(!$scope.form.isLive && $rootScope.authentication.isAuthenticated()){ + $rootScope.hideNav = false; + }else if(!$scope.form.isLive){ + $state.go('access_denied'); + }else { + CurrentForm.setForm($scope.form); + } + console.log('$rootScope.hideNav: '+$rootScope.hideNav); + console.log('$scope.form.isLive: '+$scope.form.isLive); + }, + //error + function( error ){ + $scope.error = error.message; + console.log('ERROR: '+error.message); + $state.go('access_denied'); + }); } ]); 'use strict'; @@ -554,7 +484,7 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' $scope.myform = CurrentForm.getForm(); $scope.saveInProgress = false; $scope.viewSubmissions = false; - $scope.showCreateModal = false; + $rootScope.showCreateModal = false; $scope.table = { masterChecker: true, rows: [] @@ -577,21 +507,19 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' $state.go(route, {'formId': id}, {reload: true}); }; - - $scope.setForm = function (form) { $scope.myform = form; }; //Modal functions $scope.openCreateModal = function(){ - if(!$scope.showCreateModal){ - $scope.showCreateModal = true; + if(!$rootScope.showCreateModal){ + $rootScope.showCreateModal = true; } }; $scope.closeCreateModal = function(){ - if($scope.showCreateModal){ - $scope.showCreateModal = false; + if($rootScope.showCreateModal){ + $rootScope.showCreateModal = false; } }; @@ -599,14 +527,14 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' * Table Functions */ $scope.isAtLeastOneChecked = function(){ - console.log('isAtLeastOneChecked'); + // console.log('isAtLeastOneChecked'); for(var i=0; i<$scope.table.rows.length; i++){ if($scope.table.rows[i].selected) return true; } return false; }; $scope.toggleAllCheckers = function(){ - console.log('toggleAllCheckers'); + // console.log('toggleAllCheckers'); for(var i=0; i<$scope.table.rows.length; i++){ $scope.table.rows[i].selected = $scope.table.masterChecker; } @@ -740,7 +668,7 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' form.title = $scope.myform.name.$modelValue; form.language = $scope.myform.language.$modelValue; console.log(form); - $scope.showCreateModal = true; + $rootScope.showCreateModal = true; console.log($scope.myform); if($scope.myform.$valid && $scope.myform.$dirty){ @@ -765,10 +693,10 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' if(!$rootScope.saveInProgress){ $rootScope.saveInProgress = true; - // console.log('begin updating form'); + console.log('begin updating form'); var err = null; - $http.put('/forms/'+$scope.myform._id, {form: $scope.myform}) + $scope.updatePromise = $http.put('/forms/'+$scope.myform._id, {form: $scope.myform}) .then(function(response){ $rootScope.myform = $scope.myform = response.data; console.log(response.data); @@ -780,7 +708,7 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' console.log(response.data); err = response.data; }).finally(function() { - // console.log('finished updating'); + console.log('finished updating'); $rootScope.saveInProgress = false; cb(err); }); @@ -1502,7 +1430,6 @@ angular.module('forms').factory('Forms', ['$resource', form.visible_form_fields = _.filter(form.form_fields, function(field){ return field.deletePreserved === false; }); //<-- replace each item with an instance of the resource object - console.log(form); return form; } }, @@ -1567,7 +1494,8 @@ angular.module('users').config(['$httpProvider', $httpProvider.interceptors.push(function($q, $location) { return { responseError: function(response) { - if( $location.path() !== '/verify' && $location.path() !== '/users/me' && $location.path() !== '/' && $location.path() !== '/signup' && response.config){ + console.log($location.path()); + if( response.config.url !== '/users/me' && $location.path() !== '/users/me' && response.config){ console.log('intercepted rejection of ', response.config.url, response.status); if (response.status === 401) { @@ -1699,7 +1627,7 @@ angular.module('users').controller('AuthenticationController', ['$scope', '$loca Auth.login(response); $scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User); - if($state.previous.name !== 'home' && $state.previous.name !== ''){ + if($state.previous.name !== 'home' && $state.previous.name !== 'verify' && $state.previous.name !== ''){ $state.go($state.previous.name); }else{ $state.go('home'); @@ -1740,40 +1668,40 @@ angular.module('users').controller('PasswordController', ['$scope', '$stateParam function($scope, $stateParams, $state, User) { //If user is signed in then redirect back home - if ($scope.authentication.isAuthenticated()) $state.go('home'); + // if ($scope.authentication.isAuthenticated()) $state.go('home'); - // Submit forgotten password account id - $scope.askForPasswordReset = function() { - User.askForPasswordReset($scope.credentials).then( - function(response){ - $scope.success = response.message; - $scope.credentials = null; - }, - function(error){ - $scope.error = error; - $scope.credentials = null; - } - ); - }; + // Submit forgotten password account id + $scope.askForPasswordReset = function() { + User.askForPasswordReset($scope.credentials).then( + function(response){ + $scope.success = response.message; + $scope.credentials = null; + }, + function(error){ + $scope.error = error; + $scope.credentials = null; + } + ); + }; - // Change user password - $scope.resetUserPassword = function() { - $scope.success = $scope.error = null; - User.resetPassword($scope.passwordDetails, $stateParams.token).then( - function(response){ - // If successful show success message and clear form - $scope.success = response.message; - $scope.passwordDetails = null; + // Change user password + $scope.resetUserPassword = function() { + $scope.success = $scope.error = null; + User.resetPassword($scope.passwordDetails, $stateParams.token).then( + function(response){ + // If successful show success message and clear form + $scope.success = response.message; + $scope.passwordDetails = null; - // And redirect to the index page - $state.go('reset-success'); - }, - function(error){ - $scope.error = error.message || error; - $scope.passwordDetails = null; - } - ); - }; + // And redirect to the index page + $state.go('reset-success'); + }, + function(error){ + $scope.error = error.message || error; + $scope.passwordDetails = null; + } + ); + }; } ]); 'use strict'; @@ -1853,7 +1781,7 @@ angular.module('users').controller('SettingsController', ['$scope', '$rootScope' angular.module('users').controller('VerifyController', ['$scope', '$state', '$rootScope', 'User', 'Auth', '$stateParams', function($scope, $state, $rootScope, User, Auth, $stateParams) { - if($rootScope.authetication.isAuthenticated){ + if($rootScope.authentication.isAuthenticated()){ $state.go('home'); } @@ -1865,10 +1793,12 @@ angular.module('users').controller('VerifyController', ['$scope', '$state', '$ro function(response){ $scope.success = response.message; $scope.credentials = null; + $scope.isResetSent = true; }, function(error){ $scope.error = error; $scope.credentials = null; + $scope.isReset = false; } ); }; @@ -1911,12 +1841,12 @@ angular.module('users').factory('Auth', function($window) { // Auth <- $http <- $resource <- LoopBackResource <- User <- Auth ensureHasCurrentUser: function(User) { if (service.currentUser && service.currentUser.displayName) { - // console.log('Using local current user.'); + console.log('Using local current user.'); // console.log(service.currentUser); return service.currentUser; } else if ($window.user){ - // console.log('Using cached current user.'); + console.log('Using cached current user.'); // console.log($window.user); service.currentUser = $window.user; return service.currentUser; diff --git a/public/dist/application.min.css b/public/dist/application.min.css index a7fa9b27..4b3578a4 100644 --- a/public/dist/application.min.css +++ b/public/dist/application.min.css @@ -1 +1 @@ -.navbar-inverse{background-color:#fafafa;border:0}.navbar .navbar-brand{font-size:1.6em;font-weight:900;color:#ff8383}.navbar .navbar-brand:hover,.navbar .navbar-brand:visited{color:#FA787E}.navbar li.dropdown a.dropdown-toggle:hover>*{color:#000}.navbar li.dropdown a.dropdown-toggle>*{color:#d9d9d9}.navbar li.dropdown.open a.dropdown-toggle:hover>*{color:#fff}.navbar .navbar-brand span{text-decoration:underline}.nav.navbar-nav.navbar-right li{padding-right:20px}.content{margin-top:70px}.undecorated-link:hover{text-decoration:none}.ng-cloak,.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}.ng-invalid.ng-dirty{border-color:#FA787E}.ng-valid.ng-dirty{border-color:#78FA89}.browsehappy.jumbotron.hide,body.ng-cloak{display:block}section.hero-section{width:100%}section.hero-section .jumbotron{background-color:transparent;color:#fff}.image-background{position:absolute;top:0;left:0;height:230%;width:100%;z-index:-98;background-image:url(http://yourplaceandmine.ie/wp-content/uploads/2014/09/Daingean-meeting-048_13-1080x675.jpg);background-repeat:no-repeat;background-position:0 50%;background-size:cover}.opacity-background{position:absolute;top:0;left:0;height:230%;width:100%;background-color:rgba(0,0,0,.5);z-index:-97}section.hero-section .jumbotron .signup-btn{background-color:#FA787E;border:none;font-size:2em;padding:.3em .9em;color:#fff;background-color:rgba(250,120,126,.65) #FA787E}.row-height{display:table;table-layout:fixed;height:100%;width:100%}.col-height{display:table-cell;float:none;height:100%}.col-top{vertical-align:top}.col-middle{vertical-align:middle}.col-bottom{vertical-align:bottom}@media (min-width:480px){.row-xs-height{display:table;table-layout:fixed;height:100%;width:100%}.col-xs-height{display:table-cell;float:none;height:100%}.col-xs-top{vertical-align:top}.col-xs-middle{vertical-align:middle}.col-xs-bottom{vertical-align:bottom}}@media (min-width:768px){.row-sm-height{display:table;table-layout:fixed;height:100%;width:100%}.col-sm-height{display:table-cell;float:none;height:100%}.col-sm-top{vertical-align:top}.col-sm-middle{vertical-align:middle}.col-sm-bottom{vertical-align:bottom}}@media (min-width:992px){.row-md-height{display:table;table-layout:fixed;height:100%;width:100%}.col-md-height{display:table-cell;float:none;height:100%}.col-md-top{vertical-align:top}.col-md-middle{vertical-align:middle}.col-md-bottom{vertical-align:bottom}}@media (min-width:1200px){.row-lg-height{display:table;table-layout:fixed;height:100%;width:100%}.col-lg-height{display:table-cell;float:none;height:100%}.col-lg-top{vertical-align:top}.col-lg-middle{vertical-align:middle}.col-lg-bottom{vertical-align:bottom}}.btn{border:1px solid #c6c6c6!important}form .row.field{padding:1em 0 3em}form .row.field>.field-title{margin-top:.5em;font-size:1.5em}form.submission-form .row.field.statement>.field-title{font-size:1.7em}form.submission-form .row.field.statement>.field-input{font-size:1.2em;color:#ddd}form.submission-form .select.radio>.field-input input,form.submission-form .select>.field-input input{width:20%}form.submission-form .select>.field-input .btn{text-align:left;margin-bottom:.7em}form.submission-form .select>.field-input .btn>span{font-size:1.1em}form.submission-form .row.field>.field-input input{width:100%}form.submission-form .row.field .field-input>input:focus{font-size:1em}form .row.field.textfield>.field-input>input{padding:.45em .9em;width:100%;line-height:160%}form .row.field.dropdown>.field-input{height:34px;overflow:hidden}form .row.field.dropdown>.field-input>select{padding:.45em .9em;width:100%;background:0 0;font-size:16px;border:1px solid #ccc;height:34px}div.config-form>.row{padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05);width:90%}div.config-form>.row>.container:nth-of-type(odd){border-right:1px #ddd solid}div.config-form .row>.field-input{padding-top:1.2em;padding-left:.1em}div.config-form .row>.field-input label{padding-left:1.3em;display:block}.admin-form>.page-header{padding-bottom:0;margin-bottom:40px}.admin-form>.page-header h1{margin-bottom:0}.admin-form>.page-header>.col-xs-3{padding-top:1.4em}.admin-form .form-controls .row{padding:5px}.admin-form .page-header{border:none}.admin-form .tab-content{padding-top:3em}.admin-form .panel-heading{background-color:#f1f1f1}.admin-form .panel-heading:hover{background-color:#fff;cursor:pointer}.admin-form .panel-heading a:hover{text-decoration:none}.current-fields .tool-panel>.panel-default:hover{border-color:#9d9d9d;cursor:pointer}.current-fields .tool-panel>.panel-default .panel-heading{background-color:#fff;color:#9d9d9d!important}.current-fields .tool-panel>.panel-default .panel-heading:hover{background-color:#eee;color:#000!important;cursor:pointer}.current-fields .tool-panel>.panel-default .panel-heading a{color:inherit}.current-fields .tool-panel>.panel-default .panel-heading a:hover{text-decoration:none}.admin-form .add-field{background-color:#ddd}.admin-form .add-field .col-xs-6{padding:.25em .4em}.admin-form .add-field .col-xs-6 .panel-heading{border-width:1px;border-style:solid;border-color:#bbb;border-radius:4px}.status-light{padding-left:.6em}.status-light.status-light-off{color:#BE0000}.status-light.status-light-on{color:#3C0}section>section.public-form{padding:0 6em 7em}.form-item.row{text-align:center;border-bottom:6px inset #ccc;background-color:#eee;width:180px;height:215px;margin-bottom:45px}.form-item.row.create-new{background-color:#838383;color:#fff}.form-item.row.create-new.new-form{background-color:#ff8383;z-index:11}.form-item.row.create-new.new-form:hover{background-color:#ff6464}.form-item.new-form a.btn{font-size:.95em}.overlay{position:absolute;top:0;left:0;height:193%;width:inherit;background-color:rgba(0,0,0,.5);z-index:10}.form-item.row.create-new:hover,.form-item.row:hover{border-bottom:8px inset #ccc;background-color:#d9d9d9}.form-item.row.create-new:hover{background-color:#515151}.form-item.row>.title-row{position:relative;top:15px;padding-top:3em;padding-bottom:3.65em}.form-item.row>.title-row h4{font-size:1.3em}.form-item.row.create-new>.title-row{padding:0}.form-item.row.create-new>.title-row h4{font-size:7em}.form-item.row>.details-row{margin-top:3.2em}.form-item.row>.details-row small{font-size:.6em}.form-item.row.create-new>.details-row small{font-size:.95em}@media (min-width:992px){.nav-users{position:fixed}}.remove-account-container{display:inline-block;position:relative}.btn-remove-account{top:10px;right:10px;position:absolute}section.auth{margin-top:5em}section.auth>h3{font-size:3em;font-weight:500;color:#777}section.auth.signup-view>h3{font-size:4.4em;padding-bottom:.5em} \ No newline at end of file +.navbar-inverse{background-color:#fafafa;border:0}.navbar .navbar-brand{font-size:1.6em;font-weight:900;color:#ff8383}.navbar .navbar-brand:hover,.navbar .navbar-brand:visited{color:#FA787E}.navbar li.dropdown a.dropdown-toggle:hover>*{color:#000}.navbar li.dropdown a.dropdown-toggle>*{color:#d9d9d9}.navbar li.dropdown.open a.dropdown-toggle:hover>*{color:#fff}.navbar .navbar-brand span{text-decoration:underline}.nav.navbar-nav.navbar-right li{padding-right:20px}.content{margin-top:70px}.undecorated-link:hover{text-decoration:none}.ng-cloak,.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}.ng-invalid.ng-dirty{border-color:#FA787E}.ng-valid.ng-dirty{border-color:#78FA89}.browsehappy.jumbotron.hide,body.ng-cloak{display:block}section.hero-section{width:100%}section.hero-section .jumbotron{background-color:transparent;color:#fff}.image-background{position:absolute;top:0;left:0;height:230%;width:100%;z-index:-98;background-image:url(http://yourplaceandmine.ie/wp-content/uploads/2014/09/Daingean-meeting-048_13-1080x675.jpg);background-repeat:no-repeat;background-position:0 50%;background-size:cover}.opacity-background{position:absolute;top:0;left:0;height:230%;width:100%;background-color:rgba(0,0,0,.5);z-index:-97}section.hero-section .jumbotron .signup-btn{background-color:#FA787E;border:none;font-size:2em;padding:.3em .9em;color:#fff;background-color:rgba(250,120,126,.65) #FA787E}.row-height{display:table;table-layout:fixed;height:100%;width:100%}.col-height{display:table-cell;float:none;height:100%}.col-top{vertical-align:top}.col-middle{vertical-align:middle}.col-bottom{vertical-align:bottom}@media (min-width:480px){.row-xs-height{display:table;table-layout:fixed;height:100%;width:100%}.col-xs-height{display:table-cell;float:none;height:100%}.col-xs-top{vertical-align:top}.col-xs-middle{vertical-align:middle}.col-xs-bottom{vertical-align:bottom}}@media (min-width:768px){.row-sm-height{display:table;table-layout:fixed;height:100%;width:100%}.col-sm-height{display:table-cell;float:none;height:100%}.col-sm-top{vertical-align:top}.col-sm-middle{vertical-align:middle}.col-sm-bottom{vertical-align:bottom}}@media (min-width:992px){.row-md-height{display:table;table-layout:fixed;height:100%;width:100%}.col-md-height{display:table-cell;float:none;height:100%}.col-md-top{vertical-align:top}.col-md-middle{vertical-align:middle}.col-md-bottom{vertical-align:bottom}}@media (min-width:1200px){.row-lg-height{display:table;table-layout:fixed;height:100%;width:100%}.col-lg-height{display:table-cell;float:none;height:100%}.col-lg-top{vertical-align:top}.col-lg-middle{vertical-align:middle}.col-lg-bottom{vertical-align:bottom}}.btn{border:1px solid #c6c6c6!important}.btn[type=submit]{font-size:1.5em;padding:.35em 1.2em}form .row.field{padding:1em 0 3em}form .row.field>.field-title{margin-top:.5em;font-size:1.5em}form.submission-form .row.field.statement>.field-title{font-size:1.7em}form.submission-form .row.field.statement>.field-input{font-size:1.2em;color:#ddd}form.submission-form .select.radio>.field-input input,form.submission-form .select>.field-input input{width:20%}form.submission-form .select>.field-input .btn{text-align:left;margin-bottom:.7em}form.submission-form .select>.field-input .btn>span{font-size:1.1em}form.submission-form .row.field>.field-input input{width:100%}form.submission-form .row.field .field-input>input:focus{font-size:1em}form .row.field.textfield>.field-input>input{padding:.45em .9em;width:100%;line-height:160%}form .row.field.dropdown>.field-input{height:34px;overflow:hidden}form .row.field.dropdown>.field-input>select{padding:.45em .9em;width:100%;background:0 0;font-size:16px;border:1px solid #ccc;height:34px}div.config-form>.row{padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05);width:90%}div.config-form>.row>.container:nth-of-type(odd){border-right:1px #ddd solid}div.config-form .row>.field-input{padding-top:1.2em;padding-left:.1em}div.config-form .row>.field-input label{padding-left:1.3em;display:block}.admin-form>.page-header{padding-bottom:0;margin-bottom:40px}.admin-form>.page-header h1{margin-bottom:0}.admin-form>.page-header>.col-xs-3{padding-top:1.4em}.admin-form .form-controls .row{padding:5px}.admin-form .page-header{border:none}.admin-form .tab-content{padding-top:3em}.admin-form .panel-heading{background-color:#f1f1f1}.admin-form .panel-heading:hover{background-color:#fff;cursor:pointer}.admin-form .panel-heading a:hover{text-decoration:none}.current-fields .tool-panel>.panel-default:hover{border-color:#9d9d9d;cursor:pointer}.current-fields .tool-panel>.panel-default .panel-heading{background-color:#fff;color:#9d9d9d!important}.current-fields .tool-panel>.panel-default .panel-heading:hover{background-color:#eee;color:#000!important;cursor:pointer}.current-fields .tool-panel>.panel-default .panel-heading a{color:inherit}.current-fields .tool-panel>.panel-default .panel-heading a:hover{text-decoration:none}.admin-form .add-field{background-color:#ddd}.admin-form .add-field .col-xs-6{padding:.25em .4em}.admin-form .add-field .col-xs-6 .panel-heading{border-width:1px;border-style:solid;border-color:#bbb;border-radius:4px}.status-light{padding-left:.6em}.status-light.status-light-off{color:#BE0000}.status-light.status-light-on{color:#3C0}section>section.public-form{padding:0 6em 7em}.form-item.row{text-align:center;border-bottom:6px inset #ccc;background-color:#eee;width:180px;height:215px;margin-bottom:45px}.form-item.row.create-new{background-color:#838383;color:#fff}.form-item.row.create-new.new-form{background-color:#ff8383;z-index:11}.form-item.row.create-new.new-form:hover{background-color:#ff6464}.form-item.new-form a.btn{font-size:.95em}.overlay{position:absolute;top:0;left:0;height:193%;width:100%;background-color:rgba(0,0,0,.5);z-index:10}.form-item.row.create-new:hover,.form-item.row:hover{border-bottom:8px inset #ccc;background-color:#d9d9d9}.form-item.row.create-new:hover{background-color:#515151}.form-item.row>.title-row{position:relative;top:15px;padding-top:3em;padding-bottom:3.65em}.form-item.row>.title-row h4{font-size:1.3em}.form-item.row.create-new>.title-row{padding:0}.form-item.row.create-new>.title-row h4{font-size:7em}.form-item.row>.details-row{margin-top:3.2em}.form-item.row>.details-row small{font-size:.6em}.form-item.row.create-new>.details-row small{font-size:.95em}@media (min-width:992px){.nav-users{position:fixed}}.remove-account-container{display:inline-block;position:relative}.btn-remove-account{top:10px;right:10px;position:absolute}section.auth{margin-top:5em}section.auth>h3{font-size:3em;font-weight:500;color:#777}section.auth.signup-view>h3{font-size:4.4em;padding-bottom:.5em} \ No newline at end of file diff --git a/public/dist/application.min.js b/public/dist/application.min.js index ad715e63..2a4ac710 100644 --- a/public/dist/application.min.js +++ b/public/dist/application.min.js @@ -1,2 +1,2 @@ -"use strict";var ApplicationConfiguration=function(){var applicationModuleName="medform",applicationModuleVendorDependencies=["ngResource","ngAnimate","ui.router","ui.bootstrap","ui.utils","ngRaven"],registerModule=function(moduleName,dependencies){angular.module(moduleName,dependencies||[]),angular.module(applicationModuleName).requires.push(moduleName)};return{applicationModuleName:applicationModuleName,applicationModuleVendorDependencies:applicationModuleVendorDependencies,registerModule:registerModule}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function($locationProvider){$locationProvider.hashPrefix("!")}]),angular.module(ApplicationConfiguration.applicationModuleName).constant("APP_PERMISSIONS",{viewAdminSettings:"viewAdminSettings",editAdminSettings:"editAdminSettings",editForm:"editForm",viewPrivateForm:"viewPrivateForm"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("USER_ROLES",{admin:"admin",normal:"user",superuser:"superuser"}),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","$state","$stateParams",function($rootScope,Auth,$state,$stateParams){$rootScope.$state=$state,$rootScope.$stateParams=$stateParams,$rootScope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState){$state.previous=fromState,"home"===toState.name&&Auth.isAuthenticated()&&(event.preventDefault(),$state.go("listForms"))})}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","User","Authorizer","$state","$stateParams",function($rootScope,Auth,User,Authorizer,$state,$stateParams){$rootScope.$on("$stateChangeStart",function(event,next){var authenticator,permissions,user;permissions=next&&next.data&&next.data.permissions?next.data.permissions:null,Auth.ensureHasCurrentUser(User),user=Auth.currentUser,user&&(authenticator=new Authorizer(user),null===permissions||authenticator.canAccess(permissions)||(event.preventDefault(),console.log("access denied"),$state.go("access_denied")))})}]),angular.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),ApplicationConfiguration.registerModule("core",["users"]),ApplicationConfiguration.registerModule("forms",["ngFileUpload","ui.date","ui.sortable","users"]),ApplicationConfiguration.registerModule("users"),angular.module("core").config(["$stateProvider","$urlRouterProvider",function($stateProvider,$urlRouterProvider,Authorization){$urlRouterProvider.otherwise("/"),$stateProvider.state("home",{url:"/",templateUrl:"modules/core/views/home.client.view.html"})}]),angular.module("core").controller("HeaderController",["$rootScope","$scope","Menus","$state","Auth","User",function($rootScope,$scope,Menus,$state,Auth,User){$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.authentication=$rootScope.authentication=Auth,$rootScope.languages=$scope.languages=["english","french","spanish"],$scope.isCollapsed=!1,$scope.hideNav=!1,$scope.menu=Menus.getMenu("topbar"),$scope.signout=function(){var promise=User.logout();promise.then(function(){Auth.logout(),$rootScope.user=null,$state.go("home")},function(reason){console.log("Logout Failed: "+reason)})},$scope.toggleCollapsibleMenu=function(){$scope.isCollapsed=!$scope.isCollapsed},$scope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState,fromParams){$scope.isCollapsed=!1,$scope.hideNav=!1,angular.isDefined(toState.data)&&angular.isDefined(toState.data.hideNav)&&($scope.hideNav=toState.data.hideNav)})}]),angular.module("core").controller("HomeController",["$rootScope","$scope","User","Auth","$state",function($rootScope,$scope,User,Auth,$state){$scope=$rootScope,$scope.user=Auth.ensureHasCurrentUser(User),$scope.authentication=Auth}]),angular.module("core").service("Menus",[function(){this.defaultRoles=["*"],this.menus={};var shouldRender=function(user){if(!user)return this.isPublic;if(~this.roles.indexOf("*"))return!0;for(var userRoleIndex in user.roles)for(var roleIndex in this.roles)if(console.log(this.roles[roleIndex]),console.log(this.roles[roleIndex]===user.roles[userRoleIndex]),this.roles[roleIndex]===user.roles[userRoleIndex])return!0;return!1};this.validateMenuExistance=function(menuId){if(menuId&&menuId.length){if(this.menus[menuId])return!0;throw new Error("Menu does not exists")}throw new Error("MenuId was not provided")},this.getMenu=function(menuId){return this.validateMenuExistance(menuId),this.menus[menuId]},this.addMenu=function(menuId,isPublic,roles){return this.menus[menuId]={isPublic:isPublic||!1,roles:roles||this.defaultRoles,items:[],shouldRender:shouldRender},this.menus[menuId]},this.removeMenu=function(menuId){this.validateMenuExistance(menuId),delete this.menus[menuId]},this.addMenuItem=function(menuId,menuItemTitle,menuItemURL,menuItemType,menuItemUIRoute,isPublic,roles,position){return this.validateMenuExistance(menuId),this.menus[menuId].items.push({title:menuItemTitle,link:menuItemURL,menuItemType:menuItemType||"item",menuItemClass:menuItemType,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].roles:roles,position:position||0,items:[],shouldRender:shouldRender}),this.menus[menuId]},this.addSubMenuItem=function(menuId,rootMenuItemURL,menuItemTitle,menuItemURL,menuItemUIRoute,isPublic,roles,position){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===rootMenuItemURL&&this.menus[menuId].items[itemIndex].items.push({title:menuItemTitle,link:menuItemURL,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].items[itemIndex].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].items[itemIndex].roles:roles,position:position||0,shouldRender:shouldRender});return this.menus[menuId]},this.removeMenuItem=function(menuId,menuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===menuItemURL&&this.menus[menuId].items.splice(itemIndex,1);return this.menus[menuId]},this.removeSubMenuItem=function(menuId,submenuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)for(var subitemIndex in this.menus[menuId].items[itemIndex].items)this.menus[menuId].items[itemIndex].items[subitemIndex].link===submenuItemURL&&this.menus[menuId].items[itemIndex].items.splice(subitemIndex,1);return this.menus[menuId]},this.addMenu("topbar",!1,["*"]),this.addMenu("bottombar",!1,["*"])}]),angular.module("forms").run(["Menus",function(Menus){Menus.addMenuItem("topbar","My Forms","forms","","/forms",!1)}]).filter("formValidity",function(){return function(formObj){if(formObj&&formObj.form_fields&&formObj.visible_form_fields){var formKeys=Object.keys(formObj),fields=(formKeys.filter(function(key){return"$"!==key[0]}),formObj.form_fields),valid_count=fields.filter(function(field){return"object"==typeof field?!!field.fieldValue:void 0}).length;return valid_count-(formObj.form_fields.length-formObj.visible_form_fields.length)}return 0}}).config(["$provide",function($provide){$provide.decorator("accordionDirective",function($delegate){var directive=$delegate[0];return directive.replace=!0,$delegate})}]),angular.module("forms").config(["$stateProvider",function($stateProvider){$stateProvider.state("listForms",{url:"/forms",templateUrl:"modules/forms/views/list-forms.client.view.html"}).state("viewForm",{url:"/forms/:formId/admin",templateUrl:"modules/forms/views/view-form.client.view.html",data:{permissions:["editForm"]}}).state("viewPublicForm",{url:"/forms/:formId",templateUrl:"modules/forms/views/view-public-form.client.view.html",data:{hideNav:!0}})}]),angular.module("forms").controller("SubmitFormController",["$scope","$stateParams","$state","Forms","CurrentForm",function($scope,$stateParams,$state,Forms,CurrentForm){$scope.form=Forms.get({formId:$stateParams.formId}),CurrentForm.setForm($scope.form)}]),angular.module("forms").controller("ViewSubmissionController",["$scope","$stateParams","$state","Submissions","$http",function($scope,$stateParams,$state,Submissions,$http){$scope.submissionId=void 0,$scope.findAll=function(){$scope.submissions=Submissions.query({formId:$stateParams.formId})},$scope.findOne=function(){$scope.submission=Submissions.get({submissionId:$scope.submissionId,formId:$stateParams.formId})},$scope.remove=function(submission){submission||(submission=$scope.submission),$http["delete"]("/forms/"+$stateParams.formId+"/submissions/"+submission._id).success(function(data,status,headers){console.log("submission deleted successfully"),alert("submission deleted..")})}}]),angular.module("forms").controller("ViewFormController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http){$scope=$rootScope,$scope.myform=CurrentForm.getForm(),$scope.saveInProgress=!1,$scope.viewSubmissions=!1,$scope.showCreateModal=!1,$scope.table={masterChecker:!0,rows:[]},$scope.findAll=function(){$scope.myforms=Forms.query()},$scope.findOne=function(){$scope.myform=Forms.get({formId:$stateParams.formId}),CurrentForm.setForm($scope.myform)},$scope.goToWithId=function(route,id){$state.go(route,{formId:id},{reload:!0})},$scope.setForm=function(form){$scope.myform=form},$scope.openCreateModal=function(){$scope.showCreateModal||($scope.showCreateModal=!0)},$scope.closeCreateModal=function(){$scope.showCreateModal&&($scope.showCreateModal=!1)},$scope.isAtLeastOneChecked=function(){console.log("isAtLeastOneChecked");for(var i=0;i<$scope.table.rows.length;i++)if($scope.table.rows[i].selected)return!0;return!1},$scope.toggleAllCheckers=function(){console.log("toggleAllCheckers");for(var i=0;i<$scope.table.rows.length;i++)$scope.table.rows[i].selected=$scope.table.masterChecker},$scope.toggleObjSelection=function($event,description){$event.stopPropagation()},$scope.rowClicked=function(obj){obj.selected=!obj.selected},$scope.deleteSelectedSubmissions=function(){var delete_ids=_.chain($scope.table.rows).filter(function(row){return!!row.selected}).pluck("_id").value();console.log(delete_ids),$http({url:"/forms/"+$scope.myform._id+"/submissions",method:"DELETE",data:{deleted_submissions:delete_ids},headers:{"Content-Type":"application/json;charset=utf-8"}}).success(function(data,status,headers){for(var i=0;i<$scope.table.rows.length;i++)$scope.table.rows[i].selected&&$scope.table.rows.splice(i,1)}).error(function(err){console.log("Could not delete form submissions.\nError: "),console.log(err),console.error=err})},$scope.showSubmissions=function(){$scope.viewSubmissions=!0,$http.get("/forms/"+$scope.myform._id+"/submissions").success(function(data,status,headers){for(var _data=[],i=0;i0&&($scope.myforms=_.filter($scope.myforms,function(myform){return myform._id!==form._id}))}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})},$scope.createNew=function(){var form={};form.title=$scope.myform.name.$modelValue,form.language=$scope.myform.language.$modelValue,console.log(form),$scope.showCreateModal=!0,console.log($scope.myform),$scope.myform.$valid&&$scope.myform.$dirty&&$http.post("/forms",{form:form}).success(function(data,status,headers){console.log("form created"),$scope.myform={},$scope.goToWithId("viewForm",data._id+"")}).error(function(errorResponse){console.log(errorResponse),$scope.error=errorResponse.data.message})},$scope.update=$rootScope.update=function(cb){if(!$rootScope.saveInProgress){$rootScope.saveInProgress=!0;var err=null;$http.put("/forms/"+$scope.myform._id,{form:$scope.myform}).then(function(response){$rootScope.myform=$scope.myform=response.data,console.log(response.data),$scope.$digest||$scope.$apply()})["catch"](function(response){console.log("Error occured during form UPDATE.\n"),console.log(response.data),err=response.data})["finally"](function(){$rootScope.saveInProgress=!1,cb(err)})}},$rootScope.resetForm=function(){$scope.myform=Forms.get({formId:$stateParams.formId})}}]),angular.module("forms").directive("autoSaveForm",["$rootScope","$timeout",function($rootScope,$timeout){return{require:["^form"],link:function($scope,$element,$attrs,$ctrls){void 0===$rootScope.watchCount&&($rootScope.watchCount=0);var difference=function(array){var rest=Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(arguments,1)),containsEquals=function(obj,target){return null===obj?!1:_.any(obj,function(value){return _.isEqual(value,target)})};return _.filter(array,function(value){return!containsEquals(rest,value)})},$formCtrl=$ctrls[0],savePromise=null;$scope.finishedRender=!1;$attrs.autoSaveForm||"true";$scope.$on("ngRepeatStarted",function(ngRepeatFinishedEvent){$rootScope.watchCount=0}),$scope.$on("ngRepeatFinished",function(ngRepeatFinishedEvent){$scope.finishedRender=!0}),$scope.$watch("myform.form_fields",function(newValue,oldValue){console.log("watchCount: "+$rootScope.watchCount),0!==difference(oldValue,newValue).length&&void 0!==oldValue&&(console.log("saveInProgress: "+$rootScope.saveInProgress),!$scope.finishedRender||!$formCtrl.$dirty&&0===difference(oldValue,newValue).length||$rootScope.saveInProgress||($rootScope.watchCount++,1===$rootScope.watchCount&&(savePromise&&$timeout.cancel(savePromise),savePromise=$timeout(function(){savePromise=null,$rootScope[$attrs.autoSaveCallback](function(err){err?(console.log("Error form data NOT persisted"),console.log(err)):(console.log("Form data persisted -- setting pristine flag"),console.log("\n\n---------\nUpdate form CLIENT"),console.log(Date.now()),$rootScope.watchCount=0,$formCtrl.$setPristine())})}))))},!0)}}}]),angular.module("forms").directive("changeFocus",function(){return{scope:{focusDownId:"@",focusUpId:"@"},link:function(scope,elem,attrs){scope.focusUp=function(){scope.$first||(console.log("focusUp"),elem[0].previousElementSibling.find("input").focus()),scope.apply()},scope.focusDown=function(){scope.$last||elem[0].nextElementSibling.focus(),scope.apply()},angular.element("#"+scope.focusDownId).bind("click",function(){scope.focusDown()}),angular.element("#"+scope.focusUpId).bind("click",function(){scope.focusUp()})}}}),angular.module("forms").directive("configureFormDirective",["$rootScope","$http","Upload","$timeout","timeCounter","Auth","FormFields",function($rootScope,$http,Upload,$timeout,timeCounter,Auth,FormFields){return{controller:function($scope){$scope.log="",$scope.pdfLoading=!1,$scope.languages=$rootScope.languages;var _current_upload=null;$scope.resetForm=$rootScope.resetForm,$scope.update=$rootScope.update;$scope.pdfFields;$scope.cancelUpload=function(){_current_upload.abort(),$scope.pdfLoading=!1,$scope.removePDF()},$scope.removePDF=function(){$scope.myform.pdf=null,$scope.myform.isGenerated=!1,$scope.myform.autofillPDFs=!1,console.log("form.pdf: "+$scope.myform.pdf+" REMOVED")},$scope.uploadPDF=function(files){if(files&&files.length){var file=files[0];console.log(file),_current_upload=Upload.upload({url:"/upload/pdf",fields:{user:$scope.user,form:$scope.myform},file:file}).progress(function(evt){var progressPercentage=parseInt(100*evt.loaded/evt.total);$scope.log="progress: "+progressPercentage+"% "+evt.config.file.name+"\n"+$scope.log,$scope.pdfLoading=!0}).success(function(data,status,headers,config){$scope.log="file "+data.originalname+" uploaded as "+data.name+". JSON: "+JSON.stringify(data)+"\n"+$scope.log,$scope.myform.pdf=angular.fromJson(angular.toJson(data)),console.log($scope.myform.pdf),$scope.pdfLoading=!1,console.log($scope.log),$scope.$$phase||$scope.$digest||$scope.$apply()}).error(function(err){$scope.pdfLoading=!1,console.log("Error occured during upload.\n"),console.log(err)})}}},templateUrl:"./modules/forms/views/directiveViews/form/configure-form.html",restrict:"E",scope:{myform:"=",user:"=",pdfFields:"@",formFields:"@"}}}]),angular.module("forms").directive("editFormDirective",["$rootScope","$q","$http","$timeout","timeCounter","Auth","FormFields",function($rootScope,$q,$http,$timeout,timeCounter,Auth,FormFields){return{templateUrl:"./modules/forms/views/directiveViews/form/edit-form.html",restrict:"E",scope:{myform:"=",user:"="},controller:function($scope){$scope.update=$rootScope.update,$scope.dropzone={handle:" .handle"},console.log($scope.myform),$scope.addField={},$scope.addField.types=FormFields.fields,$scope.addField.types.forEach(function(type){return type.lastAddedID=1,type}),$scope.accordion={},$scope.accordion.oneAtATime=!0,$scope.addNewField=function(fieldType){$scope.addField.lastAddedID++;for(var fieldTitle,i=0;i<$scope.addField.types.length;i++)if($scope.addField.types[i].name===fieldType){$scope.addField.types[i].lastAddedID++,fieldTitle=$scope.addField.types[i].value+$scope.addField.types[i].lastAddedID;break}var newField={title:fieldTitle,fieldType:fieldType,fieldValue:"",required:!0,disabled:!1};$scope.myform.form_fields.unshift(newField)},$scope.deleteField=function(hashKey){for(var i=0;i<$scope.myform.form_fields.length;i++)if($scope.myform.form_fields[i].$$hashKey===hashKey){$scope.myform.form_fields.splice(i,1);break}},$scope.duplicateField=function(field,field_index){for(var i=0;i<$scope.myform.form_fields.length;i++)if($scope.myform.form_fields[i].field_id===field.field_id){$scope.addNewField($scope.myform.form_fields[i].fieldType);break}},$scope.addOption=function(field){field.fieldOptions||(field.fieldOptions=[]);var lastOptionID=0;field.fieldOptions[field.fieldOptions.length-1]&&(lastOptionID=field.fieldOptions[field.fieldOptions.length-1].option_id);var option_id=lastOptionID+1,newOption={option_id:option_id,option_title:"Option "+option_id,option_value:option_id};field.fieldOptions.push(newOption)},$scope.deleteOption=function(field,option){for(var i=0;ii;i++)if(i in this&&this[i]===item)return i;return-1};angular.module("forms").directive("fieldDirective",function($http,$compile){var getTemplateUrl=function(field){var type=field.fieldType,templateUrl="./modules/forms/views/directiveViews/field/",supported_fields=["textfield","email","textarea","checkbox","date","dropdown","hidden","password","radio","legal"];return __indexOf.call(supported_fields,type)>=0?templateUrl+=type+".html":void 0},linker=function(scope,element){"date"===scope.field.fieldType&&(scope.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var templateUrl=getTemplateUrl(scope.field);$http.get(templateUrl).success(function(data){element.html(data),$compile(element.contents())(scope)})};return{template:"
{{field.title}}
",restrict:"E",scope:{field:"=",required:"&"},link:linker}}),angular.module("forms").directive("formLocator",function(){return{link:function(scope){scope.$emit("formLocator")}}}),angular.module("forms").directive("onFinishRender",function($rootScope,$timeout){return{restrict:"A",link:function(scope,element,attr){scope.$first===!0&&$timeout(function(){$rootScope.$broadcast("ngRepeatStarted")},500),scope.$last===!0&&$timeout(function(){$rootScope.$broadcast("ngRepeatFinished")},500)}}}),angular.module("forms").directive("formDirective",["$http","$timeout","timeCounter","Auth",function($http,$timeout,timeCounter,Auth){return{controller:function($scope){timeCounter.startClock(),$scope.submit=function(){var _timeElapsed=timeCounter.stopClock();$scope.form.timeElapsed=_timeElapsed,$scope.authentication=Auth,console.log($scope.authentication.isAuthenticated()),$http.post("/forms/"+$scope.form._id,$scope.form).success(function(data,status,headers){console.log("form submitted successfully"),alert("Form submitted.."),$scope.form.submitted=!0}).error(function(error){console.log(error)})},$scope.reloadForm=function(){$scope.form.submitted=!1,$scope.form.form_fields=_.chain($scope.form.form_fields).map(function(field){return field.fieldValue="",field}).value()}},templateUrl:"./modules/forms/views/directiveViews/form/submit-form.html",restrict:"E",scope:{form:"="}}}]),angular.module("forms").directive("tableDirective",["$http","$timeout","Auth",function($http,$timeout,Auth){return{controller:function($scope){$scope.toggleChecker=function(checked){for(var rows=$scope.gridOptions.$gridScope.renderedRows,allChecked=!0,r=0;ri;i++){if(permission=permissions[i],null===APP_PERMISSIONS[permission])throw"Bad permission value";if(!user||!user.roles)return!1;switch(permission){case APP_PERMISSIONS.viewAdminSettings:case APP_PERMISSIONS.editAdminSettings:return user.roles.indexOf(USER_ROLES.admin)>-1;case APP_PERMISSIONS.viewPrivateForm:case APP_PERMISSIONS.editForm:return user.roles.indexOf(USER_ROLES.admin)>-1||user.roles.indexOf(USER_ROLES.normal)>-1}}return!1}}}}),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function($window,$q,$timeout,$http,$state){var userService={getCurrent:function(){var deferred=$q.defer();return $http.get("/users/me").success(function(response){deferred.resolve(response)}).error(function(){deferred.reject("User's session has expired")}),deferred.promise},login:function(credentials){var deferred=$q.defer();return $http.post("/auth/signin",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},logout:function(){var deferred=$q.defer();return $http.get("/auth/signout").success(function(response){deferred.resolve(null)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},signup:function(credentials){var deferred=$q.defer();return $http.post("/auth/signup",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},resendVerifyEmail:function(email){var deferred=$q.defer();return $http.post("/auth/verify/",{email:email}).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},validateVerifyToken:function(token){var deferred=$q.defer();return $http.get("/auth/verify/"+token).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error)}),deferred.promise},resetPassword:function(passwordDetails,token){var deferred=$q.defer();return $http.get("/auth/password/"+token,passwordDetails).success(function(response){deferred.resolve()}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},askForPasswordReset:function(credentials){var deferred=$q.defer();return $http.post("/auth/forgot",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise}};return userService}]),angular.module("users").factory("Users",["$resource",function($resource){return $resource("users",{},{update:{method:"PUT"}})}]); \ No newline at end of file +"use strict";var ApplicationConfiguration=function(){var applicationModuleName="medform",applicationModuleVendorDependencies=["ngResource","ngAnimate","ui.router","ui.bootstrap","ui.utils","ngRaven","cgBusy"],registerModule=function(moduleName,dependencies){angular.module(moduleName,dependencies||[]),angular.module(applicationModuleName).requires.push(moduleName)};return{applicationModuleName:applicationModuleName,applicationModuleVendorDependencies:applicationModuleVendorDependencies,registerModule:registerModule}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function($locationProvider){$locationProvider.hashPrefix("!")}]),angular.module(ApplicationConfiguration.applicationModuleName).constant("APP_PERMISSIONS",{viewAdminSettings:"viewAdminSettings",editAdminSettings:"editAdminSettings",editForm:"editForm",viewPrivateForm:"viewPrivateForm"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("USER_ROLES",{admin:"admin",normal:"user",superuser:"superuser"}),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","$state","$stateParams",function($rootScope,Auth,$state,$stateParams){$rootScope.$state=$state,$rootScope.$stateParams=$stateParams,$rootScope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState){$state.previous=fromState,"home"===toState.name&&Auth.isAuthenticated()&&(event.preventDefault(),$state.go("listForms"))})}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","User","Authorizer","$state","$stateParams",function($rootScope,Auth,User,Authorizer,$state,$stateParams){$rootScope.$on("$stateChangeStart",function(event,next){var authenticator,permissions,user;permissions=next&&next.data&&next.data.permissions?next.data.permissions:null,Auth.ensureHasCurrentUser(User),user=Auth.currentUser,user&&(authenticator=new Authorizer(user),null===permissions||authenticator.canAccess(permissions)||(event.preventDefault(),console.log("access denied"),$state.go("access_denied")))})}]),angular.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),ApplicationConfiguration.registerModule("core",["users"]),ApplicationConfiguration.registerModule("forms",["ngFileUpload","ui.date","ui.sortable","users"]),ApplicationConfiguration.registerModule("users"),angular.module("core").config(["$stateProvider","$urlRouterProvider",function($stateProvider,$urlRouterProvider,Authorization){$urlRouterProvider.otherwise("/"),$stateProvider.state("home",{url:"/",templateUrl:"modules/core/views/home.client.view.html"})}]),angular.module("core").controller("HeaderController",["$rootScope","$scope","Menus","$state","Auth","User",function($rootScope,$scope,Menus,$state,Auth,User){$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.authentication=$rootScope.authentication=Auth,$scope.user.username||($scope.user=$rootScope.user=User.getCurrent(),$scope.authentication.currentUser=$rootScope.authentication.currentUser=$scope.user),$rootScope.languages=$scope.languages=["english","french","spanish"],$scope.isCollapsed=!1,$rootScope.hideNav=!1,$scope.menu=Menus.getMenu("topbar"),$scope.signout=function(){var promise=User.logout();promise.then(function(){Auth.logout(),$rootScope.user=null,$state.go("home")},function(reason){console.log("Logout Failed: "+reason)})},$scope.toggleCollapsibleMenu=function(){$scope.isCollapsed=!$scope.isCollapsed},$scope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState,fromParams){$scope.isCollapsed=!1,$rootScope.hideNav=!1,angular.isDefined(toState.data)&&angular.isDefined(toState.data.hideNav)&&($rootScope.hideNav=toState.data.hideNav)})}]),angular.module("core").controller("HomeController",["$rootScope","$scope","User","Auth","$state",function($rootScope,$scope,User,Auth,$state){$scope=$rootScope,$scope.user=Auth.ensureHasCurrentUser(User),$scope.authentication=Auth}]),angular.module("core").service("Menus",[function(){this.defaultRoles=["*"],this.menus={};var shouldRender=function(user){if(!user)return this.isPublic;if(~this.roles.indexOf("*"))return!0;for(var userRoleIndex in user.roles)for(var roleIndex in this.roles)if(console.log(this.roles[roleIndex]),console.log(this.roles[roleIndex]===user.roles[userRoleIndex]),this.roles[roleIndex]===user.roles[userRoleIndex])return!0;return!1};this.validateMenuExistance=function(menuId){if(menuId&&menuId.length){if(this.menus[menuId])return!0;throw new Error("Menu does not exists")}throw new Error("MenuId was not provided")},this.getMenu=function(menuId){return this.validateMenuExistance(menuId),this.menus[menuId]},this.addMenu=function(menuId,isPublic,roles){return this.menus[menuId]={isPublic:isPublic||!1,roles:roles||this.defaultRoles,items:[],shouldRender:shouldRender},this.menus[menuId]},this.removeMenu=function(menuId){this.validateMenuExistance(menuId),delete this.menus[menuId]},this.addMenuItem=function(menuId,menuItemTitle,menuItemURL,menuItemType,menuItemUIRoute,isPublic,roles,position){return this.validateMenuExistance(menuId),this.menus[menuId].items.push({title:menuItemTitle,link:menuItemURL,menuItemType:menuItemType||"item",menuItemClass:menuItemType,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].roles:roles,position:position||0,items:[],shouldRender:shouldRender}),this.menus[menuId]},this.addSubMenuItem=function(menuId,rootMenuItemURL,menuItemTitle,menuItemURL,menuItemUIRoute,isPublic,roles,position){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===rootMenuItemURL&&this.menus[menuId].items[itemIndex].items.push({title:menuItemTitle,link:menuItemURL,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].items[itemIndex].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].items[itemIndex].roles:roles,position:position||0,shouldRender:shouldRender});return this.menus[menuId]},this.removeMenuItem=function(menuId,menuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===menuItemURL&&this.menus[menuId].items.splice(itemIndex,1);return this.menus[menuId]},this.removeSubMenuItem=function(menuId,submenuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)for(var subitemIndex in this.menus[menuId].items[itemIndex].items)this.menus[menuId].items[itemIndex].items[subitemIndex].link===submenuItemURL&&this.menus[menuId].items[itemIndex].items.splice(subitemIndex,1);return this.menus[menuId]},this.addMenu("topbar",!1,["*"]),this.addMenu("bottombar",!1,["*"])}]),angular.module("forms").run(["Menus",function(Menus){Menus.addMenuItem("topbar","My Forms","forms","","/forms",!1)}]).filter("formValidity",function(){return function(formObj){if(formObj&&formObj.form_fields&&formObj.visible_form_fields){var formKeys=Object.keys(formObj),fields=(formKeys.filter(function(key){return"$"!==key[0]}),formObj.form_fields),valid_count=fields.filter(function(field){return"object"==typeof field?!!field.fieldValue:void 0}).length;return valid_count-(formObj.form_fields.length-formObj.visible_form_fields.length)}return 0}}).config(["$provide",function($provide){$provide.decorator("accordionDirective",function($delegate){var directive=$delegate[0];return directive.replace=!0,$delegate})}]),angular.module("forms").config(["$stateProvider",function($stateProvider){$stateProvider.state("listForms",{url:"/forms",templateUrl:"modules/forms/views/list-forms.client.view.html"}).state("viewForm",{url:"/forms/:formId/admin",templateUrl:"modules/forms/views/view-form.client.view.html",data:{permissions:["editForm"]}}).state("viewPublicForm",{url:"/forms/:formId",templateUrl:"modules/forms/views/view-public-form.client.view.html",data:{hideNav:!0}})}]),angular.module("forms").controller("SubmitFormController",["$scope","$rootScope","$stateParams","$state","Forms","CurrentForm",function($scope,$rootScope,$stateParams,$state,Forms,CurrentForm){Forms.get({formId:$stateParams.formId}).$promise.then(function(form){$scope.form=form,!$scope.form.isLive&&$rootScope.authentication.isAuthenticated()?$rootScope.hideNav=!1:$scope.form.isLive?CurrentForm.setForm($scope.form):$state.go("access_denied"),console.log("$rootScope.hideNav: "+$rootScope.hideNav),console.log("$scope.form.isLive: "+$scope.form.isLive)},function(error){$scope.error=error.message,console.log("ERROR: "+error.message),$state.go("access_denied")})}]),angular.module("forms").controller("ViewFormController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http){$scope=$rootScope,$scope.myform=CurrentForm.getForm(),$scope.saveInProgress=!1,$scope.viewSubmissions=!1,$rootScope.showCreateModal=!1,$scope.table={masterChecker:!0,rows:[]},$scope.findAll=function(){$scope.myforms=Forms.query()},$scope.findOne=function(){$scope.myform=Forms.get({formId:$stateParams.formId}),CurrentForm.setForm($scope.myform)},$scope.goToWithId=function(route,id){$state.go(route,{formId:id},{reload:!0})},$scope.setForm=function(form){$scope.myform=form},$scope.openCreateModal=function(){$rootScope.showCreateModal||($rootScope.showCreateModal=!0)},$scope.closeCreateModal=function(){$rootScope.showCreateModal&&($rootScope.showCreateModal=!1)},$scope.isAtLeastOneChecked=function(){for(var i=0;i<$scope.table.rows.length;i++)if($scope.table.rows[i].selected)return!0;return!1},$scope.toggleAllCheckers=function(){for(var i=0;i<$scope.table.rows.length;i++)$scope.table.rows[i].selected=$scope.table.masterChecker},$scope.toggleObjSelection=function($event,description){$event.stopPropagation()},$scope.rowClicked=function(obj){obj.selected=!obj.selected},$scope.deleteSelectedSubmissions=function(){var delete_ids=_.chain($scope.table.rows).filter(function(row){return!!row.selected}).pluck("_id").value();console.log(delete_ids),$http({url:"/forms/"+$scope.myform._id+"/submissions",method:"DELETE",data:{deleted_submissions:delete_ids},headers:{"Content-Type":"application/json;charset=utf-8"}}).success(function(data,status,headers){for(var i=0;i<$scope.table.rows.length;i++)$scope.table.rows[i].selected&&$scope.table.rows.splice(i,1)}).error(function(err){console.log("Could not delete form submissions.\nError: "),console.log(err),console.error=err})},$scope.showSubmissions=function(){$scope.viewSubmissions=!0,$http.get("/forms/"+$scope.myform._id+"/submissions").success(function(data,status,headers){for(var _data=[],i=0;i0&&($scope.myforms=_.filter($scope.myforms,function(myform){return myform._id!==form._id}))}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})},$scope.createNew=function(){var form={};form.title=$scope.myform.name.$modelValue,form.language=$scope.myform.language.$modelValue,console.log(form),$rootScope.showCreateModal=!0,console.log($scope.myform),$scope.myform.$valid&&$scope.myform.$dirty&&$http.post("/forms",{form:form}).success(function(data,status,headers){console.log("form created"),$scope.myform={},$scope.goToWithId("viewForm",data._id+"")}).error(function(errorResponse){console.log(errorResponse),$scope.error=errorResponse.data.message})},$scope.update=$rootScope.update=function(cb){if(!$rootScope.saveInProgress){$rootScope.saveInProgress=!0,console.log("begin updating form");var err=null;$rootScope.updatePromise=$http.put("/forms/"+$scope.myform._id,{form:$scope.myform}).then(function(response){$rootScope.myform=$scope.myform=response.data,console.log(response.data),$scope.$digest||$scope.$apply()})["catch"](function(response){console.log("Error occured during form UPDATE.\n"),console.log(response.data),err=response.data})["finally"](function(){console.log("finished updating"),$rootScope.saveInProgress=!1,cb(err)})}},$rootScope.resetForm=function(){$scope.myform=Forms.get({formId:$stateParams.formId})}}]),angular.module("forms").directive("autoSaveForm",["$rootScope","$timeout",function($rootScope,$timeout){return{require:["^form"],link:function($scope,$element,$attrs,$ctrls){void 0===$rootScope.watchCount&&($rootScope.watchCount=0);var difference=function(array){var rest=Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(arguments,1)),containsEquals=function(obj,target){return null===obj?!1:_.any(obj,function(value){return _.isEqual(value,target)})};return _.filter(array,function(value){return!containsEquals(rest,value)})},$formCtrl=$ctrls[0],savePromise=null;$scope.finishedRender=!1;$attrs.autoSaveForm||"true";$scope.$on("ngRepeatStarted",function(ngRepeatFinishedEvent){$rootScope.watchCount=0}),$scope.$on("ngRepeatFinished",function(ngRepeatFinishedEvent){$scope.finishedRender=!0}),$scope.$watch("myform.form_fields",function(newValue,oldValue){console.log("watchCount: "+$rootScope.watchCount),0!==difference(oldValue,newValue).length&&void 0!==oldValue&&(console.log("saveInProgress: "+$rootScope.saveInProgress),!$scope.finishedRender||!$formCtrl.$dirty&&0===difference(oldValue,newValue).length||$rootScope.saveInProgress||($rootScope.watchCount++,1===$rootScope.watchCount&&(savePromise&&$timeout.cancel(savePromise),savePromise=$timeout(function(){savePromise=null,$rootScope[$attrs.autoSaveCallback](function(err){err?(console.log("Error form data NOT persisted"),console.log(err)):(console.log("Form data persisted -- setting pristine flag"),console.log("\n\n---------\nUpdate form CLIENT"),console.log(Date.now()),$rootScope.watchCount=0,$formCtrl.$setPristine())})}))))},!0)}}}]),angular.module("forms").directive("changeFocus",function(){return{scope:{focusDownId:"@",focusUpId:"@"},link:function(scope,elem,attrs){scope.focusUp=function(){scope.$first||(console.log("focusUp"),elem[0].previousElementSibling.find("input").focus()),scope.apply()},scope.focusDown=function(){scope.$last||elem[0].nextElementSibling.focus(),scope.apply()},angular.element("#"+scope.focusDownId).bind("click",function(){scope.focusDown()}),angular.element("#"+scope.focusUpId).bind("click",function(){scope.focusUp()})}}}),angular.module("forms").directive("configureFormDirective",["$rootScope","$http","Upload","$timeout","timeCounter","Auth","FormFields",function($rootScope,$http,Upload,$timeout,timeCounter,Auth,FormFields){return{controller:function($scope){$scope.log="",$scope.pdfLoading=!1,$scope.languages=$rootScope.languages;var _current_upload=null;$scope.resetForm=$rootScope.resetForm,$scope.update=$rootScope.update;$scope.pdfFields;$scope.cancelUpload=function(){_current_upload.abort(),$scope.pdfLoading=!1,$scope.removePDF()},$scope.removePDF=function(){$scope.myform.pdf=null,$scope.myform.isGenerated=!1,$scope.myform.autofillPDFs=!1,console.log("form.pdf: "+$scope.myform.pdf+" REMOVED")},$scope.uploadPDF=function(files){if(files&&files.length){var file=files[0];console.log(file),_current_upload=Upload.upload({url:"/upload/pdf",fields:{user:$scope.user,form:$scope.myform},file:file}).progress(function(evt){var progressPercentage=parseInt(100*evt.loaded/evt.total);$scope.log="progress: "+progressPercentage+"% "+evt.config.file.name+"\n"+$scope.log,$scope.pdfLoading=!0}).success(function(data,status,headers,config){$scope.log="file "+data.originalname+" uploaded as "+data.name+". JSON: "+JSON.stringify(data)+"\n"+$scope.log,$scope.myform.pdf=angular.fromJson(angular.toJson(data)),console.log($scope.myform.pdf),$scope.pdfLoading=!1,console.log($scope.log),$scope.$$phase||$scope.$digest||$scope.$apply()}).error(function(err){$scope.pdfLoading=!1,console.log("Error occured during upload.\n"),console.log(err)})}}},templateUrl:"./modules/forms/views/directiveViews/form/configure-form.html",restrict:"E",scope:{myform:"=",user:"=",pdfFields:"@",formFields:"@"}}}]),angular.module("forms").directive("editFormDirective",["$rootScope","$q","$http","$timeout","timeCounter","Auth","FormFields",function($rootScope,$q,$http,$timeout,timeCounter,Auth,FormFields){return{templateUrl:"./modules/forms/views/directiveViews/form/edit-form.html",restrict:"E",scope:{myform:"=",user:"="},controller:function($scope){$scope.update=$rootScope.update,$scope.dropzone={handle:" .handle"},console.log($scope.myform),$scope.addField={},$scope.addField.types=FormFields.fields,$scope.addField.types.forEach(function(type){return type.lastAddedID=1,type}),$scope.accordion={},$scope.accordion.oneAtATime=!0,$scope.addNewField=function(fieldType){$scope.addField.lastAddedID++;for(var fieldTitle,i=0;i<$scope.addField.types.length;i++)if($scope.addField.types[i].name===fieldType){$scope.addField.types[i].lastAddedID++,fieldTitle=$scope.addField.types[i].value+$scope.addField.types[i].lastAddedID;break}var newField={title:fieldTitle,fieldType:fieldType,fieldValue:"",required:!0,disabled:!1};$scope.myform.form_fields.unshift(newField)},$scope.deleteField=function(hashKey){for(var i=0;i<$scope.myform.form_fields.length;i++)if($scope.myform.form_fields[i].$$hashKey===hashKey){$scope.myform.form_fields.splice(i,1);break}},$scope.duplicateField=function(field,field_index){for(var i=0;i<$scope.myform.form_fields.length;i++)if($scope.myform.form_fields[i].field_id===field.field_id){$scope.addNewField($scope.myform.form_fields[i].fieldType);break}},$scope.addOption=function(field){field.fieldOptions||(field.fieldOptions=[]);var lastOptionID=0;field.fieldOptions[field.fieldOptions.length-1]&&(lastOptionID=field.fieldOptions[field.fieldOptions.length-1].option_id);var option_id=lastOptionID+1,newOption={option_id:option_id,option_title:"Option "+option_id,option_value:option_id};field.fieldOptions.push(newOption)},$scope.deleteOption=function(field,option){for(var i=0;ii;i++)if(i in this&&this[i]===item)return i;return-1};angular.module("forms").directive("fieldDirective",function($http,$compile){var getTemplateUrl=function(field){var type=field.fieldType,templateUrl="./modules/forms/views/directiveViews/field/",supported_fields=["textfield","email","textarea","checkbox","date","dropdown","hidden","password","radio","legal"];return __indexOf.call(supported_fields,type)>=0?templateUrl+=type+".html":void 0},linker=function(scope,element){"date"===scope.field.fieldType&&(scope.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var templateUrl=getTemplateUrl(scope.field);$http.get(templateUrl).success(function(data){element.html(data),$compile(element.contents())(scope)})};return{template:"
{{field.title}}
",restrict:"E",scope:{field:"=",required:"&"},link:linker}}),angular.module("forms").directive("formLocator",function(){return{link:function(scope){scope.$emit("formLocator")}}}),angular.module("forms").directive("onFinishRender",function($rootScope,$timeout){return{restrict:"A",link:function(scope,element,attr){scope.$first===!0&&$timeout(function(){$rootScope.$broadcast("ngRepeatStarted")},500),scope.$last===!0&&$timeout(function(){$rootScope.$broadcast("ngRepeatFinished")},500)}}}),angular.module("forms").directive("formDirective",["$http","$timeout","timeCounter","Auth",function($http,$timeout,timeCounter,Auth){return{controller:function($scope){timeCounter.startClock(),$scope.submit=function(){var _timeElapsed=timeCounter.stopClock();$scope.form.timeElapsed=_timeElapsed,$scope.authentication=Auth,console.log($scope.authentication.isAuthenticated()),$http.post("/forms/"+$scope.form._id,$scope.form).success(function(data,status,headers){console.log("form submitted successfully"),alert("Form submitted.."),$scope.form.submitted=!0}).error(function(error){console.log(error)})},$scope.reloadForm=function(){$scope.form.submitted=!1,$scope.form.form_fields=_.chain($scope.form.form_fields).map(function(field){return field.fieldValue="",field}).value()}},templateUrl:"./modules/forms/views/directiveViews/form/submit-form.html",restrict:"E",scope:{form:"="}}}]),angular.module("forms").directive("tableDirective",["$http","$timeout","Auth",function($http,$timeout,Auth){return{controller:function($scope){$scope.toggleChecker=function(checked){for(var rows=$scope.gridOptions.$gridScope.renderedRows,allChecked=!0,r=0;ri;i++){if(permission=permissions[i],null===APP_PERMISSIONS[permission])throw"Bad permission value";if(!user||!user.roles)return!1;switch(permission){case APP_PERMISSIONS.viewAdminSettings:case APP_PERMISSIONS.editAdminSettings:return user.roles.indexOf(USER_ROLES.admin)>-1;case APP_PERMISSIONS.viewPrivateForm:case APP_PERMISSIONS.editForm:return user.roles.indexOf(USER_ROLES.admin)>-1||user.roles.indexOf(USER_ROLES.normal)>-1}}return!1}}}}),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function($window,$q,$timeout,$http,$state){var userService={getCurrent:function(){var deferred=$q.defer();return $http.get("/users/me").success(function(response){deferred.resolve(response)}).error(function(){deferred.reject("User's session has expired")}),deferred.promise},login:function(credentials){var deferred=$q.defer();return $http.post("/auth/signin",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},logout:function(){var deferred=$q.defer();return $http.get("/auth/signout").success(function(response){deferred.resolve(null)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},signup:function(credentials){var deferred=$q.defer();return $http.post("/auth/signup",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},resendVerifyEmail:function(email){var deferred=$q.defer();return $http.post("/auth/verify/",{email:email}).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},validateVerifyToken:function(token){var deferred=$q.defer();return $http.get("/auth/verify/"+token).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error)}),deferred.promise},resetPassword:function(passwordDetails,token){var deferred=$q.defer();return $http.get("/auth/password/"+token,passwordDetails).success(function(response){deferred.resolve()}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},askForPasswordReset:function(credentials){var deferred=$q.defer();return $http.post("/auth/forgot",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise}};return userService}]),angular.module("users").factory("Users",["$resource",function($resource){return $resource("users",{},{update:{method:"PUT"}})}]); \ No newline at end of file diff --git a/public/modules/core/controllers/header.client.controller.js b/public/modules/core/controllers/header.client.controller.js index 85cf0c2b..ee292952 100755 --- a/public/modules/core/controllers/header.client.controller.js +++ b/public/modules/core/controllers/header.client.controller.js @@ -4,20 +4,25 @@ angular.module('core').controller('HeaderController', ['$rootScope','$scope','Me function ($rootScope, $scope, Menus, $state, Auth, User) { $scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User); $scope.authentication = $rootScope.authentication = Auth; + // if(!$scope.user || !$scope.user.username){ + // $scope.user = $rootScope.user = User.getCurrent(); + // $scope.authentication.currentUser = $rootScope.authentication.currentUser = $scope.user; + // } + $rootScope.languages = $scope.languages = ['english', 'french', 'spanish']; $scope.isCollapsed = false; - $scope.hideNav = false; + $rootScope.hideNav = false; $scope.menu = Menus.getMenu('topbar'); $scope.signout = function() { var promise = User.logout(); promise.then(function() { Auth.logout(); - // Auth.ensureHasCurrentUser(null); - $rootScope.user = null; + Auth.ensureHasCurrentUser(User); + $scope.user = $rootScope.user = null; $state.go('home'); - }, + }, function(reason) { console.log('Logout Failed: ' + reason); }); @@ -30,47 +35,14 @@ angular.module('core').controller('HeaderController', ['$rootScope','$scope','Me // Collapsing the menu after navigation $scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) { $scope.isCollapsed = false; - $scope.hideNav = false; + $rootScope.hideNav = false; if ( angular.isDefined( toState.data ) ) { if ( angular.isDefined( toState.data.hideNav ) ) { - $scope.hideNav = toState.data.hideNav; + $rootScope.hideNav = toState.data.hideNav; } } }); - // Principal.identity().then(function(user){ - // $rootScope.user = user; - // console.log('topbar') - // console.log($scope.user); - // }, - // function(error){ - // console.log(error); - // }).then(function(){ - // $scope.signout = function() { - // $http.get('/auth/signout').success(function(response) { - // $state.go('home'); - // }).error(function(error) { - // $scope.error = (error.message || error); - // }); - - // Principal.signout().then( - // function(result){ - // $state.go('home'); - // }, - // function(error){ - // $scope.error = (error.message || error); - // } - // ); - // if( angular.isDefined(response_obj.error) ){ - // $scope.error = response_obj.error; - // } else{ - // $state.go('home'); - // } - - // }; - - // }); - } ]); \ No newline at end of file diff --git a/public/modules/core/controllers/home.client.controller.js b/public/modules/core/controllers/home.client.controller.js index 4f7ced9d..6a974ed4 100755 --- a/public/modules/core/controllers/home.client.controller.js +++ b/public/modules/core/controllers/home.client.controller.js @@ -4,13 +4,5 @@ angular.module('core').controller('HomeController', ['$rootScope', '$scope', 'User', 'Auth', '$state', function($rootScope, $scope, User, Auth, $state) { $scope = $rootScope; - - $scope.user = Auth.ensureHasCurrentUser(User); - $scope.authentication = Auth; - - // if($scope.authentication.isAuthenticated()){ - // $state.go('listForms'); - // } - } ]); \ No newline at end of file diff --git a/public/modules/core/controllers/index.client.controller.js b/public/modules/core/controllers/index.client.controller.js deleted file mode 100644 index 487db31b..00000000 --- a/public/modules/core/controllers/index.client.controller.js +++ /dev/null @@ -1,25 +0,0 @@ -// 'use strict'; - -// /** -// * @ngdoc function -// * @name medform.controller:IndexCtrl -// * @description -// * # IndexCtrl -// * Controller of core -// */ -// angular.module('medform').controller('IndexCtrl', function ($scope, $rootScope, $location, User, Auth, $state) { -// $rootScope.user = Auth.ensureHasCurrentUser(User); -// // $rootScope.user = Auth.getUserState(User).user; -// $rootScope.authentication = Auth; - -// $scope.signout = function() { -// User.logout(function() { -// Auth.logout(); -// $rootScope.user = null; -// $state.go('home'); -// // $scope.$apply(); -// }); -// }; - - -// }); diff --git a/public/modules/core/views/header.client.view.html b/public/modules/core/views/header.client.view.html index 0069a69f..e128d26d 100755 --- a/public/modules/core/views/header.client.view.html +++ b/public/modules/core/views/header.client.view.html @@ -1,63 +1,63 @@ - \ No newline at end of file diff --git a/public/modules/forms/config/forms.client.routes.js b/public/modules/forms/config/forms.client.routes.js index 5ec819c4..186be1be 100644 --- a/public/modules/forms/config/forms.client.routes.js +++ b/public/modules/forms/config/forms.client.routes.js @@ -9,6 +9,9 @@ angular.module('forms').config(['$stateProvider', state('listForms', { url: '/forms', templateUrl: 'modules/forms/views/list-forms.client.view.html', + data: { + permissions: [ 'editForm' ] + } }). state('viewForm', { url: '/forms/:formId/admin', diff --git a/public/modules/forms/controllers/submit-form.client.controller.js b/public/modules/forms/controllers/submit-form.client.controller.js index 307410f4..42420bd4 100644 --- a/public/modules/forms/controllers/submit-form.client.controller.js +++ b/public/modules/forms/controllers/submit-form.client.controller.js @@ -1,12 +1,32 @@ 'use strict'; // Forms controller -angular.module('forms').controller('SubmitFormController', ['$scope', '$stateParams', '$state', 'Forms', 'CurrentForm', - function($scope, $stateParams, $state, Forms, CurrentForm) { - - $scope.form = Forms.get({ +angular.module('forms').controller('SubmitFormController', ['$scope', '$rootScope', '$stateParams', '$state', 'Forms', 'CurrentForm', + function($scope, $rootScope, $stateParams, $state, Forms, CurrentForm) { + + Forms.get({ formId: $stateParams.formId - }); - CurrentForm.setForm($scope.form); + }).$promise.then( + //success + function(form){ + $scope.form = form; + + //Show navbar if form is not public AND user is loggedin + if(!$scope.form.isLive && $rootScope.authentication.isAuthenticated()){ + $rootScope.hideNav = false; + }else if(!$scope.form.isLive){ + $state.go('access_denied'); + }else { + CurrentForm.setForm($scope.form); + } + console.log('$rootScope.hideNav: '+$rootScope.hideNav); + console.log('$scope.form.isLive: '+$scope.form.isLive); + }, + //error + function( error ){ + $scope.error = error.message; + console.log('ERROR: '+error.message); + $state.go('access_denied'); + }); } ]); \ No newline at end of file diff --git a/public/modules/forms/controllers/view-form-submission.client.controller.js b/public/modules/forms/controllers/view-form-submission.client.controller.js deleted file mode 100644 index 24e74182..00000000 --- a/public/modules/forms/controllers/view-form-submission.client.controller.js +++ /dev/null @@ -1,36 +0,0 @@ -'use strict'; - -// submissions controller -angular.module('forms').controller('ViewSubmissionController', ['$scope', '$stateParams', '$state', 'Submissions','$http', - function($scope, $stateParams, $state, Submissions, $http) { - $scope.submissionId = undefined; - - // Return all form's submissions - $scope.findAll = function() { - $scope.submissions = Submissions.query({ - formId: $stateParams.formId - }); - }; - - // Find a specific submission - $scope.findOne = function() { - $scope.submission = Submissions.get({ - submissionId: $scope.submissionId, - formId: $stateParams.formId - }); - }; - - - // Remove existing submission - $scope.remove = function(submission) { - if (!submission) { - submission = $scope.submission; - } - $http.delete('/forms/'+$stateParams.formId+'/submissions/'+submission._id). - success(function(data, status, headers){ - console.log('submission deleted successfully'); - alert('submission deleted..'); - }); - }; - } -]); \ No newline at end of file diff --git a/public/modules/forms/controllers/view-form.client.controller.js b/public/modules/forms/controllers/view-form.client.controller.js index 08214ee7..6983acf7 100644 --- a/public/modules/forms/controllers/view-form.client.controller.js +++ b/public/modules/forms/controllers/view-form.client.controller.js @@ -6,17 +6,21 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' $scope = $rootScope; $scope.myform = CurrentForm.getForm(); - $scope.saveInProgress = false; + $rootScope.saveInProgress = false; $scope.viewSubmissions = false; - $scope.showCreateModal = false; + $rootScope.showCreateModal = false; $scope.table = { - masterChecker: true, + masterChecker: false, rows: [] }; // Return all user's Forms $scope.findAll = function() { - $scope.myforms = Forms.query(); + if(!$scope.myforms){ + Forms.query(function(_forms){ + $scope.myforms = _forms; + }); + } }; // Find a specific Form @@ -31,21 +35,19 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' $state.go(route, {'formId': id}, {reload: true}); }; - - $scope.setForm = function (form) { $scope.myform = form; }; //Modal functions $scope.openCreateModal = function(){ - if(!$scope.showCreateModal){ - $scope.showCreateModal = true; + if(!$rootScope.showCreateModal){ + $rootScope.showCreateModal = true; } }; $scope.closeCreateModal = function(){ - if($scope.showCreateModal){ - $scope.showCreateModal = false; + if($rootScope.showCreateModal){ + $rootScope.showCreateModal = false; } }; @@ -53,14 +55,14 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' * Table Functions */ $scope.isAtLeastOneChecked = function(){ - console.log('isAtLeastOneChecked'); + // console.log('isAtLeastOneChecked'); for(var i=0; i<$scope.table.rows.length; i++){ if($scope.table.rows[i].selected) return true; } return false; }; $scope.toggleAllCheckers = function(){ - console.log('toggleAllCheckers'); + // console.log('toggleAllCheckers'); for(var i=0; i<$scope.table.rows.length; i++){ $scope.table.rows[i].selected = $scope.table.masterChecker; } @@ -194,7 +196,7 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' form.title = $scope.myform.name.$modelValue; form.language = $scope.myform.language.$modelValue; console.log(form); - $scope.showCreateModal = true; + $rootScope.showCreateModal = true; console.log($scope.myform); if($scope.myform.$valid && $scope.myform.$dirty){ @@ -216,13 +218,13 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' // Update existing Form $scope.update = $rootScope.update = function(cb) { - if(!$rootScope.saveInProgress){ + if(!$rootScope.saveInProgress && $rootScope.finishedRender){ $rootScope.saveInProgress = true; - // console.log('begin updating form'); + console.log('begin updating form'); var err = null; - $http.put('/forms/'+$scope.myform._id, {form: $scope.myform}) + $scope.updatePromise = $http.put('/forms/'+$scope.myform._id, {form: $scope.myform}) .then(function(response){ $rootScope.myform = $scope.myform = response.data; console.log(response.data); @@ -234,7 +236,7 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' console.log(response.data); err = response.data; }).finally(function() { - // console.log('finished updating'); + console.log('finished updating'); $rootScope.saveInProgress = false; cb(err); }); diff --git a/public/modules/forms/css/form.css b/public/modules/forms/css/form.css index a003bca6..efabde5b 100644 --- a/public/modules/forms/css/form.css +++ b/public/modules/forms/css/form.css @@ -1,6 +1,10 @@ .btn { border: 1px solid #c6c6c6!important; } +.btn[type='submit'] { + font-size: 1.5em; + padding: 0.35em 1.2em 0.35em 1.2em; +} /* Styles for form submission view (/forms/:formID) */ form .row.field { @@ -201,16 +205,16 @@ section > section.public-form { font-size: 0.95em; } - /*Modal overlay (for lightbox effect)*/ - .overlay { - position: absolute; - top: 0; - left: 0; - height: 193%; - width: inherit; - background-color: rgba(0,0,0,0.5); - z-index: 10; - } +/*Modal overlay (for lightbox effect)*/ +.overlay { + position: absolute; + top: 0; + left: 0; + height: 193%; + width: 100%; + background-color: rgba(0,0,0,0.5); + z-index: 10; +} .form-item.row:hover, .form-item.row.create-new:hover { diff --git a/public/modules/forms/directives/auto-save.client.directive.js b/public/modules/forms/directives/auto-save.client.directive.js index 52b7c8af..69dbadc8 100644 --- a/public/modules/forms/directives/auto-save.client.directive.js +++ b/public/modules/forms/directives/auto-save.client.directive.js @@ -9,6 +9,8 @@ angular.module('forms').directive('autoSaveForm', ['$rootScope', '$timeout', fun // }, link: function($scope, $element, $attrs, $ctrls) { + $rootScope.finishedRender = false; + if($rootScope.watchCount === undefined){ $rootScope.watchCount = 0; } @@ -28,15 +30,15 @@ angular.module('forms').directive('autoSaveForm', ['$rootScope', '$timeout', fun var $formCtrl = $ctrls[0]; var savePromise = null; - $scope.finishedRender = false; + // $scope.finishedRender = false; var expression = $attrs.autoSaveForm || 'true'; $scope.$on('ngRepeatStarted', function(ngRepeatFinishedEvent) { - // $scope.finishedRender = false; + $rootScope.finishedRender = false; $rootScope.watchCount = 0; }); $scope.$on('ngRepeatFinished', function(ngRepeatFinishedEvent) { - $scope.finishedRender = true; + $rootScope.finishedRender = true; }); $scope.$watch('myform.form_fields', function(newValue, oldValue) { @@ -48,13 +50,13 @@ angular.module('forms').directive('autoSaveForm', ['$rootScope', '$timeout', fun // console.log('\n\n----------\n$dirty: '+( $formCtrl.$dirty ) ); // console.log('form_fields changed: '+difference(oldValue,newValue).length ); // console.log('$valid: '+$formCtrl.$valid); - // console.log('finishedRender: '+$scope.finishedRender); - console.log('saveInProgress: '+$rootScope.saveInProgress); + // console.log('finishedRender: '+$rootScope.finishedRender); + // console.log('saveInProgress: '+$rootScope.saveInProgress); - if($scope.finishedRender && ($formCtrl.$dirty || difference(oldValue,newValue).length !== 0) && !$rootScope.saveInProgress) { + if($rootScope.finishedRender && ($formCtrl.$dirty || difference(oldValue,newValue).length !== 0) && !$rootScope.saveInProgress) { $rootScope.watchCount++; - if($rootScope.watchCount === 1) { + // if($rootScope.watchCount === 1) { if(savePromise) { $timeout.cancel(savePromise); @@ -66,11 +68,12 @@ angular.module('forms').directive('autoSaveForm', ['$rootScope', '$timeout', fun $rootScope[$attrs.autoSaveCallback]( function(err){ if(!err){ - console.log('Form data persisted -- setting pristine flag'); - console.log('\n\n---------\nUpdate form CLIENT'); - console.log(Date.now()); + console.log('\n\nForm data persisted -- setting pristine flag'); + // console.log('\n\n---------\nUpdate form CLIENT'); + // console.log(Date.now()); $rootScope.watchCount = 0; $formCtrl.$setPristine(); + // $rootScope.saveInProgress = false; }else{ console.log('Error form data NOT persisted'); console.log(err); @@ -79,7 +82,7 @@ angular.module('forms').directive('autoSaveForm', ['$rootScope', '$timeout', fun }); - } + // } }else{ return; } diff --git a/public/modules/forms/directives/on-finish-render.client.directive.js b/public/modules/forms/directives/on-finish-render.client.directive.js index d4b7fbb2..d069bd1f 100644 --- a/public/modules/forms/directives/on-finish-render.client.directive.js +++ b/public/modules/forms/directives/on-finish-render.client.directive.js @@ -7,13 +7,14 @@ angular.module('forms').directive('onFinishRender', function ($rootScope, $timeo if (scope.$first === true) { $timeout(function () { $rootScope.$broadcast('ngRepeatStarted'); - }, 500); + }); } if (scope.$last === true) { + console.log(element); $timeout(function () { - // console.log('ngRepeatFinished') + console.log('ngRepeatFinished') $rootScope.$broadcast('ngRepeatFinished'); - }, 500); + }); } } }; diff --git a/public/modules/forms/services/forms.client.service.js b/public/modules/forms/services/forms.client.service.js index 5294f3ad..06e33d45 100644 --- a/public/modules/forms/services/forms.client.service.js +++ b/public/modules/forms/services/forms.client.service.js @@ -27,7 +27,6 @@ angular.module('forms').factory('Forms', ['$resource', form.visible_form_fields = _.filter(form.form_fields, function(field){ return field.deletePreserved === false; }); //<-- replace each item with an instance of the resource object - console.log(form); return form; } }, diff --git a/public/modules/forms/views/directiveViews/form/edit-form.html b/public/modules/forms/views/directiveViews/form/edit-form.html index 51103589..1a958f55 100644 --- a/public/modules/forms/views/directiveViews/form/edit-form.html +++ b/public/modules/forms/views/directiveViews/form/edit-form.html @@ -10,7 +10,7 @@ Updating ...
-
+
@@ -30,7 +30,7 @@
- + diff --git a/public/modules/forms/views/list-forms.client.view.html b/public/modules/forms/views/list-forms.client.view.html index bfaeea7b..0045a7da 100644 --- a/public/modules/forms/views/list-forms.client.view.html +++ b/public/modules/forms/views/list-forms.client.view.html @@ -1,5 +1,5 @@ +
-
-
+
@@ -33,13 +33,17 @@ Edit Design - +
+ +
Configure - +
+ +
diff --git a/public/modules/users/config/users.client.config.js b/public/modules/users/config/users.client.config.js index 4dd19603..781a9056 100755 --- a/public/modules/users/config/users.client.config.js +++ b/public/modules/users/config/users.client.config.js @@ -6,7 +6,8 @@ angular.module('users').config(['$httpProvider', $httpProvider.interceptors.push(function($q, $location) { return { responseError: function(response) { - if( $location.path() !== '/verify' && $location.path() !== '/users/me' && $location.path() !== '/' && $location.path() !== '/signup' && response.config){ + // console.log($location.path()); + if( response.config.url !== '/users/me' && $location.path() !== '/users/me' && response.config){ console.log('intercepted rejection of ', response.config.url, response.status); if (response.status === 401) { diff --git a/public/modules/users/controllers/authentication.client.controller.js b/public/modules/users/controllers/authentication.client.controller.js index 46fc8e54..4c068433 100755 --- a/public/modules/users/controllers/authentication.client.controller.js +++ b/public/modules/users/controllers/authentication.client.controller.js @@ -7,21 +7,18 @@ angular.module('users').controller('AuthenticationController', ['$scope', '$loca $scope.credentials = {}; $scope.error = null; - // If user is signed in then redirect back home - if ($scope.authentication.isAuthenticated()) $state.go('home'); - $scope.signin = function() { - Auth.currentUser = User.login($scope.credentials).then( + User.login($scope.credentials).then( function(response) { + console.log(response) Auth.login(response); $scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User); - if($state.previous.name !== 'home' && $state.previous.name !== ''){ + if($state.previous.name !== 'home' && $state.previous.name !== 'verify' && $state.previous.name !== ''){ $state.go($state.previous.name); }else{ - $state.go('home'); + $state.go('listForms'); } - }, function(error) { $rootScope.user = Auth.ensureHasCurrentUser(User); diff --git a/public/modules/users/controllers/password.client.controller.js b/public/modules/users/controllers/password.client.controller.js index 817977f2..28b5b04c 100755 --- a/public/modules/users/controllers/password.client.controller.js +++ b/public/modules/users/controllers/password.client.controller.js @@ -4,39 +4,39 @@ angular.module('users').controller('PasswordController', ['$scope', '$stateParam function($scope, $stateParams, $state, User) { //If user is signed in then redirect back home - if ($scope.authentication.isAuthenticated()) $state.go('home'); + // if ($scope.authentication.isAuthenticated()) $state.go('home'); - // Submit forgotten password account id - $scope.askForPasswordReset = function() { - User.askForPasswordReset($scope.credentials).then( - function(response){ - $scope.success = response.message; - $scope.credentials = null; - }, - function(error){ - $scope.error = error; - $scope.credentials = null; - } - ); - }; + // Submit forgotten password account id + $scope.askForPasswordReset = function() { + User.askForPasswordReset($scope.credentials).then( + function(response){ + $scope.success = response.message; + $scope.credentials = null; + }, + function(error){ + $scope.error = error; + $scope.credentials = null; + } + ); + }; - // Change user password - $scope.resetUserPassword = function() { - $scope.success = $scope.error = null; - User.resetPassword($scope.passwordDetails, $stateParams.token).then( - function(response){ - // If successful show success message and clear form - $scope.success = response.message; - $scope.passwordDetails = null; + // Change user password + $scope.resetUserPassword = function() { + $scope.success = $scope.error = null; + User.resetPassword($scope.passwordDetails, $stateParams.token).then( + function(response){ + // If successful show success message and clear form + $scope.success = response.message; + $scope.passwordDetails = null; - // And redirect to the index page - $state.go('reset-success'); - }, - function(error){ - $scope.error = error.message || error; - $scope.passwordDetails = null; - } - ); - }; + // And redirect to the index page + $state.go('reset-success'); + }, + function(error){ + $scope.error = error.message || error; + $scope.passwordDetails = null; + } + ); + }; } ]); \ No newline at end of file diff --git a/public/modules/users/controllers/verify.client.controller.js b/public/modules/users/controllers/verify.client.controller.js index c59ffe8d..4cf82e07 100644 --- a/public/modules/users/controllers/verify.client.controller.js +++ b/public/modules/users/controllers/verify.client.controller.js @@ -2,7 +2,7 @@ angular.module('users').controller('VerifyController', ['$scope', '$state', '$rootScope', 'User', 'Auth', '$stateParams', function($scope, $state, $rootScope, User, Auth, $stateParams) { - if($rootScope.authetication.isAuthenticated){ + if($rootScope.authentication.isAuthenticated()){ $state.go('home'); } @@ -14,10 +14,12 @@ angular.module('users').controller('VerifyController', ['$scope', '$state', '$ro function(response){ $scope.success = response.message; $scope.credentials = null; + $scope.isResetSent = true; }, function(error){ $scope.error = error; $scope.credentials = null; + $scope.isReset = false; } ); }; diff --git a/public/modules/users/services/auth.js b/public/modules/users/services/auth.js index 0b657cb1..66abdd7b 100644 --- a/public/modules/users/services/auth.js +++ b/public/modules/users/services/auth.js @@ -14,12 +14,12 @@ angular.module('users').factory('Auth', function($window) { // Auth <- $http <- $resource <- LoopBackResource <- User <- Auth ensureHasCurrentUser: function(User) { if (service.currentUser && service.currentUser.displayName) { - // console.log('Using local current user.'); - // console.log(service.currentUser); + console.log('Using local current user.'); + console.log(service.currentUser); return service.currentUser; } else if ($window.user){ - // console.log('Using cached current user.'); + console.log('Using cached current user.'); // console.log($window.user); service.currentUser = $window.user; return service.currentUser; diff --git a/public/modules/users/views/authentication/signin.client.view.html b/public/modules/users/views/authentication/signin.client.view.html index 45831770..a4334bd5 100755 --- a/public/modules/users/views/authentication/signin.client.view.html +++ b/public/modules/users/views/authentication/signin.client.view.html @@ -25,7 +25,7 @@ Error:
- +
diff --git a/public/modules/users/views/authentication/signup-success.client.view.html b/public/modules/users/views/authentication/signup-success.client.view.html index 84fa5237..14e67850 100755 --- a/public/modules/users/views/authentication/signup-success.client.view.html +++ b/public/modules/users/views/authentication/signup-success.client.view.html @@ -20,12 +20,16 @@

Signup Successful

- Congrats! You've successfully registered an account at MedForms.
But your account is not verified yet + You've successfully registered an account at MedForms. + +

But your account is not activated yet

-

Before you continue, make sure to check your email for our verification email. If you don't receive it within 24h drop us a line at hi@medforms.com

+

+ +

Before you continue, make sure to check your email for our verification. If you don't receive it within 24h drop us a line at hi@medforms.com

diff --git a/public/modules/users/views/password/forgot-password.client.view.html b/public/modules/users/views/password/forgot-password.client.view.html index 89157468..456021e9 100755 --- a/public/modules/users/views/password/forgot-password.client.view.html +++ b/public/modules/users/views/password/forgot-password.client.view.html @@ -1,6 +1,6 @@

Restore your password

-

Enter your account username.

+

Enter your account email.