From 32574ddae0e16a9154f30855bd0a8497aec257d9 Mon Sep 17 00:00:00 2001 From: sunshineLixun <1261142605@qq.com> Date: Mon, 16 Jan 2023 17:31:28 +0800 Subject: [PATCH 1/4] feat: add ProFormRadio --- .../pro-field/src/components/Radio/index.tsx | 58 +++++++++++++++++++ .../pro-field/src/components/Radio/types.ts | 12 ++++ .../src/components/TimePicker/index.tsx | 4 +- packages/pro-field/src/index.tsx | 18 ++++++ packages/pro-form/examples/views/ProForm.vue | 35 +++++++++-- .../pro-form/src/components/Radio/index.tsx | 53 +++++++++++++++++ packages/pro-form/src/components/index.ts | 29 +++++----- 7 files changed, 190 insertions(+), 19 deletions(-) create mode 100644 packages/pro-field/src/components/Radio/index.tsx create mode 100644 packages/pro-field/src/components/Radio/types.ts create mode 100644 packages/pro-form/src/components/Radio/index.tsx diff --git a/packages/pro-field/src/components/Radio/index.tsx b/packages/pro-field/src/components/Radio/index.tsx new file mode 100644 index 00000000..c6005ef5 --- /dev/null +++ b/packages/pro-field/src/components/Radio/index.tsx @@ -0,0 +1,58 @@ +import { defineComponent, type App, DefineComponent, Plugin } from 'vue'; +import { fieldRadioProps, FieldRadioProps } from './types'; +import { Radio } from 'ant-design-vue'; +import { getSlot } from '@ant-design-vue/pro-utils'; + +export const slots = ['renderExtraFooter', 'suffixIcon', 'clearIcon']; + +const FieldRadio = defineComponent({ + name: 'FieldRadio', + inheritAttrs: false, + props: fieldRadioProps, + slots, + setup(props, { slots }) { + + const render = getSlot(slots, props.fieldProps as Record, 'render') as Function; + const renderFormItem = getSlot(slots, props.fieldProps as Record, 'renderFormItem') as Function; + const children = getSlot(slots, props.fieldProps as Record, 'default'); + + return () => { + const { mode, text, fieldProps = {} } = props; + const { options } = fieldProps + + if (mode === 'read') { + const optionsValue = fieldProps.value; + const dom = <>{optionsValue}; + + if (render) { + return render(text, { mode, ...fieldProps }, dom) || null; + } + return dom; + } + + if (mode === 'edit') { + const dom = ( + + ); + if (renderFormItem) { + return renderFormItem(text, { mode, ...fieldProps }, dom); + } + return dom; + } + return null; + }; + }, +}); + +FieldRadio.install = (app: App) => { + app.component(FieldRadio.name, FieldRadio); + return app; +}; + +export default FieldRadio as DefineComponent & Plugin; diff --git a/packages/pro-field/src/components/Radio/types.ts b/packages/pro-field/src/components/Radio/types.ts new file mode 100644 index 00000000..3544bd1b --- /dev/null +++ b/packages/pro-field/src/components/Radio/types.ts @@ -0,0 +1,12 @@ +import type { ExtractPropTypes, PropType } from "vue"; +import type { RadioGroupProps } from "ant-design-vue/es/radio/Group"; +import { proFieldFC } from "../typings"; + +export const fieldRadioProps = { + ...proFieldFC, + fieldProps: { + type: Object as PropType, + }, +}; + +export type FieldRadioProps = Partial>; diff --git a/packages/pro-field/src/components/TimePicker/index.tsx b/packages/pro-field/src/components/TimePicker/index.tsx index 97e63315..4206801a 100644 --- a/packages/pro-field/src/components/TimePicker/index.tsx +++ b/packages/pro-field/src/components/TimePicker/index.tsx @@ -21,8 +21,8 @@ const FieldTimePicker = defineComponent({ 'renderExtraFooter' ); - const render = getSlot(slots, props.fieldProps as Record, 'render') as any; - const renderFormItem = getSlot(slots, props.fieldProps as Record, 'renderFormItem') as any; + const render = getSlot(slots, props.fieldProps as Record, 'render') as Function; + const renderFormItem = getSlot(slots, props.fieldProps as Record, 'renderFormItem') as Function; return () => { const { mode, text, fieldProps } = props; diff --git a/packages/pro-field/src/index.tsx b/packages/pro-field/src/index.tsx index e7e83463..a744e4c2 100644 --- a/packages/pro-field/src/index.tsx +++ b/packages/pro-field/src/index.tsx @@ -75,6 +75,11 @@ import { fieldTimeRangePickerProps, type FieldTimeRangePickerProps } from './com import FieldTimeRangePicker, { slots as timeRangePickerSlots } from './components/TimeRangePicker'; export { FieldTimeRangePicker, fieldTimeRangePickerProps, timeRangePickerSlots, FieldTimeRangePickerProps }; +import { fieldRadioProps, type FieldRadioProps } from './components/Radio/types'; +import FieldRadio from './components/Radio'; +export { FieldRadio, fieldRadioProps, FieldRadioProps }; + + // style import './default.less'; import './style.less'; @@ -268,6 +273,19 @@ const defaultRenderText = ( ); } + if (valueType === 'radio' || valueType === 'radioButton') { + const { fieldProps } = props + return ( + + ) + } + if (valueType === 'select') { let text = ''; if (dataValue instanceof Array) { diff --git a/packages/pro-form/examples/views/ProForm.vue b/packages/pro-form/examples/views/ProForm.vue index b44d2370..516cc20a 100644 --- a/packages/pro-form/examples/views/ProForm.vue +++ b/packages/pro-form/examples/views/ProForm.vue @@ -252,19 +252,37 @@ + + Hangzhou + Shanghai + Beijing + Chengdu + + + diff --git a/packages/pro-form/src/BaseForm/hooks/useFormEvents.ts b/packages/pro-form/src/BaseForm/hooks/useFormEvents.ts index 35d43257..d90642e0 100644 --- a/packages/pro-form/src/BaseForm/hooks/useFormEvents.ts +++ b/packages/pro-form/src/BaseForm/hooks/useFormEvents.ts @@ -57,7 +57,7 @@ export const useFromEvents = (params: EventsParams) => { const resetFields = (name?: NamePath) => { unref(formInstanceRef)?.resetFields(name); - props.onReset?.(model.value); + props.onReset?.(handleFormValues(model.value)); submitOnReset && handleSubmit(); }; From 0fdb9b1469b40a52cc4af8f7c923534f928ce471 Mon Sep 17 00:00:00 2001 From: sunshineLixun <1261142605@qq.com> Date: Wed, 14 Jun 2023 16:54:38 +0800 Subject: [PATCH 4/4] refactor: useGridHelpers --- packages/pro-form/examples/layouts/BasicLayout.vue | 6 ++++-- packages/pro-form/src/BaseForm/BaseForm.tsx | 2 +- .../src/QueryFilter/components/form-action/action.tsx | 2 ++ packages/pro-form/src/helpers/grid.tsx | 6 ------ 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/pro-form/examples/layouts/BasicLayout.vue b/packages/pro-form/examples/layouts/BasicLayout.vue index 2e2961aa..b8205fd9 100644 --- a/packages/pro-form/examples/layouts/BasicLayout.vue +++ b/packages/pro-form/examples/layouts/BasicLayout.vue @@ -19,11 +19,11 @@ @@ -72,6 +72,8 @@ import { computed, reactive, ref, watchEffect, onMounted } from 'vue'; import { useRouter } from 'vue-router'; import { getMenuData, clearMenuItem, type RouteContextProps } from '@ant-design-vue/pro-layout'; +import { Avatar } from 'ant-design-vue'; + const watermarkContent = ref('Pro Layout'); const loading = ref(false); diff --git a/packages/pro-form/src/BaseForm/BaseForm.tsx b/packages/pro-form/src/BaseForm/BaseForm.tsx index 5aef05e1..de5d0059 100644 --- a/packages/pro-form/src/BaseForm/BaseForm.tsx +++ b/packages/pro-form/src/BaseForm/BaseForm.tsx @@ -37,7 +37,7 @@ const BaseForm = defineComponent({ ...formEvents, ...formMethods } as BaseFormType; - + createFromInstance(instance); expose(instance); diff --git a/packages/pro-form/src/QueryFilter/components/form-action/action.tsx b/packages/pro-form/src/QueryFilter/components/form-action/action.tsx index 2c12471a..dee8f992 100644 --- a/packages/pro-form/src/QueryFilter/components/form-action/action.tsx +++ b/packages/pro-form/src/QueryFilter/components/form-action/action.tsx @@ -37,7 +37,9 @@ export const Action = defineComponent({ }, emits: ['collapsed'], setup(props, { emit }) { + const { submit, resetForm } = useFormInstance(); + const onCollapsed = () => { emit('collapsed', !props.collapsed); }; diff --git a/packages/pro-form/src/helpers/grid.tsx b/packages/pro-form/src/helpers/grid.tsx index 9056098f..8bdea756 100644 --- a/packages/pro-form/src/helpers/grid.tsx +++ b/packages/pro-form/src/helpers/grid.tsx @@ -54,14 +54,8 @@ export const gridHelpers: (config: ProFormGridConfig & CommonProps) => GridHelpe }); export const useGridHelpers = (props?: (ProFormGridConfig & CommonProps) | boolean) => { - const formInstance = useFormInstance(); const _grid = ref(); const _colProps = ref(); - if (formInstance) { - const { grid, colProps } = unref(formInstance.getFormProps); - _grid.value = grid; - _colProps.value = colProps; - } const config = computed(() => { if (typeof props === 'object') {