提交 47a448b8 编写于 作者: 无木

feat(form): add `Divider` for schema component type

新增Divider用于较长表单的区域分割
上级 5138e447
### ✨ Features
- **BasicForm** 表单组件新增`Divider`,用于较长表单的区域分割
### 🐛 Bug Fixes
- **其它** 修复部分封装组件在使用插槽时报错的问题
## 2.7.1(2021-08-16) ## 2.7.1(2021-08-16)
- 升级 vue 3.2,如果运行失败,删除 node_modules 后重装即可 - 升级 vue 3.2,如果运行失败,删除 node_modules 后重装即可
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#[item]="data" #[item]="data"
v-for="item in ['resetBefore', 'submitBefore', 'advanceBefore', 'advanceAfter']" v-for="item in ['resetBefore', 'submitBefore', 'advanceBefore', 'advanceAfter']"
> >
<slot :name="item" v-bind="data"></slot> <slot :name="item" v-bind="data || {}"></slot>
</template> </template>
</FormAction> </FormAction>
<slot name="formFooter"></slot> <slot name="formFooter"></slot>
...@@ -132,7 +132,11 @@ ...@@ -132,7 +132,11 @@
} }
} }
} }
return schemas as FormSchema[]; if (unref(getProps).showAdvancedButton) {
return schemas.filter((schema) => schema.component !== 'Divider') as FormSchema[];
} else {
return schemas as FormSchema[];
}
}); });
const { handleToggleAdvanced } = useAdvanced({ const { handleToggleAdvanced } = useAdvanced({
......
...@@ -18,6 +18,7 @@ import { ...@@ -18,6 +18,7 @@ import {
TreeSelect, TreeSelect,
Slider, Slider,
Rate, Rate,
Divider,
} from 'ant-design-vue'; } from 'ant-design-vue';
import RadioButtonGroup from './components/RadioButtonGroup.vue'; import RadioButtonGroup from './components/RadioButtonGroup.vue';
...@@ -61,6 +62,7 @@ componentMap.set('IconPicker', IconPicker); ...@@ -61,6 +62,7 @@ componentMap.set('IconPicker', IconPicker);
componentMap.set('InputCountDown', CountdownInput); componentMap.set('InputCountDown', CountdownInput);
componentMap.set('Upload', BasicUpload); componentMap.set('Upload', BasicUpload);
componentMap.set('Divider', Divider);
export function add(compName: ComponentType, component: Component) { export function add(compName: ComponentType, component: Component) {
componentMap.set(compName, component); componentMap.set(compName, component);
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
import type { ValidationRule } from 'ant-design-vue/lib/form/Form'; import type { ValidationRule } from 'ant-design-vue/lib/form/Form';
import type { TableActionType } from '/@/components/Table'; import type { TableActionType } from '/@/components/Table';
import { defineComponent, computed, unref, toRefs } from 'vue'; import { defineComponent, computed, unref, toRefs } from 'vue';
import { Form, Col } from 'ant-design-vue'; import { Form, Col, Divider } from 'ant-design-vue';
import { componentMap } from '../componentMap'; import { componentMap } from '../componentMap';
import { BasicHelp } from '/@/components/Basic'; import { BasicHelp } from '/@/components/Basic';
import { isBoolean, isFunction, isNull } from '/@/utils/is'; import { isBoolean, isFunction, isNull } from '/@/utils/is';
...@@ -73,11 +73,17 @@ ...@@ -73,11 +73,17 @@
const getComponentsProps = computed(() => { const getComponentsProps = computed(() => {
const { schema, tableAction, formModel, formActionType } = props; const { schema, tableAction, formModel, formActionType } = props;
const { componentProps = {} } = schema; let { componentProps = {} } = schema;
if (!isFunction(componentProps)) { if (isFunction(componentProps)) {
return componentProps; componentProps = componentProps({ schema, tableAction, formModel, formActionType }) ?? {};
} }
return componentProps({ schema, tableAction, formModel, formActionType }) ?? {}; if (schema.component === 'Divider') {
componentProps = Object.assign({ type: 'horizontal' }, componentProps, {
orientation: 'left',
plain: true,
});
}
return componentProps;
}); });
const getDisable = computed(() => { const getDisable = computed(() => {
...@@ -300,38 +306,46 @@ ...@@ -300,38 +306,46 @@
} }
function renderItem() { function renderItem() {
const { itemProps, slot, render, field, suffix } = props.schema; const { itemProps, slot, render, field, suffix, component, label } = props.schema;
const { labelCol, wrapperCol } = unref(itemLabelWidthProp); const { labelCol, wrapperCol } = unref(itemLabelWidthProp);
const { colon } = props.formProps; const { colon } = props.formProps;
const getContent = () => { if (component === 'Divider') {
return slot return (
? getSlot(slots, slot, unref(getValues)) <Col span={24}>
: render <Divider {...unref(getComponentsProps)}>{label}</Divider>
? render(unref(getValues)) </Col>
: renderComponent(); );
}; } else {
const getContent = () => {
const showSuffix = !!suffix; return slot
const getSuffix = isFunction(suffix) ? suffix(unref(getValues)) : suffix; ? getSlot(slots, slot, unref(getValues))
: render
return ( ? render(unref(getValues))
<Form.Item : renderComponent();
name={field} };
colon={colon}
class={{ 'suffix-item': showSuffix }} const showSuffix = !!suffix;
{...(itemProps as Recordable)} const getSuffix = isFunction(suffix) ? suffix(unref(getValues)) : suffix;
label={renderLabelHelpMessage()}
rules={handleRules()} return (
labelCol={labelCol} <Form.Item
wrapperCol={wrapperCol} name={field}
> colon={colon}
<div style="display:flex"> class={{ 'suffix-item': showSuffix }}
<div style="flex:1">{getContent()}</div> {...(itemProps as Recordable)}
{showSuffix && <span class="suffix">{getSuffix}</span>} label={renderLabelHelpMessage()}
</div> rules={handleRules()}
</Form.Item> labelCol={labelCol}
); wrapperCol={wrapperCol}
>
<div style="display:flex">
<div style="flex:1">{getContent()}</div>
{showSuffix && <span class="suffix">{getSuffix}</span>}
</div>
</Form.Item>
);
}
} }
return () => { return () => {
......
...@@ -149,7 +149,9 @@ export function useFormEvents({ ...@@ -149,7 +149,9 @@ export function useFormEvents({
updateData = [...data]; updateData = [...data];
} }
const hasField = updateData.every((item) => Reflect.has(item, 'field') && item.field); const hasField = updateData.every(
(item) => item.component === 'Divider' || (Reflect.has(item, 'field') && item.field)
);
if (!hasField) { if (!hasField) {
error( error(
...@@ -169,7 +171,9 @@ export function useFormEvents({ ...@@ -169,7 +171,9 @@ export function useFormEvents({
updateData = [...data]; updateData = [...data];
} }
const hasField = updateData.every((item) => Reflect.has(item, 'field') && item.field); const hasField = updateData.every(
(item) => item.component === 'Divider' || (Reflect.has(item, 'field') && item.field)
);
if (!hasField) { if (!hasField) {
error( error(
......
...@@ -109,4 +109,5 @@ export type ComponentType = ...@@ -109,4 +109,5 @@ export type ComponentType =
| 'IconPicker' | 'IconPicker'
| 'Render' | 'Render'
| 'Slider' | 'Slider'
| 'Rate'; | 'Rate'
| 'Divider';
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import { BasicForm, FormSchema, useForm } from '/@/components/Form/index'; import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
import { CollapseContainer } from '/@/components/Container/index'; import { CollapseContainer } from '/@/components/Container';
import { PageWrapper } from '/@/components/Page'; import { PageWrapper } from '/@/components/Page';
const getSchamas = (): FormSchema[] => { const getSchamas = (): FormSchema[] => {
...@@ -173,7 +173,12 @@ ...@@ -173,7 +173,12 @@
} }
const [register1] = useForm({ const [register1] = useForm({
labelWidth: 120, labelWidth: 120,
schemas: [...getSchamas(), ...getAppendSchemas(), ...extraSchemas], schemas: [
...getSchamas(),
...getAppendSchemas(),
{ field: '', component: 'Divider', label: '更多字段' },
...extraSchemas,
],
actionColOptions: { actionColOptions: {
span: 24, span: 24,
}, },
......
...@@ -100,6 +100,11 @@ ...@@ -100,6 +100,11 @@
}; };
const schemas: FormSchema[] = [ const schemas: FormSchema[] = [
{
field: '',
component: 'Divider',
label: '基础字段',
},
{ {
field: 'field1', field: 'field1',
component: 'Input', component: 'Input',
...@@ -293,6 +298,11 @@ ...@@ -293,6 +298,11 @@
], ],
}, },
}, },
{
field: '',
component: 'Divider',
label: '远程下拉演示',
},
{ {
field: 'field30', field: 'field30',
component: 'ApiSelect', component: 'ApiSelect',
...@@ -362,6 +372,11 @@ ...@@ -362,6 +372,11 @@
span: 8, span: 8,
}, },
}, },
{
field: '',
component: 'Divider',
label: '其它',
},
{ {
field: 'field20', field: 'field20',
component: 'InputNumber', component: 'InputNumber',
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册