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:
- Username
+ Account Email