From 21a4eed173c8e87ab47c36d38638240d8f2b640f Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 4 Aug 2015 14:06:16 -0700 Subject: [PATCH] increase autosaving efficiencies --- app/models/base.server.model.js | 24 ++++++ app/models/form.server.model.js | 8 +- package.json | 3 +- .../list-forms.client.controller.js | 31 ++++++++ .../view-form.client.controller.js | 14 ++-- .../directives/auto-save.client.directive.js | 74 +++++++++---------- .../configure-form.client.directive.js | 16 ++-- .../directives/edit-form.client.directive.js | 4 +- .../directives/field.client.directive.js | 6 +- .../on-finish-render.client.directive.js | 28 ++++--- .../submit-form.client.directive.js | 32 ++++---- .../services/form-fields.client.service.js | 8 +- .../views/directiveViews/field/radio.html | 8 +- .../views/directiveViews/field/textfield.html | 6 +- .../views/directiveViews/field/yes_no.html | 14 +++- .../views/directiveViews/form/edit-form.html | 52 +++++++------ .../directiveViews/form/submit-form.html | 3 +- .../forms/views/list-forms.client.view.html | 2 +- .../forms/views/view-form.client.view.html | 40 ++++++---- public/modules/users/services/auth.js | 4 +- 20 files changed, 240 insertions(+), 137 deletions(-) create mode 100644 app/models/base.server.model.js diff --git a/app/models/base.server.model.js b/app/models/base.server.model.js new file mode 100644 index 00000000..38d4763c --- /dev/null +++ b/app/models/base.server.model.js @@ -0,0 +1,24 @@ +// var mongoose = require('mongoose'), +// Schema = mongoose.Schema, +// shortid = require('shortid'); + +// var ObjectId = Schema.ObjectId; + +// var BaseSchema = function() { +// Schema.apply(this, arguments); + +// this.add({ +// created: { +// type: Date, +// default: Date.now +// }, +// lastModified: { +// type: Date, +// }, +// _id: { +// type: String, +// unique: true, +// 'default': shortid.generate +// }, +// }); +// } \ No newline at end of file diff --git a/app/models/form.server.model.js b/app/models/form.server.model.js index 8ff34a77..1b6017a1 100644 --- a/app/models/form.server.model.js +++ b/app/models/form.server.model.js @@ -4,8 +4,6 @@ * Module dependencies. */ var mongoose = require('mongoose'), - FieldSchema = require('./form_field.server.model.js'), - FormSubmissionSchema = require('./form_submission.server.model.js'), Schema = mongoose.Schema, pdfFiller = require('node-pdffiller'), _ = require('lodash'), @@ -13,6 +11,11 @@ var mongoose = require('mongoose'), path = require('path'), fs = require('fs-extra'), async = require('async'), + util = require('util'); + +//Mongoose Models +var FieldSchema = require('./form_field.server.model.js'), + FormSubmissionSchema = require('./form_submission.server.model.js'), Field = mongoose.model('Field', FieldSchema), FormSubmission = mongoose.model('FormSubmission', FormSubmissionSchema); @@ -27,7 +30,6 @@ var FormSchema = new Schema({ }, lastModified: { type: Date, - default: Date.now }, title: { type: String, diff --git a/package.json b/package.json index 4a03ba1e..a81fc627 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "mongoose-relationship": "^0.1.4", "morgan": "~1.4.1", "multer": "~0.1.8", + "node-pdffiller": "~0.0.5", "nodemailer": "~1.3.0", "passport": "~0.2.0", "passport-facebook": "~1.0.2", @@ -76,9 +77,9 @@ "passport-linkedin": "~0.1.3", "passport-local": "~1.0.0", "passport-twitter": "~1.0.2", - "node-pdffiller": "~0.0.5", "raven": "^0.8.1", "satelize": "~0.1.1", + "shortid": "^2.2.2", "should": "~4.1.0", "supertest": "~0.14.0", "swig": "~1.4.1", diff --git a/public/modules/forms/controllers/list-forms.client.controller.js b/public/modules/forms/controllers/list-forms.client.controller.js index 968ee99f..77818000 100644 --- a/public/modules/forms/controllers/list-forms.client.controller.js +++ b/public/modules/forms/controllers/list-forms.client.controller.js @@ -57,5 +57,36 @@ angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope }); } }; + + $scope.remove = function(form_id) { + + console.log('Remove existing form'); + + var form = {}; + if(!form_id){ + form = CurrentForm.getForm(); + if(!form) form = $scope.myform; + }else { + form._id = form_id; + } + + $http.delete('/forms/'+form._id) + .success(function(data, status, headers){ + console.log('form deleted successfully'); + + if(!form_id){ + $state.go('listForms', {}, {reload: true}); + } + if($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); + }); + }; } ]); \ 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 fdc9d3fd..50c3970f 100644 --- a/public/modules/forms/controllers/view-form.client.controller.js +++ b/public/modules/forms/controllers/view-form.client.controller.js @@ -4,8 +4,9 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope', '$stateParams', '$state', 'Forms', 'CurrentForm', '$http', '$modal', function($rootScope, $scope, $stateParams, $state, Forms, CurrentForm, $http, $modal) { - $scope = $rootScope; var deleteModal; + $scope = $rootScope; + $scope.myform = CurrentForm.getForm(); $rootScope.saveInProgress = false; $scope.viewSubmissions = false; @@ -25,6 +26,11 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' $scope.setForm = function (form) { $scope.myform = form; }; + $rootScope.resetForm = function(){ + $scope.myform = Forms.get({ + formId: $stateParams.formId + }); + }; /* * Table Functions @@ -217,11 +223,5 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' } }; - $rootScope.resetForm = function(){ - $scope.myform = Forms.get({ - formId: $stateParams.formId - }); - }; - } ]); \ No newline at end of file diff --git a/public/modules/forms/directives/auto-save.client.directive.js b/public/modules/forms/directives/auto-save.client.directive.js index 69dbadc8..c71ae6da 100644 --- a/public/modules/forms/directives/auto-save.client.directive.js +++ b/public/modules/forms/directives/auto-save.client.directive.js @@ -4,60 +4,59 @@ angular.module('forms').directive('autoSaveForm', ['$rootScope', '$timeout', fun return { require: ['^form'], - // scope: { - // callback: '&autoSaveCallback' - // }, link: function($scope, $element, $attrs, $ctrls) { $rootScope.finishedRender = false; - if($rootScope.watchCount === undefined){ - $rootScope.watchCount = 0; - } + var $formCtrl = $ctrls[0], + savePromise = null; - var difference = function(array){ - var rest = Array.prototype.concat.apply(Array.prototype, Array.prototype.slice.call(arguments, 1)); - var containsEquals = function(obj, target) { - if (obj === null) return false; - return _.any(obj, function(value) { - return _.isEqual(value, target); - }); - }; - - return _.filter(array, function(value){ return !containsEquals(rest, value); }); - }; - - var $formCtrl = $ctrls[0]; - var savePromise = null; - // $scope.finishedRender = false; - var expression = $attrs.autoSaveForm || 'true'; - - $scope.$on('ngRepeatStarted', function(ngRepeatFinishedEvent) { + $scope.$on('editFormFieldsStarted', function(ngRepeatFinishedEvent) { $rootScope.finishedRender = false; - $rootScope.watchCount = 0; }); - $scope.$on('ngRepeatFinished', function(ngRepeatFinishedEvent) { + $scope.$on('editFormFieldsFinished', function(ngRepeatFinishedEvent) { $rootScope.finishedRender = true; }); - $scope.$watch('myform.form_fields', function(newValue, oldValue) { - console.log('watchCount: '+$rootScope.watchCount); - if(difference(oldValue,newValue).length === 0 || oldValue === undefined){ + // $scope.anyDirtyAndTouched = function (form){ + // console.log(form); + // console.log($scope.myform); + + + // for(var prop in form) { + // if(form.hasOwnProperty(prop) && prop[0] !== '$') { + // if(form[prop].$dirty && form[prop].$touched) { + // return true; + // } + // } + // } + // return false; + // }; + + // console.log($scope.watchModel); + $scope.$watch($attrs.autoSaveWatch, function(newValue, oldValue) { + console.log('hello'); + if( !newValue && !oldValue ){ return; } + var changedFields = !_.isEqual(oldValue,newValue); - // console.log('\n\n----------\n$dirty: '+( $formCtrl.$dirty ) ); - // console.log('form_fields changed: '+difference(oldValue,newValue).length ); + // console.log('\n\n----------'); + console.log('$dirty: '+( $formCtrl.$dirty ) ); + // console.log('oldValue: '+oldValue); + // console.log('newValue: '+newValue); + // console.log('form_fields changed: '+changedFields); // console.log('$valid: '+$formCtrl.$valid); // console.log('finishedRender: '+$rootScope.finishedRender); // console.log('saveInProgress: '+$rootScope.saveInProgress); + + // var inputDirtyUntouched = $scope.anyDirtyAndTouched($scope.editForm); - if($rootScope.finishedRender && ($formCtrl.$dirty || difference(oldValue,newValue).length !== 0) && !$rootScope.saveInProgress) { - $rootScope.watchCount++; - - // if($rootScope.watchCount === 1) { + //Save form ONLY IF rendering is finished, form_fields have been change AND currently not save in progress + if($rootScope.finishedRender && (inputDirtyUntouched || changedFields) && !$rootScope.saveInProgress) { + console.log('Saving Form'); if(savePromise) { $timeout.cancel(savePromise); } @@ -71,12 +70,11 @@ angular.module('forms').directive('autoSaveForm', ['$rootScope', '$timeout', fun 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); + console.error('Error form data NOT persisted'); + console.error(err); } }); diff --git a/public/modules/forms/directives/configure-form.client.directive.js b/public/modules/forms/directives/configure-form.client.directive.js index ac34201c..ce9ef08d 100644 --- a/public/modules/forms/directives/configure-form.client.directive.js +++ b/public/modules/forms/directives/configure-form.client.directive.js @@ -3,6 +3,14 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$http', 'Upload', '$timeout', 'timeCounter', 'Auth', 'FormFields', function ($rootScope, $http, Upload, $timeout, timeCounter, Auth, FormFields) { return { + templateUrl: './modules/forms/views/directiveViews/form/configure-form.html', + restrict: 'E', + scope: { + myform:'=', + user:'=', + pdfFields:'@', + formFields:'@' + }, controller: function($scope){ $scope.log = ''; $scope.pdfLoading = false; @@ -73,14 +81,6 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt } }; - }, - templateUrl: './modules/forms/views/directiveViews/form/configure-form.html', - restrict: 'E', - scope: { - myform:'=', - user:'=', - pdfFields:'@', - formFields:'@' } }; } diff --git a/public/modules/forms/directives/edit-form.client.directive.js b/public/modules/forms/directives/edit-form.client.directive.js index e89f30b9..e35dce3c 100644 --- a/public/modules/forms/directives/edit-form.client.directive.js +++ b/public/modules/forms/directives/edit-form.client.directive.js @@ -7,8 +7,8 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', '$q', '$ht restrict: 'E', scope: { myform:'=', - user:'=' }, + transclude: true, controller: function($scope){ //Populate local scope with rootScope methods/variables $scope.update = $rootScope.update; @@ -20,7 +20,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', '$q', '$ht handle: ' .handle' } - console.log($scope.myform); + // console.log($scope.myform); // $scope.draggable = { // connectWith: ".dropzone", diff --git a/public/modules/forms/directives/field.client.directive.js b/public/modules/forms/directives/field.client.directive.js index 251868d6..270fc85f 100644 --- a/public/modules/forms/directives/field.client.directive.js +++ b/public/modules/forms/directives/field.client.directive.js @@ -37,7 +37,6 @@ angular.module('forms').directive('fieldDirective', function($http, $compile) { }; var linker = function(scope, element) { - // scope.field.required = scope.required; //Set format only if field is a date if(scope.field.fieldType === 'date'){ @@ -51,10 +50,11 @@ angular.module('forms').directive('fieldDirective', function($http, $compile) { } //Set only if we have a natural lang processing field else if(scope.field.fieldType === 'natural'){ + scope.field.fieldMatchValue = ''; //Fires when field is changed - scope.$watch('scope.field', function(newValue, oldValue) { - + scope.$watch('scope.field', function(newField, oldField) { + }); } 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 d069bd1f..3c99ab6b 100644 --- a/public/modules/forms/directives/on-finish-render.client.directive.js +++ b/public/modules/forms/directives/on-finish-render.client.directive.js @@ -3,17 +3,27 @@ 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'); - }); + link: function (scope, element, attrs) { + + //Don't do anything if we don't have a ng-repeat on the current element + if(!element.attr('ng-repeat')){ + return; } - if (scope.$last === true) { - console.log(element); + + var broadcastMessage = attrs.onFinishRender || 'ngRepeat'; + + + if(scope.$first && !scope.$last) { + $timeout(function () { + // console.log(broadcastMessage+'Started'); + $rootScope.$broadcast(broadcastMessage+'Started'); + }); + }else if(scope.$last) { $timeout(function () { - console.log('ngRepeatFinished') - $rootScope.$broadcast('ngRepeatFinished'); + element.ready(function () { + // console.log(broadcastMessage+'Finished'); + $rootScope.$broadcast(broadcastMessage+'Finished'); + }); }); } } diff --git a/public/modules/forms/directives/submit-form.client.directive.js b/public/modules/forms/directives/submit-form.client.directive.js index 75bb1194..3bb6ef02 100644 --- a/public/modules/forms/directives/submit-form.client.directive.js +++ b/public/modules/forms/directives/submit-form.client.directive.js @@ -3,7 +3,13 @@ angular.module('forms').directive('formDirective', ['$http', '$timeout', 'timeCounter', 'Auth', '$filter', function ($http, $timeout, timeCounter, Auth, $filter) { return { + templateUrl: './modules/forms/views/directiveViews/form/submit-form.html', + restrict: 'E', + scope: { + form:'=' + }, controller: function($scope){ + console.log('rendering submitFormDirective'); timeCounter.startClock(); $scope.submit = function(){ @@ -14,18 +20,17 @@ angular.module('forms').directive('formDirective', ['$http', '$timeout', 'timeCo delete $scope.form.visible_form_fields; $scope.authentication = Auth; - // console.log($scope.authentication.isAuthenticated()); - $scope.submitPromise = $http.post('/forms/'+$scope.form._id,$scope.form). - success(function(data, status, headers){ - console.log('form submitted successfully'); - // alert('Form submitted..'); - $scope.form.submitted = true; - }) - .error(function(error){ - console.log(error); - $scope.error = error.message; - }); + $scope.submitPromise = $http.post('/forms/'+$scope.form._id,$scope.form) + .success(function(data, status, headers){ + console.log('form submitted successfully'); + // alert('Form submitted..'); + $scope.form.submitted = true; + }) + .error(function(error){ + console.log(error); + $scope.error = error.message; + }); }; $scope.reloadForm = function(){ @@ -38,11 +43,6 @@ angular.module('forms').directive('formDirective', ['$http', '$timeout', 'timeCo }).value(); }; - }, - templateUrl: './modules/forms/views/directiveViews/form/submit-form.html', - restrict: 'E', - scope: { - form:'=' } }; } diff --git a/public/modules/forms/services/form-fields.client.service.js b/public/modules/forms/services/form-fields.client.service.js index 359120b7..4defa088 100644 --- a/public/modules/forms/services/form-fields.client.service.js +++ b/public/modules/forms/services/form-fields.client.service.js @@ -17,7 +17,7 @@ angular.module('forms').service('FormFields', [ }, { name : 'dropdown', - value : 'Dropdown List' + value : 'Dropdown' }, { name : 'date', @@ -25,7 +25,7 @@ angular.module('forms').service('FormFields', [ }, { name : 'textarea', - value : 'Long Text' + value : 'Paragraph Text' }, { name : 'checkbox', @@ -40,6 +40,10 @@ angular.module('forms').service('FormFields', [ value : 'Legal' }, // { + // name : 'sig', + // value : 'Signature' + // }, + // { // name : 'file', // value : 'File Upload' // }, diff --git a/public/modules/forms/views/directiveViews/field/radio.html b/public/modules/forms/views/directiveViews/field/radio.html index a1dbfc87..7593f037 100755 --- a/public/modules/forms/views/directiveViews/field/radio.html +++ b/public/modules/forms/views/directiveViews/field/radio.html @@ -3,7 +3,13 @@
diff --git a/public/modules/forms/views/directiveViews/field/textfield.html b/public/modules/forms/views/directiveViews/field/textfield.html index d19158b3..d1990916 100755 --- a/public/modules/forms/views/directiveViews/field/textfield.html +++ b/public/modules/forms/views/directiveViews/field/textfield.html @@ -3,10 +3,12 @@
+ ng-disabled="field.disabled" + changeFocus focus-up-id="focusUpButton" focus-down-id="focusDownButton"> * required
diff --git a/public/modules/forms/views/directiveViews/field/yes_no.html b/public/modules/forms/views/directiveViews/field/yes_no.html index 69a95b0c..4ba036cf 100644 --- a/public/modules/forms/views/directiveViews/field/yes_no.html +++ b/public/modules/forms/views/directiveViews/field/yes_no.html @@ -1,5 +1,16 @@
-

