/** * @date 2023-06-07 AM 10:24 * @author 朴睦 * @description ProForm 组件 */ import { defineComponent, ref, watch, } from 'vue' import { Form, Row, Col, Input, InputNumber, Radio, Checkbox, DatePicker, Select, Switch, TimePicker, TreeSelect, Upload, Cascader, Button, Space, Textarea, type FormInstance, } from 'ant-design-vue' import { UpOutlined, DownOutlined, UploadOutlined } from '@ant-design/icons-vue' import { fnCopy } from '../ProTable/utils' import { ThemeColor } from '../ProTable/conf' import './style.less' import type { ProFormProps, FormEmit } from './types' import type { PMColumnType, ValueType, PMSetupContext } from '../ProTable/types' export default defineComponent(function ProForm(_, { attrs, expose, emit }: PMSetupContext) { const { search, isShowToolRender } = attrs // 初始值 form表单绑定值 const formVals: Record = {} let formColSpanNum = 0 attrs.formListData?.forEach((item) => { if (item.valueType === 'doubleDatePicker') { formVals[item.doubleFieldList![0]] = item.initialValue?.[0] ?? undefined formVals[item.doubleFieldList![1]] = item.initialValue?.[1] ?? undefined } formVals[item.dataIndex as string] = item.initialValue ?? undefined // 出现了多少次 item.formColSpan && formColSpanNum++ }) const formState = ref>(formVals) const gutter = ref(24) const colSpan = ref(attrs.search?.colSpan || 6) const lastColSpan = ref(gutter.value) // 是否收起,默认收起 const isCollapsed = ref(isShowToolRender !== false ? search?.isCollapsed ?? true : false) const tQProFormRef = ref() const inputSearchRef = ref() watch([isCollapsed], () => { // 计算 lastColSpan // 每一行展示多少个 const rowNum = gutter.value / colSpan.value // 拿到最后一行展示的多少个 rowNum - 1 是收起时要展示的数目 const lastRowNum = isCollapsed.value ? rowNum - 1 : (attrs.formListData!.length - formColSpanNum) % rowNum // 就是 lastColSpan 的数目 lastColSpan.value = gutter.value - lastRowNum * colSpan.value }, { immediate: true, deep: true }) watch(() => attrs.search?.colSpan, () => { colSpan.value = attrs.search?.colSpan! }) /** * 渲染组件 * @param item 每一个 * @returns JSX.Element */ const formComponentRender = (item: PMColumnType) => { const { valueType = 'input', options = [], dataIndex } = item // 公共的属性 const commonProps = { value: formState.value[dataIndex as string], onChange: (val: any, ...args: any[]) => { // 表单改变,展开表单 isCollapsed.value = false // 传递收起展开事件 emit('collapsed', isCollapsed.value) if (valueType === 'inputSearch') { inputSearchRef.value.blur() return } if (['input', 'radio', 'textarea', 'inputSearchFillIn'].includes(valueType)) { formState.value[dataIndex as string] = val.target.value } else { item.fieldProps?.componentProps.onSelfChange?.(val, args) formState.value[dataIndex as string] = val } // 进行复制 if ( item.valueType === 'select' && !item.fieldProps?.componentProps.mode && item.fieldProps?.componentProps.showSearch ) { fnCopy(args[0].label) } }, onfocus() { // 表单改变,展开表单 isCollapsed.value = false // 传递收起展开事件 emit('collapsed', isCollapsed.value) } } const componentMap: Record = { input: ( ), inputSearch: ( ), inputSearchFillIn: ( ), textarea: (