UNPKG

tools

Version:

Install for the tools

274 lines (224 loc) 5.76 kB
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)(); } }