@iswangh/element-plus-kit-form 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +107 -6
  2. package/dist/FormAction.vue.d.ts.map +1 -1
  3. package/dist/FormItem.vue.d.ts +6 -9
  4. package/dist/FormItem.vue.d.ts.map +1 -1
  5. package/dist/composables/index.d.ts +1 -1
  6. package/dist/composables/index.d.ts.map +1 -1
  7. package/dist/composables/useChangeEventState.d.ts +2 -2
  8. package/dist/composables/useChangeEventState.d.ts.map +1 -1
  9. package/dist/composables/useLoadOptions.d.ts +57 -0
  10. package/dist/composables/useLoadOptions.d.ts.map +1 -0
  11. package/dist/config/comp.d.ts +1 -9
  12. package/dist/config/comp.d.ts.map +1 -1
  13. package/dist/config/form-item.d.ts +6 -0
  14. package/dist/config/form-item.d.ts.map +1 -0
  15. package/dist/config/index.d.ts +1 -0
  16. package/dist/config/index.d.ts.map +1 -1
  17. package/dist/index.d.ts +2 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +721 -848
  20. package/dist/style.css +1 -1
  21. package/dist/types/comp.d.ts +29 -29
  22. package/dist/types/el.d.ts +3 -0
  23. package/dist/types/form-item.d.ts +13 -17
  24. package/dist/types/index.d.ts +8 -9
  25. package/dist/types/options.d.ts +3 -62
  26. package/dist/types/scope.d.ts +30 -0
  27. package/dist/utils/action.d.ts.map +1 -1
  28. package/dist/utils/index.d.ts +0 -2
  29. package/dist/utils/index.d.ts.map +1 -1
  30. package/package.json +4 -3
  31. package/dist/composables/useClearState.d.ts +0 -17
  32. package/dist/composables/useClearState.d.ts.map +0 -1
  33. package/dist/types/index.d.ts.map +0 -1
  34. package/dist/utils/options.d.ts +0 -21
  35. package/dist/utils/options.d.ts.map +0 -1
  36. package/dist/utils/value.d.ts +0 -21
  37. package/dist/utils/value.d.ts.map +0 -1
@@ -49,29 +49,29 @@ export type FormCompConfig = ElCompMap & typeof EXPAND_COMP_MAP
49
49
  * 注意:由于 FORM_ITEM_COMP_MAP 使用了 Record<string, any> 避免类型推断超出限制,
50
50
  * 我们需要显式定义键名类型,而不是从 typeof FORM_ITEM_COMP_MAP 中提取
51
51
  */
52
- export type FormItemComp
53
- = | 'autocomplete'
54
- | 'cascader'
55
- | 'checkbox'
56
- | 'color-picker'
57
- | 'color-picker-panel'
58
- | 'date-picker'
59
- | 'date-picker-panel'
60
- | 'input'
61
- | 'input-number'
62
- | 'input-tag'
63
- | 'mention'
64
- | 'radio'
65
- | 'rate'
66
- | 'select'
67
- | 'select-v2'
68
- | 'slider'
69
- | 'switch'
70
- | 'time-picker'
71
- | 'time-select'
72
- | 'transfer'
73
- | 'tree-select'
74
- | 'custom'
52
+ export type FormItemComp = 'custom'
53
+ | 'autocomplete'
54
+ | 'cascader'
55
+ | 'checkbox'
56
+ | 'color-picker'
57
+ | 'color-picker-panel'
58
+ | 'date-picker'
59
+ | 'date-picker-panel'
60
+ | 'input'
61
+ | 'input-number'
62
+ | 'input-tag'
63
+ | 'mention'
64
+ | 'radio'
65
+ | 'rate'
66
+ | 'select'
67
+ | 'select-v2'
68
+ | 'slider'
69
+ | 'switch'
70
+ | 'time-picker'
71
+ | 'time-select'
72
+ | 'transfer'
73
+ | 'tree-select'
74
+ | 'custom'
75
75
 
