mirror of
https://github.com/imdap/ruoyi-plus-vben5.git
synced 2026-04-23 00:38:34 +08:00
feat: Schema 中 componentProps 随注册组件联动类型提示
This commit is contained in:
96
apps/web-antd/src/adapter/form-schema.ts
Normal file
96
apps/web-antd/src/adapter/form-schema.ts
Normal file
@@ -0,0 +1,96 @@
|
||||
import type {
|
||||
AutoCompleteProps,
|
||||
ButtonProps,
|
||||
CascaderProps,
|
||||
CheckboxGroupProps,
|
||||
CheckboxProps,
|
||||
DatePickerProps,
|
||||
DividerProps,
|
||||
InputNumberProps,
|
||||
InputProps,
|
||||
MentionsProps,
|
||||
RadioGroupProps,
|
||||
RadioProps,
|
||||
RateProps,
|
||||
SelectProps,
|
||||
SpaceProps,
|
||||
SwitchProps,
|
||||
TextAreaProps,
|
||||
TimePickerProps,
|
||||
TreeSelectProps,
|
||||
UploadProps,
|
||||
} from 'ant-design-vue';
|
||||
import type { RangePickerProps } from 'ant-design-vue/es/date-picker';
|
||||
|
||||
import type { Component } from 'vue';
|
||||
|
||||
import type {
|
||||
ApiComponentSharedProps,
|
||||
VbenFormSchema as CoreFormSchema,
|
||||
IconPickerProps,
|
||||
} from '@vben/common-ui';
|
||||
|
||||
import type { ComponentType } from './component';
|
||||
|
||||
/**
|
||||
* 对象形式:使用适配器里为各 `component` 声明的 Props 类型 `P`;
|
||||
* 与 `Record<string, any>` 相交是为了满足核心库 `MaybeComponentProps` 的索引签名。
|
||||
* 函数形式:通过联合 `CoreFormSchema['componentProps']`,与表单核心对动态 `componentProps` 的约定保持一致。
|
||||
*/
|
||||
type SchemaComponentProps<P> =
|
||||
| CoreFormSchema<ComponentType>['componentProps']
|
||||
| (P & Record<string, any>);
|
||||
|
||||
/**
|
||||
* 与 {@link ComponentType} 中注册的组件名一一对应,便于 Schema 上 `component` + `componentProps` 联动提示
|
||||
*/
|
||||
interface FormSchemaComponentPropsMap {
|
||||
ApiCascader: ApiComponentSharedProps & CascaderProps;
|
||||
ApiSelect: ApiComponentSharedProps & SelectProps;
|
||||
ApiTreeSelect: ApiComponentSharedProps & TreeSelectProps;
|
||||
AutoComplete: AutoCompleteProps;
|
||||
Cascader: CascaderProps;
|
||||
Checkbox: CheckboxProps;
|
||||
CheckboxGroup: CheckboxGroupProps;
|
||||
DatePicker: DatePickerProps;
|
||||
DefaultButton: ButtonProps;
|
||||
Divider: DividerProps;
|
||||
IconPicker: IconPickerProps;
|
||||
Input: InputProps;
|
||||
InputNumber: InputNumberProps;
|
||||
InputPassword: InputProps;
|
||||
Mentions: MentionsProps;
|
||||
PrimaryButton: ButtonProps;
|
||||
Radio: RadioProps;
|
||||
RadioGroup: RadioGroupProps;
|
||||
RangePicker: RangePickerProps;
|
||||
Rate: RateProps;
|
||||
Select: SelectProps;
|
||||
Space: SpaceProps;
|
||||
Switch: SwitchProps;
|
||||
Textarea: TextAreaProps;
|
||||
TimePicker: TimePickerProps;
|
||||
TreeSelect: TreeSelectProps;
|
||||
Upload: UploadProps;
|
||||
}
|
||||
|
||||
type BaseSchema = Omit<
|
||||
CoreFormSchema<ComponentType>,
|
||||
'component' | 'componentProps'
|
||||
>;
|
||||
|
||||
type RegisteredName = keyof FormSchemaComponentPropsMap;
|
||||
|
||||
type DiscriminatedFormSchema = {
|
||||
[K in RegisteredName]: BaseSchema & {
|
||||
component: K;
|
||||
componentProps?: SchemaComponentProps<FormSchemaComponentPropsMap[K]>;
|
||||
};
|
||||
}[RegisteredName];
|
||||
|
||||
type FallbackFormSchema = BaseSchema & {
|
||||
component: Component | Exclude<ComponentType, RegisteredName>;
|
||||
componentProps?: CoreFormSchema<ComponentType>['componentProps'];
|
||||
};
|
||||
|
||||
export type VbenFormSchema = DiscriminatedFormSchema | FallbackFormSchema;
|
||||
@@ -1,9 +1,7 @@
|
||||
import type {
|
||||
VbenFormSchema as FormSchema,
|
||||
VbenFormProps,
|
||||
} from '@vben/common-ui';
|
||||
import type { VbenFormProps as CoreFormProps } from '@vben/common-ui';
|
||||
|
||||
import type { ComponentType } from './component';
|
||||
import type { VbenFormSchema } from './form-schema';
|
||||
|
||||
import { setupVbenForm, useVbenForm as useForm, z } from '@vben/common-ui';
|
||||
import { $t } from '@vben/locales';
|
||||
@@ -41,9 +39,14 @@ async function initSetupVbenForm() {
|
||||
});
|
||||
}
|
||||
|
||||
const useVbenForm = useForm<ComponentType>;
|
||||
type VbenFormProps = Omit<CoreFormProps<ComponentType>, 'schema'> & {
|
||||
schema?: VbenFormSchema[];
|
||||
};
|
||||
|
||||
function useVbenForm(options: VbenFormProps) {
|
||||
return useForm<ComponentType>(options as CoreFormProps<ComponentType>);
|
||||
}
|
||||
|
||||
export { initSetupVbenForm, useVbenForm, z };
|
||||
|
||||
export type VbenFormSchema = FormSchema<ComponentType>;
|
||||
export type { VbenFormProps };
|
||||
export type { VbenFormProps, VbenFormSchema };
|
||||
|
||||
Reference in New Issue
Block a user