tools
Version:
Install for the tools
274 lines (224 loc) • 5.76 kB
JavaScript
var recline = require('recline'),
_ = require("underscore");
exports.dbName = function(db) {
this.dbname = db;
}
exports.get = function(id, cb){
var form = this.form(id, cb);
this.formSetup(form,"get",null,form.parseFields,cb);
return form;
}
exports.save = function(id, body, cb){
var form = this.form(id, cb);
this.formSetup(form,"save",body,form.validateFields,cb);
return form;
}
exports.create = function(id,body,cb){
var form = this.form(id,cb);
this.formSetup(form,"create",body,form.validateFormSchema,cb);
return form;
}
exports.formSetup = function(form,type,body,process,cb){
var dbname = this.dbname || 'forms';
if(body){
if(typeof body === "object"){
form.body = body;
}else{
form.body = JSON.parse(body);
}
}
if(cb){
form.cb = cb;
}else{
form.cb = null;
}
form.db = recline[dbname];
form.type = type;
form.getOr404(process);
}
exports.form = function(id){
var self = this;
if(typeof id != 'string') {
throw new Error("id must be string");
}
var
fClient = new Forms();
fClient.__defineGetter__('id', function(){
return id;
});
fClient._compileTemplate = function(type, stub){
var compiled = _.template(recline.fields.lookup(type));
return compiled(stub);
}
fClient._parseArgs = function(args){
var $ = {};
for(var key in args){
// Annoying fix just for jsdoc
if(_.isFunction(args[key])) $.cb = args[key];
if(_.isBoolean(args[key])) $["switch"] = args[key];
if(_.isString(args[key])) $.id = args[key];
}
return $;
}
fClient._saveData = function(){
var self = fClient;
fClient.db.saveDoc(_.extend(self.body, {"form_parent": self.id,"type":"form_child"}), function(er,res){
if(er){
self.error = true;
self.response();
}else{
self.output = { "redirect" : self.data.response.redirect };
self.response();
}
});
}
return fClient;
}
var Forms = exports.Forms = function(){
}
Forms.prototype.getOr404 = function(next){
var self = this;
self.db.getDoc(this.id, function(er,res){
if(er) {
if(self.type != "create"){
self.error = 404;
self.response();
}else
{
_.bind(next, self)();
}
}else{
if(self.type != "create"){
self.data = res;
self.rev = self.data._rev;
_.bind(next, self)();
}else{
self.error = {"exists":"form already exists"};
self.response();
}
}
});
}
Forms.prototype.parseFields = function(){
var self = this;
if(typeof self.fields === "undefined"){
self.fields = [];
}
for(var key in self.data.fields){
var type = self.data.fields[key].type;
var stub = _.extend({ name: key }, _.clone(self.data.fields[key]));
//console.log(stub);
var field = [];
field.push(this._compileTemplate("label", stub));
if(type == "radios"){
var l = self.data.fields[key].options.length;
var radios = [];
for(var i=0;i<l;i++){
var _r = { name: key, value: self.data.fields[key].options[i], _id: key+"_"+i };
radios.push(this._compileTemplate(type,_r));
var _r = { name: key+"_"+i, label: self.data.fields[key].options[i] };
radios.push(this._compileTemplate("label", _r));
}
field.push(radios);
}
else if(type == "select"){
var l = self.data.fields[key].options.length;
var select = [this._compileTemplate(type,stub)];
for(var i=0;i<l;i++){
var _s = { value: self.data.fields[key].options[i] };
select.push(this._compileTemplate("option",_s));
}
select.push("</select>");
field.push(select);
}
else
{
field.push(this._compileTemplate(type,stub));
}
if(typeof self.data.fields[key].invalid === "string"){
field.push(this._compileTemplate("invalid", stub));
}
this.fields.push(field);
}
self.response();
/*
recline.tmpl.get(self.data.template, function(er,res){
if(er) {
self.error = er;
self.response();
}
else{
this.parseForm(self, function(er,res){
if(er){ self.error = true; self.response(); }else{
self.response();
}
});
}
});
*/
}
Forms.prototype.validateFields = function(){
var self = this;
var isValid = true;
for(var key in self.data.fields){
if(self.data.fields[key].required){
var validation = recline.validations.lookup(self.data.fields[key].type);
if(typeof self.body[key] === "undefined"){
self.data.fields[key].invalid = validation[1];
isValid = false;
}else
{
var r = new RegExp(validation[0]);
if(!r.test(self.body[key])){
isValid = false;
self.data.fields[key].invalid = validation[1];
}
}
}
}
//
// else{
// if(self.data.fields[key].primary){
// // var members = recline.module("members");
// // members.get("todd@toddm.me", function(er,data){
// // if(er){
// // //self.error = er;
// // //self.response();
// // }else{
// // this.registerFormSubmission(self.id);
// // }
// // });
// }
// }
if(!isValid){
self.parseFields();
}else{
self._saveData();
}
}
Forms.prototype.validateFormSchema = function() {
var self = this;
if(typeof self.body.title === "undefined" || typeof self.body.fields === "undefined" || _.size(self.body.fields) < 1) {
self.error = {"error" : "body does not meet conditions, either title not set or no fields"};
self.response();
}else{
// add some basic preconditions to the form schema in case they were missed.
self.db.saveDoc(self.id,self.body,function(er,res){
if(er){
self.error = er;
self.response();
}else
{
self.response();
}
})
}
}
Forms.prototype.response = function(){
var self = this;
if(self.error){
self.cb && _.bind(self.cb, self, self.error, null)();
}else{
self.cb && _.bind(self.cb,self, null, self.data)();
}
}