From bd081d03c76710f688ceef5bb4104c18d754670f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Mon, 25 Aug 2025 16:32:59 +0800 Subject: [PATCH 01/79] =?UTF-8?q?feature:=20lookup=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E4=BB=BB=E6=84=8F=E8=BE=93=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lookup/src/composition/use-dialog.ts | 4 +++- .../lookup/src/composition/use-freeinput.ts | 5 ++++- .../lookup/src/composition/use-http.ts | 18 ++++++++++++++++-- .../lookup/src/composition/use-input-change.ts | 8 ++------ .../components/lookup/src/lookup.component.tsx | 10 +++++++++- .../property-config/lookup.property-config.ts | 4 ++-- 6 files changed, 36 insertions(+), 13 deletions(-) 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 17b4ca4c8f..fb1eed8d9c 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-dialog.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-dialog.ts @@ -198,7 +198,9 @@ export function useDialog( if (emitParams.type === CloseType.cancel || emitParams.type === CloseType.esc) { // 还原 - modelValue.value = props.modelValue; + if (!props.allowFreeInput) { + modelValue.value = props.modelValue; + } } // 保存用户数据 diff --git a/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts b/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts index 3e6042a1de..0ab20d643d 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts @@ -4,9 +4,12 @@ export function useFreeInput(props: any, context: any, inputValue: string, looku if (!props.editable) { return; } + + const clearParams = { items: null, mappingFields: lookupOptions.mappingFields }; + context.emit('clear', clearParams); context.emit('update:modelValue', inputValue); context.emit('update:idValue', ''); - const clearParams = {mappingFields: lookupOptions.mappingFields}; + // const clearParams = {mappingFields: lookupOptions.mappingFields}; useContext(props, clearParams); } diff --git a/packages/ui-vue/components/lookup/src/composition/use-http.ts b/packages/ui-vue/components/lookup/src/composition/use-http.ts index c455bdd2d4..27c5ebd401 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-http.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-http.ts @@ -162,9 +162,23 @@ export function useHttp(props: LookupProps, context: any): UseHttpComposition { searchParam.category = 'navsearch'; } - if (!props.enableMultiFieldSearch && searchParam.searchField === '*') { + if (!props.enableMultiFieldSearch) { + if (isNavigation) { + searchParam.searchType = 'like'; + } + + const searchFieldConditon = searchParam.searchType ==='equal' && searchParam.searchValue ? [{ + filterField: searchParam.searchField, + value: searchParam.searchValue, + lbracket: '', + rbracket: '', + relation: FilterRelation.And, + compare: Compare.Equal, + }] : []; + const searchFields = isNavigation ? navSearchFieldItems.value : searchFieldItems.value; - const conditions = buildConditionsWhenSearchAnyFields(searchFields, value, searchType); + const conditions = searchParam.searchField === '*'? buildConditionsWhenSearchAnyFields(searchFields, value, searchType): searchFieldConditon; + if (conditions && conditions.length) { if (isNavigation) { navSearchConditions = conditions; diff --git a/packages/ui-vue/components/lookup/src/composition/use-input-change.ts b/packages/ui-vue/components/lookup/src/composition/use-input-change.ts index 0b84c531b7..02ec764848 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-input-change.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-input-change.ts @@ -22,8 +22,8 @@ export function useInputChange(props: LookupProps, context: any, options: Lookup const changeOnBlur = computed(() => props.textChangeType === 'blur' || props.textChangeType === 'any'); const changeOnEnter = computed(() => props.textChangeType === 'enter' || props.textChangeType === 'any'); - const {beforeOpenDialog, updateModelValue, selectedItems, openDialog, lookupOptions, useHttpComposition, isPopuped} = options; - const {updateSearchFieldTitle} = useHttpComposition; + const { beforeOpenDialog, updateModelValue, selectedItems, openDialog, lookupOptions, useHttpComposition, isPopuped } = options; + const { updateSearchFieldTitle } = useHttpComposition; const { lookupState, queryState, searchValueChanged } = useHttpComposition.lookupStates; const isClear = ref(false); @@ -34,10 +34,6 @@ export function useInputChange(props: LookupProps, context: any, options: Lookup return false; } - if (searchValueChanged.value) { - queryState.value = text; - } - return searchValueChanged.value; } diff --git a/packages/ui-vue/components/lookup/src/lookup.component.tsx b/packages/ui-vue/components/lookup/src/lookup.component.tsx index 55372a5d76..fa3df2bb27 100644 --- a/packages/ui-vue/components/lookup/src/lookup.component.tsx +++ b/packages/ui-vue/components/lookup/src/lookup.component.tsx @@ -62,7 +62,7 @@ export default defineComponent({ }); const lookupLocales = useLookupLocales(props); const useHttpComposition = useHttp(props, context); - const { lookupOptions, selectionState, searchValueChanged } = useHttpComposition.lookupStates; + const { lookupOptions, selectionState, searchValueChanged, queryState } = useHttpComposition.lookupStates; const userDataService = useUserData(props, useHttpComposition); const showSelections = computed(() => { @@ -239,6 +239,14 @@ export default defineComponent({ searchText = searchText.trim(); } searchValueChanged.value = $event.target['_value'] !== searchText; + if (props.allowFreeInput) { + updateIdValue(''); + } else { + if (searchValueChanged.value) { + queryState.value = searchText; + } + } + if (openType.value === 'Popup' && searchValueChanged.value) { handleChangeDebounce($event); } 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 08bed10590..2fc1e4891a 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 @@ -70,8 +70,8 @@ export class LookupPropertyConfig extends InputBaseProperty { treeConfig, dialog, pager, - expressions, - searchConfig + searchConfig, + expressions }; if (propertyData.type === 'form-group') { -- Gitee From a1e0194895b64082f8852cd50ce93ea367f50acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Mon, 25 Aug 2025 16:48:17 +0800 Subject: [PATCH 02/79] =?UTF-8?q?fix:=20loading=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=9C=A8=E5=B8=83=E5=B1=80=E5=AE=B9=E5=99=A8=E5=86=85=E5=B1=95?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui-vue/components/loading/src/loading.service.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ui-vue/components/loading/src/loading.service.tsx b/packages/ui-vue/components/loading/src/loading.service.tsx index 565d5b3833..eb0e91562e 100644 --- a/packages/ui-vue/components/loading/src/loading.service.tsx +++ b/packages/ui-vue/components/loading/src/loading.service.tsx @@ -86,8 +86,8 @@ function createInstanceId() { export default class LoadingService { static show(config?: LoadingProps): Ref> { - const mergedConfig = config ? { ...DefaultLoadingProps, ...config } : { ...DefaultLoadingProps }; - const newConfig = { ...mergedConfig, isActive: true, target: document.body, targetPosition: '' }; + const mergedConfig = { ...DefaultLoadingProps, isActive: true, target: document.body, targetPosition: ''}; + const newConfig = { ...mergedConfig, ...config }; return initInstance(newConfig); } -- Gitee From 00d8478a0b1f9b963b7a83e677ce93307e412ef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Mon, 25 Aug 2025 19:33:43 +0800 Subject: [PATCH 03/79] =?UTF-8?q?fix:=20=E5=88=97=E8=A1=A8Lookup=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E6=94=AF=E6=8C=81=E4=BB=BB=E6=84=8F=E8=BE=93=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui-vue/components/lookup/src/composition/use-context.ts | 2 +- .../ui-vue/components/lookup/src/composition/use-freeinput.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ui-vue/components/lookup/src/composition/use-context.ts b/packages/ui-vue/components/lookup/src/composition/use-context.ts index a22fd73cb3..cae7006e44 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-context.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-context.ts @@ -1,4 +1,4 @@ -export function useContext(props: any, params?: { items?: any, mappingFields: any}) { +export function useContext(props: any, params?: { items?: any, mappingFields: any, isFreeInput?: boolean }) { if (props.context) { if (!params && props.context.editor) { for(const key in props.context.editor) { diff --git a/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts b/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts index 0ab20d643d..8c06852f9c 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts @@ -5,7 +5,7 @@ export function useFreeInput(props: any, context: any, inputValue: string, looku return; } - const clearParams = { items: null, mappingFields: lookupOptions.mappingFields }; + const clearParams = { items: null, mappingFields: lookupOptions.mappingFields, isFreeInput: true }; context.emit('clear', clearParams); context.emit('update:modelValue', inputValue); context.emit('update:idValue', ''); -- Gitee From 8b09fbc8fcaacceaa79cb507dfd808bdf4a70bf0 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, 26 Aug 2025 10:27:30 +0800 Subject: [PATCH 04/79] =?UTF-8?q?fix:=20=E6=B6=88=E6=81=AF=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E5=A4=9A=E8=AF=AD=E8=B5=84=E6=BA=90=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/message-box/src/composition/use-feedback.ts | 5 +++-- .../ui-vue/components/message-box/src/locales/ui/en.json | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/ui-vue/components/message-box/src/composition/use-feedback.ts b/packages/ui-vue/components/message-box/src/composition/use-feedback.ts index 8430e6c62f..3072d4e491 100644 --- a/packages/ui-vue/components/message-box/src/composition/use-feedback.ts +++ b/packages/ui-vue/components/message-box/src/composition/use-feedback.ts @@ -10,7 +10,7 @@ export function useFeedfack(): UseFeedback { position: 'absolute', left: '50%', top: '50%', - width: '100px', + 'min-width': '100px', height: '40px', background: '#303C53', 'line-height': '40px', @@ -20,7 +20,8 @@ export function useFeedfack(): UseFeedback { 'border-radius': '10px', 'box-shadow': '0px 2px 8px 0px', color: '#fff', - transition: 'all .3s ease' + transition: 'all .3s ease', + padding: '0 10px' } as Record; styleObject.opacity = toShowFeedback.value ? '0.8' : '0'; styleObject.display = toShowFeedback.value ? '' : 'none'; diff --git a/packages/ui-vue/components/message-box/src/locales/ui/en.json b/packages/ui-vue/components/message-box/src/locales/ui/en.json index 853a333bdd..0dfb661a55 100644 --- a/packages/ui-vue/components/message-box/src/locales/ui/en.json +++ b/packages/ui-vue/components/message-box/src/locales/ui/en.json @@ -27,8 +27,8 @@ "happend": "Happened Time", "detail": "Detail", "copy": "Copy Details", - "copySuccess": "Copy Succeeded!", - "copyFailed": "Replication Failed!", + "copySuccess": "Copy Successful.", + "copyFailed": "Replication Failed.", "roger": "OK" } } -- Gitee From 7c95860c4c65bf3446a57c0c15bc2dd0cb84db26 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, 26 Aug 2025 10:29:22 +0800 Subject: [PATCH 05/79] =?UTF-8?q?fix:=20=E6=B6=88=E6=81=AF=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E5=A4=9A=E8=AF=AD=E8=B5=84=E6=BA=90=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui-vue/components/message-box/src/locales/ui/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui-vue/components/message-box/src/locales/ui/en.json b/packages/ui-vue/components/message-box/src/locales/ui/en.json index 0dfb661a55..ba35ac8b47 100644 --- a/packages/ui-vue/components/message-box/src/locales/ui/en.json +++ b/packages/ui-vue/components/message-box/src/locales/ui/en.json @@ -28,7 +28,7 @@ "detail": "Detail", "copy": "Copy Details", "copySuccess": "Copy Successful.", - "copyFailed": "Replication Failed.", + "copyFailed": "Copy Failed.", "roger": "OK" } } -- Gitee From ade820380a0f492cbc7ceb525d36d870fc9751e0 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, 26 Aug 2025 10:54:23 +0800 Subject: [PATCH 06/79] =?UTF-8?q?fix:=20=E6=97=A5=E6=9C=9F=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=A0=B7=E5=BC=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../date-picker/src/components/calendar/calendar.component.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui-vue/components/date-picker/src/components/calendar/calendar.component.tsx b/packages/ui-vue/components/date-picker/src/components/calendar/calendar.component.tsx index 7a8875ca97..68ca064511 100644 --- a/packages/ui-vue/components/date-picker/src/components/calendar/calendar.component.tsx +++ b/packages/ui-vue/components/date-picker/src/components/calendar/calendar.component.tsx @@ -206,7 +206,7 @@ export default defineComponent({ {showWeekNumber.value && - + {weekTitle.value} } -- Gitee From 2e027842469cc448dcbe51fb068b3a6796bc7a9d 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, 26 Aug 2025 15:51:55 +0800 Subject: [PATCH 07/79] =?UTF-8?q?fix:=20=E5=88=97=E8=A1=A8Lookup=E4=BA=A4?= =?UTF-8?q?=E4=BA=92=E4=BA=8B=E4=BB=B6=E5=8A=A0=E5=85=A5=E7=A9=BA=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/property-config/data-grid-column.property-config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui-vue/components/data-grid/src/property-config/data-grid-column.property-config.ts b/packages/ui-vue/components/data-grid/src/property-config/data-grid-column.property-config.ts index 4eba1e3cb1..8585e0bb73 100644 --- a/packages/ui-vue/components/data-grid/src/property-config/data-grid-column.property-config.ts +++ b/packages/ui-vue/components/data-grid/src/property-config/data-grid-column.property-config.ts @@ -130,7 +130,7 @@ export class DataGriColumnProperty extends BaseControlProperty { ]; // 列编辑器事件 - if (propertyData.editor.type === 'lookup') { + if (propertyData?.editor?.type === 'lookup') { events = [...events, ...LookupEvents]; if (propertyData.editor.openType === 'Popup') { events = events.filter(item => item.label !== 'beforeSelectData'); -- Gitee From 27f902ebdd1bfb64aba807b0a777e61a39f15b13 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, 27 Aug 2025 09:13:07 +0800 Subject: [PATCH 08/79] =?UTF-8?q?feature:=20=E8=AE=BE=E8=AE=A1=E6=97=B6?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/form-designer/form-designer.component.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/designer/src/components/components/form-designer/form-designer.component.tsx b/packages/designer/src/components/components/form-designer/form-designer.component.tsx index cd493444e6..048c845bbd 100644 --- a/packages/designer/src/components/components/form-designer/form-designer.component.tsx +++ b/packages/designer/src/components/components/form-designer/form-designer.component.tsx @@ -342,8 +342,8 @@ export default defineComponent({ class={formDesignerViewClass.value}>可视化设计器
onChangeDesignerView('formDesignerCode')} class={formDesignerCodeViewClass.value}>设计时代码
- {/*
onChangeDesignerView('customClassEditor')} - class={customClassEditorClass.value}>自定义样式
*/} +
onChangeDesignerView('customClassEditor')} + class={customClassEditorClass.value}>自定义样式
-- Gitee From 9a653e11aa29c79821a66c451463c505a49fa107 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, 27 Aug 2025 10:31:58 +0800 Subject: [PATCH 09/79] =?UTF-8?q?fix:=20=E6=97=A5=E6=9C=9F=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E8=AE=BE=E8=AE=A1=E6=97=B6=E9=85=8D=E7=BD=AE=E5=90=AF?= =?UTF-8?q?=E7=94=A8=E6=B8=85=E7=A9=BA=E6=8C=89=E9=92=AE=EF=BC=9B=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E7=BB=84=E4=BB=B6=E8=AE=BE=E8=AE=A1=E6=97=B6=E5=90=AF?= =?UTF-8?q?=E7=94=A8=E5=A4=A7=E6=95=B0=E5=AD=97=E6=A0=B9=E6=8D=AE=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E4=B8=AD=E7=9A=84=E9=85=8D=E7=BD=AE=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=88=96=E9=9A=90=E8=97=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/property-config/date-picker.property-config.ts | 5 +++++ .../src/property-config/number-spinner.property-config.ts | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/packages/ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts b/packages/ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts index 5b8f4b3514..20d70efd8c 100644 --- a/packages/ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts +++ b/packages/ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts @@ -56,6 +56,11 @@ export class DatePickerProperty extends InputBaseProperty { } return this.getComponentConfig(propertyData, { type: "date-picker" }, { + enableClear: { + description: "是否显示清除按钮", + title: "启用清除", + type: "boolean", + }, selectMode:{ description: "", title: "显示类型", diff --git a/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts b/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts index df23253fc3..10932f2e4d 100644 --- a/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts +++ b/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts @@ -10,12 +10,15 @@ export class NumberSpinnerProperty extends InputBaseProperty { getEditorProperties(propertyData: any) { let maxPrecision; + let isBigNumber = false; if (propertyData?.binding?.type === 'Form') { const fieldInfo = this.schemaService.getFieldByIDAndVMID(propertyData.binding.field, this.viewModelId); if (fieldInfo?.schemaField?.type) { maxPrecision = fieldInfo.schemaField.type.precision; + isBigNumber = fieldInfo.schemaField.type.name === 'BigNumber'; } } + const editorProperties = this.getComponentConfig(propertyData, { "type": "number-spinner" }, { precision: { description: "", @@ -85,6 +88,7 @@ export class NumberSpinnerProperty extends InputBaseProperty { description: "", title: "启用大数字", type: "boolean", + visible: isBigNumber }, showZero: { description: "", -- Gitee From c5fd952342c7e2b4e3aba843ee9dc357fc82733f 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, 27 Aug 2025 16:37:16 +0800 Subject: [PATCH 10/79] =?UTF-8?q?fix:=20=E8=A1=A8=E5=8D=95=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E6=97=B6=E6=94=AF=E6=8C=81=E8=AE=BE=E7=BD=AE=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/renderer/src/composition/index.ts | 1 + .../src/composition/use-custom-css.ts | 22 +++++++++++++++++-- packages/renderer/src/page.vue | 5 ++--- .../number-spinner.property-config.ts | 1 + 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/packages/renderer/src/composition/index.ts b/packages/renderer/src/composition/index.ts index 1ebf743266..1169397fee 100644 --- a/packages/renderer/src/composition/index.ts +++ b/packages/renderer/src/composition/index.ts @@ -24,3 +24,4 @@ export * from './use-html-template-transformer'; export * from './use-component-config-dependency-resolver'; export * from './use-custom-component-renders'; export * from './use-translate'; +export * from './use-custom-css'; diff --git a/packages/renderer/src/composition/use-custom-css.ts b/packages/renderer/src/composition/use-custom-css.ts index 6d0d9f268f..c26c9fcbd6 100644 --- a/packages/renderer/src/composition/use-custom-css.ts +++ b/packages/renderer/src/composition/use-custom-css.ts @@ -1,6 +1,6 @@ import { Ref } from "vue"; -export function useCustomCss(metadataRef: Ref) { +export function useCustomCss(metadataRef: Ref, isChildComponent: boolean = false) { const hasCustomStyleContent = () => { const {customClass} = metadataRef.value.form.content.module; if (customClass) { @@ -12,6 +12,15 @@ export function useCustomCss(metadataRef: Ref) { return false; }; + const getHrefParam = (key: string) => { + const queryParam = window.location.href.substring(window.location.href.indexOf('?') + 1); + const queryVars = queryParam.split('&'); + for (const queryVar of queryVars) { + const pair = queryVar.split('='); + if (pair[0] === key) { return pair[1]; } + } + }; + function customStyleFilePath() { if (!hasCustomStyleContent()) { return ''; @@ -22,7 +31,16 @@ export function useCustomCss(metadataRef: Ref) { if (replativePath) { const formCode = code.toLowerCase(); const paths = replativePath.split('/'); - return `${paths[0]}/${paths[1]}/web/${projectName}/${formCode}/${formCode}.css`; + + const dim1 = getHrefParam('dim1'); + const dim2 = getHrefParam('dim2'); + + let cssFile = `${formCode}.css`; + if (dim1 && dim2 && !isChildComponent) { + cssFile = `${dim1}/${dim2}/${formCode}.css`; + } + + return `${paths[0]}/${paths[1]}/web/${projectName}/${formCode}/${cssFile}`; } return ''; } diff --git a/packages/renderer/src/page.vue b/packages/renderer/src/page.vue index cb6bd74b1c..89167e7b96 100644 --- a/packages/renderer/src/page.vue +++ b/packages/renderer/src/page.vue @@ -6,10 +6,9 @@ import { useEvent, useModuleConfig, useParamPersistence, useComponentProviders, useLookupProvide, useUIBinding, useEventEmitter, useNavigation, usePagination, useFormInjector, useEventHandlers, useModuleCreator, useModelValue, useSession, useComponentConfigDependencyResolver, useHtmlTemplateTransformer, useCallbackHandlerRegistry, - useTranslate + useTranslate, useCustomCss } from './composition/index'; import { useCommunication } from './communications/index'; -import { useCustomCss } from './composition/use-custom-css'; import { ModuleI18nTransformer, GlobalTranslate } from './i18n'; const props = defineProps({ @@ -64,7 +63,7 @@ useEventHandlers(formInjector); useNavigation(formInjector); usePagination(formInjector); useLookupProvide(formInjector, module); -useCustomCss(metadatas); +useCustomCss(metadatas, !!parentContainerId); // 视图层依赖的数据和方法 diff --git a/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts b/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts index 10932f2e4d..6450f47b20 100644 --- a/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts +++ b/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts @@ -88,6 +88,7 @@ export class NumberSpinnerProperty extends InputBaseProperty { description: "", title: "启用大数字", type: "boolean", + readonly: true, visible: isBigNumber }, showZero: { -- Gitee From c4fa6c41fe7af747fb83ed96b928ac11a21822c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Thu, 28 Aug 2025 13:45:00 +0800 Subject: [PATCH 11/79] =?UTF-8?q?fix:=20=E8=A1=A8=E5=8D=95=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=A0=B7=E5=BC=8F=E5=85=BC=E5=AE=B9=20linux?= =?UTF-8?q?=20=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/composition/use-custom-css.ts | 21 +++++++++++++------ .../form-metadata-data-service.ts | 4 ++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/renderer/src/composition/use-custom-css.ts b/packages/renderer/src/composition/use-custom-css.ts index c26c9fcbd6..48353ade6a 100644 --- a/packages/renderer/src/composition/use-custom-css.ts +++ b/packages/renderer/src/composition/use-custom-css.ts @@ -21,23 +21,32 @@ export function useCustomCss(metadataRef: Ref, isChildComponent: boolean = false } }; + function customStyleFilePath() { if (!hasCustomStyleContent()) { return ''; } - const {code, projectName} = metadataRef.value.form.content.module; + const {code, projectName, dimensionInfo} = metadataRef.value.form.content.module; const replativePath = metadataRef.value.form.relativePath; + if (replativePath) { const formCode = code.toLowerCase(); const paths = replativePath.split('/'); - + const dim1 = getHrefParam('dim1'); const dim2 = getHrefParam('dim2'); - + let cssFile = `${formCode}.css`; - if (dim1 && dim2 && !isChildComponent) { - cssFile = `${dim1}/${dim2}/${formCode}.css`; + if (dim1 && dim2) { + if (!isChildComponent) { + cssFile = `${dim1}/${dim2}/${formCode}.css`; + } else { + const {extented} = metadataRef.value.form; + if (extented && dimensionInfo) { + cssFile = `${dimensionInfo.dim1}/${dimensionInfo.dim2}/${formCode}.css`; + } + } } return `${paths[0]}/${paths[1]}/web/${projectName}/${formCode}/${cssFile}`; @@ -53,7 +62,7 @@ export function useCustomCss(metadataRef: Ref, isChildComponent: boolean = false const link = document.createElement('link'); link.rel = 'stylesheet'; link.type = 'text/css'; - link.href = url; + link.href = url.toLowerCase(); // 添加到 document.head.appendChild(link); diff --git a/packages/renderer/src/metadata/data-service/form-metadata-data-service.ts b/packages/renderer/src/metadata/data-service/form-metadata-data-service.ts index cc197ba762..4c27349325 100644 --- a/packages/renderer/src/metadata/data-service/form-metadata-data-service.ts +++ b/packages/renderer/src/metadata/data-service/form-metadata-data-service.ts @@ -24,10 +24,10 @@ export class FormMetadataDataService { } private createMetadata(response: any) { - const { type, code,nameSpace:namespace } = response; + const { type, code,nameSpace:namespace, extented } = response; const { Contents: content } = JSON.parse(response.content); const refs = JSON.parse(response.refs); - const metadata = { id: response.id, content, refs, relativePath: response.relativePath, type, code,namespace }; + const metadata = { id: response.id, content, refs, relativePath: response.relativePath, type, code,namespace, extented }; return metadata; } } -- Gitee From 642356ceaacfe79fb8204b05f70f6b04f5634f05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Thu, 28 Aug 2025 14:43:10 +0800 Subject: [PATCH 12/79] =?UTF-8?q?fix:=20=E6=B8=85=E9=99=A4=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=A0=B7=E5=BC=8F=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/renderer/src/composition/use-custom-css.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/renderer/src/composition/use-custom-css.ts b/packages/renderer/src/composition/use-custom-css.ts index 48353ade6a..c9934179ee 100644 --- a/packages/renderer/src/composition/use-custom-css.ts +++ b/packages/renderer/src/composition/use-custom-css.ts @@ -49,7 +49,7 @@ export function useCustomCss(metadataRef: Ref, isChildComponent: boolean = false } } - return `${paths[0]}/${paths[1]}/web/${projectName}/${formCode}/${cssFile}`; + return `${paths[0]}/${paths[1]}/web/${projectName}/${formCode}/${cssFile}?version=${Date.now()}`; } return ''; } -- Gitee From 2835dfbfbbc082e21d6ec4b71a6fdb5229ae8ff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Thu, 28 Aug 2025 16:25:46 +0800 Subject: [PATCH 13/79] =?UTF-8?q?feature:=20lookup=E5=8D=95=E9=80=89?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=94=AF=E6=8C=81=E5=8F=8C=E5=87=BB=E9=80=89?= =?UTF-8?q?=E4=B8=AD=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../favorite/lookup-favorite.component.tsx | 23 +++++++++++++++++-- .../components/lookup-container.component.tsx | 2 +- .../lookup/src/composition/use-datagrid.tsx | 8 +++++++ .../lookup/src/composition/use-treegrid.tsx | 11 ++++++++- .../lookup/src/lookup.component.tsx | 11 ++++++++- .../property-config/lookup.property-config.ts | 14 +++++------ 6 files changed, 57 insertions(+), 12 deletions(-) diff --git a/packages/ui-vue/components/lookup/src/components/favorite/lookup-favorite.component.tsx b/packages/ui-vue/components/lookup/src/components/favorite/lookup-favorite.component.tsx index c15dbacd4f..d1ad46128a 100644 --- a/packages/ui-vue/components/lookup/src/components/favorite/lookup-favorite.component.tsx +++ b/packages/ui-vue/components/lookup/src/components/favorite/lookup-favorite.component.tsx @@ -15,6 +15,7 @@ import { LOOKUP_TREEROW_OPTIONS, useTreeRowOptions } from "../../composition/use export default defineComponent({ name: 'FLookupFavorite', props: lookupFavoriteComponentProps, + emits: ['dblClickRow'], setup(props, context) { const treeRowOptions = inject(LOOKUP_TREEROW_OPTIONS); const {userDataState, getFavoriteData}: any = inject(LOOKUP_USER_DATA_SERVICE); @@ -140,6 +141,21 @@ export default defineComponent({ } } + function onDoubleClickRow(index: number, itemData: any) { + if (!props.multiSelect) { + updateSelections([itemData]); + context.emit("dblClickRow", { items: [itemData] }); + } + } + + function onDblclickNode($event: { $event: MouseEvent, node: Record}) { + const { node } = $event; + if (!props.multiSelect) { + updateSelections([node]); + context.emit("dblClickRow", { items: [node] }); + } + } + function renderTreeGrid() { return ; + onUnSelectItem={onUnSelectItem} + onDblclickNode={onDblclickNode} + >; }; function renderDataGrid() { @@ -168,7 +186,8 @@ export default defineComponent({ fit={true} selection={selectionOption} onSelectionChange={onSelectionChange} - onUnSelectItem={onUnSelectItem}> + onUnSelectItem={onUnSelectItem} + onDoubleClickRow={onDoubleClickRow}> ; } diff --git a/packages/ui-vue/components/lookup/src/components/lookup-container.component.tsx b/packages/ui-vue/components/lookup/src/components/lookup-container.component.tsx index be4158d2c4..c0f33808d8 100644 --- a/packages/ui-vue/components/lookup/src/components/lookup-container.component.tsx +++ b/packages/ui-vue/components/lookup/src/components/lookup-container.component.tsx @@ -17,7 +17,7 @@ export default defineComponent({ name: "LookupContainer", props: lookupProps, emits: ['update:modelValue', 'search', 'navSelectionsChanged', 'pageIndexChanged', 'pageSizeChanged', - 'changeDialogOptions', 'clearSearch' + 'changeDialogOptions', 'clearSearch', 'dblClickRow' ], setup(props: LookupProps, context) { const currentTab = inject>(LOOKUP_ACTIVE_TAB, ref(LookupTabs.dataList)); 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 faf8e50ddb..55686e439a 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-datagrid.tsx +++ b/packages/ui-vue/components/lookup/src/composition/use-datagrid.tsx @@ -107,6 +107,13 @@ export function useDatagrid(props: LookupProps, context: SetupContext, navigatio context.emit("selectionsChanged", { items }); } + function onDoubleClickRow(index: number, itemData: any) { + if (!lookupOptions.multiSelect && props.openType === 'Modal') { + updateSelections([itemData]); + context.emit("dblClickRow", { items: [itemData] }); + } + } + function onUnSelectItem(items: any) { updateSelections(items?.raw, false); } @@ -196,6 +203,7 @@ export function useDatagrid(props: LookupProps, context: SetupContext, navigatio onSelectionChange={onSelectionChange} onUnSelectItem={onUnSelectItem} onChanged={onPageInfoChanged} + onDoubleClickRow={onDoubleClickRow} > ; }; 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 a684626249..7057bcc236 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-treegrid.tsx +++ b/packages/ui-vue/components/lookup/src/composition/use-treegrid.tsx @@ -161,6 +161,14 @@ export function useTreegrid(props: LookupProps, context: SetupContext) { }); } + function onDblclickNode($event: { $event: MouseEvent, node: Record}) { + const { node } = $event; + if (!lookupOptions.multiSelect && props.openType === 'Modal') { + updateSelections([node]); + context.emit("dblClickRow", { items: [node] }); + } + } + function renderTreeGrid() { return ; + loadData={loadChildren} + onDblclickNode={onDblclickNode}>; }; return { diff --git a/packages/ui-vue/components/lookup/src/lookup.component.tsx b/packages/ui-vue/components/lookup/src/lookup.component.tsx index 81333640ef..dd88acb4b0 100644 --- a/packages/ui-vue/components/lookup/src/lookup.component.tsx +++ b/packages/ui-vue/components/lookup/src/lookup.component.tsx @@ -192,7 +192,7 @@ export default defineComponent({ function onCloseModal($event: MouseEvent) { const modalInstance = modalService?.getCurrentModal(); - if (modalInstance) { + if (modalService) { modalInstance.close($event); } } @@ -256,6 +256,13 @@ export default defineComponent({ searchValueChanged.value = false; } + async function onDblClickRow($event) { + const result = await submitDialog(); + if (result) { + modalService?.close(); + } + } + context.expose({ openDialog, updateIdValue, @@ -307,12 +314,14 @@ export default defineComponent({ onPageIndexChanged={onPageIndexChanged} onPageSizeChanged={onPageSizeChanged} onChangeDialogOptions={updateDialogOptions} + onDblClickRow={onDblClickRow} > ), fav: () => ( props.enableFavorite && ) }} 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 d97fbb398a..6d6df29e7d 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 @@ -394,6 +394,13 @@ export class LookupPropertyConfig extends InputBaseProperty { title: "启用搜索栏", type: "boolean" }, + searchAnyField: { + description: "显示所有列", + $converter: lookupDefaultConverter, + title: "允许查询所有列", + type: "boolean", + visible: propertyData.editor.openType !== 'Popup' && propertyData.editor.enableSearchBar == null ? true : !!propertyData.editor.enableSearchBar + }, enableEqualSearch: { $converter: lookupDefaultConverter, description: "是否启用等于搜索", @@ -691,13 +698,6 @@ export class LookupPropertyConfig extends InputBaseProperty { type: "boolean", visible: false }, - searchAnyField: { - description: "显示所有列", - $converter: lookupDefaultConverter, - title: "允许查询所有列", - type: "boolean", - visible: editorOptions.openType !== 'Popup' && editorOptions.enableSearchBar == null ? true : !!editorOptions.enableSearchBar - }, enableFavorite: { description: "启用收藏夹", $converter: lookupDefaultConverter, -- Gitee From 94c82416b1c9ba16284baf328947cd85adb119ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Fri, 29 Aug 2025 11:15:04 +0800 Subject: [PATCH 14/79] =?UTF-8?q?fix:=20datepicker=20=E5=BF=AB=E6=8D=B7?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../date-picker-container.component.tsx | 9 ++++++++- .../src/components/date-range/date-range.props.ts | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx b/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx index b0dd4f932a..8e25d0bff1 100644 --- a/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx +++ b/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx @@ -1254,7 +1254,14 @@ export default defineComponent({ } const renderQuickSelector = () => { - const items = enablePeriod.value? quickSelectorList.range : quickSelectorList.single; + const items = enablePeriod.value? quickSelectorList.range.filter(item => { + const startDateObject = convertDateToDateObject(item.value[0]); + const endDateObject = convertDateToDateObject(item.value[1]); + return !refDisableDate.isDisabledDate(startDateObject) && !refDisableDate.isDisabledDate(endDateObject); + }) : quickSelectorList.single.filter(item => { + const dateObject = convertDateToDateObject(item.value); + return !refDisableDate.isDisabledDate(dateObject); + }); return
    {items.map((item, index) => { return
  • onQuickSelected(item, $event)}>{item.label}
  • ; diff --git a/packages/ui-vue/components/date-picker/src/components/date-range/date-range.props.ts b/packages/ui-vue/components/date-picker/src/components/date-range/date-range.props.ts index 7cee8c7625..70f61dccc6 100644 --- a/packages/ui-vue/components/date-picker/src/components/date-range/date-range.props.ts +++ b/packages/ui-vue/components/date-picker/src/components/date-range/date-range.props.ts @@ -1,5 +1,5 @@ import { ExtractPropTypes, PropType } from 'vue'; -import { datePickerProps } from '../../..'; +import { datePickerProps } from '../../date-picker.props'; import { DatePickerLocale } from '../../composition/use-locales'; export const dateRangeProps = { -- Gitee From b17ce76ebc297cf5e7e2f2197e90dccfc61a20b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Fri, 29 Aug 2025 11:41:17 +0800 Subject: [PATCH 15/79] =?UTF-8?q?fix:=20=E6=B8=85=E7=A9=BA=E5=90=8E?= =?UTF-8?q?=E9=9A=90=E8=97=8Flookup=E4=B8=8B=E6=8B=89=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui-vue/components/lookup/src/lookup.component.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/ui-vue/components/lookup/src/lookup.component.tsx b/packages/ui-vue/components/lookup/src/lookup.component.tsx index dd88acb4b0..40574dbacf 100644 --- a/packages/ui-vue/components/lookup/src/lookup.component.tsx +++ b/packages/ui-vue/components/lookup/src/lookup.component.tsx @@ -151,6 +151,10 @@ export default defineComponent({ context.emit('update:modelValue', ''); updateIdValue(''); + if (openType.value === 'Popup') { + isPopuped.value && elementRef.value?.hidePopup(); + } + const clearParams = { items: null, mappingFields: lookupOptions.mappingFields }; context.emit('clear', clearParams); useContext(props, clearParams); -- Gitee From 261c804da342f44ba7a3a37c0215d27b52588411 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Fri, 29 Aug 2025 16:24:41 +0800 Subject: [PATCH 16/79] =?UTF-8?q?fix:=20=E6=97=A5=E6=9C=9F=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=98=93=E7=94=A8=E6=80=A7=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../date-picker-container.component.tsx | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx b/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx index 8e25d0bff1..b69266d3bf 100644 --- a/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx +++ b/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx @@ -189,6 +189,8 @@ export default defineComponent({ displayTextOfYear: `${selectedDateObj.value.year}` }); + const currentActiveMonth = ref(cloneDeep(activeMonth.value)); + selectedMonth.value = { year: selectedDate.value?.year, month: selectedDate.value?.month, @@ -342,6 +344,9 @@ export default defineComponent({ displayTextOfYear: `${previousYear}` }; activeMonth.value = previous; + if (selectingMonth.value) { + selectedMonth.value = {...selectedMonth.value, ...{ year: previous.year, month: previous.month }}; + } } else { const previousYear = secondaryActiveMonth.value.year - (selectingSecondaryYear.value ? 10 : 1); const previous = { @@ -364,6 +369,7 @@ export default defineComponent({ displayTextOfYear: `${previousMonthDate.year}` }; activeMonth.value = previous; + selectedMonth.value = {...selectedMonth.value, ...{ year: previous.year, month: previous.month }}; } else { const previousMonthDate = getPreviousMonth(secondaryActiveMonth.value.month, secondaryActiveMonth.value.year); const previous = { @@ -386,6 +392,7 @@ export default defineComponent({ displayTextOfYear: `${nextMonthDate.year}` }; activeMonth.value = next; + selectedMonth.value = {...selectedMonth.value, ...{ year: next.year, month: next.month }}; } else { const nextMonthDate = getNextMonth(secondaryActiveMonth.value.month, secondaryActiveMonth.value.year); const next = { @@ -411,6 +418,9 @@ export default defineComponent({ displayTextOfYear: `${nextYear}` }; activeMonth.value = next; + if (selectingMonth.value) { + selectedMonth.value = {...selectedMonth.value, ...{ year: next.year, month: next.month }}; + } } else { let nextYear = secondaryActiveMonth.value.year + 1; if (selectingSecondaryYear.value) { @@ -446,6 +456,15 @@ export default defineComponent({ } else { selectingMonth.value = false; } + + if (!enablePeriod.value) { + if (selectingYear.value) { + currentActiveMonth.value = cloneDeep(activeMonth.value); + } else { + activeMonth.value = cloneDeep(currentActiveMonth.value); + } + } + } else { selectingSecondaryYear.value = selectMode.value === 'year' ? true : !selectingSecondaryYear.value; if (selectMode.value === 'month') { @@ -756,6 +775,8 @@ export default defineComponent({ year: currentMonth.year || 1, displayTextOfYear: `${currentMonth.year}` }; + currentActiveMonth.value = cloneDeep(activeMonth.value); + if (selectMode.value === 'month') { if (!enablePeriod.value) { context.emit('datePicked', currentMonth); @@ -827,7 +848,7 @@ export default defineComponent({ enableKeyboadNavigate: enableKeyboadNavigate.value, enableMarkCurrent: enableMarkCurrent.value, enablePeriod: enablePeriod.value, - selected: selectedDate.value, + selected: selectedMonth.value, selectedPeriod: selectedPeriod.value, selectMode: selectMode.value }; @@ -852,6 +873,7 @@ export default defineComponent({ year: currentYear.year || 1, displayTextOfYear: `${currentYear.year}` }; + currentActiveMonth.value = cloneDeep(activeMonth.value); if (selectMode.value === 'year') { if (!enablePeriod.value) { @@ -862,6 +884,7 @@ export default defineComponent({ } else { selectingMonth.value = true; selectingYear.value = false; + selectedMonth.value = Object.assign(selectedMonth.value || {}, { year: currentYear.year }); } } else { -- Gitee From 422febefff0c57bf118e47a33912160bf2402961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Fri, 29 Aug 2025 18:39:59 +0800 Subject: [PATCH 17/79] =?UTF-8?q?fix:=20=E6=97=A5=E6=9C=9F=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E5=8C=BA=E9=97=B4=E9=80=89=E5=80=BC=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../date-picker-container.component.tsx | 12 ++++++------ .../time-picker/src/components/time.component.tsx | 9 +++++++-- .../time-picker/src/composition/time-holder.ts | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx b/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx index b69266d3bf..6412b2de57 100644 --- a/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx +++ b/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx @@ -621,7 +621,7 @@ export default defineComponent({ // 区间 if (enablePeriod.value) { const { from, to, emit } = setNewDateRange(selectedPeriod.value, currentDate); - selectedPeriod.value = { from, to }; + selectedPeriod.value = { from: cloneDeep(from), to: cloneDeep(to) }; if (!props.showTime && emit) { context.emit('datePicked', { startDate: from, endDate: to }); } @@ -631,9 +631,6 @@ export default defineComponent({ } else { const { year, month, day } = currentDate; selectedDate.value = Object.assign(selectedDate.value || {}, { year, month, day }); - // selectedDate.value.year = year; - // selectedDate.value.month = month; - // selectedDate.value.day = day; } } @@ -1277,11 +1274,14 @@ export default defineComponent({ } const renderQuickSelector = () => { - const items = enablePeriod.value? quickSelectorList.range.filter(item => { + /** + * .filter(item => { const startDateObject = convertDateToDateObject(item.value[0]); const endDateObject = convertDateToDateObject(item.value[1]); return !refDisableDate.isDisabledDate(startDateObject) && !refDisableDate.isDisabledDate(endDateObject); - }) : quickSelectorList.single.filter(item => { + }) + */ + const items = enablePeriod.value? quickSelectorList.range: quickSelectorList.single.filter(item => { const dateObject = convertDateToDateObject(item.value); return !refDisableDate.isDisabledDate(dateObject); }); diff --git a/packages/ui-vue/components/time-picker/src/components/time.component.tsx b/packages/ui-vue/components/time-picker/src/components/time.component.tsx index 8309fde236..3435a2569b 100644 --- a/packages/ui-vue/components/time-picker/src/components/time.component.tsx +++ b/packages/ui-vue/components/time-picker/src/components/time.component.tsx @@ -55,7 +55,7 @@ export default defineComponent({ defaultOpenValue.value = props.defaultOpenValue; // 从TimeHolder获取修改的值 - watch(time.changedValue, (newValue: TimeValueText) => { + watch(() => time.changedValue.value, (newValue: TimeValueText) => { context.emit("valueChange", newValue); }); @@ -118,7 +118,12 @@ export default defineComponent({ if (isNotNull(value)) { time.text = value; const convertedValue = convertToDate(time.text, format.value); - time.setValue(convertedValue, use12Hours.value); + if (convertedValue) { + time.setValue(convertedValue, use12Hours.value); + } else { + time.setValue(new Date(), use12Hours.value); + time.update(); + } buildTimes(); } else { time.setUse12Hours(use12Hours.value); diff --git a/packages/ui-vue/components/time-picker/src/composition/time-holder.ts b/packages/ui-vue/components/time-picker/src/composition/time-holder.ts index dc8de3bd65..81287cf56e 100644 --- a/packages/ui-vue/components/time-picker/src/composition/time-holder.ts +++ b/packages/ui-vue/components/time-picker/src/composition/time-holder.ts @@ -264,7 +264,7 @@ export class TimeHolder { } } - private update(): void { + update(): void { if (this.isEmpty) { this.temporaryValue = undefined; } else { -- Gitee From 684a180512330136a9d5851f5dc8f53e4f2a3307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Sat, 30 Aug 2025 14:59:28 +0800 Subject: [PATCH 18/79] =?UTF-8?q?fix:=20=E6=97=A5=E6=9C=9F=E5=8C=BA?= =?UTF-8?q?=E9=97=B4=E6=93=8D=E4=BD=9C=E6=98=93=E7=94=A8=E6=80=A7=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar-navbar.component.tsx | 9 +++++++ .../date-picker-container.component.tsx | 24 ++++++++++++------- .../src/components/month/month.component.tsx | 8 +++++-- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/packages/ui-vue/components/date-picker/src/components/calendar-navbar/calendar-navbar.component.tsx b/packages/ui-vue/components/date-picker/src/components/calendar-navbar/calendar-navbar.component.tsx index aa516b6fa9..1d266177e7 100644 --- a/packages/ui-vue/components/date-picker/src/components/calendar-navbar/calendar-navbar.component.tsx +++ b/packages/ui-vue/components/date-picker/src/components/calendar-navbar/calendar-navbar.component.tsx @@ -161,11 +161,20 @@ export default defineComponent({ $event.stopPropagation(); context.emit('nextPage'); } + + const yearViewButtonStyle = computed(() => { + const style = {} as Record; + if (selectMode.value === 'year') { + style.cursor = 'default'; + } + return style; + }); function renderSelectYearButton() { return ( } {shouldShowYearView.value && } - {!shouldShowMonthView.value && !shouldShowYearView.value && } + {!shouldShowMonthView.value && !shouldShowYearView.value && } } diff --git a/packages/ui-vue/components/date-picker/src/date-picker.component.tsx b/packages/ui-vue/components/date-picker/src/date-picker.component.tsx index eab42ee26e..385e1b4d0f 100644 --- a/packages/ui-vue/components/date-picker/src/date-picker.component.tsx +++ b/packages/ui-vue/components/date-picker/src/date-picker.component.tsx @@ -248,6 +248,8 @@ export default defineComponent({ return () => { return enablePeriod.value ? 当前期为: {{ currentDate3 }} diff --git a/packages/ui-vue/demos/date-picker/date_boundary.vue b/packages/ui-vue/demos/date-picker/date_boundary.vue index dc19ed32a4..b5ec8d2ddf 100644 --- a/packages/ui-vue/demos/date-picker/date_boundary.vue +++ b/packages/ui-vue/demos/date-picker/date_boundary.vue @@ -2,13 +2,13 @@ import { ref } from 'vue'; const currentDate = ref('2023-4-23'); -/** 最早年限 */ -const minYear = ref(2000); -/** 最晚年限 */ -const maxYear = ref(2024); +/** 最早日期 */ +const minDate = ref('2000-1-1'); +/** 最晚日期 */ +const maxDate = ref('2024-12-31'); diff --git a/packages/ui-vue/docs/components/date-picker/index.md b/packages/ui-vue/docs/components/date-picker/index.md index 67d7d25dee..7df644f54c 100644 --- a/packages/ui-vue/docs/components/date-picker/index.md +++ b/packages/ui-vue/docs/components/date-picker/index.md @@ -22,7 +22,7 @@ Date Picker 组件用来选择日期。 ::: -## 设置最大最小年限 +## 设置最大最小日期 :::vdemo -- Gitee From 4088b9a76066858b3d2e15e1b73c4b6a8e0bfa2d 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, 22 Oct 2025 08:36:42 +0800 Subject: [PATCH 67/79] =?UTF-8?q?fix:=20lookup=20=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E4=BA=A4=E4=BA=92=E4=BA=8B=E4=BB=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../button-edit/src/button-edit.component.tsx | 42 ++++++++--- .../button-edit/src/button-edit.props.ts | 2 + .../components/popup-container.component.tsx | 8 +- .../src/composition/use-input-change.ts | 9 +-- .../lookup/src/composition/use-popup.tsx | 73 +++++++++++-------- .../lookup/src/lookup.component.tsx | 22 +++++- .../components/modal/src/modal.component.tsx | 11 ++- .../popover/src/composition/use-popup.ts | 9 ++- .../popover/src/popover.component.tsx | 1 + .../components/popover/src/popover.props.ts | 4 +- 10 files changed, 126 insertions(+), 55 deletions(-) diff --git a/packages/ui-vue/components/button-edit/src/button-edit.component.tsx b/packages/ui-vue/components/button-edit/src/button-edit.component.tsx index 4b6883d164..e56176f4de 100644 --- a/packages/ui-vue/components/button-edit/src/button-edit.component.tsx +++ b/packages/ui-vue/components/button-edit/src/button-edit.component.tsx @@ -76,7 +76,7 @@ export default defineComponent({ const buttonEditStyles = computed(() => { return { - overflow: props.wrapText ? 'hidden': '' + overflow: props.wrapText ? 'hidden' : '' }; }); @@ -87,14 +87,14 @@ export default defineComponent({ }; }); - + function getHeiddenItems() { if (!props.multiSelect || props.inputType !== 'tag' || !buttonEditRef.value) { return 0; } let total = 0; - + const items = Array.from(buttonEditRef.value.querySelectorAll('.farris-tag-item')); if (items && items.length) { total = items.map((tag: any) => { @@ -104,7 +104,7 @@ export default defineComponent({ return total; } - const hideTagsCount= ref(getHeiddenItems()); + const hideTagsCount = ref(getHeiddenItems()); onUpdated(() => { hideTagsCount.value = getHeiddenItems(); @@ -130,7 +130,7 @@ export default defineComponent({ const { renderButtonGroup, buttonHandleElement } = getButtonGroupRender(props, context, useButtonComposition, useClearComposition); const renderPopupContent = getPopupRender(props, context, popupComposition); - + const canOpenPopup = ref(shouldPopupContent.value); const componentInstance = { displayText, commitValue, @@ -150,6 +150,12 @@ export default defineComponent({ return useButtonComposition.modalRef.value?.value; } return null; + }, + getTextbox: () => { + return buttonEditRef.value?.querySelector('input'); + }, + forceClosePopup:() => { + canOpenPopup.value = false; } }; @@ -168,18 +174,36 @@ export default defineComponent({ context.expose(componentInstance); + watch(() => shouldPopupContent.value, async (newValue, oldValue) => { + if (!newValue && props.beforeClosePopup && typeof props.beforeClosePopup === 'function') { + try { + const result = await props.beforeClosePopup(); + canOpenPopup.value = !result; + shouldPopupContent.value = !result && !props.readonly; + } catch (error) { + // 处理异步函数可能抛出的异常,保持 watcher 继续工作 + console.error('Error in beforeClosePopup:', error); + // 保持当前状态,不强制关闭弹窗 + canOpenPopup.value = oldValue; + shouldPopupContent.value = oldValue; + } + return; + } + canOpenPopup.value = newValue; + }); + return () => { return ( <> -
    -
    +
    - { context.slots.precontent?.() } + {context.slots.precontent?.()} {renderEditor()} {renderButtonGroup()}
    - {shouldPopupContent.value && renderPopupContent()} + {canOpenPopup.value && renderPopupContent()} ); }; diff --git a/packages/ui-vue/components/button-edit/src/button-edit.props.ts b/packages/ui-vue/components/button-edit/src/button-edit.props.ts index 8e9522acb2..d0d61fd72e 100644 --- a/packages/ui-vue/components/button-edit/src/button-edit.props.ts +++ b/packages/ui-vue/components/button-edit/src/button-edit.props.ts @@ -158,6 +158,8 @@ export const buttonEditProps = { */ beforeClose: { type: Function as PropType, default: null }, + beforeClosePopup: { type: Function as PropType, default: null }, + } as Record; export type ButtonEditProps = ExtractPropTypes; diff --git a/packages/ui-vue/components/button-edit/src/components/popup-container.component.tsx b/packages/ui-vue/components/button-edit/src/components/popup-container.component.tsx index 494241f000..7683c16fd9 100644 --- a/packages/ui-vue/components/button-edit/src/components/popup-container.component.tsx +++ b/packages/ui-vue/components/button-edit/src/components/popup-container.component.tsx @@ -1,4 +1,4 @@ -import { SetupContext, ref } from "vue"; +import { SetupContext, onUnmounted, ref } from "vue"; import { ButtonEditProps } from "../button-edit.props"; import { UsePopup } from "../composition/types"; import FPopover from '@farris/ui-vue/components/popover'; @@ -10,6 +10,9 @@ export default function ( ) { const popupMinWidth = ref(props.popupMinWidth); const { hidePopup, popoverRef } = popupComposition; + const onPopupShown = () => { + context.emit('shown'); + }; return () => { return {context.slots.default?.()} ; diff --git a/packages/ui-vue/components/lookup/src/composition/use-input-change.ts b/packages/ui-vue/components/lookup/src/composition/use-input-change.ts index b08e96910a..bac21c0095 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-input-change.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-input-change.ts @@ -93,14 +93,13 @@ export function useInputChange(props: LookupProps, context: any, options: Lookup if (isTextChange(searchText)) { if (props.allowFreeInput) { - // if (props.openType !== 'Modal' && isPopuped.value) { - // const { hidePopup } = usePopupComposition; - // selectedItems.value = []; - // hidePopup(); - // } + if (props.openType === 'Modal') { useFreeInput(props, context, searchText, lookupOptions); return; + } else { + selectedItems.value = []; + useFreeInput(props, context, searchText, lookupOptions); } } 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 8ff6133cfe..03ffe93dc7 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-popup.tsx +++ b/packages/ui-vue/components/lookup/src/composition/use-popup.tsx @@ -22,6 +22,7 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { provide(LOOKUP_TREEROW_OPTIONS, treeRowOptions); let selectDataToHidePopup = false; + let canClosePopup = true; const notifyService: FNotifyService | null = inject(F_NOTIFY_SERVICE_TOKEN, null); const {idValues} = useHttpComposition; @@ -34,7 +35,44 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { return false; }); - function hidePopup() { + + async function onBeforeClosePopup() { + if (!canClosePopup) { + return false; + } + + // if (props.allowFreeInput && !selectDataToHidePopup) { + // selectedItems.value = []; + // useFreeInput(props, context, elementRef.value?.displayText, lookupOptions); + // return true; + // } + + if (!selectDataToHidePopup) { + return true; + } + + let dictPickedResult: any = null; + if (!lookupOptions.multiSelect) { + dictPickedResult = await updateModelValue(); + } else { + dictPickedResult = await runDictPickedAsync(); + } + + const { shouldClose, message: pickedMsg } = dictPickedResult; + + if (!shouldClose) { + if (pickedMsg) { + notifyService?.warning({ message: pickedMsg, position: 'top-center'}); + } + canClosePopup = false; + return false; + } + + return true; + } + + + async function hidePopup() { elementRef.value?.hidePopup(); } @@ -66,6 +104,8 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { queryState.value = ''; destroyed(); selectDataToHidePopup = false; + context.emit('popupClosed'); + canClosePopup = true; } function showPopup() { @@ -77,40 +117,11 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { function onSelectionsChanged() { if (!lookupOptions.multiSelect) { selectDataToHidePopup = true; + canClosePopup = true; hidePopup(); } } - async function onBeforeClosePopup() { - if (props.allowFreeInput && !selectDataToHidePopup) { - selectedItems.value = []; - useFreeInput(props, context, elementRef.value?.displayText, lookupOptions); - return true; - } - - if (!selectDataToHidePopup) { - return true; - } - - let dictPickedResult: any = null; - if (!lookupOptions.multiSelect) { - dictPickedResult = await updateModelValue(); - } else { - dictPickedResult = await runDictPickedAsync(); - } - - const { shouldClose, message: pickedMsg } = dictPickedResult; - - if (!shouldClose) { - if (pickedMsg) { - notifyService?.warning({ message: pickedMsg, position: 'top-center'}); - } - return false; - } - - return true; - } - function renderPopup() { const { width, height } = getPopupSize(); return props.readonly, () => props.disabled], ([readonly, disable]) => { + if (readonly || disable) { + elementRef.value?.forceClosePopup(); + } + }); + } + async function onClear() { context.emit('update:modelValue', ''); updateIdValue(''); @@ -273,6 +281,14 @@ export default defineComponent({ } } + function onPopupShown() { + if (props.editable) { + setTimeout(() => { + elementRef.value.getTextbox()?.focus(); + }, 100); + } + } + context.expose({ openDialog, updateIdValue, @@ -288,7 +304,7 @@ export default defineComponent({ ref={elementRef} id={props.id} v-model={modelValue.value} - disable={props.disable} + disable={props.disabled} readonly={props.readonly} editable={editable.value} inputType={"text"} @@ -309,7 +325,9 @@ export default defineComponent({ onBeforeClearValue={onBeforeClearValue} customClass={'f-cmp-lookup'} onClick={onInputClicked} - beforeClose={onBeforeClosePopup} + onShown={onPopupShown} + beforeClosePopup={onBeforeClosePopup} + popupClass={'lookup-popup-panel'} > {openType.value === 'Modal' && onMaximizeModal($event)} diff --git a/packages/ui-vue/components/modal/src/modal.component.tsx b/packages/ui-vue/components/modal/src/modal.component.tsx index 7d8dc6559f..92e32590ea 100644 --- a/packages/ui-vue/components/modal/src/modal.component.tsx +++ b/packages/ui-vue/components/modal/src/modal.component.tsx @@ -229,9 +229,18 @@ export default defineComponent({ return styleObject; }); + const zIndex = () => { + const lookupPopupCount = document.body.querySelectorAll('.lookup-popup-panel.in').length; + if (lookupPopupCount) { + return 1061; + } + return 1040; + }; + const modalBackdropStyle = computed(() => { const styleObject: any = { - display: 'block' + display: 'block', + zIndex: zIndex(), }; if (!props.mask) { styleObject.pointerEvents = 'none'; diff --git a/packages/ui-vue/components/popover/src/composition/use-popup.ts b/packages/ui-vue/components/popover/src/composition/use-popup.ts index 548dd53f2f..acb03f5878 100644 --- a/packages/ui-vue/components/popover/src/composition/use-popup.ts +++ b/packages/ui-vue/components/popover/src/composition/use-popup.ts @@ -20,9 +20,12 @@ export function usePopup( let hidePopverOnClickBodyHandler: ($event: MouseEvent | Event) => any; async function hide() { - if (props.beforeHide && typeof props.beforeHide === 'function') { - const shouldHide = await props.beforeHide(); - if (!shouldHide) { + if (!showPopover.value) { + return; + } + if (props.beforeClose && typeof props.beforeClose === 'function') { + const canClose = await props.beforeClose(); + if (!canClose) { return; } } diff --git a/packages/ui-vue/components/popover/src/popover.component.tsx b/packages/ui-vue/components/popover/src/popover.component.tsx index 683b78317f..a1c77764d4 100644 --- a/packages/ui-vue/components/popover/src/popover.component.tsx +++ b/packages/ui-vue/components/popover/src/popover.component.tsx @@ -109,6 +109,7 @@ export default defineComponent({ onUnmounted(() => { document.body.removeEventListener('click', hidePopverOnClickBodyHandler); window.removeEventListener('resize', onResize); + showPopover.value = false; }); return () => { diff --git a/packages/ui-vue/components/popover/src/popover.props.ts b/packages/ui-vue/components/popover/src/popover.props.ts index 491dca495f..07eb30965a 100644 --- a/packages/ui-vue/components/popover/src/popover.props.ts +++ b/packages/ui-vue/components/popover/src/popover.props.ts @@ -69,8 +69,8 @@ export const popoverProps = { * 根据空间大小重新调整,原下拉面板内容指定的高度 */ limitContentBySpace: { type: Boolean, default: false }, - /** 隐藏前触发 */ - beforeHide: { type: Function as PropType<() => Promise> }, + + beforeClose: { type: Function as PropType<() => Promise | boolean> } }; export type PopoverProps = ExtractPropTypes; -- Gitee From d26aac6983fde7be59a9444aab31e3369660c438 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, 22 Oct 2025 15:31:32 +0800 Subject: [PATCH 68/79] =?UTF-8?q?fix:=20lookup=E4=B8=8B=E6=8B=89=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E4=BA=8B=E4=BB=B6=E4=BA=A4=E4=BA=92=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/lookup/lookup-style.scss | 5 +++++ .../lookup/src/composition/use-datagrid.tsx | 6 +++++- .../lookup/src/composition/use-dialog.ts | 2 +- .../src/composition/use-input-change.ts | 8 +++++-- .../lookup/src/composition/use-popup.tsx | 21 ++++++++----------- .../lookup/src/composition/use-state.ts | 5 ++++- .../lookup/src/lookup.component.tsx | 9 ++++---- 7 files changed, 35 insertions(+), 21 deletions(-) diff --git a/packages/ui-vue/components/lookup/lookup-style.scss b/packages/ui-vue/components/lookup/lookup-style.scss index 6e0b1ae284..94f2529974 100644 --- a/packages/ui-vue/components/lookup/lookup-style.scss +++ b/packages/ui-vue/components/lookup/lookup-style.scss @@ -54,3 +54,8 @@ } } } + +.lookup-datagrid.lookup-datagrid-empty .fv-datagrid-pagination { + pointer-events: none; + opacity: 0.3; +} \ No newline at end of file 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 00c953f3ee..9c10beba42 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-datagrid.tsx +++ b/packages/ui-vue/components/lookup/src/composition/use-datagrid.tsx @@ -188,8 +188,12 @@ export function useDatagrid(props: LookupProps, context: SetupContext, navigatio context.emit("pageSizeChanged", params); } + const lookupDatagridClass = computed(() => { + return { 'lookup-datagrid': true, 'lookup-datagrid-empty': !lookupState.items?.length }; + }); + function renderDataGrid() { - return , { useHttpComposition, selectionsManager, userDataService, updateModelValue, lookupLocales, destroyed, - setModelAndIdValue, runDictPickedAsync + setModelAndIdValue, runDictPickedAsync, popupState }) { provide(LOOKUP_USER_DATA_SERVICE, userDataService); @@ -21,8 +20,6 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { const treeRowOptions = useTreeRowOptions(lookupOptions, false); provide(LOOKUP_TREEROW_OPTIONS, treeRowOptions); - let selectDataToHidePopup = false; - let canClosePopup = true; const notifyService: FNotifyService | null = inject(F_NOTIFY_SERVICE_TOKEN, null); const {idValues} = useHttpComposition; @@ -37,7 +34,7 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { async function onBeforeClosePopup() { - if (!canClosePopup) { + if (!popupState.canClose) { return false; } @@ -47,7 +44,7 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { // return true; // } - if (!selectDataToHidePopup) { + if (!selectedItems.value.length) { return true; } @@ -64,7 +61,7 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { if (pickedMsg) { notifyService?.warning({ message: pickedMsg, position: 'top-center'}); } - canClosePopup = false; + popupState.canClose = false; return false; } @@ -103,9 +100,9 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { isPopuped.value && hidePopup(); queryState.value = ''; destroyed(); - selectDataToHidePopup = false; context.emit('popupClosed'); - canClosePopup = true; + popupState.canClose = true; + document.body.classList.remove('lookup-modal-open'); } function showPopup() { @@ -116,8 +113,7 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { function onSelectionsChanged() { if (!lookupOptions.multiSelect) { - selectDataToHidePopup = true; - canClosePopup = true; + popupState.canClose = true; hidePopup(); } } @@ -140,6 +136,7 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { renderPopup, showPopup, hidePopup, - onBeforeClosePopup + onBeforeClosePopup, + popupState }; } diff --git a/packages/ui-vue/components/lookup/src/composition/use-state.ts b/packages/ui-vue/components/lookup/src/composition/use-state.ts index d493a2d94a..802802396f 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-state.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-state.ts @@ -12,6 +12,7 @@ export interface LookupStates { unSelectDataId: Ref; lookupOptions: Reactive>; searchValueChanged: Ref; + popupState: Reactive; } @@ -24,6 +25,7 @@ export function useLookupState(props: LookupProps): LookupStates { const selectionState = ref([]); const unSelectDataId = ref(); const lookupOptions = reactive>({}); + const popupState = reactive({ canClose: true }); const searchValueChanged = ref(false); @@ -70,6 +72,7 @@ export function useLookupState(props: LookupProps): LookupStates { selectionState, unSelectDataId, lookupOptions, - searchValueChanged + searchValueChanged, + popupState }; } diff --git a/packages/ui-vue/components/lookup/src/lookup.component.tsx b/packages/ui-vue/components/lookup/src/lookup.component.tsx index 5f11e63eab..54a31528c7 100644 --- a/packages/ui-vue/components/lookup/src/lookup.component.tsx +++ b/packages/ui-vue/components/lookup/src/lookup.component.tsx @@ -62,7 +62,7 @@ export default defineComponent({ }); const lookupLocales = useLookupLocales(props); const useHttpComposition = useHttp(props, context); - const { lookupOptions, selectionState, searchValueChanged, queryState } = useHttpComposition.lookupStates; + const { lookupOptions, selectionState, searchValueChanged, queryState, popupState } = useHttpComposition.lookupStates; const userDataService = useUserData(props, useHttpComposition); const showSelections = computed(() => { @@ -93,7 +93,7 @@ export default defineComponent({ }); const usePopupComposition = usePopup(props, context, elementRef, { useHttpComposition, selectionsManager, userDataService, updateModelValue, lookupLocales, destroyed, - setModelAndIdValue, runDictPickedAsync + setModelAndIdValue, runDictPickedAsync, popupState }); const { renderPopup, showPopup, isPopuped, hidePopup, onBeforeClosePopup } = usePopupComposition; @@ -160,10 +160,10 @@ export default defineComponent({ updateIdValue(''); if (openType.value === 'Popup') { - isPopuped.value && elementRef.value?.hidePopup(); + isPopuped.value && elementRef.value?.forceClosePopup(); } - const clearParams = { items: null, mappingFields: lookupOptions.mappingFields }; + const clearParams = { items: null, mappingFields: lookupOptions.mappingFields}; context.emit('clear', clearParams); useContext(props, clearParams); } @@ -282,6 +282,7 @@ export default defineComponent({ } function onPopupShown() { + document.body.classList.add('lookup-modal-open'); if (props.editable) { setTimeout(() => { elementRef.value.getTextbox()?.focus(); -- Gitee From 410687dffdf4898ae74288cf363f251516b1fd6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Thu, 23 Oct 2025 09:49:19 +0800 Subject: [PATCH 69/79] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E5=BC=B9=E5=87=BA=E6=B5=AE=E5=8A=A8=E5=B1=82=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui-vue/components/common/index.ts | 1 + .../components/common/utils/use-max-zindex.ts | 46 +++++++++++++++++++ .../lookup/src/composition/use-http.ts | 5 +- .../components/modal/src/modal.component.tsx | 7 +-- .../popover/src/popover.component.tsx | 3 +- 5 files changed, 52 insertions(+), 10 deletions(-) create mode 100644 packages/ui-vue/components/common/utils/use-max-zindex.ts diff --git a/packages/ui-vue/components/common/index.ts b/packages/ui-vue/components/common/index.ts index 6cd41b5388..b06735b3c4 100644 --- a/packages/ui-vue/components/common/index.ts +++ b/packages/ui-vue/components/common/index.ts @@ -25,6 +25,7 @@ export * from './utils/use-delayed-ref'; export { default as areaResponseDirective } from './directive/area-response'; export * from './utils/type'; export * from './utils/exclude-properties'; +export * from './utils/use-max-zindex'; export default { install(app: App): void { diff --git a/packages/ui-vue/components/common/utils/use-max-zindex.ts b/packages/ui-vue/components/common/utils/use-max-zindex.ts new file mode 100644 index 0000000000..7555ccfb00 --- /dev/null +++ b/packages/ui-vue/components/common/utils/use-max-zindex.ts @@ -0,0 +1,46 @@ +const isElementVisible = (element: Element): boolean => { + // 检查元素是否可见 + if (!element || !(element instanceof Element)) { + return false; + } + + const style = window.getComputedStyle(element); + if (style.display === 'none' || style.visibility === 'hidden') { + return false; + } + + return ( + element['offsetWidth'] > 0 || + element['offsetHeight'] > 0 || + (element.getClientRects && element.getClientRects().length > 0) + ); +}; + +export const getMaxZIndex = () => { + const selectors = [ + 'body>.popover.fade.in', + 'body>.modal.fade.in' + ] + const bodyChildren = document.body.querySelectorAll(selectors.join(',')); + let max = 0; + + for (let i = 0; i < bodyChildren.length; i++) { + const element = bodyChildren[i]; + + // 跳过不可见元素 + if (!isElementVisible(element)) { continue; } + + const computedStyle = window.getComputedStyle ? window.getComputedStyle(element) : null; + if (!computedStyle) { continue; } + + const zIndex = parseInt(computedStyle.zIndex, 10); + + if (zIndex && !isNaN(zIndex)) { + const num = Number(zIndex); + if (Number.isFinite(num) && num > max) { + max = num; + } + } + } + return max + 1; +}; \ No newline at end of file diff --git a/packages/ui-vue/components/lookup/src/composition/use-http.ts b/packages/ui-vue/components/lookup/src/composition/use-http.ts index bfecbca4a8..723ae9b6f3 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-http.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-http.ts @@ -319,10 +319,7 @@ export function useHttp(props: LookupProps, context: any): UseHttpComposition { return new Promise((resolve, reject) => { resolve({ - columns: [...props.columns], - items: [...props.data], - searchFields: [...props.searchFields], - navigation: { ...props.navigation } + ...props }); }); } diff --git a/packages/ui-vue/components/modal/src/modal.component.tsx b/packages/ui-vue/components/modal/src/modal.component.tsx index 92e32590ea..b4ec5f1b96 100644 --- a/packages/ui-vue/components/modal/src/modal.component.tsx +++ b/packages/ui-vue/components/modal/src/modal.component.tsx @@ -22,6 +22,7 @@ import { useDraggable } from './composition/use-draggable'; import './modal.scss'; import { useEnter, useEsc } from './composition/use-shortcut'; import { useI18n } from 'vue-i18n'; +import { getMaxZIndex } from '@farris/ui-vue/components/common'; export default defineComponent({ name: 'FModal', @@ -230,11 +231,7 @@ export default defineComponent({ }); const zIndex = () => { - const lookupPopupCount = document.body.querySelectorAll('.lookup-popup-panel.in').length; - if (lookupPopupCount) { - return 1061; - } - return 1040; + return getMaxZIndex() || 1040; }; const modalBackdropStyle = computed(() => { diff --git a/packages/ui-vue/components/popover/src/popover.component.tsx b/packages/ui-vue/components/popover/src/popover.component.tsx index a1c77764d4..a240400b7f 100644 --- a/packages/ui-vue/components/popover/src/popover.component.tsx +++ b/packages/ui-vue/components/popover/src/popover.component.tsx @@ -20,7 +20,7 @@ import { useHost } from './composition/use-host'; import { usePosition } from './composition/use-position'; import { usePopup } from './composition/use-popup'; import { useResize } from './composition/use-resize'; -import { useDelayedRef } from '@farris/ui-vue/components/common'; +import { getMaxZIndex, useDelayedRef } from '@farris/ui-vue/components/common'; export default defineComponent({ name: 'FPopover', @@ -81,6 +81,7 @@ export default defineComponent({ const styles: any = {}; styles.opacity = showPopover.value ? 1 : 0; styles.visibility = showPopover.value ? 'visible' : 'hidden'; + styles.zIndex = getMaxZIndex() || 1050; return styles; }); /** -- Gitee From 7c700d5868ce71a807ce1ca5f3ddcb4cbef743d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Thu, 23 Oct 2025 11:53:36 +0800 Subject: [PATCH 70/79] =?UTF-8?q?fix:=20zindex=20=E5=80=BC=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui-vue/components/common/utils/use-max-zindex.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui-vue/components/common/utils/use-max-zindex.ts b/packages/ui-vue/components/common/utils/use-max-zindex.ts index 7555ccfb00..b56935e621 100644 --- a/packages/ui-vue/components/common/utils/use-max-zindex.ts +++ b/packages/ui-vue/components/common/utils/use-max-zindex.ts @@ -42,5 +42,5 @@ export const getMaxZIndex = () => { } } } - return max + 1; + return max ? max + 1 : 0; }; \ No newline at end of file -- Gitee From 2f0071e908372d67ef148d276525373d6ae90956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Thu, 23 Oct 2025 11:56:22 +0800 Subject: [PATCH 71/79] =?UTF-8?q?fix:=20zindex=20=E5=80=BC=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui-vue/components/popover/src/popover.component.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui-vue/components/popover/src/popover.component.tsx b/packages/ui-vue/components/popover/src/popover.component.tsx index a240400b7f..23565cc9f4 100644 --- a/packages/ui-vue/components/popover/src/popover.component.tsx +++ b/packages/ui-vue/components/popover/src/popover.component.tsx @@ -81,7 +81,7 @@ export default defineComponent({ const styles: any = {}; styles.opacity = showPopover.value ? 1 : 0; styles.visibility = showPopover.value ? 'visible' : 'hidden'; - styles.zIndex = getMaxZIndex() || 1050; + styles.zIndex = getMaxZIndex() || 1060; return styles; }); /** -- Gitee From 0d46a7d4aa759167230ac7e81183512b81f8b97b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Thu, 23 Oct 2025 13:47:41 +0800 Subject: [PATCH 72/79] =?UTF-8?q?fix:=20lookup=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E4=B8=BA=E7=A9=BA=E6=97=B6=E7=A6=81=E7=94=A8=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E6=9D=A1=E7=82=B9=E5=87=BB=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lookup/src/composition/use-datagrid.tsx | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) 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 9c10beba42..e992544333 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-datagrid.tsx +++ b/packages/ui-vue/components/lookup/src/composition/use-datagrid.tsx @@ -25,7 +25,7 @@ export function useDatagrid(props: LookupProps, context: SetupContext, navigatio const { checkPaination, checkMultiSelect, checkColumnOptions, navIsTreeList, isLoadAll, isPathCodeTree } = useCheckProps(props, lookupStates); const { updatePageInfo } = usePageInfo(props, pageInfoState); - const { updateSelections, isSelected, getPrimaryKey } = lookupSelectionsManager; + const { updateSelections, isSelected, getPrimaryKey } = lookupSelectionsManager; const { loadAndSelect } = useLoadData(props, lookupStates); @@ -43,6 +43,7 @@ export function useDatagrid(props: LookupProps, context: SetupContext, navigatio const currentPaginationOptions = ref(pageInfoState.default); const { setColumns } = useFavorite(props, lookupOptions.idField); + const lookupDatagridClass = ref({ 'lookup-datagrid': true, 'lookup-datagrid-empty': false }); watch(() => pageInfoState.default, (newPageInfo) => { currentPaginationOptions.value = newPageInfo; @@ -54,13 +55,14 @@ export function useDatagrid(props: LookupProps, context: SetupContext, navigatio function dataGridLoadData(items: any, total: number, pageInfo: Record | undefined) { const value: any = { total }; if (pageInfo) { - const {pageIndex: index, pageSize: size, enablePager: enable, pageList: sizeLimits } = pageInfo; - Object.assign(value, {index, size, enable}); + const { pageIndex: index, pageSize: size, enablePager: enable, pageList: sizeLimits } = pageInfo; + Object.assign(value, { index, size, enable }); } else { value.enable = false; } updatePageInfo(value); loadAndSelect(datagridRef.value, items || []); + lookupDatagridClass.value['lookup-datagrid-empty'] = !(items && items.length); } const relation = computed(() => { @@ -68,16 +70,15 @@ export function useDatagrid(props: LookupProps, context: SetupContext, navigatio const nodes = navSelectedItems.value; const filterParams = { relationFilter: getRelationFilter(nodes) }; if (!navIsTreeList() || !includeChilds.value) { - return filterParams; + return filterParams; } - + const { treeInfo } = navigationState; - const action = { action: 'navAllChildren', ...filterParams}; - return isPathCodeTree(treeInfo)? Object.assign(action, { navNodePathCode: getPathCode(nodes[0].data, treeInfo) }): action; + const action = { action: 'navAllChildren', ...filterParams }; + return isPathCodeTree(treeInfo) ? Object.assign(action, { navNodePathCode: getPathCode(nodes[0].data, treeInfo) }) : action; }); - - const unWatchLookupState = watch([() => lookupState?.columns, () => lookupState?.items, () => lookupState?.pageInfo, () => lookupState?.total, + const unWatchLookupState = watch([() => lookupState?.columns, () => lookupState?.items, () => lookupState?.pageInfo, () => lookupState?.total, () => lookupState?.selectedData ], ([newColumns, newItems, newPageInfo, newTotal, selectedData]) => { if (datagridRef.value) { @@ -119,7 +120,7 @@ export function useDatagrid(props: LookupProps, context: SetupContext, navigatio } function httpRequest() { - const queryParams= { search: searchState.default, action: 'list'}; + const queryParams = { search: searchState.default, action: 'list' }; if (props.openType === 'Modal' && relation.value) { Object.assign(queryParams, relation.value); } @@ -172,7 +173,7 @@ export function useDatagrid(props: LookupProps, context: SetupContext, navigatio } }); - + function onPageInfoChanged({ pageSize, pageIndex }) { let index = pageIndex; if (currentPaginationOptions.value?.size !== pageSize) { @@ -188,10 +189,6 @@ export function useDatagrid(props: LookupProps, context: SetupContext, navigatio context.emit("pageSizeChanged", params); } - const lookupDatagridClass = computed(() => { - return { 'lookup-datagrid': true, 'lookup-datagrid-empty': !lookupState.items?.length }; - }); - function renderDataGrid() { return Date: Thu, 23 Oct 2025 14:49:16 +0800 Subject: [PATCH 73/79] =?UTF-8?q?fix:=20lookup=E4=B8=8B=E6=8B=89=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E6=B8=85=E7=A9=BA=E6=93=8D=E4=BD=9C=E6=98=93=E7=94=A8?= =?UTF-8?q?=E6=80=A7=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lookup/src/composition/use-input-change.ts | 3 ++- .../ui-vue/components/lookup/src/lookup.component.tsx | 11 ++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/ui-vue/components/lookup/src/composition/use-input-change.ts b/packages/ui-vue/components/lookup/src/composition/use-input-change.ts index bdd73aee33..6dc07dc38e 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-input-change.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-input-change.ts @@ -138,6 +138,7 @@ export function useInputChange(props: LookupProps, context: any, options: Lookup changeOnEnter, onInputBlur, onEnterKeyDown, - isClear + isClear, + queryDataBySearchKeys }; } diff --git a/packages/ui-vue/components/lookup/src/lookup.component.tsx b/packages/ui-vue/components/lookup/src/lookup.component.tsx index 54a31528c7..c0ab197f72 100644 --- a/packages/ui-vue/components/lookup/src/lookup.component.tsx +++ b/packages/ui-vue/components/lookup/src/lookup.component.tsx @@ -105,7 +105,7 @@ export default defineComponent({ elementRef.value && !elementRef.value.getModal() && elementRef.value.openDialog(); } - const { onInputBlur, onEnterKeyDown, isClear } = useInputChange(props, context, + const { onInputBlur, onEnterKeyDown, isClear, queryDataBySearchKeys } = useInputChange(props, context, { beforeOpenDialog, updateModelValue, selectedItems: selectionState, openDialog, modelValue, useHttpComposition, lookupOptions, usePopupComposition, isPopuped @@ -159,8 +159,13 @@ export default defineComponent({ context.emit('update:modelValue', ''); updateIdValue(''); - if (openType.value === 'Popup') { - isPopuped.value && elementRef.value?.forceClosePopup(); + if (openType.value === 'Popup' && isPopuped.value) { + // isPopuped.value && elementRef.value?.forceClosePopup(); + popupState.canClose = true; + + if (!isClear.value) { + queryDataBySearchKeys(''); + } } const clearParams = { items: null, mappingFields: lookupOptions.mappingFields}; -- Gitee From 78c644e6261ad93fc07e7a11215d9e7e593f9665 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Thu, 23 Oct 2025 16:24:36 +0800 Subject: [PATCH 74/79] =?UTF-8?q?fix:=20lookup=E4=B8=8B=E6=8B=89=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E4=BA=A4=E4=BA=92=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../button-edit/src/button-edit.component.tsx | 27 ++++++++++++++++--- .../lookup/src/lookup.component.tsx | 1 + 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/packages/ui-vue/components/button-edit/src/button-edit.component.tsx b/packages/ui-vue/components/button-edit/src/button-edit.component.tsx index e56176f4de..af8ba03b9d 100644 --- a/packages/ui-vue/components/button-edit/src/button-edit.component.tsx +++ b/packages/ui-vue/components/button-edit/src/button-edit.component.tsx @@ -59,6 +59,9 @@ export default defineComponent({ const useClearComposition = useClear(props, context, modelValue, hasFocusedTextBox, displayText, useTextBoxComposition); const { onMouseEnterTextBox, onMouseLeaveTextBox } = useClearComposition; + // 是否只关闭弹窗,不触发beforeClose事件 + const justOnlyClosePopup = ref(false); + const buttonEditClass = computed(() => { const classObject = { 'f-button-edit': true, @@ -154,8 +157,10 @@ export default defineComponent({ getTextbox: () => { return buttonEditRef.value?.querySelector('input'); }, - forceClosePopup:() => { + forceClosePopup: () => { canOpenPopup.value = false; + justOnlyClosePopup.value = true; + shouldPopupContent.value = false; } }; @@ -175,11 +180,23 @@ export default defineComponent({ context.expose(componentInstance); watch(() => shouldPopupContent.value, async (newValue, oldValue) => { + // 如果是直接关闭弹窗的情况,则直接同步状态 + if (justOnlyClosePopup.value) { + canOpenPopup.value = newValue; + justOnlyClosePopup.value = false; + return; + } + + // 只有在尝试关闭弹窗且存在 beforeClosePopup 钩子时才拦截 if (!newValue && props.beforeClosePopup && typeof props.beforeClosePopup === 'function') { try { - const result = await props.beforeClosePopup(); - canOpenPopup.value = !result; - shouldPopupContent.value = !result && !props.readonly; + const canClose = await props.beforeClosePopup(); + canOpenPopup.value = !canClose; + + // 如果不允许关闭,则恢复 shouldPopupContent 的值 + if (!canClose || props.readonly) { + shouldPopupContent.value = true; + } } catch (error) { // 处理异步函数可能抛出的异常,保持 watcher 继续工作 console.error('Error in beforeClosePopup:', error); @@ -189,6 +206,8 @@ export default defineComponent({ } return; } + + // 默认情况直接同步状态 canOpenPopup.value = newValue; }); diff --git a/packages/ui-vue/components/lookup/src/lookup.component.tsx b/packages/ui-vue/components/lookup/src/lookup.component.tsx index c0ab197f72..76f88ac72c 100644 --- a/packages/ui-vue/components/lookup/src/lookup.component.tsx +++ b/packages/ui-vue/components/lookup/src/lookup.component.tsx @@ -164,6 +164,7 @@ export default defineComponent({ popupState.canClose = true; if (!isClear.value) { + searchValueChanged.value = true; queryDataBySearchKeys(''); } } -- Gitee From e512a3641a9934a628d2d91e2f2ea080b9d83b9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Thu, 23 Oct 2025 16:59:23 +0800 Subject: [PATCH 75/79] =?UTF-8?q?fix:=20number=E7=BB=84=E4=BB=B6dom=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0id=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/number-spinner/src/number-spinner.component.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui-vue/components/number-spinner/src/number-spinner.component.tsx b/packages/ui-vue/components/number-spinner/src/number-spinner.component.tsx index b5c3b80911..c98dea7b7c 100644 --- a/packages/ui-vue/components/number-spinner/src/number-spinner.component.tsx +++ b/packages/ui-vue/components/number-spinner/src/number-spinner.component.tsx @@ -82,7 +82,7 @@ export default defineComponent({ ); return () => ( -
    +
    {renderNumberTextBox()} {shouldShowSpinner.value && renderSpinner()}
    -- Gitee From 67e428b70a5132882dc3b3137d2cdbe55f01518f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Fri, 24 Oct 2025 11:52:12 +0800 Subject: [PATCH 76/79] =?UTF-8?q?fix:=20lookup=20=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=E5=85=B3=E9=97=ADAPI=20=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui-vue/components/lookup/src/composition/use-dialog.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 5ddebb568d..1bf5759d36 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-dialog.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-dialog.ts @@ -19,7 +19,10 @@ enum CloseType { esc = 'esc' }; -type DictPickedResult = boolean | { closeDialog: boolean; message?: string }; +type DictPickedResult = boolean | { + /** @deprecated 请使用 canClose 替代 */ + closeDialog: boolean; + message?: string, canClose: boolean }; type BeforeSelectResult = boolean | { canSelect: boolean; message?: string }; export interface UseDialogOptions { @@ -68,7 +71,7 @@ export function useDialog( function processDictPickedResult(result: DictPickedResult) { if (typeof result === 'object') { return { - shouldClose: result.closeDialog, + shouldClose: result.closeDialog || result.canClose, message: result.message }; } -- Gitee From d41a547ac542c358e3d2271cb7725601418765e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Fri, 24 Oct 2025 14:23:02 +0800 Subject: [PATCH 77/79] =?UTF-8?q?fix:=20=E6=97=A5=E6=9C=9F=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E6=8D=B7=E9=80=89=E6=8B=A9=E5=80=BC=E4=B8=8D=E5=87=86?= =?UTF-8?q?=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../date-picker/src/composition/use-quick-selector.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ui-vue/components/date-picker/src/composition/use-quick-selector.tsx b/packages/ui-vue/components/date-picker/src/composition/use-quick-selector.tsx index ec52af45d0..c137d98973 100644 --- a/packages/ui-vue/components/date-picker/src/composition/use-quick-selector.tsx +++ b/packages/ui-vue/components/date-picker/src/composition/use-quick-selector.tsx @@ -31,8 +31,8 @@ export function useQuickSelector(props: any, context: any) { { label: '今天', value: todayDate, description: '选择今天日期', code: 'today' }, { label: '昨天', value: subDays(todayDate, 1), description: '选择昨天日期', code: 'yesterday' }, { label: '明天', value: addDays(todayDate, 1), description: '选择明天日期', code: 'tomorrow' }, - { label: '本周一', value: startOfWeek(todayDate, { weekStartsOn }), description: '本周一', code: 'thisMonday' }, - { label: '下周一', value: addDays(startOfWeek(todayDate, { weekStartsOn }), 7), description: '下周一', code: 'nextMonday' }, + { label: '本周一', value: startOfWeek(todayDate, { weekStartsOn: 1 }), description: '本周一', code: 'thisMonday' }, + { label: '下周一', value: addDays(startOfWeek(todayDate, { weekStartsOn: 1 }), 7), description: '下周一', code: 'nextMonday' }, { label: '本月初', value: startOfMonth(todayDate), description: '本月第一天', code: 'firstDayOfMonth' }, { label: '本月末', value: endOfMonth(todayDate), description: '本月最后一天', code: 'lastDayOfMonth' }, // { label: '上月初', value: startOfMonth(subMonths(todayDate, 1)), description: '上月第一天', code: 'firstDayOfLastMonth' }, -- Gitee From a106df5e3619eb2c9ba336fcc04b35ff5e0c8d12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Fri, 24 Oct 2025 15:22:15 +0800 Subject: [PATCH 78/79] =?UTF-8?q?fix:=20lookup=E5=88=97=E8=A1=A8=E4=B8=AD?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=97=B6=E4=BB=BB=E6=84=8F=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=98=93=E7=94=A8=E6=80=A7=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui-vue/components/lookup/src/composition/use-dialog.ts | 2 +- .../ui-vue/components/lookup/src/composition/use-freeinput.ts | 2 +- packages/ui-vue/components/lookup/src/lookup.component.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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 1bf5759d36..7d7e94ec18 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-dialog.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-dialog.ts @@ -79,7 +79,7 @@ export function useDialog( } const runDictPickedAsync = async () => { - const mappingInfo = { items: selectedItems.value, mappingFields: lookupOptions.mappingFields }; + const mappingInfo = { items: selectedItems.value, mappingFields: lookupOptions.mappingFields, options: {...lookupOptions} }; context.emit('update:dataMapping', mappingInfo); useContext(props, mappingInfo); const pickedResult = await dictPicked(mappingInfo); diff --git a/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts b/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts index dc1c5add6b..7bbf4e59e9 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts @@ -5,7 +5,7 @@ export function useFreeInput(props: any, context: any, inputValue: string, looku return; } - const clearParams = { items: null, mappingFields: lookupOptions.mappingFields, isFreeInput: true }; + const clearParams = { items: null, mappingFields: lookupOptions.mappingFields, isFreeInput: true, options: {...lookupOptions} }; context.emit('clearMapping', clearParams); context.emit('update:modelValue', inputValue); context.emit('update:idValue', ''); diff --git a/packages/ui-vue/components/lookup/src/lookup.component.tsx b/packages/ui-vue/components/lookup/src/lookup.component.tsx index 76f88ac72c..498e59ea5c 100644 --- a/packages/ui-vue/components/lookup/src/lookup.component.tsx +++ b/packages/ui-vue/components/lookup/src/lookup.component.tsx @@ -169,7 +169,7 @@ export default defineComponent({ } } - const clearParams = { items: null, mappingFields: lookupOptions.mappingFields}; + const clearParams = { items: null, mappingFields: lookupOptions.mappingFields, options: {...lookupOptions}}; context.emit('clear', clearParams); useContext(props, clearParams); } -- Gitee From 1291e269be3c732f108ddea1ffeea1d8ae55a18c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Fri, 24 Oct 2025 16:38:30 +0800 Subject: [PATCH 79/79] =?UTF-8?q?fix:=20lookup=E4=B8=8B=E6=8B=89=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=80=89=E6=8B=A9=E5=90=8E=E4=BA=8B=E4=BB=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui-vue/components/lookup/src/composition/use-popup.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1df1bb8936..4edfe089ee 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-popup.tsx +++ b/packages/ui-vue/components/lookup/src/composition/use-popup.tsx @@ -112,8 +112,8 @@ export function usePopup(props: LookupProps, context, elementRef: Ref, { } function onSelectionsChanged() { + popupState.canClose = true; if (!lookupOptions.multiSelect) { - popupState.canClose = true; hidePopup(); } } -- Gitee