@zhsz/cool-design-crud
Version:
218 lines (217 loc) • 5.94 kB
JavaScript
"use strict";
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
const vue = require("vue");
const tdesignVueNext = require("tdesign-vue-next");
const crud = require("../../hooks/crud.js");
const core = require("../../hooks/core.js");
require("clone-deep");
require("array.prototype.flat");
require("merge");
require("@formily/core");
require("lodash-es");
require("../../hooks/table.js");
const index$1 = require("../form/index.js");
const tdesignIconsVueNext = require("tdesign-icons-vue-next");
const index = /* @__PURE__ */ vue.defineComponent({
name: "cl-adv-search",
components: {
CloseIcon: tdesignIconsVueNext.CloseIcon,
TdButton: tdesignVueNext.Button,
Drawer: tdesignVueNext.Drawer,
ClForm: index$1.default
},
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: crud$1,
mitt
} = core.useCore();
const {
style,
browser
} = core.useTools();
const Form = crud.useForm();
const config = vue.reactive(vue.mergeProps(props, vue.inject("useAdvSearch__options") || {}));
const visible = vue.ref(false);
function open() {
visible.value = true;
vue.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$1.refresh({
page: 1,
...params
});
}
if (config.onSearch) {
config.onSearch(data, {
next
});
} else {
next(data);
}
});
}
mitt.on("crud.openAdvSearch", open);
function renderForm() {
return vue.createVNode(index$1.default, {
"ref": Form,
"formEffects": props.formEffects,
"inner": true
}, {
...slots
});
}
function renderFooter() {
var _a;
const fns = {
search,
reset,
clear,
close
};
const icons = {
search: vue.createVNode(tdesignIconsVueNext.SearchIcon, null, null),
reset: vue.createVNode(tdesignIconsVueNext.RefreshIcon, null, null),
clear: vue.createVNode(tdesignIconsVueNext.DeleteTimeIcon, null, null),
close: vue.createVNode(tdesignIconsVueNext.CloseIcon, null, null)
};
return vue.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 vue.h(vue.createVNode(tdesignVueNext.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$1.dict.label[e],
icon: () => {
return icons[e];
}
}));
default:
return e ?? "";
}
}));
}
expose({
open,
close,
clear,
reset,
Form
});
return () => {
return vue.createVNode(tdesignVueNext.Drawer, {
"modal-class": "cl-adv-search",
"visible": visible.value,
"onUpdate:visible": ($event) => visible.value = $event,
"placement": "right",
"size": browser.isMini ? "100%" : config.size
}, {
header: () => vue.createVNode("div", {
"class": "cl-adv-search__header"
}, [vue.createVNode("span", {
"class": "text"
}, [config.title || crud$1.dict.label.advSearch]), vue.createVNode(tdesignIconsVueNext.CloseIcon, {
"size": "20px",
"onClick": close
}, null)]),
body: () => vue.createVNode("div", {
"class": "cl-adv-search__container"
}, [renderForm()]),
footer: () => vue.createVNode("div", {
"class": "cl-adv-search__footer"
}, [renderFooter()])
});
};
}
});
exports.default = index;