Files
ulthon_admin/public/static/plugs/ulthon-admin/admin-api.js

796 lines
36 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function () {
var ua = window.UA_ADMIN;
var form = window.UA_CORE.form,
layer = window.UA_CORE.layer,
upload = window.UA_CORE.upload,
laydate = window.UA_CORE.laydate;
var { init, extGroup } = window.UA_SHARED;
const { createEditor, createToolbar } = window.wangEditor;
ua.api = {
button: function () {
$('button[target="_blank"]').click(function () {
window.open(ua.url($(this).attr('href')));
});
},
closeCurrentOpen: function (option) {
option = option || {};
option.backHref = option.backHref || '';
option.refreshTable = option.refreshTable || false;
option.refreshFrame = option.refreshFrame || false;
option.onClose = option.onClose || function () { };
if (option.refreshTable === true) {
option.refreshTable = init.tableRenderId;
}
var backWindow = window.parent;
if (option.backHref) {
// 标签打开页面,需要返回上一个标签刷新的情况
backWindow = ua.findPageId(option.backHref);
if (backWindow) {
backWindow.layui.table.reloadData(option.refreshTable);
} else {
ua.findIndexPage(function (w) {
var menu = w.miniTab.searchMenu(option.backHref);
var title = option.backHref;
if (menu) {
title = menu.title;
}
w.miniTab.create({
tabId: option.backHref,
href: option.backHref,
title: title,
});
});
}
ua.findIndexPage(function (w) {
w.layui.element.tabDelete('layuiminiTab', ua.getCurrentPageId());
w.layui.element.tabChange('layuiminiTab', option.backHref);
});
return;
}
// 弹框保存后刷新的情况
var index = parent.layer.getFrameIndex(window.name);
backWindow.layer.close(index, option.onClose);
if (option.refreshTable !== false) {
backWindow.layui.table.reloadData(option.refreshTable);
}
if (option.refreshFrame) {
backWindow.location.reload();
}
return false;
},
refreshFrame: function () {
parent.location.reload();
return false;
},
refreshTable: function (tableName, mode) {
tableName = tableName || 'currentTableRenderId';
if (mode == 'table') {
table.reload(tableName);
} else {
table.reloadData(tableName);
}
},
// var options = {
// url :'system.menu/index?id=1'
// }
// ua.api.reloadTable('currentTableRenderId',options)
reloadTable: function (tableName, options, mode) {
tableName = tableName || 'currentTableRenderId';
if (mode == 'table') {
table.reload(tableName, options);
} else {
table.reloadData(tableName, options);
}
},
formRequired: function () {
var verifyList = document.querySelectorAll("[lay-verify]");
if (verifyList.length > 0) {
$.each(verifyList, function (i, v) {
var verify = $(this).attr('lay-verify');
// todo 必填项处理
if (verify.includes('required')) {
var label = $(this).parent().prev();
if (label.is('label') && !label.hasClass('required')) {
label.addClass('required');
}
if ($(this).attr('lay-reqtext') === undefined && $(this).attr('placeholder') !== undefined) {
$(this).attr('lay-reqtext', $(this).attr('placeholder'));
}
if ($(this).attr('placeholder') === undefined && $(this).attr('lay-reqtext') !== undefined) {
$(this).attr('placeholder', $(this).attr('lay-reqtext'));
}
}
});
}
},
formSubmit: function (preposeCallback, ok, no, ex, complete) {
var formList = document.querySelectorAll("[lay-submit]");
// 表单提交自动处理
if (formList.length > 0) {
$.each(formList, function (i, v) {
var filter = $(this).attr('lay-filter'),
type = $(this).attr('data-type'),
refresh = $(this).attr('data-refresh'),
close = $(this).attr('data-close'),
url = $(this).attr('lay-submit');
// 表格搜索不做自动提交
if (type === 'tableSearch') {
return false;
}
// 判断是否需要刷新表格
if (refresh === 'false') {
refresh = false;
} else {
refresh = true;
}
if (close === 'false') {
close = false;
} else {
close = true;
}
// 自动添加layui事件过滤器
if (filter === undefined || filter === '') {
filter = 'save_form_' + (i + 1);
$(this).attr('lay-filter', filter);
}
if (url === undefined || url === '' || url === null) {
url = window.location.href;
} else {
url = ua.url(url);
}
form.on('submit(' + filter + ')', function (data) {
var btnElem = data.elem;
var form = $(this).closest('form');
if ($(form).hasClass('loading')) return false;
$(form).addClass('loading');
// 判断btn是否具备name和value属性如果有则加到表单数据里
var btnName = $(btnElem).attr('name');
var btnValue = $(btnElem).attr('value');
var backHref = $(btnElem).attr('data-back-href');
if (btnName !== undefined && btnValue !== undefined) {
data.field[btnName] = btnValue;
}
if (!backHref) {
backHref = ua.getQueryVariable('backTagId');
}
var dataField = data.field;
dataField = ua.api.formSubmitEditor(dataField, v);
dataField = ua.api.formSubmitCity(dataField, v);
if (typeof preposeCallback === 'function') {
dataField = preposeCallback(dataField);
}
complete = complete || function () {
$(form).removeClass('loading');
};
if (ok) {
var originalOk = ok;
ok = function (res) {
originalOk(res);
complete();
};
} else {
ok = function (res) {
res.msg = res.msg || '';
ua.msg.success(res.msg, function () {
if (close) {
ua.api.closeCurrentOpen({
refreshTable: refresh,
backHref: backHref,
onClose: function () {
complete();
}
});
}
});
return false;
};
}
ua.request.post({
url: url,
data: dataField,
}, ok, no, ex, complete);
return false;
});
});
}
},
formSubmitEditor(dataField, form) {
return dataField;
},
formSubmitCity(dataField, form) {
var cityList = $(form).closest('.layui-form').find('[data-toggle="city-picker"]');
if (cityList.length > 0) {
$.each(cityList, function (i, v) {
var fieldName = $(v).attr('name');
var code = $(v).data('citypicker').getCode();
var text = $(v).data('citypicker').getVal();
var level = $(v).data('level');
var formatTargetList = {};
formatTargetList['name'] = 1;
formatTargetList['code'] = 1;
formatTargetList['name-province'] = 1;
formatTargetList['name-city'] = 1;
formatTargetList['name-district'] = 1;
formatTargetList['code-province'] = 1;
formatTargetList['code-city'] = 1;
formatTargetList['code-district'] = 1;
$.each(formatTargetList, function (targetType, value) {
var valueSet = $(v).data('field-' + targetType);
if (valueSet == 0) {
formatTargetList[targetType] = 0;
}
});
var codeArr = code.split('/');
var textArr = text.split('/');
if (formatTargetList['name'] == 1) {
dataField[fieldName] = text;
}
if (formatTargetList['code'] == 1) {
dataField[fieldName + '_code'] = code;
}
if (formatTargetList['name-province'] == 1) {
dataField[fieldName + '_name_province'] = textArr[0] || '';
}
if (formatTargetList['name-city'] == 1) {
dataField[fieldName + '_name_city'] = textArr[1] || '';
}
if (formatTargetList['name-district'] == 1) {
dataField[fieldName + '_name_district'] = textArr[2] || '';
}
if (formatTargetList['code-province'] == 1) {
dataField[fieldName + '_code_province'] = codeArr[0] || '';
}
if (formatTargetList['code-city'] == 1) {
dataField[fieldName + '_code_city'] = codeArr[1] || '';
}
if (formatTargetList['code-district'] == 1) {
dataField[fieldName + '_code_district'] = codeArr[2] || '';
}
});
}
return dataField;
},
upload: function () {
var uploadList = document.querySelectorAll("[data-upload]");
var uploadSelectList = document.querySelectorAll("[data-upload-select]");
if (uploadList.length > 0) {
$.each(uploadList, function (i, v) {
var uploadExts = $(this).attr('data-upload-exts'),
uploadName = $(this).attr('data-upload'),
uploadNumber = $(this).attr('data-upload-number') || 'one',
uploadSign = $(this).attr('data-upload-sign') || '|',
uploadAccept = $(this).attr('data-upload-accept') || 'file',
uploadAcceptMime = $(this).attr('data-upload-mimetype') || '',
uploadDisablePreview = $(this).attr('data-upload-disable-preview') || '0',
uploadFilenameField = $(this).attr('data-upload-filename-field') || '',
elem = "input[name='" + uploadName + "']",
uploadElem = this;
if (uploadFilenameField) {
var elemFilenameField = "[name='" + uploadFilenameField + "']";
}
if (uploadExts == '*') {
uploadExts = init.uploadExts;
} else if (uploadExts.charAt(0) == '*') {
var extGroupName = uploadExts.slice(1);
if (extGroup[extGroupName]) {
uploadExts = extGroup[extGroupName].join('|');
}
}
// 监听上传事件
upload.render({
elem: this,
url: ua.url(init.uploadUrl),
exts: uploadExts,
accept: uploadAccept,//指定允许上传时校验的文件类型
acceptMime: uploadAcceptMime,//规定打开文件选择框时,筛选出的文件类型
multiple: uploadNumber !== 'one',//是否多文件上传
headers: ua.headers(),
done: function (res) {
if (res.code === 0) {
var url = res.data.url;
var filename = res.data.original_name;
if (uploadNumber !== 'one') {
var oldUrl = $(elem).val();
if (oldUrl !== '') {
url = oldUrl + uploadSign + url;
}
if (elemFilenameField) {
var oldFilename = $(elemFilenameField).val();
if (oldFilename !== '') {
filename = oldFilename + uploadSign + filename;
}
}
}
if (elemFilenameField) {
$(elemFilenameField).val(filename);
}
$(elem).val(url);
$(elem).trigger("input");
ua.msg.success(res.msg);
} else {
ua.msg.error(res.msg);
}
return false;
}
});
if (uploadDisablePreview == 0) {
// 监听上传input值变化
$(elem).bind("input propertychange", function (event) {
var urlString = $(this).val(),
urlArray = urlString.split(uploadSign),
uploadIcon = $(uploadElem).attr('data-upload-icon') || "file";
var uploadNameKey = uploadName.replace(/\[/g, "-").replace(/\]/g, "-");
$('#bing-' + uploadNameKey).remove();
if (urlString.length > 0) {
var parant = $(this).parent('div');
var liHtml = '';
var filenameArray = [];
if (uploadFilenameField) {
var filenameVal = $(elemFilenameField).val() || '';
if (filenameVal) {
filenameArray = filenameVal.split(uploadSign);
}
}
$.each(urlArray, function (i, v) {
// 获取链接扩展名
var ext = v.substr(v.lastIndexOf('.') + 1);
var currentFilename = filenameArray[i] || '';
currentFilename = currentFilename.replace(/"/g, '"');
if (extGroup.image.indexOf(ext) != -1) {
// 是图片
liHtml += '<li><a title="点击预览"><img src="' + v + '" data-images onerror="this.src=\'/static/admin/images/upload-icons/image-error.png\';this.onerror=null"></a><small class="uploads-delete-tip bg-red badge" data-upload-delete="' + uploadName + '" data-upload-filename-field="' + uploadFilenameField + '" data-upload-url="' + v + '" data-upload-sign="' + uploadSign + '" data-upload-filename="' + currentFilename + '">×</small></li>\n';
} else {
// 不是图片
// 遍历extGroup数组找到扩展名所在的索引
uploadIcon = ua.getExtGroupName(ext);
liHtml += '<li><a title="点击打开文件" target="_blank" href="' + v + '" ><img src="/static/admin/images/upload-icons/' + uploadIcon + '.png"></a><small class="uploads-delete-tip bg-red badge" data-upload-delete="' + uploadName + '" data-upload-filename-field="' + uploadFilenameField + '" data-upload-url="' + v + '" data-upload-sign="' + uploadSign + '" data-upload-filename="' + currentFilename + '">×</small></li>\n';
}
});
parant.after('<ul id="bing-' + uploadNameKey + '" class="layui-input-block layuimini-upload-show">\n' + liHtml + '</ul>');
var initSortable = function () {
var el = document.getElementById('bing-' + uploadNameKey);
if (el) {
new Sortable(el, {
animation: 150,
onEnd: function (evt) {
var newUrls = [];
var newFilenames = [];
$(el).find('.uploads-delete-tip').each(function () {
newUrls.push($(this).attr('data-upload-url'));
newFilenames.push($(this).attr('data-upload-filename'));
});
$(elem).val(newUrls.join(uploadSign));
if (uploadFilenameField) {
$(elemFilenameField).val(newFilenames.join(uploadSign));
}
$(elem).trigger("input");
}
});
}
};
initSortable();
}
});
// 非空初始化图片显示
if ($(elem).val() !== '') {
$(elem).trigger("input");
}
}
});
// 监听上传文件的删除事件
$('body').on('click', '[data-upload-delete]', function () {
var uploadName = $(this).attr('data-upload-delete'),
deleteUrl = $(this).attr('data-upload-url'),
uploadFilenameField = $(this).attr('data-upload-filename-field'),
sign = $(this).attr('data-upload-sign');
var confirm = ua.msg.confirm('确定删除?', function () {
var elem = "input[name='" + uploadName + "']";
var elemFilenameField = "[name='" + uploadFilenameField + "']";
var currentUrl = $(elem).val();
var currentFilename = $(elemFilenameField).val();
var currentUrlList = currentUrl.split(sign);
var deleteIndex = currentUrlList.indexOf(deleteUrl);
currentUrlList.splice(deleteIndex, 1);
$(elem).val(currentUrlList.join(sign));
$(elem).trigger("input");
if (currentFilename) {
var currentFilenameList = currentFilename.split(sign);
currentFilenameList.splice(deleteIndex, 1);
$(elemFilenameField).val(currentFilenameList.join(sign));
}
ua.msg.close(confirm);
});
return false;
});
}
if (uploadSelectList.length > 0) {
$.each(uploadSelectList, function (i, v) {
var uploadName = $(this).attr('data-upload-select'),
uploadNumber = $(this).attr('data-upload-number') || 'one',
uploadSign = $(this).attr('data-upload-sign') || '|',
uploadFilenameField = $(this).attr('data-upload-filename-field') || '';
if (uploadFilenameField) {
var elemFilenameField = "[name='" + uploadFilenameField + "']";
var elemFilename = $(elemFilenameField);
}
var selectCheck = uploadNumber === 'one' ? 'radio' : 'checkbox';
var elem = "input[name='" + uploadName + "']";
var width = document.body.clientWidth,
height = document.body.clientHeight;
if (width >= 800 && height >= 600) {
clienWidth = '800px';
clientHeight = '600px';
} else {
clienWidth = '100%';
clientHeight = '100%';
}
$(v).click(function () {
layer.open({
title: '选择文件',
type: 2,
area: [clienWidth, clientHeight],
content: ua.url('system.uploadfile/index') + '?select_mode=' + selectCheck,
success(layero, index) {
window.onTableDataConfirm = function (data) {
var currentUrl = $(elem).val();
var urlArray = currentUrl.split(uploadSign);
if (currentUrl.length == 0 || selectCheck == 'radio') {
urlArray = [];
}
if (uploadFilenameField) {
var currentFilename = $(elemFilename).val();
var filenameArray = currentFilename.split(uploadSign);
if (currentFilename.length == 0 || selectCheck == 'radio') {
filenameArray = [];
}
}
$.each(data, function (index, val) {
if (urlArray.indexOf(val.url) == -1) {
urlArray.push(val.url);
}
if (uploadFilenameField) {
if (filenameArray.indexOf(val.original_name) == -1) {
filenameArray.push(val.original_name);
}
}
});
var url = urlArray.join(uploadSign);
if (uploadFilenameField) {
var filename = filenameArray.join(uploadSign);
}
$(elem).val(url);
if (uploadFilenameField) {
$(elemFilenameField).val(filename);
}
$(elem).trigger("input");
layer.close(index);
ua.msg.success('选择成功');
};
}
});
});
});
}
},
editor: function () {
var editorList = document.querySelectorAll(".editor");
if (editorList.length > 0) {
$.each(editorList, function (i, v) {
var editorConfig = {
placeholder: '请输入内容',
onChange(editor) {
const html = editor.getHtml();
$(v).val(html);
},
MENU_CONF: {
uploadImage: {
server: ua.url('ajax/uploadEditor'),
maxFileSize: 10 * 1024 * 1024,
fieldName: 'upload',
},
}
};
var formName = $(this).attr('name');
var editorId = 'editor-' + formName.replace(/\[/g, '-').replace(/\]/g, '-');
var editorContainer = $('<div id="' + editorId + '" style="height:60vh;"></div>');
$(this).after(editorContainer);
var toolbarId = 'toolbar-' + formName.replace(/\[/g, '-').replace(/\]/g, '-');
var toolbarContent = $('<div id="' + toolbarId + '"></div>');
$(this).after(toolbarContent);
$(this).hide();
var originalValue = $(this).val();
const editor = createEditor({
selector: '#' + editorId,
html: originalValue,
config: editorConfig,
mode: 'default',
scroll: true
});
$(v).data('editor', editor);
const toolbarConfig = {
excludeKeys: [
'uploadVideo',
'fullScreen',
'todo',
]
};
const toolbar = createToolbar({
editor,
selector: '#' + toolbarId,
config: toolbarConfig,
mode: 'default', // or 'simple'
});
});
}
},
select: function () {
var selectList = document.querySelectorAll("[data-select]");
$.each(selectList, function (i, v) {
var url = $(this).attr('data-select'),
selectFields = $(this).attr('data-fields'),
value = $(this).attr('data-value'),
that = this,
html = '<option value=""></option>';
var template = $(that).data('template');
if (typeof template != 'function') {
template = function (data, fields) {
return data[fields[1]];
};
}
var fields = selectFields.replace(/\s/g, "").split(',');
if (fields.length < 2) {
return ua.msg.error('下拉选择字段有误');
}
ua.request.get(
{
url: url,
data: {
selectFields: selectFields
},
}, function (res) {
var list = res.data;
list.forEach(val => {
var key = val[fields[0]];
var valueTitle = template(val, fields);
if (value !== undefined && key.toString() === value) {
html += '<option value="' + key + '" selected="">' + valueTitle + '</option>';
} else {
html += '<option value="' + key + '">' + valueTitle + '</option>';
}
});
$(that).html(html);
form.render();
}
);
});
},
nativeRadio() {
$('[value-checked]').each(function (index, elem) {
if ($(this).hasClass('checked-rendered')) {
return;
}
$(this).addClass('checked-rendered');
if ($(this).attr('value') == $(this).attr('value-checked')) {
$(this).prop('checked', true);
}
});
},
nativeSelect() {
$('[value-selected]').each(function (index, elem) {
if ($(this).hasClass('selected-rendered')) {
return;
}
$(this).addClass('selected-rendered');
if ($(this).attr('value') == $(this).attr('value-selected')) {
$(this).prop('selected', true);
}
});
},
date: function () {
var dateList = document.querySelectorAll("[data-date]");
if (dateList.length > 0) {
$.each(dateList, function (i, v) {
var format = $(this).attr('data-date'),
type = $(this).attr('data-date-type'),
range = $(this).attr('data-date-range');
if (type === undefined || type === '' || type === null) {
type = 'datetime';
}
var options = {
elem: this,
type: type,
};
if (format !== undefined && format !== '' && format !== null) {
options['format'] = format;
}
if (range !== undefined) {
if (range === null || range === '') {
range = '-';
}
options['range'] = range;
}
laydate.render(options);
});
}
},
tableData() {
var tableList = document.querySelectorAll('[data-toggle="table-data"]');
$.each(tableList, function (i, v) {
var data = $(v).data();
tableData.render(v, data, admin);
});
},
mapLocation() {
var mapList = document.querySelectorAll('[data-toggle="map-location"]');
$.each(mapList, function (i, v) {
if ($(v).hasClass('map-rendered')) {
return;
}
$(v).addClass('map-rendered');
var data = $(v).data();
mapLocation.render(v, data, admin);
});
},
tagInput() {
var list = document.querySelectorAll('[data-toggle="tag-input"]');
$.each(list, function (i, v) {
var data = $(v).data();
tagInput.render(v, data, admin);
});
},
propertyInput() {
var list = document.querySelectorAll('[data-toggle="property-input"]');
$.each(list, function (i, v) {
var data = $(v).data();
data.value = $(v).text();
propertyInput.render(v, data, admin);
});
},
copyText(elem) {
if (elem == undefined) {
elem = 'body';
}
var list = $(elem).find('[data-toggle="copy-text"]');
$.each(list, function (i, v) {
if ($(v).hasClass('copy-rendered')) {
return;
}
$(v).addClass('copy-rendered');
var clipboard = new ClipboardJS(v);
clipboard.on('success', function (e) {
ua.msg.success('复制成功');
});
clipboard.on('error', function (e) {
ua.msg.error('复制失败');
});
});
},
pasteText(elem) {
if (elem == undefined) {
elem = 'body';
}
var list = $(elem).find('[data-toggle="paste-text"]');
$.each(list, function (i, v) {
if ($(v).hasClass('paste-rendered')) {
return;
}
$(v).addClass('paste-rendered');
var targetElemName = $(v).data('paste-target');
$(v).on('click', function () {
if (!navigator.clipboard) {
ua.msg.error('您的当前不支持粘贴操作');
return;
}
navigator.clipboard.readText()
.then(text => {
$(targetElemName).val(text);
layer.msg('粘贴成功');
})
.catch(err => {
console.error('Failed to read clipboard contents: ', err);
layer.msg('粘贴失败,请手动粘贴');
});
});
});
}
};
})();