diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/security/Permission.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/security/Permission.java index 692618da481..cfee3c0f517 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/security/Permission.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/security/Permission.java @@ -15,6 +15,7 @@ public enum Permission implements com.sap.sse.security.shared.Permission { MANAGE_WIND, MANAGE_IGTIMI_ACCOUNTS, MANAGE_LEADERBOARDS, + MANAGE_LEADERBOARD_RESULTS, MANAGE_LEADERBOARD_GROUPS, MANAGE_RESULT_IMPORT_URLS, MANAGE_STRUCTURE_IMPORT_URLS, diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/security/SailingPermissionsForRoleProvider.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/security/SailingPermissionsForRoleProvider.java index c2f7495aa7b..e14d720df45 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/security/SailingPermissionsForRoleProvider.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/security/SailingPermissionsForRoleProvider.java @@ -28,6 +28,7 @@ public class SailingPermissionsForRoleProvider implements PermissionsForRoleProv Permission.MANAGE_IGTIMI_ACCOUNTS, Permission.MANAGE_LEADERBOARD_GROUPS, Permission.MANAGE_LEADERBOARDS, + Permission.MANAGE_LEADERBOARD_RESULTS, Permission.MANAGE_MEDIA, Permission.MANAGE_RACELOG_TRACKING, Permission.MANAGE_REGATTAS, diff --git a/java/com.sap.sailing.gwt.ui/AdminConsole.css b/java/com.sap.sailing.gwt.ui/AdminConsole.css index bc14cc9d8c9..899f9763c16 100644 --- a/java/com.sap.sailing.gwt.ui/AdminConsole.css +++ b/java/com.sap.sailing.gwt.ui/AdminConsole.css @@ -1,10 +1,19 @@ /** Add css rules here for your application. */ -* { +.adminConsolePanel, .adminConsolePanel * { font-family: Arial; font-size: 12px; } +body, html { + font-size: 15px; + font-family: 'Open Sans',sans-serif; + margin: 0; +} +body { + font-size: 14px; +} + /** Example rules used by the template application (remove for your app) */ h1 { font-size: 2em; diff --git a/java/com.sap.sailing.gwt.ui/Leaderboard.css b/java/com.sap.sailing.gwt.ui/Leaderboard.css index ca7ab51f790..2b70414a4b7 100755 --- a/java/com.sap.sailing.gwt.ui/Leaderboard.css +++ b/java/com.sap.sailing.gwt.ui/Leaderboard.css @@ -22,6 +22,10 @@ position: absolute; top: -1000px; } +html { + font-size: 15px; +} + body { background: #fff; font-family: 'Open Sans', Arial, Verdana, sans-serif; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/AuthenticationCommon.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/AuthenticationCommon.gwt.xml new file mode 100644 index 00000000000..ea68523dec1 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/AuthenticationCommon.gwt.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/FixedSailingAuthentication.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/FixedSailingAuthentication.java new file mode 100644 index 00000000000..e2466abf45f --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/FixedSailingAuthentication.java @@ -0,0 +1,18 @@ +package com.sap.sailing.gwt.common.authentication; + +import com.sap.sse.gwt.common.CommonSharedResources; +import com.sap.sse.security.ui.authentication.generic.GenericAuthentication; +import com.sap.sse.security.ui.authentication.generic.sapheader.FixedFlyoutAuthenticationView; +import com.sap.sse.security.ui.authentication.view.AuthenticationMenuView; +import com.sap.sse.security.ui.client.UserService; + +public class FixedSailingAuthentication extends GenericAuthentication { + private static final CommonSharedResources res = CommonSharedResources.INSTANCE; + + public FixedSailingAuthentication(UserService userService, AuthenticationMenuView userManagementMenuView) { + super(userService, userManagementMenuView, new FixedFlyoutAuthenticationView(res), + SailingAuthenticationEntryPointLinkFactory.INSTANCE, res); + res.mainCss().ensureInjected(); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/GenericSailingAuthentication.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/GenericSailingAuthentication.java new file mode 100644 index 00000000000..93ddfdbf0ac --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/GenericSailingAuthentication.java @@ -0,0 +1,18 @@ +package com.sap.sailing.gwt.common.authentication; + +import com.sap.sse.gwt.common.CommonSharedResources; +import com.sap.sse.security.ui.authentication.generic.GenericAuthentication; +import com.sap.sse.security.ui.authentication.generic.sapheader.GenericFlyoutAuthenticationView; +import com.sap.sse.security.ui.authentication.view.AuthenticationMenuView; +import com.sap.sse.security.ui.client.UserService; + +public class GenericSailingAuthentication extends GenericAuthentication { + private static final CommonSharedResources res = CommonSharedResources.INSTANCE; + + public GenericSailingAuthentication(UserService userService, AuthenticationMenuView userManagementMenuView) { + super(userService, userManagementMenuView, new GenericFlyoutAuthenticationView(res), + SailingAuthenticationEntryPointLinkFactory.INSTANCE, res); + res.mainCss().ensureInjected(); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/SailingAuthenticationEntryPointLinkFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/SailingAuthenticationEntryPointLinkFactory.java new file mode 100644 index 00000000000..bb84750d311 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/SailingAuthenticationEntryPointLinkFactory.java @@ -0,0 +1,42 @@ +package com.sap.sailing.gwt.common.authentication; + +import java.util.HashMap; + +import com.google.gwt.http.client.UrlBuilder; +import com.google.gwt.user.client.Window; +import com.sap.sse.gwt.client.AbstractEntryPointLinkFactory; +import com.sap.sse.security.ui.authentication.generic.GenericAuthenticationLinkFactory; + +public final class SailingAuthenticationEntryPointLinkFactory extends AbstractEntryPointLinkFactory implements + GenericAuthenticationLinkFactory { + + public static final GenericAuthenticationLinkFactory INSTANCE = new SailingAuthenticationEntryPointLinkFactory(); + + private SailingAuthenticationEntryPointLinkFactory() { + } + + @Override + public final String createUserProfileLink() { + return createEntryPointLink("/gwt/Home.html#/user/profile/:", new HashMap()); + } + + @Override + public final String createEmailValidationLink() { + return createFullQualifiedLink("/gwt/Home.html", "/user/confirmation/:MAIL_VERIFIED"); + } + + @Override + public final String createPasswordResetLink() { + return createFullQualifiedLink("/gwt/Home.html", "/user/passwordreset/:"); + } + + private String createFullQualifiedLink(String baseUrl, String hash) { + String path = createEntryPointLink(baseUrl, new HashMap()); + UrlBuilder urlBuilder = Window.Location.createUrlBuilder(); + for (String parameter : Window.Location.getParameterMap().keySet()) { + urlBuilder.removeParameter(parameter); + } + return urlBuilder.setPath(path).setHash(hash).buildString(); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/SharedResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/SharedResources.java index 85a124f04dd..0574c017fda 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/SharedResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/SharedResources.java @@ -11,17 +11,13 @@ public interface SharedResources extends ClientBundle, CommonSharedResources { @Source("main.gss") MainCss mainCss(); - @Source("media.gss") + @Source(CommonSharedResources.MEDIA) MediaCss mediaCss(); public interface MainCss extends CssResource, CommonMainCss { String mobile(); String desktop(); String wrapper(); - String navbar(); - String navbar_button(); - String navbar_buttonhidden(); - String navbar_buttonactive(); String button(); String buttontextonly(); String buttonsmall(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/BreadcrumbPane.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/BreadcrumbPane.java deleted file mode 100644 index c8d5e228892..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/BreadcrumbPane.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.sap.sailing.gwt.common.client.controls.tabbar; - -import com.google.gwt.core.shared.GWT; -import com.google.gwt.dom.client.AnchorElement; -import com.google.gwt.dom.client.DivElement; -import com.google.gwt.dom.client.Document; -import com.google.gwt.resources.client.ClientBundle; -import com.google.gwt.resources.client.CssResource; -import com.google.gwt.safehtml.shared.SafeUri; -import com.google.gwt.safehtml.shared.UriUtils; -import com.google.gwt.user.client.Event; -import com.google.gwt.user.client.EventListener; -import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.common.client.LinkUtil; - -/** - * @author zhorvath - * - */ -public class BreadcrumbPane extends Widget { - - interface Resources extends ClientBundle { - @Source("Breadcrumb.css") - Style style(); - } - - interface Style extends CssResource { - - String event_header__breadcrumb(); - - String event_header__breadcrumb__item(); - - } - - private static Resources resources; - - private static Resources getResources() { - if (resources == null) { - resources = GWT.create(Resources.class); - resources.style().ensureInjected(); - } - return resources; - } - - private final Style style = getResources().style(); - - private final DivElement breadcrumDiv; - - public BreadcrumbPane() { - breadcrumDiv = Document.get().createDivElement(); - breadcrumDiv.addClassName(style.event_header__breadcrumb()); - - setElement(breadcrumDiv); - } - - public void addBreadcrumbItem(String title, String link, final Runnable runnable) { - addBreadcrumbItem(title, UriUtils.fromString(link), runnable); - } - - public void addBreadcrumbItem(String title, SafeUri link, final Runnable runnable) { - AnchorElement breadcrumItem = Document.get().createAnchorElement(); - breadcrumItem.setHref(link); - breadcrumItem.setInnerText(title); - breadcrumItem.addClassName(style.event_header__breadcrumb__item()); - - breadcrumDiv.appendChild(breadcrumItem); - - Event.sinkEvents(breadcrumItem, Event.ONCLICK); - Event.setEventListener(breadcrumItem, new EventListener() { - @Override - public void onBrowserEvent(Event event) { - if (LinkUtil.handleLinkClick(event)) { - event.stopPropagation(); - event.preventDefault(); - runnable.run(); - } - } - }); - } - - public void clear() { - breadcrumDiv.removeAllChildren(); - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/TabBar.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/TabBar.gss new file mode 100644 index 00000000000..71dd81a902b --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/TabBar.gss @@ -0,0 +1,36 @@ +.navbar { + font-size: 1rem; +} +.navbar_button { + font-size: 1.2em; + display: inline-block; + font-weight: 600; + color: #666; + border: 1px solid #dedede; + padding: 0.833333333333333em 0.944444444444444em; + background-color: #ebebeb; + -webkit-transition: background-color 0.2s, border-color 0.2s; + -moz-transition: background-color 0.2s, border-color 0.2s; + transition: background-color 0.2s, border-color 0.2s; + text-decoration: none; + margin-right: 0.555555555555556em; + border-top-left-radius: 0.277777777777778em; + border-top-right-radius: 0.277777777777778em; +} +.navbar_buttonhidden { + display: block; +} +.navbar_button:hover { + background-color: #dedede; + outline: none; + text-decoration: none; +} +.navbar_buttonactive { + color: #333; + background-color: #fff; + border-bottom: 1px solid #fff; +} +.navbar_buttonactive:hover { + background-color: #dedede; + border-bottom: 1px solid #dedede; +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/TabBar.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/TabBar.java index e159845c347..7d2a9bd9a4f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/TabBar.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/TabBar.java @@ -13,12 +13,9 @@ import com.google.gwt.event.logical.shared.HasSelectionHandlers; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.event.shared.HandlerRegistration; -import com.google.gwt.place.shared.Place; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.common.client.LinkUtil; -import com.sap.sailing.gwt.common.client.SharedResources; -import com.sap.sailing.gwt.common.client.SharedResources.MainCss; +import com.sap.sse.gwt.client.LinkUtil; /** * Capsulates functionality for a tab bar. @@ -26,14 +23,15 @@ import com.sap.sailing.gwt.common.client.SharedResources.MainCss; * @author zhorvath * */ -public class TabBar extends Widget implements HasSelectionHandlers> { +public class TabBar extends Widget implements HasSelectionHandlers { - private final MainCss style = SharedResources.INSTANCE.mainCss(); + private final TabBarResources.LocalCss style = TabBarResources.INSTANCE.css(); - private final List> knownPlaceClasses = new ArrayList<>(); + private final List tabObjects = new ArrayList<>(); private final DivElement tabBarDiv; public TabBar() { + style.ensureInjected(); tabBarDiv = Document.get().createDivElement(); tabBarDiv.addClassName(style.navbar()); @@ -57,8 +55,8 @@ public class TabBar extends Widget implements HasSelectionHandlers> event.stopPropagation(); event.preventDefault(); // the specific tab was clicked -> fire SelectionEvent with the associated place - GWT.log("Found " + knownPlaceClasses.get(i)); - SelectionEvent.fire(this, knownPlaceClasses.get(i)); + GWT.log("Found " + tabObjects.get(i)); + SelectionEvent.fire(this, tabObjects.get(i)); break; } } @@ -74,16 +72,16 @@ public class TabBar extends Widget implements HasSelectionHandlers> * @param place * the place that should get selected. */ - public void select(Place place) { - GWT.log("Should activate: " + place.getClass().getName()); + public void select(T tabObject) { + GWT.log("Should activate: " + tabObject); // remove all previous selections for (int i = 0; i < tabBarDiv.getChildCount(); i++) { Element.as(tabBarDiv.getChild(i)).removeClassName(style.navbar_buttonactive()); } // find the tab that has to be selected for the given place - for (int i = 0; i < knownPlaceClasses.size(); i++) { - if (place.getClass().equals(knownPlaceClasses.get(i))) { - GWT.log("Activate: " + place.getClass().getName()); + for (int i = 0; i < tabObjects.size(); i++) { + if (tabObject.equals(tabObjects.get(i))) { + GWT.log("Activate: " + tabObject); // found the associated tab -> set the selected style. Element.as(tabBarDiv.getChild(i)).addClassName(style.navbar_buttonactive()); } @@ -100,19 +98,19 @@ public class TabBar extends Widget implements HasSelectionHandlers> * @param place * the place that should be associated with the tab. */ - public void addTab(String title, Class place, String link) { + public void addTab(String title, T place, String link) { AnchorElement tabElement = Document.get().createAnchorElement(); tabElement.setHref(link); tabElement.setInnerText(title); tabElement.addClassName(style.navbar_button()); tabBarDiv.appendChild(tabElement); - knownPlaceClasses.add(place); + tabObjects.add(place); } /** {@inheritDoc} */ @Override - public HandlerRegistration addSelectionHandler(SelectionHandler> handler) { + public HandlerRegistration addSelectionHandler(SelectionHandler handler) { return addHandler(handler, SelectionEvent.getType()); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/TabBarResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/TabBarResources.java new file mode 100644 index 00000000000..e3631b5a140 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/TabBarResources.java @@ -0,0 +1,20 @@ +package com.sap.sailing.gwt.common.client.controls.tabbar; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; + +public interface TabBarResources extends ClientBundle { + public static final TabBarResources INSTANCE = GWT.create(TabBarResources.class); + + @Source("TabBar.gss") + LocalCss css(); + + public interface LocalCss extends CssResource { + String navbar(); + String navbar_button(); + String navbar_buttonhidden(); + String navbar_buttonactive(); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/TabPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/TabPanel.java index 74d5718e6f9..85a3b02f652 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/TabPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/TabPanel.java @@ -7,13 +7,10 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.DivElement; -import com.google.gwt.dom.client.Style.Display; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.place.shared.Place; import com.google.gwt.place.shared.PlaceHistoryMapper; -import com.google.gwt.safehtml.shared.SafeUri; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiChild; import com.google.gwt.uibinder.client.UiField; @@ -26,7 +23,7 @@ import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.common.client.controls.tabbar.TabView.State; /** - * Defines whole layout for site, including the header with the breadcrumbs and tab bar, and the content. + * Defines the basic Layout of tabbed pages with tabs, an optional header and a content area. *

* Created by pgtaboada on 25.11.14. */ @@ -41,10 +38,10 @@ public class TabPanel> but UiBinder causes weired generics errors related to the @UiHandler that would have a nested generic too. @UiField - TabBar tabBar; - @UiField BreadcrumbPane breadcrumbs; - @UiField DivElement breadcrumbsContainer; + TabBar> tabBar; @UiField FlowPanel tabExtension; private TABVIEW currentTab; @@ -56,15 +53,13 @@ public class TabPanel) classForActivation, link); + tabBar.addTab(title, classForActivation, link); } } @@ -101,7 +95,7 @@ public class TabPanel> event) { + void onTabSelection(SelectionEvent> event) { TabView selectedTabActivity = knownTabs.get(event.getSelectedItem()); if (selectedTabActivity != null) { @@ -149,7 +143,9 @@ public class TabPanel placeClass = (Class) placeToGo.getClass(); + tabBar.select(placeClass); currentTab = newTab; @@ -166,14 +162,6 @@ public class TabPanel + xmlns:g='urn:import:com.google.gwt.user.client.ui' + xmlns:c="urn:import:com.sap.sailing.gwt.common.client.controls.tabbar" + xmlns:b="urn:import:com.sap.sse.gwt.client.controls.busyindicator"> @@ -11,17 +13,6 @@ border-bottom: 1px solid #dedede; } - .breadcrumb { - font-size: 1rem; - /* @alternate */ font-size: 0.866666666666667em; - font-weight: 600; - padding: 0.666666666666667em 0; - } - - .back:hover { - background-color: #cfcfcf; - } - .content { width: 100%; height: 100%; @@ -38,12 +29,6 @@ -

-
- -
-
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/main.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/main.gss index 783c6478425..2c330d72467 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/main.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/main.gss @@ -77,44 +77,6 @@ figcaption { .mobile .wrapper { padding-bottom: 11.333333333333334em; } -.navbar { - font-size: 1rem; -} -.navbar_button { - font-size: 1.2em; - display: inline-block; - font-weight: 600; - color: #666; - border: 1px solid #dedede; - padding: 0.833333333333333em 0.944444444444444em; - background-color: #ebebeb; - -webkit-transition: background-color 0.2s, border-color 0.2s; - -moz-transition: background-color 0.2s, border-color 0.2s; - transition: background-color 0.2s, border-color 0.2s; - text-decoration: none; - margin-right: 0.555555555555556em; -} -.desktop .navbar_button { - border-top-left-radius: 0.277777777777778em; - border-top-right-radius: 0.277777777777778em; -} -.navbar_buttonhidden { - display: block; -} -.navbar_button:hover { - background-color: #dedede; - outline: none; - text-decoration: none; -} -.navbar_buttonactive { - color: #333; - background-color: #fff; - border-bottom: 1px solid #fff; -} -.navbar_buttonactive:hover { - background-color: #dedede; - border-bottom: 1px solid #dedede; -} .button { font-size: 1rem; display: inline-block; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader/SAPHeader.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader/SAPHeader.gss deleted file mode 100644 index e5753a2d9cd..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader/SAPHeader.gss +++ /dev/null @@ -1,43 +0,0 @@ -.siteheader { - font-size: 1rem; - background: #333; - border-bottom: 5px solid #f0ab00; - height: 70px; - line-height: 4em; - width: 100%; - overflow: hidden; - text-align:center; -} - -.siteheaderLeft { - float:left; - width: 25%; - text-align: left; -} - -.siteheaderCentered { - width: 50%; - display: inline-block; - margin:0 auto; -} - -.siteheaderRight { - float:right; - width: 25%; - text-align: right; -} - -.logo { - margin: 0.8em 10px; - float: left; -} -.logotitle { - display: inline; - color: #f6f9fc; - font-weight: bold; -} -.pagetitle { - color: #ffffff; - font-size: 1.5rem; - font-weight: bold; -} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader/SAPHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader/SAPHeader.java deleted file mode 100644 index fec03a28200..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader/SAPHeader.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.sap.sailing.gwt.common.theme.component.sapheader; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.core.client.Scheduler; -import com.google.gwt.core.client.Scheduler.RepeatingCommand; -import com.google.gwt.dom.client.DivElement; -import com.google.gwt.dom.client.ParagraphElement; -import com.google.gwt.event.dom.client.ClickEvent; -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.ui.Button; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.common.theme.util.FullscreenUtil; - -public class SAPHeader extends Composite { - private static SAPHeaderUiBinder uiBinder = GWT.create(SAPHeaderUiBinder.class); - - interface SAPHeaderUiBinder extends UiBinder { - } - - @UiField ParagraphElement applicationNameUi; - @UiField DivElement pageTitleUi; - @UiField Button startFullScreenButton; - - public SAPHeader(String applicationName, String pageTitle, boolean startInAutoScreenMode) { - SAPHeaderResources.INSTANCE.css().ensureInjected(); - - initWidget(uiBinder.createAndBindUi(this)); - - applicationNameUi.setInnerText(applicationName != null ? applicationName : " "); - pageTitleUi.setInnerText(pageTitle); - startFullScreenButton.setVisible(startInAutoScreenMode); - - // the 'fullscreen' button should disappear after some seconds (10) - if(startInAutoScreenMode) { - Scheduler.get().scheduleFixedPeriod(new RepeatingCommand() { - public boolean execute () { - startFullScreenButton.setVisible(false); - return false; - } - }, 10000); - } - } - - @UiHandler("startFullScreenButton") - void startFullScreenClicked(ClickEvent e) { - FullscreenUtil.requestFullscreen(); - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader/SAPHeader.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader/SAPHeader.ui.xml deleted file mode 100644 index 8038ddb91ce..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader/SAPHeader.ui.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - -
-
- -

-
-
-
-
-
- -   -
-
-
-
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader2/SAPHeader2.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader2/SAPHeader2.java deleted file mode 100644 index e7eb7073db6..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader2/SAPHeader2.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.sap.sailing.gwt.common.theme.component.sapheader2; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.DivElement; -import com.google.gwt.uibinder.client.UiBinder; -import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.SimplePanel; -import com.google.gwt.user.client.ui.Widget; - -public class SAPHeader2 extends Composite { - private static SAPHeaderUiBinder uiBinder = GWT.create(SAPHeaderUiBinder.class); - - interface SAPHeaderUiBinder extends UiBinder { - } - - @UiField - DivElement applicationNameUi; - @UiField - SimplePanel pageTitleUi; - - @UiField - SimplePanel rightSideUi; - - public SAPHeader2(String applicationName, Widget pageTitle, boolean startInAutoScreenMode) { - SAPHeaderResources.INSTANCE.css().ensureInjected(); - - initWidget(uiBinder.createAndBindUi(this)); - - applicationNameUi.setInnerText(applicationName != null ? applicationName : " "); - pageTitleUi.setWidget(pageTitle); - - - } - - public void addWidgetToRightSide(Widget widget) { - rightSideUi.add(widget); - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader2/SAPHeader2.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader2/SAPHeader2.ui.xml deleted file mode 100644 index fda78514b90..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader2/SAPHeader2.ui.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - -
-
- -
-
- - - - -
-
-
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader2/SAPHeaderResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader2/SAPHeaderResources.java deleted file mode 100644 index 28b6f5945b7..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader2/SAPHeaderResources.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sap.sailing.gwt.common.theme.component.sapheader2; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; -import com.google.gwt.resources.client.CssResource; -import com.google.gwt.resources.client.ImageResource; - -public interface SAPHeaderResources extends ClientBundle { - public static final SAPHeaderResources INSTANCE = GWT.create(SAPHeaderResources.class); - - @Source("SAPHeader2.gss") - LocalCss css(); - - public interface LocalCss extends CssResource { - String siteheader(); - String siteheaderLeft(); - String siteheaderCentered(); - String siteheaderRight(); - String logo(); - String logotitle(); - String pagetitle(); - } - - @Source("logo-small@2x.png") - ImageResource logo(); -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader2/logo-small@2x.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader2/logo-small@2x.png deleted file mode 100644 index e5d2daf91f3..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader2/logo-small@2x.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/Home.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/Home.gwt.xml index bb3b89c097e..6861808a6fe 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/Home.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/Home.gwt.xml @@ -13,6 +13,7 @@ + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationView.java index 9ca54bdf9c8..6b27479c418 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationView.java @@ -10,12 +10,12 @@ import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import com.google.web.bindery.event.shared.EventBus; -import com.sap.sailing.gwt.common.client.controls.tabbar.BreadcrumbPane; import com.sap.sailing.gwt.home.desktop.partials.footer.Footer; import com.sap.sailing.gwt.home.desktop.partials.header.Header; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.DefaultErrorReporter; import com.sap.sse.gwt.client.ErrorReporter; +import com.sap.sse.gwt.client.breadcrumb.BreadcrumbPane; import com.sap.sse.security.ui.authentication.view.AuthenticationMenuView; /** diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationView.ui.xml index 45d48011aff..f27d2f9024c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationView.ui.xml @@ -2,7 +2,7 @@ + xmlns:sse="urn:import:com.sap.sse.gwt.client"> .mainContent { @@ -22,7 +22,7 @@
-
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/event/EventTeaser.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/event/EventTeaser.java index cc6e979d826..55acc3c9eb3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/event/EventTeaser.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/event/EventTeaser.java @@ -12,7 +12,6 @@ import com.google.gwt.user.client.Event; import com.google.gwt.user.client.EventListener; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.common.client.LinkUtil; import com.sap.sailing.gwt.home.communication.event.EventMetadataDTO; import com.sap.sailing.gwt.home.communication.event.LabelType; import com.sap.sailing.gwt.home.communication.eventlist.EventListEventSeriesDTO; @@ -21,6 +20,7 @@ import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.resources.SharedHomeResources; import com.sap.sailing.gwt.home.shared.utils.EventDatesFormatterUtil; import com.sap.sailing.gwt.home.shared.utils.LabelTypeUtil; +import com.sap.sse.gwt.client.LinkUtil; public class EventTeaser extends Composite { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.java index 2f4b11ddbf0..44c10e1f1f9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.java @@ -16,7 +16,6 @@ import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.common.client.LinkUtil; import com.sap.sailing.gwt.common.client.i18n.TextMessages; import com.sap.sailing.gwt.home.communication.eventview.EventViewDTO; import com.sap.sailing.gwt.home.communication.eventview.HasRegattaMetadata; @@ -31,6 +30,7 @@ import com.sap.sailing.gwt.home.shared.utils.EventDatesFormatterUtil; import com.sap.sailing.gwt.home.shared.utils.LabelTypeUtil; import com.sap.sailing.gwt.home.shared.utils.LogoUtil; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sse.gwt.client.LinkUtil; public class EventHeader extends Composite { private static EventHeaderUiBinder uiBinder = GWT.create(EventHeaderUiBinder.class); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattanavigation/DropdownFilter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattanavigation/DropdownFilter.java index 336019ffefd..19d24acfbc2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattanavigation/DropdownFilter.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattanavigation/DropdownFilter.java @@ -13,9 +13,9 @@ import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.common.client.LinkUtil; import com.sap.sailing.gwt.home.desktop.partials.regattanavigation.RegattaNavigationResources.LocalCss; import com.sap.sailing.gwt.home.shared.utils.DropdownHandler; +import com.sap.sse.gwt.client.LinkUtil; public class DropdownFilter extends Composite { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/seriesheader/SeriesHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/seriesheader/SeriesHeader.java index 87e26f33e75..7acb4c0f065 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/seriesheader/SeriesHeader.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/seriesheader/SeriesHeader.java @@ -13,7 +13,6 @@ import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.InlineLabel; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.common.client.LinkUtil; import com.sap.sailing.gwt.home.communication.event.EventMetadataDTO; import com.sap.sailing.gwt.home.communication.event.EventState; import com.sap.sailing.gwt.home.communication.fakeseries.EventSeriesViewDTO; @@ -26,6 +25,7 @@ import com.sap.sailing.gwt.home.shared.places.event.EventDefaultPlace; import com.sap.sailing.gwt.home.shared.resources.SharedHomeResources; import com.sap.sailing.gwt.home.shared.utils.LabelTypeUtil; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sse.gwt.client.LinkUtil; public class SeriesHeader extends Composite { private static SeriesHeaderUiBinder uiBinder = GWT.create(SeriesHeaderUiBinder.class); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/updates/UpdatesBoxItem.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/updates/UpdatesBoxItem.java index 132510bd584..bb6a6799b9f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/updates/UpdatesBoxItem.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/updates/UpdatesBoxItem.java @@ -14,7 +14,6 @@ import com.google.gwt.user.client.Event; import com.google.gwt.user.client.EventListener; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.common.client.BoatClassImageResolver; -import com.sap.sailing.gwt.common.client.LinkUtil; import com.sap.sailing.gwt.home.communication.event.news.AbstractRaceNewsEntryDTO; import com.sap.sailing.gwt.home.communication.event.news.LeaderboardNewsEntryDTO; import com.sap.sailing.gwt.home.communication.event.news.NewsEntryDTO; @@ -22,6 +21,7 @@ import com.sap.sailing.gwt.home.desktop.places.event.EventView; import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.util.ConditionalDateTimeFormatter; +import com.sap.sse.gwt.client.LinkUtil; public class UpdatesBoxItem extends Widget { private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/userHeader/UserHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/userHeader/UserHeader.java deleted file mode 100644 index dba7591a3f5..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/userHeader/UserHeader.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.sap.sailing.gwt.home.desktop.partials.userHeader; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.DivElement; -import com.google.gwt.uibinder.client.UiBinder; -import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.Widget; -import com.sap.sse.security.ui.authentication.app.AuthenticationContext; - -public class UserHeader extends Composite { - private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); - - interface MyUiBinder extends UiBinder { - } - - @UiField DivElement imageUi; - @UiField DivElement nameUi; - @UiField DivElement usernameUi; - - public UserHeader() { - initWidget(uiBinder.createAndBindUi(this)); - } - - public void setUserManagementContext(AuthenticationContext userManagementContext) { - UserHeaderResources.INSTANCE.css().ensureInjected(); - imageUi.getStyle().setBackgroundImage("url(images/home/userdefault.svg)"); - - nameUi.setInnerText(userManagementContext.getUserTitle()); - usernameUi.setInnerText(userManagementContext.getUserSubtitle()); - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UserAccountDetails.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UserAccountDetails.java deleted file mode 100644 index a7d6ec50c86..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UserAccountDetails.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.sap.sailing.gwt.home.desktop.partials.useraccountDetails; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.DivElement; -import com.google.gwt.dom.client.InputElement; -import com.google.gwt.event.dom.client.ClickEvent; -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.ui.Composite; -import com.google.gwt.user.client.ui.PasswordTextBox; -import com.google.gwt.user.client.ui.TextBox; -import com.google.gwt.user.client.ui.Widget; -import com.sap.sse.security.ui.authentication.app.AuthenticationContext; -import com.sap.sse.security.ui.client.i18n.StringMessages; -import com.sap.sse.security.ui.shared.UserDTO; - -public class UserAccountDetails extends Composite { - private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); - - interface MyUiBinder extends UiBinder { - } - - public interface Presenter { - void handleSaveChangesRequest(String fullName, String company); - void handleEmailChangeRequest(String email); - void handlePasswordChangeRequest(String oldPassword, String newPassword, String newPasswordConfirmation); - } - - @UiField DivElement editImageLinkUi; - @UiField InputElement usernameUi; - @UiField TextBox nameUi; - @UiField TextBox companyUi; - @UiField TextBox emailUi; - @UiField PasswordTextBox oldPasswordUi; - @UiField PasswordTextBox newPasswordUi; - @UiField PasswordTextBox newPasswordConfirmationUi; - - private final Presenter presenter; - - public UserAccountDetails(Presenter presenter) { - this.presenter = presenter; - UseraccountDetailsResources.INSTANCE.css().ensureInjected(); - initWidget(uiBinder.createAndBindUi(this)); - StringMessages i18n = StringMessages.INSTANCE; - setPlaceholder(oldPasswordUi, i18n.oldPasswordPlaceholder()); - setPlaceholder(newPasswordUi, i18n.newPasswordPlaceholder()); - setPlaceholder(newPasswordConfirmationUi, i18n.passwordRepeatPlaceholder()); - } - - public void setUserManagementContext(AuthenticationContext userManagementContext) { - UserDTO currentUser = userManagementContext.getCurrentUser(); - // TODO correct message - editImageLinkUi.setTitle("TODO picture of: " + currentUser.getName()); - // TODO use image from user when field is available - editImageLinkUi.getStyle().setBackgroundImage("url(images/home/userdefault.svg)"); - - nameUi.setValue(currentUser.getFullName()); - companyUi.setValue(currentUser.getCompany()); - usernameUi.setValue(currentUser.getName()); - emailUi.setValue(currentUser.getEmail()); - oldPasswordUi.setValue(""); - newPasswordUi.setValue(""); - newPasswordConfirmationUi.setValue(""); - } - - private void setPlaceholder(Widget widget, String placeholderText) { - widget.getElement().setAttribute("placeholder", placeholderText); - } - - @UiHandler("saveChangesUi") - void onSaveChangesClicked(ClickEvent event) { - presenter.handleSaveChangesRequest(nameUi.getValue(), companyUi.getValue()); - } - - @UiHandler("changeEmailUi") - void onChangeEmailClicked(ClickEvent event) { - presenter.handleEmailChangeRequest(emailUi.getValue()); - } - - @UiHandler("changePasswordUi") - void onChangePasswordClicked(ClickEvent event) { - presenter.handlePasswordChangeRequest(oldPasswordUi.getValue(), newPasswordUi.getValue(), - newPasswordConfirmationUi.getValue()); - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/multiregatta/TabletAndDesktopMultiRegattaEventView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/multiregatta/TabletAndDesktopMultiRegattaEventView.java index 4aded731a87..e10ef1e83fc 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/multiregatta/TabletAndDesktopMultiRegattaEventView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/multiregatta/TabletAndDesktopMultiRegattaEventView.java @@ -15,7 +15,6 @@ import com.sap.sailing.gwt.common.client.i18n.TextMessages; import com.sap.sailing.gwt.home.desktop.partials.eventheader.EventHeader; import com.sap.sailing.gwt.home.desktop.partials.sailorinfo.SailorInfo; import com.sap.sailing.gwt.home.shared.app.ApplicationHistoryMapper; -import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.ui.client.StringMessages; public class TabletAndDesktopMultiRegattaEventView extends Composite implements EventMultiregattaView { @@ -43,7 +42,6 @@ public class TabletAndDesktopMultiRegattaEventView extends Composite implements tabPanelUi = new TabPanel<>(currentPresenter, historyMapper); eventHeader = new EventHeader(currentPresenter); initWidget(uiBinder.createAndBindUi(this)); - initBreadCrumbs(); String sailorsInfoURL = currentPresenter.getEventDTO().getSailorsInfoWebsiteURL(); if(sailorsInfoURL != null && ! sailorsInfoURL.isEmpty()) { @@ -70,21 +68,6 @@ public class TabletAndDesktopMultiRegattaEventView extends Composite implements public void onTabSelection(TabPanelPlaceSelectionEvent e) { currentPresenter.handleTabPlaceSelection((TabView) e.getSelectedActivity()); } - - private void initBreadCrumbs() { - addBreadCrumbItem(i18n.home(), currentPresenter.getHomeNavigation()); - addBreadCrumbItem(i18n.events(), currentPresenter.getEventsNavigation()); - addBreadCrumbItem(currentPresenter.getEventDTO().getDisplayName(), currentPresenter.getCurrentEventNavigation()); - } - - private void addBreadCrumbItem(String label, final PlaceNavigation placeNavigation) { - tabPanelUi.addBreadcrumbItem(label, placeNavigation.getTargetUrl(), new Runnable() { - @Override - public void run() { - placeNavigation.goToPlace(); - } - }); - } @Override public void showErrorInCurrentTab(IsWidget errorView) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.java index 0d218a79a69..af2469a276f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.java @@ -14,7 +14,6 @@ import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.common.client.LinkUtil; import com.sap.sailing.gwt.common.client.SharedResources; import com.sap.sailing.gwt.common.client.controls.tabbar.TabPanel; import com.sap.sailing.gwt.common.client.controls.tabbar.TabPanelPlaceSelectionEvent; @@ -27,6 +26,7 @@ import com.sap.sailing.gwt.home.shared.app.ApplicationHistoryMapper; import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.places.fakeseries.SeriesDefaultPlace; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sse.gwt.client.LinkUtil; public class TabletAndDesktopRegattaEventView extends Composite implements EventRegattaView { @@ -53,7 +53,6 @@ public class TabletAndDesktopRegattaEventView extends Composite implements Event tabPanelUi = new TabPanel<>(currentPresenter, historyMapper); eventHeader = new EventHeader(currentPresenter); initWidget(uiBinder.createAndBindUi(this)); - initBreadCrumbs(); if(currentPresenter.getEventDTO().getType() == EventType.SERIES_EVENT) { final PlaceNavigation currentEventSeriesNavigation = currentPresenter.getCurrentEventSeriesNavigation(); @@ -102,28 +101,6 @@ public class TabletAndDesktopRegattaEventView extends Composite implements Event currentPresenter.handleTabPlaceSelection((TabView) e.getSelectedActivity()); } - private void initBreadCrumbs() { - addBreadCrumbItem(i18n.home(), currentPresenter.getHomeNavigation()); - addBreadCrumbItem(i18n.events(), currentPresenter.getEventsNavigation()); - if(currentPresenter.getEventDTO().getType() == EventType.SERIES_EVENT) { - addBreadCrumbItem(currentPresenter.getEventDTO().getSeriesName(), currentPresenter.getCurrentEventSeriesNavigation()); - } - addBreadCrumbItem(currentPresenter.getEventDTO().getLocationOrDisplayName(), currentPresenter.getCurrentEventNavigation()); - - if(currentPresenter.showRegattaMetadata()) { - addBreadCrumbItem(currentPresenter.getRegattaMetadata().getDisplayName(), currentPresenter.getCurrentRegattaOverviewNavigation()); - } - } - - private void addBreadCrumbItem(String label, final PlaceNavigation placeNavigation) { - tabPanelUi.addBreadcrumbItem(label, placeNavigation.getTargetUrl(), new Runnable() { - @Override - public void run() { - placeNavigation.goToPlace(); - } - }); - } - @Override public void showErrorInCurrentTab(IsWidget errorView) { tabPanelUi.overrideCurrentContentInTab(errorView); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/TabletAndDesktopEventsView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/TabletAndDesktopEventsView.java index 95da95fecbc..c61e790dae2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/TabletAndDesktopEventsView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/TabletAndDesktopEventsView.java @@ -5,7 +5,6 @@ import com.google.gwt.dom.client.Style.Display; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.common.client.controls.tabbar.BreadcrumbPane; import com.sap.sailing.gwt.home.desktop.app.DesktopPlacesNavigator; import com.sap.sailing.gwt.home.desktop.partials.eventsrecent.EventsOverviewRecent; import com.sap.sailing.gwt.home.desktop.partials.eventsupcoming.EventsOverviewUpcoming; @@ -13,6 +12,7 @@ import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.places.events.EventsPlace; import com.sap.sailing.gwt.home.shared.places.start.StartPlace; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sse.gwt.client.breadcrumb.BreadcrumbPane; public class TabletAndDesktopEventsView extends AbstractEventsView { private static EventsPageViewUiBinder uiBinder = GWT.create(EventsPageViewUiBinder.class); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/TabletAndDesktopEventsView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/TabletAndDesktopEventsView.ui.xml index f8affc2b4a2..a81580894d1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/TabletAndDesktopEventsView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/TabletAndDesktopEventsView.ui.xml @@ -1,6 +1,6 @@ @@ -17,7 +17,7 @@
- +
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/TabletAndDesktopSeriesView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/TabletAndDesktopSeriesView.java index b11dccfc82e..bb60ba8f119 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/TabletAndDesktopSeriesView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/TabletAndDesktopSeriesView.java @@ -14,7 +14,6 @@ import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; import com.sap.sailing.gwt.common.client.i18n.TextMessages; import com.sap.sailing.gwt.home.desktop.partials.seriesheader.SeriesHeader; import com.sap.sailing.gwt.home.shared.app.ApplicationHistoryMapper; -import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.ui.client.StringMessages; public class TabletAndDesktopSeriesView extends Composite implements SeriesView { @@ -46,8 +45,6 @@ public class TabletAndDesktopSeriesView extends Composite implements SeriesView< seriesHeader = new SeriesHeader(currentPresenter); initWidget(uiBinder.createAndBindUi(this)); - - initBreadCrumbs(); } @Override @@ -70,21 +67,6 @@ public class TabletAndDesktopSeriesView extends Composite implements SeriesView< currentPresenter.handleTabPlaceSelection((TabView) e.getSelectedActivity()); } - private void initBreadCrumbs() { - addBreadCrumbItem(i18n.home(), currentPresenter.getHomeNavigation()); - addBreadCrumbItem(i18n.events(), currentPresenter.getEventsNavigation()); - addBreadCrumbItem(currentPresenter.getSeriesDTO().getDisplayName(), currentPresenter.getCurrentEventSeriesNavigation()); - } - - private void addBreadCrumbItem(String label, final PlaceNavigation placeNavigation) { - tabPanelUi.addBreadcrumbItem(label, placeNavigation.getTargetUrl(), new Runnable() { - @Override - public void run() { - placeNavigation.goToPlace(); - } - }); - } - @Override public void showErrorInCurrentTab(IsWidget errorView) { tabPanelUi.overrideCurrentContentInTab(errorView); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java index 9dc3da6ac38..fc761558c27 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java @@ -8,15 +8,16 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.common.client.SharedResources; import com.sap.sailing.gwt.common.client.controls.tabbar.TabPanel; import com.sap.sailing.gwt.common.client.controls.tabbar.TabPanelPlaceSelectionEvent; import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; import com.sap.sailing.gwt.common.client.i18n.TextMessages; -import com.sap.sailing.gwt.home.desktop.partials.userHeader.UserHeader; import com.sap.sailing.gwt.home.shared.app.ApplicationHistoryMapper; import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.security.ui.authentication.app.AuthenticationContext; +import com.sap.sse.security.ui.userprofile.desktop.userheader.UserHeader; public class TabletAndDesktopUserProfileView extends Composite implements UserProfileView { private static final ApplicationHistoryMapper historyMapper = GWT. create(ApplicationHistoryMapper.class); @@ -44,7 +45,7 @@ public class TabletAndDesktopUserProfileView extends Composite implements UserPr this.currentPresenter = currentPresenter; tabPanelUi = new TabPanel<>(currentPresenter, historyMapper); - headerUi = new UserHeader(); + headerUi = new UserHeader(SharedResources.INSTANCE); initWidget(uiBinder.createAndBindUi(this)); } @@ -64,9 +65,9 @@ public class TabletAndDesktopUserProfileView extends Composite implements UserPr } @Override - public void setUserManagementContext(AuthenticationContext userManagementContext) { - headerUi.setUserManagementContext(userManagementContext); - tabPanelUi.getCurrentTab().setUserManagementContext(userManagementContext); + public void setAuthenticationContext(AuthenticationContext authenticationContext) { + headerUi.setAuthenticationContext(authenticationContext); + tabPanelUi.getCurrentTab().setAuthenticationContext(authenticationContext); } @SuppressWarnings("unchecked") diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.ui.xml index 0d245f6412d..0798d2ce2cc 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.ui.xml @@ -1,7 +1,7 @@ @@ -40,10 +40,10 @@ - + - + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivity.java index a5bf1a7e052..094b20b1d0c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivity.java @@ -6,8 +6,6 @@ import com.google.gwt.event.shared.EventBus; import com.google.gwt.place.shared.Place; import com.google.gwt.safehtml.shared.SafeUri; import com.google.gwt.safehtml.shared.UriUtils; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; import com.sap.sailing.gwt.home.desktop.app.DesktopPlacesNavigator; @@ -18,10 +16,10 @@ import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.places.fakeseries.AbstractSeriesPlace; import com.sap.sailing.gwt.home.shared.places.start.StartPlace; import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace; -import com.sap.sse.security.shared.UserManagementException; import com.sap.sse.security.ui.authentication.AuthenticationContextEvent; +import com.sap.sse.security.ui.authentication.AuthenticationManager; import com.sap.sse.security.ui.authentication.AuthenticationRequestEvent; -import com.sap.sse.security.ui.client.component.NewAccountValidator; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.i18n.StringMessages; public class UserProfileActivity extends AbstractActivity implements UserProfileView.Presenter { @@ -33,16 +31,15 @@ public class UserProfileActivity extends AbstractActivity implements UserProfile protected final DesktopPlacesNavigator homePlacesNavigator; private final StringMessages i18n_sec = StringMessages.INSTANCE; - private final NewAccountValidator validator = new NewAccountValidator(i18n_sec); private UserProfileView currentView = new TabletAndDesktopUserProfileView(); - + public UserProfileActivity(AbstractUserProfilePlace place, UserProfileClientFactory clientFactory, DesktopPlacesNavigator homePlacesNavigator, NavigationPathDisplay navigationPathDisplay) { this.currentPlace = place; this.clientFactory = clientFactory; this.homePlacesNavigator = homePlacesNavigator; - + initNavigationPath(navigationPathDisplay); } @@ -57,86 +54,16 @@ public class UserProfileActivity extends AbstractActivity implements UserProfile currentView.registerPresenter(this); panel.setWidget(currentView); currentView.navigateTabsTo(currentPlace); - currentView.setUserManagementContext(clientFactory.getAuthenticationManager().getAuthenticationContext()); + currentView.setAuthenticationContext(clientFactory.getAuthenticationManager().getAuthenticationContext()); + eventBus.addHandler(AuthenticationContextEvent.TYPE, new AuthenticationContextEvent.Handler() { @Override public void onUserChangeEvent(AuthenticationContextEvent event) { - currentView.setUserManagementContext(event.getCtx()); + currentView.setAuthenticationContext(event.getCtx()); } }); } - - @Override - public void handleSaveChangesRequest(String fullName, String company) { - final String username = clientFactory.getAuthenticationManager().getAuthenticationContext().getCurrentUser().getName(); - clientFactory.getUserManagementService().updateUserProperties(username, fullName, company, - new AsyncCallback() { - @Override - public void onSuccess(Void result) { - clientFactory.getAuthenticationManager().refreshUserInfo(); - Window.alert(i18n_sec.successfullyUpdatedUserProperties(username)); - } - - @Override - public void onFailure(Throwable caught) { - Window.alert(i18n_sec.errorUpdatingUserProperties(caught.getMessage())); - } - }); - } - - @Override - public void handleEmailChangeRequest(final String email) { - final String username = clientFactory.getAuthenticationManager().getAuthenticationContext().getCurrentUser().getName(); - final String url = Window.Location.createUrlBuilder() - .setHash(homePlacesNavigator.getMailVerifiedConfirmationNavigation().getTargetUrl()).buildString(); - clientFactory.getUserManagementService().updateSimpleUserEmail(username, email, url, - new AsyncCallback() { - @Override - public void onSuccess(Void result) { - Window.alert(i18n_sec.successfullyUpdatedEmail(username, email)); - } - - @Override - public void onFailure(Throwable caught) { - Window.alert(i18n_sec.errorUpdatingEmail(caught.getMessage())); - } - }); - } - @Override - public void handlePasswordChangeRequest(String oldPassword, String newPassword, String newPasswordConfirmation) { - final String username = clientFactory.getAuthenticationManager().getAuthenticationContext().getCurrentUser().getName(); - String errorMessage = validator.validateUsernameAndPassword(username, newPassword, newPasswordConfirmation); - if (errorMessage != null && !errorMessage.isEmpty()) { - Window.alert(errorMessage); - return; - } - clientFactory.getUserManagementService().updateSimpleUserPassword(username, oldPassword, null, newPassword, - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - if (caught instanceof UserManagementException) { - String message = ((UserManagementException) caught).getMessage(); - if (UserManagementException.PASSWORD_DOES_NOT_MEET_REQUIREMENTS.equals(message)) { - Window.alert(i18n_sec.passwordDoesNotMeetRequirements()); - } else if (UserManagementException.INVALID_CREDENTIALS.equals(message)) { - Window.alert(i18n_sec.invalidCredentials()); - } else { - Window.alert(i18n_sec.errorChangingPassword(caught.getMessage())); - } - } else { - Window.alert(i18n_sec.errorChangingPassword(caught.getMessage())); - } - } - - @Override - public void onSuccess(Void result) { - Window.alert(i18n_sec.passwordSuccessfullyChanged()); - currentView.setUserManagementContext(clientFactory.getAuthenticationManager().getAuthenticationContext()); - } - }); - } - @Override public void handleTabPlaceSelection(TabView selectedActivity) { Place tabPlaceToGo = selectedActivity.placeToFire(); @@ -168,4 +95,20 @@ public class UserProfileActivity extends AbstractActivity implements UserProfile public void doTriggerLoginForm() { clientFactory.getEventBus().fireEvent(new AuthenticationRequestEvent()); } + + @Override + public AuthenticationManager getAuthenticationManager() { + return clientFactory.getAuthenticationManager(); + } + + @Override + public String getMailVerifiedUrl() { + return homePlacesNavigator + .getMailVerifiedConfirmationNavigation().getTargetUrl(); + } + + @Override + public UserManagementServiceAsync getUserManagementService() { + return clientFactory.getUserManagementService(); + } } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileTabView.java index 3f4b40a37b9..860d77468f7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileTabView.java @@ -2,10 +2,8 @@ package com.sap.sailing.gwt.home.desktop.places.user.profile; import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace; -import com.sap.sse.security.ui.authentication.app.AuthenticationContext; +import com.sap.sse.security.ui.authentication.app.NeedsAuthenticationContext; -public interface UserProfileTabView extends TabView { - - void setUserManagementContext(AuthenticationContext userManagementContext); - +public interface UserProfileTabView extends + TabView, NeedsAuthenticationContext { } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileView.java index 73637b01952..aa0daa52deb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileView.java @@ -4,17 +4,18 @@ import com.google.gwt.place.shared.Place; import com.google.gwt.safehtml.shared.SafeUri; import com.google.gwt.user.client.ui.IsWidget; import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; -import com.sap.sailing.gwt.home.desktop.partials.useraccountDetails.UserAccountDetails; import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.places.fakeseries.AbstractSeriesPlace; import com.sap.sailing.gwt.home.shared.places.start.StartPlace; import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace; -import com.sap.sailing.gwt.home.shared.usermanagement.decorator.NotLoggedInPresenter; -import com.sap.sse.security.ui.authentication.app.AuthenticationContext; +import com.sap.sse.security.ui.authentication.AuthenticationManager; +import com.sap.sse.security.ui.authentication.app.NeedsAuthenticationContext; +import com.sap.sse.security.ui.authentication.decorator.NotLoggedInPresenter; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; -public interface UserProfileView extends IsWidget { +public interface UserProfileView extends IsWidget, NeedsAuthenticationContext { - public interface Presenter extends UserAccountDetails.Presenter, NotLoggedInPresenter { + public interface Presenter extends NotLoggedInPresenter { void handleTabPlaceSelection(TabView selectedActivity); SafeUri getUrl(AbstractSeriesPlace place); @@ -22,6 +23,12 @@ public interface UserProfileView getHomeNavigation(); PlaceNavigation getUserProfileNavigation(); + + AuthenticationManager getAuthenticationManager(); + + UserManagementServiceAsync getUserManagementService(); + + String getMailVerifiedUrl(); } /** @@ -39,7 +46,4 @@ public interface UserProfileView { - interface MyBinder extends UiBinder { - } + private UserProfileDetailsView.Presenter currentPresenter; - private static MyBinder ourUiBinder = GWT.create(MyBinder.class); - - @UiField(provided = true) - AuthorizedContentDecoratorDesktop decoratorUi; - - @UiField(provided = true) - UserAccountDetails accountDetailsUi; - - private UserProfileView.Presenter currentPresenter; + private UserProfileDetailsView view; public UserProfileDetailsTabView() { } @@ -47,16 +32,12 @@ public class UserProfileDetailsTabView extends Composite implements UserProfileT @Override public void start(UserProfileDetailsPlace myPlace, AcceptsOneWidget contentArea) { - decoratorUi = new AuthorizedContentDecoratorDesktop(currentPresenter); - accountDetailsUi = new UserAccountDetails(currentPresenter); - initWidget(ourUiBinder.createAndBindUi(this)); - contentArea.setWidget(this); + contentArea.setWidget(view); } - + @Override - public void setUserManagementContext(AuthenticationContext userManagementContext) { - decoratorUi.setUserManagementContext(userManagementContext); - accountDetailsUi.setUserManagementContext(userManagementContext); + public void setAuthenticationContext(AuthenticationContext authenticationContext) { + currentPresenter.setAuthenticationContext(authenticationContext); } @Override @@ -71,6 +52,7 @@ public class UserProfileDetailsTabView extends Composite implements UserProfileT @Override public void setPresenter(UserProfileView.Presenter currentPresenter) { - this.currentPresenter = currentPresenter; + view = new UserProfileDetailsViewImpl(); + this.currentPresenter = new UserProfileDetailsPresenter(view, currentPresenter); } } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/detailstab/UserProfileDetailsView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/detailstab/UserProfileDetailsView.java new file mode 100644 index 00000000000..b59ca898648 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/detailstab/UserProfileDetailsView.java @@ -0,0 +1,19 @@ +package com.sap.sailing.gwt.home.desktop.places.user.profile.detailstab; + +import com.google.gwt.user.client.ui.IsWidget; +import com.sap.sse.security.ui.authentication.app.AuthenticationContext; +import com.sap.sse.security.ui.authentication.app.NeedsAuthenticationContext; +import com.sap.sse.security.ui.userprofile.shared.userdetails.UserDetailsView; + +public interface UserProfileDetailsView extends IsWidget { + + void setPresenter(Presenter presenter); + + UserDetailsView getUserDetailsView(); + + NeedsAuthenticationContext getDecorator(); + + public interface Presenter { + void setAuthenticationContext(AuthenticationContext userManagementContext); + } +} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/detailstab/UserProfileDetailsViewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/detailstab/UserProfileDetailsViewImpl.java new file mode 100644 index 00000000000..9e371f2fee1 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/detailstab/UserProfileDetailsViewImpl.java @@ -0,0 +1,52 @@ +package com.sap.sailing.gwt.home.desktop.places.user.profile.detailstab; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.common.client.SharedResources; +import com.sap.sailing.gwt.home.desktop.places.user.profile.UserProfileView; +import com.sap.sailing.gwt.home.shared.usermanagement.decorator.AuthorizedContentDecoratorDesktop; +import com.sap.sse.security.ui.authentication.app.NeedsAuthenticationContext; +import com.sap.sse.security.ui.userprofile.desktop.userdetails.UserAccountDetails; +import com.sap.sse.security.ui.userprofile.shared.userdetails.UserDetailsView; + +/** + * Created by pgtaboada on 25.11.14. + */ +public class UserProfileDetailsViewImpl extends Composite implements UserProfileDetailsView { + + interface MyBinder extends UiBinder { + } + + private static MyBinder ourUiBinder = GWT.create(MyBinder.class); + + @UiField(provided = true) + AuthorizedContentDecoratorDesktop decoratorUi; + + @UiField(provided = true) + UserAccountDetails accountDetailsUi; + + private UserProfileView.Presenter currentPresenter; + + + public UserProfileDetailsViewImpl() { + } + + public UserDetailsView getUserDetailsView() { + return accountDetailsUi; + } + + @Override + public void setPresenter(Presenter presenter) { + decoratorUi = new AuthorizedContentDecoratorDesktop(currentPresenter); + accountDetailsUi = new UserAccountDetails(SharedResources.INSTANCE); + initWidget(ourUiBinder.createAndBindUi(this)); + } + + @Override + public NeedsAuthenticationContext getDecorator() { + return decoratorUi; + } +} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/detailstab/UserProfileDetailsTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/detailstab/UserProfileDetailsViewImpl.ui.xml similarity index 71% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/detailstab/UserProfileDetailsTabView.ui.xml rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/detailstab/UserProfileDetailsViewImpl.ui.xml index 03cd95884a3..7e52001b1d8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/detailstab/UserProfileDetailsTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/detailstab/UserProfileDetailsViewImpl.ui.xml @@ -1,12 +1,13 @@ + xmlns:ud="urn:import:com.sap.sse.security.ui.userprofile.desktop.userdetails" + xmlns:um="urn:import:com.sap.sailing.gwt.home.shared.usermanagement.decorator"> - diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/header/Header.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/header/Header.java index d9b2060e04c..14eabebfbd3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/header/Header.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/header/Header.java @@ -15,7 +15,6 @@ import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.Widget; import com.google.web.bindery.event.shared.EventBus; -import com.sap.sailing.gwt.common.client.LinkUtil; import com.sap.sailing.gwt.common.client.i18n.TextMessages; import com.sap.sailing.gwt.home.mobile.app.MobilePlacesNavigator; import com.sap.sailing.gwt.home.shared.ExperimentalFeatures; @@ -23,8 +22,9 @@ import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.app.ResettableNavigationPathDisplay; import com.sap.sailing.gwt.home.shared.utils.DropdownHandler; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sse.gwt.client.LinkUtil; import com.sap.sse.security.ui.authentication.AuthenticationContextEvent; -import com.sap.sse.security.ui.authentication.AuthenticationRequestEvent; +import com.sap.sse.security.ui.authentication.AuthenticationSignOutRequestEvent; public class Header extends Composite { @@ -73,7 +73,7 @@ public class Header extends Composite { signOutNavigationItem = addNavigation(com.sap.sse.security.ui.client.i18n.StringMessages.INSTANCE.signOut(), new Runnable() { @Override public void run() { - eventBus.fireEvent(new AuthenticationRequestEvent(false)); + eventBus.fireEvent(new AuthenticationSignOutRequestEvent()); } }); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/sectionHeader/SectionHeaderContent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/sectionHeader/SectionHeaderContent.java index 664aecc761e..04ba4efb438 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/sectionHeader/SectionHeaderContent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/sectionHeader/SectionHeaderContent.java @@ -16,12 +16,12 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.common.client.LinkUtil; import com.sap.sailing.gwt.home.communication.event.LabelType; import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.partials.filter.AbstractSelectionFilter; import com.sap.sailing.gwt.home.shared.utils.CollapseAnimation; import com.sap.sailing.gwt.home.shared.utils.LabelTypeUtil; +import com.sap.sse.gwt.client.LinkUtil; public class SectionHeaderContent extends Composite { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.ui.xml deleted file mode 100644 index 91cb1f22ad9..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.ui.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - -
-
-
-
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
- - - -
-
- -
- -
- - - -
-
- -
- -
-
-
- -
- -
-
-
- -
- -
- - - -
-
-
-
-
-
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userheader/UserHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userheader/UserHeader.java deleted file mode 100644 index 3b1dc2b1c6d..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userheader/UserHeader.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.sap.sailing.gwt.home.mobile.partials.userheader; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.DivElement; -import com.google.gwt.dom.client.HeadingElement; -import com.google.gwt.uibinder.client.UiBinder; -import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.Widget; -import com.sap.sse.security.ui.authentication.app.AuthenticationContext; -import com.sap.sse.security.ui.shared.UserDTO; - -public class UserHeader extends Composite { - - interface MyUiBinder extends UiBinder { - } - - private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); - - @UiField HeadingElement titleUi; - @UiField DivElement imageUi; - @UiField DivElement subtitleUi; - - public UserHeader() { - UserHeaderResources.INSTANCE.css().ensureInjected(); - initWidget(uiBinder.createAndBindUi(this)); - imageUi.getStyle().setBackgroundImage("url(images/home/userdefault.svg)"); - titleUi.setInnerText("testuser"); - subtitleUi.setInnerText("jennifer@auchnichtwennduderletztemenschauferdenwaerts.looser"); - } - - public void setUserManagementContext(AuthenticationContext userManagementContext) { - UserDTO currentUser = userManagementContext.getCurrentUser(); - // TODO correct message - imageUi.setTitle("TODO picture of: " + currentUser.getName()); - // TODO use image from user when field is available - imageUi.getStyle().setBackgroundImage("url(images/home/userdefault.svg)"); - - titleUi.setInnerText(userManagementContext.getUserTitle()); - subtitleUi.setInnerText(userManagementContext.getUserSubtitle()); - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsActivity.java index 458172c0018..c723488bbb0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsActivity.java @@ -2,24 +2,19 @@ package com.sap.sailing.gwt.home.mobile.places.user.profile; import com.google.gwt.activity.shared.AbstractActivity; import com.google.gwt.event.shared.EventBus; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.sap.sailing.gwt.home.mobile.app.MobileApplicationClientFactory; import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace; -import com.sap.sse.security.shared.UserManagementException; import com.sap.sse.security.ui.authentication.AuthenticationContextEvent; -import com.sap.sse.security.ui.client.component.NewAccountValidator; -import com.sap.sse.security.ui.client.i18n.StringMessages; +import com.sap.sse.security.ui.userprofile.shared.userdetails.UserDetailsPresenter; public class UserProfileDetailsActivity extends AbstractActivity implements UserProfileDetailsView.Presenter { private final MobileApplicationClientFactory clientFactory; - private final StringMessages i18n_sec = StringMessages.INSTANCE; - private final NewAccountValidator validator = new NewAccountValidator(i18n_sec); - private final UserProfileDetailsView currentView = new UserProfileDetailsViewImpl(this); + + private UserDetailsPresenter userDetailsPresenter; public UserProfileDetailsActivity(AbstractUserProfilePlace place, MobileApplicationClientFactory clientFactory) { this.clientFactory = clientFactory; @@ -28,11 +23,17 @@ public class UserProfileDetailsActivity extends AbstractActivity implements User @Override public void start(final AcceptsOneWidget panel, final EventBus eventBus) { panel.setWidget(currentView); - currentView.setUserManagementContext(clientFactory.getAuthenticationManager().getAuthenticationContext()); + currentView.setAuthenticationContext(clientFactory.getAuthenticationManager().getAuthenticationContext()); + + userDetailsPresenter = new UserDetailsPresenter(currentView.getUserDetailsView(), + clientFactory.getAuthenticationManager(), clientFactory.getUserManagementService(), clientFactory + .getNavigator().getMailVerifiedConfirmationNavigation().getTargetUrl()); + eventBus.addHandler(AuthenticationContextEvent.TYPE, new AuthenticationContextEvent.Handler() { @Override public void onUserChangeEvent(AuthenticationContextEvent event) { - currentView.setUserManagementContext(event.getCtx()); + currentView.setAuthenticationContext(event.getCtx()); + userDetailsPresenter.setAuthenticationContext(event.getCtx()); } }); } @@ -41,76 +42,4 @@ public class UserProfileDetailsActivity extends AbstractActivity implements User public void doTriggerLoginForm() { clientFactory.getNavigator().getSignInNavigation().goToPlace(); } - - @Override - public void handleSaveChangesRequest(String fullName, String company) { - final String username = clientFactory.getAuthenticationManager().getAuthenticationContext().getCurrentUser().getName(); - clientFactory.getUserManagementService().updateUserProperties(username, fullName, company, - new AsyncCallback() { - @Override - public void onSuccess(Void result) { - clientFactory.getAuthenticationManager().refreshUserInfo(); - Window.alert(i18n_sec.successfullyUpdatedUserProperties(username)); - } - - @Override - public void onFailure(Throwable caught) { - Window.alert(i18n_sec.errorUpdatingUserProperties(caught.getMessage())); - } - }); - } - - @Override - public void handleEmailChangeRequest(final String email) { - final String username = clientFactory.getAuthenticationManager().getAuthenticationContext().getCurrentUser().getName(); - final String url = Window.Location.createUrlBuilder() - .setHash(clientFactory.getNavigator().getMailVerifiedConfirmationNavigation().getTargetUrl()) - .buildString(); - clientFactory.getUserManagementService().updateSimpleUserEmail(username, email, url, - new AsyncCallback() { - @Override - public void onSuccess(Void result) { - Window.alert(i18n_sec.successfullyUpdatedEmail(username, email)); - } - - @Override - public void onFailure(Throwable caught) { - Window.alert(i18n_sec.errorUpdatingEmail(caught.getMessage())); - } - }); - } - - @Override - public void handlePasswordChangeRequest(String oldPassword, String newPassword, String newPasswordConfirmation) { - final String username = clientFactory.getAuthenticationManager().getAuthenticationContext().getCurrentUser().getName(); - String errorMessage = validator.validateUsernameAndPassword(username, newPassword, newPasswordConfirmation); - if (errorMessage != null && !errorMessage.isEmpty()) { - Window.alert(errorMessage); - return; - } - clientFactory.getUserManagementService().updateSimpleUserPassword(username, oldPassword, null, newPassword, - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - if (caught instanceof UserManagementException) { - String message = ((UserManagementException) caught).getMessage(); - if (UserManagementException.PASSWORD_DOES_NOT_MEET_REQUIREMENTS.equals(message)) { - Window.alert(i18n_sec.passwordDoesNotMeetRequirements()); - } else if (UserManagementException.INVALID_CREDENTIALS.equals(message)) { - Window.alert(i18n_sec.invalidCredentials()); - } else { - Window.alert(i18n_sec.errorChangingPassword(caught.getMessage())); - } - } else { - Window.alert(i18n_sec.errorChangingPassword(caught.getMessage())); - } - } - - @Override - public void onSuccess(Void result) { - Window.alert(i18n_sec.passwordSuccessfullyChanged()); - currentView.setUserManagementContext(clientFactory.getAuthenticationManager().getAuthenticationContext()); - } - }); - } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsView.java index b6ed8fcd083..c7bce74050d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsView.java @@ -1,15 +1,15 @@ package com.sap.sailing.gwt.home.mobile.places.user.profile; import com.google.gwt.user.client.ui.IsWidget; -import com.sap.sailing.gwt.home.mobile.partials.userdetails.UserDetails; -import com.sap.sailing.gwt.home.shared.usermanagement.decorator.NotLoggedInPresenter; -import com.sap.sse.security.ui.authentication.app.AuthenticationContext; +import com.sap.sse.security.ui.authentication.app.NeedsAuthenticationContext; +import com.sap.sse.security.ui.authentication.decorator.NotLoggedInPresenter; +import com.sap.sse.security.ui.userprofile.shared.userdetails.UserDetailsView; -public interface UserProfileDetailsView extends IsWidget { +public interface UserProfileDetailsView extends IsWidget, NeedsAuthenticationContext { - void setUserManagementContext(AuthenticationContext userManagementContext); + UserDetailsView getUserDetailsView(); - public interface Presenter extends UserDetails.Presenter, NotLoggedInPresenter { + public interface Presenter extends NotLoggedInPresenter { } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsViewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsViewImpl.java index 9e48ef19867..7e8dea11d35 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsViewImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsViewImpl.java @@ -5,10 +5,12 @@ import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.home.mobile.partials.userdetails.UserDetails; -import com.sap.sailing.gwt.home.mobile.partials.userheader.UserHeader; +import com.sap.sailing.gwt.common.client.SharedResources; import com.sap.sailing.gwt.home.shared.usermanagement.decorator.AuthorizedContentDecoratorMobile; import com.sap.sse.security.ui.authentication.app.AuthenticationContext; +import com.sap.sse.security.ui.userprofile.mobile.userdetails.UserDetails; +import com.sap.sse.security.ui.userprofile.mobile.userheader.UserHeader; +import com.sap.sse.security.ui.userprofile.shared.userdetails.UserDetailsView; public class UserProfileDetailsViewImpl extends Composite implements UserProfileDetailsView { private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); @@ -16,20 +18,25 @@ public class UserProfileDetailsViewImpl extends Composite implements UserProfile interface MyUiBinder extends UiBinder { } - @UiField UserHeader userHeaderUi; - @UiField(provided = true) AuthorizedContentDecoratorMobile decoratorUi; - @UiField(provided = true) UserDetails userDetailsUi; + @UiField(provided = true) final UserHeader userHeaderUi; + @UiField(provided = true) final AuthorizedContentDecoratorMobile decoratorUi; + @UiField(provided = true) final UserDetails userDetailsUi; public UserProfileDetailsViewImpl(Presenter presenter) { + userHeaderUi = new UserHeader(SharedResources.INSTANCE); decoratorUi = new AuthorizedContentDecoratorMobile(presenter); - userDetailsUi = new UserDetails(presenter); + userDetailsUi = new UserDetails(SharedResources.INSTANCE); initWidget(uiBinder.createAndBindUi(this)); } @Override - public void setUserManagementContext(AuthenticationContext userManagementContext) { - userHeaderUi.setUserManagementContext(userManagementContext); - decoratorUi.setUserManagementContext(userManagementContext); - userDetailsUi.setUserManagementContext(userManagementContext); + public UserDetailsView getUserDetailsView() { + return userDetailsUi; + } + + @Override + public void setAuthenticationContext(AuthenticationContext authenticationContext) { + userHeaderUi.setAuthenticationContext(authenticationContext); + decoratorUi.setAuthenticationContext(authenticationContext); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsViewImpl.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsViewImpl.ui.xml index e7fead29fe5..e6d16a49d82 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsViewImpl.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsViewImpl.ui.xml @@ -1,12 +1,13 @@ - + - + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/PlaceNavigation.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/PlaceNavigation.java index c48992bc1b6..db241b1e3cb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/PlaceNavigation.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/PlaceNavigation.java @@ -8,7 +8,7 @@ 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.sap.sailing.gwt.common.client.LinkUtil; +import com.sap.sse.gwt.client.LinkUtil; public class PlaceNavigation { private final PlaceNavigator placeNavigator; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/countdown/Countdown.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/countdown/Countdown.java index b7e137a2df8..a1014b24faf 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/countdown/Countdown.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/countdown/Countdown.java @@ -13,7 +13,6 @@ import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.common.client.LinkUtil; import com.sap.sailing.gwt.common.client.SharedResources; import com.sap.sailing.gwt.common.client.SharedResources.MainCss; import com.sap.sailing.gwt.common.client.i18n.TextMessages; @@ -25,6 +24,7 @@ import com.sap.sailing.gwt.home.shared.partials.countdown.CountdownResources.Loc import com.sap.sailing.gwt.home.shared.partials.countdowntimer.CountdownTimer; import com.sap.sailing.gwt.home.shared.resources.SharedHomeResources; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sse.gwt.client.LinkUtil; public class Countdown extends Composite { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/lowerthird/LowerThird.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/lowerthird/LowerThird.java index b8a74830cf0..b695328a905 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/lowerthird/LowerThird.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/lowerthird/LowerThird.java @@ -12,12 +12,12 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.EventListener; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.common.client.LinkUtil; import com.sap.sailing.gwt.common.client.SharedResources; import com.sap.sailing.gwt.home.communication.event.LabelType; import com.sap.sailing.gwt.home.shared.utils.ButtonUtil; import com.sap.sailing.gwt.home.shared.utils.LabelTypeUtil; import com.sap.sailing.gwt.home.shared.utils.ButtonUtil.ButtonType; +import com.sap.sse.gwt.client.LinkUtil; public class LowerThird extends Widget { private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/AuthorizedContentDecorator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/AuthorizedContentDecorator.java deleted file mode 100644 index 70776535623..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/AuthorizedContentDecorator.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.sap.sailing.gwt.home.shared.usermanagement.decorator; - -import com.google.gwt.uibinder.client.UiChild; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.SimplePanel; -import com.google.gwt.user.client.ui.Widget; -import com.sap.sse.security.ui.authentication.app.AuthenticationContext; -import com.sap.sse.security.ui.client.i18n.StringMessages; - -public class AuthorizedContentDecorator extends Composite { - - private final SimplePanel contentHolder = new SimplePanel(); - private Widget content; - private final NotLoggedInView notLoggedInView; - - public AuthorizedContentDecorator(NotLoggedInPresenter presenter, NotLoggedInView notLoggedInView) { - this.notLoggedInView = notLoggedInView; - - notLoggedInView.setPresenter(presenter); - notLoggedInView.setMessage(StringMessages.INSTANCE.youAreNotSignedIn()); - notLoggedInView.setSignInText(StringMessages.INSTANCE.signIn()); - - initWidget(contentHolder); - } - - @UiChild(limit = 1) - public void addContent(Widget content) { - this.content = content; - } - - public void setUserManagementContext(AuthenticationContext userManagementContext) { - contentHolder.setWidget(userManagementContext.isLoggedIn() ? content : notLoggedInView); - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/AuthorizedContentDecoratorDesktop.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/AuthorizedContentDecoratorDesktop.java index d3e7252ec92..df29d6b995d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/AuthorizedContentDecoratorDesktop.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/AuthorizedContentDecoratorDesktop.java @@ -1,5 +1,8 @@ package com.sap.sailing.gwt.home.shared.usermanagement.decorator; +import com.sap.sse.security.ui.authentication.decorator.AuthorizedContentDecorator; +import com.sap.sse.security.ui.authentication.decorator.NotLoggedInPresenter; + public class AuthorizedContentDecoratorDesktop extends AuthorizedContentDecorator { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/AuthorizedContentDecoratorMobile.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/AuthorizedContentDecoratorMobile.java index a18f2ca123d..f9171178f3f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/AuthorizedContentDecoratorMobile.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/AuthorizedContentDecoratorMobile.java @@ -1,5 +1,8 @@ package com.sap.sailing.gwt.home.shared.usermanagement.decorator; +import com.sap.sse.security.ui.authentication.decorator.AuthorizedContentDecorator; +import com.sap.sse.security.ui.authentication.decorator.NotLoggedInPresenter; + public class AuthorizedContentDecoratorMobile extends AuthorizedContentDecorator { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/NotLoggedInPresenter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/NotLoggedInPresenter.java deleted file mode 100644 index 212af55c342..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/NotLoggedInPresenter.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.sap.sailing.gwt.home.shared.usermanagement.decorator; - -public interface NotLoggedInPresenter { - void doTriggerLoginForm(); -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/NotLoggedInView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/NotLoggedInView.java deleted file mode 100644 index 4a59ba501ed..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/NotLoggedInView.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.sap.sailing.gwt.home.shared.usermanagement.decorator; - -import com.google.gwt.user.client.ui.IsWidget; - -public interface NotLoggedInView extends IsWidget { - - void setPresenter(NotLoggedInPresenter presenter); - - void setMessage(String message); - - void setSignInText(String signInText); -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/NotLoggedInViewDesktopImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/NotLoggedInViewDesktopImpl.java index a33863098a2..58706ebb73e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/NotLoggedInViewDesktopImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/NotLoggedInViewDesktopImpl.java @@ -9,6 +9,8 @@ import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.security.ui.authentication.decorator.NotLoggedInPresenter; +import com.sap.sse.security.ui.authentication.decorator.NotLoggedInView; public class NotLoggedInViewDesktopImpl extends Composite implements NotLoggedInView { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/NotLoggedInViewMobileImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/NotLoggedInViewMobileImpl.java index 50de7f1bfcc..e371f735361 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/NotLoggedInViewMobileImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/NotLoggedInViewMobileImpl.java @@ -9,6 +9,8 @@ import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.security.ui.authentication.decorator.NotLoggedInPresenter; +import com.sap.sse.security.ui.authentication.decorator.NotLoggedInView; public class NotLoggedInViewMobileImpl extends Composite implements NotLoggedInView { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewDesktop.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewDesktop.java index 6125dd5d12b..77d616f1fb6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewDesktop.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewDesktop.java @@ -19,7 +19,7 @@ public class AuthenticationViewDesktop extends AbstractFlyoutAuthenticationView Element anchor = Document.get().getElementById("usrMngmtFlyover"); if (anchor != null) { int left = anchor.getAbsoluteLeft() + anchor.getOffsetWidth() - offsetWidth + 15; - popupPanel.setPopupPosition(left, anchor.getAbsoluteTop() + 20); + popupPanel.setPopupPosition(left, anchor.getAbsoluteTop() + 10); } getPresenter().onVisibilityChanged(true); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/RegattaOverview.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/RegattaOverview.gwt.xml index 7bde5630361..ea9bcc3a60c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/RegattaOverview.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/RegattaOverview.gwt.xml @@ -41,6 +41,7 @@ + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverview.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverview.gss index 4cab45e2376..daa9e3e163e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverview.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverview.gss @@ -13,30 +13,12 @@ body { font-weight: 500; } -.eventDescription { - vertical-align: top; - height: 40px; -} - .repeatedInfoLabel { margin: 10px; font-size: 20px; font-weight: 700; } -.eventLabel { - color: #fff; - vertical-align: top; - font-size: 20px; - font-weight: 700; -} - -.venueLabel { - color: #fff; - font-size: 18px; - vertical-align: top; -} - .clockLabel { margin-left:30px; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewEntryPoint.java index bc7014f825e..9816dfb46b1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewEntryPoint.java @@ -14,12 +14,13 @@ import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.RootLayoutPanel; import com.google.gwt.user.client.ui.ScrollPanel; +import com.sap.sailing.gwt.common.authentication.FixedSailingAuthentication; import com.sap.sailing.gwt.common.client.SharedResources; -import com.sap.sailing.gwt.common.theme.component.sapheader2.SAPHeader2; import com.sap.sailing.gwt.regattaoverview.client.RegattaRaceStatesComponent.EntryHandler; import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint; import com.sap.sailing.gwt.ui.shared.RegattaOverviewEntryDTO; import com.sap.sse.gwt.client.URLEncoder; +import com.sap.sse.security.ui.authentication.generic.sapheader.SAPHeaderWithAuthentication; public class RegattaOverviewEntryPoint extends AbstractSailingEntryPoint { @@ -33,11 +34,10 @@ public class RegattaOverviewEntryPoint extends AbstractSailingEntryPoint { private DockLayoutPanel containerPanel; private RaceDetailPanel detailPanel; private RegattaOverviewPanel regattaPanel; - private final Label eventNameLabel = new Label(); - private final Label venueNameLabel = new Label(); private final Label clockLabel = new Label(); private final RegattaOverviewResources.LocalCss style = RegattaOverviewResources.INSTANCE.css(); + private SAPHeaderWithAuthentication siteHeader; @Override public void doOnModuleLoad() { @@ -52,18 +52,14 @@ public class RegattaOverviewEntryPoint extends AbstractSailingEntryPoint { rootPanel.add(containerPanel); containerPanel.addStyleName(RegattaOverviewResources.INSTANCE.css().container()); - FlowPanel descriptionUi = new FlowPanel(); - descriptionUi.setStyleName(style.eventDescription()); - eventNameLabel.addStyleName(style.eventLabel()); - venueNameLabel.addStyleName(style.venueLabel()); clockLabel.addStyleName(style.clockLabel()); - descriptionUi.add(eventNameLabel); - descriptionUi.add(venueNameLabel); - SAPHeader2 logoAndTitlePanel = new SAPHeader2(getStringMessages().sapSailingAnalytics(), descriptionUi, false); + siteHeader = new SAPHeaderWithAuthentication(getStringMessages() + .sapSailingAnalytics()); + new FixedSailingAuthentication(getUserService(), siteHeader.getAuthenticationMenuView()); - logoAndTitlePanel.addWidgetToRightSide(clockLabel); - containerPanel.addNorth(logoAndTitlePanel, 75); + siteHeader.addWidgetToRightSide(clockLabel); + containerPanel.addNorth(siteHeader, 75); String eventIdAsString = Window.Location.getParameter(PARAM_EVENT); if (eventIdAsString == null) { @@ -103,9 +99,8 @@ public class RegattaOverviewEntryPoint extends AbstractSailingEntryPoint { regattaPanel.addHandler(new EventDTOLoadedEvent.Handler() { @Override public void onEventDTOLoaded(EventDTOLoadedEvent e) { - eventNameLabel.setText(e.getCurrentEvent().getName()); - venueNameLabel.setText(e.getCurrentEvent().venue.getName()); - + siteHeader.setHeaderTitle(e.getCurrentEvent().getName()); + siteHeader.setHeaderSubTitle(e.getCurrentEvent().venue.getName()); } }, EventDTOLoadedEvent.TYPE); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewResources.java index d77cb6a05d6..a931f34380a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewResources.java @@ -13,8 +13,6 @@ public interface RegattaOverviewResources extends ClientBundle { public interface LocalCss extends CssResource { String container(); String titleLabel(); - String eventLabel(); - String venueLabel(); String clockLabel(); String refreshStopTime(); String functionBar(); @@ -29,22 +27,13 @@ public interface RegattaOverviewResources extends ClientBundle { String raceDetailPanel_content(); String leaderboards(); String viewerToolbar_innerElement(); - String settingsButton(); - String refreshButton(); - String refreshButton_live(); - String refreshButton_playing(); - String eventDescription(); - String button(); - String buttonLeaderboard(); - String functionBarLeft(); - String repeatedInfoLabel(); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml index 1146064af80..1da133d8ad6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml @@ -66,6 +66,11 @@ + + + + + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/SourceRaceboard.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/SourceRaceboard.gwt.xml index 5d6285b38d6..c86332fc1fa 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/SourceRaceboard.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/SourceRaceboard.gwt.xml @@ -3,7 +3,7 @@ - + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java index 80bdc0a8fb5..e85d96eb8d2 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java @@ -8,11 +8,14 @@ import java.util.Set; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.ServiceDefTarget; +import com.google.gwt.user.client.ui.HeaderPanel; import com.google.gwt.user.client.ui.RootLayoutPanel; import com.google.gwt.user.client.ui.TabLayoutPanel; +import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.domain.common.security.Permission; import com.sap.sailing.domain.common.security.Roles; import com.sap.sailing.domain.common.security.SailingPermissionsForRoleProvider; +import com.sap.sailing.gwt.common.authentication.FixedSailingAuthentication; import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint; import com.sap.sailing.gwt.ui.client.LeaderboardGroupsDisplayer; import com.sap.sailing.gwt.ui.client.LeaderboardGroupsRefresher; @@ -37,6 +40,11 @@ import com.sap.sse.gwt.client.async.MarkedAsyncCallback; import com.sap.sse.gwt.client.controls.filestorage.FileStoragePanel; import com.sap.sse.gwt.resources.Highcharts; import com.sap.sse.security.shared.Role; +import com.sap.sse.security.ui.authentication.decorator.AuthorizedContentDecorator; +import com.sap.sse.security.ui.authentication.decorator.WidgetFactory; +import com.sap.sse.security.ui.authentication.generic.GenericAuthentication; +import com.sap.sse.security.ui.authentication.generic.GenericAuthorizedContentDecorator; +import com.sap.sse.security.ui.authentication.generic.sapheader.SAPHeaderWithAuthentication; import com.sap.sse.security.ui.client.component.UserManagementPanel; import com.sap.sse.security.ui.client.i18n.StringMessages; @@ -56,8 +64,29 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements } private void createUI() { + HeaderPanel headerPanel = new HeaderPanel(); + SAPHeaderWithAuthentication header = new SAPHeaderWithAuthentication(getStringMessages().sapSailingAnalytics(), + getStringMessages().administration()); + GenericAuthentication genericSailingAuthentication = new FixedSailingAuthentication(getUserService(), header.getAuthenticationMenuView()); + AuthorizedContentDecorator authorizedContentDecorator = new GenericAuthorizedContentDecorator(genericSailingAuthentication); + authorizedContentDecorator.setContentWidgetFactory(new WidgetFactory() { + @Override + public Widget get() { + return createAdminConsolePanel(); + } + }); + + headerPanel.setHeaderWidget(header); + headerPanel.setContentWidget(authorizedContentDecorator); + RootLayoutPanel rootPanel = RootLayoutPanel.get(); + rootPanel.add(headerPanel); + } + + private Widget createAdminConsolePanel() { AdminConsolePanel panel = new AdminConsolePanel(getUserService(), SailingPermissionsForRoleProvider.INSTANCE, - sailingService, getStringMessages().releaseNotes(), "/release_notes_admin.html", /* error reporter */ this, SecurityStylesheetResources.INSTANCE.css()); + sailingService, getStringMessages().releaseNotes(), "/release_notes_admin.html", /* error reporter */ this, SecurityStylesheetResources.INSTANCE.css(), false); + panel.addStyleName("adminConsolePanel"); + BetterDateTimeBox.initialize(); regattasDisplayers = new HashSet<>(); leaderboardsDisplayers = new HashSet<>(); @@ -244,8 +273,8 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements fillRegattas(); fillLeaderboardGroups(); fillLeaderboards(); - RootLayoutPanel rootPanel = RootLayoutPanel.get(); - rootPanel.add(panel); + + return panel; } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index 98b1366a044..ceece8d9eb9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -1478,6 +1478,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String create(); String thereIsAlreadyAConfigurationForThisDevice(); String enterDeviceIdentifierName(); + String administration(); String pleaseSelectALeaderboardGroup(); String linkLeaderboardToLeaderboardGroupOfEvent(); String doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent(String leaderboardName, String eventName); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 00e50597111..da968aa08d1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -1446,6 +1446,7 @@ forWhichDeviceShouldConfigurationApply=Specify for which device the new configur create=Create thereIsAlreadyAConfigurationForThisDevice=There is already a configuration for this device. enterDeviceIdentifierName=Enter an identifier name +administration=Administration pleaseSelectALeaderboardGroup=Please select a leaderboard group linkLeaderboardToLeaderboardGroupOfEvent=Link Leaderboard to Leaderboard Group of Event doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent=Link leaderboard {0} to a leaderboard group of event {1} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index 15b2989c796..e4efef5ed1c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -1436,6 +1436,7 @@ forWhichDeviceShouldConfigurationApply=Für welches Gerät soll die neue Konfigu create=Anlegen thereIsAlreadyAConfigurationForThisDevice=Es gibt bereits eine Konfiguration für dieses Gerät. enterDeviceIdentifierName=Geräteidentifikator eingeben +administration=Administration pleaseSelectALeaderboardGroup=Bitte eine Ranglisten-Gruppe auswählen linkLeaderboardToLeaderboardGroupOfEvent=Ergebnisliste einer Ranglisten-Gruppe einer Veranstaltung hinzufügen doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent=Ergebnisliste {0} zu einer Ranglisten-Gruppe der Veranstaltung {1} hinzufügen diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index c7f6f3467ee..a11dc1641d8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1368,6 +1368,7 @@ forWhichDeviceShouldConfigurationApply=Specify for which device the new configur create=Create thereIsAlreadyAConfigurationForThisDevice=There is already a configuration for this device. enterDeviceIdentifierName=Enter an identifier name +administration=Администрация pleaseSelectALeaderboardGroup=Please select a leaderboard group linkLeaderboardToLeaderboardGroupOfEvent=Link Leaderboard to Leaderboard Group of Event doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent=Link leaderboard {0} to a leaderboard group of event {1} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index 3eab6c0441a..ee44c4fedea 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -1383,6 +1383,7 @@ forWhichDeviceShouldConfigurationApply=Specify for which device the new configur create=Create thereIsAlreadyAConfigurationForThisDevice=There is already a configuration for this device. enterDeviceIdentifierName=Enter an identifier name +administration=行政 pleaseSelectALeaderboardGroup=Please select a leaderboard group linkLeaderboardToLeaderboardGroupOfEvent=Link Leaderboard to Leaderboard Group of Event doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent=Link leaderboard {0} to a leaderboard group of event {1} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboardedit/LeaderboardEditPage.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboardedit/LeaderboardEditPage.java old mode 100755 new mode 100644 index 917aec4b79d..47ceeda55ed --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboardedit/LeaderboardEditPage.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboardedit/LeaderboardEditPage.java @@ -2,7 +2,6 @@ package com.sap.sailing.gwt.ui.leaderboardedit; import java.util.List; -import com.google.gwt.dom.client.Style.FontWeight; import com.google.gwt.dom.client.Style.Position; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.user.client.Window; @@ -10,10 +9,17 @@ import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.common.theme.component.sapheader2.SAPHeader2; +import com.sap.sailing.domain.common.security.Permission; +import com.sap.sailing.domain.common.security.SailingPermissionsForRoleProvider; +import com.sap.sailing.gwt.common.authentication.FixedSailingAuthentication; import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint; import com.sap.sse.gwt.client.async.AsyncActionsExecutor; import com.sap.sse.gwt.client.async.MarkedAsyncCallback; +import com.sap.sse.security.ui.authentication.decorator.AuthorizedContentDecorator; +import com.sap.sse.security.ui.authentication.decorator.WidgetFactory; +import com.sap.sse.security.ui.authentication.generic.GenericAuthentication; +import com.sap.sse.security.ui.authentication.generic.GenericAuthorizedContentDecorator; +import com.sap.sse.security.ui.authentication.generic.sapheader.SAPHeaderWithAuthentication; public class LeaderboardEditPage extends AbstractSailingEntryPoint { @Override @@ -24,13 +30,25 @@ public class LeaderboardEditPage extends AbstractSailingEntryPoint { new AsyncCallback>() { @Override public void onSuccess(List leaderboardNames) { - String leaderboardName = Window.Location.getParameter("name"); + final String leaderboardName = Window.Location.getParameter("name"); if (leaderboardNames.contains(leaderboardName)) { - EditableLeaderboardPanel leaderboardPanel = new EditableLeaderboardPanel(sailingService, new AsyncActionsExecutor(), leaderboardName, null, - LeaderboardEditPage.this, getStringMessages(), userAgent); - leaderboardPanel.ensureDebugId("EditableLeaderboardPanel"); - RootPanel.get().add(initHeader()); - RootPanel.get().add(leaderboardPanel); + + SAPHeaderWithAuthentication header = initHeader(); + GenericAuthentication genericSailingAuthentication = new FixedSailingAuthentication(getUserService(), header.getAuthenticationMenuView()); + AuthorizedContentDecorator authorizedContentDecorator = new GenericAuthorizedContentDecorator(genericSailingAuthentication); + authorizedContentDecorator.setPermissionToCheck(Permission.MANAGE_LEADERBOARD_RESULTS, SailingPermissionsForRoleProvider.INSTANCE); + authorizedContentDecorator.setContentWidgetFactory(new WidgetFactory() { + @Override + public Widget get() { + EditableLeaderboardPanel leaderboardPanel = new EditableLeaderboardPanel(sailingService, new AsyncActionsExecutor(), leaderboardName, null, + LeaderboardEditPage.this, getStringMessages(), userAgent); + leaderboardPanel.ensureDebugId("EditableLeaderboardPanel"); + return leaderboardPanel; + } + }); + + RootPanel.get().add(authorizedContentDecorator); + RootPanel.get().add(header); } else { RootPanel.get().add(new Label(getStringMessages().noSuchLeaderboard())); } @@ -42,17 +60,12 @@ public class LeaderboardEditPage extends AbstractSailingEntryPoint { })); } - private Widget initHeader() { - Label title = new Label(getStringMessages().editScores()); - title.getElement().getStyle().setColor("white"); - title.getElement().getStyle().setFontSize(20, Unit.PX); - title.getElement().getStyle().setFontWeight(FontWeight.BOLD); - title.getElement().getStyle().setMarginTop(16, Unit.PX); - SAPHeader2 header = new SAPHeader2(getStringMessages().sapSailingAnalytics(), title, false); + private SAPHeaderWithAuthentication initHeader() { + SAPHeaderWithAuthentication header = new SAPHeaderWithAuthentication(getStringMessages().sapSailingAnalytics(), + getStringMessages().editScores()); header.getElement().getStyle().setPosition(Position.FIXED); header.getElement().getStyle().setTop(0, Unit.PX); header.getElement().getStyle().setWidth(100, Unit.PCT); - header.getElement().getStyle().setZIndex(19); return header; } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java index cfef675e6d0..05eea8e29be 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java @@ -22,8 +22,6 @@ import com.google.gwt.user.client.ui.RequiresResize; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.Widget; -import com.google.web.bindery.event.shared.EventBus; -import com.google.web.bindery.event.shared.SimpleEventBus; import com.sap.sailing.domain.common.LeaderboardNameConstants; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; @@ -33,6 +31,7 @@ import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.domain.common.dto.LeaderboardDTO; import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sailing.domain.common.dto.RaceDTO; +import com.sap.sailing.gwt.common.authentication.SailingAuthenticationEntryPointLinkFactory; import com.sap.sailing.gwt.ui.client.CompetitorColorProvider; import com.sap.sailing.gwt.ui.client.CompetitorColorProviderImpl; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; @@ -71,14 +70,9 @@ import com.sap.sse.gwt.client.shared.components.Component; import com.sap.sse.gwt.client.shared.components.ComponentViewer; import com.sap.sse.gwt.client.shared.components.SettingsDialog; import com.sap.sse.gwt.client.useragent.UserAgentDetails; -import com.sap.sse.security.ui.authentication.AuthenticationClientFactory; -import com.sap.sse.security.ui.authentication.AuthenticationClientFactoryImpl; -import com.sap.sse.security.ui.authentication.AuthenticationManager; -import com.sap.sse.security.ui.authentication.AuthenticationManagerImpl; -import com.sap.sse.security.ui.authentication.AuthenticationPlaceManagementController; +import com.sap.sse.security.ui.authentication.generic.GenericAuthentication; import com.sap.sse.security.ui.authentication.view.AuthenticationMenuView; import com.sap.sse.security.ui.authentication.view.AuthenticationMenuViewImpl; -import com.sap.sse.security.ui.authentication.view.FlyoutAuthenticationPresenter; import com.sap.sse.security.ui.authentication.view.FlyoutAuthenticationView; import com.sap.sse.security.ui.client.UserService; @@ -129,7 +123,8 @@ public class RaceBoardPanel extends SimplePanel implements LeaderboardUpdateList private final AuthenticationMenuView userManagementMenuView; private boolean currentRaceHasBeenSelectedOnce; - private static final RaceBoardMainCss MAIN_CSS = RaceBoardResources.INSTANCE.mainCss(); + private final RaceBoardResources raceBoardResources = RaceBoardResources.INSTANCE; + private final RaceBoardMainCss mainCss = raceBoardResources.mainCss(); private static final RaceMapResources raceMapResources = GWT.create(RaceMapResources.class); /** @@ -168,8 +163,8 @@ public class RaceBoardPanel extends SimplePanel implements LeaderboardUpdateList raceInformationHeader.setStyleName("RegattaRaceInformation-Header"); regattaAndRaceTimeInformationHeader = new FlowPanel(); regattaAndRaceTimeInformationHeader.setStyleName("RegattaAndRaceTime-Header"); - this.userManagementMenuView = new AuthenticationMenuViewImpl(new Anchor(), MAIN_CSS.usermanagement_loggedin(), MAIN_CSS.usermanagement_open()); - this.userManagementMenuView.asWidget().setStyleName(MAIN_CSS.usermanagement_icon()); + this.userManagementMenuView = new AuthenticationMenuViewImpl(new Anchor(), mainCss.usermanagement_loggedin(), mainCss.usermanagement_open()); + this.userManagementMenuView.asWidget().setStyleName(mainCss.usermanagement_icon()); timeRangeWithZoomModel = new TimeRangeWithZoomModel(); componentViewers = new ArrayList(); final CompetitorColorProvider colorProvider = new CompetitorColorProviderImpl(selectedRaceIdentifier, competitorsAndTheirBoats); @@ -298,18 +293,10 @@ public class RaceBoardPanel extends SimplePanel implements LeaderboardUpdateList } private void setupUserManagementControlPanel(UserService userService) { - MAIN_CSS.ensureInjected(); - EventBus eventBus = new SimpleEventBus(); + mainCss.ensureInjected(); FlyoutAuthenticationView display = new RaceBoardAuthenticationView(); - AuthenticationManager manager = new AuthenticationManagerImpl(userService, eventBus, - com.sap.sailing.gwt.ui.raceboard.EntryPointLinkFactory.createEmailValidationLink(), - com.sap.sailing.gwt.ui.raceboard.EntryPointLinkFactory.createPasswordResetLink()); - AuthenticationClientFactory clientFactory = new AuthenticationClientFactoryImpl(manager, RaceBoardResources.INSTANCE); - AuthenticationCallbackImpl callback = new AuthenticationCallbackImpl(); - AuthenticationPlaceManagementController userManagementController = - new AuthenticationPlaceManagementController(clientFactory, callback, display, eventBus); - callback.setController(userManagementController); - new FlyoutAuthenticationPresenter(display, userManagementMenuView, userManagementController, eventBus, manager.getAuthenticationContext()); + new GenericAuthentication(userService, userManagementMenuView, display, + SailingAuthenticationEntryPointLinkFactory.INSTANCE, raceBoardResources); if (!ExperimentalFeatures.SHOW_USER_MANAGEMENT_ON_RACEBOARD) { regattaAndRaceTimeInformationHeader.getElement().getStyle().setRight(10, Unit.PX); userManagementMenuView.asWidget().removeFromParent(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardResources.java index 325ab781fb7..f5853d9d0c0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardResources.java @@ -1,21 +1,19 @@ package com.sap.sailing.gwt.ui.raceboard; import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; -import com.google.gwt.resources.client.CssResource; import com.sap.sse.gwt.common.CommonSharedResources; -public interface RaceBoardResources extends CommonSharedResources, ClientBundle { +public interface RaceBoardResources extends CommonSharedResources { public static final RaceBoardResources INSTANCE = GWT.create(RaceBoardResources.class); - @Source("raceboard-main.gss") + @Source({CommonSharedResources.RESET, CommonSharedResources.MAIN, "raceboard-main.gss"}) RaceBoardMainCss mainCss(); - @Source("raceboard-media.gss") + @Source({CommonSharedResources.MEDIA, "raceboard-media.gss"}) RaceBoardMediaCss mediaCss(); - public interface RaceBoardMainCss extends CommonMainCss, CssResource { + public interface RaceBoardMainCss extends CommonMainCss { String button(); String buttonprimary(); String buttonprimaryoutlined(); @@ -34,7 +32,7 @@ public interface RaceBoardResources extends CommonSharedResources, ClientBundle String usermanagement_open(); } - public interface RaceBoardMediaCss extends CommonMediaCss, CssResource { + public interface RaceBoardMediaCss extends CommonMediaCss { } } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/raceboard-main.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/raceboard-main.gss index bc8688e5167..3766f1000eb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/raceboard-main.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/raceboard-main.gss @@ -1,80 +1,3 @@ -*, -*:before, -*:after { - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html, -body { - height: 100%; - font-family: 'Open Sans', sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -ms-content-zooming: none; -} -.button { - font-size: 1rem; - display: inline-block; - font-weight: 600; - color: #fff; - border: none; - padding: 0.666666666666667em 2em; - border-radius: 0.2em; - background-color: #efaa00; - -webkit-transition: background-color 0.2s; - -moz-transition: background-color 0.2s; - transition: background-color 0.2s; - text-decoration: none; -} -.button:hover { - background-color: #d79900; - outline: none; - text-decoration: none; -} -.buttonprimary { - background-color: #008fcc; -} -.buttonprimary:hover { - background-color: #0081b8; -} -.buttonprimaryoutlined { - background-color: transparent; - padding: .533333333333333em 1.333333333333333em; - border: 1px solid #008fcc; - color: #008fcc; -} -.buttonprimaryoutlined:hover { - background-color: #0081b8; - color: #fff; -} -.buttonarrowrightwhite:after { - content: ''; - display: inline-block; - margin-left: 0.666666666666667em; - width: 0.466666666666667em; - height: 0.8em; - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAMCAYAAACulacQAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFtJREFUeNpi+P///wEgPgzEokDMgIxBxMn/EHAVXQGIkIBKYCiAqUJXIIEsiVUBA5ojRJEUnGFiwAR/ofQvXLpQjMXpILxeOY8rEEAOegfER4DYAYhfI7sMIMAAiXvwy2upI1UAAAAASUVORK5CYII="); - background-size: contain; - background-repeat: no-repeat; -} -.mainsection { - padding: 5.333333333333333em 0; -} -.mainsection_header { - text-align: center; - margin-bottom: 4em; -} -.mainsection_header p { - margin-top: 0; - font-size: 1.2em; -} -.mainsection_header_title { - margin: 0 0 0.5em; - font-size: 2.4em; - color: #008fcc; - text-align: center; -} - .usermanagement_icon { width: 3rem; height: 3rem; @@ -98,9 +21,9 @@ body { background-image: url('images/home/loggedin-open.svg'); } .usermanagement_view { - top: 70px !important; + top: 68px !important; left: inherit !important; - right: 0 !important; + right: 5px !important; z-index: 10; line-height: 1.333; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/LeaderboardEditing.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/LeaderboardEditing.gwt.xml index 66a1cd15527..768b33a7471 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/LeaderboardEditing.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/LeaderboardEditing.gwt.xml @@ -49,5 +49,6 @@ + diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/shiro.ini b/java/com.sap.sailing.gwt.ui/src/main/resources/shiro.ini index 8997a7fd30a..9d8d82c11b0 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/shiro.ini +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/shiro.ini @@ -48,8 +48,3 @@ customGwt = com.sap.sse.security.CustomFilter # authentication ("Authentication: Basic ...") and then regular form-based # authentication with POST parameters "username" and "password". bearerToken = com.sap.sse.security.BearerTokenOrBasicOrFormAuthenticationFilter - -[urls] -/LeaderboardEditing.html = customGwt,anyofroles[admin,eventmanager] -# The admin console displays its features based on the user's roles -/AdminConsole.html = customGwt diff --git a/java/com.sap.sailing.www/release_notes_admin.html b/java/com.sap.sailing.www/release_notes_admin.html index cc9e032d9ac..16d2c75d051 100644 --- a/java/com.sap.sailing.www/release_notes_admin.html +++ b/java/com.sap.sailing.www/release_notes_admin.html @@ -53,6 +53,14 @@
  • The user management page now also lists sailing roles and permissions in the respective suggest boxes.
  • +
  • The "Edit Points" module is now bound to the Permission "MANAGE_LEADERBOARD_RESULTS". + The Role "eventmanager" grants the "MANAGE_LEADERBOARD_RESULTS" permission. +
  • +
  • There is now a UI element in the header of "Edit Points", "Admin Console" and "Races Overview" pages + that indicates the authentication and makes it possible to sign in/sign out without leaving the page. + The pages "Edit Points" and "Admin Console" will show a message instead of the page content + if you aren't autenticated or don't have the required permissions. +
  • October 2015

      diff --git a/java/com.sap.sse.gwt.adminconsole/src/com/sap/sse/gwt/adminconsole/AdminConsolePanel.java b/java/com.sap.sse.gwt.adminconsole/src/com/sap/sse/gwt/adminconsole/AdminConsolePanel.java index 1a73e1408a4..a9428b9a45e 100755 --- a/java/com.sap.sse.gwt.adminconsole/src/com/sap/sse/gwt/adminconsole/AdminConsolePanel.java +++ b/java/com.sap.sse.gwt.adminconsole/src/com/sap/sse/gwt/adminconsole/AdminConsolePanel.java @@ -151,6 +151,12 @@ public class AdminConsolePanel extends DockLayoutPanel { public AdminConsolePanel(UserService userService, PermissionsForRoleProvider permissionsForRoleProvider, ServerInfoRetriever buildVersionRetriever, String releaseNotesAnchorLabel, String releaseNotesURL, ErrorReporter errorReporter, LoginPanelCss loginPanelCss) { + this(userService, permissionsForRoleProvider, buildVersionRetriever, releaseNotesAnchorLabel, releaseNotesURL, errorReporter, loginPanelCss, true); + } + + public AdminConsolePanel(UserService userService, PermissionsForRoleProvider permissionsForRoleProvider, + ServerInfoRetriever buildVersionRetriever, String releaseNotesAnchorLabel, + String releaseNotesURL, ErrorReporter errorReporter, LoginPanelCss loginPanelCss, boolean withLogin) { super(Unit.EM); this.permissionsForRoleProvider = permissionsForRoleProvider; this.permissionsAnyOfWhichIsRequiredToSeeWidget = new HashMap<>(); @@ -187,7 +193,9 @@ public class AdminConsolePanel extends DockLayoutPanel { final DockPanel informationPanel = new DockPanel(); informationPanel.setSize("100%", "95%"); informationPanel.setSpacing(10); - informationPanel.add(new LoginPanel(loginPanelCss, getUserService()), DockPanel.WEST); + if(withLogin) { + informationPanel.add(new LoginPanel(loginPanelCss, getUserService()), DockPanel.WEST); + } informationPanel.add(errorReporter.getPersistentInformationWidget(), DockPanel.CENTER); SystemInformationPanel sysinfoPanel = new SystemInformationPanel(buildVersionRetriever, errorReporter); sysinfoPanel.ensureDebugId("SystemInformation"); diff --git a/java/com.sap.sse.gwt/META-INF/MANIFEST.MF b/java/com.sap.sse.gwt/META-INF/MANIFEST.MF index 1ccd8900ecf..59f798364a0 100644 --- a/java/com.sap.sse.gwt/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.gwt/META-INF/MANIFEST.MF @@ -20,6 +20,7 @@ Export-Package: com.google.gwt.user.client.rpc.core.java.util, com.sap.sse.common.impl, com.sap.sse.gwt.client, com.sap.sse.gwt.client.async, + com.sap.sse.gwt.client.breadcrumb, com.sap.sse.gwt.client.celltable, com.sap.sse.gwt.client.controls, com.sap.sse.gwt.client.controls.busyindicator, @@ -35,6 +36,7 @@ Export-Package: com.google.gwt.user.client.rpc.core.java.util, com.sap.sse.gwt.client.mvp, com.sap.sse.gwt.client.panels, com.sap.sse.gwt.client.player, + com.sap.sse.gwt.client.sapheader, com.sap.sse.gwt.client.shared.components, com.sap.sse.gwt.client.useragent, com.sap.sse.gwt.common, @@ -43,10 +45,10 @@ Export-Package: com.google.gwt.user.client.rpc.core.java.util, com.sap.sse.gwt.dispatch.client.system.batching, com.sap.sse.gwt.dispatch.client.system.caching, com.sap.sse.gwt.dispatch.client.transport.gwtrpc, + com.sap.sse.gwt.dispatch.servlets, com.sap.sse.gwt.dispatch.shared.caching, com.sap.sse.gwt.dispatch.shared.commands, com.sap.sse.gwt.dispatch.shared.exceptions, - com.sap.sse.gwt.dispatch.servlets, com.sap.sse.gwt.resources, com.sap.sse.gwt.server, com.sap.sse.gwt.server.filestorage, diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/LinkUtil.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/LinkUtil.java similarity index 59% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/LinkUtil.java rename to java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/LinkUtil.java index 1f098c756e0..74d40ad8fa5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/LinkUtil.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/LinkUtil.java @@ -1,18 +1,32 @@ -package com.sap.sailing.gwt.common.client; +package com.sap.sse.gwt.client; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.AnchorElement; 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.ui.Anchor; import com.google.gwt.user.client.ui.impl.HyperlinkImpl; +/** + * When just attaching a handler to an {@link Anchor} or {@link AnchorElement} to trigger a place change there are muiltiple disadvantages: + *
        + *
      • Opening the page in a new tab via middle click or Ctrl+Click doesn't work
      • + *
      • Clicks with any mouse key will trigger the handler
      • + *
      + * + * This util helps to work around such problems. + */ public final class LinkUtil { private static final HyperlinkImpl HYPERLINK_IMPL = GWT.create(HyperlinkImpl.class); private LinkUtil() { } + /** + * @param event a browser event to check if it is a "normal" click event + * @return true if the event is a "normal" click event, false otherwise + */ public static boolean handleLinkClick(Event event) { if(event.getTypeInt() != Event.ONCLICK) { return false; @@ -21,6 +35,9 @@ public final class LinkUtil { } + /** + * Configures click handling of the given {@link AnchorElement} to trigger the given action when a "normal" click was triggered. + */ public static void configureForAction(AnchorElement anchor, final Runnable action) { DOM.sinkEvents(anchor, Event.ONCLICK); DOM.setEventListener(anchor, new EventListener() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/Breadcrumb.css b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/breadcrumb/Breadcrumb.css similarity index 100% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/tabbar/Breadcrumb.css rename to java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/breadcrumb/Breadcrumb.css diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/breadcrumb/BreadcrumbPane.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/breadcrumb/BreadcrumbPane.java new file mode 100644 index 00000000000..52a3bf58b4a --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/breadcrumb/BreadcrumbPane.java @@ -0,0 +1,91 @@ +package com.sap.sse.gwt.client.breadcrumb; + +import com.google.gwt.core.shared.GWT; +import com.google.gwt.dom.client.AnchorElement; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.dom.client.Document; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; +import com.google.gwt.safehtml.shared.SafeUri; +import com.google.gwt.safehtml.shared.UriUtils; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.EventListener; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.gwt.client.LinkUtil; + +/** + * Widget that renders multiple clickable items with ">" as spacer. + * + * Every item has: + *
        + *
      • a Text to show
      • + *
      • an action that is being triggered when doing a normal click
      • + *
      • a link that is used when the user clicks to open in a new tab
      • + *
      + * + */ +public class BreadcrumbPane extends Widget { + + interface Resources extends ClientBundle { + @Source("Breadcrumb.css") + Style style(); + } + + interface Style extends CssResource { + + String event_header__breadcrumb(); + + String event_header__breadcrumb__item(); + + } + + private static Resources resources; + + private static Resources getResources() { + if (resources == null) { + resources = GWT.create(Resources.class); + resources.style().ensureInjected(); + } + return resources; + } + + private final Style style = getResources().style(); + + private final DivElement breadcrumDiv; + + public BreadcrumbPane() { + breadcrumDiv = Document.get().createDivElement(); + breadcrumDiv.addClassName(style.event_header__breadcrumb()); + + setElement(breadcrumDiv); + } + + public void addBreadcrumbItem(String title, String link, final Runnable runnable) { + addBreadcrumbItem(title, UriUtils.fromString(link), runnable); + } + + public void addBreadcrumbItem(String title, SafeUri link, final Runnable runnable) { + AnchorElement breadcrumItem = Document.get().createAnchorElement(); + breadcrumItem.setHref(link); + breadcrumItem.setInnerText(title); + breadcrumItem.addClassName(style.event_header__breadcrumb__item()); + + breadcrumDiv.appendChild(breadcrumItem); + + Event.sinkEvents(breadcrumItem, Event.ONCLICK); + Event.setEventListener(breadcrumItem, new EventListener() { + @Override + public void onBrowserEvent(Event event) { + if (LinkUtil.handleLinkClick(event)) { + event.stopPropagation(); + event.preventDefault(); + runnable.run(); + } + } + }); + } + + public void clear() { + breadcrumDiv.removeAllChildren(); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader2/SAPHeader2.gss b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.gss similarity index 81% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader2/SAPHeader2.gss rename to java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.gss index d2d273567f8..69a3ce9d757 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader2/SAPHeader2.gss +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.gss @@ -1,15 +1,29 @@ .siteheader { font-size: 1rem; + line-height: 1.333; background: #333; border-bottom: 4px solid #f0ab00; height: 75px; - line-height: 1,1em; width: 100%; overflow: hidden; vertical-align: top; position: relative; } +.siteHeaderTitle { + color: #fff; + vertical-align: top; + font-size: 20px; + font-weight: 700; +} + +.siteHeaderSubTitle { + color: #fff; + font-size: 18px; + vertical-align: top; +} + + .siteheaderLeft { position: relative; top:10px;left:10px; display: inline-block; @@ -18,7 +32,7 @@ vertical-align: top; } -.siteheaderCentered { +.siteheader2ndCol { position: absolute; top:10px;left:235px; display: inline-block; text-align: left; @@ -38,6 +52,7 @@ margin: 0px; display: inline-block; } + .logotitle { display: inline-block; color: #f6f9fc; @@ -45,7 +60,6 @@ width: 150px; height: 100%; padding: 17px 15px 0 0; - line-height:1,1em; vertical-align: top; text-align: right; border-right: 1px solid rgb(180,180,180); diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.java new file mode 100644 index 00000000000..a5dafeef6f1 --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.java @@ -0,0 +1,65 @@ +package com.sap.sse.gwt.client.sapheader; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.dom.client.Style.Display; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.Widget; + +/** + * Generic header widget that is designed with a SAP logo and SAP color scheme. + * + * The header has the following elements: + *
        + *
      • SAP Logo with an application title (like "Sailing Analytics")
      • + *
      • Page title
      • + *
      • Optional Subtitle
      • + *
      • Optional widget to show on the right side of the header
      • + *
      + */ +public class SAPHeader extends Composite { + private static SAPHeaderUiBinder uiBinder = GWT.create(SAPHeaderUiBinder.class); + + interface SAPHeaderUiBinder extends UiBinder { + } + + @UiField + DivElement applicationNameUi; + @UiField + DivElement pageTitleUi; + @UiField + DivElement titleUi; + @UiField + DivElement subTitleUi; + @UiField + SimplePanel rightSideUi; + + public SAPHeader(String applicationName) { + SAPHeaderResources.INSTANCE.css().ensureInjected(); + initWidget(uiBinder.createAndBindUi(this)); + applicationNameUi.setInnerText(applicationName != null ? applicationName : " "); + } + + public void setHeaderTitle(String title) { + titleUi.setInnerText(title); + } + + public void setHeaderSubTitle(String subtitle) { + if (subtitle == null || subtitle.isEmpty()) { + subTitleUi.getStyle().setDisplay(Display.NONE); + titleUi.getStyle().setMarginTop(14, Unit.PX); + } else { + subTitleUi.setInnerText(subtitle); + subTitleUi.getStyle().clearDisplay(); + titleUi.getStyle().clearMarginTop(); + } + } + + public void addWidgetToRightSide(Widget widget) { + rightSideUi.add(widget); + } +} diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.ui.xml b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.ui.xml new file mode 100644 index 00000000000..f1ecf5f756f --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.ui.xml @@ -0,0 +1,24 @@ + + + + + +
      +
      + +
      +
      +
      +
      + +
      + + +
      +
      +
      diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader/SAPHeaderResources.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeaderResources.java similarity index 82% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader/SAPHeaderResources.java rename to java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeaderResources.java index 46a02ba21ba..74e6bb2ec47 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader/SAPHeaderResources.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeaderResources.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.common.theme.component.sapheader; +package com.sap.sse.gwt.client.sapheader; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; @@ -14,7 +14,9 @@ public interface SAPHeaderResources extends ClientBundle { public interface LocalCss extends CssResource { String siteheader(); String siteheaderLeft(); - String siteheaderCentered(); + String siteHeaderTitle(); + String siteHeaderSubTitle(); + String siteheader2ndCol(); String siteheaderRight(); String logo(); String logotitle(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader/logo-small@2x.png b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/logo-small@2x.png similarity index 100% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/theme/component/sapheader/logo-small@2x.png rename to java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/logo-small@2x.png diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/common/CommonSharedResources.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/common/CommonSharedResources.java index ac6aea7436a..ef8fe9fd31e 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/common/CommonSharedResources.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/common/CommonSharedResources.java @@ -1,13 +1,24 @@ package com.sap.sse.gwt.common; +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; -public interface CommonSharedResources { + +public interface CommonSharedResources extends ClientBundle { + public static final CommonSharedResources INSTANCE = GWT.create(CommonSharedResources.class); + public static final String RESET = "com/sap/sse/gwt/common/common-reset.gss"; + public static final String MAIN = "com/sap/sse/gwt/common/common-main.gss"; + public static final String MEDIA = "com/sap/sse/gwt/common/common-media.gss"; + + @Source({RESET, MAIN}) CommonMainCss mainCss(); + @Source(MEDIA) CommonMediaCss mediaCss(); - public interface CommonMainCss { + public interface CommonMainCss extends CssResource { String button(); String buttonprimary(); String buttonprimaryoutlined(); @@ -16,9 +27,102 @@ public interface CommonSharedResources { String mainsection(); String mainsection_header(); String mainsection_header_title(); + String input(); + String input_label(); + String input_input(); + String input_inputerror(); + String input_errortext(); } - public interface CommonMediaCss { + public interface CommonMediaCss extends CssResource { + String grid(); + String stackenblochen(); + String column(); + String columns(); + String small1(); + String small2(); + String small3(); + String small4(); + String small5(); + String small6(); + String small7(); + String small8(); + String small9(); + String small10(); + String small11(); + String small12(); + String smalloffset0(); + String smalloffset1(); + String smalloffset2(); + String smalloffset3(); + String smalloffset4(); + String smalloffset5(); + String smalloffset6(); + String smalloffset7(); + String smalloffset8(); + String smalloffset9(); + String smalloffset10(); + String smalloffset11(); + String showonsmall(); + String hideonsmall(); + String showonmedium(); + String hideonmedium(); + String showonlarge(); + String hideonlarge(); + String smallcentered(); + String smalluncentered(); + String medium1(); + String medium2(); + String medium3(); + String medium4(); + String medium5(); + String medium6(); + String medium7(); + String medium8(); + String medium9(); + String medium10(); + String medium11(); + String medium12(); + String mediumoffset0(); + String mediumoffset1(); + String mediumoffset2(); + String mediumoffset3(); + String mediumoffset4(); + String mediumoffset5(); + String mediumoffset6(); + String mediumoffset7(); + String mediumoffset8(); + String mediumoffset9(); + String mediumoffset10(); + String mediumoffset11(); + String mediumcentered(); + String mediumuncentered(); + String large1(); + String large2(); + String large3(); + String large4(); + String large5(); + String large6(); + String large7(); + String large8(); + String large9(); + String large10(); + String large11(); + String large12(); + String largeoffset0(); + String largeoffset1(); + String largeoffset2(); + String largeoffset3(); + String largeoffset4(); + String largeoffset5(); + String largeoffset6(); + String largeoffset7(); + String largeoffset8(); + String largeoffset9(); + String largeoffset10(); + String largeoffset11(); + String largecentered(); + String largeuncentered(); } } \ No newline at end of file diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/common/common-main.gss b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/common/common-main.gss new file mode 100644 index 00000000000..b63e506daa0 --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/common/common-main.gss @@ -0,0 +1,98 @@ +.button { + font-size: 1rem; + display: inline-block; + font-weight: 600; + color: #fff; + border: none; + padding: 0.666666666666667em 2em; + border-radius: 0.2em; + background-color: #efaa00; + -webkit-transition: background-color 0.2s; + -moz-transition: background-color 0.2s; + transition: background-color 0.2s; + text-decoration: none; + cursor: pointer; +} +.button[disabled] { + cursor: not-allowed; + background: #cfcfcf; +} +.button:hover { + background-color: #d79900; + outline: none; + text-decoration: none; +} +.buttonprimary { + background-color: #008fcc; +} +.buttonprimary:hover { + color: #fff; + background-color: #0081b8; +} +.buttonprimaryoutlined { + background-color: transparent; + padding: .533333333333333em 1.333333333333333em; + border: 1px solid #008fcc; + color: #008fcc; +} +.buttonprimaryoutlined:hover { + background-color: #0081b8; + color: #fff; +} +.buttonarrowrightwhite:after { + content: ''; + display: inline-block; + margin-left: 0.666666666666667em; + width: 0.466666666666667em; + height: 0.8em; + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAMCAYAAACulacQAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFtJREFUeNpi+P///wEgPgzEokDMgIxBxMn/EHAVXQGIkIBKYCiAqUJXIIEsiVUBA5ojRJEUnGFiwAR/ofQvXLpQjMXpILxeOY8rEEAOegfER4DYAYhfI7sMIMAAiXvwy2upI1UAAAAASUVORK5CYII="); + background-size: contain; + background-repeat: no-repeat; +} +.mainsection { + padding: 5.333333333333333em 0; +} +.mainsection_header { + text-align: center; + margin-bottom: 4em; +} +.mainsection_header p { + margin-top: 0; + font-size: 1.2em; +} +.mainsection_header_title { + margin: 0 0 0.5em; + font-size: 2.4em; + color: #008fcc; + text-align: center; +} + +.input { + width: 100%; + padding: 0.333333333333333em 0; + display: inline-block; +} +.input_label { + font-weight: 600; + margin-top: 1.333333333333333em; + line-height: 1.333333333333333em; + margin-bottom: 0.333333333333333em; +} +.input:first-of-type .input_label { + margin-top: 0.666666666666667em; +} +.input_input { + width: 100%; + color: #333; + padding: 0.6em 1.333333333333333em; + border-radius: 0.2em; + border: 1px solid #dedede; +} +.input_inputerror { + border: 1px solid #f00; +} +.input_errortext { + color: #f00; + font-size: 0.8em; + margin: -0.266666666666667em 0 0.333333333333333em; +} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/media.gss b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/common/common-media.gss similarity index 100% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/media.gss rename to java/com.sap.sse.gwt/src/com/sap/sse/gwt/common/common-media.gss diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/common/common-reset.gss b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/common/common-reset.gss new file mode 100644 index 00000000000..8a586f79f5d --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/common/common-reset.gss @@ -0,0 +1,14 @@ +*, +*:before, +*:after { + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html, +body { + height: 100%; + font-family: 'Open Sans', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -ms-content-zooming: none; +} \ No newline at end of file diff --git a/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF b/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF index 6b1cbd38699..fc7c036ea31 100644 --- a/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF @@ -29,6 +29,9 @@ Export-Package: com.sap.sse.security.shared, com.sap.sse.security.ui.authentication.app, com.sap.sse.security.ui.authentication.confirm, com.sap.sse.security.ui.authentication.create, + com.sap.sse.security.ui.authentication.decorator, + com.sap.sse.security.ui.authentication.generic, + com.sap.sse.security.ui.authentication.generic.sapheader, com.sap.sse.security.ui.authentication.info, com.sap.sse.security.ui.authentication.recover, com.sap.sse.security.ui.authentication.signin, @@ -38,4 +41,10 @@ Export-Package: com.sap.sse.security.shared, com.sap.sse.security.ui.client.i18n, com.sap.sse.security.ui.loginpanel, com.sap.sse.security.ui.server, - com.sap.sse.security.ui.shared + com.sap.sse.security.ui.shared, + com.sap.sse.security.ui.userprofile.desktop.userheader, + com.sap.sse.security.ui.userprofile.mobile.userheader, + com.sap.sse.security.ui.userprofile.shared.userheader, + com.sap.sse.security.ui.userprofile.shared.userdetails, + com.sap.sse.security.ui.userprofile.desktop.userdetails, + com.sap.sse.security.ui.userprofile.mobile.userdetails 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 7f8bcc71ee3..582263e6aed 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 @@ -86,12 +86,10 @@ public class AuthenticationManagerImpl implements AuthenticationManager { eventBus.fireEvent(new AuthenticationContextEvent(new AuthenticationContextImpl(user))); } }); - eventBus.addHandler(AuthenticationRequestEvent.TYPE, new AuthenticationRequestEvent.Handler() { + eventBus.addHandler(AuthenticationSignOutRequestEvent.TYPE, new AuthenticationSignOutRequestEvent.Handler() { @Override - public void onUserManagementRequestEvent(AuthenticationRequestEvent event) { - if (!event.isLogin()) { + public void onUserManagementSignOutRequestEvent(AuthenticationSignOutRequestEvent event) { logout(); - } } }); } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationRequestEvent.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationRequestEvent.java index f5b1874d044..a79513eef1a 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationRequestEvent.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationRequestEvent.java @@ -3,6 +3,9 @@ package com.sap.sse.security.ui.authentication; import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.GwtEvent; +/** + * Event to be fired if the user needs to see the authentication UI. + */ public class AuthenticationRequestEvent extends GwtEvent { public static final Type TYPE = new Type(); @@ -10,21 +13,7 @@ public class AuthenticationRequestEvent extends GwtEvent getAssociatedType() { return TYPE; diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationSignOutRequestEvent.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationSignOutRequestEvent.java new file mode 100644 index 00000000000..e784a05a25e --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationSignOutRequestEvent.java @@ -0,0 +1,27 @@ +package com.sap.sse.security.ui.authentication; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; + +/** + * Event to be fired to trigger logout. This makes it possible for UI elements to request a logout without further + * integration with the authentication framework. + */ +public class AuthenticationSignOutRequestEvent extends GwtEvent { + public static final Type TYPE = new Type(); + + public interface Handler extends EventHandler { + void onUserManagementSignOutRequestEvent(AuthenticationSignOutRequestEvent event); + } + + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(Handler handler) { + handler.onUserManagementSignOutRequestEvent(this); + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/UserManagement.gss b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/UserManagement.gss index 5dce234a6e3..8f2ab52e314 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/UserManagement.gss +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/UserManagement.gss @@ -48,6 +48,7 @@ display: block; font-weight: 600; margin-bottom: .4em; + padding: 0; } .form_input, .form_description, .form_errors { margin-bottom: 1.333333333333333em; @@ -59,6 +60,7 @@ padding: .666666666666667em; border: 1px solid #ccc; border-radius: .2em; + font-family: 'Open Sans', sans-serif; } .form_errors { color: red; diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/UserManagementResources.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/UserManagementResources.java index f3a2860c022..97effde6933 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/UserManagementResources.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/UserManagementResources.java @@ -4,6 +4,9 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +/** + * Resources used by the authentication framework. + */ public interface UserManagementResources extends ClientBundle { public static final UserManagementResources INSTANCE = GWT.create(UserManagementResources.class); @@ -35,5 +38,4 @@ public interface UserManagementResources extends ClientBundle { String info_user_realname(); String info_user_username(); } - } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/app/NeedsAuthenticationContext.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/app/NeedsAuthenticationContext.java new file mode 100644 index 00000000000..db35396a127 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/app/NeedsAuthenticationContext.java @@ -0,0 +1,14 @@ +package com.sap.sse.security.ui.authentication.app; + +/** + * Common interface for all classes that need to be informed whenever the authentication changes. + */ +public interface NeedsAuthenticationContext { + + /** + * To be called when the authentication changes. + * + * @param authenticationContext the new {@link AuthenticationContext}. + */ + void setAuthenticationContext(AuthenticationContext authenticationContext); +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountViewImpl.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountViewImpl.ui.xml index ce685d72a73..f62bb8d76c7 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountViewImpl.ui.xml +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountViewImpl.ui.xml @@ -19,9 +19,9 @@
      - -
      diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/AuthorizedContentDecorator.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/AuthorizedContentDecorator.java new file mode 100644 index 00000000000..d47807987f6 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/AuthorizedContentDecorator.java @@ -0,0 +1,155 @@ +package com.sap.sse.security.ui.authentication.decorator; + +import com.google.gwt.uibinder.client.UiChild; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HeaderPanel; +import com.google.gwt.user.client.ui.IsWidget; +import com.google.gwt.user.client.ui.ProvidesResize; +import com.google.gwt.user.client.ui.RequiresResize; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.security.shared.Permission; +import com.sap.sse.security.shared.PermissionsForRoleProvider; +import com.sap.sse.security.ui.authentication.app.AuthenticationContext; +import com.sap.sse.security.ui.authentication.app.NeedsAuthenticationContext; +import com.sap.sse.security.ui.client.i18n.StringMessages; + +/** + * Decorator widget that either shows its child widget or depending on the authentication state a + * {@link NotLoggedInView}. + * + */ +public class AuthorizedContentDecorator extends Composite implements RequiresResize, NeedsAuthenticationContext { + + private final SimplePanel contentHolder = new SimplePanel(); + private Widget content; + private WidgetFactory contentWidgetFactory; + private final NotLoggedInView notLoggedInView; + private String permissionToCheck; + private PermissionsForRoleProvider permissionsForRoleProvider; + + public AuthorizedContentDecorator(NotLoggedInPresenter presenter, NotLoggedInView notLoggedInView) { + this.notLoggedInView = notLoggedInView; + + notLoggedInView.setPresenter(presenter); + notLoggedInView.setSignInText(StringMessages.INSTANCE.signIn()); + + initWidget(contentHolder); + } + + /** + * @param content the child widget to show if the user is authenticated and has the required permission + */ + @UiChild(limit = 1) + public void addContent(Widget content) { + this.content = content; + } + + /** + * An alternative to setting the child widget to show for permitted users is to set a factory that creates the + * widget when needed the first time. This is useful if creating the UI required the user to be authenticated to + * make remote calls to succeed that would cause an error for non permitted users. + * + * @param contentWidgetFactory + * a factory that creates the child widget on demand when the user is authenticated and permitted the + * first time + */ + public void setContentWidgetFactory(WidgetFactory contentWidgetFactory) { + this.contentWidgetFactory = contentWidgetFactory; + } + + private Widget getContentWidget() { + if (contentWidgetFactory != null) { + content = contentWidgetFactory.get(); + contentWidgetFactory = null; + } + return content; + } + + @Override + protected void onLoad() { + super.onLoad(); + + if (getParent() instanceof ProvidesResize || getParent() instanceof HeaderPanel) { + contentHolder.setSize("100%", "100%"); + } + } + + @Override + public void onResize() { + Widget currentContentWidget = contentHolder.getWidget(); + if (currentContentWidget instanceof RequiresResize) { + ((RequiresResize) currentContentWidget).onResize(); + } + } + + /** + * You need to set the {@link AuthenticationContext} whenever the authentication changes to make the decorator react + * by showing the correct content. + */ + @Override + public void setAuthenticationContext(AuthenticationContext authenticationContext) { + boolean isAuthenticated = authenticationContext.isLoggedIn(); + boolean isPermitted = isPermitted(authenticationContext); + boolean maySeeRealContent = isAuthenticated && isPermitted; + + IsWidget isWidget = maySeeRealContent ? getContentWidget() : notLoggedInView; + + if (!maySeeRealContent) { + String message = !isAuthenticated ? StringMessages.INSTANCE.youAreNotSignedIn() : StringMessages.INSTANCE + .youDontHaveRequiredPermission(); + notLoggedInView.setMessage(message); + } + + Widget widget = isWidget.asWidget(); + if (widget instanceof RequiresResize) { + widget.setSize("100%", "100%"); + } + contentHolder.setWidget(widget); + if (widget instanceof RequiresResize) { + ((RequiresResize) widget).onResize(); + } + } + + private boolean isPermitted(AuthenticationContext userManagementContext) { + return permissionToCheck == null + || userManagementContext.getCurrentUser().hasPermission(permissionToCheck, permissionsForRoleProvider); + } + + /** + * @param permissionsForRoleProvider the PermissionsForRoleProvider used when checking the required permission of a user. + */ + public void setPermissionsForRoleProvider(PermissionsForRoleProvider permissionsForRoleProvider) { + this.permissionsForRoleProvider = permissionsForRoleProvider; + } + + /** + * Setting a permission causes that the user not only needs to be logged in but also needs to have the given permission. + * + * @param permissionToCheck the permission to check + */ + public void setPermissionToCheck(String permissionToCheck) { + this.permissionToCheck = permissionToCheck; + } + + /** + * Setting a permission causes that the user not only needs to be logged in but also needs to have the given permission. + * + * @param permissionToCheck the permission to check + */ + public void setPermissionToCheck(Permission permissionToCheck) { + setPermissionToCheck(permissionToCheck.getStringPermission()); + } + + + /** + * Setting a permission causes that the user not only needs to be logged in but also needs to have the given permission. + * + * @param permissionToCheck the permission to check + * @param permissionsForRoleProvider the PermissionsForRoleProvider used when checking the required permission of a user. + */ + public void setPermissionToCheck(Permission permissionToCheck, PermissionsForRoleProvider permissionsForRoleProvider) { + setPermissionToCheck(permissionToCheck); + setPermissionsForRoleProvider(permissionsForRoleProvider); + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/FlyoutBasedAuthorizedContentDecorator.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/FlyoutBasedAuthorizedContentDecorator.java new file mode 100644 index 00000000000..353f2306e8c --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/FlyoutBasedAuthorizedContentDecorator.java @@ -0,0 +1,15 @@ +package com.sap.sse.security.ui.authentication.decorator; + +import com.google.web.bindery.event.shared.EventBus; + +/** + * {@link AuthorizedContentDecorator} that uses {@link FlyoutNotLoggedInPresenter} internally to handle the sign in + * case. + * + */ +public class FlyoutBasedAuthorizedContentDecorator extends AuthorizedContentDecorator { + + public FlyoutBasedAuthorizedContentDecorator(EventBus eventBus, NotLoggedInView notLoggedInView) { + super(new FlyoutNotLoggedInPresenter(eventBus), notLoggedInView); + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/FlyoutNotLoggedInPresenter.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/FlyoutNotLoggedInPresenter.java new file mode 100644 index 00000000000..d01827a0517 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/FlyoutNotLoggedInPresenter.java @@ -0,0 +1,24 @@ +package com.sap.sse.security.ui.authentication.decorator; + +import com.google.web.bindery.event.shared.EventBus; +import com.sap.sse.security.ui.authentication.AuthenticationRequestEvent; + +/** + * {@link NotLoggedInPresenter} implementation that fires an {@link AuthenticationRequestEvent} which is used by + * authentication UI implementations using a flyout to host the authentication UI. This event triggers the flyout to be + * shown. + * + */ +public class FlyoutNotLoggedInPresenter implements NotLoggedInPresenter { + + private final EventBus eventBus; + + public FlyoutNotLoggedInPresenter(EventBus eventBus) { + this.eventBus = eventBus; + } + + @Override + public void doTriggerLoginForm() { + eventBus.fireEvent(new AuthenticationRequestEvent()); + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/NotLoggedInPresenter.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/NotLoggedInPresenter.java new file mode 100644 index 00000000000..6da7290c47c --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/NotLoggedInPresenter.java @@ -0,0 +1,12 @@ +package com.sap.sse.security.ui.authentication.decorator; + +/** + * Used by {@link AuthorizedContentDecorator} to trigger login when the button is pressed on the {@link NotLoggedInView}. + * + */ +public interface NotLoggedInPresenter { + /** + * When called this must show the login form to the user. + */ + void doTriggerLoginForm(); +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/NotLoggedInView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/NotLoggedInView.java new file mode 100644 index 00000000000..11465e2d586 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/NotLoggedInView.java @@ -0,0 +1,26 @@ +package com.sap.sse.security.ui.authentication.decorator; + +import com.google.gwt.user.client.ui.IsWidget; + +/** + * A view that is shown by {@link AuthorizedContentDecorator} if the user isn't logged in or doen't have the required + * permissions. + * The view must show a message and a button that leads the user to the login form when being clicked. + */ +public interface NotLoggedInView extends IsWidget { + + /** + * @param presenter the presenter to call when the "sign in" button is clicked + */ + void setPresenter(NotLoggedInPresenter presenter); + + /** + * @param message the message to show to the user + */ + void setMessage(String message); + + /** + * @param signInText the text to set on the "sign in" button + */ + void setSignInText(String signInText); +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/WidgetFactory.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/WidgetFactory.java new file mode 100644 index 00000000000..26d9acbfa7f --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/decorator/WidgetFactory.java @@ -0,0 +1,16 @@ +package com.sap.sse.security.ui.authentication.decorator; + +import com.google.gwt.user.client.ui.Widget; + +/** + * Factory used to create a widget deferred. + * + */ +public interface WidgetFactory { + + /** + * @return the created widget instance + */ + Widget get(); + +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericAuthentication.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericAuthentication.java new file mode 100644 index 00000000000..692863c1824 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericAuthentication.java @@ -0,0 +1,47 @@ +package com.sap.sse.security.ui.authentication.generic; + +import com.google.web.bindery.event.shared.EventBus; +import com.google.web.bindery.event.shared.SimpleEventBus; +import com.sap.sse.gwt.client.mvp.ClientFactory; +import com.sap.sse.gwt.common.CommonSharedResources; +import com.sap.sse.security.ui.authentication.AuthenticationClientFactory; +import com.sap.sse.security.ui.authentication.AuthenticationClientFactoryImpl; +import com.sap.sse.security.ui.authentication.AuthenticationManager; +import com.sap.sse.security.ui.authentication.AuthenticationManagerImpl; +import com.sap.sse.security.ui.authentication.AuthenticationPlaceManagementController; +import com.sap.sse.security.ui.authentication.view.AuthenticationMenuView; +import com.sap.sse.security.ui.authentication.view.FlyoutAuthenticationPresenter; +import com.sap.sse.security.ui.authentication.view.FlyoutAuthenticationView; +import com.sap.sse.security.ui.client.UserService; + +/** + * Configures the authentication framework in a common way that is suitable for generic flyout based authentication. + * This can be used for cases when no specific handling of the authentication or deeper integration is necessary. + * + * Typically you would wire the whole authentication mechanism in the {@link ClientFactory}. For simple modules there is + * potentially no {@link ClientFactory}, so using this is suitable. + */ +public class GenericAuthentication { + private final EventBus eventBus = new SimpleEventBus(); + private final AuthenticationManager manager; + + public GenericAuthentication(UserService userService, AuthenticationMenuView menuView, + FlyoutAuthenticationView display, GenericAuthenticationLinkFactory linkFactory, CommonSharedResources res) { + manager = new AuthenticationManagerImpl(userService, eventBus, + linkFactory.createEmailValidationLink(), linkFactory.createPasswordResetLink()); + final AuthenticationClientFactory clientFactory = new AuthenticationClientFactoryImpl(manager, res); + final GenericAuthenticationCallbackImpl callback = new GenericAuthenticationCallbackImpl(linkFactory); + final AuthenticationPlaceManagementController controller = new AuthenticationPlaceManagementController( + clientFactory, callback, display, eventBus); + callback.setController(controller); + new FlyoutAuthenticationPresenter(display, menuView, controller, eventBus, manager.getAuthenticationContext()); + } + + public EventBus getEventBus() { + return eventBus; + } + + public AuthenticationManager getAuthenticationManager() { + return manager; + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericAuthenticationCallbackImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericAuthenticationCallbackImpl.java new file mode 100644 index 00000000000..81d4e957b9c --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericAuthenticationCallbackImpl.java @@ -0,0 +1,31 @@ +package com.sap.sse.security.ui.authentication.generic; + +import com.google.gwt.user.client.Window; +import com.sap.sse.security.ui.authentication.AuthenticationCallback; +import com.sap.sse.security.ui.authentication.WrappedPlaceManagementController; +import com.sap.sse.security.ui.authentication.info.LoggedInUserInfoPlace; + +class GenericAuthenticationCallbackImpl implements AuthenticationCallback { + + private final GenericAuthenticationLinkFactory linkFactory; + private WrappedPlaceManagementController controller; + + GenericAuthenticationCallbackImpl(GenericAuthenticationLinkFactory linkFactory) { + this.linkFactory = linkFactory; + } + + public void setController(WrappedPlaceManagementController controller) { + this.controller = controller; + } + + @Override + public void handleSignInSuccess() { + controller.goTo(new LoggedInUserInfoPlace()); + } + + @Override + public void handleUserProfileNavigation() { + Window.open(linkFactory.createUserProfileLink(), "_blank", ""); + } + +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericAuthenticationLinkFactory.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericAuthenticationLinkFactory.java new file mode 100644 index 00000000000..b0bb4015b43 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericAuthenticationLinkFactory.java @@ -0,0 +1,14 @@ +package com.sap.sse.security.ui.authentication.generic; + +/** + * Interface for a factory which creates links used within authentication management. + */ +public interface GenericAuthenticationLinkFactory { + + String createUserProfileLink(); + + String createEmailValidationLink(); + + String createPasswordResetLink(); + +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericAuthorizedContentDecorator.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericAuthorizedContentDecorator.java new file mode 100644 index 00000000000..b16b558fd62 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericAuthorizedContentDecorator.java @@ -0,0 +1,37 @@ +package com.sap.sse.security.ui.authentication.generic; + +import com.google.web.bindery.event.shared.HandlerRegistration; +import com.sap.sse.security.ui.authentication.AuthenticationContextEvent; +import com.sap.sse.security.ui.authentication.decorator.FlyoutBasedAuthorizedContentDecorator; + +public class GenericAuthorizedContentDecorator extends FlyoutBasedAuthorizedContentDecorator { + + private final GenericAuthentication genericAuthentication; + private HandlerRegistration handlerRegistration; + + public GenericAuthorizedContentDecorator(GenericAuthentication genericAuthentication) { + super(genericAuthentication.getEventBus(), new GenericNotLoggedInView()); + this.genericAuthentication = genericAuthentication; + + } + + @Override + protected void onLoad() { + super.onLoad(); + setAuthenticationContext(genericAuthentication.getAuthenticationManager().getAuthenticationContext()); + handlerRegistration = genericAuthentication.getEventBus().addHandler(AuthenticationContextEvent.TYPE, + new AuthenticationContextEvent.Handler() { + @Override + public void onUserChangeEvent(AuthenticationContextEvent event) { + setAuthenticationContext(event.getCtx()); + } + }); + } + + @Override + protected void onUnload() { + super.onUnload(); + handlerRegistration.removeHandler(); + handlerRegistration = null; + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericNotLoggedInView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericNotLoggedInView.java new file mode 100644 index 00000000000..fb4205139e8 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericNotLoggedInView.java @@ -0,0 +1,52 @@ +package com.sap.sse.security.ui.authentication.generic; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.event.dom.client.ClickEvent; +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.ui.Button; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.security.ui.authentication.decorator.NotLoggedInPresenter; +import com.sap.sse.security.ui.authentication.decorator.NotLoggedInView; + +public class GenericNotLoggedInView extends Composite implements NotLoggedInView { + + private static NotLoggedInViewUiBinder uiBinder = GWT.create(NotLoggedInViewUiBinder.class); + + interface NotLoggedInViewUiBinder extends UiBinder { + } + + @UiField + DivElement messageUi; + + @UiField + Button buttonUi; + private NotLoggedInPresenter presenter; + + public GenericNotLoggedInView() { + initWidget(uiBinder.createAndBindUi(this)); + } + + @Override + public void setPresenter(NotLoggedInPresenter presenter) { + this.presenter = presenter; + } + + @UiHandler("buttonUi") + void onClick(ClickEvent e) { + presenter.doTriggerLoginForm(); + } + + @Override + public void setMessage(String message) { + messageUi.setInnerText(message); + } + + @Override + public void setSignInText(String signInText) { + buttonUi.setText(signInText); + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericNotLoggedInView.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericNotLoggedInView.ui.xml new file mode 100644 index 00000000000..4badfe41a8e --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/GenericNotLoggedInView.ui.xml @@ -0,0 +1,20 @@ + + + + + .message { + font-weight: bold; + font-style: italic; + display: inline-block; + padding-right: 1em; + } + .panel { + padding: 2em 1em; + } + + +
      + + + \ No newline at end of file diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/package-info.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/package-info.java new file mode 100644 index 00000000000..05e43a997c7 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/package-info.java @@ -0,0 +1,5 @@ +/** + * Generic integration of the authentication framework for desktop-like modules via flyout-based UI. + */ +package com.sap.sse.security.ui.authentication.generic; + diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/FixedFlyoutAuthenticationView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/FixedFlyoutAuthenticationView.java new file mode 100644 index 00000000000..0473448ad0e --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/FixedFlyoutAuthenticationView.java @@ -0,0 +1,63 @@ +package com.sap.sse.security.ui.authentication.generic.sapheader; + +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.dom.client.Style.Overflow; +import com.google.gwt.event.logical.shared.AttachEvent; +import com.google.gwt.event.logical.shared.ResizeEvent; +import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.user.client.Window; +import com.sap.sse.gwt.common.CommonSharedResources; +import com.sap.sse.security.ui.authentication.view.FlyoutAuthenticationView; + +/** + * {@link FlyoutAuthenticationView} styled to work with {@link SAPHeaderWithAuthentication}. This is used in cases when + * the header is positioned as fixed on top of the page. + */ +public class FixedFlyoutAuthenticationView extends GenericFlyoutAuthenticationView { + + private HandlerRegistration resizeHandlerRegistration; + + public FixedFlyoutAuthenticationView(CommonSharedResources resources) { + super(resources); + + popupPanel.addStyleName(res.css().fixed()); + + popupPanel.addAttachHandler(new AttachEvent.Handler() { + @Override + public void onAttachOrDetach(AttachEvent event) { + if(event.isAttached()) { + if(resizeHandlerRegistration == null) { + resizeHandlerRegistration = Window.addResizeHandler(new ResizeHandler() { + @Override + public void onResize(ResizeEvent event) { + updateHeight(); + } + }); + } + } else { + resizeHandlerRegistration.removeHandler(); + resizeHandlerRegistration = null; + } + } + }); + } + + @Override + public void show() { + super.show(); + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + @Override + public void execute() { + updateHeight(); + } + }); + } + + private void updateHeight() { + int maxHeight = Window.getClientHeight() - popupPanel.getPopupTop()- (popupPanel.getOffsetHeight() - flyoverContentUi.getOffsetHeight()) - 15; + flyoverContentUi.getStyle().setOverflowY(Overflow.AUTO); + flyoverContentUi.getStyle().setProperty("maxHeight", maxHeight + "px"); + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/GenericFlyoutAuthenticationView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/GenericFlyoutAuthenticationView.java new file mode 100644 index 00000000000..5bfbc945384 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/GenericFlyoutAuthenticationView.java @@ -0,0 +1,25 @@ +package com.sap.sse.security.ui.authentication.generic.sapheader; + +import com.sap.sse.gwt.common.CommonSharedResources; +import com.sap.sse.security.ui.authentication.view.AbstractFlyoutAuthenticationView; +import com.sap.sse.security.ui.authentication.view.FlyoutAuthenticationView; + +/** + * {@link FlyoutAuthenticationView} styled to work with {@link SAPHeaderWithAuthentication}. + * + */ +public class GenericFlyoutAuthenticationView extends AbstractFlyoutAuthenticationView { + protected static final SAPHeaderWithAuthenticationResources res = SAPHeaderWithAuthenticationResources.INSTANCE; + + public GenericFlyoutAuthenticationView(CommonSharedResources resources) { + super(resources); + res.css().ensureInjected(); + + popupPanel.setStyleName(res.css().usermanagement_view()); + } + + public void show() { + popupPanel.show(); + getPresenter().onVisibilityChanged(true); + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/SAPHeaderWithAuthentication.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/SAPHeaderWithAuthentication.java new file mode 100644 index 00000000000..4707a6472ae --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/SAPHeaderWithAuthentication.java @@ -0,0 +1,58 @@ +package com.sap.sse.security.ui.authentication.generic.sapheader; + +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.gwt.client.sapheader.SAPHeader; +import com.sap.sse.security.ui.authentication.generic.GenericAuthentication; +import com.sap.sse.security.ui.authentication.view.AuthenticationMenuView; +import com.sap.sse.security.ui.authentication.view.AuthenticationMenuViewImpl; + +/** + * {@link SAPHeader} which is decorated by a authentication control on the right side. This is typically ised to + * integrate with {@link GenericAuthentication}. + */ +public class SAPHeaderWithAuthentication extends SAPHeader { + private static final SAPHeaderWithAuthenticationResources res = SAPHeaderWithAuthenticationResources.INSTANCE; + + private final SimplePanel rightWrapper; + + private AuthenticationMenuView authenticationMenuView; + + public SAPHeaderWithAuthentication(String applicationName, String headerTitle) { + this(applicationName); + setHeaderTitle(headerTitle); + } + + public SAPHeaderWithAuthentication(String applicationName) { + super(applicationName); + res.css().ensureInjected(); + + FlowPanel rightWithAuthentication = new FlowPanel(); + rightWithAuthentication.addStyleName(res.css().header_right_wrapper()); + + Anchor authenticationMenu = new Anchor(); + authenticationMenu.addStyleName(res.css().usermanagement_icon()); + rightWithAuthentication.add(authenticationMenu); + authenticationMenuView = new AuthenticationMenuViewImpl(authenticationMenu, res.css().usermanagement_loggedin(), res.css().usermanagement_open()); + + rightWrapper = new SimplePanel(); + rightWrapper.addStyleName(res.css().header_right_extension()); + rightWithAuthentication.add(rightWrapper); + + super.addWidgetToRightSide(rightWithAuthentication); + } + + @Override + public void addWidgetToRightSide(Widget widget) { + rightWrapper.add(widget); + } + + /** + * @return the {@link AuthenticationMenuView} associated with the authentication control on the right side of the header. + */ + public AuthenticationMenuView getAuthenticationMenuView() { + return authenticationMenuView; + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/SAPHeaderWithAuthenticationResources.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/SAPHeaderWithAuthenticationResources.java new file mode 100644 index 00000000000..75c388e8744 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/SAPHeaderWithAuthenticationResources.java @@ -0,0 +1,24 @@ +package com.sap.sse.security.ui.authentication.generic.sapheader; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; + + +public interface SAPHeaderWithAuthenticationResources extends ClientBundle { + public static final SAPHeaderWithAuthenticationResources INSTANCE = GWT.create(SAPHeaderWithAuthenticationResources.class); + + @Source("header-with-authentication.gss") + HeaderWithAuthenticationCss css(); + + public interface HeaderWithAuthenticationCss extends CssResource { + String header_right_wrapper(); + String header_right_extension(); + String fixed(); + + String usermanagement_icon(); + String usermanagement_loggedin(); + String usermanagement_view(); + String usermanagement_open(); + } +} \ No newline at end of file diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/header-with-authentication.gss b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/header-with-authentication.gss new file mode 100644 index 00000000000..fcc2acdf9dc --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/header-with-authentication.gss @@ -0,0 +1,44 @@ +.header_right_wrapper { + height: 100%; +} +.header_right_extension { + margin-right: 4em; +} +.usermanagement_icon { + display: none; +} +.fixed { + position: fixed !important; +} +.usermanagement_icon { + position: absolute; + right: 0; + display: inline-block; + width: 4rem; + height: 100%; + vertical-align: middle; + background-repeat: no-repeat; + background-position: center center; + background-size: contain; + background-image: url('images/home/loggedout.svg'); + cursor: pointer; +} +.usermanagement_icon.usermanagement_open { + background-image: url('images/home/loggedout-open.svg'); +} +.usermanagement_icon.usermanagement_loggedin { + background-image: url('images/home/loggedin.svg'); +} +.usermanagement_icon.usermanagement_loggedin.usermanagement_open { + background-image: url('images/home/loggedin-open.svg'); +} +.usermanagement_view { + top: 68px !important; + left: inherit !important; + right: 5px !important; + z-index: 10; + line-height: 1.333; +} +.usermanagement_view * { + font-size: 15px; +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoViewImpl.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoViewImpl.ui.xml index 274b8578fec..9f239a0d5e5 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoViewImpl.ui.xml +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoViewImpl.ui.xml @@ -13,9 +13,9 @@
      - -
      diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryViewImpl.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryViewImpl.ui.xml index fad8a4e2cfd..a4471fa6bff 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryViewImpl.ui.xml +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryViewImpl.ui.xml @@ -11,7 +11,7 @@
      -
      diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInViewImpl.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInViewImpl.ui.xml index d534afbf4bf..5a39a7fb5ee 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInViewImpl.ui.xml +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInViewImpl.ui.xml @@ -11,18 +11,18 @@
      - -
      TODO or
      - TODO Login with Facebook - TODO Login with Google
      diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java index c89f6a4665b..170b284a7dc 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java @@ -94,6 +94,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages { String passwordRepeatPlaceholder(); String resetPassword(); String youAreNotSignedIn(); + String youDontHaveRequiredPermission(); String accountConfirmation(); String error(); String refresh(); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties index 4890cc7a9f7..695f2c8eadf 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties @@ -90,6 +90,7 @@ oldPasswordPlaceholder=Type in the old password passwordRepeatPlaceholder=Repeat the new password resetPassword=Reset password youAreNotSignedIn=You are currently not signed in. +youDontHaveRequiredPermission=You don''t have the required permission. accountConfirmation=Account confirmation error=Unknown error refresh=Refresh \ No newline at end of file diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_de.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_de.properties index 7e9d2ebc90a..961c3654b6a 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_de.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_de.properties @@ -90,6 +90,7 @@ oldPasswordPlaceholder=Geben Sie das alte Passwort ein passwordRepeatPlaceholder=Wiederholen Sie das Passwort resetPassword=Passwort zurücksetzen youAreNotSignedIn=Sie sind aktuell nicht eingeloggt. +youDontHaveRequiredPermission=Sie besitzen nicht die benötigten Rechte. accountConfirmation=Kontobestätigung error=Es ist ein Fehler aufgetreten refresh=Aktualisieren \ No newline at end of file diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userdetails/UserAccountDetails.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userdetails/UserAccountDetails.java new file mode 100644 index 00000000000..867411c413a --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userdetails/UserAccountDetails.java @@ -0,0 +1,39 @@ +package com.sap.sse.security.ui.userprofile.desktop.userdetails; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.gwt.common.CommonSharedResources; +import com.sap.sse.security.ui.shared.UserDTO; +import com.sap.sse.security.ui.userprofile.shared.userdetails.AbstractUserDetails; + +/** + * Desktop implementation of {@link AbstractUserDetails}. + */ +public class UserAccountDetails extends AbstractUserDetails { + private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); + + interface MyUiBinder extends UiBinder { + } + + @UiField DivElement editImageLinkUi; + + @UiField(provided = true) final CommonSharedResources res; + + public UserAccountDetails(CommonSharedResources res) { + this.res = res; + UseraccountDetailsResources.INSTANCE.css().ensureInjected(); + initWidget(uiBinder.createAndBindUi(this)); + } + + @Override + public void setUser(UserDTO currentUser) { + super.setUser(currentUser); + // TODO correct message +// editImageLinkUi.setTitle("TODO picture of: " + currentUser.getName()); + // TODO use image from user when field is available + editImageLinkUi.getStyle().setBackgroundImage("url(images/home/userdefault.svg)"); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UserAccountDetails.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userdetails/UserAccountDetails.ui.xml similarity index 91% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UserAccountDetails.ui.xml rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userdetails/UserAccountDetails.ui.xml index 14896529d3f..aaa56199983 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UserAccountDetails.ui.xml +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userdetails/UserAccountDetails.ui.xml @@ -1,10 +1,8 @@ - - - + - - + +
      diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UseraccountDetails.gss b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userdetails/UseraccountDetails.gss similarity index 100% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UseraccountDetails.gss rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userdetails/UseraccountDetails.gss diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UseraccountDetailsResources.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userdetails/UseraccountDetailsResources.java similarity index 92% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UseraccountDetailsResources.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userdetails/UseraccountDetailsResources.java index b6beee48cc3..f47574821a1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UseraccountDetailsResources.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userdetails/UseraccountDetailsResources.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.home.desktop.partials.useraccountDetails; +package com.sap.sse.security.ui.userprofile.desktop.userdetails; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/userHeader/UserHeader.gss b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userheader/UserHeader.gss similarity index 100% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/userHeader/UserHeader.gss rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userheader/UserHeader.gss diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userheader/UserHeader.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userheader/UserHeader.java new file mode 100644 index 00000000000..36cc56ee772 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userheader/UserHeader.java @@ -0,0 +1,26 @@ +package com.sap.sse.security.ui.userprofile.desktop.userheader; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.gwt.common.CommonSharedResources; +import com.sap.sse.security.ui.userprofile.shared.userheader.AbstractUserHeader; + +/** + * Desktop implementation of {@link AbstractUserHeader}. + */ +public class UserHeader extends AbstractUserHeader { + private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); + + interface MyUiBinder extends UiBinder { + } + + @UiField(provided = true) final CommonSharedResources res; + + public UserHeader(CommonSharedResources res) { + this.res = res; + UserHeaderResources.INSTANCE.css().ensureInjected(); + initWidget(uiBinder.createAndBindUi(this)); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/userHeader/UserHeader.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userheader/UserHeader.ui.xml similarity index 58% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/userHeader/UserHeader.ui.xml rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userheader/UserHeader.ui.xml index 3856265634b..f74f371dd66 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/userHeader/UserHeader.ui.xml +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userheader/UserHeader.ui.xml @@ -1,8 +1,7 @@ - - - - + + +
      @@ -12,8 +11,8 @@
      -
      -
      +
      +
      diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/userHeader/UserHeaderResources.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userheader/UserHeaderResources.java similarity index 91% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/userHeader/UserHeaderResources.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userheader/UserHeaderResources.java index 8b8937cb06f..95159c24daf 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/userHeader/UserHeaderResources.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/desktop/userheader/UserHeaderResources.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.home.desktop.partials.userHeader; +package com.sap.sse.security.ui.userprofile.desktop.userheader; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.gss b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userdetails/UserDetails.gss similarity index 100% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.gss rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userdetails/UserDetails.gss diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userdetails/UserDetails.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userdetails/UserDetails.java new file mode 100644 index 00000000000..0e7d3ee593c --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userdetails/UserDetails.java @@ -0,0 +1,27 @@ +package com.sap.sse.security.ui.userprofile.mobile.userdetails; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.gwt.common.CommonSharedResources; +import com.sap.sse.security.ui.userprofile.shared.userdetails.AbstractUserDetails; + +/** + * Mobile (smartphone) implementation of {@link AbstractUserDetails}. + */ +public class UserDetails extends AbstractUserDetails { + + interface MyUiBinder extends UiBinder { + } + + private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); + + @UiField(provided = true) final CommonSharedResources res; + + public UserDetails(CommonSharedResources res) { + this.res = res; + UserDetailsResources.INSTANCE.css().ensureInjected(); + initWidget(uiBinder.createAndBindUi(this)); + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userdetails/UserDetails.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userdetails/UserDetails.ui.xml new file mode 100644 index 00000000000..de781b77064 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userdetails/UserDetails.ui.xml @@ -0,0 +1,65 @@ + + + + + + +
      +
      +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      + + + +
      +
      + +
      + +
      + + + +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      + + + +
      +
      +
      +
      +
      \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetailsResources.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userdetails/UserDetailsResources.java similarity index 91% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetailsResources.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userdetails/UserDetailsResources.java index 257655f007c..ec86cd1e28f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetailsResources.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userdetails/UserDetailsResources.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.home.mobile.partials.userdetails; +package com.sap.sse.security.ui.userprofile.mobile.userdetails; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userheader/UserHeader.gss b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userheader/UserHeader.gss similarity index 100% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userheader/UserHeader.gss rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userheader/UserHeader.gss diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userheader/UserHeader.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userheader/UserHeader.java new file mode 100644 index 00000000000..beaef09ac02 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userheader/UserHeader.java @@ -0,0 +1,26 @@ +package com.sap.sse.security.ui.userprofile.mobile.userheader; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.gwt.common.CommonSharedResources; +import com.sap.sse.security.ui.userprofile.shared.userheader.AbstractUserHeader; + +/** + * Mobile (smartphone) implementation of {@link AbstractUserHeader}. + */ +public class UserHeader extends AbstractUserHeader { + interface MyUiBinder extends UiBinder { + } + + private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); + + @UiField(provided = true) final CommonSharedResources res; + + public UserHeader(CommonSharedResources res) { + this.res = res; + UserHeaderResources.INSTANCE.css().ensureInjected(); + initWidget(uiBinder.createAndBindUi(this)); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userheader/UserHeader.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userheader/UserHeader.ui.xml similarity index 71% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userheader/UserHeader.ui.xml rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userheader/UserHeader.ui.xml index 675936238a1..209863a4c9c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userheader/UserHeader.ui.xml +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userheader/UserHeader.ui.xml @@ -1,9 +1,7 @@ - - - - - + + +
      diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userheader/UserHeaderResources.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userheader/UserHeaderResources.java similarity index 95% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userheader/UserHeaderResources.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userheader/UserHeaderResources.java index 1b61d9c1149..fed5021b059 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userheader/UserHeaderResources.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/mobile/userheader/UserHeaderResources.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.home.mobile.partials.userheader; +package com.sap.sse.security.ui.userprofile.mobile.userheader; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/shared/userdetails/AbstractUserDetails.java similarity index 54% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/shared/userdetails/AbstractUserDetails.java index 92aa4a2ff0e..0e49bc6a03a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/shared/userdetails/AbstractUserDetails.java @@ -1,58 +1,63 @@ -package com.sap.sailing.gwt.home.mobile.partials.userdetails; +package com.sap.sse.security.ui.userprofile.shared.userdetails; -import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.InputElement; import com.google.gwt.event.dom.client.ClickEvent; -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.ui.Composite; import com.google.gwt.user.client.ui.PasswordTextBox; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; -import com.sap.sse.security.ui.authentication.app.AuthenticationContext; import com.sap.sse.security.ui.client.i18n.StringMessages; import com.sap.sse.security.ui.shared.UserDTO; -public class UserDetails extends Composite { - - interface MyUiBinder extends UiBinder { - } +/** + * Base view class of the user account details page. This class implements the shared logic of the desktop and mobile + * version of the page. + * + * {@link UiField}s and {@link UiHandler}s are intentionally marked as public to make it visible to UiBinder in concrete + * subclasses. These fields should not be accessed manually. + */ +public class AbstractUserDetails extends Composite implements UserDetailsView { - private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); + @UiField public InputElement usernameUi; + @UiField public TextBox nameUi; + @UiField public TextBox companyUi; + @UiField public TextBox emailUi; + @UiField public PasswordTextBox oldPasswordUi; + @UiField public PasswordTextBox newPasswordUi; + @UiField public PasswordTextBox newPasswordConfirmationUi; - public interface Presenter { - void handleSaveChangesRequest(String fullName, String company); - void handleEmailChangeRequest(String email); - void handlePasswordChangeRequest(String oldPassword, String newPassword, String newPasswordConfirmation); - } + private Presenter presenter; - @UiField InputElement usernameUi; - @UiField InputElement nameUi; - @UiField InputElement companyUi; - @UiField TextBox emailUi; - @UiField PasswordTextBox oldPasswordUi; - @UiField PasswordTextBox newPasswordUi; - @UiField PasswordTextBox newPasswordConfirmationUi; - - private final Presenter presenter; - - public UserDetails(Presenter presenter) { + @Override + public void setPresenter(Presenter presenter) { this.presenter = presenter; - UserDetailsResources.INSTANCE.css().ensureInjected(); - initWidget(uiBinder.createAndBindUi(this)); + } + + protected Presenter getPresenter() { + return presenter; + } + + @Override + protected void onLoad() { + super.onLoad(); StringMessages i18n = StringMessages.INSTANCE; setPlaceholder(oldPasswordUi, i18n.oldPasswordPlaceholder()); setPlaceholder(newPasswordUi, i18n.newPasswordPlaceholder()); setPlaceholder(newPasswordConfirmationUi, i18n.passwordRepeatPlaceholder()); } - public void setUserManagementContext(AuthenticationContext userManagementContext) { - UserDTO currentUser = userManagementContext.getCurrentUser(); - usernameUi.setValue(currentUser.getName()); + public void setUser(UserDTO currentUser) { nameUi.setValue(currentUser.getFullName()); companyUi.setValue(currentUser.getCompany()); + usernameUi.setValue(currentUser.getName()); emailUi.setValue(currentUser.getEmail()); + + clearPasswordFields(); + } + + public void clearPasswordFields() { oldPasswordUi.setValue(""); newPasswordUi.setValue(""); newPasswordConfirmationUi.setValue(""); @@ -63,19 +68,18 @@ public class UserDetails extends Composite { } @UiHandler("saveChangesUi") - void onSaveChangesClicked(ClickEvent event) { + public void onSaveChangesClicked(ClickEvent event) { presenter.handleSaveChangesRequest(nameUi.getValue(), companyUi.getValue()); } @UiHandler("changeEmailUi") - void onChangeEmailClicked(ClickEvent event) { + public void onChangeEmailClicked(ClickEvent event) { presenter.handleEmailChangeRequest(emailUi.getValue()); } @UiHandler("changePasswordUi") - void onChangePasswordClicked(ClickEvent event) { + public void onChangePasswordClicked(ClickEvent event) { presenter.handlePasswordChangeRequest(oldPasswordUi.getValue(), newPasswordUi.getValue(), newPasswordConfirmationUi.getValue()); } - } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/shared/userdetails/UserDetailsPresenter.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/shared/userdetails/UserDetailsPresenter.java new file mode 100644 index 00000000000..fa50245238b --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/shared/userdetails/UserDetailsPresenter.java @@ -0,0 +1,115 @@ +package com.sap.sse.security.ui.userprofile.shared.userdetails; + +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.sap.sse.security.shared.UserManagementException; +import com.sap.sse.security.ui.authentication.AuthenticationManager; +import com.sap.sse.security.ui.authentication.app.AuthenticationContext; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; +import com.sap.sse.security.ui.client.component.NewAccountValidator; +import com.sap.sse.security.ui.client.i18n.StringMessages; + +/** + * Default Presenter implementation for {@link UserDetailsView}. + * + */ +public class UserDetailsPresenter implements AbstractUserDetails.Presenter { + + private final StringMessages i18n_sec = StringMessages.INSTANCE; + private final NewAccountValidator validator = new NewAccountValidator(i18n_sec); + + private final AuthenticationManager authenticationManager; + + private final UserManagementServiceAsync userManagementService; + private final String mailVerifiedConfirmationUrlToken; + private final UserDetailsView view; + + public UserDetailsPresenter(UserDetailsView view, AuthenticationManager authenticationManager, UserManagementServiceAsync userManagementService, String mailVerifiedConfirmationUrlToken) { + this.view = view; + this.authenticationManager = authenticationManager; + this.userManagementService = userManagementService; + this.mailVerifiedConfirmationUrlToken = mailVerifiedConfirmationUrlToken; + + view.setPresenter(this); + + if(authenticationManager.getAuthenticationContext().isLoggedIn()) { + view.setUser(authenticationManager.getAuthenticationContext().getCurrentUser()); + } + } + + public void setAuthenticationContext(AuthenticationContext authenticationContext) { + view.setUser(authenticationContext.getCurrentUser()); + } + + @Override + public void handleSaveChangesRequest(String fullName, String company) { + final String username = authenticationManager.getAuthenticationContext().getCurrentUser().getName(); + userManagementService.updateUserProperties(username, fullName, company, + new AsyncCallback() { + @Override + public void onSuccess(Void result) { + authenticationManager.refreshUserInfo(); + Window.alert(i18n_sec.successfullyUpdatedUserProperties(username)); + } + + @Override + public void onFailure(Throwable caught) { + Window.alert(i18n_sec.errorUpdatingUserProperties(caught.getMessage())); + } + }); + } + + @Override + public void handleEmailChangeRequest(final String email) { + final String username = authenticationManager.getAuthenticationContext().getCurrentUser().getName(); + final String url = Window.Location.createUrlBuilder() + .setHash(mailVerifiedConfirmationUrlToken).buildString(); + userManagementService.updateSimpleUserEmail(username, email, url, + new AsyncCallback() { + @Override + public void onSuccess(Void result) { + Window.alert(i18n_sec.successfullyUpdatedEmail(username, email)); + } + + @Override + public void onFailure(Throwable caught) { + Window.alert(i18n_sec.errorUpdatingEmail(caught.getMessage())); + } + }); + } + + @Override + public void handlePasswordChangeRequest(String oldPassword, String newPassword, String newPasswordConfirmation) { + final String username = authenticationManager.getAuthenticationContext().getCurrentUser().getName(); + String errorMessage = validator.validateUsernameAndPassword(username, newPassword, newPasswordConfirmation); + if (errorMessage != null && !errorMessage.isEmpty()) { + Window.alert(errorMessage); + return; + } + userManagementService.updateSimpleUserPassword(username, oldPassword, null, newPassword, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + if (caught instanceof UserManagementException) { + String message = ((UserManagementException) caught).getMessage(); + if (UserManagementException.PASSWORD_DOES_NOT_MEET_REQUIREMENTS.equals(message)) { + Window.alert(i18n_sec.passwordDoesNotMeetRequirements()); + } else if (UserManagementException.INVALID_CREDENTIALS.equals(message)) { + Window.alert(i18n_sec.invalidCredentials()); + } else { + Window.alert(i18n_sec.errorChangingPassword(caught.getMessage())); + } + } else { + Window.alert(i18n_sec.errorChangingPassword(caught.getMessage())); + } + } + + @Override + public void onSuccess(Void result) { + Window.alert(i18n_sec.passwordSuccessfullyChanged()); + view.clearPasswordFields(); + } + }); + } + +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/shared/userdetails/UserDetailsView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/shared/userdetails/UserDetailsView.java new file mode 100644 index 00000000000..1053b8ba5dd --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/shared/userdetails/UserDetailsView.java @@ -0,0 +1,22 @@ +package com.sap.sse.security.ui.userprofile.shared.userdetails; + +import com.sap.sse.security.ui.shared.UserDTO; + +/** + * View definition of the user profile details page. This view is used to implement desktop and mobile views using a + * shared presenter implementation. + */ +public interface UserDetailsView { + + void setPresenter(Presenter presenter); + + void setUser(UserDTO user); + + void clearPasswordFields(); + + public interface Presenter { + void handleSaveChangesRequest(String fullName, String company); + void handleEmailChangeRequest(String email); + void handlePasswordChangeRequest(String oldPassword, String newPassword, String newPasswordConfirmation); + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/shared/userheader/AbstractUserHeader.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/shared/userheader/AbstractUserHeader.java new file mode 100644 index 00000000000..e559d3471be --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/userprofile/shared/userheader/AbstractUserHeader.java @@ -0,0 +1,39 @@ +package com.sap.sse.security.ui.userprofile.shared.userheader; + +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.dom.client.Element; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.ui.Composite; +import com.sap.sse.security.ui.authentication.app.AuthenticationContext; +import com.sap.sse.security.ui.authentication.app.NeedsAuthenticationContext; + +/** + * Base view class of the user header. This class implements the shared logic of the desktop and mobile + * version of the partial. + * + * {@link UiField}s and {@link UiHandler}s are intentionally marked as public to make it visible to UiBinder in concrete + * subclasses. These fields should not be accessed manually. + */ +public class AbstractUserHeader extends Composite implements NeedsAuthenticationContext { + + @UiField public Element titleUi; + @UiField public DivElement imageUi; + @UiField public DivElement subtitleUi; + + public AbstractUserHeader() { + } + + @Override + public void setAuthenticationContext(AuthenticationContext authenticationContext) { +// UserDTO currentUser = authenticationContext.getCurrentUser(); + // TODO correct message +// imageUi.setTitle("TODO picture of: " + currentUser.getName()); + // TODO use image from user when field is available + imageUi.getStyle().setBackgroundImage("url(images/home/userdefault.svg)"); + + titleUi.setInnerText(authenticationContext.getUserTitle()); + subtitleUi.setInnerText(authenticationContext.getUserSubtitle()); + } + +} diff --git a/java/com.sap.sse.security.ui/src/main/resources/com/sap/sse/security/ui/UserProfile.gwt.xml b/java/com.sap.sse.security.ui/src/main/resources/com/sap/sse/security/ui/UserProfile.gwt.xml new file mode 100644 index 00000000000..d2941a66489 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/resources/com/sap/sse/security/ui/UserProfile.gwt.xml @@ -0,0 +1,8 @@ + + + + + + + +