|
@@ -1,25 +1,25 @@
|
|
|
-import type { ComputedRef, Ref } from 'vue';
|
|
|
-import type { FormProps, FormSchema, FormActionType } from '../types/form';
|
|
|
-import type { NamePath } from 'ant-design-vue/lib/form/interface';
|
|
|
+import type { ComputedRef, Ref } from 'vue'
|
|
|
+import type { FormProps, FormSchema, FormActionType } from '../types/form'
|
|
|
+import type { NamePath } from 'ant-design-vue/lib/form/interface'
|
|
|
|
|
|
-import { unref, toRaw } from 'vue';
|
|
|
+import { unref, toRaw } from 'vue'
|
|
|
|
|
|
-import { isArray, isFunction, isObject, isString } from '/@/utils/is';
|
|
|
-import { deepMerge } from '/@/utils';
|
|
|
-import { dateItemType, handleInputNumberValue } from '../helper';
|
|
|
-import { dateUtil } from '/@/utils/dateUtil';
|
|
|
-import { cloneDeep, uniqBy } from 'lodash-es';
|
|
|
-import { error } from '/@/utils/log';
|
|
|
+import { isArray, isFunction, isObject, isString } from '/@/utils/is'
|
|
|
+import { deepMerge } from '/@/utils'
|
|
|
+import { dateItemType, handleInputNumberValue } from '../helper'
|
|
|
+import { dateUtil } from '/@/utils/dateUtil'
|
|
|
+import { cloneDeep, uniqBy } from 'lodash-es'
|
|
|
+import { error } from '/@/utils/log'
|
|
|
|
|
|
interface UseFormActionContext {
|
|
|
- emit: EmitType;
|
|
|
- getProps: ComputedRef<FormProps>;
|
|
|
- getSchema: ComputedRef<FormSchema[]>;
|
|
|
- formModel: Recordable;
|
|
|
- defaultValueRef: Ref<Recordable>;
|
|
|
- formElRef: Ref<FormActionType>;
|
|
|
- schemaRef: Ref<FormSchema[]>;
|
|
|
- handleFormValues: Fn;
|
|
|
+ emit: EmitType
|
|
|
+ getProps: ComputedRef<FormProps>
|
|
|
+ getSchema: ComputedRef<FormSchema[]>
|
|
|
+ formModel: Recordable
|
|
|
+ defaultValueRef: Ref<Recordable>
|
|
|
+ formElRef: Ref<FormActionType>
|
|
|
+ schemaRef: Ref<FormSchema[]>
|
|
|
+ handleFormValues: Fn
|
|
|
}
|
|
|
export function useFormEvents({
|
|
|
emit,
|
|
@@ -29,21 +29,21 @@ export function useFormEvents({
|
|
|
defaultValueRef,
|
|
|
formElRef,
|
|
|
schemaRef,
|
|
|
- handleFormValues,
|
|
|
+ handleFormValues
|
|
|
}: UseFormActionContext) {
|
|
|
async function resetFields(): Promise<void> {
|
|
|
- const { resetFunc, submitOnReset } = unref(getProps);
|
|
|
- resetFunc && isFunction(resetFunc) && (await resetFunc());
|
|
|
-
|
|
|
- const formEl = unref(formElRef);
|
|
|
- if (!formEl) return;
|
|
|
-
|
|
|
- Object.keys(formModel).forEach((key) => {
|
|
|
- formModel[key] = defaultValueRef.value[key];
|
|
|
- });
|
|
|
- clearValidate();
|
|
|
- emit('reset', toRaw(formModel));
|
|
|
- submitOnReset && handleSubmit();
|
|
|
+ const { resetFunc, submitOnReset } = unref(getProps)
|
|
|
+ resetFunc && isFunction(resetFunc) && (await resetFunc())
|
|
|
+
|
|
|
+ const formEl = unref(formElRef)
|
|
|
+ if (!formEl) return
|
|
|
+
|
|
|
+ Object.keys(formModel).forEach(key => {
|
|
|
+ formModel[key] = defaultValueRef.value[key]
|
|
|
+ })
|
|
|
+ clearValidate()
|
|
|
+ emit('reset', toRaw(formModel))
|
|
|
+ submitOnReset && handleSubmit()
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -51,53 +51,53 @@ export function useFormEvents({
|
|
|
*/
|
|
|
async function setFieldsValue(values: Recordable): Promise<void> {
|
|
|
const fields = unref(getSchema)
|
|
|
- .map((item) => item.field)
|
|
|
- .filter(Boolean);
|
|
|
+ .map(item => item.field)
|
|
|
+ .filter(Boolean)
|
|
|
|
|
|
- const validKeys: string[] = [];
|
|
|
- Object.keys(values).forEach((key) => {
|
|
|
- const schema = unref(getSchema).find((item) => item.field === key);
|
|
|
- let value = values[key];
|
|
|
+ const validKeys: string[] = []
|
|
|
+ Object.keys(values).forEach(key => {
|
|
|
+ const schema = unref(getSchema).find(item => item.field === key)
|
|
|
+ let value = values[key]
|
|
|
|
|
|
- const hasKey = Reflect.has(values, key);
|
|
|
+ const hasKey = Reflect.has(values, key)
|
|
|
|
|
|
- value = handleInputNumberValue(schema?.component, value);
|
|
|
+ value = handleInputNumberValue(schema?.component, value)
|
|
|
// 0| '' is allow
|
|
|
if (hasKey && fields.includes(key)) {
|
|
|
// time type
|
|
|
if (itemIsDateType(key)) {
|
|
|
if (Array.isArray(value)) {
|
|
|
- const arr: moment.Moment[] = [];
|
|
|
+ const arr: moment.Moment[] = []
|
|
|
for (const ele of value) {
|
|
|
- arr.push(dateUtil(ele));
|
|
|
+ arr.push(dateUtil(ele))
|
|
|
}
|
|
|
- formModel[key] = arr;
|
|
|
+ formModel[key] = arr
|
|
|
} else {
|
|
|
- formModel[key] = dateUtil(value);
|
|
|
+ formModel[key] = dateUtil(value)
|
|
|
}
|
|
|
} else {
|
|
|
- formModel[key] = value;
|
|
|
+ formModel[key] = value
|
|
|
}
|
|
|
- validKeys.push(key);
|
|
|
+ validKeys.push(key)
|
|
|
}
|
|
|
- });
|
|
|
- validateFields(validKeys);
|
|
|
+ })
|
|
|
+ validateFields(validKeys)
|
|
|
}
|
|
|
/**
|
|
|
* @description: Delete based on field name
|
|
|
*/
|
|
|
async function removeSchemaByFiled(fields: string | string[]): Promise<void> {
|
|
|
- const schemaList: FormSchema[] = cloneDeep(unref(getSchema));
|
|
|
- if (!fields) return;
|
|
|
+ const schemaList: FormSchema[] = cloneDeep(unref(getSchema))
|
|
|
+ if (!fields) return
|
|
|
|
|
|
- let fieldList: string[] = isString(fields) ? [fields] : fields;
|
|
|
+ let fieldList: string[] = isString(fields) ? [fields] : fields
|
|
|
if (isString(fields)) {
|
|
|
- fieldList = [fields];
|
|
|
+ fieldList = [fields]
|
|
|
}
|
|
|
for (const field of fieldList) {
|
|
|
- _removeSchemaByFiled(field, schemaList);
|
|
|
+ _removeSchemaByFiled(field, schemaList)
|
|
|
}
|
|
|
- schemaRef.value = schemaList;
|
|
|
+ schemaRef.value = schemaList
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -105,9 +105,9 @@ export function useFormEvents({
|
|
|
*/
|
|
|
function _removeSchemaByFiled(field: string, schemaList: FormSchema[]): void {
|
|
|
if (isString(field)) {
|
|
|
- const index = schemaList.findIndex((schema) => schema.field === field);
|
|
|
+ const index = schemaList.findIndex(schema => schema.field === field)
|
|
|
if (index !== -1) {
|
|
|
- schemaList.splice(index, 1);
|
|
|
+ schemaList.splice(index, 1)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -116,102 +116,102 @@ export function useFormEvents({
|
|
|
* @description: Insert after a certain field, if not insert the last
|
|
|
*/
|
|
|
async function appendSchemaByField(schema: FormSchema, prefixField?: string, first = false) {
|
|
|
- const schemaList: FormSchema[] = cloneDeep(unref(getSchema));
|
|
|
+ const schemaList: FormSchema[] = cloneDeep(unref(getSchema))
|
|
|
|
|
|
- const index = schemaList.findIndex((schema) => schema.field === prefixField);
|
|
|
- const hasInList = schemaList.some((item) => item.field === prefixField || schema.field);
|
|
|
+ const index = schemaList.findIndex(schema => schema.field === prefixField)
|
|
|
+ const hasInList = schemaList.some(item => item.field === prefixField || schema.field)
|
|
|
|
|
|
- if (!hasInList) return;
|
|
|
+ if (!hasInList) return
|
|
|
|
|
|
if (!prefixField || index === -1 || first) {
|
|
|
- first ? schemaList.unshift(schema) : schemaList.push(schema);
|
|
|
- schemaRef.value = schemaList;
|
|
|
- return;
|
|
|
+ first ? schemaList.unshift(schema) : schemaList.push(schema)
|
|
|
+ schemaRef.value = schemaList
|
|
|
+ return
|
|
|
}
|
|
|
if (index !== -1) {
|
|
|
- schemaList.splice(index + 1, 0, schema);
|
|
|
+ schemaList.splice(index + 1, 0, schema)
|
|
|
}
|
|
|
- schemaRef.value = schemaList;
|
|
|
+ schemaRef.value = schemaList
|
|
|
}
|
|
|
|
|
|
async function updateSchema(data: Partial<FormSchema> | Partial<FormSchema>[]) {
|
|
|
- let updateData: Partial<FormSchema>[] = [];
|
|
|
+ let updateData: Partial<FormSchema>[] = []
|
|
|
if (isObject(data)) {
|
|
|
- updateData.push(data as FormSchema);
|
|
|
+ updateData.push(data as FormSchema)
|
|
|
}
|
|
|
if (isArray(data)) {
|
|
|
- updateData = [...data];
|
|
|
+ updateData = [...data]
|
|
|
}
|
|
|
|
|
|
- const hasField = updateData.every((item) => Reflect.has(item, 'field') && item.field);
|
|
|
+ const hasField = updateData.every(item => Reflect.has(item, 'field') && item.field)
|
|
|
|
|
|
if (!hasField) {
|
|
|
error(
|
|
|
'All children of the form Schema array that need to be updated must contain the `field` field'
|
|
|
- );
|
|
|
- return;
|
|
|
+ )
|
|
|
+ return
|
|
|
}
|
|
|
- const schema: FormSchema[] = [];
|
|
|
- updateData.forEach((item) => {
|
|
|
- unref(getSchema).forEach((val) => {
|
|
|
+ const schema: FormSchema[] = []
|
|
|
+ updateData.forEach(item => {
|
|
|
+ unref(getSchema).forEach(val => {
|
|
|
if (val.field === item.field) {
|
|
|
- const newSchema = deepMerge(val, item);
|
|
|
- schema.push(newSchema as FormSchema);
|
|
|
+ const newSchema = deepMerge(val, item)
|
|
|
+ schema.push(newSchema as FormSchema)
|
|
|
} else {
|
|
|
- schema.push(val);
|
|
|
+ schema.push(val)
|
|
|
}
|
|
|
- });
|
|
|
- });
|
|
|
- schemaRef.value = uniqBy(schema, 'field');
|
|
|
+ })
|
|
|
+ })
|
|
|
+ schemaRef.value = uniqBy(schema, 'field')
|
|
|
}
|
|
|
|
|
|
function getFieldsValue(): Recordable {
|
|
|
- const formEl = unref(formElRef);
|
|
|
- if (!formEl) return {};
|
|
|
- return handleFormValues(toRaw(unref(formModel)));
|
|
|
+ const formEl = unref(formElRef)
|
|
|
+ if (!formEl) return {}
|
|
|
+ return handleFormValues(toRaw(unref(formModel)))
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @description: Is it time
|
|
|
*/
|
|
|
function itemIsDateType(key: string) {
|
|
|
- return unref(getSchema).some((item) => {
|
|
|
- return item.field === key ? dateItemType.includes(item.component) : false;
|
|
|
- });
|
|
|
+ return unref(getSchema).some(item => {
|
|
|
+ return item.field === key ? dateItemType.includes(item.component) : false
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
async function validateFields(nameList?: NamePath[] | undefined) {
|
|
|
- return unref(formElRef)?.validateFields(nameList);
|
|
|
+ return unref(formElRef)?.validateFields(nameList)
|
|
|
}
|
|
|
|
|
|
async function validate(nameList?: NamePath[] | undefined) {
|
|
|
- return await unref(formElRef)?.validate(nameList);
|
|
|
+ return await unref(formElRef)?.validate(nameList)
|
|
|
}
|
|
|
|
|
|
async function clearValidate(name?: string | string[]) {
|
|
|
- await unref(formElRef)?.clearValidate(name);
|
|
|
+ await unref(formElRef)?.clearValidate(name)
|
|
|
}
|
|
|
|
|
|
async function scrollToField(name: NamePath, options?: ScrollOptions | undefined) {
|
|
|
- await unref(formElRef)?.scrollToField(name, options);
|
|
|
+ await unref(formElRef)?.scrollToField(name, options)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @description: Form submission
|
|
|
*/
|
|
|
async function handleSubmit(e?: Event): Promise<void> {
|
|
|
- e && e.preventDefault();
|
|
|
- const { submitFunc } = unref(getProps);
|
|
|
+ e && e.preventDefault()
|
|
|
+ const { submitFunc } = unref(getProps)
|
|
|
if (submitFunc && isFunction(submitFunc)) {
|
|
|
- await submitFunc();
|
|
|
- return;
|
|
|
+ await submitFunc()
|
|
|
+ return
|
|
|
}
|
|
|
- const formEl = unref(formElRef);
|
|
|
- if (!formEl) return;
|
|
|
+ const formEl = unref(formElRef)
|
|
|
+ if (!formEl) return
|
|
|
try {
|
|
|
- const values = await validate();
|
|
|
- const res = handleFormValues(values);
|
|
|
- emit('submit', res);
|
|
|
+ const values = await validate()
|
|
|
+ const res = handleFormValues(values)
|
|
|
+ emit('submit', res)
|
|
|
} catch (error) {}
|
|
|
}
|
|
|
|
|
@@ -226,6 +226,6 @@ export function useFormEvents({
|
|
|
removeSchemaByFiled,
|
|
|
resetFields,
|
|
|
setFieldsValue,
|
|
|
- scrollToField,
|
|
|
- };
|
|
|
+ scrollToField
|
|
|
+ }
|
|
|
}
|