{{field.title}} *(required)

+
+

+ {{field.title}} + + *(required) + +

+

+ {{field.description}} +

+
+
- * required

diff --git a/public/modules/forms/views/directiveViews/form/edit-form.html b/public/modules/forms/views/directiveViews/form/edit-form.html index b06c49f7..b55e4269 100644 --- a/public/modules/forms/views/directiveViews/form/edit-form.html +++ b/public/modules/forms/views/directiveViews/form/edit-form.html @@ -1,4 +1,4 @@ -
+
- +
+ @@ -54,33 +54,37 @@
    - +
-
-
+
+
+
+

Edit

+
+
-
Field Title:
-
-
+
Question Title:
+
+

-
Field Decription:
-
+
Description:
+
-

+

-
Field Options:
+
Options:
-

+

-
Required:
-
+
Required:
+

-
Disabled:
-
+
Disabled:
+
diff --git a/public/modules/forms/views/directiveViews/form/submit-form.html b/public/modules/forms/views/directiveViews/form/submit-form.html index 02fe778d..f28197ca 100755 --- a/public/modules/forms/views/directiveViews/form/submit-form.html +++ b/public/modules/forms/views/directiveViews/form/submit-form.html @@ -1,4 +1,5 @@
+
@@ -7,7 +8,7 @@
@@ -30,9 +32,12 @@