2015-06-29 15:51:29 -07:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Module dependencies.
|
|
|
|
*/
|
|
|
|
var mongoose = require('mongoose'),
|
|
|
|
FieldSchema = require('./form_field.server.model.js'),
|
|
|
|
Schema = mongoose.Schema,
|
|
|
|
pdfFiller = require('pdfFiller'),
|
|
|
|
_ = require('lodash'),
|
|
|
|
config = require('../../config/config'),
|
|
|
|
path = require('path'),
|
2015-06-30 07:21:53 -07:00
|
|
|
fs = require('fs-extra'),
|
|
|
|
Field = mongoose.model('Field', FieldSchema);
|
2015-06-29 15:51:29 -07:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Form Schema
|
|
|
|
*/
|
|
|
|
var FormSchema = new Schema({
|
|
|
|
created: {
|
|
|
|
type: Date,
|
|
|
|
default: Date.now
|
|
|
|
},
|
2015-07-01 20:50:57 -07:00
|
|
|
lastModified: {
|
|
|
|
type: Date,
|
|
|
|
default: Date.now
|
|
|
|
},
|
2015-06-29 15:51:29 -07:00
|
|
|
title: {
|
|
|
|
type: String,
|
|
|
|
default: '',
|
|
|
|
trim: true,
|
|
|
|
unique: true,
|
|
|
|
required: 'Title cannot be blank'
|
|
|
|
},
|
|
|
|
description: {
|
|
|
|
type: String,
|
|
|
|
default: '',
|
|
|
|
},
|
2015-06-30 10:36:51 -07:00
|
|
|
form_fields: [{type: Schema.Types.Mixed}],
|
2015-06-29 15:51:29 -07:00
|
|
|
|
2015-06-29 19:14:43 -07:00
|
|
|
submissions: [{
|
2015-06-29 15:51:29 -07:00
|
|
|
type: Schema.Types.ObjectId,
|
|
|
|
ref: 'FormSubmission'
|
|
|
|
}],
|
|
|
|
|
|
|
|
admin: {
|
|
|
|
type: Schema.Types.ObjectId,
|
|
|
|
ref: 'User'
|
|
|
|
},
|
|
|
|
|
|
|
|
pdf: {
|
|
|
|
type: Schema.Types.Mixed
|
|
|
|
},
|
|
|
|
pdfFieldMap: {
|
|
|
|
type: Schema.Types.Mixed
|
|
|
|
},
|
2015-06-30 04:05:44 -07:00
|
|
|
hideFooter: {
|
|
|
|
type: Boolean,
|
|
|
|
default: true,
|
|
|
|
},
|
2015-06-29 15:51:29 -07:00
|
|
|
isGenerated: {
|
|
|
|
type: Boolean,
|
|
|
|
default: false,
|
|
|
|
},
|
2015-07-01 19:49:35 -07:00
|
|
|
isLive: {
|
|
|
|
type: Boolean,
|
|
|
|
default: true,
|
|
|
|
},
|
2015-06-29 15:51:29 -07:00
|
|
|
autofillPDFs: {
|
|
|
|
type: Boolean,
|
|
|
|
default: false,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2015-07-02 16:34:00 -07:00
|
|
|
//Create folder for user's pdfs
|
|
|
|
FormSchema.pre('save', function (next) {
|
|
|
|
var newDestination = path.join(config.pdfUploadPath, this.admin.username.trim()),
|
|
|
|
stat = null;
|
|
|
|
|
|
|
|
try {
|
|
|
|
stat = fs.statSync(newDestination);
|
|
|
|
} catch (err) {
|
|
|
|
fs.mkdirSync(newDestination);
|
|
|
|
}
|
|
|
|
if (stat && !stat.isDirectory()) {
|
|
|
|
console.log('Directory cannot be created');
|
|
|
|
next( new Error('Directory cannot be created because an inode of a different type exists at "' + newDestination + '"') );
|
|
|
|
}else{
|
|
|
|
next();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
|
2015-07-01 20:50:57 -07:00
|
|
|
//Update lastModified everytime we save
|
|
|
|
FormSchema.pre('save', function (next) {
|
|
|
|
this.lastModified = Date.now();
|
|
|
|
next();
|
|
|
|
});
|
|
|
|
|
|
|
|
//Move PDF to permanent location after new template is uploaded
|
2015-06-29 15:51:29 -07:00
|
|
|
FormSchema.pre('save', function (next) {
|
|
|
|
|
2015-07-02 16:34:00 -07:00
|
|
|
console.log(this.pdf);
|
|
|
|
console.log("isModified: "+this.isModified('pdf'));
|
|
|
|
var that = this;
|
2015-06-29 15:51:29 -07:00
|
|
|
if(this.pdf){
|
2015-07-02 16:34:00 -07:00
|
|
|
if(this.isModified('pdf')){
|
2015-06-29 15:51:29 -07:00
|
|
|
|
2015-07-02 16:34:00 -07:00
|
|
|
var new_filename = this.title.trim()+'_template.pdf';
|
2015-06-29 15:51:29 -07:00
|
|
|
|
2015-07-02 16:34:00 -07:00
|
|
|
var newDestination = path.join(config.pdfUploadPath, this.admin.username.trim(), this.title.trim()),
|
2015-06-29 15:51:29 -07:00
|
|
|
stat = null;
|
|
|
|
|
|
|
|
try {
|
|
|
|
stat = fs.statSync(newDestination);
|
|
|
|
} catch (err) {
|
|
|
|
fs.mkdirSync(newDestination);
|
|
|
|
}
|
|
|
|
if (stat && !stat.isDirectory()) {
|
2015-07-02 16:34:00 -07:00
|
|
|
console.log('Directory '+newDestination+' cannot be created');
|
2015-06-29 15:51:29 -07:00
|
|
|
next( new Error('Directory cannot be created because an inode of a different type exists at "' + config.pdfUploadPath + '"') );
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log('about to move PDF');
|
2015-07-02 16:34:00 -07:00
|
|
|
//Move pdf to permanent location
|
2015-06-29 15:51:29 -07:00
|
|
|
fs.move(this.pdf.path, path.join(newDestination, new_filename), function (err) {
|
2015-07-02 16:34:00 -07:00
|
|
|
// if (err) {
|
|
|
|
// console.error(err);
|
|
|
|
// next( new Error(err.message) );
|
|
|
|
// }
|
|
|
|
|
|
|
|
// //Delete old pdf file
|
|
|
|
// fs.unlink(that.pdf.path, function(err){
|
|
|
|
if (err) {
|
|
|
|
console.error(err);
|
|
|
|
next( new Error(err.message) );
|
|
|
|
}
|
|
|
|
|
|
|
|
// console.log('successfully deleted', that.pdf.path);
|
|
|
|
|
|
|
|
that.pdf.path = path.join(newDestination, new_filename);
|
|
|
|
that.pdf.name = new_filename;
|
2015-06-29 15:51:29 -07:00
|
|
|
|
2015-07-02 16:34:00 -07:00
|
|
|
console.log('\n\n PDF file:'+that.pdf.name+' successfully moved to: '+that.pdf.path);
|
2015-06-29 15:51:29 -07:00
|
|
|
|
2015-07-02 16:34:00 -07:00
|
|
|
next();
|
|
|
|
// });
|
2015-06-29 19:14:43 -07:00
|
|
|
|
2015-06-29 15:51:29 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
}else {
|
|
|
|
next();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2015-07-01 19:49:35 -07:00
|
|
|
//Delete template PDF of current Form
|
|
|
|
FormSchema.pre('remove', function (next) {
|
|
|
|
if(this.pdf){
|
|
|
|
//Delete template form
|
|
|
|
fs.unlink(this.pdf.path, function(err){
|
|
|
|
if (err) throw err;
|
|
|
|
console.log('successfully deleted', this.pdf.path);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2015-06-29 19:14:43 -07:00
|
|
|
//Autogenerate FORM from PDF if 'isGenerated' flag is 'true'
|
|
|
|
FormSchema.pre('save', function (next) {
|
2015-06-30 04:05:44 -07:00
|
|
|
var field, _form_fields;
|
2015-06-29 19:14:43 -07:00
|
|
|
|
|
|
|
if(this.isGenerated && this.pdf){
|
2015-06-29 15:51:29 -07:00
|
|
|
|
2015-06-29 19:14:43 -07:00
|
|
|
var _typeConvMap = {
|
2015-06-30 07:21:53 -07:00
|
|
|
'Multiline': 'textarea',
|
2015-06-29 19:14:43 -07:00
|
|
|
'Text': 'textfield',
|
2015-06-30 07:21:53 -07:00
|
|
|
'Button': 'checkbox',
|
|
|
|
'Choice': 'radio',
|
|
|
|
'Password': 'password',
|
|
|
|
'FileSelect': 'filefield',
|
|
|
|
'Radio': 'radio'
|
2015-06-29 19:14:43 -07:00
|
|
|
};
|
2015-06-29 15:51:29 -07:00
|
|
|
|
2015-06-29 19:14:43 -07:00
|
|
|
var that = this;
|
|
|
|
console.log('autogenerating form');
|
2015-06-29 15:51:29 -07:00
|
|
|
|
2015-06-29 19:14:43 -07:00
|
|
|
try {
|
|
|
|
pdfFiller.generateFieldJson(this.pdf.path, function(_form_fields){
|
2015-06-29 15:51:29 -07:00
|
|
|
|
2015-06-29 19:14:43 -07:00
|
|
|
//Map PDF field names to FormField field names
|
|
|
|
for(var i = 0; i < _form_fields.length; i++){
|
|
|
|
field = _form_fields[i];
|
2015-06-29 15:51:29 -07:00
|
|
|
|
2015-06-29 19:14:43 -07:00
|
|
|
//Convert types from FDF to 'FormField' types
|
|
|
|
if(_typeConvMap[ field.fieldType+'' ]){
|
2015-06-30 00:28:29 -07:00
|
|
|
field.fieldType = _typeConvMap[ field.fieldType+'' ];
|
2015-06-29 19:14:43 -07:00
|
|
|
}
|
2015-06-29 15:51:29 -07:00
|
|
|
|
2015-06-29 19:14:43 -07:00
|
|
|
field.fieldValue = '';
|
2015-06-30 10:36:51 -07:00
|
|
|
field.created = Date.now();
|
|
|
|
field.required = true;
|
|
|
|
field.disabled = false;
|
2015-06-29 15:51:29 -07:00
|
|
|
|
2015-06-29 19:14:43 -07:00
|
|
|
// field = new Field(field);
|
2015-06-30 04:05:44 -07:00
|
|
|
// field.save(function(err) {
|
|
|
|
// if (err) {
|
|
|
|
// console.error(err.message);
|
|
|
|
// throw new Error(err.message);
|
|
|
|
// });
|
|
|
|
// } else {
|
|
|
|
// _form_fields[i] = this;
|
|
|
|
// }
|
|
|
|
// });
|
|
|
|
_form_fields[i] = field;
|
2015-06-29 19:14:43 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
console.log('NEW FORM_FIELDS: ');
|
|
|
|
console.log(_form_fields);
|
2015-06-29 15:51:29 -07:00
|
|
|
|
2015-06-29 19:14:43 -07:00
|
|
|
console.log('\n\nOLD FORM_FIELDS: ');
|
|
|
|
console.log(that.form_fields);
|
2015-06-29 15:51:29 -07:00
|
|
|
|
2015-06-29 19:14:43 -07:00
|
|
|
that.form_fields = _form_fields;
|
|
|
|
next();
|
|
|
|
});
|
|
|
|
} catch(err){
|
|
|
|
next( new Error(err.message) );
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//Throw error if we encounter form with invalid type
|
|
|
|
next();
|
|
|
|
});
|
2015-06-29 15:51:29 -07:00
|
|
|
|
2015-06-29 19:14:43 -07:00
|
|
|
FormSchema.methods.convertToFDF = function (cb) {
|
2015-06-29 15:51:29 -07:00
|
|
|
var _keys = _.pluck(this.form_fields, 'title'),
|
|
|
|
_values = _.pluck(this.form_fields, 'fieldValue');
|
|
|
|
|
|
|
|
_values.forEach(function(val){
|
|
|
|
if(val === true){
|
|
|
|
val = 'Yes';
|
|
|
|
}else if(val === false) {
|
|
|
|
val = 'Off';
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
var jsonObj = _.zipObject(_keys, _values);
|
|
|
|
|
|
|
|
return jsonObj;
|
|
|
|
};
|
|
|
|
|
|
|
|
mongoose.model('Form', FormSchema);
|