diff --git a/packages/renderer/src/component-config-resolver/data-grid-component-config-resolver.ts b/packages/renderer/src/component-config-resolver/data-grid-component-config-resolver.ts index f3c63dfe9b7a058df2491bbeadc76a134dc40800..9a526ec6d87a9b0c71e98c7972ec3d471bb0e9c7 100644 --- a/packages/renderer/src/component-config-resolver/data-grid-component-config-resolver.ts +++ b/packages/renderer/src/component-config-resolver/data-grid-component-config-resolver.ts @@ -35,8 +35,8 @@ export class DataGridComponentConfigResolver extends ComponentConfigResolver { if (viewModelId) { const viewModel: any = this.viewModel.getModule().getViewModel(viewModelId); if (viewModel) { - command.onClickEditCommand = (eventParams: any) => viewModel[onClickEditCommand](eventParams); - command.onClickDeleteCommand = (eventParams: any) => viewModel[onClickDeleteCommand](eventParams); + command.onClickEditCommand = (cell: any, row: any) => viewModel[onClickEditCommand]({ cell, rowData: row.raw }); + command.onClickDeleteCommand = (cell: any, row: any) => viewModel[onClickDeleteCommand]({ cell, rowData: row.raw }); } } } diff --git a/packages/renderer/src/event-handler/data-grid-double-click-row-event-handler.ts b/packages/renderer/src/event-handler/data-grid-double-click-row-event-handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..a01452dc72fefa2d74562c77b67e7252cfb2c87d --- /dev/null +++ b/packages/renderer/src/event-handler/data-grid-double-click-row-event-handler.ts @@ -0,0 +1,49 @@ +import { Injector, Module } from "@farris/devkit-vue"; +import { EventEmitter } from "../common"; +import { FormMetadataService } from "../service"; +import { ViewEvent } from "../types"; + +export class DataGridDoubleClickRowEventHandler{ + constructor(private emitter: EventEmitter, private formMetadataService: FormMetadataService, private module: Module, private injector: Injector) { + } + + bind(): void { + this.emitter.on('doubleClickRow', (payload: ViewEvent) => this.onDoubleClickRow(payload)); + } + + dispose(): void { + this.emitter.on('doubleClickRow', (payload: ViewEvent) => this.onDoubleClickRow(payload)); + } + + private onDoubleClickRow(payload: ViewEvent) { + if (!payload) { + return; + } + const event: ViewEvent = payload; + const { token, type } = event; + if ((type !== 'data-grid' && type !== 'tree-grid') || !token) { + return; + } + const component = this.formMetadataService.getMetadataById(token); + if (!component) { + return; + } + const { id } = component; + if (!id) { + return; + } + const relatedComponent = this.formMetadataService.getRelatedComponent(id); + if (!relatedComponent) { + return; + } + const viewModel = this.module.getViewModel(relatedComponent.id); + if (!viewModel) { + return; + } + // 行切换 + const { payloads } = event; + const item = payloads[1]; + const { id: dataId } = item; + viewModel.entityStore?.changeCurrentEntityByPath(viewModel.bindingPath, dataId); + } +} diff --git a/packages/renderer/src/event-handler/index.ts b/packages/renderer/src/event-handler/index.ts index 84c7b2f76cf08254ed07608e01d4c16b3c39ec2c..3a1fef748f674b2e24940933c4c426800d56d4f1 100644 --- a/packages/renderer/src/event-handler/index.ts +++ b/packages/renderer/src/event-handler/index.ts @@ -8,4 +8,5 @@ export * from './data-grid-page-index-change-event-handler'; export * from './data-grid-page-size-change-event-handler'; export * from './data-grid-selection-change-event-handler'; export * from './query-solution-condition-change-event-handler'; +export * from './data-grid-double-click-row-event-handler'; export * from './providers'; diff --git a/packages/renderer/src/event-handler/providers.ts b/packages/renderer/src/event-handler/providers.ts index 298fbc9d4b367a8ea41185f61cfa26d2ccd2f30a..cd26960b55019a8c96ee4d2f716a607b815f3890 100644 --- a/packages/renderer/src/event-handler/providers.ts +++ b/packages/renderer/src/event-handler/providers.ts @@ -11,6 +11,7 @@ import { DataGridPageIndexChangeEventHandler } from "./data-grid-page-index-chan import { DataGridPageSizeChangeEventHandler } from "./data-grid-page-size-change-event-handler"; import { DataGridSelectionChangeEventHandler } from "./data-grid-selection-change-event-handler"; import { QuerySolutionConditionChangeEventHandler } from "./query-solution-condition-change-event-handler"; +import { DataGridDoubleClickRowEventHandler } from './data-grid-double-click-row-event-handler'; export const eventHanderProviders: StaticProvider[] = [ { provide: EVENT_HANDLERS_TOKEN, useClass: LookupDataMappingEventHandler, deps: [EventEmitter, FormMetadataService, Module, Injector], multi: true }, @@ -21,5 +22,6 @@ export const eventHanderProviders: StaticProvider[] = [ { provide: EVENT_HANDLERS_TOKEN, useClass: DataGridPageIndexChangeEventHandler, deps: [EventEmitter, FormMetadataService, Module, Injector], multi: true }, { provide: EVENT_HANDLERS_TOKEN, useClass: DataGridPageSizeChangeEventHandler, deps: [EventEmitter, FormMetadataService, Module, Injector], multi: true }, { provide: EVENT_HANDLERS_TOKEN, useClass: DataGridSelectionChangeEventHandler, deps: [EventEmitter, FormMetadataService, Module, Injector], multi: true }, - { provide: EVENT_HANDLERS_TOKEN, useClass: QuerySolutionConditionChangeEventHandler, deps: [EventEmitter, FormMetadataService, Module, Injector], multi: true } + { provide: EVENT_HANDLERS_TOKEN, useClass: QuerySolutionConditionChangeEventHandler, deps: [EventEmitter, FormMetadataService, Module, Injector], multi: true }, + { provide: EVENT_HANDLERS_TOKEN, useClass: DataGridDoubleClickRowEventHandler, deps: [EventEmitter, FormMetadataService, Module, Injector], multi: true } ]; diff --git a/packages/ui-binding/lib/compositions/use-data-grid-binding.ts b/packages/ui-binding/lib/compositions/use-data-grid-binding.ts index c7ed4dfe6405b83bc55af36fc7c991d974e9c153..20f6c61d72a5745c55ff87a0b6ec0bdf62f32b2f 100644 --- a/packages/ui-binding/lib/compositions/use-data-grid-binding.ts +++ b/packages/ui-binding/lib/compositions/use-data-grid-binding.ts @@ -189,12 +189,31 @@ export function useDataGridBinding(elementRef: ElementRef, options: BindingOptio ids = Array.isArray(ids) ? ids : [ids]; viewModel.uiStore?.setValue('ids', currentIds.filter((item) => !ids.includes(item))); } + function getEntitySchema(entityPath?: EntityPath): EntitySchema | undefined { + if (!entityPath) { + return undefined; + } + if(entityPath.getNodes().length<1){ + return viewModel.entityStore?.getEntitySchema(); + } + const fieldSchema = viewModel.entityStore?.getEntitySchema().getFieldSchemaByPath(entityPath) as EntityFieldSchema; + return fieldSchema.entitySchema; + } function updateIdsState(id: string | undefined | null) { if (!id) { viewModel.uiStore?.setValue('ids', []); } else { - // 启用多选后不需要在此处理 + // 启用多选后需要同步 if (multiSelect) { + // 启用多选后使用表格记录的多选记录,还应考虑跨页多选场景,目前不支持 + const entitySchema = getEntitySchema(entityPaths); + if (!entitySchema) { + return; + } + const idKey = entitySchema.getIdKey(); + const items: any[] = componentRef.value.getSelectedItems() || []; + const ids = items.map(item => item[idKey]); + viewModel.uiStore?.setValue('ids', ids); return; } viewModel.uiStore?.setValue('ids', [id]); diff --git a/packages/ui-binding/lib/compositions/use-form-group-binding.ts b/packages/ui-binding/lib/compositions/use-form-group-binding.ts index 80ebc384f5156d5b1424bee5851f6e3e7b7a929a..fc2ba55a9dc85c047668b7bfc1a7fc059cf0486c 100644 --- a/packages/ui-binding/lib/compositions/use-form-group-binding.ts +++ b/packages/ui-binding/lib/compositions/use-form-group-binding.ts @@ -29,11 +29,12 @@ export function useFormGroupBinding(elementRef: ElementRef, options: any, viewSc if (!mappingFields || Object.keys(mappingFields).length < 1 || !idField) { return; } - const dataField = mappingFields[idField]; - if (!dataField) { + const idFields: string = mappingFields[idField]; + if (!idFields) { return; } - + const dataFields = idFields.split(',').filter((p)=>p); + const dataField = dataFields[0]; const entityPaths = toShortPath() || []; const paths = entityPaths.concat(dataField.split('.')); const dataFieldPath = '/' + paths.join('/'); diff --git a/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts b/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts index 0cd6bddc1f999556c0aa05aacba75ac23af2f98a..273cc6292d2e244d4a51a0f8891d42bf8d5a3439 100644 --- a/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts +++ b/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts @@ -41,14 +41,14 @@ export class LookupPropertyConfig extends InputBaseProperty { return new ExpressionProperty(this.formSchemaUtils).getExpressionConfig(propertyData, 'Field', suportTypes); } - getPropertyConfig(propertyData: any, componentInstance: DesignerComponentInstance | null) { + getPropertyConfig(propertyData: any, componentInstance: DesignerComponentInstance | null, showPosition = 'Card') { const editorTypes = propertyData.binding?.field ? [] : ['Const', 'Variable', 'StateMachine']; this.readonlyEditor = this.getPropertyEditorParams(propertyData, editorTypes, 'readonly'); this.visibleEditor = this.getPropertyEditorParams(propertyData, editorTypes, 'visible'); this.requiredEditor = this.getPropertyEditorParams(propertyData, editorTypes, 'required'); this.freeInputEditor = this.getPropertyEditorParams(propertyData, ['Const', 'Variable'], 'allowFreeInput'); - const basic = this.getBasicProperties(propertyData, componentInstance); + const basic = this.getBasicProperties(propertyData, componentInstance,showPosition); const behavior = this.getBehaviorConfig(propertyData); const appearance = this.getAppearanceProperties(propertyData, componentInstance); const lookup = this.getLookupConfig(propertyData); @@ -81,7 +81,7 @@ export class LookupPropertyConfig extends InputBaseProperty { }; } getGridFieldEdtiorPropConfig(propertyData: any) { - return this.getPropertyConfig(propertyData, null).categories; + return this.getPropertyConfig(propertyData, null,'Grid').categories; } private flattenTreeNodes(treeNodes: any[]): any[] { @@ -553,8 +553,8 @@ export class LookupPropertyConfig extends InputBaseProperty { editor: { ...this.comboListEditor, data: [ - { text: '弹出窗口', value: 'Modal'}, - { text: '下拉面板', value: 'Popup'}, + { text: '弹出窗口', value: 'Modal' }, + { text: '下拉面板', value: 'Popup' }, ], valueField: 'value', textField: 'text', @@ -852,8 +852,8 @@ export class LookupPropertyConfig extends InputBaseProperty { const events = LookupEvents; const initialData = self.eventsEditorUtils['formProperties'](propertyData, self.viewModelId, events); - const properties = self.createBaseEventProperty(initialData); - + const properties = self.createBaseEventProperty(initialData); + return { title: '事件', hideTitle: true, diff --git a/packages/ui-vue/components/section/src/schema/schema-resolver.ts b/packages/ui-vue/components/section/src/schema/schema-resolver.ts index ab718b1661b75600a25e90818e205f35dccfb179..cf54831d8463f4368e436a97d31ab7285349c686 100644 --- a/packages/ui-vue/components/section/src/schema/schema-resolver.ts +++ b/packages/ui-vue/components/section/src/schema/schema-resolver.ts @@ -10,10 +10,10 @@ import { DynamicResolver } from "../../../dynamic-resolver"; * @param designerHostService * @returns */ -function wrapContainerForSection(resolver: DynamicResolver, sectionSchema: Record, context: Record) { +function wrapContainerForSection(resolver: DynamicResolver, context: Record) { const radomNum = Math.random().toString().slice(2, 6); const parentComponentInstance = context.parentComponentInstance as DesignerComponentInstance; - + const sectionSchema = resolver.getSchemaByType('section') as ComponentSchema; Object.assign(sectionSchema, { id: `section-${radomNum}`, appearance: { @@ -53,7 +53,7 @@ function wrapContainerForSection(resolver: DynamicResolver, sectionSchema: Recor export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record): Record { const parentComponentInstance = context.parentComponentInstance as DesignerComponentInstance; if (parentComponentInstance) { - return wrapContainerForSection(resolver, schema, context); + return wrapContainerForSection(resolver, context); } else { return schema; }