OpenAuth.Net/OpenAuth.Mvc/BJUI/js/bjui-ajax.js

785 lines
30 KiB
JavaScript
Raw Normal View History

2015-11-13 21:33:53 +08:00
/*!
* B-JUI v1.2 (http://b-jui.com)
* Git@OSC (http://git.oschina.net/xknaan/B-JUI)
* Copyright 2014 K'naan (xknaan@163.com).
* Licensed under Apache (http://www.apache.org/licenses/LICENSE-2.0)
*/
/* ========================================================================
* B-JUI: bjui-ajax.js v1.2
* @author K'naan (xknaan@163.com)
* -- Modified from dwz.ajax.js (author:ZhangHuihua@msn.com)
* http://git.oschina.net/xknaan/B-JUI/blob/master/BJUI/js/bjui-ajax.js
* ========================================================================
* Copyright 2014 K'naan.
* Licensed under Apache (http://www.apache.org/licenses/LICENSE-2.0)
* ======================================================================== */
+function ($) {
'use strict';
// BJUIAJAX GLOBAL ELEMENTS
// ======================
var autorefreshTimer
// BJUIAJAX CLASS DEFINITION
// ======================
var Bjuiajax = function(element, options) {
var $this = this
this.$element = $(element)
this.options = options
this.tools = this.TOOLS()
}
Bjuiajax.DEFAULTS = {
reload : true,
loadingmask : true
}
Bjuiajax.NAVTAB = 'navtab'
Bjuiajax.prototype.TOOLS = function() {
var that = this
var tools = {
getPagerForm: function($parent, args) {
var form = $parent.isTag('form') ? $parent[0] : $parent.find('#pagerForm:first')[0]
var pageInfo = $.extend({}, BJUI.pageInfo)
if ($parent.data('bjui.clientPaging')) {
args = $.extend({}, $parent.data('bjui.clientPaging'), args)
$parent.data('bjui.clientPaging', args)
}
if (form) {
for (var key in pageInfo) {
var val = ''
if (args && args[key]) val = args[key]
if (!form[pageInfo[key]]) $('<input type="hidden" name="'+ pageInfo[key] +'" value="'+ val +'">').appendTo($(form))
else if (val) form[pageInfo[key]].value = val
}
}
return form
},
getTarget: function() {
if (that.$element.closest('.navtab-panel').length) return Bjuiajax.NAVTAB
else return 'dialog'
}
}
return tools
}
Bjuiajax.prototype.ajaxForm = function(options) {
var that = this
var $form = this.$element,
callback = options && options.callback,
enctype = $form.attr('enctype')
options = $.extend({}, that.options, typeof options == 'object' && options)
if (callback) callback = callback.toFunc()
var successFn = function(data, textStatus, jqXHR) {
callback ? callback.apply(that, [data, $form]) : $.proxy(that.ajaxCallback(data), that)
}
var _submitFn = function() {
var op = {loadingmask:options.loadingmask, type:$form.attr('method'), url:$form.attr('action'), callback:successFn, error:$.proxy(that.ajaxError, that)}
if (enctype && enctype == 'multipart/form-data') {
if (window.FormData) {
$.extend(op, {data:new FormData($form[0]), contentType:false, processData:false})
} else {
$.extend(op, {data:$form.serializeArray(), files:$form.find(':file'), iframe:true, processData:false})
}
} else {
$.extend(op, {data:$form.serializeArray()})
}
$form.doAjax(op)
}
if (options.confirmMsg) {
$form.alertmsg('confirm', options.confirmMsg, {okCall: _submitFn})
} else {
_submitFn()
}
}
Bjuiajax.prototype.ajaxDone = function(json) {
var $element = this.$element
if (json[BJUI.keys.statusCode] == BJUI.statusCode.error) {
if (json[BJUI.keys.message]) $element.alertmsg('error', json[BJUI.keys.message])
} else if (json[BJUI.keys.statusCode] == BJUI.statusCode.timeout) {
$element.alertmsg('info', json[BJUI.keys.message] || FRAG.sessionTimout)
BJUI.loadLogin()
} else {
if (json[BJUI.keys.message]) $element.alertmsg('correct', json[BJUI.keys.message])
}
}
Bjuiajax.prototype.ajaxError = function(xhr, ajaxOptions, thrownError) {
var msg = xhr.responseText.trim()
if (msg.startsWith('{')) {
this.ajaxDone(msg.toObj())
} else {
this.$element.alertmsg('error', '<div>Http status: ' + xhr.status + ' ' + xhr.statusText + '</div>'
+ '<div>ajaxOptions: '+ ajaxOptions +' </div>'
+ '<div>thrownError: '+ thrownError +' </div>'
+ '<div>'+ msg +'</div>')
}
}
Bjuiajax.prototype.ajaxCallback = function(json) {
var that = this
var $element = that.$element
var $target = $element.closest('.bjui-layout')
that.ajaxDone(json)
if (json[BJUI.keys.statusCode] == BJUI.statusCode.ok) {
if ($target && $target.length) {
that.divCallback(json, $target)
} else {
if (that.tools.getTarget() == Bjuiajax.NAVTAB) {
that.navtabCallback(json)
} else {
that.dialogCallback(json)
}
}
}
}
Bjuiajax.prototype.divCallback = function(json, $target) {
var that = this
if (json.tabid)
setTimeout(function() { that.$element.navtab('reloadFlag', json.tabid) }, 100)
if (json.dialogid)
setTimeout(function() { that.$element.dialog('refresh', json.dialogid) }, 100)
if (json.divid)
setTimeout(function() { that.$element.bjuiajax('refreshDiv', json.divid) }, 100)
if (that.options.reload) {
var form = that.tools.getPagerForm($target)
var url = null, type = null
if (form) {
url = form.attr('action')
type = form.attr('method') || 'GET'
} else {
url = $target.data('url')
type = $target.data('type') || 'GET'
}
if (url) $target.ajaxUrl({url: url, type: type})
}
if (that.options.reloadNavtab)
setTimeout(function() { that.$element.navtab('refresh') }, 100)
if (json.forward) {
var _forward = function() {
$target.ajaxUrl({url: json.forward})
}
if (json.forwardConfirm) {
that.$element.alertmsg('confirm', json.forwardConfirm, {
okCall: function() { _forward() }
})
} else {
_forward()
}
}
}
Bjuiajax.prototype.navtabCallback = function(json) {
var that = this
if (json.tabid)
setTimeout(function() { that.$element.navtab('reloadFlag', json.tabid) }, 100)
if (json.dialogid)
setTimeout(function() { that.$element.dialog('refresh', json.dialogid) }, 100)
if (json.divid)
setTimeout(function() { that.$element.bjuiajax('refreshDiv', json.divid) }, 100)
if (json.datagrid) {
setTimeout(function() {
$.each(json.datagrid.join(','), function(i, n) {
$('#'+ n.trim()).datagrid('refresh')
})
}, 100)
}
if (json.closeCurrent && !json.forward)
that.$element.navtab('closeCurrentTab')
else if (that.options.reload)
setTimeout(function() { that.$element.navtab('refresh') }, 100)
if (json.forward) {
var _forward = function() {
that.$element.navtab('reload', {url:json.forward})
}
if (json.forwardConfirm) {
that.$element.alertmsg('confirm', json.forwardConfirm, {
okCall: function() { _forward() },
cancelCall: function() { if (json.closeCurrent) { that.$element.navtab('closeCurrentTab') } }
})
} else {
_forward()
}
}
}
Bjuiajax.prototype.dialogCallback = function(json) {
var that = this
if (json.tabid)
setTimeout(function() { that.$element.navtab('reloadFlag', json.tabid) }, 100)
if (json.dialogid)
setTimeout(function() { that.$element.dialog('refresh', json.dialogid) }, 100)
if (json.divid)
setTimeout(function() { that.$element.bjuiajax('refreshDiv', json.divid) }, 100)
if (json.closeCurrent && !json.forward)
that.$element.dialog('closeCurrent')
else if (that.options.reload)
setTimeout(function() { that.$element.dialog('refresh') }, 100)
if (that.options.reloadNavtab)
setTimeout(function() { that.$element.navtab('refresh') }, 100)
if (json.forward) {
var _forward = function() {
that.$element.dialog('reload', {url:json.forward})
}
if (json.forwardConfirm) {
that.$element.alertmsg('confirm', json.forwardConfirm, {
okCall: function() { _forward() }
})
} else {
_forward()
}
}
}
Bjuiajax.prototype.pageCallback = function(options, target) {
var that = this
var op = $.extend({}, Bjuiajax.DEFAULTS, options)
var $target = target || null
var form = null
if ($target && $target.length) {
form = that.tools.getPagerForm($target, op)
if (form) {
$.extend(op, $(form).data())
that.reloadDiv($target, {type:$(form).attr('method') || 'POST', url:$(form).attr('action'), data:$(form).serializeArray(), loadingmask:op.loadingmask})
}
} else {
if (that.tools.getTarget() == Bjuiajax.NAVTAB) {
$target = $.CurrentNavtab
form = that.tools.getPagerForm($target, op)
if (form) $.extend(op, $(form).data())
that.$element.navtab('reloadForm', false, op)
} else {
$target = $.CurrentDialog
form = that.tools.getPagerForm($target, op)
if (form) $.extend(op, $(form).data())
that.$element.dialog('reloadForm', false, op)
}
}
}
Bjuiajax.prototype.doSearch = function(options) {
var that = this, $element = that.$element, form = null, op = {pageCurrent:1}, $target = $element.closest('.bjui-layout'), isValid = options.isValid
options = $.extend({}, Bjuiajax.DEFAULTS, typeof options == 'object' && options)
if (!options.url) options.url = $element.attr('action')
if (!options.url) {
BJUI.debug('Error trying to submit form action: action url is undefined!')
return
} else {
options.url = decodeURI(options.url).replacePlh($element.closest('.unitBox'))
if (!options.url.isFinishedTm()) {
$element.alertmsg('error', (options.warn || FRAG.alertPlhMsg.replace('#plhmsg#', BJUI.regional.plhmsg)))
BJUI.debug('The submit form action is incorrect: '+ options.url)
return
}
options.url = encodeURI(options.url)
}
var search = function() {
if ($target && $target.length) {
form = that.tools.getPagerForm($target, op)
var data = $element.serializeJson(), _data = {}
if (options.clearQuery) {
var pageInfo = BJUI.pageInfo
for (var key in pageInfo) {
_data[pageInfo[key]] = data[pageInfo[key]]
}
data = _data
}
that.reloadDiv($target, {type:$element.attr('method') || 'POST', url:options.url, data:data, loadingmask:options.loadingmask})
} else {
if (that.tools.getTarget() == Bjuiajax.NAVTAB) {
$target = $.CurrentNavtab
form = that.tools.getPagerForm($target, op)
$element.navtab('reloadForm', options.clearQuery, options)
} else {
$target = $.CurrentDialog
form = that.tools.getPagerForm($target, op)
$element.dialog('reloadForm', options.clearQuery, options)
}
}
}
if (!isValid) {
if ($.validator) {
$element.isValid(function(v) {
if (v) search()
})
} else {
search()
}
} else {
search()
}
}
Bjuiajax.prototype.doLoad = function(options) {
var that = this, $element = that.$element, $target = options.target ? $(options.target) : null
options = $.extend({}, Bjuiajax.DEFAULTS, typeof options == 'object' && options)
if (!options.url) {
BJUI.debug('Error trying to open a ajax link: The url is undefined!')
return
} else {
options.url = decodeURI(options.url).replacePlh($element.closest('.unitBox'))
if (!options.url.isFinishedTm()) {
$element.alertmsg('error', (options.warn || FRAG.alertPlhMsg.replace('#plhmsg#', BJUI.regional.plhmsg)))
BJUI.debug('The ajax link incorrect: '+ options.url)
return
}
options.url = encodeURI(options.url)
}
if (!$target || !$target.length) {
BJUI.debug('Not set loaded \'ajax\' content container, like [data-target].')
return
}
if ($target && $target.length) {
$target.removeData('bjui.clientPaging')
that.reloadDiv($target, options)
}
}
Bjuiajax.prototype.refreshLayout = function(options) {
var that = this, $element = that.$element, $target = options.target ? $(options.target) : null
options = $.extend({}, Bjuiajax.DEFAULTS, typeof options == 'object' && options)
if (!$target || !$target.length) {
if (autorefreshTimer) clearInterval(autorefreshTimer)
BJUI.debug('Not set loaded \'ajax\' content container, like [data-target].')
return
}
if ($target && $target.length) {
$target.removeData('bjui.clientPaging')
that.reloadDiv($target, $.extend({}, $target.data('options') || {}, options))
}
}
Bjuiajax.prototype.reloadDiv = function($target, options) {
var arefre = options.autorefresh && (isNaN(String(options.autorefresh)) ? 15 : options.autorefresh)
$target
.addClass('bjui-layout')
.data('options', options)
.ajaxUrl({ type:options.type, url:options.url, data:options.data, loadingmask:options.loadingmask, callback:function(html) {
if (BJUI.ui.clientPaging && $target.data('bjui.clientPaging'))
$target.pagination('setPagingAndOrderby', $target)
if (options.callback)
options.callback.apply(this, [$target])
if (autorefreshTimer)
clearInterval(autorefreshTimer)
if (arefre)
autorefreshTimer = setInterval(function() { $target.bjuiajax('refreshLayout', options) }, arefre * 1000)
}
})
}
Bjuiajax.prototype.refreshDiv = function(divid) {
if (divid && typeof divid == 'string') {
var arr = divid.split(',')
for (var i = 0; i < arr.length; i++) {
this.refreshLayout({target: '#'+ arr[i]})
}
}
}
Bjuiajax.prototype.doAjax = function(options) {
var that = this, $element = that.$element
options = $.extend({}, Bjuiajax.DEFAULTS, typeof options == 'object' && options)
if (!options.url) {
BJUI.debug('Error trying to open a ajax link: url is undefined!')
return
} else {
options.url = decodeURI(options.url).replacePlh($element.closest('.unitBox'))
if (!options.url.isFinishedTm()) {
$element.alertmsg('error', (options.warn || FRAG.alertPlhMsg.replace('#plhmsg#', BJUI.regional.plhmsg)))
BJUI.debug('The ajax url is incorrect: '+ options.url)
return
}
options.url = encodeURI(options.url)
}
var callback = options.callback && options.callback.toFunc()
var todo = function() {
$element.doAjax({type:options.type, url:options.url, data:options.data, callback:callback ? callback : $.proxy(function(data) {that.ajaxCallback(data)}, that)})
}
if (options.confirmMsg) {
$element.alertmsg('confirm', options.confirmMsg, {
okCall: function() {
todo()
}
})
} else {
todo()
}
}
Bjuiajax.prototype.doExport = function(options) {
var that = this, $element = that.$element, $target = options.target ? $(options.target) : null, form
if (!options.url) {
BJUI.debug('Error trying to open a ajax link: url is undefined!')
return
} else {
options.url = decodeURI(options.url).replacePlh($element.closest('.unitBox'))
if (!options.url.isFinishedTm()) {
$element.alertmsg('error', (options.warn || FRAG.alertPlhMsg.replace('#plhmsg#', BJUI.regional.plhmsg)))
BJUI.debug('The ajax url is incorrect: '+ options.url)
return
}
}
var todo = function() {
if (!$target || !$target.length) {
if (that.tools.getTarget() == Bjuiajax.NAVTAB) {
$target = $.CurrentNavtab
} else {
$target = $.CurrentDialog
}
}
form = that.tools.getPagerForm($target)
if (form) options.url = encodeURI(options.url + (options.url.indexOf('?') == -1 ? '?' : '&') + $(form).serialize())
$.fileDownload(options.url, {
failCallback: function(responseHtml, url) {
if (responseHtml.trim().startsWith('{')) responseHtml = responseHtml.toObj()
that.ajaxDone(responseHtml)
}
})
}
if (options.confirmMsg) {
$element.alertmsg('confirm', options.confirmMsg, {
okCall: function() {
todo()
}
})
} else {
todo()
}
}
Bjuiajax.prototype.doExportChecked = function(options) {
var that = this, $element = that.$element, $target = options.target ? $(options.target) : null
if (!options.url) {
BJUI.debug('Error trying to open a export link: url is undefined!')
return
} else {
options.url = decodeURI(options.url).replacePlh($element.closest('.unitBox'))
if (!options.url.isFinishedTm()) {
$element.alertmsg('error', (options.warn || FRAG.alertPlhMsg.replace('#plhmsg#', BJUI.regional.plhmsg)))
BJUI.debug('The ajax url is incorrect: '+ options.url)
return
}
}
var todo = function() {
if (!options.group) {
that.$element.alertmsg('error', options.warn || FRAG.alertNoCheckGroup.replace('#nocheckgroup#', BJUI.regional.nocheckgroup))
return
}
if (!$target || !$target.length) {
if (that.tools.getTarget() == Bjuiajax.NAVTAB) {
$target = $.CurrentNavtab
} else {
$target = $.CurrentDialog
}
}
var ids = []
var $checks = $target.find(':checkbox[name='+ options.group +']:checked')
if ($checks.length == 0) {
that.$element.alertmsg('error', FRAG.alertNotChecked.replace('#notchecked#', BJUI.regional.notchecked))
return
}
$checks.each(function() {
ids.push($(this).val())
})
options.url = options.url.setUrlParam((options.idname ? options.idname : 'ids'), ids.join(','))
$.fileDownload(options.url, {
failCallback: function(responseHtml, url) {
if (responseHtml.trim().startsWith('{')) responseHtml = responseHtml.toObj()
that.ajaxDone(responseHtml)
}
})
}
if (options.confirmMsg) {
$element.alertmsg('confirm', options.confirmMsg, {
okCall: function() {
todo()
}
})
} else {
todo()
}
}
Bjuiajax.prototype.doAjaxChecked = function(options) {
var that = this, $element = that.$element, $target = options.target ? $(options.target) : null
options = $.extend({}, Bjuiajax.DEFAULTS, typeof options == 'object' && options)
if (!options.url) {
BJUI.debug('Error trying to open a del link: url is undefined!')
return
} else {
options.url = decodeURI(options.url).replacePlh($element.closest('.unitBox'))
if (!options.url.isFinishedTm()) {
$element.alertmsg('error', (options.warn || FRAG.alertPlhMsg.replace('#plhmsg#', BJUI.regional.plhmsg)))
BJUI.debug('The ajax url is incorrect: '+ options.url)
return
}
}
var todo = function() {
if (!options.group) {
$element.alertmsg('error', options.warn || FRAG.alertNoCheckGroup.replace('#nocheckgroup#', BJUI.regional.nocheckgroup))
return
}
if (!$target || !$target.length) {
if (that.tools.getTarget() == Bjuiajax.NAVTAB) {
$target = $.CurrentNavtab
} else {
$target = $.CurrentDialog
}
}
var ids = []
var $checks = $target.find(':checkbox[name='+ options.group +']:checked')
var callback = options.callback && options.callback.toFunc()
if ($checks.length == 0) {
$element.alertmsg('error', FRAG.alertNotChecked.replace('#notchecked#', BJUI.regional.notchecked))
return
}
$checks.each(function() {
ids.push($(this).val())
})
options.url = options.url.setUrlParam((options.idname ? options.idname : 'ids'), ids.join(','))
$element.doAjax({type:options.type, url:options.url, data:options.data, callback:callback ? callback : $.proxy(function(data) {that.ajaxCallback(data)}, that)})
}
if (options.confirmMsg) {
$element.alertmsg('confirm', options.confirmMsg, {
okCall: function() {
todo()
}
})
} else {
todo()
}
}
// BJUIAJAX PLUGIN DEFINITION
// =======================
function Plugin(option) {
var args = arguments
var property = option
return this.each(function () {
var $this = $(this)
var options = $.extend({}, Bjuiajax.DEFAULTS, $this.data(), typeof option == 'object' && option)
var data = $this.data('bjui.bjuiajax')
if (!data) $this.data('bjui.bjuiajax', (data = new Bjuiajax(this, options)))
if (typeof property == 'string' && $.isFunction(data[property])) {
[].shift.apply(args)
if (!args) data[property]()
else data[property].apply(data, args)
} else {
return
}
})
}
var old = $.fn.bjuiajax
$.fn.bjuiajax = Plugin
$.fn.bjuiajax.Constructor = Bjuiajax
// BJUIAJAX NO CONFLICT
// =================
$.fn.bjuiajax.noConflict = function () {
$.fn.bjuiajax = old
return this
}
// BJUIAJAX DATA-API
// ==============
$(document).on('submit.bjui.bjuiajax.data-api', 'form[data-toggle="ajaxform"]', function(e) {
var $this = $(this), options = $this.data()
Plugin.call($this, 'ajaxForm', options)
e.preventDefault()
})
/* doSearch */
$(function() {
if ($.validator) {
$(document).on(BJUI.eventType.initUI, function(e) {
$(e.target).find('form[data-toggle="ajaxsearch"]').each(function() {
var $form = $(this), options = $form.data()
options.isValid = true
$form.validator({
valid: function(form) {
Plugin.call($form, 'doSearch', options)
}
})
})
})
} else {
$(document).on('submit.bjui.bjuiajax.data-api', 'form[data-toggle="ajaxsearch"]', function(e) {
var $this = $(this), options = $this.data()
Plugin.call($this, 'doSearch', options)
e.preventDefault()
})
}
})
$(document).on('click.bjui.bjuiajax.data-api', '[data-toggle="reloadsearch"]', function(e) {
var $this = $(this), options
var $form = $this.closest('form')
if (!$form || !$form.length) return
options = $form.data()
options.clearQuery = $this.data('clearQuery') || true
Plugin.call($form, 'doSearch', options)
e.preventDefault()
})
$(document).on('click.bjui.bjuiajax.data-api', '[data-toggle="ajaxload"]', function(e) {
var $this = $(this)
var options = $this.data()
if (!options.url) options.url = $this.attr('href')
Plugin.call($this, 'doLoad', options)
e.preventDefault()
})
$(document).on(BJUI.eventType.initUI, function(e) {
var $box = $(e.target).find('[data-toggle="autoajaxload"]')
$box.each(function() {
var $element = $(this), options = $element.data()
options.target = this
Plugin.call($element, 'doLoad', options)
})
})
$(document).on('click.bjui.bjuiajax.data-api', '[data-toggle="refreshlayout"]', function(e) {
var $this = $(this)
var options = $this.data()
Plugin.call($this, 'refreshLayout', options)
})
$(document).on('click.bjui.bjuiajax.data-api', '[data-toggle="doajax"]', function(e) {
var $this = $(this)
var options = $this.data()
if (!options.url) options.url = $this.attr('href')
Plugin.call($this, 'doAjax', options)
e.preventDefault()
})
$(document).on('click.bjui.bjuiajax.data-api', '[data-toggle="doexport"]', function(e) {
var $this = $(this)
var options = $this.data()
if (!options.url) options.url = $this.attr('href')
Plugin.call($this, 'doExport', options)
e.preventDefault()
})
$(document).on('click.bjui.bjuiajax.data-api', '[data-toggle="doexportchecked"]', function(e) {
var $this = $(this)
var options = $this.data()
if (!options.url) options.url = $this.attr('href')
Plugin.call($this, 'doExportChecked', options)
e.preventDefault()
})
$(document).on('click.bjui.bjuiajax.data-api', '[data-toggle="doajaxchecked"]', function(e) {
var $this = $(this)
var options = $this.data()
if (!options.url) options.url = $this.attr('href')
Plugin.call($this, 'doAjaxChecked', options)
e.preventDefault()
})
}(jQuery);