@zhsz/cool-design-crud
Version:
218 lines (217 loc) • 5.59 kB
JavaScript
import { defineComponent, reactive, mergeProps, inject, ref, createVNode, nextTick, h } from "vue";
import { Button, Drawer } from "tdesign-vue-next";
import { useForm } from "../../hooks/crud.mjs";
import { useCore, useTools } from "../../hooks/core.mjs";
import "clone-deep";
import "array.prototype.flat";
import "merge";
import "@formily/core";
import "lodash-es";
import "../../hooks/table.mjs";
import ClForm from "../form/index.mjs";
import { CloseIcon, SearchIcon, RefreshIcon, DeleteTimeIcon } from "tdesign-icons-vue-next";
const index = /* @__PURE__ */ defineComponent({
name: "cl-adv-search",
components: {
CloseIcon,
TdButton: Button,
Drawer,
ClForm
},
props: {
/** 表单值 */
data: {
type: Object
},
/** 表单协议 */
schema: {
type: Object
},
/** 协议表达式作用域 */
scope: Object,
/** 注册组件列表 */
registerComponents: Object,
/** 副作用逻辑,用于实现各种联动逻辑 */
formEffects: Function,
/** 表单配置项 */
props: Object,
/** 标题 */
title: String,
/** 窗体大小 */
size: {
type: [String],
default: "30%"
},
/** 操作按钮 */
op: {
type: Array
},
/** 搜索钩子 */
onSearch: Function,
/** 搜索钩子 */
onClear: Function,
/** 搜索钩子 */
onReset: Function
},
emits: ["reset", "clear"],
setup(props, {
emit,
slots,
expose
}) {
const {
crud,
mitt
} = useCore();
const {
style,
browser
} = useTools();
const Form = useForm();
const config = reactive(mergeProps(props, inject("useAdvSearch__options") || {}));
const visible = ref(false);
function open() {
visible.value = true;
nextTick(() => {
var _a;
(_a = Form.value) == null ? void 0 : _a.open({
op: {
hidden: true
},
props: config.props,
schema: config.schema || {},
registerComponents: config.registerComponents || {},
scope: config.scope || {},
effects: config.effects || void 0,
form: props.data || config.data || {},
isReset: false
});
});
}
function close() {
visible.value = false;
}
function reset() {
var _a;
const form = (_a = Form.value) == null ? void 0 : _a.reset();
if (config.onReset) {
config.onReset(form);
}
emit("reset", form);
}
function clear() {
var _a;
const form = (_a = Form.value) == null ? void 0 : _a.clear();
if (config.onClear) {
config.onClear(form);
}
emit("clear", form);
}
function search() {
var _a;
(_a = Form.value) == null ? void 0 : _a.submit((data) => {
async function next(params) {
close();
return await crud.refresh({
page: 1,
...params
});
}
if (config.onSearch) {
config.onSearch(data, {
next
});
} else {
next(data);
}
});
}
mitt.on("crud.openAdvSearch", open);
function renderForm() {
return createVNode(ClForm, {
"ref": Form,
"formEffects": props.formEffects,
"inner": true
}, {
...slots
});
}
function renderFooter() {
var _a;
const fns = {
search,
reset,
clear,
close
};
const icons = {
search: createVNode(SearchIcon, null, null),
reset: createVNode(RefreshIcon, null, null),
clear: createVNode(DeleteTimeIcon, null, null),
close: createVNode(CloseIcon, null, null)
};
return h("div", {
style: {
display: "inline-flex",
margin: "0 10px",
gap: "10px"
}
}, (_a = config.op) == null ? void 0 : _a.map((e) => {
switch (e) {
case "search":
case "reset":
case "clear":
case "close":
return h(createVNode(Button, {
"theme": e === "search" ? "primary" : "default",
"type": e === "search" ? "submit" : e === "reset" ? "reset" : "button",
"variant": e === "search" ? "base" : "outline",
"size": style.size,
"onClick": fns[e]
}, {
default: () => crud.dict.label[e],
icon: () => {
return icons[e];
}
}));
default:
return e ?? "";
}
}));
}
expose({
open,
close,
clear,
reset,
Form
});
return () => {
return createVNode(Drawer, {
"modal-class": "cl-adv-search",
"visible": visible.value,
"onUpdate:visible": ($event) => visible.value = $event,
"placement": "right",
"size": browser.isMini ? "100%" : config.size
}, {
header: () => createVNode("div", {
"class": "cl-adv-search__header"
}, [createVNode("span", {
"class": "text"
}, [config.title || crud.dict.label.advSearch]), createVNode(CloseIcon, {
"size": "20px",
"onClick": close
}, null)]),
body: () => createVNode("div", {
"class": "cl-adv-search__container"
}, [renderForm()]),
footer: () => createVNode("div", {
"class": "cl-adv-search__footer"
}, [renderFooter()])
});
};
}
});
export {
index as default
};