From 3315f8133c35a8e493fc8c82e246f8f1804b1320 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 5 May 2016 22:12:40 +0300 Subject: [PATCH] make it work --- app/views/layout.server.view.html | 10 +- bower.json | 3 +- config/config.js | 33 +- config/env/all.js | 31 +- config/env/production.js | 2 +- docker-compose.yml | 4 + gruntfile.js | 16 +- public/dist/application.js | 4433 +++++++++++------ public/dist/application.min.js | 11 +- .../configure-form.client.directive.js | 2 +- .../directives/edit-form.client.directive.js | 2 +- .../edit-submissions-form.client.directive.js | 2 +- .../admin/views/admin-form.client.view.html | 10 +- public/modules/forms/base/bower.json | 1 + public/modules/forms/base/demo/boot.js | 6 +- public/modules/forms/base/demo/index.html | 29 +- .../forms/config/forms.client.routes.js | 12 +- public/modules/forms/forms.client.module.js | 5 +- 18 files changed, 2997 insertions(+), 1615 deletions(-) diff --git a/app/views/layout.server.view.html b/app/views/layout.server.view.html index f90b12b5..54fbc79a 100755 --- a/app/views/layout.server.view.html +++ b/app/views/layout.server.view.html @@ -41,7 +41,7 @@ - + @@ -70,7 +70,7 @@
{% block content %}{% endblock %}
- + - + {% for jsFile in jsFiles %} @@ -114,7 +114,7 @@

Yes, upgrade my browser!

