import { h, useSlots } from "vue";
import { useConfig, useCore } from "../hooks";
import { isBoolean, isFunction, isArray, isString, cloneDeep } from "lodash-es";
import { renderNode } from "./vnode";
import { deepFind, getValue, isObject } from ".";
/**
* 解析 form.hidden
*/
export function parseFormHidden(value: any, { scope }: any) {
if (isBoolean(value)) {
return value;
} else if (isFunction(value)) {
return value({ scope });
}
return false;
}
/**
* 解析 table.dict
*/
export function parseTableDict(value: any, item: ClTable.Column) {
const { style } = useConfig();
// 选项列表
const options: DictOptions = cloneDeep(getValue(item.dict || []));
// 设置颜色
if (item.dictColor) {
options.forEach((e, i) => {
if (!e.color) {
e.color = style.colors[i];
}
});
}
// 绑定值
const values = (isArray(value) ? value : [value]).filter(
(e) => e !== undefined && e !== null && e !== ""
);
// 返回值
const list = values.map((v) => {
const d = deepFind(v, options) || { label: v, value: v };
delete d.children;
return d;
});
// 是否格式化
if (item.dictFormatter) {
return item.dictFormatter(list);
} else {
return list.map((e) => {
return h(
,
e,
{
default: () => e.label
}
);
});
}
}
/**
* 解析 table.op.buttons
*/
export function parseTableOpButtons(buttons: any[], { scope }: any) {
const { crud } = useCore();
const { style } = useConfig();
const slots = useSlots();
const list: any[] = getValue(buttons, { scope }) || ["edit", "delete"];
return list.map((vnode) => {
if (vnode === "info") {
return (
{
crud.rowInfo(scope.row);
}}>
{crud.dict.label?.info}
);
} else if (vnode === "edit") {
return (
{
crud.rowEdit(scope.row);
}}>
{crud.dict.label?.update}
);
} else if (vnode === "delete") {
return (
{
crud.rowDelete(scope.row);
}}>
{crud.dict.label?.delete}
);
} else {
return (
!vnode.hidden &&
renderNode(vnode, {
scope,
slots,
custom(vnode) {
return (
{
vnode.onClick({ scope });
}}>
{vnode.label}
);
}
})
);
}
});
}
/**
* 解析扩展组件
*/
export function parseExtensionComponent(vnode: any) {
if (["el-select", "el-radio-group", "el-checkbox-group"].includes(vnode.name)) {
const list = getValue(vnode.options) || [];
const children = (
{list.map((e: any, i: number) => {
let label: any;
let value: any;
if (isString(e)) {
label = value = e;
} else if (isObject(e)) {
label = e.label;
value = e.value;
} else {
return ;
}
switch (vnode.name) {
case "el-select":
return ;
case "el-radio-group":
return (
{label}
);
case "el-checkbox-group":
return (
{label}
);
default:
return null;
}
})}
);
return {
children
};
} else {
return {};
}
}