import { cloneDeep } from 'lodash-es';
|
|
export type DynamicModelActionType = 'add' | 'detail' | 'edit';
|
|
export interface OpenDynamicModelOptions {
|
id?: string;
|
menuId?: string;
|
modelId: string;
|
onSuccess?: (data?: any) => void;
|
params?: Record<string, any>;
|
success?: (data?: any) => void;
|
title?: string;
|
}
|
|
export interface DynamicModelOpenContext {
|
isDataManage?: boolean;
|
isPreview?: boolean;
|
}
|
|
export interface ParsedDynamicModelConfig {
|
columnData: Record<string, any>;
|
formConf: Record<string, any>;
|
fullName: string;
|
webType: number | string;
|
}
|
|
export function validateDynamicModelActionOptions(action: DynamicModelActionType, options?: OpenDynamicModelOptions) {
|
if (!options?.modelId) throw new Error('缺少模型 id');
|
if ((action === 'edit' || action === 'detail') && !options.id) throw new Error('缺少数据 id');
|
}
|
|
export function parseTargetDynamicModelConfig(configData: any): ParsedDynamicModelConfig {
|
if (!configData) throw new Error('打开表单失败');
|
if (`${configData.webType}` === '4') throw new Error('不支持打开数据接口类型');
|
if (!configData.formData) throw new Error('目标表单配置异常');
|
|
try {
|
return {
|
columnData: configData.columnData ? JSON.parse(configData.columnData) : {},
|
formConf: JSON.parse(configData.formData),
|
fullName: configData.fullName || '',
|
webType: configData.webType,
|
};
|
} catch {
|
throw new Error('目标表单配置异常');
|
}
|
}
|
|
export function buildDynamicModelOpenData(
|
action: DynamicModelActionType,
|
input: {
|
context: DynamicModelOpenContext;
|
options: OpenDynamicModelOptions;
|
target: ParsedDynamicModelConfig;
|
},
|
) {
|
const { context, options, target } = input;
|
const formConf = cloneDeep(target.formConf);
|
const menuId = options.menuId || '';
|
const useFormPermission = !!menuId && !!target.columnData.useFormPermission;
|
const title = action === 'detail' ? options.title || '' : options.title || target.fullName;
|
const id = action === 'add' ? '' : options.id;
|
|
const baseData = {
|
formConf,
|
id,
|
isDataManage: !!context.isDataManage,
|
isPreview: !!context.isPreview,
|
menuId,
|
modelId: options.modelId,
|
onSuccess: options.onSuccess || options.success,
|
title,
|
useFormPermission,
|
};
|
|
if (action === 'detail') {
|
return {
|
...baseData,
|
hideExtra: !!context.isDataManage,
|
};
|
}
|
|
return {
|
...baseData,
|
allList: [],
|
formData: options.params || undefined,
|
showMoreBtn: action === 'edit' ? false : ![3, 5].includes(Number(target.columnData.type)),
|
};
|
}
|