- + - + diff --git a/bower.json b/bower.json index 2aa73d21..db300cb6 100755 --- a/bower.json +++ b/bower.json @@ -33,7 +33,8 @@ "angular-busy": "^4.1.3", "angular-input-stars": "https://github.com/whitef0x0/angular-input-stars.git#master", "raven-js": "^3.0.4", - "tableExport.jquery.plugin": "^1.5.1" + "tableExport.jquery.plugin": "^1.5.1", + "angular-translate": "~2.11.0" }, "resolutions": { "angular-bootstrap": "^0.14.0", diff --git a/config/config.js b/config/config.js index 7c9b7eb4..47caf459 100755 --- a/config/config.js +++ b/config/config.js @@ -4,7 +4,7 @@ * Module dependencies. */ var _ = require('lodash'), - glob = require('glob'), + gruntFile = require('grunt').file, bowerFiles = require('main-bower-files'), path = require('path'), fs = require('fs'); @@ -40,36 +40,15 @@ if( fs.existsSync('./config/env/api_keys.js') ){ * Get files by glob patterns */ module.exports.getGlobbedFiles = function(globPatterns, removeRoot) { - // For context switching - var _this = this; - // URL paths regex - var urlRegex = new RegExp('^(?:[a-z]+:)?\/\/', 'i'); - - // The output array - var output = []; - - // If glob pattern is array so we use each pattern in a recursive way, otherwise we use glob - if (_.isArray(globPatterns)) { - globPatterns.forEach(function(globPattern) { - output = _.union(output, _this.getGlobbedFiles(globPattern, removeRoot)); + var files = gruntFile.expand(globPatterns); + if (removeRoot) { + files = files.map(function(file) { + return file.replace(removeRoot, ''); }); - } else if (_.isString(globPatterns)) { - if (urlRegex.test(globPatterns)) { - output.push(globPatterns); - } else { - var files = glob.sync(globPatterns); - if (removeRoot) { - files = files.map(function(file) { - return file.replace(removeRoot, ''); - }); - } - - output = _.union(output, files); - } } - return output; + return files; }; module.exports.removeRootDir = function(files, root) { diff --git a/config/env/all.js b/config/env/all.js index a7a9f948..4125442e 100755 --- a/config/env/all.js +++ b/config/env/all.js @@ -69,27 +69,42 @@ module.exports = { }, assets: { css: [ - 'public/modules/**/css/*.css' + 'public/modules/**/css/*.css', + '!public/modules/**/demo/**/*.css', + '!public/modules/**/dist/**/*.css', + '!public/modules/**/node_modules/**/*.css' ], js: [ 'public/dist/populate_template_cache.js', - 'public/config.js', - 'public/application.js', + 'public/config.js', + 'public/application.js', + 'public/*.js', 'public/modules/*/*.js', - 'public/modules/*/*[!tests]*/*.js' + 'public/modules/*/*/*.js', + 'public/modules/**/*.js', + '!public/modules/**/gruntfile.js', + '!public/modules/**/demo/**/*.js', + '!public/modules/**/dist/**/*.js', + '!public/modules/**/node_modules/**/*.js', + '!public/modules/**/tests/**/*.js' ], views: [ - 'public/modules/*/views/*.html', - 'public/modules/*/views/*/*.html', - 'public/modules/*/views/*/*/*.html', + 'public/modules/**/*.html', + '!public/modules/**/demo/**/*.html', + '!public/modules/**/dist/**/*.html', + '!public/modules/**/node_modules/**/*.html', + '!public/modules/**/tests/**/*.html' ], unit_tests: [ 'public/lib/angular-mocks/angular-mocks.js', - 'public/modules/*/tests/unit/*.js', 'public/modules/*/tests/unit/**/*.js', + '!public/modules/**/demo/**/*.js', + '!public/modules/**/node_modules/**/*.js' ], e2e_tests: [ 'public/modules/*/tests/e2e/**.js', + '!public/modules/**/demo/**/*.js', + '!public/modules/**/node_modules/**/*.js' ] } }; diff --git a/config/env/production.js b/config/env/production.js index c60edf43..f4622f17 100755 --- a/config/env/production.js +++ b/config/env/production.js @@ -3,7 +3,7 @@ module.exports = { baseUrl: process.env.BASE_URL || 'tellform.com', db: { - uri: process.env.MONGOHQ_URL || process.env.MONGOLAB_URI || 'mongodb://' + (process.env.DB_1_PORT_27017_TCP_ADDR || 'localhost') + '/mean', + uri: process.env.MONGOHQ_URL || process.env.MONGOLAB_URI || 'mongodb://' + (process.env.DB_1_PORT_27017_TCP_ADDR || '192.168.99.100:27017') + '/mean', options: { user: '', pass: process.env.MONGOLAB_PASS || '' diff --git a/docker-compose.yml b/docker-compose.yml index a2fc97bb..6a493e95 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,6 +3,10 @@ version: '2' services: db: image: mongo:3.2 + ports: + - "27017:27017" + volumes: + - mongo-data-wt:/data/db web: build: . volumes: diff --git a/gruntfile.js b/gruntfile.js index fdf35e2a..8fa71f72 100755 --- a/gruntfile.js +++ b/gruntfile.js @@ -7,16 +7,20 @@ module.exports = function(grunt) { // Unified Watch Object var watchFiles = { + 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', '!public/modules/**/demo/**/*.js', '!public/modules/**/dist/**/*.js', '!public/modules/**/lib/**/*.js'], - clientCSS: ['public/modules/**/*.css'], + + 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'], + serverTests: ['app/tests/**/*.js'], - clientTests: ['public/modules/**/tests/*.js'], - allTests: ['public/modules/**/tests/*.js', 'app/tests/**/*.js'], + clientTests: ['public/modules/**/tests/*.js', '!public/modules/**/demo/**/*.js', '!public/modules/**/dist/**/*.js', '!public/modules/**/node_modules/**/*.js'] }; + watchFiles.allTests = watchFiles.serverTests.concat(watchFiles.clientTests); + // Project Configuration grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), @@ -234,7 +238,7 @@ module.exports = function(grunt) { }, html2js: { options: { - base: 'NodeForm', + base: 'public', watch: true, module: 'NodeForm.templates', singleModule: true, diff --git a/public/dist/application.js b/public/dist/application.js index 72ef30d2..770f1c94 100644 --- a/public/dist/application.js +++ b/public/dist/application.js @@ -1,10 +1,16 @@ angular.module('NodeForm.templates', []).run(['$templateCache', function($templateCache) { "use strict"; +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c $templateCache.put("../public/modules/core/views/header.client.view.html", "
"); $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("../public/modules/forms/views/admin-form.client.view.html", + $templateCache.put("modules/forms/admin/views/admin-form.client.view.html", "
"); $templateCache.put("../public/modules/forms/views/list-forms.client.view.html", +======= + "

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

Create a new form
Name
Language

Created on
"); - $templateCache.put("../public/modules/forms/views/submit-form.client.view.html", + $templateCache.put("modules/forms/base/views/submit-form.client.view.html", "
"); - $templateCache.put("../public/modules/forms/views/adminTabs/analyze.html", + $templateCache.put("modules/forms/admin/views/adminTabs/analyze.html", ""); - $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", @@ -71,6 +83,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
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
"); }]); @@ -367,6 +430,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) { @@ -435,6 +500,7 @@ angular.element(document).ready(function() { angular.bootstrap(document, [ApplicationConfiguration.applicationModuleName]); }); +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c 'use strict'; // Use Application configuration module to register a new module @@ -655,6 +721,641 @@ angular.module('core').service('Menus', [ this.menus[menuId].items.splice(itemIndex, 1); } } +======= +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; + } +]); + +'use strict'; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + $scope.tabData = [ + { + heading: 'Create', + route: 'viewForm.create' + }, + { + heading: 'Design', + route: 'viewForm.design' + }, + { + heading: 'Configure', + route: 'viewForm.configure' + }, + { + heading: 'Analyze', + route: 'viewForm.analyze' + } + ]; +======= +//Menu service used for managing menus +angular.module('core').service('Menus', [ +>>>>>>> make it work + + function() { + // Define a set of default roles + this.defaultRoles = ['*']; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + /* + ** DeleteModal Functions + */ + $scope.openDeleteModal = function(){ + $scope.deleteModal = $uibModal.open({ + animation: $scope.animationsEnabled, + templateUrl: 'myModalContent.html', + controller: 'AdminFormController', + resolve: { + myForm: function(){ + return $scope.myform; +======= + // 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 + $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}); +======= + // 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 + 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; +======= + // 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 + $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]; @@ -731,17 +1432,26 @@ angular.module('forms').run(['Menus', // 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/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 }, @@ -755,7 +1465,7 @@ angular.module('forms').config(['$stateProvider', controllerAs: 'ctrl' }).state('viewForm', { url: '/forms/:formId/admin', - templateUrl: 'modules/forms/views/admin-form.client.view.html', + templateUrl: 'modules/forms/admin/views/admin-form.client.view.html', data: { permissions: [ 'editForm' ] }, @@ -768,272 +1478,22 @@ angular.module('forms').config(['$stateProvider', controller: 'AdminFormController' }).state('viewForm.configure', { url: '/configure', - templateUrl: 'modules/forms/views/adminTabs/configure.html' + templateUrl: 'modules/forms/admin/views/adminTabs/configure.html' }).state('viewForm.design', { url: '/design', - templateUrl: 'modules/forms/views/adminTabs/design.html' + templateUrl: 'modules/forms/admin/views/adminTabs/design.html' }).state('viewForm.analyze', { url: '/analyze', - templateUrl: 'modules/forms/views/adminTabs/analyze.html', + templateUrl: 'modules/forms/admin/views/adminTabs/analyze.html', }).state('viewForm.create', { url: '/create', - templateUrl: 'modules/forms/views/adminTabs/create.html' + templateUrl: 'modules/forms/admin/views/adminTabs/create.html' }); +>>>>>>> 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) { - - $scope = $rootScope; - $scope.animationsEnabled = true; - $scope.myform = myForm; - $rootScope.saveInProgress = false; - - 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 - }); - }; - - /* - ** DeleteModal Functions - */ - $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(){ - if($scope.deleteModal){ - $scope.deleteModal.dismiss('cancel'); - } - }; - - // 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; - } - - } -]); -'use strict'; - - -function removeDateFieldsFunc(o) { - var clone = _.clone(o); - function eachObject(v,k){ - - if(k === 'lastModified' || k === 'created'){ - delete clone[k]; - } - } - +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c for(var i=0; i>>>>>> make it work - $rootScope.finishedRender = false; - $scope.$on('editFormFields Started', function(ngRepeatFinishedEvent) { - // console.log('hello'); - $rootScope.finishedRender = false; - }); - $scope.$on('editFormFields Finished', function(ngRepeatFinishedEvent) { - $rootScope.finishedRender = true; - }); +// 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'); + } + } - $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; - }; + } + return $q.reject(response); + } + }; + }]); +}]); +'use strict'; - var debounceSave = function () { - $rootScope.saveInProgress = true; +// Setting up route +angular.module('users').config(['$stateProvider', + function($stateProvider) { +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c $rootScope[$attrs.autoSaveCallback](true, function(err){ if(!err){ @@ -1102,1227 +1571,32 @@ angular.module('forms').directive('autoSaveForm', ['$rootScope', '$timeout', fun //console.log('introParagraphStartPage.$dirty AFTER: '+$scope.editForm.introParagraphStartPage.$dirty); } }); - - //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; - - if(oldValue.hasOwnProperty('plugins.oscarhost.settings.fieldMap')){ - changedFieldMap = !!oldValue.plugins.oscarhost.settings.fieldMap && !_.isEqual(oldValue.plugins.oscarhost.settings.fieldMap,newValue.plugins.oscarhost.settings.fieldMap); - } - - //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; - } - - 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); - }); - } - }; - -}]); - -'use strict'; - -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); - 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; - - this._current_upload = null; - $scope.resetForm = $rootScope.resetForm; - $scope.update = $rootScope.update; - - this._unbindedPdfFields = $scope.pdfFields; - - //DAVID: TODO: finish this so we can create a Form.pdfFieldMap - // $scope.getUnbindedPdfFields = function(fieldType){ - // this._unbindedPdfFields = $scope.pdfFields - // } - - //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) { - - 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/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]); - } - - //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); - }; - - // 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 = 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; - } - }; - - }] - - }; - } -]); - -'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); - - // 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', - function($http, $compile, $rootScope, $templateCache) { - - var getTemplateUrl = function(fieldType) { - var type = fieldType; - var templateUrl = 'modules/forms/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) { - templateUrl = templateUrl+type+'.html'; - } - return $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) { - 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.setActiveField = $rootScope.setActiveField; - - //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 fieldType = scope.field.fieldType; - - 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); - } - }; -}]); - -'use strict'; - -angular.module('forms').directive('keyToOption', function(){ - return { - restrict: 'AE', - transclude: true, - 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; - if($attrs.type === 'dropdown'){ - $select.selected.option_value = $scope.field.fieldOptions[index].option_value; - } - console.log($scope); - }); - } - - }); - } - }; -}); - -'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'; - -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 && !event.shiftKey) { - event.preventDefault(); - $rootScope.$apply(function() { - $rootScope.$eval($attrs.onEnterKey); - }); - } - }); - } - }; -}]); - -'use strict'; - -angular.module('forms').directive('onFinishRender', ["$rootScope", "$timeout", function ($rootScope, $timeout) { - return { - restrict: 'A', - link: function (scope, element, attrs) { - - //Don't do anything if we don't have a ng-repeat on the current element - if(!element.attr('ng-repeat') && !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/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 = {}; - $scope.form_fields_count = $scope.myform.visible_form_fields.filter(function(field){ - if(field.fieldType === 'statement' || field.fieldType === 'rating'){ - return false; - } - return true; - }).length; - - $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(); - }; - - $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; - - //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); - } - //console.log('$scope.selected.index: '+$scope.selected.index); - //console.log('scroll pos: '+$scope.scrollPos+' fieldTop: '+$scope.fieldTop+' fieldBottom: '+$scope.fieldBottom); - $scope.$apply(); - } - }; - - $rootScope.setDropdownOption = function(){ - console.log('setDropdownOption index: '); - }; - - /* - ** 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; - - if(animateScroll){ - $scope.noscroll=true; - setTimeout(function() { - $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(); - } - }); - }); - }); - }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.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.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); - } - }; - - $rootScope.prevField = $scope.prevField = function(){ - if($scope.selected.index > 0){ - var selected_index = $scope.selected.index - 1; - var selected_id = $scope.myform.visible_form_fields[selected_index]._id; - $scope.setActiveField(selected_id, selected_index, true); - } - }; - - /* - ** Form Display Functions - */ - $scope.exitStartPage = function(){ - $scope.myform.startPage.showStart = false; - if($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 = true; - 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) { - //console.log('form submitted successfully'); - - $scope.myform.submitted = true; - $scope.loading = false; - }) - .error(function (error) { - $scope.loading = false; - //console.log(error); - $scope.error = error.message; - }); - }, 500); - }; - - //Reload our form - $scope.reloadForm(); - }] - }; - } -]); - -'use strict'; - -//Forms service used for communicating with the forms REST endpoints -angular.module('forms').service('CurrentForm', - function(){ - - //Private variables - var _form = {}; - - //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' - } - ]; - } - -]); - -'use strict'; - -//Forms service used for communicating with the forms REST endpoints -angular.module('forms').factory('Forms', ['$resource', - function($resource) { - return $resource('/forms/:formId', { - 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'; - -//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'; - -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; - }; - - } -]); -'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) { - 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'; - -// 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)); + // console.log(Auth.ensureHasCurrentUser(User)); +>>>>>>> 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('signin', {reload: true}); - }); + 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"]; - 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', { @@ -2346,17 +1620,12 @@ 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' }). @@ -2368,20 +1637,16 @@ angular.module('users').config(['$stateProvider', 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('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' @@ -2400,15 +1665,37 @@ 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; @@ -2427,6 +1714,23 @@ angular.module('users').controller('AuthenticationController', ['$scope', '$loca $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); } @@ -2455,6 +1759,7 @@ angular.module('users').controller('AuthenticationController', ['$scope', '$loca } ]); +>>>>>>> make it work 'use strict'; @@ -2562,9 +1867,24 @@ angular.module('users').controller('SettingsController', ['$scope', '$rootScope' }); }; +<<<<<<< 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) { @@ -2616,8 +1936,41 @@ angular.module('users').controller('VerifyController', ['$scope', '$state', '$ro ]); '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 @@ -2684,11 +2037,27 @@ angular.module('users').factory('Auth', ['$window', }; 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 + */ + $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 { @@ -2715,6 +2084,7 @@ angular.module('users').service('Authorizer', ["APP_PERMISSIONS", "USER_ROLES", return false; } } +>>>>>>> make it work return false; } @@ -2726,9 +2096,37 @@ angular.module('users').service('Authorizer', ["APP_PERMISSIONS", "USER_ROLES", angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', '$state', function($window, $q, $timeout, $http, $state) { +<<<<<<< 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 + }; + // 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; + }; +======= var userService = { getCurrent: function() { var deferred = $q.defer(); +>>>>>>> make it work $http.get('/users/me') .success(function(response) { @@ -2742,12 +2140,22 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' }, 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; }, @@ -2801,8 +2209,19 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' 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'){ + if(!currField.fieldOptions) $scope.myform.form_fields[field_index].fieldOptions = []; +======= return deferred.promise; }, +>>>>>>> make it work resetPassword: function(passwordDetails, token) { @@ -2816,8 +2235,16 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' return deferred.promise; }, +<<<<<<< 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) { @@ -2840,6 +2267,12 @@ angular.module('users').factory('User', ['$window', '$q', '$timeout', '$http', ' 'use strict'; +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + }] + + }; + } +======= // Users service used for communicating with the users REST endpoint angular.module('users').factory('Users', ['$resource', function($resource) { @@ -2849,4 +2282,1962 @@ angular.module('users').factory('Users', ['$resource', } }); } +>>>>>>> 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) { + + $scope = $rootScope; + $scope.animationsEnabled = true; + $scope.myform = myForm; + $rootScope.saveInProgress = false; + + 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 + }); + }; + + /* + ** DeleteModal Functions + */ + $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(){ + if($scope.deleteModal){ + $scope.deleteModal.dismiss('cancel'); + } + }; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + // 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'); + +<<<<<<< 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)) ); + }) + .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}); + + }).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}, + 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' + }; + + 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); + */ + }; +======= + // 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'; + +// 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; + }); + }; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + var getTemplateUrl = function(fieldType) { + var type = fieldType; + var templateUrl = 'modules/forms/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) { + templateUrl = templateUrl+type+'.html'; + } + 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; + } + }; + + $scope.setForm = function (form) { + $scope.myform = form; + }; + $scope.goToWithId = function(route, id) { + $state.go(route, {'formId': id}, {reload: true}); + }; +>>>>>>> make it work + + $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'; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +angular.module('forms').directive('keyToOption', function(){ + return { + restrict: 'AE', + transclude: true, + 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; + if($attrs.type === 'dropdown'){ + $select.selected.option_value = $scope.field.fieldOptions[index].option_value; + } + console.log($scope); + }); + } + + }); + } + }; +}); + +'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'; + +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 && !event.shiftKey) { + event.preventDefault(); + $rootScope.$apply(function() { + $rootScope.$eval($attrs.onEnterKey); + }); + } + }); + } + }; +}]); +======= + +function removeDateFieldsFunc(o) { + var clone = _.clone(o); + function eachObject(v,k){ + + if(k === 'lastModified' || k === 'created'){ + delete clone[i][k]; + } + } +>>>>>>> make it work + + for(var i=0; i 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 ); + // 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; + } + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + $rootScope.setDropdownOption = function(){ + console.log('setDropdownOption index: '); + }; + + /* + ** 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); +======= + }, true); + }); + } + }; + +}]); + +'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() { + $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(); + } + }); + }); + }); + }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.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.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); + } + }; + + $rootScope.prevField = $scope.prevField = function(){ + if($scope.selected.index > 0){ + var selected_index = $scope.selected.index - 1; + var selected_id = $scope.myform.visible_form_fields[selected_index]._id; + $scope.setActiveField(selected_id, selected_index, true); + } + }; + + /* + ** Form Display Functions + */ + $scope.exitStartPage = function(){ + $scope.myform.startPage.showStart = false; + if($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 = true; + var form = _.cloneDeep($scope.myform); + form.timeElapsed = _timeElapsed; +======= + this._unbindedPdfFields = $scope.pdfFields; + + //DAVID: TODO: finish this so we can create a Form.pdfFieldMap + // $scope.getUnbindedPdfFields = function(fieldType){ + // this._unbindedPdfFields = $scope.pdfFields + // } + + //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 + }] + }; + } +]); + +'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){ + + 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){ + + // 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 + */ + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c +// 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'; +======= + // 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); + }; + + // 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) { + $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); + + 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) { + $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' + }). + 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' + }); + } +======= + /* + ** 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('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: [] + }; + + /* + ** 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); + + // 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); + }; + + return { + template: '
{{field.title}}
', + restrict: 'E', + scope: { + field: '=', + required: '&', + design: '=', + index: '=', + forms: '=' + }, + link: function(scope, element) { + + $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.setActiveField = $rootScope.setActiveField; + + //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 fieldType = scope.field.fieldType; + +<<<<<<< d6b8995f6035723cf908d50b65e8b75b17f7190c + 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': + 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); + } +>>>>>>> make it work + }; +}]); + +'use strict'; + +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); + }); + + event.preventDefault(); + } + }); + } + }; +}]); + +'use strict'; + +angular.module('forms').directive('onFinishRender', ["$rootScope", "$timeout", function ($rootScope, $timeout) { + return { + restrict: 'A', + link: function (scope, element, attrs) { + + //Don't do anything if we don't have a ng-repeat on the current element + if(!element.attr('ng-repeat') && !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 + + $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 + + 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(); + } + }; + + /* + ** 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 + + 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); + } + }; + + $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 + + /* + ** 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; + } + }; + + $scope.submitForm = function() { + var _timeElapsed = TimeCounter.stopClock(); + $scope.loading = true; + 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) { + //console.log('form submitted successfully'); + + $scope.myform.submitted = true; + $scope.loading = false; + }) + .error(function (error) { + $scope.loading = false; + //console.log(error); + $scope.error = error.message; + }); + }, 500); + }; + + //Load our form when the page is ready + //angular.element(document).ready(function() { + $scope.reloadForm(); + //}); + + }] + }; + } +]); + +'use strict'; + +<<<<<<< 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 d8102c32..86e00b79 100644 --- a/public/dist/application.min.js +++ b/public/dist/application.min.js @@ -1,4 +1,13 @@ +<<<<<<< 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"}})}]); \ No newline at end of file +$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 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 aaae27cf..fbbe5946 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