Commit 5091a875ab520c51aec4c57cdd200d68016958ab

Authored by vben
1 parent 5c273534

feat(modal): add minHeight and height prop #156

src/components/Form/src/BasicForm.vue
@@ -31,17 +31,7 @@ @@ -31,17 +31,7 @@
31 import type { AdvanceState } from './types/hooks'; 31 import type { AdvanceState } from './types/hooks';
32 import type { CSSProperties, Ref, WatchStopHandle } from 'vue'; 32 import type { CSSProperties, Ref, WatchStopHandle } from 'vue';
33 33
34 - import {  
35 - defineComponent,  
36 - reactive,  
37 - ref,  
38 - computed,  
39 - unref,  
40 - onMounted,  
41 - watch,  
42 - toRefs,  
43 - toRaw,  
44 - } from 'vue'; 34 + import { defineComponent, reactive, ref, computed, unref, onMounted, watch, toRefs } from 'vue';
45 import { Form, Row } from 'ant-design-vue'; 35 import { Form, Row } from 'ant-design-vue';
46 import FormItem from './components/FormItem'; 36 import FormItem from './components/FormItem';
47 import FormAction from './components/FormAction.vue'; 37 import FormAction from './components/FormAction.vue';
src/components/Form/src/hooks/useFormValues.ts
1 import { isArray, isFunction, isObject, isString } from '/@/utils/is'; 1 import { isArray, isFunction, isObject, isString } from '/@/utils/is';
2 import moment from 'moment'; 2 import moment from 'moment';
3 -import { unref } from 'vue'; 3 +import { unref, nextTick } from 'vue';
4 import type { Ref, ComputedRef } from 'vue'; 4 import type { Ref, ComputedRef } from 'vue';
5 import type { FieldMapToTime, FormSchema } from '../types/form'; 5 import type { FieldMapToTime, FormSchema } from '../types/form';
  6 +import { useModalContext } from '/@/components/Modal';
6 7
7 interface UseFormValuesContext { 8 interface UseFormValuesContext {
8 transformDateFuncRef: Ref<Fn>; 9 transformDateFuncRef: Ref<Fn>;
@@ -18,6 +19,7 @@ export function useFormValues({ @@ -18,6 +19,7 @@ export function useFormValues({
18 getSchema, 19 getSchema,
19 formModel, 20 formModel,
20 }: UseFormValuesContext) { 21 }: UseFormValuesContext) {
  22 + const modalFn = useModalContext();
21 // Processing form values 23 // Processing form values
22 function handleFormValues(values: Recordable) { 24 function handleFormValues(values: Recordable) {
23 if (!isObject(values)) { 25 if (!isObject(values)) {
@@ -81,6 +83,10 @@ export function useFormValues({ @@ -81,6 +83,10 @@ export function useFormValues({
81 } 83 }
82 }); 84 });
83 defaultValueRef.value = obj; 85 defaultValueRef.value = obj;
  86 + nextTick(() => {
  87 + // Solve the problem of modal adaptive height calculation when the form is placed in the modal
  88 + modalFn?.redoModalHeight?.();
  89 + });
84 } 90 }
85 91
86 return { handleFormValues, initDefault }; 92 return { handleFormValues, initDefault };
src/components/Modal/src/BasicModal.vue
@@ -23,6 +23,8 @@ @@ -23,6 +23,8 @@
23 :fullScreen="fullScreenRef" 23 :fullScreen="fullScreenRef"
24 ref="modalWrapperRef" 24 ref="modalWrapperRef"
25 :loading="getProps.loading" 25 :loading="getProps.loading"
  26 + :minHeight="getProps.minHeight"
  27 + :height="getProps.height"
26 :visible="visibleRef" 28 :visible="visibleRef"
27 :modalFooterHeight="footer !== undefined && !footer ? 0 : undefined" 29 :modalFooterHeight="footer !== undefined && !footer ? 0 : undefined"
28 v-bind="omit(getProps.wrapperProps, 'visible')" 30 v-bind="omit(getProps.wrapperProps, 'visible')"
src/components/Modal/src/components/ModalWrapper.vue
@@ -38,6 +38,7 @@ @@ -38,6 +38,7 @@
38 modalHeaderHeight: propTypes.number.def(50), 38 modalHeaderHeight: propTypes.number.def(50),
39 modalFooterHeight: propTypes.number.def(54), 39 modalFooterHeight: propTypes.number.def(54),
40 minHeight: propTypes.number.def(200), 40 minHeight: propTypes.number.def(200),
  41 + height: propTypes.number,
41 footerOffset: propTypes.number.def(0), 42 footerOffset: propTypes.number.def(0),
42 visible: propTypes.bool, 43 visible: propTypes.bool,
43 fullScreen: propTypes.bool, 44 fullScreen: propTypes.bool,
@@ -142,7 +143,11 @@ @@ -142,7 +143,11 @@
142 realHeightRef.value = 143 realHeightRef.value =
143 window.innerHeight - props.modalFooterHeight - props.modalHeaderHeight; 144 window.innerHeight - props.modalFooterHeight - props.modalHeaderHeight;
144 } else { 145 } else {
145 - realHeightRef.value = realHeight > maxHeight ? maxHeight : realHeight + 16 + 30; 146 + realHeightRef.value = props.height
  147 + ? props.height
  148 + : realHeight > maxHeight
  149 + ? maxHeight
  150 + : realHeight + 16 + 30;
146 } 151 }
147 emit('height-change', unref(realHeightRef)); 152 emit('height-change', unref(realHeightRef));
148 } catch (error) { 153 } catch (error) {
src/components/Modal/src/props.ts
@@ -8,6 +8,8 @@ const { t } = useI18n(); @@ -8,6 +8,8 @@ const { t } = useI18n();
8 8
9 export const modalProps = { 9 export const modalProps = {
10 visible: propTypes.bool, 10 visible: propTypes.bool,
  11 + height: propTypes.number,
  12 + minHeight: propTypes.number,
11 // open drag 13 // open drag
12 draggable: propTypes.bool.def(true), 14 draggable: propTypes.bool.def(true),
13 centered: propTypes.bool, 15 centered: propTypes.bool,
src/components/Modal/src/types.ts
@@ -27,6 +27,8 @@ export interface ReturnInnerMethods extends ModalMethods { @@ -27,6 +27,8 @@ export interface ReturnInnerMethods extends ModalMethods {
27 export type UseModalInnerReturnType = [RegisterFn, ReturnInnerMethods]; 27 export type UseModalInnerReturnType = [RegisterFn, ReturnInnerMethods];
28 28
29 export interface ModalProps { 29 export interface ModalProps {
  30 + minHeight?: number;
  31 + height?: number;
30 // 启用wrapper后 底部可以适当增加高度 32 // 启用wrapper后 底部可以适当增加高度
31 wrapperFooterOffset?: number; 33 wrapperFooterOffset?: number;
32 draggable?: boolean; 34 draggable?: boolean;
@@ -195,6 +197,7 @@ export interface ModalWrapperProps { @@ -195,6 +197,7 @@ export interface ModalWrapperProps {
195 modalHeaderHeight: number; 197 modalHeaderHeight: number;
196 modalFooterHeight: number; 198 modalFooterHeight: number;
197 minHeight: number; 199 minHeight: number;
  200 + height: number;
198 visible: boolean; 201 visible: boolean;
199 fullScreen: boolean; 202 fullScreen: boolean;
200 useWrapper: boolean; 203 useWrapper: boolean;