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")
},
reset: function(){
this.$("input,textarea").not("[type='submit']").not("[type='hidden']").val("")
},
showErrors: function(errors){
if (errors && errors.length) {
this.$errors.empty();
for (var i in errors) {
this.$errors.append('
' + errors[i] + '
');
}
this.$errors.css("opacity", 1.0);
setTimeout(function(){
this.$errors.show().css("opacity", 1.0);
}.bind(this), 200)
}
},
serialize: function(){
var fd, fh, hasCSRF = false
var file_els = this.$("input[name][type='file']")
if (file_els.length) {
fd = new FormData()
}
else {
fh = {}
}
this.$("input[name], select[name], textarea[name]").each( function(){
if (this.type == "file") {
for (var i = 0; i < this.files.length; i++) {
fd.append(this.name, this.files[i]);
}
}
else {
if (fd) {
fd.append(this.name, this.value)
} else {
fh[this.name] = this.value
}
hasCSRF = hasCSRF || this.name == "_csrf"
}
});
if (! hasCSRF) {
if (fd) {
fd.append("_csrf", $("[name=_csrf]").attr("value"))
} else {
fh["_csrf"] = $("[name=_csrf]").attr("value")
}
}
return fd || JSON.stringify(fh)
},
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 data = this.serialize()
var headers = new Headers()
headers.append("csrf-token", $("[name=_csrf]").attr("value"))
if (typeof data === "string") {
headers.append("content-type", "application/json")
}
fetch(action, {
method: this.method.toUpperCase(),
headers: headers,
credentials: 'same-origin',
body: data,
}).then(raw => raw.json())
.then(response => {
if (response.error) {
var errors = []
if (response.error.errors && response.error.errors.length) {
for (var key in response.error.errors) {
errors.push(response.error.errors[key].message);
}
} else {
errors.push(response.error)
}
if (errorCallback) {
errorCallback(errors)
}
else {
this.showErrors(errors)
}
return
}
if (successCallback) {
successCallback(response)
}
if (this.success) {
this.success(response)
}
}).catch(response => {
console.log(response)
var errors = []
if (response.error) {
if (response.error.errors && response.error.errors.length) {
for (var key in response.error.errors) {
errors.push(response.error.errors[key].message);
}
}
else {
errors.push(response.error)
}
}
if (errorCallback) {
errorCallback(errors)
}
else {
this.showErrors(errors)
}
})
// complete: function(response){
// if (this.useMinotaur) {
// Minotaur.hide()
// }
// }
//
// if (this.useMinotaur) {
// Minotaur.show()
// }
this.beforeSend && this.beforeSend()
},
})
/*
var ModalFormView = ModalView.extend(FormView.prototype).extend({
load: function(){
this.reset()
this.show()
}
})
*/