UNPKG

@vrx-arco/pro-components

Version:

<p align="center"> <img src="https://vrx-arco.github.io/arco-design-pro/favicon.svg" width="200" height="250"> </p>

212 lines (211 loc) 5.58 kB
import { defineComponent, toRef, ref, onMounted, createVNode, createTextVNode, toRaw } from "vue"; import { Form, Row, Space, Button } from "@arco-design/web-vue"; import { klona } from "klona/lite"; import { useAsyncLoading } from "@vrx/core"; import { useGrid } from "@vrx-arco/use"; import IconRefresh from "@vrx-arco/icons-vue/IconRefresh"; import IconSearch from "@vrx-arco/icons-vue/IconSearch"; import { style } from "../style/var.mjs"; import { provideSearchBar } from "./context.mjs"; const SearchBar = /* @__PURE__ */ defineComponent({ name: "vrx-arco-search-bar", props: { /** * 数据源 * 如需要使用自动重置,自动验证功能 该选项必填* */ model: { type: Object, default: () => ({}) }, /** * label 的栅格布局 */ labelColProps: Object, /** * content 的栅格布局 */ wrapperColProps: Object, /** * 禁用表单 */ disabled: Boolean, /** * 表单验证规则 */ rules: [Object, Array], /** * 点击重置按钮的时候根据`model` 初始值自动重置表单 */ resetOnButtonClick: { type: Boolean, default: false }, /** * 点击搜索按钮的时候触发验证 */ validOnButtonClick: { type: Boolean, default: false }, onSearch: Function, onReset: Function, /** * 表单栅格布局 */ column: { type: [Number, Object], default: () => ({ xs: 1, sm: 2, md: 2, lg: 3, xl: 3, xxl: 4 }) }, /** * 劫持`search-bar-item` 第一个元素 自动绑定 `v-model` */ autoUpdate: { type: Boolean, default: false }, /** * 隐藏重置按钮 */ hideReset: { type: Boolean, default: false }, /** * 隐藏操作栏 */ hideAction: { type: Boolean, default: false } }, emits: ["search", "reset"], setup: (props, { slots }) => { const { bemClass } = style("search-bar"); const model = toRef(props, "model"); const column = toRef(props, "column"); const autoUpdate = toRef(props, "autoUpdate"); const { gridProps } = useGrid(true, column); provideSearchBar({ gridProps, model, autoUpdate }); const formRef = ref(); const resetModel = ref(); const { loading: searchLoading, run: searchRun } = useAsyncLoading(); const handleSearch = () => { if (!props.validOnButtonClick) { searchRun(Promise.resolve().then(() => { var _a; return (_a = props.onSearch) == null ? void 0 : _a.call(props, toRaw(model.value)); })); return; } searchRun(formRef.value.validate().then((error) => error ? Promise.reject(error) : Promise.resolve()).then(() => { var _a; return (_a = props.onSearch) == null ? void 0 : _a.call(props, toRaw(model.value)); })); }; const { loading: resetLoading, run: resetRun } = useAsyncLoading(); const handleReset = () => { if (props.resetOnButtonClick) { Object.keys(model.value).forEach((key) => { model.value[key] = klona(resetModel.value[key]); }); } resetRun(Promise.resolve().then(() => { var _a; return (_a = props.onReset) == null ? void 0 : _a.call(props, toRaw(model.value)); })); }; onMounted(() => { resetModel.value = klona(model.value); }); return () => { const { labelColProps, wrapperColProps, disabled, hideAction, hideReset } = props; const renderAction = () => { if (hideAction) { return; } return createVNode("div", { "class": bemClass("__button-box") }, [createVNode(Space, { "direction": "vertical" }, { default: () => [createVNode(Button, { "type": "primary", "onClick": handleSearch, "loading": searchLoading.value, "disabled": disabled || resetLoading.value, "htmlType": "submit" }, { default: () => [createTextVNode("搜索")], icon: () => createVNode(IconSearch, { "class": "arco-icon" }, null) }), !hideReset && createVNode(Button, { "onClick": handleReset, "loading": resetLoading.value, "disabled": disabled || searchLoading.value }, { default: () => [createTextVNode("重置")], icon: () => createVNode(IconRefresh, { "class": "arco-icon" }, null) })] })]); }; return createVNode(Form, { "ref": formRef, "layout": "horizontal", "labelAlign": "left", "autoLabelWidth": true, "model": model.value, "wrapperColProps": wrapperColProps, "labelColProps": labelColProps, "disabled": disabled || resetLoading.value || searchLoading.value }, { default: () => [createVNode("div", { "class": bemClass() }, [createVNode(Row, { "align": "center", "class": bemClass("__form-row"), "gutter": [24, 8] }, { default: () => { var _a; return [(_a = slots.default) == null ? void 0 : _a.call(slots)]; } }), renderAction()])] }); }; } }); export { SearchBar };