diff options
Diffstat (limited to 'public/assets/js/view/formview.js')
| -rw-r--r-- | public/assets/js/view/formview.js | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/public/assets/js/view/formview.js b/public/assets/js/view/formview.js new file mode 100644 index 0000000..05b1ecb --- /dev/null +++ b/public/assets/js/view/formview.js @@ -0,0 +1,146 @@ +var FormView = View.extend({ + + method: "post", + useMinotaur: false, + + events: { + "submit form": "save" + }, + + initialize: function(opt){ + if (opt && opt.parent) { + this.parent = opt.parent + } + this.$form = this.$("form") + this.$errors = this.$(".errors") + this.$errorList = this.$(".errorList") + }, + + reset: function(){ + this.$("input,textarea").not("[type='submit']").not("[type='hidden']").val("") + }, + + showErrors: function(errors){ + if (errors && errors.length) { + this.$errorList.empty(); + for (var i in errors) { + this.$errorList.append('<div>' + errors[i] + '</div>'); + } + this.$errors.css("opacity", 1.0); + setTimeout(function(){ + this.$errors.show().css("opacity", 1.0); + }.bind(this), 200) + } + }, + + serialize: function(){ + var fd = new FormData(), hasCSRF = false + + this.$("input[name], select[name], textarea[name]").each( function(){ + if (this.type == "file") { + if (this.files.length > 0) { + fd.append(this.name, this.files[0]); + } + } + else if (this.type == "password") { + if (this.value.length > 0) { + fd.append(this.name, SHA1.hex('bucky$' + this.value + '$bucky')) + } + } + else { + fd.append(this.name, this.value); + hasCSRF = hasCSRF || this.name == "_csrf" + } + }); + +// if (! hasCSRF) { +// fd.append("_csrf", $("[name=_csrf]").attr("value")) +// } +// + return fd + }, + + save: function(e, successCallback, errorCallback){ + e && e.preventDefault() + + this.$errors.hide().css("opacity", 0.0); + + if (this.validate) { + var errors = this.validate() + if (errors && errors.length) { + if (errorCallback) { + errorCallback(errors) + } + else { + this.showErrors(errors) + } + return + } + } + + var action = typeof this.action == "function" ? this.action() : this.action + if (! action) return + + var request = $.ajax({ + url: action, + type: this.method, + data: this.serialize(), + headers: { "csrf-token": $("[name=_csrf]").attr("value") }, + dataType: "json", + processData: false, + contentType: false, + success: function(response){ + + if (response.error) { + var errors = [] + for (var key in response.error.errors) { + errors.push(response.error.errors[key].message); + } + if (errorCallback) { + errorCallback(errors) + } + else { + this.showErrors(errors) + } + return + } + else { + if (successCallback) { + successCallback(response) + } + if (this.success) { + this.success(response) + } + } + + + }.bind(this), + error: function(response){ + }.bind(this), + complete: function(response){ + if (this.useMinotaur) { + Minotaur.hide() + } + }.bind(this), + }) + + if (this.useMinotaur) { + Minotaur.show() + } + + }, + +}) + +/* + +var ModalFormView = ModalView.extend(FormView.prototype).extend({ + + load: function(){ + this.reset() + this.show() + } + +}) + +*/
\ No newline at end of file |
