feat: 优化表格

master
luoer 2023-11-22 16:44:11 +08:00
parent 8968692073
commit e5bf0bfb8b
6 changed files with 31 additions and 24 deletions

View File

@ -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>
); );
}; };
}, },

View File

@ -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);

View File

@ -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 {

View File

@ -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;
} }

View File

@ -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>
); );

View File

@ -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`}>