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 {}; } }