Files
sentcms/public/static/js/require-form.js
2019-07-09 20:39:01 +08:00

179 lines
5.5 KiB
JavaScript

define(['jquery', 'sent', 'validator'], function($, Sent, Validator){
var Form = {
events: {
validator: function (form, success, error, submit) {
if (!form.is("form")){
return;
}
//绑定表单事件
form.validator($.extend({
valid: function (ret) {
var that = this, submitBtn = $("button.submit-btn", form);
that.holdSubmit(true);
submitBtn.addClass("disabled");
//验证通过提交表单
var submitResult = Form.api.submit($(ret), function (data, ret) {
that.holdSubmit(false);
submitBtn.removeClass("disabled");
if (false === $(this).triggerHandler("success.form", [data, ret])) {
return false;
}
if (typeof success === 'function') {
if (false === success.call($(this), data, ret)) {
return false;
}
}
//提示及关闭当前窗口
var msg = ret.hasOwnProperty("msg") && ret.msg !== "" ? ret.msg : 'Operation completed';
parent.Toastr.success(msg);
parent.$(".btn-refresh").trigger("click");
var index = parent.Layer.getFrameIndex(window.name);
parent.Layer.close(index);
return false;
}, function(data, ret){
that.holdSubmit(false);
if (false === $(this).triggerHandler("error.form", [data, ret])) {
return false;
}
submitBtn.removeClass("disabled");
if (typeof error === 'function') {
if (false === error.call($(this), data, ret)) {
return false;
}
}
}, submit)
//如果提交失败则释放锁定
if (!submitResult) {
that.holdSubmit(false);
submitBtn.removeClass("disabled");
}
return false;
}
}, form.data("validator-options") || {}))
//移除提交按钮的disabled类
$(".layer-footer [type=submit],.fixed-footer [type=submit],.normal-footer [type=submit]", form).removeClass("disabled");
},
cxselect: function (form) {
//绑定cxselect元素事件
if ($("[data-toggle='cxselect']", form).size() > 0) {
require(['cxselect'], function () {
$.cxSelect.defaults.jsonName = 'name';
$.cxSelect.defaults.jsonValue = 'value';
$.cxSelect.defaults.jsonSpace = 'data';
$("[data-toggle='cxselect']", form).cxSelect();
});
}
},
switcher: function (form) {
form.on("click", "[data-toggle='switcher']", function () {
if ($(this).hasClass("disabled")) {
return false;
}
var input = $(this).prev("input");
input = $(this).data("input-id") ? $("#" + $(this).data("input-id")) : input;
if (input.size() > 0) {
var yes = $(this).data("yes");
var no = $(this).data("no");
if (input.val() == yes) {
input.val(no);
$("i", this).addClass("fa-flip-horizontal text-gray");
} else {
input.val(yes);
$("i", this).removeClass("fa-flip-horizontal text-gray");
}
input.trigger('change');
}
return false;
});
},
bindevent: function (form) {
},
},
api:{
submit: function (form, success, error, submit) {
if (form.size() === 0) {
Toastr.error("表单未初始化完成,无法提交");
return false;
}
if (typeof submit === 'function') {
if (false === submit.call(form, success, error)) {
return false;
}
}
var type = form.attr("method") ? form.attr("method").toUpperCase() : 'GET';
type = type && (type === 'GET' || type === 'POST') ? type : 'GET';
url = form.attr("action");
url = url ? url : location.href;
//修复当存在多选项元素时提交的BUG
var params = {};
var multipleList = $("[name$='[]']", form);
if (multipleList.size() > 0) {
var postFields = form.serializeArray().map(function (obj) {
return $(obj).prop("name");
});
$.each(multipleList, function (i, j) {
if (postFields.indexOf($(this).prop("name")) < 0) {
params[$(this).prop("name")] = '';
}
});
}
//调用Ajax请求方法
Sent.api.ajax({
type: type,
url: url,
data: form.serialize() + (Object.keys(params).length > 0 ? '&' + $.param(params) : ''),
dataType: 'json',
complete: function (xhr) {
var token = xhr.getResponseHeader('__token__');
if (token) {
$("input[name='__token__']", form).val(token);
}
}
}, function (data, ret) {
$('.form-group', form).removeClass('has-feedback has-success has-error');
if (data && typeof data === 'object') {
//刷新客户端token
if (typeof data.token !== 'undefined') {
$("input[name='__token__']", form).val(data.token);
}
//调用客户端事件
if (typeof data.callback !== 'undefined' && typeof data.callback === 'function') {
data.callback.call(form, data);
}
}
if (typeof success === 'function') {
if (false === success.call(form, data, ret)) {
return false;
}
}
}, function (data, ret) {
if (data && typeof data === 'object' && typeof data.token !== 'undefined') {
$("input[name='__token__']", form).val(data.token);
}
if (typeof error === 'function') {
if (false === error.call(form, data, ret)) {
return false;
}
}
});
return true;
},
bindevent: function (form, success, error, submit) {
form = typeof form === 'object' ? form : $(form);
var events = Form.events;
events.bindevent(form);
events.validator(form, success, error, submit);
events.cxselect(form);
events.switcher(form);
}
}
}
return Form;
})