diff --git a/README.md b/README.md
index 42f5e735..6bf0ed71 100755
--- a/README.md
+++ b/README.md
@@ -1,8 +1,8 @@
-TellForm 2.0.0
+TellForm 2.1.0
========
[![Build Status](https://travis-ci.org/tellform/tellform.svg?branch=master)](https://travis-ci.org/tellform/tellform)
-![Project Status](https://img.shields.io/badge/status-2.0.0-green.svg)
+![Project Status](https://img.shields.io/badge/status-2.1.0-green.svg)
[![Code Climate](https://codeclimate.com/github/whitef0x0/tellform/badges/gpa.svg)](https://codeclimate.com/github/whitef0x0/tellform)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/3491e86eb7194308b8fc80711d736ede)](https://www.codacy.com/app/david-baldwin/tellform?utm_source=github.com&utm_medium=referral&utm_content=whitef0x0/tellform&utm_campaign=Badge_Grade)
[![Gitter](https://badges.gitter.im/whitef0x0/tellform.svg)](https://gitter.im/whitef0x0/tellform?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
diff --git a/app/controllers/core.server.controller.js b/app/controllers/core.server.controller.js
index e6297edf..914e652e 100755
--- a/app/controllers/core.server.controller.js
+++ b/app/controllers/core.server.controller.js
@@ -15,7 +15,7 @@ exports.index = function(req, res) {
exports.form = function(req, res) {
//Allow form to be embedded
- res.set('X-Frame-Options', 'GOFORIT');
+ res.removeHeader('X-Frame-Options');
res.render('form', {
user: req.user || null,
diff --git a/app/controllers/forms.server.controller.js b/app/controllers/forms.server.controller.js
index a49f013b..af8e7a2d 100644
--- a/app/controllers/forms.server.controller.js
+++ b/app/controllers/forms.server.controller.js
@@ -164,7 +164,7 @@ var readForRender = exports.readForRender = function(req, res) {
delete newForm.__v;
delete newForm.created;
- if(!newForm.startPage.showStart){
+ if(newForm.startPage && !newForm.startPage.showStart){
delete newForm.startPage;
}
@@ -175,20 +175,33 @@ var readForRender = exports.readForRender = function(req, res) {
* Update a form
*/
exports.update = function(req, res) {
+
var form = req.form;
var updatedForm = req.body.form;
+ if(form.form_fields === undefined){
+ form.form_fields = [];
+ }
delete updatedForm.__v;
delete updatedForm.created;
+ if(form.analytics === undefined){
+ form.analytics = {
+ visitors: [],
+ gaCode: ''
+ }
+ }
if (req.body.changes) {
var formChanges = req.body.changes;
formChanges.forEach(function (change) {
- diff.applyChange(form, true, change);
+ diff.applyChange(form._doc, true, change);
});
} else {
- //Unless we have 'admin' privileges, updating form admin is disabled
+
+ delete updatedForm.__v;
+ delete updatedForm.created;
+ //Unless we have 'admin' privileges, updating the form's admin is disabled
if(updatedForm && req.user.roles.indexOf('admin') === -1) {
delete updatedForm.admin;
}
@@ -200,7 +213,7 @@ exports.update = function(req, res) {
//Do this so we can create duplicate fields
var checkForValidId = new RegExp('^[0-9a-fA-F]{24}$');
- for(var i=0; i
${URL}
', + subject: '✔ Activate your new TellForm account!', + html: welcomeEmail, text: 'Please verify your account by clicking the following link, or by copying and pasting it into your browser: ${URL}' }, confirmMailOptions: { from: config.mailer.from, - subject: 'Account successfully verified!', - html: 'Your account has been successfully verified.
', + subject: '✔ Welcome to {{app.title}}!', + html: verificationEmail, text: 'Your account has been successfully verified.' }, verifySendMailCallback: function(err, info) { diff --git a/app/models/form_field.server.model.js b/app/models/form_field.server.model.js index 71704614..9a86b74b 100644 --- a/app/models/form_field.server.model.js +++ b/app/models/form_field.server.model.js @@ -76,8 +76,7 @@ function BaseFieldSchema(){ }, title: { type: String, - trim: true, - required: 'Field Title cannot be blank' + trim: true }, description: { type: String, @@ -106,7 +105,6 @@ function BaseFieldSchema(){ }, fieldType: { type: String, - required: true, enum: [ 'textfield', 'date', diff --git a/app/sockets/analytics_service.js b/app/sockets/analytics_service.js index bb5f8ab2..993a0468 100644 --- a/app/sockets/analytics_service.js +++ b/app/sockets/analytics_service.js @@ -5,13 +5,14 @@ */ var mongoose = require('mongoose'), errorHandler = require('../controllers/errors.server.controller'), - Form = mongoose.model('Form'); + Form = mongoose.model('Form'), + request = require('request'); // Create the chat configuration module.exports = function (io, socket) { var visitorsData = {}; - var saveVisitorData = function (data, cb){ + var saveVisitorData = function (data, socket, cb){ Form.findById(data.formId, function(err, form) { if (err) { console.error(err); @@ -25,22 +26,25 @@ module.exports = function (io, socket) { timeElapsed: data.timeElapsed, isSubmitted: data.isSubmitted, language: data.language, - ipAddr: data.ipAddr, + ipAddr: '', deviceType: data.deviceType }; form.analytics.visitors.push(newVisitor); - form.save(function (formSaveErr) { - if (err) { - console.error(err); - throw new Error(errorHandler.getErrorMessage(formSaveErr)); - } - if(cb){ - return cb(); - } - }); + form.form_fields = form.form_fields.map(v => Object.assign({}, v, { fieldValue: null })); + + form.save(function (formSaveErr) { + if (err) { + console.error(err); + throw new Error(errorHandler.getErrorMessage(formSaveErr)); + } + + if(cb){ + return cb(); + } + }); }); }; @@ -50,6 +54,8 @@ module.exports = function (io, socket) { visitorsData[current_socket.id] = data; visitorsData[current_socket.id].socketId = current_socket.id; visitorsData[current_socket.id].isSaved = false; + + if (data.isSubmitted && !data.isSaved) { visitorsData[current_socket.id].isSaved = true; saveVisitorData(data, function() { @@ -71,3 +77,4 @@ module.exports = function (io, socket) { }); }); }; + diff --git a/app/views/form.server.view.html b/app/views/form.server.view.html index b07466ed..be1bd664 100644 --- a/app/views/form.server.view.html +++ b/app/views/form.server.view.html @@ -76,11 +76,6 @@ - diff --git a/app/views/templates/reset-password-confirm-email.server.view.html b/app/views/templates/reset-password-confirm-email.server.view.html index bfbcb157..4654ff1f 100755 --- a/app/views/templates/reset-password-confirm-email.server.view.html +++ b/app/views/templates/reset-password-confirm-email.server.view.html @@ -1,13 +1,64 @@ - - - - -Dear {{name}},
- -This is a confirmation that the password for your account has just been changed
-The {{appName}} Support Team
- - + + @import url(//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700&subset=latin,latin-ext); + + + + +
+
|
+
Dear {{name}},
-- You have requested to have your password reset for your account at {{appName}} -
-Please visit this url to reset your password:
-{{url}}
- If you didn't make this request, you can ignore this email. -The {{appName}} Support Team
- - + + @import url(//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700&subset=latin,latin-ext); + + + + +
+
|
+
-
|
-
+
|
+
+
|
+
# | {{value.title}} | {{ 'PERCENTAGE_COMPLETE' | translate }} | {{ 'TIME_ELAPSED' | translate }} | {{ 'DEVICE' | translate }} | {{ 'LOCATION' | translate }} | {{ 'IP_ADDRESS' | translate }} | {{ 'DATE_SUBMITTED' | translate }} (UTC) | |
---|---|---|---|---|---|---|---|---|
{{$index+1}} | {{field.fieldValue}} | {{row.percentageComplete}}% | {{row.timeElapsed | secondsToDateTime | date:'mm:ss'}} | {{row.device.name}}, {{row.device.type}} | {{row.geoLocation.City}}, {{row.geoLocation.Country}} | {{row.ipAddr}} | {{row.created | date:'yyyy-MM-dd HH:mm:ss'}} |
{{ \'BEFORE_YOU_CONTINUE\' | translate }} polydaic@gmail.com
{{ \'CHECK_YOUR_EMAIL\' | translate }} polydaic@gmail.com
{{pageData.introParagraph}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{myform.startPage.introParagraph}}
{{myform.endPage.paragraph}}
# | {{value.title}} | {{ 'PERCENTAGE_COMPLETE' | translate }} | {{ 'TIME_ELAPSED' | translate }} | {{ 'DEVICE' | translate }} | {{ 'LOCATION' | translate }} | {{ 'IP_ADDRESS' | translate }} | {{ 'DATE_SUBMITTED' | translate }} (UTC) | |
---|---|---|---|---|---|---|---|---|
{{$index+1}} | {{field.fieldValue}} | {{row.percentageComplete}}% | {{row.timeElapsed | secondsToDateTime | date:'mm:ss'}} | {{row.device.name}}, {{row.device.type}} | {{row.geoLocation.City}}, {{row.geoLocation.Country}} | {{row.ipAddr}} | {{row.created | date:'yyyy-MM-dd HH:mm:ss'}} |
{{ \'BEFORE_YOU_CONTINUE\' | translate }} polydaic@gmail.com
{{ \'CHECK_YOUR_EMAIL\' | translate }} polydaic@gmail.com
{{pageData.introParagraph}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{myform.startPage.introParagraph}}
{{myform.endPage.paragraph}}
{{pageData.introParagraph}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}
{{field.description}}