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.73 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const vue = require("vue"); const webVue = require("@arco-design/web-vue"); const lite = require("klona/lite"); const core = require("@vrx/core"); const use = require("@vrx-arco/use"); const IconRefresh = require("@vrx-arco/icons-vue/IconRefresh"); const IconSearch = require("@vrx-arco/icons-vue/IconSearch"); const _var = require("../style/var.js"); const context = require("./context.js"); const SearchBar = /* @__PURE__ */ vue.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 } = _var.style("search-bar"); const model = vue.toRef(props, "model"); const column = vue.toRef(props, "column"); const autoUpdate = vue.toRef(props, "autoUpdate"); const { gridProps } = use.useGrid(true, column); context.provideSearchBar({ gridProps, model, autoUpdate }); const formRef = vue.ref(); const resetModel = vue.ref(); const { loading: searchLoading, run: searchRun } = core.useAsyncLoading(); const handleSearch = () => { if (!props.validOnButtonClick) { searchRun(Promise.resolve().then(() => { var _a; return (_a = props.onSearch) == null ? void 0 : _a.call(props, vue.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, vue.toRaw(model.value)); })); }; const { loading: resetLoading, run: resetRun } = core.useAsyncLoading(); const handleReset = () => { if (props.resetOnButtonClick) { Object.keys(model.value).forEach((key) => { model.value[key] = lite.klona(resetModel.value[key]); }); } resetRun(Promise.resolve().then(() => { var _a; return (_a = props.onReset) == null ? void 0 : _a.call(props, vue.toRaw(model.value)); })); }; vue.onMounted(() => { resetModel.value = lite.klona(model.value); }); return () => { const { labelColProps, wrapperColProps, disabled, hideAction, hideReset } = props; const renderAction = () => { if (hideAction) { return; } return vue.createVNode("div", { "class": bemClass("__button-box") }, [vue.createVNode(webVue.Space, { "direction": "vertical" }, { default: () => [vue.createVNode(webVue.Button, { "type": "primary", "onClick": handleSearch, "loading": searchLoading.value, "disabled": disabled || resetLoading.value, "htmlType": "submit" }, { default: () => [vue.createTextVNode("搜索")], icon: () => vue.createVNode(IconSearch, { "class": "arco-icon" }, null) }), !hideReset && vue.createVNode(webVue.Button, { "onClick": handleReset, "loading": resetLoading.value, "disabled": disabled || searchLoading.value }, { default: () => [vue.createTextVNode("重置")], icon: () => vue.createVNode(IconRefresh, { "class": "arco-icon" }, null) })] })]); }; return vue.createVNode(webVue.Form, { "ref": formRef, "layout": "horizontal", "labelAlign": "left", "autoLabelWidth": true, "model": model.value, "wrapperColProps": wrapperColProps, "labelColProps": labelColProps, "disabled": disabled || resetLoading.value || searchLoading.value }, { default: () => [vue.createVNode("div", { "class": bemClass() }, [vue.createVNode(webVue.Row, { "align": "center", "class": bemClass("__form-row"), "gutter": [24, 8] }, { default: () => { var _a; return [(_a = slots.default) == null ? void 0 : _a.call(slots)]; } }), renderAction()])] }); }; } }); exports.SearchBar = SearchBar;