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 e56176f4dee64e92e5fc3c6341031f46049ef19e..af8ba03b9dd361f25d6ec2420e319c3849662095 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/common/utils/use-max-zindex.ts b/packages/ui-vue/components/common/utils/use-max-zindex.ts index 7555ccfb00693044520df5ad6098b32763a74777..b56935e6218b48d78f662b0e9f593f85b034ead0 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 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 ec52af45d048641154f4f677a2442cbb23e7ec30..c137d98973246a597b59c9d3100829b98928e73f 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' }, 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 9c10beba420bf4adcb6e4600dcca8a5fbd64f628..e992544333ab0a5a34cddfee4f0ba7949abe052d 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 { - 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 dc1c5add6bab2d082df08ada836ab93c69603cb4..7bbf4e59e996bc3ac17036c00108d0909271c756 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/composition/use-input-change.ts b/packages/ui-vue/components/lookup/src/composition/use-input-change.ts index bdd73aee33193748fc4b0942a8d9393f0c1ab76b..6dc07dc38ef885605042422d546605f794039663 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/composition/use-popup.tsx b/packages/ui-vue/components/lookup/src/composition/use-popup.tsx index 1df1bb89363f664bef701dca346390f87b44aac7..4edfe089eed17e0426f439848fbb7da94999e617 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(); } } diff --git a/packages/ui-vue/components/lookup/src/lookup.component.tsx b/packages/ui-vue/components/lookup/src/lookup.component.tsx index 54a31528c79a99a33cc62a24ab9ef0b09426c961..498e59ea5c2b509eb999d0542071e56f836f0630 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,11 +159,17 @@ 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) { + searchValueChanged.value = true; + queryDataBySearchKeys(''); + } } - const clearParams = { items: null, mappingFields: lookupOptions.mappingFields}; + const clearParams = { items: null, mappingFields: lookupOptions.mappingFields, options: {...lookupOptions}}; context.emit('clear', clearParams); useContext(props, clearParams); } 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 b5c3b809114899da0074fa4906b4601e639a80f9..c98dea7b7cf064de94b8ef6d2fb2f8e223cd8fe1 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()}
diff --git a/packages/ui-vue/components/popover/src/popover.component.tsx b/packages/ui-vue/components/popover/src/popover.component.tsx index a240400b7fcb4576518c1011db397b8546357118..23565cc9f40e13f566c34655a12414cd7c85f46d 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; }); /**