76
76
  /**
77
77
  * 根据组件类型获取组件实例类型
@@ -80,14 +80,14 @@ export type FormItemComp
80
80
  export type FormItemCompInstance<T extends FormItemComp> = InstanceType<FormCompConfig[T]>
81
81
 
82
82
  /**
83
- * 根据组件类型获取组件完整 Props 类型(包含事件处理器)
84
- * @template T 组件类型
83
+ * 根据组件类型推断对应的 Props 类型(包含事件处理器)
84
+ * @template T - 组件类型
85
85
  */
86
- type FormItemCompPropsFull<T extends FormItemComp> = FormItemCompInstance<T>['$props']
86
+ export type FormItemCompProps<T extends FormItemComp = FormItemComp>
87
+ = FormItemCompInstance<T>['$props']
87
88
 
88
89
  /**
89
- * 根据组件类型推断对应的 Props 类型(排除事件处理器)
90
+ * 根据组件类型推断对应的插槽类型
90
91
  * @template T - 组件类型
91
92
  */
92
- export type FormItemCompProps<T extends FormItemComp = FormItemComp>
93
- = Omit<FormItemCompPropsFull<T>, `on${string}`>
93
+ export type FormItemCompSlots<T extends FormItemComp> = FormItemCompInstance<T>['$slots']
@@ -36,6 +36,9 @@ export interface ElFormProps {
36
36
  /** Element Plus FormItem Props */
37
37
  export type ElFormItemProps = FormItemInstance['$props']
38
38
 
39
+ /** Element Plus FormItem Slots */
40
+ export type ElFormItemSlots = FormItemInstance['$slots']
41
+
39
42
  /** Element Plus Row 组件 Props */
40
43
  export type ElRowProps = InstanceType<typeof ElRow>['$props']
41
44
 
@@ -2,24 +2,18 @@ import { Condition } from './common';
2
2
  import { FormItemComp, FormItemCompProps } from './comp';
3
3
  import { ElFormItemProps } from './el';
4
4
  import { ColProps } from './layout';
5
- import { InferOptionsType, IsOptionsSupported } from './options';
6
- /**
7
- * 根据组件类型推断 options 类型
8
- * 只有支持 options 的组件才会扩展 options 类型
9
- * @template T - 组件类型
10
- */
11
- export type FormItemOptions<T extends FormItemComp> = IsOptionsSupported<T> extends true
12
- ? InferOptionsType<T>
13
- : never
14
-
5
+ import { HasOptionsProp, OptionsLoaderType } from './options';
6
+ import { CompSlotsConfig, FormItemSlotsConfig } from './scope';
15
7
  /**
16
8
  * 根据组件类型推断 compProps 类型(扩展版本)
17
- * 支持扩展属性,如 options 等
9
+ * 支持扩展属性,如 options、optionsLoader、slots
18
10
  * @template T - 组件类型
19
11
  */
20
- export type FormItemCompPropsExtended<T extends FormItemComp> = IsOptionsSupported<T> extends true
21
- ? Omit<FormItemCompProps<T>, 'options'> & { options?: FormItemOptions<T> } // 支持 options 的组件:先排除原始 options,再添加扩展的 options 类型
22
- : FormItemCompProps<T> // 不支持 options 的组件:使用原始 Props 类型
12
+ export type FormItemCompPropsExtended<T extends FormItemComp>
13
+ = (HasOptionsProp<T> extends true
14
+ ? FormItemCompProps<T> & { optionsLoader?: OptionsLoaderType }
15
+ : FormItemCompProps<T>)
16
+ & { slots?: CompSlotsConfig<T> }
23
17
 
24
18
  /**
25
19
  * FormItem Props
@@ -27,9 +21,10 @@ export type FormItemCompPropsExtended<T extends FormItemComp> = IsOptionsSupport
27
21
  * 扩展自 Element Plus 的 FormItem 组件 Props,添加了自定义配置选项
28
22
  *
29
23
  * @template T - 组件类型
30
- * @extends {ElFormItemProps} Element Plus FormItem 组件原始 Props
24
+ * @extends {ElFormItemProps} Element Plus FormItem 组件原始 Props(包含事件处理器)
31
25
  * @property {T} compType 使用的组件类型
32
- * @property {FormItemCompPropsExtended<T>} [compProps] 传递给组件的 Props 配置对象
26
+ * @property {FormItemCompPropsExtended<T>} [compProps] 传递给组件的 Props 配置对象(包含事件处理器和插槽,用于动态组件)
27
+ * @property {FormItemSlotsConfig} [slots] FormItem 插槽配置(用于 el-form-item 的插槽)
33
28
  * @property {Condition} [vIf] 条件渲染控制,支持布尔值或接收表单数据的函数
34
29
  * @property {Condition} [vShow] 显示/隐藏控制,支持布尔值或接收表单数据的函数
35
30
  *
@@ -38,7 +33,8 @@ export type FormItemCompPropsExtended<T extends FormItemComp> = IsOptionsSupport
38
33
  export interface FormItem<T extends FormItemComp = FormItemComp> extends ElFormItemProps {
39
34
  prop: string
40
35
  compType: T
41
- compProps?: FormItemCompPropsExtended<T>
36
+ compProps?: FormItemCompPropsExtended<T> // 包含事件处理器和插槽(动态组件的事件和插槽)
37
+ slots?: FormItemSlotsConfig // FormItem 插槽配置
42
38
  vIf?: Condition
43
39
  vShow?: Condition
44
40
  colProps?: ColProps
@@ -1,9 +1,8 @@
1
- export type * from './action';
2
- export type * from './common';
3
- export type * from './comp';
4
- export type * from './el';
5
- export type * from './form-item';
6
- export type * from './layout';
7
- export type * from './options';
8
- export type * from './scope';
9
- //# sourceMappingURL=index.d.ts.map
1
+ export * from './action'
2
+ export * from './common'
3
+ export * from './comp'
4
+ export * from './el'
5
+ export * from './form-item'
6
+ export * from './layout'
7
+ export * from './options'
8
+ export * from './scope'
@@ -4,70 +4,11 @@ import { FormItemComp, FormItemCompProps } from './comp';
4
4
  * 通过检查组件实例的 $props 中是否包含 'options' 来判断
5
5
  * @template T 组件类型
6
6
  */
7
- type HasOptionsProp<T extends FormItemComp> = 'options' extends keyof FormItemCompProps<T>
7
+ export type HasOptionsProp<T extends FormItemComp> = 'options' extends keyof FormItemCompProps<T>
8
8
  ? true
9
9
  : false
10
10
 
11
11
  /**
12
- * 判断组件是否支持 options 属性
13
- * 动态从组件类型定义中判断,不硬编码组件名称
14
- * @template T 组件类型
15
- */
16
- export type IsOptionsSupported<T extends FormItemComp> = HasOptionsProp<T>
17
-
18
- /**
19
- * 支持 options 属性的组件类型
20
- * 通过类型系统自动提取,不硬编码
21
- */
22
- export type OptionsSupportedComp = FormItemComp extends infer T
23
- ? T extends FormItemComp
24
- ? IsOptionsSupported<T> extends true
25
- ? T
26
- : never
27
- : never
28
- : never
29
-
30
- /**
31
- * Options 加载器函数类型
32
- * @param formData 表单数据(外部依赖通过闭包访问)
33
- * @returns 返回选项数组(支持同步和异步)
34
- */
35
- export type OptionsLoader = (formData: Record<string, any>) => any[] | Promise<any[]>
36
-
37
- /**
38
- * Options 对象模式配置
39
- */
40
- export interface OptionsConfig {
41
- /**
42
- * 选项加载器函数
43
- * @param formData 表单数据(外部依赖通过闭包访问)
44
- * @returns 返回选项数组(支持同步和异步)
45
- */
46
- loader: OptionsLoader
47
- /**
48
- * 是否立即加载(默认 false,需要显式设置为 true 才会立即加载)
49
- */
50
- immediate?: boolean
51
- /**
52
- * 依赖字段列表,需要监听并获取
53
- * 支持内部依赖(表单字段),外部依赖通过闭包访问
54
- */
55
- deps?: string[]
56
- }
57
-
58
- /**
59
- * 根据组件类型推断 options 类型
60
- * @template T 组件类型
61
- */
62
- export type InferOptionsType<T extends FormItemComp> = IsOptionsSupported<T> extends true
63
- ? OptionsLoader | OptionsConfig | any[]
64
- : never
65
-
66
- /**
67
- * 获取组件原始的 options 类型
68
- * 从组件实例的 $props 中提取 options 属性的类型
69
- * @template T 组件类型
12
+ * OptionsLoader 类型
70
13
  */
71
- export type GetCompOptionsType<T extends FormItemComp> = IsOptionsSupported<T> extends true
72
- ? FormItemCompProps<T>['options']
73
- : never
14
+ export type OptionsLoaderType = (formData?: Record<string, any>) => any[] | Promise<any[]>
@@ -1,3 +1,6 @@
1
+ import { VNode } from 'vue';
2
+ import { FormItemComp, FormItemCompSlots } from './comp';
3
+ import { ElFormItemSlots } from './el';
1
4
  import { FormItem } from './form-item';
2
5
  /**
3
6
  * 表单项事件扩展参数
@@ -32,3 +35,30 @@ export interface FormItemSlotScope {
32
35
  formItem: FormItem
33
36
  [key: string]: any // 允许 el-form-item 的其他作用域参数
34
37
  }
38
+
39
+ /**
40
+ * 插槽渲染函数类型
41
+ *
42
+ * 允许返回 VNode 或 VNode[],兼容 h() 函数返回单个 VNode 的情况
43
+ * Vue 的 component :is 可以接受返回 VNode 或 VNode[] 的函数
44
+ * 用于插槽配置,提供比 Vue 的 Slot 类型更灵活的返回值支持
45
+ * 接受 FormItemSlotScope 参数(或扩展类型),包含 value、form、formItem 等属性
46
+ * 使用泛型支持扩展参数类型,如 FormItemSlotScope & { label: string } 用于 label 插槽
47
+ */
48
+ export type SlotRenderFn<T extends FormItemSlotScope = FormItemSlotScope> = (props: T) => VNode | VNode[]
49
+
50
+ /**
51
+ * 动态组件插槽配置类型
52
+ *
53
+ * @template T - 组件类型
54
+ */
55
+ export type CompSlotsConfig<T extends FormItemComp> = {
56
+ [K in keyof FormItemCompSlots<T>]?: SlotRenderFn
57
+ }
58
+
59
+ /**
60
+ * FormItem 插槽配置类型
61
+ */
62
+ export type FormItemSlotsConfig = {
63
+ [K in keyof ElFormItemSlots]?: SlotRenderFn
64
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/utils/action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAEjD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAI9G"}
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/utils/action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAEjD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAE9G"}
@@ -1,5 +1,3 @@
1
1
  export * from './action';
2
2
  export * from './lodash';
3
- export * from './options';
4
- export * from './value';
5
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@iswangh/element-plus-kit-form",
3
3
  "type": "module",
4
- "version": "0.2.0",
4
+ "version": "0.3.0",
5
5
  "description": "Element Plus Kit 表单组件包",
6
6
  "license": "Apache-2.0",
7
7
  "sideEffects": [
@@ -32,7 +32,7 @@
32
32
  },
33
33
  "dependencies": {
34
34
  "lodash-es": "^4.17.21",
35
- "@iswangh/element-plus-kit-core": "0.2.0"
35
+ "@iswangh/element-plus-kit-core": "0.2.1"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@element-plus/icons-vue": "^2.3.2",
@@ -47,7 +47,8 @@
47
47
  "vue-tsc": "^3.1.3"
48
48
  },
49
49
  "publishConfig": {
50
- "access": "public"
50
+ "access": "public",
51
+ "registry": "https://registry.npmjs.org/"
51
52
  },
52
53
  "scripts": {
53
54
  "build": "vite build",
@@ -1,17 +0,0 @@
1
- /**
2
- * 清理状态管理组合式函数
3
- * 用于管理依赖变更时的清理操作,支持用户在 change 事件中设置默认值
4
- */
5
- export declare function useClearState(): {
6
- /** 是否正在处理依赖变更 */
7
- readonly changing: boolean;
8
- /** 用户是否在 change 事件中设置了值 */
9
- readonly hasUserValue: boolean;
10
- /** 开始依赖变更处理 */
11
- start(): void;
12
- /** 结束依赖变更处理 */
13
- end(): void;
14
- /** 标记用户在 change 事件中设置了值 */
15
- markValue(): void;
16
- };
17
- //# sourceMappingURL=useClearState.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useClearState.d.ts","sourceRoot":"","sources":["../../src/composables/useClearState.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,aAAa;IAKzB,iBAAiB;;IAKjB,2BAA2B;;IAK3B,eAAe;;IAMf,eAAe;;IAMf,2BAA2B;;EAK9B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,UAAU,CAAA;AAC7B,mBAAmB,UAAU,CAAA;AAC7B,mBAAmB,QAAQ,CAAA;AAC3B,mBAAmB,MAAM,CAAA;AACzB,mBAAmB,aAAa,CAAA;AAChC,mBAAmB,UAAU,CAAA;AAC7B,mBAAmB,WAAW,CAAA;AAC9B,mBAAmB,SAAS,CAAA"}
@@ -1,21 +0,0 @@
1
- import { OptionsConfig } from '../types';
2
- /**
3
- * 处理依赖列表:排除自身并去重
4
- * @param deps 依赖字段列表
5
- * @param currentProp 当前字段名,用于排除自己
6
- */
7
- export declare function processDeps(deps: string[], currentProp?: string): string[];
8
- /**
9
- * 获取依赖值
10
- * @param deps 依赖字段列表
11
- * @param formData 表单数据(外部依赖通过闭包访问)
12
- * @param currentProp 当前字段名,用于排除自己
13
- */
14
- export declare function getDepsValues(deps: string[], formData: Record<string, any>, currentProp?: string): Record<string, any>;
15
- /**
16
- * 检查是否为对象模式的 options 配置
17
- * @param options - 待检查的选项配置
18
- * @returns 是否为对象模式配置
19
- */
20
- export declare function isOptionsConfig(options: any): options is OptionsConfig;
21
- //# sourceMappingURL=options.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/utils/options.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAO1E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAGtH;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,IAAI,aAAa,CAEtE"}
@@ -1,21 +0,0 @@
1
- /**
2
- * 检查值是否在选项中的参数
3
- */
4
- export interface CheckValueInOptionsParams {
5
- /** 当前值(支持单个值或数组值) */
6
- modelValue: any;
7
- /** 选项数组 */
8
- options: any[];
9
- /** 表单项配置,用于获取组件类型等信息 */
10
- formItem: {
11
- compType: string;
12
- };
13
- }
14
- /**
15
- * 检查当前值是否在新的选项中
16
- * 用于判断是否需要自动清理值:如果值在新的选项中,保留;否则清理
17
- * @param params - 检查参数
18
- * @returns 是否在选项中(true 表示在选项中,不需要清理;false 表示不在,需要清理)
19
- */
20
- export declare function checkValueInOptions(params: CheckValueInOptionsParams): boolean;
21
- //# sourceMappingURL=value.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"value.d.ts","sourceRoot":"","sources":["../../src/utils/value.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,qBAAqB;IACrB,UAAU,EAAE,GAAG,CAAA;IACf,WAAW;IACX,OAAO,EAAE,GAAG,EAAE,CAAA;IACd,wBAAwB;IACxB,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAC/B;AA4BD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CA+B9E"}