@zhsz/cool-design-crud
Version:
285 lines (284 loc) • 8.32 kB
JavaScript
import { h, createVNode, withDirectives, vShow, mergeProps, isVNode, resolveComponent } from "vue";
import "./test.mjs";
import { useTools, useCore } from "../hooks/core.mjs";
import { isArray, isObject, isString, isBoolean, isFunction } from "./index.mjs";
import "@formily/core";
import { omit } from "lodash-es";
import "../hooks/table.mjs";
import { Tag, Dropdown, Button, DropdownMenu, DropdownItem } from "tdesign-vue-next";
import { EllipsisIcon } from "tdesign-icons-vue-next";
function _isSlot(s) {
return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s);
}
function parseFunctionField(value, {
scope
}, defaultValue) {
if (isBoolean(value)) {
return value;
} else if (isFunction(value)) {
return value({
scope
});
}
return defaultValue;
}
function calculateProperties(properties, form) {
for (const item in properties) {
const element = properties[item];
if (isObject(element) && !isArray(element) && item !== "cProps") {
calculateProperties(element, form);
}
}
if (properties.hidden !== void 0)
properties._hidden = parseFunctionField(properties.hidden, {
scope: form
}, false);
if (properties.filter !== void 0)
properties._filter = parseFunctionField(properties.filter, {
scope: form
}, false);
if (properties.visible !== void 0)
properties._visible = parseFunctionField(properties.visible, {
scope: form
}, true);
if (properties.required !== void 0)
properties._required = parseFunctionField(properties.required, {
scope: form
}, false);
if (properties == null ? void 0 : properties.properties) {
calculateProperties(properties.properties, form);
}
if (properties == null ? void 0 : properties.items) {
calculateProperties(properties.items, form);
}
}
function parseTableDict(value, data) {
let list = [];
let isText = false;
let separator = ",";
if (data == null ? void 0 : data.options) {
list = data.options;
isText = data.text;
separator = data.separator;
} else {
list = data;
}
const values = isArray(value) ? value : [value];
const arr = values.map((v) => {
const d = list.find((d2) => d2.value === v);
if (d) {
return isText ? d.label : h(Tag, {
...d,
style: {
margin: "2px"
}
}, {
default: () => d.label
});
} else {
return v || "-";
}
});
return isText ? arr.join(separator) : arr;
}
function parseTableOpButtons({
buttons,
length = 3
}, {
scope
}) {
const {
getValue
} = useTools();
const list = (getValue(buttons, {
scope
}) || ["edit", "delete"]).filter((item) => !["", void 0, null].includes(item));
if (list.length <= length) {
return list.map((vnode) => {
return generateButtons(vnode, scope);
});
} else {
return generateDropDown(list, scope);
}
}
function generateDropDown(list, scope) {
let _slot;
const {
crud
} = useCore();
return createVNode(Dropdown, {
"trigger": "click"
}, {
default: () => [createVNode(Button, {
"theme": "default",
"variant": "text",
"shape": "square"
}, {
default: () => [createVNode(EllipsisIcon, {
"size": "16"
}, null)]
}), createVNode(DropdownMenu, null, _isSlot(_slot = list.map((vnode) => {
if (vnode === "info") {
return withDirectives(createVNode(DropdownItem, {
"onClick": () => {
crud.rowInfo(scope.row);
}
}, {
default: () => {
var _a;
return [(_a = crud.dict.label) == null ? void 0 : _a.info];
}
}), [[vShow, crud.getPermission("info")]]);
} else if (vnode === "edit") {
return withDirectives(createVNode(DropdownItem, {
"onClick": () => {
crud.rowEdit(scope.row);
}
}, {
default: () => {
var _a;
return [(_a = crud.dict.label) == null ? void 0 : _a.update];
}
}), [[vShow, crud.getPermission("update")]]);
} else if (vnode === "delete") {
return withDirectives(createVNode(DropdownItem, {
"theme": "error",
"onClick": () => {
crud.rowDelete(scope.row);
}
}, {
default: () => {
var _a;
return [(_a = crud.dict.label) == null ? void 0 : _a.delete];
}
}), [[vShow, crud.getPermission("delete")]]);
} else {
return !vnode.hidden && createVNode(DropdownItem, mergeProps(omit(vnode == null ? void 0 : vnode.dropdownProps, ["onClick", "hidden", "label"]), {
"onClick": () => {
vnode.onClick({
scope
});
}
}), {
default: () => [vnode.label]
});
}
})) ? _slot : {
default: () => [_slot]
})]
});
}
function generateButtons(vnode, scope) {
var _a, _b, _c, _d;
useTools();
const {
crud
} = useCore();
if (vnode === "info") {
return withDirectives(createVNode(Button, {
"size": "small",
"onClick": () => {
crud.rowInfo(scope.row);
}
}, {
default: () => {
var _a2;
return [(_a2 = crud.dict.label) == null ? void 0 : _a2.info];
}
}), [[vShow, crud.getPermission("info")]]);
} else if (vnode === "edit") {
return withDirectives(createVNode(Button, {
"theme": "primary",
"size": "small",
"onClick": () => {
crud.rowEdit(scope.row);
}
}, {
default: () => {
var _a2;
return [(_a2 = crud.dict.label) == null ? void 0 : _a2.update];
}
}), [[vShow, crud.getPermission("update")]]);
} else if (vnode === "delete") {
return withDirectives(createVNode(Button, {
"theme": "danger",
"size": "small",
"onClick": () => {
crud.rowDelete(scope.row);
}
}, {
default: () => {
var _a2;
return [(_a2 = crud.dict.label) == null ? void 0 : _a2.delete];
}
}), [[vShow, crud.getPermission("delete")]]);
} else {
return !vnode.hidden && createVNode(Button, mergeProps(omit(vnode.buttonProps, ["variant", "onClick", "hidden", "type", "theme", "size", "label"]), {
"variant": ((_a = vnode == null ? void 0 : vnode.buttonProps) == null ? void 0 : _a.variant) || "base",
"type": (_b = vnode == null ? void 0 : vnode.buttonProps) == null ? void 0 : _b.type,
"size": ((_c = vnode == null ? void 0 : vnode.buttonProps) == null ? void 0 : _c.size) || "small",
"theme": (_d = vnode == null ? void 0 : vnode.buttonProps) == null ? void 0 : _d.theme,
"onClick": () => {
vnode.onClick({
scope
});
}
}), {
default: () => [vnode.label]
});
}
}
function parseExtensionComponent(vnode) {
const {
getValue
} = useTools();
if (["t-select", "t-radio-group", "t-checkbox-group"].includes(vnode.name)) {
const list = getValue(vnode.options) || [];
const children = createVNode("div", null, [list.map((e, i) => {
if (vnode.name === "t-select") {
let label, value;
if (isString(e)) {
label = value = e;
} else if (isObject(e)) {
label = e.label;
value = e.value;
} else {
return h("div", {}, `组件渲染失败,options 参数错误`);
}
return createVNode(resolveComponent("t-option"), mergeProps({
"key": i,
"label": label,
"value": value
}, e.props), null);
} else if (vnode.name === "t-radio-group") {
return createVNode(resolveComponent("t-radio"), mergeProps({
"key": i,
"label": e.value
}, e.props), {
default: () => [e.label]
});
} else if (vnode.name === "t-checkbox-group") {
return createVNode(resolveComponent("t-checkbox"), mergeProps({
"key": i,
"label": e.value
}, e.props), {
default: () => [e.label]
});
} else {
return null;
}
})]);
return {
children
};
} else {
return {};
}
}
export {
calculateProperties,
parseExtensionComponent,
parseFunctionField,
parseTableDict,
parseTableOpButtons
};