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 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.",
"value": "TRUE"
},
"DISABLE_CLUSTER_MODE": {
"description": "Disable support for running in cluster mode on pm2",
"value": "TRUE"
"ENABLE_CLUSTER_MODE": {
"description": "ENABLE support for running in cluster mode on pm2",
"value": "FALSE"
},
"NODE_ENV": {
"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) ){
readForRender(req, res);
} else {
FormSubmission.find({ form: req.form._id }).exec(function(err, _submissions) {
if (err) {
res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
}
var newForm = req.form.toJSON();
newForm.submissions = _submissions;
if (req.userId) {
if(req.form.admin._id+'' === req.userId+''){
return res.json(newForm);
FormSubmission.find({ form: req.form._id }).exec(function(err, _submissions) {
if (err) {
res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
}
return res.status(404).send({
message: 'Form Does Not Exist'
});
}
return res.json(newForm);
});
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'
});
}
return res.json(newForm);
});
}
};

View file

@ -218,7 +218,7 @@ FormSchema.virtual('analytics.fields').get(function () {
if(this.form_fields.length === 0) {
return null;
}
for(var i=0; i<this.form_fields.length; i++){
var field = this.form_fields[i];
@ -280,22 +280,6 @@ FormSchema.plugin(mUtilities.timestamp, {
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) {
switch(this.language){
case 'spanish':
@ -317,14 +301,39 @@ FormSchema.pre('save', function (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) {
var that = this;
var _original;
async.series([function(cb) {
that.constructor
.findOne({_id: that._id}).exec(function (err, original) {
if (err) {
return cb(err);
} else if (!original){
return next();
} else {
_original = original;
return cb(null);
@ -332,21 +341,18 @@ FormSchema.pre('save', function (next) {
});
},
function(cb) {
var hasIds = true;
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){
if(that.form_fields && that.isModified('form_fields') && formFieldsAllHaveIds(that.toObject().form_fields)){
var old_form_fields = _original.form_fields,
new_ids = _.map(_.pluck(that.form_fields, 'id'), function(id){ return ''+id;}),
old_ids = _.map(_.pluck(old_form_fields, 'id'), function(id){ return ''+id;}),
var current_form = that.toObject(),
old_form_fields = _original.toObject().form_fields,
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);
//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 ){
var modifiedSubmissions = [];
@ -355,23 +361,21 @@ FormSchema.pre('save', function (next) {
function (deletedIdIndex, key, cb_id) {
var deleted_id = old_ids[deletedIdIndex];
//Find FormSubmissions that contain field with _id equal to 'deleted_id'
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){
if(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) {
//Add submissions
modifiedSubmissions.push.apply(modifiedSubmissions, submissions);
}
return cb_id(null);
});
},
function (err) {
@ -383,29 +387,33 @@ FormSchema.pre('save', function (next) {
//Iterate through all submissions with modified form_fields
async.forEachOfSeries(modifiedSubmissions, function (submission, key, callback) {
//Iterate through ids of deleted fields
for (i = 0; i < deletedIds.length; i++) {
var submission_form_fields = submission.toObject().form_fields;
var currentform_form_fields = that.toObject().form_fields;
var index = _.findIndex(submission.form_fields, function (field) {
var tmp_id = field._id + '';
//Iterate through ids of deleted fields
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]];
});
var deletedField = submission.form_fields[index];
var deletedField = submission_form_fields[index];
//Hide field if it exists
if (deletedField) {
//Delete old form_field
submission.form_fields.splice(index, 1);
submission_form_fields.splice(index, 1);
deletedField.deletePreserved = true;
//Move deleted form_field to start
submission.form_fields.unshift(deletedField);
that.form_fields.unshift(deletedField);
submission_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) {
return callback(saveErr);
@ -413,13 +421,14 @@ FormSchema.pre('save', function (next) {
}, function (err) {
return cb(err);
});
}
);
} else {
return cb(null);
}
} else {
return cb(null);
}
return cb(null);
}],
function(err, results){
next(err);

View file

@ -10,6 +10,9 @@ var mongoose = require('mongoose'),
Schema = mongoose.Schema,
LogicJumpSchema = require('./logic_jump.server.model');
const UIDGenerator = require('uid-generator');
const uidgen3 = new UIDGenerator(256, UIDGenerator.BASE62);
var FieldOptionSchema = new Schema({
option_id: {
type: Number
@ -61,6 +64,9 @@ function BaseFieldSchema(){
Schema.apply(this, arguments);
this.add({
globalId: {
type: String,
},
isSubmission: {
type: Boolean,
default: false
@ -193,6 +199,9 @@ FormFieldSchema.pre('save', function(next) {
if(this.logicJump && this.logicJump.fieldA) {
if(this.logicJump.jumpTo === '') delete this.logicJump.jumpTo;
}
if(!this.globalId){
this.globalId = uidgen3.generateSync()
}
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', {
set: function(form_fields){
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) {
should.not.exist(err);
should.exist(submission);
done();
});
});
@ -187,7 +186,7 @@ describe('FormSubmission Model Unit Tests:', function() {
//Create Submission
mySubmission = new FormSubmission({
form_fields: sampleSubmission,
form_fields: _.merge(sampleSubmission, myForm.form_fields),
admin: user,
form: myForm,
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) {
var old_fields = myForm.toObject().form_fields;
@ -214,17 +212,18 @@ describe('FormSubmission Model Unit Tests:', function() {
should.not.exist(err);
should.exist(_form.form_fields);
var actual_fields = _.deepOmit(_form.toObject().form_fields, ['lastModified', 'created', '_id']);
old_fields = _.deepOmit(old_fields, ['lastModified', 'created', '_id']);
var actual_fields = _.deepOmit(_form.toObject().form_fields, ['deletePreserved', 'globalId', 'lastModified', 'created', '_id', 'submissionId']);
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();
});
});
//
it('should delete \'preserved\' form_fields whose submissions have been removed without any problems', function(done) {
var old_fields = myForm.toObject().form_fields;
old_fields.splice(0,1);
var new_form_fields = _.clone(myForm.toObject().form_fields);
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');
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){
mySubmission.remove(function(){
done();

2
config/env/all.js vendored
View file

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

View file

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

View file

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

View file

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

View file

@ -9,13 +9,9 @@ var config = require('./config'),
// Define the Socket.io configuration method
module.exports = function (app, db) {
var server = http.createServer(app);
var io = socketio(20523, { transports: ['websocket', 'polling'] });
var io = socketio(config.socketPort, { transports: ['websocket', 'polling'] });
if(config.socketPort){
io = socketio(config.socketPort, { transports: ['websocket', 'polling'] });
}
if(config.disableClusterMode){
if(config.enableClusterMode){
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 }));
}
@ -27,4 +23,4 @@ module.exports = function (app, db) {
});
return server;
};
};

View file

@ -210,14 +210,23 @@ module.exports = function(grunt) {
reporter: 'spec',
quiet: false,
require: 'server.js',
ui: 'bdd'
ui: 'bdd',
debug: true
}
},
karma: {
unit: {
configFile: 'karma.conf.js',
singleRun: true
}
},
debug: {
configFile: 'karma.conf.js',
browserConsoleLogOptions: {
level: 'log',
terminal: true
},
singleRun: true
}
},
protractor: {
options: {
@ -339,9 +348,9 @@ module.exports = function(grunt) {
// Code coverage tasks.
grunt.registerTask('coveralls', ['env:test','mocha_istanbul:coveralls']);
grunt.registerTask('coverage', ['env:test', 'mocha_istanbul:coverage']);
grunt.registerTask('coverage:client', ['env:test', 'mocha_istanbul:coverageClient']);
grunt.registerTask('coverage:server', ['env:test', 'mocha_istanbul:coverageServer']);
grunt.registerTask('coverage', ['env:test', 'mocha_istanbul:coverage']);
grunt.registerTask('coverage:client', ['env:test', 'mocha_istanbul:coverageClient']);
grunt.registerTask('coverage:server', ['env:test', 'mocha_istanbul:coverageServer']);
// Default task(s).
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:server', ['lint:tests', 'env:test', 'mochaTest']);
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-redis": "^1.0.0",
"swig": "~1.4.1",
"uid-generator": "^0.1.1",
"uuid-token-generator": "^0.5.0",
"wildcard-subdomains": "github:tellform/wildcard-subdomains",
"winston": "^2.3.1",
@ -126,7 +127,7 @@
"karma-jasmine-html-reporter": "^0.1.8",
"karma-mocha-reporter": "^1.1.1",
"karma-ng-html2js-preprocessor": "^0.2.0",
"karma-phantomjs-launcher": "~0.2.1",
"karma-phantomjs-launcher": "^1.0.4",
"mailosaur": "^1.0.1",
"mocha": "^3.1.2",
"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
function Socket($timeout, $window) {
var service;
var service;
// Connect to Socket.io server
function connect(url) {
service.socket = io(url, {'transports': ['websocket', 'polling']});
@ -35,7 +35,7 @@
service.socket.removeListener(eventName);
}
}
service = {
connect: connect,
emit: emit,
@ -44,10 +44,11 @@
socket: null
};
console.log($window.socketUrl);
var url = '';
if($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;
} else if ($window.socketPort){
url = window.location.protocol + '//' + window.location.hostname + ':' + $window.socketPort;
@ -58,12 +59,11 @@
return service;
}
angular
.module('view-form')
.factory('Socket', Socket);
Socket.$inject = ['$timeout', '$window'];
}());

View file

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

View file

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

View file

@ -137,11 +137,33 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
BTN_BACKGROUND_COLOR: 'Button Background Color',
BTN_TEXT_COLOR: 'Button Text Color',
//Share View
EMBED_YOUR_FORM: 'Embed your form',
SHARE_YOUR_FORM: 'Share your form',
//Admin Tabs
CREATE_TAB: 'Create',
DESIGN_TAB: 'Design',
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_TEXT_COLOR: 'Color del texto del botón',
//Share View
EMBED_YOUR_FORM: 'Pone tu formulario',
SHARE_YOUR_FORM: 'Compartí tu formulario',
//Admin Tabs
CREATE_TAB: 'Crear',
DESIGN_TAB: 'Diseño',
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
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) {
return $sce.trustAsResourceUrl(src);
};
$scope.trustSrc = function (src) {
return $sce.trustAsResourceUrl(src);
};
//Set active tab to Create
$scope.activePill = 0;
//Set active tab to Create
$scope.activePill = 0;
$scope.copied = false;
$scope.onCopySuccess = function (e) {
$scope.copied = true;
};
$scope.copied = false;
$scope.onCopySuccess = function (e) {
$scope.copied = true;
};
$scope = $rootScope;
$scope.animationsEnabled = true;
$scope.myform = myForm;
$rootScope.saveInProgress = false;
$scope = $rootScope;
$scope.animationsEnabled = true;
$scope.myform = myForm;
$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 ($window.subdomainsDisabled === true) {
$scope.actualFormURL = window.location.protocol + '//' + window.location.host + '/view' + $scope.formURL;
} else {
if (window.location.host.split('.').length < 3) {
$scope.actualFormURL = window.location.protocol + '//' + $scope.myform.admin.username + '.' + window.location.host + $scope.formURL;
} else {
$scope.actualFormURL = window.location.protocol + '//' + $scope.myform.admin.username + '.' + window.location.host.split('.').slice(1, 3).join('.') + $scope.formURL;
}
}
} else {
$scope.actualFormURL = window.location.protocol + '//' + window.location.host + $scope.formURL;
}
if ($scope.myform.isLive) {
if ($window.subdomainsDisabled === true) {
$scope.actualFormURL = window.location.protocol + '//' + window.location.host + '/view' + $scope.formURL;
} else {
if (window.location.host.split('.').length < 3) {
$scope.actualFormURL = window.location.protocol + '//' + $scope.myform.admin.username + '.' + window.location.host + $scope.formURL;
} else {
$scope.actualFormURL = window.location.protocol + '//' + $scope.myform.admin.username + '.' + window.location.host.split('.').slice(1, 3).join('.') + $scope.formURL;
}
}
} else {
$scope.actualFormURL = window.location.protocol + '//' + window.location.host + $scope.formURL;
}
var refreshFrame = $scope.refreshFrame = function(){
if(document.getElementById('iframe')) {
document.getElementById('iframe').contentWindow.location.reload();
}
};
var refreshFrame = $scope.refreshFrame = function(){
if(document.getElementById('iframe')) {
document.getElementById('iframe').contentWindow.location.reload();
}
};
$scope.tabData = [
$scope.tabData = [
{
heading: $filter('translate')('CONFIGURE_TAB'),
templateName: 'configure'
templateName: 'configure'
},
{
/*{
heading: $filter('translate')('ANALYZE_TAB'),
templateName: 'analyze'
}
templateName: 'analyze'
}*/
];
$scope.setForm = function(form){
@ -72,19 +72,19 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo
*/
$scope.openDeleteModal = function(){
$scope.deleteModal = $uibModal.open({
animation: $scope.animationsEnabled,
templateUrl: 'formDeleteModal.html',
controller: 'AdminFormController',
resolve: {
myForm: function(){
return $scope.myform;
}
}
animation: $scope.animationsEnabled,
templateUrl: 'formDeleteModal.html',
controller: 'AdminFormController',
resolve: {
myForm: function(){
return $scope.myform;
}
}
});
$scope.deleteModal.result.then(function (selectedItem) {
$scope.selected = selectedItem;
$scope.selected = selectedItem;
}, 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
$scope.update = $rootScope.update = function(updateImmediately, data, isDiffed, refreshAfterUpdate, cb){
refreshFrame();
refreshFrame();
var continueUpdate = true;
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**
if(continueUpdate) {
var err = null;
var err = null;
if (!updateImmediately) {
$rootScope.saveInProgress = true;
}
if (!updateImmediately) {
$rootScope.saveInProgress = true;
}
if (isDiffed) {
$scope.updatePromise = $http.put('/forms/' + $scope.myform._id, {changes: data})
.then(function (response) {
if (isDiffed) {
$scope.updatePromise = $http.put('/forms/' + $scope.myform._id, {changes: data})
.then(function (response) {
if (refreshAfterUpdate) $rootScope.myform = $scope.myform = response.data;
// console.log(response.data);
}).catch(function (response) {
console.log('Error occured during form UPDATE.\n');
// console.log(response.data);
err = response.data;
}).finally(function () {
// console.log('finished updating');
if (!updateImmediately) {
$rootScope.saveInProgress = false;
}
if (refreshAfterUpdate) $rootScope.myform = $scope.myform = response.data;
// console.log(response.data);
}).catch(function (response) {
console.log('Error occured during form UPDATE.\n');
// console.log(response.data);
err = response.data;
}).finally(function () {
// console.log('finished updating');
if (!updateImmediately) {
$rootScope.saveInProgress = false;
}
if ((typeof cb) === 'function') {
return cb(err);
}
});
} else {
var dataToSend = data;
if(dataToSend.analytics && dataToSend.analytics.visitors){
delete dataToSend.analytics.visitors;
}
if(dataToSend.submissions){
delete dataToSend.submissions;
}
if ((typeof cb) === 'function') {
return cb(err);
}
});
} else {
var dataToSend = data;
if(dataToSend.analytics && dataToSend.analytics.visitors){
delete dataToSend.analytics.visitors;
}
if(dataToSend.submissions){
delete dataToSend.submissions;
}
$scope.updatePromise = $http.put('/forms/' + $scope.myform._id, {form: dataToSend})
.then(function (response) {
$scope.updatePromise = $http.put('/forms/' + $scope.myform._id, {form: dataToSend})
.then(function (response) {
if (refreshAfterUpdate) $rootScope.myform = $scope.myform = response.data;
if (refreshAfterUpdate) $rootScope.myform = $scope.myform = response.data;
}).catch(function (response) {
console.log('Error occured during form UPDATE.\n');
// console.log(response.data);
err = response.data;
}).finally(function () {
// console.log('finished updating');
if (!updateImmediately) {
$rootScope.saveInProgress = false;
}
}).catch(function (response) {
console.log('Error occured during form UPDATE.\n');
// console.log(response.data);
err = response.data;
}).finally(function () {
// console.log('finished updating');
if (!updateImmediately) {
$rootScope.saveInProgress = false;
}
if ((typeof cb) === 'function') {
return cb(err);
}
});
}
if ((typeof cb) === 'function') {
return cb(err);
}
});
}
}
};
}
]);
}
]);

View file

@ -14,7 +14,7 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField
/*
** Initialize scope with variables
*/
var newField;
var newField;
//Setup UI-Sortable
$scope.sortableOptions = {
@ -28,8 +28,6 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField
});
},
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',
scope: {
user:'=',
myform: '='
myform: '='
},
controller: function($scope){
$scope.table = {
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({
formId: $stateParams.formId
}, function(form){
$scope.myform = form;
var defaultFormFields = _.cloneDeep($scope.myform.form_fields);
//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;
}
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;
/*
** Analytics Functions
*/
for(var i=0; i<$scope.table.rows.length; i++){
totalTime += $scope.table.rows[i].timeElapsed;
}
$scope.AverageTimeElapsed = (function(){
var totalTime = 0;
var numSubmissions = $scope.table.rows.length;
if(numSubmissions === 0) {
return 0;
}
return (totalTime/numSubmissions).toFixed(0);
})();
for(i=0; i<$scope.table.rows.length; i++){
totalTime += $scope.table.rows[i].timeElapsed;
}
$scope.DeviceStatistics = (function(){
var newStatItem = function(){
return {
visits: 0,
responses: 0,
completion: 0,
average_time: 0,
total_time: 0
};
};
if(numSubmissions === 0) {
return 0;
}
var stats = {
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(){
var newStatItem = function(){
return {
visits: 0,
responses: 0,
completion: 0,
average_time: 0,
total_time: 0
};
};
stats[deviceType].visits++;
var stats = {
desktop: newStatItem(),
tablet: newStatItem(),
phone: newStatItem(),
other: newStatItem()
};
if (visitor.isSubmitted) {
stats[deviceType].total_time = stats[deviceType].total_time + visitor.timeElapsed;
stats[deviceType].responses++;
}
if($scope.myform.analytics && $scope.myform.analytics.visitors) {
var visitors = $scope.myform.analytics.visitors;
for (i = 0; i < visitors.length; i++) {
var visitor = visitors[i];
var deviceType = visitor.deviceType;
if(stats[deviceType].visits) {
stats[deviceType].completion = 100*(stats[deviceType].responses / stats[deviceType].visits).toFixed(2);
}
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) {
stats[deviceType].total_time = stats[deviceType].total_time + visitor.timeElapsed;
stats[deviceType].responses++;
}
var updateFields = $interval(initController, 1000000);
if(stats[deviceType].visits) {
stats[deviceType].completion = 100*(stats[deviceType].responses / stats[deviceType].visits).toFixed(2);
}
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);
}
});
$scope.$on('$destroy', function() {
if (updateFields) {
$interval.cancel($scope.updateFields);
}
});
/*
** Table Functions
@ -174,7 +168,7 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope',
//Export selected submissions of Form
$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';
//TODO: DAVID: URGENT: Make this a $resource that fetches valid field types from server
angular.module('forms').service('FormFields', [
function() {
angular.module('forms').service('FormFields', [ '$filter',
function($filter) {
this.types = [
{
name : 'textfield',
value : 'Short Text'
value : $filter('translate')('SHORT_TEXT'),
},
{
name : 'email',
value : 'Email'
value : $filter('translate')('EMAIL'),
},
{
name : 'radio',
value : 'Multiple Choice'
value : $filter('translate')('MULTIPLE_CHOICE'),
},
{
name : 'dropdown',
value : 'Dropdown'
value : $filter('translate')('DROPDOWN'),
},
{
name : 'date',
value : 'Date'
value : $filter('translate')('DATE'),
},
{
name : 'textarea',
value : 'Paragraph Text'
value : $filter('translate')('PARAGRAPH'),
},
{
name : 'yes_no',
value : 'Yes/No'
value : $filter('translate')('YES_NO'),
},
{
name : 'legal',
value : 'Legal'
value : $filter('translate')('LEGAL'),
},
// {
// name : 'sig',
// value : 'Signature'
// value : $filter('translate')('SIGNATURE'),
// },
// {
// name : 'file',
// value : 'File Upload'
// value : $filter('translate')('FILE_UPLOAD'),
// },
{
name : 'rating',
value : 'Rating'
value : $filter('translate')('RATING'),
},
{
name : 'link',
value : 'Link'
value : $filter('translate')('LINK'),
},
{
name : 'number',
value : 'Numbers'
value : $filter('translate')('NUMBERS'),
},
// {
// name : 'scale',
// value : 'Opinion Scale'
// value : $filter('translate')('OPINION SCALE'),
// },
// {
// name : 'stripe',
// value : 'Payment'
// value : $filter('translate')('PAYMENT'),
// },
{
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">
<uib-tabset active="activePill" vertical="true" type="pills">
<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 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>
</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}}">
<div class="config-form">
<div class="row">
<div class="col-sm-12">
<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="col-sm-12">
{{ 'TELLFORM_URL' | translate }}
@ -87,7 +91,7 @@
</div>
</div>
</uib-tab>
<uib-tab index="1" heading="Embed your Form">
<uib-tab index="1" heading="{{ 'EMBED_YOUR_FORM' | translate }}">
<div class="row">
<div class="col-sm-12">
{{ 'COPY_AND_PASTE' | translate }}
@ -113,7 +117,7 @@
</div>
</div>
</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="row">
<div class="col-md-4 col-sm-12 container">

View file

@ -382,7 +382,7 @@
<div class="row">
<div class="col-md-4 col-xs-12 field-input">{{ 'DISABLED' | translate }}</div>
<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">
<span>
<span> {{ 'OFF' | translate }}</span>

View file

@ -261,7 +261,7 @@
</div>
</div>
<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">
<thead>
<tr>

View file

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

View file

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

View file

@ -1,49 +1,14 @@
(function () {
'use strict';
//Dummy Service for Previewing Form
function SendVisitorData() {
// Create a controller method for sending visitor data
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(){
// Make sure the Socket is connected
/*if (!Socket.socket) {
Socket.connect();
}*/
}
var service = {
@ -54,14 +19,11 @@
return service;
}
// Create the SendVisitorData service
angular
.module('forms')
.factory('SendVisitorData', SendVisitorData);
SendVisitorData.$inject = [];
}());

View file

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

View file

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

View file

@ -86,9 +86,7 @@
scope = el.isolateScope() || el.scope();
scope.update = function(updateImmediately, data, isDiffed, refreshAfterUpdate, cb){
if(cb){
cb();
}
if(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() {
// scope.myStartPage = _.cloneDeep(sampleStartPage);
// console.log(scope.myStartPage);
// var element = angular.element('<entry-page pageData="myStartPage" pageType="startPage"></entry-page>');
// $compile(element)(scope);
// scope.$digest();

View file

@ -35,7 +35,7 @@
it('should be able render all field-icon types', inject(function($compile) {
var currType, currClass;
for(var i=0; i<FormFields.types.length; i++){
currType = FormFields.types[i];
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) {
scope.myfields = FormFields.types;
$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) {
// console.log(FormFields.types);
scope.myfields = FormFields.types;
$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.error).toEqual('');
});
});
it('$scope.reloadForm() should reset and reload form', function(){

View file

@ -12,7 +12,6 @@ angular.module('stateMock').service('$state', function($q){
}else{
throw Error('No more transitions were expected! Tried to transition to '+ stateName );
}
console.log('Mock transition to: ' + stateName);
var deferred = $q.defer();
var promise = deferred.promise;
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() {
// // Forms Controller Spec
// describe('Authentication Controller Tests', function() {
// // Initialize global variables
// var AuthenticationController,
// scope,
// $httpBackend,
// $stateParams,
// $location,
// $state;
(function() {
// Forms Controller Spec
describe('Authentication Controller Tests', function() {
// Initialize global variables
var AuthenticationController,
scope,
$httpBackend,
$stateParams,
$location,
$state;
// var sampleUser = {
// firstName: 'Full',
// lastName: 'Name',
// email: 'test@test.com',
// username: 'test@test.com',
// password: 'password',
// provider: 'local',
// roles: ['user'],
// _id: 'ed873933b1f1dea0ce12fab9'
// };
var sampleUser = {
firstName: 'Full',
lastName: 'Name',
email: 'test@test.com',
username: 'test@test.com',
password: 'password',
provider: 'local',
roles: ['user'],
_id: 'ed873933b1f1dea0ce12fab9'
};
// var sampleForm = {
// title: 'Form Title',
// admin: 'ed873933b1f1dea0ce12fab9',
// language: 'english',
// form_fields: [
// {fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false}
// ],
// _id: '525a8422f6d0f87f0e407a33'
// };
var sampleForm = {
title: 'Form Title',
admin: 'ed873933b1f1dea0ce12fab9',
language: 'english',
form_fields: [
{fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false},
{fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false},
{fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false}
],
_id: '525a8422f6d0f87f0e407a33'
};
// var expectedForm = {
// title: 'Form Title',
// admin: 'ed873933b1f1dea0ce12fab9',
// language: 'english',
// form_fields: [
// {fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false}
// ],
// visible_form_fields: [
// {fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false},
// {fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false}
// ],
// _id: '525a8422f6d0f87f0e407a33'
// };
var expectedForm = {
title: 'Form Title',
admin: 'ed873933b1f1dea0ce12fab9',
language: 'english',
form_fields: [
{fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false},
{fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false},
{fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false}
],
visible_form_fields: [
{fieldType:'textfield', title:'First Name', fieldValue: '', deletePreserved: false},
{fieldType:'checkbox', title:'nascar', fieldValue: '', deletePreserved: false},
{fieldType:'checkbox', title:'hockey', fieldValue: '', deletePreserved: false}
],
_id: '525a8422f6d0f87f0e407a33'
};
// var sampleCredentials = {
// username: sampleUser.username,
// password: sampleUser.password,
// };
var sampleCredentials = {
username: sampleUser.username,
password: sampleUser.password,
};
// // 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
// // 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
// // account and ignores methods.
// beforeEach(function() {
// jasmine.addMatchers({
// toEqualData: function(util, customEqualityTesters) {
// return {
// compare: function(actual, expected) {
// return {
// pass: angular.equals(actual, expected)
// };
// }
// };
// }
// });
// });
// 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
// 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
// account and ignores methods.
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));
// Load the main application module
beforeEach(module(ApplicationConfiguration.applicationModuleName));
// beforeEach(module('stateMock'));
beforeEach(module('stateMock'));
// // Mock Users Service
// beforeEach(module(function($provide) {
// $provide.service('User', function($q) {
// return {
// getCurrent: function() {
// var deferred = $q.defer();
// deferred.resolve( JSON.stringify(sampleUser) );
// return deferred.promise;
// },
// login: function(credentials) {
// var deferred = $q.defer();
// if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){
// deferred.resolve( JSON.stringify(sampleUser) );
// }else {
// deferred.resolve('Error: User could not be loggedin');
// }
// Mock Users Service
beforeEach(module(function($provide) {
$provide.service('User', function($q) {
return {
getCurrent: function() {
var deferred = $q.defer();
deferred.resolve( JSON.stringify(sampleUser) );
return deferred.promise;
},
login: function(credentials) {
var deferred = $q.defer();
if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){
deferred.resolve( JSON.stringify(sampleUser) );
}else {
deferred.resolve('Error: User could not be loggedin');
}
// return deferred.promise;
// },
// logout: function() {
// var deferred = $q.defer();
// deferred.resolve(null);
// return deferred.promise;
// },
// signup: function(credentials) {
// var deferred = $q.defer();
// if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){
// deferred.resolve( JSON.stringify(sampleUser) );
// }else {
// deferred.resolve('Error: User could not be signed up');
// }
return deferred.promise;
},
logout: function() {
var deferred = $q.defer();
deferred.resolve(null);
return deferred.promise;
},
signup: function(credentials) {
var deferred = $q.defer();
if( credentials.password === sampleUser.password && credentials.username === sampleUser.username){
deferred.resolve( JSON.stringify(sampleUser) );
}else {
deferred.resolve('Error: User could not be signed up');
}
// return deferred.promise;
// }
// };
// });
// }));
return deferred.promise;
}
};
});
}));
// // Mock Authentication Service
// beforeEach(module(function($provide) {
// $provide.service('Auth', function() {
// return {
// ensureHasCurrentUser: function() {
// return sampleUser;
// },
// isAuthenticated: function() {
// return true;
// },
// getUserState: function() {
// return true;
// }
// };
// });
// }));
// Mock Authentication Service
beforeEach(module(function($provide) {
$provide.service('Auth', function() {
return {
ensureHasCurrentUser: function() {
return sampleUser;
},
isAuthenticated: function() {
return true;
},
getUserState: function() {
return true;
}
};
});
}));
// // 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, _$state_, _$location_, _$stateParams_, _$httpBackend_, CurrentForm, Forms) {
// // Set a new global scope
// scope = $rootScope.$new();
// scope.abc = 'hello';
// 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, _$state_, _$location_, _$stateParams_, _$httpBackend_, CurrentForm, Forms) {
// Set a new global scope
scope = $rootScope.$new();
scope.abc = 'hello';
// // Point global variables to injected services
// $stateParams = _$stateParams_;
// $httpBackend = _$httpBackend_;
// $location = _$location_;
// $state = _$state_;
// Point global variables to injected services
$stateParams = _$stateParams_;
$httpBackend = _$httpBackend_;
$location = _$location_;
$state = _$state_;
// // $httpBackend.whenGET(/\.html$/).respond('');
// $httpBackend.whenGET('/users/me/').respond('');
// $httpBackend.whenGET(/\.html$/).respond('');
$httpBackend.whenGET('/users/me/').respond('');
// // Initialize the Forms controller.
// AuthenticationController = $controller('AuthenticationController', { $scope: scope });
// }));
// Initialize the Forms controller.
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
// // $state.expectTransitionTo('listForms');
// //Set POST response
// // $httpBackend.expect('POST', '/auth/signin', sampleCredentials).respond(200, sampleUser);
//Set $state transition
// $state.expectTransitionTo('listForms');
//Set POST response
// $httpBackend.expect('POST', '/auth/signin', sampleCredentials).respond(200, sampleUser);
// scope.abc = 'sampleCredentials';
// //Run Controller Logic to Test
// scope.signin();
scope.abc = 'sampleCredentials';
//Run Controller Logic to Test
scope.signin();
// // $httpBackend.flush();
// $httpBackend.flush();
// // Test scope value
// // expect(Auth.ensureHasCurrentUser()).toEqualData(sampleUser);
// }));
// Test scope value
// expect(Auth.ensureHasCurrentUser()).toEqualData(sampleUser);
}));
// });
// }());
});
}());

View file

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