@robot-admin/naive-ui-components 0.22.0 → 0.23.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.
- package/CHANGELOG.md +18 -0
- package/README.md +9 -5
- package/README_EN.md +9 -5
- package/dist/C_ActionBar.d.cts +2 -1
- package/dist/C_ActionBar.d.ts +2 -1
- package/dist/C_AntV2.cjs +3 -3
- package/dist/C_AntV2.js +3 -3
- package/dist/C_BatchResult.cjs +1 -0
- package/dist/C_BatchResult.css +32 -0
- package/dist/C_BatchResult.d.cts +2 -0
- package/dist/C_BatchResult.d.ts +2 -0
- package/dist/C_BatchResult.js +1 -0
- package/dist/C_BatchResult2.cjs +1 -0
- package/dist/C_BatchResult2.js +1 -0
- package/dist/C_Breadcrumb.d.cts +2 -2
- package/dist/C_Breadcrumb.d.ts +1 -1
- package/dist/C_Captcha.d.ts +2 -0
- package/dist/C_Cascade.d.cts +1 -1
- package/dist/C_Cascade.d.ts +1 -1
- package/dist/C_Chat.d.cts +1 -1
- package/dist/C_Chat.d.ts +1 -1
- package/dist/C_City.d.cts +1 -1
- package/dist/C_City.d.ts +1 -1
- package/dist/C_Code.d.cts +1 -1
- package/dist/C_Code.d.ts +1 -1
- package/dist/C_ContextMenu.d.cts +1 -1
- package/dist/C_ContextMenu.d.ts +1 -1
- package/dist/C_DataPicker.cjs +1 -0
- package/dist/C_DataPicker.css +54 -0
- package/dist/C_DataPicker.d.cts +2 -0
- package/dist/C_DataPicker.d.ts +5 -0
- package/dist/C_DataPicker.js +1 -0
- package/dist/C_DataPicker2.cjs +1 -0
- package/dist/C_DataPicker2.js +1 -0
- package/dist/C_Date.d.cts +1 -1
- package/dist/C_Date.d.ts +1 -1
- package/dist/C_Density.cjs +1 -0
- package/dist/C_Density.css +1 -0
- package/dist/C_Density.d.cts +3 -0
- package/dist/C_Density.d.ts +3 -0
- package/dist/C_Density.js +1 -0
- package/dist/C_Density2.cjs +1 -0
- package/dist/C_Density2.js +1 -0
- package/dist/C_Editor.d.cts +1 -1
- package/dist/C_Editor.d.ts +1 -1
- package/dist/C_ErrorSummary.cjs +1 -0
- package/dist/C_ErrorSummary.css +29 -0
- package/dist/C_ErrorSummary.d.cts +3 -0
- package/dist/C_ErrorSummary.d.ts +3 -0
- package/dist/C_ErrorSummary.js +1 -0
- package/dist/C_ErrorSummary2.cjs +1 -0
- package/dist/C_ErrorSummary2.js +1 -0
- package/dist/C_Form.base.css +150 -148
- package/dist/C_Form.cjs +1 -1
- package/dist/C_Form.css +151 -253
- package/dist/C_Form.d.cts +3 -1
- package/dist/C_Form.d.ts +19 -1
- package/dist/C_Form.js +1 -1
- package/dist/C_FormModal.css +11 -12
- package/dist/C_FormModal.d.cts +1 -1
- package/dist/C_FormModal.d.ts +18 -2
- package/dist/C_FormModal2.cjs +1 -1
- package/dist/C_FormModal2.js +1 -1
- package/dist/C_FormSearch.cjs +1 -1
- package/dist/C_FormSearch.css +128 -56
- package/dist/C_FormSearch.d.cts +3 -3
- package/dist/C_FormSearch.d.ts +5 -3
- package/dist/C_FormSearch.js +1 -1
- package/dist/C_FormulaEditor.d.cts +1 -1
- package/dist/C_FormulaEditor.d.ts +1 -1
- package/dist/C_Guide.d.cts +1 -1
- package/dist/C_Guide.d.ts +1 -1
- package/dist/C_Icon.d.cts +1 -1
- package/dist/C_Icon.d.ts +1 -1
- package/dist/C_Language.d.cts +1 -1
- package/dist/C_Language.d.ts +1 -1
- package/dist/C_Loading.d.cts +1 -1
- package/dist/C_Loading.d.ts +1 -1
- package/dist/C_Login.d.cts +1 -1
- package/dist/C_Login.d.ts +4 -1
- package/dist/C_Markdown.d.cts +1 -1
- package/dist/C_Markdown.d.ts +1 -1
- package/dist/C_Menu.d.cts +2 -2
- package/dist/C_Menu.d.ts +1 -1
- package/dist/C_OrgChart.d.cts +1 -1
- package/dist/C_OrgChart.d.ts +1 -1
- package/dist/C_Progress.d.cts +1 -1
- package/dist/C_Progress.d.ts +1 -1
- package/dist/C_SectionNav.cjs +1 -0
- package/dist/C_SectionNav.css +46 -0
- package/dist/C_SectionNav.d.cts +2 -0
- package/dist/C_SectionNav.d.ts +2 -0
- package/dist/C_SectionNav.js +1 -0
- package/dist/C_SectionNav2.cjs +1 -0
- package/dist/C_SectionNav2.js +1 -0
- package/dist/C_Skeleton.d.cts +1 -1
- package/dist/C_Skeleton.d.ts +1 -1
- package/dist/C_Steps.d.cts +1 -1
- package/dist/C_Steps.d.ts +1 -1
- package/dist/C_Table.base.css +258 -256
- package/dist/C_Table.cjs +1 -1
- package/dist/C_Table.css +109 -1283
- package/dist/C_Table.d.cts +2 -1
- package/dist/C_Table.d.ts +11 -7
- package/dist/C_Table.js +1 -1
- package/dist/C_Table2.cjs +3 -0
- package/dist/C_Table2.js +3 -0
- package/dist/C_Tabs.cjs +1 -1
- package/dist/C_Tabs.d.cts +1 -1
- package/dist/C_Tabs.d.ts +1 -1
- package/dist/C_Tabs.js +1 -1
- package/dist/C_TagsView.d.cts +1 -1
- package/dist/C_Theme.d.cts +1 -1
- package/dist/C_Theme.d.ts +1 -1
- package/dist/C_Timeline.d.cts +1 -1
- package/dist/C_Timeline.d.ts +1 -1
- package/dist/C_Transfer.d.cts +1 -1
- package/dist/C_Transfer.d.ts +1 -1
- package/dist/C_Tree.d.cts +1 -1
- package/dist/C_Tree.d.ts +10 -6
- package/dist/C_Upload.d.cts +1 -1
- package/dist/C_Upload.d.ts +1 -1
- package/dist/C_WorkFlow2.cjs +1 -1
- package/dist/C_WorkFlow2.js +1 -1
- package/dist/Card.cjs +1 -1
- package/dist/Card.js +1 -1
- package/dist/Steps.cjs +1 -1
- package/dist/Steps.js +1 -1
- package/dist/Tabs.cjs +1 -1
- package/dist/Tabs.js +1 -1
- package/dist/batchPatch.cjs +1 -0
- package/dist/batchPatch.d.cts +26 -0
- package/dist/batchPatch.d.ts +26 -0
- package/dist/batchPatch.js +1 -0
- package/dist/config.cjs +1 -1
- package/dist/config.d.cts +7 -1
- package/dist/config.d.ts +7 -1
- package/dist/config.js +1 -1
- package/dist/config2.d.ts +14 -0
- package/dist/constants.d.cts +3 -3
- package/dist/constants.d.ts +3 -3
- package/dist/constants2.d.cts +402 -173
- package/dist/constants2.d.ts +402 -173
- package/dist/constants3.d.cts +3 -3
- package/dist/constants3.d.ts +3 -3
- package/dist/constants4.d.cts +173 -402
- package/dist/constants4.d.ts +173 -402
- package/dist/constants5.d.cts +2 -2
- package/dist/constants5.d.ts +2 -2
- package/dist/data.cjs +1 -1
- package/dist/data.d.cts +5 -108
- package/dist/data.d.ts +5 -108
- package/dist/data.js +1 -1
- package/dist/data2.cjs +1 -1
- package/dist/data2.d.cts +108 -0
- package/dist/data2.d.ts +108 -0
- package/dist/data2.js +1 -1
- package/dist/data3.cjs +1 -0
- package/dist/data3.js +1 -0
- package/dist/dateRange.d.cts +108 -13
- package/dist/dateRange.d.ts +108 -13
- package/dist/density.cjs +1 -1
- package/dist/density.js +1 -1
- package/dist/dictionary.cjs +1 -0
- package/dist/dictionary.d.cts +38 -0
- package/dist/dictionary.d.ts +38 -0
- package/dist/dictionary.js +1 -0
- package/dist/helpers.cjs +1 -1
- package/dist/helpers.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +65 -53
- package/dist/index.d.ts +73 -57
- package/dist/index.js +1 -1
- package/dist/index.vue.d.cts +1 -1
- package/dist/index.vue.d.ts +1 -1
- package/dist/index10.vue.d.cts +37 -80
- package/dist/index10.vue.d.ts +77 -53
- package/dist/index11.vue.d.cts +77 -53
- package/dist/index11.vue.d.ts +1117 -45
- package/dist/index12.vue.d.cts +1117 -45
- package/dist/index12.vue.d.ts +17 -128
- package/dist/index13.vue.d.cts +17 -128
- package/dist/index13.vue.d.ts +57 -53
- package/dist/index14.vue.d.cts +57 -53
- package/dist/index14.vue.d.ts +16 -25
- package/dist/index15.vue.d.cts +16 -25
- package/dist/index15.vue.d.ts +52 -12
- package/dist/index16.vue.d.cts +52 -12
- package/dist/index16.vue.d.ts +13 -129
- package/dist/index17.vue.d.cts +13 -129
- package/dist/index17.vue.d.ts +123 -74
- package/dist/index18.vue.d.cts +123 -74
- package/dist/index18.vue.d.ts +48 -71
- package/dist/index19.vue.d.cts +40 -91
- package/dist/index19.vue.d.ts +36 -96
- package/dist/index2.vue.d.cts +2 -2
- package/dist/index2.vue.d.ts +2 -2
- package/dist/index20.vue.d.cts +38 -47
- package/dist/index20.vue.d.ts +13 -48
- package/dist/index21.vue.d.cts +12 -96
- package/dist/index21.vue.d.ts +25 -95
- package/dist/index22.vue.d.cts +20 -32
- package/dist/index22.vue.d.ts +75 -37
- package/dist/index23.vue.d.cts +77 -13
- package/dist/index23.vue.d.ts +71 -13
- package/dist/index24.vue.d.cts +2 -2
- package/dist/index24.vue.d.ts +1 -1
- package/dist/index25.vue.d.cts +116 -90
- package/dist/index25.vue.d.ts +116 -90
- package/dist/index26.vue.d.cts +94 -59
- package/dist/index26.vue.d.ts +94 -59
- package/dist/index27.vue.d.cts +75 -0
- package/dist/index27.vue.d.ts +75 -0
- package/dist/index28.vue.d.cts +103 -0
- package/dist/index28.vue.d.ts +103 -0
- package/dist/index29.vue.d.cts +105 -0
- package/dist/index29.vue.d.ts +105 -0
- package/dist/index3.vue.d.cts +4 -4
- package/dist/index3.vue.d.ts +4 -4
- package/dist/index30.vue.d.cts +28 -0
- package/dist/index30.vue.d.ts +28 -0
- package/dist/index4.vue.d.cts +19 -128
- package/dist/index4.vue.d.ts +17 -34
- package/dist/index5.vue.d.cts +127 -35
- package/dist/index5.vue.d.ts +30 -19
- package/dist/index6.vue.d.cts +30 -19
- package/dist/index6.vue.d.ts +22 -118
- package/dist/index7.vue.d.cts +22 -118
- package/dist/index7.vue.d.ts +112 -18
- package/dist/index8.vue.d.cts +112 -18
- package/dist/index8.vue.d.ts +24 -35
- package/dist/index9.vue.d.cts +24 -35
- package/dist/index9.vue.d.ts +37 -80
- package/dist/mapUtils.d.cts +4 -4
- package/dist/mapUtils.d.ts +4 -4
- package/dist/numberCodec.cjs +1 -0
- package/dist/numberCodec.d.cts +25 -0
- package/dist/numberCodec.d.ts +25 -0
- package/dist/numberCodec.js +1 -0
- package/dist/observer.cjs +1 -0
- package/dist/observer.js +1 -0
- package/dist/presets.d.cts +3 -66
- package/dist/presets.d.ts +3 -66
- package/dist/resolver.cjs +1 -1
- package/dist/resolver.d.cts +1 -1
- package/dist/resolver.d.ts +1 -1
- package/dist/resolver.js +1 -1
- package/dist/serializeSearch.cjs +1 -0
- package/dist/serializeSearch.js +1 -0
- package/dist/style.css +561 -322
- package/dist/types.d.cts +60 -103
- package/dist/types.d.ts +62 -52
- package/dist/types2.d.cts +104 -51
- package/dist/types2.d.ts +56 -0
- package/dist/types3.d.cts +56 -0
- package/dist/useCalendarEvents.d.cts +1 -1
- package/dist/useCalendarEvents.d.ts +1 -1
- package/dist/useCollapsePanel.d.cts +6 -6
- package/dist/useCollapsePanel.d.ts +6 -6
- package/dist/useComponentLocale.cjs +1 -1
- package/dist/useComponentLocale.js +1 -1
- package/dist/useCropperCore.d.cts +13 -13
- package/dist/useCropperCore.d.ts +13 -13
- package/dist/useDataResource.cjs +1 -0
- package/dist/useDataResource.js +1 -0
- package/dist/useDictionary.cjs +1 -0
- package/dist/useDictionary.js +1 -0
- package/dist/useDynamicFormState.d.cts +959 -582
- package/dist/useDynamicFormState.d.ts +951 -584
- package/dist/useEdgeInteraction.d.cts +3 -3
- package/dist/useEdgeInteraction.d.ts +3 -3
- package/dist/useFormArray.cjs +1 -0
- package/dist/useFormArray.d.cts +69 -0
- package/dist/useFormArray.d.ts +69 -0
- package/dist/useFormArray.js +1 -0
- package/dist/useFormConfig.cjs +1 -0
- package/dist/useFormConfig.d.cts +590 -0
- package/dist/useFormConfig.d.ts +590 -0
- package/dist/useFormConfig.js +1 -0
- package/dist/useFullscreen.d.cts +3 -3
- package/dist/useFullscreen.d.ts +3 -3
- package/dist/useGridWidth.cjs +1 -0
- package/dist/useGridWidth.js +1 -0
- package/dist/useInfiniteScroll.d.cts +2 -2
- package/dist/useInfiniteScroll.d.ts +2 -2
- package/dist/useQRCode.d.cts +3 -3
- package/dist/useQRCode.d.ts +3 -3
- package/dist/useSignatureHistory.d.cts +4 -4
- package/dist/useSignatureHistory.d.ts +4 -4
- package/dist/useSplitResize.d.cts +5 -5
- package/dist/useSplitResize.d.ts +5 -5
- package/dist/useTableGlobalConfig.cjs +1 -0
- package/dist/useTableGlobalConfig.js +1 -0
- package/dist/useTableQuery.cjs +1 -3
- package/dist/useTableQuery.js +1 -3
- package/dist/useWorkflowValidation.d.cts +6 -6
- package/dist/useWorkflowValidation.d.ts +6 -6
- package/dist/validation.cjs +1 -0
- package/dist/validation.d.cts +18 -0
- package/dist/validation.d.ts +18 -0
- package/dist/validation.js +1 -0
- package/dist/verification.d.cts +4 -4
- package/dist/verification.d.ts +4 -4
- package/dist/workflows.cjs +1 -0
- package/dist/workflows.d.cts +2 -0
- package/dist/workflows.d.ts +2 -0
- package/dist/workflows.js +1 -0
- package/docs/components.en.md +13 -1
- package/docs/components.md +13 -1
- package/docs/guides/batch-results.md +47 -0
- package/docs/guides/data-picker.md +65 -0
- package/docs/guides/data-workflows.md +123 -0
- package/docs/guides/form-density.en.md +56 -3
- package/docs/guides/form-density.md +56 -3
- package/docs/guides/search-workflows.md +164 -0
- package/docs/guides/usage.en.md +1 -1
- package/package.json +21 -1
- package/dist/C_FormSearch2.cjs +0 -1
- package/dist/C_FormSearch2.js +0 -1
- package/dist/useTableQuery.d.cts +0 -1957
- package/dist/useTableQuery.d.ts +0 -1957
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
import { n as ComponentLocale, t as ComponentFeedback } from "./contracts.cjs";
|
|
2
|
+
import { t as DictionaryBinding } from "./dictionary.cjs";
|
|
3
|
+
import { t as ComponentDensity } from "./density.cjs";
|
|
4
|
+
import { CSSProperties, ComputedRef, DeepReadonly, VNode } from "vue";
|
|
5
|
+
import { FormInst, FormItemRule } from "naive-ui";
|
|
6
|
+
import { NAIVE_COMBOS, NaiveRule, PRESET_RULES, RuleSpec, RuleSpec as RuleSpec$1, SPEC_RULES } from "@robot-admin/form-validate";
|
|
7
|
+
|
|
8
|
+
//#region src/components/C_Form/utils/formValidation.d.ts
|
|
9
|
+
/** 原生规则、验证库规则和框架无关规则均可直接作为字段配置。 */
|
|
10
|
+
type FormValidationRule = FormItemRule | NaiveRule | RuleSpec;
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region src/components/C_Form/types.d.ts
|
|
13
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
14
|
+
type FormRecord = Record<string, unknown>;
|
|
15
|
+
type AtomicFormValue = string | number | boolean | bigint | symbol | null | undefined | Date | RegExp | File | Blob;
|
|
16
|
+
/**
|
|
17
|
+
* 最多展开五次子模型,保留六层字段路径及递归业务模型支持。
|
|
18
|
+
* 每层引用独立别名,避免 TypeScript 5.8 方差检查递归路径自身时栈溢出。
|
|
19
|
+
*/
|
|
20
|
+
type FieldPathChild<T> = NonNullable<T> extends AtomicFormValue ? never : NonNullable<T> extends readonly (infer Item)[] ? NonNullable<Item> extends AtomicFormValue ? never : NonNullable<Item> extends object ? NonNullable<Item> : never : NonNullable<T> extends object ? NonNullable<T> : never;
|
|
21
|
+
type FieldPathStep<T extends object, Children extends { [K in keyof T]: string }> = { [K in Extract<keyof T, string>]: NonNullable<T[K]> extends AtomicFormValue ? K : NonNullable<T[K]> extends readonly (infer Item)[] ? NonNullable<Item> extends AtomicFormValue ? K | `${K}.${number}` : NonNullable<Item> extends object ? K | `${K}.${number}` | `${K}.${number}.${Children[K]}` : K : NonNullable<T[K]> extends object ? K | `${K}.${Children[K]}` : K }[Extract<keyof T, string>];
|
|
22
|
+
type NestedFieldPath0<T extends object> = Extract<keyof T, string>;
|
|
23
|
+
type NestedFieldPath1<T extends object> = FieldPathStep<T, { [K in keyof T]: NestedFieldPath0<FieldPathChild<T[K]>> }>;
|
|
24
|
+
type NestedFieldPath2<T extends object> = FieldPathStep<T, { [K in keyof T]: NestedFieldPath1<FieldPathChild<T[K]>> }>;
|
|
25
|
+
type NestedFieldPath3<T extends object> = FieldPathStep<T, { [K in keyof T]: NestedFieldPath2<FieldPathChild<T[K]>> }>;
|
|
26
|
+
type NestedFieldPath4<T extends object> = FieldPathStep<T, { [K in keyof T]: NestedFieldPath3<FieldPathChild<T[K]>> }>;
|
|
27
|
+
type NestedFieldPath5<T extends object> = FieldPathStep<T, { [K in keyof T]: NestedFieldPath4<FieldPathChild<T[K]>> }>;
|
|
28
|
+
type FieldPath<T extends object = FormRecord> = keyof T extends never ? string : string extends keyof T ? string : NestedFieldPath5<T>;
|
|
29
|
+
type NestedFieldPathValue<T, P extends string> = T extends readonly (infer Item)[] ? P extends `${number}.${infer Rest}` ? NestedFieldPathValue<NonNullable<Item>, Rest> : P extends `${number}` ? Item : unknown : P extends keyof T ? T[P] : P extends `${infer K}.${infer Rest}` ? K extends keyof T ? NestedFieldPathValue<NonNullable<T[K]>, Rest> : unknown : unknown;
|
|
30
|
+
type FieldPathValue<T extends object, P extends string> = NestedFieldPathValue<T, P>;
|
|
31
|
+
/**
|
|
32
|
+
* 表单模式
|
|
33
|
+
* @description create = 新建(空白表单),edit = 编辑(回填已有数据 + 脏检查)
|
|
34
|
+
*/
|
|
35
|
+
type FormMode = 'create' | 'edit';
|
|
36
|
+
/**
|
|
37
|
+
* 支持的布局类型
|
|
38
|
+
* @description 定义表单支持的所有布局模式
|
|
39
|
+
*/
|
|
40
|
+
type LayoutType = 'default' | 'inline' | 'grid' | 'card' | 'tabs' | 'steps' | 'dynamic' | 'custom';
|
|
41
|
+
/**
|
|
42
|
+
* 标签位置类型
|
|
43
|
+
* @description 表单标签的显示位置
|
|
44
|
+
*/
|
|
45
|
+
type LabelPlacement = 'left' | 'top';
|
|
46
|
+
/**
|
|
47
|
+
* 支持的表单控件类型
|
|
48
|
+
* @description 所有支持的表单输入控件类型
|
|
49
|
+
*/
|
|
50
|
+
type ComponentType = 'input' | 'textarea' | 'inputNumber' | 'select' | 'checkbox' | 'radio' | 'switch' | 'slider' | 'rate' | 'datePicker' | 'daterange' | 'timePicker' | 'cascader' | 'colorPicker' | 'upload' | 'editor';
|
|
51
|
+
/**
|
|
52
|
+
* 选项项接口
|
|
53
|
+
* @description 用于 select、checkbox、radio 等组件的选项配置
|
|
54
|
+
*/
|
|
55
|
+
interface OptionItem {
|
|
56
|
+
value: string | number | boolean;
|
|
57
|
+
label: string;
|
|
58
|
+
disabled?: boolean;
|
|
59
|
+
[key: string]: unknown;
|
|
60
|
+
}
|
|
61
|
+
interface AsyncOptionsContext {
|
|
62
|
+
field: string;
|
|
63
|
+
reason: 'initialize' | 'dependency' | 'manual';
|
|
64
|
+
signal: AbortSignal;
|
|
65
|
+
}
|
|
66
|
+
interface FormErrorContext {
|
|
67
|
+
source: 'initialize' | 'async-options' | 'callback' | 'render' | 'submit';
|
|
68
|
+
field?: string;
|
|
69
|
+
}
|
|
70
|
+
/** 组件卸载时取消当前提交,业务请求可直接使用 signal。 */
|
|
71
|
+
interface FormSubmitContext {
|
|
72
|
+
signal: AbortSignal;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 标签页配置接口
|
|
76
|
+
* @description 用于标签页布局的单个标签页配置
|
|
77
|
+
*/
|
|
78
|
+
interface TabConfig {
|
|
79
|
+
key: string;
|
|
80
|
+
title: string;
|
|
81
|
+
description?: string;
|
|
82
|
+
disabled?: boolean;
|
|
83
|
+
icon?: string;
|
|
84
|
+
closable?: boolean;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 步骤配置接口
|
|
88
|
+
* @description 用于步骤布局的单个步骤配置
|
|
89
|
+
*/
|
|
90
|
+
interface StepConfig {
|
|
91
|
+
key: string;
|
|
92
|
+
title: string;
|
|
93
|
+
description?: string;
|
|
94
|
+
disabled?: boolean;
|
|
95
|
+
icon?: string;
|
|
96
|
+
required?: boolean;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 分组配置接口
|
|
100
|
+
* @description 用于卡片布局和自定义布局的分组配置
|
|
101
|
+
*/
|
|
102
|
+
interface GroupConfig {
|
|
103
|
+
key: string;
|
|
104
|
+
title: string;
|
|
105
|
+
description?: string;
|
|
106
|
+
icon?: string;
|
|
107
|
+
color?: string;
|
|
108
|
+
collapsible?: boolean;
|
|
109
|
+
collapsed?: boolean;
|
|
110
|
+
defaultExpanded?: boolean;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 动态字段配置接口
|
|
114
|
+
* @description 用于动态布局的字段配置
|
|
115
|
+
*/
|
|
116
|
+
interface DynamicFieldConfig {
|
|
117
|
+
id: string;
|
|
118
|
+
type: ComponentType | string;
|
|
119
|
+
prop: string;
|
|
120
|
+
label: string;
|
|
121
|
+
visible: boolean;
|
|
122
|
+
removable: boolean;
|
|
123
|
+
created: number;
|
|
124
|
+
placeholder?: string;
|
|
125
|
+
layout?: {
|
|
126
|
+
span?: number;
|
|
127
|
+
};
|
|
128
|
+
rules?: readonly FormValidationRule[];
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* 表单项布局配置
|
|
132
|
+
* @description 单个表单项的布局相关配置
|
|
133
|
+
*/
|
|
134
|
+
interface ItemLayoutConfig {
|
|
135
|
+
span?: number;
|
|
136
|
+
offset?: number;
|
|
137
|
+
width?: string | number;
|
|
138
|
+
group?: string;
|
|
139
|
+
tab?: string;
|
|
140
|
+
step?: string;
|
|
141
|
+
dynamic?: boolean;
|
|
142
|
+
customRender?: boolean;
|
|
143
|
+
enhanced?: boolean;
|
|
144
|
+
class?: string;
|
|
145
|
+
style?: CSSProperties | Record<string, unknown>;
|
|
146
|
+
hidden?: boolean;
|
|
147
|
+
suffix?: boolean;
|
|
148
|
+
/** Legacy nested grid attributes; top-level layout values take precedence. */
|
|
149
|
+
grid?: {
|
|
150
|
+
span?: number;
|
|
151
|
+
offset?: number;
|
|
152
|
+
suffix?: boolean;
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* 网格布局配置
|
|
157
|
+
* @description 网格布局的详细配置选项
|
|
158
|
+
*/
|
|
159
|
+
interface GridLayoutConfig {
|
|
160
|
+
cols?: number;
|
|
161
|
+
/** 可选的字段最小宽度(包含 label);responsive=false 时不自动扩展。 */
|
|
162
|
+
minItemWidth?: number;
|
|
163
|
+
gutter?: number;
|
|
164
|
+
yGutter?: number;
|
|
165
|
+
xGap?: number;
|
|
166
|
+
yGap?: number;
|
|
167
|
+
responsive?: boolean;
|
|
168
|
+
showConfigPanel?: boolean;
|
|
169
|
+
showStats?: boolean;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 内联布局配置
|
|
173
|
+
* @description 内联布局的详细配置选项
|
|
174
|
+
*/
|
|
175
|
+
interface InlineLayoutConfig {
|
|
176
|
+
gap?: number;
|
|
177
|
+
rowGap?: number;
|
|
178
|
+
itemWidth?: number;
|
|
179
|
+
align?: 'start' | 'center' | 'end' | 'baseline' | 'stretch';
|
|
180
|
+
wrap?: 'nowrap' | 'wrap' | 'wrap-reverse';
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* 卡片布局配置
|
|
184
|
+
* @description 卡片布局的详细配置选项
|
|
185
|
+
*/
|
|
186
|
+
interface CardLayoutConfig {
|
|
187
|
+
groups?: GroupConfig[];
|
|
188
|
+
spacing?: number;
|
|
189
|
+
bordered?: boolean;
|
|
190
|
+
direction?: 'vertical' | 'horizontal';
|
|
191
|
+
showLayoutConfig?: boolean;
|
|
192
|
+
showActionPanel?: boolean;
|
|
193
|
+
showProgress?: boolean;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 标签页布局配置
|
|
197
|
+
* @description 标签页布局的详细配置选项
|
|
198
|
+
*/
|
|
199
|
+
interface TabsLayoutConfig {
|
|
200
|
+
tabs?: TabConfig[];
|
|
201
|
+
type?: 'line' | 'card' | 'segment';
|
|
202
|
+
size?: 'small' | 'medium' | 'large';
|
|
203
|
+
placement?: 'top' | 'right' | 'bottom' | 'left';
|
|
204
|
+
defaultTab?: string;
|
|
205
|
+
animated?: boolean;
|
|
206
|
+
closable?: boolean;
|
|
207
|
+
addable?: boolean;
|
|
208
|
+
showTabHeader?: boolean;
|
|
209
|
+
showActions?: boolean;
|
|
210
|
+
showCount?: boolean;
|
|
211
|
+
validateBeforeSwitch?: boolean;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* 步骤布局配置
|
|
215
|
+
* @description 步骤布局的详细配置选项
|
|
216
|
+
*/
|
|
217
|
+
interface StepsLayoutConfig {
|
|
218
|
+
steps?: StepConfig[];
|
|
219
|
+
vertical?: boolean;
|
|
220
|
+
size?: 'small' | 'medium';
|
|
221
|
+
defaultStep?: number;
|
|
222
|
+
showStepHeader?: boolean;
|
|
223
|
+
validateBeforeNext?: boolean;
|
|
224
|
+
prevButtonText?: string;
|
|
225
|
+
nextButtonText?: string;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* 动态布局配置
|
|
229
|
+
* @description 动态布局的详细配置选项
|
|
230
|
+
*/
|
|
231
|
+
interface DynamicLayoutConfig {
|
|
232
|
+
grid?: {
|
|
233
|
+
cols?: number;
|
|
234
|
+
gutter?: number;
|
|
235
|
+
};
|
|
236
|
+
controls?: {
|
|
237
|
+
showControls?: boolean;
|
|
238
|
+
showItemControls?: boolean;
|
|
239
|
+
showStats?: boolean;
|
|
240
|
+
};
|
|
241
|
+
dynamic?: {
|
|
242
|
+
allowAdd?: boolean;
|
|
243
|
+
allowRemove?: boolean;
|
|
244
|
+
allowToggle?: boolean;
|
|
245
|
+
maxFields?: number;
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* 自定义渲染布局配置
|
|
250
|
+
* @description 自定义渲染布局的详细配置选项
|
|
251
|
+
*/
|
|
252
|
+
interface CustomLayoutConfig {
|
|
253
|
+
groups?: GroupConfig[];
|
|
254
|
+
rendering?: {
|
|
255
|
+
mode?: 'basic' | 'enhanced';
|
|
256
|
+
animations?: boolean;
|
|
257
|
+
tooltips?: boolean;
|
|
258
|
+
};
|
|
259
|
+
display?: {
|
|
260
|
+
showIntro?: boolean;
|
|
261
|
+
showModeSwitch?: boolean;
|
|
262
|
+
showGroupActions?: boolean;
|
|
263
|
+
showStats?: boolean;
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* 完整布局配置
|
|
268
|
+
* @description 包含所有布局类型的配置选项
|
|
269
|
+
*/
|
|
270
|
+
interface LayoutConfig {
|
|
271
|
+
type?: LayoutType;
|
|
272
|
+
grid?: GridLayoutConfig;
|
|
273
|
+
inline?: InlineLayoutConfig;
|
|
274
|
+
card?: CardLayoutConfig;
|
|
275
|
+
tabs?: TabsLayoutConfig;
|
|
276
|
+
steps?: StepsLayoutConfig;
|
|
277
|
+
dynamic?: DynamicLayoutConfig;
|
|
278
|
+
custom?: CustomLayoutConfig;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* 表单配置项接口
|
|
282
|
+
* @description 单个表单项的完整配置
|
|
283
|
+
*/
|
|
284
|
+
interface FormOptionBase<T extends object> {
|
|
285
|
+
id?: string;
|
|
286
|
+
type: ComponentType | string;
|
|
287
|
+
label?: string;
|
|
288
|
+
placeholder?: string;
|
|
289
|
+
rules?: readonly FormValidationRule[];
|
|
290
|
+
attrs?: Record<string, unknown>;
|
|
291
|
+
children?: OptionItem[];
|
|
292
|
+
/** 应用字典名称或直接选项源;asyncOptions、显式 children 优先。 */
|
|
293
|
+
dictionary?: DictionaryBinding;
|
|
294
|
+
show?: boolean;
|
|
295
|
+
layout?: ItemLayoutConfig;
|
|
296
|
+
help?: string;
|
|
297
|
+
required?: boolean;
|
|
298
|
+
dependsOn?: FieldPath<T> | FieldPath<T>[];
|
|
299
|
+
showWhen?: (formModel: FormModel<T>) => boolean;
|
|
300
|
+
/** 自定义/虚拟控件准备并返回真实焦点目标;由表单校验状态后执行 focus。 */
|
|
301
|
+
focusTarget?: (context: {
|
|
302
|
+
field: FieldPath<T>;
|
|
303
|
+
element: HTMLElement | null;
|
|
304
|
+
model: FormModel<T>;
|
|
305
|
+
signal: AbortSignal;
|
|
306
|
+
}) => MaybePromise<HTMLElement | null>;
|
|
307
|
+
/** 字段级禁用(优先级高于全局 config.disabled) */
|
|
308
|
+
disabled?: boolean | ((formModel: FormModel<T>) => boolean);
|
|
309
|
+
/** 字段级只读(优先级高于全局 config.readonly) */
|
|
310
|
+
readonly?: boolean | ((formModel: FormModel<T>) => boolean);
|
|
311
|
+
/** 异步数据源:select / cascader / checkbox / radio 的远程选项加载 */
|
|
312
|
+
asyncOptions?: (formModel: FormModel<T>, context?: AsyncOptionsContext) => Promise<readonly OptionItem[]>;
|
|
313
|
+
/** 联动校验规则:根据表单数据动态返回校验规则 */
|
|
314
|
+
rulesWhen?: (formModel: FormModel<T>) => readonly FormValidationRule[];
|
|
315
|
+
/** 跨字段校验:需要引用多个字段值的验证函数,返回错误消息或 null */
|
|
316
|
+
crossFieldValidator?: (formModel: FormModel<T>) => MaybePromise<string | null>;
|
|
317
|
+
}
|
|
318
|
+
/** 字段名与初值、联动返回值关联;未声明业务模型时保持动态表单的宽松契约。 */
|
|
319
|
+
type FormOption<T extends object = FormRecord> = FormOptionBase<T> & { [P in FieldPath<T>]: {
|
|
320
|
+
prop: P;
|
|
321
|
+
value?: FieldPathValue<T, P>; /** 联动赋值:其他字段变化时自动计算本字段的值。 */
|
|
322
|
+
valueWhen?: (formModel: FormModel<T>) => FieldPathValue<T, P>;
|
|
323
|
+
} }[FieldPath<T>];
|
|
324
|
+
/**
|
|
325
|
+
* 表单提交事件参数
|
|
326
|
+
*/
|
|
327
|
+
interface SubmitEventPayload<T extends object = FormRecord> {
|
|
328
|
+
model: FormModel<T>;
|
|
329
|
+
form: FormInst;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* C_Form 组件实例暴露的方法
|
|
333
|
+
* @description 表单组件实例对外暴露的所有方法
|
|
334
|
+
*/
|
|
335
|
+
interface FormInstance<T extends object = FormRecord> {
|
|
336
|
+
validate(): Promise<void>;
|
|
337
|
+
/** 展开字段所在区域并聚焦可用控件;隐藏、只读、禁用或切换被阻止时返回 false。 */
|
|
338
|
+
revealField(field: string): Promise<boolean>;
|
|
339
|
+
validateField(field: FieldPath<T> | FieldPath<T>[]): Promise<void>;
|
|
340
|
+
validateStep(step: number | string): Promise<boolean>;
|
|
341
|
+
validateTab(tabKey: string): Promise<boolean>;
|
|
342
|
+
validateDynamicFields(): Promise<boolean>;
|
|
343
|
+
validateCustomGroup(groupKey: string): Promise<boolean>;
|
|
344
|
+
clearValidation(field?: FieldPath<T> | FieldPath<T>[]): void;
|
|
345
|
+
getModel(): FormModel<T>;
|
|
346
|
+
setFields(fields: Partial<FormModel<T>>): void;
|
|
347
|
+
resetFields(): void;
|
|
348
|
+
setFieldValue<P extends FieldPath<T>>(field: P, value: FieldPathValue<T, P>, shouldValidate?: boolean): Promise<void>;
|
|
349
|
+
getFieldValue<P extends FieldPath<T>>(field: P): FieldPathValue<T, P>;
|
|
350
|
+
setFieldsValue(fields: Partial<FormModel<T>>, shouldValidate?: boolean): Promise<void>;
|
|
351
|
+
formRef: FormInst | null;
|
|
352
|
+
formModel: FormModel<T>;
|
|
353
|
+
initialize(): void;
|
|
354
|
+
layoutType: LayoutType;
|
|
355
|
+
shouldShowDefaultActions: boolean;
|
|
356
|
+
/** 表单是否被修改过 */
|
|
357
|
+
isDirty: boolean;
|
|
358
|
+
/** 获取被修改的字段列表 */
|
|
359
|
+
getChangedFields(): FieldPath<T>[];
|
|
360
|
+
/** 检查某字段是否被修改 */
|
|
361
|
+
isFieldDirty(field: FieldPath<T>): boolean;
|
|
362
|
+
/** 将当前值设为初始快照(常用于编辑模式加载数据后) */
|
|
363
|
+
markAsClean(): void;
|
|
364
|
+
/** 字段异步选项的 loading 状态 */
|
|
365
|
+
asyncLoadingMap: Record<string, boolean>;
|
|
366
|
+
/** 字段异步选项加载错误 */
|
|
367
|
+
asyncErrorMap: Record<string, unknown>;
|
|
368
|
+
/** 重新加载全部或指定字段的异步选项 */
|
|
369
|
+
reloadOptions(field?: FieldPath<T>): Promise<void>;
|
|
370
|
+
/** 是否正在提交 */
|
|
371
|
+
isSubmitting: boolean;
|
|
372
|
+
/** 验证并提交,成功返回 true */
|
|
373
|
+
submit(): Promise<boolean>;
|
|
374
|
+
}
|
|
375
|
+
/** C_Form 默认操作区插槽参数。 */
|
|
376
|
+
interface FormActionSlotProps<T extends object = FormRecord> {
|
|
377
|
+
form: FormInst | null;
|
|
378
|
+
model: FormModel<T>;
|
|
379
|
+
validate: FormInstance<T>['validate'];
|
|
380
|
+
validateField: FormInstance<T>['validateField'];
|
|
381
|
+
reset: FormInstance<T>['resetFields'];
|
|
382
|
+
setFields: FormInstance<T>['setFields'];
|
|
383
|
+
getModel: FormInstance<T>['getModel'];
|
|
384
|
+
clearValidation: FormInstance<T>['clearValidation'];
|
|
385
|
+
submit: FormInstance<T>['submit'];
|
|
386
|
+
reloadOptions: FormInstance<T>['reloadOptions'];
|
|
387
|
+
submitting: boolean;
|
|
388
|
+
}
|
|
389
|
+
/** Tabs 布局操作区插槽参数。 */
|
|
390
|
+
interface FormTabActionsSlotProps {
|
|
391
|
+
currentTab: string;
|
|
392
|
+
totalTabs: number;
|
|
393
|
+
validateTab: () => Promise<boolean>;
|
|
394
|
+
switchToTab: (targetTab: string) => Promise<boolean>;
|
|
395
|
+
}
|
|
396
|
+
/** Steps 布局操作区插槽参数。 */
|
|
397
|
+
interface FormStepActionsSlotProps {
|
|
398
|
+
currentStep: number;
|
|
399
|
+
totalSteps: number;
|
|
400
|
+
isFirstStep: boolean;
|
|
401
|
+
isLastStep: boolean;
|
|
402
|
+
nextStep: () => Promise<void>;
|
|
403
|
+
previousStep: () => void;
|
|
404
|
+
goToStep: (stepIndex: number) => Promise<void>;
|
|
405
|
+
/** Validate and submit the complete form, including fields in other steps. */
|
|
406
|
+
submit: () => Promise<boolean>;
|
|
407
|
+
submitting: boolean;
|
|
408
|
+
}
|
|
409
|
+
/** C_Form 对外公开的具名插槽。 */
|
|
410
|
+
interface FormSlots<T extends object = FormRecord> {
|
|
411
|
+
/** Field-specific named slots are intentionally open-ended. */
|
|
412
|
+
[slotName: string]: ((props: any) => unknown) | undefined;
|
|
413
|
+
action?: (props: FormActionSlotProps<T>) => unknown;
|
|
414
|
+
/** 增加业务按钮,保留组件默认的提交、重置和加载管理。 */
|
|
415
|
+
'action-extra'?: (props: FormActionSlotProps<T>) => unknown;
|
|
416
|
+
'tab-actions'?: (props: FormTabActionsSlotProps) => unknown;
|
|
417
|
+
'step-actions'?: (props: FormStepActionsSlotProps) => unknown;
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* 表单数据模型类型(泛型)
|
|
421
|
+
*/
|
|
422
|
+
type FormModel<T extends object = FormRecord> = T;
|
|
423
|
+
/**
|
|
424
|
+
* 渲染模式类型
|
|
425
|
+
*/
|
|
426
|
+
type RenderMode = 'basic' | 'enhanced';
|
|
427
|
+
/**
|
|
428
|
+
* 动态表单配置接口
|
|
429
|
+
*/
|
|
430
|
+
interface DynamicFormConfig {
|
|
431
|
+
maxFields: number;
|
|
432
|
+
autoSave: boolean;
|
|
433
|
+
enableSort: boolean;
|
|
434
|
+
showControls: boolean;
|
|
435
|
+
showItemControls: boolean;
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* 动态表单状态接口
|
|
439
|
+
*/
|
|
440
|
+
interface DynamicFormState {
|
|
441
|
+
config: DynamicFormConfig;
|
|
442
|
+
baseFields: FormOption[];
|
|
443
|
+
dynamicFields: DynamicFieldConfig[];
|
|
444
|
+
hiddenFieldIds: Set<string>;
|
|
445
|
+
fieldCounter: number;
|
|
446
|
+
isInitialized: boolean;
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* 动态表单状态控制器
|
|
450
|
+
* @description 为组合式函数提供稳定的公共返回类型,避免声明文件泄漏依赖库内部类型
|
|
451
|
+
*/
|
|
452
|
+
interface DynamicFormController {
|
|
453
|
+
state: DeepReadonly<DynamicFormState>;
|
|
454
|
+
allFields: ComputedRef<FormOption[]>;
|
|
455
|
+
visibleFields: ComputedRef<FormOption[]>;
|
|
456
|
+
dynamicFieldsCount: ComputedRef<number>;
|
|
457
|
+
hiddenFieldsCount: ComputedRef<number>;
|
|
458
|
+
canAddMoreFields: ComputedRef<boolean>;
|
|
459
|
+
allVisible: ComputedRef<boolean>;
|
|
460
|
+
FIELD_TYPE_OPTIONS: ReadonlyArray<{
|
|
461
|
+
label: string;
|
|
462
|
+
value: ComponentType;
|
|
463
|
+
}>;
|
|
464
|
+
addField(config?: Partial<DynamicFieldConfig>): DynamicFieldConfig | null;
|
|
465
|
+
removeField(index?: number): DynamicFieldConfig | null;
|
|
466
|
+
clearDynamicFields(): number;
|
|
467
|
+
toggleFieldVisibility(fieldId: string): boolean;
|
|
468
|
+
toggleAllVisibility(): boolean;
|
|
469
|
+
updateConfig(config: Partial<DynamicFormConfig>): void;
|
|
470
|
+
exportConfig(): string;
|
|
471
|
+
initialize(baseFields: FormOption[], config?: Partial<DynamicFormConfig>): void;
|
|
472
|
+
}
|
|
473
|
+
//#endregion
|
|
474
|
+
//#region src/components/C_Form/composables/useFormConfig.d.ts
|
|
475
|
+
/** 布局回调事件 — 替代原先 16 个 emit 中的纯透传事件 */
|
|
476
|
+
interface LayoutCallbacks<T extends object = FormRecord> {
|
|
477
|
+
onTabChange?: (tabKey: string, tabIndex: number) => void;
|
|
478
|
+
onTabBeforeChange?: (currentTab: string, targetTab: string) => MaybePromise<boolean | void>;
|
|
479
|
+
onTabValidate?: (tabKey: string) => void;
|
|
480
|
+
onStepChange?: (stepIndex: number, stepKey: string) => void;
|
|
481
|
+
onStepBeforeChange?: (currentStep: number, targetStep: number) => MaybePromise<boolean | void>;
|
|
482
|
+
onStepValidate?: (stepIndex: number) => void;
|
|
483
|
+
onFieldAdd?: (fieldConfig: DynamicFieldConfig) => void;
|
|
484
|
+
onFieldRemove?: (fieldId: string) => void;
|
|
485
|
+
onFieldToggle?: (fieldId: string, visible: boolean) => void;
|
|
486
|
+
onFieldsClear?: () => void;
|
|
487
|
+
onRenderModeChange?: (mode: RenderMode) => void;
|
|
488
|
+
onGroupToggle?: (groupKey: string, collapsed: boolean) => void;
|
|
489
|
+
onGroupReset?: (groupKey: string) => void;
|
|
490
|
+
onFieldsChange?: (fields: FormOption<T>[]) => void;
|
|
491
|
+
onSubmit?: (payload: SubmitEventPayload<T>, context?: FormSubmitContext) => unknown;
|
|
492
|
+
onError?: (error: unknown, context: FormErrorContext) => void;
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* C_Form 统一配置接口
|
|
496
|
+
* @description 收拢原先 13 个分散 Props 为 1 个 config 对象
|
|
497
|
+
* 默认值均在 FORM_DEFAULTS 中集中管理
|
|
498
|
+
*/
|
|
499
|
+
interface FormConfig<T extends object = FormRecord> extends LayoutCallbacks<T> {
|
|
500
|
+
feedback?: ComponentFeedback;
|
|
501
|
+
locale?: ComponentLocale;
|
|
502
|
+
/** 布局类型,默认 'default' */
|
|
503
|
+
layout?: LayoutType;
|
|
504
|
+
/** 标签位置,默认 'left' */
|
|
505
|
+
labelPlacement?: LabelPlacement;
|
|
506
|
+
/** 标签宽度,默认 'auto' */
|
|
507
|
+
labelWidth?: string | number;
|
|
508
|
+
/** 尺寸,默认 'medium' */
|
|
509
|
+
size?: 'small' | 'medium' | 'large';
|
|
510
|
+
/** 与表格、搜索表单一致的密度;显式 size 和布局间距优先。 */
|
|
511
|
+
density?: ComponentDensity;
|
|
512
|
+
/** 禁用整个表单,默认 false */
|
|
513
|
+
disabled?: boolean;
|
|
514
|
+
/** 只读,默认 false */
|
|
515
|
+
readonly?: boolean;
|
|
516
|
+
/** 显示默认提交/重置按钮,默认 true */
|
|
517
|
+
showActions?: boolean;
|
|
518
|
+
/** 值变化时自动校验,默认 false */
|
|
519
|
+
validateOnChange?: boolean;
|
|
520
|
+
/** 动态移除配置项后是否保留其模型值,默认 false */
|
|
521
|
+
preserveRemovedFields?: boolean;
|
|
522
|
+
/** 默认提交按钮文案 */
|
|
523
|
+
submitText?: string;
|
|
524
|
+
/** 默认重置按钮文案 */
|
|
525
|
+
resetText?: string;
|
|
526
|
+
/** 提交完成后的提示;默认不显示,由业务明确配置。 */
|
|
527
|
+
submitSuccessText?: string;
|
|
528
|
+
/** 重置完成后的提示;默认不显示。 */
|
|
529
|
+
resetSuccessText?: string;
|
|
530
|
+
/** 表单模式:create = 新建(默认),edit = 编辑(配合 initialValues 实现回填 + 脏检查) */
|
|
531
|
+
mode?: FormMode;
|
|
532
|
+
/** 编辑模式初始值:设置后自动作为脏检查基准 */
|
|
533
|
+
initialValues?: Partial<T>;
|
|
534
|
+
grid?: GridLayoutConfig;
|
|
535
|
+
inline?: InlineLayoutConfig;
|
|
536
|
+
card?: CardLayoutConfig;
|
|
537
|
+
tabs?: TabsLayoutConfig;
|
|
538
|
+
steps?: StepsLayoutConfig;
|
|
539
|
+
dynamic?: DynamicLayoutConfig;
|
|
540
|
+
custom?: CustomLayoutConfig;
|
|
541
|
+
}
|
|
542
|
+
/** Read application-level C_Form defaults without requiring a provider. */
|
|
543
|
+
declare function useFormGlobalConfig(): FormConfig;
|
|
544
|
+
/** Merge nested layout sections while preserving local-over-global precedence. */
|
|
545
|
+
declare function mergeFormConfig(local: FormConfig | undefined, global: FormConfig): FormConfig;
|
|
546
|
+
/** 解析后的配置(所有必填字段均已设置默认值) */
|
|
547
|
+
interface ResolvedFormConfig extends Required<Omit<FormConfig, keyof LayoutCallbacks | 'grid' | 'inline' | 'card' | 'tabs' | 'steps' | 'dynamic' | 'custom' | 'initialValues' | 'feedback' | 'locale'>> {
|
|
548
|
+
grid?: GridLayoutConfig;
|
|
549
|
+
inline?: InlineLayoutConfig;
|
|
550
|
+
card?: CardLayoutConfig;
|
|
551
|
+
tabs?: TabsLayoutConfig;
|
|
552
|
+
steps?: StepsLayoutConfig;
|
|
553
|
+
dynamic?: DynamicLayoutConfig;
|
|
554
|
+
custom?: CustomLayoutConfig;
|
|
555
|
+
onTabChange?: LayoutCallbacks['onTabChange'];
|
|
556
|
+
onTabBeforeChange?: LayoutCallbacks['onTabBeforeChange'];
|
|
557
|
+
onTabValidate?: LayoutCallbacks['onTabValidate'];
|
|
558
|
+
onStepChange?: LayoutCallbacks['onStepChange'];
|
|
559
|
+
onStepBeforeChange?: LayoutCallbacks['onStepBeforeChange'];
|
|
560
|
+
onStepValidate?: LayoutCallbacks['onStepValidate'];
|
|
561
|
+
onFieldAdd?: LayoutCallbacks['onFieldAdd'];
|
|
562
|
+
onFieldRemove?: LayoutCallbacks['onFieldRemove'];
|
|
563
|
+
onFieldToggle?: LayoutCallbacks['onFieldToggle'];
|
|
564
|
+
onFieldsClear?: LayoutCallbacks['onFieldsClear'];
|
|
565
|
+
onRenderModeChange?: LayoutCallbacks['onRenderModeChange'];
|
|
566
|
+
onGroupToggle?: LayoutCallbacks['onGroupToggle'];
|
|
567
|
+
onGroupReset?: LayoutCallbacks['onGroupReset'];
|
|
568
|
+
onFieldsChange?: LayoutCallbacks['onFieldsChange'];
|
|
569
|
+
onSubmit?: LayoutCallbacks['onSubmit'];
|
|
570
|
+
onError?: LayoutCallbacks['onError'];
|
|
571
|
+
initialValues?: Record<string, any>;
|
|
572
|
+
feedback?: ComponentFeedback;
|
|
573
|
+
locale?: ComponentLocale;
|
|
574
|
+
}
|
|
575
|
+
declare const FORM_DEFAULTS: ResolvedFormConfig;
|
|
576
|
+
/** 拥有自身控制按钮的布局(不显示默认操作按钮) */
|
|
577
|
+
declare const LAYOUTS_WITH_OWN_CONTROLS: readonly LayoutType[];
|
|
578
|
+
/**
|
|
579
|
+
* 解析 FormConfig,合并默认值
|
|
580
|
+
* @param config - 用户传入的配置(可选)
|
|
581
|
+
* @returns 具有完整默认值的 ResolvedFormConfig
|
|
582
|
+
*/
|
|
583
|
+
declare function resolveFormConfig(config?: FormConfig): ResolvedFormConfig;
|
|
584
|
+
/**
|
|
585
|
+
* 计算是否显示默认操作按钮
|
|
586
|
+
* @param resolved - 已解析的配置
|
|
587
|
+
*/
|
|
588
|
+
declare function shouldShowActions(resolved: ResolvedFormConfig): boolean;
|
|
589
|
+
//#endregion
|
|
590
|
+
export { FormTabActionsSlotProps as A, TabsLayoutConfig as B, FormMode as C, FormSlots as D, FormRecord as E, LayoutType as F, SPEC_RULES as G, NAIVE_COMBOS as H, MaybePromise as I, OptionItem as L, InlineLayoutConfig as M, LabelPlacement as N, FormStepActionsSlotProps as O, LayoutConfig as P, StepsLayoutConfig as R, FormInstance as S, FormOption as T, PRESET_RULES as U, FormValidationRule as V, RuleSpec$1 as W, DynamicFormState as _, ResolvedFormConfig as a, FormActionSlotProps as b, shouldShowActions as c, CardLayoutConfig as d, ComponentType as f, DynamicFormController as g, DynamicFormConfig as h, LayoutCallbacks as i, GridLayoutConfig as j, FormSubmitContext as k, useFormGlobalConfig as l, DynamicFieldConfig as m, FormConfig as n, mergeFormConfig as o, CustomLayoutConfig as p, LAYOUTS_WITH_OWN_CONTROLS as r, resolveFormConfig as s, FORM_DEFAULTS as t, AsyncOptionsContext as u, FieldPath as v, FormModel as w, FormErrorContext as x, FieldPathValue as y, SubmitEventPayload as z };
|