java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationView.java
... ...
@@ -49,7 +49,7 @@ public class TabletAndDesktopApplicationView extends Composite implements Deskto
49 49
50 50
public TabletAndDesktopApplicationView(DesktopPlacesNavigator navigator, EventBus eventBus) {
51 51
headerPanel = new Header(navigator, eventBus);
52
- footerPanel = new Footer(eventBus);
52
+ footerPanel = new Footer(navigator, eventBus);
53 53
initWidget(uiBinder.createAndBindUi(this));
54 54
navigationPathDisplay = new BreadcrumbNavigationPathDisplay();
55 55
}
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.java
... ...
@@ -17,7 +17,11 @@ import com.google.gwt.user.client.EventListener;
17 17
import com.google.gwt.user.client.ui.Composite;
18 18
import com.google.gwt.user.client.ui.Widget;
19 19
import com.google.web.bindery.event.shared.EventBus;
20
+import com.sap.sailing.gwt.home.desktop.app.DesktopPlacesNavigator;
21
+import com.sap.sailing.gwt.home.desktop.places.whatsnew.WhatsNewPlace;
22
+import com.sap.sailing.gwt.home.desktop.places.whatsnew.WhatsNewPlace.WhatsNewNavigationTabs;
20 23
import com.sap.sailing.gwt.home.shared.SwitchingEntryPoint;
24
+import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
21 25
import com.sap.sailing.gwt.ui.client.StringMessages;
22 26
import com.sap.sse.common.Util;
23 27
import com.sap.sse.gwt.client.controls.languageselect.LanguageSelector;
... ...
@@ -39,11 +43,15 @@ public class Footer extends Composite {
39 43
@UiField AnchorElement privacyAnchorLink;
40 44
@UiField AnchorElement mobileUi;
41 45
@UiField AnchorElement jobsAnchor;
46
+ @UiField(provided = true)
47
+ final PlaceNavigation<WhatsNewPlace> releaseNotesNavigation;
42 48
43
- public Footer(EventBus eventBus) {
49
+ public Footer(final DesktopPlacesNavigator navigator, EventBus eventBus) {
44 50
FooterResources.INSTANCE.css().ensureInjected();
51
+ releaseNotesNavigation = navigator.getWhatsNewNavigation(WhatsNewNavigationTabs.SailingAnalytics);
45 52
46 53
initWidget(uiBinder.createAndBindUi(this));
54
+ navigator.getImprintNavigation().configureAnchorElement(imprintAnchorLink);
47 55
48 56
DOM.sinkEvents(mobileUi, Event.ONCLICK);
49 57
DOM.setEventListener(mobileUi, new EventListener() {
... ...
@@ -60,7 +68,6 @@ public class Footer extends Composite {
60 68
languageSelector.setLabelText(StringMessages.INSTANCE.whitelabelFooterLanguage());
61 69
supportAnchor.getStyle().setDisplay(Display.NONE);
62 70
whatsNewAnchor.getStyle().setDisplay(Display.NONE);
63
- imprintAnchorLink.getStyle().setDisplay(Display.NONE);
64 71
privacyAnchorLink.getStyle().setDisplay(Display.NONE);
65 72
jobsAnchor.getStyle().setDisplay(Display.NONE);
66 73
} else {
... ...
@@ -68,8 +75,6 @@ public class Footer extends Composite {
68 75
setHrefOrHide(privacyAnchorLink, cfg.getFooterPrivacyLink());
69 76
setHrefOrHide(jobsAnchor, cfg.getFooterJobsLink());
70 77
setHrefOrHide(supportAnchor, cfg.getFooterSupportLink());
71
- setHrefOrHide(whatsNewAnchor, cfg.getFooterWhatsNewLink());
72
- setHrefOrHide(imprintAnchorLink, cfg.getFooterLegalLink());
73 78
languageSelector.setLabelText(cfg.getBrandTitle(Optional.empty()) + " " + StringMessages.INSTANCE.whitelabelFooterLanguage());
74 79
if (!hideIfBlank(copyrightDiv, cfg.getFooterCopyright())) {
75 80
copyrightDiv.setInnerText(cfg.getFooterCopyright());
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.ui.xml
... ...
@@ -5,6 +5,7 @@
5 5
<ui:with field="i18n" type="com.sap.sailing.gwt.ui.client.StringMessages" />
6 6
<ui:with field="res" type="com.sap.sailing.gwt.common.client.SharedResources" />
7 7
<ui:with field="local_res" type="com.sap.sailing.gwt.home.desktop.partials.footer.FooterResources" />
8
+ <ui:with field="releaseNotesNavigation" type="com.sap.sailing.gwt.home.shared.app.PlaceNavigation" />
8 9
<g:HTMLPanel tag="footer" addStyleNames="{local_res.css.dfooter}">
9 10
<!-- Website footer-->
10 11
<div class="{res.mediaCss.grid} {local_res.css.dfooter_row}">
... ...
@@ -23,7 +24,7 @@
23 24
<a ui:field="supportAnchor" class="{local_res.css.dfooter_item} {local_res.css.dfooter_link}">
24 25
<ui:text from='{i18n.footerSupport}' />
25 26
</a>
26
- <a ui:field="whatsNewAnchor" class="{local_res.css.dfooter_item} {local_res.css.dfooter_link}">
27
+ <a ui:field="whatsNewAnchor" href="{releaseNotesNavigation.getSafeTargetUrl}" class="{local_res.css.dfooter_item} {local_res.css.dfooter_link}">
27 28
<ui:text from='{i18n.whatsNew}' />
28 29
</a>
29 30
<a ui:field="mobileUi" title="{i18n.mobile}" href=""
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/TabletAndDesktopWhatsNewView.java
... ...
@@ -22,6 +22,8 @@ import com.sap.sailing.gwt.home.desktop.places.whatsnew.WhatsNewPlace.WhatsNewNa
22 22
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
23 23
import com.sap.sailing.gwt.ui.client.StringMessages;
24 24
import com.sap.sse.gwt.shared.ClientConfiguration;
25
+import com.google.gwt.dom.client.Element;
26
+import com.google.gwt.dom.client.NodeList;
25 27
26 28
public class TabletAndDesktopWhatsNewView extends Composite implements WhatsNewView {
27 29
private static SailingAnalyticsPageViewUiBinder uiBinder = GWT.create(SailingAnalyticsPageViewUiBinder.class);
... ...
@@ -63,6 +65,13 @@ public class TabletAndDesktopWhatsNewView extends Composite implements WhatsNewV
63 65
raceCommitteeAppNotes.setHTML(WhatsNewResources.INSTANCE.getRaceCommitteeAppNotesHtml().getText());
64 66
inSightAppNotes.setHTML(WhatsNewResources.INSTANCE.getInSightAppNotesHtml().getText());
65 67
buoyPingerAppNotes.setHTML(WhatsNewResources.INSTANCE.getBuoyPingerAppNotesHtml().getText());
68
+ if (ClientConfiguration.getInstance().isBrandingActive()) {
69
+ setBrandedHeadlineInWidget(raceCommitteeAppNotes, "h4", "What's New - {0} Sailing Race Manager");
70
+ setBrandedHeadlineInWidget(sailingAnalyticsNotes, "h4", "What's New - {0} Sailing Analytics");
71
+ setBrandedHeadlineInWidget(inSightAppNotes, "h4", "What's New - Sail Insight powered by {0}");
72
+ setBrandedHeadlineInWidget(buoyPingerAppNotes, "h4", "What's New - {0} Sailing Buoy Pinger");
73
+
74
+ }
66 75
// set notes navigation
67 76
sailingAnalyticNotesNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.SailingAnalytics);
68 77
sailingSimulatorNoteNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.SailingSimulator);
... ...
@@ -158,4 +167,17 @@ public class TabletAndDesktopWhatsNewView extends Composite implements WhatsNewV
158 167
}
159 168
}
160 169
170
+ private void setBrandedHeadlineInWidget(HTML contentWidget, String tagName, String templateWithBrandPlaceholder) {
171
+ String brandName = ClientConfiguration.getInstance().getBrandTitle(Optional.empty());
172
+ Element container = contentWidget.getElement();
173
+ NodeList<Element> elements = container.getElementsByTagName(tagName);
174
+ if (elements == null || elements.getLength() == 0) {
175
+ return;
176
+ }
177
+ Element target = elements.getItem(0);
178
+ String text = templateWithBrandPlaceholder.replace("{0}", brandName);
179
+ target.setInnerText(text);
180
+ }
181
+
182
+
161 183
}
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/BuoyPingerAppNotes.html
... ...
@@ -2,7 +2,7 @@
2 2
<html>
3 3
<body>
4 4
<div id="mainContent">
5
- <h4 class="articleHeadline">What's New - SAP Sailing Buoy Pinger</h4>
5
+ <h4 class="articleHeadline">What's New - Sailing Buoy Pinger</h4>
6 6
<div class="innerContent">
7 7
<h5 class="articleSubheadline">March 2024</h5>
8 8
<ul class="bulletList">
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/InSightAppNotes.html
... ...
@@ -2,7 +2,7 @@
2 2
<html>
3 3
<body>
4 4
<div id="mainContent">
5
- <h4 class="articleHeadline">What's New - Sail Insight powered by SAP</h4>
5
+ <h4 class="articleHeadline">What's New - Sail Insight powered by </h4>
6 6
<div class="innerContent">
7 7
<h5 class="articleSubheadline">15.05.2025 - Version 2.11.0</h5>
8 8
<ul class="bulletList">
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/RaceCommitteeAppNotes.html
... ...
@@ -2,7 +2,7 @@
2 2
<html>
3 3
<body>
4 4
<div id="mainContent">
5
- <h4 class="articleHeadline">What's New - SAP Sailing Race Manager</h4>
5
+ <h4 class="articleHeadline">What's New - Sailing Race Manager</h4>
6 6
<div class="innerContent">
7 7
<h5 class="articleSubheadline">April 2025</h5>
8 8
<ul class="bulletList">
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html
... ...
@@ -3,7 +3,7 @@
3 3
<html>
4 4
<body>
5 5
<div id="mainContent">
6
- <h4 class="articleHeadline">What's New - SAP Sailing Analytics</h4>
6
+ <h4 class="articleHeadline">What's New - Sailing Analytics</h4>
7 7
<div class="innerContent">
8 8
<h5 class="articleSubheadline">October 2025</h5>
9 9
<ul class="bulletList">
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/app/MobileApplicationView.java
... ...
@@ -46,7 +46,7 @@ public class MobileApplicationView extends Composite implements ApplicationTopLe
46 46
47 47
public MobileApplicationView(MobilePlacesNavigator placeNavigator, EventBus eventBus) {
48 48
headerPanel = new Header(placeNavigator, eventBus);
49
- footerPanel = new Footer();
49
+ footerPanel = new Footer(placeNavigator);
50 50
initWidget(uiBinder.createAndBindUi(this));
51 51
eventBus.addHandler(PlaceChangeEvent.TYPE, new PlaceChangeEvent.Handler() {
52 52
@Override
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.java
... ...
@@ -9,14 +9,18 @@ import com.google.gwt.dom.client.AnchorElement;
9 9
import com.google.gwt.dom.client.DivElement;
10 10
import com.google.gwt.dom.client.SpanElement;
11 11
import com.google.gwt.dom.client.Style.Display;
12
+import com.google.gwt.event.dom.client.ClickEvent;
12 13
import com.google.gwt.uibinder.client.UiBinder;
13 14
import com.google.gwt.uibinder.client.UiField;
15
+import com.google.gwt.uibinder.client.UiHandler;
14 16
import com.google.gwt.user.client.DOM;
15 17
import com.google.gwt.user.client.Event;
16 18
import com.google.gwt.user.client.EventListener;
17 19
import com.google.gwt.user.client.ui.Anchor;
18 20
import com.google.gwt.user.client.ui.Composite;
19 21
import com.google.gwt.user.client.ui.Widget;
22
+import com.sap.sailing.gwt.home.desktop.places.whatsnew.WhatsNewPlace;
23
+import com.sap.sailing.gwt.home.mobile.app.MobilePlacesNavigator;
20 24
import com.sap.sailing.gwt.home.shared.SwitchingEntryPoint;
21 25
import com.sap.sailing.gwt.ui.client.StringMessages;
22 26
import com.sap.sse.common.Util;
... ...
@@ -43,10 +47,14 @@ public class Footer extends Composite {
43 47
@UiField AnchorElement jobsAnchor;
44 48
@UiField AnchorElement privacyAnchor;
45 49
@UiField SpanElement pipe;
50
+
51
+ private final MobilePlacesNavigator placeNavigator;
46 52
47
- public Footer() {
53
+ public Footer(MobilePlacesNavigator placeNavigator) {
54
+ this.placeNavigator = placeNavigator;
48 55
FooterResources.INSTANCE.css().ensureInjected();
49 56
initWidget(uiBinder.createAndBindUi(this));
57
+ placeNavigator.getImprintNavigation().configureAnchorElement(imprintAnchorLink);
50 58
DOM.sinkEvents(desktopUi, Event.ONCLICK);
51 59
DOM.setEventListener(desktopUi, new EventListener() {
52 60
@Override
... ...
@@ -62,7 +70,6 @@ public class Footer extends Composite {
62 70
languageSelector.setLabelText(StringMessages.INSTANCE.whitelabelFooterLanguage());
63 71
supportAnchor.getStyle().setDisplay(Display.NONE);
64 72
whatsNewLinkUi.getElement().getStyle().setDisplay(Display.NONE);
65
- imprintAnchorLink.getStyle().setDisplay(Display.NONE);
66 73
jobsAnchor.getStyle().setDisplay(Display.NONE);
67 74
privacyAnchor.getStyle().setDisplay(Display.NONE);
68 75
} else {
... ...
@@ -74,18 +81,17 @@ public class Footer extends Composite {
74 81
setHrefOrHide(privacyAnchor, cfg.getFooterPrivacyLink());
75 82
setHrefOrHide(jobsAnchor, cfg.getFooterJobsLink());
76 83
setHrefOrHide(supportAnchor, cfg.getFooterSupportLink());
77
- setHrefOrHide(imprintAnchorLink, cfg.getFooterLegalLink());
78
- if (!Util.hasLength(cfg.getFooterWhatsNewLink())) {
79
- whatsNewLinkUi.getElement().getStyle().setDisplay(Display.NONE);
80
- } else {
81
- whatsNewLinkUi.setHref(cfg.getFooterWhatsNewLink());
82
- }
83 84
if (!hideIfBlank(copyrightDiv, cfg.getFooterCopyright())) {
84 85
copyrightDiv.setInnerText(cfg.getFooterCopyright());
85 86
}
86 87
}
87 88
}
88 89
90
+ @UiHandler("whatsNewLinkUi")
91
+ void onWhatsNew(ClickEvent e) {
92
+ placeNavigator.getWhatsNewNavigation(WhatsNewPlace.WhatsNewNavigationTabs.SailingAnalytics).goToPlace();
93
+ }
94
+
89 95
private static boolean hideIfBlank(DivElement el, String text) {
90 96
final boolean hidden = !Util.hasLength(text);
91 97
if (hidden) {
java/com.sap.sse.branding.sap/src/com/sap/sse/branding/sap/SAPBrandingConfiguration.java
... ...
@@ -105,11 +105,6 @@ public class SAPBrandingConfiguration implements BrandingConfiguration {
105 105
}
106 106
107 107
@Override
108
- public String getFooterLegalLink() {
109
- return "/gwt/Home.html#/imprint/:";
110
- }
111
-
112
- @Override
113 108
public String getFooterPrivacyLink() {
114 109
return "https://www.sap.com/about/legal/privacy.html?campaigncode=CRM-XH21-OSP-Sailing";
115 110
}
... ...
@@ -125,11 +120,6 @@ public class SAPBrandingConfiguration implements BrandingConfiguration {
125 120
}
126 121
127 122
@Override
128
- public String getFooterWhatsNewLink() {
129
- return "/gwt/Home.html#WhatsNewPlace:navigationTab=SailingAnalytics";
130
- }
131
-
132
- @Override
133 123
public String getSportsOn(Optional<String> locale) {
134 124
return sailingServerStringMessages.get(locale.map(l->Locale.forLanguageTag(l)).orElse(Locale.ENGLISH), "sportsOn");
135 125
}
java/com.sap.sse.branding/src/com/sap/sse/branding/impl/BrandingConfigurationServiceImpl.java
... ...
@@ -130,12 +130,10 @@ public class BrandingConfigurationServiceImpl implements BrandingConfigurationSe
130 130
map.put(BrandingConfigurationProperty.FOOTER_PRIVACY_LINK, brandingConfiguration == null ? "" : brandingConfiguration.getFooterPrivacyLink());
131 131
map.put(BrandingConfigurationProperty.FOOTER_JOBS_LINK, brandingConfiguration == null ? "" : brandingConfiguration.getFooterJobsLink());
132 132
map.put(BrandingConfigurationProperty.FOOTER_SUPPORT_LINK, brandingConfiguration == null ? "" : brandingConfiguration.getFooterSupportLink());
133
- map.put(BrandingConfigurationProperty.FOOTER_WHATS_NEW_LINK, brandingConfiguration == null ? "" : brandingConfiguration.getFooterWhatsNewLink());
134 133
map.put(BrandingConfigurationProperty.MORE_LOGIN_INFORMATION_SIMULATOR_URL, brandingConfiguration == null ? "" : brandingConfiguration.getMoreLoginInformationSimulatorURL());
135 134
map.put(BrandingConfigurationProperty.MORE_LOGIN_INFORMATION_SAILOR_PROFILES_URL, brandingConfiguration == null ? "" : brandingConfiguration.getMoreLoginInformationSailorProfilesURL());
136 135
map.put(BrandingConfigurationProperty.MORE_LOGIN_INFORMATION_SETTINGS_URL, brandingConfiguration == null ? "" : brandingConfiguration.getMoreLoginInformationSettingsURL());
137 136
map.put(BrandingConfigurationProperty.MORE_LOGIN_INFORMATION_NOTIFICATIONS_URL, brandingConfiguration == null ? "" : brandingConfiguration.getMoreLoginInformationNotificationsURL());
138
- map.put(BrandingConfigurationProperty.FOOTER_LEGAL_LINK, brandingConfiguration == null ? "" : brandingConfiguration.getFooterLegalLink());
139 137
map.put(BrandingConfigurationProperty.SAILING_ANALYTICS_READ_MORE_TEXT, brandingConfiguration == null ? "" : brandingConfiguration.getSailingAnalyticsReadMoreText(locale));
140 138
map.put(BrandingConfigurationProperty.SPORTS_ON, brandingConfiguration == null ? "" : brandingConfiguration.getSportsOn(locale));
141 139
map.put(BrandingConfigurationProperty.FOLLOW_SPORTS, brandingConfiguration == null ? "" : brandingConfiguration.getFollowSports(locale));
java/com.sap.sse.branding/src/com/sap/sse/branding/shared/BrandingConfiguration.java
... ...
@@ -37,17 +37,13 @@ public interface BrandingConfiguration {
37 37
String getSailingAnalyticsSailing(Optional<String> locale);
38 38
39 39
String getFooterCopyright();
40
-
41
- String getFooterLegalLink();
42
-
40
+
43 41
String getFooterPrivacyLink();
44 42
45 43
String getFooterJobsLink();
46 44
47 45
String getFooterSupportLink();
48
-
49
- String getFooterWhatsNewLink();
50
-
46
+
51 47
String getSportsOn(Optional<String> locale);
52 48
53 49
String getFollowSports(Optional<String> locale);
java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/data/ClientConfigurationContextDataJSO.java
... ...
@@ -79,9 +79,6 @@ public class ClientConfigurationContextDataJSO extends JavaScriptObject {
79 79
public final native String getFooterCopyright() /*-{
80 80
return this.footerCopyright;
81 81
}-*/;
82
- public final native String getFooterLegalLink() /*-{
83
- return this.footerLegalLink;
84
- }-*/;
85 82
public final native String getFooterPrivacyLink() /*-{
86 83
return this.footerPrivacyLink;
87 84
}-*/;
... ...
@@ -91,9 +88,6 @@ public class ClientConfigurationContextDataJSO extends JavaScriptObject {
91 88
public final native String getFooterSupportLink() /*-{
92 89
return this.footerSupportLink;
93 90
}-*/;
94
- public final native String getFooterWhatsNewLink() /*-{
95
- return this.footerWhatsNewLink;
96
- }-*/;
97 91
public final native String getSportsOn() /*-{
98 92
return this.sportsOn;
99 93
}-*/;
java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/ClientConfiguration.java
... ...
@@ -81,11 +81,9 @@ public class ClientConfiguration implements BrandingConfiguration {
81 81
private String sailingAnalyticsReadMoreText;
82 82
private String sailingAnalyticsSailing;
83 83
private String footerCopyright;
84
- private String footerLegalLink;
85 84
private String footerPrivacyLink;
86 85
private String footerJobsLink;
87 86
private String footerSupportLink;
88
- private String footerWhatsNewLink;
89 87
private String sportsOn;
90 88
private String followSports;
91 89
private String facebookLink;
... ...
@@ -120,11 +118,9 @@ public class ClientConfiguration implements BrandingConfiguration {
120 118
sailingAnalyticsReadMoreText = dataJso.getSailingAnalyticsReadMoreText();
121 119
sailingAnalyticsSailing = dataJso.getSailingAnalyticsSailing();
122 120
footerCopyright = dataJso.getFooterCopyright();
123
- footerLegalLink = dataJso.getFooterLegalLink();
124 121
footerPrivacyLink = dataJso.getFooterPrivacyLink();
125 122
footerJobsLink = dataJso.getFooterJobsLink();
126 123
footerSupportLink = dataJso.getFooterSupportLink();
127
- footerWhatsNewLink = dataJso.getFooterWhatsNewLink();
128 124
sportsOn = dataJso.getSportsOn();
129 125
followSports = dataJso.getFollowSports();
130 126
xLink = dataJso.getxLink();
... ...
@@ -221,9 +217,6 @@ public class ClientConfiguration implements BrandingConfiguration {
221 217
public String getFooterCopyright() {
222 218
return footerCopyright;
223 219
}
224
- public String getFooterLegalLink() {
225
- return footerLegalLink;
226
- }
227 220
public String getFooterPrivacyLink() {
228 221
return footerPrivacyLink;
229 222
}
... ...
@@ -233,9 +226,6 @@ public class ClientConfiguration implements BrandingConfiguration {
233 226
public String getFooterSupportLink() {
234 227
return footerSupportLink;
235 228
}
236
- public String getFooterWhatsNewLink() {
237
- return footerWhatsNewLink;
238
- }
239 229
public String getSportsOn(Optional<String> locale) {
240 230
return sportsOn;
241 231
}