From ef127d12e05f23665a328cfd076d2a4b1310d664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Tue, 22 Jul 2025 14:45:07 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E8=A1=A8=E5=8D=95=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E6=97=B6=E5=B7=A5=E5=85=B7=E7=AE=B1=E6=96=B0=E5=A2=9E=E5=A4=9A?= =?UTF-8?q?=E8=AF=AD=E8=BE=93=E5=85=A5=E6=A1=86=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/components/types/toolbox/pc-toolbox.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/designer/src/components/types/toolbox/pc-toolbox.json b/packages/designer/src/components/types/toolbox/pc-toolbox.json index fe406f53b40..8eb50499ca9 100644 --- a/packages/designer/src/components/types/toolbox/pc-toolbox.json +++ b/packages/designer/src/components/types/toolbox/pc-toolbox.json @@ -14,7 +14,7 @@ "type": "language-textbox", "name": "多语输入框", "category": "input", - "hideInControlBox": true + "hideInControlBox": false }, { "id": "MultiTextBox", -- Gitee From 185c4144014027a14e47ffa395b237e24167bc82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Wed, 23 Jul 2025 19:35:01 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20lookup=E4=B8=8B=E6=8B=89=E5=B8=AE?= =?UTF-8?q?=E5=8A=A9=E4=BF=AE=E5=A4=8D=E5=B7=B2=E7=9F=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../button-edit/src/composition/use-popup.ts | 5 +-- .../components/popup-container.component.tsx | 10 ++++-- .../src/components/popup-container.props.ts | 5 ++- .../lookup/src/composition/use-datagrid.tsx | 1 + .../lookup/src/composition/use-dialog.ts | 16 +++++++--- .../lookup/src/composition/use-popup.tsx | 31 ++++++++++++++----- .../lookup/src/composition/use-treegrid.tsx | 1 + .../lookup/src/composition/use-treenode.ts | 2 ++ .../lookup/src/lookup.component.tsx | 14 +++++++-- .../property-config/lookup.property-config.ts | 8 ++--- 10 files changed, 69 insertions(+), 24 deletions(-) diff --git a/packages/ui-vue/components/button-edit/src/composition/use-popup.ts b/packages/ui-vue/components/button-edit/src/composition/use-popup.ts index 5b4b55456cd..65ac09838f7 100644 --- a/packages/ui-vue/components/button-edit/src/composition/use-popup.ts +++ b/packages/ui-vue/components/button-edit/src/composition/use-popup.ts @@ -26,8 +26,9 @@ export function usePopup( if (window[popoverInstancesListKey]) { const popoverInstances = window[popoverInstancesListKey]; document.querySelectorAll('.f-button-edit,.v-popover').forEach((element) => { - if (popoverInstances.get(element) && element !== buttonEditRef.value) { - popoverInstances.get(element).hide(); + const popoverInstance = popoverInstances.get(element); + if (popoverInstance && element !== buttonEditRef.value && !buttonEditRef.value.closest('.popover-fitcontent')) { + popoverInstance.hide(); } }); } diff --git a/packages/ui-vue/components/lookup/src/components/popup-container.component.tsx b/packages/ui-vue/components/lookup/src/components/popup-container.component.tsx index 9c9d5807636..0c27ec26307 100644 --- a/packages/ui-vue/components/lookup/src/components/popup-container.component.tsx +++ b/packages/ui-vue/components/lookup/src/components/popup-container.component.tsx @@ -5,16 +5,19 @@ import { useTreegrid } from "../composition/use-treegrid"; import { useDatagrid } from "../composition/use-datagrid"; import { LookupHttpResult } from "../composition/types"; import { LOOKUP_TREEROW_OPTIONS, useTreeRowOptions } from "../composition/use-treegrid-row-options"; +import { LOOKUP_LOCALES, LookupLocaleData } from "../composition/use-locales"; +import { useSearchbar } from "../composition/use-search-bar"; export default defineComponent({ name: 'FLookupPopupContainer', props: lookupPopupContainerProps, - emits: [], + emits: ['selectItemsChanged'], setup(props: LookupPopupContainerProps, context) { + const lookupLocales = props.locales as LookupLocaleData; const { lookupStates, getIdQueryParams } = props.useHttpComposition; - const { lookupState, navigationState, queryState, lookupOptions} = lookupStates; const { isTreeList } = useCheckProps(props, lookupStates); + const { renderSearchBar } = useSearchbar(props, false, lookupStates, lookupLocales); const popupContainerStyle = computed(() => { return { @@ -83,7 +86,8 @@ export default defineComponent({ return () => { - return
+ return
+ {lookupOptions.multiSelect && renderSearchBar()} {renderDataComponent.value()} {/*
*/}
; diff --git a/packages/ui-vue/components/lookup/src/components/popup-container.props.ts b/packages/ui-vue/components/lookup/src/components/popup-container.props.ts index 965c60f3be2..a79511f6375 100644 --- a/packages/ui-vue/components/lookup/src/components/popup-container.props.ts +++ b/packages/ui-vue/components/lookup/src/components/popup-container.props.ts @@ -39,6 +39,9 @@ export const lookupPopupContainerProps = { disable: true } }, - cascadeStatus: { type: String, default: 'both' } + cascadeStatus: { type: String, default: 'both' }, + enableSearchBar: { type: Boolean, default: true }, + searchAnyField: { type: Boolean, default: true }, + locales: { type: Object, default: {} } }; export type LookupPopupContainerProps = ExtractPropTypes; diff --git a/packages/ui-vue/components/lookup/src/composition/use-datagrid.tsx b/packages/ui-vue/components/lookup/src/composition/use-datagrid.tsx index 53beabb9326..4c68b1ec5ad 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-datagrid.tsx +++ b/packages/ui-vue/components/lookup/src/composition/use-datagrid.tsx @@ -112,6 +112,7 @@ export function useDatagrid(props: LookupProps, context: SetupContext, navigatio } updateSelections(items); + context.emit("selectionsChanged", { items }); } function onUnSelectItem(items: any) { diff --git a/packages/ui-vue/components/lookup/src/composition/use-dialog.ts b/packages/ui-vue/components/lookup/src/composition/use-dialog.ts index 088bb9144e3..17b4ca4c8ff 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-dialog.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-dialog.ts @@ -49,7 +49,7 @@ export function useDialog( const NOTIFY_OPTIONS = { position: 'top-center' as const }; - async function updateModelValue() { + const setModelAndIdValue = () => { const displayText = selectedItems.value.map((item: any) => { return resolveField(item, lookupOptions.textField); }).join(props.separator); @@ -63,12 +63,18 @@ export function useDialog( context.emit('update:modelValue', displayText); context.emit('update:idValue', idValues); + }; + + const runDictPickedAsync = async () => { const mappingInfo = { items: selectedItems.value, mappingFields: lookupOptions.mappingFields }; context.emit('update:dataMapping', mappingInfo); - useContext(props, mappingInfo); - return await dictPicked(mappingInfo); + }; + + async function updateModelValue() { + setModelAndIdValue(); + return await runDictPickedAsync(); } function cancelDialog() { @@ -289,6 +295,8 @@ export function useDialog( updateModelValue, cancelDialog, submitDialog, - destroyed + destroyed, + setModelAndIdValue, + runDictPickedAsync }; } diff --git a/packages/ui-vue/components/lookup/src/composition/use-popup.tsx b/packages/ui-vue/components/lookup/src/composition/use-popup.tsx index eab556efd1c..0de0f25b413 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-popup.tsx +++ b/packages/ui-vue/components/lookup/src/composition/use-popup.tsx @@ -7,7 +7,8 @@ import { LOOKUP_USER_DATA_SERVICE } from "./use-user-data"; import { LOOKUP_TREEROW_OPTIONS, useTreeRowOptions } from "./use-treegrid-row-options"; export function usePopup(props: LookupProps, context, elementRef: Ref, { - useHttpComposition, selectionsManager, userDataService, updateModelValue + useHttpComposition, selectionsManager, userDataService, updateModelValue, lookupLocales, destroyed, + setModelAndIdValue, runDictPickedAsync }) { provide(LOOKUP_USER_DATA_SERVICE, userDataService); @@ -18,6 +19,7 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { const treeRowOptions = useTreeRowOptions(lookupOptions, false); provide(LOOKUP_TREEROW_OPTIONS, treeRowOptions); + const {idValues} = useHttpComposition; const isPopuped = computed(() => { const popoverInstance = elementRef.value?.popoverRef; @@ -34,10 +36,8 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { if (props.openType === 'Popup') { watch(() => selectedItems.value, (newValue) => { if (isPopuped.value) { - if (!props.multiSelect){ - hidePopup(); - } else { - updateModelValue(); + if (props.multiSelect){ + setModelAndIdValue(); } } }); @@ -55,10 +55,20 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { return elementRef.value?.popoverRef; }); - function onHidePopup() { - updateModelValue(); + async function onHidePopup() { + // const selectedIds = selectedItems.value.map((item: any) => { + // return item[lookupOptions.idField]; + // }).join(props.separator); + + if (!lookupOptions.multiSelect) { + await updateModelValue(); + } else { + await runDictPickedAsync(); + } + isPopuped.value && hidePopup(); queryState.value = ''; + destroyed(); } function showPopup() { @@ -67,13 +77,20 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { } } + function onSelectionsChanged() { + if (!lookupOptions.multiSelect) { + hidePopup(); + } + } function renderPopup() { const { width, height } = getPopupSize(); return ; } diff --git a/packages/ui-vue/components/lookup/src/composition/use-treegrid.tsx b/packages/ui-vue/components/lookup/src/composition/use-treegrid.tsx index 6e4391a2f16..5e0b1d7e883 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-treegrid.tsx +++ b/packages/ui-vue/components/lookup/src/composition/use-treegrid.tsx @@ -80,6 +80,7 @@ export function useTreegrid(props: LookupProps, context: SetupContext) { function onSelectionChange(items: any[]) { selectTreeNodes(items); + context.emit("selectionsChanged", { items }); } function onUnSelectItem(item: VisualData) { diff --git a/packages/ui-vue/components/lookup/src/composition/use-treenode.ts b/packages/ui-vue/components/lookup/src/composition/use-treenode.ts index bd11b484aa5..6afd3024cd2 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-treenode.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-treenode.ts @@ -177,6 +177,7 @@ export function useTreeNode(lookupStates: LookupStates, useCheckPropsComposition gridRef.addChildrenToNode(children, parentId); + /* nextTick(() => { const itemIds = lookupStates.selectionState.value?.map(item => item[lookupOptions.idField]) ?? []; const selectedIds = children @@ -185,6 +186,7 @@ export function useTreeNode(lookupStates: LookupStates, useCheckPropsComposition selectedIds.length && gridRef.selectItemByIds(selectedIds); }); + */ } diff --git a/packages/ui-vue/components/lookup/src/lookup.component.tsx b/packages/ui-vue/components/lookup/src/lookup.component.tsx index 9c351b767e7..2dd3f43f9e8 100644 --- a/packages/ui-vue/components/lookup/src/lookup.component.tsx +++ b/packages/ui-vue/components/lookup/src/lookup.component.tsx @@ -69,6 +69,10 @@ export default defineComponent({ return props.showSelections && lookupOptions.multiSelect; }); + const editable = computed(() => { + return props.editable && (openType.value === 'Modal' || !lookupOptions.multiSelect); + }); + const showIncludeChildNodes = computed(() => { return props.showIncludeChildNodes && props.showNavigation && !lookupOptions.navTreeToList; @@ -77,7 +81,10 @@ export default defineComponent({ const selectionsManager = useSelections(props, useHttpComposition.lookupStates); const { dictPicked } = useLookupCallBack(props); - const { modalOptions, beforeOpenDialog, dialogSize, customData: customQueryData, updateModelValue, cancelDialog, submitDialog, destroyed } = useDialog(props, context as any, selectionState, { + const { modalOptions, beforeOpenDialog, dialogSize, customData: customQueryData, + updateModelValue, cancelDialog, submitDialog, destroyed, + setModelAndIdValue, runDictPickedAsync + } = useDialog(props, context as any, selectionState, { dictPicked, modelValue, buttonEditInstance: elementRef, userDataService, @@ -85,7 +92,8 @@ export default defineComponent({ lookupLocales }); const usePopupComposition = usePopup(props, context, elementRef, { - useHttpComposition, selectionsManager, userDataService, updateModelValue + useHttpComposition, selectionsManager, userDataService, updateModelValue, lookupLocales, destroyed, + setModelAndIdValue, runDictPickedAsync }); const { renderPopup, showPopup, isPopuped } = usePopupComposition; @@ -257,7 +265,7 @@ export default defineComponent({ v-model={modelValue.value} disable={props.disable} readonly={props.readonly} - editable={props.editable} + editable={editable.value} inputType={"text"} enableClear={props.enableClear} buttonContent={buttonIcon.value} 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 84ddc2678ba..d1e03ae3d20 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 @@ -568,7 +568,7 @@ export class LookupPropertyConfig extends InputBaseProperty { textField: 'text', idField: 'value' }, - visible: false + visible: true }, title: { description: "帮助标题", @@ -817,21 +817,21 @@ export class LookupPropertyConfig extends InputBaseProperty { refreshPanelAfterChanged: true, title: "启用级联选择", type: "boolean", - visible: false // this.isTree(editorOptions) && !!editorOptions.multiSelect + visible: this.isTree(editorOptions) && !!editorOptions.multiSelect }, showCascadeControl: { description: "显示级联选择控件", $converter: lookupDefaultConverter, title: "显示级联选择控件", type: "boolean", - visible: false // !!editorOptions.enableCascade && this.isTree(editorOptions) + visible: !!editorOptions.enableCascade && this.isTree(editorOptions) }, cascadeValue: { description: "级联选择默认状态", $converter: lookupDefaultConverter, title: "级联状态", type: "string", - visible: false, // !!editorOptions.enableCascade && this.isTree(editorOptions), + visible: !!editorOptions.enableCascade && this.isTree(editorOptions), editor: { ...this.comboListEditor, data: cascadeItems, -- Gitee