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 4216ca461d442bbb10709feb5b7ae7a12610a4b9..61dfe81925d809cd3decf67a552ad39ac8fd2214 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 @@ -366,7 +366,7 @@ export default defineComponent({ formData={assembleOutline()} editorType={paramData?.controlSource?.type || 'Default'} editorControlSource={paramData?.controlSource} - customStatus={customStatus} + customRowStatus={customStatus} idField={ paramData.controlSource?.context?.data?.value === ':Entity' ? 'bindTo' : (paramData?.controlSource?.context?.valueField?.value diff --git a/packages/renderer/src/callback-handler/before-update-data-grid-callback-handler.ts b/packages/renderer/src/callback-handler/before-update-data-grid-callback-handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..1253059b627c8b357eed9e6e37d265c4e0a2d25e --- /dev/null +++ b/packages/renderer/src/callback-handler/before-update-data-grid-callback-handler.ts @@ -0,0 +1,38 @@ +import { ExpressionEvaluator, Module } from '@farris/devkit-vue'; +import { CallbackHandler } from './callback-handler'; +import { FormMetadataService } from '../service'; + +/** + * 单元格编辑前回调 + */ +export class BeforeUpdateDataGridCallCallbackHandler extends CallbackHandler { + public schemaType: string | null = 'data-grid'; + /** + * 回调类型 + */ + public callbackType: string | null = 'beforeUpdate'; + + /** + * 构造函数 + */ + constructor(module: Module, private formMetadataService: FormMetadataService, private expressionEvaluator: ExpressionEvaluator) { + super(module); + } + + /** + * 处理回调 + */ + public handle(type: string, viewSchema: Record, args: any[]): any | Promise { + const schema = viewSchema; + const { beforeUpdate } = schema; + const defaultReturnValue = () => {}; + + if (!beforeUpdate) { + return defaultReturnValue; + } + + const callbackArgs = { payload: args[0], schema }; + return this.handleCallback(type, callbackArgs, beforeUpdate, defaultReturnValue); + } + +} diff --git a/packages/renderer/src/callback-handler/providers.ts b/packages/renderer/src/callback-handler/providers.ts index 69413900ed1bd66a79c5fd00f35e549eb5ba02d6..4986640bc9820e681eb52682cbeeddd2e45a70fe 100644 --- a/packages/renderer/src/callback-handler/providers.ts +++ b/packages/renderer/src/callback-handler/providers.ts @@ -1,6 +1,7 @@ import { ExpressionEvaluator, ExpressionRegistry, Injector, Module, StaticProvider } from "@farris/devkit-vue"; import { CALLBACK_HANDLER_TOKEN } from "../tokens"; import { BeforeEditCallCallbackHandler } from "./before-edit-cell-callback-handler"; +import { BeforeUpdateDataGridCallCallbackHandler } from './before-update-data-grid-callback-handler'; import { CallbackHandlerRegistry } from "./callback-handler-registry"; import { FormMetadataService } from "../service"; import { DictPickingCallbackHandler } from "./dict-picking-callback-handler"; @@ -21,5 +22,6 @@ export const callbackHandlerProviders: StaticProvider[] = [ { provide: CALLBACK_HANDLER_TOKEN, useClass: BeforeCloseModalCallbackHandler, deps: [Module], multi: true }, { provide: CALLBACK_HANDLER_TOKEN, useClass: LoadComboListDataCallbackHandler, deps: [Module], multi: true }, { provide: CALLBACK_HANDLER_TOKEN, useClass: BeforeCloseDrawerCallbackHandler, deps: [Module], multi: true }, + { provide: CALLBACK_HANDLER_TOKEN, useClass: BeforeUpdateDataGridCallCallbackHandler, deps: [Module], multi: true }, { provide: CallbackHandlerRegistry, useClass: CallbackHandlerRegistry, deps: [Injector] } ]; 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 c0e9f6bd070850811aa233a7446df7907a16c32c..90d799865c4267b24097cce2d615c614a6c833e5 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 @@ -380,34 +380,41 @@ export default defineComponent({ } ); + function updatePagination(pageOptions: Partial) { + usePaginationComposition.updatePagination(pageOptions); + } + function updateDataSource(newData: Record[], options?: UpdateDataOption ) { - if (newData) { - // 重新加载数据时,重置滚动条位置 - dataView.load(newData); - visibleDatas.value = getVisualData(0, visibleCapacity.value + preloadCount - 1); - if (options?.keepScrollTop) { - // 更新数据源之后,组件可以允许保持纵向滚动条位置不变,提高用户体验性 - useVirtualScrollComposition.scrollTo(useVirtualScrollComposition.offsetY.value); - } else { - resetScroll(); - } - if (!visibleDatas.value.length) { - // 数据源清空后,选中数据清空 - selectedValues.value = []; - } - if (showSidebarCheckBox.value && showSelectAll.value) { - // 如果启用全选,更新全选状态,此处用于服务端分页简单的跨页多选场景 - updateSelectAllStatus(); - } - } - // 清空编辑对象,解绑编辑事件 - useEditComposition.clear(); - } - - function updatePagination(pageOptions: Partial) { - usePaginationComposition.updatePagination(pageOptions); + Promise.resolve() + .then(() => { + const instance = { updateColumns, updatePagination }; + props.beforeUpdate && typeof props.beforeUpdate === 'function' ? props.beforeUpdate({ instance }) : () => { }; + }) + .then(() => { + if (newData) { + // 重新加载数据时,重置滚动条位置 + dataView.load(newData); + visibleDatas.value = getVisualData(0, visibleCapacity.value + preloadCount - 1); + if (options?.keepScrollTop) { + // 更新数据源之后,组件可以允许保持纵向滚动条位置不变,提高用户体验性 + useVirtualScrollComposition.scrollTo(useVirtualScrollComposition.offsetY.value); + } else { + resetScroll(); + } + if (!visibleDatas.value.length) { + // 数据源清空后,选中数据清空 + selectedValues.value = []; + } + if (showSidebarCheckBox.value && showSelectAll.value) { + // 如果启用全选,更新全选状态,此处用于服务端分页简单的跨页多选场景 + updateSelectAllStatus(); + } + } + // 清空编辑对象,解绑编辑事件 + useEditComposition.clear(); + }); } watch(dataView.shouldGroupingData, (newEnableGroup: boolean, oldEnableGroup: boolean) => { diff --git a/packages/ui-vue/components/data-grid/src/data-grid.props.ts b/packages/ui-vue/components/data-grid/src/data-grid.props.ts index f9b5a2aad0a61c4c1ef560ec5939406ff75d1ed5..9cb0e483fd792abcfe91cd293e8b8b7ba5dab2ca 100644 --- a/packages/ui-vue/components/data-grid/src/data-grid.props.ts +++ b/packages/ui-vue/components/data-grid/src/data-grid.props.ts @@ -390,7 +390,7 @@ export const dataGridProps = { type: Object as PropType, default: { enable: true, width: 36, - showEllipsis:true, + showEllipsis: true, heading: '序号' } }, @@ -443,7 +443,8 @@ export const dataGridProps = { /** 宽度 */ width: { type: Number, default: -1 }, /** 空数据模板 */ - emptyTemplate: { type: Object as PropType VNode | string)> } + emptyTemplate: { type: Object as PropType VNode | string)> }, + beforeUpdate: { type: Function as PropType<(context: any) => Promise | any> } } as Record; export type DataGridProps = ExtractPropTypes; diff --git a/packages/ui-vue/components/data-grid/src/schema/callback-resolvers.ts b/packages/ui-vue/components/data-grid/src/schema/callback-resolvers.ts index 246c4dccd9912840c59418e44905d6fad1b4df66..261d98a95335988fb0d99673512b46b5fa40a63e 100644 --- a/packages/ui-vue/components/data-grid/src/schema/callback-resolvers.ts +++ b/packages/ui-vue/components/data-grid/src/schema/callback-resolvers.ts @@ -7,6 +7,9 @@ export function createDataGridCallbackResolver() { callbacks.beforeEditCell = (context: { row: VisualData, cell: VisualDataCell, rawData: any, column: DataColumn; }): Promise => { return caller.call('beforeEditCell', viewSchema, [context, viewSchema]); }; + callbacks.beforeUpdate = (context: any): Promise => { + return caller.call('beforeUpdate', viewSchema, [context, viewSchema]); + }; return callbacks; } return { 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 7340be3f1caf80ddca097a5a841d4624d671c8f5..89f52f3949e54395be56503f17e9aa3d1a0cb75a 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 @@ -819,6 +819,11 @@ "description": "", "type": "string", "default": "" + }, + "beforeUpdate": { + "description": "", + "type": "string", + "default": "" } }, "required": [ diff --git a/packages/ui-vue/components/data-view/composition/types.ts b/packages/ui-vue/components/data-view/composition/types.ts index ef845fc2761c97c4827a1bf3ad260aef554b9108..923f562c72e819885ff3a2543fd0cb8c8f1a27d0 100644 --- a/packages/ui-vue/components/data-view/composition/types.ts +++ b/packages/ui-vue/components/data-view/composition/types.ts @@ -533,6 +533,8 @@ export interface DataViewOptions { showBorder: boolean; emptyTemplate: null | undefined | (() => VNode | string); + // 调用updateDataSource之前触发 + beforeUpdate: (context: any) => Promise | any; } export interface UseDataView { diff --git a/packages/ui-vue/components/data-view/composition/use-selection.ts b/packages/ui-vue/components/data-view/composition/use-selection.ts index 0189c81407e0bdc852bae2c1a0b71d853a6e4801..c7368b1ed25e0e95592f9404a1f3910300275005 100644 --- a/packages/ui-vue/components/data-view/composition/use-selection.ts +++ b/packages/ui-vue/components/data-view/composition/use-selection.ts @@ -260,6 +260,9 @@ export function useSelection( /** 勾选指定节点 */ function select(visualDataToBeSelected: VisualData) { + if (visualDataToBeSelected.disabled) { + return; + } selectWithoutRow(visualDataToBeSelected); // emitSelectionChanged(); currentSelectedDataId.value = visualDataToBeSelected.raw[idField.value]; @@ -267,6 +270,9 @@ export function useSelection( /** 取消勾选指定节点 */ function unSelect(visualDataToBeUnSelected: VisualData) { + if (visualDataToBeUnSelected.disabled) { + return; + } unSelectWithoutRow(visualDataToBeUnSelected); currentSelectedDataId.value = ''; } diff --git a/packages/ui-vue/components/data-view/designer/property-config/use-event.ts b/packages/ui-vue/components/data-view/designer/property-config/use-event.ts index 721f111e929c3b7e8ebc05f2f0f9ca2e7ea1dab3..c1952780c7abe084ae5cbed4ff6439d39e9c572c 100644 --- a/packages/ui-vue/components/data-view/designer/property-config/use-event.ts +++ b/packages/ui-vue/components/data-view/designer/property-config/use-event.ts @@ -1,6 +1,10 @@ export function useDataGridEvent() { function initEvent(propertyData: any) { const events = [ + { + label: 'beforeUpdate', + name: '更新数据前事件' + }, { label: 'onClickRow', name: '行点击事件' 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 4f9d3a4c5d81814fed504ab95287ff51b3a72132..15a4981c120bd346581d1f2d76cd6280d8dd1b0d 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 @@ -203,7 +203,7 @@ export default defineComponent({ activeViewModelFieldData={assembleSchemaFieldsUnderBoundEntity(targetComponentId.value)} // editorType={propertyItem?.origin?.controlSource?.type || 'Default'} editorControlSource={propertyItem?.origin?.controlSource} - customStatus={customStatus} + customRowStatus={customStatus} idField={ propertyItem?.origin?.controlSource?.context?.data?.value === ':Entity' ? 'bindTo' : propertyItem?.origin?.controlSource?.context?.valueField?.value