Merge remote-tracking branch 'tellform/master'

This commit is contained in:
abby 2017-07-31 17:18:59 +08:00
commit 3cc4478d24
48 changed files with 3433 additions and 3445 deletions

View file

@ -113,7 +113,7 @@ Then run these commands
``` ```
$ docker run -p 27017:27017 -d --name some-mongo mongo $ docker run -p 27017:27017 -d --name some-mongo mongo
$ docker run -p 127.0.0.1:6379:6379 -d --name some-redis redis $ docker run -p 127.0.0.1:6379:6379 -d --name some-redis redis
$ docker run --rm -p 3000:3000 --link some-redis:redis-db --link some-mongo:db -e "MAILER_EMAIL_ID=<YourEmailAPI_ID>" -e "MAILER_FROM=<noreply@yourdomain.com>" -e "MAILER_SERVICE_PROVIDER=<YourEmailAPIProvider>" -e "MAILER_PASSWORD=<YourAPIKey>" -e "BASE_URL=localhost" -p 80:80 tellform/development $ docker run --rm -p 3000:3000 --link some-redis:redis-db --link some-mongo:db -e "SUBDOMAINS_DISABLED=TRUE" -e "DISABLE_CLUSTER_MODE=TRUE" -e "MAILER_EMAIL_ID=<YourEmailAPI_ID>" -e "MAILER_FROM=<noreply@yourdomain.com>" -e "MAILER_SERVICE_PROVIDER=<YourEmailAPIProvider>" -e "MAILER_PASSWORD=<YourAPIKey>" -e "BASE_URL=localhost" -p 80:80 tellform/development
``` ```

View file

