diff --git a/src/components/DataStandard/WorkForm/Design/config/attribute.tsx b/src/components/DataStandard/WorkForm/Design/config/attribute.tsx index d43b15fef2dc8e3c815d8652ac15293e342be582..198f9b957de03b53e81bd2c5305dff78fefb2abf 100644 --- a/src/components/DataStandard/WorkForm/Design/config/attribute.tsx +++ b/src/components/DataStandard/WorkForm/Design/config/attribute.tsx @@ -288,17 +288,14 @@ const AttributeConfig: React.FC = ({ case '引用选择框': options.push( , = ({ void; } const DataBox: React.FC = (props) => { const { @@ -27,83 +27,76 @@ const DataBox: React.FC = (props) => { height, readOnly, field, - attributes, defaultValue, - // allowViewDetail, - multiple, + attributes, + allowSetFieldsValue, + multiple = false, nameAttribute, + target, } = props; - const attr = attributes.find((item: schema.XAttribute) => item.id === props.name)!; - const targetFormId = attr.property?.formId; + const attr = attributes?.find((item: schema.XAttribute) => item.id === props.name)!; + const targetFormId = attr?.property?.formId; const [form, setForm] = useState(); const [formInst, setFormInst] = useState(); - const [formBelong, setFormBelong] = useState(); - const [dataSource, setDataSource] = useState(field?.lookups || []); - const [selectTarget, setSelectTarget] = useState( + const [dataSource, setDataSource] = useState( jsonParse(defaultValue, defaultValue), ); // 点击选择数据 const onClick = () => { + if (!form) { + return message.warning('未查询到关联表单,无法选择数据!'); + } EditModal.showFormSelect({ form: form!, fields: formInst?.fields!, - belong: formBelong!, + belong: (target as IBelong)!, multiple, onSave: (values) => { const dataSource: any = values.map((item: any) => ({ + ...item, + formId: targetFormId, id: item.id, value: item.id, text: item[nameAttribute], })); + // 需要设置表单值 + if (allowSetFieldsValue) { + const toSetData = Object.keys(dataSource[0]) + .filter((id: any) => !isNaN(id) && id !== field.id) + .reduce((pre: any, cur) => { + pre[cur] = values[0][cur]; + return pre; + }, {}); + toSetData[field.id] = JSON.stringify(dataSource); + props.setFieldsValue && props.setFieldsValue(toSetData); + } setDataSource(dataSource); }, }); }; - // 选中项变动 - const onValueChanged = useCallback((e: any) => { - const value = e.value; - setSelectTarget(value); - if (!value) setDataSource([]); - props.onValueChanged?.apply(this, [ - { value: JSON.stringify(Array.isArray(value) ? value : [value]) } as any, - ]); - }, []); - - // 监听dataSource数据源,设置选中数据 - useEffect(() => { - field.lookups = dataSource; - setSelectTarget( - multiple ? dataSource?.map((item) => item.value) : dataSource?.[0]?.value, - ); - }, [dataSource]); // 初始化 useAsyncLoad(async () => { if (targetFormId) { - const targetFormMetadata = orgCtrl.user.findMetadata(targetFormId); - if (targetFormMetadata) { - const targetFormBelong = orgCtrl.targets.find( - (i) => i.id === targetFormMetadata.belongId, - )!; - // 设置归属 - setFormBelong(targetFormBelong as IBelong); - const formList = await targetFormBelong?.resource.formColl.find([targetFormId]); - // 设置表单 - setForm(formList[0]); - const formInst = new Form( - { ...formList[0], id: formList[0].id + '_' }, - targetFormBelong.directory, - ); - await formInst.loadFields(); - // 设置表单实例 - setFormInst(formInst); - return formInst; + let formList: XForm[] = []; + if (target) { + formList = (await target?.resource.formColl.find([targetFormId])) || []; + if (formList.length) { + // 设置表单 + setForm(formList[0]); + const formInst = new Form( + { ...formList[0], id: formList[0].id + '_' }, + target.directory, + ); + await formInst.loadFields(); + // 设置表单实例 + setFormInst(formInst); + } } + return formInst; } }); - const BoxComponent: any = multiple ? TagBox : SelectBox; - return (
= (props) => { alignItems: 'end', width: width as any, }}> - item.text || '-').join(',')} + placeholder="请勿手动输入,点击右侧选择数据操作" + onValueChange={(e) => { + if (!e) setDataSource([]); + }} /> {!readOnly && (
), diff --git a/src/executor/tools/generate/columns.tsx b/src/executor/tools/generate/columns.tsx index bbfe5f3038d063b7c4b72cf6747ed74bd0cc4322..add0cca4211b502de713a3f37746b45725460fa0 100644 --- a/src/executor/tools/generate/columns.tsx +++ b/src/executor/tools/generate/columns.tsx @@ -5,6 +5,8 @@ import EntityIcon from '@/components/Common/GlobalComps/entityIcon'; import { generateUuid } from '@/ts/base/common'; import { ellipsisText, formatDate } from '@/utils'; import { Button } from 'antd'; +import { jsonParse } from '@/utils/tools'; +import { XThing } from '@/ts/base/schema'; /** 使用form生成表单列 */ export const GenerateColumn = ( @@ -63,6 +65,35 @@ export const GenerateColumn = ( return (field.lookups || []).find((i) => i.value === value)?.text || value; }; break; + case '引用型': + props.dataType = 'string'; + props.width = 200; + props.allowHeaderFiltering = false; + cellRender.render = (data: any) => { + const arrData = jsonParse(data.value, data.value); + if (arrData?.length) { + return arrData.map((item: XThing, i: number) => { + return ( + + ); + }); + } + return ''; + }; + break; case '数值型': props.dataType = 'number'; props.width = 150; diff --git a/src/executor/tools/task/start/default.tsx b/src/executor/tools/task/start/default.tsx index 79e8d5e13a26d99c5956095bf7914c64ba3e31fb..ac0efe92adc90bda2811e6656acf666635ede95b 100644 --- a/src/executor/tools/task/start/default.tsx +++ b/src/executor/tools/task/start/default.tsx @@ -115,6 +115,7 @@ const DefaultWayStart: React.FC = ({ allowEdit belong={apply.belong} data={apply.instanceData} + target={target} nodeId={apply.instanceData.node.id} /> {loadGateway(apply)} diff --git a/src/executor/tools/workForm/detail.tsx b/src/executor/tools/workForm/detail.tsx index ea8af345a764cd12650abff37102b592795f2381..7c35454397f1065027b97e9b278837682b759c4a 100644 --- a/src/executor/tools/workForm/detail.tsx +++ b/src/executor/tools/workForm/detail.tsx @@ -1,5 +1,5 @@ import { model, schema } from '../../../ts/base'; -import { IBelong } from '@/ts/core'; +import { IBelong, ITarget } from '@/ts/core'; import { useEffect, useState } from 'react'; import React from 'react'; import { Tabs } from 'antd'; @@ -17,6 +17,7 @@ interface IProps { data: model.InstanceDataModel; getFormData: (form: schema.XForm) => model.FormEditData; onChanged?: (id: string, data: model.FormEditData, field: string, value: any) => void; + target?: ITarget; } const DetailTable: React.FC = (props) => { @@ -126,8 +127,10 @@ const DetailTable: React.FC = (props) => { form: form, fields: fields, belong: props.belong, + target: props.target, create: true, onSave: (values) => { + console.log(values); formData.after.push(values); setFormData({ ...formData }); }, diff --git a/src/executor/tools/workForm/index.tsx b/src/executor/tools/workForm/index.tsx index 8f001acaad01e9d8dd4e130e55306252426e50ae..f6f3f8f134c53249b51b08b27ebae84770c59809 100644 --- a/src/executor/tools/workForm/index.tsx +++ b/src/executor/tools/workForm/index.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { common, model, schema } from '../../../ts/base'; -import { IBelong } from '@/ts/core'; +import { IBelong, ITarget } from '@/ts/core'; import PrimaryForms from './primary'; import DetailForms from './detail'; import { formatDate } from '@/utils'; @@ -13,6 +13,7 @@ interface IWorkFormProps { belong: IBelong; nodeId: string; data: model.InstanceDataModel; + target?: ITarget; } /** 流程节点表单 */ @@ -217,7 +218,6 @@ const WorkForm: React.FC = (props) => { setChangedFields(refreshFields); } }; - return (
{node.primaryForms && node.primaryForms.length > 0 && ( diff --git a/src/executor/tools/workForm/primary.tsx b/src/executor/tools/workForm/primary.tsx index 26295f15790fc1f1275f2cd150b91487ceaeaf72..79dcf1c404473774625ae99df8b2d193a707d762 100644 --- a/src/executor/tools/workForm/primary.tsx +++ b/src/executor/tools/workForm/primary.tsx @@ -1,5 +1,5 @@ import { kernel, model, schema } from '../../../ts/base'; -import { IBelong } from '@/ts/core'; +import { IBelong, ITarget } from '@/ts/core'; import { useState } from 'react'; import React from 'react'; import { Tabs } from 'antd'; @@ -15,6 +15,7 @@ interface IProps { data: model.InstanceDataModel; getFormData: (form: schema.XForm) => model.FormEditData; onChanged?: (id: string, data: model.FormEditData, field: string, value: any) => void; + target?: ITarget; } const PrimaryForm: React.FC = (props) => { diff --git a/src/utils/tools.ts b/src/utils/tools.ts index d04612b5fa7e943cc39ea845448c70e46567d06a..77684e60a095a78cbac4e6b23ab99852d1895378 100644 --- a/src/utils/tools.ts +++ b/src/utils/tools.ts @@ -362,7 +362,7 @@ const loadGatewayNodes = ( return memberNodes; }; -const jsonParse = (val: any, defaultVal = null) => { +const jsonParse = (val: any, defaultVal: any = null) => { if (!val || typeof val !== 'string') { // console.warn('JSON.parse need string param'); return defaultVal;