From 8d3e60526139a2200b402356b6060a36ed095c58 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Mon, 20 Nov 2017 18:30:16 -0800 Subject: [PATCH 01/26] fixed create new form bug --- public/form_modules/forms/base/config/i18n/english.js | 3 +++ public/form_modules/forms/base/config/i18n/french.js | 7 +++++-- public/form_modules/forms/base/config/i18n/german.js | 7 +++++-- public/form_modules/forms/base/config/i18n/italian.js | 3 +++ public/form_modules/forms/base/config/i18n/spanish.js | 3 +++ .../directiveViews/form/submit-form.client.view.html | 8 ++++++-- .../admin/directives/configure-form.client.directive.js | 9 ++++++++- .../directiveViews/form/configure-form.client.view.html | 8 +++++++- 8 files changed, 40 insertions(+), 8 deletions(-) diff --git a/public/form_modules/forms/base/config/i18n/english.js b/public/form_modules/forms/base/config/i18n/english.js index fe12abaf..9941d5ae 100644 --- a/public/form_modules/forms/base/config/i18n/english.js +++ b/public/form_modules/forms/base/config/i18n/english.js @@ -34,6 +34,9 @@ angular.module('view-form').config(['$translateProvider', function ($translatePr ADD_NEW_LINE_INSTR: 'Press SHIFT+ENTER to add a newline', ERROR: 'Error', + LOADING_LABEL: 'Loading', + WAIT_LABEL: 'Please wait', + FORM_404_HEADER: '404 - Form Does Not Exist', FORM_404_BODY: 'The form you are trying to access does not exist. Sorry about that!', diff --git a/public/form_modules/forms/base/config/i18n/french.js b/public/form_modules/forms/base/config/i18n/french.js index c544ea1f..a3a3c43b 100644 --- a/public/form_modules/forms/base/config/i18n/french.js +++ b/public/form_modules/forms/base/config/i18n/french.js @@ -33,13 +33,16 @@ angular.module('view-form').config(['$translateProvider', function ($translatePr OPTION_PLACEHOLDER: 'Tapez ou sélectionnez une option', ADD_NEW_LINE_INSTR: 'Appuyez sur MAJ + ENTRÉE pour ajouter une nouvelle ligne', ERROR: 'Erreur', + + LOADING_LABEL: 'Chargement', + WAIT_LABEL: "Veuillez patienter", FORM_404_HEADER: '404 - Le formulaire n\'existe pas', FORM_404_BODY: 'Le formulaire auquel vous essayez d\'accéder n\'existe pas. Désolé pour ça!', FORM_UNAUTHORIZED_HEADER: 'Non autorisé à accéder au formulaire', -   FORM_UNAUTHORIZED_BODY1: 'Le formulaire auquel vous essayez d\'accéder est actuellement privé et inaccessible publiquement.', -   FORM_UNAUTHORIZED_BODY2: 'Si vous êtes le propriétaire du formulaire, vous pouvez le définir sur "Public" dans le panneau "Configuration" du formulaire admin.', +   FORM_UNAUTHORIZED_BODY1: 'Le formulaire auquel vous essayez d\'accéder est actuellement privé et inaccessible publiquement.', +   FORM_UNAUTHORIZED_BODY2: 'Si vous êtes le propriétaire du formulaire, vous pouvez le définir sur "Public" dans le panneau "Configuration" du formulaire admin.', }); }]); diff --git a/public/form_modules/forms/base/config/i18n/german.js b/public/form_modules/forms/base/config/i18n/german.js index df335ce5..f9d53732 100644 --- a/public/form_modules/forms/base/config/i18n/german.js +++ b/public/form_modules/forms/base/config/i18n/german.js @@ -33,13 +33,16 @@ angular.module('view-form').config(['$translateProvider', function ($translatePr OPTION_PLACEHOLDER: 'Geben oder wählen Sie eine Option aus', ADD_NEW_LINE_INSTR: 'Drücken Sie UMSCHALT + EINGABETASTE, um eine neue Zeile hinzuzufügen', ERROR: 'Fehler', + + LOADING_LABEL: 'Laden', + WAIT_LABEL: 'Bitte warten', FORM_404_HEADER: '404 - Formular existiert nicht', FORM_404_BODY: 'Das Formular, auf das Sie zugreifen möchten, existiert nicht. Das tut mir leid!', FORM_UNAUTHORIZED_HEADER: 'Nicht zum Zugriffsformular berechtigt\' ', -   FORM_UNAUTHORIZED_BODY1: 'Das Formular, auf das Sie zugreifen möchten, ist derzeit privat und nicht öffentlich zugänglich.', -   FORM_UNAUTHORIZED_BODY2: 'Wenn Sie der Eigentümer des Formulars sind, können Sie es im Fenster "Konfiguration" im Formular admin auf "Öffentlich" setzen.', +   FORM_UNAUTHORIZED_BODY1: 'Das Formular, auf das Sie zugreifen möchten, ist derzeit privat und nicht öffentlich zugänglich.', +   FORM_UNAUTHORIZED_BODY2: 'Wenn Sie der Eigentümer des Formulars sind, können Sie es im Fenster "Konfiguration" im Formular admin auf "Öffentlich" setzen.', }); }]); diff --git a/public/form_modules/forms/base/config/i18n/italian.js b/public/form_modules/forms/base/config/i18n/italian.js index 62058a2e..20f34143 100644 --- a/public/form_modules/forms/base/config/i18n/italian.js +++ b/public/form_modules/forms/base/config/i18n/italian.js @@ -33,6 +33,9 @@ angular.module('view-form').config(['$translateProvider', function ($translatePr OPTION_PLACEHOLDER: 'Digitare o selezionare un\'opzione', ADD_NEW_LINE_INSTR: 'Premere SHIFT + INVIO per aggiungere una nuova riga', ERROR: 'Errore', + + LOADING_LABEL: 'Caricamento', + WAIT_LABEL: "Attendere prego", FORM_404_HEADER: '404 - Il modulo non esiste', FORM_404_BODY: 'La forma che stai cercando di accedere non esiste. Ci dispiace!', diff --git a/public/form_modules/forms/base/config/i18n/spanish.js b/public/form_modules/forms/base/config/i18n/spanish.js index 86861eb3..90c0b8ca 100644 --- a/public/form_modules/forms/base/config/i18n/spanish.js +++ b/public/form_modules/forms/base/config/i18n/spanish.js @@ -34,6 +34,9 @@ angular.module('view-form').config(['$translateProvider', function ($translatePr ADD_NEW_LINE_INSTR: 'Presione MAYÚS + ENTRAR para agregar una nueva línea', ERROR: 'Error', + LOADING_LABEL: 'Cargando', + WAIT_LABEL: 'Espera', + FORM_404_HEADER: '404 - La forma no existe', FORM_404_BODY: 'El formulario al que intenta acceder no existe. ¡Lo siento por eso!', diff --git a/public/form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html b/public/form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html index 8b065343..dcadc15b 100755 --- a/public/form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html +++ b/public/form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html @@ -46,7 +46,8 @@
@@ -55,7 +56,10 @@ {{ 'COMPLETING_NEEDED' | translate:translateAdvancementData }}
- diff --git a/public/modules/forms/admin/directives/configure-form.client.directive.js b/public/modules/forms/admin/directives/configure-form.client.directive.js index 79bb1755..7c5b6f93 100644 --- a/public/modules/forms/admin/directives/configure-form.client.directive.js +++ b/public/modules/forms/admin/directives/configure-form.client.directive.js @@ -12,7 +12,6 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$sta $rootScope.myform = $scope.myform; $scope.languages = $rootScope.languages; $scope.resetForm = $rootScope.resetForm; - $scope.update = $rootScope.update; Quill.register('modules/placeholder', PlaceholderModule.default(Quill)) $scope.customModules = { @@ -78,6 +77,14 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$sta } }, 500); }); + + $scope.loading = false; + $scope.saveChanges = function(){ + $scope.loading = true; + $rootScope.update(false, $scope.myform, false, false, function(){ + $scope.loading = false; + }); + }; } }; } diff --git a/public/modules/forms/admin/views/directiveViews/form/configure-form.client.view.html b/public/modules/forms/admin/views/directiveViews/form/configure-form.client.view.html index 3da080f9..bae28089 100644 --- a/public/modules/forms/admin/views/directiveViews/form/configure-form.client.view.html +++ b/public/modules/forms/admin/views/directiveViews/form/configure-form.client.view.html @@ -9,7 +9,13 @@
- +
From a3e0e89019d7c4b1cfbd47411c86665cc33797fc Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Mon, 20 Nov 2017 18:57:43 -0800 Subject: [PATCH 02/26] removed unused template property from configureTabs array --- .../forms/admin/directives/configure-form.client.directive.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/public/modules/forms/admin/directives/configure-form.client.directive.js b/public/modules/forms/admin/directives/configure-form.client.directive.js index 7c5b6f93..c5db32cc 100644 --- a/public/modules/forms/admin/directives/configure-form.client.directive.js +++ b/public/modules/forms/admin/directives/configure-form.client.directive.js @@ -38,19 +38,16 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$sta { heading: $translate.instant('GENERAL_TAB'), route: 'viewForm.configure.general', - template: 'modules/forms/admin/views/adminTabs/configureTabs/general.html', active: false }, { heading: $translate.instant('SELF_NOTIFICATIONS_TAB'), route: 'viewForm.configure.self_notifications', - template: 'modules/forms/admin/views/adminTabs/configureTabs/self_notifications.html', active: false }, { heading: $translate.instant('RESPONDENT_NOTIFICATIONS_TAB'), route: 'viewForm.configure.respondent_notifications', - template: 'modules/forms/admin/views/adminTabs/configureTabs/respondent_notifications.html', active: false } ]; From 1c4ce87084bbbe0c37fc1e4b17af2bfe45462a14 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Mon, 20 Nov 2017 19:56:49 -0800 Subject: [PATCH 03/26] removed deprecated properties from mock models --- .../directives/configure-form.client.directive.test.js | 4 ---- .../edit-form-submissions.client.directive.test.js | 1 - .../unit/directives/edit-form.client.directive.test.js | 3 --- .../unit/directives/submit-form.client.directive.test.js | 7 ++----- 4 files changed, 2 insertions(+), 13 deletions(-) diff --git a/public/modules/forms/tests/unit/directives/configure-form.client.directive.test.js b/public/modules/forms/tests/unit/directives/configure-form.client.directive.test.js index 627c38c1..af3e20b5 100644 --- a/public/modules/forms/tests/unit/directives/configure-form.client.directive.test.js +++ b/public/modules/forms/tests/unit/directives/configure-form.client.directive.test.js @@ -26,15 +26,11 @@ {fieldType:'checkbox', title:'nascar', fieldOptions: [], fieldValue: '', required: true, disabled: false, deletePreserved: false, _id: 'ed83b0ce121f17393deafab9'}, {fieldType:'checkbox', title:'hockey', fieldOptions: [], fieldValue: '', required: true, disabled: false, deletePreserved: false, _id: 'ed8317393deab0ce121ffab9'} ], - pdf: {}, - pdfFieldMap: {}, startPage: { showStart: false }, showFooter: false, - isGenerated: false, isLive: false, - autofillPDFs: false, _id: '525a8422f6d0f87f0e407a33' }; diff --git a/public/modules/forms/tests/unit/directives/edit-form-submissions.client.directive.test.js b/public/modules/forms/tests/unit/directives/edit-form-submissions.client.directive.test.js index cf9a89d0..ec3d5076 100644 --- a/public/modules/forms/tests/unit/directives/edit-form-submissions.client.directive.test.js +++ b/public/modules/forms/tests/unit/directives/edit-form-submissions.client.directive.test.js @@ -60,7 +60,6 @@ showEnd: false }, showFooter: false, - isGenerated: false, isLive: false, _id: '525a8422f6d0f87f0e407a33' }; diff --git a/public/modules/forms/tests/unit/directives/edit-form.client.directive.test.js b/public/modules/forms/tests/unit/directives/edit-form.client.directive.test.js index 147c590b..b2c2282a 100644 --- a/public/modules/forms/tests/unit/directives/edit-form.client.directive.test.js +++ b/public/modules/forms/tests/unit/directives/edit-form.client.directive.test.js @@ -26,14 +26,11 @@ {fieldType:'checkbox', title:'nascar', fieldOptions: [], fieldValue: '', required: true, disabled: false, deletePreserved: false, _id: 'ed83b0ce121f17393deafab9'}, {fieldType:'checkbox', title:'hockey', fieldOptions: [], fieldValue: '', required: true, disabled: false, deletePreserved: false, _id: 'ed8317393deab0ce121ffab9'} ], - pdf: {}, - pdfFieldMap: {}, startPage: { showStart: false, buttons: [] }, showFooter: false, - isGenerated: false, isLive: false, _id: '525a8422f6d0f87f0e407a33' }; diff --git a/public/modules/forms/tests/unit/directives/submit-form.client.directive.test.js b/public/modules/forms/tests/unit/directives/submit-form.client.directive.test.js index fb92218f..176b77db 100644 --- a/public/modules/forms/tests/unit/directives/submit-form.client.directive.test.js +++ b/public/modules/forms/tests/unit/directives/submit-form.client.directive.test.js @@ -46,16 +46,13 @@ var MobileDetect = function(userAgentStr){ visible_form_fields: [ {fieldType:'textfield', title:'First Name', fieldOptions: [], fieldValue: '', required: true, disabled: false, deletePreserved: false, _id: 'ed873933b0ce121f1deafab9'}, {fieldType:'checkbox', title:'nascar', fieldOptions: [], fieldValue: '', required: true, disabled: false, deletePreserved: false, _id: 'ed83b0ce121f17393deafab9'}, - {fieldType:'checkbox', title:'hockey', fieldOptions: [], fieldValue: '', required: true, disabled: false, deletePreserved: false, _id: 'ed8317393deab0ce121ffab9'} ], - pdf: {}, - pdfFieldMap: {}, + {fieldType:'checkbox', title:'hockey', fieldOptions: [], fieldValue: '', required: true, disabled: false, deletePreserved: false, _id: 'ed8317393deab0ce121ffab9'} + ], startPage: { showStart: false }, showFooter: false, - isGenerated: false, isLive: false, - autofillPDFs: false, _id: '525a8422f6d0f87f0e407a33' }; From f3f9232c620a2acca85373775ee9653fa50d3e34 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Mon, 20 Nov 2017 19:58:43 -0800 Subject: [PATCH 04/26] removed getUserState from Auth service --- .../admin-form.client.controller.test.js | 3 --- .../users/services/auth.client.service.js | 4 ---- .../authentication.client.controller.test.js | 3 --- .../unit/services/auth.client.service.test.js | 17 +---------------- 4 files changed, 1 insertion(+), 26 deletions(-) diff --git a/public/modules/forms/tests/unit/controllers/admin-form.client.controller.test.js b/public/modules/forms/tests/unit/controllers/admin-form.client.controller.test.js index dd2b532e..86faa40f 100644 --- a/public/modules/forms/tests/unit/controllers/admin-form.client.controller.test.js +++ b/public/modules/forms/tests/unit/controllers/admin-form.client.controller.test.js @@ -138,9 +138,6 @@ }, isAuthenticated: function() { return true; - }, - getUserState: function() { - return true; } }; }); diff --git a/public/modules/users/services/auth.client.service.js b/public/modules/users/services/auth.client.service.js index 4ca7c621..48ea544f 100644 --- a/public/modules/users/services/auth.client.service.js +++ b/public/modules/users/services/auth.client.service.js @@ -47,10 +47,6 @@ angular.module('users').factory('Auth', ['$window', '$q', 'User', return !!this._currentUser && this._currentUser.username; }, - getUserState: function() { - return userState; - }, - login: function(new_user) { userState.isLoggedIn = true; this._currentUser = new_user; diff --git a/public/modules/users/tests/unit/controllers/authentication.client.controller.test.js b/public/modules/users/tests/unit/controllers/authentication.client.controller.test.js index beaa09ca..018ccc8a 100644 --- a/public/modules/users/tests/unit/controllers/authentication.client.controller.test.js +++ b/public/modules/users/tests/unit/controllers/authentication.client.controller.test.js @@ -133,9 +133,6 @@ }, isAuthenticated: function() { return true; - }, - getUserState: function() { - return true; } }; }); diff --git a/public/modules/users/tests/unit/services/auth.client.service.test.js b/public/modules/users/tests/unit/services/auth.client.service.test.js index ea7a0f88..26c2715a 100644 --- a/public/modules/users/tests/unit/services/auth.client.service.test.js +++ b/public/modules/users/tests/unit/services/auth.client.service.test.js @@ -61,23 +61,8 @@ expect($window.user).toEqual(null); expect(Auth.currentUser).toEqual(null); expect(Auth.isAuthenticated()).toBe(false); - expect(Auth.getUserState().isLoggedIn).toBe(false); })); - - it('Auth.getUserState() should fetch current user state', function() { - //Run Service Logic to Test - Auth.login(sampleUser); - var currUserState = Auth.getUserState(); - - expect(currUserState.isLoggedIn).toBe(true); - - //Run Service Logic to Test - Auth.logout(); - currUserState = Auth.getUserState(); - - expect(currUserState.isLoggedIn).toBe(false); - }); - + it('Auth.ensureHasCurrentUser() should fetch most current user if it exists in $window, currentUser or fetch it from /users/me', function() { //Run Service Logic to Test Auth.ensureHasCurrentUser().then(function onSuccess(currUser){ From 00d437ea1e7cb5a6751d2c374141a22cc205aeaf Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Mon, 20 Nov 2017 20:23:25 -0800 Subject: [PATCH 05/26] added 'copied' label after copy button is clicked --- .../modules/forms/admin/config/i18n/english.js | 3 +++ public/modules/forms/admin/config/i18n/french.js | 3 +++ public/modules/forms/admin/config/i18n/german.js | 4 +++- .../modules/forms/admin/config/i18n/italian.js | 4 +++- .../modules/forms/admin/config/i18n/spanish.js | 4 +++- .../directives/share-form.client.directive.js | 8 +++++++- .../views/adminTabs/shareTabs/embed_form.html | 16 ++++++++++++---- .../views/adminTabs/shareTabs/share_form.html | 12 +++++++++--- 8 files changed, 43 insertions(+), 11 deletions(-) diff --git a/public/modules/forms/admin/config/i18n/english.js b/public/modules/forms/admin/config/i18n/english.js index 4e319661..5f9392f2 100644 --- a/public/modules/forms/admin/config/i18n/english.js +++ b/public/modules/forms/admin/config/i18n/english.js @@ -65,6 +65,9 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid VIEW_MY_TELLFORM: 'View my tellform', LIVE: 'Live', PREVIEW: 'Preview', + + //Share Tab + COPIED_LABEL: 'Copied', COPY: 'Copy', COPY_AND_PASTE: 'Copy and Paste this to add your TellForm to your website', CHANGE_WIDTH_AND_HEIGHT: 'Change the width and height values to suit you best', diff --git a/public/modules/forms/admin/config/i18n/french.js b/public/modules/forms/admin/config/i18n/french.js index 02955d77..902973c1 100644 --- a/public/modules/forms/admin/config/i18n/french.js +++ b/public/modules/forms/admin/config/i18n/french.js @@ -65,6 +65,9 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid VIEW_MY_TELLFORM: "Afficher ma forme", LIVE: "Live", PREVIEW: 'Aperçu', + + //Share Tab + COPIED_LABEL: 'Copié', COPY: "Copier", COPY_AND_PASTE: "Copiez et collez ceci pour ajouter votre TellForm à votre site Web", CHANGE_WIDTH_AND_HEIGHT: "Changez les valeurs de largeur et de hauteur pour mieux vous convenir", diff --git a/public/modules/forms/admin/config/i18n/german.js b/public/modules/forms/admin/config/i18n/german.js index 9c6ef36e..6a2f1cf4 100644 --- a/public/modules/forms/admin/config/i18n/german.js +++ b/public/modules/forms/admin/config/i18n/german.js @@ -65,9 +65,11 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid VIEW_MY_TELLFORM: 'Mein tellform anzeigen', LIVE: 'Leben', PREVIEW: 'Vorschau', + + //Share Tab + COPIED_LABEL: 'Kopiert', COPY: 'Kopieren', COPY_AND_PASTE: 'Kopieren und einfügen, um Ihre TellForm auf Ihrer Website hinzuzufügen', - CHANGE_WIDTH_AND_HEIGHT: 'Ändern Sie die Werte für Breite und Höhe, um Ihnen am besten zu entsprechen', POWERED_BY: 'Unterstützt von', TELLFORM_URL: "Ihr TellForm ist dauerhaft unter dieser URL", diff --git a/public/modules/forms/admin/config/i18n/italian.js b/public/modules/forms/admin/config/i18n/italian.js index f7db8665..44553d65 100644 --- a/public/modules/forms/admin/config/i18n/italian.js +++ b/public/modules/forms/admin/config/i18n/italian.js @@ -65,9 +65,11 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid VIEW_MY_TELLFORM: 'Visualizza la mia informazione', LIVE: 'Live', PREVIEW: 'Anteprima', + + // Share Tab + COPIED_LABEL: "Copiato", COPY: 'Copia', COPY_AND_PASTE: 'Copia e incolla questo per aggiungere il tuo TellForm al tuo sito web', - CHANGE_WIDTH_AND_HEIGHT: 'Modifica i valori di larghezza e di altezza per adattarti al meglio', POWERED_BY: 'Offerto da', TELLFORM_URL: 'Il tuo TellForm è permanente in questo URL', diff --git a/public/modules/forms/admin/config/i18n/spanish.js b/public/modules/forms/admin/config/i18n/spanish.js index 1e596dd1..71e9e7e8 100644 --- a/public/modules/forms/admin/config/i18n/spanish.js +++ b/public/modules/forms/admin/config/i18n/spanish.js @@ -65,9 +65,11 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid VIEW_MY_TELLFORM: 'Ver mi tellform', LIVE: 'Online', PREVIEW: 'Vista previa', + + // Share Tab + COPIED_LABEL: 'Copiado', COPY: 'Copiar', COPY_AND_PASTE: 'Copiar y pegar esto para agregar su TellForm a su sitio web', - CHANGE_WIDTH_AND_HEIGHT: 'Cambie los valores de ancho y altura para adaptar el formulario a sus necesidades', POWERED_BY: 'Con la tecnlogía de', TELLFORM_URL: 'Tu TellForm está en esta URL permanente', diff --git a/public/modules/forms/admin/directives/share-form.client.directive.js b/public/modules/forms/admin/directives/share-form.client.directive.js index 0e5bb674..71dcacd3 100644 --- a/public/modules/forms/admin/directives/share-form.client.directive.js +++ b/public/modules/forms/admin/directives/share-form.client.directive.js @@ -11,7 +11,12 @@ angular.module('forms').directive('shareFormDirective', ['$rootScope', '$transla controller: function($scope){ $scope.actualFormURL = $scope.actualformurl; - $scope.fullScreen = ""+ + $scope.isCopied = false; + $scope.onCopySuccess = function(){ + $scope.isCopied = true; + } + + $scope.embedCode = ""+ "
"+ $translate.instant('POWERED_BY')+ "TellForm"+ @@ -32,6 +37,7 @@ angular.module('forms').directive('shareFormDirective', ['$rootScope', '$transla ]; $scope.go = function(tab){ + $scope.isCopied = false; tab.active = true; $state.go(tab.route); }; diff --git a/public/modules/forms/admin/views/adminTabs/shareTabs/embed_form.html b/public/modules/forms/admin/views/adminTabs/shareTabs/embed_form.html index 1efdc1e8..d8b2a7d4 100644 --- a/public/modules/forms/admin/views/adminTabs/shareTabs/embed_form.html +++ b/public/modules/forms/admin/views/adminTabs/shareTabs/embed_form.html @@ -5,15 +5,23 @@
- +
- {{ fullScreen }} + {{ embedCode }}
-
\ No newline at end of file diff --git a/public/modules/forms/admin/views/adminTabs/shareTabs/share_form.html b/public/modules/forms/admin/views/adminTabs/shareTabs/share_form.html index ba71bc97..b43aecc9 100644 --- a/public/modules/forms/admin/views/adminTabs/shareTabs/share_form.html +++ b/public/modules/forms/admin/views/adminTabs/shareTabs/share_form.html @@ -5,13 +5,19 @@
- +
-
\ No newline at end of file From 218d96dc2b0968a42a1897262a19c231daff8445 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Mon, 20 Nov 2017 20:27:14 -0800 Subject: [PATCH 06/26] changed loading to saveInProgress for v-busy button in configure directive --- .../admin/directives/configure-form.client.directive.js | 6 +++--- .../directiveViews/form/configure-form.client.view.html | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/modules/forms/admin/directives/configure-form.client.directive.js b/public/modules/forms/admin/directives/configure-form.client.directive.js index c5db32cc..d57653d6 100644 --- a/public/modules/forms/admin/directives/configure-form.client.directive.js +++ b/public/modules/forms/admin/directives/configure-form.client.directive.js @@ -75,11 +75,11 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$sta }, 500); }); - $scope.loading = false; + $scope.saveInProgress = false; $scope.saveChanges = function(){ - $scope.loading = true; + $scope.saveInProgress = true; $rootScope.update(false, $scope.myform, false, false, function(){ - $scope.loading = false; + $scope.saveInProgress = false; }); }; } diff --git a/public/modules/forms/admin/views/directiveViews/form/configure-form.client.view.html b/public/modules/forms/admin/views/directiveViews/form/configure-form.client.view.html index bae28089..87a2b854 100644 --- a/public/modules/forms/admin/views/directiveViews/form/configure-form.client.view.html +++ b/public/modules/forms/admin/views/directiveViews/form/configure-form.client.view.html @@ -9,7 +9,7 @@
-
From 9c24d15a32bed073826e1f9c8ad823ddc6b17e90 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Mon, 20 Nov 2017 20:30:41 -0800 Subject: [PATCH 08/26] remove empty test case from header.client.controller.test.js --- .../tests/unit/controllers/header.client.controller.test.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/public/modules/core/tests/unit/controllers/header.client.controller.test.js b/public/modules/core/tests/unit/controllers/header.client.controller.test.js index b4693143..9699791a 100755 --- a/public/modules/core/tests/unit/controllers/header.client.controller.test.js +++ b/public/modules/core/tests/unit/controllers/header.client.controller.test.js @@ -47,9 +47,5 @@ $scope: scope }); })); - - it('should expose the authentication service', function() { - //expect(scope.authentication).toBeTruthy(); - }); }); })(); \ No newline at end of file From 75d06037a31298a5bfdf8830bb91d85fc28c01e9 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Mon, 20 Nov 2017 20:54:38 -0800 Subject: [PATCH 09/26] removed formValidity filter from admin js --- .../forms/config/forms.client.config.js | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/public/modules/forms/config/forms.client.config.js b/public/modules/forms/config/forms.client.config.js index a3f3ef7c..dd674c69 100644 --- a/public/modules/forms/config/forms.client.config.js +++ b/public/modules/forms/config/forms.client.config.js @@ -19,32 +19,6 @@ angular.module('forms').run(['Menus', return function(seconds) { return new Date(0).setSeconds(seconds); }; -}]).filter('formValidity', [function(){ - return function(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] !== '$'; - }); - - var fields = formObj.form_fields; - - var valid_count = fields.filter(function(field){ - if(typeof field === 'object' && field.fieldType !== 'statement' && field.fieldType !== 'rating'){ - return !!(field.fieldValue); - } else if(field.fieldType === 'rating'){ - return true; - } - - }).length; - return valid_count - (formObj.form_fields.length - formObj.visible_form_fields.length); - } - return 0; - }; }]).filter('trustSrc', ['$sce', function($sce){ return function(formUrl){ return $sce.trustAsResourceUrl(formUrl); From a165cdc242fefdf8ac7045003dc9da999050d39c Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Mon, 20 Nov 2017 20:58:53 -0800 Subject: [PATCH 10/26] moved privateFields dict to constants.js --- app/controllers/helpers.server.controller.js | 21 ++++++++------------ app/libs/constants.js | 7 +++++++ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/app/controllers/helpers.server.controller.js b/app/controllers/helpers.server.controller.js index f769187f..0f224a3b 100644 --- a/app/controllers/helpers.server.controller.js +++ b/app/controllers/helpers.server.controller.js @@ -1,14 +1,9 @@ 'use strict'; +const constants = require('../libs/constants'); + module.exports = { removeSensitiveModelData: function(type, object){ - var privateFields = { - 'public_form': ['__v', 'analytics.visitors', 'analytics.views', 'analytics.conversionRate', 'analytics.fields', 'lastModified', 'created'], - 'private_form': ['__v'], - 'public_user': ['passwordHash', 'password', 'provider', 'salt', 'lastModified', 'created', 'resetPasswordToken', 'resetPasswordExpires', 'token', 'apiKey', '__v'], - 'private_user': ['passwordHash', 'password', 'provider', 'salt', 'resetPasswordToken', 'resetPasswordExpires', 'token', '__v'] - }; - function removeKeysFromDict(dict, keys){ for(var i=0; i static', From eb658af30d804c4b2835e701777fc96e4a6a376c Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Mon, 20 Nov 2017 21:04:07 -0800 Subject: [PATCH 11/26] got jshint to pass --- .jshintrc | 1 + app/controllers/forms.server.controller.js | 52 +++++++++++----------- app/libs/send-email-notifications.js | 4 +- config/config.js | 2 +- 4 files changed, 31 insertions(+), 28 deletions(-) diff --git a/.jshintrc b/.jshintrc index 94d52d77..73f3a588 100755 --- a/.jshintrc +++ b/.jshintrc @@ -21,6 +21,7 @@ "globals": { // Globals variables. "jasmine": true, "angular": true, + "devel": false, "_": true, "saveAs": true, "ApplicationConfiguration": true, diff --git a/app/controllers/forms.server.controller.js b/app/controllers/forms.server.controller.js index bf984797..143aed0f 100644 --- a/app/controllers/forms.server.controller.js +++ b/app/controllers/forms.server.controller.js @@ -76,7 +76,7 @@ exports.createSubmission = function(req, res) { message: errorHandler.getErrorMessage(err) }); } - var form = req.body + var form = req.body; var formFieldDict = emailNotifications.createFieldDict(form.form_fields); async.waterfall([ @@ -105,7 +105,6 @@ exports.createSubmission = function(req, res) { if (form.respondentNotifications && form.respondentNotifications.enabled && form.respondentNotifications.toField) { form.respondentNotifications.toEmails = formFieldDict[form.respondentNotifications.toField]; - debugger; emailNotifications.send(form.respondentNotifications, formFieldDict, smtpTransport, function(err){ if(err){ return callback({ @@ -158,7 +157,7 @@ exports.getVisitorData = function(req, res) { }, { $facet: { - "deviceStatistics": [ + 'deviceStatistics': [ { $unwind: '$analytics.visitors' }, @@ -188,22 +187,22 @@ exports.getVisitorData = function(req, res) { }, { $group: { - _id: "$deviceType", - total_time: { $sum: "$SubmittedTimeElapsed" }, - responses: { $sum: "$SubmittedResponses" }, + _id: '$deviceType', + total_time: { $sum: '$SubmittedTimeElapsed' }, + responses: { $sum: '$SubmittedResponses' }, visits: { $sum: 1 } } }, { $project: { - total_time: "$total_time", - responses: "$responses", - visits: "$visits", + total_time: '$total_time', + responses: '$responses', + visits: '$visits', average_time: { $cond: [ - { $eq: [ "$responses", 0 ] }, + { $eq: [ '$responses', 0 ] }, 0, - { $divide: ["$total_time", "$responses"] } + { $divide: ['$total_time', '$responses'] } ] }, conversion_rate: { @@ -211,9 +210,9 @@ exports.getVisitorData = function(req, res) { 100, { $cond: [ - { $eq: [ "$visits", 0 ] }, + { $eq: [ '$visits', 0 ] }, 0, - { $divide: ["$responses", "$visits"] } + { $divide: ['$responses', '$visits'] } ] } ] @@ -221,7 +220,7 @@ exports.getVisitorData = function(req, res) { } } ], - "globalStatistics": [ + 'globalStatistics': [ { $unwind: '$analytics.visitors' }, @@ -252,22 +251,22 @@ exports.getVisitorData = function(req, res) { { $group: { _id: null, - total_time: { $sum: "$SubmittedTimeElapsed" }, - responses: { $sum: "$SubmittedResponses" }, + total_time: { $sum: '$SubmittedTimeElapsed' }, + responses: { $sum: '$SubmittedResponses' }, visits: { $sum: 1 } } }, { $project: { _id: 0, - total_time: "$total_time", - responses: "$responses", - visits: "$visits", + total_time: '$total_time', + responses: '$responses', + visits: '$visits', average_time: { $cond: [ - { $eq: [ "$responses", 0 ] }, + { $eq: [ '$responses', 0 ] }, 0, - { $divide: ["$total_time", "$responses"] } + { $divide: ['$total_time', '$responses'] } ] }, conversion_rate: { @@ -275,9 +274,9 @@ exports.getVisitorData = function(req, res) { 100, { $cond: [ - { $eq: [ "$visits", 0 ] }, + { $eq: [ '$visits', 0 ] }, 0, - { $divide: ["$responses", "$visits"] } + { $divide: ['$responses', '$visits'] } ] } ] @@ -483,13 +482,16 @@ exports.list = function(req, res) { }); } - const result_ids = results.map(function(result){ return ''+result._id }); + const result_ids = results.map(function(result){ + return ''+result._id; + }); + var currIndex = -1; for(var i=0; i -1){ forms[i].submissionNum = results[currIndex].responses; } else { diff --git a/app/libs/send-email-notifications.js b/app/libs/send-email-notifications.js index 95a9ccbf..010148a4 100644 --- a/app/libs/send-email-notifications.js +++ b/app/libs/send-email-notifications.js @@ -1,5 +1,5 @@ 'use strict'; -const jsdom = require("jsdom"); +const jsdom = require('jsdom'); var JSDOM = jsdom.JSDOM; module.exports = { @@ -24,7 +24,7 @@ module.exports = { var dom = new JSDOM(''+emailTemplate); Object.keys(emailTemplateVars).forEach(function (key) { - var elem = dom.window.document.querySelector("span.placeholder-tag[data-id='" + key + "']"); + var elem = dom.window.document.querySelector('span.placeholder-tag[data-id=\'' + key + '\']'); if(elem !== null){ elem.outerHTML = emailTemplateVars[key]; } diff --git a/config/config.js b/config/config.js index d304f42b..bc5a4c8e 100755 --- a/config/config.js +++ b/config/config.js @@ -64,7 +64,7 @@ module.exports.removeRootDir = function(files, removeRoot, addRoot) { */ module.exports.getBowerFormJSAssets = function() { if(process.env.NODE_ENV === 'production'){ - return '/static/dist/vendor.min.js' + return '/static/dist/vendor.min.js'; } return this.removeRootDir(minBowerFiles('**/**.js'), 'public/', 'static/'); }; From c7d28d641cbd1a0987f5d07d513db3062cb317b9 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Mon, 20 Nov 2017 21:05:58 -0800 Subject: [PATCH 12/26] removed commented out code in send-email-notifications --- app/libs/send-email-notifications.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/libs/send-email-notifications.js b/app/libs/send-email-notifications.js index 010148a4..8d4fd281 100644 --- a/app/libs/send-email-notifications.js +++ b/app/libs/send-email-notifications.js @@ -30,15 +30,6 @@ module.exports = { } }); - //Removed unused variables - //TODO: Currently querySelectorAll not working in JSDOM - /* - dom.window.document.querySelectorAll("span[data-id]").forEach(function(elem){ - if(elem !== null){ - elem.outerHTML = ''; - } - }) - */ if(onlyText){ return dom.window.document.documentElement.textContent; } From 2c9e931257bb033d1588a748c68bb04db7fdf527 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Mon, 20 Nov 2017 21:07:04 -0800 Subject: [PATCH 13/26] removed unnessecary console.log() statement from passport helpers --- config/passport_helpers.js | 1 - 1 file changed, 1 deletion(-) diff --git a/config/passport_helpers.js b/config/passport_helpers.js index 0543dff3..9d5ce00a 100644 --- a/config/passport_helpers.js +++ b/config/passport_helpers.js @@ -21,7 +21,6 @@ module.exports.isAuthenticatedOrApiKey = function isAuthenticated(req, res, next } if (!user) { - console.log('no user for apikey'); return res.status(401).send(info.message || ''); } From e0ad256904574169e46c598cc3b844a5ffb38a3a Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Mon, 20 Nov 2017 21:11:28 -0800 Subject: [PATCH 14/26] removed setting analytics to empty array after submissions are deleted --- app/controllers/forms.server.controller.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/forms.server.controller.js b/app/controllers/forms.server.controller.js index 143aed0f..02ecb0de 100644 --- a/app/controllers/forms.server.controller.js +++ b/app/controllers/forms.server.controller.js @@ -35,7 +35,6 @@ exports.deleteSubmissions = function(req, res) { return; } - form.analytics.visitors = []; form.save(function(formSaveErr){ if(formSaveErr){ res.status(400).send({ From 632d2b409dec5c27b05a40b71c16e4be5529de83 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Mon, 20 Nov 2017 21:13:55 -0800 Subject: [PATCH 15/26] removed submissions property from form model --- app/controllers/forms.server.controller.js | 13 +-- app/models/form.server.model.js | 125 --------------------- app/models/form_submission.server.model.js | 2 +- 3 files changed, 3 insertions(+), 137 deletions(-) diff --git a/app/controllers/forms.server.controller.js b/app/controllers/forms.server.controller.js index 02ecb0de..7a12250e 100644 --- a/app/controllers/forms.server.controller.js +++ b/app/controllers/forms.server.controller.js @@ -34,17 +34,8 @@ exports.deleteSubmissions = function(req, res) { }); return; } - - form.save(function(formSaveErr){ - if(formSaveErr){ - res.status(400).send({ - message: errorHandler.getErrorMessage(formSaveErr) - }); - return; - } - res.status(200).send('Form submissions successfully deleted'); - - }); + + res.status(200).send('Form submissions successfully deleted'); }); }; diff --git a/app/models/form.server.model.js b/app/models/form.server.model.js index c6fd922b..4aa58f89 100644 --- a/app/models/form.server.model.js +++ b/app/models/form.server.model.js @@ -13,10 +13,6 @@ var mongoose = require('mongoose'), //Mongoose Models var FieldSchema = require('./form_field.server.model.js'); -var FormSubmissionSchema = require('./form_submission.server.model.js'), - FormSubmission = mongoose.model('FormSubmission', FormSubmissionSchema); - - var ButtonSchema = new Schema({ url: { type: String, @@ -97,18 +93,10 @@ var FormSchema = new Schema({ }, visitors: [VisitorDataSchema] }, - form_fields: { type: [FieldSchema], default: [] }, - submissions: { - type: [{ - type: Schema.Types.ObjectId, - ref: 'FormSubmission' - }], - default: [] - }, admin: { type: Schema.Types.ObjectId, ref: 'User', @@ -273,119 +261,6 @@ FormSchema.pre('save', function (next) { next(); }); -/* -FormSchema.pre('save', function (next) { - var that = this; - var _original; - - async.series([ - function(cb) { - that.constructor - .findOne({_id: that._id}).exec(function (err, original) { - if (err) { - return cb(err); - } else if (!original){ - return next(); - } else { - _original = original; - return cb(null); - } - }); - }, - function(cb) { - if(that.form_fields && that.isModified('form_fields') && formFieldsAllHaveIds(that.toObject().form_fields)){ - - var current_form = that.toObject(), - old_form_fields = _original.toObject().form_fields, - new_ids = _.map(_.map(current_form.form_fields, 'globalId'), function(id){ return ''+id;}), - old_ids = _.map(_.map(old_form_fields, 'globalId'), function(id){ return ''+id;}), - deletedIds = getDeletedIndexes(old_ids, new_ids); - - //Check if any form_fileds were deleted - if( deletedIds.length > 0 ){ - - var modifiedSubmissions = []; - - async.forEachOfSeries(deletedIds, - function (deletedIdIndex, key, cb_id) { - - var deleted_id = old_ids[deletedIdIndex]; - //Find FormSubmissions that contain field with _id equal to 'deleted_id' - FormSubmission. - find({ form: that, form_fields: {$elemMatch: {globalId: deleted_id} } }). - exec(function(err, submissions){ - if(err) { - return cb_id(err); - } - - //Preserve fields that have at least one submission - if (submissions.length) { - //Add submissions - modifiedSubmissions.push.apply(modifiedSubmissions, submissions); - } - - return cb_id(null); - }); - }, - function (err) { - if(err){ - console.error(err.message); - return cb(err); - } - - //Iterate through all submissions with modified form_fields - async.forEachOfSeries(modifiedSubmissions, function (submission, key, callback) { - - var submission_form_fields = submission.toObject().form_fields; - var currentform_form_fields = that.toObject().form_fields; - - //Iterate through ids of deleted fields - for (var i = 0; i < deletedIds.length; i++) { - var index = _.findIndex(submission_form_fields, function (field) { - var tmp_id = field.globalId + ''; - return tmp_id === old_ids[deletedIds[i]]; - }); - - var deletedField = submission_form_fields[index]; - - //Hide field if it exists - if (deletedField) { - - //Delete old form_field - submission_form_fields.splice(index, 1); - - deletedField.deletePreserved = true; - - //Move deleted form_field to start - submission_form_fields.unshift(deletedField); - currentform_form_fields.unshift(deletedField); - } - } - submission.form_fields = submission_form_fields; - that.form_fields = currentform_form_fields; - - return callback(null); - }, function (err) { - return cb(err); - }); - }); - } else { - return cb(null); - } - } else { - return cb(null); - } - } - ], - function(err){ - if(err){ - return next(err); - } - next(); - }); -}); -*/ - FormSchema.index({created: 1}); mongoose.model('Form', FormSchema); diff --git a/app/models/form_submission.server.model.js b/app/models/form_submission.server.model.js index 6e77529f..58c2a897 100644 --- a/app/models/form_submission.server.model.js +++ b/app/models/form_submission.server.model.js @@ -101,4 +101,4 @@ FormSubmissionSchema.plugin(timeStampPlugin, { useVirtual: false }); -module.exports = FormSubmissionSchema; +mongoose.model('FormSubmission', FormSubmissionSchema); From 88299a2b276c8fa52f43887e7288104c52564f6c Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Mon, 20 Nov 2017 21:21:32 -0800 Subject: [PATCH 16/26] simplified form_field property deletion logic in form_submission model --- app/controllers/helpers.server.controller.js | 25 +++--- app/libs/constants.js | 85 ++++++++++++-------- app/models/form_submission.server.model.js | 31 ++----- 3 files changed, 69 insertions(+), 72 deletions(-) diff --git a/app/controllers/helpers.server.controller.js b/app/controllers/helpers.server.controller.js index 0f224a3b..bb0c9cd0 100644 --- a/app/controllers/helpers.server.controller.js +++ b/app/controllers/helpers.server.controller.js @@ -3,34 +3,33 @@ const constants = require('../libs/constants'); module.exports = { - removeSensitiveModelData: function(type, object){ - function removeKeysFromDict(dict, keys){ - for(var i=0; i Date: Mon, 20 Nov 2017 21:24:20 -0800 Subject: [PATCH 17/26] added clarifying comment for formatDeviceData --- .../admin/directives/edit-submissions-form.client.directive.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/modules/forms/admin/directives/edit-submissions-form.client.directive.js b/public/modules/forms/admin/directives/edit-submissions-form.client.directive.js index 402f2dd7..6ec81381 100644 --- a/public/modules/forms/admin/directives/edit-submissions-form.client.directive.js +++ b/public/modules/forms/admin/directives/edit-submissions-form.client.directive.js @@ -74,6 +74,8 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope', if(deviceStatData && deviceStatData.length){ for(var i=0; i Date: Tue, 21 Nov 2017 00:05:01 -0800 Subject: [PATCH 18/26] got tests to pass --- app/controllers/helpers.server.controller.js | 2 +- app/libs/constants.js | 2 +- .../controllers/list-forms.client.controller.test.js | 9 ++++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/controllers/helpers.server.controller.js b/app/controllers/helpers.server.controller.js index bb0c9cd0..c25f6682 100644 --- a/app/controllers/helpers.server.controller.js +++ b/app/controllers/helpers.server.controller.js @@ -14,7 +14,7 @@ module.exports = { removeSensitiveModelData: function(type, object){ switch(type){ case 'private_form': - this.this.removeKeysFromDict(object, constants.privateFields[type]); + this.removeKeysFromDict(object, constants.privateFields[type]); if(object.admin){ this.removeKeysFromDict(object.admin, constants.privateFields.private_user); } diff --git a/app/libs/constants.js b/app/libs/constants.js index 3ff00136..9b64918c 100644 --- a/app/libs/constants.js +++ b/app/libs/constants.js @@ -2,7 +2,7 @@ module.exports = { extraneousFormFieldProps: [ - 'validFieldTypes' + 'validFieldTypes', 'disabled', 'required', 'isSubmission', diff --git a/public/modules/forms/tests/unit/controllers/list-forms.client.controller.test.js b/public/modules/forms/tests/unit/controllers/list-forms.client.controller.test.js index 6c7c5931..1ebd19ac 100644 --- a/public/modules/forms/tests/unit/controllers/list-forms.client.controller.test.js +++ b/public/modules/forms/tests/unit/controllers/list-forms.client.controller.test.js @@ -30,7 +30,8 @@ {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false}, {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false} ], - _id: '525a8422f6d0f87f0e407a33' + _id: '525a8422f6d0f87f0e407a33', + submissionNum: 0 },{ title: 'Form Title2', admin: '39223933b1f1dea0ce12fab9', @@ -40,7 +41,8 @@ {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false}, {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false} ], - _id: '52f6d0f87f5a407a384220e3' + _id: '52f6d0f87f5a407a384220e3', + submissionNum: 0 },{ title: 'Form Title3', admin: '2fab9ed873937f0e1dea0ce1', @@ -50,7 +52,8 @@ {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false}, {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false} ], - _id: '922f6d0f87fed8730e4e1233' + _id: '922f6d0f87fed8730e4e1233', + submissionNum: 0 } ]; From 801677bdd76fb85e7638d4995e7afdfb48da9e21 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 21 Nov 2017 07:23:03 -0800 Subject: [PATCH 19/26] fixed angular-ui sorting bug --- .../forms/admin/directives/edit-form.client.directive.js | 3 ++- .../forms/admin/directives/field-icon.client.directive.js | 4 ++-- .../views/directiveViews/form/edit-form.client.view.html | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/public/modules/forms/admin/directives/edit-form.client.directive.js b/public/modules/forms/admin/directives/edit-form.client.directive.js index e9254f81..a330dcf1 100644 --- a/public/modules/forms/admin/directives/edit-form.client.directive.js +++ b/public/modules/forms/admin/directives/edit-form.client.directive.js @@ -25,7 +25,8 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField items: '.sortable-fields', forceHelperSize: true, forcePlaceholderSize: true, - update: function(e, ui) { + stop: function(e, ui) { + debugger; $scope.update(false, $scope.myform, true, false, function(err){ if(err){ console.error(err); diff --git a/public/modules/forms/admin/directives/field-icon.client.directive.js b/public/modules/forms/admin/directives/field-icon.client.directive.js index 967e9ce9..1d219de7 100644 --- a/public/modules/forms/admin/directives/field-icon.client.directive.js +++ b/public/modules/forms/admin/directives/field-icon.client.directive.js @@ -3,10 +3,10 @@ angular.module('forms').directive('fieldIconDirective', function() { return { - template: '', + template: '', restrict: 'E', scope: { - typeName: '@' + typeName: '=' }, controller: function($scope){ $scope.iconTypeMap = { diff --git a/public/modules/forms/admin/views/directiveViews/form/edit-form.client.view.html b/public/modules/forms/admin/views/directiveViews/form/edit-form.client.view.html index e57afef7..119dbf62 100644 --- a/public/modules/forms/admin/views/directiveViews/form/edit-form.client.view.html +++ b/public/modules/forms/admin/views/directiveViews/form/edit-form.client.view.html @@ -492,7 +492,7 @@
- + @@ -533,7 +533,7 @@
- + From fca552475148bb9315e6ebc346048bd9cdcc7eff Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 21 Nov 2017 07:39:00 -0800 Subject: [PATCH 20/26] fixed admin script --- config/env/all.js | 3 ++- config/env/development.js | 3 ++- config/env/production.js | 3 +++ config/env/test.js | 3 ++- config/express.js | 3 ++- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/config/env/all.js b/config/env/all.js index 583f366f..bf0cc22b 100755 --- a/config/env/all.js +++ b/config/env/all.js @@ -11,7 +11,8 @@ module.exports = { uri: process.env.MONGOLAB_URI || process.env.MONGODB_URI || 'mongodb://'+ (process.env.DB_PORT_27017_TCP_ADDR || '127.0.0.1') + '/mean', options: { user: '', - pass: '' + pass: '', + useMongoClient: true } }, diff --git a/config/env/development.js b/config/env/development.js index a44816a7..202ea79a 100755 --- a/config/env/development.js +++ b/config/env/development.js @@ -7,7 +7,8 @@ module.exports = { uri: process.env.MONGODB_URI || 'mongodb://'+( process.env.DB_PORT_27017_TCP_ADDR || '127.0.0.1') +'/mean', options: { user: '', - pass: '' + pass: '', + useMongoClient: true } }, log: { diff --git a/config/env/production.js b/config/env/production.js index 08ebc529..5dfc8ee0 100755 --- a/config/env/production.js +++ b/config/env/production.js @@ -4,6 +4,9 @@ module.exports = { baseUrl: process.env.BASE_URL || process.env.HEROKU_APP_NAME + '.herokuapp.com' || 'tellform.com', db: { uri: process.env.MONGODB_URI || process.env.MONGOHQ_URL || process.env.MONGOLAB_URI || 'mongodb://' + (process.env.DB_PORT_27017_TCP_ADDR || '127.0.0.1') + '/mean', + options: { + useMongoClient: true + } }, port: process.env.PORT || 5000, socketUrl: process.env.SOCKET_URL || 'ws.tellform.com', diff --git a/config/env/test.js b/config/env/test.js index c6731236..fceeb365 100755 --- a/config/env/test.js +++ b/config/env/test.js @@ -6,7 +6,8 @@ module.exports = { uri: 'mongodb://localhost/mean-test', options: { user: '', - pass: '' + pass: '', + useMongoClient: true } }, port: 3001, diff --git a/config/express.js b/config/express.js index d5f21587..febb14c1 100755 --- a/config/express.js +++ b/config/express.js @@ -232,13 +232,14 @@ module.exports = function(db) { // CookieParser should be above session app.use(cookieParser()); + debugger; // Express MongoDB session storage app.use(session({ saveUninitialized: true, resave: true, secret: config.sessionSecret, store: new MongoStore({ - mongooseConnection: db.connection, + mongooseConnection: mongoose.connection, collection: config.sessionCollection }), cookie: config.sessionCookie, From 68858ca1a3af7ab71e4e3448b931726e68231307 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 21 Nov 2017 10:42:07 -0800 Subject: [PATCH 21/26] fixed fieldType constant --- .gitignore | 1 + app/libs/constants.js | 9 +-- app/tests/form.server.model.test.js | 4 +- app/tests/form.server.routes.test.js | 80 +++++++++++++++++-- app/tests/form_submission.routes.test.js | 12 +-- config/env/all.js | 2 - config/env/development.js | 2 - config/env/test.js | 2 - .../admin-form.client.controller.js | 11 --- 9 files changed, 84 insertions(+), 39 deletions(-) diff --git a/.gitignore b/.gitignore index 91df1f8d..bbc3c9f2 100755 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +selenium dist .vagrant npm-debug.* diff --git a/app/libs/constants.js b/app/libs/constants.js index 9b64918c..3688b692 100644 --- a/app/libs/constants.js +++ b/app/libs/constants.js @@ -21,21 +21,14 @@ module.exports = { 'date', 'email', 'legal', - 'url', 'textarea', + 'link', 'statement', - 'welcome', - 'thankyou', - 'file', 'dropdown', - 'scale', 'rating', 'radio', - 'checkbox', 'hidden', 'yes_no', - 'natural', - 'stripe', 'number' ], diff --git a/app/tests/form.server.model.test.js b/app/tests/form.server.model.test.js index 573e631b..849415a5 100644 --- a/app/tests/form.server.model.test.js +++ b/app/tests/form.server.model.test.js @@ -40,8 +40,8 @@ describe('Form Model Unit Tests:', function() { language: 'en', form_fields: [ {'fieldType':'textfield', title:'First Name', 'fieldValue': ''}, - {'fieldType':'checkbox', title:'nascar', 'fieldValue': ''}, - {'fieldType':'checkbox', title:'hockey', 'fieldValue': ''} + {'fieldType':'legal', title:'nascar', 'fieldValue': ''}, + {'fieldType':'legal', title:'hockey', 'fieldValue': ''} ] }); done(); diff --git a/app/tests/form.server.routes.test.js b/app/tests/form.server.routes.test.js index a4c16889..a74e84ba 100644 --- a/app/tests/form.server.routes.test.js +++ b/app/tests/form.server.routes.test.js @@ -24,6 +24,17 @@ var credentials = { password: 'password' }; +var sampleVisitorData = [{ + socketId: 'ntneooe8989eotnoeeo', + referrer: 'http://google.com', + timeElapsed: 89898989, + isSubmitted: true, + language: 'en', + ipAddr: '192.168.1.1', + deviceType: 'desktop', + userAgent: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36' +}] + /** * Form routes tests */ @@ -50,8 +61,8 @@ describe('Form Routes Unit tests', function() { admin: user.id, form_fields: [ new Field({'fieldType':'textfield', 'title':'First Name', 'fieldValue': ''}), - new Field({'fieldType':'checkbox', 'title':'nascar', 'fieldValue': ''}), - new Field({'fieldType':'checkbox', 'title':'hockey', 'fieldValue': ''}) + new Field({'fieldType':'legal', 'title':'nascar', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'hockey', 'fieldValue': ''}) ], isLive: true }; @@ -315,8 +326,8 @@ describe('Form Routes Unit tests', function() { admin: user.id, form_fields: [ new Field({'fieldType':'textfield', 'title':'First Name', 'fieldValue': ''}), - new Field({'fieldType':'checkbox', 'title':'nascar', 'fieldValue': ''}), - new Field({'fieldType':'checkbox', 'title':'hockey', 'fieldValue': ''}) + new Field({'fieldType':'legal', 'title':'nascar', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'hockey', 'fieldValue': ''}) ], isLive: true }; @@ -327,8 +338,8 @@ describe('Form Routes Unit tests', function() { admin: user.id, form_fields: [ new Field({'fieldType':'textfield', 'title':'Last Name', 'fieldValue': ''}), - new Field({'fieldType':'checkbox', 'title':'formula one', 'fieldValue': ''}), - new Field({'fieldType':'checkbox', 'title':'football', 'fieldValue': ''}) + new Field({'fieldType':'legal', 'title':'formula one', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'football', 'fieldValue': ''}) ], isLive: true }; @@ -364,6 +375,63 @@ describe('Form Routes Unit tests', function() { }); }); + it(' > should preserve visitor data when updating a Form', function(done) { + // Create new Form model instance + + var formObject = { + title: 'First Form', + language: 'en', + admin: user.id, + form_fields: [ + new Field({'fieldType':'textfield', 'title':'First Name', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'nascar', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'hockey', 'fieldValue': ''}) + ], + isLive: true, + analytics: { + gaCode: '', + visitors: sampleVisitorData + } + }; + + var formUpdateObject = { + title: 'Second Form', + language: 'en', + admin: user.id, + form_fields: [ + new Field({'fieldType':'textfield', 'title':'Last Name', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'formula one', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'football', 'fieldValue': ''}) + ], + isLive: true + }; + + var CurrentForm = new Form(formObject); + + // Save the Form + CurrentForm.save(function(err, form) { + if(err) return done(err); + + loginSession.post('/forms/' + form._id) + .send(formUpdateObject) + .expect(200) + .end(function(FormSaveErr) { + + should.not.exist(FormSaveErr); + + Form.findById(form._id, function (FormFindErr, UpdatedForm){ + should.not.exist(FormFindErr); + should.exist(UpdatedForm); + + UpdatedForm.toObject().visitors.should.deepEqual(sampleVisitorData); + + done(FormFindErr); + }); + + }); + }); + }); + afterEach('should be able to signout user', function(done){ authenticatedSession.get('/auth/signout') .expect(200) diff --git a/app/tests/form_submission.routes.test.js b/app/tests/form_submission.routes.test.js index 6398828e..17c77ace 100644 --- a/app/tests/form_submission.routes.test.js +++ b/app/tests/form_submission.routes.test.js @@ -54,8 +54,8 @@ describe('Form Submission Routes Unit tests', function() { admin: user._id, form_fields: [ new Field({'fieldType':'textfield', 'title':'First Name', 'fieldValue': ''}), - new Field({'fieldType':'checkbox', 'title':'nascar', 'fieldValue': ''}), - new Field({'fieldType':'checkbox', 'title':'hockey', 'fieldValue': ''}) + new Field({'fieldType':'legal', 'title':'nascar', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'hockey', 'fieldValue': ''}) ], selfNotifications: { fromField: mongoose.Types.ObjectId(), @@ -81,8 +81,8 @@ describe('Form Submission Routes Unit tests', function() { form: form._id, form_fields: [ {'fieldType':'textfield', 'title':'First Name', 'fieldValue': 'David', _id: '', isSubmission: false, deletePreserved: false}, - {'fieldType':'checkbox', 'title':'nascar', 'fieldValue': true, _id: '', isSubmission: false, deletePreserved: true}, - {'fieldType':'checkbox', 'title':'hockey', 'fieldValue': false, _id: '', isSubmission: false, deletePreserved: false} + {'fieldType':'legal', 'title':'nascar', 'fieldValue': true, _id: '', isSubmission: false, deletePreserved: true}, + {'fieldType':'legal', 'title':'hockey', 'fieldValue': false, _id: '', isSubmission: false, deletePreserved: false} ], percentageComplete: 100, timeElapsed: 11.55, @@ -101,8 +101,8 @@ describe('Form Submission Routes Unit tests', function() { _id: form._id, form_fields: [ {'fieldType':'textfield', 'title':'First Name', 'fieldValue': 'David', _id: '', isSubmission: false, deletePreserved: false}, - {'fieldType':'checkbox', 'title':'nascar', 'fieldValue': true, _id: '', isSubmission: false, deletePreserved: true}, - {'fieldType':'checkbox', 'title':'hockey', 'fieldValue': false, _id: '', isSubmission: false, deletePreserved: false} + {'fieldType':'legal', 'title':'nascar', 'fieldValue': true, _id: '', isSubmission: false, deletePreserved: true}, + {'fieldType':'legal', 'title':'hockey', 'fieldValue': false, _id: '', isSubmission: false, deletePreserved: false} ], percentageComplete: 100, timeElapsed: 11.55, diff --git a/config/env/all.js b/config/env/all.js index bf0cc22b..36786173 100755 --- a/config/env/all.js +++ b/config/env/all.js @@ -10,8 +10,6 @@ module.exports = { db: { uri: process.env.MONGOLAB_URI || process.env.MONGODB_URI || 'mongodb://'+ (process.env.DB_PORT_27017_TCP_ADDR || '127.0.0.1') + '/mean', options: { - user: '', - pass: '', useMongoClient: true } }, diff --git a/config/env/development.js b/config/env/development.js index 202ea79a..56e175a5 100755 --- a/config/env/development.js +++ b/config/env/development.js @@ -6,8 +6,6 @@ module.exports = { db: { uri: process.env.MONGODB_URI || 'mongodb://'+( process.env.DB_PORT_27017_TCP_ADDR || '127.0.0.1') +'/mean', options: { - user: '', - pass: '', useMongoClient: true } }, diff --git a/config/env/test.js b/config/env/test.js index fceeb365..433ffa13 100755 --- a/config/env/test.js +++ b/config/env/test.js @@ -5,8 +5,6 @@ module.exports = { db: { uri: 'mongodb://localhost/mean-test', options: { - user: '', - pass: '', useMongoClient: true } }, diff --git a/public/modules/forms/admin/controllers/admin-form.client.controller.js b/public/modules/forms/admin/controllers/admin-form.client.controller.js index adce5ec2..7845eecf 100644 --- a/public/modules/forms/admin/controllers/admin-form.client.controller.js +++ b/public/modules/forms/admin/controllers/admin-form.client.controller.js @@ -207,22 +207,11 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo if(dataToSend.analytics && dataToSend.analytics.visitors){ delete dataToSend.analytics.visitors; } - if(dataToSend.submissions){ - delete dataToSend.submissions; - } if(dataToSend.visible_form_fields){ delete dataToSend.visible_form_fields; } - if(dataToSend.analytics){ - delete dataToSend.analytics.visitors; - delete dataToSend.analytics.fields; - delete dataToSend.analytics.submissions; - delete dataToSend.analytics.views; - delete dataToSend.analytics.conversionRate; - } - delete dataToSend.created; delete dataToSend.lastModified; delete dataToSend.__v; From d8268e4a9b64b2bfc480474582cb5482999bd4e8 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 21 Nov 2017 10:48:11 -0800 Subject: [PATCH 22/26] Added test for preserving visitorData on update and removed debugger statements --- app/libs/constants.js | 16 ++++++++++++++++ app/tests/form.server.routes.test.js | 2 +- config/express.js | 1 - .../directives/edit-form.client.directive.js | 1 - 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app/libs/constants.js b/app/libs/constants.js index 3688b692..f2bb9765 100644 --- a/app/libs/constants.js +++ b/app/libs/constants.js @@ -32,6 +32,22 @@ module.exports = { 'number' ], + ratingShapeTypes: [ + 'Heart', + 'Star', + 'thumbs-up', + 'thumbs-down', + 'Circle', + 'Square', + 'Check Circle', + 'Smile Outlined', + 'Hourglass', + 'bell', + 'Paper Plane', + 'Comment', + 'Trash' + ], + ratingShapeTypes: [ 'Heart', 'Star', diff --git a/app/tests/form.server.routes.test.js b/app/tests/form.server.routes.test.js index a74e84ba..7dbdaf3b 100644 --- a/app/tests/form.server.routes.test.js +++ b/app/tests/form.server.routes.test.js @@ -33,7 +33,7 @@ var sampleVisitorData = [{ ipAddr: '192.168.1.1', deviceType: 'desktop', userAgent: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36' -}] +}]; /** * Form routes tests diff --git a/config/express.js b/config/express.js index febb14c1..87b84bd7 100755 --- a/config/express.js +++ b/config/express.js @@ -232,7 +232,6 @@ module.exports = function(db) { // CookieParser should be above session app.use(cookieParser()); - debugger; // Express MongoDB session storage app.use(session({ saveUninitialized: true, diff --git a/public/modules/forms/admin/directives/edit-form.client.directive.js b/public/modules/forms/admin/directives/edit-form.client.directive.js index a330dcf1..3c4f4f2b 100644 --- a/public/modules/forms/admin/directives/edit-form.client.directive.js +++ b/public/modules/forms/admin/directives/edit-form.client.directive.js @@ -26,7 +26,6 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField forceHelperSize: true, forcePlaceholderSize: true, stop: function(e, ui) { - debugger; $scope.update(false, $scope.myform, true, false, function(err){ if(err){ console.error(err); From fb26fbd4f956ed0d7d172b18fa1c1ba60ee67d42 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 21 Nov 2017 10:54:23 -0800 Subject: [PATCH 23/26] disabled subdomains for server-side tests --- app/tests/form.server.routes.test.js | 4 ++-- config/env/test.js | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/tests/form.server.routes.test.js b/app/tests/form.server.routes.test.js index 7dbdaf3b..495ba38d 100644 --- a/app/tests/form.server.routes.test.js +++ b/app/tests/form.server.routes.test.js @@ -102,7 +102,7 @@ describe('Form Routes Unit tests', function() { FormObj.save(function(err, form) { if(err) return done(err); - userSession.get('/subdomain/' + credentials.username + '/forms/' + form._id + '/render') + userSession.get('/forms/' + form._id + '/render') .expect(200) .end(function(err, res) { if(err) return done(err) @@ -125,7 +125,7 @@ describe('Form Routes Unit tests', function() { FormObj.save(function(err, form) { if(err) return done(err); - userSession.get('/subdomain/' + credentials.username + '/forms/' + form._id + '/render') + userSession.get('/forms/' + form._id + '/render') .expect(401, {message: 'Form is Not Public'}) .end(function(err, res) { done(err); diff --git a/config/env/test.js b/config/env/test.js index 433ffa13..aa5cf81c 100755 --- a/config/env/test.js +++ b/config/env/test.js @@ -18,6 +18,7 @@ module.exports = { //stream: 'access.log' } }, + subdomainsDisabled: true, app: { title: 'TellForm Test' }, From f6546deb59dcd7baf9bb1d8ecc5ed34d06631594 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 21 Nov 2017 11:37:01 -0800 Subject: [PATCH 24/26] removed globalId --- app/controllers/forms.server.controller.js | 18 ++++- app/libs/send-email-notifications.js | 4 +- app/models/form.server.model.js | 24 ------ app/models/form_field.server.model.js | 13 +-- app/tests/form.server.routes.test.js | 79 +++++++++++++++++-- app/tests/form_submission.model.test.js | 74 +---------------- .../libs/send-email-notifications.test.js | 6 +- .../configure-form.client.directive.js | 2 +- .../respondent-notifications.html | 2 +- .../configureTabs/self-notifications.html | 2 +- 10 files changed, 95 insertions(+), 129 deletions(-) diff --git a/app/controllers/forms.server.controller.js b/app/controllers/forms.server.controller.js index 7a12250e..8beb8c3e 100644 --- a/app/controllers/forms.server.controller.js +++ b/app/controllers/forms.server.controller.js @@ -364,8 +364,8 @@ exports.update = function(req, res) { var form = req.form; var updatedForm = req.body.form; - - if(!form.analytics){ + + if(!form.analytics && req.body.form.analytics){ form.analytics = { visitors: [], gaCode: '' @@ -379,9 +379,18 @@ exports.update = function(req, res) { diff.applyChange(form._doc, true, change); }); } else { + if(!updatedForm){ + res.status(400).send({ + message: 'Updated Form is empty' + }); + } - delete updatedForm.__v; + delete updatedForm.lastModified; delete updatedForm.created; + delete updatedForm.id; + delete updatedForm._id; + delete updatedForm.__v; + //Unless we have 'admin' privileges, updating the form's admin is disabled if(updatedForm && req.user.roles.indexOf('admin') === -1) { delete updatedForm.admin; @@ -556,7 +565,8 @@ exports.formByIDFast = function(req, res, next, id) { */ exports.hasAuthorization = function(req, res, next) { var form = req.form; - if (req.form.admin.id !== req.user.id && req.user.roles.indexOf('admin') === -1) { + debugger + if (req.form.admin.id !== req.user.id || req.user.roles.indexOf('admin') > -1) { res.status(403).send({ message: 'User '+req.user.username+' is not authorized to edit Form: '+form.title }); diff --git a/app/libs/send-email-notifications.js b/app/libs/send-email-notifications.js index 8d4fd281..bbbc8548 100644 --- a/app/libs/send-email-notifications.js +++ b/app/libs/send-email-notifications.js @@ -39,8 +39,8 @@ module.exports = { createFieldDict: function(form_fields){ var formFieldDict = {}; form_fields.forEach(function(field){ - if(field.hasOwnProperty('globalId') && field.hasOwnProperty('fieldValue')){ - formFieldDict[field.globalId+''] = field.fieldValue+''; + if(field.hasOwnProperty('fieldValue')){ + formFieldDict[field.id] = String(field.fieldValue); } }); return formFieldDict; diff --git a/app/models/form.server.model.js b/app/models/form.server.model.js index 4aa58f89..3693a93f 100644 --- a/app/models/form.server.model.js +++ b/app/models/form.server.model.js @@ -228,30 +228,6 @@ FormSchema.plugin(timeStampPlugin, { useVirtual: false }); -function getDeletedIndexes(needle, haystack){ - var deletedIndexes = []; - - if(haystack.length > 0){ - for(var i = 0; i < needle.length; i++){ - if(haystack.indexOf(needle[i]) === -1){ - deletedIndexes.push(i); - } - } - } - return deletedIndexes; -} - -function formFieldsAllHaveIds(form_fields){ - if(form_fields){ - for(var i=0; i 0){ error.errors.ratingOptions = new mongoose.Error.ValidatorError({path:'fieldOptions', message: 'fieldOptions are only allowed for type dropdown, checkbox or radio fields.', type: 'notvalid', value: this.ratingOptions}); console.error(error); - return(next(error)); + return next(error); } } return next(); }); -//LogicJump Save -FormFieldSchema.pre('save', function(next) { - if(!this.globalId){ - this.globalId = tokgen(); - } - next(); -}); - //Submission fieldValue correction FormFieldSchema.pre('save', function(next) { if(this.fieldType === 'dropdown' && this.isSubmission){ diff --git a/app/tests/form.server.routes.test.js b/app/tests/form.server.routes.test.js index 495ba38d..fbdd1259 100644 --- a/app/tests/form.server.routes.test.js +++ b/app/tests/form.server.routes.test.js @@ -32,7 +32,8 @@ var sampleVisitorData = [{ language: 'en', ipAddr: '192.168.1.1', deviceType: 'desktop', - userAgent: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36' + userAgent: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36', + filledOutFields: [] }]; /** @@ -412,22 +413,84 @@ describe('Form Routes Unit tests', function() { CurrentForm.save(function(err, form) { if(err) return done(err); - loginSession.post('/forms/' + form._id) - .send(formUpdateObject) + loginSession.put('/forms/' + form.id) + .send({ form: formUpdateObject }) .expect(200) - .end(function(FormSaveErr) { + .end(function(err, res) { - should.not.exist(FormSaveErr); + should.not.exist(err); - Form.findById(form._id, function (FormFindErr, UpdatedForm){ + Form.findById(form.id, function (FormFindErr, UpdatedForm){ should.not.exist(FormFindErr); should.exist(UpdatedForm); - UpdatedForm.toObject().visitors.should.deepEqual(sampleVisitorData); + var updatedFormObj = UpdatedForm.toJSON(); + var oldFormObj = CurrentForm.toJSON(); + + updatedFormObj.analytics.should.deepEqual(oldFormObj.analytics); + + done(FormFindErr); + }); + }); + }); + }); + + it(' > shouldn\'t allow a user to change the id when updating a form', function(done) { + // Create new Form model instance + + var formObject = { + title: 'First Form', + language: 'en', + admin: user.id, + form_fields: [ + new Field({'fieldType':'textfield', 'title':'First Name', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'nascar', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'hockey', 'fieldValue': ''}) + ], + isLive: true + }; + + var formUpdateObject = { + id: mongoose.Types.ObjectId(), + title: 'First Form', + language: 'en', + admin: user.id, + form_fields: [ + new Field({'fieldType':'textfield', 'title':'Last Name', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'formula one', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'football', 'fieldValue': ''}) + ], + isLive: true + }; + + var CurrentForm = new Form(formObject); + + // Save the Form + CurrentForm.save(function(err, InitialForm) { + if(err) return done(err); + + loginSession.put('/forms/' + InitialForm.id) + .send({ form: formUpdateObject }) + .expect(200) + .end(function(err, OldForm) { + console.log(OldForm.body); + + should.not.exist(err); + + Form.findById(InitialForm.id, function (FormFindErr, UpdatedForm){ + should.not.exist(FormFindErr); + should.exist(UpdatedForm); + + var updatedFormObj = UpdatedForm.toJSON(); + var oldFormObj = InitialForm.toJSON(); + + delete oldFormObj.lastModified; + delete updatedFormObj.lastModified; + + updatedFormObj.should.deepEqual(oldFormObj); done(FormFindErr); }); - }); }); }); diff --git a/app/tests/form_submission.model.test.js b/app/tests/form_submission.model.test.js index b857e9a9..219f5d87 100644 --- a/app/tests/form_submission.model.test.js +++ b/app/tests/form_submission.model.test.js @@ -166,7 +166,7 @@ describe('FormSubmission Model Unit Tests:', function() { }); it('should be able to find FormSubmission by $elemMatch on form_fields id', function(done){ - FormSubmission.findOne({ form: myForm._id, form_fields: {$elemMatch: {globalId: myForm.form_fields[0].globalId} } }) + FormSubmission.findOne({ form: myForm.id, form_fields: {$elemMatch: {id: myForm.form_fields[0].id} } }) .exec(function(err, submission){ should.not.exist(err); should.exist(submission); @@ -176,78 +176,6 @@ describe('FormSubmission Model Unit Tests:', function() { }); }); - /* - describe('Test FormField and Submission Logic', function() { - - beforeEach(function(done){ - - //Create Submission - mySubmission = new FormSubmission({ - form_fields: _.merge(sampleSubmission, myForm.form_fields), - admin: user, - form: myForm, - timeElapsed: 17.55 - }); - - mySubmission.save(function(err){ - should.not.exist(err); - done(); - }); - - }); - - it('should preserve deleted form_fields that have submissions without any problems', function(done) { - - var fieldPropertiesToOmit = ['deletePreserved', 'globalId', 'lastModified', 'created', '_id', 'submissionId', 'isSubmission', 'validFieldTypes', 'title']; - var old_fields = myForm.toObject().form_fields; - var new_form_fields = _.clone(myForm.toObject().form_fields); - new_form_fields.splice(0, 1); - - myForm.form_fields = new_form_fields; - - myForm.save(function(err, _form) { - - should.not.exist(err); - should.exist(_form.form_fields); - - var actual_fields = _.deepOmit(_form.toObject().form_fields, fieldPropertiesToOmit); - old_fields = _.deepOmit(old_fields, fieldPropertiesToOmit); - - should.deepEqual(actual_fields, old_fields, 'old form_fields not equal to newly saved form_fields'); - done(); - }); - }); - - it('should delete \'preserved\' form_fields whose submissions have been removed without any problems', function(done) { - - var old_fields = myForm.toObject().form_fields; - old_fields.splice(0,1); - var new_form_fields = _.clone(myForm.toObject().form_fields); - new_form_fields.splice(0, 1); - - myForm.form_fields = new_form_fields; - - myForm.save(function(err, _form){ - should.not.exist(err); - should.exist(_form.form_fields); - should.exist(old_fields); - - var actual_fields = _.deepOmit(_form.toObject().form_fields, ['lastModified', 'created', '_id']); - old_fields = _.deepOmit(old_fields, ['lastModified', 'created', '_id']); - - should.deepEqual(JSON.stringify(actual_fields), JSON.stringify(old_fields)); //'old form_fields not equal to newly saved form_fields'); - done(); - }); - }); - - afterEach(function(done){ - mySubmission.remove(function(){ - done(); - }); - }); - }); - */ - afterEach(function(done) { Form.remove().exec(function() { User.remove().exec(function() { diff --git a/app/tests/libs/send-email-notifications.test.js b/app/tests/libs/send-email-notifications.test.js index 9f9db698..38beb031 100644 --- a/app/tests/libs/send-email-notifications.test.js +++ b/app/tests/libs/send-email-notifications.test.js @@ -14,9 +14,9 @@ const should = require('should'), * Globals */ const validFormFields = [ - {fieldType:'textfield', title:'First Name', fieldValue: 'John Smith', deletePreserved: false, globalId:'56340745f59a6fc9e22028e9'}, - {fieldType:'link', title:'Your Website', fieldValue: 'https://johnsmith.me', deletePreserved: false, globalId:'5c9e22028e907634f45f59a6'}, - {fieldType:'number', title:'Your Age', fieldValue: 45, deletePreserved: false, globalId:'56e90745f5934fc9e22028a6'} + {fieldType:'textfield', title:'First Name', fieldValue: 'John Smith', deletePreserved: false, id:'56340745f59a6fc9e22028e9'}, + {fieldType:'link', title:'Your Website', fieldValue: 'https://johnsmith.me', deletePreserved: false, id:'5c9e22028e907634f45f59a6'}, + {fieldType:'number', title:'Your Age', fieldValue: 45, deletePreserved: false, id:'56e90745f5934fc9e22028a6'} ]; const validFieldDict = { diff --git a/public/modules/forms/admin/directives/configure-form.client.directive.js b/public/modules/forms/admin/directives/configure-form.client.directive.js index d57653d6..e2405ab2 100644 --- a/public/modules/forms/admin/directives/configure-form.client.directive.js +++ b/public/modules/forms/admin/directives/configure-form.client.directive.js @@ -18,7 +18,7 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$sta placeholder: { placeholders: $scope.myform.visible_form_fields.map(function(field){ return { - id: field.globalId, + id: field.id, label: field.title }; }), diff --git a/public/modules/forms/admin/views/adminTabs/configureTabs/respondent-notifications.html b/public/modules/forms/admin/views/adminTabs/configureTabs/respondent-notifications.html index 5c10ca8a..563f147a 100644 --- a/public/modules/forms/admin/views/adminTabs/configureTabs/respondent-notifications.html +++ b/public/modules/forms/admin/views/adminTabs/configureTabs/respondent-notifications.html @@ -36,7 +36,7 @@ {{$select.selected.title}} - + diff --git a/public/modules/forms/admin/views/adminTabs/configureTabs/self-notifications.html b/public/modules/forms/admin/views/adminTabs/configureTabs/self-notifications.html index 77b594ae..570c0334 100644 --- a/public/modules/forms/admin/views/adminTabs/configureTabs/self-notifications.html +++ b/public/modules/forms/admin/views/adminTabs/configureTabs/self-notifications.html @@ -42,7 +42,7 @@ {{$select.selected.title}} - + From 8c1964146f4566d3a50ff8f011640a4acef98855 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 21 Nov 2017 11:37:48 -0800 Subject: [PATCH 25/26] removed newOptionSchema property from FieldSchema --- app/models/form_field.server.model.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/models/form_field.server.model.js b/app/models/form_field.server.model.js index 6293b807..9338a9d7 100644 --- a/app/models/form_field.server.model.js +++ b/app/models/form_field.server.model.js @@ -49,10 +49,6 @@ function BaseFieldSchema(){ Schema.apply(this, arguments); this.add({ - newOptionSchema: { - type: Boolean, - default: false - }, isSubmission: { type: Boolean, default: false From 9d2a548dcae1b2f56f79c2fc19c7d85e99ab00bc Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 21 Nov 2017 11:46:57 -0800 Subject: [PATCH 26/26] Added new form_route tests for update route --- app/libs/send-email-notifications.js | 4 ++-- app/tests/form.server.routes.test.js | 23 +++++++++++++++---- app/tests/form_submission.model.test.js | 2 +- .../libs/send-email-notifications.test.js | 6 ++--- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/app/libs/send-email-notifications.js b/app/libs/send-email-notifications.js index bbbc8548..158882e7 100644 --- a/app/libs/send-email-notifications.js +++ b/app/libs/send-email-notifications.js @@ -39,8 +39,8 @@ module.exports = { createFieldDict: function(form_fields){ var formFieldDict = {}; form_fields.forEach(function(field){ - if(field.hasOwnProperty('fieldValue')){ - formFieldDict[field.id] = String(field.fieldValue); + if(field.hasOwnProperty('fieldValue') && field.hasOwnProperty('_id')){ + formFieldDict[field._id] = String(field.fieldValue); } }); return formFieldDict; diff --git a/app/tests/form.server.routes.test.js b/app/tests/form.server.routes.test.js index fbdd1259..e55e35ea 100644 --- a/app/tests/form.server.routes.test.js +++ b/app/tests/form.server.routes.test.js @@ -10,7 +10,22 @@ var should = require('should'), Form = mongoose.model('Form'), Field = mongoose.model('Field'), FormSubmission = mongoose.model('FormSubmission'), - async = require('async'); + async = require('async'), + _ = require('lodash'); + +function omitDeep(collection, excludeKeys) { + + function omitFn(value) { + + if (value && typeof value === 'object') { + excludeKeys.forEach((key) => { + delete value[key]; + }); + } + } + + return _.cloneDeepWith(collection, omitFn); +} /** * Globals @@ -473,8 +488,6 @@ describe('Form Routes Unit tests', function() { .send({ form: formUpdateObject }) .expect(200) .end(function(err, OldForm) { - console.log(OldForm.body); - should.not.exist(err); Form.findById(InitialForm.id, function (FormFindErr, UpdatedForm){ @@ -484,8 +497,8 @@ describe('Form Routes Unit tests', function() { var updatedFormObj = UpdatedForm.toJSON(); var oldFormObj = InitialForm.toJSON(); - delete oldFormObj.lastModified; - delete updatedFormObj.lastModified; + updatedFormObj = omitDeep('lastModified'); + oldFormObj = omitDeep('lastModified'); updatedFormObj.should.deepEqual(oldFormObj); diff --git a/app/tests/form_submission.model.test.js b/app/tests/form_submission.model.test.js index 219f5d87..36935165 100644 --- a/app/tests/form_submission.model.test.js +++ b/app/tests/form_submission.model.test.js @@ -166,7 +166,7 @@ describe('FormSubmission Model Unit Tests:', function() { }); it('should be able to find FormSubmission by $elemMatch on form_fields id', function(done){ - FormSubmission.findOne({ form: myForm.id, form_fields: {$elemMatch: {id: myForm.form_fields[0].id} } }) + FormSubmission.findOne({ form: myForm.id, form_fields: {$elemMatch: {_id: myForm.form_fields[0]._id} } }) .exec(function(err, submission){ should.not.exist(err); should.exist(submission); diff --git a/app/tests/libs/send-email-notifications.test.js b/app/tests/libs/send-email-notifications.test.js index 38beb031..772328ee 100644 --- a/app/tests/libs/send-email-notifications.test.js +++ b/app/tests/libs/send-email-notifications.test.js @@ -14,9 +14,9 @@ const should = require('should'), * Globals */ const validFormFields = [ - {fieldType:'textfield', title:'First Name', fieldValue: 'John Smith', deletePreserved: false, id:'56340745f59a6fc9e22028e9'}, - {fieldType:'link', title:'Your Website', fieldValue: 'https://johnsmith.me', deletePreserved: false, id:'5c9e22028e907634f45f59a6'}, - {fieldType:'number', title:'Your Age', fieldValue: 45, deletePreserved: false, id:'56e90745f5934fc9e22028a6'} + {fieldType:'textfield', title:'First Name', fieldValue: 'John Smith', deletePreserved: false, _id:'56340745f59a6fc9e22028e9'}, + {fieldType:'link', title:'Your Website', fieldValue: 'https://johnsmith.me', deletePreserved: false, _id:'5c9e22028e907634f45f59a6'}, + {fieldType:'number', title:'Your Age', fieldValue: 45, deletePreserved: false, _id:'56e90745f5934fc9e22028a6'} ]; const validFieldDict = {