From c130ec74188b9d08fcbf9ea9a5d282c73619a2f5 Mon Sep 17 00:00:00 2001 From: hyygzds Date: Tue, 23 Sep 2025 13:46:50 +0800 Subject: [PATCH 01/12] fix: intergrate field mapping parameter --- .../method-list/method-list.component.tsx | 49 +++++++++++++++++-- .../controller/use-event-mapping.ts | 26 ++++++++++ .../composition/use-component-provider.ts | 46 ++++++++++++++++- .../composition/use-event-parameter-data.ts | 37 +++++++++++++- packages/ui-vue/components/designer.ts | 1 + .../src/composition/editors/use-combo-tree.ts | 14 +++--- .../src/event-parameter.component.tsx | 12 ----- .../src/event-parameter.props.ts | 6 ++- .../parameter-editor.component.tsx | 17 ++++++- .../src/mapping-editor.component.tsx | 4 +- .../src/mapping-editor.props.ts | 3 +- 11 files changed, 187 insertions(+), 28 deletions(-) create mode 100644 packages/designer/src/components/composition/schema-repository/controller/use-event-mapping.ts diff --git a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx index 1b2527f165..cfd75a0a44 100644 --- a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx +++ b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx @@ -12,6 +12,7 @@ import { useEventParameterData } from "../../../../../composition/use-event-para import { useParameterEditorData } from "../../../../../composition/use-parameter-editor-data"; import { DesignerMode, UseDesignerContext } from "../../../../../types/designer-context"; import { useComponentProvider } from "../../../../../composition/use-component-provider"; +import { useEventMapping } from "../../../../../composition/schema-repository/controller/use-event-mapping"; import './method-list.scss'; export default defineComponent({ @@ -22,6 +23,9 @@ export default defineComponent({ const designerContext = inject('designerContext') as UseDesignerContext; const useFormSchemaComposition = inject('useFormSchema')!; const useFormStateMachineComposition: any = inject('useFormStateMachine', null); + const designViewModelUtils: any = inject('designViewModelUtils', null); + const schemaService: any = inject('schemaService', null); + const { getFormFields, getHelpFields } = useEventMapping(designViewModelUtils, schemaService); /** 树表格实例 */ const treeGridRef = ref(); @@ -88,6 +92,30 @@ export default defineComponent({ }; + function getFieldMappingEditor(selectedData: any) { + const ExternalEventParameterComponent = externalComponents['fieldMapping']; + const beforeOpen = async ({ fromDataSource, toDataSource, gridColumns }) => { + const foundParam = selectedData.params.find((paramItem: any) => paramItem?.controlSource?.type === 'Select'); + const helpId = foundParam.value; + const viewModelId = props.activeViewModel?.id; + if (helpId && viewModelId) { + fromDataSource.value = await getHelpFields(helpId); + toDataSource.value = await getFormFields(viewModelId); + return true; + } + return false; + }; + return { + type: externalParamterEditor['fieldMapping'], + customRender: ExternalEventParameterComponent ? () => + + : null + }; + } + // 根据命令构造参数编辑器入参 function getParameterEditorByCommand(parameter: ParamConfig) { const ExternalEventParameterComponent = externalComponents[parameter.name]; @@ -263,8 +291,18 @@ export default defineComponent({
{paramsData.value.map((paramData: ParamConfig, index: number) => { - const editor = getParameterEditorByCommand(paramData); + const editor = paramData?.controlSource?.type === 'MappingFieldsEditor' ? getFieldMappingEditor(selectedData) : + getParameterEditorByCommand(paramData); const data = reactive(getEventParameterData(paramData.controlSource?.context?.data?.value) || []); + const customStatus = (visualData: VisualData) => { + if (paramData.controlSource?.context?.data?.value === ':Entity') { + return visualData; + } + if (visualData.raw.children && visualData.raw.children.length) { + visualData.disabled = true; + } + return visualData; + }; const paramDescriptionTooltip = reactive({ content: paramData.description, placement: 'top' }); return
@@ -297,8 +335,13 @@ export default defineComponent({ formData={assembleOutline()} editorType={paramData?.controlSource?.type || 'Default'} editorControlSource={paramData?.controlSource} - idField={paramData?.controlSource?.context?.valueField?.value - || paramData?.controlSource?.context?.idField?.value || 'id'} + // idField={paramData?.controlSource?.context?.valueField?.value + // || paramData?.controlSource?.context?.idField?.value || 'id'} + customStatus={customStatus} + idField={ + paramData.controlSource?.context?.data?.value === ':Entity' ? 'bindTo' : + (paramData?.controlSource?.context?.valueField?.value + || paramData?.controlSource?.context?.idField?.value || 'id')} textField={ paramData?.controlSource?.context?.textField?.value || 'label' } diff --git a/packages/designer/src/components/composition/schema-repository/controller/use-event-mapping.ts b/packages/designer/src/components/composition/schema-repository/controller/use-event-mapping.ts new file mode 100644 index 0000000000..e07d7c94ca --- /dev/null +++ b/packages/designer/src/components/composition/schema-repository/controller/use-event-mapping.ts @@ -0,0 +1,26 @@ +import { UseDesignViewModel, UseSchemaService } from "../../../../components/types"; +import { MetadataService } from "../../metadata.service"; +import { LookupFieldSelectorService } from "../lookup/lookup-field-selector.service"; + +export function useEventMapping(designViewModelUtils: UseDesignViewModel, schemaService: UseSchemaService) { + const metadataService = new MetadataService(); + async function getHelpFields(helpMetadataId: string) { + const lookupFieldSelectorService = new LookupFieldSelectorService(metadataService); + const path = metadataService.getMetadataPath(); + return await lookupFieldSelectorService.getData({ propertyData: { helpId: helpMetadataId }, formBasicInfo: { relativePath: path }}); + } + + async function getFormFields(viewModelId: string) { + const fields = designViewModelUtils.getAllFields2TreeByVMId(viewModelId); + const primaryField = schemaService.getPrimaryField(); + if (primaryField) { + return fields.filter(item => item.data.bindingPath !== primaryField); + } + return fields; + } + + return { + getHelpFields, + getFormFields + }; +} diff --git a/packages/designer/src/components/composition/use-component-provider.ts b/packages/designer/src/components/composition/use-component-provider.ts index 7f1684b8d7..eaf2fdcc42 100644 --- a/packages/designer/src/components/composition/use-component-provider.ts +++ b/packages/designer/src/components/composition/use-component-provider.ts @@ -1,13 +1,22 @@ import { wfBizprocessLookupComponent as WfBizProcessLookUp } from '@gsp-wf/wf-bizprocess-lookup-vue'; +import { MappingEditor as FMappingEditor} from '@farris/ui-vue/components'; import { ParamConfig } from '../components/view-model-designer/method-manager/entity/param'; export type CallbackFn = (context?: any) => any; export function useComponentProvider() { + const mapFieldsDisplayFormatter = (items: []) => { + if (items && items.length) { + return items.map((item) => `${item['name']}[${item['bindingPath']}]`).join(','); + } + return ''; + }; const externalParamterEditor = { - bizDefKey: 'Custom' + bizDefKey: 'Custom', + fieldMapping: 'Custom' }; const externalComponents = { // todo: 使用componentMap把外部组件注册进来 - bizDefKey: WfBizProcessLookUp + bizDefKey: WfBizProcessLookUp, + fieldMapping: FMappingEditor }; const externalComponentProps = { bizDefKey: (parameter: ParamConfig, onChangeValue: CallbackFn, modelValue?: any) => { @@ -39,6 +48,39 @@ export function useComponentProvider() { onChangeValue(e); } }; + }, + fieldMapping: (beforeOpen) => { + return { + modalWidth: 800, + modalHeight: 600, + editable: false, + beforeOpen: beforeOpen, + fromData: { + editable: true, + formatter: (cell, data) => { + return `${data.raw['name']} [${data.raw['bindingPath']}]`; + }, + idField: 'bindingPath', + textField: 'name', + valueField: 'bindingPath', + searchFields: ['name', 'bindingPath'], + // repositoryToken: FieldSelectorRepositoryToken, + // dataSource: fromDataSource, + displayFormatter: mapFieldsDisplayFormatter + }, + toData: { + editable: false, + idField: 'bindingPath', + textField: 'name', + valueField: 'bindingPath', + searchFields: ['name', 'bindingPath'], + // dataSource: targetDataSource, + formatter: (cell, data) => { + return `${data.raw['name']} [${data.raw['bindingPath']}]`; + }, + displayFormatter: mapFieldsDisplayFormatter + } + }; } }; return { diff --git a/packages/designer/src/components/composition/use-event-parameter-data.ts b/packages/designer/src/components/composition/use-event-parameter-data.ts index e240395fa6..af0ee29c86 100644 --- a/packages/designer/src/components/composition/use-event-parameter-data.ts +++ b/packages/designer/src/components/composition/use-event-parameter-data.ts @@ -1,5 +1,6 @@ import { inject } from "vue"; -import { ComponentType, UseFormSchema, UseFormStateMachine } from "../types"; +import { ComponentType, FormSchemaEntity, UseFormSchema, UseFormStateMachine } from "../types"; +import { cloneDeep } from "lodash-es"; export function useEventParameterData( useFormSchemaComposition: UseFormSchema, @@ -158,6 +159,38 @@ export function useEventParameterData( return result; } + function resolveEntity(schemaEntity: FormSchemaEntity, parentLabelPath: string = ''): any { + if (!schemaEntity) { + return; + } + const clonedSchemaEntity: FormSchemaEntity = cloneDeep(schemaEntity); + + const viewModelBindTo = parentLabelPath ? `${parentLabelPath}/${clonedSchemaEntity.label}` : `/`; + // entityBindToMap.set(clonedSchemaEntity.label, viewModelBindTo.replace('//', '/')); + + // const selectable = resolveEntitySelectable(clonedSchemaEntity); + const result: any = { + data: Object.assign({ bindTo: viewModelBindTo.replace('//', '/') }, clonedSchemaEntity), + children: [] + }; + if (clonedSchemaEntity.type.entities && clonedSchemaEntity.type.entities.length) { + const childTable = clonedSchemaEntity.type.entities.map(childEntity => resolveEntity(childEntity, viewModelBindTo)); + result.children = result.children.concat(childTable); + } + return result; + } + + function resolveEntityDataSource() { + const rootSchemaEntity = useFormSchemaComposition.getFormSchema().module.entity[0]?.entities[0]; + const rootSchemaTreeNode = resolveEntity(rootSchemaEntity); + return [rootSchemaTreeNode]; + } + + function buildEntities(): any { + return resolveEntityDataSource(); + } + + function getEventParameterData(dataValue: string) { let data = null; if (dataValue === ':Actions') { @@ -166,6 +199,8 @@ export function useEventParameterData( data = buildComponents(); } else if (dataValue === ':CommandsTree') { data = buildCommands(); + } else if(dataValue === ':Entity') { + data = buildEntities(); } return data; } diff --git a/packages/ui-vue/components/designer.ts b/packages/ui-vue/components/designer.ts index 8e8648dab1..656f9edf4f 100644 --- a/packages/ui-vue/components/designer.ts +++ b/packages/ui-vue/components/designer.ts @@ -11,4 +11,5 @@ export * from './dynamic-resolver'; export * from './field-selector'; export { resolverMap } from './dynamic-view'; export { ModalProperty } from "./modal"; +export { MappingEditor } from './mapping-editor'; diff --git a/packages/ui-vue/components/event-parameter/src/composition/editors/use-combo-tree.ts b/packages/ui-vue/components/event-parameter/src/composition/editors/use-combo-tree.ts index 140e0324cf..5dee4239fa 100644 --- a/packages/ui-vue/components/event-parameter/src/composition/editors/use-combo-tree.ts +++ b/packages/ui-vue/components/event-parameter/src/composition/editors/use-combo-tree.ts @@ -40,12 +40,14 @@ export default function ( textField: props.textField || 'name', mapFields: { id: 'selectId' }, multiSelect: false, - customRowStatus: (visualData: VisualData) => { - if (visualData.raw.children && visualData.raw.children.length) { - visualData.disabled = true; - } - return visualData; - } + // customRowStatus: (visualData: VisualData) => { + // if (visualData.raw.children && visualData.raw.children.length) { + // visualData.disabled = true; + // } + // return visualData; + // } + customRowStatus: props.customRowStatus, + displayFormatter: props.displayFormatter }, checkAndProcessBeforeAssign }; diff --git a/packages/ui-vue/components/event-parameter/src/event-parameter.component.tsx b/packages/ui-vue/components/event-parameter/src/event-parameter.component.tsx index b0924755b3..2f13de0d4c 100644 --- a/packages/ui-vue/components/event-parameter/src/event-parameter.component.tsx +++ b/packages/ui-vue/components/event-parameter/src/event-parameter.component.tsx @@ -351,18 +351,6 @@ export default defineComponent({ return textareaRef.value.elementRef; }; - const onAfterConfirm = (e) => { - const value = e.items[0].id; - context.emit('update:modelValue', value); - context.emit('valueChange', value); - }; - - const onAfterClear = () => { - const value = modelValue.value.id; - context.emit('update:modelValue', value); - context.emit('valueChange', value); - }; - context.expose({ getInputRef }); return () => { diff --git a/packages/ui-vue/components/event-parameter/src/event-parameter.props.ts b/packages/ui-vue/components/event-parameter/src/event-parameter.props.ts index 08624f701d..07ad891bcf 100644 --- a/packages/ui-vue/components/event-parameter/src/event-parameter.props.ts +++ b/packages/ui-vue/components/event-parameter/src/event-parameter.props.ts @@ -1,3 +1,4 @@ +import { VisualData } from "@farris/ui-vue/components/data-view"; import { ComboListProps } from "@farris/ui-vue/components/combo-list"; import { ComboTreeProps } from "@farris/ui-vue/components/combo-tree"; import { EditorType as DynamicFormEditorType } from "@farris/ui-vue/components/dynamic-form"; @@ -105,7 +106,10 @@ export const eventParameterProps = { activeViewModelFieldData: { type: Array, default: [] }, /** 是否在“参数编辑器”弹框中显示“表单组件”树 */ showOutline: { type: Boolean, default: true }, - editor: { type: Object as PropType, default: {type: 'Default'}} + editor: { type: Object as PropType, default: {type: 'Default'}}, + displayFormatter: { type: Function as PropType<(selectedItems: any[]) => string> }, + /** 自定义行状态 */ + customRowStatus: { type: Function as PropType<(dataItem: VisualData) => VisualData>, default: null } } as Record; export type EventParameterProps = ExtractPropTypes; diff --git a/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx b/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx index aebf9705de..c2949fb0e8 100644 --- a/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx +++ b/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx @@ -6,6 +6,7 @@ import { CommandItem, ControllerName } from "../../types"; import './parameter-editor.css'; import { FNotifyService as NotifyService } from "@farris/ui-vue/components/notify"; import { cloneDeep } from "lodash-es"; +import { VisualData } from "@farris/ui-vue/components/data-view"; /** * 参数编辑器,包含下列内容: @@ -160,6 +161,16 @@ export default defineComponent({ onEditorChangeHandler(value, propertyItem); onEditorBlurHandler(); }; + + const customStatus = (visualData: VisualData) => { + if(propertyItem?.origin?.controlSource?.context?.data?.value === ':Entity') { + return visualData; + } + if (visualData.raw.children && visualData.raw.children.length) { + visualData.disabled = true; + } + return visualData; + }; return >, default: {}}, editorParams: { type: Object, default: null }, - onMappingFieldsChanged: { type: Function , default: null} + onMappingFieldsChanged: { type: Function , default: null}, + beforeOpen: { type: Function } } as Record; export type MappingEditorProps = ExtractPropTypes; -- Gitee From 5e880a4c06b225d4164c64d88ed9d77b75006791 Mon Sep 17 00:00:00 2001 From: hyygzds Date: Tue, 23 Sep 2025 09:44:37 +0800 Subject: [PATCH 02/12] fix: data grid supports select row by id --- .../data-grid/src/data-grid.component.tsx | 13 ++++++++++++- .../components/data-view/composition/types.ts | 2 ++ .../components/data-view/composition/use-row.ts | 11 ++++++----- .../designer/tab-header-item.design.component.tsx | 2 +- .../tabs/src/designer/tab-page.design.props.ts | 13 +++++++++++++ 5 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 packages/ui-vue/components/tabs/src/designer/tab-page.design.props.ts diff --git a/packages/ui-vue/components/data-grid/src/data-grid.component.tsx b/packages/ui-vue/components/data-grid/src/data-grid.component.tsx index a13989f836..73c8f55d5d 100644 --- a/packages/ui-vue/components/data-grid/src/data-grid.component.tsx +++ b/packages/ui-vue/components/data-grid/src/data-grid.component.tsx @@ -450,6 +450,16 @@ export default defineComponent({ useVirtualScrollComposition.scrollToBottom(); } + function selectRowById(dataItemId: string) { + const idField = useIdentifyComposition.idField.value; + const visibleItemToBeSelected = visibleDatas.value.find((visibleData: VisualData) => { + return visibleData.raw[idField] === dataItemId; + }) as VisualData; + if (visibleItemToBeSelected) { + useRowComposition.selectRow(visibleItemToBeSelected); + } + } + function scrollToRowByIndex(index: number) { useVirtualScrollComposition.scrollToRowByIndex(index); } @@ -459,7 +469,8 @@ export default defineComponent({ addNewDataItem, addNewDataItemAtLast, removeDataItem, removeDataItemById, editDataItem, acceptDataItem, cancelDataItem, selectItemById, selectItemByIds, updateColumns, updateDataSource, updatePagination, getVisibleData, getVisibleDataByIds, getSelectedItems, getSelectionRow, getCurrentRowId, - endEditCell, clickRowItemById, clearSelection, unSelectItemByIds, scrollToBottom, scrollToRowByIndex + endEditCell, clickRowItemById, clearSelection, unSelectItemByIds, scrollToBottom, scrollToRowByIndex, + selectRowById }; context.expose(dataGridComponentInstance); diff --git a/packages/ui-vue/components/data-view/composition/types.ts b/packages/ui-vue/components/data-view/composition/types.ts index 78af8792ed..37d5a9c750 100644 --- a/packages/ui-vue/components/data-view/composition/types.ts +++ b/packages/ui-vue/components/data-view/composition/types.ts @@ -948,6 +948,8 @@ export interface UseRow { onMouseoutRow: ($event: MouseEvent, dataItem: VisualData) => any; clickRowItem: (dataItem: VisualData) => void; + + selectRow: (dataItem: VisualData, $event?: MouseEvent) => void; } export interface UseSelection { diff --git a/packages/ui-vue/components/data-view/composition/use-row.ts b/packages/ui-vue/components/data-view/composition/use-row.ts index 8020188138..b705d0b692 100644 --- a/packages/ui-vue/components/data-view/composition/use-row.ts +++ b/packages/ui-vue/components/data-view/composition/use-row.ts @@ -86,9 +86,9 @@ export function useRow( return cellClassObject; } - function selectRow($event: MouseEvent, dataItem: VisualData) { + function selectRow(dataItem: VisualData, $event?: MouseEvent) { const singleSelectOnlyOnCheck = multiSelectOnClickRowWithShift.value && - !$event.shiftKey || isSingleSelect.value; + !$event?.shiftKey || isSingleSelect.value; if (singleSelectOnlyOnCheck) { if (!props.selection?.keepSelectingOnClick) { toggleSelectItem(dataItem, props.selection?.keepSelectingOnClick); @@ -101,7 +101,7 @@ export function useRow( } const shouldToggleSelectRow = ( multiSelectOnClickRowWithShift.value && - $event.shiftKey) || + $event?.shiftKey) || multiSelectOnClickRow.value; if (shouldToggleSelectRow) { // onCheckAndClick or DependOnCheck and isMultiSelect @@ -118,7 +118,7 @@ export function useRow( if (dataItem.disabled) { return; } - selectRow($event, dataItem); + selectRow(dataItem, $event); context.emit('clickRow', dataItem.index, dataItem.raw); } @@ -141,7 +141,7 @@ export function useRow( if (dataItem.disabled) { return; } - selectRow($event, dataItem); + selectRow(dataItem, $event); raiseClickRowEvent(dataItem); } @@ -186,6 +186,7 @@ export function useRow( return { activeRowById, clickRowItem, + selectRow, gridCellClass, gridHierarchyCellClass, gridRowClass, diff --git a/packages/ui-vue/components/tabs/src/designer/tab-header-item.design.component.tsx b/packages/ui-vue/components/tabs/src/designer/tab-header-item.design.component.tsx index b756661af1..2480dce803 100644 --- a/packages/ui-vue/components/tabs/src/designer/tab-header-item.design.component.tsx +++ b/packages/ui-vue/components/tabs/src/designer/tab-header-item.design.component.tsx @@ -1,7 +1,7 @@ import { computed, Ref, ref, watch, nextTick } from "vue"; import { TabPageContext, UseOnePage, UseDesignTabs } from "../composition/types"; -import { TabPageDesignProps } from "../components/tab-page.props"; +import { TabPageDesignProps } from "../designer/tab-page.design.props"; import { TabsProps } from "../tabs.props"; import { DesignerComponentInstance } from "../../../designer-canvas/src/types"; diff --git a/packages/ui-vue/components/tabs/src/designer/tab-page.design.props.ts b/packages/ui-vue/components/tabs/src/designer/tab-page.design.props.ts new file mode 100644 index 0000000000..3968a79047 --- /dev/null +++ b/packages/ui-vue/components/tabs/src/designer/tab-page.design.props.ts @@ -0,0 +1,13 @@ + +import { tabPageProps, TabPageProps } from '@farris/ui-vue/components/tabs'; +import { createPropsResolver } from '@farris/ui-vue/components/dynamic-resolver'; +import { schemaMapper } from '../schema/tab-page-schema-mapper'; +import tabPageSchema from '../schema/tab-page.schema.json'; +import { ExtractPropTypes } from 'vue'; +export const tabPagePropsResolver = createPropsResolver(tabPageProps, tabPageSchema, schemaMapper); +export const tabPageDesignProps = Object.assign({}, tabPageProps, + { + titleHtml: { type: String, default: '' }, + }); +export type TabPageDesignProps = ExtractPropTypes; +export const tabPageDesignPropsResolver = createPropsResolver(tabPageDesignProps, tabPageSchema, schemaMapper); \ No newline at end of file -- Gitee From 42c7dd3f0fcb217bc632b2db6d6488e451493632 Mon Sep 17 00:00:00 2001 From: hyygzds Date: Tue, 23 Sep 2025 17:03:49 +0800 Subject: [PATCH 03/12] fix: verify field mapping --- .../method-list/method-list.component.tsx | 17 ++++++++++++++++- .../components/composition/use-form-schema.ts | 9 ++++++++- .../designer/src/components/types/metadata.ts | 1 + 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx index cfd75a0a44..0f0d1f53d5 100644 --- a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx +++ b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx @@ -92,11 +92,26 @@ export default defineComponent({ }; + function buildLookups() { + const externalComponents = useFormSchemaComposition.getExternalComponents(); + const result: any[] = []; + externalComponents.forEach((externalComponent) => { + if (externalComponent.type === 'lookup') { + const lookupItem = { id: externalComponent.id, label: externalComponent.name }; + result.push(lookupItem); + } + }); + + return result; + } + + function getFieldMappingEditor(selectedData: any) { const ExternalEventParameterComponent = externalComponents['fieldMapping']; const beforeOpen = async ({ fromDataSource, toDataSource, gridColumns }) => { const foundParam = selectedData.params.find((paramItem: any) => paramItem?.controlSource?.type === 'Select'); - const helpId = foundParam.value; + const foundLookup = buildLookups().find((lookup: any) => lookup.id === foundParam.value); + const { helpId } = foundLookup; const viewModelId = props.activeViewModel?.id; if (helpId && viewModelId) { fromDataSource.value = await getHelpFields(helpId); diff --git a/packages/designer/src/components/composition/use-form-schema.ts b/packages/designer/src/components/composition/use-form-schema.ts index 47c631d8f4..32901fc31e 100644 --- a/packages/designer/src/components/composition/use-form-schema.ts +++ b/packages/designer/src/components/composition/use-form-schema.ts @@ -43,6 +43,12 @@ export function useFormSchema(): UseFormSchema { function getFormSchema(): FormMetadaDataDom { return formSchema; } + + function getExternalComponents(): any[] { + return formSchema?.module?.externalComponents || []; + } + + /** * 设置DOM JSON 数据 * @param newFormSchema DOM JSON结构 @@ -1310,6 +1316,7 @@ export function useFormSchema(): UseFormSchema { getComponetsByPredicate, getDefaultValueByFiledAndType, designerMode, - removeCommunicationInComponent + removeCommunicationInComponent, + getExternalComponents }; } diff --git a/packages/designer/src/components/types/metadata.ts b/packages/designer/src/components/types/metadata.ts index 3b09c0214d..23d41be9f7 100644 --- a/packages/designer/src/components/types/metadata.ts +++ b/packages/designer/src/components/types/metadata.ts @@ -251,6 +251,7 @@ export interface UseFormSchema { getComponetsByPredicate(predicate: (component: any) => boolean); removeCommunicationInComponent: (componentSchema: any) => void; externalFormSchema: Map; + getExternalComponents: () => any[]; } export interface UseSchemaService { -- Gitee From 304081214cec8d4956bd29e70a913baf2db697a5 Mon Sep 17 00:00:00 2001 From: hyygzds Date: Tue, 23 Sep 2025 19:17:57 +0800 Subject: [PATCH 04/12] fix: improve event pamrameter --- .../components/method-list/method-list.component.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx index 0f0d1f53d5..12fac9465c 100644 --- a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx +++ b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx @@ -97,8 +97,8 @@ export default defineComponent({ const result: any[] = []; externalComponents.forEach((externalComponent) => { if (externalComponent.type === 'lookup') { - const lookupItem = { id: externalComponent.id, label: externalComponent.name }; - result.push(lookupItem); + // const lookupItem = { id: externalComponent.id, label: externalComponent.name }; + result.push(externalComponent); } }); -- Gitee From 156a59b36b5cf421c1ae71d4c12f1097c92f9865 Mon Sep 17 00:00:00 2001 From: hyygzds Date: Tue, 23 Sep 2025 19:23:01 +0800 Subject: [PATCH 05/12] fix: improve event parameter --- .../components/method-list/method-list.component.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx index 12fac9465c..4de830c7ca 100644 --- a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx +++ b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx @@ -116,6 +116,7 @@ export default defineComponent({ if (helpId && viewModelId) { fromDataSource.value = await getHelpFields(helpId); toDataSource.value = await getFormFields(viewModelId); + gridColumns[1].editor.data = toDataSource.value; return true; } return false; -- Gitee From dafcd569fb89d2d03f238911c2465e65665ba38f Mon Sep 17 00:00:00 2001 From: hyygzds Date: Wed, 24 Sep 2025 08:47:00 +0800 Subject: [PATCH 06/12] fix: improve field mapping --- .../method-list/method-list.component.tsx | 14 ++++-- .../composition/command.service.tsx | 50 ++++++++++++++++++- .../composition/use-component-provider.ts | 6 ++- 3 files changed, 63 insertions(+), 7 deletions(-) diff --git a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx index 4de830c7ca..607075feaa 100644 --- a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx +++ b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx @@ -11,7 +11,7 @@ import { UseFormSchema } from "../../../../../types"; import { useEventParameterData } from "../../../../../composition/use-event-parameter-data"; import { useParameterEditorData } from "../../../../../composition/use-parameter-editor-data"; import { DesignerMode, UseDesignerContext } from "../../../../../types/designer-context"; -import { useComponentProvider } from "../../../../../composition/use-component-provider"; +import { CallbackFn, useComponentProvider } from "../../../../../composition/use-component-provider"; import { useEventMapping } from "../../../../../composition/schema-repository/controller/use-event-mapping"; import './method-list.scss'; @@ -101,13 +101,16 @@ export default defineComponent({ result.push(externalComponent); } }); - return result; } - function getFieldMappingEditor(selectedData: any) { + function getFieldMappingEditor(parameter:any, selectedData: any) { const ExternalEventParameterComponent = externalComponents['fieldMapping']; + const onChangeValue = () => { + commandsData.value[selectTreeNodeIndex.value] = selectedTreeNode.value; + updateViewModel(commandsData.value); + }; const beforeOpen = async ({ fromDataSource, toDataSource, gridColumns }) => { const foundParam = selectedData.params.find((paramItem: any) => paramItem?.controlSource?.type === 'Select'); const foundLookup = buildLookups().find((lookup: any) => lookup.id === foundParam.value); @@ -125,7 +128,7 @@ export default defineComponent({ type: externalParamterEditor['fieldMapping'], customRender: ExternalEventParameterComponent ? () => : null @@ -307,7 +310,8 @@ export default defineComponent({
{paramsData.value.map((paramData: ParamConfig, index: number) => { - const editor = paramData?.controlSource?.type === 'MappingFieldsEditor' ? getFieldMappingEditor(selectedData) : + const editor = paramData?.controlSource?.type === 'MappingFieldsEditor' ? + getFieldMappingEditor(paramData, selectedData) : getParameterEditorByCommand(paramData); const data = reactive(getEventParameterData(paramData.controlSource?.context?.data?.value) || []); const customStatus = (visualData: VisualData) => { diff --git a/packages/designer/src/components/composition/command.service.tsx b/packages/designer/src/components/composition/command.service.tsx index e98a1d7cd1..9106d6749a 100644 --- a/packages/designer/src/components/composition/command.service.tsx +++ b/packages/designer/src/components/composition/command.service.tsx @@ -1,7 +1,7 @@ /* eslint-disable prefer-destructuring */ /* eslint-disable complexity */ /* eslint-disable no-use-before-define */ -import { ref } from 'vue'; +import { inject, ref } from 'vue'; import { clone, cloneDeep } from "lodash-es"; import axios, { AxiosResponse } from 'axios'; import { FLoadingService, FMessageBoxService, schemaMap } from "@farris/ui-vue/components"; @@ -17,8 +17,13 @@ import { ParamConfig } from "../components/view-model-designer/method-manager/en import { CallbackFn, useComponentProvider } from './use-component-provider'; import { DesignerMode } from "../types/designer-context"; +import { useEventMapping } from './schema-repository/controller/use-event-mapping'; export function useFormCommandService(formSchemaService: UseFormSchema, useFormStateMachineComposition: UseFormStateMachine, loadingService: FLoadingService, webCmpBuilderService: UseCommandBuilderService): UseFormCommandService { + const useFormSchemaComposition = inject('useFormSchema')!; + const designViewModelUtils: any = inject('designViewModelUtils', null); + const schemaService: any = inject('schemaService', null); + const { getFormFields, getHelpFields } = useEventMapping(designViewModelUtils, schemaService); const { externalComponentProps, externalComponents, externalParamterEditor } = useComponentProvider(); const metadataService = new MetadataService(); const messageService: any = FMessageBoxService; @@ -215,6 +220,47 @@ export function useFormCommandService(formSchemaService: UseFormSchema, useFormS }); } + function buildLookups() { + const externalComponents = useFormSchemaComposition.getExternalComponents(); + const result: any[] = []; + externalComponents.forEach((externalComponent) => { + if (externalComponent.type === 'lookup') { + // const lookupItem = { id: externalComponent.id, label: externalComponent.name }; + result.push(externalComponent); + } + }); + + return result; + } + + function getFieldMappingEditor(parameter: any, selectedData: any) { + const ExternalEventParameterComponent = externalComponents['fieldMapping']; + const beforeOpen = async ({ fromDataSource, toDataSource, gridColumns }) => { + const foundParam = selectedData.params.find((paramItem: any) => paramItem?.controlSource?.type === 'Select'); + const foundLookup = buildLookups().find((lookup: any) => lookup.id === foundParam.value); + const { helpId } = foundLookup; + // 缺一个视图模型id + // 缺一个命令id + const viewModelId = ''; + if (helpId && viewModelId) { + fromDataSource.value = await getHelpFields(helpId); + toDataSource.value = await getFormFields(viewModelId); + gridColumns[1].editor.data = toDataSource.value; + return true; + } + return false; + }; + return { + type: externalParamterEditor['fieldMapping'], + customRender: ExternalEventParameterComponent ? () => + + : null + }; + } + function getParameterEditorByCommand(parameter: any, controlName: string, controlType: string, onChangeValue: any) { const name = controlName || parameter.name; const ExternalEventParameterComponent = externalComponents[name]; @@ -275,6 +321,8 @@ export function useFormCommandService(formSchemaService: UseFormSchema, useFormS assembleStateVariables, assembleSchemaFieldsUnderBoundEntity, getEditor: (propertyItem: any, onChangeValue: CallbackFn) => + params.EditorType === 'MappingFieldsEditor' ? + getFieldMappingEditor(propertyItem, () => {}): getParameterEditorByCommand( propertyItem, params.Code, diff --git a/packages/designer/src/components/composition/use-component-provider.ts b/packages/designer/src/components/composition/use-component-provider.ts index eaf2fdcc42..c3ea7b05c2 100644 --- a/packages/designer/src/components/composition/use-component-provider.ts +++ b/packages/designer/src/components/composition/use-component-provider.ts @@ -49,7 +49,7 @@ export function useComponentProvider() { } }; }, - fieldMapping: (beforeOpen) => { + fieldMapping: (parameter: ParamConfig, beforeOpen) => { return { modalWidth: 800, modalHeight: 600, @@ -79,6 +79,10 @@ export function useComponentProvider() { return `${data.raw['name']} [${data.raw['bindingPath']}]`; }, displayFormatter: mapFieldsDisplayFormatter + }, + onMappingFieldsChanged: (value: string) => { + parameter.value = value; + onChangeValue(value); } }; } -- Gitee From 58732fc8da31870f4af52ab9271f5a183a3e32ca Mon Sep 17 00:00:00 2001 From: hyygzds Date: Wed, 24 Sep 2025 10:40:02 +0800 Subject: [PATCH 07/12] fix: improve field mapping event parameter --- .../method-list/method-list.component.tsx | 12 +++++++---- .../composition/command.service.tsx | 6 ++++++ .../composition/use-component-provider.ts | 6 +++++- .../parameter-editor.component.tsx | 21 +++++++++++++++++-- 4 files changed, 38 insertions(+), 7 deletions(-) diff --git a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx index 607075feaa..d951121aeb 100644 --- a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx +++ b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx @@ -105,7 +105,7 @@ export default defineComponent({ } - function getFieldMappingEditor(parameter:any, selectedData: any) { + function getFieldMappingEditor(parameter: any, selectedData: any) { const ExternalEventParameterComponent = externalComponents['fieldMapping']; const onChangeValue = () => { commandsData.value[selectTreeNodeIndex.value] = selectedTreeNode.value; @@ -128,7 +128,11 @@ export default defineComponent({ type: externalParamterEditor['fieldMapping'], customRender: ExternalEventParameterComponent ? () => : null @@ -310,8 +314,8 @@ export default defineComponent({
{paramsData.value.map((paramData: ParamConfig, index: number) => { - const editor = paramData?.controlSource?.type === 'MappingFieldsEditor' ? - getFieldMappingEditor(paramData, selectedData) : + const editor = paramData?.controlSource?.type === 'MappingFieldsEditor' ? + getFieldMappingEditor(paramData, selectedData) : getParameterEditorByCommand(paramData); const data = reactive(getEventParameterData(paramData.controlSource?.context?.data?.value) || []); const customStatus = (visualData: VisualData) => { diff --git a/packages/designer/src/components/composition/command.service.tsx b/packages/designer/src/components/composition/command.service.tsx index 454afca219..30a807ae21 100644 --- a/packages/designer/src/components/composition/command.service.tsx +++ b/packages/designer/src/components/composition/command.service.tsx @@ -238,6 +238,7 @@ export function useFormCommandService( } function getFieldMappingEditor( + modelValue: string, parameter: any, currentCommand: any, viewModelId: string, @@ -262,6 +263,7 @@ export function useFormCommandService( customRender: ExternalEventParameterComponent ? () => params.controlSource?.type === 'MappingFieldsEditor' ? getFieldMappingEditor( + modelValue, propertyItem, currentCommand, viewModelId, @@ -1346,12 +1350,14 @@ export function useFormCommandService( assembleStateVariables, assembleSchemaFieldsUnderBoundEntity, getEditor: ( + modelValue: string, propertyItem: any, currentCommand: any, viewModelId: string, onChangeValue: CallbackFn) => parameterItem.controlSource?.type === 'MappingFieldsEditor' ? getFieldMappingEditor( + modelValue, propertyItem, currentCommand, viewModelId, diff --git a/packages/designer/src/components/composition/use-component-provider.ts b/packages/designer/src/components/composition/use-component-provider.ts index 8391098e61..3be0bc8404 100644 --- a/packages/designer/src/components/composition/use-component-provider.ts +++ b/packages/designer/src/components/composition/use-component-provider.ts @@ -49,12 +49,16 @@ export function useComponentProvider() { } }; }, - fieldMapping: (parameter: ParamConfig, onChangeValue: CallbackFn, beforeOpen) => { + fieldMapping: ( + modelValue: string, + parameter: ParamConfig, + onChangeValue: CallbackFn, beforeOpen) => { return { modalWidth: 800, modalHeight: 600, editable: false, beforeOpen: beforeOpen, + modelValue, fromData: { editable: true, formatter: (cell, data) => { diff --git a/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx b/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx index 324406342e..228a562f95 100644 --- a/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx +++ b/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx @@ -7,6 +7,7 @@ import './parameter-editor.css'; import { FNotifyService as NotifyService } from "@farris/ui-vue/components/notify"; import { cloneDeep } from "lodash-es"; import { VisualData } from "@farris/ui-vue/components/data-view"; +import { UseMethods } from "../../composition/types"; /** * 参数编辑器,包含下列内容: @@ -38,6 +39,7 @@ export default defineComponent({ const shouldShowParameterEditorGroup = ref(props.showParameter); const useFormSchema = inject('useFormSchema') as any; + const methodsComposition = inject('useMethodsComposition') as UseMethods; function getDefaultTargetComponentVM(): string { const { targetComponent } = command.value; @@ -146,8 +148,18 @@ export default defineComponent({ context.emit('change', command.value); } + function getViewModelId() { + let commandViewModelId = ''; + if (targetComponentId.value) { + commandViewModelId = useFormSchema.getViewModelIdByComponentId(targetComponentId.value); + } else { + commandViewModelId = methodsComposition.getViewModeId(); + } + return commandViewModelId; + } + function renderParameterEditor(propertyItem: any, commandValue: any) { - const viewModelId = useFormSchema.getViewModelIdByComponentId(props.command?.targetComponent); + const viewModelId = getViewModelId(); const viewModel = useFormSchema.getViewModelById(viewModelId); const currentCommand = viewModel.commands.find((command: any) => command?.id === props.command?.id); @@ -180,7 +192,12 @@ export default defineComponent({ defaultValue={propertyItem?.origin.defaultValue} v-model={propertyItem.value} data={data} - editor={getEditor(propertyItem, currentCommand, viewModelId, onChangeValue)} + editor={getEditor( + propertyItem.value, + propertyItem, + currentCommand, + viewModelId, + onChangeValue)} fieldData={assembleSchemaFieldsByComponent()} formData={assembleOutline()} varData={assembleStateVariables()} -- Gitee From 78124fbab156b63d6fbba4b07e9b852b57b42685 Mon Sep 17 00:00:00 2001 From: hyygzds Date: Wed, 24 Sep 2025 11:39:39 +0800 Subject: [PATCH 08/12] fix: improve field mapping event parameter --- .../method-list/method-list.component.tsx | 17 +++++++++++++++++ .../components/composition/command.service.tsx | 7 +++++++ .../parameter-editor.component.tsx | 15 +++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx index d951121aeb..96a889a222 100644 --- a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx +++ b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx @@ -25,6 +25,7 @@ export default defineComponent({ const useFormStateMachineComposition: any = inject('useFormStateMachine', null); const designViewModelUtils: any = inject('designViewModelUtils', null); const schemaService: any = inject('schemaService', null); + const messageService: any = inject('FMessageBoxService', null); const { getFormFields, getHelpFields } = useEventMapping(designViewModelUtils, schemaService); /** 树表格实例 */ const treeGridRef = ref(); @@ -112,6 +113,13 @@ export default defineComponent({ updateViewModel(commandsData.value); }; const beforeOpen = async ({ fromDataSource, toDataSource, gridColumns }) => { + const lookupIdParam = selectedData.params.find((param: any) => { + return param.name === 'lookupId'; + }); + if (lookupIdParam && !lookupIdParam.value) { + messageService?.warning('请先选择参照帮助'); + return false; + } const foundParam = selectedData.params.find((paramItem: any) => paramItem?.controlSource?.type === 'Select'); const foundLookup = buildLookups().find((lookup: any) => lookup.id === foundParam.value); const { helpId } = foundLookup; @@ -379,6 +387,15 @@ export default defineComponent({ onValueChange={() => { commandsData.value[selectTreeNodeIndex.value] = selectedTreeNode.value; updateViewModel(commandsData.value); + // 隐藏帮助命令下,切换帮助后,字段映射值清空 + if (paramData.name === 'lookupId') { + const fieldMappingParam = selectedData.params.find((param: any) => { + return param.name === 'mappingFields'; + }); + if (fieldMappingParam && fieldMappingParam.value) { + fieldMappingParam.value = ''; + } + } }} > diff --git a/packages/designer/src/components/composition/command.service.tsx b/packages/designer/src/components/composition/command.service.tsx index 30a807ae21..77eca927cf 100644 --- a/packages/designer/src/components/composition/command.service.tsx +++ b/packages/designer/src/components/composition/command.service.tsx @@ -246,6 +246,13 @@ export function useFormCommandService( ) { const ExternalEventParameterComponent = externalComponents['fieldMapping']; const beforeOpen = async ({ fromDataSource, toDataSource, gridColumns }) => { + const lookupIdParam = currentCommand.params.find((param: any) => { + return param.name === 'lookupId'; + }); + if (lookupIdParam && !lookupIdParam.value) { + messageService?.warning('请先选择参照帮助'); + return false; + } const foundParam = currentCommand.params.find((paramItem: any) => paramItem.name === 'lookupId'); const foundLookup = buildLookups().find((lookup: any) => lookup.id === foundParam.value); const { helpId } = foundLookup; diff --git a/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx b/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx index 228a562f95..b4f51f629c 100644 --- a/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx +++ b/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx @@ -224,6 +224,21 @@ export default defineComponent({ onValueChange={(event) => { onEditorChangeHandler(event, propertyItem); onEditorBlurHandler(); + // 隐藏帮助命令下,切换帮助后,字段映射值清空 + if (propertyItem.origin?.Code === 'lookupId') { + const fieldMappingParamItem = command.value.property?.find((param: any) => { + return param.name === 'mappingFields'; + }); + if (fieldMappingParamItem && fieldMappingParamItem.value) { + fieldMappingParamItem.value = ''; + } + const fieldMappingParam = currentCommand.params.find((param: any) => { + return param.name === 'mappingFields'; + }); + if (fieldMappingParam && fieldMappingParam.value) { + fieldMappingParam.value = ''; + } + } }} > ; -- Gitee From 6cb4769b29025f08317703921cd681c8740a4b68 Mon Sep 17 00:00:00 2001 From: hyygzds Date: Wed, 24 Sep 2025 11:43:08 +0800 Subject: [PATCH 09/12] fix: improve field mapping event parameter --- .../components/method-list/method-list.component.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx index 96a889a222..253e06fde2 100644 --- a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx +++ b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx @@ -385,17 +385,17 @@ export default defineComponent({ updateViewModel(commandsData.value); }} onValueChange={() => { - commandsData.value[selectTreeNodeIndex.value] = selectedTreeNode.value; - updateViewModel(commandsData.value); // 隐藏帮助命令下,切换帮助后,字段映射值清空 if (paramData.name === 'lookupId') { - const fieldMappingParam = selectedData.params.find((param: any) => { + const fieldMappingParam = selectedTreeNode.value.data.params.find((param: any) => { return param.name === 'mappingFields'; }); if (fieldMappingParam && fieldMappingParam.value) { fieldMappingParam.value = ''; } } + commandsData.value[selectTreeNodeIndex.value] = selectedTreeNode.value; + updateViewModel(commandsData.value); }} > -- Gitee From 89d94da4a7d23c685ab378f3730d26f6e05ed144 Mon Sep 17 00:00:00 2001 From: hyygzds Date: Wed, 24 Sep 2025 14:42:31 +0800 Subject: [PATCH 10/12] fix: modify data grid select row --- .../components/data-grid/src/schema/data-grid.schema.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/ui-vue/components/data-grid/src/schema/data-grid.schema.json b/packages/ui-vue/components/data-grid/src/schema/data-grid.schema.json index f76f755d4b..384303f5ef 100644 --- a/packages/ui-vue/components/data-grid/src/schema/data-grid.schema.json +++ b/packages/ui-vue/components/data-grid/src/schema/data-grid.schema.json @@ -554,6 +554,11 @@ "selection": { "type": "object", "properties": { + "multiSelectMode": { + "description": "多选模式", + "type": "string", + "default": "OnCheckAndClick" + }, "enableSelectRow": { "description": "允许选中行", "type": "boolean", -- Gitee From 6a96bf4d2eac82bcf40545e1fdef2953fa2af235 Mon Sep 17 00:00:00 2001 From: hyygzds Date: Wed, 24 Sep 2025 16:00:34 +0800 Subject: [PATCH 11/12] fix: event editor clear field-mapping value after changing lookup --- .../parameter-editor/parameter-editor.component.tsx | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx b/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx index b4f51f629c..2ef165d6b9 100644 --- a/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx +++ b/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.component.tsx @@ -222,8 +222,6 @@ export default defineComponent({ onEditorBlurHandler(); }} onValueChange={(event) => { - onEditorChangeHandler(event, propertyItem); - onEditorBlurHandler(); // 隐藏帮助命令下,切换帮助后,字段映射值清空 if (propertyItem.origin?.Code === 'lookupId') { const fieldMappingParamItem = command.value.property?.find((param: any) => { @@ -232,13 +230,9 @@ export default defineComponent({ if (fieldMappingParamItem && fieldMappingParamItem.value) { fieldMappingParamItem.value = ''; } - const fieldMappingParam = currentCommand.params.find((param: any) => { - return param.name === 'mappingFields'; - }); - if (fieldMappingParam && fieldMappingParam.value) { - fieldMappingParam.value = ''; - } } + onEditorChangeHandler(event, propertyItem); + onEditorBlurHandler(); }} > ; -- Gitee From 918f545df73079f78440b8a8e42b74acb7b875a3 Mon Sep 17 00:00:00 2001 From: hyygzds Date: Thu, 25 Sep 2025 19:54:12 +0800 Subject: [PATCH 12/12] fix: tree grid emit selectionChange initing data --- .../method-list/method-list.component.tsx | 2 +- .../src/components/composition/command.service.tsx | 2 +- .../tree-grid/src/tree-grid.component.tsx | 13 ++++++++++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx index 253e06fde2..cf6a09df6b 100644 --- a/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx +++ b/packages/designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx @@ -117,7 +117,7 @@ export default defineComponent({ return param.name === 'lookupId'; }); if (lookupIdParam && !lookupIdParam.value) { - messageService?.warning('请先选择参照帮助'); + messageService?.warning('请先选择数据源。'); return false; } const foundParam = selectedData.params.find((paramItem: any) => paramItem?.controlSource?.type === 'Select'); diff --git a/packages/designer/src/components/composition/command.service.tsx b/packages/designer/src/components/composition/command.service.tsx index 77eca927cf..fc573900fb 100644 --- a/packages/designer/src/components/composition/command.service.tsx +++ b/packages/designer/src/components/composition/command.service.tsx @@ -250,7 +250,7 @@ export function useFormCommandService( return param.name === 'lookupId'; }); if (lookupIdParam && !lookupIdParam.value) { - messageService?.warning('请先选择参照帮助'); + messageService?.warning('请先选择数据源。'); return false; } const foundParam = currentCommand.params.find((paramItem: any) => paramItem.name === 'lookupId'); diff --git a/packages/ui-vue/components/tree-grid/src/tree-grid.component.tsx b/packages/ui-vue/components/tree-grid/src/tree-grid.component.tsx index 04383534ac..052e8ca048 100644 --- a/packages/ui-vue/components/tree-grid/src/tree-grid.component.tsx +++ b/packages/ui-vue/components/tree-grid/src/tree-grid.component.tsx @@ -484,6 +484,16 @@ export default defineComponent({ function getCollapseField() { return collapseField.value; } + + function selectRowById(dataItemId: string) { + const idField = useIdentifyComposition.idField.value; + const visibleItemToBeSelected = visibleDatas.value.find((visibleData: VisualData) => { + return visibleData.raw[idField] === dataItemId; + }) as VisualData; + if (visibleItemToBeSelected) { + useRowComposition.selectRow(visibleItemToBeSelected); + } + } context.expose({ activeRowById, addNewDataItem, @@ -508,7 +518,8 @@ export default defineComponent({ reassignRowData, hasChildren, getCollapseField, - getCollapseStatusById + getCollapseStatusById, + selectRowById }); const gridContentStyle = computed(() => { -- Gitee