车间能级提升-智能设备管理系统
朱桂飞
2025-01-09 3e8f7f239bedae0b4f04a1ac6bd443ba6298f73c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import type { FormActions, VbenFormProps } from './types';
 
import { computed, type ComputedRef, unref, useSlots } from 'vue';
 
import { createContext } from '@vben-core/shadcn-ui';
import { isString } from '@vben-core/shared/utils';
 
import { useForm } from 'vee-validate';
import { object, type ZodRawShape } from 'zod';
import { getDefaultsForSchema } from 'zod-defaults';
 
export const [injectFormProps, provideFormProps] =
  createContext<[ComputedRef<VbenFormProps> | VbenFormProps, FormActions]>(
    'VbenFormProps',
  );
 
export function useFormInitial(
  props: ComputedRef<VbenFormProps> | VbenFormProps,
) {
  const slots = useSlots();
  const initialValues = generateInitialValues();
 
  const form = useForm({
    ...(Object.keys(initialValues)?.length ? { initialValues } : {}),
  });
 
  const delegatedSlots = computed(() => {
    const resultSlots: string[] = [];
 
    for (const key of Object.keys(slots)) {
      if (key !== 'default') {
        resultSlots.push(key);
      }
    }
    return resultSlots;
  });
 
  function generateInitialValues() {
    const initialValues: Record<string, any> = {};
 
    const zodObject: ZodRawShape = {};
    (unref(props).schema || []).forEach((item) => {
      if (Reflect.has(item, 'defaultValue')) {
        initialValues[item.fieldName] = item.defaultValue;
      } else if (item.rules && !isString(item.rules)) {
        zodObject[item.fieldName] = item.rules;
      }
    });
 
    const schemaInitialValues = getDefaultsForSchema(object(zodObject));
 
    return { ...initialValues, ...schemaInitialValues };
  }
 
  return {
    delegatedSlots,
    form,
  };
}