From c72d4609b1abe87d3be02aba5316b7a9b66f793e Mon Sep 17 00:00:00 2001 From: hengsin Date: Tue, 20 Jul 2021 17:17:54 +0800 Subject: [PATCH] IDEMPIERE-4864 Fix shortcut handling for combobox and ad window (#784) Fix focus issue after closing of Process Info Dialog. --- .../src/org/adempiere/webui/ShowMaskWrapper.java | 9 +++++++++ .../webui/adwindow/AbstractADWindowContent.java | 5 +++-- .../adempiere/webui/apps/AbstractProcessDialog.java | 11 +++++++++++ .../adempiere/webui/component/ProcessInfoDialog.java | 5 +++-- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/ShowMaskWrapper.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/ShowMaskWrapper.java index da3e325a5f..6f36ad32fa 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/ShowMaskWrapper.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/ShowMaskWrapper.java @@ -16,7 +16,9 @@ package org.adempiere.webui; import org.adempiere.webui.component.Mask; import org.adempiere.webui.part.UIPart; +import org.zkoss.zk.au.out.AuScript; import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.util.Clients; /** * Helper class for any component want implement {@link ISupportMask} @@ -73,7 +75,14 @@ public class ShowMaskWrapper implements ISupportMask { if (maskObj != null || maskObj.getParent() != null){ // in same request, not yet call to show mask if (!ShowMaskWrapper.hasFlagShowMask(comp)){ + Component p = maskObj.getParent(); maskObj.detach(); + if (p == comp) { + StringBuilder script = new StringBuilder("var w=zk.Widget.$('#"); + script.append(p.getUuid()).append("');"); + script.append("w.busy=null;"); + Clients.response(new AuScript(script.toString())); + } } } } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java index 6ba4838714..23803224a1 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java @@ -3486,7 +3486,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements showBusyMask(dialog); LayoutUtils.openOverlappedWindow(getComponent(), dialog, "middle_center"); } - dialog.focus(); + Executions.schedule(getComponent().getDesktop(), e -> dialog.focus(), new Event("onPostShowProcessModalDialog")); } if (adTabbox.getSelectedGridTab().isQuickForm()) { adTabbox.getSelectedGridTab().dataRefreshAll(false, false); @@ -3653,7 +3653,8 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements if (m_logs != null && m_logs.length > 0) { - ProcessInfoDialog.showProcessInfo(pi, curWindowNo, getComponent(), false); + ProcessInfoDialog dialog = ProcessInfoDialog.showProcessInfo(pi, curWindowNo, getComponent(), false); + dialog.addEventListener(DialogEvents.ON_WINDOW_CLOSE, e -> focusToActivePanel()); } } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java index 69c89961bc..95efc317a9 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java @@ -1356,4 +1356,15 @@ public abstract class AbstractProcessDialog extends Window implements IProcessUI } }); } + + @Override + public void focus() { + super.focus(); + if (getParameterPanel() != null) { + if (getParameterPanel().focusToFirstEditor()) + return; + } + if (bOK != null) + bOK.focus(); + } } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/ProcessInfoDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/ProcessInfoDialog.java index 4c9ef17d18..b8def6dbf0 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/ProcessInfoDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/ProcessInfoDialog.java @@ -215,7 +215,7 @@ public class ProcessInfoDialog extends Window implements EventListener { * @param needFillLogFromDb if ProcessInfoUtil.setLogFromDB(pi) is called by outer function, * just pass false, other pass true to avoid duplicate message */ - public static void showProcessInfo (ProcessInfo pi, int windowNo, final Component comp, boolean needFillLogFromDb) { + public static ProcessInfoDialog showProcessInfo (ProcessInfo pi, int windowNo, final Component comp, boolean needFillLogFromDb) { ProcessInfoDialog dialog = new ProcessInfoDialog(AEnv.getDialogHeader(Env.getCtx(), windowNo),AEnv.getDialogHeader(Env.getCtx(), windowNo), pi, needFillLogFromDb); final ISupportMask supportMask = LayoutUtils.showWindowWithMask(dialog, comp, LayoutUtils.OVERLAP_PARENT); dialog.addEventListener(DialogEvents.ON_WINDOW_CLOSE, new EventListener() { @@ -224,6 +224,7 @@ public class ProcessInfoDialog extends Window implements EventListener { supportMask.hideMask(); } }); - Executions.schedule(comp.getDesktop(), e -> dialog.btnOk.focus(), new Event("onPostShowProcessInfoDialog")); + Executions.schedule(comp.getDesktop(), e -> dialog.btnOk.focus(), new Event("onPostShowProcessInfoDialog")); + return dialog; } }