X-Git-Url: http://git.onelab.eu/?p=myops.git;a=blobdiff_plain;f=web%2Fquery%2Fvendor%2Fcouchapp%2Flib%2Fdocform.js;fp=web%2Fquery%2Fvendor%2Fcouchapp%2Flib%2Fdocform.js;h=84a9af72c6d10293b227da0419b12a9e0f5dc13c;hp=0000000000000000000000000000000000000000;hb=85070b3d456667f238051af1a2f1f2a0c12300ab;hpb=607f0e13927eb18075c375fa9ba5527da4fcbb44 diff --git a/web/query/vendor/couchapp/lib/docform.js b/web/query/vendor/couchapp/lib/docform.js new file mode 100644 index 0000000..84a9af7 --- /dev/null +++ b/web/query/vendor/couchapp/lib/docform.js @@ -0,0 +1,121 @@ +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +// turn the form into deep json +// field names like 'author-email' get turned into json like +// {"author":{"email":"quentin@example.com"}} +// acts on doc by reference, so you can safely pass non-form fields through + +function docForm(formSelector, opts) { + var localFormDoc = {}; + opts = opts || {}; + opts.fields = opts.fields || []; + + // turn the form into deep json + // field names like 'author-email' get turned into json like + // {"author":{"email":"quentin@example.com"}} + function formToDeepJSON(form, fields, doc) { + form = $(form); + fields.forEach(function(field) { + var element = form.find("[name="+field+"]"), + parts = field.split('-'), + frontObj = doc, frontName = parts.shift(); + + if (element.attr('type') === 'checkbox') { + var val = element.attr('checked'); + } else { + var val = element.val(); + if (!val) { + if (frontObj[field]) { + delete frontObj[field]; + } + return; + } + } + + while (parts.length > 0) { + frontObj[frontName] = frontObj[frontName] || {}; + frontObj = frontObj[frontName]; + frontName = parts.shift(); + } + frontObj[frontName] = val; + }); + } + + // Apply the behavior + $(formSelector).submit(function(e) { + e.preventDefault(); + if (opts.validate && opts.validate() == false) { return false;} + // formToDeepJSON acts on localFormDoc by reference + formToDeepJSON(this, opts.fields, localFormDoc); + if (opts.beforeSave) {opts.beforeSave(localFormDoc);} + db.saveDoc(localFormDoc, { + success : function(resp) { + if (opts.success) {opts.success(resp, localFormDoc);} + } + }); + + return false; + }); + + // populate form from an existing doc + function docToForm(doc) { + var form = $(formSelector); + // fills in forms + opts.fields.forEach(function(field) { + var parts = field.split('-'); + var run = true, frontObj = doc, frontName = parts.shift(); + while (frontObj && parts.length > 0) { + frontObj = frontObj[frontName]; + frontName = parts.shift(); + } + if (frontObj && frontObj[frontName]) { + var element = form.find("[name="+field+"]"); + if (element.attr('type') === 'checkbox') { + element.attr('checked', frontObj[frontName]); + } else { + element.val(frontObj[frontName]); + } + } + }); + } + + if (opts.id) { + db.openDoc(opts.id, { + attachPrevRev : opts.attachPrevRev, + error: function() { + if (opts.error) {opts.error.apply(opts, arguments);} + }, + success: function(doc) { + if (opts.load || opts.onLoad) {(opts.load || opts.onLoad)(doc);} + localFormDoc = doc; + docToForm(doc); + }}); + } else if (opts.template) { + if (opts.load || opts.onLoad) {(opts.load || opts.onLoad)(opts.template);} + localFormDoc = opts.template; + docToForm(localFormDoc); + } + var instance = { + deleteDoc : function(opts) { + opts = opts || {}; + if (confirm("Really delete this document?")) { + db.removeDoc(localFormDoc, opts); + } + }, + localDoc : function() { + formToDeepJSON(formSelector, opts.fields, localFormDoc); + return localFormDoc; + } + }; + return instance; +} \ No newline at end of file