From 17f1957d70dd9a79c0f0cd03097e792e02fb8586 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Mon, 13 Feb 2023 14:52:00 +0100 Subject: [PATCH] IDEMPIERE-5520 Navigation between Tabs leave Detached DOM objects (Leak) (#1671) * IDEMPIERE-5520 Navigation between Tabs leave Detached DOM objects (Leak) - Fix another "Not unique in the ID space of" when tab where clause have context variables and is navigated using zoom - Add extra cleanup in the unexpected case a Find window is created again * IDEMPIERE-5520 Navigation between Tabs leave Detached DOM objects (Leak) - the delay removal using schedule is needed as immediate removal from parent will cause memory leak at browser --------- Co-authored-by: hengsin --- .../webui/adwindow/AbstractADWindowContent.java | 9 +++++++++ .../src/org/adempiere/webui/window/FindWindow.java | 5 ++++- 2 files changed, 13 insertions(+), 1 deletion(-) 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 52a9b1d450..5d7a757b59 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 @@ -4332,6 +4332,15 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements if (findWindow != null && isCurrentFindWindowValid()) { toolbar.setSelectedUserQuery(findWindow.getAD_UserQuery_ID()); } else { + if (findWindow != null) { + //reset to no/auto id + FindWindow old = findWindow; + old.setId(""); + if (old.getDesktop() != null) { + AEnv.detachInputElement(old); + Executions.schedule(old.getDesktop(), e -> old.detach(), new Event("onDetachOldFindWindow")); + } + } findWindow = new FindWindow (adTabbox.getSelectedGridTab().getWindowNo(), adTabbox.getSelectedGridTab().getTabNo(), adTabbox.getSelectedGridTab().getName(), adTabbox.getSelectedGridTab().getAD_Table_ID(), adTabbox.getSelectedGridTab().getTableName(), adTabbox.getSelectedGridTab().getWhereExtended(), findFields, 1, adTabbox.getSelectedGridTab().getAD_Tab_ID(), this); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java index 6c1a0787a9..496716d178 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java @@ -389,7 +389,10 @@ public class FindWindow extends Window implements EventListener, ValueCha if ((title == null && m_title != null) || (title != null && m_title == null) || !(title.equals(m_title))) return false; if (AD_Table_ID != m_AD_Table_ID) return false; if ((tableName == null && m_tableName != null) || (tableName != null && m_tableName == null) || !(tableName.equals(m_tableName))) return false; - whereExtended = Env.parseContext(Env.getCtx(), targetWindowNo, whereExtended, false); + if (whereExtended.contains("@")) + whereExtended = Env.parseContext(Env.getCtx(), targetWindowNo, whereExtended, false); + if (m_whereExtended.contains("@")) + m_whereExtended = Env.parseContext(Env.getCtx(), targetWindowNo, whereExtended, false); if ((whereExtended == null && m_whereExtended != null) || (whereExtended != null && m_whereExtended == null) || !(whereExtended.equals(m_whereExtended))) return false; if (adTabId != m_AD_Tab_ID) return false; if ((findFields == null && m_findFields != null) || (findFields != null && m_findFields == null) || (findFields.length != m_findFields.length)) return false;