feat: 优化表格
parent
8968692073
commit
e5bf0bfb8b
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { FormItem, FieldRule, FormItemInstance, SelectOptionData, SelectOptionGroup } from '@arco-design/web-vue';
|
||||||
FormItem as BaseFormItem,
|
|
||||||
FieldRule,
|
|
||||||
FormItemInstance,
|
|
||||||
SelectOptionData,
|
|
||||||
SelectOptionGroup,
|
|
||||||
} from '@arco-design/web-vue';
|
|
||||||
import { InjectionKey, PropType, provide } from 'vue';
|
import { InjectionKey, PropType, provide } from 'vue';
|
||||||
import { SetterItem, SetterType, setterMap } from './FormSetter';
|
import { SetterItem, SetterType, setterMap } from './FormSetter';
|
||||||
|
|
||||||
|
|
@ -87,7 +81,7 @@ export const AnFormItem = defineComponent({
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<BaseFormItem
|
<FormItem
|
||||||
{...props.item.itemProps}
|
{...props.item.itemProps}
|
||||||
class="an-form-item"
|
class="an-form-item"
|
||||||
label={props.item.label as string}
|
label={props.item.label as string}
|
||||||
|
|
@ -96,7 +90,7 @@ export const AnFormItem = defineComponent({
|
||||||
field={props.item.field}
|
field={props.item.field}
|
||||||
>
|
>
|
||||||
{itemSlots}
|
{itemSlots}
|
||||||
</BaseFormItem>
|
</FormItem>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import { useModalSubmit } from './useModalSubmit';
|
||||||
import { useModalTrigger } from './useModalTrigger';
|
import { useModalTrigger } from './useModalTrigger';
|
||||||
import { AnForm, AnFormInstance, AnFormProps, AnFormSubmit } from './Form';
|
import { AnForm, AnFormInstance, AnFormProps, AnFormSubmit } from './Form';
|
||||||
import { AnFormItemProps } from './FormItem';
|
import { AnFormItemProps } from './FormItem';
|
||||||
|
import { useVModel } from '@vueuse/core';
|
||||||
|
|
||||||
export interface AnFormModalContext {
|
export interface AnFormModalContext {
|
||||||
visible: Ref<boolean>;
|
visible: Ref<boolean>;
|
||||||
|
|
@ -111,12 +112,15 @@ export const AnFormModal = defineComponent({
|
||||||
type: Object as PropType<Omit<FormInstance['$props'], 'model' | 'ref'>>,
|
type: Object as PropType<Omit<FormInstance['$props'], 'model' | 'ref'>>,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
emits: ['update:model'],
|
emits: ['update:model', 'submited'],
|
||||||
setup(props) {
|
setup(props, { emit }) {
|
||||||
const formRef = ref<AnFormInstance | null>(null);
|
const formRef = ref<AnFormInstance | null>(null);
|
||||||
const { visible, show, hide } = useVisible();
|
const model = useVModel(props, 'model', emit);
|
||||||
const { modalTrigger } = useModalTrigger(props, show);
|
const visible = ref(false);
|
||||||
const { loading, setLoading, submitForm } = useModalSubmit(props, formRef, visible);
|
const show = () => (visible.value = true);
|
||||||
|
const hide = () => (visible.value = false);
|
||||||
|
const modalTrigger = useModalTrigger(props, show);
|
||||||
|
const { loading, setLoading, submitForm } = useModalSubmit(props, formRef, visible, emit, model);
|
||||||
|
|
||||||
const open = (data: Recordable = {}) => {
|
const open = (data: Recordable = {}) => {
|
||||||
formRef.value?.setModel(data);
|
formRef.value?.setModel(data);
|
||||||
|
|
@ -143,10 +147,10 @@ export const AnFormModal = defineComponent({
|
||||||
formRef,
|
formRef,
|
||||||
open,
|
open,
|
||||||
close,
|
close,
|
||||||
|
onClose,
|
||||||
submitForm,
|
submitForm,
|
||||||
modalTitle,
|
modalTitle,
|
||||||
modalTrigger,
|
modalTrigger,
|
||||||
onClose,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
provide(AnFormModalContextKey, context);
|
provide(AnFormModalContextKey, context);
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
import { sleep } from '@/utils';
|
import { sleep } from '@/utils';
|
||||||
import { Message } from '@arco-design/web-vue';
|
import { Message } from '@arco-design/web-vue';
|
||||||
|
import { cloneDeep } from 'lodash-es';
|
||||||
import { Ref } from 'vue';
|
import { Ref } from 'vue';
|
||||||
|
|
||||||
export function useModalSubmit(props: any, formRef: any, visible: Ref<boolean>) {
|
export function useModalSubmit(props: any, formRef: any, visible: Ref<boolean>, emit?: any, model?: Ref<Recordable>) {
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
|
const origin = cloneDeep(props.model);
|
||||||
|
|
||||||
const submitForm = async () => {
|
const submitForm = async () => {
|
||||||
if (await formRef.value?.validate()) {
|
if (await formRef.value?.validate()) {
|
||||||
|
|
@ -15,7 +17,11 @@ export function useModalSubmit(props: any, formRef: any, visible: Ref<boolean>)
|
||||||
const res = await props.submit?.(data, props.items);
|
const res = await props.submit?.(data, props.items);
|
||||||
const msg = res?.data?.message;
|
const msg = res?.data?.message;
|
||||||
msg && Message.success(msg);
|
msg && Message.success(msg);
|
||||||
|
emit('submited', res);
|
||||||
visible.value = false;
|
visible.value = false;
|
||||||
|
if (model) {
|
||||||
|
model.value = cloneDeep(origin);
|
||||||
|
}
|
||||||
} catch {
|
} catch {
|
||||||
// todo
|
// todo
|
||||||
} finally {
|
} finally {
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,22 @@
|
||||||
import { Button } from "@arco-design/web-vue";
|
import { Button } from '@arco-design/web-vue';
|
||||||
|
|
||||||
export function useModalTrigger(props: any, open: () => void) {
|
export function useModalTrigger(props: any, open: () => void) {
|
||||||
const modalTrigger = () => {
|
const modalTrigger = () => {
|
||||||
if (!props.trigger) {
|
if (!props.trigger) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (typeof props.trigger === "function") {
|
if (typeof props.trigger === 'function') {
|
||||||
return <props.trigger model={props.model} items={props.items} open={open}></props.trigger>;
|
return <props.trigger model={props.model} items={props.items} open={open}></props.trigger>;
|
||||||
}
|
}
|
||||||
const internal = {
|
const internal = {
|
||||||
text: "新增",
|
text: '新增',
|
||||||
buttonProps: {},
|
buttonProps: {},
|
||||||
buttonSlots: {},
|
buttonSlots: {},
|
||||||
};
|
};
|
||||||
if (typeof props.trigger === "string") {
|
if (typeof props.trigger === 'string') {
|
||||||
internal.text = props.trigger;
|
internal.text = props.trigger;
|
||||||
}
|
}
|
||||||
if (typeof props.trigger === "object") {
|
if (typeof props.trigger === 'object') {
|
||||||
Object.assign(internal, props.trigger);
|
Object.assign(internal, props.trigger);
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
|
|
@ -29,5 +29,5 @@ export function useModalTrigger(props: any, open: () => void) {
|
||||||
</Button>
|
</Button>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
return { modalTrigger };
|
return modalTrigger;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -73,6 +73,7 @@ export function useFormModal(options: FormModalUseOptions) {
|
||||||
items={props.items}
|
items={props.items}
|
||||||
formProps={props.formProps}
|
formProps={props.formProps}
|
||||||
submit={props.submit}
|
submit={props.submit}
|
||||||
|
onUpdate:model={model => ((props as any).model = model)}
|
||||||
></AnFormModal>
|
></AnFormModal>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -195,8 +195,10 @@ export const AnTable = defineComponent({
|
||||||
return (
|
return (
|
||||||
<div class="an-table table w-full">
|
<div class="an-table table w-full">
|
||||||
<div class={`mb-3 flex gap-2 toolbar justify-between`}>
|
<div class={`mb-3 flex gap-2 toolbar justify-between`}>
|
||||||
{this.create && <AnFormModal {...this.create} ref="createRef"></AnFormModal>}
|
{this.create && <AnFormModal {...this.create} ref="createRef" onSubmited={this.reload}></AnFormModal>}
|
||||||
{this.modify && <AnFormModal {...this.modify} trigger={false} ref="modifyRef"></AnFormModal>}
|
{this.modify && (
|
||||||
|
<AnFormModal {...this.modify} trigger={false} ref="modifyRef" onSubmited={this.refresh}></AnFormModal>
|
||||||
|
)}
|
||||||
{this.$slots.action?.(this.renderData)}
|
{this.$slots.action?.(this.renderData)}
|
||||||
{this.pluginer?.actions && (
|
{this.pluginer?.actions && (
|
||||||
<div class={`flex-1 flex gap-2 items-center`}>
|
<div class={`flex-1 flex gap-2 items-center`}>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue