刘光辉
10 小时以前 0dfe84494048ce27ba8449831782128412d3eb13
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
60
61
62
63
64
65
import type { Component } from 'vue';
 
import type { BaseFormComponentType, FormCommonConfig, VbenFormAdapterOptions } from './types';
 
import { h } from 'vue';
 
import { VbenButton, VbenCheckbox, Input as VbenInput, VbenInputPassword, VbenPinInput, VbenSelect } from '@vben-core/shadcn-ui';
import { globalShareState } from '@vben-core/shared/global-state';
 
import { defineRule } from 'vee-validate';
 
const DEFAULT_MODEL_PROP_NAME = 'modelValue';
 
export const DEFAULT_FORM_COMMON_CONFIG: FormCommonConfig = {};
 
export const COMPONENT_MAP: Record<BaseFormComponentType, Component> = {
  DefaultButton: h(VbenButton, { size: 'sm', variant: 'outline' }),
  PrimaryButton: h(VbenButton, { size: 'sm', variant: 'default' }),
  VbenCheckbox,
  VbenInput,
  VbenInputPassword,
  VbenPinInput,
  VbenSelect,
};
 
export const COMPONENT_BIND_EVENT_MAP: Partial<Record<BaseFormComponentType, string>> = {
  VbenCheckbox: 'checked',
};
 
export function setupVbenForm<T extends BaseFormComponentType = BaseFormComponentType>(options: VbenFormAdapterOptions<T>) {
  const { config, defineRules } = options;
 
  const { disabledOnChangeListener = true, disabledOnInputListener = true, emptyStateValue = undefined } = (config || {}) as FormCommonConfig;
 
  Object.assign(DEFAULT_FORM_COMMON_CONFIG, {
    disabledOnChangeListener,
    disabledOnInputListener,
    emptyStateValue,
  });
 
  if (defineRules) {
    for (const key of Object.keys(defineRules)) {
      defineRule(key, defineRules[key as never]);
    }
  }
 
  const baseModelPropName = config?.baseModelPropName ?? DEFAULT_MODEL_PROP_NAME;
  const modelPropNameMap = config?.modelPropNameMap as Record<BaseFormComponentType, string> | undefined;
 
  const components = globalShareState.getComponents();
 
  for (const component of Object.keys(components)) {
    const key = component as BaseFormComponentType;
    COMPONENT_MAP[key] = components[component as never];
 
    if (baseModelPropName !== DEFAULT_MODEL_PROP_NAME) {
      COMPONENT_BIND_EVENT_MAP[key] = baseModelPropName;
    }
 
    // 覆盖特殊组件的modelPropName
    if (modelPropNameMap && modelPropNameMap[key]) {
      COMPONENT_BIND_EVENT_MAP[key] = modelPropNameMap[key];
    }
  }
}