You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

287 lines
5.3 KiB

import { ElMessageBox, ElMessage } from "element-plus";
import { Mitt } from "../../utils/mitt";
import { ref } from "vue";
import { assign, isArray, isFunction } from "lodash-es";
import { merge } from "../../utils";
interface Options {
mitt: Mitt;
config: ClCrud.Config;
crud: ClCrud.Ref;
}
export function useHelper({ config, crud, mitt }: Options) {
// 刷新随机值,避免脏数据
const refreshRd = ref(0);
// 获取权限
function getPermission(key: "page" | "list" | "info" | "update" | "add" | "delete"): boolean {
return Boolean(crud.permission[key]);
}
// 根据字典替换请求参数
function paramsReplace(params: obj) {
const { pagination, search, sort } = crud.dict;
// 请求参数
const a: any = { ...params };
// 字典
const b: any = { ...pagination, ...search, ...sort };
for (const i in b) {
if (a[i]) {
if (i != b[i]) {
a[`_${b[i]}`] = a[i];
delete a[i];
}
}
}
for (const i in a) {
if (i[0] === "_") {
a[i.substr(1)] = a[i];
delete a[i];
}
}
return a;
}
// 刷新请求
function refresh(params?: obj) {
const { service, dict } = crud;
return new Promise((success, error) => {
// 合并请求参数
const reqParams = paramsReplace(assign(crud.params, params));
// Loading
crud.loading = true;
// 预防脏数据
const rd = (refreshRd.value = Math.random());
// 完成事件
function done() {
crud.loading = false;
}
// 渲染
function render(data: any | any[], pagination?: any) {
const res = isArray(data) ? { list: data, pagination } : data;
done();
success(res);
mitt.emit("crud.refresh", res);
}
// 下一步
function next(params: obj): Promise<any> {
return new Promise(async (resolve, reject) => {
await service[dict.api.page](params)
.then((res) => {
if (rd != refreshRd.value) {
return false;
}
if (isArray(res)) {
res = {
list: res,
pagination: {
total: res.length
}
};
}
render(res);
resolve(res);
})
.catch((err) => {
ElMessage.error(err.message);
error(err);
reject(err);
});
done();
});
}
// 刷新钩子
if (config.onRefresh) {
config.onRefresh(reqParams, { next, done, render });
} else {
next(reqParams);
}
});
}
// 打开详情
function rowInfo(data: any) {
mitt.emit("crud.proxy", {
name: "info",
data: [data]
});
}
// 打开新增
function rowAdd() {
mitt.emit("crud.proxy", {
name: "add"
});
}
// 打开编辑
function rowEdit(data: any) {
mitt.emit("crud.proxy", {
name: "edit",
data: [data]
});
}
// 打开追加
function rowAppend(data: any) {
mitt.emit("crud.proxy", {
name: "append",
data: [data]
});
}
// 关闭新增、编辑弹窗
function rowClose() {
mitt.emit("crud.proxy", {
name: "close"
});
}
// 删除请求
function rowDelete(...selection: any[]) {
const { service, dict } = crud;
// 参数
const params = {
ids: selection.map((e) => e[dict.primaryId])
};
// 下一步
async function next(data: obj) {
return new Promise((resolve, reject) => {
ElMessageBox({
type: "warning",
title: dict.label.tips,
message: dict.label.deleteConfirm,
confirmButtonText: dict.label.confirm,
cancelButtonText: dict.label.close,
showCancelButton: true,
async beforeClose(action, instance, done) {
if (action === "confirm") {
instance.confirmButtonLoading = true;
await service[dict.api.delete]({ ...params, ...data })
.then((res) => {
ElMessage.success(dict.label.deleteSuccess);
refresh();
resolve(res);
})
.catch((err) => {
ElMessage.error(err.message);
reject(err);
});
instance.confirmButtonLoading = false;
}
done();
}
}).catch(() => null);
});
}
// 删除钩子
if (config.onDelete) {
config.onDelete(selection, { next });
} else {
next(params);
}
}
// 代理
function proxy(name: string, data?: any[]) {
mitt.emit("crud.proxy", {
name,
data
});
}
// 获取请求参数
function getParams() {
return crud.params;
}
// 替换请求参数
function setParams(data: obj) {
merge(crud.params, data);
}
// 设置
function set(key: string, value: any) {
if (!value) {
return false;
}
switch (key) {
// 服务
case "service":
Object.assign(crud.service, value);
crud.service.__proto__ = value.__proto__;
if (value._permission) {
for (const i in value._permission) {
crud.permission[i] = value._permission[i];
}
}
break;
// 权限
case "permission":
if (isFunction(value)) {
merge(crud.permission, value(crud));
} else {
merge(crud.permission, value);
}
break;
default:
merge(crud[key], value);
break;
}
}
// 监听事件
function on(name: string, callback: fn) {
mitt.on(`${name}-${crud.id}`, callback);
}
// 默认值
set("dict", config.dict);
set("service", config.service);
set("permission", config.permission);
return {
proxy,
set,
on,
rowInfo,
rowAdd,
rowEdit,
rowAppend,
rowDelete,
rowClose,
refresh,
getPermission,
paramsReplace,
getParams,
setParams
};
}