diff --git a/app/controllers/forms.server.controller.js b/app/controllers/forms.server.controller.js index 0472e613..fb32c9d5 100644 --- a/app/controllers/forms.server.controller.js +++ b/app/controllers/forms.server.controller.js @@ -10,7 +10,8 @@ var mongoose = require('mongoose'), config = require('../../config/config'), diff = require('deep-diff'), _ = require('lodash'), - nodemailer = require('nodemailer'); + nodemailer = require('nodemailer'), + emailNotifications = require('../libs/send-email-notifications'); var smtpTransport = nodemailer.createTransport(config.mailer.options); @@ -73,22 +74,25 @@ exports.createSubmission = function(req, res) { }); } - if (req.body.emailNotifications && req.body.emailNotifications.enabled && req.body.emailNotifications.recipients) { - var mailOptions = { - from: config.mailer.from, - cc: req.body.emailNotifications.recipients, - subject: 'TellForm ' + submission.title + 'Submitted', - body: 'Your form ' + submission.title + 'was submitted.' - } + var form = req.body.form; - smtpTransport.sendMail(mailOptions, function(err) { - if (!err) { - return res.status(200).send('Form submission successfully saved'); - } - return res.status(400).send({ - message: 'Failure sending submission email' - }); + if (form.selfNotifications && form.selfNotifications.enabled && form.selfNotifications.recipients) { + + var formFieldDict = {}; + form.form_fields.forEach(function(field){ + formFieldDict[field._id] = field.fieldValue; + }); + + form.selfNotifications.from = formFieldDict[form.selfNotifications.fromField].fieldValue; + + emailNotifications.send(form.selfNotifications, formFieldDict, smtpTransport, function(err){ + if (!err) { + return res.status(200).send('Form submission successfully saved'); + } + return res.status(400).send({ + message: 'Failure sending submission email' }); + }); } else { res.status(200).send('Form submission successfully saved'); } diff --git a/app/libs/send-email-notifications.js b/app/libs/send-email-notifications.js new file mode 100644 index 00000000..efa846e1 --- /dev/null +++ b/app/libs/send-email-notifications.js @@ -0,0 +1,26 @@ +module.exports = { + send: function(emailSettings, emailTemplateVars, smtpTransport, cb){ + var parsedTemplate = parseTemplate(emailSettings.htmlTemplate, emailTemplateVars); + var parsedSubject = parseTemplate(emailSettings.body, emailTemplateVars); + var mailOptions = { + from: emailSettings.from, + cc: emailSettings.recipients, + subject: parsedSubject, + html: parsedTemplate + } + + smtpTransport.sendMail(mailOptions, cb); + }, + + parseTemplate: function(emailTemplate, emailAttrs){ + var resolvedTemplate = emailTemplate; + Object.keys(emailAttrs).forEach(function (key) { + resolvedTemplate = replaceTemplateVal(key, emailAttrs[key], resolvedTemplate); + }); + return resolvedTemplate; + }, + + replaceTemplateVal: function(key, val, template){ + return template.replace( new RegExp('${' + key + '}', 'g'), value ) + } +} \ No newline at end of file diff --git a/app/models/form.server.model.js b/app/models/form.server.model.js index 3252489c..aacda7f4 100644 --- a/app/models/form.server.model.js +++ b/app/models/form.server.model.js @@ -150,7 +150,16 @@ var FormSchema = new Schema({ buttons:[ButtonSchema] }, - emailNotifications: { + selfNotifications: { + fromField: { + type: Schema.Types.ObjectId, + }, + subject: { + type: String + }, + htmlTemplate: { + type: String + }, enabled: { type: Boolean, default: false diff --git a/app/views/index.server.view.pug b/app/views/index.server.view.pug index c7213641..3380c5e9 100644 --- a/app/views/index.server.view.pug +++ b/app/views/index.server.view.pug @@ -35,6 +35,9 @@ block content //Socket.io Client Dependency script(src='https://cdn.socket.io/socket.io-1.4.5.js') + //TinyMCE + script(src='https://cdnjs.cloudflare.com/ajax/libs/tinymce/4.7.1/tinymce.min.js') + //Bower JS dependencies each bowerJSFile in bowerJSFiles script(type='text/javascript', src=bowerJSFile) @@ -42,8 +45,6 @@ block content script(type='text/javascript', src='https://cdnjs.cloudflare.com/ajax/libs/angular-strap/2.3.8/angular-strap.min.js') - script(src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular-animate.js") - //Application JavaScript Files each jsFile in jsFiles script(type='text/javascript', src=jsFile) diff --git a/bower.json b/bower.json index afdaec71..2948ffa6 100755 --- a/bower.json +++ b/bower.json @@ -25,7 +25,6 @@ "angular-permission": "~1.1.1", "file-saver.js": "~1.20150507.2", "angular-bootstrap-colorpicker": "~3.0.19", - "angular-ui-router-tabs": "~1.7.0", "angular-scroll": "^1.0.0", "angular-sanitize": "1.4.14", "v-button": "^1.1.1", @@ -42,7 +41,8 @@ "mobile-detect": "^1.3.3", "socket.io-client": "^1.7.2", "css-toggle-switch": "^4.0.2", - "angular-strap": "^2.3.12" + "angular-strap": "^2.3.12", + "textAngular": "^1.5.16" }, "resolutions": { "angular-bootstrap": "^0.14.0", diff --git a/public/config.js b/public/config.js index d21482bf..dde967a4 100755 --- a/public/config.js +++ b/public/config.js @@ -4,7 +4,7 @@ var ApplicationConfiguration = (function() { // Init module configuration options var applicationModuleName = 'TellForm'; - var applicationModuleVendorDependencies = ['duScroll', 'ui.select', 'ngSanitize', 'vButton', 'ngResource', 'TellForm.templates', 'ui.router', 'ui.bootstrap', 'ui.utils', 'pascalprecht.translate', 'view-form']; + var applicationModuleVendorDependencies = ['duScroll', 'ui.select', 'ngSanitize', 'vButton', 'ngResource', 'TellForm.templates', 'ui.router', 'ui.bootstrap', 'ui.utils', 'pascalprecht.translate']; // Add a new vertical module var registerModule = function(moduleName, dependencies) { diff --git a/public/modules/forms/admin/config/i18n/english.js b/public/modules/forms/admin/config/i18n/english.js index 20e4a966..778e1331 100644 --- a/public/modules/forms/admin/config/i18n/english.js +++ b/public/modules/forms/admin/config/i18n/english.js @@ -22,6 +22,9 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid SELF_NOTIFICATIONS_TAB: 'Self notifications', RESPONDENT_NOTIFICATIONS_TAB: 'Respondent notifications', + //Self Notifications Tab + ADD_VARIABLE_BUTTON: 'Add variable', + //List Forms View CREATE_A_NEW_FORM: 'Create a new form', CREATE_FORM: 'Create form', diff --git a/public/modules/forms/admin/css/edit-form-configure.css b/public/modules/forms/admin/css/edit-form-configure.css new file mode 100644 index 00000000..09814345 --- /dev/null +++ b/public/modules/forms/admin/css/edit-form-configure.css @@ -0,0 +1,14 @@ +.tag { + background-color: #999; + border-radius: 3px 3px 3px 3px; + border: 0; + color: #FFFFFF; + font-style: inherit; + font-size: 11px; + padding: 4px 5px; + margin: 0 2px 2px 2px; + font-family: inherit; + white-space: nowrap; + vertical-align: middle; + cursor: pointer !important; +} \ No newline at end of file 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 3691227b..6fba83bd 100644 --- a/public/modules/forms/admin/directives/configure-form.client.directive.js +++ b/public/modules/forms/admin/directives/configure-form.client.directive.js @@ -9,10 +9,11 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$fil myform:'=' }, controller: function($scope){ + $rootScope.myform = $scope.myform; $scope.languages = $rootScope.languages; $scope.resetForm = $rootScope.resetForm; $scope.update = $rootScope.update; - + $scope.configureTabs = [ { heading: $filter('translate')('GENERAL_TAB'), diff --git a/public/modules/forms/admin/views/adminTabs/configureTabs/self-notifications.html b/public/modules/forms/admin/views/adminTabs/configureTabs/self-notifications.html index a20176b9..5a3f0163 100644 --- a/public/modules/forms/admin/views/adminTabs/configureTabs/self-notifications.html +++ b/public/modules/forms/admin/views/adminTabs/configureTabs/self-notifications.html @@ -1,39 +1,50 @@ -