From 92e85aac61b913789d36968194f8a6b408737f07 Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 19 Sep 2017 17:33:31 +0200 Subject: [PATCH 01/45] Deactivated overlay listeners on mobile devices --- .../desktop/app/DesktopActivityMapper.java | 2 +- .../partials/old/EventRegattaLeaderboard.gss | 2 +- .../gwt/home/shared/SwitchingEntryPoint.java | 12 +-- .../ui/client/media/MediaPlayerSettings.java | 2 +- .../RaceBoardAuthenticationView.java | 2 +- .../gwt/ui/raceboard/RaceBoardEntryPoint.java | 2 +- java/com.sap.sse.gwt/META-INF/MANIFEST.MF | 1 + .../client/formfactor/DeviceCategory.java | 2 +- .../client/formfactor/DeviceDetector.java | 2 +- .../gwt}/client/formfactor/MetaTagUtil.java | 2 +- .../panels/OverlayAssistantScrollPanel.java | 91 +++++++++++-------- .../panels/OverlayAssistantScrollPanel.ui.xml | 19 ++-- 12 files changed, 77 insertions(+), 62 deletions(-) rename java/{com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common => com.sap.sse.gwt/src/com/sap/sse/gwt}/client/formfactor/DeviceCategory.java (55%) rename java/{com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common => com.sap.sse.gwt/src/com/sap/sse/gwt}/client/formfactor/DeviceDetector.java (98%) rename java/{com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common => com.sap.sse.gwt/src/com/sap/sse/gwt}/client/formfactor/MetaTagUtil.java (98%) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/DesktopActivityMapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/DesktopActivityMapper.java index d6a1150832c..6fdd5559268 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/DesktopActivityMapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/DesktopActivityMapper.java @@ -3,7 +3,6 @@ package com.sap.sailing.gwt.home.desktop.app; import com.google.gwt.activity.shared.Activity; import com.google.gwt.activity.shared.ActivityMapper; import com.google.gwt.place.shared.Place; -import com.sap.sailing.gwt.common.client.formfactor.DeviceDetector; import com.sap.sailing.gwt.home.desktop.places.aboutus.AboutUsActivityProxy; import com.sap.sailing.gwt.home.desktop.places.aboutus.AboutUsPlace; import com.sap.sailing.gwt.home.desktop.places.contact.ContactActivityProxy; @@ -35,6 +34,7 @@ import com.sap.sailing.gwt.home.shared.places.user.confirmation.ConfirmationPlac import com.sap.sailing.gwt.home.shared.places.user.passwordreset.PasswordResetActivityProxy; import com.sap.sailing.gwt.home.shared.places.user.passwordreset.PasswordResetPlace; import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace; +import com.sap.sse.gwt.client.formfactor.DeviceDetector; public class DesktopActivityMapper implements ActivityMapper { private final DesktopClientFactory clientFactory; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/EventRegattaLeaderboard.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/EventRegattaLeaderboard.gss index 1c2c0a867a0..c19abc8c77e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/EventRegattaLeaderboard.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/EventRegattaLeaderboard.gss @@ -238,7 +238,7 @@ } .letItScroll { overflow-x: auto; - margin: 10px 0px; + padding: 10px 30px 10px 10px; } .regattaleaderboard_meta_fullscreen_button { background-color: #9f9f9f; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/SwitchingEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/SwitchingEntryPoint.java index f58518d477f..e58ad8506f6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/SwitchingEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/SwitchingEntryPoint.java @@ -1,10 +1,10 @@ package com.sap.sailing.gwt.home.shared; -import static com.sap.sailing.gwt.common.client.formfactor.MetaTagUtil.SCALE_VALUE_LARGE; -import static com.sap.sailing.gwt.common.client.formfactor.MetaTagUtil.SCALE_VALUE_NORMAL; -import static com.sap.sailing.gwt.common.client.formfactor.MetaTagUtil.SCALE_VALUE_SMALL; -import static com.sap.sailing.gwt.common.client.formfactor.MetaTagUtil.SCALE_VALUE_SMALLER; -import static com.sap.sailing.gwt.common.client.formfactor.MetaTagUtil.setViewportToDeviceWidth; +import static com.sap.sse.gwt.client.formfactor.MetaTagUtil.SCALE_VALUE_LARGE; +import static com.sap.sse.gwt.client.formfactor.MetaTagUtil.SCALE_VALUE_NORMAL; +import static com.sap.sse.gwt.client.formfactor.MetaTagUtil.SCALE_VALUE_SMALL; +import static com.sap.sse.gwt.client.formfactor.MetaTagUtil.SCALE_VALUE_SMALLER; +import static com.sap.sse.gwt.client.formfactor.MetaTagUtil.setViewportToDeviceWidth; import java.util.logging.Logger; @@ -21,13 +21,13 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RootPanel; import com.sap.sailing.gwt.common.client.SharedResources; -import com.sap.sailing.gwt.common.client.formfactor.DeviceDetector; import com.sap.sailing.gwt.home.desktop.DesktopEntryPoint; import com.sap.sailing.gwt.home.mobile.MobileEntryPoint; import com.sap.sailing.gwt.home.shared.app.ApplicationHistoryMapper; import com.sap.sailing.gwt.home.shared.app.ApplicationPlaceUpdater; import com.sap.sailing.gwt.home.shared.app.HasMobileVersion; import com.sap.sailing.gwt.home.shared.app.MobileSupport; +import com.sap.sse.gwt.client.formfactor.DeviceDetector; /** * Wrapper EntryPoint for the Home module that decides if the desktop or mobile page will be shown and internally starts diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaPlayerSettings.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaPlayerSettings.java index 364c6a9e337..6159a0fd845 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaPlayerSettings.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaPlayerSettings.java @@ -1,7 +1,7 @@ package com.sap.sailing.gwt.ui.client.media; -import com.sap.sailing.gwt.common.client.formfactor.DeviceDetector; import com.sap.sse.common.settings.AbstractSettings; +import com.sap.sse.gwt.client.formfactor.DeviceDetector; import com.sap.sse.gwt.shared.GwtHttpRequestUtils; public class MediaPlayerSettings extends AbstractSettings { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardAuthenticationView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardAuthenticationView.java index 3737685e679..e58541248af 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardAuthenticationView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardAuthenticationView.java @@ -1,6 +1,6 @@ package com.sap.sailing.gwt.ui.raceboard; -import com.sap.sailing.gwt.common.client.formfactor.DeviceDetector; +import com.sap.sse.gwt.client.formfactor.DeviceDetector; import com.sap.sse.security.ui.authentication.view.AbstractFlyoutAuthenticationView; public class RaceBoardAuthenticationView extends AbstractFlyoutAuthenticationView { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java index 4aee6a68bc4..8f3471cec21 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java @@ -11,7 +11,6 @@ import com.google.gwt.user.client.rpc.ServiceDefTarget; import com.google.gwt.user.client.ui.DockLayoutPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RootLayoutPanel; -import com.sap.sailing.gwt.common.client.formfactor.DeviceDetector; import com.sap.sailing.gwt.settings.client.raceboard.RaceBoardPerspectiveOwnSettings; import com.sap.sailing.gwt.settings.client.raceboard.RaceboardContextDefinition; import com.sap.sailing.gwt.settings.client.utils.StoredSettingsLocationFactory; @@ -26,6 +25,7 @@ import com.sap.sailing.gwt.ui.shared.RaceWithCompetitorsDTO; import com.sap.sailing.gwt.ui.shared.RaceboardDataDTO; import com.sap.sse.gwt.client.EntryPointHelper; import com.sap.sse.gwt.client.async.AsyncActionsExecutor; +import com.sap.sse.gwt.client.formfactor.DeviceDetector; import com.sap.sse.gwt.client.player.Timer; import com.sap.sse.gwt.client.player.Timer.PlayModes; import com.sap.sse.gwt.client.shared.components.Component; diff --git a/java/com.sap.sse.gwt/META-INF/MANIFEST.MF b/java/com.sap.sse.gwt/META-INF/MANIFEST.MF index 8080e3ab6eb..42a33e37835 100644 --- a/java/com.sap.sse.gwt/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.gwt/META-INF/MANIFEST.MF @@ -34,6 +34,7 @@ Export-Package: com.google.gwt.user.client.rpc.core.java.util, com.sap.sse.gwt.client.dialog, com.sap.sse.gwt.client.event, com.sap.sse.gwt.client.filestorage, + com.sap.sse.gwt.client.formfactor, com.sap.sse.gwt.client.media, com.sap.sse.gwt.client.mutationobserver, com.sap.sse.gwt.client.mvp, diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/formfactor/DeviceCategory.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/formfactor/DeviceCategory.java similarity index 55% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/formfactor/DeviceCategory.java rename to java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/formfactor/DeviceCategory.java index 819cd4fa9cc..40af48365ba 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/formfactor/DeviceCategory.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/formfactor/DeviceCategory.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.common.client.formfactor; +package com.sap.sse.gwt.client.formfactor; public enum DeviceCategory { DESKTOP, diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/formfactor/DeviceDetector.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/formfactor/DeviceDetector.java similarity index 98% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/formfactor/DeviceDetector.java rename to java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/formfactor/DeviceDetector.java index 608455d68d8..7ffb5f49981 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/formfactor/DeviceDetector.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/formfactor/DeviceDetector.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.common.client.formfactor; +package com.sap.sse.gwt.client.formfactor; import java.util.logging.Logger; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/formfactor/MetaTagUtil.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/formfactor/MetaTagUtil.java similarity index 98% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/formfactor/MetaTagUtil.java rename to java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/formfactor/MetaTagUtil.java index 35590d255d6..ac22fe9a079 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/formfactor/MetaTagUtil.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/formfactor/MetaTagUtil.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.common.client.formfactor; +package com.sap.sse.gwt.client.formfactor; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.HeadElement; diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java index 296a8667b2e..de6ab54884c 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java @@ -8,6 +8,7 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ScrollEvent; @@ -18,15 +19,19 @@ import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.EventListener; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.ScrollPanel; -import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.gwt.client.formfactor.DeviceDetector; /** * This scrollpanel overlays a second scrollbar fixed to the bottom of the viewport as soon as the original scrollbar is - * not visible anymore.

+ * not visible anymore. + *

* * This class observes a set of events to properly synchronize scrollbar states: * @@ -39,16 +44,16 @@ import com.google.gwt.user.client.ui.Widget; public class OverlayAssistantScrollPanel extends ScrollPanel { private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); - interface MyUiBinder extends UiBinder { + interface MyUiBinder extends UiBinder { } + private DivElement overlayWidget; @UiField - protected ScrollPanel overlayScrollPanelUi; + protected DivElement overlayScrollPanelUi; @UiField - protected SimplePanel overlayDummyContentUi; + protected DivElement overlayDummyContentUi; private final OverlayAnimation animation = new OverlayAnimation(); private final List registrations = new ArrayList<>(); - private Widget overlayWidget; private final Element contentToSyncWith; private final boolean hasMutationObservationCapability; @@ -60,7 +65,7 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { public OverlayAssistantScrollPanel(Widget contentToScroll) { super(contentToScroll); // add 15 pixel spacing between bottom scrollpanel and scrolled content - this.getElement().getStyle().setPaddingBottom(15, Unit.PX); + this.getElement().getStyle().setPaddingBottom(25, Unit.PX); contentToSyncWith = contentToScroll.getElement(); this.hasMutationObservationCapability = weCanObserve(); } @@ -69,20 +74,18 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { * Bind all observers required to manage both scrollbars in sync. */ @Override - protected void onAttach() { - super.onAttach(); - GWT.log("onAttach"); + protected void onLoad() { + overlayWidget = uiBinder.createAndBindUi(this); + RootPanel.get().getElement().appendChild(overlayWidget); if (!hasMutationObservationCapability) { return; } - overlayWidget = uiBinder.createAndBindUi(this); - RootPanel.get().add(overlayWidget); Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { matchScrollpanelAndContentWidths(); updateOverlayDisplay(); - syncScrollers(OverlayAssistantScrollPanel.this, overlayScrollPanelUi); + applyScrollpanelToOverlay(); } }); registrations.add(Window.addResizeHandler(new ResizeHandler() { @@ -90,7 +93,7 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { public void onResize(ResizeEvent event) { matchScrollpanelAndContentWidths(); updateOverlayDisplay(); - syncScrollers(OverlayAssistantScrollPanel.this, overlayScrollPanelUi); + applyScrollpanelToOverlay(); } })); registrations.add(Window.addWindowScrollHandler(new Window.ScrollHandler() { @@ -103,22 +106,15 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { registrations.add(this.addScrollHandler(new ScrollHandler() { @Override public void onScroll(ScrollEvent event) { - syncScrollers(OverlayAssistantScrollPanel.this, overlayScrollPanelUi); - } - })); - registrations.add(overlayScrollPanelUi.addScrollHandler(new ScrollHandler() { - @Override - public void onScroll(ScrollEvent event) { - syncScrollers(overlayScrollPanelUi, OverlayAssistantScrollPanel.this); + applyScrollpanelToOverlay(); } })); final JavaScriptObject observer = setupObserver(contentToSyncWith, new Command() { @Override public void execute() { - GWT.log("contentToSyncWith"); matchScrollpanelAndContentWidths(); updateOverlayDisplay(); - syncScrollers(OverlayAssistantScrollPanel.this, overlayScrollPanelUi); + applyScrollpanelToOverlay(); } }); registrations.add(new HandlerRegistration() { @@ -129,15 +125,33 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { } } }); + if (!DeviceDetector.isMobile()) { + // only bind reverse scrolling through overlay scrollpanel in desktop + DOM.sinkEvents(overlayScrollPanelUi, Event.ONSCROLL); + DOM.setEventListener(overlayScrollPanelUi, new EventListener() { + @Override + public void onBrowserEvent(Event event) { + if (event.getTypeInt() == Event.ONSCROLL) { + applyOverlayToScrollpanel(); + } + } + }); + } + } + + private void applyScrollpanelToOverlay() { + syncScrollers(this.getElement(), overlayScrollPanelUi); + matchScrollpanelAndContentWidths(); + } + + private void applyOverlayToScrollpanel() { + syncScrollers(overlayScrollPanelUi, this.getElement()); + matchScrollpanelAndContentWidths(); } - /** - * Detach all observers. - */ @Override - protected void onDetach() { - GWT.log("onDetach"); - super.onDetach(); + protected void onUnload() { + super.onUnload(); if (!hasMutationObservationCapability) { return; } @@ -145,7 +159,7 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { for (HandlerRegistration handlerRegistration : registrations) { handlerRegistration.removeHandler(); } - if (overlayWidget.isAttached()) { + if (overlayWidget != null) { overlayWidget.removeFromParent(); } } @@ -154,8 +168,8 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { * Helper method that synchronizes the scroll position of the target scrollpanel, using the data gathered from the * source scrollpanel */ - private void syncScrollers(ScrollPanel source, ScrollPanel target) { - target.setHorizontalScrollPosition(source.getHorizontalScrollPosition()); + private void syncScrollers(Element source, Element target) { + target.setScrollLeft(source.getScrollLeft()); } /** @@ -163,10 +177,9 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { * content. */ private void matchScrollpanelAndContentWidths() { - overlayDummyContentUi.getElement().getStyle().setWidth(contentToSyncWith.getClientWidth(), Unit.PX); - overlayScrollPanelUi.getElement().getStyle().setWidth(OverlayAssistantScrollPanel.this.getOffsetWidth() + 16, - Unit.PX); - overlayScrollPanelUi.getElement().getStyle().setMarginLeft(this.getAbsoluteLeft(), Unit.PX); + overlayDummyContentUi.getStyle().setWidth(contentToSyncWith.getClientWidth(), Unit.PX); + overlayScrollPanelUi.getStyle().setWidth(OverlayAssistantScrollPanel.this.getOffsetWidth(), Unit.PX); + overlayScrollPanelUi.getStyle().setMarginLeft(this.getAbsoluteLeft(), Unit.PX); } /** @@ -269,17 +282,17 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { @Override protected void onStart() { - overlayWidget.getElement().getStyle().setOpacity(overlayRequestedTargetState ? 0 : 1); + overlayWidget.getStyle().setOpacity(overlayRequestedTargetState ? 0 : 1); } @Override protected void onUpdate(double progress) { - overlayWidget.getElement().getStyle().setOpacity(overlayRequestedTargetState ? progress : 1 - progress); + overlayWidget.getStyle().setOpacity(overlayRequestedTargetState ? progress : 1 - progress); } protected void onComplete() { overlayToolbarIsCurrentlyVisible = overlayRequestedTargetState; - overlayWidget.getElement().getStyle().setOpacity(overlayRequestedTargetState ? 1 : 0); + overlayWidget.getStyle().setOpacity(overlayRequestedTargetState ? 1 : 0); }; protected void onCancel() { diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.ui.xml b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.ui.xml index 88b7eea1fac..d656c6ac914 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.ui.xml +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.ui.xml @@ -15,18 +15,19 @@ .scrollPanel { height: 20px; padding-top:25px; + overflow-x: scroll; + overflow-y: hidden; } .content { height: 1px; } - - - - - - - + +

+
+
+
+
\ No newline at end of file From 54d611a5211a363ddc177920876684a7efce9540 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 25 Sep 2017 11:32:37 +0200 Subject: [PATCH 02/45] Bug 4283: Fixed a broken import --- .../sap/sailing/gwt/ui/raceboard/RaceBoardLoginHintPopup.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardLoginHintPopup.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardLoginHintPopup.java index 17a37fbd874..8a4f2a05a4d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardLoginHintPopup.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardLoginHintPopup.java @@ -1,8 +1,8 @@ package com.sap.sailing.gwt.ui.raceboard; import com.sap.sailing.gwt.common.authentication.SailingAuthenticationEntryPointLinkFactory; -import com.sap.sailing.gwt.common.client.formfactor.DeviceDetector; import com.sap.sailing.gwt.ui.raceboard.RaceBoardResources.RaceBoardMainCss; +import com.sap.sse.gwt.client.formfactor.DeviceDetector; import com.sap.sse.security.ui.authentication.AuthenticationManager; import com.sap.sse.security.ui.authentication.generic.sapheader.GenericLoginHintPopup; From cc307fb5b461ef58ee605cbb3f77690b743245d3 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 25 Sep 2017 11:38:20 +0200 Subject: [PATCH 03/45] Bug 4283: Changes to not loose the scrollbar when reattaching OverlayAssistantScrollPanel to the DOM twice --- .../gwt/client/panels/OverlayAssistantScrollPanel.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java index de6ab54884c..56733c81b44 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java @@ -47,7 +47,7 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { interface MyUiBinder extends UiBinder { } - private DivElement overlayWidget; + private final DivElement overlayWidget; @UiField protected DivElement overlayScrollPanelUi; @UiField @@ -68,6 +68,7 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { this.getElement().getStyle().setPaddingBottom(25, Unit.PX); contentToSyncWith = contentToScroll.getElement(); this.hasMutationObservationCapability = weCanObserve(); + overlayWidget = uiBinder.createAndBindUi(this); } /** @@ -75,7 +76,6 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { */ @Override protected void onLoad() { - overlayWidget = uiBinder.createAndBindUi(this); RootPanel.get().getElement().appendChild(overlayWidget); if (!hasMutationObservationCapability) { return; @@ -159,9 +159,7 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { for (HandlerRegistration handlerRegistration : registrations) { handlerRegistration.removeHandler(); } - if (overlayWidget != null) { - overlayWidget.removeFromParent(); - } + overlayWidget.removeFromParent(); } /** From 3ce449f4ff4b55e42e2d38216cca1ba4aaae0dc6 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 25 Sep 2017 11:44:58 +0200 Subject: [PATCH 04/45] Bug 4283: Adjustments to handle child widget changes that are possible for ScrollPanel --- .../panels/OverlayAssistantScrollPanel.java | 48 ++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java index 56733c81b44..75f4a07a3a4 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java @@ -56,6 +56,7 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { private final List registrations = new ArrayList<>(); private final Element contentToSyncWith; private final boolean hasMutationObservationCapability; + private JavaScriptObject observer; /** * Create an overlay scroll panel with the corresponding widget to scroll. @@ -109,22 +110,7 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { applyScrollpanelToOverlay(); } })); - final JavaScriptObject observer = setupObserver(contentToSyncWith, new Command() { - @Override - public void execute() { - matchScrollpanelAndContentWidths(); - updateOverlayDisplay(); - applyScrollpanelToOverlay(); - } - }); - registrations.add(new HandlerRegistration() { - @Override - public void removeHandler() { - if (observer != null) { - disconnectObserver(observer); - } - } - }); + createObserverForCurrentChild(); if (!DeviceDetector.isMobile()) { // only bind reverse scrolling through overlay scrollpanel in desktop DOM.sinkEvents(overlayScrollPanelUi, Event.ONSCROLL); @@ -159,8 +145,36 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { for (HandlerRegistration handlerRegistration : registrations) { handlerRegistration.removeHandler(); } + removeObserverFromCurrentChildWidget(); overlayWidget.removeFromParent(); } + + @Override + public void setWidget(Widget w) { + if (isAttached()) { + removeObserverFromCurrentChildWidget(); + } + super.setWidget(w); + if (isAttached()) { + createObserverForCurrentChild(); + } + } + + private void createObserverForCurrentChild() { + observer = setupObserver(contentToSyncWith, new Command() { + @Override + public void execute() { + matchScrollpanelAndContentWidths(); + updateOverlayDisplay(); + applyScrollpanelToOverlay(); + } + }); + } + + private void removeObserverFromCurrentChildWidget() { + disconnectObserver(); + observer = null; + } /** * Helper method that synchronizes the scroll position of the target scrollpanel, using the data gathered from the @@ -229,7 +243,7 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { /** * Disconnect the mutation observer. */ - private native void disconnectObserver(final JavaScriptObject observer) /*-{ + private native void disconnectObserver() /*-{ if (observer) { observer.disconnect(); } From c576de5d22b9ec2e2c75a043f63a82f09fd83835 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 25 Sep 2017 12:46:52 +0200 Subject: [PATCH 05/45] Bug 4283: Fixed a NPE --- .../sse/gwt/client/panels/OverlayAssistantScrollPanel.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java index 75f4a07a3a4..45cbddb141a 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java @@ -145,13 +145,15 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { for (HandlerRegistration handlerRegistration : registrations) { handlerRegistration.removeHandler(); } - removeObserverFromCurrentChildWidget(); + if (observer != null) { + removeObserverFromCurrentChildWidget(); + } overlayWidget.removeFromParent(); } @Override public void setWidget(Widget w) { - if (isAttached()) { + if (observer != null) { removeObserverFromCurrentChildWidget(); } super.setWidget(w); From a53686e26c9ef2c08ec75917cab1772c6cdf004d Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 10 Oct 2017 10:54:58 +0200 Subject: [PATCH 06/45] Bug 4248: Locale is now initially set on registration of a new user --- .../authentication/AuthenticationManagerImpl.java | 4 +++- .../security/ui/client/UserManagementService.java | 2 +- .../ui/client/UserManagementServiceAsync.java | 2 +- .../ui/client/component/CreateUserDialog.java | 2 +- .../sse/security/ui/loginpanel/LoginPanel.java | 3 ++- .../security/ui/registration/RegisterView.java | 3 ++- .../ui/server/UserManagementServiceImpl.java | 15 ++++++++++++--- .../src/com/sap/sse/security/SecurityService.java | 5 +++++ .../sse/security/impl/SecurityServiceImpl.java | 11 +++++++++-- 9 files changed, 36 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManagerImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManagerImpl.java index 329986c72c3..1a2194b78d7 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManagerImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManagerImpl.java @@ -5,6 +5,7 @@ import static com.sap.sse.security.shared.UserManagementException.USER_ALREADY_E import java.util.function.Consumer; +import com.google.gwt.i18n.client.LocaleInfo; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.web.bindery.event.shared.EventBus; @@ -98,7 +99,8 @@ public class AuthenticationManagerImpl implements AuthenticationManager { @Override public void createAccount(final String name, String email, String password, String fullName, String company, SuccessCallback callback) { - userManagementService.createSimpleUser(name, email, password, fullName, company, emailConfirmationUrl, + userManagementService.createSimpleUser(name, email, password, fullName, company, + LocaleInfo.getCurrentLocale().getLocaleName(), emailConfirmationUrl, new AsyncCallbackImpl(callback) { @Override public void onFailure(Throwable caught) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementService.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementService.java index aa610878aa0..08864a7db61 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementService.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementService.java @@ -22,7 +22,7 @@ public interface UserManagementService extends RemoteService { SuccessInfo login(String username, String password); - UserDTO createSimpleUser(String name, String email, String password, String fullName, String company, String validationBaseURL) throws UserManagementException, MailException; + UserDTO createSimpleUser(String name, String email, String password, String fullName, String company, String localeName, String validationBaseURL) throws UserManagementException, MailException; /** * Either oldPassword or passwordResetSecret need to be provided, or the current user needs to have diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementServiceAsync.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementServiceAsync.java index 5a719bf5db9..0028b383998 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementServiceAsync.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementServiceAsync.java @@ -19,7 +19,7 @@ public interface UserManagementServiceAsync { void logout(AsyncCallback callback); - void createSimpleUser(String name, String email, String password, String fullName, String company, String validationBaseURL, AsyncCallback callback); + void createSimpleUser(String name, String email, String password, String fullName, String company, String localeName, String validationBaseURL, AsyncCallback callback); void updateSimpleUserPassword(String name, String oldPassword, String passwordResetSecret, String newPassword, AsyncCallback callback); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java index 44585ed3396..8fe2e31971a 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java @@ -26,7 +26,7 @@ public class CreateUserDialog extends AbstractUserDialog { userManagementService .createSimpleUser(usernameEmailPassword.getUsername(), usernameEmailPassword.getEmail(), usernameEmailPassword.getPassword(), - /* fullName */ null, /* company */ null, + /* fullName */ null, /* company */ null, /* TODO locale */ null, EntryPointLinkFactory.createEmailValidationLink(new HashMap()), new AsyncCallback() { @Override public void onSuccess(UserDTO result) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/LoginPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/LoginPanel.java index 98efb04ac7f..2235bf09a2e 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/LoginPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/LoginPanel.java @@ -5,6 +5,7 @@ import java.util.HashMap; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.i18n.client.LocaleInfo; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -77,7 +78,7 @@ public class LoginPanel extends HorizontalPanel implements UserStatusEventHandle @Override public void ok(final UserData userData) { userManagementService.createSimpleUser(userData.getUsername(), userData.getEmail(), userData.getPassword(), - /* fullName */ null, /* company */ null, + /* fullName */ null, /* company */ null, LocaleInfo.getCurrentLocale().getLocaleName(), EntryPointLinkFactory.createEmailValidationLink(new HashMap()), new MarkedAsyncCallback(new AsyncCallback() { @Override diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java index b4a12c3fa50..fa49d95226a 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java @@ -6,6 +6,7 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; +import com.google.gwt.i18n.client.LocaleInfo; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; @@ -77,7 +78,7 @@ public class RegisterView extends Composite { @UiHandler("signUpButton") void signUpButtonClicked(ClickEvent e) { userManagementService.createSimpleUser(usernameTextBox.getText(), emailTextBox.getText(), passwordTextBox.getText(), - /* fullName */ null, /* company */ null, + /* fullName */ null, /* company */ null, LocaleInfo.getCurrentLocale().getLocaleName(), EntryPointLinkFactory.createEmailValidationLink(new HashMap()), new AsyncCallback() { @Override public void onFailure(Throwable caught) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java index 6b08f255abd..0289f40eb8b 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java @@ -129,10 +129,10 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U } @Override - public UserDTO createSimpleUser(String name, String email, String password, String fullName, String company, String validationBaseURL) throws UserManagementException, MailException { + public UserDTO createSimpleUser(String name, String email, String password, String fullName, String company, String localeName, String validationBaseURL) throws UserManagementException, MailException { User u = null; try { - u = getSecurityService().createSimpleUser(name, email, password, fullName, company, validationBaseURL); + u = getSecurityService().createSimpleUser(name, email, password, fullName, company, getLocaleFromLocaleName(localeName), validationBaseURL); } catch (UserManagementException e) { logger.log(Level.SEVERE, "Error creating user "+name, e); throw new UserManagementException(e.getMessage()); @@ -181,7 +181,16 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U public void updateUserProperties(final String username, String fullName, String company, String localeName) throws UserManagementException { ensureThatUserInQuestionIsLoggedInOrCurrentUserIsAdmin(username); getSecurityService().updateUserProperties(username, fullName, company, - localeName == null || localeName.isEmpty() ? null : Locale.forLanguageTag(localeName)); + getLocaleFromLocaleName(localeName)); + } + + private Locale getLocaleFromLocaleName(String localeName) { + try { + return localeName == null || localeName.isEmpty() ? null : Locale.forLanguageTag(localeName); + } catch (Exception e) { + logger.log(Level.WARNING, e, () -> "Error while parsing locale with name '" + localeName + "'"); + return null; + } } @Override diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java index db4f88e4846..92527a39cee 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java @@ -53,6 +53,11 @@ public interface SecurityService extends ReplicableWithObjectInputStreamnull, no validation will be attempted */ User createSimpleUser(String username, String email, String password, String fullName, String company, String validationBaseURL) throws UserManagementException, MailException; + + /** + * @param validationBaseURL if null, no validation will be attempted + */ + User createSimpleUser(String username, String email, String password, String fullName, String company, Locale locale, String validationBaseURL) throws UserManagementException, MailException; void updateSimpleUserPassword(String name, String newPassword) throws UserManagementException; diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java index efc3b90f66b..14995ccfb79 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java @@ -195,7 +195,7 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat try { logger.info("No users found, creating default user \"admin\" with password \"admin\""); createSimpleUser("admin", "nobody@sapsailing.com", "admin", - /* fullName */ null, /* company */ null, /* validationBaseURL */ null); + /* fullName */ null, /* company */ null, Locale.ENGLISH, /* validationBaseURL */ null); addRoleForUser("admin", DefaultRoles.ADMIN.getRolename()); } catch (UserManagementException | MailException e) { logger.log(Level.SEVERE, "Exception while creating default admin user", e); @@ -324,10 +324,16 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat public User getUserByEmail(String email) { return store.getUserByEmail(email); } - + @Override public User createSimpleUser(final String username, final String email, String password, String fullName, String company, final String validationBaseURL) throws UserManagementException, MailException { + return createSimpleUser(username, email, password, fullName, company, /* locale */ null, validationBaseURL); + } + + @Override + public User createSimpleUser(final String username, final String email, String password, String fullName, + String company, Locale locale, final String validationBaseURL) throws UserManagementException, MailException { if (store.getUserByName(username) != null) { throw new UserManagementException(UserManagementException.USER_ALREADY_EXISTS); } @@ -343,6 +349,7 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat final User result = store.createUser(username, email, upa); result.setFullName(fullName); result.setCompany(company); + result.setLocale(locale); final String emailValidationSecret = result.startEmailValidation(); // don't replicate exception handling; replicate only the effect on the user store apply(s->s.internalStoreUser(result)); From 334a908a1af6a9cd99add6b6a0603876052eb981 Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 10 Oct 2017 14:47:59 +0200 Subject: [PATCH 07/45] Now ignoring unwanted scroll events --- .../panels/OverlayAssistantScrollPanel.java | 40 ++++++++++++++----- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java index 45cbddb141a..46c331916b4 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java @@ -26,7 +26,6 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.Widget; -import com.sap.sse.gwt.client.formfactor.DeviceDetector; /** * This scrollpanel overlays a second scrollbar fixed to the bottom of the viewport as soon as the original scrollbar is @@ -57,6 +56,16 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { private final Element contentToSyncWith; private final boolean hasMutationObservationCapability; private JavaScriptObject observer; + /** + * Flag that indicated that scrolling was initiated by table, the scroll event fired by the overlay scrollbar must + * be ignored, solving bug 4283 + */ + private boolean ignoreOverlayScrollEvent = false; + /** + * Flag that indicated that scrolling was initiated by overlay scrollpanel, the scroll event fired by the table must + * be ignored, solving bug 4283 + */ + private boolean ignoreTableScrollEvent = false; /** * Create an overlay scroll panel with the corresponding widget to scroll. @@ -107,22 +116,31 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { registrations.add(this.addScrollHandler(new ScrollHandler() { @Override public void onScroll(ScrollEvent event) { - applyScrollpanelToOverlay(); + GWT.log("scroll initiated by table"); + if (ignoreTableScrollEvent) { + ignoreTableScrollEvent = false; + } else { + ignoreOverlayScrollEvent = true; + applyScrollpanelToOverlay(); + } } })); createObserverForCurrentChild(); - if (!DeviceDetector.isMobile()) { - // only bind reverse scrolling through overlay scrollpanel in desktop - DOM.sinkEvents(overlayScrollPanelUi, Event.ONSCROLL); - DOM.setEventListener(overlayScrollPanelUi, new EventListener() { - @Override - public void onBrowserEvent(Event event) { + // only bind reverse scrolling through overlay scrollpanel in desktop + DOM.sinkEvents(overlayScrollPanelUi, Event.ONSCROLL); + DOM.setEventListener(overlayScrollPanelUi, new EventListener() { + @Override + public void onBrowserEvent(Event event) { + if (ignoreOverlayScrollEvent) { + ignoreOverlayScrollEvent = false; + } else { if (event.getTypeInt() == Event.ONSCROLL) { + ignoreTableScrollEvent = true; applyOverlayToScrollpanel(); } } - }); - } + } + }); } private void applyScrollpanelToOverlay() { @@ -150,7 +168,7 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { } overlayWidget.removeFromParent(); } - + @Override public void setWidget(Widget w) { if (observer != null) { From f5ef95beaf709e2ea6bd9b5897b53e6dda8fca82 Mon Sep 17 00:00:00 2001 From: Kai Boernert Date: Wed, 11 Oct 2017 15:12:26 +0200 Subject: [PATCH 08/45] fixed jsni wrong call notation being used --- .../sse/gwt/client/panels/OverlayAssistantScrollPanel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java index 46c331916b4..045979e3387 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/OverlayAssistantScrollPanel.java @@ -264,8 +264,8 @@ public class OverlayAssistantScrollPanel extends ScrollPanel { * Disconnect the mutation observer. */ private native void disconnectObserver() /*-{ - if (observer) { - observer.disconnect(); + if (this.@com.sap.sse.gwt.client.panels.OverlayAssistantScrollPanel::observer) { + this.@com.sap.sse.gwt.client.panels.OverlayAssistantScrollPanel::observer.disconnect(); } }-*/; From 822137af1492ff9b4952cc2b8a0ab95bfe889af4 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 12 Oct 2017 11:32:25 +0200 Subject: [PATCH 09/45] bug4284 Just added another todo to clearify possible enhancements --- .../sap/sse/security/ui/client/component/CreateUserDialog.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java index 8fe2e31971a..bcb01c0739f 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java @@ -16,6 +16,7 @@ import com.sap.sse.security.ui.shared.UserDTO; * @author Axel Uhl (D043530) * */ +// TODO: Add input fields for full name, company and locale information! public class CreateUserDialog extends AbstractUserDialog { public CreateUserDialog(final StringMessages stringMessages, final UserManagementServiceAsync userManagementService, final Iterable handlers) { @@ -26,7 +27,7 @@ public class CreateUserDialog extends AbstractUserDialog { userManagementService .createSimpleUser(usernameEmailPassword.getUsername(), usernameEmailPassword.getEmail(), usernameEmailPassword.getPassword(), - /* fullName */ null, /* company */ null, /* TODO locale */ null, + /* TOOD fullName */ null, /* TODO company */ null, /* TODO locale */ null, EntryPointLinkFactory.createEmailValidationLink(new HashMap()), new AsyncCallback() { @Override public void onSuccess(UserDTO result) { From fb38a06c3da3d5c031197ae2a995c3c7d23c011d Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 12 Oct 2017 16:40:38 +0200 Subject: [PATCH 10/45] bug4338 Added new widget for language selection purposes --- .../languageselect/LanguageSelector.java | 103 ++++++++++++++++++ .../languageselect/LanguageSelector.ui.xml | 42 +++++++ 2 files changed, 145 insertions(+) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.ui.xml diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.java new file mode 100644 index 00000000000..d5d7a450fa9 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.java @@ -0,0 +1,103 @@ +package com.sap.sailing.gwt.common.client.controls.languageselect; + +import java.util.List; +import java.util.Optional; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.http.client.UrlBuilder; +import com.google.gwt.i18n.client.LocaleInfo; +import com.google.gwt.text.shared.AbstractRenderer; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiConstructor; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.Window.Location; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.InlineLabel; +import com.google.gwt.user.client.ui.ValueListBox; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.common.Util; +import com.sap.sse.gwt.client.GWTLocaleUtil; + +/** + * {@link Widget} class which can be used to change the language of the application, based on the languages configured + * in the module's *.gwt.xml file. The widget behaves as follows: + *
    + *
  • {@link Widget#removeFromParent() Removing} itself, if there is only one language configured (maybe default)
  • + *
  • If two languages are configured, it shows a {@link Anchor link} to switch to the not actually selected one
  • + *
  • If multiple languages are configured, it shows a {@link ValueListBox selection} to change to the desired one
  • + *
+ */ +public class LanguageSelector extends Composite { + + private static LanguageSelectorUiBinder uiBinder = GWT.create(LanguageSelectorUiBinder.class); + + interface LanguageSelectorUiBinder extends UiBinder { + } + + @UiField + InlineLabel labelUi; + @UiField + Anchor languageSwitchLinkUi; + @UiField(provided = true) + ValueListBox languageSelectionUi; + + /** + * Creates a new {@link LanguageSelector} instance using the provided label text. + * + * @param labelText + * {@link String text} to show in front of the link / selection + */ + @UiConstructor + public LanguageSelector(String labelText) { + languageSelectionUi = new ValueListBox<>(new LanguageRenderer()); + initWidget(uiBinder.createAndBindUi(this)); + this.labelUi.setText(labelText); + this.initLanguages(LocaleInfo.getCurrentLocale()); + } + + private void initLanguages(final LocaleInfo currentLocale) { + final List availableLocales = Util.asList(GWTLocaleUtil.getAvailableLocales()); + if (availableLocales.size() <= 1) { // no other language available => remove widget + this.removeFromParent(); + } else if (availableLocales.size() == 2) { // only one other language available => show link + this.initLanguageSwitchLink(availableLocales, currentLocale); + } else { // multiple languages available => show selection + this.initLanguageSelection(availableLocales, currentLocale); + } + } + + private void initLanguageSwitchLink(final List available, final LocaleInfo current) { + this.languageSelectionUi.removeFromParent(); + final Optional other = available.stream().filter(l -> !current.getLocaleName().equals(l)).findFirst(); + other.ifPresent(name -> languageSwitchLinkUi.addClickHandler(e -> switchLanguage(name))); + } + + private void initLanguageSelection(final List available, final LocaleInfo current) { + this.languageSwitchLinkUi.removeFromParent(); + this.languageSelectionUi.setValue(current.getLocaleName()); + this.languageSelectionUi.setAcceptableValues(available); + this.languageSelectionUi.addValueChangeHandler(event -> { + if (!current.getLocaleName().equals(event.getValue())) { + this.switchLanguage(event.getValue()); + } + }); + } + + private void switchLanguage(String newLocaleName) { + final UrlBuilder builder = Location.createUrlBuilder().setParameter("locale", newLocaleName); + Window.Location.replace(builder.buildString()); + } + + private static class LanguageRenderer extends AbstractRenderer { + + @Override + public String render(String object) { + final String displayName = LocaleInfo.getLocaleNativeDisplayName(object); + return displayName == null ? "" : displayName; + } + + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.ui.xml new file mode 100644 index 00000000000..5e5780c43b6 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.ui.xml @@ -0,0 +1,42 @@ + + + + .label { + margin-right: .25em; + } + .label:after { + content: ":"; + } + .languageSwichLink { + color: #efaa00; + cursor: pointer; + } + .languageSelection:-ms-expand { + display: none; + } + .languageSelection { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + appearance: none; + margin-top: 25px; + color: #efaa00; + line-height: 1.5em; + height: 1.5em; + display: inline-block; + border: transparent; + cursor: pointer; + padding-right: 1.2em; + background: #333; + cursor: pointer; + background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgaGVpZ2h0PScxOHB4JyB3aWR0aD0nMTZweCc+PHRleHQgeD0nMCcgeT0nMTUnIGZpbGw9JyNlZmFhMDAnIGZvbnQtc2l6ZT0nMTYnPiYjOTY2MDs8L3RleHQ+PC9zdmc+"); + background-position: right center; + background-repeat: no-repeat; + } + + + + + + + \ No newline at end of file From ad1805915405be06e2d8f7c27e0f1d3442b94c15 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 12 Oct 2017 17:10:11 +0200 Subject: [PATCH 11/45] bug4338 Integrated language selection widget into Home.html footer on desktop --- .../home/desktop/partials/footer/Footer.gss | 6 -- .../home/desktop/partials/footer/Footer.java | 97 ------------------- .../desktop/partials/footer/Footer.ui.xml | 35 +------ .../partials/footer/FooterResources.java | 1 - 4 files changed, 3 insertions(+), 136 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.gss index bbb5545e440..88081595726 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.gss @@ -48,9 +48,3 @@ text-align: right; } } -.sitefooter_language_link { - color: #efaa00; - display: inline-block; - cursor: pointer; - margin-left: 0.666666666666667em; -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.java index 02fc522ec7e..d56dd87fbc3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.java @@ -1,28 +1,13 @@ package com.sap.sailing.gwt.home.desktop.partials.footer; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; - import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.AnchorElement; -import com.google.gwt.dom.client.DivElement; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.logical.shared.ValueChangeEvent; -import com.google.gwt.http.client.UrlBuilder; -import com.google.gwt.i18n.client.LocaleInfo; -import com.google.gwt.text.shared.Renderer; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.EventListener; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.Window.Location; -import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.ValueListBox; import com.google.gwt.user.client.ui.Widget; import com.google.web.bindery.event.shared.EventBus; import com.sap.sailing.gwt.home.desktop.app.DesktopPlacesNavigator; @@ -30,9 +15,6 @@ import com.sap.sailing.gwt.home.desktop.places.whatsnew.WhatsNewPlace; import com.sap.sailing.gwt.home.desktop.places.whatsnew.WhatsNewPlace.WhatsNewNavigationTabs; import com.sap.sailing.gwt.home.shared.SwitchingEntryPoint; import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; -import com.sap.sse.common.Util; -import com.sap.sse.common.Util.Pair; -import com.sap.sse.gwt.client.GWTLocaleUtil; public class Footer extends Composite { private static FooterPanelUiBinder uiBinder = GWT.create(FooterPanelUiBinder.class); @@ -40,32 +22,8 @@ public class Footer extends Composite { interface FooterPanelUiBinder extends UiBinder { } - @UiField Anchor changeLanguageLink; @UiField AnchorElement imprintAnchorLink; - @UiField DivElement languageSelectionDiv; - @UiField(provided = true) ValueListBox> changeLanguageList = new ValueListBox>(new Renderer>() { - @Override - public String render(Pair object) { - if(object == null) { - return ""; - } - if(object.getB() != null) { - return object.getB(); - } - return object.getA(); - } - - @Override - public void render(Pair object, Appendable appendable) throws IOException { - appendable.append(render(object)); - } - }); - @UiField AnchorElement mobileUi; - private String otherLanguage; - private final LocaleInfo currentLocale = LocaleInfo.getCurrentLocale(); - - @UiField(provided = true) final PlaceNavigation releaseNotesNavigation; @@ -76,7 +34,6 @@ public class Footer extends Composite { initWidget(uiBinder.createAndBindUi(this)); navigator.getImprintNavigation().configureAnchorElement(imprintAnchorLink); - updateUI(); DOM.sinkEvents(mobileUi, Event.ONCLICK); DOM.setEventListener(mobileUi, new EventListener() { @Override @@ -89,58 +46,4 @@ public class Footer extends Composite { }); } - - @UiHandler("changeLanguageLink") - public void changeLanguage(ClickEvent e) { - if(otherLanguage != null) { - UrlBuilder builder = Location.createUrlBuilder().setParameter("locale", otherLanguage); - Window.Location.replace(builder.buildString()); - } - } - - @UiHandler("changeLanguageList") - void onListSelection(ValueChangeEvent> event) { - String selectedLocaleName = event.getValue().getA(); - if(!currentLocale.getLocaleName().equals(selectedLocaleName)) { - UrlBuilder builder = Location.createUrlBuilder().setParameter("locale", selectedLocaleName); - Window.Location.replace(builder.buildString()); - } - } - - private void updateUI() { - final Iterable availableLocales = GWTLocaleUtil.getAvailableLocales(); - final int localeCount = Util.size(availableLocales); - - if (localeCount <= 1) { - // only current language (or removed default) available - changeLanguageLink.removeFromParent(); - changeLanguageList.removeFromParent(); - languageSelectionDiv.removeFromParent(); - return; - } - if (Util.size(availableLocales) == 2) { - changeLanguageList.removeFromParent(); - // current language + one we can switch to - for (String localeName : availableLocales) { - if (!currentLocale.getLocaleName().equals(localeName)) { - otherLanguage = localeName; - changeLanguageLink.setText(LocaleInfo.getLocaleNativeDisplayName(otherLanguage)); - return; - } - } - return; - } - changeLanguageLink.removeFromParent(); - Collection> values = new ArrayList<>(); - Pair selectedValue = null; - for (String localeName : availableLocales) { - Pair value = new Pair(localeName, LocaleInfo.getLocaleNativeDisplayName(localeName)); - values.add(value); - if (currentLocale.getLocaleName().equals(localeName)) { - selectedValue = value; - } - } - changeLanguageList.setValue(selectedValue); - changeLanguageList.setAcceptableValues(values); - } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.ui.xml index a0bfd39be8e..dc3c9abe6b4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.ui.xml @@ -1,37 +1,11 @@ - - .languageSelect::-ms-expand { - display: none; - } - .languageSelect { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - appearance: none; - - margin-top: 25px; - color: #efaa00; - line-height: 1.5em; - height: 1.5em; - display: inline-block; - border: transparent; - cursor: pointer; - padding-right: 1.2em; - background: #333; - cursor: pointer; - - background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgaGVpZ2h0PScxOHB4JyB3aWR0aD0nMTZweCc+PHRleHQgeD0nMCcgeT0nMTUnIGZpbGw9JyNlZmFhMDAnIGZvbnQtc2l6ZT0nMTYnPiYjOTY2MDs8L3RleHQ+PC9zdmc+"); - background-position: right center; - background-repeat: no-repeat; - - } -
@@ -61,11 +35,8 @@
-
- : - - -
+ diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/FooterResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/FooterResources.java index ce5aad9d4f1..7c73496fd50 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/FooterResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/FooterResources.java @@ -16,6 +16,5 @@ public interface FooterResources extends ClientBundle { String sitefooter_links(); String sitefooter_links_link(); String sitefooter_language(); - String sitefooter_language_link(); } } From b6b58c88a95a003d4863d4da874ca28a1c21d8c7 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 12 Oct 2017 17:27:56 +0200 Subject: [PATCH 12/45] bug4338 Integrated language selection widget into Home.html footer on mobile --- .../home/mobile/partials/footer/Footer.gss | 7 +- .../home/mobile/partials/footer/Footer.java | 93 +------------------ .../home/mobile/partials/footer/Footer.ui.xml | 67 +++---------- .../partials/footer/FooterResources.java | 2 - 4 files changed, 14 insertions(+), 155 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss index 70cd072f687..32b7a0e8c59 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss @@ -14,11 +14,8 @@ .sitefooter_language { display: block; } -a.sitefooter_language_link { - color: #fff; -} -a.sitefooter_language_linkactive { - color: #efaa00; +.sitefooter_language select { + font-size: 110%; } .sitefooter_links { font-weight: 600; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.java index a07f9cbce7d..a7f75d1530c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.java @@ -1,34 +1,19 @@ package com.sap.sailing.gwt.home.mobile.partials.footer; -import java.io.IOException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.AnchorElement; -import com.google.gwt.dom.client.DivElement; import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.logical.shared.ValueChangeEvent; -import com.google.gwt.http.client.UrlBuilder; -import com.google.gwt.i18n.client.LocaleInfo; -import com.google.gwt.text.shared.Renderer; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.EventListener; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.Window.Location; -import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.ValueListBox; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.home.desktop.places.whatsnew.WhatsNewPlace; import com.sap.sailing.gwt.home.mobile.app.MobilePlacesNavigator; import com.sap.sailing.gwt.home.shared.SwitchingEntryPoint; -import com.sap.sse.common.Util.Pair; /** * Mobile page footer with several links and the ability to switch the language. @@ -39,32 +24,10 @@ public class Footer extends Composite { interface FooterPanelUiBinder extends UiBinder { } - private String otherLanguage; - private final LocaleInfo currentLocale = LocaleInfo.getCurrentLocale(); - private MobilePlacesNavigator placeNavigator; - - @UiField Anchor changeLanguageLink; @UiField AnchorElement imprintAnchorLink; - @UiField DivElement languageSelectionDiv; @UiField AnchorElement desktopUi; - @UiField(provided = true) ValueListBox> changeLanguageList = new ValueListBox>(new Renderer>() { - @Override - public String render(Pair object) { - if(object == null) { - return ""; - } - if(object.getB() != null) { - return object.getB(); - } - return object.getA(); - } - - @Override - public void render(Pair object, Appendable appendable) throws IOException { - appendable.append(render(object)); - } - }); + private final MobilePlacesNavigator placeNavigator; public Footer(MobilePlacesNavigator placeNavigator) { this.placeNavigator = placeNavigator; @@ -73,7 +36,6 @@ public class Footer extends Composite { initWidget(uiBinder.createAndBindUi(this)); placeNavigator.getImprintNavigation().configureAnchorElement(imprintAnchorLink); - updateUI(); DOM.sinkEvents(desktopUi, Event.ONCLICK); DOM.setEventListener(desktopUi, new EventListener() { @Override @@ -86,62 +48,9 @@ public class Footer extends Composite { }); } - @UiHandler("changeLanguageLink") - public void changeLanguage(ClickEvent e) { - if(otherLanguage != null) { - UrlBuilder builder = Location.createUrlBuilder().setParameter("locale", otherLanguage); - Window.Location.replace(builder.buildString()); - } - } - - @UiHandler("changeLanguageList") - void onListSelection(ValueChangeEvent> event) { - String selectedLocaleName = event.getValue().getA(); - if(!currentLocale.getLocaleName().equals(selectedLocaleName)) { - UrlBuilder builder = Location.createUrlBuilder().setParameter("locale", selectedLocaleName); - Window.Location.replace(builder.buildString()); - } - } - @UiHandler("whatsNewLinkUi") void onWhatsNew(ClickEvent e) { placeNavigator.getWhatsNewNavigation(WhatsNewPlace.WhatsNewNavigationTabs.SailingAnalytics).goToPlace(); } - private void updateUI() { - Set availableLocales = new HashSet(Arrays.asList(LocaleInfo.getAvailableLocaleNames())); - availableLocales.remove("default"); - - if(availableLocales.size() <= 1) { - // only current language (or removed default) available - changeLanguageLink.removeFromParent(); - changeLanguageList.removeFromParent(); - languageSelectionDiv.removeFromParent(); - return; - } - if(availableLocales.size() == 2) { - changeLanguageList.removeFromParent(); - // current language + one we can switch to - for(String localeName : availableLocales) { - if(!currentLocale.getLocaleName().equals(localeName)) { - otherLanguage = localeName; - changeLanguageLink.setText(LocaleInfo.getLocaleNativeDisplayName(otherLanguage)); - return; - } - } - return; - } - changeLanguageLink.removeFromParent(); - Set> values = new HashSet<>(); - Pair selectedValue = null; - for(String localeName : availableLocales) { - Pair value = new Pair(localeName, LocaleInfo.getLocaleNativeDisplayName(localeName)); - values.add(value); - if(currentLocale.getLocaleName().equals(localeName)) { - selectedValue = value; - } - } - changeLanguageList.setValue(selectedValue); - changeLanguageList.setAcceptableValues(values); - } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.ui.xml index 14bf6904283..6126c9463fd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.ui.xml @@ -1,60 +1,17 @@ - - - - - - - .languageSelect::-ms-expand { - display: none; - } - - .languageSelect { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - appearance: none; - margin-top: 25px; - color: #efaa00; - line-height: 1.5em; - height: 1.5em; - display: inline-block; - border: transparent; - cursor: pointer; - padding-right: 1.2em; - background: #333; - cursor: pointer; - background-image: - url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgaGVpZ2h0PScxOHB4JyB3aWR0aD0nMTZweCc+PHRleHQgeD0nMCcgeT0nMTUnIGZpbGw9JyNlZmFhMDAnIGZvbnQtc2l6ZT0nMTYnPiYjOTY2MDs8L3RleHQ+PC9zdmc+"); - background-position: right center; - background-repeat: no-repeat; - font-size: 110%; - } - + + + +