Files
im/plugin/admin/public/libs/fast.js
T
2025-12-25 06:02:38 +08:00

445 lines
20 KiB
JavaScript

define(['jquery', 'bootstrap', 'layer','lightyear'], function ($, undefined, Layer,lightyear) {
var Fast = {
config: {
},
events: {
//请求成功的回调
onAjaxSuccess: function (ret, onAjaxSuccess) {
var data = typeof ret.data !== 'undefined' ? ret.data : null;
var msg = typeof ret.msg !== 'undefined' && ret.msg ? ret.msg : __('Operation completed');
if (typeof onAjaxSuccess === 'function') {
var result = onAjaxSuccess.call(this, data, ret);
if (result === false)
return;
}
lightyear.notify(msg, 'success');
},
//请求错误的回调
onAjaxError: function (ret, onAjaxError) {
var data = typeof ret.data !== 'undefined' ? ret.data : null;
if (typeof onAjaxError === 'function') {
var result = onAjaxError.call(this, data, ret);
if (result === false) {
return;
}
}
lightyear.notify(ret.msg, 'danger');
},
//服务器响应数据后
onAjaxResponse: function (response) {
try {
var ret = typeof response === 'object' ? response : JSON.parse(response);
if (!ret.hasOwnProperty('code')) {
$.extend(ret, {code: -2, msg: response, data: null});
}
} catch (e) {
var ret = {code: -1, msg: e.message, data: null};
}
return ret;
}
},
api: {
replaceids: function (elem, url) {
//如果有需要替换ids的
if (url.indexOf("{ids}") > -1) {
var ids = 0;
var tableId = $(elem).data("table-id");
if (tableId && $("#" + tableId).length > 0 && $("#" + tableId).data("bootstrap.table")) {
var Table = require("table");
ids = Table.api.selectedids($("#" + tableId)).join(",");
}
url = url.replace(/\{ids\}/g, ids);
}
return url;
},
gettablecolumnbutton: function (options) {
if (typeof options.tableId !== 'undefined' && typeof options.fieldIndex !== 'undefined' && typeof options.buttonIndex !== 'undefined') {
var tableOptions = $("#" + options.tableId).bootstrapTable('getOptions');
if (tableOptions) {
var columnObj = null;
$.each(tableOptions.columns, function (i, columns) {
$.each(columns, function (j, column) {
if (typeof column.fieldIndex !== 'undefined' && column.fieldIndex === options.fieldIndex) {
columnObj = column;
return false;
}
});
if (columnObj) {
return false;
}
});
if (columnObj) {
return columnObj['buttons'][options.buttonIndex];
}
}
}
return null;
},
//发送Ajax请求
ajax: function (options, success, error) {
options = typeof options === 'string' ? {url: options} : options;
if (typeof options.loading === 'undefined' || options.loading) {
lightyear.loading('show'); // 显示
}
options = $.extend({
type: "POST",
dataType: "json",
xhrFields: {
withCredentials: true
},
complete:function(){
lightyear.loading('hide'); // 隐藏
},
success: function (ret) {
lightyear.loading('hide'); // 隐藏
ret = Fast.events.onAjaxResponse(ret);
if (ret.code === 0) {
Fast.events.onAjaxSuccess(ret, success);
} else {
Fast.events.onAjaxError(ret, error);
}
},
error: function (xhr) {
lightyear.loading('hide'); // 隐藏
var ret = {code: xhr.status, msg: xhr.statusText, data: null};
Fast.events.onAjaxError(ret, error);
}
}, options);
options.url = Fast.api.fixurl(options.url);
return $.ajax(options);
},
//修复URL
fixurl: function (url) {
if (url.substr(0, 1) == "/") {
return url;
}
if (url.substr(0, 4) == "http") {
return url;
}
var r = new RegExp('^(?:[a-z]+:)?//', 'i');
if (!r.test(url)) {
url = Config.moduleurl + "/" + url;
}
return url;
},
//获取修复后可访问的cdn链接
cdnurl: function (url, domain) {
if(!url){return "";}
if(url.substring(0,4) == 'http'){
return url;
}
url = url.substring(0,1)==='/' ? url:'/'+url;
var rule = new RegExp("^((?:[a-z]+:)?\\/\\/|data:image\\/)", "i");
var cdnurl = Config.cdnurl;
if (typeof domain === 'undefined' || domain === true || cdnurl.indexOf("/") === 0) {
url = rule.test(url) || (cdnurl && url.indexOf(cdnurl) === 0) ? url : cdnurl + url;
}
if (domain && !rule.test(url)) {
domain = typeof domain === 'string' ? domain : location.origin;
url = domain + url;
}
return url;
},
//查询Url参数
query: function (name, url) {
if (!url) {
url = window.location.href;
}
name = name.replace(/[\[\]]/g, "\\$&");
var regex = new RegExp("[?&/]" + name + "([=/]([^&#/?]*)|&|#|$)"),
results = regex.exec(url);
if (!results)
return null;
if (!results[2])
return '';
return decodeURIComponent(results[2].replace(/\+/g, " "));
},
//打开一个弹出窗口
open: function (url, title, options) {
if(options && options.area && (typeof options.area == 'string' && options.area.indexOf(','))){
options.area = options.area.split(',');
}
title = options && options.title ? options.title : (title ? title : "");
url = Fast.api.fixurl(url);
url = url + (url.indexOf("?") > -1 ? "&" : "?") + "dialog=1";
//var area = Fast.config.openArea != undefined ? Fast.config.openArea : [$(window).width() > 800 ? '800px' : '95%', $(window).height() > 600 ? '600px' : '95%'];
var area = Fast.config.openArea != undefined ? Fast.config.openArea : (options.area || ['95%', '90%']);
//console.log(options,area)
options = $.extend({
type: 2,
title: title,
shadeClose: true,
shade: false,
maxmin: true,
moveOut: true,
area: area,
content: url,
zIndex: Layer.zIndex,
success: function (layero, index) {
var that = this;
//存储callback事件
$(layero).data("callback", that.callback);
//$(layero).removeClass("layui-layer-border");
Layer.setTop(layero);
try {
var frame = Layer.getChildFrame('html', index);
var layerfooter = frame.find(".layer-footer");
Fast.api.layerfooter(layero, index, that);
//绑定事件
if (layerfooter.length > 0) {
// 监听窗口内的元素及属性变化
// Firefox和Chrome早期版本中带有前缀
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
if (MutationObserver) {
// 选择目标节点
var target = layerfooter[0];
// 创建观察者对象
var observer = new MutationObserver(function (mutations) {
Fast.api.layerfooter(layero, index, that);
mutations.forEach(function (mutation) {
});
});
// 配置观察选项:
var config = {attributes: true, childList: true, characterData: true, subtree: true}
// 传入目标节点和观察选项
observer.observe(target, config);
// 随后,你还可以停止观察
// observer.disconnect();
}
}
} catch (e) {
}
if ($(layero).height() > $(window).height()) {
//当弹出窗口大于浏览器可视高度时,重定位
Layer.style(index, {
top: 0,
height: $(window).height()
});
}
}
}, options ? options : {});
if ($(window).width() < 480 || (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream && top.$(".tab-pane.active").length > 0)) {
if (top.$(".tab-pane.active").length > 0) {
options.area = [top.$(".tab-pane.active").width() + "px", top.$(".tab-pane.active").height() + "px"];
options.offset = [top.$(".tab-pane.active").scrollTop() + "px", "0px"];
} else {
options.area = [$(window).width() + "px", $(window).height() + "px"];
options.offset = ["0px", "0px"];
}
}
//console.log((parent ? parent.location. : ''));
return Layer.open(options);
},
//关闭窗口并回传数据
close: function (data) {
var index = parent.Layer.getFrameIndex(window.name);
var callback = parent.$("#layui-layer" + index).data("callback");
//再执行关闭
parent.Layer.close(index);
//再调用回传函数
if (typeof callback === 'function') {
callback.call(undefined, data);
}
},
layerfooter: function (layero, index, that) {
var frame = Layer.getChildFrame('html', index);
var layerfooter = frame.find(".layer-footer");
if (layerfooter.length > 0) {
$(".layui-layer-footer", layero).remove();
layerfooter.hide();
var footer = $("<div />").addClass('layui-layer-btn layui-layer-footer');
footer.html(layerfooter.html());
if ($(".row", footer).length === 0) {
$(">", footer).wrapAll("<div class='row'></div>");
}
footer.insertAfter(layero.find('.layui-layer-content'));
//绑定事件
footer.on("click", ".btn", function () {
if ($(this).hasClass("disabled") || $(this).parent().hasClass("disabled")) {
return;
}
var index = footer.find('.btn').index(this);
$(".btn:eq(" + index + ")", layerfooter).trigger("click");
});
var titHeight = layero.find('.layui-layer-title').outerHeight() || 0;
var btnHeight = layero.find('.layui-layer-btn').outerHeight() || 0;
//重设iframe高度
$("iframe", layero).height(layero.height() - titHeight - btnHeight);
}
//修复iOS下弹出窗口的高度和iOS下iframe无法滚动的BUG
if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
var titHeight = layero.find('.layui-layer-title').outerHeight() || 0;
var btnHeight = layero.find('.layui-layer-btn').outerHeight() || 0;
$("iframe", layero).parent().css("height", layero.height() - titHeight - btnHeight);
$("iframe", layero).css("height", "100%");
}
},
success: function (options, callback) {
var index,
timeout = 2000;
if(typeof options === 'string'){
index= lightyear.notify(options, 'success', timeout, 'mdi mdi-emoticon-happy', 'top', 'center');
}else if(typeof options == 'object'){
index= lightyear.notify(options.msg ||"操作完成", 'success', timeout, 'mdi mdi-emoticon-happy', 'top', 'center');
callback = options.callback;
}else{
callback = typeof options === 'function' ? options : function(){};
index= lightyear.notify(options.msg ||"操作完成", 'success', timeout, 'mdi mdi-emoticon-happy', 'top', 'center');
}
if(callback){
setTimeout(function(){
callback && callback.call(this)
},timeout);
}
return index;
},
error: function (options, callback) {
var index;
if(typeof options === 'string'){
index= lightyear.notify(options, 'danger', 3000, 'mdi mdi-emoticon-sad', 'top', 'center');
}else if(typeof options == 'object'){
index= lightyear.notify(options.msg ||"操作失败", 'danger', 3000, 'mdi mdi-emoticon-sad', 'top', 'center');
callback = options.callback;
}else{
callback = typeof options === 'function' ? options : function(){};
index= lightyear.notify(options.msg ||"操作失败", 'danger', 3000, 'mdi mdi-emoticon-sad', 'top', 'center');
}
if(callback){
setTimeout(function(){
callback && callback.call(this)
},3000);
}
return index;
},
msg: function (message, url) {
var callback = typeof url === 'function' ? url : function () {
if (typeof url !== 'undefined' && url) {
location.href = url;
}
};
Layer.msg(message, {
time: 2000
}, callback);
},
layer: Layer,
closeTopPopWindow:function(){
if ($(".layui-layer").length > 0) {
var index = 0;
$(".layui-layer").each(function () {
index = Math.max(index, parseInt($(this).attr("times")));
});
if (index) {
Layer.close(index);
return true;
}
}
return false;
}
},
isTopWindow:function(){
return self == parent;
},
isMainIframe:function(){
return parent.location.pathname.toLocaleLowerCase() == Config.admin_path+'/index/index';
},
isPopIframe:function(){
if(Fast.isTopWindow()){
return false;
}
//var p = parent.location.pathname.toLocaleLowerCase().split('/');
var s = self.location.pathname.toLocaleLowerCase().split('/');
s.pop();s.push('index')
//console.log(p,s);
return parent.location.pathname.toLocaleLowerCase() == s.join('/');
},
lang: function () {
var args = arguments,
string = args[0],
i = 1;
string = string.toLowerCase();
//string = typeof Lang[string] != 'undefined' ? Lang[string] : string;
if (typeof Lang !== 'undefined' && typeof Lang[string] !== 'undefined') {
if (typeof Lang[string] == 'object')
return Lang[string];
string = Lang[string];
} else if (string.indexOf('.') !== -1 && false) {
var arr = string.split('.');
var current = Lang[arr[0]];
for (var i = 1; i < arr.length; i++) {
current = typeof current[arr[i]] != 'undefined' ? current[arr[i]] : '';
if (typeof current != 'object')
break;
}
if (typeof current == 'object')
return current;
string = current;
} else {
string = args[0];
}
return string.replace(/%((%)|s|d)/g, function (m) {
// m is the matched format, e.g. %s, %d
var val = null;
if (m[2]) {
val = m[2];
} else {
val = args[i];
// A switch statement so that the formatter can be extended. Default is %s
switch (m) {
case '%d':
val = parseFloat(val);
if (isNaN(val)) {
val = 0;
}
break;
}
i++;
}
return val;
});
},
init: function () {
// jQuery兼容处理
$.fn.extend({
size: function () {
return $(this).length;
}
});
// 对相对地址进行处理
$.ajaxSetup({
beforeSend: function (xhr, setting) {
setting.url = Fast.api.fixurl(setting.url);
}
});
Layer.config({
skin: 'layui-layer-fast'
});
// 绑定ESC关闭窗口事件
$(window).keyup(function (e) {
if (e.keyCode == 27) {
if(!Fast.api.closeTopPopWindow()){
parent.Fast.api.closeTopPopWindow();
}
}
});
//公共代码
}
};
//将Layer暴露到全局中去
window.Layer = Layer;
window.lightyear = lightyear;
//将语言方法暴露到全局中去
window.__ = Fast.lang;
//将Fast渲染至全局
window.Fast = Fast;
//默认初始化执行的代码
Fast.init();
return Fast;
});