diff --git a/migration/i1.0c-release/oracle/20130718094134_IDEMPIERE-984.sql b/migration/i1.0c-release/oracle/20130718094134_IDEMPIERE-984.sql new file mode 100644 index 0000000000..951e2b600e --- /dev/null +++ b/migration/i1.0c-release/oracle/20130718094134_IDEMPIERE-984.sql @@ -0,0 +1,12 @@ +-- Jul 18, 2013 9:41:34 AM COT +-- IDEMPIERE-984 Change Role and Logout must check for unsaved records on open windows +INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Org_ID,Created,AD_Client_ID) VALUES ('I','You''re trying to close this tab.',200208,'D','2955ff22-87ac-401a-b5f8-66be72ad82a2','CloseTabFromBrowser?','Y',TO_DATE('2013-07-18 09:41:33','YYYY-MM-DD HH24:MI:SS'),100,100,0,TO_DATE('2013-07-18 09:41:33','YYYY-MM-DD HH24:MI:SS'),0) +; + +-- Jul 18, 2013 9:41:34 AM COT +-- IDEMPIERE-984 Change Role and Logout must check for unsaved records on open windows +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200208 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; +SELECT register_migration_script('20130718094134_IDEMPIERE-984.sql') FROM dual +; + diff --git a/migration/i1.0c-release/postgresql/20130718094134_IDEMPIERE-984.sql b/migration/i1.0c-release/postgresql/20130718094134_IDEMPIERE-984.sql new file mode 100644 index 0000000000..cdf5ca4a18 --- /dev/null +++ b/migration/i1.0c-release/postgresql/20130718094134_IDEMPIERE-984.sql @@ -0,0 +1,12 @@ +-- Jul 18, 2013 9:41:34 AM COT +-- IDEMPIERE-984 Change Role and Logout must check for unsaved records on open windows +INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Org_ID,Created,AD_Client_ID) VALUES ('I','You''re trying to close this tab.',200208,'D','2955ff22-87ac-401a-b5f8-66be72ad82a2','CloseTabFromBrowser?','Y',TO_TIMESTAMP('2013-07-18 09:41:33','YYYY-MM-DD HH24:MI:SS'),100,100,0,TO_TIMESTAMP('2013-07-18 09:41:33','YYYY-MM-DD HH24:MI:SS'),0) +; + +-- Jul 18, 2013 9:41:34 AM COT +-- IDEMPIERE-984 Change Role and Logout must check for unsaved records on open windows +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200208 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; +SELECT register_migration_script('20130718094134_IDEMPIERE-984.sql') FROM dual +; + diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java index f124b7d105..047f84ff27 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java @@ -411,6 +411,17 @@ public class AdempiereWebUI extends Window implements EventListener, IWeb //redirect to login page Executions.sendRedirect("index.zul"); } + public void logoutAfterTabDestroyed(){ + Session session = logout0(); + + //clear context, invalidate session + Env.getCtx().clear(); + session.invalidate(); + + //redirect to login page + Executions.sendRedirect("index.zul"); + } + protected Session logout0() { Session session = Executions.getCurrent().getDesktop().getSession(); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/IWebClient.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/IWebClient.java index f3b25f9880..905f461348 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/IWebClient.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/IWebClient.java @@ -33,6 +33,10 @@ public interface IWebClient { * logout */ public void logout(); + /** + * logout after browser destroyed + */ + public void logoutAfterTabDestroyed(); /** * diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/UserPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/UserPanel.java index ca2265442f..4e6a99592d 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/UserPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/UserPanel.java @@ -38,6 +38,7 @@ import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.event.KeyEvent; +import org.zkoss.zk.ui.util.Clients; import org.zkoss.zk.ui.util.Composer; import org.zkoss.zul.Menuitem; import org.zkoss.zul.impl.LabelImageElement; @@ -76,7 +77,9 @@ public class UserPanel implements EventListener, Composer protected void onCreate() { - lblUserNameValue = (Label) component.getFellowIfAny("loginUserAndRole", true); + String s = Msg.getMsg(Env.getCtx(), "CloseTabFromBrowser?").replace("\n", "
"); + Clients.confirmClose(s); + lblUserNameValue = (Label) component.getFellowIfAny("loginUserAndRole", true); lblUserNameValue.setValue(getUserName() + "@" + getClientName() + "." + getOrgName()+"/"+this.getRoleName()); lblUserNameValue.addEventListener(Events.ON_CLICK, this); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/session/SessionContextListener.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/session/SessionContextListener.java index c5841bf4c4..07d1b010ad 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/session/SessionContextListener.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/session/SessionContextListener.java @@ -319,6 +319,7 @@ public class SessionContextListener implements ExecutionInit, if (ServerContext.getCurrentInstance().isEmpty() || !isContextValid()) { + SessionManager.logoutSessionAfterBrowserDestroyed(); setupExecutionContextFromSession(Executions.getCurrent()); } int AD_Session_ID = Env.getContextAsInt(Env.getCtx(), "#AD_Session_ID"); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/session/SessionManager.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/session/SessionManager.java index 3ef9670f0d..3f1d15b2e5 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/session/SessionManager.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/session/SessionManager.java @@ -100,6 +100,12 @@ public class SessionManager if (app != null) app.logout(); } + public static void logoutSessionAfterBrowserDestroyed() + { + IWebClient app = getSessionApplication(); + if (app != null) + app.logoutAfterTabDestroyed(); + } public static void changeRole(MUser user){ IWebClient app = getSessionApplication();