@ -10,9 +10,9 @@
"description": "Disable support for running subdomains. (This should be true if you are not using your own custom domain.", "description": "Disable support for running subdomains. (This should be true if you are not using your own custom domain.",
"value": "TRUE" "value": "TRUE"
}, },
"DISABLE_CLUSTER_MODE": { "ENABLE_CLUSTER_MODE": {
"description": "Disable support for running in cluster mode on pm2", "description": "ENABLE support for running in cluster mode on pm2",
"value": "TRUE" "value": "FALSE"
}, },
"NODE_ENV": { "NODE_ENV": {
"description": "Choose whether to run app in development or production mode", "description": "Choose whether to run app in development or production mode",

View file

@ -139,27 +139,26 @@ exports.read = function(req, res) {
if(!req.user || (req.form.admin.id !== req.user.id) ){ if(!req.user || (req.form.admin.id !== req.user.id) ){
readForRender(req, res); readForRender(req, res);
} else { } else {
FormSubmission.find({ form: req.form._id }).exec(function(err, _submissions) {
FormSubmission.find({ form: req.form._id }).exec(function(err, _submissions) { if (err) {
if (err) { res.status(400).send({
res.status(400).send({ message: errorHandler.getErrorMessage(err)
message: errorHandler.getErrorMessage(err) });
});
}
var newForm = req.form.toJSON();
newForm.submissions = _submissions;
if (req.userId) {
if(req.form.admin._id+'' === req.userId+''){
return res.json(newForm);
} }
return res.status(404).send({
message: 'Form Does Not Exist' var newForm = req.form.toJSON();
}); newForm.submissions = _submissions;
}
return res.json(newForm); if (req.userId) {
}); if(req.form.admin._id+'' === req.userId+''){
return res.json(newForm);
}
return res.status(404).send({
message: 'Form Does Not Exist'
});
}
return res.json(newForm);
});
} }
}; };

View file

@ -218,7 +218,7 @@ FormSchema.virtual('analytics.fields').get(function () {
if(this.form_fields.length === 0) { if(this.form_fields.length === 0) {
return null; return null;
} }
for(var i=0; i<this.form_fields.length; i++){ for(var i=0; i<this.form_fields.length; i++){
var field = this.form_fields[i]; var field = this.form_fields[i];
@ -280,22 +280,6 @@ FormSchema.plugin(mUtilities.timestamp, {
useVirtual: false useVirtual: false
}); });
var _original;
function getDeletedIndexes(needle, haystack){
var deletedIndexes = [];
if(haystack.length > 0){
for(var i = 0; i < needle.length; i++){
if(haystack.indexOf(needle[i]) === -1){
deletedIndexes.push(i);
}
}
}
return deletedIndexes;
}
FormSchema.pre('save', function (next) { FormSchema.pre('save', function (next) {
switch(this.language){ switch(this.language){
case 'spanish': case 'spanish':
@ -317,14 +301,39 @@ FormSchema.pre('save', function (next) {
next(); next();
}); });
function getDeletedIndexes(needle, haystack){
var deletedIndexes = [];
if(haystack.length > 0){
for(var i = 0; i < needle.length; i++){
if(haystack.indexOf(needle[i]) === -1){
deletedIndexes.push(i);
}
}
}
return deletedIndexes;
}
function formFieldsAllHaveIds(form_fields){
for(var i=0; i<form_fields.length; i++){
if(!form_fields[i].hasOwnProperty('_id') && !form_fields[i].hasOwnProperty('globalId')){
return false;
}
}
return true;
}
FormSchema.pre('save', function (next) { FormSchema.pre('save', function (next) {
var that = this; var that = this;
var _original;
async.series([function(cb) { async.series([function(cb) {
that.constructor that.constructor
.findOne({_id: that._id}).exec(function (err, original) { .findOne({_id: that._id}).exec(function (err, original) {
if (err) { if (err) {
return cb(err); return cb(err);
} else if (!original){
return next();
} else { } else {
_original = original; _original = original;
return cb(null); return cb(null);
@ -332,21 +341,18 @@ FormSchema.pre('save', function (next) {
}); });
}, },
function(cb) { function(cb) {
var hasIds = true; if(that.form_fields && that.isModified('form_fields') && formFieldsAllHaveIds(that.toObject().form_fields)){
for(var i=0; i<that.form_fields.length; i++){
if(!that.form_fields.hasOwnProperty('_id')){
hasIds = false;
break;
}
}
if(that.isModified('form_fields') && that.form_fields && _original && hasIds){
var old_form_fields = _original.form_fields, var current_form = that.toObject(),
new_ids = _.map(_.pluck(that.form_fields, 'id'), function(id){ return ''+id;}), old_form_fields = _original.toObject().form_fields,
old_ids = _.map(_.pluck(old_form_fields, 'id'), function(id){ return ''+id;}), new_ids = _.map(_.map(current_form.form_fields, 'globalId'), function(id){ return ''+id;}),
old_ids = _.map(_.map(old_form_fields, 'globalId'), function(id){ return ''+id;}),
deletedIds = getDeletedIndexes(old_ids, new_ids); deletedIds = getDeletedIndexes(old_ids, new_ids);
//Preserve fields that have at least one submission console.log(deletedIds);
console.log(new_ids);
console.log(old_ids);
//Check if any form_fileds were deleted
if( deletedIds.length > 0 ){ if( deletedIds.length > 0 ){
var modifiedSubmissions = []; var modifiedSubmissions = [];
@ -355,23 +361,21 @@ FormSchema.pre('save', function (next) {
function (deletedIdIndex, key, cb_id) { function (deletedIdIndex, key, cb_id) {
var deleted_id = old_ids[deletedIdIndex]; var deleted_id = old_ids[deletedIdIndex];
//Find FormSubmissions that contain field with _id equal to 'deleted_id' //Find FormSubmissions that contain field with _id equal to 'deleted_id'
FormSubmission. FormSubmission.
find({ form: that._id, admin: that.admin, form_fields: {$elemMatch: {submissionId: deleted_id} } }). find({ form: that, form_fields: {$elemMatch: {globalId: deleted_id} } }).
exec(function(err, submissions){ exec(function(err, submissions){
if(err) { if(err) {
return cb_id(err); return cb_id(err);
} }
//Delete field if there are no submission(s) found //Preserve fields that have at least one submission
if (submissions.length) { if (submissions.length) {
//Add submissions //Add submissions
modifiedSubmissions.push.apply(modifiedSubmissions, submissions); modifiedSubmissions.push.apply(modifiedSubmissions, submissions);
} }
return cb_id(null); return cb_id(null);
}); });
}, },
function (err) { function (err) {
@ -383,29 +387,33 @@ FormSchema.pre('save', function (next) {
//Iterate through all submissions with modified form_fields //Iterate through all submissions with modified form_fields
async.forEachOfSeries(modifiedSubmissions, function (submission, key, callback) { async.forEachOfSeries(modifiedSubmissions, function (submission, key, callback) {
//Iterate through ids of deleted fields var submission_form_fields = submission.toObject().form_fields;
for (i = 0; i < deletedIds.length; i++) { var currentform_form_fields = that.toObject().form_fields;
var index = _.findIndex(submission.form_fields, function (field) { //Iterate through ids of deleted fields
var tmp_id = field._id + ''; for (var i = 0; i < deletedIds.length; i++) {
var index = _.findIndex(submission_form_fields, function (field) {
var tmp_id = field.globalId + '';
return tmp_id === old_ids[deletedIds[i]]; return tmp_id === old_ids[deletedIds[i]];
}); });
var deletedField = submission.form_fields[index]; var deletedField = submission_form_fields[index];
//Hide field if it exists //Hide field if it exists
if (deletedField) { if (deletedField) {
//Delete old form_field //Delete old form_field
submission.form_fields.splice(index, 1); submission_form_fields.splice(index, 1);
deletedField.deletePreserved = true; deletedField.deletePreserved = true;
//Move deleted form_field to start //Move deleted form_field to start
submission.form_fields.unshift(deletedField); submission_form_fields.unshift(deletedField);
that.form_fields.unshift(deletedField); currentform_form_fields.unshift(deletedField);
} }
} }
submission.form_fields = submission_form_fields;
that.form_fields = currentform_form_fields;
submission.save(function (saveErr) { submission.save(function (saveErr) {
return callback(saveErr); return callback(saveErr);
@ -413,13 +421,14 @@ FormSchema.pre('save', function (next) {
}, function (err) { }, function (err) {
return cb(err); return cb(err);
}); });
} }
); );
} else {
return cb(null);
} }
} else {
return cb(null); return cb(null);
} }
return cb(null);
}], }],
function(err, results){ function(err, results){
next(err); next(err);

View file

@ -10,6 +10,9 @@ var mongoose = require('mongoose'),
Schema = mongoose.Schema, Schema = mongoose.Schema,
LogicJumpSchema = require('./logic_jump.server.model'); LogicJumpSchema = require('./logic_jump.server.model');
const UIDGenerator = require('uid-generator');
const uidgen3 = new UIDGenerator(256, UIDGenerator.BASE62);
var FieldOptionSchema = new Schema({ var FieldOptionSchema = new Schema({
option_id: { option_id: {
type: Number type: Number
@ -61,6 +64,9 @@ function BaseFieldSchema(){
Schema.apply(this, arguments); Schema.apply(this, arguments);
this.add({ this.add({
globalId: {
type: String,
},
isSubmission: { isSubmission: {
type: Boolean, type: Boolean,
default: false default: false
@ -193,6 +199,9 @@ FormFieldSchema.pre('save', function(next) {
if(this.logicJump && this.logicJump.fieldA) { if(this.logicJump && this.logicJump.fieldA) {
if(this.logicJump.jumpTo === '') delete this.logicJump.jumpTo; if(this.logicJump.jumpTo === '') delete this.logicJump.jumpTo;
} }
if(!this.globalId){
this.globalId = uidgen3.generateSync()
}
next(); next();
}); });

View file

@ -58,6 +58,16 @@ var FormSubmissionSchema = new Schema({
} }
}); });
FormSubmissionSchema.pre('save', function (next) {
//Iterate through form fields and format data
for(var i = 0; i < this.form_fields.length; i++){
if(this.form_fields[i].fieldType === 'dropdown'){
this.form_fields[i].fieldValue = this.form_fields[i].fieldValue.option_value;
}
}
next();
});
FormSubmissionSchema.path('form_fields', { FormSubmissionSchema.path('form_fields', {
set: function(form_fields){ set: function(form_fields){
for (var i = 0; i < form_fields.length; i++) { for (var i = 0; i < form_fields.length; i++) {

View file

@ -149,7 +149,6 @@ describe('FormSubmission Model Unit Tests:', function() {
mySubmission.save(function(err, submission) { mySubmission.save(function(err, submission) {
should.not.exist(err); should.not.exist(err);
should.exist(submission); should.exist(submission);
done(); done();
}); });
}); });
@ -187,7 +186,7 @@ describe('FormSubmission Model Unit Tests:', function() {
//Create Submission //Create Submission
mySubmission = new FormSubmission({ mySubmission = new FormSubmission({
form_fields: sampleSubmission, form_fields: _.merge(sampleSubmission, myForm.form_fields),
admin: user, admin: user,
form: myForm, form: myForm,
timeElapsed: 17.55 timeElapsed: 17.55
@ -200,7 +199,6 @@ describe('FormSubmission Model Unit Tests:', function() {
}); });
/*
it('should preserve deleted form_fields that have submissions without any problems', function(done) { it('should preserve deleted form_fields that have submissions without any problems', function(done) {
var old_fields = myForm.toObject().form_fields; var old_fields = myForm.toObject().form_fields;
@ -214,17 +212,18 @@ describe('FormSubmission Model Unit Tests:', function() {
should.not.exist(err); should.not.exist(err);
should.exist(_form.form_fields); should.exist(_form.form_fields);
var actual_fields = _.deepOmit(_form.toObject().form_fields, ['lastModified', 'created', '_id']); var actual_fields = _.deepOmit(_form.toObject().form_fields, ['deletePreserved', 'globalId', 'lastModified', 'created', '_id', 'submissionId']);
old_fields = _.deepOmit(old_fields, ['lastModified', 'created', '_id']); old_fields = _.deepOmit(old_fields, ['deletePreserved', 'globalId', 'lastModified', 'created', '_id', 'submissionId']);
should.deepEqual(JSON.stringify(actual_fields), JSON.stringify(old_fields), 'old form_fields not equal to newly saved form_fields'); should.deepEqual(actual_fields, old_fields, 'old form_fields not equal to newly saved form_fields');
done(); done();
}); });
}); });
//
it('should delete \'preserved\' form_fields whose submissions have been removed without any problems', function(done) { it('should delete \'preserved\' form_fields whose submissions have been removed without any problems', function(done) {
var old_fields = myForm.toObject().form_fields; var old_fields = myForm.toObject().form_fields;
old_fields.splice(0,1);
var new_form_fields = _.clone(myForm.toObject().form_fields); var new_form_fields = _.clone(myForm.toObject().form_fields);
new_form_fields.splice(0, 1); new_form_fields.splice(0, 1);
@ -240,16 +239,9 @@ describe('FormSubmission Model Unit Tests:', function() {
should.deepEqual(JSON.stringify(actual_fields), JSON.stringify(old_fields)); //'old form_fields not equal to newly saved form_fields'); should.deepEqual(JSON.stringify(actual_fields), JSON.stringify(old_fields)); //'old form_fields not equal to newly saved form_fields');
done(); done();
// //Remove submission
// mySubmission.remove(function(err){
// myForm.submissions.should.have.length(0);
// myForm.form_fields.should.not.containDeep(old_fields[0]);
// done();
// });
}); });
}); });
*/
afterEach(function(done){ afterEach(function(done){
mySubmission.remove(function(){ mySubmission.remove(function(){
done(); done();

2
config/env/all.js vendored
View file

@ -28,7 +28,7 @@ module.exports = {
reCAPTCHA_Key: process.env.reCAPTCHA_KEY || '', reCAPTCHA_Key: process.env.reCAPTCHA_KEY || '',
signupDisabled: (process.env.SIGNUP_DISABLED === 'TRUE'), signupDisabled: (process.env.SIGNUP_DISABLED === 'TRUE'),
disableClusterMode: (process.env.DISABLE_CLUSTER_MODE === 'TRUE'), enableClusterMode: (process.env.ENABLE_CLUSTER_MODE === 'TRUE'),
baseUrl: '', baseUrl: '',
tempUserCollection: 'temporary_users', tempUserCollection: 'temporary_users',

View file

@ -9,7 +9,6 @@ module.exports = {
pass: '' pass: ''
} }
}, },
log: { log: {
// Can specify one of 'combined', 'common', 'dev', 'short', 'tiny' // Can specify one of 'combined', 'common', 'dev', 'short', 'tiny'
format: 'dev', format: 'dev',

View file

@ -7,7 +7,7 @@ module.exports = {
}, },
port: process.env.PORT || 5000, port: process.env.PORT || 5000,
socketUrl: process.env.SOCKET_URL || 'ws.tellform.com', socketUrl: process.env.SOCKET_URL || 'ws.tellform.com',
socketPort: process.env.SOCKET_PORT || null, socketPort: process.env.SOCKET_PORT || 20523,
log: { log: {
// Can specify one of 'combined', 'common', 'dev', 'short', 'tiny' // Can specify one of 'combined', 'common', 'dev', 'short', 'tiny'
format: 'combined', format: 'combined',

View file

@ -58,15 +58,12 @@ module.exports = function(db) {
if(config.socketPort){ if(config.socketPort){
app.locals.socketPort = config.socketPort; app.locals.socketPort = config.socketPort;
} else {
app.locals.socketPort = false;
} }
if(config.socketUrl){ if(config.socketUrl){
app.locals.socketUrl = config.socketUrl; app.locals.socketUrl = config.socketUrl;
} else {
app.locals.socketUrl = false;
} }
app.locals.bowerJSFiles = config.getBowerJSAssets(); app.locals.bowerJSFiles = config.getBowerJSAssets();
app.locals.bowerCssFiles = config.getBowerCSSAssets(); app.locals.bowerCssFiles = config.getBowerCSSAssets();
app.locals.bowerOtherFiles = config.getBowerOtherAssets(); app.locals.bowerOtherFiles = config.getBowerOtherAssets();

View file

@ -9,13 +9,9 @@ var config = require('./config'),
// Define the Socket.io configuration method // Define the Socket.io configuration method
module.exports = function (app, db) { module.exports = function (app, db) {
var server = http.createServer(app); var server = http.createServer(app);
var io = socketio(20523, { transports: ['websocket', 'polling'] }); var io = socketio(config.socketPort, { transports: ['websocket', 'polling'] });
if(config.socketPort){ if(config.enableClusterMode){
io = socketio(config.socketPort, { transports: ['websocket', 'polling'] });
}
if(config.disableClusterMode){
var redis = require('socket.io-redis'); var redis = require('socket.io-redis');
io.adapter(redis( process.env.REDIS_URL || { host: process.env.REDIS_DB_PORT_6379_TCP_ADDR || '127.0.0.1' , port: process.env.REDIS_DB_PORT_6379_TCP_PORT || 6379 })); io.adapter(redis( process.env.REDIS_URL || { host: process.env.REDIS_DB_PORT_6379_TCP_ADDR || '127.0.0.1' , port: process.env.REDIS_DB_PORT_6379_TCP_PORT || 6379 }));
} }
@ -27,4 +23,4 @@ module.exports = function (app, db) {
}); });
return server; return server;
}; };

View file

@ -210,14 +210,23 @@ module.exports = function(grunt) {
reporter: 'spec', reporter: 'spec',
quiet: false, quiet: false,
require: 'server.js', require: 'server.js',
ui: 'bdd' ui: 'bdd',
debug: true
} }
}, },
karma: { karma: {
unit: { unit: {
configFile: 'karma.conf.js', configFile: 'karma.conf.js',
singleRun: true singleRun: true
} },
debug: {
configFile: 'karma.conf.js',
browserConsoleLogOptions: {
level: 'log',
terminal: true
},
singleRun: true
}
}, },
protractor: { protractor: {
options: { options: {
@ -339,9 +348,9 @@ module.exports = function(grunt) {
// Code coverage tasks. // Code coverage tasks.
grunt.registerTask('coveralls', ['env:test','mocha_istanbul:coveralls']); grunt.registerTask('coveralls', ['env:test','mocha_istanbul:coveralls']);
grunt.registerTask('coverage', ['env:test', 'mocha_istanbul:coverage']); grunt.registerTask('coverage', ['env:test', 'mocha_istanbul:coverage']);
grunt.registerTask('coverage:client', ['env:test', 'mocha_istanbul:coverageClient']); grunt.registerTask('coverage:client', ['env:test', 'mocha_istanbul:coverageClient']);
grunt.registerTask('coverage:server', ['env:test', 'mocha_istanbul:coverageServer']); grunt.registerTask('coverage:server', ['env:test', 'mocha_istanbul:coverageServer']);
// Default task(s). // Default task(s).
grunt.registerTask('default', ['lint', 'html2js:main', 'html2js:forms', 'env', 'concurrent:default']); grunt.registerTask('default', ['lint', 'html2js:main', 'html2js:forms', 'env', 'concurrent:default']);
@ -367,4 +376,6 @@ module.exports = function(grunt) {
grunt.registerTask('test', ['lint:tests', 'test:server', 'test:client']); grunt.registerTask('test', ['lint:tests', 'test:server', 'test:client']);
grunt.registerTask('test:server', ['lint:tests', 'env:test', 'mochaTest']); grunt.registerTask('test:server', ['lint:tests', 'env:test', 'mochaTest']);
grunt.registerTask('test:client', ['lint:tests', 'html2js:main', 'html2js:forms', 'env:test', 'karma:unit']); grunt.registerTask('test:client', ['lint:tests', 'html2js:main', 'html2js:forms', 'env:test', 'karma:unit']);
grunt.registerTask('testdebug', ['env:test', 'karma:debug']);
}; };

View file

@ -95,6 +95,7 @@
"socket.io": "^1.4.6", "socket.io": "^1.4.6",
"socket.io-redis": "^1.0.0", "socket.io-redis": "^1.0.0",
"swig": "~1.4.1", "swig": "~1.4.1",
"uid-generator": "^0.1.1",
"uuid-token-generator": "^0.5.0", "uuid-token-generator": "^0.5.0",
"wildcard-subdomains": "github:tellform/wildcard-subdomains", "wildcard-subdomains": "github:tellform/wildcard-subdomains",
"winston": "^2.3.1", "winston": "^2.3.1",
@ -126,7 +127,7 @@
"karma-jasmine-html-reporter": "^0.1.8", "karma-jasmine-html-reporter": "^0.1.8",
"karma-mocha-reporter": "^1.1.1", "karma-mocha-reporter": "^1.1.1",
"karma-ng-html2js-preprocessor": "^0.2.0", "karma-ng-html2js-preprocessor": "^0.2.0",
"karma-phantomjs-launcher": "~0.2.1", "karma-phantomjs-launcher": "^1.0.4",
"mailosaur": "^1.0.1", "mailosaur": "^1.0.1",
"mocha": "^3.1.2", "mocha": "^3.1.2",
"mocha-lcov-reporter": "^1.0.0", "mocha-lcov-reporter": "^1.0.0",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -3,9 +3,9 @@
// Create the Socket.io wrapper service // Create the Socket.io wrapper service
function Socket($timeout, $window) { function Socket($timeout, $window) {
var service; var service;
// Connect to Socket.io server // Connect to Socket.io server
function connect(url) { function connect(url) {
service.socket = io(url, {'transports': ['websocket', 'polling']}); service.socket = io(url, {'transports': ['websocket', 'polling']});
@ -35,7 +35,7 @@
service.socket.removeListener(eventName); service.socket.removeListener(eventName);
} }
} }
service = { service = {
connect: connect, connect: connect,
emit: emit, emit: emit,
@ -44,10 +44,11 @@
socket: null socket: null
}; };
console.log($window.socketUrl);
var url = ''; var url = '';
if($window.socketUrl && $window.socketPort){ if($window.socketUrl && $window.socketPort){
url = window.location.protocol + '//' + $window.socketUrl + ':' + $window.socketPort; url = window.location.protocol + '//' + $window.socketUrl + ':' + $window.socketPort;
} else if ($window.socketUrl && !$window.socketPort){ } else if ($window.socketUrl){
url = window.location.protocol + '//' + $window.socketUrl; url = window.location.protocol + '//' + $window.socketUrl;
} else if ($window.socketPort){ } else if ($window.socketPort){
url = window.location.protocol + '//' + window.location.hostname + ':' + $window.socketPort; url = window.location.protocol + '//' + window.location.hostname + ':' + $window.socketPort;
@ -58,12 +59,11 @@
return service; return service;
} }
angular angular
.module('view-form') .module('view-form')
.factory('Socket', Socket); .factory('Socket', Socket);
Socket.$inject = ['$timeout', '$window']; Socket.$inject = ['$timeout', '$window'];
}()); }());

View file

@ -25,13 +25,11 @@ angular.module(ApplicationConfiguration.applicationModuleName).run(['$rootScope'
if(statesToIgnore.indexOf(toState.name) > 0){ if(statesToIgnore.indexOf(toState.name) > 0){
if(Auth.isAuthenticated()){ if(Auth.isAuthenticated()){
event.preventDefault(); // stop current execution event.preventDefault(); // stop current execution
//console.log('go to forms');
$state.go('listForms'); // go to listForms page $state.go('listForms'); // go to listForms page
} }
} }
//Redirect to 'signup' route if user is not authenticated //Redirect to 'signup' route if user is not authenticated
else if(toState.name !== 'access_denied' && !Auth.isAuthenticated() && toState.name !== 'submitForm'){ else if(toState.name !== 'access_denied' && !Auth.isAuthenticated() && toState.name !== 'submitForm'){
console.log('go to signup');
event.preventDefault(); // stop current execution event.preventDefault(); // stop current execution
$state.go('listForms'); // go to listForms page $state.go('listForms'); // go to listForms page
} }

View file

@ -38,7 +38,7 @@
service.socket.removeListener(eventName); service.socket.removeListener(eventName);
} }
} }
var service = { var service = {
connect: connect, connect: connect,
emit: emit, emit: emit,

View file

@ -137,11 +137,33 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
BTN_BACKGROUND_COLOR: 'Button Background Color', BTN_BACKGROUND_COLOR: 'Button Background Color',
BTN_TEXT_COLOR: 'Button Text Color', BTN_TEXT_COLOR: 'Button Text Color',
//Share View
EMBED_YOUR_FORM: 'Embed your form',
SHARE_YOUR_FORM: 'Share your form',
//Admin Tabs //Admin Tabs
CREATE_TAB: 'Create', CREATE_TAB: 'Create',
DESIGN_TAB: 'Design', DESIGN_TAB: 'Design',
CONFIGURE_TAB: 'Configure', CONFIGURE_TAB: 'Configure',
ANALYZE_TAB: 'Analyze' ANALYZE_TAB: 'Analyze',
SHARE_TAB: 'Share',
//Field Types
SHORT_TEXT: 'Short Text',
EMAIL: 'Email',
MULTIPLE_CHOICE: 'Multiple Choice',
DROPDOWN: 'Dropdown',
DATE: 'Date',
PARAGRAPH_T: 'Paragraph',
YES_NO: 'Yes/No',
LEGAL: 'Legal',
RATING: 'Rating',
NUMBERS: 'Numbers',
SIGNATURE: 'Signature',
FILE_UPLOAD: 'File upload',
OPTION_SCALE: 'Option Scale',
PAYMENT: 'Payment',
STATEMENT: 'Statement',
LINK: 'Link'
}); });
}]); }]);

View file

@ -137,11 +137,33 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
BTN_BACKGROUND_COLOR: 'Color de fondo del botón', BTN_BACKGROUND_COLOR: 'Color de fondo del botón',
BTN_TEXT_COLOR: 'Color del texto del botón', BTN_TEXT_COLOR: 'Color del texto del botón',
//Share View
EMBED_YOUR_FORM: 'Pone tu formulario',
SHARE_YOUR_FORM: 'Compartí tu formulario',
//Admin Tabs //Admin Tabs
CREATE_TAB: 'Crear', CREATE_TAB: 'Crear',
DESIGN_TAB: 'Diseño', DESIGN_TAB: 'Diseño',
CONFIGURE_TAB: 'Configuración', CONFIGURE_TAB: 'Configuración',
ANALYZE_TAB: 'Análisis' ANALYZE_TAB: 'Análisis',
SHARE_TAB: 'Compartir',
//Field Types
SHORT_TEXT: 'Texto corto',
EMAIL: 'Email',
MULTIPLE_CHOICE: 'Opciones múltiples',
DROPDOWN: 'Desplegable',
DATE: 'Fecha',
PARAGRAPH_T: 'Párrafo',
YES_NO: 'Si/No',
LEGAL: 'Legal',
RATING: 'Puntaje',
NUMBERS: 'Números',
SIGNATURE: 'Firma',
FILE_UPLOAD: 'Subir archivo',
OPTION_SCALE: 'Escala',
PAYMENT: 'Pago',
STATEMENT: 'Declaración',
LINK: 'Enlace'
}); });
}]); }]);

View file

@ -2,59 +2,59 @@
// Forms controller // Forms controller
angular.module('forms').controller('AdminFormController', ['$rootScope', '$window', '$scope', '$stateParams', '$state', 'Forms', 'CurrentForm', '$http', '$uibModal', 'myForm', '$filter', '$sce', angular.module('forms').controller('AdminFormController', ['$rootScope', '$window', '$scope', '$stateParams', '$state', 'Forms', 'CurrentForm', '$http', '$uibModal', 'myForm', '$filter', '$sce',
function($rootScope, $window, $scope, $stateParams, $state, Forms, CurrentForm, $http, $uibModal, myForm, $filter, $sce) { function($rootScope, $window, $scope, $stateParams, $state, Forms, CurrentForm, $http, $uibModal, myForm, $filter, $sce) {
$scope.trustSrc = function (src) { $scope.trustSrc = function (src) {
return $sce.trustAsResourceUrl(src); return $sce.trustAsResourceUrl(src);
}; };
//Set active tab to Create //Set active tab to Create
$scope.activePill = 0; $scope.activePill = 0;
$scope.copied = false; $scope.copied = false;
$scope.onCopySuccess = function (e) { $scope.onCopySuccess = function (e) {
$scope.copied = true; $scope.copied = true;
}; };
$scope = $rootScope; $scope = $rootScope;
$scope.animationsEnabled = true; $scope.animationsEnabled = true;
$scope.myform = myForm; $scope.myform = myForm;
$rootScope.saveInProgress = false; $rootScope.saveInProgress = false;
CurrentForm.setForm($scope.myform); CurrentForm.setForm($scope.myform);
$scope.formURL = '/#!/forms/' + $scope.myform._id; $scope.formURL = '/#!/forms/' + $scope.myform._id;
if ($scope.myform.isLive) { if ($scope.myform.isLive) {
if ($window.subdomainsDisabled === true) { if ($window.subdomainsDisabled === true) {
$scope.actualFormURL = window.location.protocol + '//' + window.location.host + '/view' + $scope.formURL; $scope.actualFormURL = window.location.protocol + '//' + window.location.host + '/view' + $scope.formURL;
} else { } else {
if (window.location.host.split('.').length < 3) { if (window.location.host.split('.').length < 3) {
$scope.actualFormURL = window.location.protocol + '//' + $scope.myform.admin.username + '.' + window.location.host + $scope.formURL; $scope.actualFormURL = window.location.protocol + '//' + $scope.myform.admin.username + '.' + window.location.host + $scope.formURL;
} else { } else {
$scope.actualFormURL = window.location.protocol + '//' + $scope.myform.admin.username + '.' + window.location.host.split('.').slice(1, 3).join('.') + $scope.formURL; $scope.actualFormURL = window.location.protocol + '//' + $scope.myform.admin.username + '.' + window.location.host.split('.').slice(1, 3).join('.') + $scope.formURL;
} }
} }
} else { } else {
$scope.actualFormURL = window.location.protocol + '//' + window.location.host + $scope.formURL; $scope.actualFormURL = window.location.protocol + '//' + window.location.host + $scope.formURL;
} }
var refreshFrame = $scope.refreshFrame = function(){ var refreshFrame = $scope.refreshFrame = function(){
if(document.getElementById('iframe')) { if(document.getElementById('iframe')) {
document.getElementById('iframe').contentWindow.location.reload(); document.getElementById('iframe').contentWindow.location.reload();
} }
}; };
$scope.tabData = [ $scope.tabData = [
{ {
heading: $filter('translate')('CONFIGURE_TAB'), heading: $filter('translate')('CONFIGURE_TAB'),
templateName: 'configure' templateName: 'configure'
}, },
{ /*{
heading: $filter('translate')('ANALYZE_TAB'), heading: $filter('translate')('ANALYZE_TAB'),
templateName: 'analyze' templateName: 'analyze'
} }*/
]; ];
$scope.setForm = function(form){ $scope.setForm = function(form){
@ -72,19 +72,19 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo
*/ */
$scope.openDeleteModal = function(){ $scope.openDeleteModal = function(){
$scope.deleteModal = $uibModal.open({ $scope.deleteModal = $uibModal.open({
animation: $scope.animationsEnabled, animation: $scope.animationsEnabled,
templateUrl: 'formDeleteModal.html', templateUrl: 'formDeleteModal.html',
controller: 'AdminFormController', controller: 'AdminFormController',
resolve: { resolve: {
myForm: function(){ myForm: function(){
return $scope.myform; return $scope.myform;
} }
} }
}); });
$scope.deleteModal.result.then(function (selectedItem) { $scope.deleteModal.result.then(function (selectedItem) {
$scope.selected = selectedItem; $scope.selected = selectedItem;
}, function () { }, function () {
console.log('Modal dismissed at: ' + new Date()); console.log('Modal dismissed at: ' + new Date());
}); });
}; };
@ -118,7 +118,7 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo
// Update existing Form // Update existing Form
$scope.update = $rootScope.update = function(updateImmediately, data, isDiffed, refreshAfterUpdate, cb){ $scope.update = $rootScope.update = function(updateImmediately, data, isDiffed, refreshAfterUpdate, cb){
refreshFrame(); refreshFrame();
var continueUpdate = true; var continueUpdate = true;
if(!updateImmediately){ if(!updateImmediately){
@ -127,64 +127,64 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo
//Update form **if we are not currently updating** or if **shouldUpdateNow flag is set** //Update form **if we are not currently updating** or if **shouldUpdateNow flag is set**
if(continueUpdate) { if(continueUpdate) {
var err = null; var err = null;
if (!updateImmediately) { if (!updateImmediately) {
$rootScope.saveInProgress = true; $rootScope.saveInProgress = true;
} }
if (isDiffed) { if (isDiffed) {
$scope.updatePromise = $http.put('/forms/' + $scope.myform._id, {changes: data}) $scope.updatePromise = $http.put('/forms/' + $scope.myform._id, {changes: data})
.then(function (response) { .then(function (response) {
if (refreshAfterUpdate) $rootScope.myform = $scope.myform = response.data; if (refreshAfterUpdate) $rootScope.myform = $scope.myform = response.data;
// console.log(response.data); // console.log(response.data);
}).catch(function (response) { }).catch(function (response) {
console.log('Error occured during form UPDATE.\n'); console.log('Error occured during form UPDATE.\n');
// console.log(response.data); // console.log(response.data);
err = response.data; err = response.data;
}).finally(function () { }).finally(function () {
// console.log('finished updating'); // console.log('finished updating');
if (!updateImmediately) { if (!updateImmediately) {
$rootScope.saveInProgress = false; $rootScope.saveInProgress = false;
} }
if ((typeof cb) === 'function') { if ((typeof cb) === 'function') {
return cb(err); return cb(err);
} }
}); });
} else { } else {
var dataToSend = data; var dataToSend = data;
if(dataToSend.analytics && dataToSend.analytics.visitors){ if(dataToSend.analytics && dataToSend.analytics.visitors){
delete dataToSend.analytics.visitors; delete dataToSend.analytics.visitors;
} }
if(dataToSend.submissions){ if(dataToSend.submissions){
delete dataToSend.submissions; delete dataToSend.submissions;
} }
$scope.updatePromise = $http.put('/forms/' + $scope.myform._id, {form: dataToSend}) $scope.updatePromise = $http.put('/forms/' + $scope.myform._id, {form: dataToSend})
.then(function (response) { .then(function (response) {
if (refreshAfterUpdate) $rootScope.myform = $scope.myform = response.data; if (refreshAfterUpdate) $rootScope.myform = $scope.myform = response.data;
}).catch(function (response) { }).catch(function (response) {
console.log('Error occured during form UPDATE.\n'); console.log('Error occured during form UPDATE.\n');
// console.log(response.data); // console.log(response.data);
err = response.data; err = response.data;
}).finally(function () { }).finally(function () {
// console.log('finished updating'); // console.log('finished updating');
if (!updateImmediately) { if (!updateImmediately) {
$rootScope.saveInProgress = false; $rootScope.saveInProgress = false;
} }
if ((typeof cb) === 'function') { if ((typeof cb) === 'function') {
return cb(err); return cb(err);
} }
}); });
} }
} }
}; };
} }
]); ]);

View file

@ -14,7 +14,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField
/* /*
** Initialize scope with variables ** Initialize scope with variables
*/ */
var newField; var newField;
//Setup UI-Sortable //Setup UI-Sortable
$scope.sortableOptions = { $scope.sortableOptions = {
@ -28,8 +28,6 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField
}); });
}, },
start: function(e, ui) { start: function(e, ui) {
console.log(ui.item);
console.log(ui.placeholder);
} }
}; };

View file

@ -7,116 +7,110 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope',
restrict: 'E', restrict: 'E',
scope: { scope: {
user:'=', user:'=',
myform: '=' myform: '='
}, },
controller: function($scope){ controller: function($scope){
$scope.table = { $scope.table = {
masterChecker: false, masterChecker: false,
rows: [] rows: $scope.myform.submissions
}; };
$scope.table.rows = []; var initController = function(){
Forms.get({
formId: $stateParams.formId
}, function(form){
$scope.myform = form;
$scope.table.rows = form.submissions;
/*var defaultFormFields = _.cloneDeep($scope.myform.form_fields);
var initController = function(){ var submissions = $scope.myform.submissions || [];
Forms.get({ //Iterate through form's submissions
formId: $stateParams.formId for(var i = 0; i < submissions.length; i++){
}, function(form){ for(var x = 0; x < submissions[i].form_fields.length; x++){
$scope.myform = form; if(submissions[i].form_fields[x].fieldType === 'dropdown'){
var defaultFormFields = _.cloneDeep($scope.myform.form_fields); submissions[i].form_fields[x].fieldValue = submissions[i].form_fields[x].fieldValue.option_value;
}
//var oldValue = submissions[i].form_fields[x].fieldValue || '';
//submissions[i].form_fields[x] = _.merge(defaultFormFields, submissions[i].form_fields);
//submissions[i].form_fields[x].fieldValue = oldValue;
}
submissions[i].selected = false;
}
var submissions = $scope.myform.submissions || []; $scope.table.rows = submissions;*/
});
};
//Iterate through form's submissions
for(var i = 0; i < submissions.length; i++){
for(var x = 0; x < submissions[i].form_fields.length; x++){
if(submissions[i].form_fields[x].fieldType === 'dropdown'){
submissions[i].form_fields[x].fieldValue = submissions[i].form_fields[x].fieldValue.option_value;
}
//var oldValue = submissions[i].form_fields[x].fieldValue || '';
//submissions[i].form_fields[x] = _.merge(defaultFormFields, submissions[i].form_fields);
//submissions[i].form_fields[x].fieldValue = oldValue;
}
submissions[i].selected = false;
}
$scope.table.rows = submissions; /*
** Analytics Functions
*/
$scope.AverageTimeElapsed = (function(){
var totalTime = 0;
var numSubmissions = $scope.table.rows.length;
/* for(var i=0; i<$scope.table.rows.length; i++){
** Analytics Functions totalTime += $scope.table.rows[i].timeElapsed;
*/ }
$scope.AverageTimeElapsed = (function(){ if(numSubmissions === 0) {
var totalTime = 0; return 0;
var numSubmissions = $scope.table.rows.length; }
return (totalTime/numSubmissions).toFixed(0);
})();
for(i=0; i<$scope.table.rows.length; i++){ $scope.DeviceStatistics = (function(){
totalTime += $scope.table.rows[i].timeElapsed; var newStatItem = function(){
} return {
visits: 0,
responses: 0,
completion: 0,
average_time: 0,
total_time: 0
};
};
if(numSubmissions === 0) { var stats = {
return 0; desktop: newStatItem(),
} tablet: newStatItem(),
phone: newStatItem(),
other: newStatItem()
};
return (totalTime/numSubmissions).toFixed(0); if($scope.myform.analytics && $scope.myform.analytics.visitors) {
})(); var visitors = $scope.myform.analytics.visitors;
for (var i = 0; i < visitors.length; i++) {
var visitor = visitors[i];
var deviceType = visitor.deviceType;
$scope.DeviceStatistics = (function(){ stats[deviceType].visits++;
var newStatItem = function(){
return {
visits: 0,
responses: 0,
completion: 0,
average_time: 0,
total_time: 0
};
};
var stats = { if (visitor.isSubmitted) {
desktop: newStatItem(), stats[deviceType].total_time = stats[deviceType].total_time + visitor.timeElapsed;
tablet: newStatItem(), stats[deviceType].responses++;
phone: newStatItem(), }
other: newStatItem()
};
if($scope.myform.analytics && $scope.myform.analytics.visitors) { if(stats[deviceType].visits) {
var visitors = $scope.myform.analytics.visitors; stats[deviceType].completion = 100*(stats[deviceType].responses / stats[deviceType].visits).toFixed(2);
for (i = 0; i < visitors.length; i++) { }
var visitor = visitors[i];
var deviceType = visitor.deviceType;
stats[deviceType].visits++; if(stats[deviceType].responses){
stats[deviceType].average_time = (stats[deviceType].total_time / stats[deviceType].responses).toFixed(0);
}
}
}
return stats;
})();
if (visitor.isSubmitted) { var updateFields = $interval(initController, 1000000);
stats[deviceType].total_time = stats[deviceType].total_time + visitor.timeElapsed;
stats[deviceType].responses++;
}
if(stats[deviceType].visits) { $scope.$on('$destroy', function() {
stats[deviceType].completion = 100*(stats[deviceType].responses / stats[deviceType].visits).toFixed(2); if (updateFields) {
} $interval.cancel($scope.updateFields);
}
if(stats[deviceType].responses){ });
stats[deviceType].average_time = (stats[deviceType].total_time / stats[deviceType].responses).toFixed(0);
}
}
}
return stats;
})();
});
};
initController();
var updateFields = $interval(initController, 1000000);
$scope.$on('$destroy', function() {
if (updateFields) {
$interval.cancel($scope.updateFields);
}
});
/* /*
** Table Functions ** Table Functions
@ -174,7 +168,7 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope',
//Export selected submissions of Form //Export selected submissions of Form
$scope.exportSubmissions = function(type){ $scope.exportSubmissions = function(type){
angular.element('#table-submission-data').tableExport({type: type, escape:false}); angular.element('#table-submission-data').tableExport({type: type, escape:false});
}; };
} }

View file

@ -1,72 +1,72 @@
'use strict'; 'use strict';
//TODO: DAVID: URGENT: Make this a $resource that fetches valid field types from server //TODO: DAVID: URGENT: Make this a $resource that fetches valid field types from server
angular.module('forms').service('FormFields', [ angular.module('forms').service('FormFields', [ '$filter',
function() { function($filter) {
this.types = [ this.types = [
{ {
name : 'textfield', name : 'textfield',
value : 'Short Text' value : $filter('translate')('SHORT_TEXT'),
}, },
{ {
name : 'email', name : 'email',
value : 'Email' value : $filter('translate')('EMAIL'),
}, },
{ {
name : 'radio', name : 'radio',
value : 'Multiple Choice' value : $filter('translate')('MULTIPLE_CHOICE'),
}, },
{ {
name : 'dropdown', name : 'dropdown',
value : 'Dropdown' value : $filter('translate')('DROPDOWN'),
}, },
{ {
name : 'date', name : 'date',
value : 'Date' value : $filter('translate')('DATE'),
}, },
{ {
name : 'textarea', name : 'textarea',
value : 'Paragraph Text' value : $filter('translate')('PARAGRAPH'),
}, },
{ {
name : 'yes_no', name : 'yes_no',
value : 'Yes/No' value : $filter('translate')('YES_NO'),
}, },
{ {
name : 'legal', name : 'legal',
value : 'Legal' value : $filter('translate')('LEGAL'),
}, },
// { // {
// name : 'sig', // name : 'sig',
// value : 'Signature' // value : $filter('translate')('SIGNATURE'),
// }, // },
// { // {
// name : 'file', // name : 'file',
// value : 'File Upload' // value : $filter('translate')('FILE_UPLOAD'),
// }, // },
{ {
name : 'rating', name : 'rating',
value : 'Rating' value : $filter('translate')('RATING'),
}, },
{ {
name : 'link', name : 'link',
value : 'Link' value : $filter('translate')('LINK'),
}, },
{ {
name : 'number', name : 'number',
value : 'Numbers' value : $filter('translate')('NUMBERS'),
}, },
// { // {
// name : 'scale', // name : 'scale',
// value : 'Opinion Scale' // value : $filter('translate')('OPINION SCALE'),
// }, // },
// { // {
// name : 'stripe', // name : 'stripe',
// value : 'Payment' // value : $filter('translate')('PAYMENT'),
// }, // },
{ {
name : 'statement', name : 'statement',
value : 'Statement' value : $filter('translate')('STATEMENT')
} }
]; ];
} }

View file

@ -19,4 +19,4 @@ angular.module('forms').factory('Submissions', ['$resource',
} }
}); });
} }
]); ]);

View file

@ -62,17 +62,21 @@
<div class="col-xs-12"> <div class="col-xs-12">
<uib-tabset active="activePill" vertical="true" type="pills"> <uib-tabset active="activePill" vertical="true" type="pills">
<uib-tab index="0" heading="{{ 'CREATE_TAB' | translate }}"> <uib-tab index="0" heading="{{ 'CREATE_TAB' | translate }}">
<edit-form-directive myform="myform"></edit-form-directive> <edit-submissions-form-directive myform="myform"></edit-submissions-form-directive>
</uib-tab> </uib-tab>
<uib-tab ng-repeat="tab in tabData" index="{{$index}}+1" heading="{{tab.heading}}"> <uib-tab ng-repeat="tab in tabData" index="{{$index}}+1" heading="{{tab.heading}}">
<div class='row' data-ng-include="'/static/modules/forms/admin/views/adminTabs/'+tab.templateName+'.html'" onload="form_url = trustSrc(formURL)"></div> <div class='row' data-ng-include="'/static/modules/forms/admin/views/adminTabs/'+tab.templateName+'.html'" onload="form_url = trustSrc(formURL)"></div>
</uib-tab> </uib-tab>
<uib-tab ng-if="tabData" heading="{{ 'SHARE_TAB' | translate }}" index="{{tabData.length}}">
<uib-tab index="2" heading="{{ 'ANALYZE_TAB' | translate }}">
<edit-form-directive myform="myform" user="myform.admin"></edit-form-directive>
</uib-tab>
<uib-tab ng-if="tabData" heading="Share" index="{{tabData.length}}"> <uib-tab ng-if="tabData" heading="Share" index="{{tabData.length}}">
<div class="config-form"> <div class="config-form">
<div class="row"> <div class="row">
<div class="col-sm-12"> <div class="col-sm-12">
<uib-tabset active="activePill" vertical="true" type="pills"> <uib-tabset active="activePill" vertical="true" type="pills">
<uib-tab index="0" heading="Share your Form"> <uib-tab index="0" heading="{{ 'SHARE_YOUR_FORM' | translate }}">
<div class="row"> <div class="row">
<div class="col-sm-12"> <div class="col-sm-12">
{{ 'TELLFORM_URL' | translate }} {{ 'TELLFORM_URL' | translate }}
@ -87,7 +91,7 @@
</div> </div>
</div> </div>
</uib-tab> </uib-tab>
<uib-tab index="1" heading="Embed your Form"> <uib-tab index="1" heading="{{ 'EMBED_YOUR_FORM' | translate }}">
<div class="row"> <div class="row">
<div class="col-sm-12"> <div class="col-sm-12">
{{ 'COPY_AND_PASTE' | translate }} {{ 'COPY_AND_PASTE' | translate }}
@ -113,7 +117,7 @@
</div> </div>
</div> </div>
</uib-tab> </uib-tab>
<uib-tab ng-if="tabData && myform.form_fields.length" heading="Design" index="{{tabData.length}}+1"> <uib-tab ng-if="tabData && myform.form_fields.length" heading="{{ 'DESIGN_TAB' | translate }}" index="{{tabData.length}}+1">
<div class="config-form design container"> <div class="config-form design container">
<div class="row"> <div class="row">
<div class="col-md-4 col-sm-12 container"> <div class="col-md-4 col-sm-12 container">

View file

@ -382,7 +382,7 @@
<div class="row"> <div class="row">
<div class="col-md-4 col-xs-12 field-input">{{ 'DISABLED' | translate }}</div> <div class="col-md-4 col-xs-12 field-input">{{ 'DISABLED' | translate }}</div>
<div class="col-md-8 col-xs-12 field-input"> <div class="col-md-8 col-xs-12 field-input">
<label class="switch-light switch-holo" ng-click="console.log('clicked switch')"> <label class="switch-light switch-holo">
<input type="checkbox" ng-model="field.disabled"> <input type="checkbox" ng-model="field.disabled">
<span> <span>
<span> {{ 'OFF' | translate }}</span> <span> {{ 'OFF' | translate }}</span>

View file

@ -261,7 +261,7 @@
</div> </div>
</div> </div>
<div class="row table-outer"> <div class="row table-outer">
<div class="col-xs-12"> <div class="col-xs-12">
<table id="table-submission-data" class="table table-striped table-hover table-condensed"> <table id="table-submission-data" class="table table-striped table-hover table-condensed">
<thead> <thead>
<tr> <tr>

View file

@ -57,9 +57,7 @@ angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$root
}else if(type === 'rating'){ }else if(type === 'rating'){
scope.field.fieldValue = 0; scope.field.fieldValue = 0;
}else if(scope.field.fieldType === 'radio'){ }else if(scope.field.fieldType === 'radio'){
console.log(scope.field);
scope.field.fieldValue = scope.field.fieldOptions[0].option_value; scope.field.fieldValue = scope.field.fieldOptions[0].option_value;
console.log(scope.field.fieldValue);
}else if(type === 'legal'){ }else if(type === 'legal'){
scope.field.fieldValue = 'true'; scope.field.fieldValue = 'true';
$rootScope.nextField(); $rootScope.nextField();
@ -68,7 +66,6 @@ angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$root
scope.setActiveField = $rootScope.setActiveField; scope.setActiveField = $rootScope.setActiveField;
console.log(scope);
//Set format only if field is a date //Set format only if field is a date
if(scope.field.fieldType === 'date'){ if(scope.field.fieldType === 'date'){
scope.dateOptions = { scope.dateOptions = {

View file

@ -219,8 +219,6 @@ angular.module('forms').directive('submitFormDirective', ['$http', 'TimeCounter'
setTimeout(function () { setTimeout(function () {
$scope.submitPromise = $http.post('/forms/' + $scope.myform._id, form) $scope.submitPromise = $http.post('/forms/' + $scope.myform._id, form)
.success(function (data, status, headers) { .success(function (data, status, headers) {
console.log('\n\n\n\n\nSUBMITTING PROMISE');
console.log(data);
$scope.myform.submitted = true; $scope.myform.submitted = true;
$scope.loading = false; $scope.loading = false;
SendVisitorData.send($scope.myform, getActiveField(), _timeElapsed); SendVisitorData.send($scope.myform, getActiveField(), _timeElapsed);

View file

@ -1,49 +1,14 @@
(function () { (function () {
'use strict'; 'use strict';
//Dummy Service for Previewing Form
function SendVisitorData() { function SendVisitorData() {
// Create a controller method for sending visitor data // Create a controller method for sending visitor data
function send(form, lastActiveIndex) { function send(form, lastActiveIndex) {
// Create a new message object
/*var visitorData = {
referrer: document.referrer,
isSubmitted: form.submitted,
formId: form._id,
lastActiveField: form.form_fields[lastActiveIndex]._id,
timeElapsed: timeElapsed,
//@TODO @FIXME: David: Need to make this get the language from the HTTP Header instead
language: window.navigator.userLanguage || window.navigator.language,
ipAddr: '',
deviceType: ''
};
$http.get('https://jsonip.com/').success(function(response) {
visitorData.ipAddr = response['ip']+'';
}).error(function(error) {
console.error('Could not get users\'s ip');
}).then(function(){
visitorData.userAgent = deviceDetector.raw;
if(deviceDetector.isTablet()) {
visitorData.deviceType = 'tablet';
}else if(deviceDetector.isMobile()){
visitorData.deviceType = 'phone';
}else {
visitorData.deviceType = 'desktop';
}
console.log(visitorData.deviceType);
Socket.emit('form-visitor-data', visitorData);
});*/
} }
function init(){ function init(){
// Make sure the Socket is connected
/*if (!Socket.socket) {
Socket.connect();
}*/
} }
var service = { var service = {
@ -54,14 +19,11 @@
return service; return service;
} }
// Create the SendVisitorData service // Create the SendVisitorData service
angular angular
.module('forms') .module('forms')
.factory('SendVisitorData', SendVisitorData); .factory('SendVisitorData', SendVisitorData);
SendVisitorData.$inject = []; SendVisitorData.$inject = [];
}()); }());

View file

@ -243,7 +243,6 @@
//Run controller functionality //Run controller functionality
scope.openDeleteModal(); scope.openDeleteModal();
console.log(scope.deleteModal);
expect(scope.deleteModal.opened).toEqual(true); expect(scope.deleteModal.opened).toEqual(true);
}); });

View file

@ -140,8 +140,6 @@
describe('Form Table Methods', function(){ describe('Form Table Methods', function(){
it('$scope.toggleAllCheckers should toggle all checkboxes in table', function(){ it('$scope.toggleAllCheckers should toggle all checkboxes in table', function(){
$httpBackend.flush();
//Run Controller Logic to Test //Run Controller Logic to Test
scope.table.masterChecker = true; scope.table.masterChecker = true;
scope.toggleAllCheckers(); scope.toggleAllCheckers();
@ -153,8 +151,6 @@
}); });
it('$scope.isAtLeastOneChecked should return true when at least one checkbox is selected', function(){ it('$scope.isAtLeastOneChecked should return true when at least one checkbox is selected', function(){
$httpBackend.flush();
scope.table.masterChecker = true; scope.table.masterChecker = true;
scope.toggleAllCheckers(); scope.toggleAllCheckers();
@ -165,8 +161,6 @@
}); });
it('$scope.deleteSelectedSubmissions should delete all submissions that are selected', function(){ it('$scope.deleteSelectedSubmissions should delete all submissions that are selected', function(){
$httpBackend.flush();
scope.table.masterChecker = true; scope.table.masterChecker = true;
scope.toggleAllCheckers(); scope.toggleAllCheckers();

View file

@ -86,9 +86,7 @@
scope = el.isolateScope() || el.scope(); scope = el.isolateScope() || el.scope();
scope.update = function(updateImmediately, data, isDiffed, refreshAfterUpdate, cb){ scope.update = function(updateImmediately, data, isDiffed, refreshAfterUpdate, cb){
if(cb){ if(cb) cb();
cb();
}
}; };
})); }));
@ -153,53 +151,5 @@
}); });
}); });
/*
describe('> Form Field Button >',function(){
it('$scope.addButton() should ADD a button to $scope.myform.startPage.buttons', function() {
var expectedStartPageBtn = {
bgColor:'#ddd',
color:'#ffffff',
text: 'Button'
};
//Run controller methods
scope.addButton();
var actualStartPageBtn = _.cloneDeep(_.last(scope.myform.startPage.buttons));
delete actualStartPageBtn._id;
expect(scope.myform.startPage.buttons.length).toEqual(sampleForm.startPage.buttons.length+1);
expect(actualStartPageBtn).toEqualData(expectedStartPageBtn);
});
it('$scope.deleteButton() should DELETE a button from $scope.myform.startPage.buttons', function() {
//Run controller methods
scope.deleteButton(scope.myform.startPage.buttons[0]);
expect(scope.myform.startPage.buttons.length).toEqual(0);
});
});
describe('> Form Field Option >',function(){
it('$scope.addOption() should ADD a new option to a field.fieldOptions', function() {
var originalOptionLen = scope.myform.form_fields[1].fieldOptions.length;
//Run controller methods
scope.addOption(1);
expect(originalOptionLen+1).toEqual(scope.myform.form_fields[1].fieldOptions.length);
expect(scope.myform.form_fields[1].fieldOptions[0].option_title).toEqualData('Option 0');
expect(scope.myform.form_fields[1].fieldOptions[0].option_value).toEqualData('Option 0');
});
it('$scope.deleteOption() should DELETE remove option from field.fieldOptions', function() {
//Run controller methods
scope.deleteOption(1, scope.myform.form_fields[1].fieldOptions[0]);
expect(scope.myform.form_fields[0].fieldOptions.length).toEqual(0);
expect(scope.myform.form_fields[0].fieldOptions[0]).not.toBeDefined();
});
});*/
}); });
}()); }());

View file

@ -65,7 +65,6 @@
// it('should be able to render entryPage in html', function() { // it('should be able to render entryPage in html', function() {
// scope.myStartPage = _.cloneDeep(sampleStartPage); // scope.myStartPage = _.cloneDeep(sampleStartPage);
// console.log(scope.myStartPage);
// var element = angular.element('<entry-page pageData="myStartPage" pageType="startPage"></entry-page>'); // var element = angular.element('<entry-page pageData="myStartPage" pageType="startPage"></entry-page>');
// $compile(element)(scope); // $compile(element)(scope);
// scope.$digest(); // scope.$digest();

View file

@ -35,7 +35,7 @@
it('should be able render all field-icon types', inject(function($compile) { it('should be able render all field-icon types', inject(function($compile) {
var currType, currClass; var currType, currClass;
for(var i=0; i<FormFields.types.length; i++){ for(var i=0; i<FormFields.types.length; i++){
currType = FormFields.types[i]; currType = FormFields.types[i];
currClass = faClasses[currType.name]; currClass = faClasses[currType.name];

View file

@ -18,7 +18,6 @@
})); }));
it('should emit Custom "Finished" and "Started" events on ng-repeat', inject(function($compile, $rootScope) { it('should emit Custom "Finished" and "Started" events on ng-repeat', inject(function($compile, $rootScope) {
scope.myfields = FormFields.types; scope.myfields = FormFields.types;
$compile('<div><div ng-repeat="item in myfields" on-finish-render="editFormFields">{{item.name}}</div></div>')(scope); $compile('<div><div ng-repeat="item in myfields" on-finish-render="editFormFields">{{item.name}}</div></div>')(scope);
@ -30,8 +29,6 @@
})); }));
it('should emit "ngRepeat Finished" and "ngRepeat Started" events on ng-repeat when attr is not set to string', inject(function($compile, $rootScope) { it('should emit "ngRepeat Finished" and "ngRepeat Started" events on ng-repeat when attr is not set to string', inject(function($compile, $rootScope) {
// console.log(FormFields.types);
scope.myfields = FormFields.types; scope.myfields = FormFields.types;
$compile('<div><div ng-repeat="item in myfields" on-finish-render>{{item.name}}</div></div>')(scope); $compile('<div><div ng-repeat="item in myfields" on-finish-render>{{item.name}}</div></div>')(scope);

View file

@ -169,7 +169,6 @@
expect(scope.myform.submitted).toBe(true); expect(scope.myform.submitted).toBe(true);
expect(scope.error).toEqual(''); expect(scope.error).toEqual('');
}); });
}); });
it('$scope.reloadForm() should reset and reload form', function(){ it('$scope.reloadForm() should reset and reload form', function(){

View file

@ -12,7 +12,6 @@ angular.module('stateMock').service('$state', function($q){
}else{ }else{
throw Error('No more transitions were expected! Tried to transition to '+ stateName ); throw Error('No more transitions were expected! Tried to transition to '+ stateName );
} }
console.log('Mock transition to: ' + stateName);
var deferred = $q.defer(); var deferred = $q.defer();
var promise = deferred.promise; var promise = deferred.promise;
deferred.resolve(); deferred.resolve();

View file

@ -1,170 +0,0 @@
// 'use strict';
// (function() {
// // Principal controller Spec for E2E Tests
// describe('AuthenticationController E2E Tests', function() {
// describe('/signup should work for a unique username', function() {
// beforeEach(function() {
// var ptor = protractor.getInstance();
// ptor.get('http://localhost:3000/#!/signup');
// });
// it('should show the signup panel on page load', function() {
// expect($('section > section.row.auth > .col-md-12.text-center')).toEqual('Signup with your email');
// });
// //Jasmine it statement : What "it" will do.
// it('Verify that the user is logged in', function() {
// //Delete all cookies
// browser.driver.manage().deleteAllCookies();
// //Enter UserName
// element.all(by.model('username')).get(0).sendKeys('abc@wingify.com');
// //Enter Password
// element(by.model('password')).sendKeys('test');
// //Click Submit button
// element(by.css('.login-form button[type="submit"]')).click();
// //Wait for the current URL to change to welcome
// browser.driver.wait(function() {
// return browser.driver.getCurrentUrl().then(function(url) {
// return (/welcome/).test(url);
// });
// });
// var firstname = element(by.model('credentials.firstname')),
// lastname = element(by.model('credentials.lastname')),
// email = element(by.model('credentials.email')),
// password = element(by.model('credentials.password'));
// email.sendKeys('admin@app.com');
// firstname.sendKeys('admin_first');
// lastname.sendKeys('admin_last');
// password.sendKeys('1234');
// //Click signup button
// element(by.css('.btn.btn-large.btn-primary')).click().then(function () {
// expect(browser.getCurrentUrl()).toEqual('http://localhost:3000/#!/signup-success');
// });
// });
// });
// });
// // Principal controller Spec
// describe('AuthenticationController Unit Tests', function() {
// // Initialize global variables
// var AuthenticationController,
// scope,
// $httpBackend,
// $stateParams,
// $location;
// beforeEach(function() {
// jasmine.addMatchers({
// toEqualData: function(util, customEqualityTesters) {
// return {
// compare: function(actual, expected) {
// return {
// pass: angular.equals(actual, expected)
// };
// }
// };
// }
// });
// });
// // Load the main application module
// beforeEach(module(ApplicationConfiguration.applicationModuleName));
// // The injector ignores leading and trailing underscores here (i.e. _$httpBackend_).
// // This allows us to inject a service but then attach it to a variable
// // with the same name as the service.
// beforeEach(inject(function($controller, $rootScope, _$location_, _$stateParams_, _$httpBackend_) {
// // Set a new global scope
// scope = $rootScope.$new();
// // Point global variables to injected services
// $stateParams = _$stateParams_;
// $httpBackend = _$httpBackend_;
// $location = _$location_;
// // Initialize the Principal controller
// AuthenticationController = $controller('AuthenticationController', {
// $scope: scope
// });
// }));
// it('$scope.signin() should login with a correct user and password', function() {
// // Test expected GET request
// $httpBackend.when('POST', '/auth/signin').respond(200, 'Fred');
// scope.signin();
// $httpBackend.flush();
// // Test scope value
// expect(scope.authentication.user).toEqual('Fred');
// expect($location.url()).toEqual('/');
// });
// it('$scope.signin() should fail to log in with nothing', function() {
// // Test expected POST request
// $httpBackend.expectPOST('/auth/signin').respond(400, {
// 'message': 'Missing credentials'
// });
// scope.signin();
// $httpBackend.flush();
// // Test scope value
// expect(scope.error).toEqual('Missing credentials');
// });
// it('$scope.signin() should fail to log in with wrong credentials', function() {
// // Foo/Bar combo assumed to not exist
// scope.authentication.user = 'Foo';
// scope.credentials = 'Bar';
// // Test expected POST request
// $httpBackend.expectPOST('/auth/signin').respond(400, {
// 'message': 'Unknown user'
// });
// scope.signin();
// $httpBackend.flush();
// // Test scope value
// expect(scope.error).toEqual('Unknown user');
// });
// it('$scope.signup() should register with correct data', function() {
// // Test expected GET request
// scope.authentication.user = 'Fred';
// $httpBackend.when('POST', '/auth/signup').respond(200, 'Fred');
// scope.signup();
// $httpBackend.flush();
// // test scope value
// expect(scope.authentication.user).toBe('Fred');
// expect(scope.error).toEqual(undefined);
// expect($location.url()).toBe('/');
// });
// it('$scope.signup() should fail to register with duplicate Username', function() {
// // Test expected POST request
// $httpBackend.when('POST', '/auth/signup').respond(400, {
// 'message': 'Username already exists'
// });
// scope.signup();
// $httpBackend.flush();
// // Test scope value
// expect(scope.error).toBe('Username already exists');
// });
// });
// }());

View file

@ -1,181 +1,181 @@
// 'use strict'; 'use strict';
// (function() { (function() {
// // Forms Controller Spec // Forms Controller Spec
// describe('Authentication Controller Tests', function() { describe('Authentication Controller Tests', function() {
// // Initialize global variables // Initialize global variables
// var AuthenticationController, var AuthenticationController,
// scope, scope,
// $httpBackend, $httpBackend,
// $stateParams, $stateParams,
// $location, $location,
// $state; $state;
// var sampleUser = { var sampleUser = {
// firstName: 'Full', firstName: 'Full',
// lastName: 'Name', lastName: 'Name',
// email: 'test@test.com', email: 'test@test.com',
// username: 'test@test.com', username: 'test@test.com',
// password: 'password', password: 'password',
// provider: 'local', provider: 'local',
// roles: ['user'], roles: ['user'],
// _id: 'ed873933b1f1dea0ce12fab9' _id: 'ed873933b1f1dea0ce12fab9'
// }; };
// var sampleForm = { var sampleForm = {
// title: 'Form Title', title: 'Form Title',
// admin: 'ed873933b1f1dea0ce12fab9', admin: 'ed873933b1f1dea0ce12fab9',
// language: 'english', language: 'english',
// form_fields: [ form_fields: [
// {fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false}, {fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false}, {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false} {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false}
// ], ],
// _id: '525a8422f6d0f87f0e407a33' _id: '525a8422f6d0f87f0e407a33'
// }; };
// var expectedForm = { var expectedForm = {
// title: 'Form Title', title: 'Form Title',
// admin: 'ed873933b1f1dea0ce12fab9', admin: 'ed873933b1f1dea0ce12fab9',
// language: 'english', language: 'english',
// form_fields: [ form_fields: [
// {fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false}, {fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false}, {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false} {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false}
// ], ],
// visible_form_fields: [ visible_form_fields: [
// {fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false}, {fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false}, {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false} {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false}
// ], ],
// _id: '525a8422f6d0f87f0e407a33' _id: '525a8422f6d0f87f0e407a33'
// }; };
// var sampleCredentials = { var sampleCredentials = {
// username: sampleUser.username, username: sampleUser.username,
// password: sampleUser.password, password: sampleUser.password,
// }; };
// // The $resource service augments the response object with methods for updating and deleting the resource. // The $resource service augments the response object with methods for updating and deleting the resource.
// // If we were to use the standard toEqual matcher, our tests would fail because the test values would not match // If we were to use the standard toEqual matcher, our tests would fail because the test values would not match
// // the responses exactly. To solve the problem, we define a new toEqualData Jasmine matcher. // the responses exactly. To solve the problem, we define a new toEqualData Jasmine matcher.
// // When the toEqualData matcher compares two objects, it takes only object properties into // When the toEqualData matcher compares two objects, it takes only object properties into
// // account and ignores methods. // account and ignores methods.
// beforeEach(function() { beforeEach(function() {
// jasmine.addMatchers({ jasmine.addMatchers({
// toEqualData: function(util, customEqualityTesters) { toEqualData: function(util, customEqualityTesters) {
// return { return {
// compare: function(actual, expected) { compare: function(actual, expected) {
// return { return {
// pass: angular.equals(actual, expected) pass: angular.equals(actual, expected)
// }; };
// } }
// }; };
// } }
// }); });
// }); });
// // Load the main application module // Load the main application module
// beforeEach(module(ApplicationConfiguration.applicationModuleName)); beforeEach(module(ApplicationConfiguration.applicationModuleName));
// beforeEach(module('stateMock')); beforeEach(module('stateMock'));
// // Mock Users Service // Mock Users Service
// beforeEach(module(function($provide) { beforeEach(module(function($provide) {
// $provide.service('User', function($q) { $provide.service('User', function($q) {
// return { return {
// getCurrent: function() { getCurrent: function() {
// var deferred = $q.defer(); var deferred = $q.defer();
// deferred.resolve( JSON.stringify(sampleUser) ); deferred.resolve( JSON.stringify(sampleUser) );
// return deferred.promise; return deferred.promise;
// }, },
// login: function(credentials) { login: function(credentials) {
// var deferred = $q.defer(); var deferred = $q.defer();
// if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){ if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){
// deferred.resolve( JSON.stringify(sampleUser) ); deferred.resolve( JSON.stringify(sampleUser) );
// }else { }else {
// deferred.resolve('Error: User could not be loggedin'); deferred.resolve('Error: User could not be loggedin');
// } }
// return deferred.promise; return deferred.promise;
// }, },
// logout: function() { logout: function() {
// var deferred = $q.defer(); var deferred = $q.defer();
// deferred.resolve(null); deferred.resolve(null);
// return deferred.promise; return deferred.promise;
// }, },
// signup: function(credentials) { signup: function(credentials) {
// var deferred = $q.defer(); var deferred = $q.defer();
// if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){ if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){
// deferred.resolve( JSON.stringify(sampleUser) ); deferred.resolve( JSON.stringify(sampleUser) );
// }else { }else {
// deferred.resolve('Error: User could not be signed up'); deferred.resolve('Error: User could not be signed up');
// } }
// return deferred.promise; return deferred.promise;
// } }
// }; };
// }); });
// })); }));
// // Mock Authentication Service // Mock Authentication Service
// beforeEach(module(function($provide) { beforeEach(module(function($provide) {
// $provide.service('Auth', function() { $provide.service('Auth', function() {
// return { return {
// ensureHasCurrentUser: function() { ensureHasCurrentUser: function() {
// return sampleUser; return sampleUser;
// }, },
// isAuthenticated: function() { isAuthenticated: function() {
// return true; return true;
// }, },
// getUserState: function() { getUserState: function() {
// return true; return true;
// } }
// }; };
// }); });
// })); }));
// // The injector ignores leading and trailing underscores here (i.e. _$httpBackend_). // The injector ignores leading and trailing underscores here (i.e. _$httpBackend_).
// // This allows us to inject a service but then attach it to a variable // This allows us to inject a service but then attach it to a variable
// // with the same name as the service. // with the same name as the service.
// beforeEach(inject(function($controller, $rootScope, _$state_, _$location_, _$stateParams_, _$httpBackend_, CurrentForm, Forms) { beforeEach(inject(function($controller, $rootScope, _$state_, _$location_, _$stateParams_, _$httpBackend_, CurrentForm, Forms) {
// // Set a new global scope // Set a new global scope
// scope = $rootScope.$new(); scope = $rootScope.$new();
// scope.abc = 'hello'; scope.abc = 'hello';
// // Point global variables to injected services // Point global variables to injected services
// $stateParams = _$stateParams_; $stateParams = _$stateParams_;
// $httpBackend = _$httpBackend_; $httpBackend = _$httpBackend_;
// $location = _$location_; $location = _$location_;
// $state = _$state_; $state = _$state_;
// // $httpBackend.whenGET(/\.html$/).respond(''); // $httpBackend.whenGET(/\.html$/).respond('');
// $httpBackend.whenGET('/users/me/').respond(''); $httpBackend.whenGET('/users/me/').respond('');
// // Initialize the Forms controller. // Initialize the Forms controller.
// AuthenticationController = $controller('AuthenticationController', { $scope: scope }); AuthenticationController = $controller('AuthenticationController', { $scope: scope });
// })); }));
// it('$scope.signin should sigin in user with valid credentials', inject(function(Auth) { it('$scope.signin should sigin in user with valid credentials', inject(function(Auth) {
// //Set $state transition //Set $state transition
// // $state.expectTransitionTo('listForms'); // $state.expectTransitionTo('listForms');
// //Set POST response //Set POST response
// // $httpBackend.expect('POST', '/auth/signin', sampleCredentials).respond(200, sampleUser); // $httpBackend.expect('POST', '/auth/signin', sampleCredentials).respond(200, sampleUser);
// scope.abc = 'sampleCredentials'; scope.abc = 'sampleCredentials';
// //Run Controller Logic to Test //Run Controller Logic to Test
// scope.signin(); scope.signin();
// // $httpBackend.flush(); // $httpBackend.flush();
// // Test scope value // Test scope value
// // expect(Auth.ensureHasCurrentUser()).toEqualData(sampleUser); // expect(Auth.ensureHasCurrentUser()).toEqualData(sampleUser);
// })); }));
// }); });
// }()); }());

View file

@ -65,7 +65,6 @@
})); }));
it('Auth.getUserState() should fetch current user state', function() { it('Auth.getUserState() should fetch current user state', function() {
//Run Service Logic to Test //Run Service Logic to Test
Auth.login(sampleUser); Auth.login(sampleUser);
var currUserState = Auth.getUserState(); var currUserState = Auth.getUserState();