From 0b94be912dd2afbe0dfbc57812d7bf0ccfbe37cd Mon Sep 17 00:00:00 2001 From: ShineKOT <1917095344@qq.com> Date: Fri, 22 Aug 2025 15:00:36 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E6=A1=86=E9=80=89=E6=8B=A9=E5=99=A8=E6=94=AF=E6=8C=81?= =?UTF-8?q?AC=E8=87=AA=E5=A1=AB=E6=A8=A1=E5=BC=8F=E8=A1=8C=E4=B8=BA?= =?UTF-8?q?=E7=BB=84=EF=BC=8C=E6=96=B0=E5=A2=9E=E6=95=B0=E6=8D=AE=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E5=99=A8=EF=BC=8C=E5=9C=B0=E5=9D=80=E6=A1=86=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E5=99=A8=E7=BC=96=E8=BE=91=E5=99=A8=E5=8F=82=E6=95=B0?= =?UTF-8?q?actionpostion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 + .../ibiz-mpicker/ibiz-mpicker.scss | 11 +- .../data-picker/ibiz-mpicker/ibiz-mpicker.tsx | 215 +++++++++++------- .../data-picker/ibiz-picker/ibiz-picker.scss | 11 +- .../data-picker/ibiz-picker/ibiz-picker.tsx | 97 ++++---- .../data-picker/picker-editor.controller.ts | 17 +- 6 files changed, 211 insertions(+), 142 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b95e46e96..7f9063759 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ - 第三方登录组件支持通过自定义补充参数指定需要展示的第三方登录方式 - 新增应用挂载时添加水印逻辑,适配应用全局参数 watermark(应用水印配置参数),可在应用自定义参数中配置,配置示例包括启用水印(globalConfig.watermark.enable=true)、设置显示文本(globalConfig.watermark.text=测试内容) +- 新增地址框选择器支持AC自填模式行为组 +- 新增数据选择器,地址框选择器编辑器参数actionpostion('top' | 'bottom')指定AC自填模式行为组在下拉列表中的位置,默认为底部 ## Fixed diff --git a/src/editor/data-picker/ibiz-mpicker/ibiz-mpicker.scss b/src/editor/data-picker/ibiz-mpicker/ibiz-mpicker.scss index 45c0be4c4..9ce3fe515 100644 --- a/src/editor/data-picker/ibiz-mpicker/ibiz-mpicker.scss +++ b/src/editor/data-picker/ibiz-mpicker/ibiz-mpicker.scss @@ -58,8 +58,17 @@ $mpicker: ( } @include e(action-item) { + display: flex; + align-items: center; + justify-content: center; color: getCssVar(color, link); - text-align: center; + @include m(caption) { + margin-left: getCssVar(spacing, extra-tight); + } + @include when(disabled) { + color: getCssVar(color, disabled-text); + cursor: not-allowed; + } } @include e(empty) { diff --git a/src/editor/data-picker/ibiz-mpicker/ibiz-mpicker.tsx b/src/editor/data-picker/ibiz-mpicker/ibiz-mpicker.tsx index 8a08fe99d..0185e6677 100644 --- a/src/editor/data-picker/ibiz-mpicker/ibiz-mpicker.tsx +++ b/src/editor/data-picker/ibiz-mpicker/ibiz-mpicker.tsx @@ -14,6 +14,7 @@ import { getDataPickerProps, } from '@ibiz-template/vue3-util'; import { clone } from 'lodash-es'; +import { IAppDEUIActionGroupDetail } from '@ibiz/model-core'; import { showTitle } from '@ibiz-template/core'; import { PickerEditorController } from '../picker-editor.controller'; import './ibiz-mpicker.scss'; @@ -29,6 +30,8 @@ import './ibiz-mpicker.scss'; * @editorparams {"name":"objectnamefield","parameterType":"string","description":"值类型为OBJECTS时的对象名称属性。也用于控制是否触发下拉区域数据的默认加载,配置时会触发默认加载,不配置时不会触发默认加载"} * @editorparams {"name":"objectvaluefield","parameterType":"string","description":"值类型为OBJECTS时的对象值属性"} * @editorparams {"name":"readonly","parameterType":"boolean","defaultvalue":false,"description":"设置编辑器是否为只读态"} + * @editorparams {"name":"AC","parameterType":"boolean","defaultvalue":false,"description":"设置编辑器是否启用AC自填模式"} + * @editorparams {"name":"actionpostion","parameterType":"'top' | 'bottom'","defaultvalue":"'bottom'","description":"设置AC自填模式行为组位置,默认在下拉底部"} * @ignoreprops overflowMode */ export const IBizMPicker = defineComponent({ @@ -61,6 +64,17 @@ export const IBizMPicker = defineComponent({ // 编辑器Ref const editorRef = ref(); + // 行为位置 + const actionPostion: 'top' | 'bottom' = + c.model.editorParams?.actionpostion || 'bottom'; + + const overflowMode = + c.editorParams.overflowMode || + c.editorParams.overflowmode || + ibiz.config.pickerEditor.overflowMode; + + const isEllipsis = overflowMode === 'ellipsis'; + // 是否显示表单默认内容 const showFormDefaultContent = computed(() => { if ( @@ -232,10 +246,11 @@ export const IBizMPicker = defineComponent({ // 下拉选中回调 const onSelect = async (selects: string[]) => { setEditable(false); - if (selects.includes('empty')) { - resetCurValue(); - return; - } + if ( + selects.includes('empty') || + selects.some(selectKey => selectKey.includes('DEUIACTION')) + ) + return resetCurValue(); const val: Array = []; let value: string | Array | null = null; const selections = selects.map((select: string) => { @@ -394,50 +409,136 @@ export const IBizMPicker = defineComponent({ } }); - const renderEmpty = () => { - if (items.value.length) { - return; - } - return ( - - event.stopPropagation()} - > - - ); + /** + * @description 绘制行为列表 + * @returns {*} + */ + const renderActionItems = () => { + return c.actionDetails.map((item: IAppDEUIActionGroupDetail) => { + if (!c.groupActionState[item.id!].visible) return; + return ( + + {{ + default: () => ( +
{ + if (!c.groupActionState[item.id!].disabled) + c.onActionClick(item, props.data, event); + }} + > + {item.showIcon && item.sysImage && ( + + )} + + {item.showCaption ? item.caption : ''} + +
+ ), + }} +
+ ); + }); + }; + + /** + * @description 绘制下拉列表 + * @returns {*} + */ + const renderListItems = () => { + if (!items.value.length) + return [ + + event.stopPropagation()} + > + , + ]; + return items.value.map(item => { + return ( + + {{ + default: () => { + if (c.acItemProvider) { + const component = resolveComponent( + c.acItemProvider.component, + ); + return h(component, { + item, + controller: c, + }); + } + const panel = c.deACMode?.itemLayoutPanel; + if (panel) + return ( + + ); + return ( + + {item[c.textName] != null ? item[c.textName] : ''} + + ); + }, + }} + + ); + }); + }; + + const renderListContent = () => { + if (actionPostion === 'top') + return [...renderActionItems(), ...renderListItems()]; + return [...renderListItems(), ...renderActionItems()]; }; return { - ns, c, - curValue, - loading, + ns, items, + loading, + curValue, valueText, + editorRef, + isEllipsis, + isEditable, + selectItems, + showFormDefaultContent, + onBlur, + onFocus, onSearch, - onOpenChange, onSelect, onRemove, - openPickUpView, - onFocus, - onBlur, + onOpenChange, handleKeyUp, - selectItems, - editorRef, - isEditable, setEditable, - showFormDefaultContent, - renderEmpty, + openPickUpView, + renderListContent, }; }, render() { - const overflowMode = - this.c.editorParams.overflowMode || - this.c.editorParams.overflowmode || - ibiz.config.pickerEditor.overflowMode; - const isEllipsis = overflowMode === 'ellipsis'; - // 编辑态内容 const editContent = [ !this.readonly && ( @@ -463,53 +564,11 @@ export const IBizMPicker = defineComponent({ onFocus={this.onFocus} onBlur={this.onBlur} onKeyup={this.handleKeyUp} - fit-input-width={isEllipsis} + fit-input-width={this.isEllipsis} remote-show-suffix={this.c.model.showTrigger} {...this.$attrs} > - {this.items.map(item => { - return ( - - {{ - default: () => { - if (this.c.acItemProvider) { - const component = resolveComponent( - this.c.acItemProvider.component, - ); - return h(component, { - item, - controller: this.c, - }); - } - const panel = this.c.deACMode?.itemLayoutPanel; - if (panel) { - return ( - - ); - } - return ( - - {item[this.c.textName] != null - ? item[this.c.textName] - : ''} - - ); - }, - }} - - ); - })} - {this.renderEmpty()} + {this.renderListContent()} ), !this.readonly && ( diff --git a/src/editor/data-picker/ibiz-picker/ibiz-picker.scss b/src/editor/data-picker/ibiz-picker/ibiz-picker.scss index 04eb2b34c..e12ddbade 100644 --- a/src/editor/data-picker/ibiz-picker/ibiz-picker.scss +++ b/src/editor/data-picker/ibiz-picker/ibiz-picker.scss @@ -98,8 +98,17 @@ $picker: ( // 界面行为项 @include e(action-item) { + display: flex; + align-items: center; + justify-content: center; color: getCssVar(color, link); - text-align: center; + @include m(caption) { + margin-left: getCssVar(spacing, extra-tight); + } + @include when(disabled) { + color: getCssVar(color, disabled-text); + cursor: not-allowed; + } } @include e(empty) { diff --git a/src/editor/data-picker/ibiz-picker/ibiz-picker.tsx b/src/editor/data-picker/ibiz-picker/ibiz-picker.tsx index 749400cde..cae251cee 100644 --- a/src/editor/data-picker/ibiz-picker/ibiz-picker.tsx +++ b/src/editor/data-picker/ibiz-picker/ibiz-picker.tsx @@ -1,3 +1,4 @@ +/* eslint-disable no-unused-expressions */ import { h, ref, @@ -16,10 +17,7 @@ import { } from '@ibiz-template/vue3-util'; import { isEmpty, isNil } from 'ramda'; import { showTitle } from '@ibiz-template/core'; -import { - IUIActionGroupDetail, - IAppDEUIActionGroupDetail, -} from '@ibiz/model-core'; +import { IAppDEUIActionGroupDetail } from '@ibiz/model-core'; import { PickerEditorController } from '../picker-editor.controller'; import './ibiz-picker.scss'; @@ -34,6 +32,7 @@ import './ibiz-picker.scss'; * @editorparams {"name":"objectnamefield","parameterType":"string","description":"值类型为OBJECT时的对象名称属性"} * @editorparams {"name":"objectvaluefield","parameterType":"string","description":"值类型为OBJECT时的对象值属性"} * @editorparams {"name":"readonly","parameterType":"boolean","defaultvalue":false,"description":"设置编辑器是否为只读态"} + * @editorparams {"name":"actionpostion","parameterType":"'top' | 'bottom'","defaultvalue":"'bottom'","description":"设置AC模式行为组位置,默认在下拉底部"} * @ignoreprops overflowMode */ export const IBizPicker = defineComponent({ @@ -65,6 +64,10 @@ export const IBizPicker = defineComponent({ const isReverse = ref(false); + // 行为位置 + const actionPostion: 'top' | 'bottom' = + c.model.editorParams?.actionpostion || 'bottom'; + // 是否显示表单默认内容 const showFormDefaultContent = computed(() => { if ( @@ -202,14 +205,13 @@ export const IBizPicker = defineComponent({ items.value = res.data as IData[]; isLoaded.value = true; if (cb && cb instanceof Function) { - if (items.value.length) { - cb([...items.value, ...c.actionDetails]); - } else { - const empty = { - srftype: 'empty', - }; - cb([empty, ...c.actionDetails]); - } + const callbackItems: IData[] = items.value.length + ? [...items.value] + : [{ srftype: 'empty' }]; + actionPostion === 'top' + ? callbackItems.unshift(...c.actionDetails) + : callbackItems.push(...c.actionDetails); + cb(callbackItems); } } } @@ -220,17 +222,9 @@ export const IBizPicker = defineComponent({ isShowAll.value = true; setEditable(false); // 回车选中空白 - if (item.srftype === 'empty') { - resetCurValue(); - return; - } - // 回车选中行为项,手动触发 - if (item.detailType === 'DEUIACTION') { - c.onActionClick(item as IUIActionGroupDetail, props.data); - resetCurValue(); - } else { - await handleDataSelect(item); - } + if (item.srftype === 'empty' || item.detailType === 'DEUIACTION') + return resetCurValue(); + await handleDataSelect(item); }; // 清除 @@ -326,22 +320,28 @@ export const IBizPicker = defineComponent({ }); const renderActionItem = (detail: IAppDEUIActionGroupDetail) => { - if (!c.groupActionState[detail.id!].visible) { - return; - } + if (!c.groupActionState[detail.id!].visible) return; return (
c.onActionClick(detail, props.data, event)} - title={showTitle(detail.tooltip)} + onClick={event => { + if (!c.groupActionState[detail.id!].disabled) + c.onActionClick(detail, props.data, event); + }} > {detail.showIcon && detail.sysImage && ( - + )} - {detail.showCaption ? detail.caption : ''} + + {detail.showCaption ? detail.caption : ''} +
); }; @@ -358,25 +358,25 @@ export const IBizPicker = defineComponent({ return { ns, c, + items, curValue, valueText, - items, - openPickUpView, - openLinkView, - onACSelect, - onSearch, editorRef, - onClear, - onFocus, - onBlur, - handleKeyUp, closeCircle, isEditable, isReverse, - setEditable, showFormDefaultContent, - renderActionItem, + onBlur, + onFocus, + onClear, + onSearch, + onACSelect, + handleKeyUp, + setEditable, renderEmpty, + openLinkView, + openPickUpView, + renderActionItem, }; }, render() { @@ -505,21 +505,14 @@ export const IBizPicker = defineComponent({ > {{ default: ({ item }: { item: IData }) => { - if (this.$slots.append) { - return this.$slots.append({}); - } - if (item.srftype === 'empty') { - return this.renderEmpty(); - } - if (item.detailType === 'DEUIACTION') { + if (this.$slots.append) return this.$slots.append({}); + if (item.srftype === 'empty') return this.renderEmpty(); + if (item.detailType === 'DEUIACTION') return this.renderActionItem(item as IAppDEUIActionGroupDetail); - } return itemContent(item); }, suffix: () => { - if (this.c.noButton) { - return; - } + if (this.c.noButton) return; return [ this.c.model.pickupAppViewId ? ( { data: IData, event?: MouseEvent, ): Promise { - if (event) { - event.stopPropagation(); - } const actionId = detail.uiactionId; await UIActionUtil.execAndResolved( actionId!, -- Gitee From b8fbcf4677169f4a38c28fd9bfd1601fd6834dba Mon Sep 17 00:00:00 2001 From: ShineKOT <1917095344@qq.com> Date: Fri, 22 Aug 2025 18:46:11 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=80=89=E6=8B=A9=EF=BC=88=E4=B8=8B=E6=8B=89=E8=A7=86=E5=9B=BE?= =?UTF-8?q?=EF=BC=89=E5=92=8C=E6=95=B0=E6=8D=AE=E9=80=89=E6=8B=A9=EF=BC=88?= =?UTF-8?q?=E5=B5=8C=E5=85=A5=E8=A7=86=E5=9B=BE=EF=BC=89=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=9B=9E=E6=98=BE=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 +- src/control/tree/tree.tsx | 37 ++++--- .../ibiz-picker-embed-view.tsx | 36 +++---- .../ibiz-picker-select-view.tsx | 98 ++++++++++--------- src/view-engine/pickup-data-view.engine.ts | 24 +++++ src/view-engine/pickup-grid-view.engine.ts | 24 +++++ src/view-engine/pickup-tree-view.engine.ts | 80 +++------------ src/view-engine/pickup-view.engine.ts | 12 +++ 8 files changed, 161 insertions(+), 152 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f9063759..8ed9ab7d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,7 @@ - 修复数据选择编辑器OBJECT和OBJECTS抛值问题 - 修复表格和树表格刷新模式异常 - 修复多选视图选择数据异常 - +- 修复数据选择(下拉视图)和数据选择(嵌入视图)数据回显异常 ### Changed - 补充地图初始化设置行政等级参数 diff --git a/src/control/tree/tree.tsx b/src/control/tree/tree.tsx index 478091bbf..ba9efa59b 100644 --- a/src/control/tree/tree.tsx +++ b/src/control/tree/tree.tsx @@ -473,20 +473,21 @@ export const TreeControl = defineComponent({ }); }; - watch( - () => c.state.selectedData, - () => { - if (!treeRef.value) return; - if (c.state.singleSelect) { - treeRef.value.setCurrentKey(c.state.selectedData[0]?._id); - } else { - // el-tree,会把没选中的反选,且不触发check事件 - treeRef.value.setCheckedKeys( - c.state.selectedData.map(item => item._id), - ); - } - }, - ); + // watch( + // () => c.state.selectedData, + // () => { + // if (!treeRef.value) return; + // console.log(`选中数据变更${c.model.id}`, [...c.state.selectedData]); + // if (c.state.singleSelect) { + // treeRef.value.setCurrentKey(c.state.selectedData[0]?._id); + // } else { + // // el-tree,会把没选中的反选,且不触发check事件 + // treeRef.value.setCheckedKeys( + // c.state.selectedData.map(item => item._id), + // ); + // } + // }, + // ); /** * 多选时选中节点变更 @@ -523,10 +524,8 @@ export const TreeControl = defineComponent({ editCurrentNodeText(); } - // 多选的时候设置节点的当前节点 - if (!c.state.singleSelect) { - treeRef.value?.setCurrentKey(nodeData._id); - } + // 设置节点的当前节点 + treeRef.value?.setCurrentKey(nodeData._id); // 导航树节点不配置导航视图的时候,只切换展开状态 if (c.state.navigational) { @@ -537,7 +536,7 @@ export const TreeControl = defineComponent({ } } if (props.isSimple) { - treeRef.value!.setCurrentKey(data?._id || undefined); + treeRef.value!.setCurrentKey(data?._id); } else { c.onTreeNodeClick(nodeData, evt); } diff --git a/src/editor/data-picker/ibiz-picker-embed-view/ibiz-picker-embed-view.tsx b/src/editor/data-picker/ibiz-picker-embed-view/ibiz-picker-embed-view.tsx index ea9f3c230..54d3b4913 100644 --- a/src/editor/data-picker/ibiz-picker-embed-view/ibiz-picker-embed-view.tsx +++ b/src/editor/data-picker/ibiz-picker-embed-view/ibiz-picker-embed-view.tsx @@ -1,21 +1,21 @@ /* eslint-disable prefer-object-spread */ import { - defineComponent, + h, ref, - resolveComponent, watch, - h, computed, + defineComponent, + resolveComponent, } from 'vue'; import { - getDataPickerProps, + useNamespace, getEditorEmits, useFocusAndBlur, - useNamespace, + getDataPickerProps, } from '@ibiz-template/vue3-util'; -import './ibiz-picker-embed-view.scss'; import { EventBase } from '@ibiz-template/runtime'; import { PickerEditorController } from '../picker-editor.controller'; +import './ibiz-picker-embed-view.scss'; /** * 数据选择(嵌入选择视图) @@ -52,20 +52,14 @@ export const IBizPickerEmbedView = defineComponent({ watch( () => props.data, newVal => { - const { context: _context, params: _params } = c.handlePublicParams( - newVal, - c.context, - c.params, - ); - const newContext = Object.assign(c.context.clone(), _context); - const newParams = Object.assign({ ...c.params }, _params); - if ( - JSON.stringify(context.value) !== JSON.stringify(newContext) || - JSON.stringify(params.value) !== JSON.stringify(newParams) - ) { + const { context: tempContext, params: tempParams } = + c.handlePublicParams(newVal, c.context, c.params); + const newContext = Object.assign(c.context.clone(), tempContext); + const newParams = Object.assign({ ...c.params }, tempParams); + if (JSON.stringify(context.value) !== JSON.stringify(newContext)) context.value = newContext; + if (JSON.stringify(params.value) !== JSON.stringify(newParams)) params.value = newParams; - } }, { deep: true, @@ -167,11 +161,11 @@ export const IBizPickerEmbedView = defineComponent({ context, params, editorRef, - singleSelect, - checkStrictly, isShowText, - selectedData, cloneParams, + singleSelect, + selectedData, + checkStrictly, onSelectionChange, }; }, diff --git a/src/editor/data-picker/ibiz-picker-select-view/ibiz-picker-select-view.tsx b/src/editor/data-picker/ibiz-picker-select-view/ibiz-picker-select-view.tsx index d957d5f38..43acacd4f 100644 --- a/src/editor/data-picker/ibiz-picker-select-view/ibiz-picker-select-view.tsx +++ b/src/editor/data-picker/ibiz-picker-select-view/ibiz-picker-select-view.tsx @@ -16,7 +16,7 @@ import { getDataPickerProps, } from '@ibiz-template/vue3-util'; import { clone } from 'ramda'; -import { IModalData, Modal, ViewMode } from '@ibiz-template/runtime'; +import { EventBase, IModalData, Modal, ViewMode } from '@ibiz-template/runtime'; import { PickerEditorController } from '../picker-editor.controller'; import './ibiz-picker-select-view.scss'; @@ -73,10 +73,15 @@ export const IBizPickerSelectView = defineComponent({ const pickViewWidth = ref('auto'); // 视图上下文 - const context: Ref = ref(c.context); + const context: Ref = ref(c.context.clone()); // 视图参数 - const params: Ref = ref(c.params); + const params: Ref = ref({ ...c.params }); + + // 克隆的视图参数 + const cloneParams = computed(() => { + return { ...params.value }; + }); watch( () => props.data, @@ -84,8 +89,12 @@ export const IBizPickerSelectView = defineComponent({ // 转换视图上下文、视图参数 const { context: tempContext, params: tempParams } = c.handlePublicParams(newVal, c.context, c.params); - Object.assign(context.value, tempContext); - Object.assign(params.value, tempParams); + const newContext = Object.assign(c.context.clone(), tempContext); + const newParams = Object.assign({ ...c.params }, tempParams); + if (JSON.stringify(context.value) !== JSON.stringify(newContext)) + context.value = newContext; + if (JSON.stringify(params.value) !== JSON.stringify(newParams)) + params.value = newParams; }, { immediate: true, deep: true }, ); @@ -157,15 +166,12 @@ export const IBizPickerSelectView = defineComponent({ } else { queryValue.value = (newVal as string) || ''; } - if (!props.data || !c.valueItem || !props.data[c.valueItem]) { - if (!isDesignPreview) { - ibiz.log.error('值项异常'); - } + if (!c.valueItem && !isDesignPreview) { + ibiz.log.error('值项异常'); } else { selectedData.value = [ { srfkey: props.data[c.valueItem], srfmajortext: props.value }, ]; - params.value.selecteddata = selectedData.value; } } else { const selectItems: IData[] = []; @@ -191,11 +197,7 @@ export const IBizPickerSelectView = defineComponent({ } }); selectItems.push(...(newVal as IData[])); - } else if ( - !props.data || - !c.valueItem || - !props.data[c.valueItem] - ) { + } else if (!c.valueItem) { ibiz.log.error('值项异常'); } else { const tempValue = props.data[c.valueItem].split(','); @@ -429,10 +431,13 @@ export const IBizPickerSelectView = defineComponent({ }; // 绑定事件 - const onSelectionChange = (event: IModalData) => { + const onSelectionChange = ( + event: EventBase | IModalData, + isClose: boolean = false, + ) => { if (event.data) { onViewDataChange(event.data); - if (singleSelect.value && editorRef.value) { + if (isClose && editorRef.value) { editorRef.value.handleClose(); } } @@ -442,7 +447,7 @@ export const IBizPickerSelectView = defineComponent({ mode: ViewMode.DRAWER, viewUsage: 2, dismiss: (_data: IModalData) => { - onSelectionChange(_data); + onSelectionChange(_data, true); }, }); @@ -507,38 +512,39 @@ export const IBizPickerSelectView = defineComponent({ }; return { - ns, c, - singleSelect, - keySet, + ns, items, - queryValue, + modal, + keySet, + params, visible, - pickViewWidth, context, - params, + showView, editorRef, - onInputChange, - triggerMenu, - onViewDataChange, - onClear, - openLinkView, - onSelectChange, - remoteMethod, - onSelectionChange, - modal, - onFocus, - onBlur, - handleKeyUp, valueText, isEditable, - setEditable, + queryValue, + cloneParams, + selectedData, + singleSelect, + pickViewWidth, showFormDefaultContent, + arrow, + onBlur, + onClear, + onFocus, + triggerMenu, + setEditable, + handleKeyUp, + openLinkView, + remoteMethod, + onInputChange, + onSelectChange, onVisibleChange, - showView, - selectedData, + onViewDataChange, + onSelectionChange, handleDropDownKeyDown, - arrow, }; }, render() { @@ -627,16 +633,14 @@ export const IBizPickerSelectView = defineComponent({ ); }, dropdown: () => { - if (!this.showView) { - return; - } - + if (!this.showView) return; const viewShell = resolveComponent('IBizViewShell'); return ( this.c.pickupView && h(viewShell, { + modal: this.modal, context: this.context, - params: this.params, + params: this.cloneParams, viewId: this.c.pickupView.id, style: { height: `${ @@ -650,8 +654,8 @@ export const IBizPickerSelectView = defineComponent({ singleSelect: this.singleSelect, selectedData: this.selectedData, }, - onSelectionChange: this.onSelectionChange, - modal: this.modal, + onSelectionChange: (event: EventBase) => + this.onSelectionChange(event, this.singleSelect), }) ); }, diff --git a/src/view-engine/pickup-data-view.engine.ts b/src/view-engine/pickup-data-view.engine.ts index d691b584f..d5360dbe1 100644 --- a/src/view-engine/pickup-data-view.engine.ts +++ b/src/view-engine/pickup-data-view.engine.ts @@ -16,6 +16,13 @@ export class PickupDataViewEngine extends DataViewEngine { IPickupDataViewEvent >; + /** + * @description 选中数据 + * @type {IData[]} + * @memberof PickupDataViewEngine + */ + selectData: IData[] = []; + /** * 表格控制器 * @@ -31,6 +38,22 @@ export class PickupDataViewEngine extends DataViewEngine { async onCreated(): Promise { super.onCreated(); this.view.slotProps.dataview.singleSelect = this.view.state.singleSelect; + this.initSelectData(); + } + + /** + * @description 初始化选中数据 + * @protected + * @memberof PickupDataViewEngine + */ + protected initSelectData(): void { + if (this.view.params.selecteddata) { + this.selectData = JSON.parse(this.view.params.selecteddata); + delete this.view.params.selecteddata; + } + if (this.view.state.selectedData) { + this.selectData = [...this.view.state.selectedData]; + } } async onMounted(): Promise { @@ -41,6 +64,7 @@ export class PickupDataViewEngine extends DataViewEngine { this.xdataControl.evt.on('onActive', async event => { this.view.evt.emit('onDataActive', { ...event }); }); + this.setSelectedData(this.selectData); } async call( diff --git a/src/view-engine/pickup-grid-view.engine.ts b/src/view-engine/pickup-grid-view.engine.ts index 3ff7a2b2b..1a27c5c0b 100644 --- a/src/view-engine/pickup-grid-view.engine.ts +++ b/src/view-engine/pickup-grid-view.engine.ts @@ -17,6 +17,13 @@ export class PickupGridViewEngine extends GridViewEngine { IPickupGridViewEvent >; + /** + * @description 选中数据 + * @type {IData[]} + * @memberof PickupGridViewEngine + */ + selectData: IData[] = []; + /** * 表格控制器 * @@ -37,6 +44,22 @@ export class PickupGridViewEngine extends GridViewEngine { } this.view.slotProps.grid.singleSelect = this.view.state.singleSelect; this.view.slotProps.grid.mdctrlActiveMode = model.gridRowActiveMode!; + this.initSelectData(); + } + + /** + * @description 初始化选中数据 + * @protected + * @memberof PickupGridViewEngine + */ + protected initSelectData(): void { + if (this.view.params.selecteddata) { + this.selectData = JSON.parse(this.view.params.selecteddata); + delete this.view.params.selecteddata; + } + if (this.view.state.selectedData) { + this.selectData = [...this.view.state.selectedData]; + } } async onMounted(): Promise { @@ -47,6 +70,7 @@ export class PickupGridViewEngine extends GridViewEngine { this.xdataControl.evt.on('onActive', async event => { this.view.evt.emit('onDataActive', { ...event }); }); + this.setSelectedData(this.selectData); } async call( diff --git a/src/view-engine/pickup-tree-view.engine.ts b/src/view-engine/pickup-tree-view.engine.ts index f6f765995..390c9bc9a 100644 --- a/src/view-engine/pickup-tree-view.engine.ts +++ b/src/view-engine/pickup-tree-view.engine.ts @@ -1,8 +1,8 @@ import { + ViewCallTag, ViewController, IPickupTreeViewState, IPickupTreeViewEvent, - ViewCallTag, IApiPickupTreeViewCall, } from '@ibiz-template/runtime'; import { IAppDETreeView } from '@ibiz/model-core'; @@ -16,21 +16,12 @@ export class PickupTreeViewEngine extends TreeViewEngine { >; /** - * 选中数据 - * + * @description 选中数据 * @type {IData[]} - * @memberof PickupViewEngine + * @memberof PickupTreeViewEngine */ selectData: IData[] = []; - /** - * 通过srfkey选中数据 - * @author lxm - * @date 2024-02-21 09:17:23 - * @type {boolean} - */ - selectBySrfkey: boolean = false; - /** * 创建完成 * @@ -45,45 +36,22 @@ export class PickupTreeViewEngine extends TreeViewEngine { } this.view.slotProps.tree.singleSelect = this.view.state.singleSelect; this.view.slotProps.tree.checkStrictly = this.view.state.checkStrictly; - // 设置回显selectedData - if (this.view.state.selectedData) { - this.selectData = this.view.state.selectedData.map((item: IData) => { - return { - ...item, - _id: item.srfnodeid, - }; - }); - const set = new Set(); - this.selectData.forEach(item => { - if (item.srfnodeid) { - const keys = this.calcExpandKeys(item.srfnodeid); - keys.forEach(key => set.add(key)); - } else { - this.selectBySrfkey = true; - } - }); - this.view.slotProps.tree.defaultExpandedKeys = Array.from(set); - } + this.initSelectData(); } /** - * 根据key计算需要展开的节点标识 - * @author lxm - * @date 2023-11-07 02:42:45 - * @param {string} key - * @return {*} {string[]} + * @description 初始化选中数据 + * @protected + * @memberof PickupTreeViewEngine */ - calcExpandKeys(key: string): string[] { - const expandedKeys: string[] = []; - key.split(':').forEach((item, index) => { - if (index === 0) { - expandedKeys.push(item); - } else { - expandedKeys.push(`${expandedKeys[index - 1]}:${item}`); - } - }); - expandedKeys.pop(); // 删除最后一个 - return expandedKeys; + protected initSelectData(): void { + if (this.view.params.selecteddata) { + this.selectData = JSON.parse(this.view.params.selecteddata); + delete this.view.params.selecteddata; + } + if (this.view.state.selectedData) { + this.selectData = [...this.view.state.selectedData]; + } } /** @@ -95,33 +63,17 @@ export class PickupTreeViewEngine extends TreeViewEngine { */ async onMounted(): Promise { const { model } = this.view; - let forbiddenSelectionChange = false; this.xdataControl.evt.on('onSelectionChange', async event => { - if (forbiddenSelectionChange) { - return; - } this.view.evt.emit('onSelectionChange', { ...event }); }); this.xdataControl.evt.on('onActive', async event => { this.view.evt.emit('onDataActive', { ...event }); }); - this.xdataControl.evt.on('onLoadSuccess', () => { - forbiddenSelectionChange = true; - let selectData = this.selectData; - if (this.selectBySrfkey) { - const srfkeys = this.selectData.map(item => item.srfkey); - selectData = this.tree.state.items.filter(item => { - return srfkeys.includes(item.srfkey); - }); - } - this.xdataControl.setSelection(selectData); - forbiddenSelectionChange = false; - }); - // 默认加载 if (!this.view.state.noLoadDefault && model.loadDefault) { this.load(); } + this.setSelectedData(this.selectData); } async call( diff --git a/src/view-engine/pickup-view.engine.ts b/src/view-engine/pickup-view.engine.ts index 7ead54495..629290934 100644 --- a/src/view-engine/pickup-view.engine.ts +++ b/src/view-engine/pickup-view.engine.ts @@ -53,10 +53,22 @@ export class PickupViewEngine extends ViewEngineBase { await super.onCreated(); const { childNames } = this.view; childNames.push('pickupviewpanel'); + this.initSelectData(); + } + + /** + * @description 初始化选中数据 + * @protected + * @memberof PickupViewEngine + */ + protected initSelectData(): void { if (this.view.params.selecteddata) { this.selectData = JSON.parse(this.view.params.selecteddata); delete this.view.params.selecteddata; } + if (this.view.state.selectedData) { + this.selectData = [...this.view.state.selectedData]; + } } /** -- Gitee From a62e61c7a09843da43c6a10931df9dfede46e20d Mon Sep 17 00:00:00 2001 From: ShineKOT <1917095344@qq.com> Date: Fri, 22 Aug 2025 19:12:10 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/control/tree/tree.tsx | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/control/tree/tree.tsx b/src/control/tree/tree.tsx index ba9efa59b..23e9a54a1 100644 --- a/src/control/tree/tree.tsx +++ b/src/control/tree/tree.tsx @@ -473,22 +473,6 @@ export const TreeControl = defineComponent({ }); }; - // watch( - // () => c.state.selectedData, - // () => { - // if (!treeRef.value) return; - // console.log(`选中数据变更${c.model.id}`, [...c.state.selectedData]); - // if (c.state.singleSelect) { - // treeRef.value.setCurrentKey(c.state.selectedData[0]?._id); - // } else { - // // el-tree,会把没选中的反选,且不触发check事件 - // treeRef.value.setCheckedKeys( - // c.state.selectedData.map(item => item._id), - // ); - // } - // }, - // ); - /** * 多选时选中节点变更 */ -- Gitee