diff --git a/README.md b/README.md index 3e62e417..2e2e70b0 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -TellForm +[](https://digitalocean.com/) ======== [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=UY555MCBZM722) @@ -14,8 +14,8 @@ TellForm is an *opensource alternative to TypeForm* built ontop of nodejs that c [See examples here](https://tellform.com/examples) ####Sponsored by -[](https://digitalocean.com/) -[](https://getsentry.com/) +[](https://digitalocean.com/) +[](https://getsentry.com/) [](https://statuspage.io/) [](https://stickermule.com/) [](https://sparkpost.com/) @@ -50,6 +50,8 @@ Before you start, make sure you have 1. Redis installed and running at 127.0.0.1:6379 2. MongoDB installed and running at 127.0.0.1:27017 (OR specify the host and port in config/env/all) +Also make sure to install DNS Masq or equivalent if running it locally on your computer (look at dns_masq_setup_osx for instructions on OSX) + Install dependencies first. ```bash $ npm install diff --git a/app/controllers/core.server.controller.js b/app/controllers/core.server.controller.js index 1ad1306c..a6f401db 100755 --- a/app/controllers/core.server.controller.js +++ b/app/controllers/core.server.controller.js @@ -13,11 +13,19 @@ exports.index = function(req, res) { }; exports.form = function(req, res) { - //Allow form to be embeded - res.removeHeader('X-Frame-Options'); + //Allow form to be embedded + res.set('X-Frame-Options', 'GOFORIT'); res.render('form', { user: req.user || null, request: req }); }; + + +exports.redoc = function(req, res) { + res.render('redoc', { + request: req + }); +}; + diff --git a/app/controllers/forms.server.controller.js b/app/controllers/forms.server.controller.js index 4fd4d301..18deeb37 100644 --- a/app/controllers/forms.server.controller.js +++ b/app/controllers/forms.server.controller.js @@ -12,6 +12,7 @@ var mongoose = require('mongoose'), fs = require('fs-extra'), async = require('async'), path = require('path'), + diff = require('deep-diff'), _ = require('lodash'); /** @@ -69,74 +70,6 @@ exports.uploadPDF = function(req, res, next) { } }; -/** - * Upload PDF - */ -/* -exports.uploadSubmissionFile = function(req, res, next) { - - console.log('inside uploadPDF'); - - // console.log('\n\nProperty Descriptor\n-----------'); - // console.log(Object.getOwnPropertyDescriptor(req.files.file, 'path')); - - console.log(req.files); - - if(req.files){ - var file, _user, _path; - - for(var i=0; i 100000000){ - return next(new Error('File uploaded exceeds MAX SIZE of 100MB')); - }else { - fs.exists(_path, function(exists) { - - //If file exists move to user's form directory - if(exists) { - var newDestination = config.tmpUploadPath+_user.username; - var stat = null; - try { - stat = fs.statSync(newDestination); - } catch (err) { - fs.mkdirSync(newDestination); - } - - if (stat && !stat.isDirectory()) { - console.log('Directory cannot be created'); - return next(new Error('Directory cannot be created because an inode of a different type exists at "' + newDestination + '"')); - } - - console.log(path.join(newDestination, pdfFile.filename)); - - fs.move(pdfFile.path, path.join(newDestination, pdfFile.filename), function (err) { - if (err) { - return next(new Error(err.message)); - } - pdfFile.path = path.join(newDestination, pdfFile.filename); - console.log(pdfFile.filename + ' uploaded to ' + pdfFile.path); - res.json(pdfFile); - }); - - } else { - return next(new Error('Did NOT get your file!')); - } - }); - } - } - - }else { - return next(new Error('Uploaded files were NOT detected')); - } -}; -*/ - /** * Delete a forms submissions */ @@ -185,8 +118,6 @@ exports.createSubmission = function(req, res) { percentageComplete: req.body.percentageComplete }); - if(!!form.plugins.oscarhost.baseUrl) submission.hasPlugins.oscarhost = true; - if(form.pdf) submission.pdf = form.pdf; //Save submitter's IP Address @@ -256,23 +187,27 @@ exports.listSubmissions = function(req, res) { * Create a new form */ exports.create = function(req, res) { + + + if(!req.body.form){ + console.log(err); + return res.status(400).send({ + message: "Invalid Input" + }); + } var form = new Form(req.body.form); form.admin = req.user._id; - console.log('Create a new form'); - console.log(form); - console.log(req.body.form); - console.log(req.user); form.save(function(err) { if (err) { console.log(err); - res.status(400).send({ + return res.status(405).send({ message: errorHandler.getErrorMessage(err) }); - } else { - res.json(form); } + + res.json(form); }); }; @@ -280,10 +215,7 @@ exports.create = function(req, res) { * Show the current form */ exports.read = function(req, res) { - var validUpdateTypes= Form.schema.path('plugins.oscarhost.settings.updateType').enumValues; - var newForm = req.form.toJSON({virtuals : true}); - newForm.plugins.oscarhost.settings.validUpdateTypes = validUpdateTypes; if (req.userId) { if(req.form.admin._id+'' === req.userId+''){ @@ -294,7 +226,6 @@ exports.read = function(req, res) { }); } return res.json(newForm); - }; /** @@ -302,27 +233,33 @@ exports.read = function(req, res) { */ exports.update = function(req, res) { var form = req.form; - delete req.body.form.__v; - delete req.body.form._id; - //Unless we have 'admin' priviledges, updating form admin is disabled - if(req.user.roles.indexOf('admin') === -1) delete req.body.form.admin; + if(req.body.changes){ + console.log('SENDING DIFFS\n\n\n'); + var formChanges = req.body.changes; - //Do this so we can create duplicate fields - var checkForValidId = new RegExp('^[0-9a-fA-F]{24}$'); - for(var i=0; i 0){ error.errors.ratingOptions = new mongoose.Error.ValidatorError({path:'fieldOptions', message: 'fieldOptions are only allowed for type dropdown, checkbox or radio fields.', type: 'notvalid', value: this.ratingOptions}); + console.error(error); return(next(error)); } } @@ -192,13 +192,18 @@ FormFieldSchema.pre('validate', function(next) { return next(); }); +//LogicJump Save +FormFieldSchema.pre('save', function(next) { + if(this.logicJump && this.logicJump.fieldA){ + if(this.logicJump.jumpTo = '') delete this.logicJump.jumpTo; + } + next(); +}); + //Submission fieldValue correction FormFieldSchema.pre('save', function(next) { - if(this.fieldType === 'dropdown' && this.isSubmission){ - //console.log(this); this.fieldValue = this.fieldValue.option_value; - //console.log(this.fieldValue); } return next(); diff --git a/app/models/form_submission.server.model.js b/app/models/form_submission.server.model.js index f96d40b4..cf470a22 100644 --- a/app/models/form_submission.server.model.js +++ b/app/models/form_submission.server.model.js @@ -159,88 +159,7 @@ FormSubmissionSchema.pre('save', function (next) { // console.log(_form); // console.log('should push to api'); // console.log( (!this.oscarDemoNum && !!_form.plugins.oscarhost.baseUrl && !!_form.plugins.oscarhost.settings.fieldMap) ); - if (!this.oscarDemoNum && _form.plugins.oscarhost.baseUrl && _form.plugins.oscarhost.settings.fieldMap) { - console.log('OSCARHOST API HOOK'); - var url_login = _form.plugins.oscarhost.baseUrl + '/LoginService?wsdl', - url_demo = _form.plugins.oscarhost.baseUrl + '/DemographicService?wsdl'; - - var args_login = {arg0: config.oscarhost.auth.user, arg1: config.oscarhost.auth.pass}; - - var options = { - ignoredNamespaces: { - namespaces: ['targetNamespace', 'typedNamespace'], - override: true - } - }; - // console.log(self.form_fields); - - //Generate demographics from hashmap - var generateDemo = function (formFields, conversionMap, demographicsTemplate) { - console.log('generating Demo fields'); - console.log(conversionMap); - var _generatedDemo = {}, currField, propertyName; - - for (var y = 0; y < formFields.length; y++) { - currField = formFields[y]; - propertyName = conversionMap[currField._id]; - - if (demographicsTemplate.hasOwnProperty(conversionMap[currField._id])) { - _generatedDemo[propertyName] = currField.fieldValue + ''; - } else if (propertyName === 'DOB') { - var date = new Date(currField.fieldValue); - _generatedDemo.dateOfBirth = date.getDate() + ''; - _generatedDemo.yearOfBirth = date.getFullYear() + ''; - _generatedDemo.monthOfBirth = date.getMonth() + ''; - } - } - var currDate = new Date(); - var dateString = currDate.toISOString().split('T')[0] + ' ' + currDate.toISOString().split('T')[1].slice(0, 8); - _generatedDemo.lastUpdateDate = currDate.toISOString(); - return _generatedDemo; - }; - - var submissionDemographic = generateDemo(self.form_fields, _form.plugins.oscarhost.settings.fieldMap, newDemoTemplate); - - console.log(submissionDemographic); - async.waterfall([ - function (callback) { - //Authenticate with API - soap.createClient(url_login, options, function (err, client) { - client.login(args_login, function (err, result) { - if (err) return callback(err); - console.log('SOAP authenticated'); - return callback(null, result.return); - }); - }); - }, - - function (security_obj, callback) { - //Force Add Demographic - if (_form.plugins.oscarhost.settings.updateType === 'force_add') { - soap.createClient(url_demo, options, function (err, client) { - if (err) return callback(err); - client.setSecurity(new OscarSecurity(security_obj.securityId, security_obj.securityTokenKey)); - - client.addDemographic({arg0: submissionDemographic}, function (err, result) { - console.log('FORCE ADDING DEMOGRAPHIC \n'); - // console.log(result.return); - if (err) return callback(err); - return callback(null, result); - }); - }); - } - } - - ], function (err, result) { - if (err) return next(err); - - self.oscarDemoNum = parseInt(result.return, 10); - console.log('self.oscarDemoNum: ' + self.oscarDemoNum); - return next(); - }); - } else { - return next(); - } + return next(); }); } else { return next(); diff --git a/app/models/logic_jump.server.model.js b/app/models/logic_jump.server.model.js index 90f50ae1..650d1fe8 100644 --- a/app/models/logic_jump.server.model.js +++ b/app/models/logic_jump.server.model.js @@ -6,76 +6,76 @@ var mongoose = require('mongoose'), Schema = mongoose.Schema, _ = require('lodash'), - math = require('math'); + math = require('mathjs'); - -var BooleanExpressionSchema = new Schema({ - expressionString: { - type: String, +var schemaOptions = { + toObject: { + virtuals: true }, - result: { - type: Boolean, - } -}); - - -BooleanExpressionSchema.methods.evaluate = function(){ - if(this.expressionString){ - //Get headNode - var headNode = math.parse(this.expressionString); - var expressionScope = {}; - var that = this; - - //Create scope - headNode.traverse(function (node, path, parent) { - if(node.type === 'SymbolNode'){ - - mongoose.model('Field') - .findOne({_id: node.name}).exec(function(err, field){ - if(err) { - console.log(err); - throw new Error(err); - } - - if(!!_.parseInt(field.fieldValue)){ - that.expressionScope[node.name] = _.parseInt(field.fieldValue); - }else { - that.expressionScope[node.name] = field.fieldValue; - } - console.log('_id: '+node.name); - console.log('value: '+that.expressionScope[node.name]); - }); - } - }); - - var code = headNode.compile(); - var result = code.eval(expressionScope); - - this.result = result; - return result; - }else{ - return null; + toJSON: { + virtuals: true } }; -mongoose.model('BooleanExpression', BooleanExpressionSchema); -/** - * Form Schema - */ var LogicJumpSchema = new Schema({ - created: { - type: Date, - default: Date.now + expressionString: { + type: String, + enum: [ + 'field == static', + 'field != static', + 'field > static', + 'field >= static', + 'field <= static', + 'field < static', + 'field contains static', + 'field !contains static', + 'field begins static', + 'field !begins static', + 'field ends static', + 'field !ends static', + ] }, - lastModified: { - type: Date, - }, - - BooleanExpression: { + fieldA: { type: Schema.Types.ObjectId, - ref: 'BooleanExpression' + ref: 'FormField' }, + valueB: { + type: Schema.Types.String + }, + jumpTo: { + type: Schema.Types.ObjectId, + ref: 'FormField' + } +}, schemaOptions); -}); +/* + IS EQUAL TO statement + + var scope = { + a: val1, + b: val2 + }; + + math.eval('a == b', scope); + + IS NOT EQUAL TO statement + var scope = { + a: val1, + b: val2 + }; + + math.eval('a !== b', scope); + + BEGINS WITH statement + + ENDS WITH statement + + CONTAINS statement + + DOES NOT CONTAIN statement + + */ mongoose.model('LogicJump', LogicJumpSchema); + +module.exports = LogicJumpSchema; diff --git a/app/models/user.server.model.js b/app/models/user.server.model.js index a39a40ab..ada86898 100755 --- a/app/models/user.server.model.js +++ b/app/models/user.server.model.js @@ -75,6 +75,7 @@ var UserSchema = new Schema({ type: String, unique: true, required: false, + lowercase: true, trim: true }, passwordHash: { @@ -119,7 +120,13 @@ var UserSchema = new Schema({ resetPasswordExpires: { type: Date }, - token: String + token: String, + apiKey: { + type: String, + unique: true, + index: true, + sparse: true + }, }); UserSchema.virtual('displayName').get(function () { diff --git a/app/routes/core.server.routes.js b/app/routes/core.server.routes.js index c8077872..166bfd03 100755 --- a/app/routes/core.server.routes.js +++ b/app/routes/core.server.routes.js @@ -7,10 +7,11 @@ var forms = require('../../app/controllers/forms.server.controller'), core = require('../../app/controllers/core.server.controller'); module.exports = function(app) { - // Root routing + // Core routing app.route('/').get(core.index); - app.route('/subdomain/([a-zA-Z0-9]+)/').get(core.form); - app.route('/subdomain/*/forms/:formId([a-zA-Z0-9]+)') - .get(forms.read) + + app.route('/subdomain/api/').get(core.redoc); + app.route('/subdomain/:userSlug((?!api$)[A-Za-z0-9]+)/').get(core.form); + app.route('/subdomain/:userSlug((?!api$)[A-Za-z0-9]+)/forms/:formId([a-zA-Z0-9]+)').get(forms.read) .post(forms.createSubmission); }; diff --git a/app/routes/forms.server.routes.js b/app/routes/forms.server.routes.js index 2bcb6332..7726d32b 100644 --- a/app/routes/forms.server.routes.js +++ b/app/routes/forms.server.routes.js @@ -6,7 +6,8 @@ var users = require('../../app/controllers/users.server.controller'), forms = require('../../app/controllers/forms.server.controller'), multer = require('multer'), - config = require('../../config/config'); + config = require('../../config/config'), + auth = require('../../config/passport_helpers'); // Setting the pdf upload route and folder var storage = multer.diskStorage({ @@ -27,21 +28,21 @@ var upload = multer({ module.exports = function(app) { // Form Routes app.route('/upload/pdf') - .post(users.requiresLogin, upload.single('file'), forms.uploadPDF); + .post(auth.isAuthenticatedOrApiKey, upload.single('file'), forms.uploadPDF); app.route('/forms') - .get(users.requiresLogin, forms.list) - .post(users.requiresLogin, forms.create); + .get(auth.isAuthenticatedOrApiKey, forms.list) + .post(auth.isAuthenticatedOrApiKey, forms.create); app.route('/forms/:formId([a-zA-Z0-9]+)') .get(forms.read) .post(forms.createSubmission) - .put(users.requiresLogin, forms.hasAuthorization, forms.update) - .delete(users.requiresLogin, forms.hasAuthorization, forms.delete); + .put(auth.isAuthenticatedOrApiKey, forms.hasAuthorization, forms.update) + .delete(auth.isAuthenticatedOrApiKey, forms.hasAuthorization, forms.delete); app.route('/forms/:formId([a-zA-Z0-9]+)/submissions') - .get(users.requiresLogin, forms.hasAuthorization, forms.listSubmissions) - .delete(users.requiresLogin, forms.hasAuthorization, forms.deleteSubmissions); + .get(auth.isAuthenticatedOrApiKey, forms.hasAuthorization, forms.listSubmissions) + .delete(auth.isAuthenticatedOrApiKey, forms.hasAuthorization, forms.deleteSubmissions); // Finish by binding the form middleware app.param('formId', forms.formByID); diff --git a/app/routes/users.server.routes.js b/app/routes/users.server.routes.js index b8b0eed2..06b5b0f3 100755 --- a/app/routes/users.server.routes.js +++ b/app/routes/users.server.routes.js @@ -3,16 +3,17 @@ /** * Module dependencies. */ -var passport = require('passport'); -var config = require('../../config/config'); +var passport = require('passport'), + config = require('../../config/config'), + auth = require('../../config/passport_helpers'); module.exports = function(app) { // User Routes var users = require('../../app/controllers/users.server.controller'); // Setting up the users profile api - app.route('/users/me').get(users.requiresLogin, users.getUser); - app.route('/users').put(users.requiresLogin, users.update); + 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 @@ -32,6 +33,8 @@ module.exports = function(app) { app.route('/auth/signin').post(users.signin); app.route('/auth/signout').get(users.signout); + app.route('/auth/genkey').get(users.requiresLogin, users.generateAPIKey); + // // Setting the facebook oauth routes // app.route('/auth/facebook').get(passport.authenticate('facebook', { // scope: ['email'] diff --git a/app/sockets/analytics_service.js b/app/sockets/analytics_service.js index 6164a672..a519e80e 100644 --- a/app/sockets/analytics_service.js +++ b/app/sockets/analytics_service.js @@ -55,12 +55,8 @@ module.exports = function (io, socket) { // a user has visited our page - add them to the visitorsData object socket.on('form-visitor-data', function(data) { - console.log('\n\nuser has visited our page'); - visitorsData[socket.id] = data; - - console.log(data); - + if (data.isSubmitted) { saveVisitorData(data, function () { console.log('\n\n user submitted form'); diff --git a/app/tests/form_submission.model.test.js b/app/tests/form_submission.model.test.js index 5a048919..cb3a5921 100644 --- a/app/tests/form_submission.model.test.js +++ b/app/tests/form_submission.model.test.js @@ -150,13 +150,6 @@ describe('FormSubmission Model Unit Tests:', function() { beforeEach(function(done){ var myFieldMap = {}; - myFieldMap[myForm.form_fields[0]._id+''] = 'firstName'; - myFieldMap[myForm.form_fields[1]._id+''] = 'lastName'; - myFieldMap[myForm.form_fields[2]._id+''] = 'sex'; - myFieldMap[myForm.form_fields[3]._id+''] = 'DOB'; - myFieldMap[myForm.form_fields[4]._id+''] = 'phone'; - - myForm.plugins.oscarhost.settings.fieldMap = myFieldMap; myForm.save(function(err, form){ if(err) done(err); @@ -175,49 +168,6 @@ describe('FormSubmission Model Unit Tests:', function() { }); }); - // it('should add Patient to OscarHost EMR after save', function(done){ - // var url_login = myForm.plugins.oscarhost.baseUrl+'/LoginService?wsdl', - // url_demo = myForm.plugins.oscarhost.baseUrl+'/DemographicService?wsdl', - // args_login = {arg0: config.oscarhost.auth.user, arg1: config.oscarhost.auth.pass}; - - // var options = { - // ignoredNamespaces: { - // namespaces: ['targetNamespace', 'typedNamespace'], - // override: true - // } - // }; - - // async.waterfall([ - // function (callback) { - // //Authenticate with API - // soap.createClient(url_login, options, function(err, client) { - // client.login(args_login, function (err, result) { - // if(err) callback(err); - // callback(null, result.return); - // }); - // }); - // }, - - // function (security_obj, callback) { - // soap.createClient(url_demo, options, function(err, client) { - // client.setSecurity(new OscarSecurity(security_obj.securityId, security_obj.securityTokenKey) ); - - // client.getDemographic({ arg0: oscar_demo_num }, function (err, result) { - // if(err) callback(err); - // callback(null, result); - // }); - // }); - // }, - - // ], function(err, result) { - // if(err) done(err); - - // should.exist(result); - // console.log(result.return); - - // done(); - // }); - // }); }); describe('Method Find', function(){ diff --git a/app/views/form.server.view.html b/app/views/form.server.view.html index ec1cb129..2e9f9fda 100644 --- a/app/views/form.server.view.html +++ b/app/views/form.server.view.html @@ -2,7 +2,7 @@ - {{title}} + {{title}} Form @@ -61,11 +61,11 @@ - +
+ +
-
- -
-
- -
+
+ +
+
+ +
diff --git a/public/modules/forms/admin/views/directiveViews/form/configure-form.client.view.html b/public/modules/forms/admin/views/directiveViews/form/configure-form.client.view.html index 52f5f982..a474bfe3 100644 --- a/public/modules/forms/admin/views/directiveViews/form/configure-form.client.view.html +++ b/public/modules/forms/admin/views/directiveViews/form/configure-form.client.view.html @@ -1,22 +1,21 @@
-
- - -
-
-
- - -
-
- + + +
+
-
+
{{ 'FORM_NAME' | translate }}
-
- +
-
+
{{ 'FORM_STATUS' | translate }}
-
+
-
- -
-
-
{{ 'GA_TRACKING_CODE' | translate }}
-
- -
- -
-
-
Language
-
+
Language
+
-  {{ 'YES' | translate }} - - - -
-
- -
-
-
Display Start Page?
-
- -
- - - - - -
-
+
+
+
+
{{ 'GA_TRACKING_CODE' | translate }}
+
+ +
+ +
+
+
+
+
{{ 'DISPLAY_FOOTER' | translate }}
+
+ +
+ + + +
+
+ +
+
+
Display Start Page?
+
+ +
+ + + + + +
+
+
-
- -
-
- -
+
+ +
+
+ +
diff --git a/public/modules/forms/admin/views/directiveViews/form/edit-form.client.view.html b/public/modules/forms/admin/views/directiveViews/form/edit-form.client.view.html index 94fc6e45..b4de84de 100644 --- a/public/modules/forms/admin/views/directiveViews/form/edit-form.client.view.html +++ b/public/modules/forms/admin/views/directiveViews/form/edit-form.client.view.html @@ -1,7 +1,7 @@
-
+
@@ -249,7 +249,6 @@
-

{{ 'NUM_OF_STEPS' | translate }}
@@ -293,7 +292,7 @@
-
Disabled:
+
{{ 'DISABLED' | translate }}
+
+

Logic Jump

+
+
+
{{ 'ADD_LOGIC_JUMP' | translate }}
+
+ + + +
+
+ +
+
+ + If this field +
+
+ +
+
+ +
+
+ + Jumps to +
+
+ +
+
+
diff --git a/public/modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html b/public/modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html index fab05cb3..cdc6a480 100644 --- a/public/modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html +++ b/public/modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html @@ -1,9 +1,6 @@ -
+
-
- Overview Analytics -
-
+
{{ 'TOTAL_VIEWS' | translate }}
@@ -20,7 +17,7 @@ {{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}
-
+
{{myform.analytics.views}}
@@ -37,10 +34,7 @@ {{AverageTimeElapsed | secondsToDateTime | date:'mm:ss'}}
-
- Device Analytics -
-
+
{{ 'DESKTOP_AND_LAPTOP' | translate }}
@@ -58,7 +52,7 @@
-
+
{{ 'UNIQUE_VISITS' | translate }} @@ -96,7 +90,7 @@
-
+
{{ 'RESPONSES' | translate }} @@ -134,7 +128,7 @@
-
+
{{ 'COMPLETION_RATE' | translate }} @@ -172,7 +166,7 @@
-
+
{{ 'AVERAGE_TIME_TO_COMPLETE' | translate }} @@ -210,10 +204,7 @@
-
- Field Analytics -
-
+
{{ 'FIELD_TITLE' | translate }} @@ -230,7 +221,7 @@
-
+
{{fieldStats.field.title}} @@ -247,9 +238,6 @@

-
- Responses Table -
-
- - {{ 'ENTER' | translate }} - -
+
+
+
+
+
diff --git a/public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html b/public/modules/forms/base/views/directiveViews/form/submit-form.client.view.html old mode 100755 new mode 100644 diff --git a/public/modules/forms/directives/analytics-service.client.directive.js b/public/modules/forms/directives/analytics-service.client.directive.js index 1466d69a..1c35fab6 100644 --- a/public/modules/forms/directives/analytics-service.client.directive.js +++ b/public/modules/forms/directives/analytics-service.client.directive.js @@ -13,7 +13,7 @@ // Create a controller method for sending visitor data function send(form, lastActiveIndex, timeElapsed) { // Create a new message object - var visitorData = { + /*var visitorData = { referrer: document.referrer, isSubmitted: form.submitted, formId: form._id, @@ -42,15 +42,15 @@ } console.log(visitorData.deviceType); Socket.emit('form-visitor-data', visitorData); - }); + });*/ } function init(){ // Make sure the Socket is connected - if (!Socket.socket) { + /*if (!Socket.socket) { Socket.connect(); - } + }*/ } var service = { diff --git a/public/modules/forms/forms.client.module.js b/public/modules/forms/forms.client.module.js index 1e98fce9..ada60435 100644 --- a/public/modules/forms/forms.client.module.js +++ b/public/modules/forms/forms.client.module.js @@ -3,5 +3,5 @@ // Use Application configuration module to register a new module ApplicationConfiguration.registerModule('forms', [ 'ngFileUpload', 'ui.router.tabs', 'ui.date', 'ui.sortable', - 'angular-input-stars', 'users' + 'angular-input-stars', 'users', 'ngclipboard' ]);//, 'colorpicker.module' @TODO reactivate this module diff --git a/public/modules/users/config/i18n/english.js b/public/modules/users/config/i18n/english.js index 3dbbdca3..8efb4052 100644 --- a/public/modules/users/config/i18n/english.js +++ b/public/modules/users/config/i18n/english.js @@ -4,7 +4,8 @@ angular.module('users').config(['$translateProvider', function ($translateProvid $translateProvider.translations('en', { ACCESS_DENIED_TEXT: 'You need to be logged in to access this page', - USERNAME_LABEL: 'Username or Email', + USERNAME_OR_EMAIL_LABEL: 'Username or Email', + USERNAME_LABEL: 'Username', PASSWORD_LABEL: 'Password', CURRENT_PASSWORD_LABEL: 'Current Password', NEW_PASSWORD_LABEL: 'New Password', @@ -21,6 +22,9 @@ angular.module('users').config(['$translateProvider', function ($translateProvid SIGNIN_HEADER_TEXT: 'Sign in', SIGNUP_ERROR_TEXT: 'Couldn\'t complete registration due to errors', + ENTER_ACCOUNT_EMAIL: 'Enter your account email.', + RESEND_VERIFICATION_EMAIL: 'Resend Verification Email', + SAVE_CHANGES: 'Save Changes', UPDATE_PROFILE_BTN: 'Update Profile', PROFILE_SAVE_SUCCESS: 'Profile saved successfully', diff --git a/public/modules/users/controllers/password.client.controller.js b/public/modules/users/controllers/password.client.controller.js index a8382270..8a6bc860 100755 --- a/public/modules/users/controllers/password.client.controller.js +++ b/public/modules/users/controllers/password.client.controller.js @@ -2,8 +2,9 @@ angular.module('users').controller('PasswordController', ['$scope', '$stateParams', '$state', 'User', function($scope, $stateParams, $state, User) { - $scope.error = ''; + $scope.error = ''; + // Submit forgotten password account id $scope.askForPasswordReset = function() { User.askForPasswordReset($scope.credentials).then( @@ -37,4 +38,4 @@ angular.module('users').controller('PasswordController', ['$scope', '$stateParam ); }; } -]); \ No newline at end of file +]); diff --git a/public/modules/users/controllers/settings.client.controller.js b/public/modules/users/controllers/settings.client.controller.js index 38f7fcad..a958490d 100755 --- a/public/modules/users/controllers/settings.client.controller.js +++ b/public/modules/users/controllers/settings.client.controller.js @@ -1,10 +1,11 @@ 'use strict'; -angular.module('users').controller('SettingsController', ['$scope', '$rootScope', '$http', '$state', 'Users', - function($scope, $rootScope, $http, $state, Users) { - $scope.user = $rootScope.user; +angular.module('users').controller('SettingsController', ['$scope', '$rootScope', '$http', '$state', 'Users', 'Auth', + function($scope, $rootScope, $http, $state, Users, Auth) { - // Check if there are additional accounts + $scope.user = Auth.currentUser; + + // Check if there are additional accounts $scope.hasConnectedAdditionalSocialAccounts = function(provider) { for (var i in $scope.user.additionalProvidersData) { return true; @@ -12,6 +13,10 @@ angular.module('users').controller('SettingsController', ['$scope', '$rootScope' return false; }; + $scope.cancel = function(){ + $scope.user = Auth.currentUser; + }; + // Check if provider is already in use with current user $scope.isConnectedSocialAccount = function(provider) { return $scope.user.provider === provider || ($scope.user.additionalProvidersData && $scope.user.additionalProvidersData[provider]); @@ -65,4 +70,4 @@ angular.module('users').controller('SettingsController', ['$scope', '$rootScope' }; } -]); \ No newline at end of file +]); diff --git a/public/modules/users/css/users.css b/public/modules/users/css/users.css index 2bf345ed..22ea1fe2 100755 --- a/public/modules/users/css/users.css +++ b/public/modules/users/css/users.css @@ -6,7 +6,7 @@ section.auth { left: 0; width: 100%; color: white; - background-color: #1e5799; /* Old browsers */ + background-color: #50B5C1; /* Old browsers */ background: -moz-linear-gradient(137deg, #50B5C1 0%, #6450A0 85%); /* FF3.6-15 */ background: -webkit-linear-gradient(137deg, #50B5C1 0%, #6450A0 85%); /* Chrome10-25,Safari5.1-6 */ background: linear-gradient(137deg, #50B5C1 0%, #6450A0 85%); @@ -63,18 +63,31 @@ section.auth { text-transform: uppercase; } - section.auth .btn-signup { + + .btn-rounded.btn-signup { background-color: #FFD747; color: #896D0B; border: 2px #FFD747 solid; - width: 100%; } - section.auth .btn-signup:hover { + + .btn-rounded.btn-signup:hover { color: #FFD747; background-color: #896D0B; border: 2px #896D0B solid; } + .btn-rounded.btn-default { + background-color: transparent; + color: white; + border: 2px white solid; + } + + .btn-rounded.btn-default:focus, .btn-rounded.btn-default:hover { + color: #6450A0; + background-color: white; + border-color: white; + } + @media (min-width: 992px) { .nav-users { position: fixed; @@ -90,10 +103,12 @@ section.auth { position: absolute; } -input.form-control { +section.auth input.form-control { border: none; +} + +input.form-control { border-radius: 4px; - color: white; box-shadow: none; font-size: 18px; padding: 30px 20px; diff --git a/public/modules/users/views/authentication/signin.client.view.html b/public/modules/users/views/authentication/signin.client.view.html index 80007bb6..8eb13a54 100755 --- a/public/modules/users/views/authentication/signin.client.view.html +++ b/public/modules/users/views/authentication/signin.client.view.html @@ -23,7 +23,6 @@
-
- +
- +
{{ 'FORGOT_PASSWORD_LINK' | translate }} diff --git a/public/modules/users/views/authentication/signup-success.client.view.html b/public/modules/users/views/authentication/signup-success.client.view.html index 44e70467..6dcef334 100755 --- a/public/modules/users/views/authentication/signup-success.client.view.html +++ b/public/modules/users/views/authentication/signup-success.client.view.html @@ -29,7 +29,7 @@

{{ 'BEFORE_YOU_CONTINUE' | translate }} polydaic@gmail.com

-
diff --git a/public/modules/users/views/authentication/signup.client.view.html b/public/modules/users/views/authentication/signup.client.view.html index e5b6ab07..ea5c5eff 100644 --- a/public/modules/users/views/authentication/signup.client.view.html +++ b/public/modules/users/views/authentication/signup.client.view.html @@ -30,29 +30,6 @@ {{'SIGNUP_ERROR_TEXT' | translate}}:
- -
@@ -66,7 +43,7 @@
- +
diff --git a/public/modules/users/views/password/forgot-password.client.view.html b/public/modules/users/views/password/forgot-password.client.view.html index a2dd3ca3..6814471b 100755 --- a/public/modules/users/views/password/forgot-password.client.view.html +++ b/public/modules/users/views/password/forgot-password.client.view.html @@ -1,22 +1,27 @@ -
-

{{ 'PASSWORD_RESTORE_HEADER' | translate }}

-

{{ 'ENTER_YOUR_EMAIL' | translate }}

-
- -
-
- -
-
- -
-
- {{error}} -
-
- {{success}} -
-
- +
+
+
+
+ +
+
+
+
+
+ +
+
+ +
+
+ {{error}} +
+
+ {{success}} +
+
+
+
+
diff --git a/public/modules/users/views/settings/edit-profile.client.view.html b/public/modules/users/views/settings/edit-profile.client.view.html index f64eb9e8..6f01d360 100755 --- a/public/modules/users/views/settings/edit-profile.client.view.html +++ b/public/modules/users/views/settings/edit-profile.client.view.html @@ -1,7 +1,7 @@
-

Edit your profile

+

Edit your profile