diff --git a/config/env/production.js b/config/env/production.js index 4a8d6cbf..6751a569 100755 --- a/config/env/production.js +++ b/config/env/production.js @@ -18,20 +18,20 @@ module.exports = { } }, assets: { - lib: { - css: [ - 'public/lib/bootstrap/dist/css/bootstrap.min.css', - 'public/lib/bootstrap/dist/css/bootstrap-theme.min.css', - ], - js: [ - 'public/lib/angular/angular.min.js', - 'public/lib/angular-resource/angular-resource.min.js', - 'public/lib/angular-animate/angular-animate.min.js', - 'public/lib/angular-ui-router/release/angular-ui-router.min.js', - 'public/lib/angular-ui-utils/ui-utils.min.js', - 'public/lib/angular-bootstrap/ui-bootstrap-tpls.min.js' - ] - }, + // lib: { + // css: [ + // 'public/lib/bootstrap/dist/css/bootstrap.min.css', + // 'public/lib/bootstrap/dist/css/bootstrap-theme.min.css', + // ], + // js: [ + // 'public/lib/angular/angular.min.js', + // 'public/lib/angular-resource/angular-resource.min.js', + // 'public/lib/angular-animate/angular-animate.min.js', + // 'public/lib/angular-ui-router/release/angular-ui-router.min.js', + // 'public/lib/angular-ui-utils/ui-utils.min.js', + // 'public/lib/angular-bootstrap/ui-bootstrap-tpls.min.js' + // ] + // }, css: 'public/dist/application.min.css', js: 'public/dist/application.min.js' }, diff --git a/gruntfile.js b/gruntfile.js index 1e359da0..9680846b 100755 --- a/gruntfile.js +++ b/gruntfile.js @@ -114,13 +114,13 @@ module.exports = function(grunt) { } } }, - // ngAnnotate: { - // production: { - // files: { - // 'public/dist/application.js': '<%= applicationJavaScriptFiles %>' - // } - // } - // }, + ngAnnotate: { + production: { + files: { + 'public/dist/application.js': '<%= applicationJavaScriptFiles %>' + } + } + }, concurrent: { default: ['nodemon', 'watch'], debug: ['nodemon', 'watch', 'node-inspector'], @@ -182,7 +182,7 @@ module.exports = function(grunt) { grunt.registerTask('lint', ['newer:jshint', 'newer:csslint']); // Build task(s). - grunt.registerTask('build', ['lint', 'loadConfig', 'uglify', 'cssmin']); //'ngAnnotate', ]); + grunt.registerTask('build', ['lint', 'loadConfig', 'uglify', 'cssmin', 'ngAnnotate' ]); // Test task. grunt.registerTask('test', ['test:server', 'test:client']); diff --git a/public/dist/application.js b/public/dist/application.js index ee37a1cb..9c80e3e9 100644 --- a/public/dist/application.js +++ b/public/dist/application.js @@ -47,49 +47,50 @@ angular.module(ApplicationConfiguration.applicationModuleName).constant('USER_RO superuser: 'superuser', }); -// angular.module(ApplicationConfiguration.applicationModuleName).run(['$rootScope', 'Auth', '$state', '$stateParams', -// function($rootScope, Auth, $state, $stateParams) { +angular.module(ApplicationConfiguration.applicationModuleName).run(['$rootScope', 'Auth', '$state', '$stateParams', + function($rootScope, Auth, $state, $stateParams) { -// $rootScope.$state = $state; -// $rootScope.$stateParams = $stateParams; + $rootScope.$state = $state; + $rootScope.$stateParams = $stateParams; -// // add previous state property -// $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState) { -// // console.log(fromState); -// $state.previous = fromState; + // add previous state property + $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 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 + } + } + }); -// } -// ]); + } +]); +//Page access/authorization logic 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 : null; + permissions = next && next.data && next.data.permissions ? next.data.permissions : null; - Auth.ensureCurrentUser(User); + Auth.ensureHasCurrentUser(User); user = Auth.currentUser; - // if(user){} - authenticator = new Authorizer(user); + if(user){ + authenticator = new Authorizer(user); - if( (permissions !== null) && !authenticator.canAccess(permissions) ){ - event.preventDefault(); - if (!user) { - $state.go('sigin'); - } else { + // console.log('Permissions'); + // console.log(permissions); + + if( (permissions !== null) && !authenticator.canAccess(permissions) ){ + event.preventDefault(); + console.log('access denied') $state.go('access_denied'); - } - } + } + } }); }]); @@ -109,7 +110,7 @@ ApplicationConfiguration.registerModule('core', ['users']); 'use strict'; // Use Application configuration module to register a new module -ApplicationConfiguration.registerModule('forms', ['ngFileUpload', 'ui.date', 'users']); +ApplicationConfiguration.registerModule('forms', ['ngFileUpload', 'ui.date', 'ui.sortable', 'users']); 'use strict'; // Use Application configuration module to register a new module @@ -427,7 +428,7 @@ angular.module('core').service('Menus', [ ]); 'use strict'; -// Configuring the Articles module +// Configuring the Forms drop-down menus angular.module('forms').run(['Menus', function(Menus) { // Set top bar menu items @@ -435,29 +436,38 @@ angular.module('forms').run(['Menus', } ]).filter('formValidity', function(){ - return function(formObj){ - //get keys - var formKeys = Object.keys(formObj); + if(formObj && formObj.form_fields && formObj.visible_form_fields){ + + //get keys + var formKeys = Object.keys(formObj); - //we only care about things that don't start with $ - var fieldKeys = formKeys.filter(function(key){ - return key[0] !== '$'; - }); + //we only care about things that don't start with $ + var fieldKeys = formKeys.filter(function(key){ + return key[0] !== '$'; + }); - var fields = formObj.form_fields; - // fieldKeys.map(function(key){ - // return formObj[key]; - // }); + var fields = formObj.form_fields; + // fieldKeys.map(function(key){ + // return formObj[key]; + // }); - var valid_count = fields.filter(function(field){ - if(typeof field === 'object'){ - return !!(field.fieldValue); - } - }).length; - return valid_count; + var valid_count = fields.filter(function(field){ + if(typeof field === 'object'){ + return !!(field.fieldValue); + } + }).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]; + directive.replace = true; + return $delegate; + }); +}]); 'use strict'; // Setting up route @@ -470,151 +480,22 @@ angular.module('forms').config(['$stateProvider', url: '/forms', templateUrl: 'modules/forms/views/list-forms.client.view.html', }). - state('createForm', { - url: '/forms/create', - templateUrl: 'modules/forms/views/create-form.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: true, - hideFooter: false }, - }). - state('editForm', { - url: '/forms/:formId/edit', - templateUrl: 'modules/forms/views/create-form.client.view.html', }); } ]); -// 'use strict'; - -// angular.module('forms').controller('EditFormController', ['$scope', '$state', '$rootScope', 'Upload', '$stateParams', 'FormFields', 'Forms', 'CurrentForm', '$modal', '$location', '$http', -// function ($scope, $state, $rootScope, Upload, $stateParams, FormFields, Forms, CurrentForm, $modal, $location, $http) { -// $scope.form = {}; -// $scope.isNewForm = false; -// $scope.log = ''; -// $scope.pdfLoading = false; -// var _current_upload = null; - -// // Get current form if it exists, or create new one -// if($stateParams.formId){ -// Forms.get({ formId: $stateParams.formId}, function(form){ -// $scope.form = angular.fromJson(angular.toJson(form)); -// console.log($scope.form); -// }); -// } else { -// $scope.form.form_fields = []; -// $scope.isNewForm = true; -// } - -// //PDF Functions -// $scope.cancelUpload = function(){ -// _current_upload.abort(); -// $scope.pdfLoading = false; -// $scope.removePDF(); -// }; - -// $scope.removePDF = function(){ -// $scope.form.pdf = null; -// $scope.form.isGenerated = false; -// $scope.form.autofillPDFs = false; - -// console.log('form.pdf: '+$scope.form.pdf+' REMOVED'); -// }; - -// $scope.uploadPDF = function(files) { - -// if (files && files.length) { -// // for (var i = 0; i < files.length; i++) { -// var file = files[0]; -// _current_upload = Upload.upload({ -// url: '/upload/pdf', -// fields: { -// 'user': $scope.user, -// 'form': $scope.form -// }, -// file: file -// }).progress(function (evt) { -// var progressPercentage = parseInt(100.0 * evt.loaded / evt.total); -// $scope.log = 'progress: ' + progressPercentage + '% ' + -// evt.config.file.name + '\n' + $scope.log; -// $scope.pdfLoading = true; -// }).success(function (data, status, headers, config) { -// $scope.log = 'file ' + data.originalname + ' uploaded as '+ data.name +'. JSON: ' + JSON.stringify(data) + '\n' + $scope.log; -// console.log($scope.form.pdf); -// $scope.form.pdf = angular.fromJson(angular.toJson(data)); -// $scope.pdfLoading = false; - -// console.log($scope.log); -// console.log('$scope.pdf: '+$scope.form.pdf.name); -// if(!$scope.$$phase){ -// $scope.$apply(); -// } -// }).error(function(err){ -// $scope.pdfLoading = false; -// console.log('Error occured during upload.\n'); -// console.log(err); -// }); -// // } -// } -// }; - -// $rootScope.goToWithId = function(route, id) { -// $state.go(route, {'formId': id}, {reload: true}); -// }; - -// // Create new Form -// $rootScope.createOrUpdate = function() { - -// if($scope.isNewForm){ -// // Create new Form object -// var form = new Forms($scope.form); - -// $http.post('/forms', {form: $scope.form}) -// .success(function(data, status, headers){ -// console.log('form created'); - -// // Clear form fields -// $scope.form = {}; -// // Redirect after save -// $scope.goToWithId('viewForm', $scope.form._id); -// }).error(function(errorResponse){ -// console.log(errorResponse); -// $scope.error = errorResponse; -// }); -// } else{ -// $scope.update(function(err){ -// console.log('done updating'); -// }); -// } -// }; - -// // Update existing Form -// $rootScope.update = function(cb) { -// var form = new Forms($scope.form); -// console.log('update form'); -// console.log($scope.form); - -// $http.put('/forms/'+$scope.form._id, {form: $scope.form}) -// .success(function(data, status, headers){ -// console.log('form updated successfully'); -// $scope.goToWithId('viewForm', $scope.form._id); -// cb(null); -// }).error(function(err){ -// console.log('Error occured during form UPDATE.\n'); -// console.log(err); -// cb(err); -// }); -// }; -// } -// ]); - 'use strict'; // Forms controller @@ -632,43 +513,35 @@ angular.module('forms').controller('SubmitFormController', ['$scope', '$statePar // submissions controller angular.module('forms').controller('ViewSubmissionController', ['$scope', '$stateParams', '$state', 'Submissions','$http', function($scope, $stateParams, $state, Submissions, $http) { - $scope.submissionId = undefined; + $scope.submissionId = undefined; - // Principal.identity().then(function(user){ - // $scope.authentication.user = user; - // }).then(function(){ - + // Return all form's submissions + $scope.findAll = function() { + $scope.submissions = Submissions.query({ + formId: $stateParams.formId + }); + }; - // 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 + }); + }; - // 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..'); - }); - }; - - - // }); + + // 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..'); + }); + }; } ]); 'use strict'; @@ -677,9 +550,9 @@ angular.module('forms').controller('ViewSubmissionController', ['$scope', '$stat 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.submissions = undefined; + $scope.saveInProgress = false; $scope.viewSubmissions = false; $scope.showCreateModal = false; $scope.table = { @@ -707,7 +580,7 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' $scope.setForm = function (form) { - $scope.myForm = form; + $scope.myform = form; }; //Modal functions @@ -725,6 +598,13 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' /* * Table Functions */ + $scope.isAtLeastOneChecked = function(){ + 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'); for(var i=0; i<$scope.table.rows.length; i++){ @@ -733,48 +613,98 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' }; $scope.toggleObjSelection = function($event, description) { $event.stopPropagation(); - console.log('checkbox clicked'); }; $scope.rowClicked = function(obj) { - console.log('row clicked'); obj.selected = !obj.selected; }; - //show submissions of Form + /* + * Form Submission Methods + */ + //Delete selected submissions of Form + $scope.deleteSelectedSubmissions = function(){ + // console.log('deleteSelectedSubmissions'); + 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){ + //Remove deleted ids from table + for(var i=0; i<$scope.table.rows.length; i++){ + if($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; + }); + }; + //Fetch and display submissions of Form $scope.showSubmissions = function(){ $scope.viewSubmissions = true; - if(!$scope.table.rows.length){ - $http.get('/forms/'+$scope.myform._id+'/submissions') - .success(function(data, status, headers){ - console.log(data); - $scope.submissions = data; - $scope.table.rows = data; - console.log('form submissions successfully fetched'); - }) - .error(function(err){ - console.log('Could not fetch form submissions.\nError: '+err); - }); - } else if(!$scope.submissions.length){ - $http.get('/forms/'+$scope.myform._id+'/submissions') - .success(function(data, status, headers){ - $scope.submissions = data; - $scope.table.rows = data; - console.log($scope.table.rows); - console.log('form submissions successfully fetched'); - }) - .error(function(err){ - console.log('Could not fetch form submissions.\nError: '+err); - }); - } - console.log($scope.submissions); + + $http.get('/forms/'+$scope.myform._id+'/submissions') + .success(function(data, status, headers){ + // console.log(data[0].form_fields); + + var _data = []; + for(var i=0; i= 0) { return templateUrl += type + '.html'; @@ -1263,11 +1255,11 @@ angular.module('forms').directive('fieldDirective', function($http, $compile) { }; var linker = function(scope, element) { - scope.field.required = scope.required; + // scope.field.required = scope.required; //Set format only if field is a date if(scope.field.fieldType === 'date'){ - $scope.dateOptions = { + scope.dateOptions = { changeYear: true, changeMonth: true, altFormat: "mm/dd/yyyy", @@ -1300,10 +1292,31 @@ angular.module('forms').directive('formLocator', function() { link: function(scope) { scope.$emit('formLocator'); } - } + }; }); 'use strict'; +angular.module('forms').directive('onFinishRender', function ($rootScope, $timeout) { + return { + restrict: 'A', + link: function (scope, element, attr) { + if (scope.$first === true) { + $timeout(function () { + $rootScope.$broadcast('ngRepeatStarted'); + }, 500); + } + if (scope.$last === true) { + $timeout(function () { + // console.log('ngRepeatFinished') + $rootScope.$broadcast('ngRepeatFinished'); + }, 500); + } + } + }; +}); + +'use strict'; + angular.module('forms').directive('formDirective', ['$http', '$timeout', 'timeCounter', 'Auth', function ($http, $timeout, timeCounter, Auth) { return { @@ -1329,12 +1342,16 @@ angular.module('forms').directive('formDirective', ['$http', '$timeout', 'timeCo }); }; - $scope.cancel = function(){ - alert('Form canceled..'); - }; + $scope.reloadForm = function(){ + $scope.form.submitted = false; + $scope.form.form_fields = _.chain($scope.form.form_fields).map(function(field){ + field.fieldValue = ''; + return field; + }).value(); + } }, - templateUrl: './modules/forms/views/directiveViews/form/form.html', + templateUrl: './modules/forms/views/directiveViews/form/submit-form.html', restrict: 'E', scope: { form:'=' @@ -1344,27 +1361,6 @@ angular.module('forms').directive('formDirective', ['$http', '$timeout', 'timeCo ]); 'use strict'; -angular.module('forms').directive('onFinishRender', function ($rootScope, $timeout) { - return { - restrict: 'A', - link: function (scope, element, attr) { - if (scope.$first === true) { - $timeout(function () { - $rootScope.$broadcast('ngRepeatStarted'); - }, 500); - } - if (scope.$last === true) { - $timeout(function () { - // console.log('ngRepeatFinished') - $rootScope.$broadcast('ngRepeatFinished'); - }, 500); - } - } - } -}); - -'use strict'; - angular.module('forms').directive('tableDirective', ['$http', '$timeout', 'Auth', function ($http, $timeout, Auth) { return { @@ -1488,6 +1484,27 @@ angular.module('forms').factory('Forms', ['$resource', 'query' : { method: 'GET', isArray: true, + transformResponse: function(data, header) { + var forms = angular.fromJson(data); + angular.forEach(forms, function(form, idx) { + form.visible_form_fields = _.filter(form.form_fields, function(field){ + return field.deletePreserved === false; + }); //<-- replace each item with an instance of the resource object + }); + return forms; + } + }, + 'get' : { + method: 'GET', + transformResponse: function(data, header) { + var form = angular.fromJson(data); + + 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; + } }, 'update': { method: 'PUT' @@ -1550,7 +1567,7 @@ angular.module('users').config(['$httpProvider', $httpProvider.interceptors.push(function($q, $location) { return { responseError: function(response) { - if( $location.path() !== '/users/me' && $location.path() !== '/'){ + if( $location.path() !== '/verify' && $location.path() !== '/users/me' && $location.path() !== '/' && $location.path() !== '/signup' && response.config){ console.log('intercepted rejection of ', response.config.url, response.status); if (response.status === 401) { @@ -1567,7 +1584,7 @@ angular.module('users').config(['$httpProvider', }; }); }]); - +'use strict'; // Setting up route angular.module('users').config(['$stateProvider', @@ -1599,10 +1616,6 @@ angular.module('users').config(['$stateProvider', // Users state routing $stateProvider. state('profile', { - // parent: 'restricted', - // data: { - // roles: ['user', 'admin'], - // }, resolve: { loggedin: checkLoggedin }, @@ -1610,13 +1623,6 @@ angular.module('users').config(['$stateProvider', templateUrl: 'modules/users/views/settings/edit-profile.client.view.html' }). state('password', { - // resolve: { - // checkLoggedin: Authorization.authorize - // }, - // parent: 'restricted', - // data: { - // roles: ['user', 'admin'], - // }, resolve: { loggedin: checkLoggedin }, @@ -1624,10 +1630,6 @@ angular.module('users').config(['$stateProvider', templateUrl: 'modules/users/views/settings/change-password.client.view.html' }). state('accounts', { - // parent: 'restricted', - // data: { - // roles: ['user', 'admin'], - // }, resolve: { loggedin: checkLoggedin }, @@ -1652,6 +1654,15 @@ angular.module('users').config(['$stateProvider', templateUrl: 'modules/users/views/authentication/access-denied.client.view.html' }). + state('resendVerifyEmail', { + url: '/verify', + templateUrl: 'modules/users/views/verify/resend-verify-email.client.view.html' + }). + state('verify', { + url: '/verify/:token', + templateUrl: 'modules/users/views/verify/verify-account.client.view.html' + }). + state('forgot', { url: '/password/forgot', templateUrl: 'modules/users/views/password/forgot-password.client.view.html' @@ -1675,105 +1686,52 @@ angular.module('users').config(['$stateProvider', angular.module('users').controller('AuthenticationController', ['$scope', '$location', '$state', '$rootScope', 'User', 'Auth', function($scope, $location, $state, $rootScope, User, Auth) { - $scope = $rootScope; - $scope.credentials = {}; - $scope.error = null; + $scope = $rootScope; + $scope.credentials = {}; + $scope.error = null; - // If user is signed in then redirect back home - if ($scope.authentication.isAuthenticated()) $state.go('home'); + // 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( - function(response) { - Auth.login(response); - $scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User); + $scope.signin = function() { + Auth.currentUser = User.login($scope.credentials).then( + function(response) { + Auth.login(response); + $scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User); - if($state.previous.name !== 'home' && $state.previous.name !== ''){ - $state.go($state.previous.name); - }else{ - $state.go('home'); + if($state.previous.name !== 'home' && $state.previous.name !== ''){ + $state.go($state.previous.name); + }else{ + $state.go('home'); + } + + }, + function(error) { + $rootScope.user = Auth.ensureHasCurrentUser(User); + $scope.user = $rootScope.user; + + $scope.error = error; + console.log('loginError: '+error); } - - }, - function(error) { - $rootScope.user = Auth.ensureHasCurrentUser(User); - $scope.user = $rootScope.user; + ); + }; - $scope.error = error; - console.log('loginError: '+error); - } - ); - }; + $scope.signup = function() { + User.signup($scope.credentials).then( + function(response) { + console.log('signup-success'); + $state.go('signup-success'); + }, + function(error) { + if(error) { + $scope.error = error; + }else { + console.log('No response received'); + } + } + ); + }; - $scope.signup = function() { - User.signup($scope.credentials).then( - function(response) { - console.log('signup-success'); - $state.go('signup-success'); - }, - function(error) { - if(error) { - $scope.error = error; - }else { - console.log('No response received'); - } - } - ); - }; - - - // $scope.signup = function() { - // Principal.signup($scope.credentials).then( - // function(result){ - // $state.go('home'); - // }, - // function(rejection_reason){ - // $scope.error = rejection_reason; - // } - // ); - // // $http.post('/auth/signup', $scope.credentials).success(function(response) { - // // // If successful we assign the response to the global user model - // // $scope.authentication.user = response; - // // Principal.authenticate(response); - - // // // And redirect to the index page - // // $location.path('/'); - // // }).error(function(response) { - // // $scope.error = response.message; - // // }); - // }; - - // $scope.signin = function() { - // console.log('signin'); - - // Principal.signin($scope.credentials).then( - // function(result){ - // $state.go('home'); - // }, - // function(rejection_reason){ - // $scope.error = rejection_reason; - // } - // ); - // // var response_obj = Principal.signin($scope.credentials); - // // if( angular.isDefined(response_obj.error) ){ - // // $scope.error = response_obj.error; - // // $location.path('/signin'); - // // } else{ - // // $location.path('/'); - // // } - // // $http.post('/auth/signin', $scope.credentials).success(function(response) { - // // // If successful we assign the response to the global user model - // // $scope.authentication.user = response; - // // Principal.authenticate(response); - - // // // And redirect to the index page - // // $location.path('/'); - // // }).error(function(response) { - // // Principal.authenticate(null); - // // $scope.error = response.message; - // // }); - // }; - // } } ]); 'use strict'; @@ -1893,8 +1851,53 @@ angular.module('users').controller('SettingsController', ['$scope', '$rootScope' ]); 'use strict'; -angular.module('users') - .factory('Auth', function($window) { +angular.module('users').controller('VerifyController', ['$scope', '$state', '$rootScope', 'User', 'Auth', '$stateParams', + function($scope, $state, $rootScope, User, Auth, $stateParams) { + if($rootScope.authetication.isAuthenticated){ + $state.go('home'); + } + + $scope.isReset = false; + + // Submit forgotten password account id + $scope.resendVerifyEmail = function() { + User.resendVerifyEmail($scope.email).then( + function(response){ + $scope.success = response.message; + $scope.credentials = null; + }, + function(error){ + $scope.error = error; + $scope.credentials = null; + } + ); + }; + + //Validate Verification Token + $scope.validateVerifyToken = function() { + if($stateParams.token){ + console.log($stateParams.token); + User.validateVerifyToken($stateParams.token).then( + function(response){ + console.log('Success: '+response.message); + $scope.success = response.message; + $scope.isReset = true; + $scope.credentials = null; + }, + function(error){ + console.log('Error: '+error.message); + $scope.isReset = false; + $scope.error = error; + $scope.credentials = null; + } + ); + } + } + } +]); +'use strict'; + +angular.module('users').factory('Auth', function($window) { var userState = { isLoggedIn: false @@ -1959,56 +1962,9 @@ angular.module('users') return service; }); -// 'use strict'; - -// angular.module('users').factory('Authorization', ['$rootScope', '$http', '$q', '$state', 'Principal', -// function($rootScope, $http, $q, $state, Principal) { -// var service = { -// authorize: function(){ -// var deferred = $q.defer(); -// $http.get('/user/me').success(function(response) { - - -// //user is logged in -// if(response.data !== null){ -// deferred.resolve(); -// }else { -// $rootScope.message = 'You need to log in.'; -// deferred.reject(); -// $state.go('/login'); -// } - -// }); -// return deferred.promise(); -// } -// }; -// return service; -// // this.authorize = function() { -// // return Principal.identity().then(function(){ -// // var isAuthenticated = Principal.isAuthenticated(); -// // if( angular.isDefined($rootScope.toState.data) ){ -// // // if ($rootScope.toState.data.roles && $rootScope.toState.data.roles.length > 0 && !principal.isInAnyRole($rootScope.toState.data.roles)) { -// // if (!isAuthenticated){ //$location.path('/access_denied'); // user is signed in but not authorized for desired state -// // // console.log('isAuthenticated: '+isAuthenticated); - -// // // else { -// // // user is not authenticated. so the state they wanted before you -// // // send them to the signin state, so you can return them when you're done -// // $rootScope.returnToState = $rootScope.toState; -// // $rootScope.returnToStateParams = $rootScope.toStateParams; - -// // // now, send them to the signin state so they can log in -// // $location.path('/signin'); -// // } -// // // } -// // } -// // }); -// // }; -// } -// ]); 'use strict'; -app.service('Authorizer', function(APP_PERMISSIONS, USER_ROLES) { +angular.module('users').service('Authorizer', function(APP_PERMISSIONS, USER_ROLES) { return function(user) { return { canAccess: function(permissions) { @@ -2021,227 +1977,25 @@ app.service('Authorizer', function(APP_PERMISSIONS, USER_ROLES) { if (APP_PERMISSIONS[permission] === null) { throw 'Bad permission value'; } - if (user && user.role) { + if (user && user.roles) { switch (permission) { case APP_PERMISSIONS.viewAdminSettings: case APP_PERMISSIONS.editAdminSettings: - return user.role === USER_ROLES.admin; + return user.roles.indexOf(USER_ROLES.admin) > -1; case APP_PERMISSIONS.viewPrivateForm: case APP_PERMISSIONS.editForm: - return user.role === USER_ROLES.admin || user.role === USER_ROLES.normal; + return user.roles.indexOf(USER_ROLES.admin) > -1 || user.roles.indexOf(USER_ROLES.normal) > -1; } } else { return false; } } + return false; } }; }; }); -// 'use strict'; - -// angular.module('users').factory('AuthenticationService', function($http, $timeout, $q) { -// var error; -// var service = { -// // Information about the current user -// currentUser: null, - -// login: function(credentials) { -// var login = $http.post('/auth/signin', credentials); -// login.success(function(data) { -// service.currentUser = data.user; -// // $flash.clear(); -// }).error(function(error) { -// error = error.error ? error.error : error; -// console.error(error.message || error); -// }); -// return login; -// }, - -// logout: function() { -// var logout = $http.get('/auth/logout'); -// logout.success(function() { -// service.currentUser = null; -// console.log("You've successfully logged out"); -// }); -// return logout; -// }, - -// signup: function(credentials) { -// var signup = $http.post('/auth/signup', credentials) -// signup.success(function(response) { -// console.log("You've successfully created an account"); -// }).error(function(response) { -// error = error.error ? error.error : error; -// console.error(error.message || error); -// }); - -// return signup; -// }, - -// // Ask the backend to see if a user is already authenticated - -// // this may be from a previous session. -// identity: function() { -// if (service.isAuthenticated()) { -// return $q.when(service.currentUser); -// } else { -// return $http.get('/user/me').then(function(response) { -// service.currentUser = response.data.user; -// return service.currentUser; -// }); -// } -// }, - -// // Is the current user authenticated? -// isAuthenticated: function() { -// return !!service.currentUser; -// }, - -// isInRole: function(role) { -// return service.isAuthenticated() (service.currentUser.roles.indexOf(role) !== -1); -// }, - -// isInAnyRole: function(roles) { -// if ( !service.isAuthenticated() || !service.currentUser.roles) return false; -// var roles = service.currentUser.roles; - -// for (var i = 0; i < roles.length; i++) { -// if (this.isInRole(roles[i])) return true; -// } - -// return false; -// }, - -// }; -// return service; -// }); - -// // .factory('Principal', ['$window', '$http', '$q', '$timeout', '$state', -// // function($window, $http, $q, $timeout, $state) { -// // var _identity, -// // _authenticated = false; - -// // return { -// // isIdentityResolved: function() { -// // return angular.isDefined(_identity); -// // }, -// // isAuthenticated: function() { -// // return _authenticated; -// // }, -// // isInRole: function(role) { -// // if (!_authenticated || !_identity.roles) return false; - -// // return _identity.roles.indexOf(role) !== -1; -// // }, -// // isInAnyRole: function(roles) { -// // if (!_authenticated || !_identity.roles) return false; - -// // for (var i = 0; i < roles.length; i++) { -// // if (this.isInRole(roles[i])) return true; -// // } - -// // return false; -// // }, -// // authenticate: function(user) { -// // _identity = user; -// // _authenticated = (user !== null); - -// // // for this demo, we'll store the identity in localStorage. For you, it could be a cookie, sessionStorage, whatever -// // if (user) $window.user = user; -// // else $window.user = null; -// // }, -// // signin: function(credentials) { - -// // var deferred = $q.defer(); -// // var self = this; -// // $http.post('/auth/signin', credentials).success(function(response) { -// // // If successful we assign the response to the global user model -// // self.authenticate(response); -// // deferred.resolve(response); -// // }).error(function(response) { -// // _authenticated = false; -// // deferred.reject({ error: response.message }); -// // }); -// // return deferred.promise; -// // }, -// // signup: function(credentials) { - -// // var deferred = $q.defer(); - -// // $http.post('/auth/signup', credentials).success(function(response) { -// // // If successful we assign the response to the global user model -// // deferred.resolve(response); -// // }).error(function(response) { - -// // deferred.reject({ error: response.message }); -// // }); - -// // return deferred.promise; -// // }, -// // signout: function() { -// // var deferred = $q.defer(); -// // $http.get('/auth/signout').success(function(response) { -// // // If successful we assign the response to the global user model -// // deferred.resolve({}); -// // }).error(function(response) { -// // deferred.reject({ error: response.message }); -// // }); - -// // _authenticated = false; -// // _identity = undefined; - -// // return deferred.promise; -// // }, -// // identity: function() { -// // var self = this; - -// // var deferred = $q.defer(); - -// // // check and see if we have retrieved the user data from the server. if we have, reuse it by immediately resolving -// // if (angular.isDefined(_identity)) { - -// // deferred.resolve(_identity); -// // return deferred.promise; -// // }else if($window.user){ -// // // console.log($window.user); -// // // self.authenticate($window.user); -// // // var user = $window.user; -// // _identity = $window.user; -// // self.authenticate(_identity); -// // deferred.resolve(_identity); - -// // return deferred.promise; -// // }else { - -// // // otherwise, retrieve the user data from the server, update the user object, and then resolve. -// // $http.get('/users/me', { ignoreErrors: true }) -// // .success(function(response) { -// // self.authenticate(response); -// // $window.user = response; -// // deferred.resolve(_identity); -// // }) -// // .error(function() { -// // _identity = null; -// // _authenticated = false; -// // $window.user = null; -// // $state.path('signin'); -// // deferred.resolve(_identity); -// // }); - -// // return deferred.promise; -// // } -// // }, -// // getUser: function(){ -// // this.identity(false).then( function(user){ -// // return user; -// // }); -// // } -// // }; - -// // } -// // ]); - 'use strict'; angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', '$state', @@ -2298,6 +2052,28 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' return deferred.promise; }, + resendVerifyEmail: function(email) { + var deferred = $q.defer(); + $http.post('/auth/verify/', {email: email}).success(function(response) { + deferred.resolve(response); + }).error(function(error) { + deferred.reject(error.message || error); + }); + + return deferred.promise; + }, + + validateVerifyToken: function(token) { + var deferred = $q.defer(); + $http.get('/auth/verify/'+token).success(function(response) { + deferred.resolve(response); + }).error(function(error) { + deferred.reject(error); + }); + + return deferred.promise; + }, + resetPassword: function(passwordDetails, token) { var deferred = $q.defer(); $http.get('/auth/password/'+token, passwordDetails).success(function(response) { diff --git a/public/dist/application.min.js b/public/dist/application.min.js index 70d418a7..ad715e63 100644 --- a/public/dist/application.min.js +++ b/public/dist/application.min.js @@ -1 +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","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:null,Auth.ensureCurrentUser(User),user=Auth.currentUser,authenticator=new Authorizer(user),null===permissions||authenticator.canAccess(permissions)||(event.preventDefault(),user?$state.go("access_denied"):$state.go("sigin"))})}]),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","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){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}}),angular.module("forms").config(["$stateProvider",function($stateProvider){$stateProvider.state("listForms",{url:"/forms",templateUrl:"modules/forms/views/list-forms.client.view.html"}).state("createForm",{url:"/forms/create",templateUrl:"modules/forms/views/create-form.client.view.html"}).state("viewForm",{url:"/forms/:formId/admin",templateUrl:"modules/forms/views/view-form.client.view.html"}).state("viewPublicForm",{url:"/forms/:formId",templateUrl:"modules/forms/views/view-public-form.client.view.html",data:{hideNav:!0,hideFooter:!1}}).state("editForm",{url:"/forms/:formId/edit",templateUrl:"modules/forms/views/create-form.client.view.html"})}]),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.myform=CurrentForm.getForm(),$scope.submissions=void 0,$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.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(),console.log("checkbox clicked")},$scope.rowClicked=function(obj){console.log("row clicked"),obj.selected=!obj.selected},$scope.showSubmissions=function(){$scope.viewSubmissions=!0,$scope.table.rows.length?$scope.submissions.length||$http.get("/forms/"+$scope.myform._id+"/submissions").success(function(data,status,headers){$scope.submissions=data,$scope.table.rows=data,console.log($scope.table.rows),console.log("form submissions successfully fetched")}).error(function(err){console.log("Could not fetch form submissions.\nError: "+err)}):$http.get("/forms/"+$scope.myform._id+"/submissions").success(function(data,status,headers){console.log(data),$scope.submissions=data,$scope.table.rows=data,console.log("form submissions successfully fetched")}).error(function(err){console.log("Could not fetch form submissions.\nError: "+err)}),console.log($scope.submissions)},$scope.hideSubmissions=function(){$scope.viewSubmissions=!1},$scope.remove=function(form_id){var form={};form_id?form._id=form_id:(form=CurrentForm.getForm(),form||(form=$scope.myform)),$http["delete"]("/forms/"+form._id).success(function(data,status,headers){console.log("form deleted successfully"),form_id||$state.go("listForms"),$scope.myforms.length>0&&($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",$scope.myform._id)}).error(function(errorResponse){console.log(errorResponse)})},$scope.saveInProgress=!1,$scope.update=$rootScope.update=function(cb){if(!$scope.saveInProgress){$scope.saveInProgress=!0,$rootScope.saveInProgress=!0,console.log("begin updating form");var err=null;$http.put("/forms/"+$scope.myform._id,{form:$scope.myform}).then(function(response){console.log("form updated successfully"),console.log(response.status)})["catch"](function(response){console.log("Error occured during form UPDATE.\n"),console.log(response.data),err=response.data})["finally"](function(){console.log("finished updating"),$scope.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("\n\n----------\n$dirty: "+$formCtrl.$dirty),console.log("form_fields changed: "+difference(oldValue,newValue).length),console.log("finishedRender: "+$scope.finishedRender),$scope.finishedRender&&($formCtrl.$dirty||0!==difference(oldValue,newValue).length)&&($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("\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||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","$timeout","timeCounter","Auth","FormFields",function($rootScope,$http,$timeout,timeCounter,Auth,FormFields){return{controller:function($scope){$scope.log="",$scope.pdfLoading=!1,$scope.languages=$rootScope.languages;var _current_upload=null;$scope.createOrUpdate=$rootScope.createOrUpdate,$scope.resetForm=$rootScope.resetForm;$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];_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,console.log($scope.myform.pdf),$scope.myform.pdf=angular.fromJson(angular.toJson(data)),$scope.pdfLoading=!1,console.log($scope.log),console.log("$scope.pdf: "+$scope.myform.pdf.name),$scope.$$phase||$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.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),console.log("\n\n---------\nAdded field CLIENT"),console.log(Date.now())},$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.field_options||(field.field_options=[]);var lastOptionID=0;field.field_options[field.field_options.length-1]&&(lastOptionID=field.field_options[field.field_options.length-1].option_id);var option_id=lastOptionID+1,newOption={option_id:option_id,option_title:"Option "+option_id,option_value:option_id};field.field_options.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"];return __indexOf.call(supported_fields,type)>=0?templateUrl+=type+".html":void 0},linker=function(scope,element){scope.field.required=scope.required,"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("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.cancel=function(){alert("Form canceled..")}},templateUrl:"./modules/forms/views/directiveViews/form/form.html",restrict:"E",scope:{form:"="}}}]),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("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.role)return!1;switch(permission){case APP_PERMISSIONS.viewAdminSettings:case APP_PERMISSIONS.editAdminSettings:return user.role===USER_ROLES.admin;case APP_PERMISSIONS.viewPrivateForm:case APP_PERMISSIONS.editForm:return user.role===USER_ROLES.admin||user.role===USER_ROLES.normal}}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},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"],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