diff --git a/README.md b/README.md
index 39e5b3a9..ce50b078 100755
--- a/README.md
+++ b/README.md
@@ -3,13 +3,12 @@ TellForm 2.1.0
[](https://travis-ci.org/tellform/tellform)

-[](https://codeclimate.com/github/whitef0x0/tellform)
-[](https://www.codacy.com/app/david-baldwin/tellform?utm_source=github.com&utm_medium=referral&utm_content=whitef0x0/tellform&utm_campaign=Badge_Grade)
-[](https://gitter.im/whitef0x0/tellform?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[](https://www.codacy.com/app/david-baldwin/tellform?utm_source=github.com&utm_medium=referral&utm_content=tellform/tellform&utm_campaign=Badge_Grade)
+[](https://gitter.im/tellform/tellform?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
> An *opensource alternative to TypeForm* that can create [stunning mobile-ready forms](https://tellform.com/examples) , surveys and questionnaires.
-[](https://heroku.com/deploy?template=https://github.com/whitef0x0/tellform/tree/master)
+[](https://heroku.com/deploy?template=https://github.com/tellform/tellform/tree/master)
## Table of Contents
@@ -94,7 +93,7 @@ MAILER_FROM=user@domain.com
# Use this for one of Nodemailer's pre-configured service providers
MAILER_SERVICE_PROVIDER=SendGrid
-# Use these for a custom service provider
+# Use these for a custom service provider
# Note: MAILER_SMTP_HOST will override MAILER_SERVICE_PROVIDER
MAILER_SMTP_HOST=smtp.domain.com
MAILER_SMTP_PORT=465
@@ -202,7 +201,7 @@ TellForm's configuration is done with environment variables. To set an option fo
## Where to get help
-[Gitter Chat](https://gitter.im/whitef0x0/tellform)
+[Gitter Chat](https://gitter.im/tellform/tellform)
[Official Twitter](https://twitter.com/tellform_real)
@@ -247,9 +246,9 @@ Love our work and community? [Become a backer](https://opencollective.com/tellfo
## Contributors
-| [David Baldwynn ](http://baldwynn.me) [💻](https://github.com/tellform/TellForm/commits?author=whitef0x0 "Code") [🔧](#tool-whitef0x0 "Tools") [🚇](#infra-whitef0x0 "Infrastructure (Hosting, Build-Tools, etc)") [📖](https://github.com/tellform/TellForm/commits?author=whitef0x0 "Documentation") [💡](#example-whitef0x0 "Examples") [🎨](#design-whitef0x0 "Design") [🔍](#fundingFinding-whitef0x0 "Funding Finding") [👀](#review-whitef0x0 "Reviewed Pull Requests") [⚠️](https://github.com/tellform/TellForm/commits?author=whitef0x0 "Tests") | [Samuel Laulhau ](https://samuellaulhau.fr) [💻](https://github.com/tellform/TellForm/commits?author=lalop "Code") [🌍](#translation-lalop "Translation") | [Arun Pattnaik ](http://arun.co) [🎨](#design-arunpattnaik "Design") | [Thiên Toán ](https://toanalien.com) [🐛](https://github.com/tellform/TellForm/issues?q=author%3Atoanalien "Bug reports") [💻](https://github.com/tellform/TellForm/commits?author=toanalien "Code") [📖](https://github.com/tellform/TellForm/commits?author=toanalien "Documentation") | [Adrian Portabales ](https://github.com/AdrianP-) [🐛](https://github.com/tellform/TellForm/issues?q=author%3AAdrianP- "Bug reports") [💻](https://github.com/tellform/TellForm/commits?author=AdrianP- "Code") | [Peter Thaleikis ](https://github.com/spekulatius) [📖](https://github.com/tellform/TellForm/commits?author=spekulatius "Documentation") | [Mickaël Andrieu ](http://www.mickael-andrieu.com) [📖](https://github.com/tellform/TellForm/commits?author=mickaelandrieu "Documentation") |
+| [David Baldwynn ](http://baldwynn.me) [💻](https://github.com/tellform/tellform/commits?author=whitef0x0 "Code") [🔧](#tool-whitef0x0 "Tools") [🚇](#infra-whitef0x0 "Infrastructure (Hosting, Build-Tools, etc)") [📖](https://github.com/tellform/tellform/commits?author=whitef0x0 "Documentation") [💡](#example-whitef0x0 "Examples") [🎨](#design-whitef0x0 "Design") [🔍](#fundingFinding-whitef0x0 "Funding Finding") [👀](#review-whitef0x0 "Reviewed Pull Requests") [⚠️](https://github.com/tellform/tellform/commits?author=whitef0x0 "Tests") | [Samuel Laulhau ](https://samuellaulhau.fr) [💻](https://github.com/tellform/tellform/commits?author=lalop "Code") [🌍](#translation-lalop "Translation") | [Arun Pattnaik ](http://arun.co) [🎨](#design-arunpattnaik "Design") | [Thiên Toán ](https://toanalien.com) [🐛](https://github.com/tellform/tellform/issues?q=author%3Atoanalien "Bug reports") [💻](https://github.com/tellform/tellform/commits?author=toanalien "Code") [📖](https://github.com/tellform/tellform/commits?author=toanalien "Documentation") | [Adrian Portabales ](https://github.com/AdrianP-) [🐛](https://github.com/tellform/tellform/issues?q=author%3AAdrianP- "Bug reports") [💻](https://github.com/tellform/tellform/commits?author=AdrianP- "Code") | [Peter Thaleikis ](https://github.com/spekulatius) [📖](https://github.com/tellform/tellform/commits?author=spekulatius "Documentation") | [Mickaël Andrieu ](http://www.mickael-andrieu.com) [📖](https://github.com/tellform/tellform/commits?author=mickaelandrieu "Documentation") |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
-| [Ahmad Luqman ](https://github.com/ahmad-luqman) [📖](https://github.com/tellform/TellForm/commits?author=ahmad-luqman "Documentation") | [Peter Dave Hello ](https://www.peterdavehello.org/) [📖](https://github.com/tellform/TellForm/commits?author=PeterDaveHello "Documentation") |
+| [Ahmad Luqman ](https://github.com/ahmad-luqman) [📖](https://github.com/tellform/tellform/commits?author=ahmad-luqman "Documentation") | [Peter Dave Hello ](https://www.peterdavehello.org/) [📖](https://github.com/tellform/tellform/commits?author=PeterDaveHello "Documentation") |
## Mentions on the Web
diff --git a/app/controllers/forms.server.controller.js b/app/controllers/forms.server.controller.js
index 383b0dc1..ef02dabf 100644
--- a/app/controllers/forms.server.controller.js
+++ b/app/controllers/forms.server.controller.js
@@ -102,7 +102,7 @@ exports.createSubmission = function(req, res) {
exports.listSubmissions = function(req, res) {
var _form = req.form;
- FormSubmission.find({ form: _form._id }).sort('-created').lean().exec(function(err, _submissions) {
+ FormSubmission.find({ form: _form._id }).sort('created').lean().exec(function(err, _submissions) {
if (err) {
console.error(err);
res.status(500).send({
@@ -148,15 +148,7 @@ exports.read = function(req, res) {
if(!req.user || (req.form.admin.id !== req.user.id) ){
readForRender(req, res);
} else {
- FormSubmission.find({ form: req.form._id }).exec(function(err, _submissions) {
- if (err) {
- res.status(400).send({
- message: errorHandler.getErrorMessage(err)
- });
- }
-
var newForm = req.form.toJSON();
- newForm.submissions = _submissions;
if (req.userId) {
if(req.form.admin._id+'' === req.userId+''){
@@ -167,7 +159,6 @@ exports.read = function(req, res) {
});
}
return res.json(newForm);
- });
}
};
@@ -279,7 +270,7 @@ exports.list = function(req, res) {
Form.find(searchObj)
.sort('-created')
- .select('title language submissions admin isLive')
+ .select('title language admin submissions isLive')
.populate('admin.username', 'admin._id')
.lean()
.exec(function(err, forms) {
@@ -311,7 +302,6 @@ exports.formByID = function(req, res, next, id) {
}
Form.findById(id)
.populate('admin')
- .populate('submissions')
.exec(function(err, form) {
if (err) {
return next(err);
diff --git a/app/controllers/users/users.authentication.server.controller.js b/app/controllers/users/users.authentication.server.controller.js
index 91d1d745..46213490 100755
--- a/app/controllers/users/users.authentication.server.controller.js
+++ b/app/controllers/users/users.authentication.server.controller.js
@@ -9,16 +9,10 @@ var errorHandler = require('../errors.server.controller'),
config = require('../../../config/config'),
User = mongoose.model('User'),
tokgen = require('../../libs/tokenGenerator'),
- fs = require('fs');
-
-require.extensions['.html'] = function (module, filename) {
- module.exports = fs.readFileSync(filename, 'utf8');
-};
-
-var welcomeEmail = require("../../views/welcome.email.view.html");
-var verificationEmail = require("../../views/verification.email.view.html");
-
-
+ fs = require('fs'),
+ i18n = require('i18n'),
+ async = require('async'),
+ pug = require('pug');
var nev = require('email-verification')(mongoose);
@@ -26,6 +20,15 @@ var nev = require('email-verification')(mongoose);
var config_nev = function () {
nev.configure({
+
+ verifyMailOptions: {
+ from: config.mailer.from
+ },
+
+ confirmMailOptions: {
+ from: config.mailer.from
+ },
+
persistentUserModel: User,
tempUserCollection: config.tempUserCollection,
emailAndUsernameUnique: true,
@@ -33,19 +36,7 @@ var config_nev = function () {
verificationURL: config.baseUrl+'/#!/verify/${URL}',
transportOptions: config.mailer.options,
- verifyMailOptions: {
- from: config.mailer.from,
- subject: '✔ Activate your new TellForm account!',
- html: verificationEmail,
- 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: '✔ Welcome to {{app.title}}!',
- html: welcomeEmail,
- text: 'Your account has been successfully verified.'
- },
+
verifySendMailCallback: function(err, info) {
if (err) {
throw err;
@@ -63,13 +54,22 @@ var config_nev = function () {
throw err;
}
});
-
};
config_nev();
exports.validateVerificationToken = function(req, res){
- nev.confirmTempUser(req.params.token, function(err, user) {
+
+ const fn = pug.compileFile(__dirname + "/../../views/welcome.email.view.pug");
+ var renderedHtml = fn(res.locals);
+
+ var emailTemplate = {
+ subject: i18n.__('WELCOME_EMAIL_SUBJECT', config.app.title),
+ html: renderedHtml,
+ text: i18n.__('WELCOME_EMAIL_TEXT')
+ };
+
+ nev.confirmTempUser(req.params.token, emailTemplate, function(err, user) {
if(err) {
return res.status(500).send( {message: err } );
} else if (user){
@@ -83,7 +83,16 @@ exports.validateVerificationToken = function(req, res){
};
exports.resendVerificationEmail = function(req, res, next){
- nev.resendVerificationEmail(req.body.email, function(err, userFound) {
+ const fn = pug.compileFile(__dirname + "/../../views/verification.email.view.pug");
+ var renderedHtml = fn(res.locals);
+
+ var emailTemplate = {
+ subject: i18n.__('VERIFICATION_EMAIL_SUBJECT'),
+ html: renderedHtml,
+ text: i18n.__('VERIFICATION_EMAIL_TEXT')
+ };
+
+ nev.resendVerificationEmail(req.body.email, emailTemplate, function(err, userFound) {
if(err) {
return res.status(500).send( {message: errorHandler.getErrorMessage(err) } );
}
@@ -107,23 +116,35 @@ exports.signup = function(req, res) {
// Init Variables
var user = new User(req.body);
+ // Set language to visitor's language
+ user.language = req.cookies['userLang'];
+
// Add missing user fields
user.provider = 'local';
+
// Then save the temporary user
nev.createTempUser(user, function (err, existingPersistentUser, newTempUser) {
if (err) {
+ console.log(err);
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
}
-
// new user created
if (newTempUser) {
- var URL = newTempUser[nev.options.URLFieldName];
- nev.sendVerificationEmail(user.email, URL, function (sendEmailErr, info) {
- if (sendEmailErr) {
+ const fn = pug.compileFile(__dirname + "/../../views/verification.email.view.pug");
+ var renderedHtml = fn(res.locals);
+ var URL = newTempUser[nev.options.URLFieldName];
+ var emailTemplate = {
+ subject: i18n.__('VERIFICATION_EMAIL_SUBJECT'),
+ html: renderedHtml,
+ text: i18n.__('VERIFICATION_EMAIL_TEXT')
+ };
+
+ nev.sendVerificationEmail(user.email, URL, emailTemplate, function (sendEmailErr, info) {
+ if (sendEmailErr) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
@@ -131,7 +152,7 @@ exports.signup = function(req, res) {
return res.status(200).send('An email has been sent to you. Please check it to verify your account.');
});
} else {
- return res.status(400).send({message: 'Error: User already exists!'});
+ return res.status(400).send({message: 'User with username/email already exists!'});
}
});
};
@@ -140,6 +161,7 @@ exports.signup = function(req, res) {
* Signin after passport authentication
*/
exports.signin = function(req, res, next) {
+
passport.authenticate('local', function(err, user, info) {
if (err || !user) {
res.status(400).send(info);
@@ -155,6 +177,8 @@ exports.signin = function(req, res, next) {
message: errorHandler.getErrorMessage(loginErr)
});
}
+
+ res.cookie('langCookie', user.language, { maxAge: 90000, httpOnly: true });
return res.json(user);
});
}
@@ -165,138 +189,11 @@ exports.signin = function(req, res, next) {
* Signout
*/
exports.signout = function(req, res) {
+ if(req.cookies.hasOwnProperty('userLang')){
+ res.destroyCookie('userLang');
+ }
req.logout();
return res.status(200).send('You have successfully logged out.');
-
-};
-
-/**
- * OAuth callback
- */
-exports.oauthCallback = function(strategy) {
- return function(req, res, next) {
- passport.authenticate(strategy, function(err, user, redirectURL) {
- if (err || !user) {
- return res.redirect('/#!/signin');
- }
- req.login(user, function(err) {
- if (err) {
- return res.redirect('/#!/signin');
- }
-
- return res.redirect(redirectURL || '/');
- });
- })(req, res, next);
- };
-};
-
-/**
- * Helper function to save or update a OAuth user profile
- */
-exports.saveOAuthUserProfile = function(req, providerUserProfile, done) {
- if (!req.user) {
- // Define a search query fields
- var searchMainProviderIdentifierField = 'providerData.' + providerUserProfile.providerIdentifierField;
- var searchAdditionalProviderIdentifierField = 'additionalProvidersData.' + providerUserProfile.provider + '.' + providerUserProfile.providerIdentifierField;
-
- // Define main provider search query
- var mainProviderSearchQuery = {};
- mainProviderSearchQuery.provider = providerUserProfile.provider;
- mainProviderSearchQuery[searchMainProviderIdentifierField] = providerUserProfile.providerData[providerUserProfile.providerIdentifierField];
-
- // Define additional provider search query
- var additionalProviderSearchQuery = {};
- additionalProviderSearchQuery[searchAdditionalProviderIdentifierField] = providerUserProfile.providerData[providerUserProfile.providerIdentifierField];
-
- // Define a search query to find existing user with current provider profile
- var searchQuery = {
- $or: [mainProviderSearchQuery, additionalProviderSearchQuery]
- };
-
- User.findOne(searchQuery, function(err, user) {
- if (err) {
- return done(err);
- } else {
- if (!user) {
- var possibleUsername = providerUserProfile.username || ((providerUserProfile.email) ? providerUserProfile.email.split('@')[0] : '');
-
- User.findUniqueUsername(possibleUsername, null, function(availableUsername) {
- var newUser = new User({
- firstName: providerUserProfile.firstName,
- lastName: providerUserProfile.lastName,
- username: availableUsername,
- displayName: providerUserProfile.displayName,
- email: providerUserProfile.email,
- provider: providerUserProfile.provider,
- providerData: providerUserProfile.providerData
- });
-
- // And save the user
- newUser.save(function(userSaveErr) {
- return done(userSaveErr, user);
- });
- });
- }
- return done(err, user);
- }
- });
- } else {
- // User is already logged in, join the provider data to the existing user
- var user = req.user;
-
- // Check if user exists, is not signed in using this provider, and doesn't have that provider data already configured
- if (user.provider !== providerUserProfile.provider && (!user.additionalProvidersData || !user.additionalProvidersData[providerUserProfile.provider])) {
- // Add the provider data to the additional provider data field
- if (!user.additionalProvidersData) {
- user.additionalProvidersData = {};
- }
- user.additionalProvidersData[providerUserProfile.provider] = providerUserProfile.providerData;
-
- // Then tell mongoose that we've updated the additionalProvidersData field
- user.markModified('additionalProvidersData');
-
- // And save the user
- user.save(function(err) {
- return done(err, user, '/#!/settings/accounts');
- });
- } else {
- return done(new Error('User is already connected using this provider'), user);
- }
- }
-};
-
-/**
- * Remove OAuth provider
- */
-exports.removeOAuthProvider = function(req, res, next) {
- var user = req.user;
- var provider = req.param('provider');
-
- if (user && provider) {
- // Delete the additional provider
- if (user.additionalProvidersData[provider]) {
- delete user.additionalProvidersData[provider];
-
- // Then tell mongoose that we've updated the additionalProvidersData field
- user.markModified('additionalProvidersData');
- }
-
- user.save(function(err) {
- if (err) {
- return res.status(400).send({
- message: errorHandler.getErrorMessage(err)
- });
- } else {
- req.login(user, function(err) {
- if (err) {
- res.status(400).send(err);
- } else {
- res.json(user);
- }
- });
- }
- });
- }
};
/* Generate API Key for User */
diff --git a/app/controllers/users/users.password.server.controller.js b/app/controllers/users/users.password.server.controller.js
index 1eff3a0b..bdeb0505 100755
--- a/app/controllers/users/users.password.server.controller.js
+++ b/app/controllers/users/users.password.server.controller.js
@@ -11,7 +11,8 @@ var _ = require('lodash'),
config = require('../../../config/config'),
nodemailer = require('nodemailer'),
async = require('async'),
- crypto = require('crypto');
+ crypto = require('crypto'),
+ pug = require('pug');
var smtpTransport = nodemailer.createTransport(config.mailer.options);
@@ -32,7 +33,7 @@ exports.forgot = function(req, res) {
if (req.body.username) {
User.findOne({
$or: [
- {'username': req.body.username},
+ {'username': req.body.username.toLowerCase()},
{'email': req.body.username}
]
}, '-salt -password', function(err, user) {
@@ -42,12 +43,27 @@ exports.forgot = function(req, res) {
});
}
if (!user) {
- return res.status(400).send({
- message: 'No account with that username or email has been found'
- });
- } else if (user.provider !== 'local') {
- return res.status(400).send({
- message: 'It seems like you signed up using your ' + user.provider + ' account'
+ var tempUserModel = mongoose.model(config.tempUserCollection);
+ tempUserModel.findOne({
+ $or: [
+ {'username': req.body.username.toLowerCase()},
+ {'email': req.body.username}
+ ]
+ }).lean().exec(function(err, user) {
+ if(err){
+ return res.status(500).send({
+ message: err.message
+ });
+ }
+ if(!user){
+ return res.status(400).send({
+ message: 'No account with that username or email has been found'
+ });
+ }
+
+ return res.status(400).send({
+ message: 'The account associated with this email has not been activated yet'
+ });
});
} else {
user.resetPasswordToken = token;
@@ -65,13 +81,12 @@ exports.forgot = function(req, res) {
}
},
function(token, user, done) {
- res.render('templates/reset-password-email', {
- name: user.displayName || 'TellForm User',
- appName: config.app.title,
- url: 'http://' + req.headers.host + '/auth/reset/' + token
- }, function(err, emailHTML) {
- done(err, emailHTML, user);
- });
+ const fn = pug.compileFile(__dirname + "/../../views/templates/reset-password-email.server.view.pug");
+ res.locals['url'] = 'http://' + req.headers.host + '/auth/reset/' + token;
+
+ console.log(res.locals);
+ var renderedHtml = fn(res.locals);
+ done(null, renderedHtml, user);
},
// If valid email, send reset email using service
function(emailHTML, user, done) {
@@ -138,10 +153,21 @@ exports.validateResetToken = function(req, res) {
* Reset password POST from email token
*/
exports.reset = function(req, res, next) {
+ if(req.body.newPassword.length < 4){
+ return res.status(400).send({
+ message: 'Password must be at least 4 characters long'
+ });
+ }
+
+ if(req.body.newPassword !== req.body.verifyPassword){
+ return res.status(400).send({
+ message: 'Passwords do not match'
+ });
+ }
+
// Init Variables
var passwordDetails = req.body;
async.waterfall([
-
function(done) {
User.findOne({
resetPasswordToken: req.params.token,
@@ -150,32 +176,25 @@ exports.reset = function(req, res, next) {
}
}, function(err, user) {
if (!err && user) {
- if (passwordDetails.newPassword === passwordDetails.verifyPassword) {
- user.password = passwordDetails.newPassword;
- user.resetPasswordToken = null;
- user.resetPasswordExpires = null;
+ user.password = passwordDetails.newPassword;
+ user.resetPasswordToken = null;
+ user.resetPasswordExpires = null;
- user.save(function(err) {
- if (err) {
- done(err, null);
- }
- done(null, user);
- });
- } else {
- done('Passwords do not match', null);
- }
+ user.save(function(err, savedUser) {
+ if (err) {
+ done(err, null);
+ }
+ done(null, savedUser);
+ });
} else {
done('Password reset token is invalid or has expired.', null);
}
});
},
function(user, done) {
- res.render('templates/reset-password-confirm-email', {
- name: user.displayName,
- appName: config.app.title
- }, function(err, emailHTML) {
- done(err, emailHTML, user);
- });
+ const fn = pug.compileFile(__dirname + "/../../views/templates/reset-password-confirm-email.server.view.pug");
+ var renderedHtml = fn(res.locals);
+ done(null, renderedHtml, user);
},
// If valid email, send reset email using service
function(emailHTML, user, done) {
diff --git a/app/models/user.server.model.js b/app/models/user.server.model.js
index 98e2d613..f8b16236 100755
--- a/app/models/user.server.model.js
+++ b/app/models/user.server.model.js
@@ -37,18 +37,11 @@ var validateLocalStrategyProperty = function(property) {
return ((this.provider !== 'local' && !this.updated) || propHasLength);
};
-/**
- * A Validation function for local strategy password
- */
-var validateLocalStrategyPassword = function(password) {
- return (this.provider !== 'local' || (password && password.length > 6));
-};
-
/**
* A Validation function for username
*/
var validateUsername = function(username) {
- return (username.match(/^[a-zA-Z0-9]+$/) !== null);
+ return (username.match(/^[a-zA-Z0-9.-_]+$/) !== null);
};
@@ -69,23 +62,17 @@ var UserSchema = new Schema({
email: {
type: String,
trim: true,
+ lowercase: true,
unique: 'Account already exists with this email',
- required: 'Please enter your email',
- validate: {
- validator: validateLocalStrategyProperty,
- message: 'Please fill in your email'
- },
- match: [/.+\@.+\..+/, 'Please fill a valid email address']
+ match: [/.+\@.+\..+/, 'Please fill a valid email address'],
+ required: [true, 'Email is required']
},
username: {
type: String,
unique: true,
- required: true,
lowercase: true,
- validate: {
- validator: validateUsername,
- message: 'Please use a valid username'
- }
+ match: [/^[a-zA-Z0-9\-]+$/, 'Username can only contain alphanumeric characters and \'-\''],
+ required: [true, 'Username is required']
},
passwordHash: {
type: String,
@@ -96,7 +83,6 @@ var UserSchema = new Schema({
},
provider: {
type: String,
- required: 'Provider is required',
default: 'local'
},
providerData: {},
@@ -112,7 +98,6 @@ var UserSchema = new Schema({
type: String,
enum: ['en', 'fr', 'es', 'it', 'de'],
default: 'en',
- required: 'User must have a language'
},
lastModified: {
type: Date
diff --git a/app/routes/forms.server.routes.js b/app/routes/forms.server.routes.js
index 5695ae01..6798e525 100644
--- a/app/routes/forms.server.routes.js
+++ b/app/routes/forms.server.routes.js
@@ -25,10 +25,13 @@ module.exports = function(app) {
} else {
app.route('/forms/:formIdFast([a-zA-Z0-9]+)/render')
.get(forms.readForRender);
+
+ app.route('/view/')
+ .get(core.form);
}
app.route('/forms/:formIdFast([a-zA-Z0-9]+)')
- .post(forms.createSubmission)
+ .post(forms.createSubmission)
app.route('/forms')
.get(auth.isAuthenticatedOrApiKey, forms.list)
diff --git a/app/routes/users.server.routes.js b/app/routes/users.server.routes.js
index f99ddc95..967176ce 100755
--- a/app/routes/users.server.routes.js
+++ b/app/routes/users.server.routes.js
@@ -14,7 +14,6 @@ module.exports = function(app) {
// Setting up the users profile api
app.route('/users/me').get(auth.isAuthenticatedOrApiKey, users.getUser);
app.route('/users').put(auth.isAuthenticatedOrApiKey, users.update);
- app.route('/users/accounts').delete(users.requiresLogin, users.removeOAuthProvider);
// Setting up the users account verification api
app.route('/auth/verify/:token').get(users.validateVerificationToken);
diff --git a/app/views/404.server.view.html b/app/views/404.server.view.html
deleted file mode 100755
index 40407617..00000000
--- a/app/views/404.server.view.html
+++ /dev/null
@@ -1,8 +0,0 @@
-{% extends 'layout.server.view.html' %}
-
-{% block content %}
-
Page Not Found
-
- {{url}} is not a valid path.
-
-{% endblock %}
diff --git a/app/views/404.server.view.pug b/app/views/404.server.view.pug
new file mode 100644
index 00000000..a9370948
--- /dev/null
+++ b/app/views/404.server.view.pug
@@ -0,0 +1,8 @@
+extends layout.server.view.pug
+
+block content
+ section.public-form.auth.sigin-view.valign-wrapper
+ div.row.valign
+ h3.col-md-12.text-center=__('404_HEADER')
+ div.col-md-4.col-md-offset-4
+ div.col-md-12.text-center(style="padding-bottom: 50px;")=__('404_BODY', url)
\ No newline at end of file
diff --git a/app/views/500.server.view.html b/app/views/500.server.view.html
deleted file mode 100755
index cc3b1478..00000000
--- a/app/views/500.server.view.html
+++ /dev/null
@@ -1,8 +0,0 @@
-{% extends 'layout.server.view.html' %}
-
-{% block content %}
-Server Error
-
- {{error}}
-
-{% endblock %}
diff --git a/app/views/500.server.view.pug b/app/views/500.server.view.pug
new file mode 100644
index 00000000..688a9af0
--- /dev/null
+++ b/app/views/500.server.view.pug
@@ -0,0 +1,12 @@
+extends layout.server.view.pug
+
+block content
+ section.public-form.auth.sigin-view.valign-wrapper
+ div.row.valign
+ h3.col-md-12.text-center=__('500_HEADER')
+ div.col-md-4.col-md-offset-4
+ if process.env.NODE_ENV == 'development'
+ div.col-md-12.text-center(style="padding-bottom: 50px;")
+ | #{error}
+ else
+ div.col-md-12.text-center(style="padding-bottom: 50px;")=__('500_BODY')
\ No newline at end of file
diff --git a/app/views/form.server.view.html b/app/views/form.server.view.html
deleted file mode 100644
index be1bd664..00000000
--- a/app/views/form.server.view.html
+++ /dev/null
@@ -1,139 +0,0 @@
-
-
-
-
- {{title}} Form
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {% for bowerCssFile in bowerCssFiles %}
-
- {% endfor %}
-
-
-
-
-
-
- {% for cssFile in cssFiles %}
-
- {% endfor %}
-
-
-
-
-
-
-
-
-
-
-
- {% for jsFile in formJSFiles %}
-
- {% endfor %}
-
-
- {% if process.env.NODE_ENV === 'development' %}
-
-
- {% endif %}
-
-
-
- {% if google_analytics_id %}
-
- {% endif %}
-
-
-
-
-
-
diff --git a/app/views/form.server.view.pug b/app/views/form.server.view.pug
new file mode 100644
index 00000000..e9332158
--- /dev/null
+++ b/app/views/form.server.view.pug
@@ -0,0 +1,106 @@
+doctype html
+html(lang='en', xmlns='http://www.w3.org/1999/xhtml')
+ head
+ title=title
+ // General META
+ meta(charset='utf-8')
+ meta(http-equiv='Content-type', content='text/html;charset=UTF-8')
+ meta(http-equiv='X-UA-Compatible', content='IE=edge,chrome=1')
+ meta(name='viewport', content='width=device-width,initial-scale=1,maximum-scale=1')
+ meta(name='apple-mobile-web-app-capable', content='yes')
+ meta(name='apple-mobile-web-app-status-bar-style', content='black')
+ // Semantic META
+ meta(name='keywords', content='keywords')
+ meta(name='description', content='description')
+ // Facebook META
+ meta(property='og:site_name', content=title)
+ meta(property='og:title', content=title)
+ meta(property='og:description', content='description')
+ meta(property='og:url', content='url')
+ meta(property='og:image', content='/img/brand/logo.png')
+ meta(property='og:type', content='website')
+ // Twitter META
+ meta(name='twitter:title', content=title)
+ meta(name='twitter:description', content='description')
+ meta(name='twitter:url', content='url')
+ meta(name='twitter:image', content='/img/brand/logo.png')
+ style.
+ .loader {
+ position: fixed;
+ left: 0px;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+ z-index: 9999;
+ background: url('/static/dist/page-loader.gif') 50% 35% no-repeat rgb(249,249,249);
+ background-size: 50px 50px;
+ }
+ // Fav Icon
+ link(href='/static/modules/core/img/brand/favicon.ico', rel='shortcut icon', type='image/x-icon')
+
+ body(ng-cloak='')
+ .loader
+ section.content
+ section(ui-view='')
+ //Embedding The User Object signupDisabled, socketPort and socketUrl Boolean
+ script(type='text/javascript').
+ var signupDisabled = !{signupDisabled};
+ var socketPort = false;
+ var socketUrl = false;
+ var subdomainsDisabled = !{subdomainsDisabled};
+
+ //Embedding socketPort
+ if socketPort
+ script(type='text/javascript').
+ socketPort = !{socketPort}
+
+ //Embedding socketUrl
+ if socketUrl
+ script(type='text/javascript').
+ socketUrl = !{socketUrl}
+
+ script(src='/static/lib/jquery/dist/jquery.min.js', type='text/javascript')
+ link(rel='stylesheet', href='/static/lib/font-awesome/css/font-awesome.min.css')
+ link(rel='stylesheet', href='/static/lib/bootstrap/dist/css/bootstrap.min.css')
+
+ //Bower CSS dependencies
+ each bowerCssFile in bowerCssFiles
+ link(rel='stylesheet', href=bowerCssFile)
+
+ link(rel='stylesheet', href='/static/lib/angular-input-stars/angular-input-stars.css')
+ link(rel='stylesheet', href='/static/lib/jquery-ui/themes/flick/jquery-ui.min.css')
+ // end Bower CSS dependencies
+
+ //Application CSS Files
+ each cssFile in cssFiles
+ link(rel='stylesheet', href=cssFile)
+ // end Application CSS Files
+
+ //Socket.io Client Dependency
+ script(src='/static/lib/socket.io-client/dist/socket.io.min.js')
+ script(src='/static/lib/jquery-ui/jquery-ui.js', type='text/javascript')
+ script(src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js', integrity='sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa', crossorigin='anonymous')
+
+ //Minified Bower Dependencies
+ script(src='/static/dist/vendor.min.js')
+ script(src='/static/lib/angular-ui-date/src/date.js', type='text/javascript')
+
+ //Application JavaScript Files
+ each jsFile in formJSFiles
+ script(type='text/javascript', src=jsFile)
+ // end Application Javascript dependencies
+
+ if process.env.NODE_ENV === 'development'
+ //Livereload script rendered
+ script(async='', type='text/javascript', src='http://#{request.hostname}:35729/livereload.js')
+
+ script Raven.config('https://825fefd6b4ed4a4da199c1b832ca845c@sentry.tellform.com/2').install();
+
+ if google_analytics_id
+ script window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date;ga('create','{{google_analytics_id}}','auto');ga('send','pageview')
+
+ script(src='https://www.google-analytics.com/analytics.js', async='')
+
+ script(type="text/javascript").
+ window.heap=window.heap||[],heap.load=function(e,t){window.heap.appid=e,window.heap.config=t=t||{};var r=t.forceSSL||"https:"===document.location.protocol,a=document.createElement("script");a.type="text/javascript",a.async=!0,a.src=(r?"https:":"http:")+"//cdn.heapanalytics.com/js/heap-"+e+".js";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(a,n);for(var o=function(e){return function(){heap.push([e].concat(Array.prototype.slice.call(arguments,0)))}},p=["addEventProperties","addUserProperties","clearEventProperties","identify","removeEventProperty","setEventProperties","track","unsetEventProperty"],c=0;c
-{% endblock %}
diff --git a/app/views/index.server.view.pug b/app/views/index.server.view.pug
new file mode 100644
index 00000000..10c29935
--- /dev/null
+++ b/app/views/index.server.view.pug
@@ -0,0 +1,55 @@
+extends layout.server.view.pug
+
+block content
+ section.content(ui-view='', ng-cloak='')
+
+ script(src='/static/lib/file-saver.js/FileSaver.js', type='text/javascript')
+
+ //Embedding The User Object
+ script(type='text/javascript').
+ var user = null;
+
+ //Embedding The signupDisabled Boolean
+ script(type='text/javascript').
+ var signupDisabled = !{signupDisabled};
+ var socketPort = false;
+ var socketUrl = false;
+ var subdomainsDisabled = !{subdomainsDisabled};
+ var locale = "en";
+
+ //Embedding locale
+ if locale
+ script(type='text/javascript').
+ locale = "!{locale}";
+
+ //Embedding socketPort
+ if socketPort
+ script(type='text/javascript').
+ socketPort = !{socketPort}
+
+ //Embedding socketUrl
+ if socketUrl
+ script(type='text/javascript').
+ socketUrl = "!{socketUrl}"
+
+ //Socket.io Client Dependency
+ script(src='https://cdn.socket.io/socket.io-1.4.5.js')
+
+ //Bower JS dependencies
+ each bowerJSFile in bowerJSFiles
+ script(type='text/javascript', src=bowerJSFile)
+ // end Bower JS dependencies
+
+ script(type='text/javascript', src='https://cdnjs.cloudflare.com/ajax/libs/angular-strap/2.3.8/angular-strap.min.js')
+
+ //Application JavaScript Files
+ each jsFile in jsFiles
+ script(type='text/javascript', src=jsFile)
+ // end Application Javascript dependencies
+
+ if process.env.NODE_ENV === 'development'
+ script(type='text/javascript', src='http://#{request.hostname}:35729/livereload.js')
+
+ script(src='https://cdn.ravenjs.com/2.3.0/angular/raven.min.js')
+
+ script Raven.config('https://825fefd6b4ed4a4da199c1b832ca845c@sentry.tellform.com/2').install();
\ No newline at end of file
diff --git a/app/views/layout.server.view.html b/app/views/layout.server.view.html
deleted file mode 100755
index 38463014..00000000
--- a/app/views/layout.server.view.html
+++ /dev/null
@@ -1,135 +0,0 @@
-
-
-
-
-{{title}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{% for bowerCssFile in bowerCssFiles %}
-
-{% endfor %}
-
-
-
-
-
-
-
-{% for cssFile in cssFiles %}
-
-{% endfor %}
-
-
-
-
-
-
-
-
- {% block content %}{% endblock %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {% for bowerJSFile in bowerJSFiles %}
-
- {% endfor %}
-
-
-
-
- {% for jsFile in jsFiles %}
-
- {% endfor %}
-
-
- {% if process.env.NODE_ENV === 'development' %}
-
-
- {% endif %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/views/layout.server.view.pug b/app/views/layout.server.view.pug
new file mode 100644
index 00000000..39ba97d5
--- /dev/null
+++ b/app/views/layout.server.view.pug
@@ -0,0 +1,61 @@
+doctype html
+html(lang='en', xmlns='http://www.w3.org/1999/xhtml')
+ head
+ title=title
+
+ // General META
+ meta(charset='utf-8')
+ meta(http-equiv='Content-type', content='text/html;charset=UTF-8')
+ meta(http-equiv='X-UA-Compatible', content='IE=edge,chrome=1')
+ meta(name='viewport', content='width=device-width,initial-scale=1,maximum-scale=1')
+ meta(name='apple-mobile-web-app-capable', content='yes')
+ meta(name='apple-mobile-web-app-status-bar-style', content='black')
+
+ // Semantic META
+ meta(name='keywords', content=keywords)
+ meta(name='description', content=description)
+
+ // Facebook META
+ meta(property='og:site_name', content=title)
+ meta(property='og:title', content=title)
+ meta(property='og:description', content=description)
+ meta(property='og:url', content=url)
+ meta(property='og:image', content='/img/brand/logo.png')
+ meta(property='og:type', content='website')
+
+ // Twitter META
+ meta(name='twitter:title', content=title)
+ meta(name='twitter:description', content=description)
+ meta(name='twitter:url', content=url)
+ meta(name='twitter:image', content='/img/brand/logo.png')
+
+ // Fav Icon
+ link(href='/static/modules/core/img/brand/favicon.ico', rel='shortcut icon', type='image/x-icon')
+ link(rel='stylesheet', href='https://maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css')
+ link(rel='stylesheet', href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css', integrity='sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u', crossorigin='anonymous')
+ link(rel='stylesheet', href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,900')
+
+ //Bower CSS dependencies
+ each bowerCssFile in bowerCssFiles
+ link(rel='stylesheet', href=bowerCssFile)
+ link(rel='stylesheet', href='/static/lib/angular-input-stars/angular-input-stars.css')
+ link(rel='stylesheet', href='/static/lib/jquery-ui/themes/flick/jquery-ui.css')
+ link(rel='stylesheet', href='/static/modules/core/css/github-fork-ribbon.css')
+ // end Bower CSS dependencies
+
+ //Application CSS Files
+ each cssFile in cssFiles
+ link(rel='stylesheet', href=cssFile)
+ // end Application CSS Files
+
+ body
+
+ block content
+
+ script window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date;ga('create','{{google_analytics_id}}','auto');ga('send','pageview')
+
+ script(src='https://www.google-analytics.com/analytics.js', async='', defer='')
+
+ script(type="text/javascript").
+ window.heap=window.heap||[],heap.load=function(e,t){window.heap.appid=e,window.heap.config=t=t||{};var r=t.forceSSL||"https:"===document.location.protocol,a=document.createElement("script");a.type="text/javascript",a.async=!0,a.src=(r?"https:":"http:")+"//cdn.heapanalytics.com/js/heap-"+e+".js";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(a,n);for(var o=function(e){return function(){heap.push([e].concat(Array.prototype.slice.call(arguments,0)))}},p=["addEventProperties","addUserProperties","clearEventProperties","identify","removeEventProperty","setEventProperties","track","unsetEventProperty"],c=0;c
-
-
-
- {{title}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {% for cssFile in cssFiles %}
-
- {% endfor %}
-
-
-
-
-
-
-
-
-
-
-
-
- {% for bowerJSFile in bowerJSFiles %}
-
- {% endfor %}
-
-
-
- {% if process.env.NODE_ENV === 'development' %}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/views/redoc.server.view.pug b/app/views/redoc.server.view.pug
new file mode 100644
index 00000000..c850dc96
--- /dev/null
+++ b/app/views/redoc.server.view.pug
@@ -0,0 +1,62 @@
+doctype html
+html(lang='en', xmlns='http://www.w3.org/1999/xhtml')
+ head
+ title #{title}
+
+ // General META
+ meta(charset='utf-8')
+ meta(http-equiv='Content-type', content='text/html;charset=UTF-8')
+ meta(http-equiv='X-UA-Compatible', content='IE=edge,chrome=1')
+ meta(name='viewport', content='width=device-width,initial-scale=1,maximum-scale=1')
+ meta(name='apple-mobile-web-app-capable', content='yes')
+ meta(name='apple-mobile-web-app-status-bar-style', content='black')
+
+ // Semantic META
+ meta(name='keywords', content='#{keywords}')
+ meta(name='description', content='#{description}')
+
+ // Facebook META
+ meta(property='og:site_name', content='#{title}')
+ meta(property='og:title', content='#{title}')
+ meta(property='og:description', content='#{description}')
+ meta(property='og:url', content='{{url}}')
+ meta(property='og:image', content='/img/brand/logo.png')
+ meta(property='og:type', content='website')
+
+ // Twitter META
+ meta(name='twitter:title', content='#{title}')
+ meta(name='twitter:description', content='#{description}')
+ meta(name='twitter:url', content='{{url}}')
+ meta(name='twitter:image', content='/img/brand/logo.png')
+
+ // Fav Icon
+ link(href='/static/modules/core/img/brand/favicon.ico', rel='shortcut icon', type='image/x-icon')
+ link(rel='stylesheet', href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,900')
+
+ //Application CSS Files
+ each cssFile in cssFiles
+ link(rel='stylesheet', href='#{cssFile}')
+ // end Application CSS Files
+ body
+ redoc(spec-url='/static/swagger.json')
+ script(src='https://rebilly.github.io/ReDoc/releases/latest/redoc.min.js')
+
+ //Bower JS dependencies
+ each bowerJSFile in bowerJSFiles
+ script(type='text/javascript', src='#{bowerJSFile}')
+ // end Bower JS dependencies
+
+ script(type='text/javascript', src='https://cdnjs.cloudflare.com/ajax/libs/angular-strap/2.3.8/angular-strap.min.js')
+
+ if process.env.NODE_ENV === 'development'
+ script(src='https://cdn.ravenjs.com/2.3.0/angular/raven.min.js')
+
+ script Raven.config('https://825fefd6b4ed4a4da199c1b832ca845c@sentry.tellform.com/2').install();
+
+ script window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date;ga('create','{{google_analytics_id}}','auto');ga('send','pageview')
+
+ script(src='https://www.google-analytics.com/analytics.js', async='', defer='')
+
+ script(type="text/javascript").
+ window.heap=window.heap||[],heap.load=function(e,t){window.heap.appid=e,window.heap.config=t=t||{};var r=t.forceSSL||"https:"===document.location.protocol,a=document.createElement("script");a.type="text/javascript",a.async=!0,a.src=(r?"https:":"http:")+"//cdn.heapanalytics.com/js/heap-"+e+".js";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(a,n);for(var o=function(e){return function(){heap.push([e].concat(Array.prototype.slice.call(arguments,0)))}},p=["addEventProperties","addUserProperties","clearEventProperties","identify","removeEventProperty","setEventProperties","track","unsetEventProperty"],c=0;cHello there!
This is a courtesy message to confirm that your password was just changed.
Thanks so much for using our services! If you have any questions, or suggestions, please feel free to email us here at team@tellform.com .
- - The {{appName}} team
+ - The #{appName} team
diff --git a/app/views/templates/reset-password-confirm-email.server.view.pug b/app/views/templates/reset-password-confirm-email.server.view.pug
new file mode 100644
index 00000000..95c05cd4
--- /dev/null
+++ b/app/views/templates/reset-password-confirm-email.server.view.pug
@@ -0,0 +1,41 @@
+doctype html
+html
+ head
+ body(style='padding: 0; width: 100% !important; -webkit-text-size-adjust: 100%; margin: 0; -ms-text-size-adjust: 100%', marginheight='0', marginwidth='0')
+ center
+ table(cellpadding='8', cellspacing='0', style='*width: 540px; padding: 0; width: 100% !important; background: #ffffff; margin: 0; background-color: #ffffff', border='0')
+ tbody
+ tr
+ td(valign='top')
+ table(cellpadding='0', cellspacing='0', style='border-radius: 6px; -webkit-border-radius: 6px; border: 1px #c0c0c0 solid; -moz-border-radius: 6px', border='0', align='center')
+ tbody
+ tr
+ td(colspan='3', height='6')
+ tr
+ td
+ table(cellpadding='0', cellspacing='0', style='line-height: 25px', border='0', align='center')
+ tbody
+ tr
+ td(colspan='3', height='30')
+ tr
+ td(width='36')
+ td(width='454', align='left', style="color: #444444; border-collapse: collapse; font-size: 11pt; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; max-width: 454px", valign='top')
+ p=__('EMAIL_GREETING')
+ p=__('RESET_PASSWORD_CONFIRMATION_EMAIL_BODY_1')
+ p=__("VERIFICATION_EMAIL_PARAGRAPH_2")
+ a(href='mailto:team@tellform.com') team@tellform.com
+ p=__('EMAIL_SIGNATURE')
+ td(width='36')
+ tr
+ td(colspan='3', height='36')
+ table(cellpadding='0', cellspacing='0', align='center', border='0')
+ tbody
+ tr
+ td(height='10')
+ tr
+ td(style='padding: 0; border-collapse: collapse')
+ table(cellpadding='0', cellspacing='0', align='center', border='0')
+ tbody
+ tr(style="color: #c0c0c0; font-size: 11px; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; -webkit-text-size-adjust: none")
+ td(width='400', align='left')
+ td(width='128', align='right') © TellForm 2017
diff --git a/app/views/templates/reset-password-email.server.view.pug b/app/views/templates/reset-password-email.server.view.pug
new file mode 100644
index 00000000..912f32e0
--- /dev/null
+++ b/app/views/templates/reset-password-email.server.view.pug
@@ -0,0 +1,44 @@
+doctype html
+html
+ head
+ body(style='padding: 0; width: 100% !important; -webkit-text-size-adjust: 100%; margin: 0; -ms-text-size-adjust: 100%', marginheight='0', marginwidth='0')
+ center
+ table(cellpadding='8', cellspacing='0', style='*width: 540px; padding: 0; width: 100% !important; background: #ffffff; margin: 0; background-color: #ffffff', border='0')
+ tbody
+ tr
+ td(valign='top')
+ table(cellpadding='0', cellspacing='0', style='border-radius: 6px; -webkit-border-radius: 6px; border: 1px #c0c0c0 solid; -moz-border-radius: 6px', border='0', align='center')
+ tbody
+ tr
+ td(colspan='3', height='6')
+ tr
+ td
+ table(cellpadding='0', cellspacing='0', style='line-height: 25px', border='0', align='center')
+ tbody
+ tr
+ td(colspan='3', height='30')
+ tr
+ td(width='36')
+ td(width='454', align='left', style="color: #444444; border-collapse: collapse; font-size: 11pt; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; max-width: 454px", valign='top')
+ p=__('EMAIL_GREETING')
+ p=__('RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_1')
+ p
+ a(href=url)=__('RESET_PASSWORD_REQUEST_EMAIL_LINK_TEXT')
+ p=__('RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_2')
+ p=__('VERIFICATION_EMAIL_PARAGRAPH_2')
+ a(href='mailto:team@tellform.com') team@tellform.com
+ p=__('EMAIL_SIGNATURE')
+ td(width='36')
+ tr
+ td(colspan='3', height='36')
+ table(cellpadding='0', cellspacing='0', align='center', border='0')
+ tbody
+ tr
+ td(height='10')
+ tr
+ td(style='padding: 0; border-collapse: collapse')
+ table(cellpadding='0', cellspacing='0', align='center', border='0')
+ tbody
+ tr(style="color: #c0c0c0; font-size: 11px; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; -webkit-text-size-adjust: none")
+ td(width='400', align='left')
+ td(width='128', align='right') © TellForm 2017
diff --git a/app/views/verification.email.view.html b/app/views/verification.email.view.html
deleted file mode 100644
index e582340d..00000000
--- a/app/views/verification.email.view.html
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
- @import url(//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700&subset=latin,latin-ext);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Hello there!
- Welcome to TellForm! Here is a special link to activate your new account:
- Activate my account
- Thanks so much for using our services! If you have any questions, or suggestions, please feel free to email us here at team@tellform.com .
- - The TellForm team
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- © TellForm 2017
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/views/verification.email.view.pug b/app/views/verification.email.view.pug
new file mode 100644
index 00000000..fb225507
--- /dev/null
+++ b/app/views/verification.email.view.pug
@@ -0,0 +1,49 @@
+html
+ head
+ style.
+ a {
+ color: #007ee6;
+ text-decoration: none;
+ }
+ meta(content='text/html; charset=utf-8', http-equiv='Content-Type')
+ body(style='padding: 0; width: 100% !important; -webkit-text-size-adjust: 100%; margin: 0; -ms-text-size-adjust: 100%', marginheight='0', marginwidth='0')
+ center
+ table(cellpadding='8', cellspacing='0', style='*width: 540px; padding: 0; width: 100% !important; background: #ffffff; margin: 0; background-color: #ffffff', border='0')
+ tbody
+ tr
+ td(valign='top')
+ table(cellpadding='0', cellspacing='0', style='border-radius: 6px; -webkit-border-radius: 6px; border: 1px #c0c0c0 solid; -moz-border-radius: 6px', border='0', align='center')
+ tbody
+ tr
+ td(colspan='3', height='6')
+ tr
+ td
+ table(cellpadding='0', cellspacing='0', style='line-height: 25px', border='0', align='center')
+ tbody
+ tr
+ td(colspan='3', height='30')
+ tr
+ td(width='36')
+ td(width='454', align='left', style="color: #444444; border-collapse: collapse; font-size: 11pt; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; max-width: 454px", valign='top')
+ p=__('EMAIL_GREETING')
+ p=__('VERIFICATION_EMAIL_PARAGRAPH_1')
+ p
+ a(href='http://${URL}')=__('VERIFICATION_EMAIL_LINK_TEXT')
+ p=__('VERIFICATION_EMAIL_PARAGRAPH_2')
+ a(href='mailto:team@tellform.com')
+ | team@tellform.com
+ p=__('EMAIL_SIGNATURE')
+ td(width='36')
+ tr
+ td(colspan='3', height='36')
+ table(cellpadding='0', cellspacing='0', align='center', border='0')
+ tbody
+ tr
+ td(height='10')
+ tr
+ td(style='padding: 0; border-collapse: collapse')
+ table(cellpadding='0', cellspacing='0', align='center', border='0')
+ tbody
+ tr(style="color: #c0c0c0; font-size: 11px; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; -webkit-text-size-adjust: none")
+ td(width='400', align='left')
+ td(width='128', align='right') © TellForm 2017
diff --git a/app/views/welcome.email.view.html b/app/views/welcome.email.view.html
deleted file mode 100644
index b69702f5..00000000
--- a/app/views/welcome.email.view.html
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
- @import url(//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700&subset=latin,latin-ext);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Hello there!
- We would like to welcome you as our newest member!
- Thanks so much for using TellForm! If you have any questions, or suggestions, please feel free to email us here at team@tellform.com .
- - The TellForm team
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- © TellForm 2017
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/views/welcome.email.view.pug b/app/views/welcome.email.view.pug
new file mode 100644
index 00000000..f4562ce0
--- /dev/null
+++ b/app/views/welcome.email.view.pug
@@ -0,0 +1,48 @@
+html
+ head
+ style.
+ a {
+ color: #007ee6;
+ text-decoration: none;
+ }
+ meta(content='text/html; charset=utf-8', http-equiv='Content-Type')
+
+ body(style='padding: 0; width: 100% !important; -webkit-text-size-adjust: 100%; margin: 0; -ms-text-size-adjust: 100%', marginheight='0', marginwidth='0')
+ center
+ table(cellpadding='8', cellspacing='0', style='*width: 540px; padding: 0; width: 100% !important; background: #ffffff; margin: 0; background-color: #ffffff', border='0')
+ tbody
+ tr
+ td(valign='top')
+ table(cellpadding='0', cellspacing='0', style='border-radius: 6px; -webkit-border-radius: 6px; border: 1px #c0c0c0 solid; -moz-border-radius: 6px', border='0', align='center')
+ tbody
+ tr
+ td(colspan='3', height='6')
+ tr
+ td
+ table(cellpadding='0', cellspacing='0', style='line-height: 25px', border='0', align='center')
+ tbody
+ tr
+ td(colspan='3', height='30')
+ tr
+ td(width='36')
+ td(width='454', align='left', style="color: #444444; border-collapse: collapse; font-size: 11pt; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; max-width: 454px", valign='top')
+ p=__('EMAIL_GREETING')
+ p=__('WELCOME_EMAIL_PARAGRAPH_1')
+ p=__('WELCOME_EMAIL_PARAGRAPH_2')
+ a(href='mailto:team@tellform.com')
+ | team@tellform.com
+ p=__('EMAIL_SIGNATURE')
+ td(width='36')
+ tr
+ td(colspan='3', height='36')
+ table(cellpadding='0', cellspacing='0', align='center', border='0')
+ tbody
+ tr
+ td(height='10')
+ tr
+ td(style='padding: 0; border-collapse: collapse')
+ table(cellpadding='0', cellspacing='0', align='center', border='0')
+ tbody
+ tr(style="color: #c0c0c0; font-size: 11px; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; -webkit-text-size-adjust: none")
+ td(width='400', align='left')
+ td(width='128', align='right') © TellForm 2017
diff --git a/bower.json b/bower.json
index 624428ba..afdaec71 100755
--- a/bower.json
+++ b/bower.json
@@ -2,7 +2,7 @@
"name": "tellform",
"description": "Opensource alternative to TypeForm",
"version": "2.0.0",
- "homepage": "https://github.com/whitef0x0/tellform",
+ "homepage": "https://github.com/tellform/tellform",
"authors": [
"David Baldwynn (http://baldwynn.me)"
],
diff --git a/config/env/all.js b/config/env/all.js
index 7e12b09e..7130af77 100755
--- a/config/env/all.js
+++ b/config/env/all.js
@@ -28,7 +28,7 @@ module.exports = {
socketPort: process.env.SOCKET_PORT || 20523,
socketPortExternallyVisible: (process.env.SOCKET_PORT_EXTERN_VISIBLE === 'TRUE'),
- templateEngine: 'swig',
+ templateEngine: 'pug',
signupDisabled: (process.env.SIGNUP_DISABLED === 'TRUE'),
enableClusterMode: (process.env.ENABLE_CLUSTER_MODE === 'TRUE'),
diff --git a/config/express.js b/config/express.js
index a3e84670..1da3f4a1 100755
--- a/config/express.js
+++ b/config/express.js
@@ -20,7 +20,8 @@ var fs = require('fs'),
config = require('./config'),
consolidate = require('consolidate'),
path = require('path'),
- client = new raven.Client(config.DSN);
+ client = new raven.Client(config.DSN),
+ i18n = require('i18n');
var mongoose = require('mongoose');
@@ -35,6 +36,18 @@ var configureSocketIO = function (app, db) {
return server;
};
+var supportedLanguages = ['en', 'de', 'fr', 'it', 'es'];
+
+function containsAnySupportedLanguages(preferredLanguages){
+ for (var i = 0; i < preferredLanguages.length; i++) {
+ var currIndex = supportedLanguages.indexOf(preferredLanguages[i]);
+ if (currIndex > -1) {
+ return supportedLanguages[currIndex];
+ }
+ }
+ return null;
+}
+
module.exports = function(db) {
// Initialize express app
var app = express();
@@ -176,11 +189,11 @@ module.exports = function(db) {
}));
- // Set swig as the template engine
- app.engine('server.view.html', consolidate[config.templateEngine]);
+ // Set template engine as defined in the config files
+ app.engine('server.view.pug', consolidate.pug);
// Set views path and view engine
- app.set('view engine', 'server.view.html');
+ app.set('view engine', 'server.view.pug');
app.set('views', './app/views');
// Enable logger (morgan)
@@ -200,6 +213,7 @@ module.exports = function(db) {
extended: true,
limit: '100mb'
}));
+
app.use(bodyParser.json({ limit: '100mb' }));
app.use(methodOverride());
@@ -220,7 +234,6 @@ module.exports = function(db) {
app.use(cookieParser());
// Express MongoDB session storage
-
app.use(session({
saveUninitialized: true,
resave: true,
@@ -237,14 +250,41 @@ module.exports = function(db) {
app.use(passport.initialize());
app.use(passport.session());
+ //Setup i18n
+ i18n.configure({
+ locales: supportedLanguages,
+ directory: __dirname + '/locales',
+ defaultLocale: 'en',
+ cookie: 'userLang'
+ });
+
+ app.use(i18n.init);
+
+ //Visitor Language Detection
+ app.use(function(req, res, next) {
+ var acceptLanguage = req.headers['accept-language'];
+ var languages = acceptLanguage.match(/[a-z]{2}(?!-)/g) || [];
+
+ var supportedLanguage = containsAnySupportedLanguages(languages);
+ if(!req.user && supportedLanguage !== null){
+ var currLanguage = res.cookie('userLang');
+
+ if(currLanguage && currLanguage !== supportedLanguage || !currLanguage){
+ res.clearCookie('userLang');
+ res.cookie('userLang', supportedLanguage, { maxAge: 90000, httpOnly: true });
+ }
+ } else if(req.user && (!req.cookies.hasOwnProperty('userLang') || req.cookies['userLang'] !== req.user.language) ){
+ res.cookie('userLang', req.user.language, { maxAge: 90000, httpOnly: true });
+ }
+ next();
+ });
+
// Globbing routing files
config.getGlobbedFiles('./app/routes/**/*.js').forEach(function(routePath) {
require(path.resolve(routePath))(app);
});
-
// Add headers for Sentry
-
app.use(function (req, res, next) {
// Website you wish to allow to connect
diff --git a/config/locales/de.json b/config/locales/de.json
new file mode 100644
index 00000000..f3095601
--- /dev/null
+++ b/config/locales/de.json
@@ -0,0 +1,21 @@
+{
+ "404_HEADER": "404 - Seite nicht gefunden",
+ "500_HEADER": "500 - Interner Serverfehler",
+ "404_BODY": "%s ist kein gültiger Pfad.",
+ "500_BODY": "Ein unerwarteter Fehler scheint aufgetreten zu sein, warum nicht versuchen, Ihre Seite zu aktualisieren oder Sie können uns kontaktieren, wenn das Problem weiterhin besteht.",
+ "EMAIL_GREETING": "Hallo da!",
+ "VERIFICATION_EMAIL_PARAGRAPH_1": "Willkommen bei TellForm! Hier ist ein spezieller Link um deinen neuen Account zu aktivieren:",
+ "VERIFICATION_EMAIL_LINK_TEXT": "Mein Konto aktivieren",
+ "VERIFICATION_EMAIL_PARAGRAPH_2": "Vielen Dank für die Nutzung unserer Dienste! Wenn Sie Fragen oder Anregungen haben, senden Sie uns bitte eine E-Mail an",
+ "VERIFICATION_EMAIL_SUBJECT": "Aktiviere dein neues TellForm-Konto!",
+ "VERIFICATION_EMAIL_TEXT": "Bitte bestätigen Sie Ihren Account, indem Sie auf den folgenden Link klicken oder ihn in Ihren Browser kopieren und einfügen: $ {URL}",
+ "EMAIL_SIGNATURE": "- Das TellForm-Team",
+ "WELCOME_EMAIL_PARAGRAPH_1": "Wir möchten Sie als unser neustes Mitglied begrüßen!",
+ "WELCOME_EMAIL_PARAGRAPH_2": "Wir wünschen Ihnen viel Spaß mit TellForm! Wenn Sie Probleme haben, senden Sie uns bitte eine E-Mail an",
+ "WELCOME_EMAIL_SUBJECT": "Willkommen bei %s!",
+ "WELCOME_EMAIL_TEXT": "Ihr Konto wurde erfolgreich verifiziert.",
+ "RESET_PASSWORD_CONFIRMATION_EMAIL_PARAGRAPH_1": "Dies ist eine Höflichkeitsnachricht, um zu bestätigen, dass Ihr Passwort gerade geändert wurde.",
+ "RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_1": "Hier ist ein spezieller Link, mit dem Sie Ihr Passwort zurücksetzen können: Bitte beachten Sie, dass es innerhalb einer Stunde zu Ihrem Schutz abläuft:",
+ "RESET_PASSWORD_REQUEST_EMAIL_LINK_TEXT": "Passwort zurücksetzen",
+ "RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_2": "Falls Sie dies nicht gewünscht haben, ignorieren Sie bitte diese E-Mail und Ihr Passwort bleibt unverändert."
+}
\ No newline at end of file
diff --git a/config/locales/en.json b/config/locales/en.json
new file mode 100644
index 00000000..668622a3
--- /dev/null
+++ b/config/locales/en.json
@@ -0,0 +1,22 @@
+{
+ "500_HEADER": "500 - Internal Server Error",
+ "404_HEADER": "404 - Page not found",
+ "404_BODY": "%s is not a valid path",
+ "500_BODY": "An unexpected error seems to have occured. Why not try refreshing your page? Or you can contact us if the problem persists.",
+ "EMAIL_GREETING": "Hello there!",
+ "VERIFICATION_EMAIL_PARAGRAPH_1": "Welcome to TellForm! Here is a special link to activate your new account:",
+ "VERIFICATION_EMAIL_LINK_TEXT": "Activate my account",
+ "VERIFICATION_EMAIL_PARAGRAPH_2": "Thanks so much for using our services! If you have any questions, or suggestions, please feel free to email us here at",
+ "VERIFICATION_EMAIL_SUBJECT": "Activate your new TellForm account!",
+ "VERIFICATION_EMAIL_TEXT": "Please verify your account by clicking the following link, or by copying and pasting it into your browser: ${URL}",
+ "EMAIL_SIGNATURE": "- The TellForm team",
+ "WELCOME_EMAIL_PARAGRAPH_1": "We would like to welcome you as our newest member!",
+ "WELCOME_EMAIL_PARAGRAPH_2": "We hope you enjoy using TellForm! If you have any trouble please feel free to email us here at",
+ "WELCOME_EMAIL_SUBJECT": "Welcome to %s!",
+ "WELCOME_EMAIL_TEXT": "Your account has been successfully verified.",
+ "RESET_PASSWORD_CONFIRMATION_EMAIL_PARAGRAPH_1": "This is a courtesy message to confirm that your password was just changed.",
+ "RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_1": "Here is a special link that will allow you to reset your password. Please note it will expire in one hour for your protection:",
+ "RESET_PASSWORD_REQUEST_EMAIL_LINK_TEXT": "Reset Your Password",
+ "RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_2": "If you did not request this, please ignore this email and your password will remain unchanged.",
+ "RESET_PASSWORD_CONFIRMATION_EMAIL_BODY_1": "RESET_PASSWORD_CONFIRMATION_EMAIL_BODY_1"
+}
\ No newline at end of file
diff --git a/config/locales/es.json b/config/locales/es.json
new file mode 100644
index 00000000..4a6ebce9
--- /dev/null
+++ b/config/locales/es.json
@@ -0,0 +1,21 @@
+{
+ "404_HEADER": "404 - Página no encontrada",
+ "500_HEADER": "500 - Error interno del servidor",
+ "404_BODY": "%s no es una ruta válida",
+ "500_BODY": "Parece que se produjo un error inesperado. ¿Por qué no intenta actualizar su página? O puede contactarnos si el problema persiste",
+ "EMAIL_GREETING": "¡Hola!",
+ "VERIFICATION_EMAIL_PARAGRAPH_1": "Bienvenido a TellForm. Aquí hay un enlace especial para activar su nueva cuenta:",
+ "VERIFICATION_EMAIL_LINK_TEXT": "Activar mi cuenta",
+ "VERIFICATION_EMAIL_PARAGRAPH_2": "¡Muchas gracias por utilizar nuestros servicios! Si tiene alguna pregunta o sugerencia, no dude en enviarnos un correo electrónico aquí",
+ "VERIFICATION_EMAIL_SUBJECT": "¡Active su nueva cuenta TellForm!",
+ "VERIFICATION_EMAIL_TEXT": "Verifique su cuenta haciendo clic en el siguiente enlace, o copiándolo y pegándolo en su navegador: $ {URL}",
+ "EMAIL_SIGNATURE": "- El equipo de TellForm",
+ "WELCOME_EMAIL_PARAGRAPH_1": "¡Nos gustaría darle la bienvenida como nuestro miembro más nuevo!",
+ "WELCOME_EMAIL_PARAGRAPH_2": "Esperamos que disfrute utilizando TellForm. Si tiene algún problema, no dude en enviarnos un correo electrónico aquí",
+ "WELCOME_EMAIL_SUBJECT": "¡Bienvenido a %s!",
+ "WELCOME_EMAIL_TEXT": "Su cuenta ha sido verificada con éxito",
+ "RESET_PASSWORD_CONFIRMATION_EMAIL_PARAGRAPH_1": "Este es un mensaje de cortesía para confirmar que su contraseña acaba de cambiarse",
+ "RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_1": "Aquí hay un enlace especial que le permitirá restablecer su contraseña. Tenga en cuenta que caducará en una hora para su protección:",
+ "RESET_PASSWORD_REQUEST_EMAIL_LINK_TEXT": "Restablecer su contraseña",
+ "RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_2": "Si no lo solicitó, ignore este correo electrónico y su contraseña no cambiará".
+}
\ No newline at end of file
diff --git a/config/locales/fr.json b/config/locales/fr.json
new file mode 100644
index 00000000..681f1bd3
--- /dev/null
+++ b/config/locales/fr.json
@@ -0,0 +1,21 @@
+{
+ "404_HEADER": "404 - Page non trouvée",
+ "500_HEADER": "500 - Erreur interne du serveur",
+ "404_BODY": "%s n'est pas un chemin valide.",
+ "500_BODY": "Une erreur inattendue semble s'être produite, pourquoi ne pas essayer d'actualiser votre page? Ou vous pouvez nous contacter si le problème persiste.",
+ "EMAIL_GREETING": "Bonjour!",
+ "VERIFICATION_EMAIL_PARAGRAPH_1": "Bienvenue sur TellForm! Voici un lien spécial pour activer votre nouveau compte:",
+ "VERIFICATION_EMAIL_LINK_TEXT": "Activer mon compte",
+ "VERIFICATION_EMAIL_PARAGRAPH_2": "Merci beaucoup pour l'utilisation de nos services! Si vous avez des questions ou des suggestions, n'hésitez pas à nous envoyer un courriel ici",
+ "VERIFICATION_EMAIL_SUBJECT": "¡Active su nueva cuenta TellForm!",
+ "VERIFICATION_EMAIL_TEXT": "Verifique su cuenta haciendo clic en el siguiente enlace, o copiándolo y pegándolo en su navegador: $ {URL}",
+ "EMAIL_SIGNATURE": "- L'équipe TellForm",
+ "WELCOME_EMAIL_PARAGRAPH_1": "Nous aimerions vous accueillir en tant que nouveau membre!",
+ "WELCOME_EMAIL_PARAGRAPH_2": "Nous espérons que vous apprécierez l'utilisation de TellForm! Si vous avez des problèmes, n'hésitez pas à nous envoyer un e-mail ici",
+ "WELCOME_EMAIL_SUBJECT": "Bienvenue dans %s!",
+ "WELCOME_EMAIL_TEXT": "Votre compte a été vérifié avec succès.",
+ "RESET_PASSWORD_CONFIRMATION_EMAIL_PARAGRAPH_1": "Ceci est un message de courtoisie pour confirmer que votre mot de passe a été modifié.",
+ "RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_1": "Voici un lien spécial qui vous permettra de réinitialiser votre mot de passe Veuillez noter qu'il expirera dans une heure pour votre protection:",
+ "RESET_PASSWORD_REQUEST_EMAIL_LINK_TEXT": "Réinitialiser votre mot de passe",
+ "RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_2": "Si vous ne l'avez pas demandé, veuillez ignorer cet e-mail et votre mot de passe restera inchangé."
+}
\ No newline at end of file
diff --git a/config/locales/it.json b/config/locales/it.json
new file mode 100644
index 00000000..ea0140a3
--- /dev/null
+++ b/config/locales/it.json
@@ -0,0 +1,21 @@
+{
+ "404_HEADER": "404 - Pagina non trovata",
+ "500_HEADER": "500 - Errore Server Interno",
+ "404_BODY": "%s non è un percorso valido",
+ "500_BODY": "Si è verificato un errore imprevisto: perché non provare a rinfrescare la tua pagina oppure puoi contattarci se il problema persiste",
+ "EMAIL_GREETING": "Ciao!",
+ "VERIFICATION_EMAIL_PARAGRAPH_1": "Benvenuti a TellForm! Ecco un collegamento speciale per attivare il tuo nuovo account:",
+ "VERIFICATION_EMAIL_LINK_TEXT": "Attiva il mio account",
+ "VERIFICATION_EMAIL_PARAGRAPH_2": "Grazie mille per l'utilizzo dei nostri servizi! Se hai domande o suggerimenti, non esitate a contattarci via",
+ "VERIFICATION_EMAIL_SUBJECT": "Attiva il tuo nuovo account TellForm",
+ "VERIFICATION_EMAIL_TEXT": "Verifica il tuo account facendo clic sul seguente collegamento o copiandolo e incollandolo nel tuo browser: $ {URL}",
+ "EMAIL_SIGNATURE": "- Il team TellForm",
+ "WELCOME_EMAIL_PARAGRAPH_1": "Vorremmo darVi il benvenuto come il nostro nuovo membro!",
+ "WELCOME_EMAIL_PARAGRAPH_2": "Speriamo che ti piace usare TellForm! Se hai problemi, non esitate a contattarci via",
+ "WELCOME_EMAIL_SUBJECT": "Benvenuto a %s!",
+ "WELCOME_EMAIL_TEXT": "Il tuo account è stato verificato correttamente.",
+ "RESET_PASSWORD_CONFIRMATION_EMAIL_PARAGRAPH_1": "Si tratta di un messaggio di cortesia per confermare che la password è stata appena modificata".
+ "RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_1": "Ecco un collegamento speciale che ti permetterà di reimpostare la tua password. Si prega di notare che scadrà in un'ora per la protezione:",
+ "RESET_PASSWORD_REQUEST_EMAIL_LINK_TEXT": "Ripristina la tua password",
+ "RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_2": "Se non l'hai richiesta, ignora questa email e la tua password rimane invariata."
+}
\ No newline at end of file
diff --git a/config/strategies/local.js b/config/strategies/local.js
index fda5a728..319324a6 100755
--- a/config/strategies/local.js
+++ b/config/strategies/local.js
@@ -14,9 +14,11 @@ module.exports = function () {
passwordField: 'password'
},
function (username, password, done) {
+ console.log('\n\n\n\n\nusername: '+username);
+ console.log('password: '+password)
User.findOne({
$or: [
- {'username': username},
+ {'username': username.toLowerCase()},
{'email': username}
]
}, function (err, user) {
diff --git a/gruntfile.js b/gruntfile.js
index efa55746..1ed5f52b 100755
--- a/gruntfile.js
+++ b/gruntfile.js
@@ -23,11 +23,11 @@ module.exports = function(grunt) {
// Unified Watch Object
var watchFiles = {
- serverViews: ['app/views/**/*.*'],
+ serverViews: ['app/views/**/*.pug'],
serverJS: ['gruntfile.js', 'server.js', 'config/**/*.js', 'app/**/*.js', '!app/tests/'],
clientViews: ['public/modules/**/*.html', 'public/form_modules/forms/base/**/*.html', '!public/modules/forms/base/**/*.html',],
- clientJS: ['public/js/*.js', 'public/form_modules/**/*.js', 'public/modules/**/*.js'],
+ clientJS: ['public/form_modules/**/*.js', 'public/modules/**/*.js'],
clientCSS: ['public/modules/**/*.css'],
serverTests: ['app/tests/**/*.js'],
@@ -145,10 +145,14 @@ module.exports = function(grunt) {
}
},
ngAnnotate: {
+ options:{
+ add: true,
+ remove: true
+ },
production: {
files: {
- 'public/dist/application.js': '<%= applicationJavaScriptFiles %>',
- 'public/dist/form-application.js': '<%= formApplicationJavaScriptFiles %>'
+ 'public/dist/application.js': ['public/application.js', 'public/config.js', 'public/form_modules/**/*.js'],
+ 'public/dist/form_application.js': ['public/form-application.js', 'public/form-config.js', 'public/form_modules/**/*.js']
}
}
},
@@ -291,7 +295,7 @@ module.exports = function(grunt) {
target: {
src: ['./scripts/setup.js']
}
- }
+ },
});
grunt.event.on('coverage', function(lcov, done){
@@ -335,7 +339,7 @@ module.exports = function(grunt) {
grunt.registerTask('secure', ['env:secure', 'lint', 'html2js:main', 'html2js:forms', 'concurrent:default']);
// Lint task(s).
- grunt.registerTask('lint', ['jshint', 'csslint']);
+ grunt.registerTask('lint', ['jshint', 'csslint', 'i18nlint:client', 'i18nlint:server']);
grunt.registerTask('lint:tests', ['jshint:allTests']);
// Build task(s).
diff --git a/package.json b/package.json
index ff9c9acf..3700f6b0 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "TellForm",
"description": "Opensource alternative to TypeForm",
"version": "2.1.0",
- "homepage": "https://github.com/whitef0x0/tellform",
+ "homepage": "https://github.com/tellform/tellform",
"authors": [
"David Baldwynn (http://baldwynn.me)"
],
@@ -10,7 +10,7 @@
"private": true,
"repository": {
"type": "git",
- "url": "https://github.com/whitef0x0/tellform.git"
+ "url": "https://github.com/tellform/tellform.git"
},
"engines": {
"node": "6.x.x",
@@ -19,8 +19,8 @@
"scripts": {
"addcontrib": "all-contributors add",
"generate": "all-contributors generate",
- "start": "npm run version && grunt",
- "test": "npm run version && grunt test",
+ "start": "grunt",
+ "test": "grunt test",
"postinstall": "bower install --config.interactive=false; grunt build;",
"init": "node scripts/setup.js"
},
@@ -33,11 +33,11 @@
"compression": "~1.6.0",
"connect": "^3.4.1",
"connect-mongo": "~0.8.2",
- "consolidate": "~0.13.1",
+ "consolidate": "~0.14.5",
"cookie-parser": "~1.4.0",
"deep-diff": "^0.3.4",
"dotenv": "^2.0.0",
- "email-verification": "~0.4.1",
+ "email-verification": "github:tellform/node-email-verification",
"express": "~4.13.3",
"express-session": "~1.12.1",
"glob": "^7.0.3",
@@ -51,6 +51,7 @@
"grunt-html2js": "~0.3.5",
"grunt-ng-annotate": "~1.0.1",
"helmet": "3.5.0",
+ "i18n": "^0.8.3",
"jit-grunt": "^0.9.1",
"lodash": "^4.17.4",
"main-bower-files": "~2.9.0",
@@ -65,6 +66,7 @@
"passport-localapikey-update": "^0.5.0",
"path-exists": "^2.1.0",
"prerender-node": "^2.2.1",
+ "pug": "^2.0.0-rc.4",
"random-js": "^1.0.8",
"raven": "^0.9.0",
"request": "^2.83.0",
@@ -87,14 +89,15 @@
"grunt-contrib-concat": "^1.0.1",
"grunt-contrib-copy": "^1.0.0",
"grunt-contrib-uglify": "^0.11.1",
+ "grunt-contrib-watch": "~0.6.1",
"grunt-execute": "^0.2.2",
+ "grunt-i18nlint": "github:jwarby/grunt-i18nlint",
+ "grunt-karma": "~0.12.1",
"grunt-mocha-istanbul": "^3.0.1",
"grunt-mocha-test": "~0.12.1",
- "grunt-contrib-watch": "~0.6.1",
"grunt-newer": "~1.1.1",
- "grunt-usemin": "^3.1.1",
- "grunt-karma": "~0.12.1",
"grunt-nodemon": "~0.4.0",
+ "grunt-usemin": "^3.1.1",
"grunt-wiredep": "^3.0.1",
"istanbul": "^0.4.0",
"jasmine-core": "^2.4.1",
diff --git a/public/dist/application.js b/public/dist/application.js
index 57c66bcb..18eb286f 100644
--- a/public/dist/application.js
+++ b/public/dist/application.js
@@ -600,7 +600,7 @@ angular.module('TellForm.templates', []).run(['$templateCache', function($templa
$templateCache.put("modules/users/views/authentication/signin.client.view.html",
"");
$templateCache.put("modules/users/views/authentication/signup-success.client.view.html",
- "{{ 'SUCCESS_HEADER' | translate }} {{ 'SUCCESS_TEXT' | translate }} {{ 'NOT_ACTIVATED_YET' | translate }} {{ 'BEFORE_YOU_CONTINUE' | translate }} polydaic@gmail.com
");
+ "{{ 'SUCCESS_HEADER' | translate }} {{ 'SUCCESS_TEXT' | translate }} {{ 'NOT_ACTIVATED_YET' | translate }} {{ 'BEFORE_YOU_CONTINUE' | translate }} team@tellform.com
");
$templateCache.put("modules/users/views/authentication/signup.client.view.html",
"");
$templateCache.put("modules/users/views/password/forgot-password.client.view.html",
@@ -737,8 +737,8 @@ angular.module(ApplicationConfiguration.applicationModuleName).run(['$rootScope'
'use strict';
-angular.module('core').controller('HeaderController', ['$rootScope', '$scope', 'Menus', '$state', 'Auth', 'User', '$window', '$translate', '$locale',
- function ($rootScope, $scope, Menus, $state, Auth, User, $window, $translate, $locale) {
+angular.module('core').controller('HeaderController', ['$rootScope', '$scope', 'Menus', '$state', 'Auth', 'User', '$window', '$translate',
+ function ($rootScope, $scope, Menus, $state, Auth, User, $window, $translate) {
$rootScope.signupDisabled = $window.signupDisabled;
@@ -749,12 +749,8 @@ angular.module('core').controller('HeaderController', ['$rootScope', '$scope', '
$rootScope.languages = $scope.languages = ['en', 'fr', 'es', 'it', 'de'];
//Set global app language
- if($scope.authentication.isAuthenticated()){
- $rootScope.language = $scope.user.language;
- }else {
- $rootScope.language = $locale.id.substring(0,2);
- }
- $translate.use($rootScope.language);
+ $rootScope.language = $scope.user.language;
+ $translate.use($scope.user.language);
$scope.isCollapsed = false;
$rootScope.hideNav = false;
@@ -1278,33 +1274,36 @@ angular.module('users').config(['$stateProvider',
'use strict';
-angular.module('users').controller('AuthenticationController', ['$scope', '$location', '$state', '$rootScope', 'User', 'Auth',
- function($scope, $location, $state, $rootScope, User, Auth) {
-
+angular.module('users').controller('AuthenticationController', ['$scope', '$location', '$state', '$rootScope', 'User', 'Auth', '$translate', '$window',
+ function($scope, $location, $state, $rootScope, User, Auth, $translate, $window) {
+
$scope = $rootScope;
$scope.credentials = {};
$scope.error = '';
+ $scope.forms = {};
$scope.signin = function() {
- User.login($scope.credentials).then(
- function(response) {
- Auth.login(response);
- $scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User);
+ if(!$scope.forms.signinForm.$invalid){
+ User.login($scope.credentials).then(
+ function(response) {
+ Auth.login(response);
+ $scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User);
- if($state.previous.name !== 'home' && $state.previous.name !== 'verify' && $state.previous.name !== '') {
- $state.go($state.previous.name);
- } else {
- $state.go('listForms');
+ if($state.previous.name !== 'home' && $state.previous.name !== 'verify' && $state.previous.name !== '') {
+ $state.go($state.previous.name);
+ } else {
+ $state.go('listForms');
+ }
+ },
+ function(error) {
+ $rootScope.user = Auth.ensureHasCurrentUser(User);
+ $scope.user = $rootScope.user;
+
+ $scope.error = error;
+ console.error('loginError: '+error);
}
- },
- function(error) {
- $rootScope.user = Auth.ensureHasCurrentUser(User);
- $scope.user = $rootScope.user;
-
- $scope.error = error;
- console.error('loginError: '+error);
- }
- );
+ );
+ }
};
$scope.signup = function() {
@@ -1313,20 +1312,22 @@ angular.module('users').controller('AuthenticationController', ['$scope', '$loca
return;
}
- User.signup($scope.credentials).then(
- function(response) {
- $state.go('signup-success');
- },
- function(error) {
- console.error(error);
- if(error) {
- $scope.error = error;
- console.error(error);
- } else {
- console.error('No response received');
- }
- }
- );
+ if(!$scope.forms.signupForm.$invalid){
+ User.signup($scope.credentials).then(
+ function(response) {
+ $state.go('signup-success');
+ },
+ function(error) {
+ console.error(error);
+ if(error) {
+ $scope.error = error;
+ console.error(error);
+ } else {
+ console.error('No response received');
+ }
+ }
+ );
+ }
};
}
@@ -1334,20 +1335,24 @@ angular.module('users').controller('AuthenticationController', ['$scope', '$loca
'use strict';
-angular.module('users').controller('PasswordController', ['$scope', '$stateParams', '$state', 'User',
- function($scope, $stateParams, $state, User) {
+angular.module('users').controller('PasswordController', ['$scope', '$stateParams', '$state', 'User', '$translate', '$window',
+ function($scope, $stateParams, $state, User, $translate, $window) {
+ $translate.use($window.locale);
$scope.error = '';
+ $scope.forms = {};
// Submit forgotten password account id
$scope.askForPasswordReset = function() {
User.askForPasswordReset($scope.credentials).then(
function(response){
$scope.success = response.message;
+ $scope.error = null;
$scope.credentials = null;
},
function(error){
$scope.error = error;
+ $scope.success = null;
$scope.credentials = null;
}
);
@@ -1355,21 +1360,25 @@ angular.module('users').controller('PasswordController', ['$scope', '$stateParam
// Change user password
$scope.resetUserPassword = function() {
- $scope.success = $scope.error = null;
- User.resetPassword($scope.passwordDetails, $stateParams.token).then(
- function(response){
- // If successful show success message and clear form
- $scope.success = response.message;
- $scope.passwordDetails = null;
+ if(!$scope.forms.resetPasswordForm.$invalid){
+ $scope.success = $scope.error = null;
+ User.resetPassword($scope.passwordDetails, $stateParams.token).then(
+ function(response){
+ // If successful show success message and clear form
+ $scope.success = response.message;
+ $scope.error = null;
+ $scope.passwordDetails = null;
- // And redirect to the index page
- $state.go('reset-success');
- },
- function(error){
- $scope.error = error.message || error;
- $scope.passwordDetails = null;
- }
- );
+ // And redirect to the index page
+ $state.go('reset-success');
+ },
+ function(error){
+ $scope.error = error.message || error;
+ $scope.success = null;
+ $scope.passwordDetails = null;
+ }
+ );
+ }
};
}
]);
@@ -1409,8 +1418,10 @@ angular.module('users').controller('SettingsController', ['$scope', '$rootScope'
}).success(function(response) {
// If successful show success message and clear form
$scope.success = true;
+ $scope.error = null;
$scope.user = response;
}).error(function(response) {
+ $scope.success = null;
$scope.error = response.message;
});
};
@@ -1423,8 +1434,10 @@ angular.module('users').controller('SettingsController', ['$scope', '$rootScope'
user.$update(function(response) {
$scope.success = true;
+ $scope.error = null;
$scope.user = response;
}, function(response) {
+ $scope.success = null;
$scope.error = response.data.message;
});
} else {
@@ -1439,8 +1452,10 @@ angular.module('users').controller('SettingsController', ['$scope', '$rootScope'
$http.post('/users/password', $scope.passwordDetails).success(function(response) {
// If successful show success message and clear form
$scope.success = true;
+ $scope.error = null;
$scope.passwordDetails = null;
}).error(function(response) {
+ $scope.success = null;
$scope.error = response.message;
});
};
@@ -1450,8 +1465,9 @@ angular.module('users').controller('SettingsController', ['$scope', '$rootScope'
'use strict';
-angular.module('users').controller('VerifyController', ['$scope', '$state', '$rootScope', 'User', 'Auth', '$stateParams',
- function($scope, $state, $rootScope, User, Auth, $stateParams) {
+angular.module('users').controller('VerifyController', ['$scope', '$state', '$rootScope', 'User', 'Auth', '$stateParams', '$translate', '$window',
+ function($scope, $state, $rootScope, User, Auth, $stateParams, $translate, $window) {
+ $translate.use($window.locale);
$scope.isResetSent = false;
$scope.credentials = {};
@@ -1462,11 +1478,13 @@ angular.module('users').controller('VerifyController', ['$scope', '$state', '$ro
User.resendVerifyEmail($scope.credentials.email).then(
function(response){
$scope.success = response.message;
+ $scope.error = null;
$scope.credentials = null;
$scope.isResetSent = true;
},
function(error){
$scope.error = error;
+ $scope.success = null;
$scope.credentials.email = null;
$scope.isResetSent = false;
}
@@ -1480,11 +1498,13 @@ angular.module('users').controller('VerifyController', ['$scope', '$state', '$ro
User.validateVerifyToken($stateParams.token).then(
function(response){
$scope.success = response.message;
+ $scope.error = null;
$scope.isResetSent = true;
$scope.credentials.email = null;
},
function(error){
$scope.isResetSent = false;
+ $scope.success = null;
$scope.error = error;
$scope.credentials.email = null;
}
@@ -1731,9 +1751,9 @@ angular.module('core').config(['$translateProvider', function ($translateProvide
SIGNIN_TAB: 'Sign In',
SIGNOUT_TAB: 'Signout',
EDIT_PROFILE: 'Edit Profile',
- MY_FORMS: 'My Forms',
MY_SETTINGS: 'My Settings',
- CHANGE_PASSWORD: 'Change Password'
+ CHANGE_PASSWORD: 'Change Password',
+ TOGGLE_NAVIGATION: 'Toggle navigation'
});
$translateProvider.preferredLanguage('en')
@@ -1752,9 +1772,41 @@ angular.module('core').config(['$translateProvider', function ($translateProvide
SIGNIN_TAB: 'Connexion',
SIGNOUT_TAB: 'Créer un compte',
EDIT_PROFILE: 'Modifier Mon Profil',
- MY_FORMS: 'Mes Formulaires',
MY_SETTINGS: 'Mes Paramètres',
- CHANGE_PASSWORD: 'Changer mon Mot de Pass'
+ CHANGE_PASSWORD: 'Changer mon Mot de Pass',
+ TOGGLE_NAVIGATION: 'Basculer la navigation',
+ });
+}]);
+
+'use strict';
+
+angular.module('core').config(['$translateProvider', function ($translateProvider) {
+
+ $translateProvider.translations('de', {
+ MENU: 'MENÜ',
+ SIGNUP_TAB: 'Anmelden',
+ SIGNIN_TAB: 'Anmeldung',
+ SIGNOUT_TAB: 'Abmelden',
+ EDIT_PROFILE: 'Profil bearbeiten',
+ MY_SETTINGS: 'Meine Einstellungen',
+ CHANGE_PASSWORD: 'Passwort ändern',
+ TOGGLE_NAVIGATION: 'Navigation umschalten'
+ });
+}]);
+
+'use strict';
+
+angular.module('core').config(['$translateProvider', function ($translateProvider) {
+
+ $translateProvider.translations('it', {
+ MENU: 'MENÜ',
+ SIGNUP_TAB: 'Vi Phrasal',
+ SIGNIN_TAB: 'Accedi',
+ SIGNOUT_TAB: 'Esci',
+ EDIT_PROFILE: 'Modifica Profilo',
+ MY_SETTINGS: 'Mie Impostazioni',
+ CHANGE_PASSWORD: 'Cambia la password',
+ TOGGLE_NAVIGATION: 'Attiva la navigazione'
});
}]);
@@ -1768,9 +1820,9 @@ angular.module('core').config(['$translateProvider', function ($translateProvide
SIGNIN_TAB: 'Entrar',
SIGNOUT_TAB: 'Salir',
EDIT_PROFILE: 'Editar Perfil',
- MY_FORMS: 'Mis formularios',
MY_SETTINGS: 'Mis configuraciones',
- CHANGE_PASSWORD: 'Cambiar contraseña'
+ CHANGE_PASSWORD: 'Cambiar contraseña',
+ TOGGLE_NAVIGATION: 'Navegación de palanca'
});
}]);
@@ -1778,8 +1830,8 @@ angular.module('core').config(['$translateProvider', function ($translateProvide
'use strict';
// Forms controller
-angular.module('forms').controller('AdminFormController', ['$rootScope', '$window', '$scope', '$stateParams', '$state', 'Forms', 'CurrentForm', '$http', '$uibModal', 'myForm', '$filter',
- function($rootScope, $window, $scope, $stateParams, $state, Forms, CurrentForm, $http, $uibModal, myForm, $filter) {
+angular.module('forms').controller('AdminFormController', ['$rootScope', '$window', '$scope', '$stateParams', '$state', 'Forms', 'CurrentForm', '$http', '$uibModal', 'myForm', '$filter', '$translate',
+ function($rootScope, $window, $scope, $stateParams, $state, Forms, CurrentForm, $http, $uibModal, myForm, $filter, $translate) {
//Set active tab to Create
$scope.activePill = 0;
@@ -2526,7 +2578,7 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope',
var initController = function(){
$http({
method: 'GET',
- url: '/forms'+$scope.myform._id+'/submissions'
+ url: '/forms/'+$scope.myform._id+'/submissions'
}).then(function successCallback(response) {
var defaultFormFields = _.cloneDeep($scope.myform.form_fields);
@@ -2684,72 +2736,75 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope',
'use strict';
//TODO: DAVID: URGENT: Make this a $resource that fetches valid field types from server
-angular.module('forms').service('FormFields', [ '$filter',
- function($filter) {
+angular.module('forms').service('FormFields', [ '$rootScope', '$translate', '$window',
+ function($rootScope, $translate, $window) {
+ $translate.use($window.user.language);
+ console.log($translate.instant('SHORT_TEXT'));
+
this.types = [
{
name : 'textfield',
- value : $filter('translate')('SHORT_TEXT'),
+ value : $translate.instant('SHORT_TEXT'),
},
{
name : 'email',
- value : $filter('translate')('EMAIL'),
+ value : $translate.instant('EMAIL'),
},
{
name : 'radio',
- value : $filter('translate')('MULTIPLE_CHOICE'),
+ value : $translate.instant('MULTIPLE_CHOICE'),
},
{
name : 'dropdown',
- value : $filter('translate')('DROPDOWN'),
+ value : $translate.instant('DROPDOWN'),
},
{
name : 'date',
- value : $filter('translate')('DATE'),
+ value : $translate.instant('DATE'),
},
{
name : 'textarea',
- value : $filter('translate')('PARAGRAPH'),
+ value : $translate.instant('PARAGRAPH'),
},
{
name : 'yes_no',
- value : $filter('translate')('YES_NO'),
+ value : $translate.instant('YES_NO'),
},
{
name : 'legal',
- value : $filter('translate')('LEGAL'),
+ value : $translate.instant('LEGAL'),
},
// {
// name : 'sig',
- // value : $filter('translate')('SIGNATURE'),
+ // value : $translate.instant('SIGNATURE'),
// },
// {
// name : 'file',
- // value : $filter('translate')('FILE_UPLOAD'),
+ // value : $translate.instant('FILE_UPLOAD'),
// },
{
name : 'rating',
- value : $filter('translate')('RATING'),
+ value : $translate.instant('RATING'),
},
{
name : 'link',
- value : $filter('translate')('LINK'),
+ value : $translate.instant('LINK'),
},
{
name : 'number',
- value : $filter('translate')('NUMBERS'),
+ value : $translate.instant('NUMBERS'),
},
// {
// name : 'scale',
- // value : $filter('translate')('OPINION SCALE'),
+ // value : $translate.instant('OPINION SCALE'),
// },
// {
// name : 'stripe',
- // value : $filter('translate')('PAYMENT'),
+ // value : $translate.instant('PAYMENT'),
// },
{
name : 'statement',
- value : $filter('translate')('STATEMENT')
+ value : $translate.instant('STATEMENT')
}
];
}
@@ -2836,16 +2891,17 @@ angular.module('users').config(['$translateProvider', function ($translateProvid
SUBMIT_BTN: 'Submit',
ASK_FOR_NEW_PASSWORD: 'Ask for new password reset',
- PASSWORD_RESET_INVALID: 'Password reset is invalid',
- PASSWORD_RESET_SUCCESS: 'Passport successfully reset',
- PASSWORD_CHANGE_SUCCESS: 'Passport successfully changed',
+ PASSWORD_RESET_INVALID: 'Password reset link is invalid',
+ PASSWORD_RESET_SUCCESS: 'Password successfully reset',
+ PASSWORD_CHANGE_SUCCESS: 'Password successfully changed',
RESET_PASSWORD: 'Reset your password',
CHANGE_PASSWORD: 'Change your password',
CONTINUE_TO_LOGIN: 'Continue to login page',
VERIFY_SUCCESS: 'Account successfully activated',
- VERIFY_ERROR: 'Verification link is invalid or has expired'
+ VERIFY_ERROR: 'Verification link is invalid or has expired',
+ ERROR: 'Error'
});
$translateProvider.preferredLanguage('en')
@@ -2894,20 +2950,163 @@ angular.module('users').config(['$translateProvider', function ($translateProvid
SUBMIT_BTN: 'Enregistrer',
ASK_FOR_NEW_PASSWORD: 'Demander un nouveau mot de pass ',
- PASSWORD_RESET_INVALID: 'Le nouveau mot de passe est invalid',
+ PASSWORD_RESET_INVALID: 'Ce lien de réinitialisation de mot de passe a déjà expiré',
PASSWORD_RESET_SUCCESS: 'Mot de passe réinitialisé avec succès',
PASSWORD_CHANGE_SUCCESS: 'Mot de passe enregistré avec succès',
CONTINUE_TO_LOGIN: 'Allez à la page de connexion',
VERIFY_SUCCESS: 'Votre compte est activé !',
- VERIFY_ERROR: 'Le lien de vérification est invalide ou à expiré'
+ VERIFY_ERROR: 'Le lien de vérification est invalide ou à expiré',
+ ERROR: 'Erreur'
});
}]);
'use strict';
+angular.module('users').config(['$translateProvider', function ($translateProvider) {
+
+ $translateProvider.translations('de', {
+ ACCESS_DENIED_TEXT: 'Sie müssen eingeloggt sein, um auf diese Seite zugreifen zu können',
+ USERNAME_OR_EMAIL_LABEL: 'Benutzername oder E-Mail',
+ USERNAME_LABEL: 'Benutzername',
+ PASSWORD_LABEL: 'Passwort',
+ CURRENT_PASSWORD_LABEL: 'Aktuelles Passwort',
+ NEW_PASSWORD_LABEL: 'Neues Passwort',
+ VERIFY_PASSWORD_LABEL: 'Passwort bestätigen',
+ UPDATE_PASSWORD_LABEL: 'Passwort aktualisieren',
+ FIRST_NAME_LABEL: 'Vorname',
+ LAST_NAME_LABEL: 'Nachname',
+ LANGUAGE_LABEL: 'Sprache',
+ EMAIL_LABEL: 'Email',
+
+ SIGNUP_ACCOUNT_LINK: 'Haben Sie kein Konto? Hier registrieren',
+ SIGN_IN_ACCOUNT_LINK: 'Haben Sie bereits ein Konto? Hier anmelden',
+ SIGNUP_HEADER_TEXT: 'Registrieren',
+ SIGNIN_HEADER_TEXT: 'Anmelden',
+
+ SIGNUP_ERROR_TEXT: 'Konnte die Registrierung aufgrund von Fehlern nicht abschließen',
+ ENTER_ACCOUNT_EMAIL: 'Geben Sie Ihre Konto-E-Mail ein.',
+ RESEND_VERIFICATION_EMAIL: 'Bestätigungs-E-Mail erneut senden',
+ SAVE_CHANGES: 'Änderungen speichern',
+ CANCEL_BTN: 'Abbrechen',
+
+ EDIT_PROFILE: 'Bearbeiten Sie Ihr Profil',
+ UPDATE_PROFILE_BTN: 'Profil aktualisieren',
+ PROFILE_SAVE_SUCCESS: 'Profil wurde erfolgreich gespeichert',
+ PROFILE_SAVE_ERROR: 'Könnte Ihr Profil nicht speichern.',
+ CONNECTED_SOCIAL_ACCOUNTS: 'Verbundene Sozialkonten',
+ CONNECT_OTHER_SOCIAL_ACCOUNTS: 'Andere soziale Konten verbinden',
+
+ FORGOT_PASSWORD_LINK: 'Passwort vergessen?',
+ REVERIFY_ACCOUNT_LINK: 'Bestätige deine Bestätigungs-E-Mail erneut',
+
+ SIGNIN_BTN: "Anmelden",
+ SIGNUP_BTN: 'Registrieren',
+ SAVE_PASSWORD_BTN: 'Passwort speichern',
+
+ SUCCESS_HEADER: 'Anmeldung erfolgreich',
+ SUCCESS_TEXT: 'Sie haben ein Konto erfolgreich bei TellForm registriert.',
+ VERIFICATION_EMAIL_SENT: 'Bestätigungs-E-Mail wurde gesendet',
+ VERIFICATION_EMAIL_SENT_TO: 'Es wurde eine Bestätigungs-E-Mail gesendet.',
+ NOT_ACTIVATED_YET: 'Dein Account ist noch nicht aktiviert',
+ BEFORE_YOU_CONTINUE: 'Bevor Sie fortfahren, überprüfen Sie bitte Ihre E-Mail-Adresse auf Überprüfung. Wenn Sie nicht innerhalb von 24 Stunden erhalten Sie uns eine Zeile bei ',
+ CHECK_YOUR_EMAIL: 'Überprüfe deine E-Mail und klicke auf den Aktivierungslink, um deinen Account zu aktivieren. Wenn Sie irgendwelche Fragen haben, lassen Sie uns eine Zeile bei ',
+ WEITER: 'Weiter',
+
+ PASSWORD_RESTORE_HEADER: 'Wiederherstellen Ihres Passworts',
+ ENTER_YOUR_EMAIL: 'Geben Sie Ihre E-Mail-Adresse ein.',
+ SUBMIT_BTN: 'Senden',
+
+ ASK_FOR_NEW_PASSWORD: 'Neues Passwort zurücksetzen',
+ PASSWORD_RESET_INVALID: 'Dieser Link zum Zurücksetzen des Passworts ist bereits abgelaufen',
+ PASSWORD_RESET_SUCCESS: 'Passport erfolgreich zurückgesetzt',
+ PASSWORD_CHANGE_SUCCESS: 'Pass wurde erfolgreich geändert',
+ RESET_PASSWORD: 'Passwort zurücksetzen',
+ CHANGE_PASSWORD: 'Ändern Sie Ihr Passwort',
+
+ CONTINUE_TO_LOGIN: 'Weiter zur Anmeldeseite',
+
+ VERIFY_SUCCESS: 'Konto erfolgreich aktiviert',
+ VERIFY_ERROR: 'Überprüfungslink ist ungültig oder abgelaufen',
+ ERROR: 'Fehler'
+ });
+}]);
+
+'use strict';
+
+angular.module('users').config(['$translateProvider', function ($translateProvider) {
+
+ $translateProvider.translations('it', {
+ ACCESS_DENIED_TEXT: 'Devi aver effettuato l\'accesso per accedere a questa pagina',
+ USERNAME_OR_EMAIL_LABEL: 'Nome utente o posta elettronica',
+ USERNAME_LABEL: 'Nome utente',
+ PASSWORD_LABEL: 'Password',
+ CURRENT_PASSWORD_LABEL: 'Current Password',
+ NEW_PASSWORD_LABEL: 'Nuova password',
+ VERIFY_PASSWORD_LABEL: 'Verifica password',
+ UPDATE_PASSWORD_LABEL: 'Aggiorna password',
+ FIRST_NAME_LABEL: 'Nome',
+ LAST_NAME_LABEL: 'Cognome',
+ LANGUAGE_LABEL: 'Lingua',
+ EMAIL_LABEL: 'Email',
+
+ SIGNUP_ACCOUNT_LINK: 'Non hai un account? Iscriviti qui ',
+ SIGN_IN_ACCOUNT_LINK: 'Hai già un account? Accedi qui ',
+ SIGNUP_HEADER_TEXT: 'Iscriviti',
+ SIGNIN_HEADER_TEXT: 'Accedi',
+
+ SIGNUP_ERROR_TEXT: 'Impossibile completare la registrazione a causa di errori',
+ ENTER_ACCOUNT_EMAIL: "Inserisci l'email del tuo account.",
+ RESEND_VERIFICATION_EMAIL: 'Ripeti l\'email di verifica',
+ SAVE_CHANGES: 'Salva modifiche',
+ CANCEL_BTN: 'Annulla',
+
+ EDIT_PROFILE: 'Modifica il tuo profilo',
+ UPDATE_PROFILE_BTN: 'Aggiorna profilo',
+ PROFILE_SAVE_SUCCESS: 'Profilo salvato con successo',
+ PROFILE_SAVE_ERROR: 'Impossibile salvare il tuo profilo.',
+ CONNECTED_SOCIAL_ACCOUNTS: 'Conti sociali connessi',
+ CONNECT_OTHER_SOCIAL_ACCOUNTS: 'Connetti altri account sociali',
+
+ FORGOT_PASSWORD_LINK: 'Hai dimenticato la password?',
+ REVERIFY_ACCOUNT_LINK: 'Ripeti la tua email di verifica',
+
+ SIGNIN_BTN: 'Accedi',
+ SIGNUP_BTN: 'Iscriviti',
+ SAVE_PASSWORD_BTN: 'Salva password',
+
+ SUCCESS_HEADER: 'Registra il successo',
+ SUCCESS_TEXT: 'Hai registrato un account con TellForm.',
+ VERIFICATION_EMAIL_SENT: 'L\'email di verifica è stata inviata',
+ VERIFICATION_EMAIL_SENT_TO: 'E\' stata inviata un\'email di verifica a ',
+ NOT_ACTIVATED_YET: 'Ma il tuo account non è ancora attivato',
+ BEFORE_YOU_CONTINUE: 'Prima di continuare, assicurati di controllare la tua email per la nostra verifica. Se non lo ricevi entro 24 ore ci cali una linea a ',
+ CHECK_YOUR_EMAIL: 'Controlla la tua email e fai clic sul link di attivazione per attivare il tuo account. Se hai domande, fai una linea a ',
+ CONTINUA: 'Continua',
+
+ PASSWORD_RESTORE_HEADER: 'Ripristina password',
+ ENTER_YOUR_EMAIL: 'Inserisci l\'email del tuo account',
+ SUBMIT_BTN: 'Invia',
+
+ ASK_FOR_NEW_PASSWORD: 'Richiedi nuova password reimpostata',
+ PASSWORD_RESET_INVALID: 'Questo collegamento per la reimpostazione della password è già scaduto',
+ PASSWORD_RESET_SUCCESS: 'Passaporto resettato con successo',
+ PASSWORD_CHANGE_SUCCESS: 'Passaporto modificato con successo',
+ RESET_PASSWORD: 'Ripristina la tua password',
+ CHANGE_PASSWORD: 'Modifica password',
+
+ CONTINUE_TO_LOGIN: 'Continua alla pagina di login',
+
+ VERIFY_SUCCESS: 'Account attivato correttamente',
+ VERIFY_ERROR: 'Il collegamento di verifica non è valido o è scaduto',
+ ERROR: 'Errore'
+ });
+}]);
+
+'use strict';
+
angular.module('users').config(['$translateProvider', function ($translateProvider) {
$translateProvider.translations('es', {
@@ -2963,7 +3162,7 @@ angular.module('users').config(['$translateProvider', function ($translateProvid
SUBMIT_BTN: 'Enviar',
ASK_FOR_NEW_PASSWORD: 'Pedir reseteo de contraseña',
- PASSWORD_RESET_INVALID: 'El reseteo de la contraseña es inválido',
+ PASSWORD_RESET_INVALID: 'Este enlace de restablecimiento de contraseña ya ha caducado',
PASSWORD_RESET_SUCCESS: 'Contraseña exitosamente reseteada',
PASSWORD_CHANGE_SUCCESS: 'Contraseña exitosamente cambiada',
RESET_PASSWORD: 'Resetear contraseña',
@@ -2972,7 +3171,8 @@ angular.module('users').config(['$translateProvider', function ($translateProvid
CONTINUE_TO_LOGIN: 'Ir a la página de ingreso',
VERIFY_SUCCESS: 'Cuenta activada exitosamente',
- VERIFY_ERROR: 'El link de verificación es inválido o inexistente'
+ VERIFY_ERROR: 'El link de verificación es inválido o inexistente',
+ ERROR: 'Error'
});
}]);
@@ -3071,7 +3271,7 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
IS_NOT_EQUAL_TO: 'is not equal to',
IS_GREATER_THAN: 'is greater than',
IS_GREATER_OR_EQUAL_THAN: 'is greater or equal than',
- IS_SMALLER_THAN: 'is_smaller_than',
+ IS_SMALLER_THAN: 'is smaller than',
IS_SMALLER_OR_EQUAL_THAN: 'is smaller or equal than',
CONTAINS: 'contains',
DOES_NOT_CONTAINS: 'does not contain',
@@ -3107,7 +3307,6 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
LOCATION: 'Location',
IP_ADDRESS: 'IP Address',
DATE_SUBMITTED: 'Date Submitted',
- GENERATED_PDF: 'Generated PDF',
//Design View
BACKGROUND_COLOR: 'Background Color',
@@ -3174,35 +3373,380 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
angular.module('forms').config(['$translateProvider', function ($translateProvider) {
- $translateProvider.translations('french', {
- FORM_SUCCESS: 'Votre formulaire a été enregistré!',
- REVIEW: 'Incomplet',
- BACK_TO_FORM: 'Retourner au formulaire',
- EDIT_FORM: 'Éditer le Tellform',
- CREATE_FORM: 'Créer un TellForm',
- ADVANCEMENT: '{{done}} complétés sur {{total}}',
- CONTINUE_FORM: 'Aller au formulaire',
- REQUIRED: 'obligatoire',
- COMPLETING_NEEDED: '{{answers_not_completed}} réponse(s) doive(nt) être complétée(s)',
- OPTIONAL: 'facultatif',
- ERROR_EMAIL_INVALID: 'Merci de rentrer une adresse mail valide',
- ERROR_NOT_A_NUMBER: 'Merce de ne rentrer que des nombres',
- ERROR_URL_INVALID: 'Merci de rentrer une url valide',
- OK: 'OK',
- ENTER: 'presser ENTRÉE',
- YES: 'Oui',
- NO: 'Non',
- NEWLINE: 'presser SHIFT+ENTER pour créer une nouvelle ligne',
- CONTINUE: 'Continuer',
- LEGAL_ACCEPT: 'J’accepte',
- LEGAL_NO_ACCEPT: 'Je n’accepte pas',
- DELETE: 'Supprimer',
- CANCEL: 'Réinitialiser',
- SUBMIT: 'Enregistrer',
- UPLOAD_FILE: 'Envoyer un fichier',
- Y: 'O',
- N: 'N',
- });
+ $translateProvider.translations('fr', {
+ // Configurer la vue de l'onglet Formulaire
+ ADVANCED_SETTINGS: 'Paramètres avancés',
+ FORM_NAME: "Nom du formulaire",
+ FORM_STATUS: 'Statut du formulaire',
+ PUBLIC: 'Public',
+ PRIVATE: "Privé",
+ GA_TRACKING_CODE: "Code de suivi Google Analytics",
+ DISPLAY_FOOTER: "Afficher le pied de formulaire?",
+ SAVE_CHANGES: 'Enregistrer les modifications',
+ CANCEL: 'Annuler',
+ DISPLAY_START_PAGE: "Afficher la page de démarrage?",
+ DISPLAY_END_PAGE: "Afficher la page de fin personnalisée?",
+
+ // Afficher les formulaires
+ CREATE_A_NEW_FORM: "Créer un nouveau formulaire",
+ CREATE_FORM: "Créer un formulaire",
+ CREATED_ON: 'Créé le',
+ MY_FORMS: 'Mes formes',
+ NAME: "Nom",
+ LANGUE: 'Langue',
+ FORM_PAUSED: 'Formulaire en pause',
+
+ // Modifier le modal de champ
+ EDIT_FIELD: "Modifier ce champ",
+ SAVE_FIELD: 'Enregistrer',
+ ON: 'ON',
+ OFF: "OFF",
+ REQUIRED_FIELD: "Obligatoire",
+ LOGIC_JUMP: 'Saut logique',
+ SHOW_BUTTONS: 'Boutons supplémentaires',
+ SAVE_START_PAGE: "Enregistrer",
+
+ // Affichage du formulaire d'administration
+ ARE_YOU_SURE: 'Es-tu ABSOLUMENT sûr?',
+ READ_WARNING: "De mauvaises choses inattendues se produiront si vous ne lisez pas ceci!",
+ DELETE_WARNING1: 'Cette action NE PEUT PAS être annulée. Cela supprimera définitivement le "',
+ DELETE_WARNING2: '" forme et supprime toutes les soumissions de formulaire associées. ',
+ DELETE_CONFIRM: "Veuillez taper le nom du formulaire pour confirmer.",
+ I_UNDERSTAND: 'Je comprends les conséquences, efface ce formulaire.',
+ DELETE_FORM_SM: 'Supprimer',
+ DELETE_FORM_MD: "Supprimer le formulaire",
+ DELETE: "Supprimer",
+ FORM: 'Formulaire',
+ VIEW: "Afficher",
+ LIVE: "Live",
+ PREVIEW: 'Aperçu',
+ COPY: "Copier",
+ COPY_AND_PASTE: "Copiez et collez ceci pour ajouter votre TellForm à votre site Web",
+ CHANGE_WIDTH_AND_HEIGHT: "Changez les valeurs de largeur et de hauteur pour mieux vous convenir",
+ POWERED_BY: "Alimenté par",
+ TELLFORM_URL: "Votre TellForm est en permanence sur cette URL",
+
+ // Modifier la vue de formulaire
+ DISABLED: "Désactivé",
+ OUI: 'OUI',
+ NO: 'NON',
+ ADD_LOGIC_JUMP: 'Ajouter un saut de logique',
+ ADD_FIELD_LG: "Cliquez pour ajouter un nouveau champ",
+ ADD_FIELD_MD: "Ajouter un nouveau champ",
+ ADD_FIELD_SM: "Ajouter un champ",
+ EDIT_START_PAGE: "Modifier la page de démarrage",
+ EDIT_END_PAGE: "Modifier la page de fin",
+ WELCOME_SCREEN: 'Page de démarrage',
+ END_SCREEN: 'Fin de page',
+ INTRO_TITLE: "Titre",
+ INTRO_PARAGRAPH: 'Paragraphe',
+ INTRO_BTN: 'Bouton de démarrage',
+ TITLE: "Titre",
+ PARAGRAPHE: 'Paragraphe',
+ BTN_TEXT: "Bouton Retour",
+ BOUTONS: 'Boutons',
+ BUTTON_TEXT: "Texte",
+ BUTTON_LINK: "Lien",
+ ADD_BUTTON: 'Ajouter un bouton',
+ PREVIEW_FIELD: 'Question d\'aperçu',
+ QUESTION_TITLE: "Titre",
+ QUESTION_DESCRIPTION: 'Description',
+ OPTIONS: 'Options',
+ ADD_OPTION: 'Ajouter une option',
+ NUM_OF_STEPS: "Nombre d'étapes",
+ CLICK_FIELDS_FOOTER: 'Cliquez sur les champs pour les ajouter ici',
+ SHAPE: 'Forme',
+ IF_THIS_FIELD: "Si ce champ",
+ IS_EQUAL_TO: 'est égal à',
+ IS_NOT_EQUAL_TO: 'n\'est pas égal à',
+ IS_GREATER_THAN: 'est supérieur à',
+ IS_GREATER_OR_EQUAL_THAN: 'est supérieur ou égal à',
+ IS_SMALLER_THAN: 'est plus petit que',
+ IS_SMALLER_OR_EQUAL_THAN: 'est plus petit ou égal à',
+ CONTAINS: 'contient',
+ DOES_NOT_CONTAINS: 'ne contient pas',
+ ENDS_WITH: "se termine par",
+ DOES_NOT_END_WITH: "ne finit pas avec",
+ STARTS_WITH: 'commence par',
+ DOES_NOT_START_WITH: "ne commence pas par",
+ THEN_JUMP_TO: 'alors saute à',
+
+ // Modifier la vue des soumissions
+ TOTAL_VIEWS: 'total des visites uniques',
+ RESPONSES: "réponses",
+ COMPLETION_RATE: "taux d'achèvement",
+ AVERAGE_TIME_TO_COMPLETE: 'moy. le temps d\'achèvement',
+
+ DESKTOP_AND_LAPTOP: 'Desktops',
+ TABLETS: 'Tablettes',
+ PHONES: 'Téléphones',
+ OTHER: 'Autre',
+ UNIQUE_VISITS: 'Visites uniques',
+
+ FIELD_TITLE: 'Titre du champ',
+ FIELD_VIEWS: 'Vues de champ',
+ FIELD_DROPOFF: "Achèvement du champ",
+ FIELD_RESPONSES: 'Réponses sur le terrain',
+ DELETE_SELECTED: 'Supprimer la sélection',
+ EXPORT_TO_EXCEL: 'Exporter vers Excel',
+ EXPORT_TO_CSV: 'Export vers CSV',
+ EXPORT_TO_JSON: "Exporter vers JSON",
+ PERCENTAGE_COMPLETE: 'Pourcentage terminé',
+ TIME_ELAPSED: 'Temps écoulé',
+ DEVICE: "Dispositif",
+ LOCATION: "Emplacement",
+ IP_ADDRESS: 'Adresse IP',
+ DATE_SUBMITTED: 'Date de soumission',
+
+ // Vue de conception
+ BACKGROUND_COLOR: "Couleur d'arrière-plan",
+ DESIGN_HEADER: "Changez l'apparence de votre formulaire",
+ QUESTION_TEXT_COLOR: "Couleur du texte de la question",
+ ANSWER_TEXT_COLOR: "Couleur du texte de la réponse",
+ BTN_BACKGROUND_COLOR: "Couleur d'arrière-plan du bouton",
+ BTN_TEXT_COLOR: "Couleur du texte du bouton",
+
+ // Vue de partage
+ EMBED_YOUR_FORM: "Intégrez votre formulaire",
+ SHARE_YOUR_FORM: "Partager votre formulaire",
+
+ // Onglets d'administration
+ CREATE_TAB: "Créer",
+ DESIGN_TAB: 'Design',
+ CONFIGURE_TAB: 'Configurer',
+ ANALYZE_TAB: "Analyser",
+ SHARE_TAB: "Partager",
+
+ // Types de champs
+ SHORT_TEXT: "Texte court",
+ EMAIL: "E-mail",
+ MULTIPLE_CHOICE: 'Choix multiple',
+ DROPDOWN: 'Menu Déroulant',
+ DATE: 'Date',
+ PARAGRAPH_T: "Paragraphe",
+ OUI_NON: 'Oui / Non',
+ LEGAL: 'Légal',
+ RATING: "Évaluation",
+ NUMBERS: "Chiffres",
+ SIGNATURE: 'Signature',
+ FILE_UPLOAD: 'Téléchargement de fichier',
+ OPTION_SCALE: 'Option Scale',
+ PAYMENT: 'Paiement',
+ STATEMENT: 'Déclaration',
+ LINK: "Lien",
+
+ // Aperçu du formulaire
+ FORM_SUCCESS: 'Entrée de formulaire soumise avec succès!',
+ REVIEW: 'Réviser',
+ BACK_TO_FORM: "Revenir au formulaire",
+ EDIT_FORM: "Modifier ce TellForm",
+ ADVANCEMENT: '{{done}} sur {{total}} a répondu',
+ CONTINUE_FORM: "Continuer à se former",
+ REQUIRED: 'requis',
+ COMPLETING_NEEDED: '{{answers_not_completed}} réponse (s) doivent être complétées',
+ OPTIONAL: 'optionnel',
+ ERROR_EMAIL_INVALID: "Veuillez entrer une adresse email valide",
+ ERROR_NOT_A_NUMBER: "Veuillez entrer uniquement des numéros valides",
+ ERROR_URL_INVALID: "S'il vous plaît une adresse valide",
+ OK: 'OK',
+ ENTER: 'appuyez sur ENTRER',
+ NEWLINE: 'appuyez sur MAJ + ENTRÉE pour créer une nouvelle ligne',
+ CONTINUE: "Continuer",
+ LEGAL_ACCEPT: 'J\'accepte',
+ LEGAL_NO_ACCEPT: "Je n'accepte pas",
+ SUBMIT: "Soumettre",
+ UPLOAD_FILE: "Télécharger votre fichier"
+ });
+}]);
+
+'use strict';
+
+angular.module('forms').config(['$translateProvider', function ($translateProvider) {
+
+ $translateProvider.translations('de', {
+ // Konfigurieren der Formularregisterkarte
+ ADVANCED_SETTINGS: 'Erweiterte Einstellungen',
+ FORM_NAME: 'Formularname',
+ FORM_STATUS: 'Formularstatus',
+ PUBLIC: 'Öffentlich',
+ PRIVATE: 'Privat',
+ GA_TRACKING_CODE: 'Google Analytics Tracking-Code',
+ DISPLAY_FOOTER: 'Formularfußzeile anzeigen?',
+ SAVE_CHANGES: 'Änderungen speichern',
+ CANCEL: 'Abbrechen',
+ DISPLAY_START_PAGE: 'Startseite anzeigen?',
+ DISPLAY_END_PAGE: 'Benutzerdefinierte Endseite anzeigen?',
+
+ // Listenformularansicht
+ CREATE_A_NEW_FORM: 'Erstelle ein neues Formular',
+ CREATE_FORM: 'Formular erstellen',
+ CREATED_ON: 'Erstellt am',
+ MY_FORMS: 'Meine Formulare',
+ NAME: 'Name',
+ SPRACHE: 'Sprache',
+ FORM_PAUSED: 'Formular pausiert',
+
+ // Feld Modal bearbeiten
+ EDIT_FIELD: 'Dieses Feld bearbeiten',
+ SAVE_FIELD: 'Speichern',
+ ON: 'ON',
+ AUS: 'AUS',
+ REQUIRED_FIELD: 'Erforderlich',
+ LOGIC_JUMP: 'Logischer Sprung',
+ SHOW_BUTTONS: 'Zusätzliche Schaltflächen',
+ SAVE_START_PAGE: 'Speichern',
+
+ // Admin-Formularansicht
+ ARE_YOU_SURE: "Bist du ABSOLUT sicher?",
+ READ_WARNING: 'Unerwartete schlimme Dinge werden passieren, wenn Sie das nicht lesen!',
+ DELETE_WARNING1: 'Diese Aktion kann NICHT rückgängig gemacht werden. Dies wird dauerhaft die "',
+ DELETE_WARNING2: '"Formular und entferne alle verknüpften Formulareinreichungen.',
+ DELETE_CONFIRM: 'Bitte geben Sie den Namen des zu bestätigenden Formulars ein.',
+ I_UNDERSTAND: "Ich verstehe die Konsequenzen, lösche dieses Formular.",
+ DELETE_FORM_SM: 'Löschen',
+ DELETE_FORM_MD: 'Formular löschen',
+ DELETE: 'Löschen',
+ FORM: 'Formular',
+ VIEW: 'Ansicht',
+ LIVE: 'Leben',
+ PREVIEW: 'Vorschau',
+ COPY: 'Kopieren',
+ COPY_AND_PASTE: 'Kopieren und einfügen, um Ihre TellForm auf Ihrer Website hinzuzufügen',
+ CHANGE_WIDTH_AND_HEIGHT: 'Ändern Sie die Werte für Breite und Höhe, um Ihnen am besten zu entsprechen',
+ POWERED_BY: 'Unterstützt von',
+ TELLFORM_URL: "Ihr TellForm ist dauerhaft unter dieser URL",
+
+ // Formularansicht bearbeiten
+ DISABLED: 'Deaktiviert',
+ JA: 'JA',
+ NO: 'NEIN',
+ ADD_LOGIC_JUMP: 'Logic Jump hinzufügen',
+ ADD_FIELD_LG: 'Klicken Sie auf Neues Feld hinzufügen',
+ ADD_FIELD_MD: 'Neues Feld hinzufügen',
+ ADD_FIELD_SM: 'Feld hinzufügen',
+ EDIT_START_PAGE: 'Startseite bearbeiten',
+ EDIT_END_PAGE: 'Endseite bearbeiten',
+ WELCOME_SCREEN: 'Startseite',
+ END_SCREEN: 'Ende Seite',
+ INTRO_TITLE: 'Titel',
+ INTRO_PARAGRAPH: "Absatz",
+ INTRO_BTN: 'Start Knopf',
+ TITLE: "Titel",
+ PARAGRAPH: "Absatz",
+ BTN_TEXT: 'Zurück Button',
+ TASTEN: 'Knöpfe',
+ BUTTON_TEXT: 'Text',
+ BUTTON_LINK: 'Link',
+ ADD_BUTTON: 'Schaltfläche hinzufügen',
+ PREVIEW_FIELD: 'Vorschaufrage',
+ QUESTION_TITLE: 'Titel',
+ QUESTION_DESCRIPTION: 'Beschreibung',
+ OPTIONS: 'Optionen',
+ ADD_OPTION: 'Option hinzufügen',
+ NUM_OF_STEPS: 'Anzahl der Schritte',
+ CLICK_FIELDS_FOOTER: 'Klicken Sie auf Felder, um sie hier hinzuzufügen',
+ FORM: 'Formular',
+ IF_THIS_FIELD: 'Wenn dieses Feld',
+ IS_EQUAL_TO: 'ist gleich',
+ IS_NOT_EQUAL_TO: 'ist nicht gleich',
+ IS_GREATER_THAN: 'ist größer als',
+ IS_GREATER_OR_EQUAL_THAN: 'ist größer oder gleich',
+ IS_SMALLER_THAN: 'ist kleiner als',
+ IS_SMALLER_OR_EQUAL_THAN: 'ist kleiner oder gleich',
+ CONTAINS: 'enthält',
+ DOES_NOT_CONTAINS: 'enthält nicht',
+ ENDS_WITH: 'endet mit',
+ DOES_NOT_END_WITH: 'endet nicht mit',
+ STARTS_WITH: 'beginnt mit',
+ DOES_NOT_START_WITH: 'beginnt nicht mit',
+ THEN_JUMP_TO: 'Springe dann zu',
+
+ // Bearbeiten der Einreichungsansicht
+ TOTAL_VIEWS: 'Gesamtzahl eindeutiger Besuche',
+ RESPONSES: 'Antworten',
+ COMPLETION_RATE: 'Abschlussrate',
+ AVERAGE_TIME_TO_COMPLETE: 'avg. Fertigstellungszeit',
+
+ DESKTOP_AND_LAPTOP: 'Desktops',
+ TABLETS: "Tabletten",
+ PHONES: 'Telefone',
+ OTHER: 'Andere',
+ UNIQUE_VISITS: 'Eindeutige Besuche',
+
+ FIELD_TITLE: 'Feldtitel',
+ FIELD_VIEWS: 'Feld Ansichten',
+ FIELD_DROPOFF: 'Feldabschluss',
+ FIELD_RESPONSES: 'Feldantworten',
+ DELETE_SELECTED: 'Ausgewählte löschen',
+ EXPORT_TO_EXCEL: 'Export nach Excel',
+ EXPORT_TO_CSV: 'In CSV exportieren',
+ EXPORT_TO_JSON: 'Export nach JSON',
+ PERCENTAGE_COMPLETE: 'Prozent abgeschlossen',
+ TIME_ELAPSED: 'Zeit verstrichen',
+ DEVICE: 'Gerät',
+ LOCATION: 'Ort',
+ IP_ADDRESS: 'IP-Adresse',
+ DATE_SUBMITTED: 'Eingereichtes Datum',
+
+ // Entwurfsansicht
+ BACKGROUND_COLOR: 'Hintergrundfarbe',
+ DESIGN_HEADER: 'Ändern Sie, wie Ihr Formular aussieht',
+ QUESTION_TEXT_COLOR: 'Fragetextfarbe',
+ ANSWER_TEXT_COLOR: 'Textfarbe beantworten',
+ BTN_BACKGROUND_COLOR: 'Schaltfläche Hintergrundfarbe',
+ BTN_TEXT_COLOR: 'Schaltfläche Textfarbe',
+
+ // Freigabeansicht
+ EMBED_YOUR_FORM: 'Einbetten Ihres Formulars',
+ SHARE_YOUR_FORM: 'Teilen Sie Ihr Formular',
+
+ // Admin-Registerkarten
+ CREATE_TAB: 'Erstellen',
+ DESIGN_TAB: 'Entwurf',
+ CONFIGURE_TAB: 'Konfigurieren',
+ ANALYZE_TAB: 'Analysieren',
+ SHARE_TAB: 'Freigeben',
+
+ // Feldtypen
+ SHORT_TEXT: 'Kurztext',
+ EMAIL: 'Email',
+ MULTIPLE_CHOICE: 'Mehrfachauswahl',
+ DROPDOWN: 'Dropdown-Liste',
+ DATE: 'Datum',
+ PARAGRAPH_T: "Absatz",
+ YES_NO: 'Ja / Nein',
+ LEGAL: "Rechtliche",
+ RATING: 'Bewertung',
+ NUMBERS: 'Zahlen',
+ SIGNATURE: "Unterschrift",
+ FILE_UPLOAD: 'Datei-Upload',
+ OPTION_SCALE: 'Optionsskala',
+ ZAHLUNG: "Zahlung",
+ STATEMENT: 'Anweisung',
+ LINK: 'Link',
+
+ // Formularvorschau
+ FORM_SUCCESS: 'Formulareintrag erfolgreich gesendet!',
+ REVIEW: 'Überprüfung',
+ BACK_TO_FORM: 'Gehe zurück zu Formular',
+ EDIT_FORM: 'Bearbeiten Sie diese TellForm',
+ ADVANCEMENT: '{{done}} von {{total}} wurde beantwortet',
+ CONTINUE_FORM: 'Weiter zum Formular',
+ REQUIRED: 'erforderlich',
+ COMPLETING_NEEDED: '{{answers_not_completed}} Antwort (en) müssen ausgefüllt werden',
+ OPTIONAL: 'optional',
+ ERROR_EMAIL_INVALID: 'Geben Sie eine gültige E-Mail-Adresse ein',
+ ERROR_NOT_A_NUMBER: 'Bitte nur gültige Nummern eingeben',
+ ERROR_URL_INVALID: 'Bitte eine gültige URL',
+ OK: 'OK',
+ ENTER: 'ENTER drücken',
+ NEWLINE: 'Drücken Sie UMSCHALT + EINGABETASTE, um eine neue Zeile zu erstellen',
+ CONTINUE: 'Weiter',
+ LEGAL_ACCEPT: "Ich akzeptiere",
+ LEGAL_NO_ACCEPT: "Ich akzeptiere nicht",
+ SUBMIT: 'Senden',
+ UPLOAD_FILE: 'Hochladen Ihrer Datei'
+ });
}]);
@@ -3210,71 +3754,190 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
angular.module('forms').config(['$translateProvider', function ($translateProvider) {
- $translateProvider.translations('german', {
- FORM_SUCCESS: 'Ihre Angaben wurden gespeichert.',
- REVIEW: 'Unvollständig',
- BACK_TO_FORM: 'Zurück zum Formular',
- EDIT_FORM: '',
- CREATE_FORM: '',
- ADVANCEMENT: '{{done}} von {{total}} beantwortet',
- CONTINUE_FORM: 'Zum Formular',
- REQUIRED: 'verpflichtend',
- COMPLETING_NEEDED: 'Es fehlen/fehtl noch {{answers_not_completed}} Antwort(en)',
- OPTIONAL: 'fakultativ',
- ERROR_EMAIL_INVALID: 'Bitte gültige Mailadresse eingeben',
- ERROR_NOT_A_NUMBER: 'Bitte nur Zahlen eingeben',
- ERROR_URL_INVALID: 'Bitte eine gültige URL eingeben',
- OK: 'Okay',
- ENTER: 'Eingabetaste drücken',
- YES: 'Ja',
- NO: 'Nein',
- NEWLINE: 'Für eine neue Zeile SHIFT+ENTER drücken',
- CONTINUE: 'Weiter',
- LEGAL_ACCEPT: 'I accept',
- LEGAL_NO_ACCEPT: 'I don’t accept',
- DELETE: 'Entfernen',
- CANCEL: 'Canceln',
- SUBMIT: 'Speichern',
- UPLOAD_FILE: 'Datei versenden',
- Y: 'J',
- N: 'N',
- });
+ $translateProvider.translations('it', {
+ // Configura la visualizzazione scheda modulo
+ ADVANCED_SETTINGS: 'Impostazioni avanzate',
+ FORM_NAME: 'Nome modulo',
+ FORM_STATUS: 'Stato modulo',
+ PUBLIC: 'pubblico',
+ PRIVATE: 'Privato',
+ GA_TRACKING_CODE: 'Codice di monitoraggio di Google Analytics',
+ DISPLAY_FOOTER: 'Visualizza piè di pagina?',
+ SAVE_CHANGES: 'Salva modifiche',
+ CANCEL: 'Annulla',
+ DISPLAY_START_PAGE: 'Visualizza pagina iniziale?',
+ DISPLAY_END_PAGE: 'Mostra pagina finale personalizzata?',
-}]);
+ // Visualizzazione dei moduli di elenco
+ CREATE_A_NEW_FORM: 'Crea un nuovo modulo',
+ CREATE_FORM: 'Crea modulo',
+ CREATED_ON: 'Creato su',
+ MY_FORMS: 'Le mie forme',
+ NAME: 'Nome',
+ LINGUA: 'Lingua',
+ FORM_PAUSED: 'Forme in pausa',
-'use strict';
+ // Modifica campo modale
+ EDIT_FIELD: 'Modifica questo campo',
+ SAVE_FIELD: 'Salva',
+ ON: 'ON',
+ OFF: 'OFF',
+ REQUIRED_FIELD: 'Obbligatorio',
+ LOGIC_JUMP: 'Jump Logic',
+ SHOW_BUTTONS: 'Pulsanti aggiuntivi',
+ SAVE_START_PAGE: 'Salva',
-angular.module('forms').config(['$translateProvider', function ($translateProvider) {
+ // Visualizzazione modulo di amministrazione
+ ARE_YOU_SURE: 'Sei ASSOLUTAMENTE sicuro?',
+ READ_WARNING: 'Le cose cattive impreviste avverranno se non lo leggi!',
+ DELETE_WARNING1: 'Questa azione NON può essere annullata. Ciò eliminerà in modo permanente il "',
+ DELETE_WARNING2: '" forma e rimuovi tutti i moduli di modulo associati. ',
+ DELETE_CONFIRM: 'Inserisci il nome del modulo per confermare',
+ I_UNDERSTAND: "Capisco le conseguenze, elimina questa forma",
+ DELETE_FORM_SM: 'Elimina',
+ DELETE_FORM_MD: 'Elimina modulo',
+ DELETE: 'Elimina',
+ FORM: 'Forma',
+ VIEW: 'Visualizza',
+ LIVE: 'Live',
+ PREVIEW: 'Anteprima',
+ COPY: 'Copia',
+ COPY_AND_PASTE: 'Copia e incolla questo per aggiungere il tuo TellForm al tuo sito web',
+ CHANGE_WIDTH_AND_HEIGHT: 'Modifica i valori di larghezza e di altezza per adattarti al meglio',
+ POWERED_BY: 'Offerto da',
+ TELLFORM_URL: 'Il tuo TellForm è permanente in questo URL',
- $translateProvider.translations('italian', {
- FORM_SUCCESS: 'Il formulario è stato inviato con successo!',
- REVIEW: 'Incompleto',
- BACK_TO_FORM: 'Ritorna al formulario',
- EDIT_FORM: '',
- CREATE_FORM: '',
- ADVANCEMENT: '{{done}} su {{total}} completate',
- CONTINUE_FORM: 'Vai al formulario',
- REQUIRED: 'obbligatorio',
- COMPLETING_NEEDED: '{{answers_not_completed}} risposta/e deve/ono essere completata/e',
- OPTIONAL: 'opzionale',
- ERROR_EMAIL_INVALID: 'Si prega di inserire un indirizzo email valido',
- ERROR_NOT_A_NUMBER: 'Si prega di inserire solo numeri',
- ERROR_URL_INVALID: 'Grazie per inserire un URL valido',
- OK: 'OK',
- ENTER: 'premere INVIO',
- YES: 'Sì',
- NO: 'No',
- NEWLINE: 'premere SHIFT+INVIO per creare una nuova linea',
- CONTINUE: 'Continua',
- LEGAL_ACCEPT: 'I accept',
- LEGAL_NO_ACCEPT: 'I don’t accept',
- DELETE: 'Cancella',
- CANCEL: 'Reset',
- SUBMIT: 'Registra',
- UPLOAD_FILE: 'Invia un file',
- Y: 'S',
- N: 'N',
- });
+ // Modifica vista modulo
+ DISABLED: 'disabilitato',
+ YES: 'SI',
+ NO: 'NO',
+ ADD_LOGIC_JUMP: 'Aggiungi logico salto',
+ ADD_FIELD_LG: 'Clicca per aggiungere nuovo campo',
+ ADD_FIELD_MD: 'Aggiungi nuovo campo',
+ ADD_FIELD_SM: 'Aggiungi campo',
+ EDIT_START_PAGE: 'Modifica pagina iniziale',
+ EDIT_END_PAGE: 'Modifica pagina finale',
+ WELCOME_SCREEN: 'Pagina iniziale',
+ END_SCREEN: 'Fine pagina',
+ INTRO_TITLE: 'Titolo',
+ INTRO_PARAGRAPH: 'Paragrafo',
+ INTRO_BTN: 'Pulsante Start',
+ TITLE: 'Titolo',
+ PARAGRAFO: 'Paragrafo',
+ BTN_TEXT: 'Tornare indietro',
+ TASTI: 'Pulsanti',
+ BUTTON_TEXT: 'Testo',
+ BUTTON_LINK: 'Link',
+ ADD_BUTTON: 'Aggiungi pulsante',
+ PREVIEW_FIELD: 'Anteprima domanda',
+ QUESTION_TITLE: 'Titolo',
+ QUESTION_DESCRIPTION: 'Descrizione',
+ OPTIONS: 'Opzioni',
+ ADD_OPTION: 'Aggiungi opzione',
+ NUM_OF_STEPS: 'Numero di passi',
+ CLICK_FIELDS_FOOTER: 'Clicca sui campi per aggiungerli qui',
+ FORMA: 'Forma',
+ IF_THIS_FIELD: 'Se questo campo',
+ IS_EQUAL_TO: 'è uguale a',
+ IS_NOT_EQUAL_TO: 'non è uguale a',
+ IS_GREATER_THAN: 'è maggiore di',
+ IS_GREATER_OR_EQUAL_THAN: 'è maggiore o uguale a',
+ IS_SMALLER_THAN: 'è inferiore a',
+ IS_SMALLER_OR_EQUAL_THAN: 'è più piccolo o uguale a quello',
+ CONTAINS: 'contiene',
+ DOES_NOT_CONTAINS: 'non contiene',
+ ENDS_WITH: 'finisce con',
+ DOES_NOT_END_WITH: 'non finisce con',
+ STARTS_WITH: 'inizia con',
+ DOES_NOT_START_WITH: 'non inizia con',
+ THEN_JUMP_TO: 'poi salta a',
+
+ // Modifica visualizzazione presentazioni
+ TOTAL_VIEWS: 'visite totali totali',
+ RESPONSES: 'risposte',
+ COMPLETION_RATE: 'tasso di completamento',
+ AVERAGE_TIME_TO_COMPLETE: 'avg. tempo di completamento',
+
+ DESKTOP_AND_LAPTOP: 'Desktop',
+ TABLETS: 'compresse',
+ PHONES: 'Telefoni',
+ OTHER: 'Altro',
+ UNIQUE_VISITS: 'Visite Uniche',
+
+ FIELD_TITLE: 'Titolo del campo',
+ FIELD_VIEWS: 'Viste sul campo',
+ FIELD_DROPOFF: 'Completamento del campo',
+ FIELD_RESPONSES: 'Risposte sul campo',
+ DELETE_SELECTED: 'Elimina selezionata',
+ EXPORT_TO_EXCEL: 'Esporta in Excel',
+ EXPORT_TO_CSV: 'Esporta in CSV',
+ EXPORT_TO_JSON: 'Esporta in JSON',
+ PERCENTAGE_COMPLETE: 'Percentuale completa',
+ TIME_ELAPSED: 'Tempo trascorso',
+ DEVICE: 'Dispositivo',
+ LOCATION: 'Posizione',
+ IP_ADDRESS: 'Indirizzo IP',
+ DATE_SUBMITTED: 'Data trasmessa',
+
+ // Vista di progettazione
+ BACKGROUND_COLOR: 'Colore di sfondo',
+ DESIGN_HEADER: 'Modifica il tuo aspetto forma',
+ QUESTION_TEXT_COLOR: 'Colore del testo di domanda',
+ ANSWER_TEXT_COLOR: 'Rispondere al colore del testo',
+ BTN_BACKGROUND_COLOR: 'Colore di sfondo del pulsante',
+ BTN_TEXT_COLOR: 'Colore del testo pulsante',
+
+ // Vista condivisione
+ EMBED_YOUR_FORM: 'Inserisci il tuo modulo',
+ SHARE_YOUR_FORM: 'Condividi il tuo modulo',
+
+ // Schede amministratore
+ CREATE_TAB: 'Crea',
+ DESIGN_TAB: 'Design',
+ CONFIGURE_TAB: 'Configura',
+ ANALYZE_TAB: 'Analizza',
+ SHARE_TAB: 'Condividi',
+
+ // Tipi di campo
+ SHORT_TEXT: 'Testo corto',
+ EMAIL: 'E-mail',
+ MULTIPLE_CHOICE: 'Scelta multipla',
+ DROPDOWN: 'Dropdown',
+ DATE: 'Data',
+ PARAGRAPH_T: 'Paragrafo',
+ YES_NO: 'Sì / no',
+ LEGAL: 'Legale',
+ RATING: 'Valutazione',
+ NUMBERS: 'Numeri',
+ SIGNATURE: 'Firma',
+ FILE_UPLOAD: 'Caricamento file',
+ OPTION_SCALE: 'Scala opzione',
+ PAGAMENTO: 'Pagamento',
+ STATEMENT: 'Dichiarazione',
+ LINK: 'Link',
+
+ // Anteprima del modulo
+ FORM_SUCCESS: 'Inserimento modulo con successo presentato!',
+ REVIEW: 'Recensione',
+ BACK_TO_FORM: 'Torna alla scheda',
+ EDIT_FORM: 'Modifica questo TellForm',
+ ADVANCEMENT: '{{done}} su {{total}} ha risposto',
+ CONTINUE_FORM: "Continua a formare",
+ REQUIRED: 'richiesta',
+ COMPLETING_NEEDED: '{{answers_not_completed}} answer (s) need completing',
+ OPTIONAL: 'facoltativo',
+ ERROR_EMAIL_INVALID: 'Inserisci un indirizzo e-mail valido',
+ ERROR_NOT_A_NUMBER: 'Inserisci solo numeri validi',
+ ERROR_URL_INVALID: 'Per favore un url valido',
+ OK: 'OK',
+ ENTER: 'premere INVIO',
+ NEWLINE: 'premere SHIFT + INVIO per creare una nuova riga',
+ CONTINUE: 'Continua',
+ LEGAL_ACCEPT: 'accetto',
+ LEGAL_NO_ACCEPT: 'Non accetto',
+ SUBMIT: 'Invia',
+ UPLOAD_FILE: 'Carica il tuo file'
+ });
}]);
@@ -3309,8 +3972,8 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
//Edit Field Modal
EDIT_FIELD: 'Editar este campo',
SAVE_FIELD: 'Grabar',
- ON: 'ON',
- OFF: 'OFF',
+ ON: 'EN',
+ OFF: 'APAGADO',
REQUIRED_FIELD: 'Requerido',
LOGIC_JUMP: 'Salto lógico',
SHOW_BUTTONS: 'Botones adicionales',
@@ -3407,7 +4070,6 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
LOCATION: 'Lugar',
IP_ADDRESS: 'Dirección IP',
DATE_SUBMITTED: 'Fecha de envío',
- GENERATED_PDF: 'PDF generado',
//Design View
BACKGROUND_COLOR: 'Color de fondo',
@@ -3664,7 +4326,7 @@ angular.module('view-form').constant('VIEW_FORM_URL', '/forms/:formId/render');
angular.module('view-form').config(['$translateProvider', function ($translateProvider) {
- $translateProvider.translations('english', {
+ $translateProvider.translations('en', {
FORM_SUCCESS: 'Form entry successfully submitted!',
REVIEW: 'Review',
BACK_TO_FORM: 'Go back to Form',
@@ -3690,10 +4352,22 @@ angular.module('view-form').config(['$translateProvider', function ($translatePr
CANCEL: 'Cancel',
SUBMIT: 'Submit',
UPLOAD_FILE: 'Upload your File',
+ Y: 'Y',
+ N: 'N',
+ OPTION_PLACEHOLDER: 'Type or select an option',
+ ADD_NEW_LINE_INSTR: 'Press SHIFT+ENTER to add a newline',
+ ERROR: 'Error',
+
+ FORM_404_HEADER: '404 - Form Does Not Exist',
+ FORM_404_BODY: 'The form you are trying to access does not exist. Sorry about that!',
+
+ FORM_UNAUTHORIZED_HEADER: 'Not Authorized to Access Form',
+ FORM_UNAUTHORIZED_BODY1: 'The form you are trying to access is currently private and not accesible publically.',
+ FORM_UNAUTHORIZED_BODY2: 'If you are the owner of the form, you can set it to "Public" in the "Configuration" panel in the form admin.',
});
- $translateProvider.preferredLanguage('english')
- .fallbackLanguage('english')
+ $translateProvider.preferredLanguage('en')
+ .fallbackLanguage('en')
.useSanitizeValueStrategy('escape');
}]);
@@ -3702,7 +4376,7 @@ angular.module('view-form').config(['$translateProvider', function ($translatePr
angular.module('view-form').config(['$translateProvider', function ($translateProvider) {
- $translateProvider.translations('french', {
+ $translateProvider.translations('fr', {
FORM_SUCCESS: 'Votre formulaire a été enregistré!',
REVIEW: 'Incomplet',
BACK_TO_FORM: 'Retourner au formulaire',
@@ -3730,6 +4404,16 @@ angular.module('view-form').config(['$translateProvider', function ($translatePr
UPLOAD_FILE: 'Envoyer un fichier',
Y: 'O',
N: 'N',
+ OPTION_PLACEHOLDER: 'Tapez ou sélectionnez une option',
+ ADD_NEW_LINE_INSTR: 'Appuyez sur MAJ + ENTRÉE pour ajouter une nouvelle ligne',
+ ERROR: 'Erreur',
+
+ FORM_404_HEADER: '404 - Le formulaire n\'existe pas',
+ FORM_404_BODY: 'Le formulaire auquel vous essayez d\'accéder n\'existe pas. Désolé pour ça!',
+
+ FORM_UNAUTHORIZED_HEADER: 'Non autorisé à accéder au formulaire',
+ FORM_UNAUTHORIZED_BODY1: 'Le formulaire auquel vous essayez d\'accéder est actuellement privé et inaccessible publiquement.',
+ FORM_UNAUTHORIZED_BODY2: 'Si vous êtes le propriétaire du formulaire, vous pouvez le définir sur "Public" dans le panneau "Configuration" du formulaire admin.',
});
}]);
@@ -3738,12 +4422,12 @@ angular.module('view-form').config(['$translateProvider', function ($translatePr
angular.module('view-form').config(['$translateProvider', function ($translateProvider) {
- $translateProvider.translations('german', {
+ $translateProvider.translations('de', {
FORM_SUCCESS: 'Ihre Angaben wurden gespeichert.',
REVIEW: 'Unvollständig',
BACK_TO_FORM: 'Zurück zum Formular',
- EDIT_FORM: '',
- CREATE_FORM: '',
+ EDIT_FORM: 'Bearbeiten Sie diese TellForm',
+ CREATE_FORM: 'Dieses TellForm erstellen',
ADVANCEMENT: '{{done}} von {{total}} beantwortet',
CONTINUE_FORM: 'Zum Formular',
REQUIRED: 'verpflichtend',
@@ -3766,6 +4450,16 @@ angular.module('view-form').config(['$translateProvider', function ($translatePr
UPLOAD_FILE: 'Datei versenden',
Y: 'J',
N: 'N',
+ OPTION_PLACEHOLDER: 'Geben oder wählen Sie eine Option aus',
+ ADD_NEW_LINE_INSTR: 'Drücken Sie UMSCHALT + EINGABETASTE, um eine neue Zeile hinzuzufügen',
+ ERROR: 'Fehler',
+
+ FORM_404_HEADER: '404 - Formular existiert nicht',
+ FORM_404_BODY: 'Das Formular, auf das Sie zugreifen möchten, existiert nicht. Das tut mir leid!',
+
+ FORM_UNAUTHORIZED_HEADER: 'Nicht zum Zugriffsformular berechtigt\' ',
+ FORM_UNAUTHORIZED_BODY1: 'Das Formular, auf das Sie zugreifen möchten, ist derzeit privat und nicht öffentlich zugänglich.',
+ FORM_UNAUTHORIZED_BODY2: 'Wenn Sie der Eigentümer des Formulars sind, können Sie es im Fenster "Konfiguration" im Formular admin auf "Öffentlich" setzen.',
});
}]);
@@ -3774,12 +4468,12 @@ angular.module('view-form').config(['$translateProvider', function ($translatePr
angular.module('view-form').config(['$translateProvider', function ($translateProvider) {
- $translateProvider.translations('italian', {
+ $translateProvider.translations('it', {
FORM_SUCCESS: 'Il formulario è stato inviato con successo!',
REVIEW: 'Incompleto',
BACK_TO_FORM: 'Ritorna al formulario',
- EDIT_FORM: '',
- CREATE_FORM: '',
+ EDIT_FORM: 'Modifica questo TellForm',
+ CREATE_FORM: 'Crea questo TellForm',
ADVANCEMENT: '{{done}} su {{total}} completate',
CONTINUE_FORM: 'Vai al formulario',
REQUIRED: 'obbligatorio',
@@ -3802,6 +4496,16 @@ angular.module('view-form').config(['$translateProvider', function ($translatePr
UPLOAD_FILE: 'Invia un file',
Y: 'S',
N: 'N',
+ OPTION_PLACEHOLDER: 'Digitare o selezionare un\'opzione',
+ ADD_NEW_LINE_INSTR: 'Premere SHIFT + INVIO per aggiungere una nuova riga',
+ ERROR: 'Errore',
+
+ FORM_404_HEADER: '404 - Il modulo non esiste',
+ FORM_404_BODY: 'La forma che stai cercando di accedere non esiste. Ci dispiace!',
+
+ FORM_UNAUTHORIZED_HEADER: 'Non autorizzato per accedere al modulo',
+ FORM_UNAUTHORIZED_BODY1: 'Il modulo che si sta tentando di accedere è attualmente privato e non accessibile in pubblico.',
+ FORM_UNAUTHORIZED_BODY2: 'Se sei il proprietario del modulo, puoi impostarlo su "Pubblico" nel pannello "Configurazione" nell\'amministratore di moduli.',
});
}]);
@@ -3810,35 +4514,45 @@ angular.module('view-form').config(['$translateProvider', function ($translatePr
angular.module('view-form').config(['$translateProvider', function ($translateProvider) {
- $translateProvider.translations('spanish', {
- FORM_SUCCESS: '¡El formulario ha sido enviado con éxito!',
- REVIEW: 'Revisar',
- BACK_TO_FORM: 'Regresar al formulario',
- EDIT_FORM: '',
- CREATE_FORM: '',
- ADVANCEMENT: '{{done}} de {{total}} contestadas',
- CONTINUE_FORM: 'Continuar al formulario',
- REQUIRED: 'Información requerida',
- COMPLETING_NEEDED: '{{answers_not_completed}} respuesta(s) necesita(n) ser completada(s)',
- OPTIONAL: 'Opcional',
- ERROR_EMAIL_INVALID: 'Favor de proporcionar un correo electrónico válido',
- ERROR_NOT_A_NUMBER: 'Por favor, introduzca sólo números válidos',
- ERROR_URL_INVALID: 'Favor de proporcionar un url válido',
- OK: 'OK',
- ENTER: 'pulse INTRO',
- YES: 'Si',
- NO: 'No',
- NEWLINE: 'presione SHIFT+INTRO para crear una nueva línea',
- CONTINUE: 'Continuar',
- LEGAL_ACCEPT: 'Yo acepto',
- LEGAL_NO_ACCEPT: 'Yo no acepto',
- DELETE: 'Eliminar',
- CANCEL: 'Cancelar',
- SUBMIT: 'Registrar',
- UPLOAD_FILE: 'Cargar el archivo',
- Y: 'S',
- N: 'N'
- });
+ $translateProvider.translations('es', {
+ FORM_SUCCESS: '¡El formulario ha sido enviado con éxito!',
+ REVIEW: 'Revisar',
+ BACK_TO_FORM: 'Regresar al formulario',
+ EDIT_FORM: 'Editar este TellForm',
+ CREATE_FORM: 'Crear este TellForm',
+ ADVANCEMENT: '{{done}} de {{total}} contestadas',
+ CONTINUE_FORM: 'Continuar al formulario',
+ REQUIRED: 'Información requerida',
+ COMPLETING_NEEDED: '{{answers_not_completed}} respuesta(s) necesita(n) ser completada(s)',
+ OPTIONAL: 'Opcional',
+ ERROR_EMAIL_INVALID: 'Favor de proporcionar un correo electrónico válido',
+ ERROR_NOT_A_NUMBER: 'Por favor, introduzca sólo números válidos',
+ ERROR_URL_INVALID: 'Favor de proporcionar un url válido',
+ OK: 'OK',
+ ENTER: 'pulse INTRO',
+ YES: 'Si',
+ NO: 'No',
+ NEWLINE: 'presione SHIFT+INTRO para crear una nueva línea',
+ CONTINUE: 'Continuar',
+ LEGAL_ACCEPT: 'Yo acepto',
+ LEGAL_NO_ACCEPT: 'Yo no acepto',
+ DELETE: 'Eliminar',
+ CANCEL: 'Cancelar',
+ SUBMIT: 'Registrar',
+ UPLOAD_FILE: 'Cargar el archivo',
+ Y: 'S',
+ N: 'N',
+ OPTION_PLACEHOLDER: 'Escriba o seleccione una opción',
+ ADD_NEW_LINE_INSTR: 'Presione MAYÚS + ENTRAR para agregar una nueva línea',
+ ERROR: 'Error',
+
+ FORM_404_HEADER: '404 - La forma no existe',
+ FORM_404_BODY: 'El formulario al que intenta acceder no existe. ¡Lo siento por eso!',
+
+ FORM_UNAUTHORIZED_HEADER: 'Non autorizzato per accedere al modulo',
+ FORM_UNAUTHORIZED_BODY1: 'Il modulo che si sta tentando di accedere è attualmente privato e non accessibile in pubblico.',
+ FORM_UNAUTHORIZED_BODY2: 'Se sei il proprietario del modulo, puoi impostarlo su "Pubblico" nel pannello "Configurazione" nell\'amministratore di moduli.',
+ });
}]);
diff --git a/public/dist/application.min.css b/public/dist/application.min.css
index d5dfc184..154a78c9 100644
--- a/public/dist/application.min.css
+++ b/public/dist/application.min.css
@@ -1,4 +1,4 @@
-.navbar,.navbar-nav,.navbar-nav>li{min-height:60px}.image-background,.opacity-background{position:fixed;height:100%;width:100%;top:0;left:0}.btn-rounded,.field-title-row,section.auth .btn{text-transform:uppercase}.form-item .title-row>.list-group-item-heading{color:#34628a}.form-item.paused .title-row>.list-group-item-heading,.form-item:hover .title-row>.list-group-item-heading{color:#fff}.form-item:hover .title-row{text-decoration:none}body{overflow-x:hidden;font-family:'Source Sans Pro',sans-serif;font-size:16px}.vcenter{display:inline-block;vertical-align:middle;float:none}.btn-rounded{border-radius:100px;font-size:14px;padding:10px 28px;margin:1em 2px 0;text-decoration:none!important}.current-fields .panel-heading a:hover,.current-fields .tool-panel.panel .panel-heading a:hover,.footer-basic-centered .footer-links a,.undecorated-link:hover{text-decoration:none}.btn-secondary{background:#DDD;color:#4c4c4c;border:2px solid #4c4c4c}.btn-secondary:hover{background:#cacaca;border-color:#cacaca}.navbar{padding:10px 0}.navbar-inverse{background-color:#3FA2F7;border:0;color:#fff!important}.navbar .navbar-brand{min-height:60px;padding:10px}.navbar-nav>li>a{padding-top:20px;color:#fff}.navbar-nav>li.active,.navbar-nav>li:hover{background-color:#4b7096}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:transparent;color:inherit;border:none}.navbar-inverse .navbar-nav>li>a{color:#fff}.navbar li.dropdown a.dropdown-toggle:hover>*{color:#f9f9f9}.navbar-inverse .navbar-toggle{border:none}.ng-cloak,.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}.dropdown-menu>li>a{color:#515151}section.hero-section{width:100%}section.hero-section .jumbotron{background-color:transparent;color:#fff}.image-background{z-index:-98;background-image:url(http://yourplaceandmine.ie/wp-content/uploads/2014/09/Daingean-meeting-048_13-1080x675.jpg);background-repeat:no-repeat;background-position:0 50%;background-size:cover}.opacity-background{background-color:#000;background-color:rgba(0,0,0,.5);z-index:-97}section.hero-section .jumbotron .signup-btn{background-color:#FA787E;border:none;font-size:2em;padding:.3em .9em;color:#fff}.footer-basic-centered{background-color:#292c2f;box-shadow:0 1px 1px 0 rgba(0,0,0,.12);box-sizing:border-box;width:100%;text-align:center;font:400 18px sans-serif;padding:45px;margin-top:80px}.footer-basic-centered .footer-company-motto{color:#8d9093;font-size:24px;margin:0}.footer-basic-centered .footer-company-name{color:#8f9296;font-size:14px;margin:0}.footer-basic-centered .footer-links{list-style:none;font-weight:700;color:#fff;padding:35px 0 23px;margin:0}.footer-basic-centered .footer-links a{display:inline-block;color:inherit}@media (max-width:600px){.footer-basic-centered{padding:35px}.footer-basic-centered .footer-company-motto{font-size:18px}.footer-basic-centered .footer-company-name{font-size:12px}.footer-basic-centered .footer-links{font-size:14px;padding:25px 0 20px}.footer-basic-centered .footer-links a{line-height:1.8}}/*!
+.navbar,.navbar-nav,.navbar-nav>li{min-height:60px}.image-background,.opacity-background{position:fixed;height:100%;width:100%;top:0;left:0}.config-form,.form-item.create-new input{max-width:100%}.btn-rounded,.field-title-row,section.auth .btn{text-transform:uppercase}.form-item .title-row>.list-group-item-heading{color:#34628a}.form-item.paused .title-row>.list-group-item-heading,.form-item:hover .title-row>.list-group-item-heading{color:#fff}.form-item:hover .title-row{text-decoration:none}body{overflow-x:hidden;font-family:'Source Sans Pro',sans-serif;font-size:16px}.vcenter{display:inline-block;vertical-align:middle;float:none}.btn-rounded{border-radius:100px;font-size:14px;padding:10px 28px;margin:1em 2px 0;text-decoration:none!important}.current-fields .panel-heading a:hover,.current-fields .tool-panel.panel .panel-heading a:hover,.footer-basic-centered .footer-links a,.undecorated-link:hover{text-decoration:none}.btn-secondary{background:#DDD;color:#4c4c4c;border:2px solid #4c4c4c}.btn-secondary:hover{background:#cacaca;border-color:#cacaca}.navbar{padding:10px 0}.navbar-inverse{background-color:#3FA2F7;border:0;color:#fff!important}.navbar .navbar-brand{min-height:60px;padding:10px}.navbar-nav>li>a{padding-top:20px;color:#fff}.navbar-nav>li.active,.navbar-nav>li:hover{background-color:#4b7096}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:transparent;color:inherit;border:none}.navbar-inverse .navbar-nav>li>a{color:#fff}.navbar li.dropdown a.dropdown-toggle:hover>*{color:#f9f9f9}.navbar-inverse .navbar-toggle{border:none}.ng-cloak,.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}.dropdown-menu>li>a{color:#515151}section.hero-section{width:100%}section.hero-section .jumbotron{background-color:transparent;color:#fff}.image-background{z-index:-98;background-image:url(http://yourplaceandmine.ie/wp-content/uploads/2014/09/Daingean-meeting-048_13-1080x675.jpg);background-repeat:no-repeat;background-position:0 50%;background-size:cover}.opacity-background{background-color:#000;background-color:rgba(0,0,0,.5);z-index:-97}section.hero-section .jumbotron .signup-btn{background-color:#FA787E;border:none;font-size:2em;padding:.3em .9em;color:#fff}.footer-basic-centered{background-color:#292c2f;box-shadow:0 1px 1px 0 rgba(0,0,0,.12);box-sizing:border-box;width:100%;text-align:center;font:400 18px sans-serif;padding:45px;margin-top:80px}.footer-basic-centered .footer-company-motto{color:#8d9093;font-size:24px;margin:0}.footer-basic-centered .footer-company-name{color:#8f9296;font-size:14px;margin:0}.footer-basic-centered .footer-links{list-style:none;font-weight:700;color:#fff;padding:35px 0 23px;margin:0}.footer-basic-centered .footer-links a{display:inline-block;color:inherit}@media (max-width:600px){.footer-basic-centered{padding:35px}.footer-basic-centered .footer-company-motto{font-size:18px}.footer-basic-centered .footer-company-name{font-size:12px}.footer-basic-centered .footer-links{font-size:14px;padding:25px 0 20px}.footer-basic-centered .footer-links a{line-height:1.8}}/*!
* "Fork me on GitHub" CSS ribbon v0.1.1 | MIT License
* https://github.com/simonwhitaker/github-fork-ribbon-css
-*/.github-fork-ribbon{position:absolute;padding:2px 0;background-color:#a00;background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,0)),to(rgba(0,0,0,.15)));background-image:-webkit-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-moz-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-ms-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-o-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:linear-gradient(to bottom,rgba(0,0,0,0),rgba(0,0,0,.15));-webkit-box-shadow:0 2px 3px 0 rgba(0,0,0,.5);-moz-box-shadow:0 2px 3px 0 rgba(0,0,0,.5);box-shadow:0 2px 3px 0 rgba(0,0,0,.5);font:700 13px "Helvetica Neue",Helvetica,Arial,sans-serif;z-index:9999;pointer-events:auto}.github-fork-ribbon a,.github-fork-ribbon a:hover{color:#fff;text-decoration:none;text-shadow:0 -1px rgba(0,0,0,.5);text-align:center;width:200px;line-height:20px;display:inline-block;padding:2px 0;border-width:1px 0;border-style:dotted;border-color:#fff;border-color:rgba(255,255,255,.7)}.github-fork-ribbon-wrapper{width:150px;height:150px;position:absolute;overflow:hidden;top:0;z-index:9998;pointer-events:none}.github-fork-ribbon-wrapper.fixed{position:fixed}.github-fork-ribbon-wrapper.left{left:0}.github-fork-ribbon-wrapper.right{right:0}.github-fork-ribbon-wrapper.left-bottom{position:fixed;top:inherit;bottom:0;left:0}.github-fork-ribbon-wrapper.right-bottom{position:fixed;top:inherit;bottom:0;right:0}.github-fork-ribbon-wrapper.right .github-fork-ribbon{top:42px;right:-43px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.github-fork-ribbon-wrapper.left .github-fork-ribbon{top:42px;left:-43px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.github-fork-ribbon-wrapper.left-bottom .github-fork-ribbon{top:80px;left:-43px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.github-fork-ribbon-wrapper.right-bottom .github-fork-ribbon{top:80px;right:-43px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.custom-select{position:relative;display:block;padding:0}.custom-select select{width:100%;margin:0;background:0 0;border:1px solid transparent;border-radius:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;appearance:none;-webkit-appearance:none;-moz-appearance:none;font-size:1em;font-family:helvetica,sans-serif;font-weight:700;color:#444;padding:.6em 1.9em .5em .8em;line-height:1.3}.custom-select option,.modal-header{font-weight:400}.custom-select::after{content:"";position:absolute;width:9px;height:8px;top:50%;right:1em;margin-top:-4px;background-image:url(http://filamentgroup.com/files/select-arrow.png);background-repeat:no-repeat;background-size:100%;z-index:2;pointer-events:none}.custom-select:hover{border:1px solid #888}.custom-select select:focus{outline:0;box-shadow:0 0 1px 3px rgba(180,222,250,1);background-color:transparent;color:#222;border:1px solid #aaa}.custom-select::after,x:-o-prefocus{display:none}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.custom-select select::-ms-expand{display:none}.custom-select select:focus::-ms-value{background:0 0;color:#222}}.custom-select select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}.pull-top{display:inline-block;vertical-align:top;float:none}.nav.nav-pills.nav-stacked,div.tab-content{position:relative;min-height:1px;float:left}.box{padding:0 5px!important}.current-fields .field-row{padding:5px 0}.current-fields .panel{background-color:#f1f1f1;margin-top:0!important}.current-fields .panel:hover{background-color:#fff;cursor:pointer}.current-fields .panel.tool-panel{background-color:#fff}.current-fields .panel-heading{background-color:#f1f1f1;position:relative}.current-fields .panel-heading:hover{background-color:#fff;cursor:pointer}.current-fields .tool-panel.panel:hover{border-color:#9d9d9d;background-color:#eee;cursor:pointer}.current-fields .tool-panel.panel:hover .panel-heading{background-color:inherit;color:#000;cursor:pointer}.current-fields .tool-panel.panel .panel-heading{background-color:#fff;color:#9d9d9d}.current-fields .tool-panel.panel .panel-heading a{color:inherit}.nav.nav-pills.nav-stacked{width:16.66666667%;padding-right:15px}div.tab-content{width:83.33333333%;padding-top:0!important}.panel-default.startPage{border-style:dashed;border-color:#a9a9a9;border-width:3px}.busy-updating-wrapper{text-align:center;font-size:20px;position:fixed;bottom:0;right:55px;z-index:1}.busy-submitting-wrapper{position:fixed;top:50%;left:0;right:0;bottom:0}.dropzone h4.panel-title{height:17px;overflow:hidden}.container.admin-form{margin-top:70px}.edit-modal-window .modal-dialog{width:90%}.edit-modal-window .modal-body{padding:0}.edit-modal-window .edit-panel{background-color:#F1F1F1;padding:0 35px}.edit-modal-window .preview-field-panel{display:flex;flex-direction:column;justify-content:center}.edit-modal-window .preview-field-panel form{padding-right:20px}.edit-modal-window .preview-field{resize:vertical}.admin-form .ui-sortable-placeholder{visibility:visible!important;border:none;padding:1px;background:rgba(0,0,0,.5)!important}.config-form{max-width:100%}.config-form>.row{padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}div.config-form .row.field{padding-top:1.5em}div.config-form>.row>.container:nth-of-type(odd){border-right:1px #ddd solid}div.config-form.design>.row>.container:nth-of-type(odd){border-right:none}div.config-form .row>.field-input{padding-left:.1em}div.config-form .row>.field-input label{padding-left:1.3em;display:block}.admin-form>.page-header{padding-bottom:0;margin-bottom:40px}.admin-form>.page-header h1{margin-bottom:0;margin-top:0}.admin-form>.page-header>.col-xs-3{padding-top:1.4em}.admin-form .form-controls .row{padding:5px}.admin-form .page-header{border:none;margin-top:none;margin-bottom:none}.admin-form .tab-content{padding-top:3em}.submissions-table .table-outer.row{margin:1.5em 0 2em!important}.submissions-table .table-outer .col-xs-12{padding-left:0!important;border:1px solid #ddd;overflow-x:scroll;border-radius:3px}.submissions-table .table>thead>tr>th{min-width:8em}.submissions-table .table>tbody>tr.selected{background-color:#efefef}.admin-form .add-field{background-color:#ddd;padding:0 2%;border-radius:3px}.admin-form .add-field .col-xs-6{padding:.25em .4em}.admin-form .add-field .col-xs-6 .panel-heading{border-width:1px;border-style:solid;border-color:#bbb;border-radius:4px}.admin-form .oscar-field-select{margin:10px 0}.view-form-btn.span{padding-right:.6em}.status-light.status-light-off{color:#BE0000}.status-light.status-light-on{color:#3C0}.analytics .header-title{font-size:1em;color:#bab8b8}.analytics .header-numbers{font-size:4em;padding-bottom:.1em;margin-bottom:.5em;border-bottom:#fafafa solid 1px}.analytics .detailed-title{font-size:1.8em;margin-bottom:1.1em}.analytics .detailed-row{padding-bottom:.8em}.analytics .detailed-row .row{font-size:1.2em}.analytics .detailed-row .row.header{font-size:.8em;color:#bab8b8;text-transform:uppercase}.field-title-row{padding-top:2em;padding-bottom:1em;border-top:#fafafa solid 1px;font-size:1.2em;color:#bab8b8}.field-detailed-row{font-size:1.2em;padding-bottom:.3em}.table-tools{border-top:#fafafa solid 1px;padding-top:2.5em}.overlay{position:fixed;top:0;left:0;height:100%;width:100%;background-color:#000;background-color:rgba(0,0,0,.5);z-index:10}.overlay.submitform{background-color:#fff;background-color:rgba(256,256,256,.8)}.public-form.preview{border:none;box-shadow:0 0 10px 0 grey;overflow-y:scroll;overflow-x:hidden;height:400px;width:90%;position:absolute}.public-form input,.public-form textarea{background-color:#000;background-color:rgba(0,0,0,0);border-width:0}form .btn{border-color:grey}.public-form input.ng-untouched,.public-form input:focus,.public-form textarea.ng-untouched,.public-form textarea:focus{border-width:0 0 2px;border-color:rgba(246,255,181,.4);outline:0}.public-form input.ng-dirty,.public-form textarea.ng-dirty{border-width:0}.public-form input.empty,.public-form textarea.empty{border-width:0 0 2px;border-color:rgba(246,255,181,.4)}section.content p.breakwords{word-break:break-all}.public-form .btn[type=submit]{font-size:1.5em;padding:.35em 1.2em}section.content>section>section.container{margin-top:70px}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;font-size:18px}.public-form .input-block{display:block;width:100%}.modal-footer input[type=text]{min-height:34px;padding:7px 8px;font-size:13px;color:#333;vertical-align:middle;background-color:#fff;background-repeat:no-repeat;background-position:right 8px center;border:1px solid #ccc;border-radius:3px;box-shadow:inset 0 1px 2px rgba(0,0,0,.075)}.modal-body>.modal-body-alert{color:#796620;background-color:#f8eec7;border-color:#f2e09a;margin:-16px -15px 15px;padding:10px 15px;border-style:solid;border-width:1px 0}div.form-fields{position:relative;padding-top:10%}.public-form .letter{position:relative;display:-moz-inline-stack;display:inline-block;vertical-align:top;zoom:1;width:16px;padding:0;height:17px;font-size:12px;line-height:19px;border:1px solid #000;border:1px solid rgba(0,0,0,.2);margin-right:7px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;text-align:center;font-weight:700}div.form-submitted>.field.row{padding-bottom:2%;margin-top:10%}div.form-submitted>.field.row>div{font-size:1.7em}form .accordion-edit{width:inherit}.ui-datepicker.ui-widget{z-index:99!important}form .row.field .field-number{margin-right:.5em}form .row.field{padding:1em 0 0;width:inherit}form .row.field>.field-title{margin-top:.5em;font-size:1.2em;padding-bottom:.5em;width:inherit}form .row.field>.field-input{font-size:1.4em;color:#777}form.submission-form .row.field.statement>.field-title{font-size:1.7em}form.submission-form .row.field.statement>.field-input{font-size:1em;color:#ddd}form.submission-form .select.radio>.field-input input,form.submission-form .select>.field-input input{width:20%}form.submission-form .field.row.radio .btn.activeBtn{background-color:#000!important;background-color:rgba(0,0,0,.7)!important;color:#fff}form.submission-form .field.row.radio .btn{margin-right:1.2em}form.submission-form .select>.field-input .btn{text-align:left;margin-bottom:.7em}form.submission-form .select>.field-input .btn>span{font-size:1.1em}form .field-input>textarea{padding:.45em .9em;width:100%;line-height:160%}form .field-input>input.hasDatepicker{padding:.45em .9em;width:50%;line-height:160%}form .field-input>input.text-field-input{padding:.45em .9em;width:100%;line-height:160%}form .required-error{color:#ddd;font-size:.8em}form .row.field.dropdown>.field-input input{min-height:34px;border-width:0 0 2px;border-radius:5px}form .row.field.dropdown>.field-input input:focus{border:none}form .dropdown>.field-input .ui-select-choices-row-inner{border-radius:3px;margin:5px;padding:10px;background-color:#000;background-color:rgba(0,0,0,.05)}form .dropdown>.field-input .ui-select-choices-row-inner.active,form .dropdown>.field-input .ui-select-choices-row-inner.active:focus{background-color:#000;background-color:rgba(0,0,0,.1)}.current-fields .panel-body .row.description textarea,.current-fields .panel-body .row.question input[type=text]{width:100%}.current-fields .panel-body .row.options input[type=text]{width:80%}.ui-select-choices.ui-select-dropdown{top:2.5em!important}.ui-select-toggle{box-shadow:none!important;border:none!important}section.public-form field-directive .btn.btn-lg.btn-default{background:0 0}section.public-form field-directive .btn[disabled]{display:none}.form-item{border-radius:5px;text-align:center;width:180px;position:relative;height:215px;margin-bottom:45px}.form-item.paused{background-color:red;color:#fff}.form-item.paused:hover{background-color:#8b0000;color:#fff}.form-item.create-new input[type=text]{width:inherit;color:#000;border:none}.form-item.create-new{background-color:#3FA2F7;color:#fff}.form-item.create-new.new-form{background-color:#ff8383;z-index:11}.form-item.create-new.new-form:hover{background-color:#3079b5}.form-item.new-form input[type=text]{margin-top:.2em;width:inherit;color:#000;border:none;padding:.3em .6em}.form-item.new-form .custom-select{margin-top:.2em}.form-item.new-form .custom-select select{background-color:#fff}.form-item.new-form .details-row{margin-top:1em}.form-item.new-form .details-row.submit{margin-top:1.7em}.form-item.new-form .details-row.submit .btn{font-size:.95em}.form-item.new-form .title-row{margin-top:1em;top:0}.field-directive{opacity:.2;padding:2.5% 10%}.field-directive.activeField,.form-field-wrapper .form-actions.activeField{opacity:1}h3.forms-list-title{color:#3FA2F7;font-weight:600;margin-bottom:3em}.form-item{color:#71AADD;background-color:#E4F1FD}.form-item:hover{background-color:#3FA2F7;color:#23527C}.form-item.create-new:hover{color:#fff;background-color:#515151}.form-item>.row.footer{position:absolute;bottom:0;left:30%}.form-item .title-row{position:relative;top:15px;padding-top:3em;padding-bottom:1em}.form-item .title-row h4{font-size:1.3em}.form-item.create-new .title-row{padding:0}.form-item.create-new .title-row h4{font-size:7em}.form-item .details-row{margin-top:3.2em}.form-item .details-row small{font-size:.6em}.form-item.create-new .details-row small{font-size:.95em}section.auth{padding:70px 0;position:absolute;min-height:100%;top:0;left:0;width:100%;color:#fff;background-color:#50B5C1;background:-moz-linear-gradient(137deg,#50B5C1 0,#6450A0 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#50B5C1),color-stop(100%,#6450A0));background:-webkit-linear-gradient(137deg,#50B5C1 0,#6450A0 100%);background:-o-linear-gradient(137deg,#50B5C1 0,#6450A0 100%);background:-ms-linear-gradient(137deg,#50B5C1 0,#6450A0 100%)}section.auth>h3{font-size:2em;font-weight:500}.valign-wrapper{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.valign-wrapper .valign{display:block;width:100%}section.auth a{color:#fff;text-decoration:underline}section.auth.signup-view>h3{font-size:3em;padding-bottom:.5em}section.auth form .field-input select{padding:.45em .9em;width:100%;background:0 0;font-size:16px;border:1px solid #ccc;min-height:34px}section.auth input{color:#4c4c4c}section.auth .btn{border-radius:100px;font-size:14px;padding:12px 28px;margin-top:1em}.btn-rounded.btn-signup{background-color:#FFD747;color:#896D0B;border:2px solid #FFD747}.btn-rounded.btn-signup:hover{color:#FFD747;background-color:#896D0B;border:2px solid #896D0B}.btn-rounded.btn-default{background-color:transparent;color:#fff;border:2px solid #fff}.btn-rounded.btn-default:focus,.btn-rounded.btn-default:hover{color:#6450A0;background-color:#fff;border-color:#fff}@media (min-width:992px){.nav-users{position:fixed}}.remove-account-container{display:inline-block;position:relative}.btn-remove-account{top:10px;right:10px;position:absolute}section.auth input.form-control{min-height:30px!important;border:none}input.form-control{height:auto;border-radius:4px;box-shadow:none;font-size:18px;padding:20px 10px}
\ No newline at end of file
+*/.github-fork-ribbon{position:absolute;padding:2px 0;background-color:#a00;background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,0)),to(rgba(0,0,0,.15)));background-image:-webkit-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-moz-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-ms-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:-o-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.15));background-image:linear-gradient(to bottom,rgba(0,0,0,0),rgba(0,0,0,.15));-webkit-box-shadow:0 2px 3px 0 rgba(0,0,0,.5);-moz-box-shadow:0 2px 3px 0 rgba(0,0,0,.5);box-shadow:0 2px 3px 0 rgba(0,0,0,.5);font:700 13px "Helvetica Neue",Helvetica,Arial,sans-serif;z-index:9999;pointer-events:auto}.github-fork-ribbon a,.github-fork-ribbon a:hover{color:#fff;text-decoration:none;text-shadow:0 -1px rgba(0,0,0,.5);text-align:center;width:200px;line-height:20px;display:inline-block;padding:2px 0;border-width:1px 0;border-style:dotted;border-color:#fff;border-color:rgba(255,255,255,.7)}.github-fork-ribbon-wrapper{width:150px;height:150px;position:absolute;overflow:hidden;top:0;z-index:9998;pointer-events:none}.github-fork-ribbon-wrapper.fixed{position:fixed}.github-fork-ribbon-wrapper.left{left:0}.github-fork-ribbon-wrapper.right{right:0}.github-fork-ribbon-wrapper.left-bottom{position:fixed;top:inherit;bottom:0;left:0}.github-fork-ribbon-wrapper.right-bottom{position:fixed;top:inherit;bottom:0;right:0}.github-fork-ribbon-wrapper.right .github-fork-ribbon{top:42px;right:-43px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.github-fork-ribbon-wrapper.left .github-fork-ribbon{top:42px;left:-43px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.github-fork-ribbon-wrapper.left-bottom .github-fork-ribbon{top:80px;left:-43px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.github-fork-ribbon-wrapper.right-bottom .github-fork-ribbon{top:80px;right:-43px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.custom-select{position:relative;display:block;padding:0}.custom-select select{width:100%;margin:0;background:0 0;border:1px solid transparent;border-radius:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;appearance:none;-webkit-appearance:none;-moz-appearance:none;font-size:1em;font-family:helvetica,sans-serif;font-weight:700;color:#444;padding:.6em 1.9em .5em .8em;line-height:1.3}.custom-select option,.modal-header{font-weight:400}.custom-select::after{content:"";position:absolute;width:9px;height:8px;top:50%;right:1em;margin-top:-4px;background-image:url(http://filamentgroup.com/files/select-arrow.png);background-repeat:no-repeat;background-size:100%;z-index:2;pointer-events:none}.custom-select:hover{border:1px solid #888}.custom-select select:focus{outline:0;box-shadow:0 0 1px 3px rgba(180,222,250,1);background-color:transparent;color:#222;border:1px solid #aaa}.custom-select::after,x:-o-prefocus{display:none}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.custom-select select::-ms-expand{display:none}.custom-select select:focus::-ms-value{background:0 0;color:#222}}.custom-select select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}.pull-top{display:inline-block;vertical-align:top;float:none}.nav.nav-pills.nav-stacked,div.tab-content{position:relative;min-height:1px;float:left}.box{padding:0 5px!important}.current-fields .field-row{padding:5px 0}.current-fields .panel{background-color:#f1f1f1;margin-top:0!important}.current-fields .panel:hover{background-color:#fff;cursor:pointer}.current-fields .panel.tool-panel{background-color:#fff}.current-fields .panel-heading{background-color:#f1f1f1;position:relative}.current-fields .panel-heading:hover{background-color:#fff;cursor:pointer}.current-fields .tool-panel.panel:hover{border-color:#9d9d9d;background-color:#eee;cursor:pointer}.current-fields .tool-panel.panel:hover .panel-heading{background-color:inherit;color:#000;cursor:pointer}.current-fields .tool-panel.panel .panel-heading{background-color:#fff;color:#9d9d9d}.current-fields .tool-panel.panel .panel-heading a{color:inherit}.nav.nav-pills.nav-stacked{width:16.66666667%;padding-right:15px}div.tab-content{width:83.33333333%;padding-top:0!important}.panel-default.startPage{border-style:dashed;border-color:#a9a9a9;border-width:3px}.busy-updating-wrapper{text-align:center;font-size:20px;position:fixed;bottom:0;right:55px;z-index:1}.busy-submitting-wrapper{position:fixed;top:50%;left:0;right:0;bottom:0}.dropzone h4.panel-title{height:17px;overflow:hidden}.container.admin-form{margin-top:70px}.edit-modal-window .modal-dialog{width:90%}.edit-modal-window .modal-body{padding:0}.edit-modal-window .edit-panel{background-color:#F1F1F1;padding:0 35px}.edit-modal-window .preview-field-panel{display:flex;flex-direction:column;justify-content:center}.edit-modal-window .preview-field-panel form{padding-right:20px}.edit-modal-window .preview-field{resize:vertical}.admin-form .ui-sortable-placeholder{visibility:visible!important;border:none;padding:1px;background:rgba(0,0,0,.5)!important}.config-form>.row{padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}div.config-form .row.field{padding-top:1.5em}div.config-form>.row>.container:nth-of-type(odd){border-right:1px #ddd solid}div.config-form.design>.row>.container:nth-of-type(odd){border-right:none}div.config-form .row>.field-input{padding-left:.1em}div.config-form .row>.field-input label{padding-left:1.3em;display:block}.admin-form>.page-header{padding-bottom:0;margin-bottom:40px}.admin-form>.page-header h1{margin-bottom:0;margin-top:0}.admin-form>.page-header>.col-xs-3{padding-top:1.4em}.admin-form .form-controls .row{padding:5px}.admin-form .page-header{border:none;margin-top:none;margin-bottom:none}.admin-form .tab-content{padding-top:3em}.submissions-table .table-outer.row{margin:1.5em 0 2em!important}.submissions-table .table-outer .col-xs-12{padding-left:0!important;border:1px solid #ddd;overflow-x:scroll;border-radius:3px}.submissions-table .table>thead>tr>th{min-width:8em}.submissions-table .table>tbody>tr.selected{background-color:#efefef}.admin-form .add-field{background-color:#ddd;padding:0 2%;border-radius:3px}.admin-form .add-field .col-xs-6{padding:.25em .4em}.admin-form .add-field .col-xs-6 .panel-heading{border-width:1px;border-style:solid;border-color:#bbb;border-radius:4px}.admin-form .oscar-field-select{margin:10px 0}.view-form-btn.span{padding-right:.6em}.status-light.status-light-off{color:#BE0000}.status-light.status-light-on{color:#3C0}.analytics .header-title{font-size:1em;color:#bab8b8}.analytics .header-numbers{font-size:4em;padding-bottom:.1em;margin-bottom:.5em;border-bottom:#fafafa solid 1px}.analytics .detailed-title{font-size:1.8em;margin-bottom:1.1em}.analytics .detailed-row{padding-bottom:.8em}.analytics .detailed-row .row{font-size:1.2em}.analytics .detailed-row .row.header{font-size:.8em;color:#bab8b8;text-transform:uppercase}.field-title-row{padding-top:2em;padding-bottom:1em;border-top:#fafafa solid 1px;font-size:1.2em;color:#bab8b8}.field-detailed-row{font-size:1.2em;padding-bottom:.3em}.table-tools{border-top:#fafafa solid 1px;padding-top:2.5em}.overlay{position:fixed;top:0;left:0;height:100%;width:100%;background-color:#000;background-color:rgba(0,0,0,.5);z-index:10}.overlay.submitform{background-color:#fff;background-color:rgba(256,256,256,.8)}.public-form.preview{border:none;box-shadow:0 0 10px 0 grey;overflow-y:scroll;overflow-x:hidden;height:400px;width:90%;position:absolute}.public-form input,.public-form textarea{background-color:#000;background-color:rgba(0,0,0,0);border-width:0}form .btn{border-color:grey}.public-form input.ng-untouched,.public-form input:focus,.public-form textarea.ng-untouched,.public-form textarea:focus{border-width:0 0 2px;border-color:rgba(246,255,181,.4);outline:0}.public-form input.ng-dirty,.public-form textarea.ng-dirty{border-width:0}.public-form input.empty,.public-form textarea.empty{border-width:0 0 2px;border-color:rgba(246,255,181,.4)}section.content p.breakwords{word-break:break-all}.public-form .btn[type=submit]{font-size:1.5em;padding:.35em 1.2em}section.content>section>section.container{margin-top:70px}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;font-size:18px}.public-form .input-block{display:block;width:100%}.modal-footer input[type=text]{min-height:34px;padding:7px 8px;font-size:13px;color:#333;vertical-align:middle;background-color:#fff;background-repeat:no-repeat;background-position:right 8px center;border:1px solid #ccc;border-radius:3px;box-shadow:inset 0 1px 2px rgba(0,0,0,.075)}.modal-body>.modal-body-alert{color:#796620;background-color:#f8eec7;border-color:#f2e09a;margin:-16px -15px 15px;padding:10px 15px;border-style:solid;border-width:1px 0}div.form-fields{position:relative;padding-top:10%}.public-form .letter{position:relative;display:-moz-inline-stack;display:inline-block;vertical-align:top;zoom:1;width:16px;padding:0;height:17px;font-size:12px;line-height:19px;border:1px solid #000;border:1px solid rgba(0,0,0,.2);margin-right:7px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;text-align:center;font-weight:700}div.form-submitted>.field.row{padding-bottom:2%;margin-top:10%}div.form-submitted>.field.row>div{font-size:1.7em}form .accordion-edit{width:inherit}.ui-datepicker.ui-widget{z-index:99!important}form .row.field .field-number{margin-right:.5em}form .row.field{padding:1em 0 0;width:inherit}form .row.field>.field-title{margin-top:.5em;font-size:1.2em;padding-bottom:.5em;width:inherit}form .row.field>.field-input{font-size:1.4em;color:#777}form.submission-form .row.field.statement>.field-title{font-size:1.7em}form.submission-form .row.field.statement>.field-input{font-size:1em;color:#ddd}form.submission-form .select.radio>.field-input input,form.submission-form .select>.field-input input{width:20%}form.submission-form .field.row.radio .btn.activeBtn{background-color:#000!important;background-color:rgba(0,0,0,.7)!important;color:#fff}form.submission-form .field.row.radio .btn{margin-right:1.2em}form.submission-form .select>.field-input .btn{text-align:left;margin-bottom:.7em}form.submission-form .select>.field-input .btn>span{font-size:1.1em}form .field-input>textarea{padding:.45em .9em;width:100%;line-height:160%}form .field-input>input.hasDatepicker{padding:.45em .9em;width:50%;line-height:160%}form .field-input>input.text-field-input{padding:.45em .9em;width:100%;line-height:160%}form .required-error{color:#ddd;font-size:.8em}form .row.field.dropdown>.field-input input{min-height:34px;border-width:0 0 2px;border-radius:5px}form .row.field.dropdown>.field-input input:focus{border:none}form .dropdown>.field-input .ui-select-choices-row-inner{border-radius:3px;margin:5px;padding:10px;background-color:#000;background-color:rgba(0,0,0,.05)}form .dropdown>.field-input .ui-select-choices-row-inner.active,form .dropdown>.field-input .ui-select-choices-row-inner.active:focus{background-color:#000;background-color:rgba(0,0,0,.1)}.current-fields .panel-body .row.description textarea,.current-fields .panel-body .row.question input[type=text]{width:100%}.current-fields .panel-body .row.options input[type=text]{width:80%}.ui-select-choices.ui-select-dropdown{top:2.5em!important}.ui-select-toggle{box-shadow:none!important;border:none!important}section.public-form field-directive .btn.btn-lg.btn-default{background:0 0}section.public-form field-directive .btn[disabled]{display:none}.form-item{border-radius:5px;text-align:center;width:180px;position:relative;height:215px;margin-bottom:45px}.form-item.paused{background-color:red;color:#fff}.form-item.paused:hover{background-color:#8b0000;color:#fff}.form-item.create-new input[type=text]{width:inherit;color:#000;border:none}.form-item.create-new{background-color:#3FA2F7;color:#fff}.form-item.new-form{background-color:#ff8383;z-index:11}.form-item.new-form:hover{background-color:#3079b5}.form-item.new-form input[type=text]{margin-top:.2em;width:inherit;color:#000;border:none;padding:.3em .6em}.form-item.new-form .custom-select{margin-top:.2em}.form-item.new-form .custom-select select{background-color:#fff}.form-item.new-form .details-row{margin-top:1em}.form-item.new-form .details-row.submit{margin-top:1.7em}.form-item.new-form .details-row.submit .btn{font-size:.95em}.form-item.new-form .title-row{margin-top:1em;top:0}.field-directive{opacity:.2;padding:2.5% 10%}.field-directive.activeField,.form-field-wrapper .form-actions.activeField{opacity:1}h3.forms-list-title{color:#3FA2F7;font-weight:600;margin-bottom:3em}.form-item{color:#71AADD;background-color:#E4F1FD}.form-item:hover{background-color:#3FA2F7;color:#23527C}.form-item.create-new:hover{color:#fff;background-color:#515151}.form-item>.row.footer{position:absolute;bottom:0;left:30%}.form-item .title-row{position:relative;top:15px;padding-top:3em;padding-bottom:1em}.form-item .title-row h4{font-size:1.3em}.form-item.create-new .title-row{padding:0}.form-item.create-new .title-row h4{font-size:7em}.form-item.create-new.new-button .details-row{padding-top:20%}.form-item .details-row small{font-size:.6em}.form-item.create-new .details-row small{font-size:.95em}section.auth{padding:70px 0;position:absolute;min-height:100%;top:0;left:0;width:100%;color:#fff;background-color:#50B5C1;background:-moz-linear-gradient(137deg,#50B5C1 0,#6450A0 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#50B5C1),color-stop(100%,#6450A0));background:-webkit-linear-gradient(137deg,#50B5C1 0,#6450A0 100%);background:-o-linear-gradient(137deg,#50B5C1 0,#6450A0 100%);background:-ms-linear-gradient(137deg,#50B5C1 0,#6450A0 100%)}section.auth>h3{font-size:2em;font-weight:500}.valign-wrapper{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.valign-wrapper .valign{display:block;width:100%}section.auth a{color:#fff;text-decoration:underline}section.auth.signup-view>h3{font-size:3em;padding-bottom:.5em}section.auth form .field-input select{padding:.45em .9em;width:100%;background:0 0;font-size:16px;border:1px solid #ccc;min-height:34px}section.auth input{color:#4c4c4c}section.auth .btn{border-radius:100px;font-size:14px;padding:12px 28px;margin-top:1em}.btn-rounded.btn-signup{background-color:#FFD747;color:#896D0B;border:2px solid #FFD747}.btn-rounded.btn-signup:hover{color:#FFD747;background-color:#896D0B;border:2px solid #896D0B}.btn-rounded.btn-default{background-color:transparent;color:#fff;border:2px solid #fff}.btn-rounded.btn-default:focus,.btn-rounded.btn-default:hover{color:#6450A0;background-color:#fff;border-color:#fff}@media (min-width:992px){.nav-users{position:fixed}}.remove-account-container{display:inline-block;position:relative}.btn-remove-account{top:10px;right:10px;position:absolute}section.auth input.form-control{min-height:30px!important;border:none}input.form-control{height:auto;border-radius:4px;box-shadow:none;font-size:18px;padding:20px 10px}
\ No newline at end of file
diff --git a/public/dist/application.min.js b/public/dist/application.min.js
index b97d8b0e..176ba03c 100644
--- a/public/dist/application.min.js
+++ b/public/dist/application.min.js
@@ -1,5 +1,6 @@
"use strict";var ApplicationConfiguration=function(){var a="TellForm",b=["duScroll","ui.select","ngSanitize","vButton","ngResource","TellForm.templates","ui.router","ui.bootstrap","ui.utils","pascalprecht.translate","view-form"],c=function(b,c){angular.module(b,c||[]),angular.module(a).requires.push(b)};return{applicationModuleName:a,applicationModuleVendorDependencies:b,registerModule:c}}();angular.module(ApplicationConfiguration.applicationModuleName,ApplicationConfiguration.applicationModuleVendorDependencies),angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider",function(a){a.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.element(document).ready(function(){"#_=_"===window.location.hash&&(window.location.hash="#!"),angular.bootstrap(document,[ApplicationConfiguration.applicationModuleName])}),angular.module("TellForm.templates",[]).run(["$templateCache",function(a){a.put("modules/core/views/header.client.view.html",''),a.put("modules/forms/admin/views/admin-form.client.view.html",''),a.put("modules/forms/admin/views/list-forms.client.view.html",''),a.put("modules/forms/admin/views/adminTabs/analyze.html"," "),a.put("modules/forms/admin/views/adminTabs/configure.html"," "),a.put("modules/forms/admin/views/adminTabs/create.html"," "),a.put("modules/forms/admin/views/directiveViews/form/configure-form.client.view.html",''),a.put("modules/forms/admin/views/directiveViews/form/edit-form.client.view.html",''),
-a.put("modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html","{{ 'TOTAL_VIEWS' | translate }}
{{ 'RESPONSES' | translate }}
{{ 'COMPLETION_RATE' | translate }}
{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}
{{myform.analytics.visitors.length}}
{{myform.analytics.submissions}}
{{myform.analytics.conversionRate | number:0}}%
{{ AverageTimeElapsed | secondsToDateTime | date:'mm:ss'}}
{{ 'DESKTOP_AND_LAPTOP' | translate }}
{{ 'TABLETS' | translate }}
{{ 'PHONES' | translate }}
{{ 'OTHER' | translate }}
{{ 'UNIQUE_VISITS' | translate }}
{{DeviceStatistics.desktop.visits}}
{{ 'UNIQUE_VISITS' | translate }}
{{DeviceStatistics.tablet.visits}}
{{ 'UNIQUE_VISITS' | translate }}
{{DeviceStatistics.tablet.visits}}
{{ 'UNIQUE_VISITS' | translate }}
{{DeviceStatistics.other.visits}}
{{ 'RESPONSES' | translate }}
{{DeviceStatistics.desktop.responses}}
{{ 'RESPONSES' | translate }}
{{DeviceStatistics.tablet.responses}}
{{ 'RESPONSES' | translate }}
{{DeviceStatistics.phone.responses}}
{{ 'RESPONSES' | translate }}
{{DeviceStatistics.other.responses}}
{{ 'COMPLETION_RATE' | translate }}
{{DeviceStatistics.desktop.completion}}%
{{ 'COMPLETION_RATE' | translate }}
{{DeviceStatistics.tablet.completion}}%
{{ 'COMPLETION_RATE' | translate }}
{{DeviceStatistics.phone.completion}}%
{{ 'COMPLETION_RATE' | translate }}
{{DeviceStatistics.other.completion}}%
{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}
{{DeviceStatistics.desktop.average_time | secondsToDateTime | date:'mm:ss'}}
{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}
{{DeviceStatistics.tablet.average_time | secondsToDateTime | date:'mm:ss'}}
{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}
{{DeviceStatistics.phone.average_time | secondsToDateTime | date:'mm:ss'}}
{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}
{{DeviceStatistics.other.average_time | secondsToDateTime | date:'mm:ss'}}
{{ 'FIELD_TITLE' | translate }}
{{ 'FIELD_VIEWS' | translate }}
{{ 'FIELD_RESPONSES' | translate }}
{{ 'FIELD_DROPOFF' | translate }}
{{fieldStats.field.title}}
{{fieldStats.totalViews}}
{{fieldStats.responses}}
{{fieldStats.continueRate}}%
{{ 'DELETE_SELECTED' | translate }}
{{ 'EXPORT_TO_EXCEL' | translate }}
{{ 'EXPORT_TO_CSV' | translate }}
{{ 'EXPORT_TO_JSON' | translate }}
"),a.put("modules/users/views/authentication/access-denied.client.view.html","{{ 'ACCESS_DENIED_TEXT' | translate }} {{ 'SIGNIN_BTN' | translate }} "),a.put("modules/users/views/authentication/signin.client.view.html",''),a.put("modules/users/views/authentication/signup-success.client.view.html",'{{ \'SUCCESS_HEADER\' | translate }} {{ \'SUCCESS_TEXT\' | translate }} {{ \'NOT_ACTIVATED_YET\' | translate }} {{ \'BEFORE_YOU_CONTINUE\' | translate }} polydaic@gmail.com
'),a.put("modules/users/views/authentication/signup.client.view.html",''),a.put("modules/users/views/password/forgot-password.client.view.html",''),a.put("modules/users/views/password/reset-password-invalid.client.view.html",""),a.put("modules/users/views/password/reset-password-success.client.view.html",""),a.put("modules/users/views/password/reset-password.client.view.html",'{{ \'RESET_PASSWORD\' | translate }} '),a.put("modules/users/views/settings/change-password.client.view.html",'{{ \'CHANGE_PASSWORD\' | translate }} '),a.put("modules/users/views/settings/edit-profile.client.view.html",'{{ \'EDIT_PROFILE\' | translate }} '),a.put("modules/users/views/settings/social-accounts.client.view.html",'{{ \'CONNECTED_SOCIAL_ACCOUNTS\' | translate }}: {{ \'CONNECT_OTHER_SOCIAL_ACCOUNTS\' | translate }} '),a.put("modules/users/views/verify/resend-verify-email.client.view.html",'{{ \'VERIFICATION_EMAIL_SENT\' | translate }} {{ \'VERIFICATION_EMAIL_SENT_TO\' | translate }} {{username}}. {{ \'NOT_ACTIVATED_YET\' | translate }} {{ \'CHECK_YOUR_EMAIL\' | translate }} polydaic@gmail.com
'),a.put("modules/users/views/verify/verify-account.client.view.html",'{{ \'VERIFY_SUCCESS\' | translate }} {{ \'VERIFY_ERROR\' | translate }} '),a.put("form_modules/forms/base/views/directiveViews/entryPage/startPage.html",'
{{pageData.introTitle}} {{pageData.introParagraph}}
'),a.put("form_modules/forms/base/views/directiveViews/field/date.html",'{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }} {{field.description}}
'),a.put("form_modules/forms/base/views/directiveViews/field/dropdown.html",'{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }} {{field.description}}
'),a.put("form_modules/forms/base/views/directiveViews/field/hidden.html"," "),a.put("form_modules/forms/base/views/directiveViews/field/legal.html",'{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }} {{field.description}}
'),a.put("form_modules/forms/base/views/directiveViews/field/radio.html",'{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }} {{field.description}}
'),a.put("form_modules/forms/base/views/directiveViews/field/rating.html",'{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }} {{field.description}}
'),a.put("form_modules/forms/base/views/directiveViews/field/statement.html",'
{{field.title}} {{field.description}}
'),a.put("form_modules/forms/base/views/directiveViews/field/textarea.html",'{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }} {{ \'NEWLINE\' | translate }} {{field.description}}
Press SHIFT+ENTER to add a newline
{{ \'OK\' | translate }} {{ \'ENTER\' | translate }}
'),a.put("form_modules/forms/base/views/directiveViews/field/textfield.html",'{{index+1}} {{field.title}} ({{ \'OPTIONAL\' | translate }}) {{field.description}}
Error: {{ \'ERROR_EMAIL_INVALID\' | translate }} {{ \'ERROR_NOT_A_NUMBER\' | translate }} {{ \'ERROR_URL_INVALID\' | translate }}
{{ \'OK\' | translate }} {{ \'ENTER\' | translate }}
'),
-a.put("form_modules/forms/base/views/directiveViews/field/yes_no.html",'{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }} {{field.description}}
'),a.put("form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html",''),a.put("form_modules/forms/base/views/form-not-found.client.view.html",''),a.put("form_modules/forms/base/views/form-unauthorized.client.view.html",''),a.put("form_modules/forms/base/views/submit-form.client.view.html","")}]),ApplicationConfiguration.registerModule("core",["users"]),ApplicationConfiguration.registerModule("forms",["ngFileUpload","ui.router.tabs","ui.date","ui.sortable","angular-input-stars","users","ngclipboard"]),ApplicationConfiguration.registerModule("users"),angular.module("core").config(["$stateProvider","$urlRouterProvider",function(a,b,c){b.otherwise("/forms")}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","$state","$stateParams",function(a,b,c,d){a.$state=c,a.$stateParams=d,a.$on("$stateChangeSuccess",function(a,d,e,f){c.previous=f;var g=["home","signin","resendVerifyEmail","verify","signup","signup-success","forgot","reset-invalid","reset","reset-success"];g.indexOf(d.name)>0?b.isAuthenticated()&&(a.preventDefault(),c.go("listForms")):"access_denied"===d.name||b.isAuthenticated()||"submitForm"===d.name||(a.preventDefault(),c.go("listForms"))})}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","User","Authorizer","$state","$stateParams",function(a,b,c,d,e,f){a.$on("$stateChangeStart",function(a,f){var g,h,i;h=f&&f.data&&f.data.permissions?f.data.permissions:null,b.ensureHasCurrentUser(c),i=b.currentUser,i&&(g=new d(i),null!==h&&(g.canAccess(h)||(a.preventDefault(),e.go("access_denied"))))})}]),angular.module("core").controller("HeaderController",["$rootScope","$scope","Menus","$state","Auth","User","$window","$translate","$locale",function(a,b,c,d,e,f,g,h,i){a.signupDisabled=g.signupDisabled,b.user=a.user=e.ensureHasCurrentUser(f),b.authentication=a.authentication=e,a.languages=b.languages=["en","fr","es","it","de"],b.authentication.isAuthenticated()?a.language=b.user.language:a.language=i.id.substring(0,2),h.use(a.language),b.isCollapsed=!1,a.hideNav=!1,b.menu=c.getMenu("topbar"),b.signout=function(){var c=f.logout();c.then(function(){e.logout(),e.ensureHasCurrentUser(f),b.user=a.user=null,d.go("listForms"),d.reload()},function(a){console.error("Logout Failed: "+a)})},b.toggleCollapsibleMenu=function(){b.isCollapsed=!b.isCollapsed},b.$on("$stateChangeSuccess",function(c,d,e,f,g){b.isCollapsed=!1,a.hideNav=!1,angular.isDefined(d.data)&&angular.isDefined(d.data.hideNav)&&(a.hideNav=d.data.hideNav)})}]),angular.module("core").service("Menus",[function(){this.defaultRoles=["*"],this.menus={};var a=function(a){if(a){if(~this.roles.indexOf("*"))return!0;for(var b in a.roles)for(var c in this.roles)if(this.roles[c]===a.roles[b])return!0;return!1}return this.isPublic};this.validateMenuExistance=function(a){if(a&&a.length){if(this.menus[a])return!0;throw new Error("Menu does not exists")}throw new Error("MenuId was not provided")},this.getMenu=function(a){return this.validateMenuExistance(a),this.menus[a]},this.addMenu=function(b,c,d){return this.menus[b]={isPublic:c||!1,roles:d||this.defaultRoles,items:[],shouldRender:a},this.menus[b]},this.removeMenu=function(a){this.validateMenuExistance(a),delete this.menus[a]},this.addMenuItem=function(b,c,d,e,f,g,h,i){return this.validateMenuExistance(b),this.menus[b].items.push({title:c,link:d,menuItemType:e||"item",menuItemClass:e,uiRoute:f||"/"+d,isPublic:null===g||"undefined"==typeof g?this.menus[b].isPublic:g,roles:null===h||"undefined"==typeof h?this.menus[b].roles:h,position:i||0,items:[],shouldRender:a}),this.menus[b]},this.addSubMenuItem=function(b,c,d,e,f,g,h,i){this.validateMenuExistance(b);for(var j in this.menus[b].items)this.menus[b].items[j].link===c&&this.menus[b].items[j].items.push({title:d,link:e,uiRoute:f||"/"+e,isPublic:null===g||"undefined"==typeof g?this.menus[b].items[j].isPublic:g,roles:null===h||"undefined"==typeof h?this.menus[b].items[j].roles:h,position:i||0,shouldRender:a});return this.menus[b]},this.removeMenuItem=function(a,b){this.validateMenuExistance(a);for(var c in this.menus[a].items)this.menus[a].items[c].link===b&&this.menus[a].items.splice(c,1);return this.menus[a]},this.removeSubMenuItem=function(a,b){this.validateMenuExistance(a);for(var c in this.menus[a].items)for(var d in this.menus[a].items[c].items)this.menus[a].items[c].items[d].link===b&&this.menus[a].items[c].items.splice(d,1);return this.menus[a]},this.addMenu("topbar",!1,["*"]),this.addMenu("bottombar",!1,["*"])}]),angular.module("core").factory("subdomain",["$location",function(a){var b=a.host();return b.indexOf(".")<0?null:b.split(".")[0]}]),angular.module("forms").run(["Menus",function(a){a.addMenuItem("topbar","My Forms","forms","","/forms",!1)}]).filter("secondsToDateTime",[function(){return function(a){return new Date(1970,0,1).setSeconds(a)}}]).filter("formValidity",[function(){return function(a){if(a&&a.form_fields&&a.visible_form_fields){var b=Object.keys(a),c=(b.filter(function(a){return"$"!==a[0]}),a.form_fields),d=c.filter(function(a){return"object"==typeof a&&"statement"!==a.fieldType&&"rating"!==a.fieldType?!!a.fieldValue:"rating"===a.fieldType||void 0}).length;return d-(a.form_fields.length-a.visible_form_fields.length)}return 0}}]).filter("trustSrc",["$sce",function(a){return function(b){return a.trustAsResourceUrl(b)}}]).config(["$provide",function(a){a.decorator("accordionDirective",["$delegate",function(a){var b=a[0];return b.replace=!0,a}])}]),angular.module("forms").config(["$stateProvider",function(a){a.state("listForms",{url:"/forms",templateUrl:"modules/forms/admin/views/list-forms.client.view.html",resolve:{Forms:"GetForms",myForms:["GetForms","$q",function(a,b){var c=b.defer();return a.query(function(a){c.resolve(a)}),c.promise}]},controller:"ListFormsController",controllerAs:"ctrl"}).state("submitForm",{url:"/forms/:formId",templateUrl:"/static/form_modules/forms/base/views/submit-form.client.view.html",data:{hideNav:!0},resolve:{Forms:"GetForms",myForm:["GetForms","$stateParams","$q",function(a,b,c){var d=c.defer();return a.get({formId:b.formId},function(a){d.resolve(a)}),d.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:{GetForms:"GetForms",myForm:["GetForms","$stateParams","$q",function(a,b,c){var d=c.defer();return a.get({formId:b.formId},function(a){d.resolve(a)}),d.promise}]},controller:"AdminFormController"}).state("viewForm.configure",{url:"/configure",templateUrl:"modules/forms/admin/views/adminTabs/configure.html"}).state("viewForm.design",{url:"/design",templateUrl:"modules/forms/admin/views/adminTabs/design.html"}).state("viewForm.analyze",{url:"/analyze",templateUrl:"modules/forms/admin/views/adminTabs/analyze.html"}).state("viewForm.create",{url:"/create",templateUrl:"modules/forms/admin/views/adminTabs/create.html"})}]),angular.module("forms").factory("GetForms",["$resource","FORM_URL",function(a,b){return a(b,{formId:"@_id"},{query:{method:"GET",isArray:!0},get:{method:"GET",transformResponse:function(a,b){var c=angular.fromJson(a);return c.visible_form_fields=_.filter(c.form_fields,function(a){return a.deletePreserved===!1}),c}},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("users").config(["$httpProvider",function(a){a.interceptors.push(["$q","$location",function(a,b){return{responseError:function(c){return"/users/me"!==b.path()&&c.config&&"/users/me"!==c.config.url&&(401===c.status?(b.nextAfterLogin=b.path(),b.path("/signin")):403===c.status&&b.path("/access_denied")),a.reject(c)}}}])}]),angular.module("users").config(["$stateProvider",function(a){var b=function(a,b,c,d,e){var f=a.defer();return e.currentUser&&e.currentUser.email?b(f.resolve):e.currentUser=d.getCurrent(function(){e.login(),b(f.resolve())},function(){e.logout(),b(f.reject()),c.go("signin",{reload:!0})}),f.promise};b.$inject=["$q","$timeout","$state","User","Auth"];var c=function(a,b,c){var d=c.defer();return b(a.signupDisabled?d.reject():d.resolve()),d.promise};c.$inject=["$window","$timeout","$q"],a.state("profile",{resolve:{loggedin:b},url:"/settings/profile",templateUrl:"modules/users/views/settings/edit-profile.client.view.html"}).state("password",{resolve:{loggedin:b},url:"/settings/password",templateUrl:"modules/users/views/settings/change-password.client.view.html"}).state("accounts",{resolve:{loggedin:b},url:"/settings/accounts",templateUrl:"modules/users/views/settings/social-accounts.client.view.html"}).state("signup",{resolve:{isDisabled:c},url:"/signup",templateUrl:"modules/users/views/authentication/signup.client.view.html"}).state("signup-success",{resolve:{isDisabled:c},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:c},url:"/verify/:token",templateUrl:"modules/users/views/verify/verify-account.client.view.html"}).state("resendVerifyEmail",{resolve:{isDisabled:c},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(a,b,c,d,e,f){a=d,a.credentials={},a.error="",a.signin=function(){e.login(a.credentials).then(function(b){f.login(b),a.user=d.user=f.ensureHasCurrentUser(e),"home"!==c.previous.name&&"verify"!==c.previous.name&&""!==c.previous.name?c.go(c.previous.name):c.go("listForms")},function(b){d.user=f.ensureHasCurrentUser(e),a.user=d.user,a.error=b,console.error("loginError: "+b)})},a.signup=function(){return"admin"===a.credentials?void(a.error="Username cannot be 'admin'. Please pick another username."):void e.signup(a.credentials).then(function(a){c.go("signup-success")},function(b){console.error(b),b?(a.error=b,console.error(b)):console.error("No response received")})}}]),angular.module("users").controller("PasswordController",["$scope","$stateParams","$state","User",function(a,b,c,d){a.error="",a.askForPasswordReset=function(){d.askForPasswordReset(a.credentials).then(function(b){a.success=b.message,a.credentials=null},function(b){a.error=b,a.credentials=null})},a.resetUserPassword=function(){a.success=a.error=null,d.resetPassword(a.passwordDetails,b.token).then(function(b){a.success=b.message,a.passwordDetails=null,c.go("reset-success")},function(b){a.error=b.message||b,a.passwordDetails=null})}}]),angular.module("users").controller("SettingsController",["$scope","$rootScope","$http","$state","Users","Auth",function(a,b,c,d,e,f){a.user=f.currentUser,a.hasConnectedAdditionalSocialAccounts=function(b){for(var c in a.user.additionalProvidersData)return!0;return!1},a.cancel=function(){a.user=f.currentUser},a.isConnectedSocialAccount=function(b){return a.user.provider===b||a.user.additionalProvidersData&&a.user.additionalProvidersData[b]},a.removeUserSocialAccount=function(b){a.success=a.error=null,c["delete"]("/users/accounts",{params:{provider:b}}).success(function(b){a.success=!0,a.user=b}).error(function(b){a.error=b.message})},a.updateUserProfile=function(b){if(b){a.success=a.error=null;var c=new e(a.user);c.$update(function(b){a.success=!0,a.user=b},function(b){a.error=b.data.message})}else a.submitted=!0},a.changeUserPassword=function(){a.success=a.error=null,c.post("/users/password",a.passwordDetails).success(function(b){a.success=!0,a.passwordDetails=null}).error(function(b){a.error=b.message})}}]),angular.module("users").controller("VerifyController",["$scope","$state","$rootScope","User","Auth","$stateParams",function(a,b,c,d,e,f){a.isResetSent=!1,a.credentials={},a.error="",a.resendVerifyEmail=function(){d.resendVerifyEmail(a.credentials.email).then(function(b){a.success=b.message,a.credentials=null,a.isResetSent=!0},function(b){a.error=b,a.credentials.email=null,a.isResetSent=!1})},a.validateVerifyToken=function(){f.token&&(console.log(f.token),d.validateVerifyToken(f.token).then(function(b){a.success=b.message,a.isResetSent=!0,a.credentials.email=null},function(b){a.isResetSent=!1,a.error=b,a.credentials.email=null}))}}]),angular.module("users").factory("Auth",["$window",function(a){var b={isLoggedIn:!1},c={_currentUser:null,get currentUser(){return this._currentUser},ensureHasCurrentUser:function(d){return c._currentUser&&c._currentUser.username?c._currentUser:a.user?(c._currentUser=a.user,c._currentUser):void d.getCurrent().then(function(d){return c._currentUser=d,b.isLoggedIn=!0,a.user=c._currentUser,c._currentUser},function(d){return b.isLoggedIn=!1,c._currentUser=null,a.user=null,null})},isAuthenticated:function(){return!!c._currentUser},getUserState:function(){return b},login:function(a){b.isLoggedIn=!0,c._currentUser=a},logout:function(){a.user=null,b.isLoggedIn=!1,c._currentUser=null}};return c}]),angular.module("users").service("Authorizer",["APP_PERMISSIONS","USER_ROLES",function(a,b){return function(c){return{canAccess:function(d){var e,f,g;for(angular.isArray(d)||(d=[d]),e=0,f=d.length;e-1;case a.viewPrivateForm:case a.editForm:return c.roles.indexOf(b.admin)>-1||c.roles.indexOf(b.normal)>-1}}return!1}}}}]),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function(a,b,c,d,e){var f={getCurrent:function(){var a=b.defer();return d.get("/users/me").success(function(b){a.resolve(b)}).error(function(){a.reject("User's session has expired")}),a.promise},login:function(a){var c=b.defer();return d.post("/auth/signin",a).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise},logout:function(){var a=b.defer();return d.get("/auth/signout").then(function(b){a.resolve(null)},function(b){a.reject(b.data.message||b.data)}),a.promise},signup:function(a){var c=b.defer();return d.post("/auth/signup",a).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise},resendVerifyEmail:function(a){var c=b.defer();return d.post("/auth/verify",{email:a}).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise},validateVerifyToken:function(a){var c=/^([A-Za-z0-9]{48})$/g;if(!c.test(a))throw new Error("Error token: "+a+" is not a valid verification token");var e=b.defer();return d.get("/auth/verify/"+a).then(function(a){e.resolve(a.data)},function(a){e.reject(a.data)}),e.promise},resetPassword:function(a,c){var e=b.defer();return d.post("/auth/reset/"+c,a).then(function(a){e.resolve(a)},function(a){e.reject(a.data.message||a.data)}),e.promise},askForPasswordReset:function(a){var c=b.defer();return d.post("/auth/forgot",a).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise}};return f}]),angular.module("users").factory("Users",["$resource",function(a){return a("users",{},{update:{method:"PUT"}})}]),angular.module("core").config(["$translateProvider",function(a){a.translations("en",{MENU:"MENU",SIGNUP_TAB:"Sign Up",SIGNIN_TAB:"Sign In",SIGNOUT_TAB:"Signout",EDIT_PROFILE:"Edit Profile",MY_FORMS:"My Forms",MY_SETTINGS:"My Settings",CHANGE_PASSWORD:"Change Password"}),a.preferredLanguage("en").fallbackLanguage("en").useSanitizeValueStrategy("escape")}]),angular.module("core").config(["$translateProvider",function(a){a.translations("fr",{MENU:"MENU",SIGNUP_TAB:"Créer un Compte",SIGNIN_TAB:"Connexion",SIGNOUT_TAB:"Créer un compte",EDIT_PROFILE:"Modifier Mon Profil",MY_FORMS:"Mes Formulaires",MY_SETTINGS:"Mes Paramètres",CHANGE_PASSWORD:"Changer mon Mot de Pass"})}]),angular.module("core").config(["$translateProvider",function(a){a.translations("es",{MENU:"MENU",SIGNUP_TAB:"Registrarse",SIGNIN_TAB:"Entrar",SIGNOUT_TAB:"Salir",EDIT_PROFILE:"Editar Perfil",MY_FORMS:"Mis formularios",MY_SETTINGS:"Mis configuraciones",CHANGE_PASSWORD:"Cambiar contraseña"})}]),angular.module("forms").controller("AdminFormController",["$rootScope","$window","$scope","$stateParams","$state","Forms","CurrentForm","$http","$uibModal","myForm","$filter",function(a,b,c,d,e,f,g,h,i,j,k){c.activePill=0,c.copied=!1,c.onCopySuccess=function(a){c.copied=!0},c=a,c.animationsEnabled=!0,c.myform=j,a.saveInProgress=!1,c.oldForm=_.cloneDeep(c.myform),g.setForm(c.myform),c.formURL="/#!/forms/"+c.myform._id,c.myform.isLive?b.subdomainsDisabled===!0?c.actualFormURL=window.location.protocol+"//"+window.location.host+"/view"+c.formURL:window.location.host.split(".").length<3?c.actualFormURL=window.location.protocol+"//"+c.myform.admin.username+"."+window.location.host+c.formURL:c.actualFormURL=window.location.protocol+"//"+c.myform.admin.username+"."+window.location.host.split(".").slice(1,3).join(".")+c.formURL:c.actualFormURL=window.location.protocol+"//"+window.location.host+c.formURL;var l=c.refreshFrame=function(){document.getElementById("iframe")&&document.getElementById("iframe").contentWindow.location.reload()};c.tabData=[{heading:k("translate")("CONFIGURE_TAB"),templateName:"configure"}],c.designTabActive=!1,c.deactivateDesignTab=function(){c.designTabActive=!1},c.activateDesignTab=function(){c.designTabActive=!0},c.setForm=function(a){c.myform=a},a.resetForm=function(){c.myform=f.get({formId:d.formId})},c.openDeleteModal=function(){c.deleteModal=i.open({animation:c.animationsEnabled,templateUrl:"formDeleteModal.html",controller:"AdminFormController",resolve:{myForm:function(){return c.myform}}}),c.deleteModal.result.then(function(a){c.selected=a})},c.cancelDeleteModal=function(){c.deleteModal&&c.deleteModal.dismiss("cancel")},c.removeCurrentForm=function(){if(c.deleteModal&&c.deleteModal.opened){c.deleteModal.close();var a=c.myform._id;if(!a)throw new Error("Error - removeCurrentForm(): $scope.myform._id does not exist");h["delete"]("/forms/"+a).then(function(a){e.go("listForms",{},{reload:!0})},function(a){console.error(a)})}},c.updateDesign=function(a,b,d,e){c.update(a,b,d,e,function(){l()})},c.update=a.update=function(b,d,e,f,g){var i=!0;if(b||(i=!a.saveInProgress),i){var j=null;if(b||(a.saveInProgress=!0),e){for(var k=new RegExp("^[0-9a-fA-F]{24}$"),l=0;l]+/i,test:function(a){return!this.regExp.test(a)}},b.openDeleteModal=function(a){b.deleteModal=h.open({animation:b.animationsEnabled,templateUrl:"deleteModalListForms.html",controller:["$uibModalInstance","items","$scope",function(a,b,c){c.content=b,c.cancel=c.cancelDeleteModal,c.deleteForm=function(){c.$parent.removeForm(b.formIndex)}}],resolve:{items:function(){return{currFormTitle:b.myforms[a].title,formIndex:a}}}})},b.cancelDeleteModal=function(){b.deleteModal&&b.deleteModal.dismiss("cancel")},b.openCreateModal=function(){b.showCreateModal||(b.showCreateModal=!0)},b.closeCreateModal=function(){b.showCreateModal&&(b.showCreateModal=!1)},b.setForm=function(a){b.myform=a},b.goToWithId=function(a,b){d.go(a,{formId:b},{reload:!0})},b.duplicateForm=function(a){var c=_.cloneDeep(b.myforms[a]);delete c._id,g.post("/forms",{form:c}).success(function(c,d,e){b.myforms.splice(a+1,0,c)}).error(function(a){console.error(a),null===a&&(b.error=a.data.message)})},b.createNewForm=function(){var a={};a.title=b.forms.createForm.title.$modelValue,a.language=b.forms.createForm.language.$modelValue,b.forms.createForm.$valid&&b.forms.createForm.$dirty&&g.post("/forms",{form:a}).success(function(a,c,d){b.goToWithId("viewForm.create",a._id+"")}).error(function(a){console.error(a),b.error=a.data.message})},b.removeForm=function(a){if(a>=b.myforms.length||a<0)throw new Error("Error: form_index in removeForm() must be between 0 and "+b.myforms.length-1);g["delete"]("/forms/"+b.myforms[a]._id).success(function(c,d,e){
-b.myforms.splice(a,1),b.cancelDeleteModal()}).error(function(a){console.error(a)})}}]),angular.module("forms").directive("configureFormDirective",["$rootScope","$http","Upload","CurrentForm",function(a,b,c,d){return{templateUrl:"modules/forms/admin/views/directiveViews/form/configure-form.client.view.html",restrict:"E",scope:{myform:"=",user:"=",pdfFields:"@",formFields:"@"},controller:["$scope",function(b){b.log="",b.languages=a.languages,b.resetForm=a.resetForm,b.update=a.update}]}}]),angular.module("forms").directive("editFormDirective",["$rootScope","FormFields","$uibModal",function(a,b,c){return{templateUrl:"modules/forms/admin/views/directiveViews/form/edit-form.client.view.html",restrict:"E",transclude:!0,scope:{myform:"="},controller:["$scope",function(d){var e;d.sortableOptions={appendTo:".dropzone",forceHelperSize:!0,forcePlaceholderSize:!0,update:function(a,b){d.update(!1,d.myform,!0,!1,function(a){})}},d.openEditModal=function(a,b,e){d.editFieldModal=c.open({animation:!0,templateUrl:"editFieldModal.html",windowClass:"edit-modal-window",controller:["$uibModalInstance","$scope",function(c,d){d.field=a,d.showLogicJump=!1,d.isEdit=b,d.showAddOptions=function(a){return"dropdown"===d.field.fieldType||"checkbox"===d.field.fieldType||"radio"===d.field.fieldType},d.validShapes=["Heart","Star","thumbs-up","thumbs-down","Circle","Square","Check Circle","Smile Outlined","Hourglass","bell","Paper Plane","Comment","Trash"],d.addOption=function(){if("checkbox"===d.field.fieldType||"dropdown"===d.field.fieldType||"radio"===d.field.fieldType){d.field.fieldOptions||(d.field.fieldOptions=[]);var a=d.field.fieldOptions.length+1,b={option_id:Math.floor(1e5*Math.random()),option_title:"Option "+a,option_value:"Option "+a};d.field.fieldOptions.push(b)}},d.deleteOption=function(a){if("checkbox"===d.field.fieldType||"dropdown"===d.field.fieldType||"radio"===d.field.fieldType)for(var b=0;b',restrict:"E",scope:{typeName:"@"},controller:["$scope",function(a){var b={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"};a.typeIcon=b[a.typeName]}]}});var __indexOf=[].indexOf||function(a){for(var b=0,c=this.length;b=0&&(c=c+b+".html"),d.get(c)};return{template:"{{field.title}}
",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(a,d){c.chooseDefaultOption=a.chooseDefaultOption=function(b){"yes_no"===b?a.field.fieldValue="true":"rating"===b?a.field.fieldValue=0:"radio"===a.field.fieldType?a.field.fieldValue=a.field.fieldOptions[0].option_value:"legal"===b&&(a.field.fieldValue="true",c.nextField())},a.nextField=c.nextField,a.setActiveField=c.setActiveField,"date"===a.field.fieldType&&(a.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var e=a.field.fieldType;if("number"===a.field.fieldType||"textfield"===a.field.fieldType||"email"===a.field.fieldType||"link"===a.field.fieldType){switch(a.field.fieldType){case"textfield":a.input_type="text";break;case"email":a.input_type="email",a.placeholder="joesmith@example.com";break;case"number":a.input_type="text",a.validateRegex=/^-?\d+$/;break;default:a.input_type="url",a.placeholder="http://example.com"}e="textfield"}var g=f(e);d.html(g).show();b(d.contents())(a)}}}]),angular.module("view-form").directive("onEnterKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode,e=!1;null!==d.onEnterKeyDisabled&&(e=d.onEnterKeyDisabled),13!==c||b.shiftKey||e||(b.preventDefault(),a.$apply(function(){a.$eval(d.onEnterKey)}))})}}}]).directive("onTabKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keyup keypress",function(b){var c=b.which||b.keyCode;9!==c||b.shiftKey||(b.preventDefault(),a.$apply(function(){a.$eval(d.onTabKey)}))})}}}]).directive("onEnterOrTabKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode;13!==c&&9!==c||b.shiftKey||(b.preventDefault(),a.$apply(function(){a.$eval(d.onEnterOrTabKey)}))})}}}]).directive("onTabAndShiftKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode;9===c&&b.shiftKey&&(console.log("onTabAndShiftKey"),b.preventDefault(),a.$apply(function(){a.$eval(d.onTabAndShiftKey)}))})}}}]),angular.module("view-form").directive("onFinishRender",["$rootScope","$timeout",function(a,b){return{restrict:"A",link:function(b,c,d){if(c.attr("ng-repeat")||c.attr("data-ng-repeat")){var e=d.onFinishRender||"ngRepeat";b.$first&&!b.$last?b.$evalAsync(function(){a.$broadcast(e+" Started")}):b.$last&&b.$evalAsync(function(){a.$broadcast(e+" Finished")})}}}}]),jsep.addBinaryOp("contains",10),jsep.addBinaryOp("!contains",10),jsep.addBinaryOp("begins",10),jsep.addBinaryOp("!begins",10),jsep.addBinaryOp("ends",10),jsep.addBinaryOp("!ends",10),angular.module("view-form").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","SendVisitorData","$translate","$timeout",function(a,b,c,d,e,f,g){return{templateUrl:"form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html",restrict:"E",scope:{myform:"=",ispreview:"="},controller:["$document","$window","$scope",function(f,g,h){var i=!1,j="submit_field";h.forms={},h.ispreview&&b.restartClock();var k=h.myform.visible_form_fields.filter(function(a){return"statement"!==a.fieldType}).length,l=c("formValidity")(h.myform);h.translateAdvancementData={done:l,total:k,answers_not_completed:k-l},h.reloadForm=function(){h.myform.submitted=!1,h.myform.form_fields=_.chain(h.myform.visible_form_fields).map(function(a){return a.fieldValue="",a}).value(),h.loading=!1,h.error="",h.selected={_id:"",index:0},h.setActiveField(h.myform.visible_form_fields[0]._id,0,!1),b.restartClock()};var m=function(a){var b=a.logicJump;if(b.enabled&&b.expressionString&&b.valueB&&a.fieldValue){var c,d,e=jsep(b.expressionString);if("field"===e.left.name?(c=a.fieldValue,d=b.valueB):(c=b.valueB,d=a.fieldValue),"number"===a.fieldType||"scale"===a.fieldType||"rating"===a.fieldType)switch(e.operator){case"==":return parseInt(c)===parseInt(d);case"!==":return parseInt(c)!==parseInt(d);case">":return parseInt(c)>parseInt(d);case">=":return parseInt(c)>parseInt(d);case"<":return parseInt(c)-1;case"!contains":return!(c.indexOf(d)>-1);case"begins":return c.startsWith(d);case"!begins":return!c.startsWith(d);case"ends":return c.endsWith(d);case"!ends":return c.endsWith(d);default:return!1}}},n=function(){if(null===h.selected)throw console.error("current active field is null"),new Error("current active field is null");return h.selected._id===j?h.myform.form_fields.length-1:h.selected.index};h.isActiveField=function(a){return h.selected._id===a._id},h.setActiveField=d.setActiveField=function(a,b,d){if(null!==h.selected&&(a||null!==b)){if(a){if(null===b){b=h.myform.visible_form_fields.length;for(var e=0;e .field-directive:nth-of-type("+String(h.myform.visible_form_fields.length-1)+")"),m=$(l).height(),n=k-g-1.2*m,o=.9;h.selected.index===h.myform.visible_form_fields.length?bn?(a=h.selected.index+1,h.setActiveField(j,a,!1)):ef*o&&(a=h.selected.index-1,h.setActiveField(null,a,!1))}h.$apply()},d.nextField=h.nextField=function(){if(h.selected&&h.selected.index>-1)if(h.selected._id!==j){var a=h.myform.visible_form_fields[h.selected.index];a.logicJump&&a.logicJump.jumpTo&&m(a)?h.setActiveField(a.logicJump.jumpTo,null,!0):h.selected.index0&&h.setActiveField(null,a,!0)},d.goToInvalid=h.goToInvalid=function(){var a=$(".row.field-directive .ng-invalid.focusOn, .row.field-directive .ng-untouched.focusOn:not(.ng-valid)").first().parents(".row.field-directive").first().attr("data-id");h.setActiveField(a,null,!0)},h.exitStartPage=function(){h.myform.startPage.showStart=!1,h.myform.visible_form_fields.length>0&&(h.selected._id=h.myform.visible_form_fields[0]._id)};var o=function(){var a=new MobileDetect(window.navigator.userAgent),b="other";return a.tablet()?b="tablet":a.mobile()?b="mobile":a.is("bot")||(b="desktop"),{type:b,name:window.navigator.platform}},p=function(){$.ajaxSetup({async:!1});var a=$.getJSON("https://freegeoip.net/json/").responseJSON;return $.ajaxSetup({async:!0}),a&&a.ip||(a={ip:"Adblocker"}),{ipAddr:a.ip,geoLocation:{City:a.city,Country:a.country_name}}};d.submitForm=h.submitForm=function(){if(h.forms.myForm.$invalid)return void h.goToInvalid();var d=b.stopClock();h.loading=!0;var f=_.cloneDeep(h.myform),g=o();f.device=g;var i=p();f.ipAddr=i.ipAddr,f.geoLocation=i.geoLocation,f.timeElapsed=d,f.percentageComplete=c("formValidity")(h.myform)/h.myform.visible_form_fields.length*100,delete f.endPage,delete f.isLive,delete f.provider,delete f.startPage,delete f.visible_form_fields,delete f.analytics,delete f.design,delete f.submissions,delete f.submitted;for(var j=0;j{{ 'TOTAL_VIEWS' | translate }}
{{ 'RESPONSES' | translate }}
{{ 'COMPLETION_RATE' | translate }}
{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}
{{myform.analytics.visitors.length}}
{{myform.analytics.submissions}}
{{myform.analytics.conversionRate | number:0}}%
{{ AverageTimeElapsed | secondsToDateTime | date:'mm:ss'}}
{{ 'DESKTOP_AND_LAPTOP' | translate }}
{{ 'TABLETS' | translate }}
{{ 'PHONES' | translate }}
{{ 'OTHER' | translate }}
{{ 'UNIQUE_VISITS' | translate }}
{{DeviceStatistics.desktop.visits}}
{{ 'UNIQUE_VISITS' | translate }}
{{DeviceStatistics.tablet.visits}}
{{ 'UNIQUE_VISITS' | translate }}
{{DeviceStatistics.tablet.visits}}
{{ 'UNIQUE_VISITS' | translate }}
{{DeviceStatistics.other.visits}}
{{ 'RESPONSES' | translate }}
{{DeviceStatistics.desktop.responses}}
{{ 'RESPONSES' | translate }}
{{DeviceStatistics.tablet.responses}}
{{ 'RESPONSES' | translate }}
{{DeviceStatistics.phone.responses}}
{{ 'RESPONSES' | translate }}
{{DeviceStatistics.other.responses}}
{{ 'COMPLETION_RATE' | translate }}
{{DeviceStatistics.desktop.completion}}%
{{ 'COMPLETION_RATE' | translate }}
{{DeviceStatistics.tablet.completion}}%
{{ 'COMPLETION_RATE' | translate }}
{{DeviceStatistics.phone.completion}}%
{{ 'COMPLETION_RATE' | translate }}
{{DeviceStatistics.other.completion}}%
{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}
{{DeviceStatistics.desktop.average_time | secondsToDateTime | date:'mm:ss'}}
{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}
{{DeviceStatistics.tablet.average_time | secondsToDateTime | date:'mm:ss'}}
{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}
{{DeviceStatistics.phone.average_time | secondsToDateTime | date:'mm:ss'}}
{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}
{{DeviceStatistics.other.average_time | secondsToDateTime | date:'mm:ss'}}
{{ 'FIELD_TITLE' | translate }}
{{ 'FIELD_VIEWS' | translate }}
{{ 'FIELD_RESPONSES' | translate }}
{{ 'FIELD_DROPOFF' | translate }}
{{fieldStats.field.title}}
{{fieldStats.totalViews}}
{{fieldStats.responses}}
{{fieldStats.continueRate}}%
{{ 'DELETE_SELECTED' | translate }}
{{ 'EXPORT_TO_EXCEL' | translate }}
{{ 'EXPORT_TO_CSV' | translate }}
{{ 'EXPORT_TO_JSON' | translate }}
"),a.put("modules/users/views/authentication/access-denied.client.view.html","{{ 'ACCESS_DENIED_TEXT' | translate }} {{ 'SIGNIN_BTN' | translate }} "),a.put("modules/users/views/authentication/signin.client.view.html",''),a.put("modules/users/views/authentication/signup-success.client.view.html",'{{ \'SUCCESS_HEADER\' | translate }} {{ \'SUCCESS_TEXT\' | translate }} {{ \'NOT_ACTIVATED_YET\' | translate }} {{ \'BEFORE_YOU_CONTINUE\' | translate }} team@tellform.com
'),a.put("modules/users/views/authentication/signup.client.view.html",''),a.put("modules/users/views/password/forgot-password.client.view.html",''),a.put("modules/users/views/password/reset-password-invalid.client.view.html",""),a.put("modules/users/views/password/reset-password-success.client.view.html",""),a.put("modules/users/views/password/reset-password.client.view.html",'{{ \'RESET_PASSWORD\' | translate }} '),a.put("modules/users/views/settings/change-password.client.view.html",'{{ \'CHANGE_PASSWORD\' | translate }} '),a.put("modules/users/views/settings/edit-profile.client.view.html",'{{ \'EDIT_PROFILE\' | translate }} '),a.put("modules/users/views/settings/social-accounts.client.view.html",'{{ \'CONNECTED_SOCIAL_ACCOUNTS\' | translate }}: {{ \'CONNECT_OTHER_SOCIAL_ACCOUNTS\' | translate }} '),a.put("modules/users/views/verify/resend-verify-email.client.view.html",'{{ \'VERIFICATION_EMAIL_SENT\' | translate }} {{ \'VERIFICATION_EMAIL_SENT_TO\' | translate }} {{username}}. {{ \'NOT_ACTIVATED_YET\' | translate }} {{ \'CHECK_YOUR_EMAIL\' | translate }} polydaic@gmail.com
'),a.put("modules/users/views/verify/verify-account.client.view.html",'{{ \'VERIFY_SUCCESS\' | translate }} {{ \'VERIFY_ERROR\' | translate }} '),a.put("form_modules/forms/base/views/directiveViews/entryPage/startPage.html",'
{{pageData.introTitle}} {{pageData.introParagraph}}
'),a.put("form_modules/forms/base/views/directiveViews/field/date.html",'{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }} {{field.description}}
'),a.put("form_modules/forms/base/views/directiveViews/field/dropdown.html",'{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }} {{field.description}}
'),a.put("form_modules/forms/base/views/directiveViews/field/hidden.html"," "),a.put("form_modules/forms/base/views/directiveViews/field/legal.html",'{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }} {{field.description}}
'),a.put("form_modules/forms/base/views/directiveViews/field/radio.html",'{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }} {{field.description}}
'),a.put("form_modules/forms/base/views/directiveViews/field/rating.html",'{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }} {{field.description}}
'),a.put("form_modules/forms/base/views/directiveViews/field/statement.html",'
{{field.title}} {{field.description}}
'),a.put("form_modules/forms/base/views/directiveViews/field/textarea.html",'{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }} {{ \'NEWLINE\' | translate }} {{field.description}}
Press SHIFT+ENTER to add a newline
{{ \'OK\' | translate }} {{ \'ENTER\' | translate }}
'),a.put("form_modules/forms/base/views/directiveViews/field/textfield.html",'{{index+1}} {{field.title}} ({{ \'OPTIONAL\' | translate }}) {{field.description}}
Error: {{ \'ERROR_EMAIL_INVALID\' | translate }} {{ \'ERROR_NOT_A_NUMBER\' | translate }} {{ \'ERROR_URL_INVALID\' | translate }}
{{ \'OK\' | translate }} {{ \'ENTER\' | translate }}
'),
+a.put("form_modules/forms/base/views/directiveViews/field/yes_no.html",'{{index+1}} {{field.title}} {{ \'OPTIONAL\' | translate }} {{field.description}}
'),a.put("form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html",''),a.put("form_modules/forms/base/views/form-not-found.client.view.html",''),a.put("form_modules/forms/base/views/form-unauthorized.client.view.html",''),a.put("form_modules/forms/base/views/submit-form.client.view.html","")}]),ApplicationConfiguration.registerModule("core",["users"]),ApplicationConfiguration.registerModule("forms",["ngFileUpload","ui.router.tabs","ui.date","ui.sortable","angular-input-stars","users","ngclipboard"]),ApplicationConfiguration.registerModule("users"),angular.module("core").config(["$stateProvider","$urlRouterProvider",function(a,b,c){b.otherwise("/forms")}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","$state","$stateParams",function(a,b,c,d){a.$state=c,a.$stateParams=d,a.$on("$stateChangeSuccess",function(a,d,e,f){c.previous=f;var g=["home","signin","resendVerifyEmail","verify","signup","signup-success","forgot","reset-invalid","reset","reset-success"];g.indexOf(d.name)>0?b.isAuthenticated()&&(a.preventDefault(),c.go("listForms")):"access_denied"===d.name||b.isAuthenticated()||"submitForm"===d.name||(a.preventDefault(),c.go("listForms"))})}]),angular.module(ApplicationConfiguration.applicationModuleName).run(["$rootScope","Auth","User","Authorizer","$state","$stateParams",function(a,b,c,d,e,f){a.$on("$stateChangeStart",function(a,f){var g,h,i;h=f&&f.data&&f.data.permissions?f.data.permissions:null,b.ensureHasCurrentUser(c),i=b.currentUser,i&&(g=new d(i),null!==h&&(g.canAccess(h)||(a.preventDefault(),e.go("access_denied"))))})}]),angular.module("core").controller("HeaderController",["$rootScope","$scope","Menus","$state","Auth","User","$window","$translate",function(a,b,c,d,e,f,g,h){a.signupDisabled=g.signupDisabled,b.user=a.user=e.ensureHasCurrentUser(f),b.authentication=a.authentication=e,a.languages=b.languages=["en","fr","es","it","de"],a.language=b.user.language,h.use(b.user.language),b.isCollapsed=!1,a.hideNav=!1,b.menu=c.getMenu("topbar"),b.signout=function(){var c=f.logout();c.then(function(){e.logout(),e.ensureHasCurrentUser(f),b.user=a.user=null,d.go("listForms"),d.reload()},function(a){console.error("Logout Failed: "+a)})},b.toggleCollapsibleMenu=function(){b.isCollapsed=!b.isCollapsed},b.$on("$stateChangeSuccess",function(c,d,e,f,g){b.isCollapsed=!1,a.hideNav=!1,angular.isDefined(d.data)&&angular.isDefined(d.data.hideNav)&&(a.hideNav=d.data.hideNav)})}]),angular.module("core").service("Menus",[function(){this.defaultRoles=["*"],this.menus={};var a=function(a){if(a){if(~this.roles.indexOf("*"))return!0;for(var b in a.roles)for(var c in this.roles)if(this.roles[c]===a.roles[b])return!0;return!1}return this.isPublic};this.validateMenuExistance=function(a){if(a&&a.length){if(this.menus[a])return!0;throw new Error("Menu does not exists")}throw new Error("MenuId was not provided")},this.getMenu=function(a){return this.validateMenuExistance(a),this.menus[a]},this.addMenu=function(b,c,d){return this.menus[b]={isPublic:c||!1,roles:d||this.defaultRoles,items:[],shouldRender:a},this.menus[b]},this.removeMenu=function(a){this.validateMenuExistance(a),delete this.menus[a]},this.addMenuItem=function(b,c,d,e,f,g,h,i){return this.validateMenuExistance(b),this.menus[b].items.push({title:c,link:d,menuItemType:e||"item",menuItemClass:e,uiRoute:f||"/"+d,isPublic:null===g||"undefined"==typeof g?this.menus[b].isPublic:g,roles:null===h||"undefined"==typeof h?this.menus[b].roles:h,position:i||0,items:[],shouldRender:a}),this.menus[b]},this.addSubMenuItem=function(b,c,d,e,f,g,h,i){this.validateMenuExistance(b);for(var j in this.menus[b].items)this.menus[b].items[j].link===c&&this.menus[b].items[j].items.push({title:d,link:e,uiRoute:f||"/"+e,isPublic:null===g||"undefined"==typeof g?this.menus[b].items[j].isPublic:g,roles:null===h||"undefined"==typeof h?this.menus[b].items[j].roles:h,position:i||0,shouldRender:a});return this.menus[b]},this.removeMenuItem=function(a,b){this.validateMenuExistance(a);for(var c in this.menus[a].items)this.menus[a].items[c].link===b&&this.menus[a].items.splice(c,1);return this.menus[a]},this.removeSubMenuItem=function(a,b){this.validateMenuExistance(a);for(var c in this.menus[a].items)for(var d in this.menus[a].items[c].items)this.menus[a].items[c].items[d].link===b&&this.menus[a].items[c].items.splice(d,1);return this.menus[a]},this.addMenu("topbar",!1,["*"]),this.addMenu("bottombar",!1,["*"])}]),angular.module("core").factory("subdomain",["$location",function(a){var b=a.host();return b.indexOf(".")<0?null:b.split(".")[0]}]),angular.module("forms").run(["Menus",function(a){a.addMenuItem("topbar","My Forms","forms","","/forms",!1)}]).filter("secondsToDateTime",[function(){return function(a){return new Date(1970,0,1).setSeconds(a)}}]).filter("formValidity",[function(){return function(a){if(a&&a.form_fields&&a.visible_form_fields){var b=Object.keys(a),c=(b.filter(function(a){return"$"!==a[0]}),a.form_fields),d=c.filter(function(a){return"object"==typeof a&&"statement"!==a.fieldType&&"rating"!==a.fieldType?!!a.fieldValue:"rating"===a.fieldType||void 0}).length;return d-(a.form_fields.length-a.visible_form_fields.length)}return 0}}]).filter("trustSrc",["$sce",function(a){return function(b){return a.trustAsResourceUrl(b)}}]).config(["$provide",function(a){a.decorator("accordionDirective",["$delegate",function(a){var b=a[0];return b.replace=!0,a}])}]),angular.module("forms").config(["$stateProvider",function(a){a.state("listForms",{url:"/forms",templateUrl:"modules/forms/admin/views/list-forms.client.view.html",resolve:{Forms:"GetForms",myForms:["GetForms","$q",function(a,b){var c=b.defer();return a.query(function(a){c.resolve(a)}),c.promise}]},controller:"ListFormsController",controllerAs:"ctrl"}).state("submitForm",{url:"/forms/:formId",templateUrl:"/static/form_modules/forms/base/views/submit-form.client.view.html",data:{hideNav:!0},resolve:{Forms:"GetForms",myForm:["GetForms","$stateParams","$q",function(a,b,c){var d=c.defer();return a.get({formId:b.formId},function(a){d.resolve(a)}),d.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:{GetForms:"GetForms",myForm:["GetForms","$stateParams","$q",function(a,b,c){var d=c.defer();return a.get({formId:b.formId},function(a){d.resolve(a)}),d.promise}]},controller:"AdminFormController"}).state("viewForm.configure",{url:"/configure",templateUrl:"modules/forms/admin/views/adminTabs/configure.html"}).state("viewForm.design",{url:"/design",templateUrl:"modules/forms/admin/views/adminTabs/design.html"}).state("viewForm.analyze",{url:"/analyze",templateUrl:"modules/forms/admin/views/adminTabs/analyze.html"}).state("viewForm.create",{url:"/create",templateUrl:"modules/forms/admin/views/adminTabs/create.html"})}]),angular.module("forms").factory("GetForms",["$resource","FORM_URL",function(a,b){return a(b,{formId:"@_id"},{query:{method:"GET",isArray:!0},get:{method:"GET",transformResponse:function(a,b){var c=angular.fromJson(a);return c.visible_form_fields=_.filter(c.form_fields,function(a){return a.deletePreserved===!1}),c}},update:{method:"PUT"},save:{method:"POST"}})}]),angular.module("users").config(["$httpProvider",function(a){a.interceptors.push(["$q","$location",function(a,b){return{responseError:function(c){return"/users/me"!==b.path()&&c.config&&"/users/me"!==c.config.url&&(401===c.status?(b.nextAfterLogin=b.path(),b.path("/signin")):403===c.status&&b.path("/access_denied")),a.reject(c)}}}])}]),angular.module("users").config(["$stateProvider",function(a){var b=function(a,b,c,d,e){var f=a.defer();return e.currentUser&&e.currentUser.email?b(f.resolve):e.currentUser=d.getCurrent(function(){e.login(),b(f.resolve())},function(){e.logout(),b(f.reject()),c.go("signin",{reload:!0})}),f.promise};b.$inject=["$q","$timeout","$state","User","Auth"];var c=function(a,b,c){var d=c.defer();return b(a.signupDisabled?d.reject():d.resolve()),d.promise};c.$inject=["$window","$timeout","$q"],a.state("profile",{resolve:{loggedin:b},url:"/settings/profile",templateUrl:"modules/users/views/settings/edit-profile.client.view.html"}).state("password",{resolve:{loggedin:b},url:"/settings/password",templateUrl:"modules/users/views/settings/change-password.client.view.html"}).state("accounts",{resolve:{loggedin:b},url:"/settings/accounts",templateUrl:"modules/users/views/settings/social-accounts.client.view.html"}).state("signup",{resolve:{isDisabled:c},url:"/signup",templateUrl:"modules/users/views/authentication/signup.client.view.html"}).state("signup-success",{resolve:{isDisabled:c},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:c},url:"/verify/:token",templateUrl:"modules/users/views/verify/verify-account.client.view.html"}).state("resendVerifyEmail",{resolve:{isDisabled:c},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","$translate","$window",function(a,b,c,d,e,f,g,h){a=d,a.credentials={},a.error="",a.forms={},a.signin=function(){a.forms.signinForm.$invalid||e.login(a.credentials).then(function(b){f.login(b),a.user=d.user=f.ensureHasCurrentUser(e),"home"!==c.previous.name&&"verify"!==c.previous.name&&""!==c.previous.name?c.go(c.previous.name):c.go("listForms")},function(b){d.user=f.ensureHasCurrentUser(e),a.user=d.user,a.error=b,console.error("loginError: "+b)})},a.signup=function(){return"admin"===a.credentials?void(a.error="Username cannot be 'admin'. Please pick another username."):void(a.forms.signupForm.$invalid||e.signup(a.credentials).then(function(a){c.go("signup-success")},function(b){console.error(b),b?(a.error=b,console.error(b)):console.error("No response received")}))}}]),angular.module("users").controller("PasswordController",["$scope","$stateParams","$state","User","$translate","$window",function(a,b,c,d,e,f){e.use(f.locale),a.error="",a.forms={},a.askForPasswordReset=function(){d.askForPasswordReset(a.credentials).then(function(b){a.success=b.message,a.error=null,a.credentials=null},function(b){a.error=b,a.success=null,a.credentials=null})},a.resetUserPassword=function(){a.forms.resetPasswordForm.$invalid||(a.success=a.error=null,d.resetPassword(a.passwordDetails,b.token).then(function(b){a.success=b.message,a.error=null,a.passwordDetails=null,c.go("reset-success")},function(b){a.error=b.message||b,a.success=null,a.passwordDetails=null}))}}]),angular.module("users").controller("SettingsController",["$scope","$rootScope","$http","$state","Users","Auth",function(a,b,c,d,e,f){a.user=f.currentUser,a.hasConnectedAdditionalSocialAccounts=function(b){for(var c in a.user.additionalProvidersData)return!0;return!1},a.cancel=function(){a.user=f.currentUser},a.isConnectedSocialAccount=function(b){return a.user.provider===b||a.user.additionalProvidersData&&a.user.additionalProvidersData[b]},a.removeUserSocialAccount=function(b){a.success=a.error=null,c["delete"]("/users/accounts",{params:{provider:b}}).success(function(b){a.success=!0,a.error=null,a.user=b}).error(function(b){a.success=null,a.error=b.message})},a.updateUserProfile=function(b){if(b){a.success=a.error=null;var c=new e(a.user);c.$update(function(b){a.success=!0,a.error=null,a.user=b},function(b){a.success=null,a.error=b.data.message})}else a.submitted=!0},a.changeUserPassword=function(){a.success=a.error=null,c.post("/users/password",a.passwordDetails).success(function(b){a.success=!0,a.error=null,a.passwordDetails=null}).error(function(b){a.success=null,a.error=b.message})}}]),angular.module("users").controller("VerifyController",["$scope","$state","$rootScope","User","Auth","$stateParams","$translate","$window",function(a,b,c,d,e,f,g,h){g.use(h.locale),a.isResetSent=!1,a.credentials={},a.error="",a.resendVerifyEmail=function(){d.resendVerifyEmail(a.credentials.email).then(function(b){a.success=b.message,a.error=null,a.credentials=null,a.isResetSent=!0},function(b){a.error=b,a.success=null,a.credentials.email=null,a.isResetSent=!1})},a.validateVerifyToken=function(){f.token&&(console.log(f.token),d.validateVerifyToken(f.token).then(function(b){a.success=b.message,a.error=null,a.isResetSent=!0,a.credentials.email=null},function(b){a.isResetSent=!1,a.success=null,a.error=b,a.credentials.email=null}))}}]),angular.module("users").factory("Auth",["$window",function(a){var b={isLoggedIn:!1},c={_currentUser:null,get currentUser(){return this._currentUser},ensureHasCurrentUser:function(d){return c._currentUser&&c._currentUser.username?c._currentUser:a.user?(c._currentUser=a.user,c._currentUser):void d.getCurrent().then(function(d){return c._currentUser=d,b.isLoggedIn=!0,a.user=c._currentUser,c._currentUser},function(d){return b.isLoggedIn=!1,c._currentUser=null,a.user=null,null})},isAuthenticated:function(){return!!c._currentUser},getUserState:function(){return b},login:function(a){b.isLoggedIn=!0,c._currentUser=a},logout:function(){a.user=null,b.isLoggedIn=!1,c._currentUser=null}};return c}]),angular.module("users").service("Authorizer",["APP_PERMISSIONS","USER_ROLES",function(a,b){return function(c){return{canAccess:function(d){var e,f,g;for(angular.isArray(d)||(d=[d]),e=0,f=d.length;e-1;case a.viewPrivateForm:case a.editForm:return c.roles.indexOf(b.admin)>-1||c.roles.indexOf(b.normal)>-1}}return!1}}}}]),angular.module("users").factory("User",["$window","$q","$timeout","$http","$state",function(a,b,c,d,e){var f={getCurrent:function(){var a=b.defer();return d.get("/users/me").success(function(b){a.resolve(b)}).error(function(){a.reject("User's session has expired")}),a.promise},login:function(a){var c=b.defer();return d.post("/auth/signin",a).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise},logout:function(){var a=b.defer();return d.get("/auth/signout").then(function(b){a.resolve(null)},function(b){a.reject(b.data.message||b.data)}),a.promise},signup:function(a){var c=b.defer();return d.post("/auth/signup",a).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise},resendVerifyEmail:function(a){var c=b.defer();return d.post("/auth/verify",{email:a}).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise},validateVerifyToken:function(a){var c=/^([A-Za-z0-9]{48})$/g;if(!c.test(a))throw new Error("Error token: "+a+" is not a valid verification token");var e=b.defer();return d.get("/auth/verify/"+a).then(function(a){e.resolve(a.data)},function(a){e.reject(a.data)}),e.promise},resetPassword:function(a,c){var e=b.defer();return d.post("/auth/reset/"+c,a).then(function(a){e.resolve(a)},function(a){e.reject(a.data.message||a.data)}),e.promise},askForPasswordReset:function(a){var c=b.defer();return d.post("/auth/forgot",a).then(function(a){c.resolve(a.data)},function(a){c.reject(a.data.message||a.data)}),c.promise}};return f}]),angular.module("users").factory("Users",["$resource",function(a){return a("users",{},{update:{method:"PUT"}})}]),angular.module("core").config(["$translateProvider",function(a){a.translations("en",{MENU:"MENU",SIGNUP_TAB:"Sign Up",SIGNIN_TAB:"Sign In",SIGNOUT_TAB:"Signout",EDIT_PROFILE:"Edit Profile",MY_SETTINGS:"My Settings",CHANGE_PASSWORD:"Change Password",TOGGLE_NAVIGATION:"Toggle navigation"}),a.preferredLanguage("en").fallbackLanguage("en").useSanitizeValueStrategy("escape")}]),angular.module("core").config(["$translateProvider",function(a){a.translations("fr",{MENU:"MENU",SIGNUP_TAB:"Créer un Compte",SIGNIN_TAB:"Connexion",SIGNOUT_TAB:"Créer un compte",EDIT_PROFILE:"Modifier Mon Profil",MY_SETTINGS:"Mes Paramètres",CHANGE_PASSWORD:"Changer mon Mot de Pass",TOGGLE_NAVIGATION:"Basculer la navigation"})}]),angular.module("core").config(["$translateProvider",function(a){a.translations("de",{MENU:"MENÜ",SIGNUP_TAB:"Anmelden",SIGNIN_TAB:"Anmeldung",SIGNOUT_TAB:"Abmelden",EDIT_PROFILE:"Profil bearbeiten",MY_SETTINGS:"Meine Einstellungen",CHANGE_PASSWORD:"Passwort ändern",TOGGLE_NAVIGATION:"Navigation umschalten"})}]),angular.module("core").config(["$translateProvider",function(a){a.translations("it",{MENU:"MENÜ",SIGNUP_TAB:"Vi Phrasal",SIGNIN_TAB:"Accedi",SIGNOUT_TAB:"Esci",EDIT_PROFILE:"Modifica Profilo",MY_SETTINGS:"Mie Impostazioni",CHANGE_PASSWORD:"Cambia la password",TOGGLE_NAVIGATION:"Attiva la navigazione"})}]),angular.module("core").config(["$translateProvider",function(a){a.translations("es",{MENU:"MENU",SIGNUP_TAB:"Registrarse",SIGNIN_TAB:"Entrar",SIGNOUT_TAB:"Salir",EDIT_PROFILE:"Editar Perfil",MY_SETTINGS:"Mis configuraciones",CHANGE_PASSWORD:"Cambiar contraseña",TOGGLE_NAVIGATION:"Navegación de palanca"})}]),angular.module("forms").controller("AdminFormController",["$rootScope","$window","$scope","$stateParams","$state","Forms","CurrentForm","$http","$uibModal","myForm","$filter","$translate",function(a,b,c,d,e,f,g,h,i,j,k,l){c.activePill=0,c.copied=!1,c.onCopySuccess=function(a){c.copied=!0},c=a,c.animationsEnabled=!0,c.myform=j,a.saveInProgress=!1,c.oldForm=_.cloneDeep(c.myform),g.setForm(c.myform),c.formURL="/#!/forms/"+c.myform._id,c.myform.isLive?b.subdomainsDisabled===!0?c.actualFormURL=window.location.protocol+"//"+window.location.host+"/view"+c.formURL:window.location.host.split(".").length<3?c.actualFormURL=window.location.protocol+"//"+c.myform.admin.username+"."+window.location.host+c.formURL:c.actualFormURL=window.location.protocol+"//"+c.myform.admin.username+"."+window.location.host.split(".").slice(1,3).join(".")+c.formURL:c.actualFormURL=window.location.protocol+"//"+window.location.host+c.formURL;var m=c.refreshFrame=function(){document.getElementById("iframe")&&document.getElementById("iframe").contentWindow.location.reload()};c.tabData=[{heading:k("translate")("CONFIGURE_TAB"),templateName:"configure"}],c.designTabActive=!1,c.deactivateDesignTab=function(){c.designTabActive=!1},c.activateDesignTab=function(){c.designTabActive=!0},c.setForm=function(a){c.myform=a},a.resetForm=function(){c.myform=f.get({formId:d.formId})},c.openDeleteModal=function(){c.deleteModal=i.open({animation:c.animationsEnabled,templateUrl:"formDeleteModal.html",controller:"AdminFormController",resolve:{myForm:function(){return c.myform}}}),c.deleteModal.result.then(function(a){c.selected=a})},c.cancelDeleteModal=function(){c.deleteModal&&c.deleteModal.dismiss("cancel")},c.removeCurrentForm=function(){if(c.deleteModal&&c.deleteModal.opened){c.deleteModal.close();var a=c.myform._id;if(!a)throw new Error("Error - removeCurrentForm(): $scope.myform._id does not exist");h["delete"]("/forms/"+a).then(function(a){e.go("listForms",{},{reload:!0})},function(a){console.error(a)})}},c.updateDesign=function(a,b,d,e){c.update(a,b,d,e,function(){m()})},c.update=a.update=function(b,d,e,f,g){var i=!0;if(b||(i=!a.saveInProgress),i){var j=null;if(b||(a.saveInProgress=!0),e){for(var k=new RegExp("^[0-9a-fA-F]{24}$"),l=0;l]+/i,test:function(a){return!this.regExp.test(a)}},b.openDeleteModal=function(a){b.deleteModal=h.open({animation:b.animationsEnabled,templateUrl:"deleteModalListForms.html",controller:["$uibModalInstance","items","$scope",function(a,b,c){c.content=b,c.cancel=c.cancelDeleteModal,c.deleteForm=function(){c.$parent.removeForm(b.formIndex)}}],resolve:{items:function(){return{currFormTitle:b.myforms[a].title,formIndex:a}}}})},b.cancelDeleteModal=function(){
+b.deleteModal&&b.deleteModal.dismiss("cancel")},b.openCreateModal=function(){b.showCreateModal||(b.showCreateModal=!0)},b.closeCreateModal=function(){b.showCreateModal&&(b.showCreateModal=!1)},b.setForm=function(a){b.myform=a},b.goToWithId=function(a,b){d.go(a,{formId:b},{reload:!0})},b.duplicateForm=function(a){var c=_.cloneDeep(b.myforms[a]);delete c._id,g.post("/forms",{form:c}).success(function(c,d,e){b.myforms.splice(a+1,0,c)}).error(function(a){console.error(a),null===a&&(b.error=a.data.message)})},b.createNewForm=function(){var a={};a.title=b.forms.createForm.title.$modelValue,a.language=b.forms.createForm.language.$modelValue,b.forms.createForm.$valid&&b.forms.createForm.$dirty&&g.post("/forms",{form:a}).success(function(a,c,d){b.goToWithId("viewForm.create",a._id+"")}).error(function(a){console.error(a),b.error=a.data.message})},b.removeForm=function(a){if(a>=b.myforms.length||a<0)throw new Error("Error: form_index in removeForm() must be between 0 and "+b.myforms.length-1);g["delete"]("/forms/"+b.myforms[a]._id).success(function(c,d,e){b.myforms.splice(a,1),b.cancelDeleteModal()}).error(function(a){console.error(a)})}}]),angular.module("forms").directive("configureFormDirective",["$rootScope","$http","Upload","CurrentForm",function(a,b,c,d){return{templateUrl:"modules/forms/admin/views/directiveViews/form/configure-form.client.view.html",restrict:"E",scope:{myform:"=",user:"=",pdfFields:"@",formFields:"@"},controller:["$scope",function(b){b.log="",b.languages=a.languages,b.resetForm=a.resetForm,b.update=a.update}]}}]),angular.module("forms").directive("editFormDirective",["$rootScope","FormFields","$uibModal",function(a,b,c){return{templateUrl:"modules/forms/admin/views/directiveViews/form/edit-form.client.view.html",restrict:"E",transclude:!0,scope:{myform:"="},controller:["$scope",function(d){var e;d.sortableOptions={appendTo:".dropzone",forceHelperSize:!0,forcePlaceholderSize:!0,update:function(a,b){d.update(!1,d.myform,!0,!1,function(a){})}},d.openEditModal=function(a,b,e){d.editFieldModal=c.open({animation:!0,templateUrl:"editFieldModal.html",windowClass:"edit-modal-window",controller:["$uibModalInstance","$scope",function(c,d){d.field=a,d.showLogicJump=!1,d.isEdit=b,d.showAddOptions=function(a){return"dropdown"===d.field.fieldType||"checkbox"===d.field.fieldType||"radio"===d.field.fieldType},d.validShapes=["Heart","Star","thumbs-up","thumbs-down","Circle","Square","Check Circle","Smile Outlined","Hourglass","bell","Paper Plane","Comment","Trash"],d.addOption=function(){if("checkbox"===d.field.fieldType||"dropdown"===d.field.fieldType||"radio"===d.field.fieldType){d.field.fieldOptions||(d.field.fieldOptions=[]);var a=d.field.fieldOptions.length+1,b={option_id:Math.floor(1e5*Math.random()),option_title:"Option "+a,option_value:"Option "+a};d.field.fieldOptions.push(b)}},d.deleteOption=function(a){if("checkbox"===d.field.fieldType||"dropdown"===d.field.fieldType||"radio"===d.field.fieldType)for(var b=0;b',restrict:"E",scope:{typeName:"@"},controller:["$scope",function(a){var b={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"};a.typeIcon=b[a.typeName]}]}});var __indexOf=[].indexOf||function(a){for(var b=0,c=this.length;b=0&&(c=c+b+".html"),d.get(c)};return{template:"{{field.title}}
",restrict:"E",scope:{field:"=",required:"&",design:"=",index:"=",forms:"="},link:function(a,d){c.chooseDefaultOption=a.chooseDefaultOption=function(b){"yes_no"===b?a.field.fieldValue="true":"rating"===b?a.field.fieldValue=0:"radio"===a.field.fieldType?a.field.fieldValue=a.field.fieldOptions[0].option_value:"legal"===b&&(a.field.fieldValue="true",c.nextField())},a.nextField=c.nextField,a.setActiveField=c.setActiveField,"date"===a.field.fieldType&&(a.dateOptions={changeYear:!0,changeMonth:!0,altFormat:"mm/dd/yyyy",yearRange:"1900:-0",defaultDate:0});var e=a.field.fieldType;if("number"===a.field.fieldType||"textfield"===a.field.fieldType||"email"===a.field.fieldType||"link"===a.field.fieldType){switch(a.field.fieldType){case"textfield":a.input_type="text";break;case"email":a.input_type="email",a.placeholder="joesmith@example.com";break;case"number":a.input_type="text",a.validateRegex=/^-?\d+$/;break;default:a.input_type="url",a.placeholder="http://example.com"}e="textfield"}var g=f(e);d.html(g).show();b(d.contents())(a)}}}]),angular.module("view-form").directive("onEnterKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode,e=!1;null!==d.onEnterKeyDisabled&&(e=d.onEnterKeyDisabled),13!==c||b.shiftKey||e||(b.preventDefault(),a.$apply(function(){a.$eval(d.onEnterKey)}))})}}}]).directive("onTabKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keyup keypress",function(b){var c=b.which||b.keyCode;9!==c||b.shiftKey||(b.preventDefault(),a.$apply(function(){a.$eval(d.onTabKey)}))})}}}]).directive("onEnterOrTabKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode;13!==c&&9!==c||b.shiftKey||(b.preventDefault(),a.$apply(function(){a.$eval(d.onEnterOrTabKey)}))})}}}]).directive("onTabAndShiftKey",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){c.bind("keydown keypress",function(b){var c=b.which||b.keyCode;9===c&&b.shiftKey&&(console.log("onTabAndShiftKey"),b.preventDefault(),a.$apply(function(){a.$eval(d.onTabAndShiftKey)}))})}}}]),angular.module("view-form").directive("onFinishRender",["$rootScope","$timeout",function(a,b){return{restrict:"A",link:function(b,c,d){if(c.attr("ng-repeat")||c.attr("data-ng-repeat")){var e=d.onFinishRender||"ngRepeat";b.$first&&!b.$last?b.$evalAsync(function(){a.$broadcast(e+" Started")}):b.$last&&b.$evalAsync(function(){a.$broadcast(e+" Finished")})}}}}]),jsep.addBinaryOp("contains",10),jsep.addBinaryOp("!contains",10),jsep.addBinaryOp("begins",10),jsep.addBinaryOp("!begins",10),jsep.addBinaryOp("ends",10),jsep.addBinaryOp("!ends",10),angular.module("view-form").directive("submitFormDirective",["$http","TimeCounter","$filter","$rootScope","SendVisitorData","$translate","$timeout",function(a,b,c,d,e,f,g){return{templateUrl:"form_modules/forms/base/views/directiveViews/form/submit-form.client.view.html",restrict:"E",scope:{myform:"=",ispreview:"="},controller:["$document","$window","$scope",function(f,g,h){var i=!1,j="submit_field";h.forms={},h.ispreview&&b.restartClock();var k=h.myform.visible_form_fields.filter(function(a){return"statement"!==a.fieldType}).length,l=c("formValidity")(h.myform);h.translateAdvancementData={done:l,total:k,answers_not_completed:k-l},h.reloadForm=function(){h.myform.submitted=!1,h.myform.form_fields=_.chain(h.myform.visible_form_fields).map(function(a){return a.fieldValue="",a}).value(),h.loading=!1,h.error="",h.selected={_id:"",index:0},h.setActiveField(h.myform.visible_form_fields[0]._id,0,!1),b.restartClock()};var m=function(a){var b=a.logicJump;if(b.enabled&&b.expressionString&&b.valueB&&a.fieldValue){var c,d,e=jsep(b.expressionString);if("field"===e.left.name?(c=a.fieldValue,d=b.valueB):(c=b.valueB,d=a.fieldValue),"number"===a.fieldType||"scale"===a.fieldType||"rating"===a.fieldType)switch(e.operator){case"==":return parseInt(c)===parseInt(d);case"!==":return parseInt(c)!==parseInt(d);case">":return parseInt(c)>parseInt(d);case">=":return parseInt(c)>parseInt(d);case"<":return parseInt(c)-1;case"!contains":
+return!(c.indexOf(d)>-1);case"begins":return c.startsWith(d);case"!begins":return!c.startsWith(d);case"ends":return c.endsWith(d);case"!ends":return c.endsWith(d);default:return!1}}},n=function(){if(null===h.selected)throw console.error("current active field is null"),new Error("current active field is null");return h.selected._id===j?h.myform.form_fields.length-1:h.selected.index};h.isActiveField=function(a){return h.selected._id===a._id},h.setActiveField=d.setActiveField=function(a,b,d){if(null!==h.selected&&(a||null!==b)){if(a){if(null===b){b=h.myform.visible_form_fields.length;for(var e=0;e .field-directive:nth-of-type("+String(h.myform.visible_form_fields.length-1)+")"),m=$(l).height(),n=k-g-1.2*m,o=.9;h.selected.index===h.myform.visible_form_fields.length?bn?(a=h.selected.index+1,h.setActiveField(j,a,!1)):ef*o&&(a=h.selected.index-1,h.setActiveField(null,a,!1))}h.$apply()},d.nextField=h.nextField=function(){if(h.selected&&h.selected.index>-1)if(h.selected._id!==j){var a=h.myform.visible_form_fields[h.selected.index];a.logicJump&&a.logicJump.jumpTo&&m(a)?h.setActiveField(a.logicJump.jumpTo,null,!0):h.selected.index0&&h.setActiveField(null,a,!0)},d.goToInvalid=h.goToInvalid=function(){var a=$(".row.field-directive .ng-invalid.focusOn, .row.field-directive .ng-untouched.focusOn:not(.ng-valid)").first().parents(".row.field-directive").first().attr("data-id");h.setActiveField(a,null,!0)},h.exitStartPage=function(){h.myform.startPage.showStart=!1,h.myform.visible_form_fields.length>0&&(h.selected._id=h.myform.visible_form_fields[0]._id)};var o=function(){var a=new MobileDetect(window.navigator.userAgent),b="other";return a.tablet()?b="tablet":a.mobile()?b="mobile":a.is("bot")||(b="desktop"),{type:b,name:window.navigator.platform}},p=function(){$.ajaxSetup({async:!1});var a=$.getJSON("https://freegeoip.net/json/").responseJSON;return $.ajaxSetup({async:!0}),a&&a.ip||(a={ip:"Adblocker"}),{ipAddr:a.ip,geoLocation:{City:a.city,Country:a.country_name}}};d.submitForm=h.submitForm=function(){if(h.forms.myForm.$invalid)return void h.goToInvalid();var d=b.stopClock();h.loading=!0;var f=_.cloneDeep(h.myform),g=o();f.device=g;var i=p();f.ipAddr=i.ipAddr,f.geoLocation=i.geoLocation,f.timeElapsed=d,f.percentageComplete=c("formValidity")(h.myform)/h.myform.visible_form_fields.length*100,delete f.endPage,delete f.isLive,delete f.provider,delete f.startPage,delete f.visible_form_fields,delete f.analytics,delete f.design,delete f.submissions,delete f.submitted;for(var j=0;j$(\".loader\").fadeOut(\"slow\");");
+ "");
$templateCache.put("form_modules/forms/base/views/form-unauthorized.client.view.html",
- "");
+ "");
$templateCache.put("form_modules/forms/base/views/submit-form.client.view.html",
"");
$templateCache.put("form_modules/forms/base/views/directiveViews/entryPage/startPage.html",
"
{{pageData.introTitle}} {{pageData.introParagraph}}
");
$templateCache.put("form_modules/forms/base/views/directiveViews/field/date.html",
- "{{index+1}} {{field.title}} {{ 'OPTIONAL' | translate }} {{field.description}}
");
+ "{{index+1}} {{field.title}} {{ 'OPTIONAL' | translate }} {{field.description}}
");
$templateCache.put("form_modules/forms/base/views/directiveViews/field/dropdown.html",
- " 0\">
{{index+1}} {{field.title}} {{ 'OPTIONAL' | translate }} {{field.description}}
");
+ " 0\">
{{index+1}} {{field.title}} {{ 'OPTIONAL' | translate }} {{field.description}}
");
$templateCache.put("form_modules/forms/base/views/directiveViews/field/hidden.html",
" ");
$templateCache.put("form_modules/forms/base/views/directiveViews/field/legal.html",
- "{{index+1}} {{field.title}} {{ 'OPTIONAL' | translate }} {{field.description}}
");
+ "{{index+1}} {{field.title}} {{ 'OPTIONAL' | translate }} {{field.description}}
");
$templateCache.put("form_modules/forms/base/views/directiveViews/field/radio.html",
- " 0\">
{{index+1}} {{field.title}} {{ 'OPTIONAL' | translate }} {{field.description}}
");
+ " 0\">
{{index+1}} {{field.title}} {{ 'OPTIONAL' | translate }} {{field.description}}
");
$templateCache.put("form_modules/forms/base/views/directiveViews/field/rating.html",
- "{{index+1}} {{field.title}} {{ 'OPTIONAL' | translate }} {{field.description}}
");
+ "{{index+1}} {{field.title}} {{ 'OPTIONAL' | translate }} {{field.description}}
");
$templateCache.put("form_modules/forms/base/views/directiveViews/field/statement.html",
"
{{field.title}} {{field.description}}
{{field.description}}
{{ 'CONTINUE' | translate }}
");
$templateCache.put("form_modules/forms/base/views/directiveViews/field/textarea.html",
- "{{index+1}} {{field.title}} {{ 'OPTIONAL' | translate }} {{ 'NEWLINE' | translate }} {{field.description}}
Press SHIFT+ENTER to add a newline