import { useState, useEffect } from 'react'; import { waitServer } from './../utils/server'; // model props type AttributeProps = { isSystemField: boolean; comment: string; required: boolean; type: string } type FieldProps = Partial & { fieldName?: string; formShowFlag?: boolean; tableShowFlag?: boolean; isSystemField?: boolean; // 是否系统字段 order?: number; filter?: boolean; fixed?: string; required?: boolean; type?: string; locales?: { cn?: string; en?: string; }; [prop: string]: any } type PageModelProps = { pageModelCode: string; pageModelName: string; type: 'table' | 'form'; fields?: FieldProps[] } type ModelProps = { pageModels?: PageModelProps[]; attributes: AttributeProps[]; } const lang = localStorage.i18nextLng === 'en' ? 'en' : 'cn'; export function getModel(url: string, next: Function) { waitServer(url, { url }, (result: ModelProps) => { next(result); }) } export default function useModel(url: string, codes: string[]) { const [list, setList] = useState([]); useEffect(() => { // purchase.PurceaseOrderHead const _url = url.includes('.') ? `/bk/api/${url.replace('.', '/')}/getModel` : url; waitServer(url, { url: _url }, (result: ModelProps) => { const _list: any[] = []; const attributes = result.attributes || []; codes.forEach(code => { const pageModel = result.pageModels?.find(item => item.pageModelCode === code); if (!pageModel) { _list.push([]); return; } let fields: PageModelProps['fields'] = pageModel.fields?.filter(item => { if (pageModel.type === 'form') return item.formShowFlag && attributes[item.fieldName!]; if (pageModel.type === 'table') return item.tableShowFlag && attributes[item.fieldName!]; }) || []; fields = fields.sort((v1, v2) => { return (v1.order || 0) - (v2.order || 0) }); if (pageModel.type === 'table') { _list.push(fields.map(item => { return { dataIndex: item.fieldName, title: item.locales?.[lang], format: item.format, width: item.width, tooltip: item.tooltip, ellipsis: item.ellipsis, filter: item.filter, fixed: item.fixed } })) } if (pageModel.type === 'form') { _list.push(fields.map(item => { return { name: item.fieldName, label: item.locales?.[lang], options: item.options || {}, rules: item.rules, disabled: item.disabled, type: item.controlType || 'input', bindField: item.bindField, required: item.required, ghost: item.ghost } })) } }) setList(_list); }) }, []); return list; }