From b98154670d0ba9bc451c3c17be5b67273715a894 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Fri, 20 Oct 2017 12:25:52 +0800 Subject: [PATCH] IDEMPIERE-3518 Improvement For Mobile Compatibility. Fix calendar errors on mobile devices. --- .../webui/dashboard/CalendarWindow.java | 24 ++++++++++++- .../adempiere/webui/dashboard/DPCalendar.java | 26 +++++++++++++- .../org/adempiere/webui/panel/WSchedule.java | 26 +++++++++++++- .../adempiere/webui/part/WindowContainer.java | 24 +++++++++---- org.adempiere.ui.zk/index.zul | 36 +++++++++++++++++++ 5 files changed, 126 insertions(+), 10 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/dashboard/CalendarWindow.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/dashboard/CalendarWindow.java index 34dfb4cbf5..a632c2e1dd 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/dashboard/CalendarWindow.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/dashboard/CalendarWindow.java @@ -28,10 +28,11 @@ import java.util.Map; import java.util.Properties; import java.util.TimeZone; - +import org.adempiere.webui.ClientInfo; import org.adempiere.webui.component.Tabpanel; import org.adempiere.webui.component.Window; import org.adempiere.webui.panel.ITabOnCloseHandler; +import org.adempiere.webui.part.WindowContainer; import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.util.ZKUpdateUtil; @@ -80,6 +81,7 @@ public class CalendarWindow extends Window implements EventListener, ITab * */ private static final long serialVersionUID = 1576992746053720647L; + private static final String ON_MOBILE_SET_SELECTED_TAB_ECHO = "onMobileSetSelectedTabEcho"; private Calendars calendars; private SimpleCalendarModel scm; @@ -187,15 +189,35 @@ public class CalendarWindow extends Window implements EventListener, ITab calendars.addEventListener("onEventUpdate", this); calendars.addEventListener("onMouseOver", this); + if (ClientInfo.isMobile()) { + addCallback(AFTER_PAGE_ATTACHED, t -> afterPageAttached()); + addEventListener(ON_MOBILE_SET_SELECTED_TAB_ECHO, evt -> calendars.invalidate()); + } + SessionManager.getAppDesktop().showWindow(this); // IDEMPIERE-1457: when show this window on tab, handle event close to remove calendars away scm Component parentTab = this.getParent(); if (parentTab != null && parentTab.getClass().equals(Tabpanel.class)) { ((Tabpanel)parentTab).setOnCloseHandler(this); + } + } + + private void afterPageAttached() { + Component p = getParent(); + while (p != null) { + if (p instanceof Tabpanel) { + p.addEventListener(WindowContainer.ON_MOBILE_SET_SELECTED_TAB, evt -> onMobileSelected()); + break; + } + p = p.getParent(); } } + private void onMobileSelected() { + Events.echoEvent(ON_MOBILE_SET_SELECTED_TAB_ECHO, this, null); + } + public void onClose(Tabpanel tabPanel){ //IDEMPIERE-1457: On close, remove calendars away scm calendars.setModel(null); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/dashboard/DPCalendar.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/dashboard/DPCalendar.java index d53baee448..95732f1b06 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/dashboard/DPCalendar.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/dashboard/DPCalendar.java @@ -30,6 +30,9 @@ import org.adempiere.base.Service; import org.adempiere.base.event.AbstractEventHandler; import org.adempiere.base.event.EventManager; import org.adempiere.base.event.IEventTopics; +import org.adempiere.webui.ClientInfo; +import org.adempiere.webui.component.Tabpanel; +import org.adempiere.webui.part.WindowContainer; import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.util.ServerPushTemplate; @@ -70,11 +73,12 @@ import org.zkoss.zul.impl.LabelImageElement; */ public class DPCalendar extends DashboardPanel implements EventListener, EventHandler { - + /** * */ private static final long serialVersionUID = -224914882522997787L; + private static final String ON_MOBILE_SET_SELECTED_TAB_ECHO = "onMobileSetSelectedTabEcho"; private Calendars calendars; private SimpleCalendarModel scm; private LabelImageElement btnCal, btnRefresh; @@ -137,6 +141,26 @@ public class DPCalendar extends DashboardPanel implements EventListener, DPCalendar.this.cleanup(); } }; + + if (ClientInfo.isMobile()) { + addCallback(AFTER_PAGE_ATTACHED, t -> afterPageAttached()); + addEventListener(ON_MOBILE_SET_SELECTED_TAB_ECHO, evt -> calendars.invalidate()); + } + } + + private void afterPageAttached() { + Component p = getParent(); + while (p != null) { + if (p instanceof Tabpanel) { + p.addEventListener(WindowContainer.ON_MOBILE_SET_SELECTED_TAB, evt -> onMobileSelected()); + break; + } + p = p.getParent(); + } + } + + private void onMobileSelected() { + Events.echoEvent(ON_MOBILE_SET_SELECTED_TAB_ECHO, this, null); } private synchronized void createStaticListeners() { diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WSchedule.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WSchedule.java index c1dd3389c4..66f729fba7 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WSchedule.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WSchedule.java @@ -24,9 +24,12 @@ import java.util.GregorianCalendar; import java.util.TimeZone; import java.util.logging.Level; +import org.adempiere.webui.ClientInfo; +import org.adempiere.webui.component.Tabpanel; import org.adempiere.webui.component.ToolBarButton; import org.adempiere.webui.component.Window; import org.adempiere.webui.component.ZkCssHelper; +import org.adempiere.webui.part.WindowContainer; import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.util.ZKUpdateUtil; @@ -69,6 +72,7 @@ public class WSchedule extends Window implements EventListener * */ private static final long serialVersionUID = -4819513326165148245L; + private static final String ON_MOBILE_SET_SELECTED_TAB_ECHO = "onMobileSetSelectedTabEcho"; @SuppressWarnings("unused") private InfoSchedule infoSchedule; @@ -204,7 +208,27 @@ public class WSchedule extends Window implements EventListener divTabClicked(7); addEventListener("onAfterReCreate", this); - } // jbInit + + if (ClientInfo.isMobile()) { + addCallback(AFTER_PAGE_ATTACHED, t -> afterPageAttached()); + addEventListener(ON_MOBILE_SET_SELECTED_TAB_ECHO, evt -> calendars.invalidate()); + } + } + + private void afterPageAttached() { + Component p = getParent(); + while (p != null) { + if (p instanceof Tabpanel) { + p.addEventListener(WindowContainer.ON_MOBILE_SET_SELECTED_TAB, evt -> onMobileSelected()); + break; + } + p = p.getParent(); + } + } + + private void onMobileSelected() { + Events.echoEvent(ON_MOBILE_SET_SELECTED_TAB_ECHO, this, null); + } /** * Recreate View diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/part/WindowContainer.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/part/WindowContainer.java index f57945bc9d..06f4a37c56 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/part/WindowContainer.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/part/WindowContainer.java @@ -49,6 +49,8 @@ import org.zkoss.zul.Menuitem; */ public class WindowContainer extends AbstractUIPart implements EventListener { + public static final String ON_MOBILE_SET_SELECTED_TAB = "onMobileSetSelectedTab"; + private static final String ON_AFTER_TAB_CLOSE = "onAfterTabClose"; private static final String ON_DEFER_SET_SELECTED_TAB = "onDeferSetSelectedTab"; @@ -100,8 +102,11 @@ public class WindowContainer extends AbstractUIPart implements EventListener { - updateMobileTabState(tabbox.getSelectedTab()); - updateTabListButton(); + if (isMobile()) { + updateMobileTabState(tabbox.getSelectedTab()); + updateTabListButton(); + tabbox.getTabs().invalidate(); + } }); Tabpanels tabpanels = new Tabpanels(); @@ -474,8 +479,11 @@ public class WindowContainer extends AbstractUIPart implements EventListener