UNPKG

@arco-vue-pro-components/pro-components

Version:
442 lines (441 loc) 13.6 kB
import { defineComponent, toRef, ref, computed, onMounted, watchEffect, watch, createVNode, isVNode, mergeProps, Fragment, cloneVNode } from "vue"; import { Form, Input, DatePicker, RangePicker, TimePicker, Textarea, CheckboxGroup, RadioGroup, Switch, Upload, Grid, GridItem, FormItem, Button, Space } from "@arco-design/web-vue"; import { IconDown } from "@arco-design/web-vue/es/icon"; import ProSelect from "../../pro-select/index.js"; import ProInputNumber from "../../pro-input-number/index.js"; import { useI18n } from "../../locale/index.js"; import { parsingValueEnumToArray, ObjToMap, runFunction, genColumnKey } from "../utils/index.js"; import { getPrefixCls } from "../../_utils/index.js"; function _isSlot(s) { return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s); } const inputDecimalTypes = ["digit", "decimal", "money", "percent"]; const renderFormInput = (item, type, formModel, formRef, slots, t) => { var _a; const data = { item, formModel, formRef, type }; if (item.renderFormItem) { return item.renderFormItem(data); } if (item.formSlotName && (slots == null ? void 0 : slots[item.formSlotName])) { return (_a = slots[item.formSlotName]) == null ? void 0 : _a.call(slots, data)[0]; } const valueType = typeof item.valueType === "function" ? item.valueType({}) : item.valueType; let options = []; if (item.valueEnum) { options = parsingValueEnumToArray(ObjToMap(runFunction(item.valueEnum, data))); } if (!valueType || valueType === "text") { const { valueEnum } = item; if (valueEnum) { return createVNode(ProSelect, mergeProps({ "style": { width: "100%" }, "columnKey": item.key, "options": options, "placeholder": t("tableForm.selectPlaceholder") }, item.fieldProps), null); } return createVNode(Input, mergeProps({ "placeholder": t("tableForm.inputPlaceholder"), "allowClear": true }, item.fieldProps), null); } if (valueType === "select") { return createVNode(ProSelect, mergeProps({ "style": { width: "100%" }, "columnKey": item.key, "placeholder": t("tableForm.selectPlaceholder"), "options": options }, item.fieldProps), null); } if (valueType === "date") { return createVNode(DatePicker, mergeProps({ "format": "YYYY-MM-DD", "style": { width: "100%" } }, item.fieldProps), null); } if (valueType === "dateTime") { return createVNode(DatePicker, mergeProps({ "showTime": true, "format": "YYYY-MM-DD HH:mm:ss", "style": { width: "100%" } }, item.fieldProps), null); } if (valueType === "dateRange") { return createVNode(RangePicker, mergeProps({ "style": { width: "100%" } }, item.fieldProps), null); } if (valueType === "dateTimeRange") { return createVNode(RangePicker, mergeProps({ "showTime": true, "style": { width: "100%" } }, item.fieldProps), null); } if (valueType === "time") { return createVNode(TimePicker, mergeProps({ "style": { width: "100%" } }, item.fieldProps), null); } if (valueType === "textarea" && type === "form") { return createVNode(Textarea, mergeProps({ "placeholder": t("tableForm.inputPlaceholder") }, item.fieldProps), null); } if (valueType === "checkbox") { return createVNode(CheckboxGroup, mergeProps({ "options": options }, item.fieldProps), null); } if (valueType === "radio" || valueType === "radioButton") { return createVNode(RadioGroup, mergeProps({ "type": valueType === "radioButton" ? "button" : "radio", "options": options }, item.fieldProps), null); } if (valueType === "switch") { return createVNode(Switch, mergeProps({ "checkedValue": 0, "uncheckedValue": 1 }, item.fieldProps), null); } if (valueType === "uploadFile") { return createVNode(Upload, mergeProps({ "action": "/" }, item.fieldProps, { "multiple": false }), null); } if (typeof valueType === "string" && inputDecimalTypes.includes(valueType)) { return createVNode(ProInputNumber, mergeProps({ "type": valueType }, item.fieldProps), null); } return createVNode(Input, mergeProps({ "placeholder": t("tableForm.inputPlaceholder"), "allowClear": true }, item.fieldProps), null); }; const defaultSearch = { searchText: "\u67E5\u8BE2", resetText: "\u91CD\u7F6E", submitText: "\u63D0\u4EA4", collapseRender: (collapsed) => collapsed ? "\u5C55\u5F00" : "\u6536\u8D77" }; const getDefaultSearch = (search, t, isForm) => { const config = { collapseRender: (collapsed) => { if (collapsed) { return createVNode(Fragment, null, [t("tableForm.collapsed"), createVNode(IconDown, { "style": { verticalAlign: "middle", fontSize: "16px", marginLeft: "8px", transition: "0.3s all", transform: `rotate(${collapsed ? 0 : 0.5}turn)` } }, null)]); } return createVNode(Fragment, null, [t("tableForm.expand"), createVNode(IconDown, { "style": { verticalAlign: "baseline", fontSize: "16px", marginLeft: "8px", transition: "0.3s all", transform: `rotate(${collapsed ? 0 : 0.5}turn)` } }, null)]); }, searchText: defaultSearch.searchText, resetText: defaultSearch.resetText, submitText: defaultSearch.submitText }; if (search === void 0 || search === true) { return config; } return { ...config, ...search }; }; var FormSearch = defineComponent({ name: "ProFormSearch", props: { columns: { type: Array, default: () => [] }, search: { type: [Object, Boolean], default: true }, type: { type: String, default: "table" }, defaultFormData: { type: Object, default: () => ({}) }, formRef: { type: Function }, submitButtonLoading: { type: Boolean } }, emits: { submit: (formData, firstLoad) => true, reset: (formData) => true, cancel: () => true }, setup(props, { slots, attrs, emit }) { var _a; const columns = toRef(props, "columns"); const defaultFormData = toRef(props, "defaultFormData"); const formSearchRef = ref(); const { t } = useI18n(); const prefixCls = getPrefixCls("pro-table"); const searchConfig = computed(() => getDefaultSearch(props.search, t, props.type === "form")); const isForm = computed(() => props.type === "form"); const onReset = () => { formSearchRef.value.resetFields(); handleReset(); }; const onSubmit = async () => { var _a2; const res = await ((_a2 = formSearchRef.value) == null ? void 0 : _a2.validate()); if (!res) { emit("submit", formModel.value); } }; onMounted(() => { if (props.type === "table") { emit("submit", defaultFormData.value, true); } }); watchEffect(() => { if (typeof props.formRef === "function" && formSearchRef.value) { formSearchRef.value.submit = onSubmit; formSearchRef.value.reset = onReset; props.formRef(formSearchRef.value); } }); const formModel = ref(props.defaultFormData || {}); const collapsed = ref((_a = searchConfig.value.collapsed) != null ? _a : true); const columnsList = ref([]); const gridKey = ref(Date.now()); watch(columns, (columns2) => { columnsList.value = columns2.filter((item) => { if (item.hideInSearch && props.type !== "form") { return false; } if (props.type === "form" && item.hideInForm) { return false; } if (!(item.valueType === "index" || item.valueType === "indexBorder") && (item.key || item.dataIndex)) { return true; } return false; }).sort((a, b) => { if (a && b) { return (b.order || 0) - (a.order || 0); } if (a && a.order) { return -1; } if (b && b.order) { return 1; } return 0; }) || []; gridKey.value = Date.now(); }, { deep: true, immediate: true }); const handleReset = () => { emit("reset", formModel.value); }; const handleSubmit = ({ values, errors } = {}) => { if (!errors) { emit("submit", values || {}); } }; const renderGridFormItems = () => { return createVNode(Grid, mergeProps(gridProps.value, props.search && props.search !== true ? props.search.gridProps : void 0, { "key": gridKey.value, "collapsedRows": 1 }), { default: () => [columnsList.value.map((item, index) => { var _a2; const key = genColumnKey(item.key || ((_a2 = item.dataIndex) == null ? void 0 : _a2.toString()), index); const getTitle = () => { if (item.title && typeof item.title === "function") { return item.title(item, "form"); } return item.title; }; const title = getTitle(); const valueType = typeof item.valueType === "function" ? item.valueType({}) : item.valueType; const hidden = valueType === "hidden"; return createVNode(GridItem, mergeProps({ "key": key, "hidden": hidden }, item.girdItemProps), { default: () => { var _a3; return [createVNode(FormItem, mergeProps({ "field": item.dataIndex, "label": !hidden && typeof title === "string" ? title : void 0, "tooltip": (_a3 = item.formItemProps) == null ? void 0 : _a3.tooltip }, isForm.value ? item.formItemProps : {}), { default: () => [cloneVNode(renderFormInput(item, props.type, formModel, formSearchRef, slots, t), { "modelValue": formModel.value[item.dataIndex], "onUpdate:modelValue": (value) => { formModel.value[item.dataIndex] = value; } })], label: () => { return hidden ? "" : title; } })]; } }); }), createVNode(GridItem, { "span": 1, "suffix": true, "style": [{ "text-align": "right" }, !isForm.value ? { "margin-bottom": "20px" } : {}] }, { default: ({ overflow }) => { return renderFormOption(collapsed.value ? overflow : true); } })] }); }; const renderFormOption = (showCollapseButton) => { if (searchConfig.value.optionRender === false) { return null; } const optionProps = { searchConfig: searchConfig.value, collapse: collapsed.value, setCollapse: (value) => { collapsed.value = value; }, type: props.type, submit: onSubmit, reset: onReset, dom: [createVNode(Button, { "onClick": onReset }, { default: () => [searchConfig.value.resetText] }), createVNode(Button, { "type": "primary", "htmlType": "submit", "loading": props.submitButtonLoading }, { default: () => [isForm.value ? searchConfig.value.submitText : searchConfig.value.searchText] })], form: formSearchRef, showCollapseButton }; let dom = null; if (searchConfig.value.optionRender || (slots == null ? void 0 : slots["option-render"])) { if (slots == null ? void 0 : slots["option-render"]) { dom = slots == null ? void 0 : slots["option-render"](optionProps); } if (searchConfig.value.optionRender) { dom = searchConfig.value.optionRender(optionProps); } } return createVNode(Space, { "size": 16 }, { default: () => [createVNode(Space, null, { default: () => [dom || optionProps.dom] }), !isForm.value && showCollapseButton && createVNode("a", { "class": `${prefixCls}-collapse-button`, "onClick": () => { collapsed.value = !collapsed.value; } }, [searchConfig.value.collapseRender && searchConfig.value.collapseRender(collapsed.value)])] }); }; const gridProps = computed(() => props.type === "form" ? { cols: 1, collapsed: false } : { cols: { xs: 1, sm: 2, md: 3 }, collapsed: collapsed.value }); const render = () => { let _slot; return createVNode(Form, { "model": formModel.value, "ref": formSearchRef, "layout": isForm.value ? "vertical" : "horizontal", "onSubmit": handleSubmit }, _isSlot(_slot = renderGridFormItems()) ? _slot : { default: () => [_slot] }); }; return { render, selfSubmit: handleSubmit, selfReset: handleReset, formSearchRef }; }, methods: { submit(data) { return this.selfSubmit(data); }, reset() { return this.selfReset(); } }, render() { return this.render(); } }); export { FormSearch as default, renderFormInput };