From ff9d95267831bdd48832596b892d8430c5a3c987 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 23 Apr 2016 18:51:39 +0300 Subject: [PATCH 01/42] split form code --- .../forms/{ => admin}/controllers/admin-form.client.controller.js | 0 .../forms/{ => admin}/controllers/list-forms.client.controller.js | 0 .../forms/{ => admin}/directives/auto-save.client.directive.js | 0 .../{ => admin}/directives/configure-form.client.directive.js | 0 .../forms/{ => admin}/directives/edit-form.client.directive.js | 0 .../directives/edit-submissions-form.client.directive.js | 0 .../forms/{ => admin}/services/submissions.client.service.js | 0 .../modules/forms/{ => admin}/views/admin-form.client.view.html | 0 public/modules/forms/{ => admin}/views/adminTabs/analyze.html | 0 public/modules/forms/{ => admin}/views/adminTabs/configure.html | 0 public/modules/forms/{ => admin}/views/adminTabs/create.html | 0 public/modules/forms/{ => admin}/views/adminTabs/design.html | 0 .../views/directiveViews/cgBusy/update-form-message-TypeA.html | 0 .../views/directiveViews/cgBusy/update-form-message-TypeB.html | 0 .../views/directiveViews/form/configure-form.client.view.html | 0 .../views/directiveViews/form/edit-form.client.view.html | 0 .../directiveViews/form/edit-submissions-form.client.view.html | 0 .../modules/forms/{ => admin}/views/list-forms.client.view.html | 0 .../forms/{ => base}/controllers/submit-form.client.controller.js | 0 public/modules/forms/{ => base}/css/form.css | 0 .../forms/{ => base}/directives/field-icon.client.directive.js | 0 .../modules/forms/{ => base}/directives/field.client.directive.js | 0 .../forms/{ => base}/directives/on-enter-key.client.directive.js | 0 .../{ => base}/directives/on-finish-render.client.directive.js | 0 .../forms/{ => base}/directives/submit-form.client.directive.js | 0 .../forms/{ => base}/services/current-form.client.service.js | 0 .../forms/{ => base}/services/form-fields.client.service.js | 0 public/modules/forms/{ => base}/services/forms.client.service.js | 0 .../forms/{ => base}/services/time-counter.client.service.js | 0 .../{ => base}/views/directiveViews/entryPage/startPage.html | 0 .../modules/forms/{ => base}/views/directiveViews/field/date.html | 0 .../forms/{ => base}/views/directiveViews/field/dropdown.html | 0 .../forms/{ => base}/views/directiveViews/field/hidden.html | 0 .../forms/{ => base}/views/directiveViews/field/legal.html | 0 .../forms/{ => base}/views/directiveViews/field/radio.html | 0 .../forms/{ => base}/views/directiveViews/field/rating.html | 0 .../forms/{ => base}/views/directiveViews/field/statement.html | 0 .../forms/{ => base}/views/directiveViews/field/textarea.html | 0 .../forms/{ => base}/views/directiveViews/field/textfield.html | 0 .../forms/{ => base}/views/directiveViews/field/yes_no.html | 0 .../views/directiveViews/form/submit-form.client.view.html | 0 .../modules/forms/{ => base}/views/submit-form.client.view.html | 0 42 files changed, 0 insertions(+), 0 deletions(-) rename public/modules/forms/{ => admin}/controllers/admin-form.client.controller.js (100%) rename public/modules/forms/{ => admin}/controllers/list-forms.client.controller.js (100%) rename public/modules/forms/{ => admin}/directives/auto-save.client.directive.js (100%) rename public/modules/forms/{ => admin}/directives/configure-form.client.directive.js (100%) rename public/modules/forms/{ => admin}/directives/edit-form.client.directive.js (100%) rename public/modules/forms/{ => admin}/directives/edit-submissions-form.client.directive.js (100%) rename public/modules/forms/{ => admin}/services/submissions.client.service.js (100%) rename public/modules/forms/{ => admin}/views/admin-form.client.view.html (100%) rename public/modules/forms/{ => admin}/views/adminTabs/analyze.html (100%) rename public/modules/forms/{ => admin}/views/adminTabs/configure.html (100%) rename public/modules/forms/{ => admin}/views/adminTabs/create.html (100%) rename public/modules/forms/{ => admin}/views/adminTabs/design.html (100%) rename public/modules/forms/{ => admin}/views/directiveViews/cgBusy/update-form-message-TypeA.html (100%) rename public/modules/forms/{ => admin}/views/directiveViews/cgBusy/update-form-message-TypeB.html (100%) rename public/modules/forms/{ => admin}/views/directiveViews/form/configure-form.client.view.html (100%) rename public/modules/forms/{ => admin}/views/directiveViews/form/edit-form.client.view.html (100%) rename public/modules/forms/{ => admin}/views/directiveViews/form/edit-submissions-form.client.view.html (100%) rename public/modules/forms/{ => admin}/views/list-forms.client.view.html (100%) rename public/modules/forms/{ => base}/controllers/submit-form.client.controller.js (100%) rename public/modules/forms/{ => base}/css/form.css (100%) rename public/modules/forms/{ => base}/directives/field-icon.client.directive.js (100%) rename public/modules/forms/{ => base}/directives/field.client.directive.js (100%) rename public/modules/forms/{ => base}/directives/on-enter-key.client.directive.js (100%) rename public/modules/forms/{ => base}/directives/on-finish-render.client.directive.js (100%) rename public/modules/forms/{ => base}/directives/submit-form.client.directive.js (100%) rename public/modules/forms/{ => base}/services/current-form.client.service.js (100%) rename public/modules/forms/{ => base}/services/form-fields.client.service.js (100%) rename public/modules/forms/{ => base}/services/forms.client.service.js (100%) rename public/modules/forms/{ => base}/services/time-counter.client.service.js (100%) rename public/modules/forms/{ => base}/views/directiveViews/entryPage/startPage.html (100%) rename public/modules/forms/{ => base}/views/directiveViews/field/date.html (100%) rename public/modules/forms/{ => base}/views/directiveViews/field/dropdown.html (100%) rename public/modules/forms/{ => base}/views/directiveViews/field/hidden.html (100%) rename public/modules/forms/{ => base}/views/directiveViews/field/legal.html (100%) rename public/modules/forms/{ => base}/views/directiveViews/field/radio.html (100%) rename public/modules/forms/{ => base}/views/directiveViews/field/rating.html (100%) rename public/modules/forms/{ => base}/views/directiveViews/field/statement.html (100%) rename public/modules/forms/{ => base}/views/directiveViews/field/textarea.html (100%) rename public/modules/forms/{ => base}/views/directiveViews/field/textfield.html (100%) rename public/modules/forms/{ => base}/views/directiveViews/field/yes_no.html (100%) rename public/modules/forms/{ => base}/views/directiveViews/form/submit-form.client.view.html (100%) rename public/modules/forms/{ => base}/views/submit-form.client.view.html (100%) diff --git a/public/modules/forms/controllers/admin-form.client.controller.js b/public/modules/forms/admin/controllers/admin-form.client.controller.js similarity index 100% rename from public/modules/forms/controllers/admin-form.client.controller.js rename to public/modules/forms/admin/controllers/admin-form.client.controller.js diff --git a/public/modules/forms/controllers/list-forms.client.controller.js b/public/modules/forms/admin/controllers/list-forms.client.controller.js similarity index 100% rename from public/modules/forms/controllers/list-forms.client.controller.js rename to public/modules/forms/admin/controllers/list-forms.client.controller.js diff --git a/public/modules/forms/directives/auto-save.client.directive.js b/public/modules/forms/admin/directives/auto-save.client.directive.js similarity index 100% rename from public/modules/forms/directives/auto-save.client.directive.js rename to public/modules/forms/admin/directives/auto-save.client.directive.js diff --git a/public/modules/forms/directives/configure-form.client.directive.js b/public/modules/forms/admin/directives/configure-form.client.directive.js similarity index 100% rename from public/modules/forms/directives/configure-form.client.directive.js rename to public/modules/forms/admin/directives/configure-form.client.directive.js diff --git a/public/modules/forms/directives/edit-form.client.directive.js b/public/modules/forms/admin/directives/edit-form.client.directive.js similarity index 100% rename from public/modules/forms/directives/edit-form.client.directive.js rename to public/modules/forms/admin/directives/edit-form.client.directive.js diff --git a/public/modules/forms/directives/edit-submissions-form.client.directive.js b/public/modules/forms/admin/directives/edit-submissions-form.client.directive.js similarity index 100% rename from public/modules/forms/directives/edit-submissions-form.client.directive.js rename to public/modules/forms/admin/directives/edit-submissions-form.client.directive.js diff --git a/public/modules/forms/services/submissions.client.service.js b/public/modules/forms/admin/services/submissions.client.service.js similarity index 100% rename from public/modules/forms/services/submissions.client.service.js rename to public/modules/forms/admin/services/submissions.client.service.js diff --git a/public/modules/forms/views/admin-form.client.view.html b/public/modules/forms/admin/views/admin-form.client.view.html similarity index 100% rename from public/modules/forms/views/admin-form.client.view.html rename to public/modules/forms/admin/views/admin-form.client.view.html diff --git a/public/modules/forms/views/adminTabs/analyze.html b/public/modules/forms/admin/views/adminTabs/analyze.html similarity index 100% rename from public/modules/forms/views/adminTabs/analyze.html rename to public/modules/forms/admin/views/adminTabs/analyze.html diff --git a/public/modules/forms/views/adminTabs/configure.html b/public/modules/forms/admin/views/adminTabs/configure.html similarity index 100% rename from public/modules/forms/views/adminTabs/configure.html rename to public/modules/forms/admin/views/adminTabs/configure.html diff --git a/public/modules/forms/views/adminTabs/create.html b/public/modules/forms/admin/views/adminTabs/create.html similarity index 100% rename from public/modules/forms/views/adminTabs/create.html rename to public/modules/forms/admin/views/adminTabs/create.html diff --git a/public/modules/forms/views/adminTabs/design.html b/public/modules/forms/admin/views/adminTabs/design.html similarity index 100% rename from public/modules/forms/views/adminTabs/design.html rename to public/modules/forms/admin/views/adminTabs/design.html diff --git a/public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeA.html b/public/modules/forms/admin/views/directiveViews/cgBusy/update-form-message-TypeA.html similarity index 100% rename from public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeA.html rename to public/modules/forms/admin/views/directiveViews/cgBusy/update-form-message-TypeA.html diff --git a/public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html b/public/modules/forms/admin/views/directiveViews/cgBusy/update-form-message-TypeB.html similarity index 100% rename from public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html rename to public/modules/forms/admin/views/directiveViews/cgBusy/update-form-message-TypeB.html diff --git a/public/modules/forms/views/directiveViews/form/configure-form.client.view.html b/public/modules/forms/admin/views/directiveViews/form/configure-form.client.view.html similarity index 100% rename from public/modules/forms/views/directiveViews/form/configure-form.client.view.html rename to public/modules/forms/admin/views/directiveViews/form/configure-form.client.view.html diff --git a/public/modules/forms/views/directiveViews/form/edit-form.client.view.html b/public/modules/forms/admin/views/directiveViews/form/edit-form.client.view.html similarity index 100% rename from public/modules/forms/views/directiveViews/form/edit-form.client.view.html rename to public/modules/forms/admin/views/directiveViews/form/edit-form.client.view.html diff --git a/public/modules/forms/views/directiveViews/form/edit-submissions-form.client.view.html b/public/modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html similarity index 100% rename from public/modules/forms/views/directiveViews/form/edit-submissions-form.client.view.html rename to public/modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html diff --git a/public/modules/forms/views/list-forms.client.view.html b/public/modules/forms/admin/views/list-forms.client.view.html similarity index 100% rename from public/modules/forms/views/list-forms.client.view.html rename to public/modules/forms/admin/views/list-forms.client.view.html diff --git a/public/modules/forms/controllers/submit-form.client.controller.js b/public/modules/forms/base/controllers/submit-form.client.controller.js similarity index 100% rename from public/modules/forms/controllers/submit-form.client.controller.js rename to public/modules/forms/base/controllers/submit-form.client.controller.js diff --git a/public/modules/forms/css/form.css b/public/modules/forms/base/css/form.css similarity index 100% rename from public/modules/forms/css/form.css rename to public/modules/forms/base/css/form.css diff --git a/public/modules/forms/directives/field-icon.client.directive.js b/public/modules/forms/base/directives/field-icon.client.directive.js similarity index 100% rename from public/modules/forms/directives/field-icon.client.directive.js rename to public/modules/forms/base/directives/field-icon.client.directive.js diff --git a/public/modules/forms/directives/field.client.directive.js b/public/modules/forms/base/directives/field.client.directive.js similarity index 100% rename from public/modules/forms/directives/field.client.directive.js rename to public/modules/forms/base/directives/field.client.directive.js diff --git a/public/modules/forms/directives/on-enter-key.client.directive.js b/public/modules/forms/base/directives/on-enter-key.client.directive.js similarity index 100% rename from public/modules/forms/directives/on-enter-key.client.directive.js rename to public/modules/forms/base/directives/on-enter-key.client.directive.js diff --git a/public/modules/forms/directives/on-finish-render.client.directive.js b/public/modules/forms/base/directives/on-finish-render.client.directive.js similarity index 100% rename from public/modules/forms/directives/on-finish-render.client.directive.js rename to public/modules/forms/base/directives/on-finish-render.client.directive.js diff --git a/public/modules/forms/directives/submit-form.client.directive.js b/public/modules/forms/base/directives/submit-form.client.directive.js similarity index 100% rename from public/modules/forms/directives/submit-form.client.directive.js rename to public/modules/forms/base/directives/submit-form.client.directive.js diff --git a/public/modules/forms/services/current-form.client.service.js b/public/modules/forms/base/services/current-form.client.service.js similarity index 100% rename from public/modules/forms/services/current-form.client.service.js rename to public/modules/forms/base/services/current-form.client.service.js diff --git a/public/modules/forms/services/form-fields.client.service.js b/public/modules/forms/base/services/form-fields.client.service.js similarity index 100% rename from public/modules/forms/services/form-fields.client.service.js rename to public/modules/forms/base/services/form-fields.client.service.js diff --git a/public/modules/forms/services/forms.client.service.js b/public/modules/forms/base/services/forms.client.service.js similarity index 100% rename from public/modules/forms/services/forms.client.service.js rename to public/modules/forms/base/services/forms.client.service.js diff --git a/public/modules/forms/services/time-counter.client.service.js b/public/modules/forms/base/services/time-counter.client.service.js similarity index 100% rename from public/modules/forms/services/time-counter.client.service.js rename to public/modules/forms/base/services/time-counter.client.service.js diff --git a/public/modules/forms/views/directiveViews/entryPage/startPage.html b/public/modules/forms/base/views/directiveViews/entryPage/startPage.html similarity index 100% rename from public/modules/forms/views/directiveViews/entryPage/startPage.html rename to public/modules/forms/base/views/directiveViews/entryPage/startPage.html diff --git a/public/modules/forms/views/directiveViews/field/date.html b/public/modules/forms/base/views/directiveViews/field/date.html similarity index 100% rename from public/modules/forms/views/directiveViews/field/date.html rename to public/modules/forms/base/views/directiveViews/field/date.html diff --git a/public/modules/forms/views/directiveViews/field/dropdown.html b/public/modules/forms/base/views/directiveViews/field/dropdown.html similarity index 100% rename from public/modules/forms/views/directiveViews/field/dropdown.html rename to public/modules/forms/base/views/directiveViews/field/dropdown.html diff --git a/public/modules/forms/views/directiveViews/field/hidden.html b/public/modules/forms/base/views/directiveViews/field/hidden.html similarity index 100% rename from public/modules/forms/views/directiveViews/field/hidden.html rename to public/modules/forms/base/views/directiveViews/field/hidden.html diff --git a/public/modules/forms/views/directiveViews/field/legal.html b/public/modules/forms/base/views/directiveViews/field/legal.html similarity index 100% rename from public/modules/forms/views/directiveViews/field/legal.html rename to public/modules/forms/base/views/directiveViews/field/legal.html diff --git a/public/modules/forms/views/directiveViews/field/radio.html b/public/modules/forms/base/views/directiveViews/field/radio.html similarity index 100% rename from public/modules/forms/views/directiveViews/field/radio.html rename to public/modules/forms/base/views/directiveViews/field/radio.html diff --git a/public/modules/forms/views/directiveViews/field/rating.html b/public/modules/forms/base/views/directiveViews/field/rating.html similarity index 100% rename from public/modules/forms/views/directiveViews/field/rating.html rename to public/modules/forms/base/views/directiveViews/field/rating.html diff --git a/public/modules/forms/views/directiveViews/field/statement.html b/public/modules/forms/base/views/directiveViews/field/statement.html similarity index 100% rename from public/modules/forms/views/directiveViews/field/statement.html rename to public/modules/forms/base/views/directiveViews/field/statement.html diff --git a/public/modules/forms/views/directiveViews/field/textarea.html b/public/modules/forms/base/views/directiveViews/field/textarea.html similarity index 100% rename from public/modules/forms/views/directiveViews/field/textarea.html rename to public/modules/forms/base/views/directiveViews/field/textarea.html diff --git a/public/modules/forms/views/directiveViews/field/textfield.html b/public/modules/forms/base/views/directiveViews/field/textfield.html similarity index 100% rename from public/modules/forms/views/directiveViews/field/textfield.html rename to public/modules/forms/base/views/directiveViews/field/textfield.html diff --git a/public/modules/forms/views/directiveViews/field/yes_no.html b/public/modules/forms/base/views/directiveViews/field/yes_no.html similarity index 100% rename from public/modules/forms/views/directiveViews/field/yes_no.html rename to public/modules/forms/base/views/directiveViews/field/yes_no.html diff --git a/public/modules/forms/views/directiveViews/form/submit-form.client.view.html b/public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html similarity index 100% rename from public/modules/forms/views/directiveViews/form/submit-form.client.view.html rename to public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html diff --git a/public/modules/forms/views/submit-form.client.view.html b/public/modules/forms/base/views/submit-form.client.view.html similarity index 100% rename from public/modules/forms/views/submit-form.client.view.html rename to public/modules/forms/base/views/submit-form.client.view.html From dd1aab9f0c9fd6ef51e18d7823b3a4a4e105f36a Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 27 Apr 2016 17:09:04 +0300 Subject: [PATCH 02/42] add form build --- .../forms/base/controllers/submit-form.client.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/modules/forms/base/controllers/submit-form.client.controller.js b/public/modules/forms/base/controllers/submit-form.client.controller.js index 1e321fba..c2919531 100644 --- a/public/modules/forms/base/controllers/submit-form.client.controller.js +++ b/public/modules/forms/base/controllers/submit-form.client.controller.js @@ -21,4 +21,4 @@ angular.module('forms').controller('SubmitFormController', ['$scope', '$rootScop } } -]); \ No newline at end of file +]); From f870d4c1390cfb8f6be32cfcaa41c5adf8286495 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 28 Apr 2016 00:38:56 +0300 Subject: [PATCH 03/42] wip --- public/application.js | 2 ++ .../forms/base/config/forms.client.config.js | 29 +++++++++++++++++++ .../base/directives/field.client.directive.js | 2 +- .../submit-form.client.directive.js | 3 +- .../base/services/forms.client.service.js | 6 ++-- .../forms/config/forms.client.routes.js | 4 +-- 6 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 public/modules/forms/base/config/forms.client.config.js diff --git a/public/application.js b/public/application.js index 5b024e0f..25c2ca36 100755 --- a/public/application.js +++ b/public/application.js @@ -23,6 +23,8 @@ angular.module(ApplicationConfiguration.applicationModuleName).constant('USER_RO normal: 'user', superuser: 'superuser' }); +//form url +angular.module(ApplicationConfiguration.applicationModuleName).constant('FORM_URL', '/forms/:formId'); angular.module(ApplicationConfiguration.applicationModuleName).run(['$rootScope', 'Auth', '$state', '$stateParams', function($rootScope, Auth, $state, $stateParams) { diff --git a/public/modules/forms/base/config/forms.client.config.js b/public/modules/forms/base/config/forms.client.config.js new file mode 100644 index 00000000..b08eebd7 --- /dev/null +++ b/public/modules/forms/base/config/forms.client.config.js @@ -0,0 +1,29 @@ +'use strict'; + +// Configuring the Forms drop-down menus +angular.module('forms').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); + } + + }).length; + return valid_count - (formObj.form_fields.length - formObj.visible_form_fields.length); + } + return 0; + }; +}); diff --git a/public/modules/forms/base/directives/field.client.directive.js b/public/modules/forms/base/directives/field.client.directive.js index b92c5c48..1881e217 100644 --- a/public/modules/forms/base/directives/field.client.directive.js +++ b/public/modules/forms/base/directives/field.client.directive.js @@ -13,7 +13,7 @@ angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$root var getTemplateUrl = function(fieldType) { var type = fieldType; - var templateUrl = 'modules/forms/views/directiveViews/field/'; + var templateUrl = 'modules/forms/base/views/directiveViews/field/'; var supported_fields = [ 'textfield', 'textarea', diff --git a/public/modules/forms/base/directives/submit-form.client.directive.js b/public/modules/forms/base/directives/submit-form.client.directive.js index b9c368e6..12037bcc 100644 --- a/public/modules/forms/base/directives/submit-form.client.directive.js +++ b/public/modules/forms/base/directives/submit-form.client.directive.js @@ -3,8 +3,7 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter', '$filter', '$rootScope', 'Auth', 'SendVisitorData', function ($http, TimeCounter, $filter, $rootScope, Auth, SendVisitorData) { return { - templateUrl: 'modules/forms/views/directiveViews/form/submit-form.client.view.html', - restrict: 'E', + templateUrl: 'modules/forms/base/views/directiveViews/form/submit-form.client.view.html', restrict: 'E', scope: { myform:'=' }, diff --git a/public/modules/forms/base/services/forms.client.service.js b/public/modules/forms/base/services/forms.client.service.js index 3cb4fc94..5c82341a 100644 --- a/public/modules/forms/base/services/forms.client.service.js +++ b/public/modules/forms/base/services/forms.client.service.js @@ -1,9 +1,9 @@ 'use strict'; //Forms service used for communicating with the forms REST endpoints -angular.module('forms').factory('Forms', ['$resource', - function($resource) { - return $resource('/forms/:formId', { +angular.module('forms').factory('Forms', ['$resource', 'FORM_URL', + function($resource, FORM_URL) { + return $resource(FORM_URL, { formId: '@_id' }, { 'query' : { diff --git a/public/modules/forms/config/forms.client.routes.js b/public/modules/forms/config/forms.client.routes.js index 5e5f44c6..a1142d33 100644 --- a/public/modules/forms/config/forms.client.routes.js +++ b/public/modules/forms/config/forms.client.routes.js @@ -8,11 +8,11 @@ angular.module('forms').config(['$stateProvider', $stateProvider. state('listForms', { url: '/forms', - templateUrl: 'modules/forms/views/list-forms.client.view.html' + templateUrl: 'modules/forms/admin/views/list-forms.client.view.html' }). state('submitForm', { url: '/forms/:formId', - templateUrl: 'modules/forms/views/submit-form.client.view.html', + templateUrl: 'modules/forms/base/views/submit-form.client.view.html', data: { hideNav: true }, From 30f702e0bf7d68661606c4edadd1376f21691d26 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 28 Apr 2016 15:58:16 +0300 Subject: [PATCH 04/42] add base build + demo --- public/modules/forms/base/.bowerrc | 4 ++ public/modules/forms/base/.gitignore | 2 + public/modules/forms/base/bower.json | 41 +++++++++++++ public/modules/forms/base/demo/boot.js | 51 ++++++++++++++++ public/modules/forms/base/demo/index.html | 74 +++++++++++++++++++++++ public/modules/forms/base/gruntfile.js | 47 ++++++++++++++ public/modules/forms/base/package.json | 33 ++++++++++ 7 files changed, 252 insertions(+) create mode 100644 public/modules/forms/base/.bowerrc create mode 100644 public/modules/forms/base/.gitignore create mode 100755 public/modules/forms/base/bower.json create mode 100644 public/modules/forms/base/demo/boot.js create mode 100644 public/modules/forms/base/demo/index.html create mode 100644 public/modules/forms/base/gruntfile.js create mode 100644 public/modules/forms/base/package.json diff --git a/public/modules/forms/base/.bowerrc b/public/modules/forms/base/.bowerrc new file mode 100644 index 00000000..dc56168b --- /dev/null +++ b/public/modules/forms/base/.bowerrc @@ -0,0 +1,4 @@ +{ + "directory": "demo/lib", + "analytics": false +} diff --git a/public/modules/forms/base/.gitignore b/public/modules/forms/base/.gitignore new file mode 100644 index 00000000..1b246098 --- /dev/null +++ b/public/modules/forms/base/.gitignore @@ -0,0 +1,2 @@ +dist +demo/lib diff --git a/public/modules/forms/base/bower.json b/public/modules/forms/base/bower.json new file mode 100755 index 00000000..f7fdb071 --- /dev/null +++ b/public/modules/forms/base/bower.json @@ -0,0 +1,41 @@ +{ + "name": "tellform Form UI", + "description": "Opensource alternative to TypeForm", + "version": "1.2.1", + "homepage": "https://github.com/whitef0x0/tellform", + "authors": [ + "David Baldwynn (http://baldwynn.me)", + "Samuel Laulhau (https://samuellaulhau.fr)" + ], + "license": "MIT", + "dependencies": { + "bootstrap": "~3", + "angular": "~1.4.7", + "angular-resource": "~1.4.7", + "angular-bootstrap": "~1.3.2", + "angular-ui-utils": "~3.0.0", + "ng-file-upload": "~10.0.2", + "angular-ui-date": "~0.0.8", + "lodash": "~3.10.0", + "angular-input-stars": "*", + "file-saver.js": "~1.20150507.2", + "angular-scroll": "^1.0.0", + "ui-select": "angular-ui-select#^0.16.1", + "angular-sanitize": "^1.5.3", + "v-button": "^1.1.1", + "angular-busy": "^4.1.3", + "font-awesome": "~4.6.1", + "components-font-awesome": "~4.6.1", + "angular-strap": "~2.3.8", + "restangular": "~1.5.2" + }, + "resolutions": { + "angular-bootstrap": "^0.14.0", + "angular": "1.4.x" + }, + "overrides": { + "BOWER-PACKAGE": { + "main": "**/*.min.js" + } + } +} diff --git a/public/modules/forms/base/demo/boot.js b/public/modules/forms/base/demo/boot.js new file mode 100644 index 00000000..2d6811e8 --- /dev/null +++ b/public/modules/forms/base/demo/boot.js @@ -0,0 +1,51 @@ + +angular.module('NodeForm', [ + 'duScroll', 'ui.select', 'cgBusy', 'ngSanitize', 'vButton', 'ngResource', + 'ui.router', 'ui.bootstrap', 'ui.utils', 'ngRaven' +]); +angular.module('forms', ['ngResource', 'NodeForm.templates']); +angular.module('NodeForm').requires.push('forms'); + +angular.module('forms').factory('Auth', [ + function() { + var service = { + _currentUser: null, + get currentUser(){ + return this._currentUser; + }, + ensureHasCurrentUser: function() { + return null; + }, + isAuthenticated: function() { + return false; + }, + getUserState: function() { + return ''; + }, + login: function() { + }, + logout: function() { + }, + }; + return service; + } +]); +angular.module('forms').factory('$state', [function() { + return { + go: function() {} + }; +}]); +angular.module('forms').factory('myForm', ['Forms', function(Forms) { + var form = window.form; + form.visible_form_fields = _.filter(form.form_fields, function(field){ + return (field.deletePreserved === false); + }); + return form; +}]); +angular.module('forms').constant('FORM_URL', '/form/:formId'); + + +angular.element(document).ready(function() { + //Then init the app + angular.bootstrap(document, ['forms']); +}); diff --git a/public/modules/forms/base/demo/index.html b/public/modules/forms/base/demo/index.html new file mode 100644 index 00000000..6bb63bae --- /dev/null +++ b/public/modules/forms/base/demo/index.html @@ -0,0 +1,74 @@ + + + + + Mes avis + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/modules/forms/base/gruntfile.js b/public/modules/forms/base/gruntfile.js new file mode 100644 index 00000000..2de89827 --- /dev/null +++ b/public/modules/forms/base/gruntfile.js @@ -0,0 +1,47 @@ +'use strict'; + +module.exports = function(grunt) { + require('jit-grunt')(grunt); + + // Project Configuration + grunt.initConfig({ + ngAnnotate: { + production: { + files: { + 'dist/form.js': [ + 'config/**/*.js', 'controllers/**/*.js', + 'directives/**/*.js', 'services/**/*.js', + 'dist/template.js' + ] + } + } + }, + html2js: { + options: { + base: '', + module: 'NodeForm.templates', + singleModule: true, + rename: function (moduleName) { + return 'modules/forms/base/' + moduleName; + } + }, + form: { + src: ['views/**/*.html'], + dest: 'dist/template.js' + } + }, + cssmin: { + combine: { + files: { + 'dist/form.css': 'css/**/*.css' + } + } + }, + }); + + // Making grunt default to force in order not to break the project. + grunt.option('force', true); + + // Default task(s). + grunt.registerTask('default', ['html2js:form', 'ngAnnotate', 'cssmin']); +}; diff --git a/public/modules/forms/base/package.json b/public/modules/forms/base/package.json new file mode 100644 index 00000000..889b300f --- /dev/null +++ b/public/modules/forms/base/package.json @@ -0,0 +1,33 @@ +{ + "name": "angular-tellform", + "description": "Opensource alternative to TypeForm", + "version": "1.3.0", + "homepage": "https://github.com/whitef0x0/tellform", + "authors": [ + "David Baldwynn (http://baldwynn.me)", + "Samuel Laulhau (https://samuellaulhau.fr)" + ], + "private": true, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/tellform/angular-tellform.git" + }, + "engines": { + "node": "~5.0.0", + "npm": "~2.11.2" + }, + "scripts": { + "postinstall": "node node_modules/.bin/bower install --config.interactive=false; node node_modules/.bin/grunt build" + }, + "dependencies": { + "bower": "~1.6.5", + "grunt": "~0.4.1", + "grunt-cli": "~0.1.13", + "grunt-contrib-cssmin": "~0.14.0", + "grunt-contrib-uglify": "~0.11.0", + "grunt-html2js": "~0.3.5", + "grunt-ng-annotate": "~1.0.1", + "jit-grunt": "^0.10.0" + } +} From c52909e4f2b9edb8605200cece7a23ebbe5970f0 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 28 Apr 2016 16:13:47 +0300 Subject: [PATCH 05/42] add readme --- public/modules/forms/base/README.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 public/modules/forms/base/README.md diff --git a/public/modules/forms/base/README.md b/public/modules/forms/base/README.md new file mode 100644 index 00000000..3bb9f1b5 --- /dev/null +++ b/public/modules/forms/base/README.md @@ -0,0 +1,6 @@ +This is a readonly split of the tellform project. +This repository contain the form ui as a standalone component. + +To see it in action clone this repos, run `npm install` and open the file `demo/index.html`. + +This is a largely work in progress, use it at your own risk. From df7da6843bcdb12a43bef147493006c387d68266 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 28 Apr 2016 16:14:08 +0300 Subject: [PATCH 06/42] demo title --- public/modules/forms/base/demo/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/modules/forms/base/demo/index.html b/public/modules/forms/base/demo/index.html index 6bb63bae..d94659ce 100644 --- a/public/modules/forms/base/demo/index.html +++ b/public/modules/forms/base/demo/index.html @@ -2,7 +2,7 @@ - Mes avis + tellform demo From 760c25e528298f83f2c50815cf6d50a6be63c78d Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 28 Apr 2016 16:27:14 +0300 Subject: [PATCH 07/42] add license --- public/modules/forms/base/LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 public/modules/forms/base/LICENSE diff --git a/public/modules/forms/base/LICENSE b/public/modules/forms/base/LICENSE new file mode 100644 index 00000000..5bbaddbd --- /dev/null +++ b/public/modules/forms/base/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 tellform + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 1af24d096f37ac67163c76241666d9e423ae7a84 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 28 Apr 2016 16:27:40 +0300 Subject: [PATCH 08/42] ignore node_modules --- public/modules/forms/base/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/public/modules/forms/base/.gitignore b/public/modules/forms/base/.gitignore index 1b246098..6b667241 100644 --- a/public/modules/forms/base/.gitignore +++ b/public/modules/forms/base/.gitignore @@ -1,2 +1,3 @@ dist demo/lib +node_modules From 431c76ee2dcb6a6b1e1314b33e195391ba5d414c Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 28 Apr 2016 16:29:02 +0300 Subject: [PATCH 09/42] add presentation to readme --- public/modules/forms/base/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/public/modules/forms/base/README.md b/public/modules/forms/base/README.md index 3bb9f1b5..b01f16e1 100644 --- a/public/modules/forms/base/README.md +++ b/public/modules/forms/base/README.md @@ -1,6 +1,12 @@ +# angular-tellform +Tellform Angular Form UI Module + +##About +This module gives you the standalone front-end of tellform. It handles form rendering and form ui. For you to use this module you must have an API endpoint, such as (Formkeep)[https://formkeep.com]. + This is a readonly split of the tellform project. -This repository contain the form ui as a standalone component. To see it in action clone this repos, run `npm install` and open the file `demo/index.html`. +##Disclaimer This is a largely work in progress, use it at your own risk. From d5c6fc959bb45c49c97928811f368b2ecf6efac7 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 30 Apr 2016 13:19:58 +0300 Subject: [PATCH 10/42] reorder dependencies --- public/modules/forms/base/demo/boot.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/modules/forms/base/demo/boot.js b/public/modules/forms/base/demo/boot.js index 2d6811e8..7f9c368f 100644 --- a/public/modules/forms/base/demo/boot.js +++ b/public/modules/forms/base/demo/boot.js @@ -1,10 +1,10 @@ +angular.module('forms', ['duScroll', 'ngResource', 'NodeForm.templates']); + angular.module('NodeForm', [ - 'duScroll', 'ui.select', 'cgBusy', 'ngSanitize', 'vButton', 'ngResource', - 'ui.router', 'ui.bootstrap', 'ui.utils', 'ngRaven' + 'ui.select', 'cgBusy', 'ngSanitize', 'vButton', 'ngResource', + 'ui.router', 'ui.bootstrap', 'ui.utils', 'ngRaven', 'forms' ]); -angular.module('forms', ['ngResource', 'NodeForm.templates']); -angular.module('NodeForm').requires.push('forms'); angular.module('forms').factory('Auth', [ function() { From a1d65447e07d22e764ed751b748e9dbc70e0ad2c Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 1 May 2016 12:03:55 +0300 Subject: [PATCH 11/42] exclude form gruntfile from build --- gruntfile.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/gruntfile.js b/gruntfile.js index 11f3d26c..3acdb21a 100755 --- a/gruntfile.js +++ b/gruntfile.js @@ -10,7 +10,7 @@ module.exports = function(grunt) { serverViews: ['app/views/**/*.*'], serverJS: ['gruntfile.js', 'server.js', 'config/**/*.js', 'app/**/*.js', '!app/tests/'], clientViews: ['public/modules/**/views/**/*.html'], - clientJS: ['public/js/*.js', 'public/modules/**/*.js'], + clientJS: ['public/js/*.js', 'public/modules/**/*.js', '!public/modules/**/gruntfile.js'], clientCSS: ['public/modules/**/*.css'], serverTests: ['app/tests/**/*.js'], clientTests: ['public/modules/**/tests/*.js'], @@ -95,7 +95,7 @@ module.exports = function(grunt) { files: { 'public/dist/application.min.js': 'public/dist/application.js' } - } + } }, cssmin: { combine: { @@ -125,27 +125,27 @@ module.exports = function(grunt) { 'stack-trace-limit': 50, 'hidden': [] } - } + } }, ngAnnotate: { production: { files: { 'public/dist/application.js': '<%= applicationJavaScriptFiles %>' - } - } - }, + } + } + }, concurrent: { default: ['nodemon', 'watch'], debug: ['nodemon', 'watch', 'node-inspector'], - options: { + options: { logConcurrentOutput: true, - limit: 10 - } + limit: 10 + } }, env: { test: { NODE_ENV: 'test', - src: '.env' + src: '.env' }, secure: { NODE_ENV: 'secure', From abe605590a26d096c068af1ab37d1a026e627e15 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 1 May 2016 12:04:44 +0300 Subject: [PATCH 12/42] colorpicker tmp hack --- public/modules/forms/forms.client.module.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/modules/forms/forms.client.module.js b/public/modules/forms/forms.client.module.js index e8c72d95..c0cfddb8 100644 --- a/public/modules/forms/forms.client.module.js +++ b/public/modules/forms/forms.client.module.js @@ -1,4 +1,4 @@ 'use strict'; // Use Application configuration module to register a new module -ApplicationConfiguration.registerModule('forms', ['ngFileUpload', 'ui.router.tabs', 'colorpicker.module', 'ui.date', 'ui.sortable', 'angular-input-stars', 'users']); \ No newline at end of file +ApplicationConfiguration.registerModule('forms', ['ngFileUpload', 'ui.router.tabs', 'ui.date', 'ui.sortable', 'angular-input-stars', 'users']);//, 'colorpicker.module' @TODO reactivate this module From 013a560da631af0cf5586afce78b062f13c269be Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 3 May 2016 11:04:10 +0300 Subject: [PATCH 13/42] =?UTF-8?q?exclude=20form=E2=80=99s=20demo,=20lib=20?= =?UTF-8?q?and=20dist=20from=20general=20build?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gruntfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gruntfile.js b/gruntfile.js index 3acdb21a..fdf35e2a 100755 --- a/gruntfile.js +++ b/gruntfile.js @@ -10,7 +10,7 @@ module.exports = function(grunt) { serverViews: ['app/views/**/*.*'], serverJS: ['gruntfile.js', 'server.js', 'config/**/*.js', 'app/**/*.js', '!app/tests/'], clientViews: ['public/modules/**/views/**/*.html'], - clientJS: ['public/js/*.js', 'public/modules/**/*.js', '!public/modules/**/gruntfile.js'], + clientJS: ['public/js/*.js', 'public/modules/**/*.js', '!public/modules/**/gruntfile.js', '!public/modules/**/demo/**/*.js', '!public/modules/**/dist/**/*.js', '!public/modules/**/lib/**/*.js'], clientCSS: ['public/modules/**/*.css'], serverTests: ['app/tests/**/*.js'], clientTests: ['public/modules/**/tests/*.js'], From df10d8e3fe9b17eb9b620a4261a8efd1126d780e Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 5 May 2016 13:00:24 +0300 Subject: [PATCH 14/42] export supportedFields in injector --- config/express.js | 1 + docker-compose.yml | 2 ++ .../forms/base/config/forms.client.config.js | 16 ++++++++++++++ .../base/directives/field.client.directive.js | 22 ++++--------------- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/config/express.js b/config/express.js index dfe88bf9..a167474a 100755 --- a/config/express.js +++ b/config/express.js @@ -127,6 +127,7 @@ module.exports = function(db) { app.use(cookieParser()); // Express MongoDB session storage + app.use(session({ saveUninitialized: true, resave: true, diff --git a/docker-compose.yml b/docker-compose.yml index ce08992e..a2fc97bb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,12 +7,14 @@ services: build: . volumes: - .:/usr/src/app + command: node server.js ports: - "3000:3000" - "35729:35729" environment: DB_1_PORT_27017_TCP_ADDR: db PORT: 3000 + BASE_URL: http://192.168.99.100:3000/ links: - db volumes: diff --git a/public/modules/forms/base/config/forms.client.config.js b/public/modules/forms/base/config/forms.client.config.js index b08eebd7..8bd182e9 100644 --- a/public/modules/forms/base/config/forms.client.config.js +++ b/public/modules/forms/base/config/forms.client.config.js @@ -27,3 +27,19 @@ function(){ return 0; }; }); + +angular.module('forms').value('supportedFields', [ + 'textfield', + 'textarea', + 'date', + 'dropdown', + 'hidden', + 'password', + 'radio', + 'legal', + 'statement', + 'rating', + 'yes_no', + 'number', + 'natural' +]); diff --git a/public/modules/forms/base/directives/field.client.directive.js b/public/modules/forms/base/directives/field.client.directive.js index 1881e217..5d10b613 100644 --- a/public/modules/forms/base/directives/field.client.directive.js +++ b/public/modules/forms/base/directives/field.client.directive.js @@ -8,28 +8,14 @@ var __indexOf = [].indexOf || function(item) { return -1; }; -angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$rootScope', '$templateCache', - function($http, $compile, $rootScope, $templateCache) { +angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$rootScope', '$templateCache', 'supportedFields', + function($http, $compile, $rootScope, $templateCache, supportedFields) { var getTemplateUrl = function(fieldType) { var type = fieldType; var templateUrl = 'modules/forms/base/views/directiveViews/field/'; - var supported_fields = [ - 'textfield', - 'textarea', - 'date', - 'dropdown', - 'hidden', - 'password', - 'radio', - 'legal', - 'statement', - 'rating', - 'yes_no', - 'number', - 'natural' - ]; - if (__indexOf.call(supported_fields, type) >= 0) { + + if (__indexOf.call(supportedFields, type) >= 0) { templateUrl = templateUrl+type+'.html'; } return $templateCache.get('../public/'+templateUrl); From 0266dd119b78b92ae5b2bd24d8f8ab1e616362be Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 5 May 2016 16:00:58 +0300 Subject: [PATCH 15/42] translate app + add french translation --- .../forms/base/config/forms.client.config.js | 4 +-- .../modules/forms/base/config/i18n/english.js | 32 +++++++++++++++++++ .../modules/forms/base/config/i18n/french.js | 27 ++++++++++++++++ .../submit-form.client.controller.js | 8 +++-- public/modules/forms/base/demo/boot.js | 2 +- public/modules/forms/base/demo/index.html | 30 ++++++++++++++++- .../base/directives/field.client.directive.js | 2 +- .../submit-form.client.directive.js | 12 ++++++- .../directiveViews/entryPage/startPage.html | 6 ++-- .../base/views/directiveViews/field/date.html | 4 +-- .../views/directiveViews/field/dropdown.html | 6 ++-- .../views/directiveViews/field/legal.html | 18 +++++------ .../views/directiveViews/field/radio.html | 8 ++--- .../views/directiveViews/field/rating.html | 2 +- .../views/directiveViews/field/statement.html | 4 +-- .../views/directiveViews/field/textarea.html | 4 +-- .../views/directiveViews/field/textfield.html | 26 +++++++-------- .../views/directiveViews/field/yes_no.html | 29 ++++++++++------- .../form/submit-form.client.view.html | 27 ++++++++-------- 19 files changed, 179 insertions(+), 72 deletions(-) create mode 100644 public/modules/forms/base/config/i18n/english.js create mode 100644 public/modules/forms/base/config/i18n/french.js diff --git a/public/modules/forms/base/config/forms.client.config.js b/public/modules/forms/base/config/forms.client.config.js index 8bd182e9..6b04a479 100644 --- a/public/modules/forms/base/config/forms.client.config.js +++ b/public/modules/forms/base/config/forms.client.config.js @@ -1,8 +1,8 @@ 'use strict'; // Configuring the Forms drop-down menus -angular.module('forms').filter('formValidity', -function(){ +angular.module('forms') +.filter('formValidity', function(){ return function(formObj){ if(formObj && formObj.form_fields && formObj.visible_form_fields){ diff --git a/public/modules/forms/base/config/i18n/english.js b/public/modules/forms/base/config/i18n/english.js new file mode 100644 index 00000000..d5a9c7c1 --- /dev/null +++ b/public/modules/forms/base/config/i18n/english.js @@ -0,0 +1,32 @@ +'use strict'; + +angular.module('forms').config(['$translateProvider', function ($translateProvider) { + + $translateProvider.translations('english', { + FORM_SUCCESS: 'Form entry successfully submitted!', + BACK_TO_FORM: 'Go back to Form', + EDIT_FORM: 'Edit this TellForm', + CREATE_FORM: 'Create this TellForm', + ADVANCEMENT: '{{done}} out of {{total}} answered', + CONTINUE_FORM: 'Continue to Form', + REQUIRED: 'required', + OPTIONAL: 'optional', + ERROR_EMAIL_INVALID: 'Please enter a valid email address', + ERROR_NOT_A_NUMBER: 'Please enter valid numbers only', + ERROR_URL_INVALID: 'Please a valid url', + OK: 'OK', + ENTER: 'press ENTER', + CONTINUE: 'Continue', + LEGAL_ACCEPT: 'I accept', + LEGAL_NO_ACCEPT: 'I don’t accept', + DELETE: 'Delete', + CANCEL: 'Cancel', + UPLOAD_FILE: 'Upload your File' + + }); + + $translateProvider.preferredLanguage('english') + .fallbackLanguage('english') + .useSanitizeValueStrategy('escape'); + +}]); diff --git a/public/modules/forms/base/config/i18n/french.js b/public/modules/forms/base/config/i18n/french.js new file mode 100644 index 00000000..3a346b8c --- /dev/null +++ b/public/modules/forms/base/config/i18n/french.js @@ -0,0 +1,27 @@ +'use strict'; + +angular.module('forms').config(['$translateProvider', function ($translateProvider) { + + $translateProvider.translations('french', { + FORM_SUCCESS: 'Votre formulaire a été enregistré!', + BACK_TO_FORM: 'Retourner au formulaire', + EDIT_FORM: 'Éditer le Tellform', + CREATE_FORM: 'Créer un TellForm', + ADVANCEMENT: '{{done}} complétés sur {{total}}', + CONTINUE_FORM: 'Aller au formulaire', + REQUIRED: 'obligatoire', + OPTIONAL: 'facultatif', + ERROR_EMAIL_INVALID: 'Merci de rentrer une adresse mail valide', + ERROR_NOT_A_NUMBER: 'Merce de ne rentrer que des nombres', + ERROR_URL_INVALID: 'Merci de rentrer une url valide', + OK: 'OK', + ENTER: 'presser ENTRÉE', + CONTINUE: 'Continuer', + LEGAL_ACCEPT: 'J’accepte', + LEGAL_NO_ACCEPT: 'Jen n’accepte pas', + DELETE: 'Supprimer', + CANCEL: 'Réinitialiser', + UPLOAD_FILE: 'Envoyer des fichier' + }); + +}]); diff --git a/public/modules/forms/base/controllers/submit-form.client.controller.js b/public/modules/forms/base/controllers/submit-form.client.controller.js index c2919531..e15df9e6 100644 --- a/public/modules/forms/base/controllers/submit-form.client.controller.js +++ b/public/modules/forms/base/controllers/submit-form.client.controller.js @@ -1,10 +1,13 @@ 'use strict'; // SubmitForm controller -angular.module('forms').controller('SubmitFormController', ['$scope', '$rootScope', '$state', 'myForm', 'Auth', - function($scope, $rootScope, $state, myForm, Auth) { +angular.module('forms').controller('SubmitFormController', [ + '$scope', '$rootScope', '$state', '$translate', 'myForm', 'Auth', + function($scope, $rootScope, $state, $translate, myForm, Auth) { $scope.authentication = Auth; $scope.myform = myForm; + console.log(myForm); + $translate.use(myForm.language); if(!$scope.myform.isLive){ // Show navbar if form is not public AND user IS loggedin @@ -19,6 +22,5 @@ angular.module('forms').controller('SubmitFormController', ['$scope', '$rootScop }else{ $scope.hideNav = $rootScope.hideNav = true; } - } ]); diff --git a/public/modules/forms/base/demo/boot.js b/public/modules/forms/base/demo/boot.js index 7f9c368f..a889417d 100644 --- a/public/modules/forms/base/demo/boot.js +++ b/public/modules/forms/base/demo/boot.js @@ -1,5 +1,5 @@ -angular.module('forms', ['duScroll', 'ngResource', 'NodeForm.templates']); +angular.module('forms', ['duScroll', 'ngResource', 'NodeForm.templates', 'pascalprecht.translate']); angular.module('NodeForm', [ 'ui.select', 'cgBusy', 'ngSanitize', 'vButton', 'ngResource', diff --git a/public/modules/forms/base/demo/index.html b/public/modules/forms/base/demo/index.html index d94659ce..61083082 100644 --- a/public/modules/forms/base/demo/index.html +++ b/public/modules/forms/base/demo/index.html @@ -39,7 +39,34 @@ @@ -68,6 +95,7 @@ + diff --git a/public/modules/forms/base/directives/field.client.directive.js b/public/modules/forms/base/directives/field.client.directive.js index 5d10b613..6ec0726e 100644 --- a/public/modules/forms/base/directives/field.client.directive.js +++ b/public/modules/forms/base/directives/field.client.directive.js @@ -18,7 +18,7 @@ angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$root if (__indexOf.call(supportedFields, type) >= 0) { templateUrl = templateUrl+type+'.html'; } - return $templateCache.get('../public/'+templateUrl); + return $templateCache.get(templateUrl); }; return { diff --git a/public/modules/forms/base/directives/submit-form.client.directive.js b/public/modules/forms/base/directives/submit-form.client.directive.js index 12037bcc..440fc997 100644 --- a/public/modules/forms/base/directives/submit-form.client.directive.js +++ b/public/modules/forms/base/directives/submit-form.client.directive.js @@ -11,12 +11,17 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' $scope.authentication = $rootScope.authentication; $scope.noscroll = false; $scope.forms = {}; - $scope.form_fields_count = $scope.myform.visible_form_fields.filter(function(field){ + + var form_fields_count = $scope.myform.visible_form_fields.filter(function(field){ if(field.fieldType === 'statement' || field.fieldType === 'rating'){ return false; } return true; }).length; + $scope.translateAdvancementData = { + done: $filter('formValidity')($scope.myform), + total: form_fields_count + }; $scope.reloadForm = function(){ //Reset Form @@ -109,6 +114,11 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' $scope.selected._id = field_id; $scope.selected.index = field_index; + $scope.translateAdvancementData = { + done: $filter('formValidity')($scope.myform), + total: form_fields_count + }; + if(animateScroll){ $scope.noscroll=true; setTimeout(function() { diff --git a/public/modules/forms/base/views/directiveViews/entryPage/startPage.html b/public/modules/forms/base/views/directiveViews/entryPage/startPage.html index 212a9d7e..d13f1715 100644 --- a/public/modules/forms/base/views/directiveViews/entryPage/startPage.html +++ b/public/modules/forms/base/views/directiveViews/entryPage/startPage.html @@ -9,7 +9,7 @@

@@ -18,7 +18,7 @@

\ No newline at end of file +
diff --git a/public/modules/forms/base/views/directiveViews/field/date.html b/public/modules/forms/base/views/directiveViews/field/date.html index 5000ccb9..e7f02391 100755 --- a/public/modules/forms/base/views/directiveViews/field/date.html +++ b/public/modules/forms/base/views/directiveViews/field/date.html @@ -6,8 +6,8 @@ {{index+1}} - {{field.title}} - optional + {{field.title}} + {{ 'OPTIONAL' | translate }}

{{field.description}} diff --git a/public/modules/forms/base/views/directiveViews/field/dropdown.html b/public/modules/forms/base/views/directiveViews/field/dropdown.html index 4908c365..ec5cba2c 100755 --- a/public/modules/forms/base/views/directiveViews/field/dropdown.html +++ b/public/modules/forms/base/views/directiveViews/field/dropdown.html @@ -6,8 +6,8 @@ {{index+1}} - {{field.title}} - optional + {{field.title}} + {{ 'OPTIONAL' | translate }}

{{field.description}} @@ -30,7 +30,7 @@ ng-class="{'active': option.option_value === field.fieldValue }"> - +
diff --git a/public/modules/forms/base/views/directiveViews/field/legal.html b/public/modules/forms/base/views/directiveViews/field/legal.html index edcc53f2..04fff652 100644 --- a/public/modules/forms/base/views/directiveViews/field/legal.html +++ b/public/modules/forms/base/views/directiveViews/field/legal.html @@ -1,14 +1,14 @@


diff --git a/public/modules/forms/base/views/directiveViews/field/radio.html b/public/modules/forms/base/views/directiveViews/field/radio.html index 0aa34660..92c50a7e 100755 --- a/public/modules/forms/base/views/directiveViews/field/radio.html +++ b/public/modules/forms/base/views/directiveViews/field/radio.html @@ -9,7 +9,7 @@ {{field.title}} - optional + {{ 'OPTIONAL' | translate }}

{{field.description}} @@ -28,12 +28,12 @@ type="radio" class="focusOn" ng-focus="setActiveField(field._id, index, true)" value="{{option.option_value}}" - ng-model="field.fieldValue" - ng-model-options="{ debounce: 250 }" + ng-model="field.fieldValue" + ng-model-options="{ debounce: 250 }" ng-required="field.required" ng-disabled="field.disabled" ng-change="$root.nextField()"/> - + diff --git a/public/modules/forms/base/views/directiveViews/field/rating.html b/public/modules/forms/base/views/directiveViews/field/rating.html index c449c482..23a6c0b0 100644 --- a/public/modules/forms/base/views/directiveViews/field/rating.html +++ b/public/modules/forms/base/views/directiveViews/field/rating.html @@ -7,7 +7,7 @@ {{field.title}} - optional + {{ 'OPTIONAL' | translate }}

{{field.description}} diff --git a/public/modules/forms/base/views/directiveViews/field/statement.html b/public/modules/forms/base/views/directiveViews/field/statement.html index 5ca40295..99e8045e 100644 --- a/public/modules/forms/base/views/directiveViews/field/statement.html +++ b/public/modules/forms/base/views/directiveViews/field/statement.html @@ -13,11 +13,11 @@

{{field.description}}


-
diff --git a/public/modules/forms/base/views/directiveViews/field/textarea.html b/public/modules/forms/base/views/directiveViews/field/textarea.html index 7a7d656d..5280d88a 100755 --- a/public/modules/forms/base/views/directiveViews/field/textarea.html +++ b/public/modules/forms/base/views/directiveViews/field/textarea.html @@ -37,11 +37,11 @@ ng-click="$root.nextField()" class="btn col-sm-5 col-xs-5"> - OK + {{ 'OK' | translate }}
- press ENTER + {{ 'ENTER' | translate }}
diff --git a/public/modules/forms/base/views/directiveViews/field/textfield.html b/public/modules/forms/base/views/directiveViews/field/textfield.html index cff51f5c..fc281d65 100755 --- a/public/modules/forms/base/views/directiveViews/field/textfield.html +++ b/public/modules/forms/base/views/directiveViews/field/textfield.html @@ -10,7 +10,7 @@ {{field.title}} - (optional) + ({{ 'OPTIONAL' | translate }}) @@ -19,15 +19,15 @@

-
-
+
diff --git a/public/modules/forms/base/views/directiveViews/field/yes_no.html b/public/modules/forms/base/views/directiveViews/field/yes_no.html index 32b77cf4..244d8d4b 100644 --- a/public/modules/forms/base/views/directiveViews/field/yes_no.html +++ b/public/modules/forms/base/views/directiveViews/field/yes_no.html @@ -10,7 +10,7 @@ {{field.title}} - optional + {{ 'OPTIONAL' | translate }}

@@ -22,35 +22,42 @@

Yes
- +
"); + $templateCache.put("modules/forms/admin/views/list-forms.client.view.html", +>>>>>>> make it work "

Create a new form
Name
Language

Created on
"); +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 $templateCache.put("../public/modules/forms/views/submit-form.client.view.html", "
"); $templateCache.put("../public/modules/forms/views/adminTabs/analyze.html", +======= + $templateCache.put("modules/forms/base/views/submit-form.client.view.html", + "
"); + $templateCache.put("modules/forms/admin/views/adminTabs/analyze.html", +>>>>>>> make it work ""); - $templateCache.put("../public/modules/forms/views/adminTabs/configure.html", + $templateCache.put("modules/forms/admin/views/adminTabs/configure.html", ""); - $templateCache.put("../public/modules/forms/views/adminTabs/create.html", + $templateCache.put("modules/forms/admin/views/adminTabs/create.html", ""); - $templateCache.put("../public/modules/forms/views/adminTabs/design.html", + $templateCache.put("modules/forms/admin/views/adminTabs/design.html", "

Change how your Form Looks

Change how your Form Looks

Background Color
Question Text Color
Answer Text Color
Button Background Color
Button Text Color
"); - $templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeA.html", + $templateCache.put("modules/forms/admin/views/directiveViews/cgBusy/update-form-message-TypeA.html", "
{{$message}}
"); - $templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html", + $templateCache.put("modules/forms/admin/views/directiveViews/cgBusy/update-form-message-TypeB.html", "
{{$message}}
"); +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c $templateCache.put("../public/modules/forms/views/directiveViews/entryPage/startPage.html", "

{{pageData.introTitle}}

{{pageData.introParagraph}}

"); $templateCache.put("../public/modules/forms/views/directiveViews/field/date.html", @@ -75,6 +93,12 @@ angular.module('NodeForm.templates', []).run(['$templateCache', function($templa "

PDF Generation/EMR

PDF Generation/EMR

Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.name}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type


Advanced Settings

Advanced Settings

Form Name
Form Status
Google Analytics Tracking Code
Language
* required
Display Form Footer?
Display Start Page?
"); $templateCache.put("../public/modules/forms/views/directiveViews/form/edit-form.client.view.html", "

Click to Add New Field

Add New Field

Add Field

Start Page

Preview Start Page

    {{myform.startPage.introTitle}}

    {{myform.startPage.introParagraph}}

Edit Start Page


Intro Title:
Intro Paragraph:
{{ 'ENTER' | translate }}
"); + $templateCache.put("modules/forms/base/views/directiveViews/field/textfield.html", + "

{{field.title}} ({{ 'OPTIONAL' | translate }})

{{ 'ENTER' | translate }}
"); + $templateCache.put("modules/forms/base/views/directiveViews/field/yes_no.html", + "

{{field.title}} *({{ REQUIRED | translate }})

{{field.description}}


"); + $templateCache.put("modules/forms/base/views/directiveViews/form/submit-form.client.view.html", + "
press ENTER

{{ 'ADVANCEMENT' | translate:translateAdvancementData }}

"); + $templateCache.put("modules/users/views/authentication/access-denied.client.view.html", + "

You need to be logged in to access this page

Login
"); + $templateCache.put("modules/users/views/authentication/signin.client.view.html", + "

Sign into your account

Error:
  or  Sign up
"); + $templateCache.put("modules/users/views/authentication/signup-success.client.view.html", + "

Signup Successful

You've successfully registered an account at TellForm.

But your account is not activated yet



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

"); + $templateCache.put("modules/users/views/authentication/signup.client.view.html", +>>>>>>> make it work "

Signup with your email

Couldn't submit form due to errors:

"); - $templateCache.put("../public/modules/users/views/password/forgot-password.client.view.html", + $templateCache.put("modules/users/views/password/forgot-password.client.view.html", "

Restore your password

Enter your account email.

{{error}}
{{success}}
"); - $templateCache.put("../public/modules/users/views/password/reset-password-invalid.client.view.html", + $templateCache.put("modules/users/views/password/reset-password-invalid.client.view.html", "

Password reset is invalid

Ask for a new password reset
"); - $templateCache.put("../public/modules/users/views/password/reset-password-success.client.view.html", + $templateCache.put("modules/users/views/password/reset-password-success.client.view.html", "

Password successfully reset

Continue to home page
"); - $templateCache.put("../public/modules/users/views/password/reset-password.client.view.html", + $templateCache.put("modules/users/views/password/reset-password.client.view.html", "

Reset your password

{{error}}
{{success}}
"); - $templateCache.put("../public/modules/users/views/settings/change-password.client.view.html", + $templateCache.put("modules/users/views/settings/change-password.client.view.html", "

Change your password


Password Changed Successfully
"); - $templateCache.put("../public/modules/users/views/settings/edit-profile.client.view.html", + $templateCache.put("modules/users/views/settings/edit-profile.client.view.html", "

Edit your profile

Profile Saved Successfully
Couldn't Save Your Profile.
Error:
First Name
Last Name

Language
Email (also your username)
"); - $templateCache.put("../public/modules/users/views/settings/social-accounts.client.view.html", + $templateCache.put("modules/users/views/settings/social-accounts.client.view.html", "

Connected social accounts:

Connect other social accounts:

"); +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c $templateCache.put("../public/modules/users/views/verify/resend-verify-email.client.view.html", "

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at polydaic@gmail.com

"); $templateCache.put("../public/modules/users/views/verify/verify-account.client.view.html", +======= + $templateCache.put("modules/users/views/verify/resend-verify-email.client.view.html", + "

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at hi@TellForm.com

"); + $templateCache.put("modules/users/views/verify/verify-account.client.view.html", +>>>>>>> make it work "

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
"); }]); @@ -389,6 +458,8 @@ angular.module(ApplicationConfiguration.applicationModuleName).constant('USER_RO normal: 'user', superuser: 'superuser' }); +//form url +angular.module(ApplicationConfiguration.applicationModuleName).constant('FORM_URL', '/forms/:formId'); angular.module(ApplicationConfiguration.applicationModuleName).run(['$rootScope', 'Auth', '$state', '$stateParams', function($rootScope, Auth, $state, $stateParams) { @@ -457,6 +528,7 @@ angular.element(document).ready(function() { angular.bootstrap(document, [ApplicationConfiguration.applicationModuleName]); }); +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c 'use strict'; // Use Application configuration module to register a new module @@ -677,6 +749,7 @@ angular.module('core').service('Menus', [ this.menus[menuId].items.splice(itemIndex, 1); } } +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 // Return the menu object return this.menus[menuId]; @@ -857,11 +930,1761 @@ angular.module('forms').config(['$stateProvider', url: '/create', templateUrl: 'modules/forms/views/adminTabs/create.html' }); +======= +======= +angular.module('NodeForm.templates', []).run(['$templateCache', function($templateCache) { + "use strict"; + $templateCache.put("../public/modules/core/views/header.client.view.html", + "
"); + $templateCache.put("../public/modules/core/views/home.client.view.html", + "

TellForm

Craft beautiful forms in seconds.

Craft beautiful forms.

TellForm is an opensource alternative to TypeForm that can create stunning forms from PDFs or from scratch

TellForm is an opensource alternative to TypeForm that can create stunning forms from PDFs or from scratch

Create your next ______.

Tell a story with a form.

"); + $templateCache.put("../public/modules/forms/views/admin-form.client.view.html", + "
"); + $templateCache.put("../public/modules/forms/views/list-forms.client.view.html", + "

Create a new form
Name
Language

Created on
"); + $templateCache.put("../public/modules/forms/views/submit-form.client.view.html", + "
"); + $templateCache.put("../public/modules/forms/views/adminTabs/analyze.html", + ""); + $templateCache.put("../public/modules/forms/views/adminTabs/configure.html", + ""); + $templateCache.put("../public/modules/forms/views/adminTabs/create.html", + ""); + $templateCache.put("../public/modules/forms/views/adminTabs/design.html", + "

Change how your Form Looks

Change how your Form Looks

Background Color
Question Text Color
Answer Text Color
Button Background Color
Button Text Color
"); + $templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeA.html", + "
{{$message}}
"); + $templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html", + "
{{$message}}
"); + $templateCache.put("../public/modules/forms/views/directiveViews/entryPage/startPage.html", + "

{{pageData.introTitle}}

{{pageData.introParagraph}}

"); + $templateCache.put("../public/modules/forms/views/directiveViews/field/date.html", + "

{{field.title}} *(required)

"); + $templateCache.put("../public/modules/forms/views/directiveViews/field/dropdown.html", + "
0\">

{{field.title}} *(required)

{{$select.selected.option_value}}

"); + $templateCache.put("../public/modules/forms/views/directiveViews/field/file.html", + "
{{field.title}} (* required)
{{field.file.originalname}}
Upload your File
"); + $templateCache.put("../public/modules/forms/views/directiveViews/field/hidden.html", + ""); + $templateCache.put("../public/modules/forms/views/directiveViews/field/legal.html", + "

{{field.title}} *(required)


{{field.description}}


"); + $templateCache.put("../public/modules/forms/views/directiveViews/field/natural.html", + "

{{field.title}} *(required)


"); + $templateCache.put("../public/modules/forms/views/directiveViews/field/password.html", + "

{{field.title}} *(required)

"); + $templateCache.put("../public/modules/forms/views/directiveViews/field/radio.html", + "
0\">

{{field.title}} *(required)


"); + $templateCache.put("../public/modules/forms/views/directiveViews/field/rating.html", + "

{{field.title}} *(required)

"); + $templateCache.put("../public/modules/forms/views/directiveViews/field/statement.html", + "

{{field.title}}

{{field.description}}


"); + $templateCache.put("../public/modules/forms/views/directiveViews/field/textarea.html", + "

{{field.title}} *(required)

press ENTER
"); + $templateCache.put("../public/modules/forms/views/directiveViews/field/textfield.html", + "

{{field.title}} *(required)

press ENTER
"); + $templateCache.put("../public/modules/forms/views/directiveViews/field/yes_no.html", + "

{{field.title}} *(required)

{{field.description}}


"); + $templateCache.put("../public/modules/forms/views/directiveViews/form/configure-form.client.view.html", + "

PDF Generation/EMR

PDF Generation/EMR

Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.originalname}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type


Advanced Settings

Advanced Settings

Form Name
Form Status
Language
* required
Display Form Footer?
Display Start Page?
"); + $templateCache.put("../public/modules/forms/views/directiveViews/form/edit-form.client.view.html", + "

Click to Add New Field

Add New Field

Add Field

Start Page

Preview Start Page

    {{myform.startPage.introTitle}}

    {{myform.startPage.introParagraph}}

Edit Start Page


Intro Title:
Intro Paragraph:
\n" + + "
\n" + + "\n" + + "

\n" + + "
\n" + + "
Options:
\n" + + "
\n" + + "
\n" + + " \n" + + "\n" + + " \n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + " \n" + + "
\n" + + "
\n" + + "
\n" + + "\n" + + "

\n" + + "\n" + + "
\n" + + "
Required:
\n" + + "
\n" + + " \n" + + "\n" + + " \n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + "
Disabled:
\n" + + "
\n" + + " \n" + + "\n" + + " \n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + " \n" + + "\n" + + "
\n" + + "
\n" + + "

\n" + + " Click on Fields to add them here\n" + + "

\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + " \n" + + "
\n" + + "\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "\n" + + ""); + $templateCache.put("../public/modules/forms/views/directiveViews/form/edit-submissions-form.client.view.html", + "
#{{value.title}}OscarEMR User ProfilePercentage CompleteTime ElapsedDeviceLocationIP AddressDate Submitted (UTC)Generated PDF
{{$index+1}}{{field.fieldValue}}User Profile #{{row.oscarDemoNum}}{{row.percentageComplete}}%{{row.timeElapsed}}{{row.device.name}}, {{row.device.type}}{{row.geoLocation.city}}, {{row.geoLocation.country}}{{row.ipAddr}}{{row.created | date:'yyyy-MM-dd HH:mm:ss'}}Generated PDF
"); + $templateCache.put("../public/modules/forms/views/directiveViews/form/submit-form.client.view.html", + "
press ENTER

{{myform | formValidity}} out of {{form_fields_count}} answered

"); + $templateCache.put("../public/modules/users/views/authentication/access-denied.client.view.html", + "

You need to be logged in to access this page

Login
"); + $templateCache.put("../public/modules/users/views/authentication/signin.client.view.html", + "

Sign into your account

Error:
  or  Sign up
"); + $templateCache.put("../public/modules/users/views/authentication/signup-success.client.view.html", + "

Signup Successful

You've successfully registered an account at TellForm.

But your account is not activated yet



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

"); + $templateCache.put("../public/modules/users/views/authentication/signup.client.view.html", + "

Signup with your email

Couldn't submit form due to errors:

"); + $templateCache.put("../public/modules/users/views/password/forgot-password.client.view.html", + "

Restore your password

Enter your account email.

{{error}}
{{success}}
"); + $templateCache.put("../public/modules/users/views/password/reset-password-invalid.client.view.html", + "

Password reset is invalid

Ask for a new password reset
"); + $templateCache.put("../public/modules/users/views/password/reset-password-success.client.view.html", + "

Password successfully reset

Continue to home page
"); + $templateCache.put("../public/modules/users/views/password/reset-password.client.view.html", + "

Reset your password

{{error}}
{{success}}
"); + $templateCache.put("../public/modules/users/views/settings/change-password.client.view.html", + "

Change your password


Password Changed Successfully
"); + $templateCache.put("../public/modules/users/views/settings/edit-profile.client.view.html", + "

Edit your profile

Profile Saved Successfully
Couldn't Save Your Profile.
Error:
First Name
Last Name

Language
Email (also your username)
"); + $templateCache.put("../public/modules/users/views/settings/social-accounts.client.view.html", + "

Connected social accounts:

Connect other social accounts:

"); + $templateCache.put("../public/modules/users/views/verify/resend-verify-email.client.view.html", + "

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at hi@TellForm.com

"); + $templateCache.put("../public/modules/users/views/verify/verify-account.client.view.html", + "

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
"); +}]); +>>>>>>> make it work + +'use strict'; + +// Use Application configuration module to register a new module +ApplicationConfiguration.registerModule('core', ['users']); + +'use strict'; + +// Use Application configuration module to register a new module +ApplicationConfiguration.registerModule('forms', [ + 'ngFileUpload', 'ui.router.tabs', 'ui.date', 'ui.sortable', + 'angular-input-stars', 'users', 'pascalprecht.translate' +]);//, 'colorpicker.module' @TODO reactivate this module + +'use strict'; + +// Use Application configuration module to register a new module +ApplicationConfiguration.registerModule('users'); +'use strict'; + +// Setting up route +angular.module('core').config(['$stateProvider', '$urlRouterProvider', + function($stateProvider, $urlRouterProvider, Authorization) { + // Redirect to home view when route not found + $urlRouterProvider.otherwise('/forms'); } ]); 'use strict'; +angular.module('core').controller('HeaderController', ['$rootScope', '$scope', 'Menus', '$state', 'Auth', 'User', + function ($rootScope, $scope, Menus, $state, Auth, User) { + $scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User); + $scope.authentication = $rootScope.authentication = Auth; + + $rootScope.languages = $scope.languages = ['english', 'french', 'spanish']; + + $scope.isCollapsed = false; + $rootScope.hideNav = false; + $scope.menu = Menus.getMenu('topbar'); + + $scope.signout = function() { + var promise = User.logout(); + promise.then(function() { + Auth.logout(); + Auth.ensureHasCurrentUser(User); + $scope.user = $rootScope.user = null; + $state.go('listForms'); + }, + function(reason) { + console.log('Logout Failed: ' + reason); + }); + }; + + $scope.toggleCollapsibleMenu = function() { + $scope.isCollapsed = !$scope.isCollapsed; + }; + + // Collapsing the menu after navigation + $scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) { + $scope.isCollapsed = false; + $rootScope.hideNav = false; + if ( angular.isDefined( toState.data ) ) { + + if ( angular.isDefined( toState.data.hideNav ) ) { + $rootScope.hideNav = toState.data.hideNav; + } + } + }); + + } +]); + +'use strict'; + + +angular.module('core').controller('HomeController', ['$rootScope', '$scope', 'User', '$state', + function($rootScope, $scope, User, $state) { + $scope = $rootScope; +>>>>>>> make it work + } +]); + +'use strict'; + +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 +// Forms controller +angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope', '$stateParams', '$state', 'Forms', 'CurrentForm', '$http', '$uibModal', 'myForm', + function($rootScope, $scope, $stateParams, $state, Forms, CurrentForm, $http, $uibModal, myForm) { + + $scope = $rootScope; + $scope.animationsEnabled = true; + $scope.myform = myForm; + $rootScope.saveInProgress = false; + + CurrentForm.setForm($scope.myform); + +======= +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +>>>>>>> make it work + $scope.tabData = [ + { + heading: 'Create', + route: 'viewForm.create' + }, + { + heading: 'Design', + route: 'viewForm.design' + }, + { + heading: 'Configure', + route: 'viewForm.configure' + }, + { + heading: 'Analyze', + route: 'viewForm.analyze' + } + ]; +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 + + $scope.setForm = function(form){ + $scope.myform = form; + }; + $rootScope.resetForm = function(){ + $scope.myform = Forms.get({ + formId: $stateParams.formId + }); + }; + +======= +======= +//Menu service used for managing menus +angular.module('core').service('Menus', [ +>>>>>>> make it work + + function() { + // Define a set of default roles + this.defaultRoles = ['*']; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +>>>>>>> make it work + /* + ** DeleteModal Functions + */ + $scope.openDeleteModal = function(){ + $scope.deleteModal = $uibModal.open({ + animation: $scope.animationsEnabled, + templateUrl: 'myModalContent.html', + controller: 'AdminFormController', + resolve: { + myForm: function(){ + return $scope.myform; +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 + } + } + }); + $scope.deleteModal.result.then(function (selectedItem) { + $scope.selected = selectedItem; + }, function () { + console.log('Modal dismissed at: ' + new Date()); + }); + }; + + + $scope.cancelDeleteModal = function(){ + if($scope.deleteModal){ + $scope.deleteModal.dismiss('cancel'); + } + }; + + // Remove existing Form + $scope.removeCurrentForm = function() { + if($scope.deleteModal && $scope.deleteModal.opened){ + +======= +======= + // Define the menus object + this.menus = {}; + + // A private function for rendering decision + var shouldRender = function(user) { + if (user) { + if (~this.roles.indexOf('*')) { + return true; + } else { + for (var userRoleIndex in user.roles) { + for (var roleIndex in this.roles) { + console.log(this.roles[roleIndex]); + console.log( this.roles[roleIndex] === user.roles[userRoleIndex]); + if (this.roles[roleIndex] === user.roles[userRoleIndex]) { + return true; + } + } +>>>>>>> make it work + } + } + } else { + return this.isPublic; + } + + return false; + }; + + // Validate menu existance + this.validateMenuExistance = function(menuId) { + if (menuId && menuId.length) { + if (this.menus[menuId]) { + return true; + } else { + throw new Error('Menu does not exists'); + } + } else { + throw new Error('MenuId was not provided'); + } + + return false; + }; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +>>>>>>> make it work + $scope.deleteModal.close(); + + var form_id = $scope.myform._id; + if(!form_id) throw new Error('Error - removeCurrentForm(): $scope.myform._id does not exist'); + + $http.delete('/forms/'+form_id) + .success(function(data, status, headers){ + console.log('form deleted successfully'); + + $state.go('listForms', {}, {reload: true}); +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 + + }).error(function(error){ + console.log('ERROR: Form could not be deleted.'); + console.error(error); + }); + } + }; + + // Update existing Form + $scope.update = $rootScope.update = function(updateImmediately, cb){ + +======= +======= + // Get the menu object by menu id + this.getMenu = function(menuId) { + // Validate that the menu exists + this.validateMenuExistance(menuId); + + // Return the menu object + return this.menus[menuId]; + }; +>>>>>>> make it work + + // Add new menu object by menu id + this.addMenu = function(menuId, isPublic, roles) { + // Create the new menu + this.menus[menuId] = { + isPublic: isPublic || false, + roles: roles || this.defaultRoles, + items: [], + shouldRender: shouldRender + }; + + // Return the menu object + return this.menus[menuId]; + }; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +>>>>>>> make it work + var continueUpdate = true; + if(!updateImmediately){ + continueUpdate = !$rootScope.saveInProgress; + } + + //Update form **if we are not currently updating** or if **shouldUpdateNow flag is set** + if(continueUpdate){ + var err = null; +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 + + if(!updateImmediately){ $rootScope.saveInProgress = true; } + +======= +======= + // Remove existing menu object by menu id + this.removeMenu = function(menuId) { + // Validate that the menu exists + this.validateMenuExistance(menuId); +>>>>>>> make it work + + // Return the menu object + delete this.menus[menuId]; + }; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +>>>>>>> make it work + $scope.updatePromise = $http.put('/forms/'+$scope.myform._id, {form: $scope.myform}) + .then(function(response){ + $rootScope.myform = $scope.myform = response.data; + // console.log(response.data); + }).catch(function(response){ + console.log('Error occured during form UPDATE.\n'); + // console.log(response.data); + err = response.data; + }).finally(function() { + // console.log('finished updating'); + if(!updateImmediately){$rootScope.saveInProgress = false; } + + if( (typeof cb) === 'function'){ + return cb(err); + } + }); + } + }; +======= + // Add menu item object + this.addMenuItem = function(menuId, menuItemTitle, menuItemURL, menuItemType, menuItemUIRoute, isPublic, roles, position) { + // Validate that the menu exists + this.validateMenuExistance(menuId); + + // Push new menu item + this.menus[menuId].items.push({ + title: menuItemTitle, + link: menuItemURL, + menuItemType: menuItemType || 'item', + menuItemClass: menuItemType, + uiRoute: menuItemUIRoute || ('/' + menuItemURL), + isPublic: ((isPublic === null || typeof isPublic === 'undefined') ? this.menus[menuId].isPublic : isPublic), + roles: ((roles === null || typeof roles === 'undefined') ? this.menus[menuId].roles : roles), + position: position || 0, + items: [], + shouldRender: shouldRender + }); +>>>>>>> make it work + + // Return the menu object + return this.menus[menuId]; + }; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + } +]); + +'use strict'; +======= + // Add submenu item object + this.addSubMenuItem = function(menuId, rootMenuItemURL, menuItemTitle, menuItemURL, menuItemUIRoute, isPublic, roles, position) { + // Validate that the menu exists + this.validateMenuExistance(menuId); +>>>>>>> make it work + + // Search for menu item + for (var itemIndex in this.menus[menuId].items) { + if (this.menus[menuId].items[itemIndex].link === rootMenuItemURL) { + // Push new submenu item + this.menus[menuId].items[itemIndex].items.push({ + title: menuItemTitle, + link: menuItemURL, + uiRoute: menuItemUIRoute || ('/' + menuItemURL), + isPublic: ((isPublic === null || typeof isPublic === 'undefined') ? this.menus[menuId].items[itemIndex].isPublic : isPublic), + roles: ((roles === null || typeof roles === 'undefined') ? this.menus[menuId].items[itemIndex].roles : roles), + position: position || 0, + shouldRender: shouldRender + }); + } + } + + // Return the menu object + return this.menus[menuId]; + }; + + // Remove existing menu object by menu id + this.removeMenuItem = function(menuId, menuItemURL) { + // Validate that the menu exists + this.validateMenuExistance(menuId); + + // Search for menu item to remove + for (var itemIndex in this.menus[menuId].items) { + if (this.menus[menuId].items[itemIndex].link === menuItemURL) { + this.menus[menuId].items.splice(itemIndex, 1); + } + } + + // Return the menu object + return this.menus[menuId]; + }; + + // Remove existing menu object by menu id + this.removeSubMenuItem = function(menuId, submenuItemURL) { + // Validate that the menu exists + this.validateMenuExistance(menuId); + + // Search for menu item to remove + for (var itemIndex in this.menus[menuId].items) { + for (var subitemIndex in this.menus[menuId].items[itemIndex].items) { + if (this.menus[menuId].items[itemIndex].items[subitemIndex].link === submenuItemURL) { + this.menus[menuId].items[itemIndex].items.splice(subitemIndex, 1); + } + } + } + + // Return the menu object + return this.menus[menuId]; + }; + + //Adding the topbar menu + this.addMenu('topbar', false, ['*']); + + //Adding the bottombar menu for the Form-Footer view + this.addMenu('bottombar', false, ['*']); + } +]); + +'use strict'; + +// Configuring the Forms drop-down menus +angular.module('forms').run(['Menus', + function(Menus) { + // Set top bar menu items + Menus.addMenuItem('topbar', 'My Forms', 'forms', '', '/forms', false); + } +]).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); + } + + }).length; + return valid_count - (formObj.form_fields.length - formObj.visible_form_fields.length); + } + return 0; + }; +}).config(['$provide', function ($provide){ + $provide.decorator('accordionDirective', ["$delegate", function($delegate) { + var directive = $delegate[0]; + directive.replace = true; + return $delegate; + }]); +}]); + +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 + } +]); +(function () { + 'use strict'; + + // Create the SendVisitorData service + angular + .module('forms') + .factory('SendVisitorData', SendVisitorData); + + SendVisitorData.$inject = ['Socket', '$state']; + + function SendVisitorData(Socket, $state) { + + // Create a controller method for sending visitor data + function send(form, lastActiveIndex, timeElapsed) { + + console.log(lastActiveIndex); + // Create a new message object + var visitorData = { + referrer: document.referrer, + isSubmitted: form.submitted, + formId: form._id, + lastActiveField: form.form_fields[lastActiveIndex]._id, + timeElapsed: timeElapsed + }; + Socket.emit('form-visitor-data', visitorData); + } + + function init(){ + // Make sure the Socket is connected + if (!Socket.socket) { + Socket.connect(); + } + } + + var service = { + send: send + }; + + init(); + return service; + + } +}()); + + +======= +>>>>>>> make it work +'use strict'; + +// Setting up route +angular.module('forms').config(['$stateProvider', + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +function removeDateFieldsFunc(o) { + var clone = _.clone(o); + function eachObject(v,k){ + + if(k === 'lastModified' || k === 'created'){ + delete clone[k]; + } +======= + function($stateProvider) { + // Forms state routing + $stateProvider. + state('listForms', { + url: '/forms', + templateUrl: 'modules/forms/admin/views/list-forms.client.view.html' + }). + state('submitForm', { + url: '/forms/:formId', + templateUrl: 'modules/forms/base/views/submit-form.client.view.html', + data: { + hideNav: true + }, + resolve: { + Forms: 'Forms', + myForm: ["Forms", "$stateParams", function (Forms, $stateParams) { + return Forms.get({formId: $stateParams.formId}).$promise; + }] + }, + controller: 'SubmitFormController', + controllerAs: 'ctrl' + }).state('viewForm', { + url: '/forms/:formId/admin', + templateUrl: 'modules/forms/admin/views/admin-form.client.view.html', + data: { + permissions: [ 'editForm' ] + }, + resolve: { + Forms: 'Forms', + myForm: ["Forms", "$stateParams", function (Forms, $stateParams) { + return Forms.get({formId: $stateParams.formId}).$promise; + }] + }, + controller: 'AdminFormController' + }).state('viewForm.configure', { + url: '/configure', + templateUrl: 'modules/forms/admin/views/adminTabs/configure.html' + }).state('viewForm.design', { + url: '/design', + templateUrl: 'modules/forms/admin/views/adminTabs/design.html' + }).state('viewForm.analyze', { + url: '/analyze', + templateUrl: 'modules/forms/admin/views/adminTabs/analyze.html', + }).state('viewForm.create', { + url: '/create', + templateUrl: 'modules/forms/admin/views/adminTabs/create.html' + }); +>>>>>>> make it work + } +]); + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + for(var i=0; i>>>>>> make it work + +// Config HTTP Error Handling +angular.module('users').config(['$httpProvider', + function($httpProvider) { + $httpProvider.interceptors.push(["$q", "$location", function($q, $location) { + return { + responseError: function(response) { + if( $location.path() !== '/users/me' && response.config){ + if(response.config.url !== '/users/me'){ + console.log('intercepted rejection of ', response.config.url, response.status); + if (response.status === 401) { + // save the current location so that login can redirect back + $location.nextAfterLogin = $location.path(); + $location.path('/signin'); + }else if(response.status === 403){ + $location.path('/access_denied'); + } + } + + } + return $q.reject(response); + } + }; + }]); +}]); +'use strict'; + +// Setting up route +angular.module('users').config(['$stateProvider', + function($stateProvider) { + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + $rootScope[$attrs.autoSaveCallback](true, + function(err){ + if(!err){ + //console.log('\n\nForm data persisted -- setting pristine flag'); + $formCtrl.$setPristine(); + $formCtrl.$setUntouched(); + }else{ + console.error('Error form data NOT persisted'); + console.error(err); + } + }); + }; + + //Update/Save Form if any Form fields are Dirty and Touched + $scope.$watch(function(newValue, oldValue) { + //console.log('introParagraphStartPage.$dirty: '+$scope.editForm.introParagraphStartPage.$dirty); + //console.log('introParagraphStartPage.$touched: '+$scope.editForm.introParagraphStartPage.$touched); + if($rootScope.finishedRender && $scope.anyDirtyAndTouched($scope.editForm) && !$rootScope.saveInProgress){ + //console.log('Form saving started'); + debounceSave(); + //console.log('introParagraphStartPage.$dirty AFTER: '+$scope.editForm.introParagraphStartPage.$dirty); + } + }); +======= + var checkLoggedin = function($q, $timeout, $state, User, Auth) { + var deferred = $q.defer(); + +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 + //Autosave Form when model (specified in $attrs.autoSaveWatch) changes + $scope.$watch($attrs.autoSaveWatch, function(newValue, oldValue) { +======= + // console.log(Auth.ensureHasCurrentUser(User)); +>>>>>>> make it work +>>>>>>> make it work + + if (Auth.currentUser && Auth.currentUser.email) { + $timeout(deferred.resolve); + } + else { + Auth.currentUser = User.getCurrent(function() { + Auth.login(); + $timeout(deferred.resolve()); + }, + function() { + Auth.logout(); + $timeout(deferred.reject()); + $state.go('sigin', {reload: true}); + }); + } + + return deferred.promise; + }; + checkLoggedin.$inject = ["$q", "$timeout", "$state", "User", "Auth"]; + + // Users state routing + $stateProvider. + state('profile', { + resolve: { + loggedin: checkLoggedin + }, + url: '/settings/profile', + templateUrl: 'modules/users/views/settings/edit-profile.client.view.html' + }). + state('password', { + resolve: { + loggedin: checkLoggedin + }, + url: '/settings/password', + templateUrl: 'modules/users/views/settings/change-password.client.view.html' + }). + state('accounts', { + resolve: { + loggedin: checkLoggedin + }, + url: '/settings/accounts', + templateUrl: 'modules/users/views/settings/social-accounts.client.view.html' + }). + + state('signup', { + url: '/signup', + templateUrl: 'modules/users/views/authentication/signup.client.view.html' + }). + state('signup-success', { + url: '/signup-success', + templateUrl: 'modules/users/views/authentication/signup-success.client.view.html' + }). + state('signin', { + url: '/signin', + templateUrl: 'modules/users/views/authentication/signin.client.view.html' + }). + state('access_denied', { + url: '/access_denied', + templateUrl: 'modules/users/views/authentication/access-denied.client.view.html' + }). + + state('resendVerifyEmail', { + url: '/verify', + templateUrl: 'modules/users/views/verify/resend-verify-email.client.view.html' + }). + state('verify', { + url: '/verify/:token', + templateUrl: 'modules/users/views/verify/verify-account.client.view.html' + }). + + state('forgot', { + url: '/password/forgot', + templateUrl: 'modules/users/views/password/forgot-password.client.view.html' + }). + state('reset-invalid', { + url: '/password/reset/invalid', + templateUrl: 'modules/users/views/password/reset-password-invalid.client.view.html' + }). + state('reset-success', { + url: '/password/reset/success', + templateUrl: 'modules/users/views/password/reset-password-success.client.view.html' + }). + state('reset', { + url: '/password/reset/:token', + templateUrl: 'modules/users/views/password/reset-password.client.view.html' + }); + } +]); +'use strict'; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + //If our form is undefined, don't save form + if( (!newValue && !oldValue) || !oldValue ){ + return; + } + + // console.log('Autosaving'); + // console.log('\n\n----------'); + // console.log('!$dirty: '+ !$formCtrl.$dirty ); + // console.log('changedFields: '+changedFields); + // console.log('changedFieldMap: '+changedFieldMap); + // console.log('finishedRender: '+$rootScope.finishedRender); + // console.log('!saveInProgress: '+!$rootScope.saveInProgress); + // console.log('newValue: '+newValue); + // console.log('oldValue: '+oldValue); + // console.log(oldValue.form_fields); + // console.log(newValue.form_fields); + + if(oldValue.form_fields.length === 0) { + $rootScope.finishedRender = true; + } +======= +angular.module('users').controller('AuthenticationController', ['$scope', '$location', '$state', '$rootScope', 'User', 'Auth', + function($scope, $location, $state, $rootScope, User, Auth) { + + $scope = $rootScope; + $scope.credentials = {}; + $scope.error = ''; +>>>>>>> make it work + + $scope.signin = function() { + $scope.credentials.email = $scope.credentials.username; + User.login($scope.credentials).then( + function(response) { + Auth.login(response); + $scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User); + + if($state.previous.name !== 'home' && $state.previous.name !== 'verify' && $state.previous.name !== ''){ + $state.go($state.previous.name); + }else{ + $state.go('listForms'); + } + }, + function(error) { + $rootScope.user = Auth.ensureHasCurrentUser(User); + $scope.user = $rootScope.user; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + savePromise = $timeout(function() { + debounceSave(); + }); + } + //If we are finished rendering then form saving should be finished + else if($rootScope.finishedRender && $rootScope.saveInProgress){ + $rootScope.saveInProgress = false; + } + + }, true); + }); + } + }; + +}]); +======= + $scope.error = error; + console.log('loginError: '+error); + } + ); + }; + + $scope.signup = function() { + console.log($scope.credentials); + User.signup($scope.credentials).then( + function(response) { + console.log('signup-success'); + $state.go('signup-success'); + }, + function(error) { + console.log('Error: '); + console.log(error); + if(error) { + $scope.error = error; + console.log(error); + }else { + console.log('No response received'); + } + } + ); + }; + + } +]); +>>>>>>> make it work + +'use strict'; + +angular.module('users').controller('PasswordController', ['$scope', '$stateParams', '$state', 'User', + function($scope, $stateParams, $state, User) { + $scope.error = ''; + + // Submit forgotten password account id + $scope.askForPasswordReset = function() { + User.askForPasswordReset($scope.credentials).then( + function(response){ + $scope.success = response.message; + $scope.credentials = null; + }, + function(error){ + $scope.error = error; + $scope.credentials = null; + } + ); + }; + + // Change user password + $scope.resetUserPassword = function() { + $scope.success = $scope.error = null; + User.resetPassword($scope.passwordDetails, $stateParams.token).then( + function(response){ + // If successful show success message and clear form + $scope.success = response.message; + $scope.passwordDetails = null; + + // And redirect to the index page + $state.go('reset-success'); + }, + function(error){ + $scope.error = error.message || error; + $scope.passwordDetails = null; + } + ); + }; + } +]); +'use strict'; + +angular.module('users').controller('SettingsController', ['$scope', '$rootScope', '$http', '$state', 'Users', + function($scope, $rootScope, $http, $state, Users) { + $scope.user = $rootScope.user; + + // Check if there are additional accounts + $scope.hasConnectedAdditionalSocialAccounts = function(provider) { + for (var i in $scope.user.additionalProvidersData) { + return true; + } + return false; + }; + + // Check if provider is already in use with current user + $scope.isConnectedSocialAccount = function(provider) { + return $scope.user.provider === provider || ($scope.user.additionalProvidersData && $scope.user.additionalProvidersData[provider]); + }; + + // Remove a user social account + $scope.removeUserSocialAccount = function(provider) { + $scope.success = $scope.error = null; + + $http.delete('/users/accounts', { + params: { + provider: provider + } + }).success(function(response) { + // If successful show success message and clear form + $scope.success = true; + $scope.user = response; + }).error(function(response) { + $scope.error = response.message; + }); + }; + + // Update a user profile + $scope.updateUserProfile = function(isValid) { + if (isValid) { + $scope.success = $scope.error = null; + var user = new Users($scope.user); + + user.$update(function(response) { + $scope.success = true; + $scope.user = response; + }, function(response) { + $scope.error = response.data.message; + }); + } else { + $scope.submitted = true; + } + }; + + // Change user password + $scope.changeUserPassword = function() { + $scope.success = $scope.error = null; + + $http.post('/users/password', $scope.passwordDetails).success(function(response) { + // If successful show success message and clear form + $scope.success = true; + $scope.passwordDetails = null; + }).error(function(response) { + $scope.error = response.message; + }); + }; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + console.log($scope.log); + if (!$scope.$$phase && !$scope.$digest) { + $scope.$apply(); + } + }, function(resp){ + $scope.pdfLoading = false; + console.log('Error occured during upload.\n'); + console.log(resp.status); + }, function (evt) { + var progressPercentage = parseInt(100.0 * evt.loaded / evt.total, 10); + $scope.log = 'progress: ' + progressPercentage + '% ' + + evt.config.data.file.name + '\n' + $scope.log; +======= + } +]); +'use strict'; +>>>>>>> make it work + +angular.module('users').controller('VerifyController', ['$scope', '$state', '$rootScope', 'User', 'Auth', '$stateParams', + function($scope, $state, $rootScope, User, Auth, $stateParams) { + + $scope.isResetSent = false; + $scope.credentials = {}; + $scope.error = ''; + + // Submit forgotten password account id + $scope.resendVerifyEmail = function() { + // console.log($scope.credentials); + // console.log($scope.credentials.email); + User.resendVerifyEmail($scope.credentials.email).then( + function(response){ + console.log(response); + $scope.success = response.message; + $scope.credentials = null; + $scope.isResetSent = true; + }, + function(error){ + $scope.error = error; + $scope.credentials.email = null; + $scope.isResetSent = false; + } + ); + }; + + //Validate Verification Token + $scope.validateVerifyToken = function() { + if($stateParams.token){ + console.log($stateParams.token); + User.validateVerifyToken($stateParams.token).then( + function(response){ + console.log('Success: '+response.message); + $scope.success = response.message; + $scope.isResetSent = true; + $scope.credentials.email = null; + }, + function(error){ + console.log('Error: '+error.message); + $scope.isResetSent = false; + $scope.error = error; + $scope.credentials.email = null; + } + ); + } + }; + } +]); +'use strict'; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormFields', + function ($rootScope, FormFields) { + return { + templateUrl: 'modules/forms/views/directiveViews/form/edit-form.client.view.html', + restrict: 'E', + scope: { + myform:'=' + }, + controller: ["$scope", function($scope){ + var field_ids = _($scope.myform.form_fields).pluck('_id'); + for(var i=0; i>>>>>> make it work + + var userState = { + isLoggedIn: false + }; + + var service = { + _currentUser: null, + get currentUser(){ + return this._currentUser; + }, + + // Note: we can't make the User a dependency of Auth + // because that would create a circular dependency + // Auth <- $http <- $resource <- LoopBackResource <- User <- Auth + ensureHasCurrentUser: function(User) { + if (service._currentUser && service._currentUser.username) { + //console.log('Using local current user.'); + //console.log(service._currentUser); + return service._currentUser; + } + else if ($window.user){ + //console.log('Using cached current user.'); + //console.log($window.user); + service._currentUser = $window.user; + return service._currentUser; + } + else{ + //console.log('Fetching current user from the server.'); + User.getCurrent().then(function(user) { + // success + service._currentUser = user; + userState.isLoggedIn = true; + $window.user = service._currentUser; + return service._currentUser; + }, + function(response) { + userState.isLoggedIn = false; + service._currentUser = null; + $window.user = null; + console.log('User.getCurrent() err', response); + return null; + }); + } + }, + + isAuthenticated: function() { + return !!service._currentUser; + }, + + getUserState: function() { + return userState; + }, + + login: function(new_user) { + userState.isLoggedIn = true; + service._currentUser = new_user; + }, + + logout: function() { + $window.user = null; + userState.isLoggedIn = false; + service._currentUser = null; + } + }; + return service; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + if( $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id) ){ + currentFields = _(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id]); + } +======= + } +]); +>>>>>>> make it work + +'use strict'; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + /* + ** FormFields (ui-sortable) drag-and-drop configuration + */ +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 + $scope.dropzone = { + handle: '.handle', + containment: '.dropzoneContainer', + cursor: 'grabbing' + }; +======= + $scope.dropzone = { + handle: ' .handle', + containment: '.dropzoneContainer', + cursor: 'grabbing' + }; +======= +angular.module('users').service('Authorizer', ["APP_PERMISSIONS", "USER_ROLES", function(APP_PERMISSIONS, USER_ROLES) { + return function(user) { + return { + canAccess: function(permissions) { + var i, len, permission; + if (!angular.isArray(permissions)) { + permissions = [permissions]; + } + for (i = 0, len = permissions.length; i < len; i++) { + permission = permissions[i]; + if (APP_PERMISSIONS[permission] === null) { + throw 'Bad permission value'; + } + if (user && user.roles) { + switch (permission) { + case APP_PERMISSIONS.viewAdminSettings: + case APP_PERMISSIONS.editAdminSettings: + return user.roles.indexOf(USER_ROLES.admin) > -1; + case APP_PERMISSIONS.viewPrivateForm: + case APP_PERMISSIONS.editForm: + return user.roles.indexOf(USER_ROLES.admin) > -1 || user.roles.indexOf(USER_ROLES.normal) > -1; + } + } else { + return false; + } + } +>>>>>>> make it work +>>>>>>> make it work + + return false; + } + }; + }; +}]); +'use strict'; + +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 + // increment lastAddedID counter + $scope.addField.lastAddedID++; + var fieldTitle; +======= +angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', '$state', + function($window, $q, $timeout, $http, $state) { +>>>>>>> make it work + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + for(var i = 0; i < $scope.addField.types.length; i++){ + if($scope.addField.types[i].name === fieldType){ + $scope.addField.types[i].lastAddedID++; + fieldTitle = $scope.addField.types[i].value+$scope.addField.types[i].lastAddedID; + break; + } + } + var newField = { + title: fieldTitle, + fieldType: fieldType, + fieldValue: '', + required: true, + disabled: false, + deletePreserved: false + }; + + if($scope.showAddOptions(newField)){ + newField.fieldOptions = []; + newField.fieldOptions.push({ + 'option_id' : Math.floor(100000*Math.random()), //Generate pseudo-random option id + 'option_title' : 'Option 0', + 'option_value' : 'Option 0' + }); + } + + + if(modifyForm){ + //Add newField to form_fields array + $scope.myform.form_fields.push(newField); + } + return newField; + }; +======= + var userService = { + getCurrent: function() { + var deferred = $q.defer(); +>>>>>>> make it work + + $http.get('/users/me') + .success(function(response) { + deferred.resolve(response); + }) + .error(function() { + deferred.reject('User\'s session has expired'); + }); + + return deferred.promise; + }, + login: function(credentials) { + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + //Delete field + $scope.myform.form_fields.splice(field_index, 1); + }; + $scope.duplicateField = function (field_index){ + var currField = _.cloneDeep($scope.myform.form_fields[field_index]); + currField._id = 'cloned'+_.uniqueId(); + currField.title += ' copy'; +======= + var deferred = $q.defer(); + $http.post('/auth/signin', credentials).success(function(response) { + deferred.resolve(response); + }).error(function(error) { + deferred.reject(error.message || error); + }); +>>>>>>> make it work + + return deferred.promise; + }, + logout: function() { + + var deferred = $q.defer(); + $http.get('/auth/signout').success(function(response) { + deferred.resolve(null); + }).error(function(error) { + deferred.reject(error.message || error); + }); + + return deferred.promise; + }, + signup: function(credentials) { + + var deferred = $q.defer(); + $http.post('/auth/signup', credentials).success(function(response) { + // If successful we assign the response to the global user model + deferred.resolve(response); + }).error(function(error) { + deferred.reject(error.message || error); + }); + + return deferred.promise; + }, + + resendVerifyEmail: function(_email) { + + var deferred = $q.defer(); + $http.post('/auth/verify', {email: _email}).success(function(response) { + deferred.resolve(response); + }).error(function(error) { + deferred.reject(error.message || error); + }); + + return deferred.promise; + }, + + validateVerifyToken: function(token) { + + //DAVID: TODO: The valid length of a token should somehow be linked to server config values + //DAVID: TODO: SEMI-URGENT: Should we even be doing this? + var validTokenRe = /^([A-Za-z0-9]{48})$/g; + if( !validTokenRe.test(token) ) throw new Error('Error token: '+token+' is not a valid verification token'); + + var deferred = $q.defer(); + $http.get('/auth/verify/'+token).success(function(response) { + deferred.resolve(response); + }).error(function(error) { + deferred.reject(error); + }); + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + // add new option to the field + $scope.addOption = function(field_index){ + var currField = $scope.myform.form_fields[field_index]; + //console.log(field_index); + //console.log(currField); + + if(currField.fieldType === 'checkbox' || currField.fieldType === 'dropdown' || currField.fieldType === 'radio'){ +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 + if(!currField.fieldOptions){ + $scope.myform.form_fields[field_index].fieldOptions = []; + } + + var lastOptionID = $scope.myform.form_fields[field_index].fieldOptions.length+1; + + // new option's id +======= + if(!currField.fieldOptions) $scope.myform.form_fields[field_index].fieldOptions = []; +======= + return deferred.promise; + }, +>>>>>>> make it work + + resetPassword: function(passwordDetails, token) { + + var deferred = $q.defer(); + $http.get('/auth/password/'+token, passwordDetails).success(function(response) { + deferred.resolve(); + }).error(function(error) { + deferred.reject(error.message || error); + }); + + return deferred.promise; + }, +>>>>>>> make it work + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + var newOption = { + 'option_id' : Math.floor(100000*Math.random()), + 'option_title' : 'Option '+lastOptionID, + 'option_value' : 'Option ' +lastOptionID + }; +======= + // Submit forgotten password account id + askForPasswordReset: function(credentials) { +>>>>>>> make it work + + var deferred = $q.defer(); + $http.post('/auth/forgot', credentials).success(function(response) { + // Show user success message and clear form + deferred.resolve(response); + }).error(function(error) { + // Show user error message + deferred.reject(error.message || error); + }); + + return deferred.promise; + } + + }; + + return userService; + + } +]); + +'use strict'; + +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 + // decides whether field options block will be shown (true for dropdown and radio fields) + $scope.showRatingOptions = function (field){ + if(field.fieldType === 'rating'){ + return true; + } else { + return false; + } + }; + + + }] +======= +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + }] +>>>>>>> make it work + + }; + } +======= +// Users service used for communicating with the users REST endpoint +angular.module('users').factory('Users', ['$resource', + function($resource) { + return $resource('users', {}, { + update: { + method: 'PUT' + } + }); + } +>>>>>>> make it work +]); +'use strict'; + // Forms controller angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope', '$stateParams', '$state', 'Forms', 'CurrentForm', '$http', '$uibModal', 'myForm', function($rootScope, $scope, $stateParams, $state, Forms, CurrentForm, $http, $uibModal, myForm) { @@ -929,767 +2752,7 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope } }; - // Remove existing Form - $scope.removeCurrentForm = function() { - if($scope.deleteModal && $scope.deleteModal.opened){ - - $scope.deleteModal.close(); - - var form_id = $scope.myform._id; - if(!form_id) throw new Error('Error - removeCurrentForm(): $scope.myform._id does not exist'); - - $http.delete('/forms/'+form_id) - .success(function(data, status, headers){ - console.log('form deleted successfully'); - - $state.go('listForms', {}, {reload: true}); - - }).error(function(error){ - console.log('ERROR: Form could not be deleted.'); - console.error(error); - }); - } - }; - - // Update existing Form - $scope.update = $rootScope.update = function(updateImmediately, cb){ - - var continueUpdate = true; - if(!updateImmediately){ - continueUpdate = !$rootScope.saveInProgress; - } - - //Update form **if we are not currently updating** or if **shouldUpdateNow flag is set** - if(continueUpdate){ - var err = null; - - if(!updateImmediately){ $rootScope.saveInProgress = true; } - - $scope.updatePromise = $http.put('/forms/'+$scope.myform._id, {form: $scope.myform}) - .then(function(response){ - $rootScope.myform = $scope.myform = response.data; - // console.log(response.data); - }).catch(function(response){ - console.log('Error occured during form UPDATE.\n'); - // console.log(response.data); - err = response.data; - }).finally(function() { - // console.log('finished updating'); - if(!updateImmediately){$rootScope.saveInProgress = false; } - - if( (typeof cb) === 'function'){ - return cb(err); - } - }); - } - }; - - - } -]); - -'use strict'; - -// Forms controller -angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope', '$stateParams', '$state', 'Forms', 'CurrentForm', '$http', - function($rootScope, $scope, $stateParams, $state, Forms, CurrentForm, $http) { - - $scope = $rootScope; - $scope.forms = {}; - $scope.showCreateModal = false; - - // Return all user's Forms - $scope.findAll = function() { - Forms.query(function(_forms){ - $scope.myforms = _forms; - }); - }; - - //Modal functions - $scope.openCreateModal = function(){ - if(!$scope.showCreateModal){ - $scope.showCreateModal = true; - } - }; - $scope.closeCreateModal = function(){ - if($scope.showCreateModal){ - $scope.showCreateModal = false; - } - }; - - $scope.setForm = function (form) { - $scope.myform = form; - }; - $scope.goToWithId = function(route, id) { - $state.go(route, {'formId': id}, {reload: true}); - }; - - $scope.duplicateForm = function(form_index){ - var form = _.cloneDeep($scope.myforms[form_index]); - delete form._id; - - $http.post('/forms', {form: form}) - .success(function(data, status, headers){ - $scope.myforms.splice(form_index+1, 0, data); - }).error(function(errorResponse){ - console.error(errorResponse); - if(errorResponse === null){ - $scope.error = errorResponse.data.message; - } - }); - }; - - // Create new Form - $scope.createNewForm = function(){ - // console.log($scope.forms.createForm); - - var form = {}; - form.title = $scope.forms.createForm.title.$modelValue; - form.language = $scope.forms.createForm.language.$modelValue; - - if($scope.forms.createForm.$valid && $scope.forms.createForm.$dirty){ - $http.post('/forms', {form: form}) - .success(function(data, status, headers){ - console.log('new form created'); - // Redirect after save - $scope.goToWithId('viewForm.create', data._id+''); - }).error(function(errorResponse){ - console.error(errorResponse); - $scope.error = errorResponse.data.message; - }); - } - }; - - $scope.removeForm = function(form_index) { - if(form_index >= $scope.myforms.length || form_index < 0){ - throw new Error('Error: form_index in removeForm() must be between 0 and '+$scope.myforms.length-1); - } - - $http.delete('/forms/'+$scope.myforms[form_index]._id) - .success(function(data, status, headers){ - console.log('form deleted successfully'); - $scope.myforms.splice(form_index, 1); - }).error(function(error){ - console.log('ERROR: Form could not be deleted.'); - console.error(error); - }); - }; - } -]); -'use strict'; - -// SubmitForm controller -angular.module('forms').controller('SubmitFormController', ['$scope', '$rootScope', '$state', 'myForm', 'Auth', - function($scope, $rootScope, $state, myForm, Auth) { - $scope.authentication = Auth; - $scope.myform = myForm; - - if(!$scope.myform.isLive){ - // Show navbar if form is not public AND user IS loggedin - if($scope.authentication.isAuthenticated()){ - $scope.hideNav = $rootScope.hideNav = false; - } - // Redirect if form is not public user IS NOT loggedin - else { - $scope.hideNav = $rootScope.hideNav = true; - $state.go('access_denied'); - } - }else{ - $scope.hideNav = $rootScope.hideNav = true; - } - - } -]); -(function () { - 'use strict'; - - // Create the SendVisitorData service - angular - .module('forms') - .factory('SendVisitorData', SendVisitorData); - - SendVisitorData.$inject = ['Socket', '$state']; - - function SendVisitorData(Socket, $state) { - - // Create a controller method for sending visitor data - function send(form, lastActiveIndex, timeElapsed) { - - console.log(lastActiveIndex); - // Create a new message object - var visitorData = { - referrer: document.referrer, - isSubmitted: form.submitted, - formId: form._id, - lastActiveField: form.form_fields[lastActiveIndex]._id, - timeElapsed: timeElapsed - }; - Socket.emit('form-visitor-data', visitorData); - } - - function init(){ - // Make sure the Socket is connected - if (!Socket.socket) { - Socket.connect(); - } - } - - var service = { - send: send - }; - - init(); - return service; - - } -}()); - - -'use strict'; - - -function removeDateFieldsFunc(o) { - var clone = _.clone(o); - function eachObject(v,k){ - - if(k === 'lastModified' || k === 'created'){ - delete clone[k]; - } - } - - for(var i=0; i FormFields - $scope.oscarFieldsLeft = function(field_id){ - - if($scope.myform && $scope.myform.plugins.oscarhost.settings.validFields.length > 0){ - if(!$scope.myform.plugins.oscarhost.settings.fieldMap) $scope.myform.plugins.oscarhost.settings.fieldMap = {}; - - var oscarhostFields = $scope.myform.plugins.oscarhost.settings.validFields; - var currentFields = _($scope.myform.plugins.oscarhost.settings.fieldMap).invert().keys().value(); - - if( $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id) ){ - currentFields = _(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id]); - } - - //Get all oscarhostFields that haven't been mapped to a formfield - return _(oscarhostFields).difference(currentFields).value(); - } - return []; - }; - - /* - ** FormFields (ui-sortable) drag-and-drop configuration - */ - $scope.dropzone = { - handle: '.handle', - containment: '.dropzoneContainer', - cursor: 'grabbing' - }; - - /* - ** Field CRUD Methods - */ - // Add a new field - $scope.addNewField = function(modifyForm, fieldType){ - - // increment lastAddedID counter - $scope.addField.lastAddedID++; - var fieldTitle; - - for(var i = 0; i < $scope.addField.types.length; i++){ - if($scope.addField.types[i].name === fieldType){ - $scope.addField.types[i].lastAddedID++; - fieldTitle = $scope.addField.types[i].value+$scope.addField.types[i].lastAddedID; - break; - } - } - var newField = { - title: fieldTitle, - fieldType: fieldType, - fieldValue: '', - required: true, - disabled: false, - deletePreserved: false - }; - - if($scope.showAddOptions(newField)){ - newField.fieldOptions = []; - newField.fieldOptions.push({ - 'option_id' : Math.floor(100000*Math.random()), //Generate pseudo-random option id - 'option_title' : 'Option 0', - 'option_value' : 'Option 0' - }); - } - - - if(modifyForm){ - //Add newField to form_fields array - $scope.myform.form_fields.push(newField); - } - return newField; - }; - - // Delete particular field on button click - $scope.deleteField = function (field_index){ - - //Delete field from field map - var currFieldId = $scope.myform.form_fields[field_index]._id; - if($scope.myform.hasOwnProperty('plugins.oscarhost.baseUrl')) delete $scope.myform.plugins.oscarhost.settings.fieldMap[currFieldId]; - - //Delete field - $scope.myform.form_fields.splice(field_index, 1); - }; - $scope.duplicateField = function (field_index){ - var currField = _.cloneDeep($scope.myform.form_fields[field_index]); - currField._id = 'cloned'+_.uniqueId(); - currField.title += ' copy'; - - //Insert field at selected index - $scope.myform.form_fields.splice(field_index+1, 0, currField); - }; - - - /* - ** startPage Button Methods - */ - - // add new Button to the startPage - $scope.addButton = function(){ - - var newButton = {}; - newButton.bgColor = '#ddd'; - newButton.color = '#ffffff'; - newButton.text = 'Button'; - newButton._id = Math.floor(100000*Math.random()); - - $scope.myform.startPage.buttons.push(newButton); - }; - - // delete particular Button from startPage - $scope.deleteButton = function(button){ - var currID; - for(var i = 0; i < $scope.myform.startPage.buttons.length; i++){ - - currID = $scope.myform.startPage.buttons[i]._id; - console.log(currID); - - if(currID === button._id){ - $scope.myform.startPage.buttons.splice(i, 1); - break; - } - } - }; - - - /* - ** Field Option Methods - */ - - // add new option to the field - $scope.addOption = function(field_index){ - var currField = $scope.myform.form_fields[field_index]; - //console.log(field_index); - //console.log(currField); - - if(currField.fieldType === 'checkbox' || currField.fieldType === 'dropdown' || currField.fieldType === 'radio'){ - if(!currField.fieldOptions){ - $scope.myform.form_fields[field_index].fieldOptions = []; - } - - var lastOptionID = $scope.myform.form_fields[field_index].fieldOptions.length+1; - - // new option's id - - var newOption = { - 'option_id' : Math.floor(100000*Math.random()), - 'option_title' : 'Option '+lastOptionID, - 'option_value' : 'Option ' +lastOptionID - }; - - // put new option into fieldOptions array - $scope.myform.form_fields[field_index].fieldOptions.push(newOption); - } - }; - - // delete particular option - $scope.deleteOption = function (field_index, option){ - var currField = $scope.myform.form_fields[field_index]; - - if(currField.fieldType === 'checkbox' || currField.fieldType === 'dropdown' || currField.fieldType === 'radio'){ - for(var i = 0; i < currField.fieldOptions.length; i++){ - if(currField.fieldOptions[i].option_id === option.option_id){ - - $scope.myform.form_fields[field_index].fieldOptions.splice(i, 1); - break; - - } - } - } - }; - - // decides whether field options block will be shown (true for dropdown and radio fields) - $scope.showAddOptions = function (field){ - if(field.fieldType === 'dropdown' || field.fieldType === 'checkbox' || field.fieldType === 'radio'){ - return true; - } else { - return false; - } - }; - - // decides whether field options block will be shown (true for dropdown and radio fields) - $scope.showRatingOptions = function (field){ - if(field.fieldType === 'rating'){ - return true; - } else { - return false; - } - }; - - - }] - - }; - } -]); - -'use strict'; - -angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope', '$http', - function ($rootScope, $http) { - return { - templateUrl: 'modules/forms/views/directiveViews/form/edit-submissions-form.client.view.html', - restrict: 'E', - scope: { - myform:'=', - user:'=' - }, - controller: ["$scope", function($scope){ - $scope.table = { - masterChecker: false, - rows: [] - }; - - /* - ** Table Functions - */ - $scope.isAtLeastOneChecked = function(){ - for(var i=0; i<$scope.table.rows.length; i++){ - if($scope.table.rows[i].selected) return true; - } - return false; - }; - $scope.toggleAllCheckers = function(){ - for(var i=0; i<$scope.table.rows.length; i++){ - $scope.table.rows[i].selected = $scope.table.masterChecker; - } - }; - $scope.toggleObjSelection = function($event, description) { - $event.stopPropagation(); - }; - $scope.rowClicked = function(row_index) { - $scope.table.rows[row_index].selected = !$scope.table.rows[row_index].selected; - }; - - /* - * Form Submission Methods - */ - - //Fetch and display submissions of Form - $scope.initFormSubmissions = function(){ - $http.get('/forms/'+$scope.myform._id+'/submissions') - .success(function(data, status, headers){ - - var _tmpSubFormFields, - defaultFormFields = _.cloneDeep($scope.myform.form_fields); - +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c // console.log('before textField2: '+data[0].form_fields[1].fieldValue); //Iterate through form's submissions @@ -1702,9 +2765,18 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope', data[i].selected = false; } // console.log('after textField2: '+data[0].form_fields[1].fieldValue); +======= + // Remove existing Form + $scope.removeCurrentForm = function() { + if($scope.deleteModal && $scope.deleteModal.opened){ - $scope.table.rows = data; + $scope.deleteModal.close(); +>>>>>>> make it work + var form_id = $scope.myform._id; + if(!form_id) throw new Error('Error - removeCurrentForm(): $scope.myform._id does not exist'); + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c // console.log('form submissions successfully fetched'); // console.log( JSON.parse(JSON.stringify($scope.submissions)) ) ; // console.log( JSON.parse(JSON.stringify($scope.myform.form_fields)) ); @@ -1713,14 +2785,22 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope', console.error('Could not fetch form submissions.\nError: '+err); }); }; +======= + $http.delete('/forms/'+form_id) + .success(function(data, status, headers){ + console.log('form deleted successfully'); +>>>>>>> make it work - //Delete selected submissions of Form - $scope.deleteSelectedSubmissions = function(){ + $state.go('listForms', {}, {reload: true}); - var delete_ids = _.chain($scope.table.rows).filter(function(row){ - return !!row.selected; - }).pluck('_id').value(); + }).error(function(error){ + console.log('ERROR: Form could not be deleted.'); + console.error(error); + }); + } + }; +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c $http({ url: '/forms/'+$scope.myform._id+'/submissions', method: 'DELETE', data: {deleted_submissions: delete_ids}, @@ -1761,14 +2841,43 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope', saveAs(blob, $scope.myform.title+'_sumbissions_export_'+Date.now()+'.'+type); */ }; +======= + // Update existing Form + $scope.update = $rootScope.update = function(updateImmediately, cb){ - }] + var continueUpdate = true; + if(!updateImmediately){ + continueUpdate = !$rootScope.saveInProgress; + } + + //Update form **if we are not currently updating** or if **shouldUpdateNow flag is set** + if(continueUpdate){ + var err = null; +>>>>>>> make it work + + if(!updateImmediately){ $rootScope.saveInProgress = true; } + + $scope.updatePromise = $http.put('/forms/'+$scope.myform._id, {form: $scope.myform}) + .then(function(response){ + $rootScope.myform = $scope.myform = response.data; + // console.log(response.data); + }).catch(function(response){ + console.log('Error occured during form UPDATE.\n'); + // console.log(response.data); + err = response.data; + }).finally(function() { + // console.log('finished updating'); + if(!updateImmediately){$rootScope.saveInProgress = false; } + + if( (typeof cb) === 'function'){ + return cb(err); + } + }); + } }; - } -]); -'use strict'; +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 angular.module('forms').directive('fieldIconDirective', function() { return { @@ -1800,20 +2909,29 @@ angular.module('forms').directive('fieldIconDirective', function() { }] }; }); +======= + } +]); +>>>>>>> make it work 'use strict'; -// coffeescript's for in loop -var __indexOf = [].indexOf || function(item) { - for (var i = 0, l = this.length; i < l; i++) { - if (i in this && this[i] === item) return i; - } - return -1; -}; +// Forms controller +angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope', '$stateParams', '$state', 'Forms', 'CurrentForm', '$http', + function($rootScope, $scope, $stateParams, $state, Forms, CurrentForm, $http) { + + $scope = $rootScope; + $scope.forms = {}; + $scope.showCreateModal = false; -angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$rootScope', '$templateCache', - function($http, $compile, $rootScope, $templateCache) { + // Return all user's Forms + $scope.findAll = function() { + Forms.query(function(_forms){ + $scope.myforms = _forms; + }); + }; +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c var getTemplateUrl = function(fieldType) { var type = fieldType; var templateUrl = 'modules/forms/views/directiveViews/field/'; @@ -1837,7 +2955,20 @@ angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$root } return $templateCache.get('../public/'+templateUrl); }; +======= + //Modal functions + $scope.openCreateModal = function(){ + if(!$scope.showCreateModal){ + $scope.showCreateModal = true; + } + }; + $scope.closeCreateModal = function(){ + if($scope.showCreateModal){ + $scope.showCreateModal = false; + } + }; +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 return { template: '
{{field.title}}
', restrict: 'E', @@ -1849,37 +2980,53 @@ angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$root forms: '=' }, link: function(scope, element) { +======= + $scope.setForm = function (form) { + $scope.myform = form; + }; + $scope.goToWithId = function(route, id) { + $state.go(route, {'formId': id}, {reload: true}); + }; +>>>>>>> make it work +>>>>>>> make it work - $rootScope.chooseDefaultOption = scope.chooseDefaultOption = function(type) { - if(type === 'yes_no'){ - scope.field.fieldValue = 'true'; - }else if(type === 'rating'){ - scope.field.fieldValue = 0; - }else if(scope.field.fieldType === 'radio'){ - console.log(scope.field); - scope.field.fieldValue = scope.field.fieldOptions[0].option_value; - console.log(scope.field.fieldValue); - }else if(type === 'legal'){ - scope.field.fieldValue = 'true'; - $rootScope.nextField(); - } - }; + $scope.duplicateForm = function(form_index){ + var form = _.cloneDeep($scope.myforms[form_index]); + delete form._id; + + $http.post('/forms', {form: form}) + .success(function(data, status, headers){ + $scope.myforms.splice(form_index+1, 0, data); + }).error(function(errorResponse){ + console.error(errorResponse); + if(errorResponse === null){ + $scope.error = errorResponse.data.message; + } + }); + }; - scope.setActiveField = $rootScope.setActiveField; + // Create new Form + $scope.createNewForm = function(){ + // console.log($scope.forms.createForm); - //Set format only if field is a date - if(scope.field.fieldType === 'date'){ - scope.dateOptions = { - changeYear: true, - changeMonth: true, - altFormat: 'mm/dd/yyyy', - yearRange: '1900:-0', - defaultDate: 0 - }; + var form = {}; + form.title = $scope.forms.createForm.title.$modelValue; + form.language = $scope.forms.createForm.language.$modelValue; + + if($scope.forms.createForm.$valid && $scope.forms.createForm.$dirty){ + $http.post('/forms', {form: form}) + .success(function(data, status, headers){ + console.log('new form created'); + // Redirect after save + $scope.goToWithId('viewForm.create', data._id+''); + }).error(function(errorResponse){ + console.error(errorResponse); + $scope.error = errorResponse.data.message; + }); } + }; - var fieldType = scope.field.fieldType; - +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 if(scope.field.fieldType === 'number' || scope.field.fieldType === 'textfield' || scope.field.fieldType === 'email' || scope.field.fieldType === 'link'){ switch(scope.field.fieldType){ case 'textfield': @@ -1906,9 +3053,27 @@ angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$root } }; }]); +======= + $scope.removeForm = function(form_index) { + if(form_index >= $scope.myforms.length || form_index < 0){ + throw new Error('Error: form_index in removeForm() must be between 0 and '+$scope.myforms.length-1); + } +>>>>>>> make it work + $http.delete('/forms/'+$scope.myforms[form_index]._id) + .success(function(data, status, headers){ + console.log('form deleted successfully'); + $scope.myforms.splice(form_index, 1); + }).error(function(error){ + console.log('ERROR: Form could not be deleted.'); + console.error(error); + }); + }; + } +]); 'use strict'; +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c angular.module('forms').directive('keyToOption', function(){ return { restrict: 'A', @@ -2041,9 +3206,19 @@ angular.module('forms').directive('onEnterKey', ['$rootScope', function($rootSco } }; }]); +======= -'use strict'; +function removeDateFieldsFunc(o) { + var clone = _.clone(o); + function eachObject(v,k){ + + if(k === 'lastModified' || k === 'created'){ + delete clone[i][k]; + } + } +>>>>>>> make it work +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 angular.module('forms').directive('onFinishRender', ["$rootScope", "$timeout", function ($rootScope, $timeout) { return { restrict: 'A', @@ -2053,25 +3228,51 @@ angular.module('forms').directive('onFinishRender', ["$rootScope", "$timeout", f if(!element.attr('ng-repeat') && !element.attr('data-ng-repeat')){ return; } +======= + for(var i=0; i>>>>>> make it work - if(scope.$first && !scope.$last) { - scope.$evalAsync(function () { - $rootScope.$broadcast(broadcastMessage+' Started'); +angular.module('forms').directive('autoSaveForm', ['$rootScope', '$timeout', function($rootScope, $timeout) { + + return { + require: ['^form'], + restrict: 'AE', + link: function($scope, $element, $attrs, $ctrls) { + //DAVID: TODO: Do we really need to check if our directive element is ready everytime + angular.element(document).ready(function() { + + var $formCtrl = $ctrls[0], + savePromise = null; + + $rootScope.finishedRender = false; + $scope.$on('editFormFields Started', function(ngRepeatFinishedEvent) { + // console.log('hello'); + $rootScope.finishedRender = false; }); - }else if(scope.$last) { - scope.$evalAsync(function () { - // console.log(broadcastMessage+'Finished'); - $rootScope.$broadcast(broadcastMessage+' Finished'); + $scope.$on('editFormFields Finished', function(ngRepeatFinishedEvent) { + $rootScope.finishedRender = true; }); - } - } - }; -}]); -'use strict'; + $scope.anyDirtyAndTouched = function(form){ + var propCount = 0; + for(var prop in form) { + if(form.hasOwnProperty(prop) && prop[0] !== '$') { + propCount++; + if(form[prop].$touched && form[prop].$dirty) { + return true; + } + } + } + return false; + }; +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter', '$filter', '$rootScope', 'Auth', 'SendVisitorData', function ($http, TimeCounter, $filter, $rootScope, Auth, SendVisitorData) { return { @@ -2087,39 +3288,61 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' $scope.form_fields_count = $scope.myform.visible_form_fields.filter(function(field){ if(field.fieldType === 'statement' || field.fieldType === 'rating'){ return false; - } - return true; - }).length; +======= + var debounceSave = function () { + $rootScope.saveInProgress = true; - $scope.reloadForm = function(){ - //Reset Form - $scope.myform.submitted = false; - $scope.myform.form_fields = _.chain($scope.myform.visible_form_fields).map(function(field){ - field.fieldValue = ''; - return field; - }).value(); - - $scope.loading = false; - $scope.error = ''; - - $scope.selected = { - _id: '', - index: 0 - }; - $scope.setActiveField($scope.myform.visible_form_fields[0]._id, 0, false); - - //console.log($scope.selected); - //Reset Timer - TimeCounter.restartClock(); + $rootScope[$attrs.autoSaveCallback](true, + function(err){ + if(!err){ + console.log('\n\nForm data persisted -- setting pristine flag'); + $formCtrl.$setPristine(); + $formCtrl.$setUntouched(); + }else{ + console.error('Error form data NOT persisted'); + console.error(err); + } + }); }; + //Update/Save Form if any Form fields are Dirty and Touched + $scope.$watch(function(newValue, oldValue) { + console.log('introParagraphStartPage.$dirty: '+$scope.editForm.introParagraphStartPage.$dirty); + console.log('introParagraphStartPage.$touched: '+$scope.editForm.introParagraphStartPage.$touched); + if($rootScope.finishedRender && $scope.anyDirtyAndTouched($scope.editForm) && !$rootScope.saveInProgress){ + console.log('Form saving started'); + debounceSave(); + console.log('introParagraphStartPage.$dirty AFTER: '+$scope.editForm.introParagraphStartPage.$dirty); +>>>>>>> make it work + } + }); + + //Autosave Form when model (specificed in $attrs.autoSaveWatch) changes + $scope.$watch($attrs.autoSaveWatch, function(newValue, oldValue) { + + newValue = angular.copy(newValue); + oldValue = angular.copy(oldValue); + + newValue.form_fields = _.removeDateFields(newValue.form_fields); + oldValue.form_fields = _.removeDateFields(oldValue.form_fields); + + var changedFields = !_.isEqual(oldValue.form_fields,newValue.form_fields) || !_.isEqual(oldValue.startPage, newValue.startPage); + var changedFieldMap = false; + +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 //Fire event when window is scrolled $window.onscroll = function(){ $scope.scrollPos = document.body.scrollTop || document.documentElement.scrollTop || 0; var elemBox = document.getElementsByClassName('activeField')[0].getBoundingClientRect(); $scope.fieldTop = elemBox.top; $scope.fieldBottom = elemBox.bottom; +======= + if(oldValue.hasOwnProperty('plugins.oscarhost.settings.fieldMap')){ + changedFieldMap = !!oldValue.plugins.oscarhost.settings.fieldMap && !_.isEqual(oldValue.plugins.oscarhost.settings.fieldMap,newValue.plugins.oscarhost.settings.fieldMap); + } +>>>>>>> make it work +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c //console.log($scope.forms.myForm); var field_id; var field_index; @@ -2146,13 +3369,54 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' field_index = $scope.selected.index-1; field_id = $scope.myform.visible_form_fields[field_index]._id; $scope.setActiveField(field_id, field_index, false); - } - //console.log('$scope.selected.index: '+$scope.selected.index); - //console.log('scroll pos: '+$scope.scrollPos+' fieldTop: '+$scope.fieldTop+' fieldBottom: '+$scope.fieldBottom); - $scope.$apply(); +======= + //If our form is undefined, don't save form + if( (!newValue && !oldValue) || !oldValue ){ + return; } - }; + + // console.log('Autosaving'); + // console.log('\n\n----------'); + // console.log('!$dirty: '+ !$formCtrl.$dirty ); + // console.log('changedFields: '+changedFields); + // console.log('changedFieldMap: '+changedFieldMap); + // console.log('finishedRender: '+$rootScope.finishedRender); + // console.log('!saveInProgress: '+!$rootScope.saveInProgress); + // console.log('newValue: '+newValue); + // console.log('oldValue: '+oldValue); + // console.log(oldValue.form_fields); + // console.log(newValue.form_fields); + if(oldValue.form_fields.length === 0) { + $rootScope.finishedRender = true; + } + + //Save form ONLY IF rendering is finished, form_fields have been changed AND currently not save in progress + if( $rootScope.finishedRender && ((changedFields && !$formCtrl.$dirty) || changedFieldMap) && !$rootScope.saveInProgress) { + + if(savePromise) { + $timeout.cancel(savePromise); + savePromise = null; +>>>>>>> make it work + } + + savePromise = $timeout(function() { + debounceSave(); + }); + } + //If we are finished rendering then form saving should be finished + else if($rootScope.finishedRender && $rootScope.saveInProgress){ + $rootScope.saveInProgress = false; + } + +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 +======= +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + $rootScope.setDropdownOption = function(){ + console.log('setDropdownOption index: '); + }; + +>>>>>>> make it work /* ** Field Controls */ @@ -2178,10 +3442,44 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' //console.log('field_id: '+field_id); //console.log('field_index: '+field_index); //console.log($scope.selected); +======= + }, true); + }); + } + }; + +}]); - $scope.selected._id = field_id; - $scope.selected.index = field_index; +'use strict'; +angular.module('forms').directive('configureFormDirective', ['$rootScope', '$http', 'Upload', 'CurrentForm', + function ($rootScope, $http, Upload, CurrentForm) { + return { + templateUrl: 'modules/forms/admin/views/directiveViews/form/configure-form.client.view.html', + restrict: 'E', + scope: { + myform:'=', + user:'=', + pdfFields:'@', + formFields:'@' + }, + controller: ["$scope", function($scope){ + console.log($scope.myform); + if( CurrentForm.getForm().plugins){ + if(CurrentForm.getForm().plugins.oscarhost.baseUrl) $scope.oscarhostAPI = true; + }else{ + $scope.oscarhostAPI = false; + } + $scope.log = ''; + $scope.pdfLoading = false; + $scope.languages = $rootScope.languages; +>>>>>>> make it work + + this._current_upload = null; + $scope.resetForm = $rootScope.resetForm; + $scope.update = $rootScope.update; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c if(animateScroll){ $scope.noscroll=true; setTimeout(function() { @@ -2262,10 +3560,15 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' var form = _.cloneDeep($scope.myform); form.timeElapsed = _timeElapsed; +======= + this._unbindedPdfFields = $scope.pdfFields; - form.percentageComplete = $filter('formValidity')($scope.myform) / $scope.myform.visible_form_fields.length * 100; - delete form.visible_form_fields; + //DAVID: TODO: finish this so we can create a Form.pdfFieldMap + // $scope.getUnbindedPdfFields = function(fieldType){ + // this._unbindedPdfFields = $scope.pdfFields + // } +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 for(var i=0; i < $scope.myform.form_fields.length; i++){ if($scope.myform.form_fields[i].fieldType === 'dropdown' && !$scope.myform.form_fields[i].deletePreserved){ $scope.myform.form_fields[i].fieldValue = $scope.myform.form_fields[i].fieldValue.option_value; @@ -2286,10 +3589,69 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' $scope.error = error.message; }); }, 500); +======= + //PDF Functions + $scope.cancelUpload = function(){ + this._current_upload.abort(); + $scope.pdfLoading = false; + $scope.removePDF(); }; + $scope.removePDF = function(){ + $scope.myform.pdf = null; + $scope.myform.isGenerated = false; + $scope.myform.autofillPDFs = false; + + console.log('form.pdf: '+$scope.myform.pdf+' REMOVED'); + }; + + $scope.uploadPDF = function(file) { +>>>>>>> make it work + + if (file) { + console.log(file); + + Upload.upload({ + url: '/upload/pdf', + data: { + 'user': $scope.user, + file: file + } + }).then(function (resp) { + var data = resp.data; + $scope.log = 'file ' + data.originalname + ' uploaded as ' + data.filename + '. JSON: ' + JSON.stringify(data) + '\n' + $scope.log; + $scope.myform.pdf = angular.fromJson(angular.toJson(data)); + + //console.log($scope.myform.pdf); + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c //Reload our form $scope.reloadForm(); +======= + $scope.pdfLoading = false; + + console.log($scope.log); + if (!$scope.$$phase && !$scope.$digest) { + $scope.$apply(); + } + }, function(resp){ + $scope.pdfLoading = false; + console.log('Error occured during upload.\n'); + console.log(resp.status); + }, function (evt) { + var progressPercentage = parseInt(100.0 * evt.loaded / evt.total, 10); + $scope.log = 'progress: ' + progressPercentage + '% ' + + evt.config.data.file.name + '\n' + $scope.log; + + console.log($scope.log); + + $scope.pdfLoading = true; + }); + } +>>>>>>> make it work + }; + +>>>>>>> make it work }] }; } @@ -2297,99 +3659,54 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' 'use strict'; -//Forms service used for communicating with the forms REST endpoints -angular.module('forms').service('CurrentForm', - function(){ +angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormFields', + function ($rootScope, FormFields) { + return { + templateUrl: 'modules/forms/admin/views/directiveViews/form/edit-form.client.view.html', + restrict: 'E', + scope: { + myform:'=' + }, + controller: ["$scope", function($scope){ + var field_ids = _($scope.myform.form_fields).pluck('_id'); + for(var i=0; i FormFields + $scope.oscarFieldsLeft = function(field_id){ + + if($scope.myform && $scope.myform.plugins.oscarhost.settings.validFields.length > 0){ + if(!$scope.myform.plugins.oscarhost.settings.fieldMap) $scope.myform.plugins.oscarhost.settings.fieldMap = {}; + + var oscarhostFields = $scope.myform.plugins.oscarhost.settings.validFields; + var currentFields = _($scope.myform.plugins.oscarhost.settings.fieldMap).invert().keys().value(); + + if( $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id) ){ + currentFields = _(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id]); + } + +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 //Forms service used for communicating with the forms REST endpoints angular.module('forms').factory('Forms', ['$resource', function($resource) { @@ -2430,37 +3747,66 @@ angular.module('forms').factory('Forms', ['$resource', }); } ]); +======= + //Get all oscarhostFields that haven't been mapped to a formfield + return _(oscarhostFields).difference(currentFields).value(); + } + return []; + }; -'use strict'; + /* + ** FormFields (ui-sortable) drag-and-drop configuration + */ + $scope.dropzone = { + handle: ' .handle', + containment: '.dropzoneContainer', + cursor: 'grabbing' + }; +>>>>>>> make it work -//Submissions service used for communicating with the forms REST endpoints -angular.module('forms').factory('Submissions', ['$resource', - function($resource) { - return $resource('forms/:formID/submissions/:submissionId', { - submissionId: '@_id', - formId: '@_id' - }, { - 'query' : { - method: 'GET', - isArray: true, - }, - 'update': { - method: 'PUT' - }, - 'save': { - method: 'POST' - } - }); - } -]); -'use strict'; + /* + ** Field CRUD Methods + */ + // Add a new field + $scope.addNewField = function(modifyForm, fieldType){ + // incr field_id counter + $scope.addField.lastAddedID++; + var fieldTitle; + +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 angular.module('forms').service('TimeCounter', [ function(){ var _startTime, _endTime = null, that=this; +======= + for(var i = 0; i < $scope.addField.types.length; i++){ + if($scope.addField.types[i].name === fieldType){ + $scope.addField.types[i].lastAddedID++; + fieldTitle = $scope.addField.types[i].value+$scope.addField.types[i].lastAddedID; + break; + } + } + var newField = { + title: fieldTitle, + fieldType: fieldType, + fieldValue: '', + required: true, + disabled: false, + deletePreserved: false + }; + // console.log('\n\n---------\nAdded field CLIENT'); + // console.log(newField); + // newField._id = _.uniqueId(); +>>>>>>> make it work - this.timeSpent = 0; + // put newField into fields array + if(modifyForm){ + $scope.myform.form_fields.push(newField); + } + return newField; + }; +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 this.restartClock = function(){ _startTime = Date.now(); _endTime = null; @@ -2484,16 +3830,40 @@ angular.module('forms').service('TimeCounter', [ return new Error('Clock has not been started'); } }; +======= + // Delete particular field on button click + $scope.deleteField = function (field_index){ - this.clockStarted = function(){ - return !!this._startTime; - }; + //Delete field from field map + var currFieldId = $scope.myform.form_fields[field_index]._id; + if($scope.myform.hasOwnProperty('plugins.oscarhost.baseUrl')) delete $scope.myform.plugins.oscarhost.settings.fieldMap[currFieldId]; + //Delete field + $scope.myform.form_fields.splice(field_index, 1); + }; + $scope.duplicateField = function (field_index){ + var currField = _.cloneDeep($scope.myform.form_fields[field_index]); + currField._id = 'cloned'+_.uniqueId(); + currField.title += ' copy'; + + //Insert field at selected index + $scope.myform.form_fields.splice(field_index+1, 0, currField); + }; +>>>>>>> make it work + + +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 } ]); 'use strict'; +======= + /* + ** startPage Button Methods + */ +>>>>>>> make it work +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c // Config HTTP Error Handling angular.module('users').config(['$httpProvider', function($httpProvider) { @@ -2521,14 +3891,26 @@ angular.module('users').config(['$httpProvider', }]); 'use strict'; +======= + // add new Button to the startPage + $scope.addButton = function(){ -// Setting up route -angular.module('users').config(['$stateProvider', - function($stateProvider) { + var newButton = {}; + newButton.bgColor = '#ddd'; + newButton.color = '#ffffff'; + newButton.text = 'Button'; + newButton._id = Math.floor(100000*Math.random()); +>>>>>>> make it work - var checkLoggedin = function($q, $timeout, $state, User, Auth) { - var deferred = $q.defer(); + $scope.myform.startPage.buttons.push(newButton); + }; + // delete particular Button from startPage + $scope.deleteButton = function(button){ + var currID; + for(var i = 0; i < $scope.myform.startPage.buttons.length; i++){ + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c //console.log(Auth.ensureHasCurrentUser(User)); if (Auth.currentUser && Auth.currentUser.email) { @@ -2546,11 +3928,20 @@ angular.module('users').config(['$stateProvider', $state.go('signin', {reload: true}); }); } +======= + currID = $scope.myform.startPage.buttons[i]._id; + console.log(currID); - return deferred.promise; - }; - checkLoggedin.$inject = ["$q", "$timeout", "$state", "User", "Auth"]; + if(currID === button._id){ + $scope.myform.startPage.buttons.splice(i, 1); + break; + } + } + }; +>>>>>>> make it work + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c var checkSignupDisabled = function($window, $timeout, $q) { var deferred = $q.defer(); if($window.signupDisabled) { @@ -2638,454 +4029,912 @@ angular.module('users').config(['$stateProvider', templateUrl: 'modules/users/views/password/reset-password.client.view.html' }); } +======= + /* + ** Field Option Methods + */ + + // add new option to the field + $scope.addOption = function(field_index){ + var currField = $scope.myform.form_fields[field_index]; + console.log(field_index); + console.log(currField); + + if(currField.fieldType === 'checkbox' || currField.fieldType === 'dropdown' || currField.fieldType === 'radio'){ + if(!currField.fieldOptions) $scope.myform.form_fields[field_index].fieldOptions = []; + + var lastOptionID = 0; + + if(currField.fieldOptions[currField.fieldOptions.length-1]){ + lastOptionID = currField.fieldOptions[currField.fieldOptions.length-1].option_id; + } + + // new option's id + var option_id = lastOptionID + 1; + + var newOption = { + 'option_id' : Math.floor(100000*Math.random()), + 'option_title' : 'Option '+lastOptionID, + 'option_value' : 'Option ' +lastOptionID + }; + + // put new option into fieldOptions array + $scope.myform.form_fields[field_index].fieldOptions.push(newOption); + } + }; + + // delete particular option + $scope.deleteOption = function (field_index, option){ + var currField = $scope.myform.form_fields[field_index]; + + if(currField.fieldType === 'checkbox' || currField.fieldType === 'dropdown' || currField.fieldType === 'radio'){ + for(var i = 0; i < currField.fieldOptions.length; i++){ + if(currField.fieldOptions[i].option_id === option.option_id){ + + $scope.myform.form_fields[field_index].fieldOptions.splice(i, 1); + break; + + } + } + } + }; + + // decides whether field options block will be shown (true for dropdown and radio fields) + $scope.showAddOptions = function (field){ + if(field.fieldType === 'dropdown' || field.fieldType === 'checkbox' || field.fieldType === 'radio'){ + return true; + } else { + return false; + } + }; + + }] + + }; + } +>>>>>>> make it work ]); 'use strict'; -angular.module('users').controller('AuthenticationController', ['$scope', '$location', '$state', '$rootScope', 'User', 'Auth', - function($scope, $location, $state, $rootScope, User, Auth) { +angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope', '$http', + function ($rootScope, $http) { + return { + templateUrl: 'modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html', + restrict: 'E', + scope: { + myform:'=', + user:'=' + }, + controller: ["$scope", function($scope){ + $scope.table = { + masterChecker: false, + rows: [] + }; - $scope = $rootScope; - $scope.credentials = {}; - $scope.error = ''; + /* + ** Table Functions + */ + $scope.isAtLeastOneChecked = function(){ + for(var i=0; i<$scope.table.rows.length; i++){ + if($scope.table.rows[i].selected) return true; + } + return false; + }; + $scope.toggleAllCheckers = function(){ + for(var i=0; i<$scope.table.rows.length; i++){ + $scope.table.rows[i].selected = $scope.table.masterChecker; + } + }; + $scope.toggleObjSelection = function($event, description) { + $event.stopPropagation(); + }; + $scope.rowClicked = function(row_index) { + $scope.table.rows[row_index].selected = !$scope.table.rows[row_index].selected; + }; - $scope.signin = function() { - $scope.credentials.email = $scope.credentials.username; - User.login($scope.credentials).then( - function(response) { - Auth.login(response); - $scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User); + /* + * Form Submission Methods + */ - if($state.previous.name !== 'home' && $state.previous.name !== 'verify' && $state.previous.name !== ''){ - $state.go($state.previous.name); - }else{ - $state.go('listForms'); - } - }, - function(error) { - $rootScope.user = Auth.ensureHasCurrentUser(User); - $scope.user = $rootScope.user; + //Fetch and display submissions of Form + $scope.initFormSubmissions = function(){ + $http.get('/forms/'+$scope.myform._id+'/submissions') + .success(function(data, status, headers){ - $scope.error = error; - console.log('loginError: '+error); - } - ); - }; + var _tmpSubFormFields, + defaultFormFields = _.cloneDeep($scope.myform.form_fields); - $scope.signup = function() { - console.log($scope.credentials); - User.signup($scope.credentials).then( - function(response) { - console.log('signup-success'); - $state.go('signup-success'); - }, - function(error) { - console.log('Error: '); - console.log(error); - if(error) { - $scope.error = error; - console.log(error); - }else { - console.log('No response received'); - } - } - ); - }; + // console.log('before textField2: '+data[0].form_fields[1].fieldValue); - } + //Iterate through form's submissions + for(var i=0; i', + restrict: 'E', + scope: { + typeName: '@' + }, + controller: ["$scope", function($scope){ + var iconTypeMap = { + 'textfield': 'fa fa-pencil-square-o', + 'dropdown': 'fa fa-th-list', + 'date': 'fa fa-calendar', + 'checkbox': 'fa fa-check-square-o', + 'radio': 'fa fa-dot-circle-o', + 'email': 'fa fa-envelope-o', + 'textarea': 'fa fa-pencil-square', + 'legal': 'fa fa-legal', + 'file': 'fa fa-cloud-upload', + 'rating': 'fa fa-star-half-o', + 'link': 'fa fa-link', + 'scale': 'fa fa-sliders', + 'stripe': 'fa fa-credit-card', + 'statement': 'fa fa-quote-left', + 'yes_no': 'fa fa-toggle-on', + 'number': 'fa fa-slack' + }; + $scope.typeIcon = iconTypeMap[$scope.typeName]; + }], + }; +}); +'use strict'; + +// coffeescript's for in loop +var __indexOf = [].indexOf || function(item) { + for (var i = 0, l = this.length; i < l; i++) { + if (i in this && this[i] === item) return i; + } + return -1; +}; + +angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$rootScope', '$templateCache', 'supportedFields', + function($http, $compile, $rootScope, $templateCache, supportedFields) { + + var getTemplateUrl = function(fieldType) { + var type = fieldType; + var templateUrl = 'modules/forms/base/views/directiveViews/field/'; + + if (__indexOf.call(supportedFields, type) >= 0) { + templateUrl = templateUrl+type+'.html'; + } + return $templateCache.get(templateUrl); }; - var service = { - _currentUser: null, - get currentUser(){ - return this._currentUser; - }, + return { + template: '
{{field.title}}
', + restrict: 'E', + scope: { + field: '=', + required: '&', + design: '=', + index: '=', + forms: '=' + }, + link: function(scope, element) { - // Note: we can't make the User a dependency of Auth - // because that would create a circular dependency - // Auth <- $http <- $resource <- LoopBackResource <- User <- Auth - ensureHasCurrentUser: function(User) { - if (service._currentUser && service._currentUser.username) { - //console.log('Using local current user.'); - //console.log(service._currentUser); - return service._currentUser; - } - else if ($window.user){ - //console.log('Using cached current user.'); - //console.log($window.user); - service._currentUser = $window.user; - return service._currentUser; - } - else{ - //console.log('Fetching current user from the server.'); - User.getCurrent().then(function(user) { - // success - service._currentUser = user; - userState.isLoggedIn = true; - $window.user = service._currentUser; - return service._currentUser; - }, - function(response) { - userState.isLoggedIn = false; - service._currentUser = null; - $window.user = null; - console.log('User.getCurrent() err', response); - return null; - }); - } - }, + $rootScope.chooseDefaultOption = scope.chooseDefaultOption = function(type) { + if(type === 'yes_no'){ + scope.field.fieldValue = 'true'; + }else if(type === 'rating'){ + scope.field.fieldValue = 0; + }else if(scope.field.fieldType === 'radio'){ + console.log(scope.field); + scope.field.fieldValue = scope.field.fieldOptions[0].option_value; + console.log(scope.field.fieldValue); + }else if(type === 'legal'){ + scope.field.fieldValue = 'true'; + $rootScope.nextField(); + } + }; - isAuthenticated: function() { - return !!service._currentUser; - }, + scope.setActiveField = $rootScope.setActiveField; - getUserState: function() { - return userState; - }, + //Set format only if field is a date + if(scope.field.fieldType === 'date'){ + scope.dateOptions = { + changeYear: true, + changeMonth: true, + altFormat: 'mm/dd/yyyy', + yearRange: '1900:-0', + defaultDate: 0 + }; + } - login: function(new_user) { - userState.isLoggedIn = true; - service._currentUser = new_user; - }, + var fieldType = scope.field.fieldType; +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c logout: function() { $window.user = null; userState.isLoggedIn = false; service._currentUser = null; } - }; - return service; - - } -]); - -'use strict'; - -angular.module('users').service('Authorizer', ["APP_PERMISSIONS", "USER_ROLES", function(APP_PERMISSIONS, USER_ROLES) { - return function(user) { - return { - canAccess: function(permissions) { - var i, len, permission; - if (!angular.isArray(permissions)) { - permissions = [permissions]; +======= + if(scope.field.fieldType === 'number' || scope.field.fieldType === 'textfield' || scope.field.fieldType === 'email' || scope.field.fieldType === 'link'){ + switch(scope.field.fieldType){ + case 'textfield': + scope.field.input_type = 'text'; + break; + case 'email': + scope.field.input_type = 'email'; + scope.field.placeholder = 'joesmith@example.com'; + break; + case 'number': + scope.field.input_type = 'text'; + scope.field.validateRegex = /^\d+$/; + break; + default: + scope.field.input_type = 'url'; + scope.field.placeholder = 'http://example.com'; + break; + } + fieldType = 'textfield'; + } + var template = getTemplateUrl(fieldType); + element.html(template).show(); + $compile(element.contents())(scope); } - for (i = 0, len = permissions.length; i < len; i++) { - permission = permissions[i]; - if (APP_PERMISSIONS[permission] === null) { - throw 'Bad permission value'; - } - if (user && user.roles) { - switch (permission) { - case APP_PERMISSIONS.viewAdminSettings: - case APP_PERMISSIONS.editAdminSettings: - return user.roles.indexOf(USER_ROLES.admin) > -1; - case APP_PERMISSIONS.viewPrivateForm: - case APP_PERMISSIONS.editForm: - return user.roles.indexOf(USER_ROLES.admin) > -1 || user.roles.indexOf(USER_ROLES.normal) > -1; - } - } else { - return false; - } - } - - return false; - } +>>>>>>> make it work }; - }; }]); + 'use strict'; -angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', '$state', - function($window, $q, $timeout, $http, $state) { +angular.module('forms').directive('onEnterKey', ['$rootScope', function($rootScope){ + return { + restrict: 'A', + link: function($scope, $element, $attrs) { + $element.bind('keydown keypress', function(event) { + var keyCode = event.which || event.keyCode; + if(keyCode === 13) { + $rootScope.$apply(function() { + $rootScope.$eval($attrs.onEnterKey); + }); - var userService = { - getCurrent: function() { - var deferred = $q.defer(); + event.preventDefault(); + } + }); + } + }; +}]); - $http.get('/users/me') - .success(function(response) { - deferred.resolve(response); - }) - .error(function() { - deferred.reject('User\'s session has expired'); - }); +'use strict'; - return deferred.promise; - }, - login: function(credentials) { +angular.module('forms').directive('onFinishRender', ["$rootScope", "$timeout", function ($rootScope, $timeout) { + return { + restrict: 'A', + link: function (scope, element, attrs) { - var deferred = $q.defer(); - $http.post('/auth/signin', credentials).success(function(response) { - deferred.resolve(response); - }).error(function(error) { - deferred.reject(error.message || error); - }); + //Don't do anything if we don't have a ng-repeat on the current element + if(!element.attr('ng-repeat') && !element.attr('data-ng-repeat')){ + return; + } + var broadcastMessage = attrs.onFinishRender || 'ngRepeat'; + + if(scope.$first && !scope.$last) { + scope.$evalAsync(function () { + $rootScope.$broadcast(broadcastMessage+' Started'); + }); + }else if(scope.$last) { + scope.$evalAsync(function () { + // console.log(broadcastMessage+'Finished'); + $rootScope.$broadcast(broadcastMessage+' Finished'); + }); + } + } + }; +}]); + +'use strict'; + +angular.module('forms').directive('submitFormDirective', + ['$http', 'TimeCounter', '$filter', '$rootScope', 'Auth', + function ($http, TimeCounter, $filter, $rootScope, Auth) { + return { + templateUrl: 'modules/forms/base/views/directiveViews/form/submit-form.client.view.html', restrict: 'E', + scope: { + myform:'=' + }, + controller: ["$document", "$window", "$scope", function($document, $window, $scope){ + $scope.authentication = $rootScope.authentication; + $scope.noscroll = false; + $scope.forms = {}; + + var form_fields_count = $scope.myform.visible_form_fields.filter(function(field){ + if(field.fieldType === 'statement' || field.fieldType === 'rating'){ + return false; + } + return true; + }).length; + $scope.translateAdvancementData = { + done: $filter('formValidity')($scope.myform), + total: form_fields_count + }; + + $scope.reloadForm = function(){ + //Reset Form + $scope.myform.submitted = false; + $scope.myform.form_fields = _.chain($scope.myform.visible_form_fields).map(function(field){ + field.fieldValue = ''; + return field; + }).value(); + + $scope.loading = false; + $scope.error = ''; + + $scope.selected = { + _id: '', + index: 0 + }; + $scope.setActiveField($scope.myform.visible_form_fields[0]._id, 0, false); + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c return deferred.promise; }, logout: function() { +======= + //console.log($scope.selected); + //Reset Timer + TimeCounter.restartClock(); + }; +>>>>>>> make it work - var deferred = $q.defer(); - $http.get('/auth/signout').success(function(response) { - deferred.resolve(null); - }).error(function(error) { - deferred.reject(error.message || error); - }); + $window.onscroll = function(){ + $scope.scrollPos = document.body.scrollTop || document.documentElement.scrollTop || 0; + var elemBox = document.getElementsByClassName('activeField')[0].getBoundingClientRect(); + $scope.fieldTop = elemBox.top; + $scope.fieldBottom = elemBox.bottom; +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c return deferred.promise; }, signup: function(credentials) { +======= + //console.log($scope.forms.myForm); + var field_id; + var field_index; +>>>>>>> make it work - var deferred = $q.defer(); - $http.post('/auth/signup', credentials).success(function(response) { - // If successful we assign the response to the global user model - deferred.resolve(response); - }).error(function(error) { - deferred.reject(error.message || error); - }); + if(!$scope.noscroll){ + //Focus on submit button + if( $scope.selected.index === $scope.myform.form_fields.length-1 && $scope.fieldBottom < 200){ + field_index = $scope.selected.index+1; + field_id = 'submit_field'; + $scope.setActiveField(field_id, field_index, false); + } + //Focus on field above submit button + else if($scope.selected.index === $scope.myform.form_fields.length){ + if($scope.fieldTop > 200){ + field_index = $scope.selected.index-1; + field_id = $scope.myform.form_fields[field_index]._id; + $scope.setActiveField(field_id, field_index, false); + } + }else if( $scope.fieldBottom < 0){ + field_index = $scope.selected.index+1; + field_id = $scope.myform.form_fields[field_index]._id; + $scope.setActiveField(field_id, field_index, false); + }else if ( $scope.selected.index !== 0 && $scope.fieldTop > 0) { + field_index = $scope.selected.index-1; + field_id = $scope.myform.form_fields[field_index]._id; + $scope.setActiveField(field_id, field_index, false); + } + //console.log('$scope.selected.index: '+$scope.selected.index); + //console.log('scroll pos: '+$scope.scrollPos+' fieldTop: '+$scope.fieldTop+' fieldBottom: '+$scope.fieldBottom); + $scope.$apply(); + } + }; - return deferred.promise; - }, + /* + ** Field Controls + */ + $scope.setActiveField = $rootScope.setActiveField = function(field_id, field_index, animateScroll) { + if($scope.selected === null || $scope.selected._id === field_id){ + //console.log('not scrolling'); + //console.log($scope.selected); + return; + } + //console.log('field_id: '+field_id); + //console.log('field_index: '+field_index); + //console.log($scope.selected); + $scope.selected._id = field_id; + $scope.selected.index = field_index; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c resendVerifyEmail: function(_email) { +======= + $scope.translateAdvancementData = { + done: $filter('formValidity')($scope.myform), + total: form_fields_count + }; +>>>>>>> make it work - var deferred = $q.defer(); - $http.post('/auth/verify', {email: _email}).success(function(response) { - deferred.resolve(response); - }).error(function(error) { - deferred.reject(error.message || error); - }); + if(animateScroll){ + $scope.noscroll=true; + setTimeout(function() { + $document.scrollToElement(angular.element('.activeField'), -10, 200).then(function(){ + $scope.noscroll = false; + document.querySelectorAll('.activeField .focusOn')[0].focus(); + }); + }, 20); + } + }; - return deferred.promise; - }, + $rootScope.nextField = $scope.nextField = function(){ + //console.log('nextfield'); + //console.log($scope.selected.index); + //console.log($scope.myform.form_fields.length-1); + if($scope.selected.index < $scope.myform.form_fields.length-1){ + var selected_index = $scope.selected.index+1; + var selected_id = $scope.myform.form_fields[selected_index]._id; + $rootScope.setActiveField(selected_id, selected_index, true); + } else if($scope.selected.index === $scope.myform.form_fields.length-1) { + var selected_index = $scope.selected.index+1; + var selected_id = 'submit_field'; + $rootScope.setActiveField(selected_id, selected_index, true); + } + }; +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c validateVerifyToken: function(token) { +======= + $rootScope.prevField = $scope.prevField = function(){ + if($scope.selected.index > 0){ + var selected_index = $scope.selected.index - 1; + var selected_id = $scope.myform.form_fields[selected_index]._id; + $scope.setActiveField(selected_id, selected_index, true); + } + }; +>>>>>>> make it work - //DAVID: TODO: The valid length of a token should somehow be linked to server config values - //DAVID: TODO: SEMI-URGENT: Should we even be doing this? - var validTokenRe = /^([A-Za-z0-9]{48})$/g; - if( !validTokenRe.test(token) ) throw new Error('Error token: '+token+' is not a valid verification token'); + /* + ** Form Display Functions + */ + $scope.exitStartPage = function(){ + $scope.myform.startPage.showStart = false; + if($scope.myform.form_fields.length > 0){ + $scope.selected._id = $scope.myform.form_fields[0]._id; + } + }; - var deferred = $q.defer(); - $http.get('/auth/verify/'+token).success(function(response) { - deferred.resolve(response); - }).error(function(error) { - deferred.reject(error); - }); + $scope.submitForm = function() { + var _timeElapsed = TimeCounter.stopClock(); + $scope.loading = true; + var form = _.cloneDeep($scope.myform); + form.timeElapsed = _timeElapsed; - return deferred.promise; - }, + form.percentageComplete = $filter('formValidity')($scope.myform) / $scope.myform.visible_form_fields.length * 100; + delete form.visible_form_fields; - resetPassword: function(passwordDetails, token) { + setTimeout(function () { + $scope.submitPromise = $http.post('/forms/' + $scope.myform._id, form) + .success(function (data, status, headers) { + //console.log('form submitted successfully'); - var deferred = $q.defer(); - $http.get('/auth/password/'+token, passwordDetails).success(function(response) { - deferred.resolve(); - }).error(function(error) { - deferred.reject(error.message || error); - }); + $scope.myform.submitted = true; + $scope.loading = false; + }) + .error(function (error) { + $scope.loading = false; + //console.log(error); + $scope.error = error.message; + }); + }, 500); + }; - return deferred.promise; - }, + //Load our form when the page is ready + //angular.element(document).ready(function() { + $scope.reloadForm(); + //}); - // Submit forgotten password account id - askForPasswordReset: function(credentials) { - - var deferred = $q.defer(); - $http.post('/auth/forgot', credentials).success(function(response) { - // Show user success message and clear form - deferred.resolve(response); - }).error(function(error) { - // Show user error message - deferred.reject(error.message || error); - }); - - return deferred.promise; - } - - }; - - return userService; - - } + }] + }; + } ]); 'use strict'; -// Users service used for communicating with the users REST endpoint -angular.module('users').factory('Users', ['$resource', - function($resource) { - return $resource('users', {}, { - update: { +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + return deferred.promise; + } +======= +//Forms service used for communicating with the forms REST endpoints +angular.module('forms').service('CurrentForm', + function(){ +>>>>>>> make it work + + //Private variables + var _form = {}; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + return userService; + + } +======= + //Public Methods + this.getForm = function() { + return _form; + }; + this.setForm = function(form) { + _form = form; + }; + } +); +'use strict'; + +//TODO: DAVID: URGENT: Make this a $resource that fetches valid field types from server +angular.module('forms').service('FormFields', [ + function() { + this.types = [ + { + name : 'textfield', + value : 'Short Text' + }, + { + name : 'email', + value : 'Email' + }, + { + name : 'radio', + value : 'Multiple Choice' + }, + { + name : 'dropdown', + value : 'Dropdown' + }, + { + name : 'date', + value : 'Date' + }, + { + name : 'textarea', + value : 'Paragraph Text' + }, + { + name : 'yes_no', + value : 'Yes/No' + }, + { + name : 'legal', + value : 'Legal' + }, + // { + // name : 'sig', + // value : 'Signature' + // }, + // { + // name : 'file', + // value : 'File Upload' + // }, + { + name : 'rating', + value : 'Rating' + }, + { + name : 'link', + value : 'Link' + }, + { + name : 'number', + value : 'Numbers' + }, + // { + // name : 'scale', + // value : 'Opinion Scale' + // }, + // { + // name : 'stripe', + // value : 'Payment' + // }, + { + name : 'statement', + value : 'Statement' + } + ]; + } + +>>>>>>> make it work +]); + +'use strict'; + +//Forms service used for communicating with the forms REST endpoints +angular.module('forms').factory('Forms', ['$resource', 'FORM_URL', + function($resource, FORM_URL) { + return $resource(FORM_URL, { + formId: '@_id' + }, { + 'query' : { + method: 'GET', + isArray: true, + //DAVID: TODO: Do we really need to get visible_form_fields for a Query? + // transformResponse: function(data, header) { + // var forms = angular.fromJson(data); + // angular.forEach(forms, function(form, idx) { + // form.visible_form_fields = _.filter(form.form_fields, function(field){ + // return (field.deletePreserved === false); + // }); + // }); + // return forms; + // } + }, + 'get' : { + method: 'GET', + transformResponse: function(data, header) { + var form = angular.fromJson(data); + //console.log(form); + form.visible_form_fields = _.filter(form.form_fields, function(field){ + return (field.deletePreserved === false); + }); + return form; + } + }, + 'update': { method: 'PUT' + }, + 'save': { + method: 'POST' } }); } +]); + +'use strict'; + +angular.module('forms').service('TimeCounter', [ + function(){ + var _startTime, _endTime, that=this; + + this.timeSpent = 0; + + this.restartClock = function(){ + _startTime = Date.now(); + _endTime = _startTime; + // console.log('Clock Started'); + }; + + this.stopClock = function(){ + if(_startTime){ + _endTime = Date.now(); + that.timeSpent = Math.abs(_endTime.valueOf() - _startTime.valueOf())/1000; + // console.log('Clock Ended'); + return that.timeSpent; + }else{ + return new Error('Clock has not been started'); + } + }; + + this.clockStarted = function(){ + return !!this._startTime; + }; + + } ]); \ No newline at end of file diff --git a/public/dist/application.min.js b/public/dist/application.min.js index 758bee4d..e09f9cd7 100644 --- a/public/dist/application.min.js +++ b/public/dist/application.min.js @@ -1,4 +1,20 @@ +<<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 function removeDateFieldsFunc(o){function eachObject(v,k){"lastModified"!==k&&"created"!==k||delete clone[k]}for(var clone=_.clone(o),i=0;i'),$templateCache.put("../public/modules/core/views/home.client.view.html",'

Craft beautiful forms in seconds.

Create your next ______.

Tell a story with a form.

'),$templateCache.put("../public/modules/forms/views/admin-form.client.view.html",'
'),$templateCache.put("../public/modules/forms/views/list-forms.client.view.html",'

Create a new form
Name
Language

'),$templateCache.put("../public/modules/forms/views/submit-form.client.view.html","
"),$templateCache.put("../public/modules/forms/views/adminTabs/analyze.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/configure.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/create.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/design.html",'
Background Color
Question Text Color
Answer Text Color
Button Background Color
Button Text Color
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeA.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/entryPage/startPage.html",'

{{pageData.introTitle}}

{{pageData.introParagraph}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/date.html",'

{{index+1}} {{field.title}} optional

{{field.description}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/dropdown.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/hidden.html",''),$templateCache.put("../public/modules/forms/views/directiveViews/field/legal.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/radio.html",'

{{index+1}} {{field.title}} optional

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/rating.html",'

{{index+1}} {{field.title}} optional

{{field.description}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/statement.html",'

{{field.title}}

{{field.description}}

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textarea.html",'

{{index+1}} {{field.title}} optional

{{field.description}}

Press SHIFT+ENTER to add a newline
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textfield.html",'

{{index+1}} {{field.title}} (optional)

{{field.description}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/yes_no.html",'

{{index+1}} {{field.title}} optional

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/form/configure-form.client.view.html",'
Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.name}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type
Form Name
Form Status
Google Analytics Tracking Code
Language
* required
Display Form Footer?
Display Start Page?
'), $templateCache.put("../public/modules/forms/views/directiveViews/form/edit-form.client.view.html",'

Edit Start Page


Intro Title:
Intro Paragraph:
\n
\n\n

\n
\n
Options:
\n
\n
\n \n\n \n \n \n
\n
\n \n
\n
\n
\n\n\n

\n
\n
Number of Steps:
\n
\n \n
\n
\n
Shape:
\n
\n \n
\n
\n\n

\n\n
\n
Required:
\n
\n \n\n \n
\n
\n\n
\n
Disabled:
\n
\n \n\n \n
\n
\n\n
\n \n\n
\n
\n

\n Click on Fields to add them here\n

\n
\n
\n\n
\n \n
\n\n \n \n\n \n
\n
\n\n'),$templateCache.put("../public/modules/forms/views/directiveViews/form/edit-submissions-form.client.view.html",'
Total Views: {{myform.analytics.views}}
Submissions: {{myform.analytics.submissions}}
Conversion Rate: {{myform.analytics.conversionRate}}%

Field Title
Field Views
User dropoff rate at this field
{{fieldStats.field.title}}
{{fieldStats.totalViews}}
{{fieldStats.dropoffRate}}%

#{{value.title}}OscarEMR User ProfilePercentage CompleteTime ElapsedDeviceLocationIP AddressDate Submitted (UTC)Generated PDF
{{$index+1}}{{field.fieldValue.option_value}} {{field.fieldValue}}User Profile #{{row.oscarDemoNum}}{{row.percentageComplete}}%{{row.timeElapsed}}{{row.device.name}}, {{row.device.type}}{{row.geoLocation.city}}, {{row.geoLocation.country}}{{row.ipAddr}}{{row.created | date:\'yyyy-MM-dd HH:mm:ss\'}}Generated PDF
'),$templateCache.put("../public/modules/forms/views/directiveViews/form/submit-form.client.view.html",'
{{form_fields_count - (myform | formValidity)}} answer(s) need completing
'),$templateCache.put("../public/modules/users/views/authentication/access-denied.client.view.html",'

You need to be logged in to access this page

Login
'),$templateCache.put("../public/modules/users/views/authentication/signin.client.view.html",'

Sign into your account

'),$templateCache.put("../public/modules/users/views/authentication/signup-success.client.view.html",''),$templateCache.put("../public/modules/users/views/authentication/signup.client.view.html",''),$templateCache.put("../public/modules/users/views/password/forgot-password.client.view.html",'

Restore your password

Enter your account email.

'),$templateCache.put("../public/modules/users/views/password/reset-password-invalid.client.view.html",'

Password reset is invalid

Ask for a new password reset
'),$templateCache.put("../public/modules/users/views/password/reset-password-success.client.view.html",'

Password successfully reset

Continue to home page
'),$templateCache.put("../public/modules/users/views/password/reset-password.client.view.html",'

Reset your password

'),$templateCache.put("../public/modules/users/views/settings/change-password.client.view.html",'

Change your password

'), $templateCache.put("../public/modules/users/views/settings/edit-profile.client.view.html",'

Edit your profile

'),$templateCache.put("../public/modules/users/views/settings/social-accounts.client.view.html",'

Connected social accounts:

Connect other social accounts:

'),$templateCache.put("../public/modules/users/views/verify/resend-verify-email.client.view.html",'

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at polydaic@gmail.com

'),$templateCache.put("../public/modules/users/views/verify/verify-account.client.view.html",'

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
')}]);var ApplicationConfiguration=function(){var applicationModuleName="NodeForm",applicationModuleVendorDependencies=["duScroll","ui.select","cgBusy","ngSanitize","vButton","ngResource","NodeForm.templates","ui.router","ui.bootstrap","ui.utils"],registerModule=function(moduleName,dependencies){angular.module(moduleName,dependencies||[]),angular.module(applicationModuleName).requires.push(moduleName)};return{applicationModuleName:applicationModuleName,applicationModuleVendorDependencies:applicationModuleVendorDependencies,registerModule:registerModule}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function($locationProvider){$locationProvider.hashPrefix("!")}]),angular.module(ApplicationConfiguration.applicationModuleName).constant("APP_PERMISSIONS",{viewAdminSettings:"viewAdminSettings",editAdminSettings:"editAdminSettings",editForm:"editForm",viewPrivateForm:"viewPrivateForm"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("USER_ROLES",{admin:"admin",normal:"user",superuser:"superuser"}),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","$state","$stateParams",function($rootScope,Auth,$state,$stateParams){$rootScope.$state=$state,$rootScope.$stateParams=$stateParams,$rootScope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState){$state.previous=fromState;var statesToIgnore=["home","signin","resendVerifyEmail","verify","signup","signup-success","forgot","reset-invalid","reset","reset-success"];statesToIgnore.indexOf(toState.name)>0?Auth.isAuthenticated()&&(event.preventDefault(),$state.go("listForms")):"access_denied"===toState.name||Auth.isAuthenticated()||"submitForm"===toState.name||(console.log("go to signup"),event.preventDefault(),$state.go("listForms"))})}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","User","Authorizer","$state","$stateParams",function($rootScope,Auth,User,Authorizer,$state,$stateParams){$rootScope.$on("$stateChangeStart",function(event,next){var authenticator,permissions,user;permissions=next&&next.data&&next.data.permissions?next.data.permissions:null,Auth.ensureHasCurrentUser(User),user=Auth.currentUser,user&&(authenticator=new Authorizer(user),null!=permissions&&(authenticator.canAccess(permissions)||(event.preventDefault(),$state.go("access_denied"))))})}]),angular.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),ApplicationConfiguration.registerModule("core",["users"]),ApplicationConfiguration.registerModule("forms",["ngFileUpload","ui.router.tabs","colorpicker.module","ui.date","ui.sortable","angular-input-stars","users"]),ApplicationConfiguration.registerModule("users"),angular.module("core").config(["$stateProvider","$urlRouterProvider",function($stateProvider,$urlRouterProvider,Authorization){$urlRouterProvider.otherwise("/forms")}]),angular.module("core").controller("HeaderController",["$rootScope","$scope","Menus","$state","Auth","User","$window",function($rootScope,$scope,Menus,$state,Auth,User,$window){$rootScope.signupDisabled=$window.signupDisabled,$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.authentication=$rootScope.authentication=Auth,$rootScope.languages=$scope.languages=["english","french","spanish"],$scope.isCollapsed=!1,$rootScope.hideNav=!1,$scope.menu=Menus.getMenu("topbar"),$scope.signout=function(){var promise=User.logout();promise.then(function(){Auth.logout(),Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user=null,$state.go("listForms")},function(reason){console.log("Logout Failed: "+reason)})},$scope.toggleCollapsibleMenu=function(){$scope.isCollapsed=!$scope.isCollapsed},$scope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState,fromParams){$scope.isCollapsed=!1,$rootScope.hideNav=!1,angular.isDefined(toState.data)&&angular.isDefined(toState.data.hideNav)&&($rootScope.hideNav=toState.data.hideNav)})}]),angular.module("core").controller("HomeController",["$rootScope","$scope","User","$state",function($rootScope,$scope,User,$state){$scope=$rootScope}]),angular.module("core").service("Menus",[function(){this.defaultRoles=["*"],this.menus={};var shouldRender=function(user){if(!user)return this.isPublic;if(~this.roles.indexOf("*"))return!0;for(var userRoleIndex in user.roles)for(var roleIndex in this.roles)if(console.log(this.roles[roleIndex]),console.log(this.roles[roleIndex]===user.roles[userRoleIndex]),this.roles[roleIndex]===user.roles[userRoleIndex])return!0;return!1};this.validateMenuExistance=function(menuId){if(menuId&&menuId.length){if(this.menus[menuId])return!0;throw new Error("Menu does not exists")}throw new Error("MenuId was not provided")},this.getMenu=function(menuId){return this.validateMenuExistance(menuId),this.menus[menuId]},this.addMenu=function(menuId,isPublic,roles){return this.menus[menuId]={isPublic:isPublic||!1,roles:roles||this.defaultRoles,items:[],shouldRender:shouldRender},this.menus[menuId]},this.removeMenu=function(menuId){this.validateMenuExistance(menuId),delete this.menus[menuId]},this.addMenuItem=function(menuId,menuItemTitle,menuItemURL,menuItemType,menuItemUIRoute,isPublic,roles,position){return this.validateMenuExistance(menuId),this.menus[menuId].items.push({title:menuItemTitle,link:menuItemURL,menuItemType:menuItemType||"item",menuItemClass:menuItemType,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].roles:roles,position:position||0,items:[],shouldRender:shouldRender}),this.menus[menuId]},this.addSubMenuItem=function(menuId,rootMenuItemURL,menuItemTitle,menuItemURL,menuItemUIRoute,isPublic,roles,position){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===rootMenuItemURL&&this.menus[menuId].items[itemIndex].items.push({title:menuItemTitle,link:menuItemURL,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].items[itemIndex].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].items[itemIndex].roles:roles,position:position||0,shouldRender:shouldRender});return this.menus[menuId]},this.removeMenuItem=function(menuId,menuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===menuItemURL&&this.menus[menuId].items.splice(itemIndex,1);return this.menus[menuId]},this.removeSubMenuItem=function(menuId,submenuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)for(var subitemIndex in this.menus[menuId].items[itemIndex].items)this.menus[menuId].items[itemIndex].items[subitemIndex].link===submenuItemURL&&this.menus[menuId].items[itemIndex].items.splice(subitemIndex,1);return this.menus[menuId]},this.addMenu("topbar",!1,["*"]),this.addMenu("bottombar",!1,["*"])}]),function(){"use strict";function Socket($timeout,$window){function connect(url){service.socket=io()}function emit(eventName,data){service.socket&&service.socket.emit(eventName,data)}function on(eventName,callback){service.socket&&service.socket.on(eventName,function(data){$timeout(function(){callback(data)})})}function removeListener(eventName){service.socket&&service.socket.removeListener(eventName)}var service={connect:connect,emit:emit,on:on,removeListener:removeListener,socket:null};return console.log("https://"+window.location.hostname+":"+$window.socketPort),connect("https://"+window.location.hostname+":"+$window.socketPort),service}angular.module("core").factory("Socket",Socket),Socket.$inject=["$timeout","$window"]}(),angular.module("forms").run(["Menus",function(Menus){Menus.addMenuItem("topbar","My Forms","forms","","/forms",!1)}]).filter("formValidity",function(){return function(formObj){if(formObj&&formObj.form_fields&&formObj.visible_form_fields){var formKeys=Object.keys(formObj),fields=(formKeys.filter(function(key){return"$"!==key[0]}),formObj.form_fields),valid_count=fields.filter(function(field){return"object"==typeof field&&"statement"!==field.fieldType&&"rating"!==field.fieldType?!!field.fieldValue:void 0}).length;return valid_count-(formObj.form_fields.length-formObj.visible_form_fields.length)}return 0}}).config(["$provide",function($provide){$provide.decorator("accordionDirective",["$delegate",function($delegate){var directive=$delegate[0];return directive.replace=!0,$delegate}])}]),angular.module("forms").config(["$stateProvider",function($stateProvider){$stateProvider.state("listForms",{url:"/forms",templateUrl:"modules/forms/views/list-forms.client.view.html"}).state("submitForm",{url:"/forms/:formId",templateUrl:"modules/forms/views/submit-form.client.view.html",data:{hideNav:!0},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"SubmitFormController",controllerAs:"ctrl"}).state("viewForm",{url:"/forms/:formId/admin",templateUrl:"modules/forms/views/admin-form.client.view.html",data:{permissions:["editForm"]},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"AdminFormController"}).state("viewForm.configure",{url:"/configure",templateUrl:"modules/forms/views/adminTabs/configure.html"}).state("viewForm.design",{url:"/design",templateUrl:"modules/forms/views/adminTabs/design.html"}).state("viewForm.analyze",{url:"/analyze",templateUrl:"modules/forms/views/adminTabs/analyze.html"}).state("viewForm.create",{url:"/create",templateUrl:"modules/forms/views/adminTabs/create.html"})}]),angular.module("forms").controller("AdminFormController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http","$uibModal","myForm",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http,$uibModal,myForm){$scope=$rootScope,$scope.animationsEnabled=!0,$scope.myform=myForm,$rootScope.saveInProgress=!1,CurrentForm.setForm($scope.myform),$scope.tabData=[{heading:"Create",route:"viewForm.create"},{heading:"Design",route:"viewForm.design"},{heading:"Configure",route:"viewForm.configure"},{heading:"Analyze",route:"viewForm.analyze"}],$scope.setForm=function(form){$scope.myform=form},$rootScope.resetForm=function(){$scope.myform=Forms.get({formId:$stateParams.formId})},$scope.openDeleteModal=function(){$scope.deleteModal=$uibModal.open({animation:$scope.animationsEnabled,templateUrl:"myModalContent.html",controller:"AdminFormController",resolve:{myForm:function(){return $scope.myform}}}),$scope.deleteModal.result.then(function(selectedItem){$scope.selected=selectedItem},function(){console.log("Modal dismissed at: "+new Date)})},$scope.cancelDeleteModal=function(){$scope.deleteModal&&$scope.deleteModal.dismiss("cancel")},$scope.removeCurrentForm=function(){if($scope.deleteModal&&$scope.deleteModal.opened){$scope.deleteModal.close();var form_id=$scope.myform._id;if(!form_id)throw new Error("Error - removeCurrentForm(): $scope.myform._id does not exist");$http["delete"]("/forms/"+form_id).success(function(data,status,headers){console.log("form deleted successfully"),$state.go("listForms",{},{reload:!0})}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}},$scope.update=$rootScope.update=function(updateImmediately,cb){var continueUpdate=!0;if(updateImmediately||(continueUpdate=!$rootScope.saveInProgress),continueUpdate){var err=null;updateImmediately||($rootScope.saveInProgress=!0),$scope.updatePromise=$http.put("/forms/"+$scope.myform._id,{form:$scope.myform}).then(function(response){$rootScope.myform=$scope.myform=response.data})["catch"](function(response){console.log("Error occured during form UPDATE.\n"),err=response.data})["finally"](function(){return updateImmediately||($rootScope.saveInProgress=!1),"function"==typeof cb?cb(err):void 0})}}}]),angular.module("forms").controller("ListFormsController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http){$scope=$rootScope,$scope.forms={},$scope.showCreateModal=!1,$scope.findAll=function(){Forms.query(function(_forms){$scope.myforms=_forms})},$scope.openCreateModal=function(){$scope.showCreateModal||($scope.showCreateModal=!0)},$scope.closeCreateModal=function(){$scope.showCreateModal&&($scope.showCreateModal=!1)},$scope.setForm=function(form){$scope.myform=form},$scope.goToWithId=function(route,id){$state.go(route,{formId:id},{reload:!0})},$scope.duplicateForm=function(form_index){var form=_.cloneDeep($scope.myforms[form_index]);delete form._id,$http.post("/forms",{form:form}).success(function(data,status,headers){$scope.myforms.splice(form_index+1,0,data)}).error(function(errorResponse){console.error(errorResponse),null===errorResponse&&($scope.error=errorResponse.data.message)})},$scope.createNewForm=function(){var form={};form.title=$scope.forms.createForm.title.$modelValue,form.language=$scope.forms.createForm.language.$modelValue,$scope.forms.createForm.$valid&&$scope.forms.createForm.$dirty&&$http.post("/forms",{form:form}).success(function(data,status,headers){console.log("new form created"),$scope.goToWithId("viewForm.create",data._id+"")}).error(function(errorResponse){console.error(errorResponse),$scope.error=errorResponse.data.message})},$scope.removeForm=function(form_index){if(form_index>=$scope.myforms.length||0>form_index)throw new Error("Error: form_index in removeForm() must be between 0 and "+$scope.myforms.length-1);$http["delete"]("/forms/"+$scope.myforms[form_index]._id).success(function(data,status,headers){console.log("form deleted successfully"),$scope.myforms.splice(form_index,1)}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}}]),angular.module("forms").controller("SubmitFormController",["$scope","$rootScope","$state","myForm","Auth",function($scope,$rootScope,$state,myForm,Auth){$scope.authentication=Auth,$scope.myform=myForm,$scope.myform.isLive?$scope.hideNav=$rootScope.hideNav=!0:$scope.authentication.isAuthenticated()?$scope.hideNav=$rootScope.hideNav=!1:($scope.hideNav=$rootScope.hideNav=!0,$state.go("access_denied"))}]),function(){"use strict";function SendVisitorData(Socket,$state){function send(form,lastActiveIndex,timeElapsed){console.log(lastActiveIndex);var visitorData={referrer:document.referrer,isSubmitted:form.submitted,formId:form._id,lastActiveField:form.form_fields[lastActiveIndex]._id,timeElapsed:timeElapsed};Socket.emit("form-visitor-data",visitorData)}function init(){Socket.socket||Socket.connect()}var service={send:send};return init(),service}angular.module("forms").factory("SendVisitorData",SendVisitorData),SendVisitorData.$inject=["Socket","$state"]}(),_.mixin({removeDateFields:removeDateFieldsFunc}),angular.module("forms").directive("autoSaveForm",["$rootScope","$timeout",function($rootScope,$timeout){return{require:["^form"],restrict:"AE",link:function($scope,$element,$attrs,$ctrls){angular.element(document).ready(function(){var $formCtrl=$ctrls[0],savePromise=null;$rootScope.finishedRender=!1,$scope.$on("editFormFields Started",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!1}),$scope.$on("editFormFields Finished",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!0}),$scope.anyDirtyAndTouched=function(form){var propCount=0;for(var prop in form)if(form.hasOwnProperty(prop)&&"$"!==prop[0]&&(propCount++,form[prop].$touched&&form[prop].$dirty))return!0;return!1};var debounceSave=function(){$rootScope.saveInProgress=!0,$rootScope[$attrs.autoSaveCallback](!0,function(err){err?(console.error("Error form data NOT persisted"),console.error(err)):($formCtrl.$setPristine(),$formCtrl.$setUntouched())})};$scope.$watch(function(newValue,oldValue){$rootScope.finishedRender&&$scope.anyDirtyAndTouched($scope.editForm)&&!$rootScope.saveInProgress&&debounceSave()}),$scope.$watch($attrs.autoSaveWatch,function(newValue,oldValue){newValue=angular.copy(newValue),oldValue=angular.copy(oldValue),newValue.form_fields=_.removeDateFields(newValue.form_fields),oldValue.form_fields=_.removeDateFields(oldValue.form_fields);var changedFields=!_.isEqual(oldValue.form_fields,newValue.form_fields)||!_.isEqual(oldValue.startPage,newValue.startPage),changedFieldMap=!1;oldValue.hasOwnProperty("plugins.oscarhost.settings.fieldMap")&&(changedFieldMap=!!oldValue.plugins.oscarhost.settings.fieldMap&&!_.isEqual(oldValue.plugins.oscarhost.settings.fieldMap,newValue.plugins.oscarhost.settings.fieldMap)),(newValue||oldValue)&&oldValue&&(0===oldValue.form_fields.length&&($rootScope.finishedRender=!0),$rootScope.finishedRender&&(changedFields&&!$formCtrl.$dirty||changedFieldMap)&&!$rootScope.saveInProgress?(savePromise&&($timeout.cancel(savePromise),savePromise=null),savePromise=$timeout(function(){debounceSave()})):$rootScope.finishedRender&&$rootScope.saveInProgress&&($rootScope.saveInProgress=!1))},!0)})}}}]),angular.module("forms").directive("configureFormDirective",["$rootScope","$http","Upload","CurrentForm",function($rootScope,$http,Upload,CurrentForm){return{templateUrl:"modules/forms/views/directiveViews/form/configure-form.client.view.html",restrict:"E",scope:{myform:"=",user:"=",pdfFields:"@",formFields:"@"},controller:["$scope",function($scope){console.log($scope.myform),CurrentForm.getForm().plugins?CurrentForm.getForm().plugins.oscarhost.baseUrl&&($scope.oscarhostAPI=!0):$scope.oscarhostAPI=!1,$scope.log="",$scope.pdfLoading=!1,$scope.languages=$rootScope.languages,this._current_upload=null,$scope.resetForm=$rootScope.resetForm,$scope.update=$rootScope.update,this._unbindedPdfFields=$scope.pdfFields,$scope.cancelUpload=function(){this._current_upload.abort(),$scope.pdfLoading=!1,$scope.removePDF()},$scope.removePDF=function(){$scope.myform.pdf=null,$scope.myform.isGenerated=!1,$scope.myform.autofillPDFs=!1,console.log("form.pdf: "+$scope.myform.pdf+" REMOVED")},$scope.uploadPDF=function(file){file&&(console.log(file),Upload.upload({url:"/upload/pdf",data:{user:$scope.user,file:file}}).then(function(resp){var data=resp.data;$scope.log="file "+data.originalname+" uploaded as "+data.filename+". JSON: "+JSON.stringify(data)+"\n"+$scope.log,$scope.myform.pdf=angular.fromJson(angular.toJson(data)),$scope.pdfLoading=!1,console.log($scope.log),$scope.$$phase||$scope.$digest||$scope.$apply()},function(resp){$scope.pdfLoading=!1,console.log("Error occured during upload.\n"),console.log(resp.status)},function(evt){var progressPercentage=parseInt(100*evt.loaded/evt.total,10);$scope.log="progress: "+progressPercentage+"% "+evt.config.data.file.name+"\n"+$scope.log,console.log($scope.log),$scope.pdfLoading=!0}))}}]}}]),angular.module("forms").directive("editFormDirective",["$rootScope","FormFields",function($rootScope,FormFields){return{templateUrl:"modules/forms/views/directiveViews/form/edit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$scope",function($scope){for(var field_ids=_($scope.myform.form_fields).pluck("_id"),i=0;i0){$scope.myform.plugins.oscarhost.settings.fieldMap||($scope.myform.plugins.oscarhost.settings.fieldMap={});var oscarhostFields=$scope.myform.plugins.oscarhost.settings.validFields,currentFields=_($scope.myform.plugins.oscarhost.settings.fieldMap).invert().keys().value();return $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id)&&(currentFields=_(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id])),_(oscarhostFields).difference(currentFields).value()}return[]},$scope.dropzone={handle:".handle",containment:".dropzoneContainer",cursor:"grabbing"},$scope.addNewField=function(modifyForm,fieldType){$scope.addField.lastAddedID++;for(var fieldTitle,i=0;i<$scope.addField.types.length;i++)if($scope.addField.types[i].name===fieldType){$scope.addField.types[i].lastAddedID++,fieldTitle=$scope.addField.types[i].value+$scope.addField.types[i].lastAddedID;break}var newField={title:fieldTitle,fieldType:fieldType,fieldValue:"",required:!0,disabled:!1,deletePreserved:!1};return $scope.showAddOptions(newField)&&(newField.fieldOptions=[],newField.fieldOptions.push({option_id:Math.floor(1e5*Math.random()),option_title:"Option 0",option_value:"Option 0"})),modifyForm&&$scope.myform.form_fields.push(newField),newField},$scope.deleteField=function(field_index){var currFieldId=$scope.myform.form_fields[field_index]._id;$scope.myform.hasOwnProperty("plugins.oscarhost.baseUrl")&&delete $scope.myform.plugins.oscarhost.settings.fieldMap[currFieldId],$scope.myform.form_fields.splice(field_index,1)},$scope.duplicateField=function(field_index){var currField=_.cloneDeep($scope.myform.form_fields[field_index]);currField._id="cloned"+_.uniqueId(),currField.title+=" copy",$scope.myform.form_fields.splice(field_index+1,0,currField)},$scope.addButton=function(){var newButton={};newButton.bgColor="#ddd",newButton.color="#ffffff",newButton.text="Button",newButton._id=Math.floor(1e5*Math.random()),$scope.myform.startPage.buttons.push(newButton)},$scope.deleteButton=function(button){for(var currID,i=0;i<$scope.myform.startPage.buttons.length;i++)if(currID=$scope.myform.startPage.buttons[i]._id,console.log(currID),currID===button._id){$scope.myform.startPage.buttons.splice(i,1);break}},$scope.addOption=function(field_index){var currField=$scope.myform.form_fields[field_index];if("checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType){currField.fieldOptions||($scope.myform.form_fields[field_index].fieldOptions=[]);var lastOptionID=$scope.myform.form_fields[field_index].fieldOptions.length+1,newOption={option_id:Math.floor(1e5*Math.random()),option_title:"Option "+lastOptionID,option_value:"Option "+lastOptionID};$scope.myform.form_fields[field_index].fieldOptions.push(newOption)}},$scope.deleteOption=function(field_index,option){var currField=$scope.myform.form_fields[field_index];if("checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType)for(var i=0;i',restrict:"E",scope:{typeName:"@"},controller:["$scope",function($scope){var iconTypeMap={textfield:"fa fa-pencil-square-o",dropdown:"fa fa-th-list",date:"fa fa-calendar",checkbox:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",email:"fa fa-envelope-o",textarea:"fa fa-pencil-square",legal:"fa fa-legal",file:"fa fa-cloud-upload",rating:"fa fa-star-half-o",link:"fa fa-link",scale:"fa fa-sliders",stripe:"fa fa-credit-card", -statement:"fa fa-quote-left",yes_no:"fa fa-toggle-on",number:"fa fa-slack"};$scope.typeIcon=iconTypeMap[$scope.typeName]}]}});var __indexOf=[].indexOf||function(item){for(var i=0,l=this.length;l>i;i++)if(i in this&&this[i]===item)return i;return-1};angular.module("forms").directive("fieldDirective",["$http","$compile","$rootScope","$templateCache",function($http,$compile,$rootScope,$templateCache){var getTemplateUrl=function(fieldType){var type=fieldType,templateUrl="modules/forms/views/directiveViews/field/",supported_fields=["textfield","textarea","date","dropdown","hidden","password","radio","legal","statement","rating","yes_no","number","natural"];return __indexOf.call(supported_fields,type)>=0&&(templateUrl=templateUrl+type+".html"),$templateCache.get("../public/"+templateUrl)};return{template:"
{{field.title}}
",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(scope,element){$rootScope.chooseDefaultOption=scope.chooseDefaultOption=function(type){"yes_no"===type?scope.field.fieldValue="true":"rating"===type?scope.field.fieldValue=0:"radio"===scope.field.fieldType?(console.log(scope.field),scope.field.fieldValue=scope.field.fieldOptions[0].option_value,console.log(scope.field.fieldValue)):"legal"===type&&(scope.field.fieldValue="true",$rootScope.nextField())},scope.setActiveField=$rootScope.setActiveField,"date"===scope.field.fieldType&&(scope.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var fieldType=scope.field.fieldType;if("number"===scope.field.fieldType||"textfield"===scope.field.fieldType||"email"===scope.field.fieldType||"link"===scope.field.fieldType){switch(scope.field.fieldType){case"textfield":scope.field.input_type="text";break;case"email":scope.field.input_type="email",scope.field.placeholder="joesmith@example.com";break;case"number":scope.field.input_type="text",scope.field.validateRegex=/^-?\d+$/;break;default:scope.field.input_type="url",scope.field.placeholder="http://example.com"}fieldType="textfield"}var template=getTemplateUrl(fieldType);element.html(template).show();$compile(element.contents())(scope)}}}]),angular.module("forms").directive("keyToOption",function(){return{restrict:"A",scope:{field:"="},link:function($scope,$element,$attrs,$select){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,index=parseInt(String.fromCharCode(keyCode))-1;index<$scope.field.fieldOptions.length&&(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue=$scope.field.fieldOptions[index].option_value}))})}}}),angular.module("forms").directive("keyToTruthy",["$rootScope",function($rootScope){return{restrict:"A",scope:{field:"="},link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,truthyKeyCode=$attrs.keyCharTruthy.charCodeAt(0)-32,falseyKeyCode=$attrs.keyCharFalsey.charCodeAt(0)-32;keyCode===truthyKeyCode?(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue="true"})):keyCode===falseyKeyCode&&(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue="false"}))})}}}]),angular.module("forms").directive("onEnterKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,onEnterKeyDisabled=!1;null!==$attrs.onEnterKeyDisabled&&(onEnterKeyDisabled=$attrs.onEnterKeyDisabled),13!==keyCode||event.shiftKey||onEnterKeyDisabled||(event.preventDefault(),$rootScope.$apply(function(){$rootScope.$eval($attrs.onEnterKey)}))})}}}]).directive("onTabKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;9!==keyCode||event.shiftKey||(event.preventDefault(),$rootScope.$apply(function(){$rootScope.$eval($attrs.onTabKey)}))})}}}]).directive("onEnterOrTabKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;13!==keyCode&&9!==keyCode||event.shiftKey||(event.preventDefault(),$rootScope.$apply(function(){$rootScope.$eval($attrs.onEnterOrTabKey)}))})}}}]).directive("onTabAndShiftKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;9===keyCode&&event.shiftKey&&(event.preventDefault(),$rootScope.$apply(function(){$rootScope.$eval($attrs.onTabAndShiftKey)}))})}}}]),angular.module("forms").directive("onFinishRender",["$rootScope","$timeout",function($rootScope,$timeout){return{restrict:"A",link:function(scope,element,attrs){if(element.attr("ng-repeat")||element.attr("data-ng-repeat")){var broadcastMessage=attrs.onFinishRender||"ngRepeat";scope.$first&&!scope.$last?scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Started")}):scope.$last&&scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Finished")})}}}}]),angular.module("forms").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","Auth","SendVisitorData",function($http,TimeCounter,$filter,$rootScope,Auth,SendVisitorData){return{templateUrl:"modules/forms/views/directiveViews/form/submit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$document","$window","$scope",function($document,$window,$scope){$scope.authentication=$rootScope.authentication,$scope.noscroll=!1,$scope.forms={},$scope.form_fields_count=$scope.myform.visible_form_fields.filter(function(field){return"statement"!==field.fieldType&&"rating"!==field.fieldType}).length,$scope.reloadForm=function(){$scope.myform.submitted=!1,$scope.myform.form_fields=_.chain($scope.myform.visible_form_fields).map(function(field){return field.fieldValue="",field}).value(),$scope.loading=!1,$scope.error="",$scope.selected={_id:"",index:0},$scope.setActiveField($scope.myform.visible_form_fields[0]._id,0,!1),TimeCounter.restartClock()},$window.onscroll=function(){$scope.scrollPos=document.body.scrollTop||document.documentElement.scrollTop||0;var elemBox=document.getElementsByClassName("activeField")[0].getBoundingClientRect();$scope.fieldTop=elemBox.top,$scope.fieldBottom=elemBox.bottom;var field_id,field_index;$scope.noscroll||($scope.selected.index===$scope.myform.visible_form_fields.length-1&&$scope.fieldBottom<200?(field_index=$scope.selected.index+1,field_id="submit_field",$scope.setActiveField(field_id,field_index,!1)):$scope.selected.index===$scope.myform.visible_form_fields.length?$scope.fieldTop>200&&(field_index=$scope.selected.index-1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):$scope.fieldBottom<0?(field_index=$scope.selected.index+1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):0!==$scope.selected.index&&$scope.fieldTop>0&&(field_index=$scope.selected.index-1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)),$scope.$apply())};var getActiveField=function(){if(null===$scope.selected)throw console.error("current active field is null"),new Error("current active field is null");return"submit_field"===$scope.selected._id?$scope.myform.form_fields.length-1:$scope.selected.index};$scope.setActiveField=$rootScope.setActiveField=function(field_id,field_index,animateScroll){null!==$scope.selected&&$scope.selected._id!==field_id&&($scope.selected._id=field_id,$scope.selected.index=field_index,animateScroll?($scope.noscroll=!0,setTimeout(function(){$document.scrollToElement(angular.element(".activeField"),-10,200).then(function(){$scope.noscroll=!1,setTimeout(function(){document.querySelectorAll(".activeField .focusOn").length?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input").length?document.querySelectorAll(".activeField input")[0].focus():document.querySelectorAll(".activeField .selectize-input")[0].focus()})})})):setTimeout(function(){document.querySelectorAll(".activeField .focusOn")[0]?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input")[0].focus()}),SendVisitorData.send($scope.myform,getActiveField(),TimeCounter.getTimeElapsed()))},$rootScope.nextField=$scope.nextField=function(){var selected_index,selected_id;$scope.selected.index<$scope.myform.visible_form_fields.length-1?(selected_index=$scope.selected.index+1,selected_id=$scope.myform.visible_form_fields[selected_index]._id,$rootScope.setActiveField(selected_id,selected_index,!0)):$scope.selected.index===$scope.myform.visible_form_fields.length-1&&(selected_index=$scope.selected.index+1,selected_id="submit_field",$rootScope.setActiveField(selected_id,selected_index,!0))},$rootScope.prevField=$scope.prevField=function(){if($scope.selected.index>0){var selected_index=$scope.selected.index-1,selected_id=$scope.myform.visible_form_fields[selected_index]._id;$scope.setActiveField(selected_id,selected_index,!0)}},$scope.exitStartPage=function(){$scope.myform.startPage.showStart=!1,$scope.myform.visible_form_fields.length>0&&($scope.selected._id=$scope.myform.visible_form_fields[0]._id)},$rootScope.goToInvalid=$scope.goToInvalid=function(){document.querySelectorAll(".ng-invalid.focusOn")[0].focus()},$rootScope.submitForm=$scope.submitForm=function(){var _timeElapsed=TimeCounter.stopClock();$scope.loading=!0;var form=_.cloneDeep($scope.myform);form.timeElapsed=_timeElapsed,form.percentageComplete=$filter("formValidity")($scope.myform)/$scope.myform.visible_form_fields.length*100,delete form.visible_form_fields;for(var i=0;i<$scope.myform.form_fields.length;i++)"dropdown"!==$scope.myform.form_fields[i].fieldType||$scope.myform.form_fields[i].deletePreserved||($scope.myform.form_fields[i].fieldValue=$scope.myform.form_fields[i].fieldValue.option_value);setTimeout(function(){$scope.submitPromise=$http.post("/forms/"+$scope.myform._id,form).success(function(data,status,headers){console.log($scope.myform.form_fields[0]),$scope.myform.submitted=!0,$scope.loading=!1,SendVisitorData.send($scope.myform,getActiveField(),_timeElapsed)}).error(function(error){$scope.loading=!1,console.error(error),$scope.error=error.message})},500)},$scope.reloadForm()}]}}]),angular.module("forms").service("CurrentForm",function(){var _form={};this.getForm=function(){return _form},this.setForm=function(form){_form=form}}),angular.module("forms").service("FormFields",[function(){this.types=[{name:"textfield",value:"Short Text"},{name:"email",value:"Email"},{name:"radio",value:"Multiple Choice"},{name:"dropdown",value:"Dropdown"},{name:"date",value:"Date"},{name:"textarea",value:"Paragraph Text"},{name:"yes_no",value:"Yes/No"},{name:"legal",value:"Legal"},{name:"rating",value:"Rating"},{name:"link",value:"Link"},{name:"number",value:"Numbers"},{name:"statement",value:"Statement"}]}]),angular.module("forms").factory("Forms",["$resource",function($resource){return $resource("/forms/:formId",{formId:"@_id"},{query:{method:"GET",isArray:!0},get:{method:"GET",transformResponse:function(data,header){var form=angular.fromJson(data);return form.visible_form_fields=_.filter(form.form_fields,function(field){return field.deletePreserved===!1}),form}},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").factory("Submissions",["$resource",function($resource){return $resource("forms/:formID/submissions/:submissionId",{submissionId:"@_id",formId:"@_id"},{query:{method:"GET",isArray:!0},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").service("TimeCounter",[function(){var _startTime,_endTime=null;this.timeSpent=0,this.restartClock=function(){_startTime=Date.now(),_endTime=null},this.getTimeElapsed=function(){return _startTime?Math.abs(Date.now().valueOf()-_startTime.valueOf())/1e3:void 0},this.stopClock=function(){return _startTime&&null===_endTime?(_endTime=Date.now(),this.timeSpent=Math.abs(_endTime.valueOf()-_startTime.valueOf())/1e3,this._startTime=this._endTime=null,this.timeSpent):new Error("Clock has not been started")},this.clockStarted=function(){return!!this._startTime}}]),angular.module("users").config(["$httpProvider",function($httpProvider){$httpProvider.interceptors.push(["$q","$location",function($q,$location){return{responseError:function(response){return"/users/me"!==$location.path()&&response.config&&"/users/me"!==response.config.url&&(console.log("intercepted rejection of ",response.config.url,response.status),401===response.status?(console.log($location.path()),$location.nextAfterLogin=$location.path(),$location.path("/signin")):403===response.status&&$location.path("/access_denied")),$q.reject(response)}}}])}]),angular.module("users").config(["$stateProvider",function($stateProvider){var checkLoggedin=function($q,$timeout,$state,User,Auth){var deferred=$q.defer();return Auth.currentUser&&Auth.currentUser.email?$timeout(deferred.resolve):Auth.currentUser=User.getCurrent(function(){Auth.login(),$timeout(deferred.resolve())},function(){Auth.logout(),$timeout(deferred.reject()),$state.go("signin",{reload:!0})}),deferred.promise};checkLoggedin.$inject=["$q","$timeout","$state","User","Auth"];var checkSignupDisabled=function($window,$timeout,$q){var deferred=$q.defer();return $timeout($window.signupDisabled?deferred.reject():deferred.resolve()),deferred.promise};checkSignupDisabled.$inject=["$window","$timeout","$q"],$stateProvider.state("profile",{resolve:{loggedin:checkLoggedin},url:"/settings/profile",templateUrl:"modules/users/views/settings/edit-profile.client.view.html"}).state("password",{resolve:{loggedin:checkLoggedin},url:"/settings/password",templateUrl:"modules/users/views/settings/change-password.client.view.html"}).state("accounts",{resolve:{loggedin:checkLoggedin},url:"/settings/accounts",templateUrl:"modules/users/views/settings/social-accounts.client.view.html"}).state("signup",{resolve:{isDisabled:checkSignupDisabled},url:"/signup",templateUrl:"modules/users/views/authentication/signup.client.view.html"}).state("signup-success",{resolve:{isDisabled:checkSignupDisabled},url:"/signup-success",templateUrl:"modules/users/views/authentication/signup-success.client.view.html"}).state("signin",{url:"/signin",templateUrl:"modules/users/views/authentication/signin.client.view.html"}).state("access_denied",{url:"/access_denied",templateUrl:"modules/users/views/authentication/access-denied.client.view.html"}).state("verify",{resolve:{isDisabled:checkSignupDisabled},url:"/verify/:token",templateUrl:"modules/users/views/verify/verify-account.client.view.html"}).state("resendVerifyEmail",{resolve:{isDisabled:checkSignupDisabled},url:"/verify",templateUrl:"modules/users/views/verify/resend-verify-email.client.view.html"}).state("forgot",{url:"/password/forgot",templateUrl:"modules/users/views/password/forgot-password.client.view.html"}).state("reset-invalid",{url:"/password/reset/invalid",templateUrl:"modules/users/views/password/reset-password-invalid.client.view.html"}).state("reset-success",{url:"/password/reset/success",templateUrl:"modules/users/views/password/reset-password-success.client.view.html"}).state("reset",{url:"/password/reset/:token",templateUrl:"modules/users/views/password/reset-password.client.view.html"})}]),angular.module("users").controller("AuthenticationController",["$scope","$location","$state","$rootScope","User","Auth",function($scope,$location,$state,$rootScope,User,Auth){$scope=$rootScope,$scope.credentials={},$scope.error="",$scope.signin=function(){$scope.credentials.email=$scope.credentials.username,User.login($scope.credentials).then(function(response){Auth.login(response),$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),"home"!==$state.previous.name&&"verify"!==$state.previous.name&&""!==$state.previous.name?$state.go($state.previous.name):$state.go("listForms")},function(error){$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user,$scope.error=error,console.log("loginError: "+error)})},$scope.signup=function(){console.log($scope.credentials),User.signup($scope.credentials).then(function(response){console.log("signup-success"),$state.go("signup-success")},function(error){console.log("Error: "),console.log(error),error?($scope.error=error,console.log(error)):console.log("No response received")})}}]),angular.module("users").controller("PasswordController",["$scope","$stateParams","$state","User",function($scope,$stateParams,$state,User){$scope.error="",$scope.askForPasswordReset=function(){User.askForPasswordReset($scope.credentials).then(function(response){$scope.success=response.message,$scope.credentials=null},function(error){$scope.error=error,$scope.credentials=null})},$scope.resetUserPassword=function(){$scope.success=$scope.error=null,User.resetPassword($scope.passwordDetails,$stateParams.token).then(function(response){$scope.success=response.message,$scope.passwordDetails=null,$state.go("reset-success")},function(error){$scope.error=error.message||error,$scope.passwordDetails=null})}}]),angular.module("users").controller("SettingsController",["$scope","$rootScope","$http","$state","Users",function($scope,$rootScope,$http,$state,Users){$scope.user=$rootScope.user,$scope.hasConnectedAdditionalSocialAccounts=function(provider){for(var i in $scope.user.additionalProvidersData)return!0;return!1},$scope.isConnectedSocialAccount=function(provider){return $scope.user.provider===provider||$scope.user.additionalProvidersData&&$scope.user.additionalProvidersData[provider]},$scope.removeUserSocialAccount=function(provider){$scope.success=$scope.error=null,$http["delete"]("/users/accounts",{params:{provider:provider}}).success(function(response){$scope.success=!0,$scope.user=response}).error(function(response){$scope.error=response.message})},$scope.updateUserProfile=function(isValid){if(isValid){$scope.success=$scope.error=null;var user=new Users($scope.user);user.$update(function(response){$scope.success=!0,$scope.user=response},function(response){$scope.error=response.data.message})}else $scope.submitted=!0},$scope.changeUserPassword=function(){$scope.success=$scope.error=null,$http.post("/users/password",$scope.passwordDetails).success(function(response){$scope.success=!0,$scope.passwordDetails=null}).error(function(response){$scope.error=response.message})}}]),angular.module("users").controller("VerifyController",["$scope","$state","$rootScope","User","Auth","$stateParams",function($scope,$state,$rootScope,User,Auth,$stateParams){$scope.isResetSent=!1,$scope.credentials={},$scope.error="",$scope.resendVerifyEmail=function(){User.resendVerifyEmail($scope.credentials.email).then(function(response){console.log(response),$scope.success=response.message,$scope.credentials=null,$scope.isResetSent=!0},function(error){$scope.error=error,$scope.credentials.email=null,$scope.isResetSent=!1})},$scope.validateVerifyToken=function(){$stateParams.token&&(console.log($stateParams.token),User.validateVerifyToken($stateParams.token).then(function(response){console.log("Success: "+response.message),$scope.success=response.message,$scope.isResetSent=!0,$scope.credentials.email=null},function(error){console.log("Error: "+error.message),$scope.isResetSent=!1,$scope.error=error,$scope.credentials.email=null}))}}]),angular.module("users").factory("Auth",["$window",function($window){var userState={isLoggedIn:!1},service={_currentUser:null,get currentUser(){return this._currentUser},ensureHasCurrentUser:function(User){return service._currentUser&&service._currentUser.username?service._currentUser:$window.user?(service._currentUser=$window.user,service._currentUser):void User.getCurrent().then(function(user){return service._currentUser=user,userState.isLoggedIn=!0,$window.user=service._currentUser,service._currentUser},function(response){return userState.isLoggedIn=!1,service._currentUser=null,$window.user=null,console.log("User.getCurrent() err",response),null})},isAuthenticated:function(){return!!service._currentUser},getUserState:function(){return userState},login:function(new_user){userState.isLoggedIn=!0,service._currentUser=new_user},logout:function(){$window.user=null,userState.isLoggedIn=!1,service._currentUser=null}};return service}]),angular.module("users").service("Authorizer",["APP_PERMISSIONS","USER_ROLES",function(APP_PERMISSIONS,USER_ROLES){return function(user){return{canAccess:function(permissions){var i,len,permission;for(angular.isArray(permissions)||(permissions=[permissions]),i=0,len=permissions.length;len>i;i++){if(permission=permissions[i],null===APP_PERMISSIONS[permission])throw"Bad permission value";if(!user||!user.roles)return!1;switch(permission){case APP_PERMISSIONS.viewAdminSettings:case APP_PERMISSIONS.editAdminSettings:return user.roles.indexOf(USER_ROLES.admin)>-1;case APP_PERMISSIONS.viewPrivateForm:case APP_PERMISSIONS.editForm:return user.roles.indexOf(USER_ROLES.admin)>-1||user.roles.indexOf(USER_ROLES.normal)>-1}}return!1}}}}]),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function($window,$q,$timeout,$http,$state){var userService={getCurrent:function(){var deferred=$q.defer();return $http.get("/users/me").success(function(response){deferred.resolve(response)}).error(function(){deferred.reject("User's session has expired")}),deferred.promise},login:function(credentials){var deferred=$q.defer();return $http.post("/auth/signin",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},logout:function(){var deferred=$q.defer();return $http.get("/auth/signout").success(function(response){deferred.resolve(null)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},signup:function(credentials){var deferred=$q.defer();return $http.post("/auth/signup",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},resendVerifyEmail:function(_email){var deferred=$q.defer();return $http.post("/auth/verify",{email:_email}).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},validateVerifyToken:function(token){var validTokenRe=/^([A-Za-z0-9]{48})$/g;if(!validTokenRe.test(token))throw new Error("Error token: "+token+" is not a valid verification token");var deferred=$q.defer();return $http.get("/auth/verify/"+token).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error)}),deferred.promise},resetPassword:function(passwordDetails,token){var deferred=$q.defer();return $http.get("/auth/password/"+token,passwordDetails).success(function(response){deferred.resolve()}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},askForPasswordReset:function(credentials){var deferred=$q.defer();return $http.post("/auth/forgot",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise}};return userService}]),angular.module("users").factory("Users",["$resource",function($resource){return $resource("users",{},{update:{method:"PUT"}})}]); \ No newline at end of file +statement:"fa fa-quote-left",yes_no:"fa fa-toggle-on",number:"fa fa-slack"};$scope.typeIcon=iconTypeMap[$scope.typeName]}]}});var __indexOf=[].indexOf||function(item){for(var i=0,l=this.length;l>i;i++)if(i in this&&this[i]===item)return i;return-1};angular.module("forms").directive("fieldDirective",["$http","$compile","$rootScope","$templateCache",function($http,$compile,$rootScope,$templateCache){var getTemplateUrl=function(fieldType){var type=fieldType,templateUrl="modules/forms/views/directiveViews/field/",supported_fields=["textfield","textarea","date","dropdown","hidden","password","radio","legal","statement","rating","yes_no","number","natural"];return __indexOf.call(supported_fields,type)>=0&&(templateUrl=templateUrl+type+".html"),$templateCache.get("../public/"+templateUrl)};return{template:"
{{field.title}}
",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(scope,element){$rootScope.chooseDefaultOption=scope.chooseDefaultOption=function(type){"yes_no"===type?scope.field.fieldValue="true":"rating"===type?scope.field.fieldValue=0:"radio"===scope.field.fieldType?(console.log(scope.field),scope.field.fieldValue=scope.field.fieldOptions[0].option_value,console.log(scope.field.fieldValue)):"legal"===type&&(scope.field.fieldValue="true",$rootScope.nextField())},scope.setActiveField=$rootScope.setActiveField,"date"===scope.field.fieldType&&(scope.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var fieldType=scope.field.fieldType;if("number"===scope.field.fieldType||"textfield"===scope.field.fieldType||"email"===scope.field.fieldType||"link"===scope.field.fieldType){switch(scope.field.fieldType){case"textfield":scope.field.input_type="text";break;case"email":scope.field.input_type="email",scope.field.placeholder="joesmith@example.com";break;case"number":scope.field.input_type="text",scope.field.validateRegex=/^-?\d+$/;break;default:scope.field.input_type="url",scope.field.placeholder="http://example.com"}fieldType="textfield"}var template=getTemplateUrl(fieldType);element.html(template).show();$compile(element.contents())(scope)}}}]),angular.module("forms").directive("keyToOption",function(){return{restrict:"A",scope:{field:"="},link:function($scope,$element,$attrs,$select){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,index=parseInt(String.fromCharCode(keyCode))-1;index<$scope.field.fieldOptions.length&&(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue=$scope.field.fieldOptions[index].option_value}))})}}}),angular.module("forms").directive("keyToTruthy",["$rootScope",function($rootScope){return{restrict:"A",scope:{field:"="},link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,truthyKeyCode=$attrs.keyCharTruthy.charCodeAt(0)-32,falseyKeyCode=$attrs.keyCharFalsey.charCodeAt(0)-32;keyCode===truthyKeyCode?(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue="true"})):keyCode===falseyKeyCode&&(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue="false"}))})}}}]),angular.module("forms").directive("onEnterKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,onEnterKeyDisabled=!1;null!==$attrs.onEnterKeyDisabled&&(onEnterKeyDisabled=$attrs.onEnterKeyDisabled),13!==keyCode||event.shiftKey||onEnterKeyDisabled||(event.preventDefault(),$rootScope.$apply(function(){$rootScope.$eval($attrs.onEnterKey)}))})}}}]).directive("onTabKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;9!==keyCode||event.shiftKey||(event.preventDefault(),$rootScope.$apply(function(){$rootScope.$eval($attrs.onTabKey)}))})}}}]).directive("onEnterOrTabKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;13!==keyCode&&9!==keyCode||event.shiftKey||(event.preventDefault(),$rootScope.$apply(function(){$rootScope.$eval($attrs.onEnterOrTabKey)}))})}}}]).directive("onTabAndShiftKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;9===keyCode&&event.shiftKey&&(event.preventDefault(),$rootScope.$apply(function(){$rootScope.$eval($attrs.onTabAndShiftKey)}))})}}}]),angular.module("forms").directive("onFinishRender",["$rootScope","$timeout",function($rootScope,$timeout){return{restrict:"A",link:function(scope,element,attrs){if(element.attr("ng-repeat")||element.attr("data-ng-repeat")){var broadcastMessage=attrs.onFinishRender||"ngRepeat";scope.$first&&!scope.$last?scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Started")}):scope.$last&&scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Finished")})}}}}]),angular.module("forms").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","Auth","SendVisitorData",function($http,TimeCounter,$filter,$rootScope,Auth,SendVisitorData){return{templateUrl:"modules/forms/views/directiveViews/form/submit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$document","$window","$scope",function($document,$window,$scope){$scope.authentication=$rootScope.authentication,$scope.noscroll=!1,$scope.forms={},$scope.form_fields_count=$scope.myform.visible_form_fields.filter(function(field){return"statement"!==field.fieldType&&"rating"!==field.fieldType}).length,$scope.reloadForm=function(){$scope.myform.submitted=!1,$scope.myform.form_fields=_.chain($scope.myform.visible_form_fields).map(function(field){return field.fieldValue="",field}).value(),$scope.loading=!1,$scope.error="",$scope.selected={_id:"",index:0},$scope.setActiveField($scope.myform.visible_form_fields[0]._id,0,!1),TimeCounter.restartClock()},$window.onscroll=function(){$scope.scrollPos=document.body.scrollTop||document.documentElement.scrollTop||0;var elemBox=document.getElementsByClassName("activeField")[0].getBoundingClientRect();$scope.fieldTop=elemBox.top,$scope.fieldBottom=elemBox.bottom;var field_id,field_index;$scope.noscroll||($scope.selected.index===$scope.myform.visible_form_fields.length-1&&$scope.fieldBottom<200?(field_index=$scope.selected.index+1,field_id="submit_field",$scope.setActiveField(field_id,field_index,!1)):$scope.selected.index===$scope.myform.visible_form_fields.length?$scope.fieldTop>200&&(field_index=$scope.selected.index-1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):$scope.fieldBottom<0?(field_index=$scope.selected.index+1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):0!==$scope.selected.index&&$scope.fieldTop>0&&(field_index=$scope.selected.index-1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)),$scope.$apply())};var getActiveField=function(){if(null===$scope.selected)throw console.error("current active field is null"),new Error("current active field is null");return"submit_field"===$scope.selected._id?$scope.myform.form_fields.length-1:$scope.selected.index};$scope.setActiveField=$rootScope.setActiveField=function(field_id,field_index,animateScroll){null!==$scope.selected&&$scope.selected._id!==field_id&&($scope.selected._id=field_id,$scope.selected.index=field_index,animateScroll?($scope.noscroll=!0,setTimeout(function(){$document.scrollToElement(angular.element(".activeField"),-10,200).then(function(){$scope.noscroll=!1,setTimeout(function(){document.querySelectorAll(".activeField .focusOn").length?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input").length?document.querySelectorAll(".activeField input")[0].focus():document.querySelectorAll(".activeField .selectize-input")[0].focus()})})})):setTimeout(function(){document.querySelectorAll(".activeField .focusOn")[0]?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input")[0].focus()}),SendVisitorData.send($scope.myform,getActiveField(),TimeCounter.getTimeElapsed()))},$rootScope.nextField=$scope.nextField=function(){var selected_index,selected_id;$scope.selected.index<$scope.myform.visible_form_fields.length-1?(selected_index=$scope.selected.index+1,selected_id=$scope.myform.visible_form_fields[selected_index]._id,$rootScope.setActiveField(selected_id,selected_index,!0)):$scope.selected.index===$scope.myform.visible_form_fields.length-1&&(selected_index=$scope.selected.index+1,selected_id="submit_field",$rootScope.setActiveField(selected_id,selected_index,!0))},$rootScope.prevField=$scope.prevField=function(){if($scope.selected.index>0){var selected_index=$scope.selected.index-1,selected_id=$scope.myform.visible_form_fields[selected_index]._id;$scope.setActiveField(selected_id,selected_index,!0)}},$scope.exitStartPage=function(){$scope.myform.startPage.showStart=!1,$scope.myform.visible_form_fields.length>0&&($scope.selected._id=$scope.myform.visible_form_fields[0]._id)},$rootScope.goToInvalid=$scope.goToInvalid=function(){document.querySelectorAll(".ng-invalid.focusOn")[0].focus()},$rootScope.submitForm=$scope.submitForm=function(){var _timeElapsed=TimeCounter.stopClock();$scope.loading=!0;var form=_.cloneDeep($scope.myform);form.timeElapsed=_timeElapsed,form.percentageComplete=$filter("formValidity")($scope.myform)/$scope.myform.visible_form_fields.length*100,delete form.visible_form_fields;for(var i=0;i<$scope.myform.form_fields.length;i++)"dropdown"!==$scope.myform.form_fields[i].fieldType||$scope.myform.form_fields[i].deletePreserved||($scope.myform.form_fields[i].fieldValue=$scope.myform.form_fields[i].fieldValue.option_value);setTimeout(function(){$scope.submitPromise=$http.post("/forms/"+$scope.myform._id,form).success(function(data,status,headers){console.log($scope.myform.form_fields[0]),$scope.myform.submitted=!0,$scope.loading=!1,SendVisitorData.send($scope.myform,getActiveField(),_timeElapsed)}).error(function(error){$scope.loading=!1,console.error(error),$scope.error=error.message})},500)},$scope.reloadForm()}]}}]),angular.module("forms").service("CurrentForm",function(){var _form={};this.getForm=function(){return _form},this.setForm=function(form){_form=form}}),angular.module("forms").service("FormFields",[function(){this.types=[{name:"textfield",value:"Short Text"},{name:"email",value:"Email"},{name:"radio",value:"Multiple Choice"},{name:"dropdown",value:"Dropdown"},{name:"date",value:"Date"},{name:"textarea",value:"Paragraph Text"},{name:"yes_no",value:"Yes/No"},{name:"legal",value:"Legal"},{name:"rating",value:"Rating"},{name:"link",value:"Link"},{name:"number",value:"Numbers"},{name:"statement",value:"Statement"}]}]),angular.module("forms").factory("Forms",["$resource",function($resource){return $resource("/forms/:formId",{formId:"@_id"},{query:{method:"GET",isArray:!0},get:{method:"GET",transformResponse:function(data,header){var form=angular.fromJson(data);return form.visible_form_fields=_.filter(form.form_fields,function(field){return field.deletePreserved===!1}),form}},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").factory("Submissions",["$resource",function($resource){return $resource("forms/:formID/submissions/:submissionId",{submissionId:"@_id",formId:"@_id"},{query:{method:"GET",isArray:!0},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").service("TimeCounter",[function(){var _startTime,_endTime=null;this.timeSpent=0,this.restartClock=function(){_startTime=Date.now(),_endTime=null},this.getTimeElapsed=function(){return _startTime?Math.abs(Date.now().valueOf()-_startTime.valueOf())/1e3:void 0},this.stopClock=function(){return _startTime&&null===_endTime?(_endTime=Date.now(),this.timeSpent=Math.abs(_endTime.valueOf()-_startTime.valueOf())/1e3,this._startTime=this._endTime=null,this.timeSpent):new Error("Clock has not been started")},this.clockStarted=function(){return!!this._startTime}}]),angular.module("users").config(["$httpProvider",function($httpProvider){$httpProvider.interceptors.push(["$q","$location",function($q,$location){return{responseError:function(response){return"/users/me"!==$location.path()&&response.config&&"/users/me"!==response.config.url&&(console.log("intercepted rejection of ",response.config.url,response.status),401===response.status?(console.log($location.path()),$location.nextAfterLogin=$location.path(),$location.path("/signin")):403===response.status&&$location.path("/access_denied")),$q.reject(response)}}}])}]),angular.module("users").config(["$stateProvider",function($stateProvider){var checkLoggedin=function($q,$timeout,$state,User,Auth){var deferred=$q.defer();return Auth.currentUser&&Auth.currentUser.email?$timeout(deferred.resolve):Auth.currentUser=User.getCurrent(function(){Auth.login(),$timeout(deferred.resolve())},function(){Auth.logout(),$timeout(deferred.reject()),$state.go("signin",{reload:!0})}),deferred.promise};checkLoggedin.$inject=["$q","$timeout","$state","User","Auth"];var checkSignupDisabled=function($window,$timeout,$q){var deferred=$q.defer();return $timeout($window.signupDisabled?deferred.reject():deferred.resolve()),deferred.promise};checkSignupDisabled.$inject=["$window","$timeout","$q"],$stateProvider.state("profile",{resolve:{loggedin:checkLoggedin},url:"/settings/profile",templateUrl:"modules/users/views/settings/edit-profile.client.view.html"}).state("password",{resolve:{loggedin:checkLoggedin},url:"/settings/password",templateUrl:"modules/users/views/settings/change-password.client.view.html"}).state("accounts",{resolve:{loggedin:checkLoggedin},url:"/settings/accounts",templateUrl:"modules/users/views/settings/social-accounts.client.view.html"}).state("signup",{resolve:{isDisabled:checkSignupDisabled},url:"/signup",templateUrl:"modules/users/views/authentication/signup.client.view.html"}).state("signup-success",{resolve:{isDisabled:checkSignupDisabled},url:"/signup-success",templateUrl:"modules/users/views/authentication/signup-success.client.view.html"}).state("signin",{url:"/signin",templateUrl:"modules/users/views/authentication/signin.client.view.html"}).state("access_denied",{url:"/access_denied",templateUrl:"modules/users/views/authentication/access-denied.client.view.html"}).state("verify",{resolve:{isDisabled:checkSignupDisabled},url:"/verify/:token",templateUrl:"modules/users/views/verify/verify-account.client.view.html"}).state("resendVerifyEmail",{resolve:{isDisabled:checkSignupDisabled},url:"/verify",templateUrl:"modules/users/views/verify/resend-verify-email.client.view.html"}).state("forgot",{url:"/password/forgot",templateUrl:"modules/users/views/password/forgot-password.client.view.html"}).state("reset-invalid",{url:"/password/reset/invalid",templateUrl:"modules/users/views/password/reset-password-invalid.client.view.html"}).state("reset-success",{url:"/password/reset/success",templateUrl:"modules/users/views/password/reset-password-success.client.view.html"}).state("reset",{url:"/password/reset/:token",templateUrl:"modules/users/views/password/reset-password.client.view.html"})}]),angular.module("users").controller("AuthenticationController",["$scope","$location","$state","$rootScope","User","Auth",function($scope,$location,$state,$rootScope,User,Auth){$scope=$rootScope,$scope.credentials={},$scope.error="",$scope.signin=function(){$scope.credentials.email=$scope.credentials.username,User.login($scope.credentials).then(function(response){Auth.login(response),$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),"home"!==$state.previous.name&&"verify"!==$state.previous.name&&""!==$state.previous.name?$state.go($state.previous.name):$state.go("listForms")},function(error){$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user,$scope.error=error,console.log("loginError: "+error)})},$scope.signup=function(){console.log($scope.credentials),User.signup($scope.credentials).then(function(response){console.log("signup-success"),$state.go("signup-success")},function(error){console.log("Error: "),console.log(error),error?($scope.error=error,console.log(error)):console.log("No response received")})}}]),angular.module("users").controller("PasswordController",["$scope","$stateParams","$state","User",function($scope,$stateParams,$state,User){$scope.error="",$scope.askForPasswordReset=function(){User.askForPasswordReset($scope.credentials).then(function(response){$scope.success=response.message,$scope.credentials=null},function(error){$scope.error=error,$scope.credentials=null})},$scope.resetUserPassword=function(){$scope.success=$scope.error=null,User.resetPassword($scope.passwordDetails,$stateParams.token).then(function(response){$scope.success=response.message,$scope.passwordDetails=null,$state.go("reset-success")},function(error){$scope.error=error.message||error,$scope.passwordDetails=null})}}]),angular.module("users").controller("SettingsController",["$scope","$rootScope","$http","$state","Users",function($scope,$rootScope,$http,$state,Users){$scope.user=$rootScope.user,$scope.hasConnectedAdditionalSocialAccounts=function(provider){for(var i in $scope.user.additionalProvidersData)return!0;return!1},$scope.isConnectedSocialAccount=function(provider){return $scope.user.provider===provider||$scope.user.additionalProvidersData&&$scope.user.additionalProvidersData[provider]},$scope.removeUserSocialAccount=function(provider){$scope.success=$scope.error=null,$http["delete"]("/users/accounts",{params:{provider:provider}}).success(function(response){$scope.success=!0,$scope.user=response}).error(function(response){$scope.error=response.message})},$scope.updateUserProfile=function(isValid){if(isValid){$scope.success=$scope.error=null;var user=new Users($scope.user);user.$update(function(response){$scope.success=!0,$scope.user=response},function(response){$scope.error=response.data.message})}else $scope.submitted=!0},$scope.changeUserPassword=function(){$scope.success=$scope.error=null,$http.post("/users/password",$scope.passwordDetails).success(function(response){$scope.success=!0,$scope.passwordDetails=null}).error(function(response){$scope.error=response.message})}}]),angular.module("users").controller("VerifyController",["$scope","$state","$rootScope","User","Auth","$stateParams",function($scope,$state,$rootScope,User,Auth,$stateParams){$scope.isResetSent=!1,$scope.credentials={},$scope.error="",$scope.resendVerifyEmail=function(){User.resendVerifyEmail($scope.credentials.email).then(function(response){console.log(response),$scope.success=response.message,$scope.credentials=null,$scope.isResetSent=!0},function(error){$scope.error=error,$scope.credentials.email=null,$scope.isResetSent=!1})},$scope.validateVerifyToken=function(){$stateParams.token&&(console.log($stateParams.token),User.validateVerifyToken($stateParams.token).then(function(response){console.log("Success: "+response.message),$scope.success=response.message,$scope.isResetSent=!0,$scope.credentials.email=null},function(error){console.log("Error: "+error.message),$scope.isResetSent=!1,$scope.error=error,$scope.credentials.email=null}))}}]),angular.module("users").factory("Auth",["$window",function($window){var userState={isLoggedIn:!1},service={_currentUser:null,get currentUser(){return this._currentUser},ensureHasCurrentUser:function(User){return service._currentUser&&service._currentUser.username?service._currentUser:$window.user?(service._currentUser=$window.user,service._currentUser):void User.getCurrent().then(function(user){return service._currentUser=user,userState.isLoggedIn=!0,$window.user=service._currentUser,service._currentUser},function(response){return userState.isLoggedIn=!1,service._currentUser=null,$window.user=null,console.log("User.getCurrent() err",response),null})},isAuthenticated:function(){return!!service._currentUser},getUserState:function(){return userState},login:function(new_user){userState.isLoggedIn=!0,service._currentUser=new_user},logout:function(){$window.user=null,userState.isLoggedIn=!1,service._currentUser=null}};return service}]),angular.module("users").service("Authorizer",["APP_PERMISSIONS","USER_ROLES",function(APP_PERMISSIONS,USER_ROLES){return function(user){return{canAccess:function(permissions){var i,len,permission;for(angular.isArray(permissions)||(permissions=[permissions]),i=0,len=permissions.length;len>i;i++){if(permission=permissions[i],null===APP_PERMISSIONS[permission])throw"Bad permission value";if(!user||!user.roles)return!1;switch(permission){case APP_PERMISSIONS.viewAdminSettings:case APP_PERMISSIONS.editAdminSettings:return user.roles.indexOf(USER_ROLES.admin)>-1;case APP_PERMISSIONS.viewPrivateForm:case APP_PERMISSIONS.editForm:return user.roles.indexOf(USER_ROLES.admin)>-1||user.roles.indexOf(USER_ROLES.normal)>-1}}return!1}}}}]),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function($window,$q,$timeout,$http,$state){var userService={getCurrent:function(){var deferred=$q.defer();return $http.get("/users/me").success(function(response){deferred.resolve(response)}).error(function(){deferred.reject("User's session has expired")}),deferred.promise},login:function(credentials){var deferred=$q.defer();return $http.post("/auth/signin",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},logout:function(){var deferred=$q.defer();return $http.get("/auth/signout").success(function(response){deferred.resolve(null)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},signup:function(credentials){var deferred=$q.defer();return $http.post("/auth/signup",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},resendVerifyEmail:function(_email){var deferred=$q.defer();return $http.post("/auth/verify",{email:_email}).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},validateVerifyToken:function(token){var validTokenRe=/^([A-Za-z0-9]{48})$/g;if(!validTokenRe.test(token))throw new Error("Error token: "+token+" is not a valid verification token");var deferred=$q.defer();return $http.get("/auth/verify/"+token).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error)}),deferred.promise},resetPassword:function(passwordDetails,token){var deferred=$q.defer();return $http.get("/auth/password/"+token,passwordDetails).success(function(response){deferred.resolve()}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},askForPasswordReset:function(credentials){var deferred=$q.defer();return $http.post("/auth/forgot",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise}};return userService}]),angular.module("users").factory("Users",["$resource",function($resource){return $resource("users",{},{update:{method:"PUT"}})}]); +======= +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +function removeDateFieldsFunc(o){function eachObject(v,k){"lastModified"!==k&&"created"!==k||delete clone[k]}for(var clone=_.clone(o),i=0;i'),$templateCache.put("../public/modules/core/views/home.client.view.html",'

Craft beautiful forms in seconds.

Create your next ______.

Tell a story with a form.

'),$templateCache.put("../public/modules/forms/views/admin-form.client.view.html",'
'),$templateCache.put("../public/modules/forms/views/list-forms.client.view.html",'

Create a new form
Name
Language

'),$templateCache.put("../public/modules/forms/views/submit-form.client.view.html","
"),$templateCache.put("../public/modules/forms/views/adminTabs/analyze.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/configure.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/create.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/design.html",'
Background Color
Question Text Color
Answer Text Color
Button Background Color
Button Text Color
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeA.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/entryPage/startPage.html",'

{{pageData.introTitle}}

{{pageData.introParagraph}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/date.html",'

{{index+1}} {{field.title}} optional

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/dropdown.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/file.html",'

{{index+1}} {{field.title}} optional

{{field.file.originalname}}
Upload your File
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/hidden.html",''),$templateCache.put("../public/modules/forms/views/directiveViews/field/legal.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/radio.html",'

{{index+1}} {{field.title}} optional


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/rating.html",'

{{index+1}} {{field.title}} optional

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/statement.html",'

{{field.title}}

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textarea.html",'

{{index+1}} {{field.title}} optional

press SHIFT+ENTER to create a newline
press ENTER
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textfield.html",'

{{index+1}} {{field.title}} (optional)

press ENTER
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/yes_no.html",'

{{index+1}} {{field.title}} optional

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/form/configure-form.client.view.html",'
Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.name}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type
Form Name
Form Status
Language
* required
Display Form Footer?
Display Start Page?
'), +$templateCache.put("../public/modules/forms/views/directiveViews/form/edit-form.client.view.html",'

Edit Start Page


Intro Title:
Intro Paragraph:
\n
\n\n

\n
\n
Options:
\n
\n
\n \n\n \n \n \n
\n
\n \n
\n
\n
\n\n

\n\n
\n
Required:
\n
\n \n\n \n
\n
\n\n
\n
Disabled:
\n
\n \n\n \n
\n
\n\n
\n \n\n
\n
\n

\n Click on Fields to add them here\n

\n
\n
\n\n
\n \n
\n\n \n \n\n \n
\n
\n\n'),$templateCache.put("../public/modules/forms/views/directiveViews/form/edit-submissions-form.client.view.html",'
#{{value.title}}OscarEMR User ProfilePercentage CompleteTime ElapsedDeviceLocationIP AddressDate Submitted (UTC)Generated PDF
{{$index+1}}{{field.fieldValue}}User Profile #{{row.oscarDemoNum}}{{row.percentageComplete}}%{{row.timeElapsed}}{{row.device.name}}, {{row.device.type}}{{row.geoLocation.city}}, {{row.geoLocation.country}}{{row.ipAddr}}{{row.created | date:\'yyyy-MM-dd HH:mm:ss\'}}Generated PDF
'),$templateCache.put("../public/modules/forms/views/directiveViews/form/submit-form.client.view.html",'
{{form_fields_count - (myform | formValidity)}} answer(s) need completing
'),$templateCache.put("../public/modules/users/views/authentication/access-denied.client.view.html",'

You need to be logged in to access this page

Login
'),$templateCache.put("../public/modules/users/views/authentication/signin.client.view.html",'

Sign into your account

'),$templateCache.put("../public/modules/users/views/authentication/signup-success.client.view.html",''),$templateCache.put("../public/modules/users/views/authentication/signup.client.view.html",''),$templateCache.put("../public/modules/users/views/password/forgot-password.client.view.html",'

Restore your password

Enter your account email.

'),$templateCache.put("../public/modules/users/views/password/reset-password-invalid.client.view.html",'

Password reset is invalid

Ask for a new password reset
'),$templateCache.put("../public/modules/users/views/password/reset-password-success.client.view.html",'

Password successfully reset

Continue to home page
'),$templateCache.put("../public/modules/users/views/password/reset-password.client.view.html",'

Reset your password

'),$templateCache.put("../public/modules/users/views/settings/change-password.client.view.html",'

Change your password

'),$templateCache.put("../public/modules/users/views/settings/edit-profile.client.view.html",'

Edit your profile

'), +$templateCache.put("../public/modules/users/views/settings/social-accounts.client.view.html",'

Connected social accounts:

Connect other social accounts:

'),$templateCache.put("../public/modules/users/views/verify/resend-verify-email.client.view.html",'

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at polydaic@gmail.com

'),$templateCache.put("../public/modules/users/views/verify/verify-account.client.view.html",'

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
')}]);var ApplicationConfiguration=function(){var applicationModuleName="NodeForm",applicationModuleVendorDependencies=["duScroll","ui.select","cgBusy","ngSanitize","vButton","ngResource","NodeForm.templates","ui.router","ui.bootstrap","ui.utils"],registerModule=function(moduleName,dependencies){angular.module(moduleName,dependencies||[]),angular.module(applicationModuleName).requires.push(moduleName)};return{applicationModuleName:applicationModuleName,applicationModuleVendorDependencies:applicationModuleVendorDependencies,registerModule:registerModule}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function($locationProvider){$locationProvider.hashPrefix("!")}]),angular.module(ApplicationConfiguration.applicationModuleName).constant("APP_PERMISSIONS",{viewAdminSettings:"viewAdminSettings",editAdminSettings:"editAdminSettings",editForm:"editForm",viewPrivateForm:"viewPrivateForm"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("USER_ROLES",{admin:"admin",normal:"user",superuser:"superuser"}),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","$state","$stateParams",function($rootScope,Auth,$state,$stateParams){$rootScope.$state=$state,$rootScope.$stateParams=$stateParams,$rootScope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState){$state.previous=fromState;var statesToIgnore=["home","signin","resendVerifyEmail","verify","signup","signup-success","forgot","reset-invalid","reset","reset-success"];statesToIgnore.indexOf(toState.name)>0?Auth.isAuthenticated()&&(event.preventDefault(),$state.go("listForms")):"access_denied"===toState.name||Auth.isAuthenticated()||"submitForm"===toState.name||(console.log("go to signup"),event.preventDefault(),$state.go("listForms"))})}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","User","Authorizer","$state","$stateParams",function($rootScope,Auth,User,Authorizer,$state,$stateParams){$rootScope.$on("$stateChangeStart",function(event,next){var authenticator,permissions,user;permissions=next&&next.data&&next.data.permissions?next.data.permissions:null,Auth.ensureHasCurrentUser(User),user=Auth.currentUser,user&&(authenticator=new Authorizer(user),null!=permissions&&(authenticator.canAccess(permissions)||(event.preventDefault(),$state.go("access_denied"))))})}]),angular.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),ApplicationConfiguration.registerModule("core",["users"]),ApplicationConfiguration.registerModule("forms",["ngFileUpload","ui.router.tabs","colorpicker.module","ui.date","ui.sortable","angular-input-stars","users"]),ApplicationConfiguration.registerModule("users"),angular.module("core").config(["$stateProvider","$urlRouterProvider",function($stateProvider,$urlRouterProvider,Authorization){$urlRouterProvider.otherwise("/forms")}]),angular.module("core").controller("HeaderController",["$rootScope","$scope","Menus","$state","Auth","User","$window",function($rootScope,$scope,Menus,$state,Auth,User,$window){$rootScope.signupDisabled=$window.signupDisabled,$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.authentication=$rootScope.authentication=Auth,$rootScope.languages=$scope.languages=["english","french","spanish"],$scope.isCollapsed=!1,$rootScope.hideNav=!1,$scope.menu=Menus.getMenu("topbar"),$scope.signout=function(){var promise=User.logout();promise.then(function(){Auth.logout(),Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user=null,$state.go("listForms")},function(reason){console.log("Logout Failed: "+reason)})},$scope.toggleCollapsibleMenu=function(){$scope.isCollapsed=!$scope.isCollapsed},$scope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState,fromParams){$scope.isCollapsed=!1,$rootScope.hideNav=!1,angular.isDefined(toState.data)&&angular.isDefined(toState.data.hideNav)&&($rootScope.hideNav=toState.data.hideNav)})}]),angular.module("core").controller("HomeController",["$rootScope","$scope","User","$state",function($rootScope,$scope,User,$state){$scope=$rootScope}]),angular.module("core").service("Menus",[function(){this.defaultRoles=["*"],this.menus={};var shouldRender=function(user){if(!user)return this.isPublic;if(~this.roles.indexOf("*"))return!0;for(var userRoleIndex in user.roles)for(var roleIndex in this.roles)if(console.log(this.roles[roleIndex]),console.log(this.roles[roleIndex]===user.roles[userRoleIndex]),this.roles[roleIndex]===user.roles[userRoleIndex])return!0;return!1};this.validateMenuExistance=function(menuId){if(menuId&&menuId.length){if(this.menus[menuId])return!0;throw new Error("Menu does not exists")}throw new Error("MenuId was not provided")},this.getMenu=function(menuId){return this.validateMenuExistance(menuId),this.menus[menuId]},this.addMenu=function(menuId,isPublic,roles){return this.menus[menuId]={isPublic:isPublic||!1,roles:roles||this.defaultRoles,items:[],shouldRender:shouldRender},this.menus[menuId]},this.removeMenu=function(menuId){this.validateMenuExistance(menuId),delete this.menus[menuId]},this.addMenuItem=function(menuId,menuItemTitle,menuItemURL,menuItemType,menuItemUIRoute,isPublic,roles,position){return this.validateMenuExistance(menuId),this.menus[menuId].items.push({title:menuItemTitle,link:menuItemURL,menuItemType:menuItemType||"item",menuItemClass:menuItemType,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].roles:roles,position:position||0,items:[],shouldRender:shouldRender}),this.menus[menuId]},this.addSubMenuItem=function(menuId,rootMenuItemURL,menuItemTitle,menuItemURL,menuItemUIRoute,isPublic,roles,position){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===rootMenuItemURL&&this.menus[menuId].items[itemIndex].items.push({title:menuItemTitle,link:menuItemURL,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].items[itemIndex].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].items[itemIndex].roles:roles,position:position||0,shouldRender:shouldRender});return this.menus[menuId]},this.removeMenuItem=function(menuId,menuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===menuItemURL&&this.menus[menuId].items.splice(itemIndex,1);return this.menus[menuId]},this.removeSubMenuItem=function(menuId,submenuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)for(var subitemIndex in this.menus[menuId].items[itemIndex].items)this.menus[menuId].items[itemIndex].items[subitemIndex].link===submenuItemURL&&this.menus[menuId].items[itemIndex].items.splice(subitemIndex,1);return this.menus[menuId]},this.addMenu("topbar",!1,["*"]),this.addMenu("bottombar",!1,["*"])}]),angular.module("forms").run(["Menus",function(Menus){Menus.addMenuItem("topbar","My Forms","forms","","/forms",!1)}]).filter("formValidity",function(){return function(formObj){if(formObj&&formObj.form_fields&&formObj.visible_form_fields){var formKeys=Object.keys(formObj),fields=(formKeys.filter(function(key){return"$"!==key[0]}),formObj.form_fields),valid_count=fields.filter(function(field){return"object"==typeof field&&"statement"!==field.fieldType&&"rating"!==field.fieldType?!!field.fieldValue:void 0}).length;return valid_count-(formObj.form_fields.length-formObj.visible_form_fields.length)}return 0}}).config(["$provide",function($provide){$provide.decorator("accordionDirective",["$delegate",function($delegate){var directive=$delegate[0];return directive.replace=!0,$delegate}])}]),angular.module("forms").config(["$stateProvider",function($stateProvider){$stateProvider.state("listForms",{url:"/forms",templateUrl:"modules/forms/views/list-forms.client.view.html"}).state("submitForm",{url:"/forms/:formId",templateUrl:"modules/forms/views/submit-form.client.view.html",data:{hideNav:!0},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"SubmitFormController",controllerAs:"ctrl"}).state("viewForm",{url:"/forms/:formId/admin",templateUrl:"modules/forms/views/admin-form.client.view.html",data:{permissions:["editForm"]},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"AdminFormController"}).state("viewForm.configure",{url:"/configure",templateUrl:"modules/forms/views/adminTabs/configure.html"}).state("viewForm.design",{url:"/design",templateUrl:"modules/forms/views/adminTabs/design.html"}).state("viewForm.analyze",{url:"/analyze",templateUrl:"modules/forms/views/adminTabs/analyze.html"}).state("viewForm.create",{url:"/create",templateUrl:"modules/forms/views/adminTabs/create.html"})}]),angular.module("forms").controller("AdminFormController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http","$uibModal","myForm",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http,$uibModal,myForm){$scope=$rootScope,$scope.animationsEnabled=!0,$scope.myform=myForm,$rootScope.saveInProgress=!1,CurrentForm.setForm($scope.myform),$scope.tabData=[{heading:"Create",route:"viewForm.create"},{heading:"Design",route:"viewForm.design"},{heading:"Configure",route:"viewForm.configure"},{heading:"Analyze",route:"viewForm.analyze"}],$scope.setForm=function(form){$scope.myform=form},$rootScope.resetForm=function(){$scope.myform=Forms.get({formId:$stateParams.formId})},$scope.openDeleteModal=function(){$scope.deleteModal=$uibModal.open({animation:$scope.animationsEnabled,templateUrl:"myModalContent.html",controller:"AdminFormController",resolve:{myForm:function(){return $scope.myform}}}),$scope.deleteModal.result.then(function(selectedItem){$scope.selected=selectedItem},function(){console.log("Modal dismissed at: "+new Date)})},$scope.cancelDeleteModal=function(){$scope.deleteModal&&$scope.deleteModal.dismiss("cancel")},$scope.removeCurrentForm=function(){if($scope.deleteModal&&$scope.deleteModal.opened){$scope.deleteModal.close();var form_id=$scope.myform._id;if(!form_id)throw new Error("Error - removeCurrentForm(): $scope.myform._id does not exist");$http["delete"]("/forms/"+form_id).success(function(data,status,headers){console.log("form deleted successfully"),$state.go("listForms",{},{reload:!0})}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}},$scope.update=$rootScope.update=function(updateImmediately,cb){var continueUpdate=!0;if(updateImmediately||(continueUpdate=!$rootScope.saveInProgress),continueUpdate){var err=null;updateImmediately||($rootScope.saveInProgress=!0),$scope.updatePromise=$http.put("/forms/"+$scope.myform._id,{form:$scope.myform}).then(function(response){$rootScope.myform=$scope.myform=response.data})["catch"](function(response){console.log("Error occured during form UPDATE.\n"),err=response.data})["finally"](function(){return updateImmediately||($rootScope.saveInProgress=!1),"function"==typeof cb?cb(err):void 0})}}}]),angular.module("forms").controller("ListFormsController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http){$scope=$rootScope,$scope.forms={},$scope.showCreateModal=!1,$scope.findAll=function(){Forms.query(function(_forms){$scope.myforms=_forms})},$scope.openCreateModal=function(){$scope.showCreateModal||($scope.showCreateModal=!0)},$scope.closeCreateModal=function(){$scope.showCreateModal&&($scope.showCreateModal=!1)},$scope.setForm=function(form){$scope.myform=form},$scope.goToWithId=function(route,id){$state.go(route,{formId:id},{reload:!0})},$scope.duplicateForm=function(form_index){var form=_.cloneDeep($scope.myforms[form_index]);delete form._id,$http.post("/forms",{form:form}).success(function(data,status,headers){$scope.myforms.splice(form_index+1,0,data)}).error(function(errorResponse){console.error(errorResponse),null===errorResponse&&($scope.error=errorResponse.data.message)})},$scope.createNewForm=function(){var form={};form.title=$scope.forms.createForm.title.$modelValue,form.language=$scope.forms.createForm.language.$modelValue,$scope.forms.createForm.$valid&&$scope.forms.createForm.$dirty&&$http.post("/forms",{form:form}).success(function(data,status,headers){console.log("new form created"),$scope.goToWithId("viewForm.create",data._id+"")}).error(function(errorResponse){console.error(errorResponse),$scope.error=errorResponse.data.message})},$scope.removeForm=function(form_index){if(form_index>=$scope.myforms.length||0>form_index)throw new Error("Error: form_index in removeForm() must be between 0 and "+$scope.myforms.length-1);$http["delete"]("/forms/"+$scope.myforms[form_index]._id).success(function(data,status,headers){console.log("form deleted successfully"),$scope.myforms.splice(form_index,1)}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}}]),angular.module("forms").controller("SubmitFormController",["$scope","$rootScope","$state","myForm","Auth",function($scope,$rootScope,$state,myForm,Auth){$scope.authentication=Auth,$scope.myform=myForm,$scope.myform.isLive?$scope.hideNav=$rootScope.hideNav=!0:$scope.authentication.isAuthenticated()?$scope.hideNav=$rootScope.hideNav=!1:($scope.hideNav=$rootScope.hideNav=!0,$state.go("access_denied"))}]),_.mixin({removeDateFields:removeDateFieldsFunc}),angular.module("forms").directive("autoSaveForm",["$rootScope","$timeout",function($rootScope,$timeout){return{require:["^form"],restrict:"AE",link:function($scope,$element,$attrs,$ctrls){angular.element(document).ready(function(){var $formCtrl=$ctrls[0],savePromise=null;$rootScope.finishedRender=!1,$scope.$on("editFormFields Started",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!1}),$scope.$on("editFormFields Finished",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!0}),$scope.anyDirtyAndTouched=function(form){var propCount=0;for(var prop in form)if(form.hasOwnProperty(prop)&&"$"!==prop[0]&&(propCount++,form[prop].$touched&&form[prop].$dirty))return!0;return!1};var debounceSave=function(){$rootScope.saveInProgress=!0,$rootScope[$attrs.autoSaveCallback](!0,function(err){err?(console.error("Error form data NOT persisted"),console.error(err)):($formCtrl.$setPristine(),$formCtrl.$setUntouched())})};$scope.$watch(function(newValue,oldValue){$rootScope.finishedRender&&$scope.anyDirtyAndTouched($scope.editForm)&&!$rootScope.saveInProgress&&debounceSave()}),$scope.$watch($attrs.autoSaveWatch,function(newValue,oldValue){newValue=angular.copy(newValue),oldValue=angular.copy(oldValue),newValue.form_fields=_.removeDateFields(newValue.form_fields),oldValue.form_fields=_.removeDateFields(oldValue.form_fields);var changedFields=!_.isEqual(oldValue.form_fields,newValue.form_fields)||!_.isEqual(oldValue.startPage,newValue.startPage),changedFieldMap=!1;oldValue.hasOwnProperty("plugins.oscarhost.settings.fieldMap")&&(changedFieldMap=!!oldValue.plugins.oscarhost.settings.fieldMap&&!_.isEqual(oldValue.plugins.oscarhost.settings.fieldMap,newValue.plugins.oscarhost.settings.fieldMap)),(newValue||oldValue)&&oldValue&&(0===oldValue.form_fields.length&&($rootScope.finishedRender=!0),$rootScope.finishedRender&&(changedFields&&!$formCtrl.$dirty||changedFieldMap)&&!$rootScope.saveInProgress?(savePromise&&($timeout.cancel(savePromise),savePromise=null),savePromise=$timeout(function(){debounceSave()})):$rootScope.finishedRender&&$rootScope.saveInProgress&&($rootScope.saveInProgress=!1))},!0)})}}}]),angular.module("forms").directive("configureFormDirective",["$rootScope","$http","Upload","CurrentForm",function($rootScope,$http,Upload,CurrentForm){return{templateUrl:"modules/forms/views/directiveViews/form/configure-form.client.view.html",restrict:"E",scope:{myform:"=",user:"=",pdfFields:"@",formFields:"@"},controller:["$scope",function($scope){console.log($scope.myform),CurrentForm.getForm().plugins?CurrentForm.getForm().plugins.oscarhost.baseUrl&&($scope.oscarhostAPI=!0):$scope.oscarhostAPI=!1,$scope.log="",$scope.pdfLoading=!1,$scope.languages=$rootScope.languages,this._current_upload=null,$scope.resetForm=$rootScope.resetForm,$scope.update=$rootScope.update,this._unbindedPdfFields=$scope.pdfFields,$scope.cancelUpload=function(){this._current_upload.abort(),$scope.pdfLoading=!1,$scope.removePDF()},$scope.removePDF=function(){$scope.myform.pdf=null,$scope.myform.isGenerated=!1,$scope.myform.autofillPDFs=!1,console.log("form.pdf: "+$scope.myform.pdf+" REMOVED")},$scope.uploadPDF=function(file){file&&(console.log(file),Upload.upload({url:"/upload/pdf",data:{user:$scope.user,file:file}}).then(function(resp){var data=resp.data;$scope.log="file "+data.originalname+" uploaded as "+data.filename+". JSON: "+JSON.stringify(data)+"\n"+$scope.log,$scope.myform.pdf=angular.fromJson(angular.toJson(data)),$scope.pdfLoading=!1,console.log($scope.log),$scope.$$phase||$scope.$digest||$scope.$apply()},function(resp){$scope.pdfLoading=!1,console.log("Error occured during upload.\n"),console.log(resp.status)},function(evt){var progressPercentage=parseInt(100*evt.loaded/evt.total,10);$scope.log="progress: "+progressPercentage+"% "+evt.config.data.file.name+"\n"+$scope.log,console.log($scope.log),$scope.pdfLoading=!0}))}}]}}]),angular.module("forms").directive("editFormDirective",["$rootScope","FormFields",function($rootScope,FormFields){return{templateUrl:"modules/forms/views/directiveViews/form/edit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$scope",function($scope){for(var field_ids=_($scope.myform.form_fields).pluck("_id"),i=0;i0){$scope.myform.plugins.oscarhost.settings.fieldMap||($scope.myform.plugins.oscarhost.settings.fieldMap={});var oscarhostFields=$scope.myform.plugins.oscarhost.settings.validFields,currentFields=_($scope.myform.plugins.oscarhost.settings.fieldMap).invert().keys().value();return $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id)&&(currentFields=_(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id])),_(oscarhostFields).difference(currentFields).value()}return[]},$scope.dropzone={handle:" .handle",containment:".dropzoneContainer",cursor:"grabbing"},$scope.addNewField=function(modifyForm,fieldType){$scope.addField.lastAddedID++;for(var fieldTitle,i=0;i<$scope.addField.types.length;i++)if($scope.addField.types[i].name===fieldType){$scope.addField.types[i].lastAddedID++,fieldTitle=$scope.addField.types[i].value+$scope.addField.types[i].lastAddedID;break}var newField={title:fieldTitle,fieldType:fieldType,fieldValue:"",required:!0,disabled:!1,deletePreserved:!1};return modifyForm&&$scope.myform.form_fields.push(newField),newField},$scope.deleteField=function(field_index){var currFieldId=$scope.myform.form_fields[field_index]._id;$scope.myform.hasOwnProperty("plugins.oscarhost.baseUrl")&&delete $scope.myform.plugins.oscarhost.settings.fieldMap[currFieldId],$scope.myform.form_fields.splice(field_index,1)},$scope.duplicateField=function(field_index){var currField=_.cloneDeep($scope.myform.form_fields[field_index]);currField._id="cloned"+_.uniqueId(),currField.title+=" copy",$scope.myform.form_fields.splice(field_index+1,0,currField)},$scope.addButton=function(){var newButton={};newButton.bgColor="#ddd",newButton.color="#ffffff",newButton.text="Button",newButton._id=Math.floor(1e5*Math.random()),$scope.myform.startPage.buttons.push(newButton)},$scope.deleteButton=function(button){for(var currID,i=0;i<$scope.myform.startPage.buttons.length;i++)if(currID=$scope.myform.startPage.buttons[i]._id,console.log(currID),currID===button._id){$scope.myform.startPage.buttons.splice(i,1);break}},$scope.addOption=function(field_index){var currField=$scope.myform.form_fields[field_index];if(console.log(field_index),console.log(currField),"checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType){currField.fieldOptions||($scope.myform.form_fields[field_index].fieldOptions=[]);var lastOptionID=0;currField.fieldOptions[currField.fieldOptions.length-1]&&(lastOptionID=currField.fieldOptions[currField.fieldOptions.length-1].option_id);var newOption={option_id:Math.floor(1e5*Math.random()),option_title:"Option "+lastOptionID,option_value:"Option "+lastOptionID};$scope.myform.form_fields[field_index].fieldOptions.push(newOption)}},$scope.deleteOption=function(field_index,option){var currField=$scope.myform.form_fields[field_index];if("checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType)for(var i=0;i',restrict:"E",scope:{typeName:"@"},controller:["$scope",function($scope){var iconTypeMap={textfield:"fa fa-pencil-square-o",dropdown:"fa fa-th-list",date:"fa fa-calendar",checkbox:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",email:"fa fa-envelope-o",textarea:"fa fa-pencil-square",legal:"fa fa-legal",file:"fa fa-cloud-upload",rating:"fa fa-star-half-o",link:"fa fa-link",scale:"fa fa-sliders",stripe:"fa fa-credit-card",statement:"fa fa-quote-left",yes_no:"fa fa-toggle-on",number:"fa fa-slack"};$scope.typeIcon=iconTypeMap[$scope.typeName]}]}});var __indexOf=[].indexOf||function(item){for(var i=0,l=this.length;l>i;i++)if(i in this&&this[i]===item)return i;return-1};angular.module("forms").directive("fieldDirective",["$http","$compile","$rootScope","$templateCache",function($http,$compile,$rootScope,$templateCache){var getTemplateUrl=function(fieldType){var type=fieldType,templateUrl="modules/forms/views/directiveViews/field/",supported_fields=["textfield","textarea","date","dropdown","hidden","password","radio","legal","statement","rating","yes_no","number","natural"];return __indexOf.call(supported_fields,type)>=0&&(templateUrl=templateUrl+type+".html"),$templateCache.get("../public/"+templateUrl)};return{template:"
{{field.title}}
",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(scope,element){$rootScope.chooseDefaultOption=scope.chooseDefaultOption=function(type){"yes_no"===type?scope.field.fieldValue="true":"rating"===type?scope.field.fieldValue=0:"radio"===scope.field.fieldType?(console.log(scope.field),scope.field.fieldValue=scope.field.fieldOptions[0].option_value,console.log(scope.field.fieldValue)):"legal"===type&&(scope.field.fieldValue="true",$rootScope.nextField())},scope.setActiveField=$rootScope.setActiveField,"date"===scope.field.fieldType&&(scope.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var fieldType=scope.field.fieldType;if("number"===scope.field.fieldType||"textfield"===scope.field.fieldType||"email"===scope.field.fieldType||"link"===scope.field.fieldType){switch(scope.field.fieldType){case"textfield":scope.field.input_type="text";break;case"email":scope.field.input_type="email",scope.field.placeholder="joesmith@example.com";break;case"number":scope.field.input_type="text",scope.field.validateRegex=/^\d+$/;break;default:scope.field.input_type="url",scope.field.placeholder="http://example.com"}fieldType="textfield"}var template=getTemplateUrl(fieldType);element.html(template).show(),$compile(element.contents())(scope)}}}]),angular.module("forms").directive("keyToOption",function(){return{restrict:"AE",transclude:!0,scope:{field:"&"},link:function($scope,$element,$attrs,$select){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,index=parseInt(String.fromCharCode(keyCode))-1;console.log($scope.field),index<$scope.field.fieldOptions.length&&(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue=$scope.field.fieldOptions[index].option_value,"dropdown"===$attrs.type&&($select.selected.option_value=$scope.field.fieldOptions[index].option_value),console.log($scope)}))})}}}),angular.module("forms").directive("keyToTruthy",["$rootScope",function($rootScope){return{restrict:"A",scope:{field:"="},link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,truthyKeyCode=$attrs.keyCharTruthy.charCodeAt(0)-32,falseyKeyCode=$attrs.keyCharFalsey.charCodeAt(0)-32;keyCode===truthyKeyCode?(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue="true"})):keyCode===falseyKeyCode&&(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue="false"}))})}}}]),angular.module("forms").directive("onEnterKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;13!==keyCode||event.shiftKey||(event.preventDefault(), +$rootScope.$apply(function(){$rootScope.$eval($attrs.onEnterKey)}))})}}}]),angular.module("forms").directive("onFinishRender",["$rootScope","$timeout",function($rootScope,$timeout){return{restrict:"A",link:function(scope,element,attrs){if(element.attr("ng-repeat")||element.attr("data-ng-repeat")){var broadcastMessage=attrs.onFinishRender||"ngRepeat";scope.$first&&!scope.$last?scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Started")}):scope.$last&&scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Finished")})}}}}]),angular.module("forms").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","Auth",function($http,TimeCounter,$filter,$rootScope,Auth){return{templateUrl:"modules/forms/views/directiveViews/form/submit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$document","$window","$scope",function($document,$window,$scope){$scope.authentication=$rootScope.authentication,$scope.noscroll=!1,$scope.forms={},$scope.form_fields_count=$scope.myform.visible_form_fields.filter(function(field){return"statement"!==field.fieldType&&"rating"!==field.fieldType}).length,$scope.reloadForm=function(){$scope.myform.submitted=!1,$scope.myform.form_fields=_.chain($scope.myform.visible_form_fields).map(function(field){return field.fieldValue="",field}).value(),$scope.loading=!1,$scope.error="",$scope.selected={_id:"",index:0},$scope.setActiveField($scope.myform.visible_form_fields[0]._id,0,!1),TimeCounter.restartClock()},$window.onscroll=function(){$scope.scrollPos=document.body.scrollTop||document.documentElement.scrollTop||0;var elemBox=document.getElementsByClassName("activeField")[0].getBoundingClientRect();$scope.fieldTop=elemBox.top,$scope.fieldBottom=elemBox.bottom;var field_id,field_index;$scope.noscroll||($scope.selected.index===$scope.myform.visible_form_fields.length-1&&$scope.fieldBottom<200?(field_index=$scope.selected.index+1,field_id="submit_field",$scope.setActiveField(field_id,field_index,!1)):$scope.selected.index===$scope.myform.visible_form_fields.length?$scope.fieldTop>200&&(field_index=$scope.selected.index-1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):$scope.fieldBottom<0?(field_index=$scope.selected.index+1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):0!==$scope.selected.index&&$scope.fieldTop>0&&(field_index=$scope.selected.index-1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)),$scope.$apply())},$rootScope.setDropdownOption=function(){console.log("setDropdownOption index: ")},$scope.setActiveField=$rootScope.setActiveField=function(field_id,field_index,animateScroll){null!==$scope.selected&&$scope.selected._id!==field_id&&($scope.selected._id=field_id,$scope.selected.index=field_index,animateScroll?($scope.noscroll=!0,setTimeout(function(){$document.scrollToElement(angular.element(".activeField"),-10,200).then(function(){$scope.noscroll=!1,setTimeout(function(){document.querySelectorAll(".activeField .focusOn")[0]?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input")[0].focus()})})})):setTimeout(function(){document.querySelectorAll(".activeField .focusOn")[0]?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input")[0].focus()}))},$rootScope.nextField=$scope.nextField=function(){var selected_index,selected_id;$scope.selected.index<$scope.myform.visible_form_fields.length-1?(selected_index=$scope.selected.index+1,selected_id=$scope.myform.visible_form_fields[selected_index]._id,$rootScope.setActiveField(selected_id,selected_index,!0)):$scope.selected.index===$scope.myform.visible_form_fields.length-1&&(selected_index=$scope.selected.index+1,selected_id="submit_field",$rootScope.setActiveField(selected_id,selected_index,!0))},$rootScope.prevField=$scope.prevField=function(){if($scope.selected.index>0){var selected_index=$scope.selected.index-1,selected_id=$scope.myform.visible_form_fields[selected_index]._id;$scope.setActiveField(selected_id,selected_index,!0)}},$scope.exitStartPage=function(){$scope.myform.startPage.showStart=!1,$scope.myform.visible_form_fields.length>0&&($scope.selected._id=$scope.myform.visible_form_fields[0]._id)},$scope.goToInvalid=function(){document.querySelectorAll(".ng-invalid.focusOn")[0].focus()},$scope.submitForm=function(){var _timeElapsed=TimeCounter.stopClock();$scope.loading=!0;var form=_.cloneDeep($scope.myform);form.timeElapsed=_timeElapsed,form.percentageComplete=$filter("formValidity")($scope.myform)/$scope.myform.visible_form_fields.length*100,delete form.visible_form_fields,setTimeout(function(){$scope.submitPromise=$http.post("/forms/"+$scope.myform._id,form).success(function(data,status,headers){$scope.myform.submitted=!0,$scope.loading=!1}).error(function(error){$scope.loading=!1,$scope.error=error.message})},500)},$scope.reloadForm()}]}}]),angular.module("forms").service("CurrentForm",function(){var _form={};this.getForm=function(){return _form},this.setForm=function(form){_form=form}}),angular.module("forms").service("FormFields",[function(){this.types=[{name:"textfield",value:"Short Text"},{name:"email",value:"Email"},{name:"radio",value:"Multiple Choice"},{name:"dropdown",value:"Dropdown"},{name:"date",value:"Date"},{name:"textarea",value:"Paragraph Text"},{name:"yes_no",value:"Yes/No"},{name:"legal",value:"Legal"},{name:"rating",value:"Rating"},{name:"link",value:"Link"},{name:"number",value:"Numbers"},{name:"statement",value:"Statement"}]}]),angular.module("forms").factory("Forms",["$resource",function($resource){return $resource("/forms/:formId",{formId:"@_id"},{query:{method:"GET",isArray:!0},get:{method:"GET",transformResponse:function(data,header){var form=angular.fromJson(data);return form.visible_form_fields=_.filter(form.form_fields,function(field){return field.deletePreserved===!1}),form}},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").factory("Submissions",["$resource",function($resource){return $resource("forms/:formID/submissions/:submissionId",{submissionId:"@_id",formId:"@_id"},{query:{method:"GET",isArray:!0},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").service("TimeCounter",[function(){var _startTime,_endTime,that=this;this.timeSpent=0,this.restartClock=function(){_startTime=Date.now(),_endTime=_startTime},this.stopClock=function(){return _startTime?(_endTime=Date.now(),that.timeSpent=Math.abs(_endTime.valueOf()-_startTime.valueOf())/1e3,that.timeSpent):new Error("Clock has not been started")},this.clockStarted=function(){return!!this._startTime}}]),angular.module("users").config(["$httpProvider",function($httpProvider){$httpProvider.interceptors.push(["$q","$location",function($q,$location){return{responseError:function(response){return"/users/me"!==$location.path()&&response.config&&"/users/me"!==response.config.url&&(console.log("intercepted rejection of ",response.config.url,response.status),401===response.status?(console.log($location.path()),$location.nextAfterLogin=$location.path(),$location.path("/signin")):403===response.status&&$location.path("/access_denied")),$q.reject(response)}}}])}]),angular.module("users").config(["$stateProvider",function($stateProvider){var checkLoggedin=function($q,$timeout,$state,User,Auth){var deferred=$q.defer();return Auth.currentUser&&Auth.currentUser.email?$timeout(deferred.resolve):Auth.currentUser=User.getCurrent(function(){Auth.login(),$timeout(deferred.resolve())},function(){Auth.logout(),$timeout(deferred.reject()),$state.go("signin",{reload:!0})}),deferred.promise};checkLoggedin.$inject=["$q","$timeout","$state","User","Auth"];var checkSignupDisabled=function($window,$timeout,$q){var deferred=$q.defer();return $timeout($window.signupDisabled?deferred.reject():deferred.resolve()),deferred.promise};checkSignupDisabled.$inject=["$window","$timeout","$q"],$stateProvider.state("profile",{resolve:{loggedin:checkLoggedin},url:"/settings/profile",templateUrl:"modules/users/views/settings/edit-profile.client.view.html"}).state("password",{resolve:{loggedin:checkLoggedin},url:"/settings/password",templateUrl:"modules/users/views/settings/change-password.client.view.html"}).state("accounts",{resolve:{loggedin:checkLoggedin},url:"/settings/accounts",templateUrl:"modules/users/views/settings/social-accounts.client.view.html"}).state("signup",{resolve:{isDisabled:checkSignupDisabled},url:"/signup",templateUrl:"modules/users/views/authentication/signup.client.view.html"}).state("signup-success",{resolve:{isDisabled:checkSignupDisabled},url:"/signup-success",templateUrl:"modules/users/views/authentication/signup-success.client.view.html"}).state("signin",{url:"/signin",templateUrl:"modules/users/views/authentication/signin.client.view.html"}).state("access_denied",{url:"/access_denied",templateUrl:"modules/users/views/authentication/access-denied.client.view.html"}).state("verify",{resolve:{isDisabled:checkSignupDisabled},url:"/verify/:token",templateUrl:"modules/users/views/verify/verify-account.client.view.html"}).state("resendVerifyEmail",{resolve:{isDisabled:checkSignupDisabled},url:"/verify",templateUrl:"modules/users/views/verify/resend-verify-email.client.view.html"}).state("forgot",{url:"/password/forgot",templateUrl:"modules/users/views/password/forgot-password.client.view.html"}).state("reset-invalid",{url:"/password/reset/invalid",templateUrl:"modules/users/views/password/reset-password-invalid.client.view.html"}).state("reset-success",{url:"/password/reset/success",templateUrl:"modules/users/views/password/reset-password-success.client.view.html"}).state("reset",{url:"/password/reset/:token",templateUrl:"modules/users/views/password/reset-password.client.view.html"})}]),angular.module("users").controller("AuthenticationController",["$scope","$location","$state","$rootScope","User","Auth",function($scope,$location,$state,$rootScope,User,Auth){$scope=$rootScope,$scope.credentials={},$scope.error="",$scope.signin=function(){$scope.credentials.email=$scope.credentials.username,User.login($scope.credentials).then(function(response){Auth.login(response),$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),"home"!==$state.previous.name&&"verify"!==$state.previous.name&&""!==$state.previous.name?$state.go($state.previous.name):$state.go("listForms")},function(error){$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user,$scope.error=error,console.log("loginError: "+error)})},$scope.signup=function(){console.log($scope.credentials),User.signup($scope.credentials).then(function(response){console.log("signup-success"),$state.go("signup-success")},function(error){console.log("Error: "),console.log(error),error?($scope.error=error,console.log(error)):console.log("No response received")})}}]),angular.module("users").controller("PasswordController",["$scope","$stateParams","$state","User",function($scope,$stateParams,$state,User){$scope.error="",$scope.askForPasswordReset=function(){User.askForPasswordReset($scope.credentials).then(function(response){$scope.success=response.message,$scope.credentials=null},function(error){$scope.error=error,$scope.credentials=null})},$scope.resetUserPassword=function(){$scope.success=$scope.error=null,User.resetPassword($scope.passwordDetails,$stateParams.token).then(function(response){$scope.success=response.message,$scope.passwordDetails=null,$state.go("reset-success")},function(error){$scope.error=error.message||error,$scope.passwordDetails=null})}}]),angular.module("users").controller("SettingsController",["$scope","$rootScope","$http","$state","Users",function($scope,$rootScope,$http,$state,Users){$scope.user=$rootScope.user,$scope.hasConnectedAdditionalSocialAccounts=function(provider){for(var i in $scope.user.additionalProvidersData)return!0;return!1},$scope.isConnectedSocialAccount=function(provider){return $scope.user.provider===provider||$scope.user.additionalProvidersData&&$scope.user.additionalProvidersData[provider]},$scope.removeUserSocialAccount=function(provider){$scope.success=$scope.error=null,$http["delete"]("/users/accounts",{params:{provider:provider}}).success(function(response){$scope.success=!0,$scope.user=response}).error(function(response){$scope.error=response.message})},$scope.updateUserProfile=function(isValid){if(isValid){$scope.success=$scope.error=null;var user=new Users($scope.user);user.$update(function(response){$scope.success=!0,$scope.user=response},function(response){$scope.error=response.data.message})}else $scope.submitted=!0},$scope.changeUserPassword=function(){$scope.success=$scope.error=null,$http.post("/users/password",$scope.passwordDetails).success(function(response){$scope.success=!0,$scope.passwordDetails=null}).error(function(response){$scope.error=response.message})}}]),angular.module("users").controller("VerifyController",["$scope","$state","$rootScope","User","Auth","$stateParams",function($scope,$state,$rootScope,User,Auth,$stateParams){$scope.isResetSent=!1,$scope.credentials={},$scope.error="",$scope.resendVerifyEmail=function(){User.resendVerifyEmail($scope.credentials.email).then(function(response){console.log(response),$scope.success=response.message,$scope.credentials=null,$scope.isResetSent=!0},function(error){$scope.error=error,$scope.credentials.email=null,$scope.isResetSent=!1})},$scope.validateVerifyToken=function(){$stateParams.token&&(console.log($stateParams.token),User.validateVerifyToken($stateParams.token).then(function(response){console.log("Success: "+response.message),$scope.success=response.message,$scope.isResetSent=!0,$scope.credentials.email=null},function(error){console.log("Error: "+error.message),$scope.isResetSent=!1,$scope.error=error,$scope.credentials.email=null}))}}]),angular.module("users").factory("Auth",["$window",function($window){var userState={isLoggedIn:!1},service={_currentUser:null,get currentUser(){return this._currentUser},ensureHasCurrentUser:function(User){return service._currentUser&&service._currentUser.username?service._currentUser:$window.user?(service._currentUser=$window.user,service._currentUser):void User.getCurrent().then(function(user){return service._currentUser=user,userState.isLoggedIn=!0,$window.user=service._currentUser,service._currentUser},function(response){return userState.isLoggedIn=!1,service._currentUser=null,$window.user=null,console.log("User.getCurrent() err",response),null})},isAuthenticated:function(){return!!service._currentUser},getUserState:function(){return userState},login:function(new_user){userState.isLoggedIn=!0,service._currentUser=new_user},logout:function(){$window.user=null,userState.isLoggedIn=!1,service._currentUser=null}};return service}]),angular.module("users").service("Authorizer",["APP_PERMISSIONS","USER_ROLES",function(APP_PERMISSIONS,USER_ROLES){return function(user){return{canAccess:function(permissions){var i,len,permission;for(angular.isArray(permissions)||(permissions=[permissions]),i=0,len=permissions.length;len>i;i++){if(permission=permissions[i],null===APP_PERMISSIONS[permission])throw"Bad permission value";if(!user||!user.roles)return!1;switch(permission){case APP_PERMISSIONS.viewAdminSettings:case APP_PERMISSIONS.editAdminSettings:return user.roles.indexOf(USER_ROLES.admin)>-1;case APP_PERMISSIONS.viewPrivateForm:case APP_PERMISSIONS.editForm:return user.roles.indexOf(USER_ROLES.admin)>-1||user.roles.indexOf(USER_ROLES.normal)>-1}}return!1}}}}]),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function($window,$q,$timeout,$http,$state){var userService={getCurrent:function(){var deferred=$q.defer();return $http.get("/users/me").success(function(response){deferred.resolve(response)}).error(function(){deferred.reject("User's session has expired")}),deferred.promise},login:function(credentials){var deferred=$q.defer();return $http.post("/auth/signin",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},logout:function(){var deferred=$q.defer();return $http.get("/auth/signout").success(function(response){deferred.resolve(null)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},signup:function(credentials){var deferred=$q.defer();return $http.post("/auth/signup",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},resendVerifyEmail:function(_email){var deferred=$q.defer();return $http.post("/auth/verify",{email:_email}).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},validateVerifyToken:function(token){var validTokenRe=/^([A-Za-z0-9]{48})$/g;if(!validTokenRe.test(token))throw new Error("Error token: "+token+" is not a valid verification token");var deferred=$q.defer();return $http.get("/auth/verify/"+token).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error)}),deferred.promise},resetPassword:function(passwordDetails,token){var deferred=$q.defer();return $http.get("/auth/password/"+token,passwordDetails).success(function(response){deferred.resolve()}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},askForPasswordReset:function(credentials){var deferred=$q.defer();return $http.post("/auth/forgot",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise}};return userService}]),angular.module("users").factory("Users",["$resource",function($resource){return $resource("users",{},{update:{method:"PUT"}})}]); +======= +function removeDateFieldsFunc(o){function eachObject(v,k){"lastModified"!==k&&"created"!==k||delete clone[i][k]}for(var clone=_.clone(o),i=0;i'),$templateCache.put("modules/core/views/home.client.view.html",'

Craft beautiful forms in seconds.

Create your next ______.

Tell a story with a form.

'),$templateCache.put("modules/forms/admin/views/admin-form.client.view.html",'
'),$templateCache.put("modules/forms/admin/views/list-forms.client.view.html",'

Create a new form
Name
Language

'),$templateCache.put("modules/forms/base/views/submit-form.client.view.html","
"),$templateCache.put("modules/forms/admin/views/adminTabs/analyze.html",""),$templateCache.put("modules/forms/admin/views/adminTabs/configure.html",""),$templateCache.put("modules/forms/admin/views/adminTabs/create.html",""),$templateCache.put("modules/forms/admin/views/adminTabs/design.html",'
Background Color
Question Text Color
Answer Text Color
Button Background Color
Button Text Color
'),$templateCache.put("modules/forms/admin/views/directiveViews/cgBusy/update-form-message-TypeA.html",'
{{$message}}
'),$templateCache.put("modules/forms/admin/views/directiveViews/cgBusy/update-form-message-TypeB.html",'
{{$message}}
'),$templateCache.put("modules/forms/admin/views/directiveViews/form/configure-form.client.view.html",'
Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.name}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type
Form Name
Form Status
Language
* required
Display Form Footer?
Display Start Page?
'),$templateCache.put("modules/forms/admin/views/directiveViews/form/edit-form.client.view.html",'

Edit Start Page


Intro Title:
Intro Paragraph:
\n
\n\n

\n
\n
Options:
\n
\n
\n \n\n \n \n \n
\n
\n \n
\n
\n
\n\n

\n\n
\n
Required:
\n
\n \n\n \n
\n
\n\n
\n
Disabled:
\n
\n \n\n \n
\n
\n\n
\n \n\n
\n
\n

\n Click on Fields to add them here\n

\n
\n
\n\n
\n \n
\n\n \n \n\n \n
\n
\n\n'), +$templateCache.put("modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html",'
#{{value.title}}OscarEMR User ProfilePercentage CompleteTime ElapsedDeviceLocationIP AddressDate Submitted (UTC)Generated PDF
{{$index+1}}{{field.fieldValue}}User Profile #{{row.oscarDemoNum}}{{row.percentageComplete}}%{{row.timeElapsed}}{{row.device.name}}, {{row.device.type}}{{row.geoLocation.city}}, {{row.geoLocation.country}}{{row.ipAddr}}{{row.created | date:\'yyyy-MM-dd HH:mm:ss\'}}Generated PDF
'),$templateCache.put("modules/forms/base/views/directiveViews/entryPage/startPage.html",'

{{pageData.introTitle}}

{{pageData.introParagraph}}

'),$templateCache.put("modules/forms/base/views/directiveViews/field/date.html",'

{{field.title}} {{ \'OPTIONAL\' | translate }}

'),$templateCache.put("modules/forms/base/views/directiveViews/field/dropdown.html",'
'),$templateCache.put("modules/forms/base/views/directiveViews/field/file.html",'
{{field.title}} (* {{ \'REQUIRED\' | translate }})
{{field.file.originalname}}
{{ UPLOAD_FILE | translate }}
'),$templateCache.put("modules/forms/base/views/directiveViews/field/hidden.html",''),$templateCache.put("modules/forms/base/views/directiveViews/field/legal.html",'
'),$templateCache.put("modules/forms/base/views/directiveViews/field/radio.html",'

{{field.title}} {{ \'OPTIONAL\' | translate }}


'),$templateCache.put("modules/forms/base/views/directiveViews/field/rating.html",'

{{field.title}} {{ \'OPTIONAL\' | translate }}

'),$templateCache.put("modules/forms/base/views/directiveViews/field/statement.html",'

{{field.title}}

{{field.description}}


'),$templateCache.put("modules/forms/base/views/directiveViews/field/textarea.html",'

{{field.title}} {{ \'OPTIONAL\' | translate }}

{{ \'ENTER\' | translate }}
'),$templateCache.put("modules/forms/base/views/directiveViews/field/textfield.html",'

{{field.title}} ({{ \'OPTIONAL\' | translate }})

{{ \'ENTER\' | translate }}
'),$templateCache.put("modules/forms/base/views/directiveViews/field/yes_no.html",'

{{field.title}} *({{ REQUIRED | translate }})

{{field.description}}


'),$templateCache.put("modules/forms/base/views/directiveViews/form/submit-form.client.view.html",'
press ENTER
'),$templateCache.put("modules/users/views/authentication/access-denied.client.view.html",'

You need to be logged in to access this page

Login
'),$templateCache.put("modules/users/views/authentication/signin.client.view.html",'

Sign into your account

'),$templateCache.put("modules/users/views/authentication/signup-success.client.view.html",''),$templateCache.put("modules/users/views/authentication/signup.client.view.html",''),$templateCache.put("modules/users/views/password/forgot-password.client.view.html",'

Restore your password

Enter your account email.

'),$templateCache.put("modules/users/views/password/reset-password-invalid.client.view.html",'

Password reset is invalid

Ask for a new password reset
'),$templateCache.put("modules/users/views/password/reset-password-success.client.view.html",'

Password successfully reset

Continue to home page
'),$templateCache.put("modules/users/views/password/reset-password.client.view.html",'

Reset your password

'),$templateCache.put("modules/users/views/settings/change-password.client.view.html",'

Change your password

'),$templateCache.put("modules/users/views/settings/edit-profile.client.view.html",'

Edit your profile

'),$templateCache.put("modules/users/views/settings/social-accounts.client.view.html",'

Connected social accounts:

Connect other social accounts:

'), +$templateCache.put("modules/users/views/verify/resend-verify-email.client.view.html",'

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at hi@TellForm.com

'),$templateCache.put("modules/users/views/verify/verify-account.client.view.html",'

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
')}]);var ApplicationConfiguration=function(){var applicationModuleName="NodeForm",applicationModuleVendorDependencies=["duScroll","ui.select","cgBusy","ngSanitize","vButton","ngResource","NodeForm.templates","ui.router","ui.bootstrap","ui.utils"],registerModule=function(moduleName,dependencies){angular.module(moduleName,dependencies||[]),angular.module(applicationModuleName).requires.push(moduleName)};return{applicationModuleName:applicationModuleName,applicationModuleVendorDependencies:applicationModuleVendorDependencies,registerModule:registerModule}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function($locationProvider){$locationProvider.hashPrefix("!")}]),angular.module(ApplicationConfiguration.applicationModuleName).constant("APP_PERMISSIONS",{viewAdminSettings:"viewAdminSettings",editAdminSettings:"editAdminSettings",editForm:"editForm",viewPrivateForm:"viewPrivateForm"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("USER_ROLES",{admin:"admin",normal:"user",superuser:"superuser"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("FORM_URL","/forms/:formId"),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","$state","$stateParams",function($rootScope,Auth,$state,$stateParams){$rootScope.$state=$state,$rootScope.$stateParams=$stateParams,$rootScope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState){$state.previous=fromState,"home"===toState.name||"signin"===toState.name||"resendVerifyEmail"===toState.name||"verify"===toState.name||"signup"===toState.name||"signup-success"===toState.name?Auth.isAuthenticated()&&(event.preventDefault(),$state.go("listForms")):"access_denied"===toState.name||Auth.isAuthenticated()||"submitForm"===toState.name||(event.preventDefault(),$state.go("listForms"))})}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","User","Authorizer","$state","$stateParams",function($rootScope,Auth,User,Authorizer,$state,$stateParams){$rootScope.$on("$stateChangeStart",function(event,next){var authenticator,permissions,user;permissions=next&&next.data&&next.data.permissions?next.data.permissions:null,Auth.ensureHasCurrentUser(User),user=Auth.currentUser,user&&(authenticator=new Authorizer(user),null!=permissions&&(authenticator.canAccess(permissions)||(event.preventDefault(),$state.go("access_denied"))))})}]),angular.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),angular.module("NodeForm.templates",[]).run(["$templateCache",function($templateCache){"use strict";$templateCache.put("../public/modules/core/views/header.client.view.html",''),$templateCache.put("../public/modules/core/views/home.client.view.html",'

Craft beautiful forms in seconds.

Create your next ______.

Tell a story with a form.

'),$templateCache.put("../public/modules/forms/views/admin-form.client.view.html",'
'),$templateCache.put("../public/modules/forms/views/list-forms.client.view.html",'

Create a new form
Name
Language

'),$templateCache.put("../public/modules/forms/views/submit-form.client.view.html","
"),$templateCache.put("../public/modules/forms/views/adminTabs/analyze.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/configure.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/create.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/design.html",'
Background Color
Question Text Color
Answer Text Color
Button Background Color
Button Text Color
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeA.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/entryPage/startPage.html",'

{{pageData.introTitle}}

{{pageData.introParagraph}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/date.html",'

{{field.title}} *(required)

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/dropdown.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/file.html",'
{{field.title}} (* required)
{{field.file.originalname}}
Upload your File
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/hidden.html",''),$templateCache.put("../public/modules/forms/views/directiveViews/field/legal.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/natural.html",'

{{field.title}} *(required)


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/password.html",'

{{field.title}} *(required)

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/radio.html",'

{{field.title}} *(required)


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/rating.html",'

{{field.title}} *(required)

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/statement.html",'

{{field.title}}

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textarea.html",'

{{field.title}} *(required)

press ENTER
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textfield.html",'

{{field.title}} *(required)

press ENTER
'), +$templateCache.put("../public/modules/forms/views/directiveViews/field/yes_no.html",'

{{field.title}} *(required)

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/form/configure-form.client.view.html",'
Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.originalname}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type
Form Name
Form Status
Language
* required
Display Form Footer?
Display Start Page?
'),$templateCache.put("../public/modules/forms/views/directiveViews/form/edit-form.client.view.html",'

Edit Start Page


Intro Title:
Intro Paragraph:
\n
\n\n

\n
\n
Options:
\n
\n
\n \n\n \n \n \n
\n
\n \n
\n
\n
\n\n

\n\n
\n
Required:
\n
\n \n\n \n
\n
\n\n
\n
Disabled:
\n
\n \n\n \n
\n
\n\n
\n \n\n
\n
\n

\n Click on Fields to add them here\n

\n
\n
\n\n
\n \n
\n\n \n \n\n \n
\n
\n\n'),$templateCache.put("../public/modules/forms/views/directiveViews/form/edit-submissions-form.client.view.html",'
#{{value.title}}OscarEMR User ProfilePercentage CompleteTime ElapsedDeviceLocationIP AddressDate Submitted (UTC)Generated PDF
{{$index+1}}{{field.fieldValue}}User Profile #{{row.oscarDemoNum}}{{row.percentageComplete}}%{{row.timeElapsed}}{{row.device.name}}, {{row.device.type}}{{row.geoLocation.city}}, {{row.geoLocation.country}}{{row.ipAddr}}{{row.created | date:\'yyyy-MM-dd HH:mm:ss\'}}Generated PDF
'),$templateCache.put("../public/modules/forms/views/directiveViews/form/submit-form.client.view.html",'
press ENTER
'),$templateCache.put("../public/modules/users/views/authentication/access-denied.client.view.html",'

You need to be logged in to access this page

Login
'),$templateCache.put("../public/modules/users/views/authentication/signin.client.view.html",'

Sign into your account

'), +$templateCache.put("../public/modules/users/views/authentication/signup-success.client.view.html",''),$templateCache.put("../public/modules/users/views/authentication/signup.client.view.html",''),$templateCache.put("../public/modules/users/views/password/forgot-password.client.view.html",'

Restore your password

Enter your account email.

'),$templateCache.put("../public/modules/users/views/password/reset-password-invalid.client.view.html",'

Password reset is invalid

Ask for a new password reset
'),$templateCache.put("../public/modules/users/views/password/reset-password-success.client.view.html",'

Password successfully reset

Continue to home page
'),$templateCache.put("../public/modules/users/views/password/reset-password.client.view.html",'

Reset your password

'),$templateCache.put("../public/modules/users/views/settings/change-password.client.view.html",'

Change your password

'),$templateCache.put("../public/modules/users/views/settings/edit-profile.client.view.html",'

Edit your profile

'),$templateCache.put("../public/modules/users/views/settings/social-accounts.client.view.html",'

Connected social accounts:

Connect other social accounts:

'),$templateCache.put("../public/modules/users/views/verify/resend-verify-email.client.view.html",'

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at hi@TellForm.com

'),$templateCache.put("../public/modules/users/views/verify/verify-account.client.view.html",'

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
')}]),ApplicationConfiguration.registerModule("core",["users"]),ApplicationConfiguration.registerModule("forms",["ngFileUpload","ui.router.tabs","ui.date","ui.sortable","angular-input-stars","users","pascalprecht.translate"]),ApplicationConfiguration.registerModule("users"),angular.module("core").config(["$stateProvider","$urlRouterProvider",function($stateProvider,$urlRouterProvider,Authorization){$urlRouterProvider.otherwise("/forms")}]),angular.module("core").controller("HeaderController",["$rootScope","$scope","Menus","$state","Auth","User",function($rootScope,$scope,Menus,$state,Auth,User){$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.authentication=$rootScope.authentication=Auth,$rootScope.languages=$scope.languages=["english","french","spanish"],$scope.isCollapsed=!1,$rootScope.hideNav=!1,$scope.menu=Menus.getMenu("topbar"),$scope.signout=function(){var promise=User.logout();promise.then(function(){Auth.logout(),Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user=null,$state.go("listForms")},function(reason){console.log("Logout Failed: "+reason)})},$scope.toggleCollapsibleMenu=function(){$scope.isCollapsed=!$scope.isCollapsed},$scope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState,fromParams){$scope.isCollapsed=!1,$rootScope.hideNav=!1,angular.isDefined(toState.data)&&angular.isDefined(toState.data.hideNav)&&($rootScope.hideNav=toState.data.hideNav)})}]),angular.module("core").controller("HomeController",["$rootScope","$scope","User","$state",function($rootScope,$scope,User,$state){$scope=$rootScope}]),angular.module("core").service("Menus",[function(){this.defaultRoles=["*"],this.menus={};var shouldRender=function(user){if(!user)return this.isPublic;if(~this.roles.indexOf("*"))return!0;for(var userRoleIndex in user.roles)for(var roleIndex in this.roles)if(console.log(this.roles[roleIndex]),console.log(this.roles[roleIndex]===user.roles[userRoleIndex]),this.roles[roleIndex]===user.roles[userRoleIndex])return!0;return!1};this.validateMenuExistance=function(menuId){if(menuId&&menuId.length){if(this.menus[menuId])return!0;throw new Error("Menu does not exists")}throw new Error("MenuId was not provided")},this.getMenu=function(menuId){return this.validateMenuExistance(menuId),this.menus[menuId]},this.addMenu=function(menuId,isPublic,roles){return this.menus[menuId]={isPublic:isPublic||!1,roles:roles||this.defaultRoles,items:[],shouldRender:shouldRender},this.menus[menuId]},this.removeMenu=function(menuId){this.validateMenuExistance(menuId),delete this.menus[menuId]},this.addMenuItem=function(menuId,menuItemTitle,menuItemURL,menuItemType,menuItemUIRoute,isPublic,roles,position){return this.validateMenuExistance(menuId),this.menus[menuId].items.push({title:menuItemTitle,link:menuItemURL,menuItemType:menuItemType||"item",menuItemClass:menuItemType,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].roles:roles,position:position||0,items:[],shouldRender:shouldRender}),this.menus[menuId]},this.addSubMenuItem=function(menuId,rootMenuItemURL,menuItemTitle,menuItemURL,menuItemUIRoute,isPublic,roles,position){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===rootMenuItemURL&&this.menus[menuId].items[itemIndex].items.push({title:menuItemTitle,link:menuItemURL,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].items[itemIndex].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].items[itemIndex].roles:roles,position:position||0,shouldRender:shouldRender});return this.menus[menuId]},this.removeMenuItem=function(menuId,menuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===menuItemURL&&this.menus[menuId].items.splice(itemIndex,1);return this.menus[menuId]},this.removeSubMenuItem=function(menuId,submenuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)for(var subitemIndex in this.menus[menuId].items[itemIndex].items)this.menus[menuId].items[itemIndex].items[subitemIndex].link===submenuItemURL&&this.menus[menuId].items[itemIndex].items.splice(subitemIndex,1);return this.menus[menuId]},this.addMenu("topbar",!1,["*"]),this.addMenu("bottombar",!1,["*"])}]),angular.module("forms").run(["Menus",function(Menus){Menus.addMenuItem("topbar","My Forms","forms","","/forms",!1)}]).filter("formValidity",function(){return function(formObj){if(formObj&&formObj.form_fields&&formObj.visible_form_fields){var formKeys=Object.keys(formObj),fields=(formKeys.filter(function(key){return"$"!==key[0]}),formObj.form_fields),valid_count=fields.filter(function(field){return"object"==typeof field&&"statement"!==field.fieldType&&"rating"!==field.fieldType?!!field.fieldValue:void 0}).length;return valid_count-(formObj.form_fields.length-formObj.visible_form_fields.length)}return 0}}).config(["$provide",function($provide){$provide.decorator("accordionDirective",["$delegate",function($delegate){var directive=$delegate[0];return directive.replace=!0,$delegate}])}]),angular.module("forms").config(["$stateProvider",function($stateProvider){$stateProvider.state("listForms",{url:"/forms",templateUrl:"modules/forms/admin/views/list-forms.client.view.html"}).state("submitForm",{url:"/forms/:formId",templateUrl:"modules/forms/base/views/submit-form.client.view.html",data:{hideNav:!0},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"SubmitFormController",controllerAs:"ctrl"}).state("viewForm",{url:"/forms/:formId/admin",templateUrl:"modules/forms/admin/views/admin-form.client.view.html",data:{permissions:["editForm"]},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"AdminFormController"}).state("viewForm.configure",{url:"/configure",templateUrl:"modules/forms/admin/views/adminTabs/configure.html"}).state("viewForm.design",{url:"/design",templateUrl:"modules/forms/admin/views/adminTabs/design.html"}).state("viewForm.analyze",{url:"/analyze",templateUrl:"modules/forms/admin/views/adminTabs/analyze.html"}).state("viewForm.create",{url:"/create",templateUrl:"modules/forms/admin/views/adminTabs/create.html"})}]),angular.module("users").config(["$httpProvider",function($httpProvider){$httpProvider.interceptors.push(["$q","$location",function($q,$location){return{responseError:function(response){return"/users/me"!==$location.path()&&response.config&&"/users/me"!==response.config.url&&(console.log("intercepted rejection of ",response.config.url,response.status),401===response.status?($location.nextAfterLogin=$location.path(),$location.path("/signin")):403===response.status&&$location.path("/access_denied")),$q.reject(response)}}}])}]),angular.module("users").config(["$stateProvider",function($stateProvider){var checkLoggedin=function($q,$timeout,$state,User,Auth){var deferred=$q.defer();return Auth.currentUser&&Auth.currentUser.email?$timeout(deferred.resolve):Auth.currentUser=User.getCurrent(function(){Auth.login(),$timeout(deferred.resolve())},function(){Auth.logout(),$timeout(deferred.reject()),$state.go("sigin",{reload:!0})}),deferred.promise};checkLoggedin.$inject=["$q","$timeout","$state","User","Auth"],$stateProvider.state("profile",{resolve:{loggedin:checkLoggedin},url:"/settings/profile",templateUrl:"modules/users/views/settings/edit-profile.client.view.html"}).state("password",{resolve:{loggedin:checkLoggedin},url:"/settings/password",templateUrl:"modules/users/views/settings/change-password.client.view.html"}).state("accounts",{resolve:{loggedin:checkLoggedin},url:"/settings/accounts",templateUrl:"modules/users/views/settings/social-accounts.client.view.html"}).state("signup",{url:"/signup",templateUrl:"modules/users/views/authentication/signup.client.view.html"}).state("signup-success",{url:"/signup-success",templateUrl:"modules/users/views/authentication/signup-success.client.view.html"}).state("signin",{url:"/signin",templateUrl:"modules/users/views/authentication/signin.client.view.html"}).state("access_denied",{url:"/access_denied",templateUrl:"modules/users/views/authentication/access-denied.client.view.html"}).state("resendVerifyEmail",{url:"/verify",templateUrl:"modules/users/views/verify/resend-verify-email.client.view.html"}).state("verify",{url:"/verify/:token",templateUrl:"modules/users/views/verify/verify-account.client.view.html"}).state("forgot",{url:"/password/forgot",templateUrl:"modules/users/views/password/forgot-password.client.view.html"}).state("reset-invalid",{url:"/password/reset/invalid",templateUrl:"modules/users/views/password/reset-password-invalid.client.view.html"}).state("reset-success",{url:"/password/reset/success",templateUrl:"modules/users/views/password/reset-password-success.client.view.html"}).state("reset",{url:"/password/reset/:token",templateUrl:"modules/users/views/password/reset-password.client.view.html"})}]),angular.module("users").controller("AuthenticationController",["$scope","$location","$state","$rootScope","User","Auth",function($scope,$location,$state,$rootScope,User,Auth){$scope=$rootScope,$scope.credentials={},$scope.error="",$scope.signin=function(){$scope.credentials.email=$scope.credentials.username,User.login($scope.credentials).then(function(response){Auth.login(response),$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),"home"!==$state.previous.name&&"verify"!==$state.previous.name&&""!==$state.previous.name?$state.go($state.previous.name):$state.go("listForms")},function(error){$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user,$scope.error=error,console.log("loginError: "+error)})},$scope.signup=function(){console.log($scope.credentials),User.signup($scope.credentials).then(function(response){console.log("signup-success"),$state.go("signup-success")},function(error){console.log("Error: "),console.log(error),error?($scope.error=error,console.log(error)):console.log("No response received")})}}]),angular.module("users").controller("PasswordController",["$scope","$stateParams","$state","User",function($scope,$stateParams,$state,User){$scope.error="",$scope.askForPasswordReset=function(){User.askForPasswordReset($scope.credentials).then(function(response){$scope.success=response.message,$scope.credentials=null},function(error){$scope.error=error,$scope.credentials=null})},$scope.resetUserPassword=function(){$scope.success=$scope.error=null,User.resetPassword($scope.passwordDetails,$stateParams.token).then(function(response){$scope.success=response.message,$scope.passwordDetails=null,$state.go("reset-success")},function(error){$scope.error=error.message||error,$scope.passwordDetails=null})}}]),angular.module("users").controller("SettingsController",["$scope","$rootScope","$http","$state","Users",function($scope,$rootScope,$http,$state,Users){$scope.user=$rootScope.user,$scope.hasConnectedAdditionalSocialAccounts=function(provider){for(var i in $scope.user.additionalProvidersData)return!0;return!1},$scope.isConnectedSocialAccount=function(provider){return $scope.user.provider===provider||$scope.user.additionalProvidersData&&$scope.user.additionalProvidersData[provider]},$scope.removeUserSocialAccount=function(provider){$scope.success=$scope.error=null,$http["delete"]("/users/accounts",{params:{provider:provider}}).success(function(response){$scope.success=!0,$scope.user=response}).error(function(response){$scope.error=response.message})},$scope.updateUserProfile=function(isValid){if(isValid){$scope.success=$scope.error=null;var user=new Users($scope.user);user.$update(function(response){$scope.success=!0,$scope.user=response},function(response){$scope.error=response.data.message})}else $scope.submitted=!0},$scope.changeUserPassword=function(){$scope.success=$scope.error=null,$http.post("/users/password",$scope.passwordDetails).success(function(response){$scope.success=!0,$scope.passwordDetails=null}).error(function(response){$scope.error=response.message})}}]),angular.module("users").controller("VerifyController",["$scope","$state","$rootScope","User","Auth","$stateParams",function($scope,$state,$rootScope,User,Auth,$stateParams){$scope.isResetSent=!1,$scope.credentials={},$scope.error="",$scope.resendVerifyEmail=function(){User.resendVerifyEmail($scope.credentials.email).then(function(response){console.log(response),$scope.success=response.message,$scope.credentials=null,$scope.isResetSent=!0},function(error){$scope.error=error,$scope.credentials.email=null,$scope.isResetSent=!1})},$scope.validateVerifyToken=function(){$stateParams.token&&(console.log($stateParams.token),User.validateVerifyToken($stateParams.token).then(function(response){console.log("Success: "+response.message),$scope.success=response.message,$scope.isResetSent=!0,$scope.credentials.email=null},function(error){console.log("Error: "+error.message),$scope.isResetSent=!1,$scope.error=error,$scope.credentials.email=null}))}}]),angular.module("users").factory("Auth",["$window",function($window){var userState={isLoggedIn:!1},service={_currentUser:null,get currentUser(){return this._currentUser},ensureHasCurrentUser:function(User){return service._currentUser&&service._currentUser.username?service._currentUser:$window.user?(service._currentUser=$window.user,service._currentUser):void User.getCurrent().then(function(user){return service._currentUser=user,userState.isLoggedIn=!0,$window.user=service._currentUser,service._currentUser},function(response){return userState.isLoggedIn=!1,service._currentUser=null,$window.user=null,console.log("User.getCurrent() err",response),null})},isAuthenticated:function(){return!!service._currentUser},getUserState:function(){return userState},login:function(new_user){userState.isLoggedIn=!0,service._currentUser=new_user},logout:function(){$window.user=null,userState.isLoggedIn=!1,service._currentUser=null}};return service}]),angular.module("users").service("Authorizer",["APP_PERMISSIONS","USER_ROLES",function(APP_PERMISSIONS,USER_ROLES){return function(user){return{canAccess:function(permissions){var i,len,permission;for(angular.isArray(permissions)||(permissions=[permissions]),i=0,len=permissions.length;len>i;i++){if(permission=permissions[i],null===APP_PERMISSIONS[permission])throw"Bad permission value";if(!user||!user.roles)return!1;switch(permission){case APP_PERMISSIONS.viewAdminSettings:case APP_PERMISSIONS.editAdminSettings:return user.roles.indexOf(USER_ROLES.admin)>-1;case APP_PERMISSIONS.viewPrivateForm:case APP_PERMISSIONS.editForm:return user.roles.indexOf(USER_ROLES.admin)>-1||user.roles.indexOf(USER_ROLES.normal)>-1}}return!1}}}}]),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function($window,$q,$timeout,$http,$state){var userService={getCurrent:function(){var deferred=$q.defer();return $http.get("/users/me").success(function(response){deferred.resolve(response)}).error(function(){deferred.reject("User's session has expired")}),deferred.promise},login:function(credentials){var deferred=$q.defer();return $http.post("/auth/signin",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},logout:function(){var deferred=$q.defer();return $http.get("/auth/signout").success(function(response){deferred.resolve(null)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},signup:function(credentials){var deferred=$q.defer();return $http.post("/auth/signup",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},resendVerifyEmail:function(_email){var deferred=$q.defer();return $http.post("/auth/verify",{email:_email}).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},validateVerifyToken:function(token){var validTokenRe=/^([A-Za-z0-9]{48})$/g;if(!validTokenRe.test(token))throw new Error("Error token: "+token+" is not a valid verification token");var deferred=$q.defer();return $http.get("/auth/verify/"+token).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error)}),deferred.promise},resetPassword:function(passwordDetails,token){var deferred=$q.defer();return $http.get("/auth/password/"+token,passwordDetails).success(function(response){deferred.resolve()}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},askForPasswordReset:function(credentials){var deferred=$q.defer();return $http.post("/auth/forgot",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise}};return userService}]),angular.module("users").factory("Users",["$resource",function($resource){return $resource("users",{},{update:{method:"PUT"}})}]),angular.module("forms").controller("AdminFormController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http","$uibModal","myForm",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http,$uibModal,myForm){$scope=$rootScope,$scope.animationsEnabled=!0,$scope.myform=myForm,$rootScope.saveInProgress=!1,CurrentForm.setForm($scope.myform),$scope.tabData=[{heading:"Create",route:"viewForm.create"},{heading:"Design",route:"viewForm.design"},{heading:"Configure",route:"viewForm.configure"},{heading:"Analyze",route:"viewForm.analyze"}],$scope.setForm=function(form){$scope.myform=form},$rootScope.resetForm=function(){$scope.myform=Forms.get({formId:$stateParams.formId})},$scope.openDeleteModal=function(){$scope.deleteModal=$uibModal.open({animation:$scope.animationsEnabled,templateUrl:"myModalContent.html",controller:"AdminFormController",resolve:{myForm:function(){return $scope.myform}}}),$scope.deleteModal.result.then(function(selectedItem){$scope.selected=selectedItem},function(){console.log("Modal dismissed at: "+new Date)})},$scope.cancelDeleteModal=function(){$scope.deleteModal&&$scope.deleteModal.dismiss("cancel")},$scope.removeCurrentForm=function(){if($scope.deleteModal&&$scope.deleteModal.opened){$scope.deleteModal.close();var form_id=$scope.myform._id;if(!form_id)throw new Error("Error - removeCurrentForm(): $scope.myform._id does not exist");$http["delete"]("/forms/"+form_id).success(function(data,status,headers){console.log("form deleted successfully"),$state.go("listForms",{},{reload:!0})}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}},$scope.update=$rootScope.update=function(updateImmediately,cb){var continueUpdate=!0;if(updateImmediately||(continueUpdate=!$rootScope.saveInProgress),continueUpdate){var err=null;updateImmediately||($rootScope.saveInProgress=!0),$scope.updatePromise=$http.put("/forms/"+$scope.myform._id,{form:$scope.myform}).then(function(response){$rootScope.myform=$scope.myform=response.data})["catch"](function(response){console.log("Error occured during form UPDATE.\n"),err=response.data})["finally"](function(){return updateImmediately||($rootScope.saveInProgress=!1),"function"==typeof cb?cb(err):void 0})}}}]),angular.module("forms").controller("ListFormsController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http){$scope=$rootScope,$scope.forms={},$scope.showCreateModal=!1,$scope.findAll=function(){Forms.query(function(_forms){$scope.myforms=_forms})},$scope.openCreateModal=function(){$scope.showCreateModal||($scope.showCreateModal=!0)},$scope.closeCreateModal=function(){$scope.showCreateModal&&($scope.showCreateModal=!1); +},$scope.setForm=function(form){$scope.myform=form},$scope.goToWithId=function(route,id){$state.go(route,{formId:id},{reload:!0})},$scope.duplicateForm=function(form_index){var form=_.cloneDeep($scope.myforms[form_index]);delete form._id,$http.post("/forms",{form:form}).success(function(data,status,headers){$scope.myforms.splice(form_index+1,0,data)}).error(function(errorResponse){console.error(errorResponse),null===errorResponse&&($scope.error=errorResponse.data.message)})},$scope.createNewForm=function(){var form={};form.title=$scope.forms.createForm.title.$modelValue,form.language=$scope.forms.createForm.language.$modelValue,$scope.forms.createForm.$valid&&$scope.forms.createForm.$dirty&&$http.post("/forms",{form:form}).success(function(data,status,headers){console.log("new form created"),$scope.goToWithId("viewForm.create",data._id+"")}).error(function(errorResponse){console.error(errorResponse),$scope.error=errorResponse.data.message})},$scope.removeForm=function(form_index){if(form_index>=$scope.myforms.length||0>form_index)throw new Error("Error: form_index in removeForm() must be between 0 and "+$scope.myforms.length-1);$http["delete"]("/forms/"+$scope.myforms[form_index]._id).success(function(data,status,headers){console.log("form deleted successfully"),$scope.myforms.splice(form_index,1)}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}}]),_.mixin({removeDateFields:removeDateFieldsFunc}),angular.module("forms").directive("autoSaveForm",["$rootScope","$timeout",function($rootScope,$timeout){return{require:["^form"],restrict:"AE",link:function($scope,$element,$attrs,$ctrls){angular.element(document).ready(function(){var $formCtrl=$ctrls[0],savePromise=null;$rootScope.finishedRender=!1,$scope.$on("editFormFields Started",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!1}),$scope.$on("editFormFields Finished",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!0}),$scope.anyDirtyAndTouched=function(form){var propCount=0;for(var prop in form)if(form.hasOwnProperty(prop)&&"$"!==prop[0]&&(propCount++,form[prop].$touched&&form[prop].$dirty))return!0;return!1};var debounceSave=function(){$rootScope.saveInProgress=!0,$rootScope[$attrs.autoSaveCallback](!0,function(err){err?(console.error("Error form data NOT persisted"),console.error(err)):(console.log("\n\nForm data persisted -- setting pristine flag"),$formCtrl.$setPristine(),$formCtrl.$setUntouched())})};$scope.$watch(function(newValue,oldValue){console.log("introParagraphStartPage.$dirty: "+$scope.editForm.introParagraphStartPage.$dirty),console.log("introParagraphStartPage.$touched: "+$scope.editForm.introParagraphStartPage.$touched),$rootScope.finishedRender&&$scope.anyDirtyAndTouched($scope.editForm)&&!$rootScope.saveInProgress&&(console.log("Form saving started"),debounceSave(),console.log("introParagraphStartPage.$dirty AFTER: "+$scope.editForm.introParagraphStartPage.$dirty))}),$scope.$watch($attrs.autoSaveWatch,function(newValue,oldValue){newValue=angular.copy(newValue),oldValue=angular.copy(oldValue),newValue.form_fields=_.removeDateFields(newValue.form_fields),oldValue.form_fields=_.removeDateFields(oldValue.form_fields);var changedFields=!_.isEqual(oldValue.form_fields,newValue.form_fields)||!_.isEqual(oldValue.startPage,newValue.startPage),changedFieldMap=!1;oldValue.hasOwnProperty("plugins.oscarhost.settings.fieldMap")&&(changedFieldMap=!!oldValue.plugins.oscarhost.settings.fieldMap&&!_.isEqual(oldValue.plugins.oscarhost.settings.fieldMap,newValue.plugins.oscarhost.settings.fieldMap)),(newValue||oldValue)&&oldValue&&(0===oldValue.form_fields.length&&($rootScope.finishedRender=!0),$rootScope.finishedRender&&(changedFields&&!$formCtrl.$dirty||changedFieldMap)&&!$rootScope.saveInProgress?(savePromise&&($timeout.cancel(savePromise),savePromise=null),savePromise=$timeout(function(){debounceSave()})):$rootScope.finishedRender&&$rootScope.saveInProgress&&($rootScope.saveInProgress=!1))},!0)})}}}]),angular.module("forms").directive("configureFormDirective",["$rootScope","$http","Upload","CurrentForm",function($rootScope,$http,Upload,CurrentForm){return{templateUrl:"modules/forms/admin/views/directiveViews/form/configure-form.client.view.html",restrict:"E",scope:{myform:"=",user:"=",pdfFields:"@",formFields:"@"},controller:["$scope",function($scope){console.log($scope.myform),CurrentForm.getForm().plugins?CurrentForm.getForm().plugins.oscarhost.baseUrl&&($scope.oscarhostAPI=!0):$scope.oscarhostAPI=!1,$scope.log="",$scope.pdfLoading=!1,$scope.languages=$rootScope.languages,this._current_upload=null,$scope.resetForm=$rootScope.resetForm,$scope.update=$rootScope.update,this._unbindedPdfFields=$scope.pdfFields,$scope.cancelUpload=function(){this._current_upload.abort(),$scope.pdfLoading=!1,$scope.removePDF()},$scope.removePDF=function(){$scope.myform.pdf=null,$scope.myform.isGenerated=!1,$scope.myform.autofillPDFs=!1,console.log("form.pdf: "+$scope.myform.pdf+" REMOVED")},$scope.uploadPDF=function(file){file&&(console.log(file),Upload.upload({url:"/upload/pdf",data:{user:$scope.user,file:file}}).then(function(resp){var data=resp.data;$scope.log="file "+data.originalname+" uploaded as "+data.filename+". JSON: "+JSON.stringify(data)+"\n"+$scope.log,$scope.myform.pdf=angular.fromJson(angular.toJson(data)),$scope.pdfLoading=!1,console.log($scope.log),$scope.$$phase||$scope.$digest||$scope.$apply()},function(resp){$scope.pdfLoading=!1,console.log("Error occured during upload.\n"),console.log(resp.status)},function(evt){var progressPercentage=parseInt(100*evt.loaded/evt.total,10);$scope.log="progress: "+progressPercentage+"% "+evt.config.data.file.name+"\n"+$scope.log,console.log($scope.log),$scope.pdfLoading=!0}))}}]}}]),angular.module("forms").directive("editFormDirective",["$rootScope","FormFields",function($rootScope,FormFields){return{templateUrl:"modules/forms/admin/views/directiveViews/form/edit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$scope",function($scope){for(var field_ids=_($scope.myform.form_fields).pluck("_id"),i=0;i0){$scope.myform.plugins.oscarhost.settings.fieldMap||($scope.myform.plugins.oscarhost.settings.fieldMap={});var oscarhostFields=$scope.myform.plugins.oscarhost.settings.validFields,currentFields=_($scope.myform.plugins.oscarhost.settings.fieldMap).invert().keys().value();return $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id)&&(currentFields=_(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id])),_(oscarhostFields).difference(currentFields).value()}return[]},$scope.dropzone={handle:" .handle",containment:".dropzoneContainer",cursor:"grabbing"},$scope.addNewField=function(modifyForm,fieldType){$scope.addField.lastAddedID++;for(var fieldTitle,i=0;i<$scope.addField.types.length;i++)if($scope.addField.types[i].name===fieldType){$scope.addField.types[i].lastAddedID++,fieldTitle=$scope.addField.types[i].value+$scope.addField.types[i].lastAddedID;break}var newField={title:fieldTitle,fieldType:fieldType,fieldValue:"",required:!0,disabled:!1,deletePreserved:!1};return modifyForm&&$scope.myform.form_fields.push(newField),newField},$scope.deleteField=function(field_index){var currFieldId=$scope.myform.form_fields[field_index]._id;$scope.myform.hasOwnProperty("plugins.oscarhost.baseUrl")&&delete $scope.myform.plugins.oscarhost.settings.fieldMap[currFieldId],$scope.myform.form_fields.splice(field_index,1)},$scope.duplicateField=function(field_index){var currField=_.cloneDeep($scope.myform.form_fields[field_index]);currField._id="cloned"+_.uniqueId(),currField.title+=" copy",$scope.myform.form_fields.splice(field_index+1,0,currField)},$scope.addButton=function(){var newButton={};newButton.bgColor="#ddd",newButton.color="#ffffff",newButton.text="Button",newButton._id=Math.floor(1e5*Math.random()),$scope.myform.startPage.buttons.push(newButton)},$scope.deleteButton=function(button){for(var currID,i=0;i<$scope.myform.startPage.buttons.length;i++)if(currID=$scope.myform.startPage.buttons[i]._id,console.log(currID),currID===button._id){$scope.myform.startPage.buttons.splice(i,1);break}},$scope.addOption=function(field_index){var currField=$scope.myform.form_fields[field_index];if(console.log(field_index),console.log(currField),"checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType){currField.fieldOptions||($scope.myform.form_fields[field_index].fieldOptions=[]);var lastOptionID=0;currField.fieldOptions[currField.fieldOptions.length-1]&&(lastOptionID=currField.fieldOptions[currField.fieldOptions.length-1].option_id);var newOption={option_id:Math.floor(1e5*Math.random()),option_title:"Option "+lastOptionID,option_value:"Option "+lastOptionID};$scope.myform.form_fields[field_index].fieldOptions.push(newOption)}},$scope.deleteOption=function(field_index,option){var currField=$scope.myform.form_fields[field_index];if("checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType)for(var i=0;i',restrict:"E",scope:{typeName:"@"},controller:["$scope",function($scope){var iconTypeMap={textfield:"fa fa-pencil-square-o",dropdown:"fa fa-th-list",date:"fa fa-calendar",checkbox:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",email:"fa fa-envelope-o",textarea:"fa fa-pencil-square",legal:"fa fa-legal",file:"fa fa-cloud-upload",rating:"fa fa-star-half-o",link:"fa fa-link",scale:"fa fa-sliders",stripe:"fa fa-credit-card",statement:"fa fa-quote-left",yes_no:"fa fa-toggle-on",number:"fa fa-slack"};$scope.typeIcon=iconTypeMap[$scope.typeName]}]}});var __indexOf=[].indexOf||function(item){for(var i=0,l=this.length;l>i;i++)if(i in this&&this[i]===item)return i;return-1};angular.module("forms").directive("fieldDirective",["$http","$compile","$rootScope","$templateCache","supportedFields",function($http,$compile,$rootScope,$templateCache,supportedFields){var getTemplateUrl=function(fieldType){var type=fieldType,templateUrl="modules/forms/base/views/directiveViews/field/";return __indexOf.call(supportedFields,type)>=0&&(templateUrl=templateUrl+type+".html"),$templateCache.get(templateUrl)};return{template:"
{{field.title}}
",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(scope,element){$rootScope.chooseDefaultOption=scope.chooseDefaultOption=function(type){"yes_no"===type?scope.field.fieldValue="true":"rating"===type?scope.field.fieldValue=0:"radio"===scope.field.fieldType?(console.log(scope.field),scope.field.fieldValue=scope.field.fieldOptions[0].option_value,console.log(scope.field.fieldValue)):"legal"===type&&(scope.field.fieldValue="true",$rootScope.nextField())},scope.setActiveField=$rootScope.setActiveField,"date"===scope.field.fieldType&&(scope.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var fieldType=scope.field.fieldType;if("number"===scope.field.fieldType||"textfield"===scope.field.fieldType||"email"===scope.field.fieldType||"link"===scope.field.fieldType){switch(scope.field.fieldType){case"textfield":scope.field.input_type="text";break;case"email":scope.field.input_type="email",scope.field.placeholder="joesmith@example.com";break;case"number":scope.field.input_type="text",scope.field.validateRegex=/^\d+$/;break;default:scope.field.input_type="url",scope.field.placeholder="http://example.com"}fieldType="textfield"}var template=getTemplateUrl(fieldType);element.html(template).show(),$compile(element.contents())(scope)}}}]),angular.module("forms").directive("onEnterKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;13===keyCode&&($rootScope.$apply(function(){$rootScope.$eval($attrs.onEnterKey)}),event.preventDefault())})}}}]),angular.module("forms").directive("onFinishRender",["$rootScope","$timeout",function($rootScope,$timeout){return{restrict:"A",link:function(scope,element,attrs){if(element.attr("ng-repeat")||element.attr("data-ng-repeat")){var broadcastMessage=attrs.onFinishRender||"ngRepeat";scope.$first&&!scope.$last?scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Started")}):scope.$last&&scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Finished")})}}}}]),angular.module("forms").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","Auth",function($http,TimeCounter,$filter,$rootScope,Auth){return{templateUrl:"modules/forms/base/views/directiveViews/form/submit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$document","$window","$scope",function($document,$window,$scope){$scope.authentication=$rootScope.authentication,$scope.noscroll=!1,$scope.forms={};var form_fields_count=$scope.myform.visible_form_fields.filter(function(field){return"statement"!==field.fieldType&&"rating"!==field.fieldType}).length;$scope.translateAdvancementData={done:$filter("formValidity")($scope.myform),total:form_fields_count},$scope.reloadForm=function(){$scope.myform.submitted=!1,$scope.myform.form_fields=_.chain($scope.myform.visible_form_fields).map(function(field){return field.fieldValue="",field}).value(),$scope.loading=!1,$scope.error="",$scope.selected={_id:"",index:0},$scope.setActiveField($scope.myform.visible_form_fields[0]._id,0,!1),TimeCounter.restartClock()},$window.onscroll=function(){$scope.scrollPos=document.body.scrollTop||document.documentElement.scrollTop||0;var elemBox=document.getElementsByClassName("activeField")[0].getBoundingClientRect();$scope.fieldTop=elemBox.top,$scope.fieldBottom=elemBox.bottom;var field_id,field_index;$scope.noscroll||($scope.selected.index===$scope.myform.form_fields.length-1&&$scope.fieldBottom<200?(field_index=$scope.selected.index+1,field_id="submit_field",$scope.setActiveField(field_id,field_index,!1)):$scope.selected.index===$scope.myform.form_fields.length?$scope.fieldTop>200&&(field_index=$scope.selected.index-1,field_id=$scope.myform.form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):$scope.fieldBottom<0?(field_index=$scope.selected.index+1,field_id=$scope.myform.form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):0!==$scope.selected.index&&$scope.fieldTop>0&&(field_index=$scope.selected.index-1,field_id=$scope.myform.form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)),$scope.$apply())},$scope.setActiveField=$rootScope.setActiveField=function(field_id,field_index,animateScroll){null!==$scope.selected&&$scope.selected._id!==field_id&&($scope.selected._id=field_id,$scope.selected.index=field_index,$scope.translateAdvancementData={done:$filter("formValidity")($scope.myform),total:form_fields_count},animateScroll&&($scope.noscroll=!0,setTimeout(function(){$document.scrollToElement(angular.element(".activeField"),-10,200).then(function(){$scope.noscroll=!1,document.querySelectorAll(".activeField .focusOn")[0].focus()})},20)))},$rootScope.nextField=$scope.nextField=function(){if($scope.selected.index<$scope.myform.form_fields.length-1){var selected_index=$scope.selected.index+1,selected_id=$scope.myform.form_fields[selected_index]._id;$rootScope.setActiveField(selected_id,selected_index,!0)}else if($scope.selected.index===$scope.myform.form_fields.length-1){var selected_index=$scope.selected.index+1,selected_id="submit_field";$rootScope.setActiveField(selected_id,selected_index,!0)}},$rootScope.prevField=$scope.prevField=function(){if($scope.selected.index>0){var selected_index=$scope.selected.index-1,selected_id=$scope.myform.form_fields[selected_index]._id;$scope.setActiveField(selected_id,selected_index,!0)}},$scope.exitStartPage=function(){$scope.myform.startPage.showStart=!1,$scope.myform.form_fields.length>0&&($scope.selected._id=$scope.myform.form_fields[0]._id)},$scope.submitForm=function(){var _timeElapsed=TimeCounter.stopClock();$scope.loading=!0;var form=_.cloneDeep($scope.myform);form.timeElapsed=_timeElapsed,form.percentageComplete=$filter("formValidity")($scope.myform)/$scope.myform.visible_form_fields.length*100,delete form.visible_form_fields,setTimeout(function(){$scope.submitPromise=$http.post("/forms/"+$scope.myform._id,form).success(function(data,status,headers){$scope.myform.submitted=!0,$scope.loading=!1}).error(function(error){$scope.loading=!1,$scope.error=error.message})},500)},$scope.reloadForm()}]}}]),angular.module("forms").service("CurrentForm",function(){var _form={};this.getForm=function(){return _form},this.setForm=function(form){_form=form}}),angular.module("forms").service("FormFields",[function(){this.types=[{name:"textfield",value:"Short Text"},{name:"email",value:"Email"},{name:"radio",value:"Multiple Choice"},{name:"dropdown",value:"Dropdown"},{name:"date",value:"Date"},{name:"textarea",value:"Paragraph Text"},{name:"yes_no",value:"Yes/No"},{name:"legal",value:"Legal"},{name:"rating",value:"Rating"},{name:"link",value:"Link"},{name:"number",value:"Numbers"},{name:"statement",value:"Statement"}]}]),angular.module("forms").factory("Forms",["$resource","FORM_URL",function($resource,FORM_URL){return $resource(FORM_URL,{formId:"@_id"},{query:{method:"GET",isArray:!0},get:{method:"GET",transformResponse:function(data,header){var form=angular.fromJson(data);return form.visible_form_fields=_.filter(form.form_fields,function(field){return field.deletePreserved===!1}),form}},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").service("TimeCounter",[function(){var _startTime,_endTime,that=this;this.timeSpent=0,this.restartClock=function(){_startTime=Date.now(),_endTime=_startTime},this.stopClock=function(){return _startTime?(_endTime=Date.now(),that.timeSpent=Math.abs(_endTime.valueOf()-_startTime.valueOf())/1e3,that.timeSpent):new Error("Clock has not been started")},this.clockStarted=function(){return!!this._startTime}}]); +>>>>>>> make it work +>>>>>>> make it work 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 91b58f1c..012684fc 100644 --- a/public/modules/forms/admin/directives/configure-form.client.directive.js +++ b/public/modules/forms/admin/directives/configure-form.client.directive.js @@ -3,7 +3,7 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$http', 'Upload', 'CurrentForm', function ($rootScope, $http, Upload, CurrentForm) { return { - templateUrl: 'modules/forms/views/directiveViews/form/configure-form.client.view.html', + templateUrl: 'modules/forms/admin/views/directiveViews/form/configure-form.client.view.html', restrict: 'E', scope: { myform:'=', 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 2b5b50f8..3e8d3faa 100644 --- a/public/modules/forms/admin/directives/edit-form.client.directive.js +++ b/public/modules/forms/admin/directives/edit-form.client.directive.js @@ -3,7 +3,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormFields', function ($rootScope, FormFields) { return { - templateUrl: 'modules/forms/views/directiveViews/form/edit-form.client.view.html', + templateUrl: 'modules/forms/admin/views/directiveViews/form/edit-form.client.view.html', restrict: 'E', scope: { myform:'=' 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 fe1a5521..c9464467 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 @@ -3,7 +3,7 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope', '$http', function ($rootScope, $http) { return { - templateUrl: 'modules/forms/views/directiveViews/form/edit-submissions-form.client.view.html', + templateUrl: 'modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html', restrict: 'E', scope: { myform:'=', diff --git a/public/modules/forms/admin/views/admin-form.client.view.html b/public/modules/forms/admin/views/admin-form.client.view.html index 47ca2b6e..b8e987b0 100644 --- a/public/modules/forms/admin/views/admin-form.client.view.html +++ b/public/modules/forms/admin/views/admin-form.client.view.html @@ -1,4 +1,4 @@ -
+
@@ -33,7 +33,7 @@
- +
- - + + Preview Form
- +
From fd8c5e24176fae5b74879427df2f28faac4a8978 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 28 Apr 2016 00:38:56 +0300 Subject: [PATCH 22/42] wip --- public/modules/forms/base/directives/field.client.directive.js | 1 + .../base/views/directiveViews/form/submit-form.client.view.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/public/modules/forms/base/directives/field.client.directive.js b/public/modules/forms/base/directives/field.client.directive.js index 6ec0726e..5e358a98 100644 --- a/public/modules/forms/base/directives/field.client.directive.js +++ b/public/modules/forms/base/directives/field.client.directive.js @@ -16,6 +16,7 @@ angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$root var templateUrl = 'modules/forms/base/views/directiveViews/field/'; if (__indexOf.call(supportedFields, type) >= 0) { + templateUrl = templateUrl+type+'.html'; } return $templateCache.get(templateUrl); diff --git a/public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html b/public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html index 7eebde7c..53495188 100755 --- a/public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html +++ b/public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html @@ -141,7 +141,7 @@ ng-style="{'color':button.color}">
- +
From 966a322f20c4200210135f217bca092dfb6ead41 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 28 Apr 2016 15:58:16 +0300 Subject: [PATCH 23/42] add base build + demo --- public/modules/forms/base/demo/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/modules/forms/base/demo/index.html b/public/modules/forms/base/demo/index.html index 9b9ae3b1..648b496a 100644 --- a/public/modules/forms/base/demo/index.html +++ b/public/modules/forms/base/demo/index.html @@ -39,7 +39,7 @@ From 02249a44326d5bfa0694a48a5c0ad8a43f271c0f Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 30 Apr 2016 13:19:58 +0300 Subject: [PATCH 24/42] reorder dependencies --- public/modules/forms/base/demo/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/modules/forms/base/demo/boot.js b/public/modules/forms/base/demo/boot.js index 5d808911..a9534c34 100644 --- a/public/modules/forms/base/demo/boot.js +++ b/public/modules/forms/base/demo/boot.js @@ -8,7 +8,7 @@ angular.module('forms', [ angular.module('NodeForm', [ 'ui.select', 'cgBusy', 'ngSanitize', 'vButton', 'ngResource', 'ui.router', 'ui.bootstrap', 'ui.utils', 'ngRaven', 'forms', - 'ui.select' + 'ui.select' ]); angular.module('forms').factory('Auth', [ From 66ff2c8d39df1523eaaf5f530526bcc575a73184 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 1 May 2016 12:03:55 +0300 Subject: [PATCH 25/42] exclude form gruntfile from build --- gruntfile.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gruntfile.js b/gruntfile.js index 8fa71f72..1ad2dcc8 100755 --- a/gruntfile.js +++ b/gruntfile.js @@ -145,6 +145,14 @@ module.exports = function(grunt) { logConcurrentOutput: true, limit: 10 } + }, + concurrent: { + default: ['nodemon', 'watch'], + debug: ['nodemon', 'watch', 'node-inspector'], + options: { + logConcurrentOutput: true, + limit: 10 + } }, env: { test: { From 43935c47e0ef6b6f1f1a6cfeda305c20abab480f Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 1 May 2016 12:04:44 +0300 Subject: [PATCH 26/42] colorpicker tmp hack --- public/modules/forms/forms.client.module.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/modules/forms/forms.client.module.js b/public/modules/forms/forms.client.module.js index a07f3d98..5fa901f9 100644 --- a/public/modules/forms/forms.client.module.js +++ b/public/modules/forms/forms.client.module.js @@ -5,3 +5,4 @@ ApplicationConfiguration.registerModule('forms', [ 'ngFileUpload', 'ui.router.tabs', 'ui.date', 'ui.sortable', 'angular-input-stars', 'users', 'pascalprecht.translate' ]);//, 'colorpicker.module' @TODO reactivate this module + From 654c7bf6192ad4e97663155d1afaa767ca734654 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 3 May 2016 11:04:10 +0300 Subject: [PATCH 27/42] =?UTF-8?q?exclude=20form=E2=80=99s=20demo,=20lib=20?= =?UTF-8?q?and=20dist=20from=20general=20build?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gruntfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gruntfile.js b/gruntfile.js index 1ad2dcc8..ffd5b9c9 100755 --- a/gruntfile.js +++ b/gruntfile.js @@ -13,7 +13,7 @@ module.exports = function(grunt) { clientViews: ['public/modules/**/views/**/*.html', '!public/modules/**/demo/**/*.html', '!public/modules/**/dist/**/*.html', '!public/modules/**/node_modules/**/*.html'], clientJS: ['public/js/*.js', 'public/modules/**/*.js', '!public/modules/**/gruntfile.js', '!public/modules/**/demo/**/*.js', '!public/modules/**/dist/**/*.js', '!public/modules/**/node_modules/**/*.js'], - clientCSS: ['public/modules/**/*.css', '!public/modules/**/demo/**/*.css', '!public/modules/**/dist/**/*.css', '!public/modules/**/node_modules/**/*.css'], + clientCSS: ['public/modules/**/*.css', '!public/modules/**/demo/**/*.css', '!public/modules/**/dist/**/*.css', '!public/modules/**/node_modules/**/*.css'], serverTests: ['app/tests/**/*.js'], clientTests: ['public/modules/**/tests/*.js', '!public/modules/**/demo/**/*.js', '!public/modules/**/dist/**/*.js', '!public/modules/**/node_modules/**/*.js'] From 25fffe4ef7bc3dd03bd2dd220e42426d89da67d8 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 5 May 2016 13:00:24 +0300 Subject: [PATCH 28/42] export supportedFields in injector --- public/modules/forms/base/directives/field.client.directive.js | 1 - 1 file changed, 1 deletion(-) diff --git a/public/modules/forms/base/directives/field.client.directive.js b/public/modules/forms/base/directives/field.client.directive.js index 5e358a98..6ec0726e 100644 --- a/public/modules/forms/base/directives/field.client.directive.js +++ b/public/modules/forms/base/directives/field.client.directive.js @@ -16,7 +16,6 @@ angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$root var templateUrl = 'modules/forms/base/views/directiveViews/field/'; if (__indexOf.call(supportedFields, type) >= 0) { - templateUrl = templateUrl+type+'.html'; } return $templateCache.get(templateUrl); From d0057c41a936b21c285af5d1277412898f8943ef Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 5 May 2016 16:00:58 +0300 Subject: [PATCH 29/42] translate app + add french translation --- .../modules/forms/base/config/i18n/english.js | 7 ++++- .../modules/forms/base/config/i18n/french.js | 11 +++++-- public/modules/forms/base/demo/boot.js | 2 +- public/modules/forms/base/demo/index.html | 29 ++++++++++++++++++- .../submit-form.client.directive.js | 13 ++++++--- .../views/directiveViews/field/legal.html | 4 +-- .../views/directiveViews/field/textarea.html | 6 ++-- .../views/directiveViews/field/yes_no.html | 4 +-- .../form/submit-form.client.view.html | 3 +- 9 files changed, 60 insertions(+), 19 deletions(-) diff --git a/public/modules/forms/base/config/i18n/english.js b/public/modules/forms/base/config/i18n/english.js index dc83635e..0b24dee8 100644 --- a/public/modules/forms/base/config/i18n/english.js +++ b/public/modules/forms/base/config/i18n/english.js @@ -4,25 +4,30 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid $translateProvider.translations('english', { FORM_SUCCESS: 'Form entry successfully submitted!', + SUBMIT: 'Submit', + REVIEW: 'Review', BACK_TO_FORM: 'Go back to Form', EDIT_FORM: 'Edit this TellForm', CREATE_FORM: 'Create this TellForm', ADVANCEMENT: '{{done}} out of {{total}} answered', CONTINUE_FORM: 'Continue to Form', REQUIRED: 'required', + COMPLETING_NEEDED: '{{answers_not_completed}} answer(s) need completing', OPTIONAL: 'optional', ERROR_EMAIL_INVALID: 'Please enter a valid email address', ERROR_NOT_A_NUMBER: 'Please enter valid numbers only', ERROR_URL_INVALID: 'Please a valid url', OK: 'OK', ENTER: 'press ENTER', + YES: 'Yes', + NO: 'No', + NEWLINE: 'press SHIFT+ENTER to create a newline', CONTINUE: 'Continue', LEGAL_ACCEPT: 'I accept', LEGAL_NO_ACCEPT: 'I don’t accept', DELETE: 'Delete', CANCEL: 'Cancel', UPLOAD_FILE: 'Upload your File', - SUBMIT: 'Submit' }); $translateProvider.preferredLanguage('english') diff --git a/public/modules/forms/base/config/i18n/french.js b/public/modules/forms/base/config/i18n/french.js index 3eaa31c7..0b980232 100644 --- a/public/modules/forms/base/config/i18n/french.js +++ b/public/modules/forms/base/config/i18n/french.js @@ -4,25 +4,30 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid $translateProvider.translations('french', { FORM_SUCCESS: 'Votre formulaire a été enregistré!', + REVIEW: 'Review', BACK_TO_FORM: 'Retourner au formulaire', EDIT_FORM: 'Éditer le Tellform', CREATE_FORM: 'Créer un TellForm', ADVANCEMENT: '{{done}} complétés sur {{total}}', CONTINUE_FORM: 'Aller au formulaire', REQUIRED: 'obligatoire', + COMPLETING_NEEDED: '{{answers_not_completed}} réponse(s) doive(nt) être complétée(s)', OPTIONAL: 'facultatif', ERROR_EMAIL_INVALID: 'Merci de rentrer une adresse mail valide', ERROR_NOT_A_NUMBER: 'Merce de ne rentrer que des nombres', ERROR_URL_INVALID: 'Merci de rentrer une url valide', OK: 'OK', ENTER: 'presser ENTRÉE', + YES: 'Oui', + NO: 'Non', + NEWLINE: 'presser SHIFT+ENTER pour créer une nouvelle ligne', CONTINUE: 'Continuer', LEGAL_ACCEPT: 'J’accepte', - LEGAL_NO_ACCEPT: 'Jen n’accepte pas', + LEGAL_NO_ACCEPT: 'Je n’accepte pas', DELETE: 'Supprimer', CANCEL: 'Réinitialiser', - UPLOAD_FILE: 'Envoyer des fichier', - SUBMIT: 'Enregistrer' + SUBMIT: 'Enregistrer', + UPLOAD_FILE: 'Envoyer un fichier', }); }]); diff --git a/public/modules/forms/base/demo/boot.js b/public/modules/forms/base/demo/boot.js index a9534c34..5d808911 100644 --- a/public/modules/forms/base/demo/boot.js +++ b/public/modules/forms/base/demo/boot.js @@ -8,7 +8,7 @@ angular.module('forms', [ angular.module('NodeForm', [ 'ui.select', 'cgBusy', 'ngSanitize', 'vButton', 'ngResource', 'ui.router', 'ui.bootstrap', 'ui.utils', 'ngRaven', 'forms', - 'ui.select' + 'ui.select' ]); angular.module('forms').factory('Auth', [ diff --git a/public/modules/forms/base/demo/index.html b/public/modules/forms/base/demo/index.html index 648b496a..61083082 100644 --- a/public/modules/forms/base/demo/index.html +++ b/public/modules/forms/base/demo/index.html @@ -39,7 +39,34 @@ diff --git a/public/modules/forms/base/directives/submit-form.client.directive.js b/public/modules/forms/base/directives/submit-form.client.directive.js index 440fc997..043ee96d 100644 --- a/public/modules/forms/base/directives/submit-form.client.directive.js +++ b/public/modules/forms/base/directives/submit-form.client.directive.js @@ -18,9 +18,12 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' } return true; }).length; + + var nb_valid = $filter('formValidity')($scope.myform); $scope.translateAdvancementData = { - done: $filter('formValidity')($scope.myform), - total: form_fields_count + done: nb_valid, + total: form_fields_count, + answers_not_completed: form_fields_count - nb_valid }; $scope.reloadForm = function(){ @@ -114,9 +117,11 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' $scope.selected._id = field_id; $scope.selected.index = field_index; + var nb_valid = $filter('formValidity')($scope.myform); $scope.translateAdvancementData = { - done: $filter('formValidity')($scope.myform), - total: form_fields_count + done: nb_valid, + total: form_fields_count, + answers_not_completed: form_fields_count - nb_valid }; if(animateScroll){ diff --git a/public/modules/forms/base/views/directiveViews/field/legal.html b/public/modules/forms/base/views/directiveViews/field/legal.html index 04fff652..0ee6e101 100644 --- a/public/modules/forms/base/views/directiveViews/field/legal.html +++ b/public/modules/forms/base/views/directiveViews/field/legal.html @@ -31,7 +31,7 @@
Y
- {{ 'LEGAL_ACCEPT' | translate }} + {{ 'LEGAL_ACCEPT' | translate }}
diff --git a/public/modules/forms/base/views/directiveViews/field/textarea.html b/public/modules/forms/base/views/directiveViews/field/textarea.html index 5280d88a..6214fea7 100755 --- a/public/modules/forms/base/views/directiveViews/field/textarea.html +++ b/public/modules/forms/base/views/directiveViews/field/textarea.html @@ -6,11 +6,9 @@ {{field.title}} - optional + {{ 'OPTIONAL' | translate }} -

- {{field.description}} -

+ {{ 'NEWLINE' | translate }}
Press SHIFT+ENTER to add a newline diff --git a/public/modules/forms/base/views/directiveViews/field/yes_no.html b/public/modules/forms/base/views/directiveViews/field/yes_no.html index 244d8d4b..4ebfe0dc 100644 --- a/public/modules/forms/base/views/directiveViews/field/yes_no.html +++ b/public/modules/forms/base/views/directiveViews/field/yes_no.html @@ -34,7 +34,7 @@
Y
- Yes + {{ 'YES' | translate }}
@@ -61,7 +61,7 @@
N
- No + {{ 'NO' | translate }}
diff --git a/public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html b/public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html index 53495188..c2f44b26 100755 --- a/public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html +++ b/public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html @@ -71,6 +71,7 @@ ng-style="{'color':button.color}">
+ {{ 'COMPLETING_NEEDED' | translate:translateAdvancementData }} {{form_fields_count - (myform | formValidity)}} answer(s) need completing
@@ -93,7 +94,7 @@ ng-style="{'color':button.color}"> on-enter-key="goToInvalid()" on-enter-key-disabled="!forms.myForm.$invalid" style="font-size: 1.6em; margin-left: 1em; margin-top: 1em; background-color:#990000; color:white"> - Review + {{ 'REVIEW' | translate }}
"); $templateCache.put("../public/modules/forms/views/list-forms.client.view.html", @@ -53,6 +58,22 @@ angular.module('NodeForm.templates', []).run(['$templateCache', function($templa $templateCache.put("modules/forms/base/views/submit-form.client.view.html", "
"); $templateCache.put("modules/forms/admin/views/adminTabs/analyze.html", +<<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf +======= +======= + "
"); + $templateCache.put("modules/forms/admin/views/list-forms.client.view.html", + "

Create a new form
Name
Language

Created on
"); +<<<<<<< 95d6fb967b8d351fe9e17be40be308a8fe73c55f + $templateCache.put("../public/modules/forms/views/submit-form.client.view.html", + "√
"); + $templateCache.put("../public/modules/forms/views/adminTabs/analyze.html", +======= + $templateCache.put("modules/forms/base/views/submit-form.client.view.html", + "
"); + $templateCache.put("modules/forms/admin/views/adminTabs/analyze.html", +>>>>>>> make it work +>>>>>>> make it work >>>>>>> make it work ""); $templateCache.put("modules/forms/admin/views/adminTabs/configure.html", @@ -65,7 +86,11 @@ angular.module('NodeForm.templates', []).run(['$templateCache', function($templa "
{{$message}}
"); $templateCache.put("modules/forms/admin/views/directiveViews/cgBusy/update-form-message-TypeB.html", "
{{$message}}
"); +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work $templateCache.put("../public/modules/forms/views/directiveViews/entryPage/startPage.html", "

{{pageData.introTitle}}

{{pageData.introParagraph}}

"); $templateCache.put("../public/modules/forms/views/directiveViews/field/date.html", @@ -90,12 +115,22 @@ angular.module('NodeForm.templates', []).run(['$templateCache', function($templa $templateCache.put("../public/modules/forms/views/directiveViews/field/yes_no.html", "

{{index+1}} {{field.title}} optional

{{field.description}}


"); $templateCache.put("../public/modules/forms/views/directiveViews/form/configure-form.client.view.html", +<<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf "

PDF Generation/EMR

PDF Generation/EMR

Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.name}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type


Advanced Settings

Advanced Settings

Form Name
Form Status
Google Analytics Tracking Code
Language
* required
Display Form Footer?
Display Start Page?
"); +======= +======= + $templateCache.put("modules/forms/admin/views/directiveViews/form/configure-form.client.view.html", +>>>>>>> make it work + "

PDF Generation/EMR

PDF Generation/EMR

Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.name}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type


Advanced Settings

Advanced Settings

Form Name
Form Status
Language
* required
Display Form Footer?
Display Start Page?
"); +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f +>>>>>>> make it work $templateCache.put("../public/modules/forms/views/directiveViews/form/edit-form.client.view.html", "

Click to Add New Field

Add New Field

Add Field

Start Page

Preview Start Page

    {{myform.startPage.introTitle}}

    {{myform.startPage.introParagraph}}

Edit Start Page


Intro Title:
Intro Paragraph:
{{ 'ENTER' | translate }}
"); + $templateCache.put("modules/forms/base/views/directiveViews/field/textfield.html", + "

{{field.title}} ({{ 'OPTIONAL' | translate }})

{{ 'ENTER' | translate }}
"); + $templateCache.put("modules/forms/base/views/directiveViews/field/yes_no.html", + "

{{field.title}} *({{ REQUIRED | translate }})

{{field.description}}


"); + $templateCache.put("modules/forms/base/views/directiveViews/form/submit-form.client.view.html", + "
press ENTER

{{ 'ADVANCEMENT' | translate:translateAdvancementData }}

"); + $templateCache.put("modules/users/views/authentication/access-denied.client.view.html", +>>>>>>> make it work "

You need to be logged in to access this page

Login
"); +<<<<<<< adb4e008930e5142044796081f66a1db54906706 $templateCache.put("../public/modules/users/views/authentication/signin.client.view.html", "

Sign into your account

Error:
  or  Sign up
"); $templateCache.put("../public/modules/users/views/authentication/signup-success.client.view.html", +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f "

Signup Successful

You've successfully registered an account at TellForm.

But your account is not activated yet



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

"); $templateCache.put("../public/modules/users/views/authentication/signup.client.view.html", ======= @@ -381,6 +458,15 @@ angular.module('NodeForm.templates', []).run(['$templateCache', function($templa $templateCache.put("modules/users/views/authentication/signup-success.client.view.html", "

Signup Successful

You've successfully registered an account at TellForm.

But your account is not activated yet



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

"); $templateCache.put("modules/users/views/authentication/signup.client.view.html", +>>>>>>> make it work +======= +======= + $templateCache.put("modules/users/views/authentication/signin.client.view.html", + "

Sign into your account

Error:
  or  Sign up
"); + $templateCache.put("modules/users/views/authentication/signup-success.client.view.html", +>>>>>>> make it work + "

Signup Successful

You've successfully registered an account at TellForm.

But your account is not activated yet



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

"); + $templateCache.put("modules/users/views/authentication/signup.client.view.html", >>>>>>> make it work "

Signup with your email

Couldn't submit form due to errors:

"); $templateCache.put("modules/users/views/password/forgot-password.client.view.html", @@ -397,10 +483,16 @@ angular.module('NodeForm.templates', []).run(['$templateCache', function($templa "

Edit your profile

Profile Saved Successfully
Couldn't Save Your Profile.
Error:
First Name
Last Name

Language
Email (also your username)
"); $templateCache.put("modules/users/views/settings/social-accounts.client.view.html", "

Connected social accounts:

Connect other social accounts:

"); +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c $templateCache.put("../public/modules/users/views/verify/resend-verify-email.client.view.html", "

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at polydaic@gmail.com

"); $templateCache.put("../public/modules/users/views/verify/verify-account.client.view.html", +======= + $templateCache.put("modules/users/views/verify/resend-verify-email.client.view.html", + "

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at hi@TellForm.com

"); + $templateCache.put("modules/users/views/verify/verify-account.client.view.html", +>>>>>>> make it work ======= $templateCache.put("modules/users/views/verify/resend-verify-email.client.view.html", "

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at hi@TellForm.com

"); @@ -528,7 +620,11 @@ angular.element(document).ready(function() { angular.bootstrap(document, [ApplicationConfiguration.applicationModuleName]); }); +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work 'use strict'; // Use Application configuration module to register a new module @@ -1341,6 +1437,7 @@ angular.module('core').controller('HomeController', ['$rootScope', '$scope', 'Us 'use strict'; +<<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf <<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 // Forms controller angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope', '$stateParams', '$state', 'Forms', 'CurrentForm', '$http', '$uibModal', 'myForm', @@ -1355,6 +1452,12 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope ======= <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work >>>>>>> make it work $scope.tabData = [ { @@ -1395,7 +1498,13 @@ angular.module('core').service('Menus', [ // Define a set of default roles this.defaultRoles = ['*']; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +<<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf +======= +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work >>>>>>> make it work /* ** DeleteModal Functions @@ -1474,7 +1583,13 @@ angular.module('core').service('Menus', [ return false; }; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +<<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf +======= +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work >>>>>>> make it work $scope.deleteModal.close(); @@ -1524,7 +1639,13 @@ angular.module('core').service('Menus', [ return this.menus[menuId]; }; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +<<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf +======= +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work >>>>>>> make it work var continueUpdate = true; if(!updateImmediately){ @@ -1550,7 +1671,13 @@ angular.module('core').service('Menus', [ delete this.menus[menuId]; }; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +<<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf +======= +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work >>>>>>> make it work $scope.updatePromise = $http.put('/forms/'+$scope.myform._id, {form: $scope.myform}) .then(function(response){ @@ -1575,6 +1702,7 @@ angular.module('core').service('Menus', [ this.addMenuItem = function(menuId, menuItemTitle, menuItemURL, menuItemType, menuItemUIRoute, isPublic, roles, position) { // Validate that the menu exists this.validateMenuExistance(menuId); +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f // Push new menu item this.menus[menuId].items.push({ @@ -1591,11 +1719,33 @@ angular.module('core').service('Menus', [ }); >>>>>>> make it work +======= + + // Push new menu item + this.menus[menuId].items.push({ + title: menuItemTitle, + link: menuItemURL, + menuItemType: menuItemType || 'item', + menuItemClass: menuItemType, + uiRoute: menuItemUIRoute || ('/' + menuItemURL), + isPublic: ((isPublic === null || typeof isPublic === 'undefined') ? this.menus[menuId].isPublic : isPublic), + roles: ((roles === null || typeof roles === 'undefined') ? this.menus[menuId].roles : roles), + position: position || 0, + items: [], + shouldRender: shouldRender + }); +>>>>>>> make it work + +>>>>>>> make it work // Return the menu object return this.menus[menuId]; }; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work } ]); @@ -1681,6 +1831,7 @@ angular.module('forms').run(['Menus', function(){ return function(formObj){ if(formObj && formObj.form_fields && formObj.visible_form_fields){ +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f //get keys var formKeys = Object.keys(formObj); @@ -1697,6 +1848,24 @@ angular.module('forms').run(['Menus', return !!(field.fieldValue); } +======= + + //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); + } + +>>>>>>> make it work }).length; return valid_count - (formObj.form_fields.length - formObj.visible_form_fields.length); } @@ -1765,6 +1934,7 @@ angular.module('forms').run(['Menus', // Setting up route angular.module('forms').config(['$stateProvider', +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c function removeDateFieldsFunc(o) { var clone = _.clone(o); @@ -1774,6 +1944,8 @@ function removeDateFieldsFunc(o) { delete clone[k]; } ======= +======= +>>>>>>> make it work function($stateProvider) { // Forms state routing $stateProvider. @@ -1821,6 +1993,7 @@ function removeDateFieldsFunc(o) { url: '/create', templateUrl: 'modules/forms/admin/views/adminTabs/create.html' }); +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f >>>>>>> make it work } ]); @@ -2097,6 +2270,189 @@ angular.module('users').controller('AuthenticationController', ['$scope', '$loca } ]); >>>>>>> make it work +======= + } +]); + +'use strict'; + +// Config HTTP Error Handling +angular.module('users').config(['$httpProvider', + function($httpProvider) { + $httpProvider.interceptors.push(["$q", "$location", function($q, $location) { + return { + responseError: function(response) { + if( $location.path() !== '/users/me' && response.config){ + if(response.config.url !== '/users/me'){ + console.log('intercepted rejection of ', response.config.url, response.status); + if (response.status === 401) { + // save the current location so that login can redirect back + $location.nextAfterLogin = $location.path(); + $location.path('/signin'); + }else if(response.status === 403){ + $location.path('/access_denied'); + } + } + + } + return $q.reject(response); + } + }; + }]); +}]); +'use strict'; + +// Setting up route +angular.module('users').config(['$stateProvider', + function($stateProvider) { + + var checkLoggedin = function($q, $timeout, $state, User, Auth) { + var deferred = $q.defer(); + + // console.log(Auth.ensureHasCurrentUser(User)); + + if (Auth.currentUser && Auth.currentUser.email) { + $timeout(deferred.resolve); + } + else { + Auth.currentUser = User.getCurrent(function() { + Auth.login(); + $timeout(deferred.resolve()); + }, + function() { + Auth.logout(); + $timeout(deferred.reject()); + $state.go('sigin', {reload: true}); + }); + } + + return deferred.promise; + }; + checkLoggedin.$inject = ["$q", "$timeout", "$state", "User", "Auth"]; + + // Users state routing + $stateProvider. + state('profile', { + resolve: { + loggedin: checkLoggedin + }, + url: '/settings/profile', + templateUrl: 'modules/users/views/settings/edit-profile.client.view.html' + }). + state('password', { + resolve: { + loggedin: checkLoggedin + }, + url: '/settings/password', + templateUrl: 'modules/users/views/settings/change-password.client.view.html' + }). + state('accounts', { + resolve: { + loggedin: checkLoggedin + }, + url: '/settings/accounts', + templateUrl: 'modules/users/views/settings/social-accounts.client.view.html' + }). + + state('signup', { + url: '/signup', + templateUrl: 'modules/users/views/authentication/signup.client.view.html' + }). + state('signup-success', { + url: '/signup-success', + templateUrl: 'modules/users/views/authentication/signup-success.client.view.html' + }). + state('signin', { + url: '/signin', + templateUrl: 'modules/users/views/authentication/signin.client.view.html' + }). + state('access_denied', { + url: '/access_denied', + templateUrl: 'modules/users/views/authentication/access-denied.client.view.html' + }). + + state('resendVerifyEmail', { + url: '/verify', + templateUrl: 'modules/users/views/verify/resend-verify-email.client.view.html' + }). + state('verify', { + url: '/verify/:token', + templateUrl: 'modules/users/views/verify/verify-account.client.view.html' + }). + + state('forgot', { + url: '/password/forgot', + templateUrl: 'modules/users/views/password/forgot-password.client.view.html' + }). + state('reset-invalid', { + url: '/password/reset/invalid', + templateUrl: 'modules/users/views/password/reset-password-invalid.client.view.html' + }). + state('reset-success', { + url: '/password/reset/success', + templateUrl: 'modules/users/views/password/reset-password-success.client.view.html' + }). + state('reset', { + url: '/password/reset/:token', + templateUrl: 'modules/users/views/password/reset-password.client.view.html' + }); + } +]); +'use strict'; + +angular.module('users').controller('AuthenticationController', ['$scope', '$location', '$state', '$rootScope', 'User', 'Auth', + function($scope, $location, $state, $rootScope, User, Auth) { + + $scope = $rootScope; + $scope.credentials = {}; + $scope.error = ''; + + $scope.signin = function() { + $scope.credentials.email = $scope.credentials.username; + User.login($scope.credentials).then( + function(response) { + Auth.login(response); + $scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User); + + if($state.previous.name !== 'home' && $state.previous.name !== 'verify' && $state.previous.name !== ''){ + $state.go($state.previous.name); + }else{ + $state.go('listForms'); + } + }, + function(error) { + $rootScope.user = Auth.ensureHasCurrentUser(User); + $scope.user = $rootScope.user; + + $scope.error = error; + console.log('loginError: '+error); + } + ); + }; + + $scope.signup = function() { + console.log($scope.credentials); + User.signup($scope.credentials).then( + function(response) { + console.log('signup-success'); + $state.go('signup-success'); + }, + function(error) { + console.log('Error: '); + console.log(error); + if(error) { + $scope.error = error; + console.log(error); + }else { + console.log('No response received'); + } + } + ); + }; + + } +]); +>>>>>>> make it work 'use strict'; @@ -2204,7 +2560,11 @@ angular.module('users').controller('SettingsController', ['$scope', '$rootScope' }); }; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work console.log($scope.log); if (!$scope.$$phase && !$scope.$digest) { $scope.$apply(); @@ -2229,6 +2589,7 @@ angular.module('users').controller('VerifyController', ['$scope', '$state', '$ro $scope.isResetSent = false; $scope.credentials = {}; $scope.error = ''; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f // Submit forgotten password account id $scope.resendVerifyEmail = function() { @@ -2249,6 +2610,28 @@ angular.module('users').controller('VerifyController', ['$scope', '$state', '$ro ); }; +======= + + // Submit forgotten password account id + $scope.resendVerifyEmail = function() { + // console.log($scope.credentials); + // console.log($scope.credentials.email); + User.resendVerifyEmail($scope.credentials.email).then( + function(response){ + console.log(response); + $scope.success = response.message; + $scope.credentials = null; + $scope.isResetSent = true; + }, + function(error){ + $scope.error = error; + $scope.credentials.email = null; + $scope.isResetSent = false; + } + ); + }; + +>>>>>>> make it work //Validate Verification Token $scope.validateVerifyToken = function() { if($stateParams.token){ @@ -2273,7 +2656,11 @@ angular.module('users').controller('VerifyController', ['$scope', '$state', '$ro ]); 'use strict'; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormFields', function ($rootScope, FormFields) { return { @@ -2391,7 +2778,11 @@ angular.module('users').factory('Auth', ['$window', }; return service; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work if( $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id) ){ currentFields = _(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id]); } @@ -2402,7 +2793,11 @@ angular.module('users').factory('Auth', ['$window', 'use strict'; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work /* ** FormFields (ui-sortable) drag-and-drop configuration */ @@ -2464,7 +2859,11 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' function($window, $q, $timeout, $http, $state) { >>>>>>> make it work +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work for(var i = 0; i < $scope.addField.types.length; i++){ if($scope.addField.types[i].name === fieldType){ $scope.addField.types[i].lastAddedID++; @@ -2515,7 +2914,11 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' }, login: function(credentials) { +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work //Delete field $scope.myform.form_fields.splice(field_index, 1); }; @@ -2584,7 +2987,11 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' deferred.reject(error); }); +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work // add new option to the field $scope.addOption = function(field_index){ var currField = $scope.myform.form_fields[field_index]; @@ -2620,7 +3027,11 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' }, >>>>>>> make it work +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work var newOption = { 'option_id' : Math.floor(100000*Math.random()), 'option_title' : 'Option '+lastOptionID, @@ -2652,6 +3063,7 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' 'use strict'; +<<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf <<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 // decides whether field options block will be shown (true for dropdown and radio fields) $scope.showRatingOptions = function (field){ @@ -2665,7 +3077,13 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' }] ======= +======= +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f +>>>>>>> make it work <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work }] >>>>>>> make it work @@ -2752,7 +3170,11 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope } }; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work // console.log('before textField2: '+data[0].form_fields[1].fieldValue); //Iterate through form's submissions @@ -2776,7 +3198,11 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope var form_id = $scope.myform._id; if(!form_id) throw new Error('Error - removeCurrentForm(): $scope.myform._id does not exist'); +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work // console.log('form submissions successfully fetched'); // console.log( JSON.parse(JSON.stringify($scope.submissions)) ) ; // console.log( JSON.parse(JSON.stringify($scope.myform.form_fields)) ); @@ -2800,7 +3226,11 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope } }; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work $http({ url: '/forms/'+$scope.myform._id+'/submissions', method: 'DELETE', data: {deleted_submissions: delete_ids}, @@ -2829,7 +3259,11 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope 'json': 'json', 'csv': 'csv' }; +======= + // Update existing Form + $scope.update = $rootScope.update = function(updateImmediately, cb){ +<<<<<<< 95d6fb967b8d351fe9e17be40be308a8fe73c55f console.log($scope.table.rows); angular.element('#table-submission-data').tableExport({type: type, escape:false}); @@ -2842,6 +3276,7 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope */ }; ======= +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f // Update existing Form $scope.update = $rootScope.update = function(updateImmediately, cb){ @@ -2855,6 +3290,19 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope var err = null; >>>>>>> make it work +======= + var continueUpdate = true; + if(!updateImmediately){ + continueUpdate = !$rootScope.saveInProgress; + } +>>>>>>> make it work +>>>>>>> make it work + + //Update form **if we are not currently updating** or if **shouldUpdateNow flag is set** + if(continueUpdate){ + var err = null; + +>>>>>>> make it work if(!updateImmediately){ $rootScope.saveInProgress = true; } $scope.updatePromise = $http.put('/forms/'+$scope.myform._id, {form: $scope.myform}) @@ -2931,7 +3379,11 @@ angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope }); }; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work var getTemplateUrl = function(fieldType) { var type = fieldType; var templateUrl = 'modules/forms/views/directiveViews/field/'; @@ -3073,7 +3525,11 @@ angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope ]); 'use strict'; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< 95d6fb967b8d351fe9e17be40be308a8fe73c55f +>>>>>>> make it work angular.module('forms').directive('keyToOption', function(){ return { restrict: 'A', @@ -3342,7 +3798,11 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' } >>>>>>> make it work +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work //console.log($scope.forms.myForm); var field_id; var field_index; @@ -3403,6 +3863,7 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' savePromise = $timeout(function() { debounceSave(); }); +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f } //If we are finished rendering then form saving should be finished else if($rootScope.finishedRender && $rootScope.saveInProgress){ @@ -3415,7 +3876,25 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' $rootScope.setDropdownOption = function(){ console.log('setDropdownOption index: '); }; +======= + } + //If we are finished rendering then form saving should be finished + else if($rootScope.finishedRender && $rootScope.saveInProgress){ + $rootScope.saveInProgress = false; + } +<<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf +>>>>>>> make it work +======= + }, true); + }); + } + }; + +}]); +>>>>>>> make it work + +<<<<<<< 95d6fb967b8d351fe9e17be40be308a8fe73c55f >>>>>>> make it work /* ** Field Controls @@ -3443,6 +3922,7 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' //console.log('field_index: '+field_index); //console.log($scope.selected); ======= +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f }, true); }); } @@ -3452,6 +3932,11 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' 'use strict'; +======= +'use strict'; +>>>>>>> make it work + +>>>>>>> make it work angular.module('forms').directive('configureFormDirective', ['$rootScope', '$http', 'Upload', 'CurrentForm', function ($rootScope, $http, Upload, CurrentForm) { return { @@ -3473,6 +3958,7 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt $scope.log = ''; $scope.pdfLoading = false; $scope.languages = $rootScope.languages; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f >>>>>>> make it work this._current_upload = null; @@ -3480,6 +3966,10 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt $scope.update = $rootScope.update; <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= + +<<<<<<< 95d6fb967b8d351fe9e17be40be308a8fe73c55f +>>>>>>> make it work if(animateScroll){ $scope.noscroll=true; setTimeout(function() { @@ -3512,7 +4002,15 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt SendVisitorData.send($scope.myform, getActiveField(), TimeCounter.getTimeElapsed()); }; +======= + this._current_upload = null; + $scope.resetForm = $rootScope.resetForm; + $scope.update = $rootScope.update; + this._unbindedPdfFields = $scope.pdfFields; +>>>>>>> make it work + +<<<<<<< adb4e008930e5142044796081f66a1db54906706 $rootScope.nextField = $scope.nextField = function(){ //console.log('nextfield'); //console.log($scope.selected.index); @@ -3529,7 +4027,14 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt $rootScope.setActiveField(selected_id, selected_index, true); } }; +======= + //DAVID: TODO: finish this so we can create a Form.pdfFieldMap + // $scope.getUnbindedPdfFields = function(fieldType){ + // this._unbindedPdfFields = $scope.pdfFields + // } +>>>>>>> make it work +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f $rootScope.prevField = $scope.prevField = function(){ if($scope.selected.index > 0){ var selected_index = $scope.selected.index - 1; @@ -3546,9 +4051,21 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt if($scope.myform.visible_form_fields.length > 0){ $scope.selected._id = $scope.myform.visible_form_fields[0]._id; } +======= + //PDF Functions + $scope.cancelUpload = function(){ + this._current_upload.abort(); + $scope.pdfLoading = false; + $scope.removePDF(); +>>>>>>> make it work }; +<<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf $rootScope.goToInvalid = $scope.goToInvalid = function() { +======= +<<<<<<< 95d6fb967b8d351fe9e17be40be308a8fe73c55f + $scope.goToInvalid = function() { +>>>>>>> make it work document.querySelectorAll('.ng-invalid.focusOn')[0].focus(); }; @@ -3568,6 +4085,7 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt // this._unbindedPdfFields = $scope.pdfFields // } +<<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf <<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 for(var i=0; i < $scope.myform.form_fields.length; i++){ if($scope.myform.form_fields[i].fieldType === 'dropdown' && !$scope.myform.form_fields[i].deletePreserved){ @@ -3590,6 +4108,9 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt }); }, 500); ======= +======= +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f +>>>>>>> make it work //PDF Functions $scope.cancelUpload = function(){ this._current_upload.abort(); @@ -3602,10 +4123,24 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt $scope.myform.isGenerated = false; $scope.myform.autofillPDFs = false; +======= + setTimeout(function () { + $scope.submitPromise = $http.post('/forms/' + $scope.myform._id, form) + .success(function (data, status, headers) { + //console.log('form submitted successfully'); +======= + $scope.removePDF = function(){ + $scope.myform.pdf = null; + $scope.myform.isGenerated = false; + $scope.myform.autofillPDFs = false; +>>>>>>> make it work + +>>>>>>> make it work console.log('form.pdf: '+$scope.myform.pdf+' REMOVED'); }; $scope.uploadPDF = function(file) { +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f >>>>>>> make it work if (file) { @@ -3864,6 +4399,92 @@ angular.module('forms').service('TimeCounter', [ >>>>>>> make it work <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= + + if (file) { + console.log(file); + + Upload.upload({ + url: '/upload/pdf', + data: { + 'user': $scope.user, + file: file + } + }).then(function (resp) { + var data = resp.data; + $scope.log = 'file ' + data.originalname + ' uploaded as ' + data.filename + '. JSON: ' + JSON.stringify(data) + '\n' + $scope.log; + $scope.myform.pdf = angular.fromJson(angular.toJson(data)); + + //console.log($scope.myform.pdf); + + $scope.pdfLoading = false; + + console.log($scope.log); + if (!$scope.$$phase && !$scope.$digest) { + $scope.$apply(); + } + }, function(resp){ + $scope.pdfLoading = false; + console.log('Error occured during upload.\n'); + console.log(resp.status); + }, function (evt) { + var progressPercentage = parseInt(100.0 * evt.loaded / evt.total, 10); + $scope.log = 'progress: ' + progressPercentage + '% ' + + evt.config.data.file.name + '\n' + $scope.log; + + console.log($scope.log); + + $scope.pdfLoading = true; + }); + } + }; + + }] + }; + } +]); + +'use strict'; + +angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormFields', + function ($rootScope, FormFields) { + return { + templateUrl: 'modules/forms/admin/views/directiveViews/form/edit-form.client.view.html', + restrict: 'E', + scope: { + myform:'=' + }, + controller: ["$scope", function($scope){ + var field_ids = _($scope.myform.form_fields).pluck('_id'); + for(var i=0; i FormFields + $scope.oscarFieldsLeft = function(field_id){ + +<<<<<<< 95d6fb967b8d351fe9e17be40be308a8fe73c55f +>>>>>>> make it work // Config HTTP Error Handling angular.module('users').config(['$httpProvider', function($httpProvider) { @@ -3892,6 +4513,7 @@ angular.module('users').config(['$httpProvider', 'use strict'; ======= +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f // add new Button to the startPage $scope.addButton = function(){ @@ -3905,12 +4527,116 @@ angular.module('users').config(['$httpProvider', $scope.myform.startPage.buttons.push(newButton); }; +======= + if($scope.myform && $scope.myform.plugins.oscarhost.settings.validFields.length > 0){ + if(!$scope.myform.plugins.oscarhost.settings.fieldMap) $scope.myform.plugins.oscarhost.settings.fieldMap = {}; + + var oscarhostFields = $scope.myform.plugins.oscarhost.settings.validFields; + var currentFields = _($scope.myform.plugins.oscarhost.settings.fieldMap).invert().keys().value(); +>>>>>>> make it work + + if( $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id) ){ + currentFields = _(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id]); + } + + //Get all oscarhostFields that haven't been mapped to a formfield + return _(oscarhostFields).difference(currentFields).value(); + } + return []; + }; + + /* + ** FormFields (ui-sortable) drag-and-drop configuration + */ + $scope.dropzone = { + handle: ' .handle', + containment: '.dropzoneContainer', + cursor: 'grabbing' + }; + + /* + ** Field CRUD Methods + */ + // Add a new field + $scope.addNewField = function(modifyForm, fieldType){ + + // incr field_id counter + $scope.addField.lastAddedID++; + var fieldTitle; + + for(var i = 0; i < $scope.addField.types.length; i++){ + if($scope.addField.types[i].name === fieldType){ + $scope.addField.types[i].lastAddedID++; + fieldTitle = $scope.addField.types[i].value+$scope.addField.types[i].lastAddedID; + break; + } + } + var newField = { + title: fieldTitle, + fieldType: fieldType, + fieldValue: '', + required: true, + disabled: false, + deletePreserved: false + }; + // console.log('\n\n---------\nAdded field CLIENT'); + // console.log(newField); + // newField._id = _.uniqueId(); + + // put newField into fields array + if(modifyForm){ + $scope.myform.form_fields.push(newField); + } + return newField; + }; + + // Delete particular field on button click + $scope.deleteField = function (field_index){ + + //Delete field from field map + var currFieldId = $scope.myform.form_fields[field_index]._id; + if($scope.myform.hasOwnProperty('plugins.oscarhost.baseUrl')) delete $scope.myform.plugins.oscarhost.settings.fieldMap[currFieldId]; + + //Delete field + $scope.myform.form_fields.splice(field_index, 1); + }; + $scope.duplicateField = function (field_index){ + var currField = _.cloneDeep($scope.myform.form_fields[field_index]); + currField._id = 'cloned'+_.uniqueId(); + currField.title += ' copy'; + + //Insert field at selected index + $scope.myform.form_fields.splice(field_index+1, 0, currField); + }; + + + /* + ** startPage Button Methods + */ + + // add new Button to the startPage + $scope.addButton = function(){ + + var newButton = {}; + newButton.bgColor = '#ddd'; + newButton.color = '#ffffff'; + newButton.text = 'Button'; + newButton._id = Math.floor(100000*Math.random()); + + $scope.myform.startPage.buttons.push(newButton); + }; + +>>>>>>> make it work // delete particular Button from startPage $scope.deleteButton = function(button){ var currID; for(var i = 0; i < $scope.myform.startPage.buttons.length; i++){ +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work //console.log(Auth.ensureHasCurrentUser(User)); if (Auth.currentUser && Auth.currentUser.email) { @@ -3931,6 +4657,7 @@ angular.module('users').config(['$httpProvider', ======= currID = $scope.myform.startPage.buttons[i]._id; console.log(currID); +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f if(currID === button._id){ $scope.myform.startPage.buttons.splice(i, 1); @@ -3942,6 +4669,19 @@ angular.module('users').config(['$httpProvider', <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= + + if(currID === button._id){ + $scope.myform.startPage.buttons.splice(i, 1); + break; + } + } + }; +>>>>>>> make it work + + +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work var checkSignupDisabled = function($window, $timeout, $q) { var deferred = $q.defer(); if($window.signupDisabled) { @@ -3998,6 +4738,7 @@ angular.module('users').config(['$httpProvider', url: '/access_denied', templateUrl: 'modules/users/views/authentication/access-denied.client.view.html' }). +<<<<<<< 95d6fb967b8d351fe9e17be40be308a8fe73c55f state('verify', { resolve: { isDisabled: checkSignupDisabled @@ -4023,12 +4764,24 @@ angular.module('users').config(['$httpProvider', state('reset-success', { url: '/password/reset/success', templateUrl: 'modules/users/views/password/reset-password-success.client.view.html' +======= + state('resendVerifyEmail', { + url: '/verify', + templateUrl: 'modules/users/views/verify/resend-verify-email.client.view.html' +>>>>>>> make it work }). +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f state('reset', { url: '/password/reset/:token', templateUrl: 'modules/users/views/password/reset-password.client.view.html' }); } +======= + state('verify', { + url: '/verify/:token', + templateUrl: 'modules/users/views/verify/verify-account.client.view.html' + }). +>>>>>>> make it work ======= /* ** Field Option Methods @@ -4066,6 +4819,10 @@ angular.module('users').config(['$httpProvider', // delete particular option $scope.deleteOption = function (field_index, option){ var currField = $scope.myform.form_fields[field_index]; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f +======= +>>>>>>> make it work +>>>>>>> make it work if(currField.fieldType === 'checkbox' || currField.fieldType === 'dropdown' || currField.fieldType === 'radio'){ for(var i = 0; i < currField.fieldOptions.length; i++){ @@ -4092,6 +4849,9 @@ angular.module('users').config(['$httpProvider', }; } +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f +>>>>>>> make it work +======= >>>>>>> make it work ]); @@ -4470,7 +5230,11 @@ angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$root var fieldType = scope.field.fieldType; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work logout: function() { $window.user = null; userState.isLoggedIn = false; @@ -4596,7 +5360,11 @@ angular.module('forms').directive('submitFormDirective', }; $scope.setActiveField($scope.myform.visible_form_fields[0]._id, 0, false); +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work return deferred.promise; }, logout: function() { @@ -4613,7 +5381,11 @@ angular.module('forms').directive('submitFormDirective', $scope.fieldTop = elemBox.top; $scope.fieldBottom = elemBox.bottom; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work return deferred.promise; }, signup: function(credentials) { @@ -4668,7 +5440,11 @@ angular.module('forms').directive('submitFormDirective', $scope.selected._id = field_id; $scope.selected.index = field_index; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work resendVerifyEmail: function(_email) { ======= $scope.translateAdvancementData = { @@ -4703,7 +5479,11 @@ angular.module('forms').directive('submitFormDirective', } }; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work validateVerifyToken: function(token) { ======= $rootScope.prevField = $scope.prevField = function(){ @@ -4762,7 +5542,11 @@ angular.module('forms').directive('submitFormDirective', 'use strict'; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work return deferred.promise; } ======= @@ -4774,7 +5558,11 @@ angular.module('forms').service('CurrentForm', //Private variables var _form = {}; +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +>>>>>>> make it work return userService; } diff --git a/public/dist/application.min.js b/public/dist/application.min.js index e09f9cd7..9493be90 100644 --- a/public/dist/application.min.js +++ b/public/dist/application.min.js @@ -1,15 +1,32 @@ +<<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf <<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 function removeDateFieldsFunc(o){function eachObject(v,k){"lastModified"!==k&&"created"!==k||delete clone[k]}for(var clone=_.clone(o),i=0;i'),$templateCache.put("../public/modules/core/views/home.client.view.html",'

Craft beautiful forms in seconds.

Create your next ______.

Tell a story with a form.

'),$templateCache.put("../public/modules/forms/views/admin-form.client.view.html",'
'),$templateCache.put("../public/modules/forms/views/list-forms.client.view.html",'

Create a new form
Name
Language

'),$templateCache.put("../public/modules/forms/views/submit-form.client.view.html","
"),$templateCache.put("../public/modules/forms/views/adminTabs/analyze.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/configure.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/create.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/design.html",'
Background Color
Question Text Color
Answer Text Color
Button Background Color
Button Text Color
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeA.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/entryPage/startPage.html",'

{{pageData.introTitle}}

{{pageData.introParagraph}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/date.html",'

{{index+1}} {{field.title}} optional

{{field.description}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/dropdown.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/hidden.html",''),$templateCache.put("../public/modules/forms/views/directiveViews/field/legal.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/radio.html",'

{{index+1}} {{field.title}} optional

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/rating.html",'

{{index+1}} {{field.title}} optional

{{field.description}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/statement.html",'

{{field.title}}

{{field.description}}

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textarea.html",'

{{index+1}} {{field.title}} optional

{{field.description}}

Press SHIFT+ENTER to add a newline
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textfield.html",'

{{index+1}} {{field.title}} (optional)

{{field.description}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/yes_no.html",'

{{index+1}} {{field.title}} optional

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/form/configure-form.client.view.html",'
Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.name}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type
Form Name
Form Status
Google Analytics Tracking Code
Language
* required
Display Form Footer?
Display Start Page?
'), $templateCache.put("../public/modules/forms/views/directiveViews/form/edit-form.client.view.html",'

Edit Start Page


Intro Title:
Intro Paragraph:
\n
\n\n

\n
\n
Options:
\n
\n
\n \n\n \n \n \n
\n
\n \n
\n
\n
\n\n\n

\n
\n
Number of Steps:
\n
\n \n
\n
\n
Shape:
\n
\n \n
\n
\n\n

\n\n
\n
Required:
\n
\n \n\n \n
\n
\n\n
\n
Disabled:
\n
\n \n\n \n
\n
\n\n
\n \n\n
\n
\n

\n Click on Fields to add them here\n

\n
\n
\n\n
\n \n
\n\n \n \n\n \n
\n
\n\n'),$templateCache.put("../public/modules/forms/views/directiveViews/form/edit-submissions-form.client.view.html",'
Total Views: {{myform.analytics.views}}
Submissions: {{myform.analytics.submissions}}
Conversion Rate: {{myform.analytics.conversionRate}}%

Field Title
Field Views
User dropoff rate at this field
{{fieldStats.field.title}}
{{fieldStats.totalViews}}
{{fieldStats.dropoffRate}}%

#{{value.title}}OscarEMR User ProfilePercentage CompleteTime ElapsedDeviceLocationIP AddressDate Submitted (UTC)Generated PDF
{{$index+1}}{{field.fieldValue.option_value}} {{field.fieldValue}}User Profile #{{row.oscarDemoNum}}{{row.percentageComplete}}%{{row.timeElapsed}}{{row.device.name}}, {{row.device.type}}{{row.geoLocation.city}}, {{row.geoLocation.country}}{{row.ipAddr}}{{row.created | date:\'yyyy-MM-dd HH:mm:ss\'}}Generated PDF
'),$templateCache.put("../public/modules/forms/views/directiveViews/form/submit-form.client.view.html",'
{{form_fields_count - (myform | formValidity)}} answer(s) need completing
'),$templateCache.put("../public/modules/users/views/authentication/access-denied.client.view.html",'

You need to be logged in to access this page

Login
'),$templateCache.put("../public/modules/users/views/authentication/signin.client.view.html",'

Sign into your account

'),$templateCache.put("../public/modules/users/views/authentication/signup-success.client.view.html",''),$templateCache.put("../public/modules/users/views/authentication/signup.client.view.html",''),$templateCache.put("../public/modules/users/views/password/forgot-password.client.view.html",'

Restore your password

Enter your account email.

'),$templateCache.put("../public/modules/users/views/password/reset-password-invalid.client.view.html",'

Password reset is invalid

Ask for a new password reset
'),$templateCache.put("../public/modules/users/views/password/reset-password-success.client.view.html",'

Password successfully reset

Continue to home page
'),$templateCache.put("../public/modules/users/views/password/reset-password.client.view.html",'

Reset your password

'),$templateCache.put("../public/modules/users/views/settings/change-password.client.view.html",'

Change your password

'), $templateCache.put("../public/modules/users/views/settings/edit-profile.client.view.html",'

Edit your profile

'),$templateCache.put("../public/modules/users/views/settings/social-accounts.client.view.html",'

Connected social accounts:

Connect other social accounts:

'),$templateCache.put("../public/modules/users/views/verify/resend-verify-email.client.view.html",'

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at polydaic@gmail.com

'),$templateCache.put("../public/modules/users/views/verify/verify-account.client.view.html",'

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
')}]);var ApplicationConfiguration=function(){var applicationModuleName="NodeForm",applicationModuleVendorDependencies=["duScroll","ui.select","cgBusy","ngSanitize","vButton","ngResource","NodeForm.templates","ui.router","ui.bootstrap","ui.utils"],registerModule=function(moduleName,dependencies){angular.module(moduleName,dependencies||[]),angular.module(applicationModuleName).requires.push(moduleName)};return{applicationModuleName:applicationModuleName,applicationModuleVendorDependencies:applicationModuleVendorDependencies,registerModule:registerModule}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function($locationProvider){$locationProvider.hashPrefix("!")}]),angular.module(ApplicationConfiguration.applicationModuleName).constant("APP_PERMISSIONS",{viewAdminSettings:"viewAdminSettings",editAdminSettings:"editAdminSettings",editForm:"editForm",viewPrivateForm:"viewPrivateForm"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("USER_ROLES",{admin:"admin",normal:"user",superuser:"superuser"}),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","$state","$stateParams",function($rootScope,Auth,$state,$stateParams){$rootScope.$state=$state,$rootScope.$stateParams=$stateParams,$rootScope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState){$state.previous=fromState;var statesToIgnore=["home","signin","resendVerifyEmail","verify","signup","signup-success","forgot","reset-invalid","reset","reset-success"];statesToIgnore.indexOf(toState.name)>0?Auth.isAuthenticated()&&(event.preventDefault(),$state.go("listForms")):"access_denied"===toState.name||Auth.isAuthenticated()||"submitForm"===toState.name||(console.log("go to signup"),event.preventDefault(),$state.go("listForms"))})}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","User","Authorizer","$state","$stateParams",function($rootScope,Auth,User,Authorizer,$state,$stateParams){$rootScope.$on("$stateChangeStart",function(event,next){var authenticator,permissions,user;permissions=next&&next.data&&next.data.permissions?next.data.permissions:null,Auth.ensureHasCurrentUser(User),user=Auth.currentUser,user&&(authenticator=new Authorizer(user),null!=permissions&&(authenticator.canAccess(permissions)||(event.preventDefault(),$state.go("access_denied"))))})}]),angular.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),ApplicationConfiguration.registerModule("core",["users"]),ApplicationConfiguration.registerModule("forms",["ngFileUpload","ui.router.tabs","colorpicker.module","ui.date","ui.sortable","angular-input-stars","users"]),ApplicationConfiguration.registerModule("users"),angular.module("core").config(["$stateProvider","$urlRouterProvider",function($stateProvider,$urlRouterProvider,Authorization){$urlRouterProvider.otherwise("/forms")}]),angular.module("core").controller("HeaderController",["$rootScope","$scope","Menus","$state","Auth","User","$window",function($rootScope,$scope,Menus,$state,Auth,User,$window){$rootScope.signupDisabled=$window.signupDisabled,$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.authentication=$rootScope.authentication=Auth,$rootScope.languages=$scope.languages=["english","french","spanish"],$scope.isCollapsed=!1,$rootScope.hideNav=!1,$scope.menu=Menus.getMenu("topbar"),$scope.signout=function(){var promise=User.logout();promise.then(function(){Auth.logout(),Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user=null,$state.go("listForms")},function(reason){console.log("Logout Failed: "+reason)})},$scope.toggleCollapsibleMenu=function(){$scope.isCollapsed=!$scope.isCollapsed},$scope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState,fromParams){$scope.isCollapsed=!1,$rootScope.hideNav=!1,angular.isDefined(toState.data)&&angular.isDefined(toState.data.hideNav)&&($rootScope.hideNav=toState.data.hideNav)})}]),angular.module("core").controller("HomeController",["$rootScope","$scope","User","$state",function($rootScope,$scope,User,$state){$scope=$rootScope}]),angular.module("core").service("Menus",[function(){this.defaultRoles=["*"],this.menus={};var shouldRender=function(user){if(!user)return this.isPublic;if(~this.roles.indexOf("*"))return!0;for(var userRoleIndex in user.roles)for(var roleIndex in this.roles)if(console.log(this.roles[roleIndex]),console.log(this.roles[roleIndex]===user.roles[userRoleIndex]),this.roles[roleIndex]===user.roles[userRoleIndex])return!0;return!1};this.validateMenuExistance=function(menuId){if(menuId&&menuId.length){if(this.menus[menuId])return!0;throw new Error("Menu does not exists")}throw new Error("MenuId was not provided")},this.getMenu=function(menuId){return this.validateMenuExistance(menuId),this.menus[menuId]},this.addMenu=function(menuId,isPublic,roles){return this.menus[menuId]={isPublic:isPublic||!1,roles:roles||this.defaultRoles,items:[],shouldRender:shouldRender},this.menus[menuId]},this.removeMenu=function(menuId){this.validateMenuExistance(menuId),delete this.menus[menuId]},this.addMenuItem=function(menuId,menuItemTitle,menuItemURL,menuItemType,menuItemUIRoute,isPublic,roles,position){return this.validateMenuExistance(menuId),this.menus[menuId].items.push({title:menuItemTitle,link:menuItemURL,menuItemType:menuItemType||"item",menuItemClass:menuItemType,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].roles:roles,position:position||0,items:[],shouldRender:shouldRender}),this.menus[menuId]},this.addSubMenuItem=function(menuId,rootMenuItemURL,menuItemTitle,menuItemURL,menuItemUIRoute,isPublic,roles,position){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===rootMenuItemURL&&this.menus[menuId].items[itemIndex].items.push({title:menuItemTitle,link:menuItemURL,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].items[itemIndex].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].items[itemIndex].roles:roles,position:position||0,shouldRender:shouldRender});return this.menus[menuId]},this.removeMenuItem=function(menuId,menuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===menuItemURL&&this.menus[menuId].items.splice(itemIndex,1);return this.menus[menuId]},this.removeSubMenuItem=function(menuId,submenuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)for(var subitemIndex in this.menus[menuId].items[itemIndex].items)this.menus[menuId].items[itemIndex].items[subitemIndex].link===submenuItemURL&&this.menus[menuId].items[itemIndex].items.splice(subitemIndex,1);return this.menus[menuId]},this.addMenu("topbar",!1,["*"]),this.addMenu("bottombar",!1,["*"])}]),function(){"use strict";function Socket($timeout,$window){function connect(url){service.socket=io()}function emit(eventName,data){service.socket&&service.socket.emit(eventName,data)}function on(eventName,callback){service.socket&&service.socket.on(eventName,function(data){$timeout(function(){callback(data)})})}function removeListener(eventName){service.socket&&service.socket.removeListener(eventName)}var service={connect:connect,emit:emit,on:on,removeListener:removeListener,socket:null};return console.log("https://"+window.location.hostname+":"+$window.socketPort),connect("https://"+window.location.hostname+":"+$window.socketPort),service}angular.module("core").factory("Socket",Socket),Socket.$inject=["$timeout","$window"]}(),angular.module("forms").run(["Menus",function(Menus){Menus.addMenuItem("topbar","My Forms","forms","","/forms",!1)}]).filter("formValidity",function(){return function(formObj){if(formObj&&formObj.form_fields&&formObj.visible_form_fields){var formKeys=Object.keys(formObj),fields=(formKeys.filter(function(key){return"$"!==key[0]}),formObj.form_fields),valid_count=fields.filter(function(field){return"object"==typeof field&&"statement"!==field.fieldType&&"rating"!==field.fieldType?!!field.fieldValue:void 0}).length;return valid_count-(formObj.form_fields.length-formObj.visible_form_fields.length)}return 0}}).config(["$provide",function($provide){$provide.decorator("accordionDirective",["$delegate",function($delegate){var directive=$delegate[0];return directive.replace=!0,$delegate}])}]),angular.module("forms").config(["$stateProvider",function($stateProvider){$stateProvider.state("listForms",{url:"/forms",templateUrl:"modules/forms/views/list-forms.client.view.html"}).state("submitForm",{url:"/forms/:formId",templateUrl:"modules/forms/views/submit-form.client.view.html",data:{hideNav:!0},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"SubmitFormController",controllerAs:"ctrl"}).state("viewForm",{url:"/forms/:formId/admin",templateUrl:"modules/forms/views/admin-form.client.view.html",data:{permissions:["editForm"]},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"AdminFormController"}).state("viewForm.configure",{url:"/configure",templateUrl:"modules/forms/views/adminTabs/configure.html"}).state("viewForm.design",{url:"/design",templateUrl:"modules/forms/views/adminTabs/design.html"}).state("viewForm.analyze",{url:"/analyze",templateUrl:"modules/forms/views/adminTabs/analyze.html"}).state("viewForm.create",{url:"/create",templateUrl:"modules/forms/views/adminTabs/create.html"})}]),angular.module("forms").controller("AdminFormController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http","$uibModal","myForm",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http,$uibModal,myForm){$scope=$rootScope,$scope.animationsEnabled=!0,$scope.myform=myForm,$rootScope.saveInProgress=!1,CurrentForm.setForm($scope.myform),$scope.tabData=[{heading:"Create",route:"viewForm.create"},{heading:"Design",route:"viewForm.design"},{heading:"Configure",route:"viewForm.configure"},{heading:"Analyze",route:"viewForm.analyze"}],$scope.setForm=function(form){$scope.myform=form},$rootScope.resetForm=function(){$scope.myform=Forms.get({formId:$stateParams.formId})},$scope.openDeleteModal=function(){$scope.deleteModal=$uibModal.open({animation:$scope.animationsEnabled,templateUrl:"myModalContent.html",controller:"AdminFormController",resolve:{myForm:function(){return $scope.myform}}}),$scope.deleteModal.result.then(function(selectedItem){$scope.selected=selectedItem},function(){console.log("Modal dismissed at: "+new Date)})},$scope.cancelDeleteModal=function(){$scope.deleteModal&&$scope.deleteModal.dismiss("cancel")},$scope.removeCurrentForm=function(){if($scope.deleteModal&&$scope.deleteModal.opened){$scope.deleteModal.close();var form_id=$scope.myform._id;if(!form_id)throw new Error("Error - removeCurrentForm(): $scope.myform._id does not exist");$http["delete"]("/forms/"+form_id).success(function(data,status,headers){console.log("form deleted successfully"),$state.go("listForms",{},{reload:!0})}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}},$scope.update=$rootScope.update=function(updateImmediately,cb){var continueUpdate=!0;if(updateImmediately||(continueUpdate=!$rootScope.saveInProgress),continueUpdate){var err=null;updateImmediately||($rootScope.saveInProgress=!0),$scope.updatePromise=$http.put("/forms/"+$scope.myform._id,{form:$scope.myform}).then(function(response){$rootScope.myform=$scope.myform=response.data})["catch"](function(response){console.log("Error occured during form UPDATE.\n"),err=response.data})["finally"](function(){return updateImmediately||($rootScope.saveInProgress=!1),"function"==typeof cb?cb(err):void 0})}}}]),angular.module("forms").controller("ListFormsController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http){$scope=$rootScope,$scope.forms={},$scope.showCreateModal=!1,$scope.findAll=function(){Forms.query(function(_forms){$scope.myforms=_forms})},$scope.openCreateModal=function(){$scope.showCreateModal||($scope.showCreateModal=!0)},$scope.closeCreateModal=function(){$scope.showCreateModal&&($scope.showCreateModal=!1)},$scope.setForm=function(form){$scope.myform=form},$scope.goToWithId=function(route,id){$state.go(route,{formId:id},{reload:!0})},$scope.duplicateForm=function(form_index){var form=_.cloneDeep($scope.myforms[form_index]);delete form._id,$http.post("/forms",{form:form}).success(function(data,status,headers){$scope.myforms.splice(form_index+1,0,data)}).error(function(errorResponse){console.error(errorResponse),null===errorResponse&&($scope.error=errorResponse.data.message)})},$scope.createNewForm=function(){var form={};form.title=$scope.forms.createForm.title.$modelValue,form.language=$scope.forms.createForm.language.$modelValue,$scope.forms.createForm.$valid&&$scope.forms.createForm.$dirty&&$http.post("/forms",{form:form}).success(function(data,status,headers){console.log("new form created"),$scope.goToWithId("viewForm.create",data._id+"")}).error(function(errorResponse){console.error(errorResponse),$scope.error=errorResponse.data.message})},$scope.removeForm=function(form_index){if(form_index>=$scope.myforms.length||0>form_index)throw new Error("Error: form_index in removeForm() must be between 0 and "+$scope.myforms.length-1);$http["delete"]("/forms/"+$scope.myforms[form_index]._id).success(function(data,status,headers){console.log("form deleted successfully"),$scope.myforms.splice(form_index,1)}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}}]),angular.module("forms").controller("SubmitFormController",["$scope","$rootScope","$state","myForm","Auth",function($scope,$rootScope,$state,myForm,Auth){$scope.authentication=Auth,$scope.myform=myForm,$scope.myform.isLive?$scope.hideNav=$rootScope.hideNav=!0:$scope.authentication.isAuthenticated()?$scope.hideNav=$rootScope.hideNav=!1:($scope.hideNav=$rootScope.hideNav=!0,$state.go("access_denied"))}]),function(){"use strict";function SendVisitorData(Socket,$state){function send(form,lastActiveIndex,timeElapsed){console.log(lastActiveIndex);var visitorData={referrer:document.referrer,isSubmitted:form.submitted,formId:form._id,lastActiveField:form.form_fields[lastActiveIndex]._id,timeElapsed:timeElapsed};Socket.emit("form-visitor-data",visitorData)}function init(){Socket.socket||Socket.connect()}var service={send:send};return init(),service}angular.module("forms").factory("SendVisitorData",SendVisitorData),SendVisitorData.$inject=["Socket","$state"]}(),_.mixin({removeDateFields:removeDateFieldsFunc}),angular.module("forms").directive("autoSaveForm",["$rootScope","$timeout",function($rootScope,$timeout){return{require:["^form"],restrict:"AE",link:function($scope,$element,$attrs,$ctrls){angular.element(document).ready(function(){var $formCtrl=$ctrls[0],savePromise=null;$rootScope.finishedRender=!1,$scope.$on("editFormFields Started",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!1}),$scope.$on("editFormFields Finished",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!0}),$scope.anyDirtyAndTouched=function(form){var propCount=0;for(var prop in form)if(form.hasOwnProperty(prop)&&"$"!==prop[0]&&(propCount++,form[prop].$touched&&form[prop].$dirty))return!0;return!1};var debounceSave=function(){$rootScope.saveInProgress=!0,$rootScope[$attrs.autoSaveCallback](!0,function(err){err?(console.error("Error form data NOT persisted"),console.error(err)):($formCtrl.$setPristine(),$formCtrl.$setUntouched())})};$scope.$watch(function(newValue,oldValue){$rootScope.finishedRender&&$scope.anyDirtyAndTouched($scope.editForm)&&!$rootScope.saveInProgress&&debounceSave()}),$scope.$watch($attrs.autoSaveWatch,function(newValue,oldValue){newValue=angular.copy(newValue),oldValue=angular.copy(oldValue),newValue.form_fields=_.removeDateFields(newValue.form_fields),oldValue.form_fields=_.removeDateFields(oldValue.form_fields);var changedFields=!_.isEqual(oldValue.form_fields,newValue.form_fields)||!_.isEqual(oldValue.startPage,newValue.startPage),changedFieldMap=!1;oldValue.hasOwnProperty("plugins.oscarhost.settings.fieldMap")&&(changedFieldMap=!!oldValue.plugins.oscarhost.settings.fieldMap&&!_.isEqual(oldValue.plugins.oscarhost.settings.fieldMap,newValue.plugins.oscarhost.settings.fieldMap)),(newValue||oldValue)&&oldValue&&(0===oldValue.form_fields.length&&($rootScope.finishedRender=!0),$rootScope.finishedRender&&(changedFields&&!$formCtrl.$dirty||changedFieldMap)&&!$rootScope.saveInProgress?(savePromise&&($timeout.cancel(savePromise),savePromise=null),savePromise=$timeout(function(){debounceSave()})):$rootScope.finishedRender&&$rootScope.saveInProgress&&($rootScope.saveInProgress=!1))},!0)})}}}]),angular.module("forms").directive("configureFormDirective",["$rootScope","$http","Upload","CurrentForm",function($rootScope,$http,Upload,CurrentForm){return{templateUrl:"modules/forms/views/directiveViews/form/configure-form.client.view.html",restrict:"E",scope:{myform:"=",user:"=",pdfFields:"@",formFields:"@"},controller:["$scope",function($scope){console.log($scope.myform),CurrentForm.getForm().plugins?CurrentForm.getForm().plugins.oscarhost.baseUrl&&($scope.oscarhostAPI=!0):$scope.oscarhostAPI=!1,$scope.log="",$scope.pdfLoading=!1,$scope.languages=$rootScope.languages,this._current_upload=null,$scope.resetForm=$rootScope.resetForm,$scope.update=$rootScope.update,this._unbindedPdfFields=$scope.pdfFields,$scope.cancelUpload=function(){this._current_upload.abort(),$scope.pdfLoading=!1,$scope.removePDF()},$scope.removePDF=function(){$scope.myform.pdf=null,$scope.myform.isGenerated=!1,$scope.myform.autofillPDFs=!1,console.log("form.pdf: "+$scope.myform.pdf+" REMOVED")},$scope.uploadPDF=function(file){file&&(console.log(file),Upload.upload({url:"/upload/pdf",data:{user:$scope.user,file:file}}).then(function(resp){var data=resp.data;$scope.log="file "+data.originalname+" uploaded as "+data.filename+". JSON: "+JSON.stringify(data)+"\n"+$scope.log,$scope.myform.pdf=angular.fromJson(angular.toJson(data)),$scope.pdfLoading=!1,console.log($scope.log),$scope.$$phase||$scope.$digest||$scope.$apply()},function(resp){$scope.pdfLoading=!1,console.log("Error occured during upload.\n"),console.log(resp.status)},function(evt){var progressPercentage=parseInt(100*evt.loaded/evt.total,10);$scope.log="progress: "+progressPercentage+"% "+evt.config.data.file.name+"\n"+$scope.log,console.log($scope.log),$scope.pdfLoading=!0}))}}]}}]),angular.module("forms").directive("editFormDirective",["$rootScope","FormFields",function($rootScope,FormFields){return{templateUrl:"modules/forms/views/directiveViews/form/edit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$scope",function($scope){for(var field_ids=_($scope.myform.form_fields).pluck("_id"),i=0;i0){$scope.myform.plugins.oscarhost.settings.fieldMap||($scope.myform.plugins.oscarhost.settings.fieldMap={});var oscarhostFields=$scope.myform.plugins.oscarhost.settings.validFields,currentFields=_($scope.myform.plugins.oscarhost.settings.fieldMap).invert().keys().value();return $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id)&&(currentFields=_(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id])),_(oscarhostFields).difference(currentFields).value()}return[]},$scope.dropzone={handle:".handle",containment:".dropzoneContainer",cursor:"grabbing"},$scope.addNewField=function(modifyForm,fieldType){$scope.addField.lastAddedID++;for(var fieldTitle,i=0;i<$scope.addField.types.length;i++)if($scope.addField.types[i].name===fieldType){$scope.addField.types[i].lastAddedID++,fieldTitle=$scope.addField.types[i].value+$scope.addField.types[i].lastAddedID;break}var newField={title:fieldTitle,fieldType:fieldType,fieldValue:"",required:!0,disabled:!1,deletePreserved:!1};return $scope.showAddOptions(newField)&&(newField.fieldOptions=[],newField.fieldOptions.push({option_id:Math.floor(1e5*Math.random()),option_title:"Option 0",option_value:"Option 0"})),modifyForm&&$scope.myform.form_fields.push(newField),newField},$scope.deleteField=function(field_index){var currFieldId=$scope.myform.form_fields[field_index]._id;$scope.myform.hasOwnProperty("plugins.oscarhost.baseUrl")&&delete $scope.myform.plugins.oscarhost.settings.fieldMap[currFieldId],$scope.myform.form_fields.splice(field_index,1)},$scope.duplicateField=function(field_index){var currField=_.cloneDeep($scope.myform.form_fields[field_index]);currField._id="cloned"+_.uniqueId(),currField.title+=" copy",$scope.myform.form_fields.splice(field_index+1,0,currField)},$scope.addButton=function(){var newButton={};newButton.bgColor="#ddd",newButton.color="#ffffff",newButton.text="Button",newButton._id=Math.floor(1e5*Math.random()),$scope.myform.startPage.buttons.push(newButton)},$scope.deleteButton=function(button){for(var currID,i=0;i<$scope.myform.startPage.buttons.length;i++)if(currID=$scope.myform.startPage.buttons[i]._id,console.log(currID),currID===button._id){$scope.myform.startPage.buttons.splice(i,1);break}},$scope.addOption=function(field_index){var currField=$scope.myform.form_fields[field_index];if("checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType){currField.fieldOptions||($scope.myform.form_fields[field_index].fieldOptions=[]);var lastOptionID=$scope.myform.form_fields[field_index].fieldOptions.length+1,newOption={option_id:Math.floor(1e5*Math.random()),option_title:"Option "+lastOptionID,option_value:"Option "+lastOptionID};$scope.myform.form_fields[field_index].fieldOptions.push(newOption)}},$scope.deleteOption=function(field_index,option){var currField=$scope.myform.form_fields[field_index];if("checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType)for(var i=0;i',restrict:"E",scope:{typeName:"@"},controller:["$scope",function($scope){var iconTypeMap={textfield:"fa fa-pencil-square-o",dropdown:"fa fa-th-list",date:"fa fa-calendar",checkbox:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",email:"fa fa-envelope-o",textarea:"fa fa-pencil-square",legal:"fa fa-legal",file:"fa fa-cloud-upload",rating:"fa fa-star-half-o",link:"fa fa-link",scale:"fa fa-sliders",stripe:"fa fa-credit-card", statement:"fa fa-quote-left",yes_no:"fa fa-toggle-on",number:"fa fa-slack"};$scope.typeIcon=iconTypeMap[$scope.typeName]}]}});var __indexOf=[].indexOf||function(item){for(var i=0,l=this.length;l>i;i++)if(i in this&&this[i]===item)return i;return-1};angular.module("forms").directive("fieldDirective",["$http","$compile","$rootScope","$templateCache",function($http,$compile,$rootScope,$templateCache){var getTemplateUrl=function(fieldType){var type=fieldType,templateUrl="modules/forms/views/directiveViews/field/",supported_fields=["textfield","textarea","date","dropdown","hidden","password","radio","legal","statement","rating","yes_no","number","natural"];return __indexOf.call(supported_fields,type)>=0&&(templateUrl=templateUrl+type+".html"),$templateCache.get("../public/"+templateUrl)};return{template:"
{{field.title}}
",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(scope,element){$rootScope.chooseDefaultOption=scope.chooseDefaultOption=function(type){"yes_no"===type?scope.field.fieldValue="true":"rating"===type?scope.field.fieldValue=0:"radio"===scope.field.fieldType?(console.log(scope.field),scope.field.fieldValue=scope.field.fieldOptions[0].option_value,console.log(scope.field.fieldValue)):"legal"===type&&(scope.field.fieldValue="true",$rootScope.nextField())},scope.setActiveField=$rootScope.setActiveField,"date"===scope.field.fieldType&&(scope.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var fieldType=scope.field.fieldType;if("number"===scope.field.fieldType||"textfield"===scope.field.fieldType||"email"===scope.field.fieldType||"link"===scope.field.fieldType){switch(scope.field.fieldType){case"textfield":scope.field.input_type="text";break;case"email":scope.field.input_type="email",scope.field.placeholder="joesmith@example.com";break;case"number":scope.field.input_type="text",scope.field.validateRegex=/^-?\d+$/;break;default:scope.field.input_type="url",scope.field.placeholder="http://example.com"}fieldType="textfield"}var template=getTemplateUrl(fieldType);element.html(template).show();$compile(element.contents())(scope)}}}]),angular.module("forms").directive("keyToOption",function(){return{restrict:"A",scope:{field:"="},link:function($scope,$element,$attrs,$select){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,index=parseInt(String.fromCharCode(keyCode))-1;index<$scope.field.fieldOptions.length&&(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue=$scope.field.fieldOptions[index].option_value}))})}}}),angular.module("forms").directive("keyToTruthy",["$rootScope",function($rootScope){return{restrict:"A",scope:{field:"="},link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,truthyKeyCode=$attrs.keyCharTruthy.charCodeAt(0)-32,falseyKeyCode=$attrs.keyCharFalsey.charCodeAt(0)-32;keyCode===truthyKeyCode?(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue="true"})):keyCode===falseyKeyCode&&(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue="false"}))})}}}]),angular.module("forms").directive("onEnterKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,onEnterKeyDisabled=!1;null!==$attrs.onEnterKeyDisabled&&(onEnterKeyDisabled=$attrs.onEnterKeyDisabled),13!==keyCode||event.shiftKey||onEnterKeyDisabled||(event.preventDefault(),$rootScope.$apply(function(){$rootScope.$eval($attrs.onEnterKey)}))})}}}]).directive("onTabKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;9!==keyCode||event.shiftKey||(event.preventDefault(),$rootScope.$apply(function(){$rootScope.$eval($attrs.onTabKey)}))})}}}]).directive("onEnterOrTabKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;13!==keyCode&&9!==keyCode||event.shiftKey||(event.preventDefault(),$rootScope.$apply(function(){$rootScope.$eval($attrs.onEnterOrTabKey)}))})}}}]).directive("onTabAndShiftKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;9===keyCode&&event.shiftKey&&(event.preventDefault(),$rootScope.$apply(function(){$rootScope.$eval($attrs.onTabAndShiftKey)}))})}}}]),angular.module("forms").directive("onFinishRender",["$rootScope","$timeout",function($rootScope,$timeout){return{restrict:"A",link:function(scope,element,attrs){if(element.attr("ng-repeat")||element.attr("data-ng-repeat")){var broadcastMessage=attrs.onFinishRender||"ngRepeat";scope.$first&&!scope.$last?scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Started")}):scope.$last&&scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Finished")})}}}}]),angular.module("forms").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","Auth","SendVisitorData",function($http,TimeCounter,$filter,$rootScope,Auth,SendVisitorData){return{templateUrl:"modules/forms/views/directiveViews/form/submit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$document","$window","$scope",function($document,$window,$scope){$scope.authentication=$rootScope.authentication,$scope.noscroll=!1,$scope.forms={},$scope.form_fields_count=$scope.myform.visible_form_fields.filter(function(field){return"statement"!==field.fieldType&&"rating"!==field.fieldType}).length,$scope.reloadForm=function(){$scope.myform.submitted=!1,$scope.myform.form_fields=_.chain($scope.myform.visible_form_fields).map(function(field){return field.fieldValue="",field}).value(),$scope.loading=!1,$scope.error="",$scope.selected={_id:"",index:0},$scope.setActiveField($scope.myform.visible_form_fields[0]._id,0,!1),TimeCounter.restartClock()},$window.onscroll=function(){$scope.scrollPos=document.body.scrollTop||document.documentElement.scrollTop||0;var elemBox=document.getElementsByClassName("activeField")[0].getBoundingClientRect();$scope.fieldTop=elemBox.top,$scope.fieldBottom=elemBox.bottom;var field_id,field_index;$scope.noscroll||($scope.selected.index===$scope.myform.visible_form_fields.length-1&&$scope.fieldBottom<200?(field_index=$scope.selected.index+1,field_id="submit_field",$scope.setActiveField(field_id,field_index,!1)):$scope.selected.index===$scope.myform.visible_form_fields.length?$scope.fieldTop>200&&(field_index=$scope.selected.index-1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):$scope.fieldBottom<0?(field_index=$scope.selected.index+1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):0!==$scope.selected.index&&$scope.fieldTop>0&&(field_index=$scope.selected.index-1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)),$scope.$apply())};var getActiveField=function(){if(null===$scope.selected)throw console.error("current active field is null"),new Error("current active field is null");return"submit_field"===$scope.selected._id?$scope.myform.form_fields.length-1:$scope.selected.index};$scope.setActiveField=$rootScope.setActiveField=function(field_id,field_index,animateScroll){null!==$scope.selected&&$scope.selected._id!==field_id&&($scope.selected._id=field_id,$scope.selected.index=field_index,animateScroll?($scope.noscroll=!0,setTimeout(function(){$document.scrollToElement(angular.element(".activeField"),-10,200).then(function(){$scope.noscroll=!1,setTimeout(function(){document.querySelectorAll(".activeField .focusOn").length?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input").length?document.querySelectorAll(".activeField input")[0].focus():document.querySelectorAll(".activeField .selectize-input")[0].focus()})})})):setTimeout(function(){document.querySelectorAll(".activeField .focusOn")[0]?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input")[0].focus()}),SendVisitorData.send($scope.myform,getActiveField(),TimeCounter.getTimeElapsed()))},$rootScope.nextField=$scope.nextField=function(){var selected_index,selected_id;$scope.selected.index<$scope.myform.visible_form_fields.length-1?(selected_index=$scope.selected.index+1,selected_id=$scope.myform.visible_form_fields[selected_index]._id,$rootScope.setActiveField(selected_id,selected_index,!0)):$scope.selected.index===$scope.myform.visible_form_fields.length-1&&(selected_index=$scope.selected.index+1,selected_id="submit_field",$rootScope.setActiveField(selected_id,selected_index,!0))},$rootScope.prevField=$scope.prevField=function(){if($scope.selected.index>0){var selected_index=$scope.selected.index-1,selected_id=$scope.myform.visible_form_fields[selected_index]._id;$scope.setActiveField(selected_id,selected_index,!0)}},$scope.exitStartPage=function(){$scope.myform.startPage.showStart=!1,$scope.myform.visible_form_fields.length>0&&($scope.selected._id=$scope.myform.visible_form_fields[0]._id)},$rootScope.goToInvalid=$scope.goToInvalid=function(){document.querySelectorAll(".ng-invalid.focusOn")[0].focus()},$rootScope.submitForm=$scope.submitForm=function(){var _timeElapsed=TimeCounter.stopClock();$scope.loading=!0;var form=_.cloneDeep($scope.myform);form.timeElapsed=_timeElapsed,form.percentageComplete=$filter("formValidity")($scope.myform)/$scope.myform.visible_form_fields.length*100,delete form.visible_form_fields;for(var i=0;i<$scope.myform.form_fields.length;i++)"dropdown"!==$scope.myform.form_fields[i].fieldType||$scope.myform.form_fields[i].deletePreserved||($scope.myform.form_fields[i].fieldValue=$scope.myform.form_fields[i].fieldValue.option_value);setTimeout(function(){$scope.submitPromise=$http.post("/forms/"+$scope.myform._id,form).success(function(data,status,headers){console.log($scope.myform.form_fields[0]),$scope.myform.submitted=!0,$scope.loading=!1,SendVisitorData.send($scope.myform,getActiveField(),_timeElapsed)}).error(function(error){$scope.loading=!1,console.error(error),$scope.error=error.message})},500)},$scope.reloadForm()}]}}]),angular.module("forms").service("CurrentForm",function(){var _form={};this.getForm=function(){return _form},this.setForm=function(form){_form=form}}),angular.module("forms").service("FormFields",[function(){this.types=[{name:"textfield",value:"Short Text"},{name:"email",value:"Email"},{name:"radio",value:"Multiple Choice"},{name:"dropdown",value:"Dropdown"},{name:"date",value:"Date"},{name:"textarea",value:"Paragraph Text"},{name:"yes_no",value:"Yes/No"},{name:"legal",value:"Legal"},{name:"rating",value:"Rating"},{name:"link",value:"Link"},{name:"number",value:"Numbers"},{name:"statement",value:"Statement"}]}]),angular.module("forms").factory("Forms",["$resource",function($resource){return $resource("/forms/:formId",{formId:"@_id"},{query:{method:"GET",isArray:!0},get:{method:"GET",transformResponse:function(data,header){var form=angular.fromJson(data);return form.visible_form_fields=_.filter(form.form_fields,function(field){return field.deletePreserved===!1}),form}},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").factory("Submissions",["$resource",function($resource){return $resource("forms/:formID/submissions/:submissionId",{submissionId:"@_id",formId:"@_id"},{query:{method:"GET",isArray:!0},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").service("TimeCounter",[function(){var _startTime,_endTime=null;this.timeSpent=0,this.restartClock=function(){_startTime=Date.now(),_endTime=null},this.getTimeElapsed=function(){return _startTime?Math.abs(Date.now().valueOf()-_startTime.valueOf())/1e3:void 0},this.stopClock=function(){return _startTime&&null===_endTime?(_endTime=Date.now(),this.timeSpent=Math.abs(_endTime.valueOf()-_startTime.valueOf())/1e3,this._startTime=this._endTime=null,this.timeSpent):new Error("Clock has not been started")},this.clockStarted=function(){return!!this._startTime}}]),angular.module("users").config(["$httpProvider",function($httpProvider){$httpProvider.interceptors.push(["$q","$location",function($q,$location){return{responseError:function(response){return"/users/me"!==$location.path()&&response.config&&"/users/me"!==response.config.url&&(console.log("intercepted rejection of ",response.config.url,response.status),401===response.status?(console.log($location.path()),$location.nextAfterLogin=$location.path(),$location.path("/signin")):403===response.status&&$location.path("/access_denied")),$q.reject(response)}}}])}]),angular.module("users").config(["$stateProvider",function($stateProvider){var checkLoggedin=function($q,$timeout,$state,User,Auth){var deferred=$q.defer();return Auth.currentUser&&Auth.currentUser.email?$timeout(deferred.resolve):Auth.currentUser=User.getCurrent(function(){Auth.login(),$timeout(deferred.resolve())},function(){Auth.logout(),$timeout(deferred.reject()),$state.go("signin",{reload:!0})}),deferred.promise};checkLoggedin.$inject=["$q","$timeout","$state","User","Auth"];var checkSignupDisabled=function($window,$timeout,$q){var deferred=$q.defer();return $timeout($window.signupDisabled?deferred.reject():deferred.resolve()),deferred.promise};checkSignupDisabled.$inject=["$window","$timeout","$q"],$stateProvider.state("profile",{resolve:{loggedin:checkLoggedin},url:"/settings/profile",templateUrl:"modules/users/views/settings/edit-profile.client.view.html"}).state("password",{resolve:{loggedin:checkLoggedin},url:"/settings/password",templateUrl:"modules/users/views/settings/change-password.client.view.html"}).state("accounts",{resolve:{loggedin:checkLoggedin},url:"/settings/accounts",templateUrl:"modules/users/views/settings/social-accounts.client.view.html"}).state("signup",{resolve:{isDisabled:checkSignupDisabled},url:"/signup",templateUrl:"modules/users/views/authentication/signup.client.view.html"}).state("signup-success",{resolve:{isDisabled:checkSignupDisabled},url:"/signup-success",templateUrl:"modules/users/views/authentication/signup-success.client.view.html"}).state("signin",{url:"/signin",templateUrl:"modules/users/views/authentication/signin.client.view.html"}).state("access_denied",{url:"/access_denied",templateUrl:"modules/users/views/authentication/access-denied.client.view.html"}).state("verify",{resolve:{isDisabled:checkSignupDisabled},url:"/verify/:token",templateUrl:"modules/users/views/verify/verify-account.client.view.html"}).state("resendVerifyEmail",{resolve:{isDisabled:checkSignupDisabled},url:"/verify",templateUrl:"modules/users/views/verify/resend-verify-email.client.view.html"}).state("forgot",{url:"/password/forgot",templateUrl:"modules/users/views/password/forgot-password.client.view.html"}).state("reset-invalid",{url:"/password/reset/invalid",templateUrl:"modules/users/views/password/reset-password-invalid.client.view.html"}).state("reset-success",{url:"/password/reset/success",templateUrl:"modules/users/views/password/reset-password-success.client.view.html"}).state("reset",{url:"/password/reset/:token",templateUrl:"modules/users/views/password/reset-password.client.view.html"})}]),angular.module("users").controller("AuthenticationController",["$scope","$location","$state","$rootScope","User","Auth",function($scope,$location,$state,$rootScope,User,Auth){$scope=$rootScope,$scope.credentials={},$scope.error="",$scope.signin=function(){$scope.credentials.email=$scope.credentials.username,User.login($scope.credentials).then(function(response){Auth.login(response),$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),"home"!==$state.previous.name&&"verify"!==$state.previous.name&&""!==$state.previous.name?$state.go($state.previous.name):$state.go("listForms")},function(error){$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user,$scope.error=error,console.log("loginError: "+error)})},$scope.signup=function(){console.log($scope.credentials),User.signup($scope.credentials).then(function(response){console.log("signup-success"),$state.go("signup-success")},function(error){console.log("Error: "),console.log(error),error?($scope.error=error,console.log(error)):console.log("No response received")})}}]),angular.module("users").controller("PasswordController",["$scope","$stateParams","$state","User",function($scope,$stateParams,$state,User){$scope.error="",$scope.askForPasswordReset=function(){User.askForPasswordReset($scope.credentials).then(function(response){$scope.success=response.message,$scope.credentials=null},function(error){$scope.error=error,$scope.credentials=null})},$scope.resetUserPassword=function(){$scope.success=$scope.error=null,User.resetPassword($scope.passwordDetails,$stateParams.token).then(function(response){$scope.success=response.message,$scope.passwordDetails=null,$state.go("reset-success")},function(error){$scope.error=error.message||error,$scope.passwordDetails=null})}}]),angular.module("users").controller("SettingsController",["$scope","$rootScope","$http","$state","Users",function($scope,$rootScope,$http,$state,Users){$scope.user=$rootScope.user,$scope.hasConnectedAdditionalSocialAccounts=function(provider){for(var i in $scope.user.additionalProvidersData)return!0;return!1},$scope.isConnectedSocialAccount=function(provider){return $scope.user.provider===provider||$scope.user.additionalProvidersData&&$scope.user.additionalProvidersData[provider]},$scope.removeUserSocialAccount=function(provider){$scope.success=$scope.error=null,$http["delete"]("/users/accounts",{params:{provider:provider}}).success(function(response){$scope.success=!0,$scope.user=response}).error(function(response){$scope.error=response.message})},$scope.updateUserProfile=function(isValid){if(isValid){$scope.success=$scope.error=null;var user=new Users($scope.user);user.$update(function(response){$scope.success=!0,$scope.user=response},function(response){$scope.error=response.data.message})}else $scope.submitted=!0},$scope.changeUserPassword=function(){$scope.success=$scope.error=null,$http.post("/users/password",$scope.passwordDetails).success(function(response){$scope.success=!0,$scope.passwordDetails=null}).error(function(response){$scope.error=response.message})}}]),angular.module("users").controller("VerifyController",["$scope","$state","$rootScope","User","Auth","$stateParams",function($scope,$state,$rootScope,User,Auth,$stateParams){$scope.isResetSent=!1,$scope.credentials={},$scope.error="",$scope.resendVerifyEmail=function(){User.resendVerifyEmail($scope.credentials.email).then(function(response){console.log(response),$scope.success=response.message,$scope.credentials=null,$scope.isResetSent=!0},function(error){$scope.error=error,$scope.credentials.email=null,$scope.isResetSent=!1})},$scope.validateVerifyToken=function(){$stateParams.token&&(console.log($stateParams.token),User.validateVerifyToken($stateParams.token).then(function(response){console.log("Success: "+response.message),$scope.success=response.message,$scope.isResetSent=!0,$scope.credentials.email=null},function(error){console.log("Error: "+error.message),$scope.isResetSent=!1,$scope.error=error,$scope.credentials.email=null}))}}]),angular.module("users").factory("Auth",["$window",function($window){var userState={isLoggedIn:!1},service={_currentUser:null,get currentUser(){return this._currentUser},ensureHasCurrentUser:function(User){return service._currentUser&&service._currentUser.username?service._currentUser:$window.user?(service._currentUser=$window.user,service._currentUser):void User.getCurrent().then(function(user){return service._currentUser=user,userState.isLoggedIn=!0,$window.user=service._currentUser,service._currentUser},function(response){return userState.isLoggedIn=!1,service._currentUser=null,$window.user=null,console.log("User.getCurrent() err",response),null})},isAuthenticated:function(){return!!service._currentUser},getUserState:function(){return userState},login:function(new_user){userState.isLoggedIn=!0,service._currentUser=new_user},logout:function(){$window.user=null,userState.isLoggedIn=!1,service._currentUser=null}};return service}]),angular.module("users").service("Authorizer",["APP_PERMISSIONS","USER_ROLES",function(APP_PERMISSIONS,USER_ROLES){return function(user){return{canAccess:function(permissions){var i,len,permission;for(angular.isArray(permissions)||(permissions=[permissions]),i=0,len=permissions.length;len>i;i++){if(permission=permissions[i],null===APP_PERMISSIONS[permission])throw"Bad permission value";if(!user||!user.roles)return!1;switch(permission){case APP_PERMISSIONS.viewAdminSettings:case APP_PERMISSIONS.editAdminSettings:return user.roles.indexOf(USER_ROLES.admin)>-1;case APP_PERMISSIONS.viewPrivateForm:case APP_PERMISSIONS.editForm:return user.roles.indexOf(USER_ROLES.admin)>-1||user.roles.indexOf(USER_ROLES.normal)>-1}}return!1}}}}]),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function($window,$q,$timeout,$http,$state){var userService={getCurrent:function(){var deferred=$q.defer();return $http.get("/users/me").success(function(response){deferred.resolve(response)}).error(function(){deferred.reject("User's session has expired")}),deferred.promise},login:function(credentials){var deferred=$q.defer();return $http.post("/auth/signin",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},logout:function(){var deferred=$q.defer();return $http.get("/auth/signout").success(function(response){deferred.resolve(null)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},signup:function(credentials){var deferred=$q.defer();return $http.post("/auth/signup",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},resendVerifyEmail:function(_email){var deferred=$q.defer();return $http.post("/auth/verify",{email:_email}).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},validateVerifyToken:function(token){var validTokenRe=/^([A-Za-z0-9]{48})$/g;if(!validTokenRe.test(token))throw new Error("Error token: "+token+" is not a valid verification token");var deferred=$q.defer();return $http.get("/auth/verify/"+token).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error)}),deferred.promise},resetPassword:function(passwordDetails,token){var deferred=$q.defer();return $http.get("/auth/password/"+token,passwordDetails).success(function(response){deferred.resolve()}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},askForPasswordReset:function(credentials){var deferred=$q.defer();return $http.post("/auth/forgot",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise}};return userService}]),angular.module("users").factory("Users",["$resource",function($resource){return $resource("users",{},{update:{method:"PUT"}})}]); ======= +======= +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f +>>>>>>> make it work <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c function removeDateFieldsFunc(o){function eachObject(v,k){"lastModified"!==k&&"created"!==k||delete clone[k]}for(var clone=_.clone(o),i=0;i'),$templateCache.put("../public/modules/core/views/home.client.view.html",'

Craft beautiful forms in seconds.

Create your next ______.

Tell a story with a form.

'),$templateCache.put("../public/modules/forms/views/admin-form.client.view.html",'
'),$templateCache.put("../public/modules/forms/views/list-forms.client.view.html",'

Create a new form
Name
Language

'),$templateCache.put("../public/modules/forms/views/submit-form.client.view.html","
"),$templateCache.put("../public/modules/forms/views/adminTabs/analyze.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/configure.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/create.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/design.html",'
Background Color
Question Text Color
Answer Text Color
Button Background Color
Button Text Color
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeA.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/entryPage/startPage.html",'

{{pageData.introTitle}}

{{pageData.introParagraph}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/date.html",'

{{index+1}} {{field.title}} optional

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/dropdown.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/file.html",'

{{index+1}} {{field.title}} optional

{{field.file.originalname}}
Upload your File
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/hidden.html",''),$templateCache.put("../public/modules/forms/views/directiveViews/field/legal.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/radio.html",'

{{index+1}} {{field.title}} optional


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/rating.html",'

{{index+1}} {{field.title}} optional

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/statement.html",'

{{field.title}}

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textarea.html",'

{{index+1}} {{field.title}} optional

press SHIFT+ENTER to create a newline
press ENTER
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textfield.html",'

{{index+1}} {{field.title}} (optional)

press ENTER
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/yes_no.html",'

{{index+1}} {{field.title}} optional

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/form/configure-form.client.view.html",'
Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.name}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type
Form Name
Form Status
Language
* required
Display Form Footer?
Display Start Page?
'), $templateCache.put("../public/modules/forms/views/directiveViews/form/edit-form.client.view.html",'

Edit Start Page


Intro Title:
Intro Paragraph:
\n
\n\n

\n
\n
Options:
\n
\n
\n \n\n \n \n \n
\n
\n \n
\n
\n
\n\n

\n\n
\n
Required:
\n
\n \n\n \n
\n
\n\n
\n
Disabled:
\n
\n \n\n \n
\n
\n\n
\n \n\n
\n
\n

\n Click on Fields to add them here\n

\n
\n
\n\n
\n \n
\n\n \n \n\n \n
\n
\n\n'),$templateCache.put("../public/modules/forms/views/directiveViews/form/edit-submissions-form.client.view.html",'
#{{value.title}}OscarEMR User ProfilePercentage CompleteTime ElapsedDeviceLocationIP AddressDate Submitted (UTC)Generated PDF
{{$index+1}}{{field.fieldValue}}User Profile #{{row.oscarDemoNum}}{{row.percentageComplete}}%{{row.timeElapsed}}{{row.device.name}}, {{row.device.type}}{{row.geoLocation.city}}, {{row.geoLocation.country}}{{row.ipAddr}}{{row.created | date:\'yyyy-MM-dd HH:mm:ss\'}}Generated PDF
'),$templateCache.put("../public/modules/forms/views/directiveViews/form/submit-form.client.view.html",'
{{form_fields_count - (myform | formValidity)}} answer(s) need completing
'),$templateCache.put("../public/modules/users/views/authentication/access-denied.client.view.html",'

You need to be logged in to access this page

Login
'),$templateCache.put("../public/modules/users/views/authentication/signin.client.view.html",'

Sign into your account

'),$templateCache.put("../public/modules/users/views/authentication/signup-success.client.view.html",''),$templateCache.put("../public/modules/users/views/authentication/signup.client.view.html",''),$templateCache.put("../public/modules/users/views/password/forgot-password.client.view.html",'

Restore your password

Enter your account email.

'),$templateCache.put("../public/modules/users/views/password/reset-password-invalid.client.view.html",'

Password reset is invalid

Ask for a new password reset
'),$templateCache.put("../public/modules/users/views/password/reset-password-success.client.view.html",'

Password successfully reset

Continue to home page
'),$templateCache.put("../public/modules/users/views/password/reset-password.client.view.html",'

Reset your password

'),$templateCache.put("../public/modules/users/views/settings/change-password.client.view.html",'

Change your password

'),$templateCache.put("../public/modules/users/views/settings/edit-profile.client.view.html",'

Edit your profile

'), $templateCache.put("../public/modules/users/views/settings/social-accounts.client.view.html",'

Connected social accounts:

Connect other social accounts:

'),$templateCache.put("../public/modules/users/views/verify/resend-verify-email.client.view.html",'

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at polydaic@gmail.com

'),$templateCache.put("../public/modules/users/views/verify/verify-account.client.view.html",'

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
')}]);var ApplicationConfiguration=function(){var applicationModuleName="NodeForm",applicationModuleVendorDependencies=["duScroll","ui.select","cgBusy","ngSanitize","vButton","ngResource","NodeForm.templates","ui.router","ui.bootstrap","ui.utils"],registerModule=function(moduleName,dependencies){angular.module(moduleName,dependencies||[]),angular.module(applicationModuleName).requires.push(moduleName)};return{applicationModuleName:applicationModuleName,applicationModuleVendorDependencies:applicationModuleVendorDependencies,registerModule:registerModule}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function($locationProvider){$locationProvider.hashPrefix("!")}]),angular.module(ApplicationConfiguration.applicationModuleName).constant("APP_PERMISSIONS",{viewAdminSettings:"viewAdminSettings",editAdminSettings:"editAdminSettings",editForm:"editForm",viewPrivateForm:"viewPrivateForm"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("USER_ROLES",{admin:"admin",normal:"user",superuser:"superuser"}),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","$state","$stateParams",function($rootScope,Auth,$state,$stateParams){$rootScope.$state=$state,$rootScope.$stateParams=$stateParams,$rootScope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState){$state.previous=fromState;var statesToIgnore=["home","signin","resendVerifyEmail","verify","signup","signup-success","forgot","reset-invalid","reset","reset-success"];statesToIgnore.indexOf(toState.name)>0?Auth.isAuthenticated()&&(event.preventDefault(),$state.go("listForms")):"access_denied"===toState.name||Auth.isAuthenticated()||"submitForm"===toState.name||(console.log("go to signup"),event.preventDefault(),$state.go("listForms"))})}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","User","Authorizer","$state","$stateParams",function($rootScope,Auth,User,Authorizer,$state,$stateParams){$rootScope.$on("$stateChangeStart",function(event,next){var authenticator,permissions,user;permissions=next&&next.data&&next.data.permissions?next.data.permissions:null,Auth.ensureHasCurrentUser(User),user=Auth.currentUser,user&&(authenticator=new Authorizer(user),null!=permissions&&(authenticator.canAccess(permissions)||(event.preventDefault(),$state.go("access_denied"))))})}]),angular.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),ApplicationConfiguration.registerModule("core",["users"]),ApplicationConfiguration.registerModule("forms",["ngFileUpload","ui.router.tabs","colorpicker.module","ui.date","ui.sortable","angular-input-stars","users"]),ApplicationConfiguration.registerModule("users"),angular.module("core").config(["$stateProvider","$urlRouterProvider",function($stateProvider,$urlRouterProvider,Authorization){$urlRouterProvider.otherwise("/forms")}]),angular.module("core").controller("HeaderController",["$rootScope","$scope","Menus","$state","Auth","User","$window",function($rootScope,$scope,Menus,$state,Auth,User,$window){$rootScope.signupDisabled=$window.signupDisabled,$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.authentication=$rootScope.authentication=Auth,$rootScope.languages=$scope.languages=["english","french","spanish"],$scope.isCollapsed=!1,$rootScope.hideNav=!1,$scope.menu=Menus.getMenu("topbar"),$scope.signout=function(){var promise=User.logout();promise.then(function(){Auth.logout(),Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user=null,$state.go("listForms")},function(reason){console.log("Logout Failed: "+reason)})},$scope.toggleCollapsibleMenu=function(){$scope.isCollapsed=!$scope.isCollapsed},$scope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState,fromParams){$scope.isCollapsed=!1,$rootScope.hideNav=!1,angular.isDefined(toState.data)&&angular.isDefined(toState.data.hideNav)&&($rootScope.hideNav=toState.data.hideNav)})}]),angular.module("core").controller("HomeController",["$rootScope","$scope","User","$state",function($rootScope,$scope,User,$state){$scope=$rootScope}]),angular.module("core").service("Menus",[function(){this.defaultRoles=["*"],this.menus={};var shouldRender=function(user){if(!user)return this.isPublic;if(~this.roles.indexOf("*"))return!0;for(var userRoleIndex in user.roles)for(var roleIndex in this.roles)if(console.log(this.roles[roleIndex]),console.log(this.roles[roleIndex]===user.roles[userRoleIndex]),this.roles[roleIndex]===user.roles[userRoleIndex])return!0;return!1};this.validateMenuExistance=function(menuId){if(menuId&&menuId.length){if(this.menus[menuId])return!0;throw new Error("Menu does not exists")}throw new Error("MenuId was not provided")},this.getMenu=function(menuId){return this.validateMenuExistance(menuId),this.menus[menuId]},this.addMenu=function(menuId,isPublic,roles){return this.menus[menuId]={isPublic:isPublic||!1,roles:roles||this.defaultRoles,items:[],shouldRender:shouldRender},this.menus[menuId]},this.removeMenu=function(menuId){this.validateMenuExistance(menuId),delete this.menus[menuId]},this.addMenuItem=function(menuId,menuItemTitle,menuItemURL,menuItemType,menuItemUIRoute,isPublic,roles,position){return this.validateMenuExistance(menuId),this.menus[menuId].items.push({title:menuItemTitle,link:menuItemURL,menuItemType:menuItemType||"item",menuItemClass:menuItemType,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].roles:roles,position:position||0,items:[],shouldRender:shouldRender}),this.menus[menuId]},this.addSubMenuItem=function(menuId,rootMenuItemURL,menuItemTitle,menuItemURL,menuItemUIRoute,isPublic,roles,position){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===rootMenuItemURL&&this.menus[menuId].items[itemIndex].items.push({title:menuItemTitle,link:menuItemURL,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].items[itemIndex].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].items[itemIndex].roles:roles,position:position||0,shouldRender:shouldRender});return this.menus[menuId]},this.removeMenuItem=function(menuId,menuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===menuItemURL&&this.menus[menuId].items.splice(itemIndex,1);return this.menus[menuId]},this.removeSubMenuItem=function(menuId,submenuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)for(var subitemIndex in this.menus[menuId].items[itemIndex].items)this.menus[menuId].items[itemIndex].items[subitemIndex].link===submenuItemURL&&this.menus[menuId].items[itemIndex].items.splice(subitemIndex,1);return this.menus[menuId]},this.addMenu("topbar",!1,["*"]),this.addMenu("bottombar",!1,["*"])}]),angular.module("forms").run(["Menus",function(Menus){Menus.addMenuItem("topbar","My Forms","forms","","/forms",!1)}]).filter("formValidity",function(){return function(formObj){if(formObj&&formObj.form_fields&&formObj.visible_form_fields){var formKeys=Object.keys(formObj),fields=(formKeys.filter(function(key){return"$"!==key[0]}),formObj.form_fields),valid_count=fields.filter(function(field){return"object"==typeof field&&"statement"!==field.fieldType&&"rating"!==field.fieldType?!!field.fieldValue:void 0}).length;return valid_count-(formObj.form_fields.length-formObj.visible_form_fields.length)}return 0}}).config(["$provide",function($provide){$provide.decorator("accordionDirective",["$delegate",function($delegate){var directive=$delegate[0];return directive.replace=!0,$delegate}])}]),angular.module("forms").config(["$stateProvider",function($stateProvider){$stateProvider.state("listForms",{url:"/forms",templateUrl:"modules/forms/views/list-forms.client.view.html"}).state("submitForm",{url:"/forms/:formId",templateUrl:"modules/forms/views/submit-form.client.view.html",data:{hideNav:!0},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"SubmitFormController",controllerAs:"ctrl"}).state("viewForm",{url:"/forms/:formId/admin",templateUrl:"modules/forms/views/admin-form.client.view.html",data:{permissions:["editForm"]},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"AdminFormController"}).state("viewForm.configure",{url:"/configure",templateUrl:"modules/forms/views/adminTabs/configure.html"}).state("viewForm.design",{url:"/design",templateUrl:"modules/forms/views/adminTabs/design.html"}).state("viewForm.analyze",{url:"/analyze",templateUrl:"modules/forms/views/adminTabs/analyze.html"}).state("viewForm.create",{url:"/create",templateUrl:"modules/forms/views/adminTabs/create.html"})}]),angular.module("forms").controller("AdminFormController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http","$uibModal","myForm",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http,$uibModal,myForm){$scope=$rootScope,$scope.animationsEnabled=!0,$scope.myform=myForm,$rootScope.saveInProgress=!1,CurrentForm.setForm($scope.myform),$scope.tabData=[{heading:"Create",route:"viewForm.create"},{heading:"Design",route:"viewForm.design"},{heading:"Configure",route:"viewForm.configure"},{heading:"Analyze",route:"viewForm.analyze"}],$scope.setForm=function(form){$scope.myform=form},$rootScope.resetForm=function(){$scope.myform=Forms.get({formId:$stateParams.formId})},$scope.openDeleteModal=function(){$scope.deleteModal=$uibModal.open({animation:$scope.animationsEnabled,templateUrl:"myModalContent.html",controller:"AdminFormController",resolve:{myForm:function(){return $scope.myform}}}),$scope.deleteModal.result.then(function(selectedItem){$scope.selected=selectedItem},function(){console.log("Modal dismissed at: "+new Date)})},$scope.cancelDeleteModal=function(){$scope.deleteModal&&$scope.deleteModal.dismiss("cancel")},$scope.removeCurrentForm=function(){if($scope.deleteModal&&$scope.deleteModal.opened){$scope.deleteModal.close();var form_id=$scope.myform._id;if(!form_id)throw new Error("Error - removeCurrentForm(): $scope.myform._id does not exist");$http["delete"]("/forms/"+form_id).success(function(data,status,headers){console.log("form deleted successfully"),$state.go("listForms",{},{reload:!0})}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}},$scope.update=$rootScope.update=function(updateImmediately,cb){var continueUpdate=!0;if(updateImmediately||(continueUpdate=!$rootScope.saveInProgress),continueUpdate){var err=null;updateImmediately||($rootScope.saveInProgress=!0),$scope.updatePromise=$http.put("/forms/"+$scope.myform._id,{form:$scope.myform}).then(function(response){$rootScope.myform=$scope.myform=response.data})["catch"](function(response){console.log("Error occured during form UPDATE.\n"),err=response.data})["finally"](function(){return updateImmediately||($rootScope.saveInProgress=!1),"function"==typeof cb?cb(err):void 0})}}}]),angular.module("forms").controller("ListFormsController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http){$scope=$rootScope,$scope.forms={},$scope.showCreateModal=!1,$scope.findAll=function(){Forms.query(function(_forms){$scope.myforms=_forms})},$scope.openCreateModal=function(){$scope.showCreateModal||($scope.showCreateModal=!0)},$scope.closeCreateModal=function(){$scope.showCreateModal&&($scope.showCreateModal=!1)},$scope.setForm=function(form){$scope.myform=form},$scope.goToWithId=function(route,id){$state.go(route,{formId:id},{reload:!0})},$scope.duplicateForm=function(form_index){var form=_.cloneDeep($scope.myforms[form_index]);delete form._id,$http.post("/forms",{form:form}).success(function(data,status,headers){$scope.myforms.splice(form_index+1,0,data)}).error(function(errorResponse){console.error(errorResponse),null===errorResponse&&($scope.error=errorResponse.data.message)})},$scope.createNewForm=function(){var form={};form.title=$scope.forms.createForm.title.$modelValue,form.language=$scope.forms.createForm.language.$modelValue,$scope.forms.createForm.$valid&&$scope.forms.createForm.$dirty&&$http.post("/forms",{form:form}).success(function(data,status,headers){console.log("new form created"),$scope.goToWithId("viewForm.create",data._id+"")}).error(function(errorResponse){console.error(errorResponse),$scope.error=errorResponse.data.message})},$scope.removeForm=function(form_index){if(form_index>=$scope.myforms.length||0>form_index)throw new Error("Error: form_index in removeForm() must be between 0 and "+$scope.myforms.length-1);$http["delete"]("/forms/"+$scope.myforms[form_index]._id).success(function(data,status,headers){console.log("form deleted successfully"),$scope.myforms.splice(form_index,1)}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}}]),angular.module("forms").controller("SubmitFormController",["$scope","$rootScope","$state","myForm","Auth",function($scope,$rootScope,$state,myForm,Auth){$scope.authentication=Auth,$scope.myform=myForm,$scope.myform.isLive?$scope.hideNav=$rootScope.hideNav=!0:$scope.authentication.isAuthenticated()?$scope.hideNav=$rootScope.hideNav=!1:($scope.hideNav=$rootScope.hideNav=!0,$state.go("access_denied"))}]),_.mixin({removeDateFields:removeDateFieldsFunc}),angular.module("forms").directive("autoSaveForm",["$rootScope","$timeout",function($rootScope,$timeout){return{require:["^form"],restrict:"AE",link:function($scope,$element,$attrs,$ctrls){angular.element(document).ready(function(){var $formCtrl=$ctrls[0],savePromise=null;$rootScope.finishedRender=!1,$scope.$on("editFormFields Started",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!1}),$scope.$on("editFormFields Finished",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!0}),$scope.anyDirtyAndTouched=function(form){var propCount=0;for(var prop in form)if(form.hasOwnProperty(prop)&&"$"!==prop[0]&&(propCount++,form[prop].$touched&&form[prop].$dirty))return!0;return!1};var debounceSave=function(){$rootScope.saveInProgress=!0,$rootScope[$attrs.autoSaveCallback](!0,function(err){err?(console.error("Error form data NOT persisted"),console.error(err)):($formCtrl.$setPristine(),$formCtrl.$setUntouched())})};$scope.$watch(function(newValue,oldValue){$rootScope.finishedRender&&$scope.anyDirtyAndTouched($scope.editForm)&&!$rootScope.saveInProgress&&debounceSave()}),$scope.$watch($attrs.autoSaveWatch,function(newValue,oldValue){newValue=angular.copy(newValue),oldValue=angular.copy(oldValue),newValue.form_fields=_.removeDateFields(newValue.form_fields),oldValue.form_fields=_.removeDateFields(oldValue.form_fields);var changedFields=!_.isEqual(oldValue.form_fields,newValue.form_fields)||!_.isEqual(oldValue.startPage,newValue.startPage),changedFieldMap=!1;oldValue.hasOwnProperty("plugins.oscarhost.settings.fieldMap")&&(changedFieldMap=!!oldValue.plugins.oscarhost.settings.fieldMap&&!_.isEqual(oldValue.plugins.oscarhost.settings.fieldMap,newValue.plugins.oscarhost.settings.fieldMap)),(newValue||oldValue)&&oldValue&&(0===oldValue.form_fields.length&&($rootScope.finishedRender=!0),$rootScope.finishedRender&&(changedFields&&!$formCtrl.$dirty||changedFieldMap)&&!$rootScope.saveInProgress?(savePromise&&($timeout.cancel(savePromise),savePromise=null),savePromise=$timeout(function(){debounceSave()})):$rootScope.finishedRender&&$rootScope.saveInProgress&&($rootScope.saveInProgress=!1))},!0)})}}}]),angular.module("forms").directive("configureFormDirective",["$rootScope","$http","Upload","CurrentForm",function($rootScope,$http,Upload,CurrentForm){return{templateUrl:"modules/forms/views/directiveViews/form/configure-form.client.view.html",restrict:"E",scope:{myform:"=",user:"=",pdfFields:"@",formFields:"@"},controller:["$scope",function($scope){console.log($scope.myform),CurrentForm.getForm().plugins?CurrentForm.getForm().plugins.oscarhost.baseUrl&&($scope.oscarhostAPI=!0):$scope.oscarhostAPI=!1,$scope.log="",$scope.pdfLoading=!1,$scope.languages=$rootScope.languages,this._current_upload=null,$scope.resetForm=$rootScope.resetForm,$scope.update=$rootScope.update,this._unbindedPdfFields=$scope.pdfFields,$scope.cancelUpload=function(){this._current_upload.abort(),$scope.pdfLoading=!1,$scope.removePDF()},$scope.removePDF=function(){$scope.myform.pdf=null,$scope.myform.isGenerated=!1,$scope.myform.autofillPDFs=!1,console.log("form.pdf: "+$scope.myform.pdf+" REMOVED")},$scope.uploadPDF=function(file){file&&(console.log(file),Upload.upload({url:"/upload/pdf",data:{user:$scope.user,file:file}}).then(function(resp){var data=resp.data;$scope.log="file "+data.originalname+" uploaded as "+data.filename+". JSON: "+JSON.stringify(data)+"\n"+$scope.log,$scope.myform.pdf=angular.fromJson(angular.toJson(data)),$scope.pdfLoading=!1,console.log($scope.log),$scope.$$phase||$scope.$digest||$scope.$apply()},function(resp){$scope.pdfLoading=!1,console.log("Error occured during upload.\n"),console.log(resp.status)},function(evt){var progressPercentage=parseInt(100*evt.loaded/evt.total,10);$scope.log="progress: "+progressPercentage+"% "+evt.config.data.file.name+"\n"+$scope.log,console.log($scope.log),$scope.pdfLoading=!0}))}}]}}]),angular.module("forms").directive("editFormDirective",["$rootScope","FormFields",function($rootScope,FormFields){return{templateUrl:"modules/forms/views/directiveViews/form/edit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$scope",function($scope){for(var field_ids=_($scope.myform.form_fields).pluck("_id"),i=0;i0){$scope.myform.plugins.oscarhost.settings.fieldMap||($scope.myform.plugins.oscarhost.settings.fieldMap={});var oscarhostFields=$scope.myform.plugins.oscarhost.settings.validFields,currentFields=_($scope.myform.plugins.oscarhost.settings.fieldMap).invert().keys().value();return $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id)&&(currentFields=_(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id])),_(oscarhostFields).difference(currentFields).value()}return[]},$scope.dropzone={handle:" .handle",containment:".dropzoneContainer",cursor:"grabbing"},$scope.addNewField=function(modifyForm,fieldType){$scope.addField.lastAddedID++;for(var fieldTitle,i=0;i<$scope.addField.types.length;i++)if($scope.addField.types[i].name===fieldType){$scope.addField.types[i].lastAddedID++,fieldTitle=$scope.addField.types[i].value+$scope.addField.types[i].lastAddedID;break}var newField={title:fieldTitle,fieldType:fieldType,fieldValue:"",required:!0,disabled:!1,deletePreserved:!1};return modifyForm&&$scope.myform.form_fields.push(newField),newField},$scope.deleteField=function(field_index){var currFieldId=$scope.myform.form_fields[field_index]._id;$scope.myform.hasOwnProperty("plugins.oscarhost.baseUrl")&&delete $scope.myform.plugins.oscarhost.settings.fieldMap[currFieldId],$scope.myform.form_fields.splice(field_index,1)},$scope.duplicateField=function(field_index){var currField=_.cloneDeep($scope.myform.form_fields[field_index]);currField._id="cloned"+_.uniqueId(),currField.title+=" copy",$scope.myform.form_fields.splice(field_index+1,0,currField)},$scope.addButton=function(){var newButton={};newButton.bgColor="#ddd",newButton.color="#ffffff",newButton.text="Button",newButton._id=Math.floor(1e5*Math.random()),$scope.myform.startPage.buttons.push(newButton)},$scope.deleteButton=function(button){for(var currID,i=0;i<$scope.myform.startPage.buttons.length;i++)if(currID=$scope.myform.startPage.buttons[i]._id,console.log(currID),currID===button._id){$scope.myform.startPage.buttons.splice(i,1);break}},$scope.addOption=function(field_index){var currField=$scope.myform.form_fields[field_index];if(console.log(field_index),console.log(currField),"checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType){currField.fieldOptions||($scope.myform.form_fields[field_index].fieldOptions=[]);var lastOptionID=0;currField.fieldOptions[currField.fieldOptions.length-1]&&(lastOptionID=currField.fieldOptions[currField.fieldOptions.length-1].option_id);var newOption={option_id:Math.floor(1e5*Math.random()),option_title:"Option "+lastOptionID,option_value:"Option "+lastOptionID};$scope.myform.form_fields[field_index].fieldOptions.push(newOption)}},$scope.deleteOption=function(field_index,option){var currField=$scope.myform.form_fields[field_index];if("checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType)for(var i=0;i',restrict:"E",scope:{typeName:"@"},controller:["$scope",function($scope){var iconTypeMap={textfield:"fa fa-pencil-square-o",dropdown:"fa fa-th-list",date:"fa fa-calendar",checkbox:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",email:"fa fa-envelope-o",textarea:"fa fa-pencil-square",legal:"fa fa-legal",file:"fa fa-cloud-upload",rating:"fa fa-star-half-o",link:"fa fa-link",scale:"fa fa-sliders",stripe:"fa fa-credit-card",statement:"fa fa-quote-left",yes_no:"fa fa-toggle-on",number:"fa fa-slack"};$scope.typeIcon=iconTypeMap[$scope.typeName]}]}});var __indexOf=[].indexOf||function(item){for(var i=0,l=this.length;l>i;i++)if(i in this&&this[i]===item)return i;return-1};angular.module("forms").directive("fieldDirective",["$http","$compile","$rootScope","$templateCache",function($http,$compile,$rootScope,$templateCache){var getTemplateUrl=function(fieldType){var type=fieldType,templateUrl="modules/forms/views/directiveViews/field/",supported_fields=["textfield","textarea","date","dropdown","hidden","password","radio","legal","statement","rating","yes_no","number","natural"];return __indexOf.call(supported_fields,type)>=0&&(templateUrl=templateUrl+type+".html"),$templateCache.get("../public/"+templateUrl)};return{template:"
{{field.title}}
",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(scope,element){$rootScope.chooseDefaultOption=scope.chooseDefaultOption=function(type){"yes_no"===type?scope.field.fieldValue="true":"rating"===type?scope.field.fieldValue=0:"radio"===scope.field.fieldType?(console.log(scope.field),scope.field.fieldValue=scope.field.fieldOptions[0].option_value,console.log(scope.field.fieldValue)):"legal"===type&&(scope.field.fieldValue="true",$rootScope.nextField())},scope.setActiveField=$rootScope.setActiveField,"date"===scope.field.fieldType&&(scope.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var fieldType=scope.field.fieldType;if("number"===scope.field.fieldType||"textfield"===scope.field.fieldType||"email"===scope.field.fieldType||"link"===scope.field.fieldType){switch(scope.field.fieldType){case"textfield":scope.field.input_type="text";break;case"email":scope.field.input_type="email",scope.field.placeholder="joesmith@example.com";break;case"number":scope.field.input_type="text",scope.field.validateRegex=/^\d+$/;break;default:scope.field.input_type="url",scope.field.placeholder="http://example.com"}fieldType="textfield"}var template=getTemplateUrl(fieldType);element.html(template).show(),$compile(element.contents())(scope)}}}]),angular.module("forms").directive("keyToOption",function(){return{restrict:"AE",transclude:!0,scope:{field:"&"},link:function($scope,$element,$attrs,$select){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,index=parseInt(String.fromCharCode(keyCode))-1;console.log($scope.field),index<$scope.field.fieldOptions.length&&(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue=$scope.field.fieldOptions[index].option_value,"dropdown"===$attrs.type&&($select.selected.option_value=$scope.field.fieldOptions[index].option_value),console.log($scope)}))})}}}),angular.module("forms").directive("keyToTruthy",["$rootScope",function($rootScope){return{restrict:"A",scope:{field:"="},link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,truthyKeyCode=$attrs.keyCharTruthy.charCodeAt(0)-32,falseyKeyCode=$attrs.keyCharFalsey.charCodeAt(0)-32;keyCode===truthyKeyCode?(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue="true"})):keyCode===falseyKeyCode&&(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue="false"}))})}}}]),angular.module("forms").directive("onEnterKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;13!==keyCode||event.shiftKey||(event.preventDefault(), $rootScope.$apply(function(){$rootScope.$eval($attrs.onEnterKey)}))})}}}]),angular.module("forms").directive("onFinishRender",["$rootScope","$timeout",function($rootScope,$timeout){return{restrict:"A",link:function(scope,element,attrs){if(element.attr("ng-repeat")||element.attr("data-ng-repeat")){var broadcastMessage=attrs.onFinishRender||"ngRepeat";scope.$first&&!scope.$last?scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Started")}):scope.$last&&scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Finished")})}}}}]),angular.module("forms").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","Auth",function($http,TimeCounter,$filter,$rootScope,Auth){return{templateUrl:"modules/forms/views/directiveViews/form/submit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$document","$window","$scope",function($document,$window,$scope){$scope.authentication=$rootScope.authentication,$scope.noscroll=!1,$scope.forms={},$scope.form_fields_count=$scope.myform.visible_form_fields.filter(function(field){return"statement"!==field.fieldType&&"rating"!==field.fieldType}).length,$scope.reloadForm=function(){$scope.myform.submitted=!1,$scope.myform.form_fields=_.chain($scope.myform.visible_form_fields).map(function(field){return field.fieldValue="",field}).value(),$scope.loading=!1,$scope.error="",$scope.selected={_id:"",index:0},$scope.setActiveField($scope.myform.visible_form_fields[0]._id,0,!1),TimeCounter.restartClock()},$window.onscroll=function(){$scope.scrollPos=document.body.scrollTop||document.documentElement.scrollTop||0;var elemBox=document.getElementsByClassName("activeField")[0].getBoundingClientRect();$scope.fieldTop=elemBox.top,$scope.fieldBottom=elemBox.bottom;var field_id,field_index;$scope.noscroll||($scope.selected.index===$scope.myform.visible_form_fields.length-1&&$scope.fieldBottom<200?(field_index=$scope.selected.index+1,field_id="submit_field",$scope.setActiveField(field_id,field_index,!1)):$scope.selected.index===$scope.myform.visible_form_fields.length?$scope.fieldTop>200&&(field_index=$scope.selected.index-1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):$scope.fieldBottom<0?(field_index=$scope.selected.index+1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):0!==$scope.selected.index&&$scope.fieldTop>0&&(field_index=$scope.selected.index-1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)),$scope.$apply())},$rootScope.setDropdownOption=function(){console.log("setDropdownOption index: ")},$scope.setActiveField=$rootScope.setActiveField=function(field_id,field_index,animateScroll){null!==$scope.selected&&$scope.selected._id!==field_id&&($scope.selected._id=field_id,$scope.selected.index=field_index,animateScroll?($scope.noscroll=!0,setTimeout(function(){$document.scrollToElement(angular.element(".activeField"),-10,200).then(function(){$scope.noscroll=!1,setTimeout(function(){document.querySelectorAll(".activeField .focusOn")[0]?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input")[0].focus()})})})):setTimeout(function(){document.querySelectorAll(".activeField .focusOn")[0]?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input")[0].focus()}))},$rootScope.nextField=$scope.nextField=function(){var selected_index,selected_id;$scope.selected.index<$scope.myform.visible_form_fields.length-1?(selected_index=$scope.selected.index+1,selected_id=$scope.myform.visible_form_fields[selected_index]._id,$rootScope.setActiveField(selected_id,selected_index,!0)):$scope.selected.index===$scope.myform.visible_form_fields.length-1&&(selected_index=$scope.selected.index+1,selected_id="submit_field",$rootScope.setActiveField(selected_id,selected_index,!0))},$rootScope.prevField=$scope.prevField=function(){if($scope.selected.index>0){var selected_index=$scope.selected.index-1,selected_id=$scope.myform.visible_form_fields[selected_index]._id;$scope.setActiveField(selected_id,selected_index,!0)}},$scope.exitStartPage=function(){$scope.myform.startPage.showStart=!1,$scope.myform.visible_form_fields.length>0&&($scope.selected._id=$scope.myform.visible_form_fields[0]._id)},$scope.goToInvalid=function(){document.querySelectorAll(".ng-invalid.focusOn")[0].focus()},$scope.submitForm=function(){var _timeElapsed=TimeCounter.stopClock();$scope.loading=!0;var form=_.cloneDeep($scope.myform);form.timeElapsed=_timeElapsed,form.percentageComplete=$filter("formValidity")($scope.myform)/$scope.myform.visible_form_fields.length*100,delete form.visible_form_fields,setTimeout(function(){$scope.submitPromise=$http.post("/forms/"+$scope.myform._id,form).success(function(data,status,headers){$scope.myform.submitted=!0,$scope.loading=!1}).error(function(error){$scope.loading=!1,$scope.error=error.message})},500)},$scope.reloadForm()}]}}]),angular.module("forms").service("CurrentForm",function(){var _form={};this.getForm=function(){return _form},this.setForm=function(form){_form=form}}),angular.module("forms").service("FormFields",[function(){this.types=[{name:"textfield",value:"Short Text"},{name:"email",value:"Email"},{name:"radio",value:"Multiple Choice"},{name:"dropdown",value:"Dropdown"},{name:"date",value:"Date"},{name:"textarea",value:"Paragraph Text"},{name:"yes_no",value:"Yes/No"},{name:"legal",value:"Legal"},{name:"rating",value:"Rating"},{name:"link",value:"Link"},{name:"number",value:"Numbers"},{name:"statement",value:"Statement"}]}]),angular.module("forms").factory("Forms",["$resource",function($resource){return $resource("/forms/:formId",{formId:"@_id"},{query:{method:"GET",isArray:!0},get:{method:"GET",transformResponse:function(data,header){var form=angular.fromJson(data);return form.visible_form_fields=_.filter(form.form_fields,function(field){return field.deletePreserved===!1}),form}},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").factory("Submissions",["$resource",function($resource){return $resource("forms/:formID/submissions/:submissionId",{submissionId:"@_id",formId:"@_id"},{query:{method:"GET",isArray:!0},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").service("TimeCounter",[function(){var _startTime,_endTime,that=this;this.timeSpent=0,this.restartClock=function(){_startTime=Date.now(),_endTime=_startTime},this.stopClock=function(){return _startTime?(_endTime=Date.now(),that.timeSpent=Math.abs(_endTime.valueOf()-_startTime.valueOf())/1e3,that.timeSpent):new Error("Clock has not been started")},this.clockStarted=function(){return!!this._startTime}}]),angular.module("users").config(["$httpProvider",function($httpProvider){$httpProvider.interceptors.push(["$q","$location",function($q,$location){return{responseError:function(response){return"/users/me"!==$location.path()&&response.config&&"/users/me"!==response.config.url&&(console.log("intercepted rejection of ",response.config.url,response.status),401===response.status?(console.log($location.path()),$location.nextAfterLogin=$location.path(),$location.path("/signin")):403===response.status&&$location.path("/access_denied")),$q.reject(response)}}}])}]),angular.module("users").config(["$stateProvider",function($stateProvider){var checkLoggedin=function($q,$timeout,$state,User,Auth){var deferred=$q.defer();return Auth.currentUser&&Auth.currentUser.email?$timeout(deferred.resolve):Auth.currentUser=User.getCurrent(function(){Auth.login(),$timeout(deferred.resolve())},function(){Auth.logout(),$timeout(deferred.reject()),$state.go("signin",{reload:!0})}),deferred.promise};checkLoggedin.$inject=["$q","$timeout","$state","User","Auth"];var checkSignupDisabled=function($window,$timeout,$q){var deferred=$q.defer();return $timeout($window.signupDisabled?deferred.reject():deferred.resolve()),deferred.promise};checkSignupDisabled.$inject=["$window","$timeout","$q"],$stateProvider.state("profile",{resolve:{loggedin:checkLoggedin},url:"/settings/profile",templateUrl:"modules/users/views/settings/edit-profile.client.view.html"}).state("password",{resolve:{loggedin:checkLoggedin},url:"/settings/password",templateUrl:"modules/users/views/settings/change-password.client.view.html"}).state("accounts",{resolve:{loggedin:checkLoggedin},url:"/settings/accounts",templateUrl:"modules/users/views/settings/social-accounts.client.view.html"}).state("signup",{resolve:{isDisabled:checkSignupDisabled},url:"/signup",templateUrl:"modules/users/views/authentication/signup.client.view.html"}).state("signup-success",{resolve:{isDisabled:checkSignupDisabled},url:"/signup-success",templateUrl:"modules/users/views/authentication/signup-success.client.view.html"}).state("signin",{url:"/signin",templateUrl:"modules/users/views/authentication/signin.client.view.html"}).state("access_denied",{url:"/access_denied",templateUrl:"modules/users/views/authentication/access-denied.client.view.html"}).state("verify",{resolve:{isDisabled:checkSignupDisabled},url:"/verify/:token",templateUrl:"modules/users/views/verify/verify-account.client.view.html"}).state("resendVerifyEmail",{resolve:{isDisabled:checkSignupDisabled},url:"/verify",templateUrl:"modules/users/views/verify/resend-verify-email.client.view.html"}).state("forgot",{url:"/password/forgot",templateUrl:"modules/users/views/password/forgot-password.client.view.html"}).state("reset-invalid",{url:"/password/reset/invalid",templateUrl:"modules/users/views/password/reset-password-invalid.client.view.html"}).state("reset-success",{url:"/password/reset/success",templateUrl:"modules/users/views/password/reset-password-success.client.view.html"}).state("reset",{url:"/password/reset/:token",templateUrl:"modules/users/views/password/reset-password.client.view.html"})}]),angular.module("users").controller("AuthenticationController",["$scope","$location","$state","$rootScope","User","Auth",function($scope,$location,$state,$rootScope,User,Auth){$scope=$rootScope,$scope.credentials={},$scope.error="",$scope.signin=function(){$scope.credentials.email=$scope.credentials.username,User.login($scope.credentials).then(function(response){Auth.login(response),$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),"home"!==$state.previous.name&&"verify"!==$state.previous.name&&""!==$state.previous.name?$state.go($state.previous.name):$state.go("listForms")},function(error){$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user,$scope.error=error,console.log("loginError: "+error)})},$scope.signup=function(){console.log($scope.credentials),User.signup($scope.credentials).then(function(response){console.log("signup-success"),$state.go("signup-success")},function(error){console.log("Error: "),console.log(error),error?($scope.error=error,console.log(error)):console.log("No response received")})}}]),angular.module("users").controller("PasswordController",["$scope","$stateParams","$state","User",function($scope,$stateParams,$state,User){$scope.error="",$scope.askForPasswordReset=function(){User.askForPasswordReset($scope.credentials).then(function(response){$scope.success=response.message,$scope.credentials=null},function(error){$scope.error=error,$scope.credentials=null})},$scope.resetUserPassword=function(){$scope.success=$scope.error=null,User.resetPassword($scope.passwordDetails,$stateParams.token).then(function(response){$scope.success=response.message,$scope.passwordDetails=null,$state.go("reset-success")},function(error){$scope.error=error.message||error,$scope.passwordDetails=null})}}]),angular.module("users").controller("SettingsController",["$scope","$rootScope","$http","$state","Users",function($scope,$rootScope,$http,$state,Users){$scope.user=$rootScope.user,$scope.hasConnectedAdditionalSocialAccounts=function(provider){for(var i in $scope.user.additionalProvidersData)return!0;return!1},$scope.isConnectedSocialAccount=function(provider){return $scope.user.provider===provider||$scope.user.additionalProvidersData&&$scope.user.additionalProvidersData[provider]},$scope.removeUserSocialAccount=function(provider){$scope.success=$scope.error=null,$http["delete"]("/users/accounts",{params:{provider:provider}}).success(function(response){$scope.success=!0,$scope.user=response}).error(function(response){$scope.error=response.message})},$scope.updateUserProfile=function(isValid){if(isValid){$scope.success=$scope.error=null;var user=new Users($scope.user);user.$update(function(response){$scope.success=!0,$scope.user=response},function(response){$scope.error=response.data.message})}else $scope.submitted=!0},$scope.changeUserPassword=function(){$scope.success=$scope.error=null,$http.post("/users/password",$scope.passwordDetails).success(function(response){$scope.success=!0,$scope.passwordDetails=null}).error(function(response){$scope.error=response.message})}}]),angular.module("users").controller("VerifyController",["$scope","$state","$rootScope","User","Auth","$stateParams",function($scope,$state,$rootScope,User,Auth,$stateParams){$scope.isResetSent=!1,$scope.credentials={},$scope.error="",$scope.resendVerifyEmail=function(){User.resendVerifyEmail($scope.credentials.email).then(function(response){console.log(response),$scope.success=response.message,$scope.credentials=null,$scope.isResetSent=!0},function(error){$scope.error=error,$scope.credentials.email=null,$scope.isResetSent=!1})},$scope.validateVerifyToken=function(){$stateParams.token&&(console.log($stateParams.token),User.validateVerifyToken($stateParams.token).then(function(response){console.log("Success: "+response.message),$scope.success=response.message,$scope.isResetSent=!0,$scope.credentials.email=null},function(error){console.log("Error: "+error.message),$scope.isResetSent=!1,$scope.error=error,$scope.credentials.email=null}))}}]),angular.module("users").factory("Auth",["$window",function($window){var userState={isLoggedIn:!1},service={_currentUser:null,get currentUser(){return this._currentUser},ensureHasCurrentUser:function(User){return service._currentUser&&service._currentUser.username?service._currentUser:$window.user?(service._currentUser=$window.user,service._currentUser):void User.getCurrent().then(function(user){return service._currentUser=user,userState.isLoggedIn=!0,$window.user=service._currentUser,service._currentUser},function(response){return userState.isLoggedIn=!1,service._currentUser=null,$window.user=null,console.log("User.getCurrent() err",response),null})},isAuthenticated:function(){return!!service._currentUser},getUserState:function(){return userState},login:function(new_user){userState.isLoggedIn=!0,service._currentUser=new_user},logout:function(){$window.user=null,userState.isLoggedIn=!1,service._currentUser=null}};return service}]),angular.module("users").service("Authorizer",["APP_PERMISSIONS","USER_ROLES",function(APP_PERMISSIONS,USER_ROLES){return function(user){return{canAccess:function(permissions){var i,len,permission;for(angular.isArray(permissions)||(permissions=[permissions]),i=0,len=permissions.length;len>i;i++){if(permission=permissions[i],null===APP_PERMISSIONS[permission])throw"Bad permission value";if(!user||!user.roles)return!1;switch(permission){case APP_PERMISSIONS.viewAdminSettings:case APP_PERMISSIONS.editAdminSettings:return user.roles.indexOf(USER_ROLES.admin)>-1;case APP_PERMISSIONS.viewPrivateForm:case APP_PERMISSIONS.editForm:return user.roles.indexOf(USER_ROLES.admin)>-1||user.roles.indexOf(USER_ROLES.normal)>-1}}return!1}}}}]),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function($window,$q,$timeout,$http,$state){var userService={getCurrent:function(){var deferred=$q.defer();return $http.get("/users/me").success(function(response){deferred.resolve(response)}).error(function(){deferred.reject("User's session has expired")}),deferred.promise},login:function(credentials){var deferred=$q.defer();return $http.post("/auth/signin",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},logout:function(){var deferred=$q.defer();return $http.get("/auth/signout").success(function(response){deferred.resolve(null)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},signup:function(credentials){var deferred=$q.defer();return $http.post("/auth/signup",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},resendVerifyEmail:function(_email){var deferred=$q.defer();return $http.post("/auth/verify",{email:_email}).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},validateVerifyToken:function(token){var validTokenRe=/^([A-Za-z0-9]{48})$/g;if(!validTokenRe.test(token))throw new Error("Error token: "+token+" is not a valid verification token");var deferred=$q.defer();return $http.get("/auth/verify/"+token).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error)}),deferred.promise},resetPassword:function(passwordDetails,token){var deferred=$q.defer();return $http.get("/auth/password/"+token,passwordDetails).success(function(response){deferred.resolve()}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},askForPasswordReset:function(credentials){var deferred=$q.defer();return $http.post("/auth/forgot",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise}};return userService}]),angular.module("users").factory("Users",["$resource",function($resource){return $resource("users",{},{update:{method:"PUT"}})}]); ======= +<<<<<<< 95d6fb967b8d351fe9e17be40be308a8fe73c55f +function removeDateFieldsFunc(o){function eachObject(v,k){"lastModified"!==k&&"created"!==k||delete clone[i][k]}for(var clone=_.clone(o),i=0;i'),$templateCache.put("../public/modules/core/views/home.client.view.html",'

Craft beautiful forms in seconds.

Create your next ______.

Tell a story with a form.

'),$templateCache.put("../public/modules/forms/views/admin-form.client.view.html",'
'),$templateCache.put("../public/modules/forms/views/list-forms.client.view.html",'

Create a new form
Name
Language

'),$templateCache.put("../public/modules/forms/views/submit-form.client.view.html","√
"),$templateCache.put("../public/modules/forms/views/adminTabs/analyze.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/configure.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/create.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/design.html",'
Background Color
Question Text Color
Answer Text Color
Button Background Color
Button Text Color
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeA.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/entryPage/startPage.html",'

{{pageData.introTitle}}

{{pageData.introParagraph}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/date.html",'

{{index+1}} {{field.title}} optional

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/dropdown.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/file.html",'

{{index+1}} {{field.title}} optional

{{field.file.originalname}}
Upload your File
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/hidden.html",''),$templateCache.put("../public/modules/forms/views/directiveViews/field/legal.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/radio.html",'

{{index+1}} {{field.title}} optional


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/rating.html",'
\n

\n \n {{index+1}}\n \n \n {{field.title}} \n optional\n

\n
\n
\n \n \n
\n
\n'),$templateCache.put("../public/modules/forms/views/directiveViews/field/statement.html",'

{{field.title}}

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textarea.html",'

{{index+1}} {{field.title}} optional

press SHIFT+ENTER to create a newline
press ENTER
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textfield.html",'

{{index+1}} {{field.title}} (optional)

press ENTER
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/yes_no.html",'

{{index+1}} {{field.title}} optional

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/form/configure-form.client.view.html",'
Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.name}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type
Form Name
Form Status
Language
* required
Display Form Footer?
Display Start Page?
'), +$templateCache.put("../public/modules/forms/views/directiveViews/form/edit-form.client.view.html",'

Edit Start Page


Intro Title:
Intro Paragraph:
\n
\n\n

\n
\n
Options:
\n
\n
\n \n\n \n \n \n
\n
\n \n
\n
\n
\n\n

\n\n
\n
Required:
\n
\n \n\n \n
\n
\n\n
\n
Disabled:
\n
\n \n\n \n
\n
\n\n
\n \n\n
\n
\n

\n Click on Fields to add them here\n

\n
\n
\n\n
\n \n
\n\n \n \n\n \n
\n
\n\n'),$templateCache.put("../public/modules/forms/views/directiveViews/form/edit-submissions-form.client.view.html",'
#{{value.title}}OscarEMR User ProfilePercentage CompleteTime ElapsedDeviceLocationIP AddressDate Submitted (UTC)Generated PDF
{{$index+1}}{{field.fieldValue}}User Profile #{{row.oscarDemoNum}}{{row.percentageComplete}}%{{row.timeElapsed}}{{row.device.name}}, {{row.device.type}}{{row.geoLocation.city}}, {{row.geoLocation.country}}{{row.ipAddr}}{{row.created | date:\'yyyy-MM-dd HH:mm:ss\'}}Generated PDF
'),$templateCache.put("../public/modules/forms/views/directiveViews/form/submit-form.client.view.html",'
{{form_fields_count - (myform | formValidity)}} answer(s) need completing
'),$templateCache.put("../public/modules/users/views/authentication/access-denied.client.view.html",'

You need to be logged in to access this page

Login
'),$templateCache.put("../public/modules/users/views/authentication/signin.client.view.html",'

Sign into your account

'),$templateCache.put("../public/modules/users/views/authentication/signup-success.client.view.html",''),$templateCache.put("../public/modules/users/views/authentication/signup.client.view.html",''),$templateCache.put("../public/modules/users/views/password/forgot-password.client.view.html",'

Restore your password

Enter your account email.

'),$templateCache.put("../public/modules/users/views/password/reset-password-invalid.client.view.html",'

Password reset is invalid

Ask for a new password reset
'),$templateCache.put("../public/modules/users/views/password/reset-password-success.client.view.html",'

Password successfully reset

Continue to home page
'),$templateCache.put("../public/modules/users/views/password/reset-password.client.view.html",'

Reset your password

'),$templateCache.put("../public/modules/users/views/settings/change-password.client.view.html",'

Change your password

'),$templateCache.put("../public/modules/users/views/settings/edit-profile.client.view.html",'

Edit your profile

'), +$templateCache.put("../public/modules/users/views/settings/social-accounts.client.view.html",'

Connected social accounts:

Connect other social accounts:

'),$templateCache.put("../public/modules/users/views/verify/resend-verify-email.client.view.html",'

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at hi@TellForm.com

'),$templateCache.put("../public/modules/users/views/verify/verify-account.client.view.html",'

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
')}]);var ApplicationConfiguration=function(){var applicationModuleName="NodeForm",applicationModuleVendorDependencies=["duScroll","ui.select","cgBusy","ngSanitize","vButton","ngResource","NodeForm.templates","ui.router","ui.bootstrap","ui.utils"],registerModule=function(moduleName,dependencies){angular.module(moduleName,dependencies||[]),angular.module(applicationModuleName).requires.push(moduleName)};return{applicationModuleName:applicationModuleName,applicationModuleVendorDependencies:applicationModuleVendorDependencies,registerModule:registerModule}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function($locationProvider){$locationProvider.hashPrefix("!")}]),angular.module(ApplicationConfiguration.applicationModuleName).constant("APP_PERMISSIONS",{viewAdminSettings:"viewAdminSettings",editAdminSettings:"editAdminSettings",editForm:"editForm",viewPrivateForm:"viewPrivateForm"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("USER_ROLES",{admin:"admin",normal:"user",superuser:"superuser"}),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","$state","$stateParams",function($rootScope,Auth,$state,$stateParams){$rootScope.$state=$state,$rootScope.$stateParams=$stateParams,$rootScope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState){$state.previous=fromState;var statesToIgnore=["home","signin","resendVerifyEmail","verify","signup","signup-success","forgot","reset-invalid","reset","reset-success"];statesToIgnore.indexOf(toState.name)>0?Auth.isAuthenticated()&&(event.preventDefault(),$state.go("listForms")):"access_denied"===toState.name||Auth.isAuthenticated()||"submitForm"===toState.name||(console.log("go to signup"),event.preventDefault(),$state.go("listForms"))})}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","User","Authorizer","$state","$stateParams",function($rootScope,Auth,User,Authorizer,$state,$stateParams){$rootScope.$on("$stateChangeStart",function(event,next){var authenticator,permissions,user;permissions=next&&next.data&&next.data.permissions?next.data.permissions:null,Auth.ensureHasCurrentUser(User),user=Auth.currentUser,user&&(authenticator=new Authorizer(user),null!=permissions&&(authenticator.canAccess(permissions)||(event.preventDefault(),$state.go("access_denied"))))})}]),angular.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),ApplicationConfiguration.registerModule("core",["users"]),ApplicationConfiguration.registerModule("forms",["ngFileUpload","ui.router.tabs","colorpicker.module","ui.date","ui.sortable","angular-input-stars","users"]),ApplicationConfiguration.registerModule("users"),angular.module("core").config(["$stateProvider","$urlRouterProvider",function($stateProvider,$urlRouterProvider,Authorization){$urlRouterProvider.otherwise("/forms")}]),angular.module("core").controller("HeaderController",["$rootScope","$scope","Menus","$state","Auth","User","$window",function($rootScope,$scope,Menus,$state,Auth,User,$window){$rootScope.signupDisabled=$window.signupDisabled,$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.authentication=$rootScope.authentication=Auth,$rootScope.languages=$scope.languages=["english","french","spanish"],$scope.isCollapsed=!1,$rootScope.hideNav=!1,$scope.menu=Menus.getMenu("topbar"),$scope.signout=function(){var promise=User.logout();promise.then(function(){Auth.logout(),Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user=null,$state.go("listForms")},function(reason){console.log("Logout Failed: "+reason)})},$scope.toggleCollapsibleMenu=function(){$scope.isCollapsed=!$scope.isCollapsed},$scope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState,fromParams){$scope.isCollapsed=!1,$rootScope.hideNav=!1,angular.isDefined(toState.data)&&angular.isDefined(toState.data.hideNav)&&($rootScope.hideNav=toState.data.hideNav)})}]),angular.module("core").controller("HomeController",["$rootScope","$scope","User","$state",function($rootScope,$scope,User,$state){$scope=$rootScope}]),angular.module("core").service("Menus",[function(){this.defaultRoles=["*"],this.menus={};var shouldRender=function(user){if(!user)return this.isPublic;if(~this.roles.indexOf("*"))return!0;for(var userRoleIndex in user.roles)for(var roleIndex in this.roles)if(console.log(this.roles[roleIndex]),console.log(this.roles[roleIndex]===user.roles[userRoleIndex]),this.roles[roleIndex]===user.roles[userRoleIndex])return!0;return!1};this.validateMenuExistance=function(menuId){if(menuId&&menuId.length){if(this.menus[menuId])return!0;throw new Error("Menu does not exists")}throw new Error("MenuId was not provided")},this.getMenu=function(menuId){return this.validateMenuExistance(menuId),this.menus[menuId]},this.addMenu=function(menuId,isPublic,roles){return this.menus[menuId]={isPublic:isPublic||!1,roles:roles||this.defaultRoles,items:[],shouldRender:shouldRender},this.menus[menuId]},this.removeMenu=function(menuId){this.validateMenuExistance(menuId),delete this.menus[menuId]},this.addMenuItem=function(menuId,menuItemTitle,menuItemURL,menuItemType,menuItemUIRoute,isPublic,roles,position){return this.validateMenuExistance(menuId),this.menus[menuId].items.push({title:menuItemTitle,link:menuItemURL,menuItemType:menuItemType||"item",menuItemClass:menuItemType,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].roles:roles,position:position||0,items:[],shouldRender:shouldRender}),this.menus[menuId]},this.addSubMenuItem=function(menuId,rootMenuItemURL,menuItemTitle,menuItemURL,menuItemUIRoute,isPublic,roles,position){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===rootMenuItemURL&&this.menus[menuId].items[itemIndex].items.push({title:menuItemTitle,link:menuItemURL,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].items[itemIndex].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].items[itemIndex].roles:roles,position:position||0,shouldRender:shouldRender});return this.menus[menuId]},this.removeMenuItem=function(menuId,menuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===menuItemURL&&this.menus[menuId].items.splice(itemIndex,1);return this.menus[menuId]},this.removeSubMenuItem=function(menuId,submenuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)for(var subitemIndex in this.menus[menuId].items[itemIndex].items)this.menus[menuId].items[itemIndex].items[subitemIndex].link===submenuItemURL&&this.menus[menuId].items[itemIndex].items.splice(subitemIndex,1);return this.menus[menuId]},this.addMenu("topbar",!1,["*"]),this.addMenu("bottombar",!1,["*"])}]),angular.module("forms").run(["Menus",function(Menus){Menus.addMenuItem("topbar","My Forms","forms","","/forms",!1)}]).filter("formValidity",function(){return function(formObj){if(formObj&&formObj.form_fields&&formObj.visible_form_fields){var formKeys=Object.keys(formObj),fields=(formKeys.filter(function(key){return"$"!==key[0]}),formObj.form_fields),valid_count=fields.filter(function(field){return"object"==typeof field&&"statement"!==field.fieldType&&"rating"!==field.fieldType?!!field.fieldValue:void 0}).length;return valid_count-(formObj.form_fields.length-formObj.visible_form_fields.length)}return 0}}).config(["$provide",function($provide){$provide.decorator("accordionDirective",["$delegate",function($delegate){var directive=$delegate[0];return directive.replace=!0,$delegate}])}]),angular.module("forms").config(["$stateProvider",function($stateProvider){$stateProvider.state("listForms",{url:"/forms",templateUrl:"modules/forms/views/list-forms.client.view.html"}).state("submitForm",{url:"/forms/:formId",templateUrl:"modules/forms/views/submit-form.client.view.html",data:{hideNav:!0},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"SubmitFormController",controllerAs:"ctrl"}).state("viewForm",{url:"/forms/:formId/admin",templateUrl:"modules/forms/views/admin-form.client.view.html",data:{permissions:["editForm"]},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"AdminFormController"}).state("viewForm.configure",{url:"/configure",templateUrl:"modules/forms/views/adminTabs/configure.html"}).state("viewForm.design",{url:"/design",templateUrl:"modules/forms/views/adminTabs/design.html"}).state("viewForm.analyze",{url:"/analyze",templateUrl:"modules/forms/views/adminTabs/analyze.html"}).state("viewForm.create",{url:"/create",templateUrl:"modules/forms/views/adminTabs/create.html"})}]),angular.module("forms").controller("AdminFormController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http","$uibModal","myForm",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http,$uibModal,myForm){$scope=$rootScope,$scope.animationsEnabled=!0,$scope.myform=myForm,$rootScope.saveInProgress=!1,CurrentForm.setForm($scope.myform),$scope.tabData=[{heading:"Create",route:"viewForm.create"},{heading:"Design",route:"viewForm.design"},{heading:"Configure",route:"viewForm.configure"},{heading:"Analyze",route:"viewForm.analyze"}],$scope.setForm=function(form){$scope.myform=form},$rootScope.resetForm=function(){$scope.myform=Forms.get({formId:$stateParams.formId})},$scope.openDeleteModal=function(){$scope.deleteModal=$uibModal.open({animation:$scope.animationsEnabled,templateUrl:"myModalContent.html",controller:"AdminFormController",resolve:{myForm:function(){return $scope.myform}}}),$scope.deleteModal.result.then(function(selectedItem){$scope.selected=selectedItem},function(){console.log("Modal dismissed at: "+new Date)})},$scope.cancelDeleteModal=function(){$scope.deleteModal&&$scope.deleteModal.dismiss("cancel")},$scope.removeCurrentForm=function(){if($scope.deleteModal&&$scope.deleteModal.opened){$scope.deleteModal.close();var form_id=$scope.myform._id;if(!form_id)throw new Error("Error - removeCurrentForm(): $scope.myform._id does not exist");$http["delete"]("/forms/"+form_id).success(function(data,status,headers){console.log("form deleted successfully"),$state.go("listForms",{},{reload:!0})}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}},$scope.update=$rootScope.update=function(updateImmediately,cb){var continueUpdate=!0;if(updateImmediately||(continueUpdate=!$rootScope.saveInProgress),continueUpdate){var err=null;updateImmediately||($rootScope.saveInProgress=!0),$scope.updatePromise=$http.put("/forms/"+$scope.myform._id,{form:$scope.myform}).then(function(response){$rootScope.myform=$scope.myform=response.data})["catch"](function(response){console.log("Error occured during form UPDATE.\n"),err=response.data})["finally"](function(){return updateImmediately||($rootScope.saveInProgress=!1),"function"==typeof cb?cb(err):void 0})}}}]),angular.module("forms").controller("ListFormsController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http){$scope=$rootScope,$scope.forms={},$scope.showCreateModal=!1,$scope.findAll=function(){Forms.query(function(_forms){$scope.myforms=_forms})},$scope.openCreateModal=function(){$scope.showCreateModal||($scope.showCreateModal=!0)},$scope.closeCreateModal=function(){$scope.showCreateModal&&($scope.showCreateModal=!1)},$scope.setForm=function(form){$scope.myform=form},$scope.goToWithId=function(route,id){$state.go(route,{formId:id},{reload:!0})},$scope.duplicateForm=function(form_index){var form=_.cloneDeep($scope.myforms[form_index]);delete form._id,$http.post("/forms",{form:form}).success(function(data,status,headers){$scope.myforms.splice(form_index+1,0,data)}).error(function(errorResponse){console.error(errorResponse),null===errorResponse&&($scope.error=errorResponse.data.message)})},$scope.createNewForm=function(){var form={};form.title=$scope.forms.createForm.title.$modelValue,form.language=$scope.forms.createForm.language.$modelValue,$scope.forms.createForm.$valid&&$scope.forms.createForm.$dirty&&$http.post("/forms",{form:form}).success(function(data,status,headers){console.log("new form created"),$scope.goToWithId("viewForm.create",data._id+"")}).error(function(errorResponse){console.error(errorResponse),$scope.error=errorResponse.data.message})},$scope.removeForm=function(form_index){if(form_index>=$scope.myforms.length||0>form_index)throw new Error("Error: form_index in removeForm() must be between 0 and "+$scope.myforms.length-1);$http["delete"]("/forms/"+$scope.myforms[form_index]._id).success(function(data,status,headers){console.log("form deleted successfully"),$scope.myforms.splice(form_index,1)}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}}]),angular.module("forms").controller("SubmitFormController",["$scope","$rootScope","$state","myForm","Auth",function($scope,$rootScope,$state,myForm,Auth){$scope.authentication=Auth,$scope.myform=myForm,$scope.myform.isLive?$scope.hideNav=$rootScope.hideNav=!0:$scope.authentication.isAuthenticated()?$scope.hideNav=$rootScope.hideNav=!1:($scope.hideNav=$rootScope.hideNav=!0,$state.go("access_denied"))}]),_.mixin({removeDateFields:removeDateFieldsFunc}),angular.module("forms").directive("autoSaveForm",["$rootScope","$timeout",function($rootScope,$timeout){return{require:["^form"],restrict:"AE",link:function($scope,$element,$attrs,$ctrls){angular.element(document).ready(function(){var $formCtrl=$ctrls[0],savePromise=null;$rootScope.finishedRender=!1,$scope.$on("editFormFields Started",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!1}),$scope.$on("editFormFields Finished",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!0}),$scope.anyDirtyAndTouched=function(form){var propCount=0;for(var prop in form)if(form.hasOwnProperty(prop)&&"$"!==prop[0]&&(propCount++,form[prop].$touched&&form[prop].$dirty))return!0;return!1};var debounceSave=function(){$rootScope.saveInProgress=!0,$rootScope[$attrs.autoSaveCallback](!0,function(err){err?(console.error("Error form data NOT persisted"),console.error(err)):(console.log("\n\nForm data persisted -- setting pristine flag"),$formCtrl.$setPristine(),$formCtrl.$setUntouched())})};$scope.$watch(function(newValue,oldValue){console.log("introParagraphStartPage.$dirty: "+$scope.editForm.introParagraphStartPage.$dirty),console.log("introParagraphStartPage.$touched: "+$scope.editForm.introParagraphStartPage.$touched),$rootScope.finishedRender&&$scope.anyDirtyAndTouched($scope.editForm)&&!$rootScope.saveInProgress&&(console.log("Form saving started"),debounceSave(),console.log("introParagraphStartPage.$dirty AFTER: "+$scope.editForm.introParagraphStartPage.$dirty))}),$scope.$watch($attrs.autoSaveWatch,function(newValue,oldValue){newValue=angular.copy(newValue),oldValue=angular.copy(oldValue),newValue.form_fields=_.removeDateFields(newValue.form_fields),oldValue.form_fields=_.removeDateFields(oldValue.form_fields);var changedFields=!_.isEqual(oldValue.form_fields,newValue.form_fields)||!_.isEqual(oldValue.startPage,newValue.startPage),changedFieldMap=!1;oldValue.hasOwnProperty("plugins.oscarhost.settings.fieldMap")&&(changedFieldMap=!!oldValue.plugins.oscarhost.settings.fieldMap&&!_.isEqual(oldValue.plugins.oscarhost.settings.fieldMap,newValue.plugins.oscarhost.settings.fieldMap)),(newValue||oldValue)&&oldValue&&(0===oldValue.form_fields.length&&($rootScope.finishedRender=!0),$rootScope.finishedRender&&(changedFields&&!$formCtrl.$dirty||changedFieldMap)&&!$rootScope.saveInProgress?(savePromise&&($timeout.cancel(savePromise),savePromise=null),savePromise=$timeout(function(){debounceSave()})):$rootScope.finishedRender&&$rootScope.saveInProgress&&($rootScope.saveInProgress=!1))},!0)})}}}]),angular.module("forms").directive("configureFormDirective",["$rootScope","$http","Upload","CurrentForm",function($rootScope,$http,Upload,CurrentForm){return{templateUrl:"modules/forms/views/directiveViews/form/configure-form.client.view.html",restrict:"E",scope:{myform:"=",user:"=",pdfFields:"@",formFields:"@"},controller:["$scope",function($scope){console.log($scope.myform),CurrentForm.getForm().plugins?CurrentForm.getForm().plugins.oscarhost.baseUrl&&($scope.oscarhostAPI=!0):$scope.oscarhostAPI=!1,$scope.log="",$scope.pdfLoading=!1,$scope.languages=$rootScope.languages,this._current_upload=null,$scope.resetForm=$rootScope.resetForm,$scope.update=$rootScope.update,this._unbindedPdfFields=$scope.pdfFields,$scope.cancelUpload=function(){this._current_upload.abort(),$scope.pdfLoading=!1,$scope.removePDF()},$scope.removePDF=function(){$scope.myform.pdf=null,$scope.myform.isGenerated=!1,$scope.myform.autofillPDFs=!1,console.log("form.pdf: "+$scope.myform.pdf+" REMOVED")},$scope.uploadPDF=function(file){file&&(console.log(file),Upload.upload({url:"/upload/pdf",data:{user:$scope.user,file:file}}).then(function(resp){var data=resp.data;$scope.log="file "+data.originalname+" uploaded as "+data.filename+". JSON: "+JSON.stringify(data)+"\n"+$scope.log,$scope.myform.pdf=angular.fromJson(angular.toJson(data)),$scope.pdfLoading=!1,console.log($scope.log),$scope.$$phase||$scope.$digest||$scope.$apply()},function(resp){$scope.pdfLoading=!1,console.log("Error occured during upload.\n"),console.log(resp.status)},function(evt){var progressPercentage=parseInt(100*evt.loaded/evt.total,10);$scope.log="progress: "+progressPercentage+"% "+evt.config.data.file.name+"\n"+$scope.log,console.log($scope.log),$scope.pdfLoading=!0}))}}]}}]),angular.module("forms").directive("editFormDirective",["$rootScope","FormFields",function($rootScope,FormFields){return{templateUrl:"modules/forms/views/directiveViews/form/edit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$scope",function($scope){for(var field_ids=_($scope.myform.form_fields).pluck("_id"),i=0;i0){$scope.myform.plugins.oscarhost.settings.fieldMap||($scope.myform.plugins.oscarhost.settings.fieldMap={});var oscarhostFields=$scope.myform.plugins.oscarhost.settings.validFields,currentFields=_($scope.myform.plugins.oscarhost.settings.fieldMap).invert().keys().value();return $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id)&&(currentFields=_(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id])),_(oscarhostFields).difference(currentFields).value()}return[]},$scope.dropzone={handle:" .handle",containment:".dropzoneContainer",cursor:"grabbing"},$scope.addNewField=function(modifyForm,fieldType){$scope.addField.lastAddedID++;for(var fieldTitle,i=0;i<$scope.addField.types.length;i++)if($scope.addField.types[i].name===fieldType){$scope.addField.types[i].lastAddedID++,fieldTitle=$scope.addField.types[i].value+$scope.addField.types[i].lastAddedID;break}var newField={title:fieldTitle,fieldType:fieldType,fieldValue:"",required:!0,disabled:!1,deletePreserved:!1};return modifyForm&&$scope.myform.form_fields.push(newField),newField},$scope.deleteField=function(field_index){var currFieldId=$scope.myform.form_fields[field_index]._id;$scope.myform.hasOwnProperty("plugins.oscarhost.baseUrl")&&delete $scope.myform.plugins.oscarhost.settings.fieldMap[currFieldId],$scope.myform.form_fields.splice(field_index,1)},$scope.duplicateField=function(field_index){var currField=_.cloneDeep($scope.myform.form_fields[field_index]);currField._id="cloned"+_.uniqueId(),currField.title+=" copy",$scope.myform.form_fields.splice(field_index+1,0,currField)},$scope.addButton=function(){var newButton={};newButton.bgColor="#ddd",newButton.color="#ffffff",newButton.text="Button",newButton._id=Math.floor(1e5*Math.random()),$scope.myform.startPage.buttons.push(newButton)},$scope.deleteButton=function(button){for(var currID,i=0;i<$scope.myform.startPage.buttons.length;i++)if(currID=$scope.myform.startPage.buttons[i]._id,console.log(currID),currID===button._id){$scope.myform.startPage.buttons.splice(i,1);break}},$scope.addOption=function(field_index){var currField=$scope.myform.form_fields[field_index];if(console.log(field_index),console.log(currField),"checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType){currField.fieldOptions||($scope.myform.form_fields[field_index].fieldOptions=[]);var lastOptionID=0;currField.fieldOptions[currField.fieldOptions.length-1]&&(lastOptionID=currField.fieldOptions[currField.fieldOptions.length-1].option_id);var newOption={option_id:Math.floor(1e5*Math.random()),option_title:"Option "+lastOptionID,option_value:"Option "+lastOptionID};$scope.myform.form_fields[field_index].fieldOptions.push(newOption)}},$scope.deleteOption=function(field_index,option){var currField=$scope.myform.form_fields[field_index];if("checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType)for(var i=0;i',restrict:"E",scope:{typeName:"@"},controller:["$scope",function($scope){var iconTypeMap={textfield:"fa fa-pencil-square-o",dropdown:"fa fa-th-list",date:"fa fa-calendar",checkbox:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",email:"fa fa-envelope-o",textarea:"fa fa-pencil-square",legal:"fa fa-legal",file:"fa fa-cloud-upload",rating:"fa fa-star-half-o",link:"fa fa-link",scale:"fa fa-sliders",stripe:"fa fa-credit-card",statement:"fa fa-quote-left",yes_no:"fa fa-toggle-on",number:"fa fa-slack"};$scope.typeIcon=iconTypeMap[$scope.typeName]}]}});var __indexOf=[].indexOf||function(item){for(var i=0,l=this.length;l>i;i++)if(i in this&&this[i]===item)return i;return-1};angular.module("forms").directive("fieldDirective",["$http","$compile","$rootScope","$templateCache",function($http,$compile,$rootScope,$templateCache){var getTemplateUrl=function(fieldType){var type=fieldType,templateUrl="modules/forms/views/directiveViews/field/",supported_fields=["textfield","textarea","date","dropdown","hidden","password","radio","legal","statement","rating","yes_no","number","natural"];return __indexOf.call(supported_fields,type)>=0&&(templateUrl=templateUrl+type+".html"),$templateCache.get("../public/"+templateUrl)};return{template:"
{{field.title}}
",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(scope,element){$rootScope.chooseDefaultOption=scope.chooseDefaultOption=function(type){"yes_no"===type?scope.field.fieldValue="true":"rating"===type?scope.field.fieldValue=0:"radio"===scope.field.fieldType?(console.log(scope.field),scope.field.fieldValue=scope.field.fieldOptions[0].option_value,console.log(scope.field.fieldValue)):"legal"===type&&(scope.field.fieldValue="true",$rootScope.nextField())},scope.setActiveField=$rootScope.setActiveField,"date"===scope.field.fieldType&&(scope.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var fieldType=scope.field.fieldType;if("number"===scope.field.fieldType||"textfield"===scope.field.fieldType||"email"===scope.field.fieldType||"link"===scope.field.fieldType){switch(scope.field.fieldType){case"textfield":scope.field.input_type="text";break;case"email":scope.field.input_type="email",scope.field.placeholder="joesmith@example.com";break;case"number":scope.field.input_type="text",scope.field.validateRegex=/^\d+$/;break;default:scope.field.input_type="url",scope.field.placeholder="http://example.com"}fieldType="textfield"}var template=getTemplateUrl(fieldType);element.html(template).show(),$compile(element.contents())(scope)}}}]),angular.module("forms").directive("keyToOption",function(){return{restrict:"A",scope:{field:"="},link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){console.log("keypress");var keyCode=event.which||event.keyCode,index=parseInt(String.fromCharCode(keyCode))-1;console.log($scope.field),index<$scope.field.fieldOptions.length&&(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue=$scope.field.fieldOptions[index].option_value}))})}}}),angular.module("forms").directive("keyToTruthy",["$rootScope",function($rootScope){return{restrict:"A",scope:{field:"="},link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,truthyKeyCode=$attrs.keyCharTruthy.charCodeAt(0)-32,falseyKeyCode=$attrs.keyCharFalsey.charCodeAt(0)-32;keyCode===truthyKeyCode?(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue="true"})):keyCode===falseyKeyCode&&(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue="false"}))})}}}]),angular.module("forms").directive("onEnterKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){ +$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;13!==keyCode||event.shiftKey||(event.preventDefault(),$rootScope.$apply(function(){$rootScope.$eval($attrs.onEnterKey)}))})}}}]),angular.module("forms").directive("onFinishRender",["$rootScope","$timeout",function($rootScope,$timeout){return{restrict:"A",link:function(scope,element,attrs){if(element.attr("ng-repeat")||element.attr("data-ng-repeat")){var broadcastMessage=attrs.onFinishRender||"ngRepeat";scope.$first&&!scope.$last?scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Started")}):scope.$last&&scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Finished")})}}}}]),angular.module("forms").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","Auth",function($http,TimeCounter,$filter,$rootScope,Auth){return{templateUrl:"modules/forms/views/directiveViews/form/submit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$document","$window","$scope",function($document,$window,$scope){$scope.authentication=$rootScope.authentication,$scope.noscroll=!1,$scope.forms={},$scope.form_fields_count=$scope.myform.visible_form_fields.filter(function(field){return"statement"!==field.fieldType&&"rating"!==field.fieldType}).length,$scope.reloadForm=function(){$scope.myform.submitted=!1,$scope.myform.form_fields=_.chain($scope.myform.visible_form_fields).map(function(field){return field.fieldValue="",field}).value(),$scope.loading=!1,$scope.error="",$scope.selected={_id:"",index:0},$scope.setActiveField($scope.myform.visible_form_fields[0]._id,0,!1),TimeCounter.restartClock()},$window.onscroll=function(){$scope.scrollPos=document.body.scrollTop||document.documentElement.scrollTop||0;var elemBox=document.getElementsByClassName("activeField")[0].getBoundingClientRect();$scope.fieldTop=elemBox.top,$scope.fieldBottom=elemBox.bottom;var field_id,field_index;$scope.noscroll||($scope.selected.index===$scope.myform.form_fields.length-1&&$scope.fieldBottom<200?(field_index=$scope.selected.index+1,field_id="submit_field",$scope.setActiveField(field_id,field_index,!1)):$scope.selected.index===$scope.myform.form_fields.length?$scope.fieldTop>200&&(field_index=$scope.selected.index-1,field_id=$scope.myform.form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):$scope.fieldBottom<0?(field_index=$scope.selected.index+1,field_id=$scope.myform.form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):0!==$scope.selected.index&&$scope.fieldTop>0&&(field_index=$scope.selected.index-1,field_id=$scope.myform.form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)),$scope.$apply())},$scope.setActiveField=$rootScope.setActiveField=function(field_id,field_index,animateScroll){null!==$scope.selected&&$scope.selected._id!==field_id&&(console.log("field_id: "+field_id),console.log("field_index: "+field_index),$scope.selected._id=field_id,$scope.selected.index=field_index,animateScroll&&($scope.noscroll=!0,setTimeout(function(){$document.scrollToElement(angular.element(".activeField"),-10,200).then(function(){$scope.noscroll=!1,setTimeout(function(){document.querySelectorAll(".activeField .focusOn")[0]?(console.log(document.querySelectorAll(".activeField .focusOn")[0]),document.querySelectorAll(".activeField .focusOn")[0].focus()):document.querySelectorAll(".activeField input")[0].focus()})})})))},$rootScope.nextField=$scope.nextField=function(){var selected_index,selected_id;$scope.selected.index<$scope.myform.form_fields.length-1?(selected_index=$scope.selected.index+1,selected_id=$scope.myform.form_fields[selected_index]._id,$rootScope.setActiveField(selected_id,selected_index,!0)):$scope.selected.index===$scope.myform.form_fields.length-1&&(console.log("Second last element"),selected_index=$scope.selected.index+1,selected_id="submit_field",$rootScope.setActiveField(selected_id,selected_index,!0))},$rootScope.prevField=$scope.prevField=function(){if($scope.selected.index>0){var selected_index=$scope.selected.index-1,selected_id=$scope.myform.form_fields[selected_index]._id;$scope.setActiveField(selected_id,selected_index,!0)}},$scope.exitStartPage=function(){$scope.myform.startPage.showStart=!1,$scope.myform.form_fields.length>0&&($scope.selected._id=$scope.myform.form_fields[0]._id)},$scope.goToInvalid=function(){document.querySelectorAll(".ng-invalid.focusOn")[0].focus()},$scope.submitForm=function(){var _timeElapsed=TimeCounter.stopClock();$scope.loading=!0;var form=_.cloneDeep($scope.myform);form.timeElapsed=_timeElapsed,form.percentageComplete=$filter("formValidity")($scope.myform)/$scope.myform.visible_form_fields.length*100,delete form.visible_form_fields,setTimeout(function(){$scope.submitPromise=$http.post("/forms/"+$scope.myform._id,form).success(function(data,status,headers){$scope.myform.submitted=!0,$scope.loading=!1}).error(function(error){$scope.loading=!1,$scope.error=error.message})},500)},$scope.reloadForm()}]}}]),angular.module("forms").service("CurrentForm",function(){var _form={};this.getForm=function(){return _form},this.setForm=function(form){_form=form}}),angular.module("forms").service("FormFields",[function(){this.types=[{name:"textfield",value:"Short Text"},{name:"email",value:"Email"},{name:"radio",value:"Multiple Choice"},{name:"dropdown",value:"Dropdown"},{name:"date",value:"Date"},{name:"textarea",value:"Paragraph Text"},{name:"yes_no",value:"Yes/No"},{name:"legal",value:"Legal"},{name:"rating",value:"Rating"},{name:"link",value:"Link"},{name:"number",value:"Numbers"},{name:"statement",value:"Statement"}]}]),angular.module("forms").factory("Forms",["$resource",function($resource){return $resource("/forms/:formId",{formId:"@_id"},{query:{method:"GET",isArray:!0},get:{method:"GET",transformResponse:function(data,header){var form=angular.fromJson(data);return form.visible_form_fields=_.filter(form.form_fields,function(field){return field.deletePreserved===!1}),form}},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").factory("Submissions",["$resource",function($resource){return $resource("forms/:formID/submissions/:submissionId",{submissionId:"@_id",formId:"@_id"},{query:{method:"GET",isArray:!0},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").service("TimeCounter",[function(){var _startTime,_endTime,that=this;this.timeSpent=0,this.restartClock=function(){_startTime=Date.now(),_endTime=_startTime},this.stopClock=function(){return _startTime?(_endTime=Date.now(),that.timeSpent=Math.abs(_endTime.valueOf()-_startTime.valueOf())/1e3,that.timeSpent):new Error("Clock has not been started")},this.clockStarted=function(){return!!this._startTime}}]),angular.module("users").config(["$httpProvider",function($httpProvider){$httpProvider.interceptors.push(["$q","$location",function($q,$location){return{responseError:function(response){return"/users/me"!==$location.path()&&response.config&&"/users/me"!==response.config.url&&(console.log("intercepted rejection of ",response.config.url,response.status),401===response.status?(console.log($location.path()),$location.nextAfterLogin=$location.path(),$location.path("/signin")):403===response.status&&$location.path("/access_denied")),$q.reject(response)}}}])}]),angular.module("users").config(["$stateProvider",function($stateProvider){var checkLoggedin=function($q,$timeout,$state,User,Auth){var deferred=$q.defer();return Auth.currentUser&&Auth.currentUser.email?$timeout(deferred.resolve):Auth.currentUser=User.getCurrent(function(){Auth.login(),$timeout(deferred.resolve())},function(){Auth.logout(),$timeout(deferred.reject()),$state.go("signin",{reload:!0})}),deferred.promise};checkLoggedin.$inject=["$q","$timeout","$state","User","Auth"];var checkSignupDisabled=function($window,$timeout,$q){var deferred=$q.defer();return $timeout($window.signupDisabled?deferred.reject():deferred.resolve()),deferred.promise};checkSignupDisabled.$inject=["$window","$timeout","$q"],$stateProvider.state("profile",{resolve:{loggedin:checkLoggedin},url:"/settings/profile",templateUrl:"modules/users/views/settings/edit-profile.client.view.html"}).state("password",{resolve:{loggedin:checkLoggedin},url:"/settings/password",templateUrl:"modules/users/views/settings/change-password.client.view.html"}).state("accounts",{resolve:{loggedin:checkLoggedin},url:"/settings/accounts",templateUrl:"modules/users/views/settings/social-accounts.client.view.html"}).state("signup",{resolve:{isDisabled:checkSignupDisabled},url:"/signup",templateUrl:"modules/users/views/authentication/signup.client.view.html"}).state("signup-success",{resolve:{isDisabled:checkSignupDisabled},url:"/signup-success",templateUrl:"modules/users/views/authentication/signup-success.client.view.html"}).state("signin",{url:"/signin",templateUrl:"modules/users/views/authentication/signin.client.view.html"}).state("access_denied",{url:"/access_denied",templateUrl:"modules/users/views/authentication/access-denied.client.view.html"}).state("verify",{resolve:{isDisabled:checkSignupDisabled},url:"/verify/:token",templateUrl:"modules/users/views/verify/verify-account.client.view.html"}).state("resendVerifyEmail",{resolve:{isDisabled:checkSignupDisabled},url:"/verify",templateUrl:"modules/users/views/verify/resend-verify-email.client.view.html"}).state("forgot",{url:"/password/forgot",templateUrl:"modules/users/views/password/forgot-password.client.view.html"}).state("reset-invalid",{url:"/password/reset/invalid",templateUrl:"modules/users/views/password/reset-password-invalid.client.view.html"}).state("reset-success",{url:"/password/reset/success",templateUrl:"modules/users/views/password/reset-password-success.client.view.html"}).state("reset",{url:"/password/reset/:token",templateUrl:"modules/users/views/password/reset-password.client.view.html"})}]),angular.module("users").controller("AuthenticationController",["$scope","$location","$state","$rootScope","User","Auth",function($scope,$location,$state,$rootScope,User,Auth){$scope=$rootScope,$scope.credentials={},$scope.error="",$scope.signin=function(){$scope.credentials.email=$scope.credentials.username,User.login($scope.credentials).then(function(response){Auth.login(response),$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),"home"!==$state.previous.name&&"verify"!==$state.previous.name&&""!==$state.previous.name?$state.go($state.previous.name):$state.go("listForms")},function(error){$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user,$scope.error=error,console.log("loginError: "+error)})},$scope.signup=function(){console.log($scope.credentials),User.signup($scope.credentials).then(function(response){console.log("signup-success"),$state.go("signup-success")},function(error){console.log("Error: "),console.log(error),error?($scope.error=error,console.log(error)):console.log("No response received")})}}]),angular.module("users").controller("PasswordController",["$scope","$stateParams","$state","User",function($scope,$stateParams,$state,User){$scope.error="",$scope.askForPasswordReset=function(){User.askForPasswordReset($scope.credentials).then(function(response){$scope.success=response.message,$scope.credentials=null},function(error){$scope.error=error,$scope.credentials=null})},$scope.resetUserPassword=function(){$scope.success=$scope.error=null,User.resetPassword($scope.passwordDetails,$stateParams.token).then(function(response){$scope.success=response.message,$scope.passwordDetails=null,$state.go("reset-success")},function(error){$scope.error=error.message||error,$scope.passwordDetails=null})}}]),angular.module("users").controller("SettingsController",["$scope","$rootScope","$http","$state","Users",function($scope,$rootScope,$http,$state,Users){$scope.user=$rootScope.user,$scope.hasConnectedAdditionalSocialAccounts=function(provider){for(var i in $scope.user.additionalProvidersData)return!0;return!1},$scope.isConnectedSocialAccount=function(provider){return $scope.user.provider===provider||$scope.user.additionalProvidersData&&$scope.user.additionalProvidersData[provider]},$scope.removeUserSocialAccount=function(provider){$scope.success=$scope.error=null,$http["delete"]("/users/accounts",{params:{provider:provider}}).success(function(response){$scope.success=!0,$scope.user=response}).error(function(response){$scope.error=response.message})},$scope.updateUserProfile=function(isValid){if(isValid){$scope.success=$scope.error=null;var user=new Users($scope.user);user.$update(function(response){$scope.success=!0,$scope.user=response},function(response){$scope.error=response.data.message})}else $scope.submitted=!0},$scope.changeUserPassword=function(){$scope.success=$scope.error=null,$http.post("/users/password",$scope.passwordDetails).success(function(response){$scope.success=!0,$scope.passwordDetails=null}).error(function(response){$scope.error=response.message})}}]),angular.module("users").controller("VerifyController",["$scope","$state","$rootScope","User","Auth","$stateParams",function($scope,$state,$rootScope,User,Auth,$stateParams){$scope.isResetSent=!1,$scope.credentials={},$scope.error="",$scope.resendVerifyEmail=function(){User.resendVerifyEmail($scope.credentials.email).then(function(response){console.log(response),$scope.success=response.message,$scope.credentials=null,$scope.isResetSent=!0},function(error){$scope.error=error,$scope.credentials.email=null,$scope.isResetSent=!1})},$scope.validateVerifyToken=function(){$stateParams.token&&(console.log($stateParams.token),User.validateVerifyToken($stateParams.token).then(function(response){console.log("Success: "+response.message),$scope.success=response.message,$scope.isResetSent=!0,$scope.credentials.email=null},function(error){console.log("Error: "+error.message),$scope.isResetSent=!1,$scope.error=error,$scope.credentials.email=null}))}}]),angular.module("users").factory("Auth",["$window",function($window){var userState={isLoggedIn:!1},service={_currentUser:null,get currentUser(){return this._currentUser},ensureHasCurrentUser:function(User){return service._currentUser&&service._currentUser.username?service._currentUser:$window.user?(service._currentUser=$window.user,service._currentUser):void User.getCurrent().then(function(user){return service._currentUser=user,userState.isLoggedIn=!0,$window.user=service._currentUser,service._currentUser},function(response){return userState.isLoggedIn=!1,service._currentUser=null,$window.user=null,console.log("User.getCurrent() err",response),null})},isAuthenticated:function(){return!!service._currentUser},getUserState:function(){return userState},login:function(new_user){userState.isLoggedIn=!0,service._currentUser=new_user},logout:function(){$window.user=null,userState.isLoggedIn=!1,service._currentUser=null}};return service}]),angular.module("users").service("Authorizer",["APP_PERMISSIONS","USER_ROLES",function(APP_PERMISSIONS,USER_ROLES){return function(user){return{canAccess:function(permissions){var i,len,permission;for(angular.isArray(permissions)||(permissions=[permissions]),i=0,len=permissions.length;len>i;i++){if(permission=permissions[i],null===APP_PERMISSIONS[permission])throw"Bad permission value";if(!user||!user.roles)return!1;switch(permission){case APP_PERMISSIONS.viewAdminSettings:case APP_PERMISSIONS.editAdminSettings:return user.roles.indexOf(USER_ROLES.admin)>-1;case APP_PERMISSIONS.viewPrivateForm:case APP_PERMISSIONS.editForm:return user.roles.indexOf(USER_ROLES.admin)>-1||user.roles.indexOf(USER_ROLES.normal)>-1}}return!1}}}}]),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function($window,$q,$timeout,$http,$state){var userService={getCurrent:function(){var deferred=$q.defer();return $http.get("/users/me").success(function(response){deferred.resolve(response)}).error(function(){deferred.reject("User's session has expired")}),deferred.promise},login:function(credentials){var deferred=$q.defer();return $http.post("/auth/signin",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},logout:function(){var deferred=$q.defer();return $http.get("/auth/signout").success(function(response){deferred.resolve(null)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},signup:function(credentials){var deferred=$q.defer();return $http.post("/auth/signup",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},resendVerifyEmail:function(_email){var deferred=$q.defer();return $http.post("/auth/verify",{email:_email}).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},validateVerifyToken:function(token){var validTokenRe=/^([A-Za-z0-9]{48})$/g;if(!validTokenRe.test(token))throw new Error("Error token: "+token+" is not a valid verification token");var deferred=$q.defer();return $http.get("/auth/verify/"+token).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error)}),deferred.promise},resetPassword:function(passwordDetails,token){var deferred=$q.defer();return $http.get("/auth/password/"+token,passwordDetails).success(function(response){deferred.resolve()}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},askForPasswordReset:function(credentials){var deferred=$q.defer();return $http.post("/auth/forgot",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise}};return userService}]),angular.module("users").factory("Users",["$resource",function($resource){return $resource("users",{},{update:{method:"PUT"}})}]); +======= +<<<<<<< adb4e008930e5142044796081f66a1db54906706 +function removeDateFieldsFunc(o){function eachObject(v,k){"lastModified"!==k&&"created"!==k||delete clone[i][k]}for(var clone=_.clone(o),i=0;i'),$templateCache.put("../public/modules/core/views/home.client.view.html",'

Craft beautiful forms in seconds.

Create your next ______.

Tell a story with a form.

'),$templateCache.put("../public/modules/forms/views/admin-form.client.view.html",'
'),$templateCache.put("../public/modules/forms/views/list-forms.client.view.html",'

Create a new form
Name
Language

'),$templateCache.put("../public/modules/forms/views/submit-form.client.view.html","
"),$templateCache.put("../public/modules/forms/views/adminTabs/analyze.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/configure.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/create.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/design.html",'
Background Color
Question Text Color
Answer Text Color
Button Background Color
Button Text Color
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeA.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/entryPage/startPage.html",'

{{pageData.introTitle}}

{{pageData.introParagraph}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/date.html",'

{{index}} {{field.title}} optional

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/dropdown.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/file.html",'
{{field.title}} (* required)
{{field.file.originalname}}
Upload your File
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/hidden.html",''),$templateCache.put("../public/modules/forms/views/directiveViews/field/legal.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/radio.html",'

{{index}}{{field.title}} optional


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/rating.html",'

{{index}} {{field.title}} optional

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/statement.html",'

{{field.title}}

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textarea.html",'

{{index}}{{field.title}} optional

press ENTER
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textfield.html",'

{{index}}{{field.title}} (optional)

press ENTER
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/yes_no.html",'

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

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/form/configure-form.client.view.html",'
Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.name}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type
Form Name
Form Status
Language
* required
Display Form Footer?
Display Start Page?
'), +$templateCache.put("../public/modules/forms/views/directiveViews/form/edit-form.client.view.html",'

Edit Start Page


Intro Title:
Intro Paragraph:
\n
\n\n

\n
\n
Options:
\n
\n
\n \n\n \n \n \n
\n
\n \n
\n
\n
\n\n

\n\n
\n
Required:
\n
\n \n\n \n
\n
\n\n
\n
Disabled:
\n
\n \n\n \n
\n
\n\n
\n \n\n
\n
\n

\n Click on Fields to add them here\n

\n
\n
\n\n
\n \n
\n\n \n \n\n \n
\n
\n\n'),$templateCache.put("../public/modules/forms/views/directiveViews/form/edit-submissions-form.client.view.html",'
#{{value.title}}OscarEMR User ProfilePercentage CompleteTime ElapsedDeviceLocationIP AddressDate Submitted (UTC)Generated PDF
{{$index+1}}{{field.fieldValue}}User Profile #{{row.oscarDemoNum}}{{row.percentageComplete}}%{{row.timeElapsed}}{{row.device.name}}, {{row.device.type}}{{row.geoLocation.city}}, {{row.geoLocation.country}}{{row.ipAddr}}{{row.created | date:\'yyyy-MM-dd HH:mm:ss\'}}Generated PDF
'),$templateCache.put("../public/modules/forms/views/directiveViews/form/submit-form.client.view.html",'
press ENTER
'),$templateCache.put("../public/modules/users/views/authentication/access-denied.client.view.html",'

You need to be logged in to access this page

Login
'),$templateCache.put("../public/modules/users/views/authentication/signin.client.view.html",'

Sign into your account

'),$templateCache.put("../public/modules/users/views/authentication/signup-success.client.view.html",''),$templateCache.put("../public/modules/users/views/authentication/signup.client.view.html",''),$templateCache.put("../public/modules/users/views/password/forgot-password.client.view.html",'

Restore your password

Enter your account email.

'),$templateCache.put("../public/modules/users/views/password/reset-password-invalid.client.view.html",'

Password reset is invalid

Ask for a new password reset
'),$templateCache.put("../public/modules/users/views/password/reset-password-success.client.view.html",'

Password successfully reset

Continue to home page
'),$templateCache.put("../public/modules/users/views/password/reset-password.client.view.html",'

Reset your password

'),$templateCache.put("../public/modules/users/views/settings/change-password.client.view.html",'

Change your password

'),$templateCache.put("../public/modules/users/views/settings/edit-profile.client.view.html",'

Edit your profile

'), +$templateCache.put("../public/modules/users/views/settings/social-accounts.client.view.html",'

Connected social accounts:

Connect other social accounts:

'),$templateCache.put("../public/modules/users/views/verify/resend-verify-email.client.view.html",'

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at hi@TellForm.com

'),$templateCache.put("../public/modules/users/views/verify/verify-account.client.view.html",'

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
')}]);var ApplicationConfiguration=function(){var applicationModuleName="NodeForm",applicationModuleVendorDependencies=["duScroll","ui.select","cgBusy","ngSanitize","vButton","ngResource","NodeForm.templates","ui.router","ui.bootstrap","ui.utils"],registerModule=function(moduleName,dependencies){angular.module(moduleName,dependencies||[]),angular.module(applicationModuleName).requires.push(moduleName)};return{applicationModuleName:applicationModuleName,applicationModuleVendorDependencies:applicationModuleVendorDependencies,registerModule:registerModule}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function($locationProvider){$locationProvider.hashPrefix("!")}]),angular.module(ApplicationConfiguration.applicationModuleName).constant("APP_PERMISSIONS",{viewAdminSettings:"viewAdminSettings",editAdminSettings:"editAdminSettings",editForm:"editForm",viewPrivateForm:"viewPrivateForm"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("USER_ROLES",{admin:"admin",normal:"user",superuser:"superuser"}),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","$state","$stateParams",function($rootScope,Auth,$state,$stateParams){$rootScope.$state=$state,$rootScope.$stateParams=$stateParams,$rootScope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState){$state.previous=fromState,"home"===toState.name||"signin"===toState.name||"resendVerifyEmail"===toState.name||"verify"===toState.name||"signup"===toState.name||"signup-success"===toState.name?Auth.isAuthenticated()&&(event.preventDefault(),$state.go("listForms")):"access_denied"===toState.name||Auth.isAuthenticated()||"submitForm"===toState.name||(event.preventDefault(),$state.go("listForms"))})}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","User","Authorizer","$state","$stateParams",function($rootScope,Auth,User,Authorizer,$state,$stateParams){$rootScope.$on("$stateChangeStart",function(event,next){var authenticator,permissions,user;permissions=next&&next.data&&next.data.permissions?next.data.permissions:null,Auth.ensureHasCurrentUser(User),user=Auth.currentUser,user&&(authenticator=new Authorizer(user),null!=permissions&&(authenticator.canAccess(permissions)||(event.preventDefault(),$state.go("access_denied"))))})}]),angular.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),ApplicationConfiguration.registerModule("core",["users"]),ApplicationConfiguration.registerModule("forms",["ngFileUpload","ui.router.tabs","colorpicker.module","ui.date","ui.sortable","angular-input-stars","users"]),ApplicationConfiguration.registerModule("users"),angular.module("core").config(["$stateProvider","$urlRouterProvider",function($stateProvider,$urlRouterProvider,Authorization){$urlRouterProvider.otherwise("/forms")}]),angular.module("core").controller("HeaderController",["$rootScope","$scope","Menus","$state","Auth","User","$window",function($rootScope,$scope,Menus,$state,Auth,User,$window){$rootScope.signupDisabled=$window.signupDisabled,$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.authentication=$rootScope.authentication=Auth,$rootScope.languages=$scope.languages=["english","french","spanish"],$scope.isCollapsed=!1,$rootScope.hideNav=!1,$scope.menu=Menus.getMenu("topbar"),$scope.signout=function(){var promise=User.logout();promise.then(function(){Auth.logout(),Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user=null,$state.go("listForms")},function(reason){console.log("Logout Failed: "+reason)})},$scope.toggleCollapsibleMenu=function(){$scope.isCollapsed=!$scope.isCollapsed},$scope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState,fromParams){$scope.isCollapsed=!1,$rootScope.hideNav=!1,angular.isDefined(toState.data)&&angular.isDefined(toState.data.hideNav)&&($rootScope.hideNav=toState.data.hideNav)})}]),angular.module("core").controller("HomeController",["$rootScope","$scope","User","$state",function($rootScope,$scope,User,$state){$scope=$rootScope}]),angular.module("core").service("Menus",[function(){this.defaultRoles=["*"],this.menus={};var shouldRender=function(user){if(!user)return this.isPublic;if(~this.roles.indexOf("*"))return!0;for(var userRoleIndex in user.roles)for(var roleIndex in this.roles)if(console.log(this.roles[roleIndex]),console.log(this.roles[roleIndex]===user.roles[userRoleIndex]),this.roles[roleIndex]===user.roles[userRoleIndex])return!0;return!1};this.validateMenuExistance=function(menuId){if(menuId&&menuId.length){if(this.menus[menuId])return!0;throw new Error("Menu does not exists")}throw new Error("MenuId was not provided")},this.getMenu=function(menuId){return this.validateMenuExistance(menuId),this.menus[menuId]},this.addMenu=function(menuId,isPublic,roles){return this.menus[menuId]={isPublic:isPublic||!1,roles:roles||this.defaultRoles,items:[],shouldRender:shouldRender},this.menus[menuId]},this.removeMenu=function(menuId){this.validateMenuExistance(menuId),delete this.menus[menuId]},this.addMenuItem=function(menuId,menuItemTitle,menuItemURL,menuItemType,menuItemUIRoute,isPublic,roles,position){return this.validateMenuExistance(menuId),this.menus[menuId].items.push({title:menuItemTitle,link:menuItemURL,menuItemType:menuItemType||"item",menuItemClass:menuItemType,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].roles:roles,position:position||0,items:[],shouldRender:shouldRender}),this.menus[menuId]},this.addSubMenuItem=function(menuId,rootMenuItemURL,menuItemTitle,menuItemURL,menuItemUIRoute,isPublic,roles,position){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===rootMenuItemURL&&this.menus[menuId].items[itemIndex].items.push({title:menuItemTitle,link:menuItemURL,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].items[itemIndex].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].items[itemIndex].roles:roles,position:position||0,shouldRender:shouldRender});return this.menus[menuId]},this.removeMenuItem=function(menuId,menuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===menuItemURL&&this.menus[menuId].items.splice(itemIndex,1);return this.menus[menuId]},this.removeSubMenuItem=function(menuId,submenuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)for(var subitemIndex in this.menus[menuId].items[itemIndex].items)this.menus[menuId].items[itemIndex].items[subitemIndex].link===submenuItemURL&&this.menus[menuId].items[itemIndex].items.splice(subitemIndex,1);return this.menus[menuId]},this.addMenu("topbar",!1,["*"]),this.addMenu("bottombar",!1,["*"])}]),angular.module("forms").run(["Menus",function(Menus){Menus.addMenuItem("topbar","My Forms","forms","","/forms",!1)}]).filter("formValidity",function(){return function(formObj){if(formObj&&formObj.form_fields&&formObj.visible_form_fields){var formKeys=Object.keys(formObj),fields=(formKeys.filter(function(key){return"$"!==key[0]}),formObj.form_fields),valid_count=fields.filter(function(field){return"object"==typeof field&&"statement"!==field.fieldType&&"rating"!==field.fieldType?!!field.fieldValue:void 0}).length;return valid_count-(formObj.form_fields.length-formObj.visible_form_fields.length)}return 0}}).config(["$provide",function($provide){$provide.decorator("accordionDirective",["$delegate",function($delegate){var directive=$delegate[0];return directive.replace=!0,$delegate}])}]),angular.module("forms").config(["$stateProvider",function($stateProvider){$stateProvider.state("listForms",{url:"/forms",templateUrl:"modules/forms/views/list-forms.client.view.html"}).state("submitForm",{url:"/forms/:formId",templateUrl:"modules/forms/views/submit-form.client.view.html",data:{hideNav:!0},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"SubmitFormController",controllerAs:"ctrl"}).state("viewForm",{url:"/forms/:formId/admin",templateUrl:"modules/forms/views/admin-form.client.view.html",data:{permissions:["editForm"]},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"AdminFormController"}).state("viewForm.configure",{url:"/configure",templateUrl:"modules/forms/views/adminTabs/configure.html"}).state("viewForm.design",{url:"/design",templateUrl:"modules/forms/views/adminTabs/design.html"}).state("viewForm.analyze",{url:"/analyze",templateUrl:"modules/forms/views/adminTabs/analyze.html"}).state("viewForm.create",{url:"/create",templateUrl:"modules/forms/views/adminTabs/create.html"})}]),angular.module("forms").controller("AdminFormController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http","$uibModal","myForm",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http,$uibModal,myForm){$scope=$rootScope,$scope.animationsEnabled=!0,$scope.myform=myForm,$rootScope.saveInProgress=!1,CurrentForm.setForm($scope.myform),$scope.tabData=[{heading:"Create",route:"viewForm.create"},{heading:"Design",route:"viewForm.design"},{heading:"Configure",route:"viewForm.configure"},{heading:"Analyze",route:"viewForm.analyze"}],$scope.setForm=function(form){$scope.myform=form},$rootScope.resetForm=function(){$scope.myform=Forms.get({formId:$stateParams.formId})},$scope.openDeleteModal=function(){$scope.deleteModal=$uibModal.open({animation:$scope.animationsEnabled,templateUrl:"myModalContent.html",controller:"AdminFormController",resolve:{myForm:function(){return $scope.myform}}}),$scope.deleteModal.result.then(function(selectedItem){$scope.selected=selectedItem},function(){console.log("Modal dismissed at: "+new Date)})},$scope.cancelDeleteModal=function(){$scope.deleteModal&&$scope.deleteModal.dismiss("cancel")},$scope.removeCurrentForm=function(){if($scope.deleteModal&&$scope.deleteModal.opened){$scope.deleteModal.close();var form_id=$scope.myform._id;if(!form_id)throw new Error("Error - removeCurrentForm(): $scope.myform._id does not exist");$http["delete"]("/forms/"+form_id).success(function(data,status,headers){console.log("form deleted successfully"),$state.go("listForms",{},{reload:!0})}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}},$scope.update=$rootScope.update=function(updateImmediately,cb){var continueUpdate=!0;if(updateImmediately||(continueUpdate=!$rootScope.saveInProgress),continueUpdate){var err=null;updateImmediately||($rootScope.saveInProgress=!0),$scope.updatePromise=$http.put("/forms/"+$scope.myform._id,{form:$scope.myform}).then(function(response){$rootScope.myform=$scope.myform=response.data})["catch"](function(response){console.log("Error occured during form UPDATE.\n"),err=response.data})["finally"](function(){return updateImmediately||($rootScope.saveInProgress=!1),"function"==typeof cb?cb(err):void 0})}}}]),angular.module("forms").controller("ListFormsController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http){$scope=$rootScope,$scope.forms={},$scope.showCreateModal=!1,$scope.findAll=function(){Forms.query(function(_forms){$scope.myforms=_forms})},$scope.openCreateModal=function(){$scope.showCreateModal||($scope.showCreateModal=!0)},$scope.closeCreateModal=function(){$scope.showCreateModal&&($scope.showCreateModal=!1)},$scope.setForm=function(form){$scope.myform=form},$scope.goToWithId=function(route,id){$state.go(route,{formId:id},{reload:!0})},$scope.duplicateForm=function(form_index){var form=_.cloneDeep($scope.myforms[form_index]);delete form._id,$http.post("/forms",{form:form}).success(function(data,status,headers){$scope.myforms.splice(form_index+1,0,data)}).error(function(errorResponse){console.error(errorResponse),null===errorResponse&&($scope.error=errorResponse.data.message)})},$scope.createNewForm=function(){var form={};form.title=$scope.forms.createForm.title.$modelValue,form.language=$scope.forms.createForm.language.$modelValue,$scope.forms.createForm.$valid&&$scope.forms.createForm.$dirty&&$http.post("/forms",{form:form}).success(function(data,status,headers){console.log("new form created"),$scope.goToWithId("viewForm.create",data._id+"")}).error(function(errorResponse){console.error(errorResponse),$scope.error=errorResponse.data.message})},$scope.removeForm=function(form_index){if(form_index>=$scope.myforms.length||0>form_index)throw new Error("Error: form_index in removeForm() must be between 0 and "+$scope.myforms.length-1);$http["delete"]("/forms/"+$scope.myforms[form_index]._id).success(function(data,status,headers){console.log("form deleted successfully"),$scope.myforms.splice(form_index,1)}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}}]),angular.module("forms").controller("SubmitFormController",["$scope","$rootScope","$state","myForm","Auth",function($scope,$rootScope,$state,myForm,Auth){$scope.authentication=Auth,$scope.myform=myForm,$scope.myform.isLive?$scope.hideNav=$rootScope.hideNav=!0:$scope.authentication.isAuthenticated()?$scope.hideNav=$rootScope.hideNav=!1:($scope.hideNav=$rootScope.hideNav=!0,$state.go("access_denied"))}]),_.mixin({removeDateFields:removeDateFieldsFunc}),angular.module("forms").directive("autoSaveForm",["$rootScope","$timeout",function($rootScope,$timeout){return{require:["^form"],restrict:"AE",link:function($scope,$element,$attrs,$ctrls){angular.element(document).ready(function(){var $formCtrl=$ctrls[0],savePromise=null;$rootScope.finishedRender=!1,$scope.$on("editFormFields Started",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!1}),$scope.$on("editFormFields Finished",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!0}),$scope.anyDirtyAndTouched=function(form){var propCount=0;for(var prop in form)if(form.hasOwnProperty(prop)&&"$"!==prop[0]&&(propCount++,form[prop].$touched&&form[prop].$dirty))return!0;return!1};var debounceSave=function(){$rootScope.saveInProgress=!0,$rootScope[$attrs.autoSaveCallback](!0,function(err){err?(console.error("Error form data NOT persisted"),console.error(err)):(console.log("\n\nForm data persisted -- setting pristine flag"),$formCtrl.$setPristine(),$formCtrl.$setUntouched())})};$scope.$watch(function(newValue,oldValue){console.log("introParagraphStartPage.$dirty: "+$scope.editForm.introParagraphStartPage.$dirty),console.log("introParagraphStartPage.$touched: "+$scope.editForm.introParagraphStartPage.$touched),$rootScope.finishedRender&&$scope.anyDirtyAndTouched($scope.editForm)&&!$rootScope.saveInProgress&&(console.log("Form saving started"),debounceSave(),console.log("introParagraphStartPage.$dirty AFTER: "+$scope.editForm.introParagraphStartPage.$dirty))}),$scope.$watch($attrs.autoSaveWatch,function(newValue,oldValue){newValue=angular.copy(newValue),oldValue=angular.copy(oldValue),newValue.form_fields=_.removeDateFields(newValue.form_fields),oldValue.form_fields=_.removeDateFields(oldValue.form_fields);var changedFields=!_.isEqual(oldValue.form_fields,newValue.form_fields)||!_.isEqual(oldValue.startPage,newValue.startPage),changedFieldMap=!1;oldValue.hasOwnProperty("plugins.oscarhost.settings.fieldMap")&&(changedFieldMap=!!oldValue.plugins.oscarhost.settings.fieldMap&&!_.isEqual(oldValue.plugins.oscarhost.settings.fieldMap,newValue.plugins.oscarhost.settings.fieldMap)),(newValue||oldValue)&&oldValue&&(0===oldValue.form_fields.length&&($rootScope.finishedRender=!0),$rootScope.finishedRender&&(changedFields&&!$formCtrl.$dirty||changedFieldMap)&&!$rootScope.saveInProgress?(savePromise&&($timeout.cancel(savePromise),savePromise=null),savePromise=$timeout(function(){debounceSave()})):$rootScope.finishedRender&&$rootScope.saveInProgress&&($rootScope.saveInProgress=!1))},!0)})}}}]),angular.module("forms").directive("configureFormDirective",["$rootScope","$http","Upload","CurrentForm",function($rootScope,$http,Upload,CurrentForm){return{templateUrl:"modules/forms/views/directiveViews/form/configure-form.client.view.html",restrict:"E",scope:{myform:"=",user:"=",pdfFields:"@",formFields:"@"},controller:["$scope",function($scope){console.log($scope.myform),CurrentForm.getForm().plugins?CurrentForm.getForm().plugins.oscarhost.baseUrl&&($scope.oscarhostAPI=!0):$scope.oscarhostAPI=!1,$scope.log="",$scope.pdfLoading=!1,$scope.languages=$rootScope.languages,this._current_upload=null,$scope.resetForm=$rootScope.resetForm,$scope.update=$rootScope.update,this._unbindedPdfFields=$scope.pdfFields,$scope.cancelUpload=function(){this._current_upload.abort(),$scope.pdfLoading=!1,$scope.removePDF()},$scope.removePDF=function(){$scope.myform.pdf=null,$scope.myform.isGenerated=!1,$scope.myform.autofillPDFs=!1,console.log("form.pdf: "+$scope.myform.pdf+" REMOVED")},$scope.uploadPDF=function(file){file&&(console.log(file),Upload.upload({url:"/upload/pdf",data:{user:$scope.user,file:file}}).then(function(resp){var data=resp.data;$scope.log="file "+data.originalname+" uploaded as "+data.filename+". JSON: "+JSON.stringify(data)+"\n"+$scope.log,$scope.myform.pdf=angular.fromJson(angular.toJson(data)),$scope.pdfLoading=!1,console.log($scope.log),$scope.$$phase||$scope.$digest||$scope.$apply()},function(resp){$scope.pdfLoading=!1,console.log("Error occured during upload.\n"),console.log(resp.status)},function(evt){var progressPercentage=parseInt(100*evt.loaded/evt.total,10);$scope.log="progress: "+progressPercentage+"% "+evt.config.data.file.name+"\n"+$scope.log,console.log($scope.log),$scope.pdfLoading=!0}))}}]}}]),angular.module("forms").directive("editFormDirective",["$rootScope","FormFields",function($rootScope,FormFields){return{templateUrl:"modules/forms/views/directiveViews/form/edit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$scope",function($scope){for(var field_ids=_($scope.myform.form_fields).pluck("_id"),i=0;i0){$scope.myform.plugins.oscarhost.settings.fieldMap||($scope.myform.plugins.oscarhost.settings.fieldMap={});var oscarhostFields=$scope.myform.plugins.oscarhost.settings.validFields,currentFields=_($scope.myform.plugins.oscarhost.settings.fieldMap).invert().keys().value();return $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id)&&(currentFields=_(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id])),_(oscarhostFields).difference(currentFields).value()}return[]},$scope.dropzone={handle:" .handle",containment:".dropzoneContainer",cursor:"grabbing"},$scope.addNewField=function(modifyForm,fieldType){$scope.addField.lastAddedID++;for(var fieldTitle,i=0;i<$scope.addField.types.length;i++)if($scope.addField.types[i].name===fieldType){$scope.addField.types[i].lastAddedID++,fieldTitle=$scope.addField.types[i].value+$scope.addField.types[i].lastAddedID;break}var newField={title:fieldTitle,fieldType:fieldType,fieldValue:"",required:!0,disabled:!1,deletePreserved:!1};return modifyForm&&$scope.myform.form_fields.push(newField),newField},$scope.deleteField=function(field_index){var currFieldId=$scope.myform.form_fields[field_index]._id;$scope.myform.hasOwnProperty("plugins.oscarhost.baseUrl")&&delete $scope.myform.plugins.oscarhost.settings.fieldMap[currFieldId],$scope.myform.form_fields.splice(field_index,1)},$scope.duplicateField=function(field_index){var currField=_.cloneDeep($scope.myform.form_fields[field_index]);currField._id="cloned"+_.uniqueId(),currField.title+=" copy",$scope.myform.form_fields.splice(field_index+1,0,currField)},$scope.addButton=function(){var newButton={};newButton.bgColor="#ddd",newButton.color="#ffffff",newButton.text="Button",newButton._id=Math.floor(1e5*Math.random()),$scope.myform.startPage.buttons.push(newButton)},$scope.deleteButton=function(button){for(var currID,i=0;i<$scope.myform.startPage.buttons.length;i++)if(currID=$scope.myform.startPage.buttons[i]._id,console.log(currID),currID===button._id){$scope.myform.startPage.buttons.splice(i,1);break}},$scope.addOption=function(field_index){var currField=$scope.myform.form_fields[field_index];if(console.log(field_index),console.log(currField),"checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType){currField.fieldOptions||($scope.myform.form_fields[field_index].fieldOptions=[]);var lastOptionID=0;currField.fieldOptions[currField.fieldOptions.length-1]&&(lastOptionID=currField.fieldOptions[currField.fieldOptions.length-1].option_id);var newOption={option_id:Math.floor(1e5*Math.random()),option_title:"Option "+lastOptionID,option_value:"Option "+lastOptionID};$scope.myform.form_fields[field_index].fieldOptions.push(newOption)}},$scope.deleteOption=function(field_index,option){var currField=$scope.myform.form_fields[field_index];if("checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType)for(var i=0;i',restrict:"E",scope:{typeName:"@"},controller:["$scope",function($scope){var iconTypeMap={textfield:"fa fa-pencil-square-o",dropdown:"fa fa-th-list",date:"fa fa-calendar",checkbox:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",email:"fa fa-envelope-o",textarea:"fa fa-pencil-square",legal:"fa fa-legal",file:"fa fa-cloud-upload",rating:"fa fa-star-half-o",link:"fa fa-link",scale:"fa fa-sliders",stripe:"fa fa-credit-card",statement:"fa fa-quote-left",yes_no:"fa fa-toggle-on",number:"fa fa-slack"};$scope.typeIcon=iconTypeMap[$scope.typeName]}]}});var __indexOf=[].indexOf||function(item){for(var i=0,l=this.length;l>i;i++)if(i in this&&this[i]===item)return i;return-1};angular.module("forms").directive("fieldDirective",["$http","$compile","$rootScope","$templateCache",function($http,$compile,$rootScope,$templateCache){var getTemplateUrl=function(fieldType){var type=fieldType,templateUrl="modules/forms/views/directiveViews/field/",supported_fields=["textfield","textarea","date","dropdown","hidden","password","radio","legal","statement","rating","yes_no","number","natural"];return __indexOf.call(supported_fields,type)>=0&&(templateUrl=templateUrl+type+".html"),$templateCache.get("../public/"+templateUrl)};return{template:"
{{field.title}}
",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(scope,element){$rootScope.chooseDefaultOption=scope.chooseDefaultOption=function(type){"yes_no"===type?scope.field.fieldValue="true":"rating"===type?scope.field.fieldValue=0:"radio"===scope.field.fieldType?(console.log(scope.field),scope.field.fieldValue=scope.field.fieldOptions[0].option_value,console.log(scope.field.fieldValue)):"legal"===type&&(scope.field.fieldValue="true",$rootScope.nextField())},scope.setActiveField=$rootScope.setActiveField,"date"===scope.field.fieldType&&(scope.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var fieldType=scope.field.fieldType;if("number"===scope.field.fieldType||"textfield"===scope.field.fieldType||"email"===scope.field.fieldType||"link"===scope.field.fieldType){switch(scope.field.fieldType){case"textfield":scope.field.input_type="text";break;case"email":scope.field.input_type="email",scope.field.placeholder="joesmith@example.com";break;case"number":scope.field.input_type="text",scope.field.validateRegex=/^\d+$/;break;default:scope.field.input_type="url",scope.field.placeholder="http://example.com"}fieldType="textfield"}var template=getTemplateUrl(fieldType);element.html(template).show(),$compile(element.contents())(scope)}}}]),angular.module("forms").directive("onEnterKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;13===keyCode&&($rootScope.$apply(function(){$rootScope.$eval($attrs.onEnterKey)}),event.preventDefault())})}}}]),angular.module("forms").directive("onFinishRender",["$rootScope","$timeout",function($rootScope,$timeout){return{restrict:"A",link:function(scope,element,attrs){if(element.attr("ng-repeat")||element.attr("data-ng-repeat")){var broadcastMessage=attrs.onFinishRender||"ngRepeat";scope.$first&&!scope.$last?scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Started")}):scope.$last&&scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Finished")})}}}}]),angular.module("forms").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","Auth",function($http,TimeCounter,$filter,$rootScope,Auth){return{templateUrl:"modules/forms/views/directiveViews/form/submit-form.client.view.html", +restrict:"E",scope:{myform:"="},controller:["$document","$window","$scope",function($document,$window,$scope){$scope.authentication=$rootScope.authentication,$scope.noscroll=!1,$scope.forms={},$scope.form_fields_count=$scope.myform.visible_form_fields.filter(function(field){return"statement"!==field.fieldType&&"rating"!==field.fieldType}).length,$scope.reloadForm=function(){$scope.myform.submitted=!1,$scope.myform.form_fields=_.chain($scope.myform.visible_form_fields).map(function(field){return field.fieldValue="",field}).value(),$scope.loading=!1,$scope.error="",$scope.selected={_id:"",index:0},$scope.setActiveField($scope.myform.visible_form_fields[0]._id,0,!1),TimeCounter.restartClock()},$window.onscroll=function(){$scope.scrollPos=document.body.scrollTop||document.documentElement.scrollTop||0;var elemBox=document.getElementsByClassName("activeField")[0].getBoundingClientRect();$scope.fieldTop=elemBox.top,$scope.fieldBottom=elemBox.bottom;var field_id,field_index;$scope.noscroll||($scope.selected.index===$scope.myform.form_fields.length-1&&$scope.fieldBottom<200?(field_index=$scope.selected.index+1,field_id="submit_field",$scope.setActiveField(field_id,field_index,!1)):$scope.selected.index===$scope.myform.form_fields.length?$scope.fieldTop>200&&(field_index=$scope.selected.index-1,field_id=$scope.myform.form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):$scope.fieldBottom<0?(field_index=$scope.selected.index+1,field_id=$scope.myform.form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):0!==$scope.selected.index&&$scope.fieldTop>0&&(field_index=$scope.selected.index-1,field_id=$scope.myform.form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)),$scope.$apply())},$scope.setActiveField=$rootScope.setActiveField=function(field_id,field_index,animateScroll){null!==$scope.selected&&$scope.selected._id!==field_id&&($scope.selected._id=field_id,$scope.selected.index=field_index,animateScroll&&($scope.noscroll=!0,setTimeout(function(){$document.scrollToElement(angular.element(".activeField"),-10,200).then(function(){$scope.noscroll=!1,document.querySelectorAll(".activeField .focusOn")[0].focus()})},20)))},$rootScope.nextField=$scope.nextField=function(){var selected_index,selected_id;$scope.selected.index<$scope.myform.form_fields.length-1?(selected_index=$scope.selected.index+1,selected_id=$scope.myform.form_fields[selected_index]._id,$rootScope.setActiveField(selected_id,selected_index,!0)):$scope.selected.index===$scope.myform.form_fields.length-1&&(selected_index=$scope.selected.index+1,selected_id="submit_field",$rootScope.setActiveField(selected_id,selected_index,!0))},$rootScope.prevField=$scope.prevField=function(){if($scope.selected.index>0){var selected_index=$scope.selected.index-1,selected_id=$scope.myform.form_fields[selected_index]._id;$scope.setActiveField(selected_id,selected_index,!0)}},$scope.exitStartPage=function(){$scope.myform.startPage.showStart=!1,$scope.myform.form_fields.length>0&&($scope.selected._id=$scope.myform.form_fields[0]._id)},$scope.submitForm=function(){var _timeElapsed=TimeCounter.stopClock();$scope.loading=!0;var form=_.cloneDeep($scope.myform);form.timeElapsed=_timeElapsed,form.percentageComplete=$filter("formValidity")($scope.myform)/$scope.myform.visible_form_fields.length*100,delete form.visible_form_fields,setTimeout(function(){$scope.submitPromise=$http.post("/forms/"+$scope.myform._id,form).success(function(data,status,headers){$scope.myform.submitted=!0,$scope.loading=!1}).error(function(error){$scope.loading=!1,$scope.error=error.message})},500)},$scope.reloadForm()}]}}]),angular.module("forms").service("CurrentForm",function(){var _form={};this.getForm=function(){return _form},this.setForm=function(form){_form=form}}),angular.module("forms").service("FormFields",[function(){this.types=[{name:"textfield",value:"Short Text"},{name:"email",value:"Email"},{name:"radio",value:"Multiple Choice"},{name:"dropdown",value:"Dropdown"},{name:"date",value:"Date"},{name:"textarea",value:"Paragraph Text"},{name:"yes_no",value:"Yes/No"},{name:"legal",value:"Legal"},{name:"rating",value:"Rating"},{name:"link",value:"Link"},{name:"number",value:"Numbers"},{name:"statement",value:"Statement"}]}]),angular.module("forms").factory("Forms",["$resource",function($resource){return $resource("/forms/:formId",{formId:"@_id"},{query:{method:"GET",isArray:!0},get:{method:"GET",transformResponse:function(data,header){var form=angular.fromJson(data);return form.visible_form_fields=_.filter(form.form_fields,function(field){return field.deletePreserved===!1}),form}},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").factory("Submissions",["$resource",function($resource){return $resource("forms/:formID/submissions/:submissionId",{submissionId:"@_id",formId:"@_id"},{query:{method:"GET",isArray:!0},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").service("TimeCounter",[function(){var _startTime,_endTime,that=this;this.timeSpent=0,this.restartClock=function(){_startTime=Date.now(),_endTime=_startTime},this.stopClock=function(){return _startTime?(_endTime=Date.now(),that.timeSpent=Math.abs(_endTime.valueOf()-_startTime.valueOf())/1e3,that.timeSpent):new Error("Clock has not been started")},this.clockStarted=function(){return!!this._startTime}}]),angular.module("users").config(["$httpProvider",function($httpProvider){$httpProvider.interceptors.push(["$q","$location",function($q,$location){return{responseError:function(response){return"/users/me"!==$location.path()&&response.config&&"/users/me"!==response.config.url&&(console.log("intercepted rejection of ",response.config.url,response.status),401===response.status?($location.nextAfterLogin=$location.path(),$location.path("/signin")):403===response.status&&$location.path("/access_denied")),$q.reject(response)}}}])}]),angular.module("users").config(["$stateProvider",function($stateProvider){var checkLoggedin=function($q,$timeout,$state,User,Auth){var deferred=$q.defer();return Auth.currentUser&&Auth.currentUser.email?$timeout(deferred.resolve):Auth.currentUser=User.getCurrent(function(){Auth.login(),$timeout(deferred.resolve())},function(){Auth.logout(),$timeout(deferred.reject()),$state.go("signin",{reload:!0})}),deferred.promise};checkLoggedin.$inject=["$q","$timeout","$state","User","Auth"];var checkSignupDisabled=function($window,$timeout,$q){var deferred=$q.defer();return $timeout($window.signupDisabled?deferred.reject():deferred.resolve()),deferred.promise};checkSignupDisabled.$inject=["$window","$timeout","$q"],$stateProvider.state("profile",{resolve:{loggedin:checkLoggedin},url:"/settings/profile",templateUrl:"modules/users/views/settings/edit-profile.client.view.html"}).state("password",{resolve:{loggedin:checkLoggedin},url:"/settings/password",templateUrl:"modules/users/views/settings/change-password.client.view.html"}).state("accounts",{resolve:{loggedin:checkLoggedin},url:"/settings/accounts",templateUrl:"modules/users/views/settings/social-accounts.client.view.html"}).state("signup",{resolve:{isDisabled:checkSignupDisabled},url:"/signup",templateUrl:"modules/users/views/authentication/signup.client.view.html"}).state("signup-success",{resolve:{isDisabled:checkSignupDisabled},url:"/signup-success",templateUrl:"modules/users/views/authentication/signup-success.client.view.html"}).state("signin",{url:"/signin",templateUrl:"modules/users/views/authentication/signin.client.view.html"}).state("access_denied",{url:"/access_denied",templateUrl:"modules/users/views/authentication/access-denied.client.view.html"}).state("resendVerifyEmail",{url:"/verify",templateUrl:"modules/users/views/verify/resend-verify-email.client.view.html"}).state("verify",{url:"/verify/:token",templateUrl:"modules/users/views/verify/verify-account.client.view.html"}).state("forgot",{url:"/password/forgot",templateUrl:"modules/users/views/password/forgot-password.client.view.html"}).state("reset-invalid",{url:"/password/reset/invalid",templateUrl:"modules/users/views/password/reset-password-invalid.client.view.html"}).state("reset-success",{url:"/password/reset/success",templateUrl:"modules/users/views/password/reset-password-success.client.view.html"}).state("reset",{url:"/password/reset/:token",templateUrl:"modules/users/views/password/reset-password.client.view.html"})}]),angular.module("users").controller("AuthenticationController",["$scope","$location","$state","$rootScope","User","Auth",function($scope,$location,$state,$rootScope,User,Auth){$scope=$rootScope,$scope.credentials={},$scope.error="",$scope.signin=function(){$scope.credentials.email=$scope.credentials.username,User.login($scope.credentials).then(function(response){Auth.login(response),$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),"home"!==$state.previous.name&&"verify"!==$state.previous.name&&""!==$state.previous.name?$state.go($state.previous.name):$state.go("listForms")},function(error){$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user,$scope.error=error,console.log("loginError: "+error)})},$scope.signup=function(){console.log($scope.credentials),User.signup($scope.credentials).then(function(response){console.log("signup-success"),$state.go("signup-success")},function(error){console.log("Error: "),console.log(error),error?($scope.error=error,console.log(error)):console.log("No response received")})}}]),angular.module("users").controller("PasswordController",["$scope","$stateParams","$state","User",function($scope,$stateParams,$state,User){$scope.error="",$scope.askForPasswordReset=function(){User.askForPasswordReset($scope.credentials).then(function(response){$scope.success=response.message,$scope.credentials=null},function(error){$scope.error=error,$scope.credentials=null})},$scope.resetUserPassword=function(){$scope.success=$scope.error=null,User.resetPassword($scope.passwordDetails,$stateParams.token).then(function(response){$scope.success=response.message,$scope.passwordDetails=null,$state.go("reset-success")},function(error){$scope.error=error.message||error,$scope.passwordDetails=null})}}]),angular.module("users").controller("SettingsController",["$scope","$rootScope","$http","$state","Users",function($scope,$rootScope,$http,$state,Users){$scope.user=$rootScope.user,$scope.hasConnectedAdditionalSocialAccounts=function(provider){for(var i in $scope.user.additionalProvidersData)return!0;return!1},$scope.isConnectedSocialAccount=function(provider){return $scope.user.provider===provider||$scope.user.additionalProvidersData&&$scope.user.additionalProvidersData[provider]},$scope.removeUserSocialAccount=function(provider){$scope.success=$scope.error=null,$http["delete"]("/users/accounts",{params:{provider:provider}}).success(function(response){$scope.success=!0,$scope.user=response}).error(function(response){$scope.error=response.message})},$scope.updateUserProfile=function(isValid){if(isValid){$scope.success=$scope.error=null;var user=new Users($scope.user);user.$update(function(response){$scope.success=!0,$scope.user=response},function(response){$scope.error=response.data.message})}else $scope.submitted=!0},$scope.changeUserPassword=function(){$scope.success=$scope.error=null,$http.post("/users/password",$scope.passwordDetails).success(function(response){$scope.success=!0,$scope.passwordDetails=null}).error(function(response){$scope.error=response.message})}}]),angular.module("users").controller("VerifyController",["$scope","$state","$rootScope","User","Auth","$stateParams",function($scope,$state,$rootScope,User,Auth,$stateParams){$scope.isResetSent=!1,$scope.credentials={},$scope.error="",$scope.resendVerifyEmail=function(){User.resendVerifyEmail($scope.credentials.email).then(function(response){console.log(response),$scope.success=response.message,$scope.credentials=null,$scope.isResetSent=!0},function(error){$scope.error=error,$scope.credentials.email=null,$scope.isResetSent=!1})},$scope.validateVerifyToken=function(){$stateParams.token&&(console.log($stateParams.token),User.validateVerifyToken($stateParams.token).then(function(response){console.log("Success: "+response.message),$scope.success=response.message,$scope.isResetSent=!0,$scope.credentials.email=null},function(error){console.log("Error: "+error.message),$scope.isResetSent=!1,$scope.error=error,$scope.credentials.email=null}))}}]),angular.module("users").factory("Auth",["$window",function($window){var userState={isLoggedIn:!1},service={_currentUser:null,get currentUser(){return this._currentUser},ensureHasCurrentUser:function(User){return service._currentUser&&service._currentUser.username?service._currentUser:$window.user?(service._currentUser=$window.user,service._currentUser):void User.getCurrent().then(function(user){return service._currentUser=user,userState.isLoggedIn=!0,$window.user=service._currentUser,service._currentUser},function(response){return userState.isLoggedIn=!1,service._currentUser=null,$window.user=null,console.log("User.getCurrent() err",response),null})},isAuthenticated:function(){return!!service._currentUser},getUserState:function(){return userState},login:function(new_user){userState.isLoggedIn=!0,service._currentUser=new_user},logout:function(){$window.user=null,userState.isLoggedIn=!1,service._currentUser=null}};return service}]),angular.module("users").service("Authorizer",["APP_PERMISSIONS","USER_ROLES",function(APP_PERMISSIONS,USER_ROLES){return function(user){return{canAccess:function(permissions){var i,len,permission;for(angular.isArray(permissions)||(permissions=[permissions]),i=0,len=permissions.length;len>i;i++){if(permission=permissions[i],null===APP_PERMISSIONS[permission])throw"Bad permission value";if(!user||!user.roles)return!1;switch(permission){case APP_PERMISSIONS.viewAdminSettings:case APP_PERMISSIONS.editAdminSettings:return user.roles.indexOf(USER_ROLES.admin)>-1;case APP_PERMISSIONS.viewPrivateForm:case APP_PERMISSIONS.editForm:return user.roles.indexOf(USER_ROLES.admin)>-1||user.roles.indexOf(USER_ROLES.normal)>-1}}return!1}}}}]),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function($window,$q,$timeout,$http,$state){var userService={getCurrent:function(){var deferred=$q.defer();return $http.get("/users/me").success(function(response){deferred.resolve(response)}).error(function(){deferred.reject("User's session has expired")}),deferred.promise},login:function(credentials){var deferred=$q.defer();return $http.post("/auth/signin",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},logout:function(){var deferred=$q.defer();return $http.get("/auth/signout").success(function(response){deferred.resolve(null)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},signup:function(credentials){var deferred=$q.defer();return $http.post("/auth/signup",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},resendVerifyEmail:function(_email){var deferred=$q.defer();return $http.post("/auth/verify",{email:_email}).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},validateVerifyToken:function(token){var validTokenRe=/^([A-Za-z0-9]{48})$/g;if(!validTokenRe.test(token))throw new Error("Error token: "+token+" is not a valid verification token");var deferred=$q.defer();return $http.get("/auth/verify/"+token).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error)}),deferred.promise},resetPassword:function(passwordDetails,token){var deferred=$q.defer();return $http.get("/auth/password/"+token,passwordDetails).success(function(response){deferred.resolve()}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},askForPasswordReset:function(credentials){var deferred=$q.defer();return $http.post("/auth/forgot",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise}};return userService}]),angular.module("users").factory("Users",["$resource",function($resource){return $resource("users",{},{update:{method:"PUT"}})}]); +>>>>>>> make it work +======= function removeDateFieldsFunc(o){function eachObject(v,k){"lastModified"!==k&&"created"!==k||delete clone[i][k]}for(var clone=_.clone(o),i=0;i'),$templateCache.put("modules/core/views/home.client.view.html",'

Craft beautiful forms in seconds.

Create your next ______.

Tell a story with a form.

'),$templateCache.put("modules/forms/admin/views/admin-form.client.view.html",'
'),$templateCache.put("modules/forms/admin/views/list-forms.client.view.html",'

Create a new form
Name
Language

'),$templateCache.put("modules/forms/base/views/submit-form.client.view.html","
"),$templateCache.put("modules/forms/admin/views/adminTabs/analyze.html",""),$templateCache.put("modules/forms/admin/views/adminTabs/configure.html",""),$templateCache.put("modules/forms/admin/views/adminTabs/create.html",""),$templateCache.put("modules/forms/admin/views/adminTabs/design.html",'
Background Color
Question Text Color
Answer Text Color
Button Background Color
Button Text Color
'),$templateCache.put("modules/forms/admin/views/directiveViews/cgBusy/update-form-message-TypeA.html",'
{{$message}}
'),$templateCache.put("modules/forms/admin/views/directiveViews/cgBusy/update-form-message-TypeB.html",'
{{$message}}
'),$templateCache.put("modules/forms/admin/views/directiveViews/form/configure-form.client.view.html",'
Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.name}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type
Form Name
Form Status
Language
* required
Display Form Footer?
Display Start Page?
'),$templateCache.put("modules/forms/admin/views/directiveViews/form/edit-form.client.view.html",'

Edit Start Page


Intro Title:
Intro Paragraph:
\n
\n\n

\n
\n
Options:
\n
\n
\n \n\n \n \n \n
\n
\n \n
\n
\n
\n\n

\n\n
\n
Required:
\n
\n \n\n \n
\n
\n\n
\n
Disabled:
\n
\n \n\n \n
\n
\n\n
\n \n\n
\n
\n

\n Click on Fields to add them here\n

\n
\n
\n\n
\n \n
\n\n \n \n\n \n
\n
\n\n'), $templateCache.put("modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html",'
#{{value.title}}OscarEMR User ProfilePercentage CompleteTime ElapsedDeviceLocationIP AddressDate Submitted (UTC)Generated PDF
{{$index+1}}{{field.fieldValue}}User Profile #{{row.oscarDemoNum}}{{row.percentageComplete}}%{{row.timeElapsed}}{{row.device.name}}, {{row.device.type}}{{row.geoLocation.city}}, {{row.geoLocation.country}}{{row.ipAddr}}{{row.created | date:\'yyyy-MM-dd HH:mm:ss\'}}Generated PDF
'),$templateCache.put("modules/forms/base/views/directiveViews/entryPage/startPage.html",'

{{pageData.introTitle}}

{{pageData.introParagraph}}

'),$templateCache.put("modules/forms/base/views/directiveViews/field/date.html",'

{{field.title}} {{ \'OPTIONAL\' | translate }}

'),$templateCache.put("modules/forms/base/views/directiveViews/field/dropdown.html",'
'),$templateCache.put("modules/forms/base/views/directiveViews/field/file.html",'
{{field.title}} (* {{ \'REQUIRED\' | translate }})
{{field.file.originalname}}
{{ UPLOAD_FILE | translate }}
'),$templateCache.put("modules/forms/base/views/directiveViews/field/hidden.html",''),$templateCache.put("modules/forms/base/views/directiveViews/field/legal.html",'
'),$templateCache.put("modules/forms/base/views/directiveViews/field/radio.html",'

{{field.title}} {{ \'OPTIONAL\' | translate }}


'),$templateCache.put("modules/forms/base/views/directiveViews/field/rating.html",'

{{field.title}} {{ \'OPTIONAL\' | translate }}

'),$templateCache.put("modules/forms/base/views/directiveViews/field/statement.html",'

{{field.title}}

{{field.description}}


'),$templateCache.put("modules/forms/base/views/directiveViews/field/textarea.html",'

{{field.title}} {{ \'OPTIONAL\' | translate }}

{{ \'ENTER\' | translate }}
'),$templateCache.put("modules/forms/base/views/directiveViews/field/textfield.html",'

{{field.title}} ({{ \'OPTIONAL\' | translate }})

{{ \'ENTER\' | translate }}
'),$templateCache.put("modules/forms/base/views/directiveViews/field/yes_no.html",'

{{field.title}} *({{ REQUIRED | translate }})

{{field.description}}


'),$templateCache.put("modules/forms/base/views/directiveViews/form/submit-form.client.view.html",'
press ENTER
'),$templateCache.put("modules/users/views/authentication/access-denied.client.view.html",'

You need to be logged in to access this page

Login
'),$templateCache.put("modules/users/views/authentication/signin.client.view.html",'

Sign into your account

'),$templateCache.put("modules/users/views/authentication/signup-success.client.view.html",''),$templateCache.put("modules/users/views/authentication/signup.client.view.html",''),$templateCache.put("modules/users/views/password/forgot-password.client.view.html",'

Restore your password

Enter your account email.

'),$templateCache.put("modules/users/views/password/reset-password-invalid.client.view.html",'

Password reset is invalid

Ask for a new password reset
'),$templateCache.put("modules/users/views/password/reset-password-success.client.view.html",'

Password successfully reset

Continue to home page
'),$templateCache.put("modules/users/views/password/reset-password.client.view.html",'

Reset your password

'),$templateCache.put("modules/users/views/settings/change-password.client.view.html",'

Change your password

'),$templateCache.put("modules/users/views/settings/edit-profile.client.view.html",'

Edit your profile

'),$templateCache.put("modules/users/views/settings/social-accounts.client.view.html",'

Connected social accounts:

Connect other social accounts:

'), $templateCache.put("modules/users/views/verify/resend-verify-email.client.view.html",'

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at hi@TellForm.com

'),$templateCache.put("modules/users/views/verify/verify-account.client.view.html",'

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
')}]);var ApplicationConfiguration=function(){var applicationModuleName="NodeForm",applicationModuleVendorDependencies=["duScroll","ui.select","cgBusy","ngSanitize","vButton","ngResource","NodeForm.templates","ui.router","ui.bootstrap","ui.utils"],registerModule=function(moduleName,dependencies){angular.module(moduleName,dependencies||[]),angular.module(applicationModuleName).requires.push(moduleName)};return{applicationModuleName:applicationModuleName,applicationModuleVendorDependencies:applicationModuleVendorDependencies,registerModule:registerModule}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function($locationProvider){$locationProvider.hashPrefix("!")}]),angular.module(ApplicationConfiguration.applicationModuleName).constant("APP_PERMISSIONS",{viewAdminSettings:"viewAdminSettings",editAdminSettings:"editAdminSettings",editForm:"editForm",viewPrivateForm:"viewPrivateForm"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("USER_ROLES",{admin:"admin",normal:"user",superuser:"superuser"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("FORM_URL","/forms/:formId"),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","$state","$stateParams",function($rootScope,Auth,$state,$stateParams){$rootScope.$state=$state,$rootScope.$stateParams=$stateParams,$rootScope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState){$state.previous=fromState,"home"===toState.name||"signin"===toState.name||"resendVerifyEmail"===toState.name||"verify"===toState.name||"signup"===toState.name||"signup-success"===toState.name?Auth.isAuthenticated()&&(event.preventDefault(),$state.go("listForms")):"access_denied"===toState.name||Auth.isAuthenticated()||"submitForm"===toState.name||(event.preventDefault(),$state.go("listForms"))})}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","User","Authorizer","$state","$stateParams",function($rootScope,Auth,User,Authorizer,$state,$stateParams){$rootScope.$on("$stateChangeStart",function(event,next){var authenticator,permissions,user;permissions=next&&next.data&&next.data.permissions?next.data.permissions:null,Auth.ensureHasCurrentUser(User),user=Auth.currentUser,user&&(authenticator=new Authorizer(user),null!=permissions&&(authenticator.canAccess(permissions)||(event.preventDefault(),$state.go("access_denied"))))})}]),angular.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),angular.module("NodeForm.templates",[]).run(["$templateCache",function($templateCache){"use strict";$templateCache.put("../public/modules/core/views/header.client.view.html",''),$templateCache.put("../public/modules/core/views/home.client.view.html",'

Craft beautiful forms in seconds.

Create your next ______.

Tell a story with a form.

'),$templateCache.put("../public/modules/forms/views/admin-form.client.view.html",'
'),$templateCache.put("../public/modules/forms/views/list-forms.client.view.html",'

Create a new form
Name
Language

'),$templateCache.put("../public/modules/forms/views/submit-form.client.view.html","
"),$templateCache.put("../public/modules/forms/views/adminTabs/analyze.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/configure.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/create.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/design.html",'
Background Color
Question Text Color
Answer Text Color
Button Background Color
Button Text Color
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeA.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/entryPage/startPage.html",'

{{pageData.introTitle}}

{{pageData.introParagraph}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/date.html",'

{{field.title}} *(required)

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/dropdown.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/file.html",'
{{field.title}} (* required)
{{field.file.originalname}}
Upload your File
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/hidden.html",''),$templateCache.put("../public/modules/forms/views/directiveViews/field/legal.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/natural.html",'

{{field.title}} *(required)


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/password.html",'

{{field.title}} *(required)

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/radio.html",'

{{field.title}} *(required)


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/rating.html",'

{{field.title}} *(required)

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/statement.html",'

{{field.title}}

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textarea.html",'

{{field.title}} *(required)

press ENTER
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textfield.html",'

{{field.title}} *(required)

press ENTER
'), @@ -17,4 +34,10 @@ $templateCache.put("../public/modules/forms/views/directiveViews/field/yes_no.ht $templateCache.put("../public/modules/users/views/authentication/signup-success.client.view.html",''),$templateCache.put("../public/modules/users/views/authentication/signup.client.view.html",''),$templateCache.put("../public/modules/users/views/password/forgot-password.client.view.html",'

Restore your password

Enter your account email.

'),$templateCache.put("../public/modules/users/views/password/reset-password-invalid.client.view.html",'

Password reset is invalid

Ask for a new password reset
'),$templateCache.put("../public/modules/users/views/password/reset-password-success.client.view.html",'

Password successfully reset

Continue to home page
'),$templateCache.put("../public/modules/users/views/password/reset-password.client.view.html",'

Reset your password

'),$templateCache.put("../public/modules/users/views/settings/change-password.client.view.html",'

Change your password

'),$templateCache.put("../public/modules/users/views/settings/edit-profile.client.view.html",'

Edit your profile

'),$templateCache.put("../public/modules/users/views/settings/social-accounts.client.view.html",'

Connected social accounts:

Connect other social accounts:

'),$templateCache.put("../public/modules/users/views/verify/resend-verify-email.client.view.html",'

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at hi@TellForm.com

'),$templateCache.put("../public/modules/users/views/verify/verify-account.client.view.html",'

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
')}]),ApplicationConfiguration.registerModule("core",["users"]),ApplicationConfiguration.registerModule("forms",["ngFileUpload","ui.router.tabs","ui.date","ui.sortable","angular-input-stars","users","pascalprecht.translate"]),ApplicationConfiguration.registerModule("users"),angular.module("core").config(["$stateProvider","$urlRouterProvider",function($stateProvider,$urlRouterProvider,Authorization){$urlRouterProvider.otherwise("/forms")}]),angular.module("core").controller("HeaderController",["$rootScope","$scope","Menus","$state","Auth","User",function($rootScope,$scope,Menus,$state,Auth,User){$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.authentication=$rootScope.authentication=Auth,$rootScope.languages=$scope.languages=["english","french","spanish"],$scope.isCollapsed=!1,$rootScope.hideNav=!1,$scope.menu=Menus.getMenu("topbar"),$scope.signout=function(){var promise=User.logout();promise.then(function(){Auth.logout(),Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user=null,$state.go("listForms")},function(reason){console.log("Logout Failed: "+reason)})},$scope.toggleCollapsibleMenu=function(){$scope.isCollapsed=!$scope.isCollapsed},$scope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState,fromParams){$scope.isCollapsed=!1,$rootScope.hideNav=!1,angular.isDefined(toState.data)&&angular.isDefined(toState.data.hideNav)&&($rootScope.hideNav=toState.data.hideNav)})}]),angular.module("core").controller("HomeController",["$rootScope","$scope","User","$state",function($rootScope,$scope,User,$state){$scope=$rootScope}]),angular.module("core").service("Menus",[function(){this.defaultRoles=["*"],this.menus={};var shouldRender=function(user){if(!user)return this.isPublic;if(~this.roles.indexOf("*"))return!0;for(var userRoleIndex in user.roles)for(var roleIndex in this.roles)if(console.log(this.roles[roleIndex]),console.log(this.roles[roleIndex]===user.roles[userRoleIndex]),this.roles[roleIndex]===user.roles[userRoleIndex])return!0;return!1};this.validateMenuExistance=function(menuId){if(menuId&&menuId.length){if(this.menus[menuId])return!0;throw new Error("Menu does not exists")}throw new Error("MenuId was not provided")},this.getMenu=function(menuId){return this.validateMenuExistance(menuId),this.menus[menuId]},this.addMenu=function(menuId,isPublic,roles){return this.menus[menuId]={isPublic:isPublic||!1,roles:roles||this.defaultRoles,items:[],shouldRender:shouldRender},this.menus[menuId]},this.removeMenu=function(menuId){this.validateMenuExistance(menuId),delete this.menus[menuId]},this.addMenuItem=function(menuId,menuItemTitle,menuItemURL,menuItemType,menuItemUIRoute,isPublic,roles,position){return this.validateMenuExistance(menuId),this.menus[menuId].items.push({title:menuItemTitle,link:menuItemURL,menuItemType:menuItemType||"item",menuItemClass:menuItemType,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].roles:roles,position:position||0,items:[],shouldRender:shouldRender}),this.menus[menuId]},this.addSubMenuItem=function(menuId,rootMenuItemURL,menuItemTitle,menuItemURL,menuItemUIRoute,isPublic,roles,position){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===rootMenuItemURL&&this.menus[menuId].items[itemIndex].items.push({title:menuItemTitle,link:menuItemURL,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].items[itemIndex].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].items[itemIndex].roles:roles,position:position||0,shouldRender:shouldRender});return this.menus[menuId]},this.removeMenuItem=function(menuId,menuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===menuItemURL&&this.menus[menuId].items.splice(itemIndex,1);return this.menus[menuId]},this.removeSubMenuItem=function(menuId,submenuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)for(var subitemIndex in this.menus[menuId].items[itemIndex].items)this.menus[menuId].items[itemIndex].items[subitemIndex].link===submenuItemURL&&this.menus[menuId].items[itemIndex].items.splice(subitemIndex,1);return this.menus[menuId]},this.addMenu("topbar",!1,["*"]),this.addMenu("bottombar",!1,["*"])}]),angular.module("forms").run(["Menus",function(Menus){Menus.addMenuItem("topbar","My Forms","forms","","/forms",!1)}]).filter("formValidity",function(){return function(formObj){if(formObj&&formObj.form_fields&&formObj.visible_form_fields){var formKeys=Object.keys(formObj),fields=(formKeys.filter(function(key){return"$"!==key[0]}),formObj.form_fields),valid_count=fields.filter(function(field){return"object"==typeof field&&"statement"!==field.fieldType&&"rating"!==field.fieldType?!!field.fieldValue:void 0}).length;return valid_count-(formObj.form_fields.length-formObj.visible_form_fields.length)}return 0}}).config(["$provide",function($provide){$provide.decorator("accordionDirective",["$delegate",function($delegate){var directive=$delegate[0];return directive.replace=!0,$delegate}])}]),angular.module("forms").config(["$stateProvider",function($stateProvider){$stateProvider.state("listForms",{url:"/forms",templateUrl:"modules/forms/admin/views/list-forms.client.view.html"}).state("submitForm",{url:"/forms/:formId",templateUrl:"modules/forms/base/views/submit-form.client.view.html",data:{hideNav:!0},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"SubmitFormController",controllerAs:"ctrl"}).state("viewForm",{url:"/forms/:formId/admin",templateUrl:"modules/forms/admin/views/admin-form.client.view.html",data:{permissions:["editForm"]},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"AdminFormController"}).state("viewForm.configure",{url:"/configure",templateUrl:"modules/forms/admin/views/adminTabs/configure.html"}).state("viewForm.design",{url:"/design",templateUrl:"modules/forms/admin/views/adminTabs/design.html"}).state("viewForm.analyze",{url:"/analyze",templateUrl:"modules/forms/admin/views/adminTabs/analyze.html"}).state("viewForm.create",{url:"/create",templateUrl:"modules/forms/admin/views/adminTabs/create.html"})}]),angular.module("users").config(["$httpProvider",function($httpProvider){$httpProvider.interceptors.push(["$q","$location",function($q,$location){return{responseError:function(response){return"/users/me"!==$location.path()&&response.config&&"/users/me"!==response.config.url&&(console.log("intercepted rejection of ",response.config.url,response.status),401===response.status?($location.nextAfterLogin=$location.path(),$location.path("/signin")):403===response.status&&$location.path("/access_denied")),$q.reject(response)}}}])}]),angular.module("users").config(["$stateProvider",function($stateProvider){var checkLoggedin=function($q,$timeout,$state,User,Auth){var deferred=$q.defer();return Auth.currentUser&&Auth.currentUser.email?$timeout(deferred.resolve):Auth.currentUser=User.getCurrent(function(){Auth.login(),$timeout(deferred.resolve())},function(){Auth.logout(),$timeout(deferred.reject()),$state.go("sigin",{reload:!0})}),deferred.promise};checkLoggedin.$inject=["$q","$timeout","$state","User","Auth"],$stateProvider.state("profile",{resolve:{loggedin:checkLoggedin},url:"/settings/profile",templateUrl:"modules/users/views/settings/edit-profile.client.view.html"}).state("password",{resolve:{loggedin:checkLoggedin},url:"/settings/password",templateUrl:"modules/users/views/settings/change-password.client.view.html"}).state("accounts",{resolve:{loggedin:checkLoggedin},url:"/settings/accounts",templateUrl:"modules/users/views/settings/social-accounts.client.view.html"}).state("signup",{url:"/signup",templateUrl:"modules/users/views/authentication/signup.client.view.html"}).state("signup-success",{url:"/signup-success",templateUrl:"modules/users/views/authentication/signup-success.client.view.html"}).state("signin",{url:"/signin",templateUrl:"modules/users/views/authentication/signin.client.view.html"}).state("access_denied",{url:"/access_denied",templateUrl:"modules/users/views/authentication/access-denied.client.view.html"}).state("resendVerifyEmail",{url:"/verify",templateUrl:"modules/users/views/verify/resend-verify-email.client.view.html"}).state("verify",{url:"/verify/:token",templateUrl:"modules/users/views/verify/verify-account.client.view.html"}).state("forgot",{url:"/password/forgot",templateUrl:"modules/users/views/password/forgot-password.client.view.html"}).state("reset-invalid",{url:"/password/reset/invalid",templateUrl:"modules/users/views/password/reset-password-invalid.client.view.html"}).state("reset-success",{url:"/password/reset/success",templateUrl:"modules/users/views/password/reset-password-success.client.view.html"}).state("reset",{url:"/password/reset/:token",templateUrl:"modules/users/views/password/reset-password.client.view.html"})}]),angular.module("users").controller("AuthenticationController",["$scope","$location","$state","$rootScope","User","Auth",function($scope,$location,$state,$rootScope,User,Auth){$scope=$rootScope,$scope.credentials={},$scope.error="",$scope.signin=function(){$scope.credentials.email=$scope.credentials.username,User.login($scope.credentials).then(function(response){Auth.login(response),$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),"home"!==$state.previous.name&&"verify"!==$state.previous.name&&""!==$state.previous.name?$state.go($state.previous.name):$state.go("listForms")},function(error){$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user,$scope.error=error,console.log("loginError: "+error)})},$scope.signup=function(){console.log($scope.credentials),User.signup($scope.credentials).then(function(response){console.log("signup-success"),$state.go("signup-success")},function(error){console.log("Error: "),console.log(error),error?($scope.error=error,console.log(error)):console.log("No response received")})}}]),angular.module("users").controller("PasswordController",["$scope","$stateParams","$state","User",function($scope,$stateParams,$state,User){$scope.error="",$scope.askForPasswordReset=function(){User.askForPasswordReset($scope.credentials).then(function(response){$scope.success=response.message,$scope.credentials=null},function(error){$scope.error=error,$scope.credentials=null})},$scope.resetUserPassword=function(){$scope.success=$scope.error=null,User.resetPassword($scope.passwordDetails,$stateParams.token).then(function(response){$scope.success=response.message,$scope.passwordDetails=null,$state.go("reset-success")},function(error){$scope.error=error.message||error,$scope.passwordDetails=null})}}]),angular.module("users").controller("SettingsController",["$scope","$rootScope","$http","$state","Users",function($scope,$rootScope,$http,$state,Users){$scope.user=$rootScope.user,$scope.hasConnectedAdditionalSocialAccounts=function(provider){for(var i in $scope.user.additionalProvidersData)return!0;return!1},$scope.isConnectedSocialAccount=function(provider){return $scope.user.provider===provider||$scope.user.additionalProvidersData&&$scope.user.additionalProvidersData[provider]},$scope.removeUserSocialAccount=function(provider){$scope.success=$scope.error=null,$http["delete"]("/users/accounts",{params:{provider:provider}}).success(function(response){$scope.success=!0,$scope.user=response}).error(function(response){$scope.error=response.message})},$scope.updateUserProfile=function(isValid){if(isValid){$scope.success=$scope.error=null;var user=new Users($scope.user);user.$update(function(response){$scope.success=!0,$scope.user=response},function(response){$scope.error=response.data.message})}else $scope.submitted=!0},$scope.changeUserPassword=function(){$scope.success=$scope.error=null,$http.post("/users/password",$scope.passwordDetails).success(function(response){$scope.success=!0,$scope.passwordDetails=null}).error(function(response){$scope.error=response.message})}}]),angular.module("users").controller("VerifyController",["$scope","$state","$rootScope","User","Auth","$stateParams",function($scope,$state,$rootScope,User,Auth,$stateParams){$scope.isResetSent=!1,$scope.credentials={},$scope.error="",$scope.resendVerifyEmail=function(){User.resendVerifyEmail($scope.credentials.email).then(function(response){console.log(response),$scope.success=response.message,$scope.credentials=null,$scope.isResetSent=!0},function(error){$scope.error=error,$scope.credentials.email=null,$scope.isResetSent=!1})},$scope.validateVerifyToken=function(){$stateParams.token&&(console.log($stateParams.token),User.validateVerifyToken($stateParams.token).then(function(response){console.log("Success: "+response.message),$scope.success=response.message,$scope.isResetSent=!0,$scope.credentials.email=null},function(error){console.log("Error: "+error.message),$scope.isResetSent=!1,$scope.error=error,$scope.credentials.email=null}))}}]),angular.module("users").factory("Auth",["$window",function($window){var userState={isLoggedIn:!1},service={_currentUser:null,get currentUser(){return this._currentUser},ensureHasCurrentUser:function(User){return service._currentUser&&service._currentUser.username?service._currentUser:$window.user?(service._currentUser=$window.user,service._currentUser):void User.getCurrent().then(function(user){return service._currentUser=user,userState.isLoggedIn=!0,$window.user=service._currentUser,service._currentUser},function(response){return userState.isLoggedIn=!1,service._currentUser=null,$window.user=null,console.log("User.getCurrent() err",response),null})},isAuthenticated:function(){return!!service._currentUser},getUserState:function(){return userState},login:function(new_user){userState.isLoggedIn=!0,service._currentUser=new_user},logout:function(){$window.user=null,userState.isLoggedIn=!1,service._currentUser=null}};return service}]),angular.module("users").service("Authorizer",["APP_PERMISSIONS","USER_ROLES",function(APP_PERMISSIONS,USER_ROLES){return function(user){return{canAccess:function(permissions){var i,len,permission;for(angular.isArray(permissions)||(permissions=[permissions]),i=0,len=permissions.length;len>i;i++){if(permission=permissions[i],null===APP_PERMISSIONS[permission])throw"Bad permission value";if(!user||!user.roles)return!1;switch(permission){case APP_PERMISSIONS.viewAdminSettings:case APP_PERMISSIONS.editAdminSettings:return user.roles.indexOf(USER_ROLES.admin)>-1;case APP_PERMISSIONS.viewPrivateForm:case APP_PERMISSIONS.editForm:return user.roles.indexOf(USER_ROLES.admin)>-1||user.roles.indexOf(USER_ROLES.normal)>-1}}return!1}}}}]),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function($window,$q,$timeout,$http,$state){var userService={getCurrent:function(){var deferred=$q.defer();return $http.get("/users/me").success(function(response){deferred.resolve(response)}).error(function(){deferred.reject("User's session has expired")}),deferred.promise},login:function(credentials){var deferred=$q.defer();return $http.post("/auth/signin",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},logout:function(){var deferred=$q.defer();return $http.get("/auth/signout").success(function(response){deferred.resolve(null)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},signup:function(credentials){var deferred=$q.defer();return $http.post("/auth/signup",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},resendVerifyEmail:function(_email){var deferred=$q.defer();return $http.post("/auth/verify",{email:_email}).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},validateVerifyToken:function(token){var validTokenRe=/^([A-Za-z0-9]{48})$/g;if(!validTokenRe.test(token))throw new Error("Error token: "+token+" is not a valid verification token");var deferred=$q.defer();return $http.get("/auth/verify/"+token).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error)}),deferred.promise},resetPassword:function(passwordDetails,token){var deferred=$q.defer();return $http.get("/auth/password/"+token,passwordDetails).success(function(response){deferred.resolve()}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},askForPasswordReset:function(credentials){var deferred=$q.defer();return $http.post("/auth/forgot",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise}};return userService}]),angular.module("users").factory("Users",["$resource",function($resource){return $resource("users",{},{update:{method:"PUT"}})}]),angular.module("forms").controller("AdminFormController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http","$uibModal","myForm",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http,$uibModal,myForm){$scope=$rootScope,$scope.animationsEnabled=!0,$scope.myform=myForm,$rootScope.saveInProgress=!1,CurrentForm.setForm($scope.myform),$scope.tabData=[{heading:"Create",route:"viewForm.create"},{heading:"Design",route:"viewForm.design"},{heading:"Configure",route:"viewForm.configure"},{heading:"Analyze",route:"viewForm.analyze"}],$scope.setForm=function(form){$scope.myform=form},$rootScope.resetForm=function(){$scope.myform=Forms.get({formId:$stateParams.formId})},$scope.openDeleteModal=function(){$scope.deleteModal=$uibModal.open({animation:$scope.animationsEnabled,templateUrl:"myModalContent.html",controller:"AdminFormController",resolve:{myForm:function(){return $scope.myform}}}),$scope.deleteModal.result.then(function(selectedItem){$scope.selected=selectedItem},function(){console.log("Modal dismissed at: "+new Date)})},$scope.cancelDeleteModal=function(){$scope.deleteModal&&$scope.deleteModal.dismiss("cancel")},$scope.removeCurrentForm=function(){if($scope.deleteModal&&$scope.deleteModal.opened){$scope.deleteModal.close();var form_id=$scope.myform._id;if(!form_id)throw new Error("Error - removeCurrentForm(): $scope.myform._id does not exist");$http["delete"]("/forms/"+form_id).success(function(data,status,headers){console.log("form deleted successfully"),$state.go("listForms",{},{reload:!0})}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}},$scope.update=$rootScope.update=function(updateImmediately,cb){var continueUpdate=!0;if(updateImmediately||(continueUpdate=!$rootScope.saveInProgress),continueUpdate){var err=null;updateImmediately||($rootScope.saveInProgress=!0),$scope.updatePromise=$http.put("/forms/"+$scope.myform._id,{form:$scope.myform}).then(function(response){$rootScope.myform=$scope.myform=response.data})["catch"](function(response){console.log("Error occured during form UPDATE.\n"),err=response.data})["finally"](function(){return updateImmediately||($rootScope.saveInProgress=!1),"function"==typeof cb?cb(err):void 0})}}}]),angular.module("forms").controller("ListFormsController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http){$scope=$rootScope,$scope.forms={},$scope.showCreateModal=!1,$scope.findAll=function(){Forms.query(function(_forms){$scope.myforms=_forms})},$scope.openCreateModal=function(){$scope.showCreateModal||($scope.showCreateModal=!0)},$scope.closeCreateModal=function(){$scope.showCreateModal&&($scope.showCreateModal=!1); },$scope.setForm=function(form){$scope.myform=form},$scope.goToWithId=function(route,id){$state.go(route,{formId:id},{reload:!0})},$scope.duplicateForm=function(form_index){var form=_.cloneDeep($scope.myforms[form_index]);delete form._id,$http.post("/forms",{form:form}).success(function(data,status,headers){$scope.myforms.splice(form_index+1,0,data)}).error(function(errorResponse){console.error(errorResponse),null===errorResponse&&($scope.error=errorResponse.data.message)})},$scope.createNewForm=function(){var form={};form.title=$scope.forms.createForm.title.$modelValue,form.language=$scope.forms.createForm.language.$modelValue,$scope.forms.createForm.$valid&&$scope.forms.createForm.$dirty&&$http.post("/forms",{form:form}).success(function(data,status,headers){console.log("new form created"),$scope.goToWithId("viewForm.create",data._id+"")}).error(function(errorResponse){console.error(errorResponse),$scope.error=errorResponse.data.message})},$scope.removeForm=function(form_index){if(form_index>=$scope.myforms.length||0>form_index)throw new Error("Error: form_index in removeForm() must be between 0 and "+$scope.myforms.length-1);$http["delete"]("/forms/"+$scope.myforms[form_index]._id).success(function(data,status,headers){console.log("form deleted successfully"),$scope.myforms.splice(form_index,1)}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}}]),_.mixin({removeDateFields:removeDateFieldsFunc}),angular.module("forms").directive("autoSaveForm",["$rootScope","$timeout",function($rootScope,$timeout){return{require:["^form"],restrict:"AE",link:function($scope,$element,$attrs,$ctrls){angular.element(document).ready(function(){var $formCtrl=$ctrls[0],savePromise=null;$rootScope.finishedRender=!1,$scope.$on("editFormFields Started",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!1}),$scope.$on("editFormFields Finished",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!0}),$scope.anyDirtyAndTouched=function(form){var propCount=0;for(var prop in form)if(form.hasOwnProperty(prop)&&"$"!==prop[0]&&(propCount++,form[prop].$touched&&form[prop].$dirty))return!0;return!1};var debounceSave=function(){$rootScope.saveInProgress=!0,$rootScope[$attrs.autoSaveCallback](!0,function(err){err?(console.error("Error form data NOT persisted"),console.error(err)):(console.log("\n\nForm data persisted -- setting pristine flag"),$formCtrl.$setPristine(),$formCtrl.$setUntouched())})};$scope.$watch(function(newValue,oldValue){console.log("introParagraphStartPage.$dirty: "+$scope.editForm.introParagraphStartPage.$dirty),console.log("introParagraphStartPage.$touched: "+$scope.editForm.introParagraphStartPage.$touched),$rootScope.finishedRender&&$scope.anyDirtyAndTouched($scope.editForm)&&!$rootScope.saveInProgress&&(console.log("Form saving started"),debounceSave(),console.log("introParagraphStartPage.$dirty AFTER: "+$scope.editForm.introParagraphStartPage.$dirty))}),$scope.$watch($attrs.autoSaveWatch,function(newValue,oldValue){newValue=angular.copy(newValue),oldValue=angular.copy(oldValue),newValue.form_fields=_.removeDateFields(newValue.form_fields),oldValue.form_fields=_.removeDateFields(oldValue.form_fields);var changedFields=!_.isEqual(oldValue.form_fields,newValue.form_fields)||!_.isEqual(oldValue.startPage,newValue.startPage),changedFieldMap=!1;oldValue.hasOwnProperty("plugins.oscarhost.settings.fieldMap")&&(changedFieldMap=!!oldValue.plugins.oscarhost.settings.fieldMap&&!_.isEqual(oldValue.plugins.oscarhost.settings.fieldMap,newValue.plugins.oscarhost.settings.fieldMap)),(newValue||oldValue)&&oldValue&&(0===oldValue.form_fields.length&&($rootScope.finishedRender=!0),$rootScope.finishedRender&&(changedFields&&!$formCtrl.$dirty||changedFieldMap)&&!$rootScope.saveInProgress?(savePromise&&($timeout.cancel(savePromise),savePromise=null),savePromise=$timeout(function(){debounceSave()})):$rootScope.finishedRender&&$rootScope.saveInProgress&&($rootScope.saveInProgress=!1))},!0)})}}}]),angular.module("forms").directive("configureFormDirective",["$rootScope","$http","Upload","CurrentForm",function($rootScope,$http,Upload,CurrentForm){return{templateUrl:"modules/forms/admin/views/directiveViews/form/configure-form.client.view.html",restrict:"E",scope:{myform:"=",user:"=",pdfFields:"@",formFields:"@"},controller:["$scope",function($scope){console.log($scope.myform),CurrentForm.getForm().plugins?CurrentForm.getForm().plugins.oscarhost.baseUrl&&($scope.oscarhostAPI=!0):$scope.oscarhostAPI=!1,$scope.log="",$scope.pdfLoading=!1,$scope.languages=$rootScope.languages,this._current_upload=null,$scope.resetForm=$rootScope.resetForm,$scope.update=$rootScope.update,this._unbindedPdfFields=$scope.pdfFields,$scope.cancelUpload=function(){this._current_upload.abort(),$scope.pdfLoading=!1,$scope.removePDF()},$scope.removePDF=function(){$scope.myform.pdf=null,$scope.myform.isGenerated=!1,$scope.myform.autofillPDFs=!1,console.log("form.pdf: "+$scope.myform.pdf+" REMOVED")},$scope.uploadPDF=function(file){file&&(console.log(file),Upload.upload({url:"/upload/pdf",data:{user:$scope.user,file:file}}).then(function(resp){var data=resp.data;$scope.log="file "+data.originalname+" uploaded as "+data.filename+". JSON: "+JSON.stringify(data)+"\n"+$scope.log,$scope.myform.pdf=angular.fromJson(angular.toJson(data)),$scope.pdfLoading=!1,console.log($scope.log),$scope.$$phase||$scope.$digest||$scope.$apply()},function(resp){$scope.pdfLoading=!1,console.log("Error occured during upload.\n"),console.log(resp.status)},function(evt){var progressPercentage=parseInt(100*evt.loaded/evt.total,10);$scope.log="progress: "+progressPercentage+"% "+evt.config.data.file.name+"\n"+$scope.log,console.log($scope.log),$scope.pdfLoading=!0}))}}]}}]),angular.module("forms").directive("editFormDirective",["$rootScope","FormFields",function($rootScope,FormFields){return{templateUrl:"modules/forms/admin/views/directiveViews/form/edit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$scope",function($scope){for(var field_ids=_($scope.myform.form_fields).pluck("_id"),i=0;i0){$scope.myform.plugins.oscarhost.settings.fieldMap||($scope.myform.plugins.oscarhost.settings.fieldMap={});var oscarhostFields=$scope.myform.plugins.oscarhost.settings.validFields,currentFields=_($scope.myform.plugins.oscarhost.settings.fieldMap).invert().keys().value();return $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id)&&(currentFields=_(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id])),_(oscarhostFields).difference(currentFields).value()}return[]},$scope.dropzone={handle:" .handle",containment:".dropzoneContainer",cursor:"grabbing"},$scope.addNewField=function(modifyForm,fieldType){$scope.addField.lastAddedID++;for(var fieldTitle,i=0;i<$scope.addField.types.length;i++)if($scope.addField.types[i].name===fieldType){$scope.addField.types[i].lastAddedID++,fieldTitle=$scope.addField.types[i].value+$scope.addField.types[i].lastAddedID;break}var newField={title:fieldTitle,fieldType:fieldType,fieldValue:"",required:!0,disabled:!1,deletePreserved:!1};return modifyForm&&$scope.myform.form_fields.push(newField),newField},$scope.deleteField=function(field_index){var currFieldId=$scope.myform.form_fields[field_index]._id;$scope.myform.hasOwnProperty("plugins.oscarhost.baseUrl")&&delete $scope.myform.plugins.oscarhost.settings.fieldMap[currFieldId],$scope.myform.form_fields.splice(field_index,1)},$scope.duplicateField=function(field_index){var currField=_.cloneDeep($scope.myform.form_fields[field_index]);currField._id="cloned"+_.uniqueId(),currField.title+=" copy",$scope.myform.form_fields.splice(field_index+1,0,currField)},$scope.addButton=function(){var newButton={};newButton.bgColor="#ddd",newButton.color="#ffffff",newButton.text="Button",newButton._id=Math.floor(1e5*Math.random()),$scope.myform.startPage.buttons.push(newButton)},$scope.deleteButton=function(button){for(var currID,i=0;i<$scope.myform.startPage.buttons.length;i++)if(currID=$scope.myform.startPage.buttons[i]._id,console.log(currID),currID===button._id){$scope.myform.startPage.buttons.splice(i,1);break}},$scope.addOption=function(field_index){var currField=$scope.myform.form_fields[field_index];if(console.log(field_index),console.log(currField),"checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType){currField.fieldOptions||($scope.myform.form_fields[field_index].fieldOptions=[]);var lastOptionID=0;currField.fieldOptions[currField.fieldOptions.length-1]&&(lastOptionID=currField.fieldOptions[currField.fieldOptions.length-1].option_id);var newOption={option_id:Math.floor(1e5*Math.random()),option_title:"Option "+lastOptionID,option_value:"Option "+lastOptionID};$scope.myform.form_fields[field_index].fieldOptions.push(newOption)}},$scope.deleteOption=function(field_index,option){var currField=$scope.myform.form_fields[field_index];if("checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType)for(var i=0;i',restrict:"E",scope:{typeName:"@"},controller:["$scope",function($scope){var iconTypeMap={textfield:"fa fa-pencil-square-o",dropdown:"fa fa-th-list",date:"fa fa-calendar",checkbox:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",email:"fa fa-envelope-o",textarea:"fa fa-pencil-square",legal:"fa fa-legal",file:"fa fa-cloud-upload",rating:"fa fa-star-half-o",link:"fa fa-link",scale:"fa fa-sliders",stripe:"fa fa-credit-card",statement:"fa fa-quote-left",yes_no:"fa fa-toggle-on",number:"fa fa-slack"};$scope.typeIcon=iconTypeMap[$scope.typeName]}]}});var __indexOf=[].indexOf||function(item){for(var i=0,l=this.length;l>i;i++)if(i in this&&this[i]===item)return i;return-1};angular.module("forms").directive("fieldDirective",["$http","$compile","$rootScope","$templateCache","supportedFields",function($http,$compile,$rootScope,$templateCache,supportedFields){var getTemplateUrl=function(fieldType){var type=fieldType,templateUrl="modules/forms/base/views/directiveViews/field/";return __indexOf.call(supportedFields,type)>=0&&(templateUrl=templateUrl+type+".html"),$templateCache.get(templateUrl)};return{template:"
{{field.title}}
",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(scope,element){$rootScope.chooseDefaultOption=scope.chooseDefaultOption=function(type){"yes_no"===type?scope.field.fieldValue="true":"rating"===type?scope.field.fieldValue=0:"radio"===scope.field.fieldType?(console.log(scope.field),scope.field.fieldValue=scope.field.fieldOptions[0].option_value,console.log(scope.field.fieldValue)):"legal"===type&&(scope.field.fieldValue="true",$rootScope.nextField())},scope.setActiveField=$rootScope.setActiveField,"date"===scope.field.fieldType&&(scope.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var fieldType=scope.field.fieldType;if("number"===scope.field.fieldType||"textfield"===scope.field.fieldType||"email"===scope.field.fieldType||"link"===scope.field.fieldType){switch(scope.field.fieldType){case"textfield":scope.field.input_type="text";break;case"email":scope.field.input_type="email",scope.field.placeholder="joesmith@example.com";break;case"number":scope.field.input_type="text",scope.field.validateRegex=/^\d+$/;break;default:scope.field.input_type="url",scope.field.placeholder="http://example.com"}fieldType="textfield"}var template=getTemplateUrl(fieldType);element.html(template).show(),$compile(element.contents())(scope)}}}]),angular.module("forms").directive("onEnterKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;13===keyCode&&($rootScope.$apply(function(){$rootScope.$eval($attrs.onEnterKey)}),event.preventDefault())})}}}]),angular.module("forms").directive("onFinishRender",["$rootScope","$timeout",function($rootScope,$timeout){return{restrict:"A",link:function(scope,element,attrs){if(element.attr("ng-repeat")||element.attr("data-ng-repeat")){var broadcastMessage=attrs.onFinishRender||"ngRepeat";scope.$first&&!scope.$last?scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Started")}):scope.$last&&scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Finished")})}}}}]),angular.module("forms").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","Auth",function($http,TimeCounter,$filter,$rootScope,Auth){return{templateUrl:"modules/forms/base/views/directiveViews/form/submit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$document","$window","$scope",function($document,$window,$scope){$scope.authentication=$rootScope.authentication,$scope.noscroll=!1,$scope.forms={};var form_fields_count=$scope.myform.visible_form_fields.filter(function(field){return"statement"!==field.fieldType&&"rating"!==field.fieldType}).length;$scope.translateAdvancementData={done:$filter("formValidity")($scope.myform),total:form_fields_count},$scope.reloadForm=function(){$scope.myform.submitted=!1,$scope.myform.form_fields=_.chain($scope.myform.visible_form_fields).map(function(field){return field.fieldValue="",field}).value(),$scope.loading=!1,$scope.error="",$scope.selected={_id:"",index:0},$scope.setActiveField($scope.myform.visible_form_fields[0]._id,0,!1),TimeCounter.restartClock()},$window.onscroll=function(){$scope.scrollPos=document.body.scrollTop||document.documentElement.scrollTop||0;var elemBox=document.getElementsByClassName("activeField")[0].getBoundingClientRect();$scope.fieldTop=elemBox.top,$scope.fieldBottom=elemBox.bottom;var field_id,field_index;$scope.noscroll||($scope.selected.index===$scope.myform.form_fields.length-1&&$scope.fieldBottom<200?(field_index=$scope.selected.index+1,field_id="submit_field",$scope.setActiveField(field_id,field_index,!1)):$scope.selected.index===$scope.myform.form_fields.length?$scope.fieldTop>200&&(field_index=$scope.selected.index-1,field_id=$scope.myform.form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):$scope.fieldBottom<0?(field_index=$scope.selected.index+1,field_id=$scope.myform.form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):0!==$scope.selected.index&&$scope.fieldTop>0&&(field_index=$scope.selected.index-1,field_id=$scope.myform.form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)),$scope.$apply())},$scope.setActiveField=$rootScope.setActiveField=function(field_id,field_index,animateScroll){null!==$scope.selected&&$scope.selected._id!==field_id&&($scope.selected._id=field_id,$scope.selected.index=field_index,$scope.translateAdvancementData={done:$filter("formValidity")($scope.myform),total:form_fields_count},animateScroll&&($scope.noscroll=!0,setTimeout(function(){$document.scrollToElement(angular.element(".activeField"),-10,200).then(function(){$scope.noscroll=!1,document.querySelectorAll(".activeField .focusOn")[0].focus()})},20)))},$rootScope.nextField=$scope.nextField=function(){if($scope.selected.index<$scope.myform.form_fields.length-1){var selected_index=$scope.selected.index+1,selected_id=$scope.myform.form_fields[selected_index]._id;$rootScope.setActiveField(selected_id,selected_index,!0)}else if($scope.selected.index===$scope.myform.form_fields.length-1){var selected_index=$scope.selected.index+1,selected_id="submit_field";$rootScope.setActiveField(selected_id,selected_index,!0)}},$rootScope.prevField=$scope.prevField=function(){if($scope.selected.index>0){var selected_index=$scope.selected.index-1,selected_id=$scope.myform.form_fields[selected_index]._id;$scope.setActiveField(selected_id,selected_index,!0)}},$scope.exitStartPage=function(){$scope.myform.startPage.showStart=!1,$scope.myform.form_fields.length>0&&($scope.selected._id=$scope.myform.form_fields[0]._id)},$scope.submitForm=function(){var _timeElapsed=TimeCounter.stopClock();$scope.loading=!0;var form=_.cloneDeep($scope.myform);form.timeElapsed=_timeElapsed,form.percentageComplete=$filter("formValidity")($scope.myform)/$scope.myform.visible_form_fields.length*100,delete form.visible_form_fields,setTimeout(function(){$scope.submitPromise=$http.post("/forms/"+$scope.myform._id,form).success(function(data,status,headers){$scope.myform.submitted=!0,$scope.loading=!1}).error(function(error){$scope.loading=!1,$scope.error=error.message})},500)},$scope.reloadForm()}]}}]),angular.module("forms").service("CurrentForm",function(){var _form={};this.getForm=function(){return _form},this.setForm=function(form){_form=form}}),angular.module("forms").service("FormFields",[function(){this.types=[{name:"textfield",value:"Short Text"},{name:"email",value:"Email"},{name:"radio",value:"Multiple Choice"},{name:"dropdown",value:"Dropdown"},{name:"date",value:"Date"},{name:"textarea",value:"Paragraph Text"},{name:"yes_no",value:"Yes/No"},{name:"legal",value:"Legal"},{name:"rating",value:"Rating"},{name:"link",value:"Link"},{name:"number",value:"Numbers"},{name:"statement",value:"Statement"}]}]),angular.module("forms").factory("Forms",["$resource","FORM_URL",function($resource,FORM_URL){return $resource(FORM_URL,{formId:"@_id"},{query:{method:"GET",isArray:!0},get:{method:"GET",transformResponse:function(data,header){var form=angular.fromJson(data);return form.visible_form_fields=_.filter(form.form_fields,function(field){return field.deletePreserved===!1}),form}},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").service("TimeCounter",[function(){var _startTime,_endTime,that=this;this.timeSpent=0,this.restartClock=function(){_startTime=Date.now(),_endTime=_startTime},this.stopClock=function(){return _startTime?(_endTime=Date.now(),that.timeSpent=Math.abs(_endTime.valueOf()-_startTime.valueOf())/1e3,that.timeSpent):new Error("Clock has not been started")},this.clockStarted=function(){return!!this._startTime}}]); >>>>>>> make it work +<<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf +======= +<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f +======= +>>>>>>> make it work +>>>>>>> make it work >>>>>>> make it work diff --git a/public/modules/forms/base/bower.json b/public/modules/forms/base/bower.json index 76bdff1f..c3f082b6 100755 --- a/public/modules/forms/base/bower.json +++ b/public/modules/forms/base/bower.json @@ -18,7 +18,7 @@ "ng-file-upload": "~10.0.2", "angular-ui-date": "~0.0.8", "lodash": "~3.10.0", - "angular-input-stars": "*", + "angular-input-stars": "https://github.com/whitef0x0/angular-input-stars.git#master", "file-saver.js": "~1.20150507.2", "angular-scroll": "^1.0.0", "angular-sanitize": "^1.5.3", diff --git a/public/modules/forms/base/demo/boot.js b/public/modules/forms/base/demo/boot.js index aa107583..5d808911 100644 --- a/public/modules/forms/base/demo/boot.js +++ b/public/modules/forms/base/demo/boot.js @@ -1,7 +1,8 @@ angular.module('forms', [ 'duScroll', 'ngResource', 'NodeForm.templates', 'pascalprecht.translate', - 'angular-input-stars' + 'angular-input-stars', + 'ui.select' ]); angular.module('NodeForm', [ diff --git a/public/modules/forms/base/demo/index.html b/public/modules/forms/base/demo/index.html index 61083082..9b9ae3b1 100644 --- a/public/modules/forms/base/demo/index.html +++ b/public/modules/forms/base/demo/index.html @@ -39,34 +39,7 @@ diff --git a/public/modules/forms/forms.client.module.js b/public/modules/forms/forms.client.module.js index 5fa901f9..a07f3d98 100644 --- a/public/modules/forms/forms.client.module.js +++ b/public/modules/forms/forms.client.module.js @@ -5,4 +5,3 @@ ApplicationConfiguration.registerModule('forms', [ 'ngFileUpload', 'ui.router.tabs', 'ui.date', 'ui.sortable', 'angular-input-stars', 'users', 'pascalprecht.translate' ]);//, 'colorpicker.module' @TODO reactivate this module - From de18a40375fcaf72bacc363028c45be886215982 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 9 May 2016 19:14:00 +0300 Subject: [PATCH 32/42] translate submit button --- public/modules/forms/base/config/i18n/english.js | 4 ++++ .../views/directiveViews/form/submit-form.client.view.html | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/public/modules/forms/base/config/i18n/english.js b/public/modules/forms/base/config/i18n/english.js index 0b24dee8..a07e3286 100644 --- a/public/modules/forms/base/config/i18n/english.js +++ b/public/modules/forms/base/config/i18n/english.js @@ -28,6 +28,10 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid DELETE: 'Delete', CANCEL: 'Cancel', UPLOAD_FILE: 'Upload your File', +<<<<<<< 0e63943bc6423cb59a8a1be0d0fc09f1cd9fcfcd +======= + SUBMIT: 'Submit' +>>>>>>> translate submit button }); $translateProvider.preferredLanguage('english') diff --git a/public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html b/public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html index c2f44b26..d79a5b07 100755 --- a/public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html +++ b/public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html @@ -72,7 +72,6 @@ ng-style="{'color':button.color}"> style="background-color:#990000; color:white;" ng-if="forms.myForm.$invalid"> {{ 'COMPLETING_NEEDED' | translate:translateAdvancementData }} - {{form_fields_count - (myform | formValidity)}} answer(s) need completing
TellForm
"); - $templateCache.put("../public/modules/core/views/home.client.view.html", -======= $templateCache.put("modules/core/views/header.client.view.html", - "
"); + "
"); $templateCache.put("modules/core/views/home.client.view.html", ->>>>>>> make it work "

TellForm

Craft beautiful forms in seconds.

Craft beautiful forms.

TellForm is an opensource alternative to TypeForm that can create stunning forms from PDFs or from scratch

TellForm is an opensource alternative to TypeForm that can create stunning forms from PDFs or from scratch

Create your next ______.

Tell a story with a form.

"); $templateCache.put("modules/forms/admin/views/admin-form.client.view.html", - "
"); @@ -61,20 +52,20 @@ angular.module('NodeForm.templates', []).run(['$templateCache', function($templa <<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf ======= ======= +======= +>>>>>>> fix docker "
"); $templateCache.put("modules/forms/admin/views/list-forms.client.view.html", "

Create a new form
Name
Language

Created on
"); -<<<<<<< 95d6fb967b8d351fe9e17be40be308a8fe73c55f - $templateCache.put("../public/modules/forms/views/submit-form.client.view.html", - "√
"); - $templateCache.put("../public/modules/forms/views/adminTabs/analyze.html", -======= $templateCache.put("modules/forms/base/views/submit-form.client.view.html", "
"); $templateCache.put("modules/forms/admin/views/adminTabs/analyze.html", +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 >>>>>>> make it work >>>>>>> make it work >>>>>>> make it work +======= +>>>>>>> fix docker ""); $templateCache.put("modules/forms/admin/views/adminTabs/configure.html", ""); @@ -86,6 +77,7 @@ angular.module('NodeForm.templates', []).run(['$templateCache', function($templa "
{{$message}}
"); $templateCache.put("modules/forms/admin/views/directiveViews/cgBusy/update-form-message-TypeB.html", "
{{$message}}
"); +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c ======= @@ -127,13 +119,12 @@ angular.module('NodeForm.templates', []).run(['$templateCache', function($templa $templateCache.put("../public/modules/forms/views/directiveViews/form/edit-form.client.view.html", "

Click to Add New Field

Add New Field

Add Field

Start Page

Preview Start Page

    {{myform.startPage.introTitle}}

    {{myform.startPage.introParagraph}}

Edit Start Page


Intro Title:
Intro Paragraph:
{{ 'ENTER' | translate }}
"); + "

{{index+1}} {{field.title}} {{ 'OPTIONAL' | translate }}

{{ 'NEWLINE' | translate }}
{{ 'ENTER' | translate }}
"); $templateCache.put("modules/forms/base/views/directiveViews/field/textfield.html", - "

{{field.title}} ({{ 'OPTIONAL' | translate }})

{{ 'ENTER' | translate }}
"); + "

{{index+1}} {{field.title}} ({{ 'OPTIONAL' | translate }})

{{ 'ENTER' | translate }}
"); $templateCache.put("modules/forms/base/views/directiveViews/field/yes_no.html", - "

{{field.title}} *({{ REQUIRED | translate }})

{{field.description}}


"); + "

{{index+1}} {{field.title}} {{ 'OPTIONAL' | translate }}

{{field.description}}


"); $templateCache.put("modules/forms/base/views/directiveViews/form/submit-form.client.view.html", - "
press ENTER

{{ 'ADVANCEMENT' | translate:translateAdvancementData }}

"); + "
{{ 'COMPLETING_NEEDED' | translate:translateAdvancementData }}
{{ 'ENTER' | translate }}

{{ 'ADVANCEMENT' | translate:translateAdvancementData }}

"); $templateCache.put("modules/users/views/authentication/access-denied.client.view.html", "

You need to be logged in to access this page

Login
"); $templateCache.put("modules/users/views/authentication/signin.client.view.html", - "

Sign into your account

Error:
  or  Sign up
"); + "

Sign into your account

Error:
  or  Sign up
"); $templateCache.put("modules/users/views/authentication/signup-success.client.view.html", - "

Signup Successful

You've successfully registered an account at TellForm.

But your account is not activated yet



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

"); + "

Signup Successful

You've successfully registered an account at TellForm.

But your account is not activated yet



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

"); $templateCache.put("modules/users/views/authentication/signup.client.view.html", ->>>>>>> make it work -======= -======= - $templateCache.put("modules/users/views/authentication/signin.client.view.html", - "

Sign into your account

Error:
  or  Sign up
"); - $templateCache.put("modules/users/views/authentication/signup-success.client.view.html", ->>>>>>> make it work - "

Signup Successful

You've successfully registered an account at TellForm.

But your account is not activated yet



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

"); - $templateCache.put("modules/users/views/authentication/signup.client.view.html", ->>>>>>> make it work "

Signup with your email

Couldn't submit form due to errors:

"); $templateCache.put("modules/users/views/password/forgot-password.client.view.html", "

Restore your password

Enter your account email.

{{error}}
{{success}}
"); @@ -483,21 +467,9 @@ angular.module('NodeForm.templates', []).run(['$templateCache', function($templa "

Edit your profile

Profile Saved Successfully
Couldn't Save Your Profile.
Error:
First Name
Last Name

Language
Email (also your username)
"); $templateCache.put("modules/users/views/settings/social-accounts.client.view.html", "

Connected social accounts:

Connect other social accounts:

"); -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c - $templateCache.put("../public/modules/users/views/verify/resend-verify-email.client.view.html", + $templateCache.put("modules/users/views/verify/resend-verify-email.client.view.html", "

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at polydaic@gmail.com

"); - $templateCache.put("../public/modules/users/views/verify/verify-account.client.view.html", -======= - $templateCache.put("modules/users/views/verify/resend-verify-email.client.view.html", - "

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at hi@TellForm.com

"); $templateCache.put("modules/users/views/verify/verify-account.client.view.html", ->>>>>>> make it work -======= - $templateCache.put("modules/users/views/verify/resend-verify-email.client.view.html", - "

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at hi@TellForm.com

"); - $templateCache.put("modules/users/views/verify/verify-account.client.view.html", ->>>>>>> make it work "

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
"); }]); @@ -620,6 +592,7 @@ angular.element(document).ready(function() { angular.bootstrap(document, [ApplicationConfiguration.applicationModuleName]); }); +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c ======= @@ -1028,6 +1001,8 @@ angular.module('forms').config(['$stateProvider', }); ======= ======= +======= +>>>>>>> fix docker angular.module('NodeForm.templates', []).run(['$templateCache', function($templateCache) { "use strict"; $templateCache.put("../public/modules/core/views/header.client.view.html", @@ -1351,7 +1326,6 @@ angular.module('NodeForm.templates', []).run(['$templateCache', function($templa $templateCache.put("../public/modules/users/views/verify/verify-account.client.view.html", "

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
"); }]); ->>>>>>> make it work 'use strict'; @@ -1382,8 +1356,10 @@ angular.module('core').config(['$stateProvider', '$urlRouterProvider', 'use strict'; -angular.module('core').controller('HeaderController', ['$rootScope', '$scope', 'Menus', '$state', 'Auth', 'User', - function ($rootScope, $scope, Menus, $state, Auth, User) { +angular.module('core').controller('HeaderController', ['$rootScope', '$scope', 'Menus', '$state', 'Auth', 'User', '$window', + function ($rootScope, $scope, Menus, $state, Auth, User, $window) { + $rootScope.signupDisabled = $window.signupDisabled; + $scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User); $scope.authentication = $rootScope.authentication = Auth; @@ -1437,6 +1413,7 @@ angular.module('core').controller('HomeController', ['$rootScope', '$scope', 'Us 'use strict'; +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf <<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 // Forms controller @@ -1490,14 +1467,16 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope ======= ======= +======= +>>>>>>> fix docker //Menu service used for managing menus angular.module('core').service('Menus', [ ->>>>>>> make it work function() { // Define a set of default roles this.defaultRoles = ['*']; +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c <<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf @@ -1541,6 +1520,8 @@ angular.module('core').service('Menus', [ ======= ======= +======= +>>>>>>> fix docker // Define the menus object this.menus = {}; @@ -1558,7 +1539,6 @@ angular.module('core').service('Menus', [ return true; } } ->>>>>>> make it work } } } else { @@ -1583,6 +1563,7 @@ angular.module('core').service('Menus', [ return false; }; +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c <<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf @@ -1615,6 +1596,8 @@ angular.module('core').service('Menus', [ ======= ======= +======= +>>>>>>> fix docker // Get the menu object by menu id this.getMenu = function(menuId) { // Validate that the menu exists @@ -1623,7 +1606,6 @@ angular.module('core').service('Menus', [ // Return the menu object return this.menus[menuId]; }; ->>>>>>> make it work // Add new menu object by menu id this.addMenu = function(menuId, isPublic, roles) { @@ -1639,6 +1621,7 @@ angular.module('core').service('Menus', [ return this.menus[menuId]; }; +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c <<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf @@ -1661,16 +1644,18 @@ angular.module('core').service('Menus', [ ======= ======= +======= +>>>>>>> fix docker // Remove existing menu object by menu id this.removeMenu = function(menuId) { // Validate that the menu exists this.validateMenuExistance(menuId); ->>>>>>> make it work // Return the menu object delete this.menus[menuId]; }; +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c <<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf @@ -1698,11 +1683,12 @@ angular.module('core').service('Menus', [ } }; ======= +======= +>>>>>>> fix docker // Add menu item object this.addMenuItem = function(menuId, menuItemTitle, menuItemURL, menuItemType, menuItemUIRoute, isPublic, roles, position) { // Validate that the menu exists this.validateMenuExistance(menuId); -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f // Push new menu item this.menus[menuId].items.push({ @@ -1717,45 +1703,15 @@ angular.module('core').service('Menus', [ items: [], shouldRender: shouldRender }); ->>>>>>> make it work -======= - - // Push new menu item - this.menus[menuId].items.push({ - title: menuItemTitle, - link: menuItemURL, - menuItemType: menuItemType || 'item', - menuItemClass: menuItemType, - uiRoute: menuItemUIRoute || ('/' + menuItemURL), - isPublic: ((isPublic === null || typeof isPublic === 'undefined') ? this.menus[menuId].isPublic : isPublic), - roles: ((roles === null || typeof roles === 'undefined') ? this.menus[menuId].roles : roles), - position: position || 0, - items: [], - shouldRender: shouldRender - }); ->>>>>>> make it work - ->>>>>>> make it work // Return the menu object return this.menus[menuId]; }; -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - } -]); - -'use strict'; -======= // Add submenu item object this.addSubMenuItem = function(menuId, rootMenuItemURL, menuItemTitle, menuItemURL, menuItemUIRoute, isPublic, roles, position) { // Validate that the menu exists this.validateMenuExistance(menuId); ->>>>>>> make it work // Search for menu item for (var itemIndex in this.menus[menuId].items) { @@ -1831,7 +1787,6 @@ angular.module('forms').run(['Menus', function(){ return function(formObj){ if(formObj && formObj.form_fields && formObj.visible_form_fields){ -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f //get keys var formKeys = Object.keys(formObj); @@ -1848,24 +1803,6 @@ angular.module('forms').run(['Menus', return !!(field.fieldValue); } -======= - - //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); - } - ->>>>>>> make it work }).length; return valid_count - (formObj.form_fields.length - formObj.visible_form_fields.length); } @@ -1934,18 +1871,6 @@ angular.module('forms').run(['Menus', // Setting up route angular.module('forms').config(['$stateProvider', -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -function removeDateFieldsFunc(o) { - var clone = _.clone(o); - function eachObject(v,k){ - - if(k === 'lastModified' || k === 'created'){ - delete clone[k]; - } -======= -======= ->>>>>>> make it work function($stateProvider) { // Forms state routing $stateProvider. @@ -1993,34 +1918,68 @@ function removeDateFieldsFunc(o) { url: '/create', templateUrl: 'modules/forms/admin/views/adminTabs/create.html' }); -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f ->>>>>>> make it work } ]); -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c - for(var i=0; i>>>>>> make it work + +angular.module('forms').directive('keyToOption', function(){ + return { + restrict: 'A', + scope: { + field: '=' + }, + link: function($scope, $element, $attrs, $select) { + $element.bind('keydown keypress', function(event) { + + var keyCode = event.which || event.keyCode; + var index = parseInt(String.fromCharCode(keyCode))-1; + //console.log($scope.field); + + if (index < $scope.field.fieldOptions.length) { + event.preventDefault(); + $scope.$apply(function () { + $scope.field.fieldValue = $scope.field.fieldOptions[index].option_value; + }); + } + + }); + } + }; +}); + +'use strict'; + +angular.module('forms').directive('keyToTruthy', ['$rootScope', function($rootScope){ + return { + restrict: 'A', + scope: { + field: '=' + }, + link: function($scope, $element, $attrs) { + $element.bind('keydown keypress', function(event) { + var keyCode = event.which || event.keyCode; + var truthyKeyCode = $attrs.keyCharTruthy.charCodeAt(0) - 32; + var falseyKeyCode = $attrs.keyCharFalsey.charCodeAt(0) - 32; + + if(keyCode === truthyKeyCode ) { + event.preventDefault(); + $scope.$apply(function() { + $scope.field.fieldValue = 'true'; + }); + }else if(keyCode === falseyKeyCode){ + event.preventDefault(); + $scope.$apply(function() { + $scope.field.fieldValue = 'false'; + }); + } + }); + } + }; +}]); + + +'use strict'; // Config HTTP Error Handling angular.module('users').config(['$httpProvider', @@ -2032,6 +1991,7 @@ angular.module('users').config(['$httpProvider', if(response.config.url !== '/users/me'){ console.log('intercepted rejection of ', response.config.url, response.status); if (response.status === 401) { + console.log($location.path()); // save the current location so that login can redirect back $location.nextAfterLogin = $location.path(); $location.path('/signin'); @@ -2046,40 +2006,17 @@ angular.module('users').config(['$httpProvider', }; }]); }]); + 'use strict'; // Setting up route angular.module('users').config(['$stateProvider', function($stateProvider) { -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c - $rootScope[$attrs.autoSaveCallback](true, - function(err){ - if(!err){ - //console.log('\n\nForm data persisted -- setting pristine flag'); - $formCtrl.$setPristine(); - $formCtrl.$setUntouched(); - }else{ - console.error('Error form data NOT persisted'); - console.error(err); - } - }); - }; - - //Update/Save Form if any Form fields are Dirty and Touched - $scope.$watch(function(newValue, oldValue) { - //console.log('introParagraphStartPage.$dirty: '+$scope.editForm.introParagraphStartPage.$dirty); - //console.log('introParagraphStartPage.$touched: '+$scope.editForm.introParagraphStartPage.$touched); - if($rootScope.finishedRender && $scope.anyDirtyAndTouched($scope.editForm) && !$rootScope.saveInProgress){ - //console.log('Form saving started'); - debounceSave(); - //console.log('introParagraphStartPage.$dirty AFTER: '+$scope.editForm.introParagraphStartPage.$dirty); - } - }); -======= var checkLoggedin = function($q, $timeout, $state, User, Auth) { var deferred = $q.defer(); +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 //Autosave Form when model (specified in $attrs.autoSaveWatch) changes $scope.$watch($attrs.autoSaveWatch, function(newValue, oldValue) { @@ -2087,26 +2024,41 @@ angular.module('users').config(['$stateProvider', // console.log(Auth.ensureHasCurrentUser(User)); >>>>>>> make it work >>>>>>> make it work +======= + //console.log(Auth.ensureHasCurrentUser(User)); +>>>>>>> fix docker if (Auth.currentUser && Auth.currentUser.email) { $timeout(deferred.resolve); } else { - Auth.currentUser = User.getCurrent(function() { - Auth.login(); - $timeout(deferred.resolve()); - }, - function() { - Auth.logout(); - $timeout(deferred.reject()); - $state.go('sigin', {reload: true}); - }); + Auth.currentUser = User.getCurrent( + function() { + Auth.login(); + $timeout(deferred.resolve()); + }, + function() { + Auth.logout(); + $timeout(deferred.reject()); + $state.go('signin', {reload: true}); + }); } return deferred.promise; }; checkLoggedin.$inject = ["$q", "$timeout", "$state", "User", "Auth"]; + var checkSignupDisabled = function($window, $timeout, $q) { + var deferred = $q.defer(); + if($window.signupDisabled) { + $timeout(deferred.reject()); + } else { + $timeout(deferred.resolve()); + } + return deferred.promise; + }; + checkSignupDisabled.$inject = ["$window", "$timeout", "$q"]; + // Users state routing $stateProvider. state('profile', { @@ -2130,12 +2082,17 @@ angular.module('users').config(['$stateProvider', url: '/settings/accounts', templateUrl: 'modules/users/views/settings/social-accounts.client.view.html' }). - state('signup', { + resolve: { + isDisabled: checkSignupDisabled + }, url: '/signup', templateUrl: 'modules/users/views/authentication/signup.client.view.html' }). state('signup-success', { + resolve: { + isDisabled: checkSignupDisabled + }, url: '/signup-success', templateUrl: 'modules/users/views/authentication/signup-success.client.view.html' }). @@ -2147,16 +2104,20 @@ angular.module('users').config(['$stateProvider', url: '/access_denied', templateUrl: 'modules/users/views/authentication/access-denied.client.view.html' }). - - state('resendVerifyEmail', { - url: '/verify', - templateUrl: 'modules/users/views/verify/resend-verify-email.client.view.html' - }). state('verify', { + resolve: { + isDisabled: checkSignupDisabled + }, url: '/verify/:token', templateUrl: 'modules/users/views/verify/verify-account.client.view.html' }). - + state('resendVerifyEmail', { + resolve: { + isDisabled: checkSignupDisabled + }, + url: '/verify', + templateUrl: 'modules/users/views/verify/resend-verify-email.client.view.html' + }). state('forgot', { url: '/password/forgot', templateUrl: 'modules/users/views/password/forgot-password.client.view.html' @@ -2175,229 +2136,7 @@ angular.module('users').config(['$stateProvider', }); } ]); -'use strict'; -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c - //If our form is undefined, don't save form - if( (!newValue && !oldValue) || !oldValue ){ - return; - } - - // console.log('Autosaving'); - // console.log('\n\n----------'); - // console.log('!$dirty: '+ !$formCtrl.$dirty ); - // console.log('changedFields: '+changedFields); - // console.log('changedFieldMap: '+changedFieldMap); - // console.log('finishedRender: '+$rootScope.finishedRender); - // console.log('!saveInProgress: '+!$rootScope.saveInProgress); - // console.log('newValue: '+newValue); - // console.log('oldValue: '+oldValue); - // console.log(oldValue.form_fields); - // console.log(newValue.form_fields); - - if(oldValue.form_fields.length === 0) { - $rootScope.finishedRender = true; - } -======= -angular.module('users').controller('AuthenticationController', ['$scope', '$location', '$state', '$rootScope', 'User', 'Auth', - function($scope, $location, $state, $rootScope, User, Auth) { - - $scope = $rootScope; - $scope.credentials = {}; - $scope.error = ''; ->>>>>>> make it work - - $scope.signin = function() { - $scope.credentials.email = $scope.credentials.username; - User.login($scope.credentials).then( - function(response) { - Auth.login(response); - $scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User); - - if($state.previous.name !== 'home' && $state.previous.name !== 'verify' && $state.previous.name !== ''){ - $state.go($state.previous.name); - }else{ - $state.go('listForms'); - } - }, - function(error) { - $rootScope.user = Auth.ensureHasCurrentUser(User); - $scope.user = $rootScope.user; - -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c - savePromise = $timeout(function() { - debounceSave(); - }); - } - //If we are finished rendering then form saving should be finished - else if($rootScope.finishedRender && $rootScope.saveInProgress){ - $rootScope.saveInProgress = false; - } - - }, true); - }); - } - }; - -}]); -======= - $scope.error = error; - console.log('loginError: '+error); - } - ); - }; - - $scope.signup = function() { - console.log($scope.credentials); - User.signup($scope.credentials).then( - function(response) { - console.log('signup-success'); - $state.go('signup-success'); - }, - function(error) { - console.log('Error: '); - console.log(error); - if(error) { - $scope.error = error; - console.log(error); - }else { - console.log('No response received'); - } - } - ); - }; - - } -]); ->>>>>>> make it work -======= - } -]); - -'use strict'; - -// Config HTTP Error Handling -angular.module('users').config(['$httpProvider', - function($httpProvider) { - $httpProvider.interceptors.push(["$q", "$location", function($q, $location) { - return { - responseError: function(response) { - if( $location.path() !== '/users/me' && response.config){ - if(response.config.url !== '/users/me'){ - console.log('intercepted rejection of ', response.config.url, response.status); - if (response.status === 401) { - // save the current location so that login can redirect back - $location.nextAfterLogin = $location.path(); - $location.path('/signin'); - }else if(response.status === 403){ - $location.path('/access_denied'); - } - } - - } - return $q.reject(response); - } - }; - }]); -}]); -'use strict'; - -// Setting up route -angular.module('users').config(['$stateProvider', - function($stateProvider) { - - var checkLoggedin = function($q, $timeout, $state, User, Auth) { - var deferred = $q.defer(); - - // console.log(Auth.ensureHasCurrentUser(User)); - - if (Auth.currentUser && Auth.currentUser.email) { - $timeout(deferred.resolve); - } - else { - Auth.currentUser = User.getCurrent(function() { - Auth.login(); - $timeout(deferred.resolve()); - }, - function() { - Auth.logout(); - $timeout(deferred.reject()); - $state.go('sigin', {reload: true}); - }); - } - - return deferred.promise; - }; - checkLoggedin.$inject = ["$q", "$timeout", "$state", "User", "Auth"]; - - // Users state routing - $stateProvider. - state('profile', { - resolve: { - loggedin: checkLoggedin - }, - url: '/settings/profile', - templateUrl: 'modules/users/views/settings/edit-profile.client.view.html' - }). - state('password', { - resolve: { - loggedin: checkLoggedin - }, - url: '/settings/password', - templateUrl: 'modules/users/views/settings/change-password.client.view.html' - }). - state('accounts', { - resolve: { - loggedin: checkLoggedin - }, - url: '/settings/accounts', - templateUrl: 'modules/users/views/settings/social-accounts.client.view.html' - }). - - state('signup', { - url: '/signup', - templateUrl: 'modules/users/views/authentication/signup.client.view.html' - }). - state('signup-success', { - url: '/signup-success', - templateUrl: 'modules/users/views/authentication/signup-success.client.view.html' - }). - state('signin', { - url: '/signin', - templateUrl: 'modules/users/views/authentication/signin.client.view.html' - }). - state('access_denied', { - url: '/access_denied', - templateUrl: 'modules/users/views/authentication/access-denied.client.view.html' - }). - - state('resendVerifyEmail', { - url: '/verify', - templateUrl: 'modules/users/views/verify/resend-verify-email.client.view.html' - }). - state('verify', { - url: '/verify/:token', - templateUrl: 'modules/users/views/verify/verify-account.client.view.html' - }). - - state('forgot', { - url: '/password/forgot', - templateUrl: 'modules/users/views/password/forgot-password.client.view.html' - }). - state('reset-invalid', { - url: '/password/reset/invalid', - templateUrl: 'modules/users/views/password/reset-password-invalid.client.view.html' - }). - state('reset-success', { - url: '/password/reset/success', - templateUrl: 'modules/users/views/password/reset-password-success.client.view.html' - }). - state('reset', { - url: '/password/reset/:token', - templateUrl: 'modules/users/views/password/reset-password.client.view.html' - }); - } -]); 'use strict'; angular.module('users').controller('AuthenticationController', ['$scope', '$location', '$state', '$rootScope', 'User', 'Auth', @@ -2452,7 +2191,6 @@ angular.module('users').controller('AuthenticationController', ['$scope', '$loca } ]); ->>>>>>> make it work 'use strict'; @@ -2560,28 +2298,9 @@ angular.module('users').controller('SettingsController', ['$scope', '$rootScope' }); }; -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - console.log($scope.log); - if (!$scope.$$phase && !$scope.$digest) { - $scope.$apply(); - } - }, function(resp){ - $scope.pdfLoading = false; - console.log('Error occured during upload.\n'); - console.log(resp.status); - }, function (evt) { - var progressPercentage = parseInt(100.0 * evt.loaded / evt.total, 10); - $scope.log = 'progress: ' + progressPercentage + '% ' + - evt.config.data.file.name + '\n' + $scope.log; -======= } ]); 'use strict'; ->>>>>>> make it work angular.module('users').controller('VerifyController', ['$scope', '$state', '$rootScope', 'User', 'Auth', '$stateParams', function($scope, $state, $rootScope, User, Auth, $stateParams) { @@ -2589,7 +2308,6 @@ angular.module('users').controller('VerifyController', ['$scope', '$state', '$ro $scope.isResetSent = false; $scope.credentials = {}; $scope.error = ''; -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f // Submit forgotten password account id $scope.resendVerifyEmail = function() { @@ -2610,28 +2328,6 @@ angular.module('users').controller('VerifyController', ['$scope', '$state', '$ro ); }; -======= - - // Submit forgotten password account id - $scope.resendVerifyEmail = function() { - // console.log($scope.credentials); - // console.log($scope.credentials.email); - User.resendVerifyEmail($scope.credentials.email).then( - function(response){ - console.log(response); - $scope.success = response.message; - $scope.credentials = null; - $scope.isResetSent = true; - }, - function(error){ - $scope.error = error; - $scope.credentials.email = null; - $scope.isResetSent = false; - } - ); - }; - ->>>>>>> make it work //Validate Verification Token $scope.validateVerifyToken = function() { if($stateParams.token){ @@ -2656,6 +2352,7 @@ angular.module('users').controller('VerifyController', ['$scope', '$state', '$ro ]); 'use strict'; +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c ======= @@ -2709,9 +2406,10 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField $scope.addField = {}; $scope.addField.types = FormFields.types; ======= +======= +>>>>>>> fix docker angular.module('users').factory('Auth', ['$window', function($window) { ->>>>>>> make it work var userState = { isLoggedIn: false @@ -2778,21 +2476,12 @@ angular.module('users').factory('Auth', ['$window', }; return service; -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - if( $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id) ){ - currentFields = _(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id]); - } -======= } ]); ->>>>>>> make it work 'use strict'; +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c ======= @@ -2814,6 +2503,8 @@ angular.module('users').factory('Auth', ['$window', cursor: 'grabbing' }; ======= +======= +>>>>>>> fix docker angular.module('users').service('Authorizer', ["APP_PERMISSIONS", "USER_ROLES", function(APP_PERMISSIONS, USER_ROLES) { return function(user) { return { @@ -2840,8 +2531,11 @@ angular.module('users').service('Authorizer', ["APP_PERMISSIONS", "USER_ROLES", return false; } } +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 >>>>>>> make it work >>>>>>> make it work +======= +>>>>>>> fix docker return false; } @@ -2859,6 +2553,7 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' function($window, $q, $timeout, $http, $state) { >>>>>>> make it work +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c ======= @@ -2897,10 +2592,11 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' return newField; }; ======= +======= +>>>>>>> fix docker var userService = { getCurrent: function() { var deferred = $q.defer(); ->>>>>>> make it work $http.get('/users/me') .success(function(response) { @@ -2914,26 +2610,12 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' }, login: function(credentials) { -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - //Delete field - $scope.myform.form_fields.splice(field_index, 1); - }; - $scope.duplicateField = function (field_index){ - var currField = _.cloneDeep($scope.myform.form_fields[field_index]); - currField._id = 'cloned'+_.uniqueId(); - currField.title += ' copy'; -======= var deferred = $q.defer(); $http.post('/auth/signin', credentials).success(function(response) { deferred.resolve(response); }).error(function(error) { deferred.reject(error.message || error); }); ->>>>>>> make it work return deferred.promise; }, @@ -2987,6 +2669,7 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' deferred.reject(error); }); +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c ======= @@ -3010,9 +2693,10 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' ======= if(!currField.fieldOptions) $scope.myform.form_fields[field_index].fieldOptions = []; ======= +======= +>>>>>>> fix docker return deferred.promise; }, ->>>>>>> make it work resetPassword: function(passwordDetails, token) { @@ -3027,20 +2711,8 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' }, >>>>>>> make it work -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - var newOption = { - 'option_id' : Math.floor(100000*Math.random()), - 'option_title' : 'Option '+lastOptionID, - 'option_value' : 'Option ' +lastOptionID - }; -======= // Submit forgotten password account id askForPasswordReset: function(credentials) { ->>>>>>> make it work var deferred = $q.defer(); $http.post('/auth/forgot', credentials).success(function(response) { @@ -3063,6 +2735,7 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' 'use strict'; +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf <<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 // decides whether field options block will be shown (true for dropdown and radio fields) @@ -3090,6 +2763,8 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' }; } ======= +======= +>>>>>>> fix docker // Users service used for communicating with the users REST endpoint angular.module('users').factory('Users', ['$resource', function($resource) { @@ -3099,7 +2774,6 @@ angular.module('users').factory('Users', ['$resource', } }); } ->>>>>>> make it work ]); 'use strict'; @@ -3170,52 +2844,18 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope } }; -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - // console.log('before textField2: '+data[0].form_fields[1].fieldValue); - - //Iterate through form's submissions - for(var i=0; i>>>>>> make it work var form_id = $scope.myform._id; if(!form_id) throw new Error('Error - removeCurrentForm(): $scope.myform._id does not exist'); -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - // console.log('form submissions successfully fetched'); - // console.log( JSON.parse(JSON.stringify($scope.submissions)) ) ; - // console.log( JSON.parse(JSON.stringify($scope.myform.form_fields)) ); - }) - .error(function(err){ - console.error('Could not fetch form submissions.\nError: '+err); - }); - }; -======= $http.delete('/forms/'+form_id) .success(function(data, status, headers){ console.log('form deleted successfully'); ->>>>>>> make it work $state.go('listForms', {}, {reload: true}); @@ -3226,57 +2866,6 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope } }; -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - $http({ url: '/forms/'+$scope.myform._id+'/submissions', - method: 'DELETE', - data: {deleted_submissions: delete_ids}, - headers: {'Content-Type': 'application/json;charset=utf-8'} - }).success(function(data, status, headers){ - //Remove deleted ids from table - var tmpArray = []; - for(var i=0; i<$scope.table.rows.length; i++){ - if(!$scope.table.rows[i].selected){ - tmpArray.push($scope.table.rows[i]); - } - } - $scope.table.rows = tmpArray; - }) - .error(function(err){ - console.log('Could not delete form submissions.\nError: '); - console.log(err); - console.error = err; - }); - }; - - //Export selected submissions of Form - $scope.exportSubmissions = function(type){ - var fileMIMETypeMap = { - 'xls': 'vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'json': 'json', - 'csv': 'csv' - }; -======= - // Update existing Form - $scope.update = $rootScope.update = function(updateImmediately, cb){ - -<<<<<<< 95d6fb967b8d351fe9e17be40be308a8fe73c55f - console.log($scope.table.rows); - - angular.element('#table-submission-data').tableExport({type: type, escape:false}); - - /* - var blob = new Blob([$scope.table.rows], { - type: 'application/'+fileMIMETypeMap[type]+';charset=utf-8' - }); - saveAs(blob, $scope.myform.title+'_sumbissions_export_'+Date.now()+'.'+type); - */ - }; -======= -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f // Update existing Form $scope.update = $rootScope.update = function(updateImmediately, cb){ @@ -3288,21 +2877,7 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$scope //Update form **if we are not currently updating** or if **shouldUpdateNow flag is set** if(continueUpdate){ var err = null; ->>>>>>> make it work -======= - var continueUpdate = true; - if(!updateImmediately){ - continueUpdate = !$rootScope.saveInProgress; - } ->>>>>>> make it work ->>>>>>> make it work - - //Update form **if we are not currently updating** or if **shouldUpdateNow flag is set** - if(continueUpdate){ - var err = null; - ->>>>>>> make it work if(!updateImmediately){ $rootScope.saveInProgress = true; } $scope.updatePromise = $http.put('/forms/'+$scope.myform._id, {form: $scope.myform}) @@ -3379,6 +2954,7 @@ angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope }); }; +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c ======= @@ -3408,6 +2984,8 @@ angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope return $templateCache.get('../public/'+templateUrl); }; ======= +======= +>>>>>>> fix docker //Modal functions $scope.openCreateModal = function(){ if(!$scope.showCreateModal){ @@ -3439,8 +3017,11 @@ angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope $scope.goToWithId = function(route, id) { $state.go(route, {'formId': id}, {reload: true}); }; +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 >>>>>>> make it work >>>>>>> make it work +======= +>>>>>>> fix docker $scope.duplicateForm = function(form_index){ var form = _.cloneDeep($scope.myforms[form_index]); @@ -3525,6 +3106,7 @@ angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope ]); 'use strict'; +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c ======= @@ -3549,26 +3131,29 @@ angular.module('forms').directive('keyToOption', function(){ $scope.field.fieldValue = $scope.field.fieldOptions[index].option_value; }); } +======= - }); - } - }; -}); +function removeDateFieldsFunc(o) { + var clone = _.clone(o); + function eachObject(v,k){ -'use strict'; + if(k === 'lastModified' || k === 'created'){ + delete clone[k]; + } + } +>>>>>>> fix docker -angular.module('forms').directive('keyToTruthy', ['$rootScope', function($rootScope){ - return { - restrict: 'A', - scope: { - field: '=' - }, - link: function($scope, $element, $attrs) { - $element.bind('keydown keypress', function(event) { - var keyCode = event.which || event.keyCode; - var truthyKeyCode = $attrs.keyCharTruthy.charCodeAt(0) - 32; - var falseyKeyCode = $attrs.keyCharFalsey.charCodeAt(0) - 32; + for(var i=0; i>>>>>> fix docker return { require: ['^form'], restrict: 'AE', @@ -3751,25 +3338,29 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' $rootScope[$attrs.autoSaveCallback](true, function(err){ if(!err){ - console.log('\n\nForm data persisted -- setting pristine flag'); - $formCtrl.$setPristine(); - $formCtrl.$setUntouched(); + //console.log('\n\nForm data persisted -- setting pristine flag'); + $formCtrl.$setPristine(); + $formCtrl.$setUntouched(); }else{ console.error('Error form data NOT persisted'); console.error(err); } - }); + }); }; //Update/Save Form if any Form fields are Dirty and Touched $scope.$watch(function(newValue, oldValue) { - console.log('introParagraphStartPage.$dirty: '+$scope.editForm.introParagraphStartPage.$dirty); - console.log('introParagraphStartPage.$touched: '+$scope.editForm.introParagraphStartPage.$touched); + //console.log('introParagraphStartPage.$dirty: '+$scope.editForm.introParagraphStartPage.$dirty); + //console.log('introParagraphStartPage.$touched: '+$scope.editForm.introParagraphStartPage.$touched); if($rootScope.finishedRender && $scope.anyDirtyAndTouched($scope.editForm) && !$rootScope.saveInProgress){ - console.log('Form saving started'); + //console.log('Form saving started'); debounceSave(); +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 console.log('introParagraphStartPage.$dirty AFTER: '+$scope.editForm.introParagraphStartPage.$dirty); >>>>>>> make it work +======= + //console.log('introParagraphStartPage.$dirty AFTER: '+$scope.editForm.introParagraphStartPage.$dirty); +>>>>>>> fix docker } }); @@ -3798,43 +3389,11 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' } >>>>>>> make it work -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - //console.log($scope.forms.myForm); - var field_id; - var field_index; - - if(!$scope.noscroll){ - //Focus on submit button - if( $scope.selected.index === $scope.myform.visible_form_fields.length-1 && $scope.fieldBottom < 200){ - field_index = $scope.selected.index+1; - field_id = 'submit_field'; - $scope.setActiveField(field_id, field_index, false); - } - //Focus on field above submit button - else if($scope.selected.index === $scope.myform.visible_form_fields.length){ - if($scope.fieldTop > 200){ - field_index = $scope.selected.index-1; - field_id = $scope.myform.visible_form_fields[field_index]._id; - $scope.setActiveField(field_id, field_index, false); - } - }else if( $scope.fieldBottom < 0){ - field_index = $scope.selected.index+1; - field_id = $scope.myform.visible_form_fields[field_index]._id; - $scope.setActiveField(field_id, field_index, false); - }else if ( $scope.selected.index !== 0 && $scope.fieldTop > 0) { - field_index = $scope.selected.index-1; - field_id = $scope.myform.visible_form_fields[field_index]._id; - $scope.setActiveField(field_id, field_index, false); -======= //If our form is undefined, don't save form if( (!newValue && !oldValue) || !oldValue ){ return; } - + // console.log('Autosaving'); // console.log('\n\n----------'); // console.log('!$dirty: '+ !$formCtrl.$dirty ); @@ -3847,7 +3406,7 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' // console.log(oldValue.form_fields); // console.log(newValue.form_fields); - if(oldValue.form_fields.length === 0) { + if(oldValue.form_fields.length === 0) { $rootScope.finishedRender = true; } @@ -3857,9 +3416,9 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' if(savePromise) { $timeout.cancel(savePromise); savePromise = null; ->>>>>>> make it work } +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 savePromise = $timeout(function() { debounceSave(); }); @@ -3877,6 +3436,11 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' console.log('setDropdownOption index: '); }; ======= +======= + savePromise = $timeout(function() { + debounceSave(); + }); +>>>>>>> fix docker } //If we are finished rendering then form saving should be finished else if($rootScope.finishedRender && $rootScope.saveInProgress){ @@ -3890,10 +3454,8 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' }); } }; - -}]); ->>>>>>> make it work +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< 95d6fb967b8d351fe9e17be40be308a8fe73c55f >>>>>>> make it work /* @@ -3928,15 +3490,12 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter' } }; +======= +>>>>>>> fix docker }]); 'use strict'; -======= -'use strict'; ->>>>>>> make it work - ->>>>>>> make it work angular.module('forms').directive('configureFormDirective', ['$rootScope', '$http', 'Upload', 'CurrentForm', function ($rootScope, $http, Upload, CurrentForm) { return { @@ -3958,13 +3517,8 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt $scope.log = ''; $scope.pdfLoading = false; $scope.languages = $rootScope.languages; -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f ->>>>>>> make it work - - this._current_upload = null; - $scope.resetForm = $rootScope.resetForm; - $scope.update = $rootScope.update; +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c ======= @@ -4003,11 +3557,14 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt SendVisitorData.send($scope.myform, getActiveField(), TimeCounter.getTimeElapsed()); }; ======= +======= +>>>>>>> fix docker this._current_upload = null; $scope.resetForm = $rootScope.resetForm; $scope.update = $rootScope.update; this._unbindedPdfFields = $scope.pdfFields; +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 >>>>>>> make it work <<<<<<< adb4e008930e5142044796081f66a1db54906706 @@ -4079,12 +3636,15 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt form.timeElapsed = _timeElapsed; ======= this._unbindedPdfFields = $scope.pdfFields; +======= +>>>>>>> fix docker //DAVID: TODO: finish this so we can create a Form.pdfFieldMap // $scope.getUnbindedPdfFields = function(fieldType){ // this._unbindedPdfFields = $scope.pdfFields // } +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf <<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 for(var i=0; i < $scope.myform.form_fields.length; i++){ @@ -4111,6 +3671,8 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt ======= <<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f >>>>>>> make it work +======= +>>>>>>> fix docker //PDF Functions $scope.cancelUpload = function(){ this._current_upload.abort(); @@ -4123,25 +3685,10 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt $scope.myform.isGenerated = false; $scope.myform.autofillPDFs = false; -======= - setTimeout(function () { - $scope.submitPromise = $http.post('/forms/' + $scope.myform._id, form) - .success(function (data, status, headers) { - //console.log('form submitted successfully'); -======= - $scope.removePDF = function(){ - $scope.myform.pdf = null; - $scope.myform.isGenerated = false; - $scope.myform.autofillPDFs = false; ->>>>>>> make it work - ->>>>>>> make it work console.log('form.pdf: '+$scope.myform.pdf+' REMOVED'); }; $scope.uploadPDF = function(file) { -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f ->>>>>>> make it work if (file) { console.log(file); @@ -4159,10 +3706,6 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt //console.log($scope.myform.pdf); -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c - //Reload our form - $scope.reloadForm(); -======= $scope.pdfLoading = false; console.log($scope.log); @@ -4186,7 +3729,6 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$htt >>>>>>> make it work }; ->>>>>>> make it work }] }; } @@ -4210,6 +3752,17 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField /* ** Initialize scope with variables */ + //Setup UI-Sortable + $scope.sortableOptions = { + appendTo: '.dropzone', + cursorAt: { top: -155 }, + forceHelperSize: true, + forcePlaceholderSize: true + }; + + + console.log($scope.sortableOptions); + //Populate AddField with all available form field types $scope.addField = {}; $scope.addField.types = FormFields.types; @@ -4398,222 +3951,6 @@ angular.module('forms').service('TimeCounter', [ */ >>>>>>> make it work -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= - - if (file) { - console.log(file); - - Upload.upload({ - url: '/upload/pdf', - data: { - 'user': $scope.user, - file: file - } - }).then(function (resp) { - var data = resp.data; - $scope.log = 'file ' + data.originalname + ' uploaded as ' + data.filename + '. JSON: ' + JSON.stringify(data) + '\n' + $scope.log; - $scope.myform.pdf = angular.fromJson(angular.toJson(data)); - - //console.log($scope.myform.pdf); - - $scope.pdfLoading = false; - - console.log($scope.log); - if (!$scope.$$phase && !$scope.$digest) { - $scope.$apply(); - } - }, function(resp){ - $scope.pdfLoading = false; - console.log('Error occured during upload.\n'); - console.log(resp.status); - }, function (evt) { - var progressPercentage = parseInt(100.0 * evt.loaded / evt.total, 10); - $scope.log = 'progress: ' + progressPercentage + '% ' + - evt.config.data.file.name + '\n' + $scope.log; - - console.log($scope.log); - - $scope.pdfLoading = true; - }); - } - }; - - }] - }; - } -]); - -'use strict'; - -angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormFields', - function ($rootScope, FormFields) { - return { - templateUrl: 'modules/forms/admin/views/directiveViews/form/edit-form.client.view.html', - restrict: 'E', - scope: { - myform:'=' - }, - controller: ["$scope", function($scope){ - var field_ids = _($scope.myform.form_fields).pluck('_id'); - for(var i=0; i FormFields - $scope.oscarFieldsLeft = function(field_id){ - -<<<<<<< 95d6fb967b8d351fe9e17be40be308a8fe73c55f ->>>>>>> make it work -// Config HTTP Error Handling -angular.module('users').config(['$httpProvider', - function($httpProvider) { - $httpProvider.interceptors.push(["$q", "$location", function($q, $location) { - return { - responseError: function(response) { - if( $location.path() !== '/users/me' && response.config){ - if(response.config.url !== '/users/me'){ - console.log('intercepted rejection of ', response.config.url, response.status); - if (response.status === 401) { - console.log($location.path()); - // save the current location so that login can redirect back - $location.nextAfterLogin = $location.path(); - $location.path('/signin'); - }else if(response.status === 403){ - $location.path('/access_denied'); - } - } - - } - return $q.reject(response); - } - }; - }]); -}]); - -'use strict'; -======= -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f - // add new Button to the startPage - $scope.addButton = function(){ - - var newButton = {}; - newButton.bgColor = '#ddd'; - newButton.color = '#ffffff'; - newButton.text = 'Button'; - newButton._id = Math.floor(100000*Math.random()); ->>>>>>> make it work - - $scope.myform.startPage.buttons.push(newButton); - }; - -======= - if($scope.myform && $scope.myform.plugins.oscarhost.settings.validFields.length > 0){ - if(!$scope.myform.plugins.oscarhost.settings.fieldMap) $scope.myform.plugins.oscarhost.settings.fieldMap = {}; - - var oscarhostFields = $scope.myform.plugins.oscarhost.settings.validFields; - var currentFields = _($scope.myform.plugins.oscarhost.settings.fieldMap).invert().keys().value(); ->>>>>>> make it work - - if( $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id) ){ - currentFields = _(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id]); - } - - //Get all oscarhostFields that haven't been mapped to a formfield - return _(oscarhostFields).difference(currentFields).value(); - } - return []; - }; - - /* - ** FormFields (ui-sortable) drag-and-drop configuration - */ - $scope.dropzone = { - handle: ' .handle', - containment: '.dropzoneContainer', - cursor: 'grabbing' - }; - - /* - ** Field CRUD Methods - */ - // Add a new field - $scope.addNewField = function(modifyForm, fieldType){ - - // incr field_id counter - $scope.addField.lastAddedID++; - var fieldTitle; - - for(var i = 0; i < $scope.addField.types.length; i++){ - if($scope.addField.types[i].name === fieldType){ - $scope.addField.types[i].lastAddedID++; - fieldTitle = $scope.addField.types[i].value+$scope.addField.types[i].lastAddedID; - break; - } - } - var newField = { - title: fieldTitle, - fieldType: fieldType, - fieldValue: '', - required: true, - disabled: false, - deletePreserved: false - }; - // console.log('\n\n---------\nAdded field CLIENT'); - // console.log(newField); - // newField._id = _.uniqueId(); - - // put newField into fields array - if(modifyForm){ - $scope.myform.form_fields.push(newField); - } - return newField; - }; - - // Delete particular field on button click - $scope.deleteField = function (field_index){ - - //Delete field from field map - var currFieldId = $scope.myform.form_fields[field_index]._id; - if($scope.myform.hasOwnProperty('plugins.oscarhost.baseUrl')) delete $scope.myform.plugins.oscarhost.settings.fieldMap[currFieldId]; - - //Delete field - $scope.myform.form_fields.splice(field_index, 1); - }; - $scope.duplicateField = function (field_index){ - var currField = _.cloneDeep($scope.myform.form_fields[field_index]); - currField._id = 'cloned'+_.uniqueId(); - currField.title += ' copy'; - - //Insert field at selected index - $scope.myform.form_fields.splice(field_index+1, 0, currField); - }; - - - /* - ** startPage Button Methods - */ - // add new Button to the startPage $scope.addButton = function(){ @@ -4626,38 +3963,13 @@ angular.module('users').config(['$httpProvider', $scope.myform.startPage.buttons.push(newButton); }; ->>>>>>> make it work // delete particular Button from startPage $scope.deleteButton = function(button){ var currID; for(var i = 0; i < $scope.myform.startPage.buttons.length; i++){ -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - //console.log(Auth.ensureHasCurrentUser(User)); - - if (Auth.currentUser && Auth.currentUser.email) { - $timeout(deferred.resolve); - } - else { - Auth.currentUser = User.getCurrent( - function() { - Auth.login(); - $timeout(deferred.resolve()); - }, - function() { - Auth.logout(); - $timeout(deferred.reject()); - $state.go('signin', {reload: true}); - }); - } -======= currID = $scope.myform.startPage.buttons[i]._id; console.log(currID); -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f if(currID === button._id){ $scope.myform.startPage.buttons.splice(i, 1); @@ -4665,124 +3977,8 @@ angular.module('users').config(['$httpProvider', } } }; ->>>>>>> make it work -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= - - if(currID === button._id){ - $scope.myform.startPage.buttons.splice(i, 1); - break; - } - } - }; ->>>>>>> make it work - - -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - var checkSignupDisabled = function($window, $timeout, $q) { - var deferred = $q.defer(); - if($window.signupDisabled) { - $timeout(deferred.reject()); - } else { - $timeout(deferred.resolve()); - } - return deferred.promise; - }; - checkSignupDisabled.$inject = ["$window", "$timeout", "$q"]; - - // Users state routing - $stateProvider. - state('profile', { - resolve: { - loggedin: checkLoggedin - }, - url: '/settings/profile', - templateUrl: 'modules/users/views/settings/edit-profile.client.view.html' - }). - state('password', { - resolve: { - loggedin: checkLoggedin - }, - url: '/settings/password', - templateUrl: 'modules/users/views/settings/change-password.client.view.html' - }). - state('accounts', { - resolve: { - loggedin: checkLoggedin - }, - url: '/settings/accounts', - templateUrl: 'modules/users/views/settings/social-accounts.client.view.html' - }). - state('signup', { - resolve: { - isDisabled: checkSignupDisabled - }, - url: '/signup', - templateUrl: 'modules/users/views/authentication/signup.client.view.html' - }). - state('signup-success', { - resolve: { - isDisabled: checkSignupDisabled - }, - url: '/signup-success', - templateUrl: 'modules/users/views/authentication/signup-success.client.view.html' - }). - state('signin', { - url: '/signin', - templateUrl: 'modules/users/views/authentication/signin.client.view.html' - }). - state('access_denied', { - url: '/access_denied', - templateUrl: 'modules/users/views/authentication/access-denied.client.view.html' - }). -<<<<<<< 95d6fb967b8d351fe9e17be40be308a8fe73c55f - state('verify', { - resolve: { - isDisabled: checkSignupDisabled - }, - url: '/verify/:token', - templateUrl: 'modules/users/views/verify/verify-account.client.view.html' - }). - state('resendVerifyEmail', { - resolve: { - isDisabled: checkSignupDisabled - }, - url: '/verify', - templateUrl: 'modules/users/views/verify/resend-verify-email.client.view.html' - }). - state('forgot', { - url: '/password/forgot', - templateUrl: 'modules/users/views/password/forgot-password.client.view.html' - }). - state('reset-invalid', { - url: '/password/reset/invalid', - templateUrl: 'modules/users/views/password/reset-password-invalid.client.view.html' - }). - state('reset-success', { - url: '/password/reset/success', - templateUrl: 'modules/users/views/password/reset-password-success.client.view.html' -======= - state('resendVerifyEmail', { - url: '/verify', - templateUrl: 'modules/users/views/verify/resend-verify-email.client.view.html' ->>>>>>> make it work - }). -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f - state('reset', { - url: '/password/reset/:token', - templateUrl: 'modules/users/views/password/reset-password.client.view.html' - }); - } -======= - state('verify', { - url: '/verify/:token', - templateUrl: 'modules/users/views/verify/verify-account.client.view.html' - }). ->>>>>>> make it work -======= /* ** Field Option Methods */ @@ -4819,10 +4015,6 @@ angular.module('users').config(['$httpProvider', // delete particular option $scope.deleteOption = function (field_index, option){ var currField = $scope.myform.form_fields[field_index]; -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -======= ->>>>>>> make it work ->>>>>>> make it work if(currField.fieldType === 'checkbox' || currField.fieldType === 'dropdown' || currField.fieldType === 'radio'){ for(var i = 0; i < currField.fieldOptions.length; i++){ @@ -4849,10 +4041,6 @@ angular.module('users').config(['$httpProvider', }; } -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f ->>>>>>> make it work -======= ->>>>>>> make it work ]); 'use strict'; @@ -4965,10 +4153,16 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope', 'csv': 'csv' }; - var blob = new Blob([document.getElementById('table-submission-data').innerHTM], { + console.log($scope.table.rows); + + angular.element('#table-submission-data').tableExport({type: type, escape:false}); + + /* + var blob = new Blob([$scope.table.rows], { type: 'application/'+fileMIMETypeMap[type]+';charset=utf-8' }); saveAs(blob, $scope.myform.title+'_sumbissions_export_'+Date.now()+'.'+type); + */ }; }] @@ -4978,6 +4172,81 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope', 'use strict'; +//TODO: DAVID: URGENT: Make this a $resource that fetches valid field types from server +angular.module('forms').service('FormFields', [ + function() { + this.types = [ + { + name : 'textfield', + value : 'Short Text' + }, + { + name : 'email', + value : 'Email' + }, + { + name : 'radio', + value : 'Multiple Choice' + }, + { + name : 'dropdown', + value : 'Dropdown' + }, + { + name : 'date', + value : 'Date' + }, + { + name : 'textarea', + value : 'Paragraph Text' + }, + { + name : 'yes_no', + value : 'Yes/No' + }, + { + name : 'legal', + value : 'Legal' + }, + // { + // name : 'sig', + // value : 'Signature' + // }, + // { + // name : 'file', + // value : 'File Upload' + // }, + { + name : 'rating', + value : 'Rating' + }, + { + name : 'link', + value : 'Link' + }, + { + name : 'number', + value : 'Numbers' + }, + // { + // name : 'scale', + // value : 'Opinion Scale' + // }, + // { + // name : 'stripe', + // value : 'Payment' + // }, + { + name : 'statement', + value : 'Statement' + } + ]; + } + +]); + +'use strict'; + //Submissions service used for communicating with the forms REST endpoints angular.module('forms').factory('Submissions', ['$resource', function($resource) { @@ -5050,31 +4319,36 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid $translateProvider.translations('english', { FORM_SUCCESS: 'Form entry successfully submitted!', + REVIEW: 'Review', BACK_TO_FORM: 'Go back to Form', EDIT_FORM: 'Edit this TellForm', CREATE_FORM: 'Create this TellForm', ADVANCEMENT: '{{done}} out of {{total}} answered', CONTINUE_FORM: 'Continue to Form', REQUIRED: 'required', + COMPLETING_NEEDED: '{{answers_not_completed}} answer(s) need completing', OPTIONAL: 'optional', ERROR_EMAIL_INVALID: 'Please enter a valid email address', ERROR_NOT_A_NUMBER: 'Please enter valid numbers only', ERROR_URL_INVALID: 'Please a valid url', OK: 'OK', ENTER: 'press ENTER', + YES: 'Yes', + NO: 'No', + NEWLINE: 'press SHIFT+ENTER to create a newline', CONTINUE: 'Continue', LEGAL_ACCEPT: 'I accept', LEGAL_NO_ACCEPT: 'I don’t accept', DELETE: 'Delete', CANCEL: 'Cancel', - UPLOAD_FILE: 'Upload your File' - + SUBMIT: 'Submit', + UPLOAD_FILE: 'Upload your File', }); $translateProvider.preferredLanguage('english') .fallbackLanguage('english') .useSanitizeValueStrategy('escape'); - + }]); 'use strict'; @@ -5083,24 +4357,32 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid $translateProvider.translations('french', { FORM_SUCCESS: 'Votre formulaire a été enregistré!', + REVIEW: 'Incomplet', BACK_TO_FORM: 'Retourner au formulaire', EDIT_FORM: 'Éditer le Tellform', CREATE_FORM: 'Créer un TellForm', ADVANCEMENT: '{{done}} complétés sur {{total}}', CONTINUE_FORM: 'Aller au formulaire', REQUIRED: 'obligatoire', + COMPLETING_NEEDED: '{{answers_not_completed}} réponse(s) doive(nt) être complétée(s)', OPTIONAL: 'facultatif', ERROR_EMAIL_INVALID: 'Merci de rentrer une adresse mail valide', ERROR_NOT_A_NUMBER: 'Merce de ne rentrer que des nombres', ERROR_URL_INVALID: 'Merci de rentrer une url valide', OK: 'OK', ENTER: 'presser ENTRÉE', + YES: 'Oui', + NO: 'Non', + NEWLINE: 'presser SHIFT+ENTER pour créer une nouvelle ligne', CONTINUE: 'Continuer', LEGAL_ACCEPT: 'J’accepte', - LEGAL_NO_ACCEPT: 'Jen n’accepte pas', + LEGAL_NO_ACCEPT: 'Je n’accepte pas', DELETE: 'Supprimer', CANCEL: 'Réinitialiser', - UPLOAD_FILE: 'Envoyer des fichier' + SUBMIT: 'Enregistrer', + UPLOAD_FILE: 'Envoyer un fichier', + Y: 'O', + N: 'N', }); }]); @@ -5113,7 +4395,7 @@ angular.module('forms').controller('SubmitFormController', [ function($scope, $rootScope, $state, $translate, myForm, Auth) { $scope.authentication = Auth; $scope.myform = myForm; - console.log(myForm); + $translate.use(myForm.language); if(!$scope.myform.isLive){ @@ -5230,17 +4512,6 @@ angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$root var fieldType = scope.field.fieldType; -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - logout: function() { - $window.user = null; - userState.isLoggedIn = false; - service._currentUser = null; - } -======= if(scope.field.fieldType === 'number' || scope.field.fieldType === 'textfield' || scope.field.fieldType === 'email' || scope.field.fieldType === 'link'){ switch(scope.field.fieldType){ case 'textfield': @@ -5252,7 +4523,7 @@ angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$root break; case 'number': scope.field.input_type = 'text'; - scope.field.validateRegex = /^\d+$/; + scope.field.validateRegex = /^-?\d+$/; break; default: scope.field.input_type = 'url'; @@ -5265,7 +4536,6 @@ angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$root element.html(template).show(); $compile(element.contents())(scope); } ->>>>>>> make it work }; }]); @@ -5277,12 +4547,11 @@ angular.module('forms').directive('onEnterKey', ['$rootScope', function($rootSco link: function($scope, $element, $attrs) { $element.bind('keydown keypress', function(event) { var keyCode = event.which || event.keyCode; - if(keyCode === 13) { + if(keyCode === 13 && !event.shiftKey) { + event.preventDefault(); $rootScope.$apply(function() { $rootScope.$eval($attrs.onEnterKey); }); - - event.preventDefault(); } }); } @@ -5338,9 +4607,12 @@ angular.module('forms').directive('submitFormDirective', } return true; }).length; + + var nb_valid = $filter('formValidity')($scope.myform); $scope.translateAdvancementData = { - done: $filter('formValidity')($scope.myform), - total: form_fields_count + done: nb_valid, + total: form_fields_count, + answers_not_completed: form_fields_count - nb_valid }; $scope.reloadForm = function(){ @@ -5360,20 +4632,10 @@ angular.module('forms').directive('submitFormDirective', }; $scope.setActiveField($scope.myform.visible_form_fields[0]._id, 0, false); -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - return deferred.promise; - }, - logout: function() { -======= //console.log($scope.selected); //Reset Timer TimeCounter.restartClock(); }; ->>>>>>> make it work $window.onscroll = function(){ $scope.scrollPos = document.body.scrollTop || document.documentElement.scrollTop || 0; @@ -5381,41 +4643,31 @@ angular.module('forms').directive('submitFormDirective', $scope.fieldTop = elemBox.top; $scope.fieldBottom = elemBox.bottom; -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - return deferred.promise; - }, - signup: function(credentials) { -======= //console.log($scope.forms.myForm); var field_id; var field_index; ->>>>>>> make it work if(!$scope.noscroll){ //Focus on submit button - if( $scope.selected.index === $scope.myform.form_fields.length-1 && $scope.fieldBottom < 200){ + if( $scope.selected.index === $scope.myform.visible_form_fields.length-1 && $scope.fieldBottom < 200){ field_index = $scope.selected.index+1; field_id = 'submit_field'; $scope.setActiveField(field_id, field_index, false); } //Focus on field above submit button - else if($scope.selected.index === $scope.myform.form_fields.length){ + else if($scope.selected.index === $scope.myform.visible_form_fields.length){ if($scope.fieldTop > 200){ field_index = $scope.selected.index-1; - field_id = $scope.myform.form_fields[field_index]._id; + field_id = $scope.myform.visible_form_fields[field_index]._id; $scope.setActiveField(field_id, field_index, false); } }else if( $scope.fieldBottom < 0){ field_index = $scope.selected.index+1; - field_id = $scope.myform.form_fields[field_index]._id; + field_id = $scope.myform.visible_form_fields[field_index]._id; $scope.setActiveField(field_id, field_index, false); }else if ( $scope.selected.index !== 0 && $scope.fieldTop > 0) { field_index = $scope.selected.index-1; - field_id = $scope.myform.form_fields[field_index]._id; + field_id = $scope.myform.visible_form_fields[field_index]._id; $scope.setActiveField(field_id, field_index, false); } //console.log('$scope.selected.index: '+$scope.selected.index); @@ -5424,6 +4676,10 @@ angular.module('forms').directive('submitFormDirective', } }; + $rootScope.setDropdownOption = function(){ + console.log('setDropdownOption index: '); + }; + /* ** Field Controls */ @@ -5440,72 +4696,81 @@ angular.module('forms').directive('submitFormDirective', $scope.selected._id = field_id; $scope.selected.index = field_index; -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - resendVerifyEmail: function(_email) { -======= + var nb_valid = $filter('formValidity')($scope.myform); $scope.translateAdvancementData = { - done: $filter('formValidity')($scope.myform), - total: form_fields_count + done: nb_valid, + total: form_fields_count, + answers_not_completed: form_fields_count - nb_valid }; ->>>>>>> make it work if(animateScroll){ $scope.noscroll=true; setTimeout(function() { - $document.scrollToElement(angular.element('.activeField'), -10, 200).then(function(){ - $scope.noscroll = false; - document.querySelectorAll('.activeField .focusOn')[0].focus(); + $document.scrollToElement(angular.element('.activeField'), -10, 200).then(function() { + $scope.noscroll = false; + setTimeout(function() { + if (document.querySelectorAll('.activeField .focusOn')[0]) { + //console.log(document.querySelectorAll('.activeField .focusOn')[0]); + document.querySelectorAll('.activeField .focusOn')[0].focus(); + } else { + //console.log(document.querySelectorAll('.activeField input')[0]); + document.querySelectorAll('.activeField input')[0].focus(); + } + }); }); - }, 20); - } + }); + }else { + setTimeout(function() { + if (document.querySelectorAll('.activeField .focusOn')[0]) { + //console.log(document.querySelectorAll('.activeField .focusOn')[0]); + document.querySelectorAll('.activeField .focusOn')[0].focus(); + } else { + document.querySelectorAll('.activeField input')[0].focus(); + } + }); + } }; $rootScope.nextField = $scope.nextField = function(){ //console.log('nextfield'); //console.log($scope.selected.index); - //console.log($scope.myform.form_fields.length-1); - if($scope.selected.index < $scope.myform.form_fields.length-1){ - var selected_index = $scope.selected.index+1; - var selected_id = $scope.myform.form_fields[selected_index]._id; + //console.log($scope.myform.visible_form_fields.length-1); + var selected_index, selected_id; + if($scope.selected.index < $scope.myform.visible_form_fields.length-1){ + selected_index = $scope.selected.index+1; + selected_id = $scope.myform.visible_form_fields[selected_index]._id; $rootScope.setActiveField(selected_id, selected_index, true); - } else if($scope.selected.index === $scope.myform.form_fields.length-1) { - var selected_index = $scope.selected.index+1; - var selected_id = 'submit_field'; + } else if($scope.selected.index === $scope.myform.visible_form_fields.length-1) { + //console.log('Second last element'); + selected_index = $scope.selected.index+1; + selected_id = 'submit_field'; $rootScope.setActiveField(selected_id, selected_index, true); } }; -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - validateVerifyToken: function(token) { -======= $rootScope.prevField = $scope.prevField = function(){ if($scope.selected.index > 0){ var selected_index = $scope.selected.index - 1; - var selected_id = $scope.myform.form_fields[selected_index]._id; + var selected_id = $scope.myform.visible_form_fields[selected_index]._id; $scope.setActiveField(selected_id, selected_index, true); } }; ->>>>>>> make it work /* ** Form Display Functions */ $scope.exitStartPage = function(){ $scope.myform.startPage.showStart = false; - if($scope.myform.form_fields.length > 0){ - $scope.selected._id = $scope.myform.form_fields[0]._id; + if($scope.myform.visible_form_fields.length > 0){ + $scope.selected._id = $scope.myform.visible_form_fields[0]._id; } }; - $scope.submitForm = function() { + $scope.goToInvalid = function() { + document.querySelectorAll('.ng-invalid.focusOn')[0].focus(); + }; + + $scope.submitForm = function() { var _timeElapsed = TimeCounter.stopClock(); $scope.loading = true; var form = _.cloneDeep($scope.myform); @@ -5530,11 +4795,8 @@ angular.module('forms').directive('submitFormDirective', }, 500); }; - //Load our form when the page is ready - //angular.element(document).ready(function() { - $scope.reloadForm(); - //}); - + //Reload our form + $scope.reloadForm(); }] }; } @@ -5542,31 +4804,13 @@ angular.module('forms').directive('submitFormDirective', 'use strict'; -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - return deferred.promise; - } -======= //Forms service used for communicating with the forms REST endpoints angular.module('forms').service('CurrentForm', function(){ ->>>>>>> make it work //Private variables var _form = {}; -<<<<<<< afa26fde37ead7eff67e1cf9053c069ded63381f -<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c -======= -<<<<<<< adb4e008930e5142044796081f66a1db54906706 ->>>>>>> make it work - return userService; - - } -======= //Public Methods this.getForm = function() { return _form; @@ -5578,82 +4822,6 @@ angular.module('forms').service('CurrentForm', ); 'use strict'; -//TODO: DAVID: URGENT: Make this a $resource that fetches valid field types from server -angular.module('forms').service('FormFields', [ - function() { - this.types = [ - { - name : 'textfield', - value : 'Short Text' - }, - { - name : 'email', - value : 'Email' - }, - { - name : 'radio', - value : 'Multiple Choice' - }, - { - name : 'dropdown', - value : 'Dropdown' - }, - { - name : 'date', - value : 'Date' - }, - { - name : 'textarea', - value : 'Paragraph Text' - }, - { - name : 'yes_no', - value : 'Yes/No' - }, - { - name : 'legal', - value : 'Legal' - }, - // { - // name : 'sig', - // value : 'Signature' - // }, - // { - // name : 'file', - // value : 'File Upload' - // }, - { - name : 'rating', - value : 'Rating' - }, - { - name : 'link', - value : 'Link' - }, - { - name : 'number', - value : 'Numbers' - }, - // { - // name : 'scale', - // value : 'Opinion Scale' - // }, - // { - // name : 'stripe', - // value : 'Payment' - // }, - { - name : 'statement', - value : 'Statement' - } - ]; - } - ->>>>>>> make it work -]); - -'use strict'; - //Forms service used for communicating with the forms REST endpoints angular.module('forms').factory('Forms', ['$resource', 'FORM_URL', function($resource, FORM_URL) { diff --git a/public/dist/application.min.js b/public/dist/application.min.js index 9493be90..52307291 100644 --- a/public/dist/application.min.js +++ b/public/dist/application.min.js @@ -1,3 +1,4 @@ +<<<<<<< 7fab87aeb2fac11c800978b13daeeb2629a02297 <<<<<<< 96591cc1e8fbb4fd9e1f61b6c8ba44f9aa5a02cf <<<<<<< 89a4852b67e5d936da0821c12c28ec39c7c6d2b0 function removeDateFieldsFunc(o){function eachObject(v,k){"lastModified"!==k&&"created"!==k||delete clone[k]}for(var clone=_.clone(o),i=0;i'),$templateCache.put("../public/modules/core/views/home.client.view.html",'

Craft beautiful forms in seconds.

Create your next ______.

Tell a story with a form.

'),$templateCache.put("../public/modules/forms/views/admin-form.client.view.html",'
'),$templateCache.put("../public/modules/forms/views/list-forms.client.view.html",'

Create a new form
Name
Language

'),$templateCache.put("../public/modules/forms/views/submit-form.client.view.html","
"),$templateCache.put("../public/modules/forms/views/adminTabs/analyze.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/configure.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/create.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/design.html",'
Background Color
Question Text Color
Answer Text Color
Button Background Color
Button Text Color
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeA.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/entryPage/startPage.html",'

{{pageData.introTitle}}

{{pageData.introParagraph}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/date.html",'

{{index+1}} {{field.title}} optional

{{field.description}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/dropdown.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/hidden.html",''),$templateCache.put("../public/modules/forms/views/directiveViews/field/legal.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/radio.html",'

{{index+1}} {{field.title}} optional

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/rating.html",'

{{index+1}} {{field.title}} optional

{{field.description}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/statement.html",'

{{field.title}}

{{field.description}}

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textarea.html",'

{{index+1}} {{field.title}} optional

{{field.description}}

Press SHIFT+ENTER to add a newline
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textfield.html",'

{{index+1}} {{field.title}} (optional)

{{field.description}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/yes_no.html",'

{{index+1}} {{field.title}} optional

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/form/configure-form.client.view.html",'
Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.name}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type
Form Name
Form Status
Google Analytics Tracking Code
Language
* required
Display Form Footer?
Display Start Page?
'), @@ -41,3 +42,11 @@ $templateCache.put("../public/modules/users/views/authentication/signup-success. >>>>>>> make it work >>>>>>> make it work >>>>>>> make it work +======= +function removeDateFieldsFunc(o){function eachObject(v,k){"lastModified"!==k&&"created"!==k||delete clone[k]}for(var clone=_.clone(o),i=0;i'),$templateCache.put("modules/core/views/home.client.view.html",'

Craft beautiful forms in seconds.

Create your next ______.

Tell a story with a form.

'),$templateCache.put("modules/forms/admin/views/admin-form.client.view.html",'
'),$templateCache.put("modules/forms/admin/views/list-forms.client.view.html",'

Create a new form
Name
Language

'),$templateCache.put("modules/forms/base/views/submit-form.client.view.html","
"),$templateCache.put("modules/forms/admin/views/adminTabs/analyze.html",""),$templateCache.put("modules/forms/admin/views/adminTabs/configure.html",""),$templateCache.put("modules/forms/admin/views/adminTabs/create.html",""),$templateCache.put("modules/forms/admin/views/adminTabs/design.html",'
Background Color
Question Text Color
Answer Text Color
Button Background Color
Button Text Color
'),$templateCache.put("modules/forms/admin/views/directiveViews/cgBusy/update-form-message-TypeA.html",'
{{$message}}
'),$templateCache.put("modules/forms/admin/views/directiveViews/cgBusy/update-form-message-TypeB.html",'
{{$message}}
'),$templateCache.put("modules/forms/admin/views/directiveViews/form/configure-form.client.view.html",'
Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.name}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type
Form Name
Form Status
Language
* required
Display Form Footer?
Display Start Page?
'),$templateCache.put("modules/forms/admin/views/directiveViews/form/edit-form.client.view.html",'

Edit Start Page


Intro Title:
Intro Paragraph:
\n
\n\n

\n
\n
Options:
\n
\n
\n \n\n \n \n \n
\n
\n \n
\n
\n
\n\n

\n\n
\n
Required:
\n
\n \n\n \n
\n
\n\n
\n
Disabled:
\n
\n \n\n \n
\n
\n\n
\n \n\n
\n
\n

\n Click on Fields to add them here\n

\n
\n
\n\n
\n \n
\n\n \n \n\n \n
\n
\n\n'), +$templateCache.put("modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html",'
#{{value.title}}OscarEMR User ProfilePercentage CompleteTime ElapsedDeviceLocationIP AddressDate Submitted (UTC)Generated PDF
{{$index+1}}{{field.fieldValue.field_title}}{{field.fieldValue}}User Profile #{{row.oscarDemoNum}}{{row.percentageComplete}}%{{row.timeElapsed}}{{row.device.name}}, {{row.device.type}}{{row.geoLocation.city}}, {{row.geoLocation.country}}{{row.ipAddr}}{{row.created | date:\'yyyy-MM-dd HH:mm:ss\'}}Generated PDF
'),$templateCache.put("modules/forms/base/views/directiveViews/entryPage/startPage.html",'

{{pageData.introTitle}}

{{pageData.introParagraph}}

'),$templateCache.put("modules/forms/base/views/directiveViews/field/date.html",'

{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }}

'),$templateCache.put("modules/forms/base/views/directiveViews/field/dropdown.html",'
'),$templateCache.put("modules/forms/base/views/directiveViews/field/file.html",'

{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }}

{{field.file.originalname}}
{{ UPLOAD_FILE | translate }}
'),$templateCache.put("modules/forms/base/views/directiveViews/field/hidden.html",''),$templateCache.put("modules/forms/base/views/directiveViews/field/legal.html",'
'),$templateCache.put("modules/forms/base/views/directiveViews/field/radio.html",'

{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }}


'),$templateCache.put("modules/forms/base/views/directiveViews/field/rating.html",'

{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }}

'),$templateCache.put("modules/forms/base/views/directiveViews/field/statement.html",'

{{field.title}}

{{field.description}}


'),$templateCache.put("modules/forms/base/views/directiveViews/field/textarea.html",'

{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }}

{{ \'NEWLINE\' | translate }}
{{ \'ENTER\' | translate }}
'),$templateCache.put("modules/forms/base/views/directiveViews/field/textfield.html",'

{{index+1}} {{field.title}} ({{ \'OPTIONAL\' | translate }})

{{ \'ENTER\' | translate }}
'),$templateCache.put("modules/forms/base/views/directiveViews/field/yes_no.html",'

{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }}

{{field.description}}


'),$templateCache.put("modules/forms/base/views/directiveViews/form/submit-form.client.view.html",'
{{ \'COMPLETING_NEEDED\' | translate:translateAdvancementData }}
'),$templateCache.put("modules/users/views/authentication/access-denied.client.view.html",'

You need to be logged in to access this page

Login
'),$templateCache.put("modules/users/views/authentication/signin.client.view.html",'

Sign into your account

'),$templateCache.put("modules/users/views/authentication/signup-success.client.view.html",''),$templateCache.put("modules/users/views/authentication/signup.client.view.html",''),$templateCache.put("modules/users/views/password/forgot-password.client.view.html",'

Restore your password

Enter your account email.

'),$templateCache.put("modules/users/views/password/reset-password-invalid.client.view.html",'

Password reset is invalid

Ask for a new password reset
'),$templateCache.put("modules/users/views/password/reset-password-success.client.view.html",'

Password successfully reset

Continue to home page
'),$templateCache.put("modules/users/views/password/reset-password.client.view.html",'

Reset your password

'),$templateCache.put("modules/users/views/settings/change-password.client.view.html",'

Change your password

'),$templateCache.put("modules/users/views/settings/edit-profile.client.view.html",'

Edit your profile

'), +$templateCache.put("modules/users/views/settings/social-accounts.client.view.html",'

Connected social accounts:

Connect other social accounts:

'),$templateCache.put("modules/users/views/verify/resend-verify-email.client.view.html",'

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at polydaic@gmail.com

'),$templateCache.put("modules/users/views/verify/verify-account.client.view.html",'

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
')}]);var ApplicationConfiguration=function(){var applicationModuleName="NodeForm",applicationModuleVendorDependencies=["duScroll","ui.select","cgBusy","ngSanitize","vButton","ngResource","NodeForm.templates","ui.router","ui.bootstrap","ui.utils"],registerModule=function(moduleName,dependencies){angular.module(moduleName,dependencies||[]),angular.module(applicationModuleName).requires.push(moduleName)};return{applicationModuleName:applicationModuleName,applicationModuleVendorDependencies:applicationModuleVendorDependencies,registerModule:registerModule}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function($locationProvider){$locationProvider.hashPrefix("!")}]),angular.module(ApplicationConfiguration.applicationModuleName).constant("APP_PERMISSIONS",{viewAdminSettings:"viewAdminSettings",editAdminSettings:"editAdminSettings",editForm:"editForm",viewPrivateForm:"viewPrivateForm"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("USER_ROLES",{admin:"admin",normal:"user",superuser:"superuser"}),angular.module(ApplicationConfiguration.applicationModuleName).constant("FORM_URL","/forms/:formId"),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","$state","$stateParams",function($rootScope,Auth,$state,$stateParams){$rootScope.$state=$state,$rootScope.$stateParams=$stateParams,$rootScope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState){$state.previous=fromState;var statesToIgnore=["home","signin","resendVerifyEmail","verify","signup","signup-success","forgot","reset-invalid","reset","reset-success"];statesToIgnore.indexOf(toState.name)>0?Auth.isAuthenticated()&&(event.preventDefault(),$state.go("listForms")):"access_denied"===toState.name||Auth.isAuthenticated()||"submitForm"===toState.name||(console.log("go to signup"),event.preventDefault(),$state.go("listForms"))})}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","User","Authorizer","$state","$stateParams",function($rootScope,Auth,User,Authorizer,$state,$stateParams){$rootScope.$on("$stateChangeStart",function(event,next){var authenticator,permissions,user;permissions=next&&next.data&&next.data.permissions?next.data.permissions:null,Auth.ensureHasCurrentUser(User),user=Auth.currentUser,user&&(authenticator=new Authorizer(user),null!=permissions&&(authenticator.canAccess(permissions)||(event.preventDefault(),$state.go("access_denied"))))})}]),angular.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),angular.module("NodeForm.templates",[]).run(["$templateCache",function($templateCache){"use strict";$templateCache.put("../public/modules/core/views/header.client.view.html",''),$templateCache.put("../public/modules/core/views/home.client.view.html",'

Craft beautiful forms in seconds.

Create your next ______.

Tell a story with a form.

'),$templateCache.put("../public/modules/forms/views/admin-form.client.view.html",'
'),$templateCache.put("../public/modules/forms/views/list-forms.client.view.html",'

Create a new form
Name
Language

'),$templateCache.put("../public/modules/forms/views/submit-form.client.view.html","
"),$templateCache.put("../public/modules/forms/views/adminTabs/analyze.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/configure.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/create.html",""),$templateCache.put("../public/modules/forms/views/adminTabs/design.html",'
Background Color
Question Text Color
Answer Text Color
Button Background Color
Button Text Color
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeA.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html",'
{{$message}}
'),$templateCache.put("../public/modules/forms/views/directiveViews/entryPage/startPage.html",'

{{pageData.introTitle}}

{{pageData.introParagraph}}

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/date.html",'

{{field.title}} *(required)

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/dropdown.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/file.html",'
{{field.title}} (* required)
{{field.file.originalname}}
Upload your File
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/hidden.html",''),$templateCache.put("../public/modules/forms/views/directiveViews/field/legal.html",'
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/natural.html",'

{{field.title}} *(required)


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/password.html",'

{{field.title}} *(required)

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/radio.html",'

{{field.title}} *(required)


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/rating.html",'

{{field.title}} *(required)

'),$templateCache.put("../public/modules/forms/views/directiveViews/field/statement.html",'

{{field.title}}

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textarea.html",'

{{field.title}} *(required)

press ENTER
'),$templateCache.put("../public/modules/forms/views/directiveViews/field/textfield.html",'

{{field.title}} *(required)

press ENTER
'), +$templateCache.put("../public/modules/forms/views/directiveViews/field/yes_no.html",'

{{field.title}} *(required)

{{field.description}}


'),$templateCache.put("../public/modules/forms/views/directiveViews/form/configure-form.client.view.html",'
Save Submissions as PDFs?
Upload Your PDF Template
{{myform.pdf.originalname}}
Upload your PDF
Autogenerate Form?
Use Oscarhost API?
Oscarhost API Username
Oscarhost API Password
Oscarhost API URL
Oscarhost API Update Type
Form Name
Form Status
Language
* required
Display Form Footer?
Display Start Page?
'),$templateCache.put("../public/modules/forms/views/directiveViews/form/edit-form.client.view.html",'

Edit Start Page


Intro Title:
Intro Paragraph:
\n
\n\n

\n
\n
Options:
\n
\n
\n \n\n \n \n \n
\n
\n \n
\n
\n
\n\n

\n\n
\n
Required:
\n
\n \n\n \n
\n
\n\n
\n
Disabled:
\n
\n \n\n \n
\n
\n\n
\n \n\n
\n
\n

\n Click on Fields to add them here\n

\n
\n
\n\n
\n \n
\n\n \n \n\n \n
\n
\n\n'),$templateCache.put("../public/modules/forms/views/directiveViews/form/edit-submissions-form.client.view.html",'
#{{value.title}}OscarEMR User ProfilePercentage CompleteTime ElapsedDeviceLocationIP AddressDate Submitted (UTC)Generated PDF
{{$index+1}}{{field.fieldValue}}User Profile #{{row.oscarDemoNum}}{{row.percentageComplete}}%{{row.timeElapsed}}{{row.device.name}}, {{row.device.type}}{{row.geoLocation.city}}, {{row.geoLocation.country}}{{row.ipAddr}}{{row.created | date:\'yyyy-MM-dd HH:mm:ss\'}}Generated PDF
'),$templateCache.put("../public/modules/forms/views/directiveViews/form/submit-form.client.view.html",'
press ENTER
'),$templateCache.put("../public/modules/users/views/authentication/access-denied.client.view.html",'

You need to be logged in to access this page

Login
'),$templateCache.put("../public/modules/users/views/authentication/signin.client.view.html",'

Sign into your account

'), +$templateCache.put("../public/modules/users/views/authentication/signup-success.client.view.html",''),$templateCache.put("../public/modules/users/views/authentication/signup.client.view.html",''),$templateCache.put("../public/modules/users/views/password/forgot-password.client.view.html",'

Restore your password

Enter your account email.

'),$templateCache.put("../public/modules/users/views/password/reset-password-invalid.client.view.html",'

Password reset is invalid

Ask for a new password reset
'),$templateCache.put("../public/modules/users/views/password/reset-password-success.client.view.html",'

Password successfully reset

Continue to home page
'),$templateCache.put("../public/modules/users/views/password/reset-password.client.view.html",'

Reset your password

'),$templateCache.put("../public/modules/users/views/settings/change-password.client.view.html",'

Change your password

'),$templateCache.put("../public/modules/users/views/settings/edit-profile.client.view.html",'

Edit your profile

'),$templateCache.put("../public/modules/users/views/settings/social-accounts.client.view.html",'

Connected social accounts:

Connect other social accounts:

'),$templateCache.put("../public/modules/users/views/verify/resend-verify-email.client.view.html",'

Resend your account verification email

Enter your account email.

{{error}}

Verification Email has been Sent

A verification email has been sent to {{username}}.
But your account is still not activated yet

Check your email and click on the activation link to activate your account. If you have any questions drop us a line at hi@TellForm.com

'),$templateCache.put("../public/modules/users/views/verify/verify-account.client.view.html",'

Account successfuly activated

Continue to login page

Verification link is invalid or has expired

Resend your verification email Signin to your account
')}]),ApplicationConfiguration.registerModule("core",["users"]),ApplicationConfiguration.registerModule("forms",["ngFileUpload","ui.router.tabs","ui.date","ui.sortable","angular-input-stars","users","pascalprecht.translate"]),ApplicationConfiguration.registerModule("users"),angular.module("core").config(["$stateProvider","$urlRouterProvider",function($stateProvider,$urlRouterProvider,Authorization){$urlRouterProvider.otherwise("/forms")}]),angular.module("core").controller("HeaderController",["$rootScope","$scope","Menus","$state","Auth","User","$window",function($rootScope,$scope,Menus,$state,Auth,User,$window){$rootScope.signupDisabled=$window.signupDisabled,$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.authentication=$rootScope.authentication=Auth,$rootScope.languages=$scope.languages=["english","french","spanish"],$scope.isCollapsed=!1,$rootScope.hideNav=!1,$scope.menu=Menus.getMenu("topbar"),$scope.signout=function(){var promise=User.logout();promise.then(function(){Auth.logout(),Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user=null,$state.go("listForms")},function(reason){console.log("Logout Failed: "+reason)})},$scope.toggleCollapsibleMenu=function(){$scope.isCollapsed=!$scope.isCollapsed},$scope.$on("$stateChangeSuccess",function(event,toState,toParams,fromState,fromParams){$scope.isCollapsed=!1,$rootScope.hideNav=!1,angular.isDefined(toState.data)&&angular.isDefined(toState.data.hideNav)&&($rootScope.hideNav=toState.data.hideNav)})}]),angular.module("core").controller("HomeController",["$rootScope","$scope","User","$state",function($rootScope,$scope,User,$state){$scope=$rootScope}]),angular.module("core").service("Menus",[function(){this.defaultRoles=["*"],this.menus={};var shouldRender=function(user){if(!user)return this.isPublic;if(~this.roles.indexOf("*"))return!0;for(var userRoleIndex in user.roles)for(var roleIndex in this.roles)if(console.log(this.roles[roleIndex]),console.log(this.roles[roleIndex]===user.roles[userRoleIndex]),this.roles[roleIndex]===user.roles[userRoleIndex])return!0;return!1};this.validateMenuExistance=function(menuId){if(menuId&&menuId.length){if(this.menus[menuId])return!0;throw new Error("Menu does not exists")}throw new Error("MenuId was not provided")},this.getMenu=function(menuId){return this.validateMenuExistance(menuId),this.menus[menuId]},this.addMenu=function(menuId,isPublic,roles){return this.menus[menuId]={isPublic:isPublic||!1,roles:roles||this.defaultRoles,items:[],shouldRender:shouldRender},this.menus[menuId]},this.removeMenu=function(menuId){this.validateMenuExistance(menuId),delete this.menus[menuId]},this.addMenuItem=function(menuId,menuItemTitle,menuItemURL,menuItemType,menuItemUIRoute,isPublic,roles,position){return this.validateMenuExistance(menuId),this.menus[menuId].items.push({title:menuItemTitle,link:menuItemURL,menuItemType:menuItemType||"item",menuItemClass:menuItemType,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].roles:roles,position:position||0,items:[],shouldRender:shouldRender}),this.menus[menuId]},this.addSubMenuItem=function(menuId,rootMenuItemURL,menuItemTitle,menuItemURL,menuItemUIRoute,isPublic,roles,position){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===rootMenuItemURL&&this.menus[menuId].items[itemIndex].items.push({title:menuItemTitle,link:menuItemURL,uiRoute:menuItemUIRoute||"/"+menuItemURL,isPublic:null===isPublic||"undefined"==typeof isPublic?this.menus[menuId].items[itemIndex].isPublic:isPublic,roles:null===roles||"undefined"==typeof roles?this.menus[menuId].items[itemIndex].roles:roles,position:position||0,shouldRender:shouldRender});return this.menus[menuId]},this.removeMenuItem=function(menuId,menuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)this.menus[menuId].items[itemIndex].link===menuItemURL&&this.menus[menuId].items.splice(itemIndex,1);return this.menus[menuId]},this.removeSubMenuItem=function(menuId,submenuItemURL){this.validateMenuExistance(menuId);for(var itemIndex in this.menus[menuId].items)for(var subitemIndex in this.menus[menuId].items[itemIndex].items)this.menus[menuId].items[itemIndex].items[subitemIndex].link===submenuItemURL&&this.menus[menuId].items[itemIndex].items.splice(subitemIndex,1);return this.menus[menuId]},this.addMenu("topbar",!1,["*"]),this.addMenu("bottombar",!1,["*"])}]),angular.module("forms").run(["Menus",function(Menus){Menus.addMenuItem("topbar","My Forms","forms","","/forms",!1)}]).filter("formValidity",function(){return function(formObj){if(formObj&&formObj.form_fields&&formObj.visible_form_fields){var formKeys=Object.keys(formObj),fields=(formKeys.filter(function(key){return"$"!==key[0]}),formObj.form_fields),valid_count=fields.filter(function(field){return"object"==typeof field&&"statement"!==field.fieldType&&"rating"!==field.fieldType?!!field.fieldValue:void 0}).length;return valid_count-(formObj.form_fields.length-formObj.visible_form_fields.length)}return 0}}).config(["$provide",function($provide){$provide.decorator("accordionDirective",["$delegate",function($delegate){var directive=$delegate[0];return directive.replace=!0,$delegate}])}]),angular.module("forms").config(["$stateProvider",function($stateProvider){$stateProvider.state("listForms",{url:"/forms",templateUrl:"modules/forms/admin/views/list-forms.client.view.html"}).state("submitForm",{url:"/forms/:formId",templateUrl:"modules/forms/base/views/submit-form.client.view.html",data:{hideNav:!0},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"SubmitFormController",controllerAs:"ctrl"}).state("viewForm",{url:"/forms/:formId/admin",templateUrl:"modules/forms/admin/views/admin-form.client.view.html",data:{permissions:["editForm"]},resolve:{Forms:"Forms",myForm:["Forms","$stateParams",function(Forms,$stateParams){return Forms.get({formId:$stateParams.formId}).$promise}]},controller:"AdminFormController"}).state("viewForm.configure",{url:"/configure",templateUrl:"modules/forms/admin/views/adminTabs/configure.html"}).state("viewForm.design",{url:"/design",templateUrl:"modules/forms/admin/views/adminTabs/design.html"}).state("viewForm.analyze",{url:"/analyze",templateUrl:"modules/forms/admin/views/adminTabs/analyze.html"}).state("viewForm.create",{url:"/create",templateUrl:"modules/forms/admin/views/adminTabs/create.html"})}]),angular.module("forms").directive("keyToOption",function(){return{restrict:"A",scope:{field:"="},link:function($scope,$element,$attrs,$select){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,index=parseInt(String.fromCharCode(keyCode))-1;index<$scope.field.fieldOptions.length&&(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue=$scope.field.fieldOptions[index].option_value}))})}}}),angular.module("forms").directive("keyToTruthy",["$rootScope",function($rootScope){return{restrict:"A",scope:{field:"="},link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode,truthyKeyCode=$attrs.keyCharTruthy.charCodeAt(0)-32,falseyKeyCode=$attrs.keyCharFalsey.charCodeAt(0)-32;keyCode===truthyKeyCode?(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue="true"})):keyCode===falseyKeyCode&&(event.preventDefault(),$scope.$apply(function(){$scope.field.fieldValue="false"}))})}}}]),angular.module("users").config(["$httpProvider",function($httpProvider){$httpProvider.interceptors.push(["$q","$location",function($q,$location){return{responseError:function(response){return"/users/me"!==$location.path()&&response.config&&"/users/me"!==response.config.url&&(console.log("intercepted rejection of ",response.config.url,response.status),401===response.status?(console.log($location.path()),$location.nextAfterLogin=$location.path(),$location.path("/signin")):403===response.status&&$location.path("/access_denied")),$q.reject(response)}}}])}]),angular.module("users").config(["$stateProvider",function($stateProvider){var checkLoggedin=function($q,$timeout,$state,User,Auth){var deferred=$q.defer();return Auth.currentUser&&Auth.currentUser.email?$timeout(deferred.resolve):Auth.currentUser=User.getCurrent(function(){Auth.login(),$timeout(deferred.resolve())},function(){Auth.logout(),$timeout(deferred.reject()),$state.go("signin",{reload:!0})}),deferred.promise};checkLoggedin.$inject=["$q","$timeout","$state","User","Auth"];var checkSignupDisabled=function($window,$timeout,$q){var deferred=$q.defer();return $timeout($window.signupDisabled?deferred.reject():deferred.resolve()),deferred.promise};checkSignupDisabled.$inject=["$window","$timeout","$q"],$stateProvider.state("profile",{resolve:{loggedin:checkLoggedin},url:"/settings/profile",templateUrl:"modules/users/views/settings/edit-profile.client.view.html"}).state("password",{resolve:{loggedin:checkLoggedin},url:"/settings/password",templateUrl:"modules/users/views/settings/change-password.client.view.html"}).state("accounts",{resolve:{loggedin:checkLoggedin},url:"/settings/accounts",templateUrl:"modules/users/views/settings/social-accounts.client.view.html"}).state("signup",{resolve:{isDisabled:checkSignupDisabled},url:"/signup",templateUrl:"modules/users/views/authentication/signup.client.view.html"}).state("signup-success",{resolve:{isDisabled:checkSignupDisabled},url:"/signup-success",templateUrl:"modules/users/views/authentication/signup-success.client.view.html"}).state("signin",{url:"/signin",templateUrl:"modules/users/views/authentication/signin.client.view.html"}).state("access_denied",{url:"/access_denied",templateUrl:"modules/users/views/authentication/access-denied.client.view.html"}).state("verify",{resolve:{isDisabled:checkSignupDisabled},url:"/verify/:token",templateUrl:"modules/users/views/verify/verify-account.client.view.html"}).state("resendVerifyEmail",{resolve:{isDisabled:checkSignupDisabled},url:"/verify",templateUrl:"modules/users/views/verify/resend-verify-email.client.view.html"}).state("forgot",{url:"/password/forgot",templateUrl:"modules/users/views/password/forgot-password.client.view.html"}).state("reset-invalid",{url:"/password/reset/invalid",templateUrl:"modules/users/views/password/reset-password-invalid.client.view.html"}).state("reset-success",{url:"/password/reset/success",templateUrl:"modules/users/views/password/reset-password-success.client.view.html"}).state("reset",{url:"/password/reset/:token",templateUrl:"modules/users/views/password/reset-password.client.view.html"})}]),angular.module("users").controller("AuthenticationController",["$scope","$location","$state","$rootScope","User","Auth",function($scope,$location,$state,$rootScope,User,Auth){$scope=$rootScope,$scope.credentials={},$scope.error="",$scope.signin=function(){$scope.credentials.email=$scope.credentials.username,User.login($scope.credentials).then(function(response){Auth.login(response),$scope.user=$rootScope.user=Auth.ensureHasCurrentUser(User),"home"!==$state.previous.name&&"verify"!==$state.previous.name&&""!==$state.previous.name?$state.go($state.previous.name):$state.go("listForms")},function(error){$rootScope.user=Auth.ensureHasCurrentUser(User),$scope.user=$rootScope.user,$scope.error=error,console.log("loginError: "+error)})},$scope.signup=function(){console.log($scope.credentials),User.signup($scope.credentials).then(function(response){console.log("signup-success"),$state.go("signup-success")},function(error){console.log("Error: "),console.log(error),error?($scope.error=error,console.log(error)):console.log("No response received")})}}]),angular.module("users").controller("PasswordController",["$scope","$stateParams","$state","User",function($scope,$stateParams,$state,User){$scope.error="",$scope.askForPasswordReset=function(){User.askForPasswordReset($scope.credentials).then(function(response){$scope.success=response.message,$scope.credentials=null},function(error){$scope.error=error,$scope.credentials=null})},$scope.resetUserPassword=function(){$scope.success=$scope.error=null,User.resetPassword($scope.passwordDetails,$stateParams.token).then(function(response){$scope.success=response.message,$scope.passwordDetails=null,$state.go("reset-success")},function(error){$scope.error=error.message||error,$scope.passwordDetails=null})}}]),angular.module("users").controller("SettingsController",["$scope","$rootScope","$http","$state","Users",function($scope,$rootScope,$http,$state,Users){$scope.user=$rootScope.user,$scope.hasConnectedAdditionalSocialAccounts=function(provider){for(var i in $scope.user.additionalProvidersData)return!0;return!1},$scope.isConnectedSocialAccount=function(provider){return $scope.user.provider===provider||$scope.user.additionalProvidersData&&$scope.user.additionalProvidersData[provider]},$scope.removeUserSocialAccount=function(provider){$scope.success=$scope.error=null,$http["delete"]("/users/accounts",{params:{provider:provider}}).success(function(response){$scope.success=!0,$scope.user=response}).error(function(response){$scope.error=response.message})},$scope.updateUserProfile=function(isValid){if(isValid){$scope.success=$scope.error=null;var user=new Users($scope.user);user.$update(function(response){$scope.success=!0,$scope.user=response},function(response){$scope.error=response.data.message})}else $scope.submitted=!0},$scope.changeUserPassword=function(){$scope.success=$scope.error=null,$http.post("/users/password",$scope.passwordDetails).success(function(response){$scope.success=!0,$scope.passwordDetails=null}).error(function(response){$scope.error=response.message})}}]),angular.module("users").controller("VerifyController",["$scope","$state","$rootScope","User","Auth","$stateParams",function($scope,$state,$rootScope,User,Auth,$stateParams){$scope.isResetSent=!1,$scope.credentials={},$scope.error="",$scope.resendVerifyEmail=function(){User.resendVerifyEmail($scope.credentials.email).then(function(response){console.log(response),$scope.success=response.message,$scope.credentials=null,$scope.isResetSent=!0},function(error){$scope.error=error,$scope.credentials.email=null,$scope.isResetSent=!1})},$scope.validateVerifyToken=function(){$stateParams.token&&(console.log($stateParams.token),User.validateVerifyToken($stateParams.token).then(function(response){console.log("Success: "+response.message),$scope.success=response.message,$scope.isResetSent=!0,$scope.credentials.email=null},function(error){console.log("Error: "+error.message),$scope.isResetSent=!1,$scope.error=error,$scope.credentials.email=null}))}}]),angular.module("users").factory("Auth",["$window",function($window){var userState={isLoggedIn:!1},service={_currentUser:null,get currentUser(){return this._currentUser},ensureHasCurrentUser:function(User){return service._currentUser&&service._currentUser.username?service._currentUser:$window.user?(service._currentUser=$window.user,service._currentUser):void User.getCurrent().then(function(user){return service._currentUser=user,userState.isLoggedIn=!0,$window.user=service._currentUser,service._currentUser},function(response){return userState.isLoggedIn=!1,service._currentUser=null,$window.user=null,console.log("User.getCurrent() err",response),null})},isAuthenticated:function(){return!!service._currentUser},getUserState:function(){return userState},login:function(new_user){userState.isLoggedIn=!0,service._currentUser=new_user},logout:function(){$window.user=null,userState.isLoggedIn=!1,service._currentUser=null}};return service}]),angular.module("users").service("Authorizer",["APP_PERMISSIONS","USER_ROLES",function(APP_PERMISSIONS,USER_ROLES){return function(user){return{canAccess:function(permissions){var i,len,permission;for(angular.isArray(permissions)||(permissions=[permissions]),i=0,len=permissions.length;len>i;i++){if(permission=permissions[i],null===APP_PERMISSIONS[permission])throw"Bad permission value";if(!user||!user.roles)return!1;switch(permission){case APP_PERMISSIONS.viewAdminSettings:case APP_PERMISSIONS.editAdminSettings:return user.roles.indexOf(USER_ROLES.admin)>-1;case APP_PERMISSIONS.viewPrivateForm:case APP_PERMISSIONS.editForm:return user.roles.indexOf(USER_ROLES.admin)>-1||user.roles.indexOf(USER_ROLES.normal)>-1}}return!1}}}}]),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function($window,$q,$timeout,$http,$state){var userService={getCurrent:function(){var deferred=$q.defer();return $http.get("/users/me").success(function(response){deferred.resolve(response)}).error(function(){deferred.reject("User's session has expired")}),deferred.promise},login:function(credentials){var deferred=$q.defer();return $http.post("/auth/signin",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},logout:function(){var deferred=$q.defer();return $http.get("/auth/signout").success(function(response){deferred.resolve(null)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},signup:function(credentials){var deferred=$q.defer();return $http.post("/auth/signup",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},resendVerifyEmail:function(_email){var deferred=$q.defer();return $http.post("/auth/verify",{email:_email}).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},validateVerifyToken:function(token){var validTokenRe=/^([A-Za-z0-9]{48})$/g;if(!validTokenRe.test(token))throw new Error("Error token: "+token+" is not a valid verification token");var deferred=$q.defer();return $http.get("/auth/verify/"+token).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error)}),deferred.promise},resetPassword:function(passwordDetails,token){var deferred=$q.defer();return $http.get("/auth/password/"+token,passwordDetails).success(function(response){deferred.resolve()}).error(function(error){deferred.reject(error.message||error)}),deferred.promise},askForPasswordReset:function(credentials){var deferred=$q.defer();return $http.post("/auth/forgot",credentials).success(function(response){deferred.resolve(response)}).error(function(error){deferred.reject(error.message||error)}),deferred.promise}};return userService}]),angular.module("users").factory("Users",["$resource",function($resource){return $resource("users",{},{update:{method:"PUT"}})}]),angular.module("forms").controller("AdminFormController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http","$uibModal","myForm",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http,$uibModal,myForm){$scope=$rootScope,$scope.animationsEnabled=!0,$scope.myform=myForm,$rootScope.saveInProgress=!1,CurrentForm.setForm($scope.myform),$scope.tabData=[{heading:"Create",route:"viewForm.create"},{heading:"Design",route:"viewForm.design"},{heading:"Configure",route:"viewForm.configure"},{heading:"Analyze",route:"viewForm.analyze"}],$scope.setForm=function(form){$scope.myform=form},$rootScope.resetForm=function(){$scope.myform=Forms.get({formId:$stateParams.formId})},$scope.openDeleteModal=function(){$scope.deleteModal=$uibModal.open({animation:$scope.animationsEnabled,templateUrl:"myModalContent.html",controller:"AdminFormController",resolve:{myForm:function(){return $scope.myform}}}),$scope.deleteModal.result.then(function(selectedItem){$scope.selected=selectedItem},function(){console.log("Modal dismissed at: "+new Date)})},$scope.cancelDeleteModal=function(){$scope.deleteModal&&$scope.deleteModal.dismiss("cancel")},$scope.removeCurrentForm=function(){if($scope.deleteModal&&$scope.deleteModal.opened){ +$scope.deleteModal.close();var form_id=$scope.myform._id;if(!form_id)throw new Error("Error - removeCurrentForm(): $scope.myform._id does not exist");$http["delete"]("/forms/"+form_id).success(function(data,status,headers){console.log("form deleted successfully"),$state.go("listForms",{},{reload:!0})}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}},$scope.update=$rootScope.update=function(updateImmediately,cb){var continueUpdate=!0;if(updateImmediately||(continueUpdate=!$rootScope.saveInProgress),continueUpdate){var err=null;updateImmediately||($rootScope.saveInProgress=!0),$scope.updatePromise=$http.put("/forms/"+$scope.myform._id,{form:$scope.myform}).then(function(response){$rootScope.myform=$scope.myform=response.data})["catch"](function(response){console.log("Error occured during form UPDATE.\n"),err=response.data})["finally"](function(){return updateImmediately||($rootScope.saveInProgress=!1),"function"==typeof cb?cb(err):void 0})}}}]),angular.module("forms").controller("ListFormsController",["$rootScope","$scope","$stateParams","$state","Forms","CurrentForm","$http",function($rootScope,$scope,$stateParams,$state,Forms,CurrentForm,$http){$scope=$rootScope,$scope.forms={},$scope.showCreateModal=!1,$scope.findAll=function(){Forms.query(function(_forms){$scope.myforms=_forms})},$scope.openCreateModal=function(){$scope.showCreateModal||($scope.showCreateModal=!0)},$scope.closeCreateModal=function(){$scope.showCreateModal&&($scope.showCreateModal=!1)},$scope.setForm=function(form){$scope.myform=form},$scope.goToWithId=function(route,id){$state.go(route,{formId:id},{reload:!0})},$scope.duplicateForm=function(form_index){var form=_.cloneDeep($scope.myforms[form_index]);delete form._id,$http.post("/forms",{form:form}).success(function(data,status,headers){$scope.myforms.splice(form_index+1,0,data)}).error(function(errorResponse){console.error(errorResponse),null===errorResponse&&($scope.error=errorResponse.data.message)})},$scope.createNewForm=function(){var form={};form.title=$scope.forms.createForm.title.$modelValue,form.language=$scope.forms.createForm.language.$modelValue,$scope.forms.createForm.$valid&&$scope.forms.createForm.$dirty&&$http.post("/forms",{form:form}).success(function(data,status,headers){console.log("new form created"),$scope.goToWithId("viewForm.create",data._id+"")}).error(function(errorResponse){console.error(errorResponse),$scope.error=errorResponse.data.message})},$scope.removeForm=function(form_index){if(form_index>=$scope.myforms.length||0>form_index)throw new Error("Error: form_index in removeForm() must be between 0 and "+$scope.myforms.length-1);$http["delete"]("/forms/"+$scope.myforms[form_index]._id).success(function(data,status,headers){console.log("form deleted successfully"),$scope.myforms.splice(form_index,1)}).error(function(error){console.log("ERROR: Form could not be deleted."),console.error(error)})}}]),_.mixin({removeDateFields:removeDateFieldsFunc}),angular.module("forms").directive("autoSaveForm",["$rootScope","$timeout",function($rootScope,$timeout){return{require:["^form"],restrict:"AE",link:function($scope,$element,$attrs,$ctrls){angular.element(document).ready(function(){var $formCtrl=$ctrls[0],savePromise=null;$rootScope.finishedRender=!1,$scope.$on("editFormFields Started",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!1}),$scope.$on("editFormFields Finished",function(ngRepeatFinishedEvent){$rootScope.finishedRender=!0}),$scope.anyDirtyAndTouched=function(form){var propCount=0;for(var prop in form)if(form.hasOwnProperty(prop)&&"$"!==prop[0]&&(propCount++,form[prop].$touched&&form[prop].$dirty))return!0;return!1};var debounceSave=function(){$rootScope.saveInProgress=!0,$rootScope[$attrs.autoSaveCallback](!0,function(err){err?(console.error("Error form data NOT persisted"),console.error(err)):($formCtrl.$setPristine(),$formCtrl.$setUntouched())})};$scope.$watch(function(newValue,oldValue){$rootScope.finishedRender&&$scope.anyDirtyAndTouched($scope.editForm)&&!$rootScope.saveInProgress&&debounceSave()}),$scope.$watch($attrs.autoSaveWatch,function(newValue,oldValue){newValue=angular.copy(newValue),oldValue=angular.copy(oldValue),newValue.form_fields=_.removeDateFields(newValue.form_fields),oldValue.form_fields=_.removeDateFields(oldValue.form_fields);var changedFields=!_.isEqual(oldValue.form_fields,newValue.form_fields)||!_.isEqual(oldValue.startPage,newValue.startPage),changedFieldMap=!1;oldValue.hasOwnProperty("plugins.oscarhost.settings.fieldMap")&&(changedFieldMap=!!oldValue.plugins.oscarhost.settings.fieldMap&&!_.isEqual(oldValue.plugins.oscarhost.settings.fieldMap,newValue.plugins.oscarhost.settings.fieldMap)),(newValue||oldValue)&&oldValue&&(0===oldValue.form_fields.length&&($rootScope.finishedRender=!0),$rootScope.finishedRender&&(changedFields&&!$formCtrl.$dirty||changedFieldMap)&&!$rootScope.saveInProgress?(savePromise&&($timeout.cancel(savePromise),savePromise=null),savePromise=$timeout(function(){debounceSave()})):$rootScope.finishedRender&&$rootScope.saveInProgress&&($rootScope.saveInProgress=!1))},!0)})}}}]),angular.module("forms").directive("configureFormDirective",["$rootScope","$http","Upload","CurrentForm",function($rootScope,$http,Upload,CurrentForm){return{templateUrl:"modules/forms/admin/views/directiveViews/form/configure-form.client.view.html",restrict:"E",scope:{myform:"=",user:"=",pdfFields:"@",formFields:"@"},controller:["$scope",function($scope){console.log($scope.myform),CurrentForm.getForm().plugins?CurrentForm.getForm().plugins.oscarhost.baseUrl&&($scope.oscarhostAPI=!0):$scope.oscarhostAPI=!1,$scope.log="",$scope.pdfLoading=!1,$scope.languages=$rootScope.languages,this._current_upload=null,$scope.resetForm=$rootScope.resetForm,$scope.update=$rootScope.update,this._unbindedPdfFields=$scope.pdfFields,$scope.cancelUpload=function(){this._current_upload.abort(),$scope.pdfLoading=!1,$scope.removePDF()},$scope.removePDF=function(){$scope.myform.pdf=null,$scope.myform.isGenerated=!1,$scope.myform.autofillPDFs=!1,console.log("form.pdf: "+$scope.myform.pdf+" REMOVED")},$scope.uploadPDF=function(file){file&&(console.log(file),Upload.upload({url:"/upload/pdf",data:{user:$scope.user,file:file}}).then(function(resp){var data=resp.data;$scope.log="file "+data.originalname+" uploaded as "+data.filename+". JSON: "+JSON.stringify(data)+"\n"+$scope.log,$scope.myform.pdf=angular.fromJson(angular.toJson(data)),$scope.pdfLoading=!1,console.log($scope.log),$scope.$$phase||$scope.$digest||$scope.$apply()},function(resp){$scope.pdfLoading=!1,console.log("Error occured during upload.\n"),console.log(resp.status)},function(evt){var progressPercentage=parseInt(100*evt.loaded/evt.total,10);$scope.log="progress: "+progressPercentage+"% "+evt.config.data.file.name+"\n"+$scope.log,console.log($scope.log),$scope.pdfLoading=!0}))}}]}}]),angular.module("forms").directive("editFormDirective",["$rootScope","FormFields",function($rootScope,FormFields){return{templateUrl:"modules/forms/admin/views/directiveViews/form/edit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$scope",function($scope){for(var field_ids=_($scope.myform.form_fields).pluck("_id"),i=0;i0){$scope.myform.plugins.oscarhost.settings.fieldMap||($scope.myform.plugins.oscarhost.settings.fieldMap={});var oscarhostFields=$scope.myform.plugins.oscarhost.settings.validFields,currentFields=_($scope.myform.plugins.oscarhost.settings.fieldMap).invert().keys().value();return $scope.myform.plugins.oscarhost.settings.fieldMap.hasOwnProperty(field_id)&&(currentFields=_(currentFields).difference($scope.myform.plugins.oscarhost.settings.fieldMap[field_id])),_(oscarhostFields).difference(currentFields).value()}return[]},$scope.dropzone={handle:" .handle",containment:".dropzoneContainer",cursor:"grabbing"},$scope.addNewField=function(modifyForm,fieldType){$scope.addField.lastAddedID++;for(var fieldTitle,i=0;i<$scope.addField.types.length;i++)if($scope.addField.types[i].name===fieldType){$scope.addField.types[i].lastAddedID++,fieldTitle=$scope.addField.types[i].value+$scope.addField.types[i].lastAddedID;break}var newField={title:fieldTitle,fieldType:fieldType,fieldValue:"",required:!0,disabled:!1,deletePreserved:!1};return modifyForm&&$scope.myform.form_fields.push(newField),newField},$scope.deleteField=function(field_index){var currFieldId=$scope.myform.form_fields[field_index]._id;$scope.myform.hasOwnProperty("plugins.oscarhost.baseUrl")&&delete $scope.myform.plugins.oscarhost.settings.fieldMap[currFieldId],$scope.myform.form_fields.splice(field_index,1)},$scope.duplicateField=function(field_index){var currField=_.cloneDeep($scope.myform.form_fields[field_index]);currField._id="cloned"+_.uniqueId(),currField.title+=" copy",$scope.myform.form_fields.splice(field_index+1,0,currField)},$scope.addButton=function(){var newButton={};newButton.bgColor="#ddd",newButton.color="#ffffff",newButton.text="Button",newButton._id=Math.floor(1e5*Math.random()),$scope.myform.startPage.buttons.push(newButton)},$scope.deleteButton=function(button){for(var currID,i=0;i<$scope.myform.startPage.buttons.length;i++)if(currID=$scope.myform.startPage.buttons[i]._id,console.log(currID),currID===button._id){$scope.myform.startPage.buttons.splice(i,1);break}},$scope.addOption=function(field_index){var currField=$scope.myform.form_fields[field_index];if(console.log(field_index),console.log(currField),"checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType){currField.fieldOptions||($scope.myform.form_fields[field_index].fieldOptions=[]);var lastOptionID=0;currField.fieldOptions[currField.fieldOptions.length-1]&&(lastOptionID=currField.fieldOptions[currField.fieldOptions.length-1].option_id);var newOption={option_id:Math.floor(1e5*Math.random()),option_title:"Option "+lastOptionID,option_value:"Option "+lastOptionID};$scope.myform.form_fields[field_index].fieldOptions.push(newOption)}},$scope.deleteOption=function(field_index,option){var currField=$scope.myform.form_fields[field_index];if("checkbox"===currField.fieldType||"dropdown"===currField.fieldType||"radio"===currField.fieldType)for(var i=0;i',restrict:"E",scope:{typeName:"@"},controller:["$scope",function($scope){var iconTypeMap={textfield:"fa fa-pencil-square-o",dropdown:"fa fa-th-list",date:"fa fa-calendar",checkbox:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",email:"fa fa-envelope-o",textarea:"fa fa-pencil-square",legal:"fa fa-legal",file:"fa fa-cloud-upload",rating:"fa fa-star-half-o",link:"fa fa-link",scale:"fa fa-sliders",stripe:"fa fa-credit-card",statement:"fa fa-quote-left",yes_no:"fa fa-toggle-on",number:"fa fa-slack"};$scope.typeIcon=iconTypeMap[$scope.typeName]}]}});var __indexOf=[].indexOf||function(item){for(var i=0,l=this.length;l>i;i++)if(i in this&&this[i]===item)return i;return-1};angular.module("forms").directive("fieldDirective",["$http","$compile","$rootScope","$templateCache","supportedFields",function($http,$compile,$rootScope,$templateCache,supportedFields){var getTemplateUrl=function(fieldType){var type=fieldType,templateUrl="modules/forms/base/views/directiveViews/field/";return __indexOf.call(supportedFields,type)>=0&&(templateUrl=templateUrl+type+".html"),$templateCache.get(templateUrl)};return{template:"
{{field.title}}
",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(scope,element){$rootScope.chooseDefaultOption=scope.chooseDefaultOption=function(type){"yes_no"===type?scope.field.fieldValue="true":"rating"===type?scope.field.fieldValue=0:"radio"===scope.field.fieldType?(console.log(scope.field),scope.field.fieldValue=scope.field.fieldOptions[0].option_value,console.log(scope.field.fieldValue)):"legal"===type&&(scope.field.fieldValue="true",$rootScope.nextField())},scope.setActiveField=$rootScope.setActiveField,"date"===scope.field.fieldType&&(scope.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var fieldType=scope.field.fieldType;if("number"===scope.field.fieldType||"textfield"===scope.field.fieldType||"email"===scope.field.fieldType||"link"===scope.field.fieldType){switch(scope.field.fieldType){case"textfield":scope.field.input_type="text";break;case"email":scope.field.input_type="email",scope.field.placeholder="joesmith@example.com";break;case"number":scope.field.input_type="text",scope.field.validateRegex=/^-?\d+$/;break;default:scope.field.input_type="url",scope.field.placeholder="http://example.com"}fieldType="textfield"}var template=getTemplateUrl(fieldType);element.html(template).show(),$compile(element.contents())(scope)}}}]),angular.module("forms").directive("onEnterKey",["$rootScope",function($rootScope){return{restrict:"A",link:function($scope,$element,$attrs){$element.bind("keydown keypress",function(event){var keyCode=event.which||event.keyCode;13!==keyCode||event.shiftKey||(event.preventDefault(),$rootScope.$apply(function(){$rootScope.$eval($attrs.onEnterKey)}))})}}}]),angular.module("forms").directive("onFinishRender",["$rootScope","$timeout",function($rootScope,$timeout){return{restrict:"A",link:function(scope,element,attrs){if(element.attr("ng-repeat")||element.attr("data-ng-repeat")){var broadcastMessage=attrs.onFinishRender||"ngRepeat";scope.$first&&!scope.$last?scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Started")}):scope.$last&&scope.$evalAsync(function(){$rootScope.$broadcast(broadcastMessage+" Finished")})}}}}]),angular.module("forms").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","Auth",function($http,TimeCounter,$filter,$rootScope,Auth){return{templateUrl:"modules/forms/base/views/directiveViews/form/submit-form.client.view.html",restrict:"E",scope:{myform:"="},controller:["$document","$window","$scope",function($document,$window,$scope){$scope.authentication=$rootScope.authentication,$scope.noscroll=!1,$scope.forms={};var form_fields_count=$scope.myform.visible_form_fields.filter(function(field){return"statement"!==field.fieldType&&"rating"!==field.fieldType}).length,nb_valid=$filter("formValidity")($scope.myform);$scope.translateAdvancementData={done:nb_valid,total:form_fields_count,answers_not_completed:form_fields_count-nb_valid},$scope.reloadForm=function(){$scope.myform.submitted=!1,$scope.myform.form_fields=_.chain($scope.myform.visible_form_fields).map(function(field){return field.fieldValue="",field}).value(),$scope.loading=!1,$scope.error="",$scope.selected={_id:"",index:0},$scope.setActiveField($scope.myform.visible_form_fields[0]._id,0,!1),TimeCounter.restartClock()},$window.onscroll=function(){$scope.scrollPos=document.body.scrollTop||document.documentElement.scrollTop||0;var elemBox=document.getElementsByClassName("activeField")[0].getBoundingClientRect();$scope.fieldTop=elemBox.top,$scope.fieldBottom=elemBox.bottom;var field_id,field_index;$scope.noscroll||($scope.selected.index===$scope.myform.visible_form_fields.length-1&&$scope.fieldBottom<200?(field_index=$scope.selected.index+1,field_id="submit_field",$scope.setActiveField(field_id,field_index,!1)):$scope.selected.index===$scope.myform.visible_form_fields.length?$scope.fieldTop>200&&(field_index=$scope.selected.index-1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):$scope.fieldBottom<0?(field_index=$scope.selected.index+1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)):0!==$scope.selected.index&&$scope.fieldTop>0&&(field_index=$scope.selected.index-1,field_id=$scope.myform.visible_form_fields[field_index]._id,$scope.setActiveField(field_id,field_index,!1)),$scope.$apply())},$rootScope.setDropdownOption=function(){console.log("setDropdownOption index: ")},$scope.setActiveField=$rootScope.setActiveField=function(field_id,field_index,animateScroll){if(null!==$scope.selected&&$scope.selected._id!==field_id){$scope.selected._id=field_id,$scope.selected.index=field_index;var nb_valid=$filter("formValidity")($scope.myform);$scope.translateAdvancementData={done:nb_valid,total:form_fields_count,answers_not_completed:form_fields_count-nb_valid},animateScroll?($scope.noscroll=!0,setTimeout(function(){$document.scrollToElement(angular.element(".activeField"),-10,200).then(function(){$scope.noscroll=!1,setTimeout(function(){document.querySelectorAll(".activeField .focusOn")[0]?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input")[0].focus()})})})):setTimeout(function(){document.querySelectorAll(".activeField .focusOn")[0]?document.querySelectorAll(".activeField .focusOn")[0].focus():document.querySelectorAll(".activeField input")[0].focus()})}},$rootScope.nextField=$scope.nextField=function(){var selected_index,selected_id;$scope.selected.index<$scope.myform.visible_form_fields.length-1?(selected_index=$scope.selected.index+1,selected_id=$scope.myform.visible_form_fields[selected_index]._id,$rootScope.setActiveField(selected_id,selected_index,!0)):$scope.selected.index===$scope.myform.visible_form_fields.length-1&&(selected_index=$scope.selected.index+1,selected_id="submit_field",$rootScope.setActiveField(selected_id,selected_index,!0))},$rootScope.prevField=$scope.prevField=function(){if($scope.selected.index>0){var selected_index=$scope.selected.index-1,selected_id=$scope.myform.visible_form_fields[selected_index]._id;$scope.setActiveField(selected_id,selected_index,!0)}},$scope.exitStartPage=function(){$scope.myform.startPage.showStart=!1,$scope.myform.visible_form_fields.length>0&&($scope.selected._id=$scope.myform.visible_form_fields[0]._id)},$scope.goToInvalid=function(){document.querySelectorAll(".ng-invalid.focusOn")[0].focus()},$scope.submitForm=function(){var _timeElapsed=TimeCounter.stopClock();$scope.loading=!0;var form=_.cloneDeep($scope.myform);form.timeElapsed=_timeElapsed,form.percentageComplete=$filter("formValidity")($scope.myform)/$scope.myform.visible_form_fields.length*100,delete form.visible_form_fields,setTimeout(function(){$scope.submitPromise=$http.post("/forms/"+$scope.myform._id,form).success(function(data,status,headers){$scope.myform.submitted=!0,$scope.loading=!1}).error(function(error){$scope.loading=!1,$scope.error=error.message})},500)},$scope.reloadForm()}]}}]),angular.module("forms").service("CurrentForm",function(){var _form={};this.getForm=function(){return _form},this.setForm=function(form){_form=form}}),angular.module("forms").factory("Forms",["$resource","FORM_URL",function($resource,FORM_URL){return $resource(FORM_URL,{formId:"@_id"},{query:{method:"GET",isArray:!0},get:{method:"GET",transformResponse:function(data,header){var form=angular.fromJson(data);return form.visible_form_fields=_.filter(form.form_fields,function(field){return field.deletePreserved===!1}),form}},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("forms").service("TimeCounter",[function(){var _startTime,_endTime,that=this;this.timeSpent=0,this.restartClock=function(){_startTime=Date.now(),_endTime=_startTime},this.stopClock=function(){return _startTime?(_endTime=Date.now(),that.timeSpent=Math.abs(_endTime.valueOf()-_startTime.valueOf())/1e3,that.timeSpent):new Error("Clock has not been started")},this.clockStarted=function(){return!!this._startTime}}]); +>>>>>>> fix docker From c71a9eeeac602860cf27f31b5f0e15eeee574664 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 8 Jun 2016 20:03:35 +0200 Subject: [PATCH 38/42] fake SendVisitorDataProvider --- public/modules/forms/base/demo/boot.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/modules/forms/base/demo/boot.js b/public/modules/forms/base/demo/boot.js index 5d808911..23c5b86c 100644 --- a/public/modules/forms/base/demo/boot.js +++ b/public/modules/forms/base/demo/boot.js @@ -49,6 +49,9 @@ angular.module('forms').factory('myForm', ['Forms', function(Forms) { }]); angular.module('forms').constant('FORM_URL', '/form/:formId'); +angular.module('forms').value('SendVisitorData', { + send: function(){} +}); angular.element(document).ready(function() { //Then init the app From 677b9abb6f3b563316b777ddb73e84245c31db2f Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 8 Jun 2016 20:15:14 +0200 Subject: [PATCH 39/42] add spanish --- .../modules/forms/base/config/i18n/spanish.js | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 public/modules/forms/base/config/i18n/spanish.js diff --git a/public/modules/forms/base/config/i18n/spanish.js b/public/modules/forms/base/config/i18n/spanish.js new file mode 100644 index 00000000..76e928ca --- /dev/null +++ b/public/modules/forms/base/config/i18n/spanish.js @@ -0,0 +1,35 @@ +'use strict'; + +angular.module('forms').config(['$translateProvider', function ($translateProvider) { + + $translateProvider.translations('spanish', { + FORM_SUCCESS: '¡El formulario ha sido enviado con éxito!', + REVIEW: 'Revisar', + BACK_TO_FORM: 'Regresar al formulario', + EDIT_FORM: '', + CREATE_FORM: '', + ADVANCEMENT: '{{done}} de {{total}} contestadas', + CONTINUE_FORM: 'Continuar al formulario', + REQUIRED: 'Información requerida', + COMPLETING_NEEDED: '{{answers_not_completed}} respuesta(s) necesita(n) ser completada(s)', + OPTIONAL: 'Opcional', + ERROR_EMAIL_INVALID: 'Favor de proporcionar un correo electrónico válido', + ERROR_NOT_A_NUMBER: 'Por favor, introduzca sólo números válidos', + ERROR_URL_INVALID: 'Favor de proporcionar un url válido', + OK: 'OK', + ENTER: 'pulse INTRO', + YES: 'Si', + NO: 'No', + NEWLINE: 'presione SHIFT+INTRO para crear una nueva línea', + CONTINUE: 'Continuar', + LEGAL_ACCEPT: 'I accept', + LEGAL_NO_ACCEPT: 'I don’t accept', + DELETE: 'Eliminar', + CANCEL: 'Cancelar', + SUBMIT: 'Registrar', + UPLOAD_FILE: 'Cargar el archivo', + Y: 'S', + N: 'N' + }); + +}]); From 68a46dafa198b464c1274a223984fb30deca83ff Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 8 Jun 2016 20:17:40 +0200 Subject: [PATCH 40/42] add german --- .../modules/forms/base/config/i18n/german.js | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 public/modules/forms/base/config/i18n/german.js diff --git a/public/modules/forms/base/config/i18n/german.js b/public/modules/forms/base/config/i18n/german.js new file mode 100644 index 00000000..17f074b0 --- /dev/null +++ b/public/modules/forms/base/config/i18n/german.js @@ -0,0 +1,35 @@ +'use strict'; + +angular.module('forms').config(['$translateProvider', function ($translateProvider) { + + $translateProvider.translations('spanish', { + FORM_SUCCESS: 'Ihre Angaben wurden gespeichert.', + REVIEW: 'Unvollständig', + BACK_TO_FORM: 'Zurück zum Formular', + EDIT_FORM: '', + CREATE_FORM: '', + ADVANCEMENT: '{{done}} von {{total}} beantwortet', + CONTINUE_FORM: 'Zum Formular', + REQUIRED: 'verpflichtend', + COMPLETING_NEEDED: 'Es fehlen/fehtl noch {{answers_not_completed}} Antwort(en)', + OPTIONAL: 'fakultativ', + ERROR_EMAIL_INVALID: 'Bitte gültige Mailadresse eingeben', + ERROR_NOT_A_NUMBER: 'Bitte nur Zahlen eingeben', + ERROR_URL_INVALID: 'Bitte eine gültige URL eingeben', + OK: 'Okay', + ENTER: 'Eingabetaste drücken', + YES: 'Ja', + NO: 'Nein', + NEWLINE: 'Für eine neue Zeile SHIFT+ENTER drücken', + CONTINUE: 'Weiter', + LEGAL_ACCEPT: 'I accept', + LEGAL_NO_ACCEPT: 'I don’t accept', + DELETE: 'Entfernen', + CANCEL: 'Canceln', + SUBMIT: 'Speichern', + UPLOAD_FILE: 'Datei versenden', + Y: 'J', + N: 'N', + }); + +}]); From a7fbe9ac6ae30352b38e47c965881b2cdc234f2e Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 8 Jun 2016 20:19:04 +0200 Subject: [PATCH 41/42] add italian --- .../modules/forms/base/config/i18n/italian.js | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 public/modules/forms/base/config/i18n/italian.js diff --git a/public/modules/forms/base/config/i18n/italian.js b/public/modules/forms/base/config/i18n/italian.js new file mode 100644 index 00000000..4cf28622 --- /dev/null +++ b/public/modules/forms/base/config/i18n/italian.js @@ -0,0 +1,35 @@ +'use strict'; + +angular.module('forms').config(['$translateProvider', function ($translateProvider) { + + $translateProvider.translations('italian', { + FORM_SUCCESS: 'Il formulario è stato inviato con successo!', + REVIEW: 'Incompleto', + BACK_TO_FORM: 'Ritorna al formulario', + EDIT_FORM: '', + CREATE_FORM: '', + ADVANCEMENT: '{{done}} su {{total}} completate', + CONTINUE_FORM: 'Vai al formulario', + REQUIRED: 'obbligatorio', + COMPLETING_NEEDED: '{{answers_not_completed}} risposta/e deve/ono essere completata/e', + OPTIONAL: 'opzionale', + ERROR_EMAIL_INVALID: 'Si prega di inserire un indirizzo email valido', + ERROR_NOT_A_NUMBER: 'Si prega di inserire solo numeri', + ERROR_URL_INVALID: 'Grazie per inserire un URL valido', + OK: 'OK', + ENTER: 'premere INVIO', + YES: 'Sì', + NO: 'No', + NEWLINE: 'premere SHIFT+INVIO per creare una nuova linea', + CONTINUE: 'Continua', + LEGAL_ACCEPT: 'I accept', + LEGAL_NO_ACCEPT: 'I don’t accept', + DELETE: 'Cancella', + CANCEL: 'Reset', + SUBMIT: 'Registra', + UPLOAD_FILE: 'Invia un file', + Y: 'S', + N: 'N', + }); + +}]); From 08d0093851c35892e3ab391b4b01a337a999daec Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 8 Jun 2016 20:19:37 +0200 Subject: [PATCH 42/42] typo --- public/modules/forms/base/config/i18n/german.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/modules/forms/base/config/i18n/german.js b/public/modules/forms/base/config/i18n/german.js index 17f074b0..c9f5c33f 100644 --- a/public/modules/forms/base/config/i18n/german.js +++ b/public/modules/forms/base/config/i18n/german.js @@ -2,7 +2,7 @@ angular.module('forms').config(['$translateProvider', function ($translateProvider) { - $translateProvider.translations('spanish', { + $translateProvider.translations('german', { FORM_SUCCESS: 'Ihre Angaben wurden gespeichert.', REVIEW: 'Unvollständig', BACK_TO_FORM: 'Zurück zum Formular',