.github/workflows/create-docker-image.yml
... ...
@@ -6,7 +6,7 @@ on:
6 6
workflow_run:
7 7
workflows: [release]
8 8
types: [completed]
9
- branches: [main, docker-24]
9
+ branches: [main, docker-24, docker-25]
10 10
workflow_dispatch:
11 11
inputs:
12 12
release:
... ...
@@ -72,12 +72,12 @@ jobs:
72 72
uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6.13.0
73 73
with:
74 74
build-args: RELEASE=${{ env.RELEASE }}
75
- tags: ghcr.io/${{steps.ghcr.outputs.PACKAGE}}:${{ env.RELEASE }}${{ env.BRANCH == 'main' && github.event.inputs.release == '' && format(',ghcr.io/{0}:latest', steps.ghcr.outputs.PACKAGE) || env.BRANCH == 'docker-17' && github.event.inputs.release == '' && format(',ghcr.io/{0}:latest-17', steps.ghcr.outputs.PACKAGE) || env.BRANCH == 'docker-21' && github.event.inputs.release == '' && format(',ghcr.io/{0}:latest-21', steps.ghcr.outputs.PACKAGE) || env.BRANCH == 'docker-24' && github.event.inputs.release == '' && format(',ghcr.io/{0}:latest-24', steps.ghcr.outputs.PACKAGE) || '' }}
75
+ tags: ghcr.io/${{steps.ghcr.outputs.PACKAGE}}:${{ env.RELEASE }}${{ env.BRANCH == 'main' && github.event.inputs.release == '' && format(',ghcr.io/{0}:latest', steps.ghcr.outputs.PACKAGE) || env.BRANCH == 'docker-17' && github.event.inputs.release == '' && format(',ghcr.io/{0}:latest-17', steps.ghcr.outputs.PACKAGE) || env.BRANCH == 'docker-21' && github.event.inputs.release == '' && format(',ghcr.io/{0}:latest-21', steps.ghcr.outputs.PACKAGE) || env.BRANCH == 'docker-24' && github.event.inputs.release == '' && format(',ghcr.io/{0}:latest-24', steps.ghcr.outputs.PACKAGE) || env.BRANCH == 'docker-25' && github.event.inputs.release == '' && format(',ghcr.io/{0}:latest-25', steps.ghcr.outputs.PACKAGE) || '' }}
76 76
annotations: |
77 77
maintainer=axel.uhl@sap.com
78 78
index:org.opencontainers.image.title=Sailing Analytics
79 79
index:org.opencontainers.image.description=The Sailing Analytics Web Application
80
- file: ${{ env.BRANCH == 'docker-17' && 'docker/Dockerfile_sapsailing_on_sapmachine17' || env.BRANCH == 'docker-21' && 'docker/Dockerfile_sapsailing_on_sapmachine21' || env.BRANCH == 'docker-24' && 'docker/Dockerfile_sapsailing_on_sapmachine24' || 'docker/Dockerfile' }}
80
+ file: ${{ env.BRANCH == 'docker-17' && 'docker/Dockerfile_sapsailing_on_sapmachine17' || env.BRANCH == 'docker-21' && 'docker/Dockerfile_sapsailing_on_sapmachine21' || env.BRANCH == 'docker-24' && 'docker/Dockerfile_sapsailing_on_sapmachine24' || env.BRANCH == 'docker-25' && 'docker/Dockerfile_sapsailing_on_sapmachine25' || 'docker/Dockerfile' }}
81 81
context: docker/
82 82
platforms: linux/amd64,linux/arm64
83 83
push: true
.github/workflows/merge-main-into-docker-25.yml
... ...
@@ -0,0 +1,29 @@
1
+name: Merge main branch into docker-25 after successful build
2
+on:
3
+ workflow_run:
4
+ workflows: [release]
5
+ types: [completed]
6
+ branches: [main]
7
+ workflow_dispatch: {}
8
+jobs:
9
+ merge-main-into-docker-25:
10
+ permissions:
11
+ contents: write
12
+ if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }}
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - name: Checkout
16
+ uses: actions/checkout@v4
17
+ with:
18
+ ref: docker-25
19
+ fetch-depth: 0 # fetch the whole thing to make sure the histories merge
20
+ - name: Merge main into docker-25
21
+ uses: devmasx/merge-branch@854d3ac71ed1e9deb668e0074781b81fdd6e771f # v1.4.0
22
+ env:
23
+ GH_TOKEN: ${{ secrets.REPO_TOKEN_FOR_MERGE_AND_PUSH }}
24
+ with:
25
+ type: now
26
+ from_branch: main
27
+ target_branch: docker-25
28
+ message: Auto-merging main into docker-25 after successful release build
29
+ github_token: ${{ secrets.REPO_TOKEN_FOR_MERGE_AND_PUSH }}
.github/workflows/release.yml
... ...
@@ -78,12 +78,12 @@ jobs:
78 78
distribution: 'temurin' # See 'Supported distributions' for available options
79 79
java-version: '8'
80 80
mvn-toolchain-id: 'JavaSE-1.8'
81
- - name: Install JDK 17
81
+ - name: Install JDK 25
82 82
uses: actions/setup-java@v4
83 83
with:
84 84
distribution: 'temurin' # See 'Supported distributions' for available options
85
- java-version: '17'
86
- mvn-toolchain-id: 'JavaSE-17'
85
+ java-version: '25'
86
+ mvn-toolchain-id: 'JavaSE-25'
87 87
- name: Setup Android SDK
88 88
uses: android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407 # v3.2.2
89 89
with:
... ...
@@ -131,7 +131,7 @@ jobs:
131 131
reporter: java-junit
132 132
fail-on-error: true
133 133
- name: Build Release
134
- if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/docker-24' || startsWith(github.ref, 'refs/heads/releases/') }}
134
+ if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/docker-24' || github.ref == 'refs/heads/docker-25' || startsWith(github.ref, 'refs/heads/releases/') }}
135 135
shell: bash
136 136
run: |
137 137
./configuration/buildAndUpdateProduct.sh -u -L ${{ github.event.inputs.skip_tests == 'true' && '-n untested' || '' }} release
... ...
@@ -148,14 +148,14 @@ jobs:
148 148
retention-days: 90
149 149
- name: Upload distribution artifact
150 150
uses: actions/upload-artifact@v4
151
- if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/docker-24' || startsWith(github.ref, 'refs/heads/releases/') }}
151
+ if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/docker-24' || github.ref == 'refs/heads/docker-25' || startsWith(github.ref, 'refs/heads/releases/') }}
152 152
with:
153 153
name: ${{ env.SIMPLE_VERSION_INFO }}
154 154
path: dist/**/*
155 155
retention-days: 90
156 156
- name: Create Release
157 157
id: create_release
158
- if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/docker-24' || startsWith(github.ref, 'refs/heads/releases/') }}
158
+ if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/docker-24' || github.ref == 'refs/heads/docker-25' || startsWith(github.ref, 'refs/heads/releases/') }}
159 159
uses: softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda # v2.2.1
160 160
with:
161 161
tag_name: ${{ env.SIMPLE_VERSION_INFO }}
... ...
@@ -164,7 +164,7 @@ jobs:
164 164
prerelease: false
165 165
- name: Upload Release Asset tar.gz
166 166
id: upload-release-asset-tar-gz
167
- if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/docker-24' || startsWith(github.ref, 'refs/heads/releases/') }}
167
+ if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/docker-24' || github.ref == 'refs/heads/docker-25' || startsWith(github.ref, 'refs/heads/releases/') }}
168 168
uses: actions/upload-release-asset@v1
169 169
env:
170 170
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
... ...
@@ -175,7 +175,7 @@ jobs:
175 175
asset_content_type: application/x-tar
176 176
- name: Upload Release Asset release_notes.txt
177 177
id: upload-release-asset-release-notes-txt
178
- if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/docker-24' || startsWith(github.ref, 'refs/heads/releases/') }}
178
+ if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/docker-24' || github.ref == 'refs/heads/docker-25' || startsWith(github.ref, 'refs/heads/releases/') }}
179 179
uses: actions/upload-release-asset@v1
180 180
env:
181 181
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
docker/Dockerfile_sapsailing_on_sapmachine25
... ...
@@ -0,0 +1,25 @@
1
+FROM sapmachine:25.0.1
2
+# This Dockerfile assumes that the release to use is provided as
3
+# ${RELEASE}.tar.gz in the current Docker workspace. Use, e.g.,
4
+# the configuration/github-download-release-assets.sh script to
5
+# obtain the tar.gz file for a specific or the latest "main" release.
6
+ARG RELEASE
7
+LABEL maintainer=axel.uhl@sap.com
8
+LABEL org.opencontainers.image.description="Sailing Analytics with Java 25"
9
+# Download and extract the release
10
+WORKDIR /home/sailing/servers/server
11
+RUN apt-get update \
12
+ && apt-get install -y wget apt-utils vim telnet dnsutils net-tools jq
13
+COPY vimrc /root/.vimrc
14
+RUN wget -O /tmp/rds.pem https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem \
15
+ && ${JAVA_HOME}/bin/keytool -importcert -alias AWSRDS -file /tmp/rds.pem -keystore ${JAVA_HOME}/lib/security/cacerts -noprompt -storepass changeit \
16
+ && rm /tmp/rds.pem
17
+COPY ${RELEASE}.tar.gz /tmp
18
+RUN tar xzvpf /tmp/${RELEASE}.tar.gz \
19
+ && rm /tmp/${RELEASE}.tar.gz
20
+COPY env.sh .
21
+RUN cat env-default-rules.sh >>env.sh
22
+COPY start .
23
+COPY JavaSE-11.profile .
24
+EXPOSE 8888 14888 8000 7091 6666
25
+CMD [ "/home/sailing/servers/server/start", "docker" ]
docker/Dockerfile_windestimation-on-sapmachine25
... ...
@@ -0,0 +1,16 @@
1
+FROM sapmachine:25.0.1
2
+LABEL maintainer=axel.uhl@sap.com
3
+# Download and extract the release
4
+WORKDIR /home/sailing
5
+RUN chmod 777 /home/sailing; mkdir logs; mkdir dump
6
+RUN apt-get -y update; apt-get -y upgrade; apt-get -y install apt-utils wget curl
7
+RUN curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | apt-key add -
8
+RUN echo "deb [arch=amd64,arm64] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" >/etc/apt/sources.list.d/mongodb-org-4.4.list
9
+RUN apt-get update \
10
+ && apt-get install -y vim mongodb-org-shell
11
+COPY vimrc /root/.vimrc
12
+RUN wget -O /tmp/rds.pem https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem \
13
+ && ${JAVA_HOME}/bin/keytool -importcert -alias AWSRDS -file /tmp/rds.pem -keystore ${JAVA_HOME}/lib/security/cacerts -noprompt -storepass changeit \
14
+ && rm /tmp/rds.pem
15
+RUN wget -O /home/sailing/WindEstimationModelsTraining.jar https://static.sapsailing.com/WindEstimationModelsTraining.jar
16
+CMD exec java "${MEMORY}" -Dmongo.uri="${MONGODB_URI}" -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump/ -Xlog:gc*=info,gc+region*=info,gc+ergo*=info,gc+humongous*=info,gc+liveness=trace:file=logs/gc.log:time,level,tags:filecount=10,filesize=100000000 -jar WindEstimationModelsTraining.jar "${BEARER_TOKEN}" ${TRAINING_DATA_PERCENT}
docker/docker-compose-25.yml
... ...
@@ -0,0 +1,19 @@
1
+version: "3.10"
2
+services:
3
+ sailing-analytics:
4
+ image: "ghcr.io/sap/sailing-analytics:latest-25"
5
+ ports:
6
+ - "8888:8888"
7
+ - "6666:6666"
8
+ - "14888:14888"
9
+ environment:
10
+ MONGODB_URI: mongodb://mongo/test
11
+ SERVER_NAME: test
12
+ REPLICATION_HOST: rabbitmq
13
+ REPLICATION_CHANNEL: test
14
+ REPLICATION_PORT: 5672
15
+ mongo:
16
+ image: "mongo:7"
17
+ rabbitmq:
18
+ image: "rabbitmq:3.13"
19
+
docker/makeImageForLatestRelease-on-sapmachine25
... ...
@@ -0,0 +1,31 @@
1
+#!/bin/bash
2
+release_prefix=$1
3
+GITROOT="`dirname $0`/.."
4
+DOCKERDIR="${GITROOT}/docker"
5
+DOCKERFILE="$DOCKERDIR/Dockerfile"
6
+if [ "${release_prefix}" = "" ]; then
7
+ SET_LATEST=1
8
+ release_prefix="docker-25-"
9
+fi
10
+pushd "${DOCKERDIR}"
11
+RELEASE_TAR_GZ_FILENAME=$( ${GITROOT}/configuration/github-download-release-assets.sh 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 "${release_prefix}" )
12
+if [ "${RELEASE_TAR_GZ_FILENAME}" = "" ]; then
13
+ echo "No release with prefix ${release_prefix} found" >&2
14
+else
15
+ release=$( echo ${RELEASE_TAR_GZ_FILENAME} | sed -e 's/\.tar\.gz//' )
16
+ echo Release is ${release}
17
+ echo "Copying files from GITROOT $GITROOT into Docker workspace"
18
+ cp "$GITROOT/java/target/env.sh" "$DOCKERDIR"
19
+ cp "$GITROOT/java/target/start" "$DOCKERDIR"
20
+ cp "$GITROOT/java/target/configuration/JavaSE-11.profile" "$DOCKERDIR"
21
+ cd "$DOCKERDIR"
22
+ docker build --build-arg RELEASE=${release} -t ghcr.io/sap/sailing-analytics:${release} -f Dockerfile_sapsailing_on_sapmachine25 .
23
+ echo "Cleaning up..."
24
+ rm start env.sh JavaSE-11.profile ${RELEASE_TAR_GZ_FILENAME} release-notes.txt
25
+ docker push ghcr.io/sap/sailing-analytics:${release}
26
+ if [ "$SET_LATEST" = "1" ]; then
27
+ docker tag ghcr.io/sap/sailing-analytics:${release} ghcr.io/sap/sailing-analytics:latest-25
28
+ docker push ghcr.io/sap/sailing-analytics:latest-25
29
+ fi
30
+fi
31
+popd
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.gss
... ...
@@ -1,9 +1,9 @@
1
-/**
2
- * Website footer styling
3
- */
4 1
@def SITEFOOTER_BACKGROUND_COLOR #333;
5 2
@def SITEFOOTER_TEXT_COLOR #fff;
6 3
4
+/**
5
+ * Mobile footer styling
6
+ */
7 7
.sitefooter {
8 8
font-size: 1rem;
9 9
background: SITEFOOTER_BACKGROUND_COLOR;
... ...
@@ -50,6 +50,74 @@
50 50
}
51 51
@media (min-width: 45em) {
52 52
.sitefooter_language {
53
+ float: right;
53 54
text-align: right;
54 55
}
55 56
}
57
+/**
58
+ * Desktop footer styling
59
+ */
60
+.dfooter {
61
+ background: SITEFOOTER_BACKGROUND_COLOR;
62
+ color: SITEFOOTER_TEXT_COLOR;
63
+ font-size: 1rem;
64
+ border-top: 0.333333333333333em solid SITEFOOTER_BACKGROUND_COLOR;
65
+ padding: 0 1.333333333333333em;
66
+ margin-top: -5.333333333333333em;
67
+ display: block;
68
+ line-height: normal;
69
+ width: 100%;
70
+ position: relative;
71
+ z-index: 1000;
72
+}
73
+.dfooter_row {
74
+ display: flex;
75
+ flex-wrap: wrap;
76
+ align-items: center;
77
+ min-height: 5em;
78
+ row-gap: 0.25em;
79
+ column-gap: 2em;
80
+}
81
+.dfooter_left {
82
+ display: flex;
83
+ flex-wrap: wrap;
84
+ align-items: baseline;
85
+ /*change rem here to configure preferred width before right block drops */
86
+ flex: 1 1 14rem;
87
+ row-gap: 0.25em;
88
+ column-gap: 2em;
89
+ min-width: 0;
90
+}
91
+.dfooter_right {
92
+ display: flex;
93
+ align-items: center;
94
+ margin-left: auto;
95
+ flex: 0 0 auto;
96
+ min-width: 8rem;
97
+}
98
+.dfooter_item,
99
+.dfooter_link,
100
+.dfooter_copyright {
101
+ line-height: 1;
102
+ margin: 0;
103
+ padding: 0;
104
+ display: inline-flex;
105
+ align-items: center;
106
+}
107
+.dfooter_copyright {
108
+ font-weight: 600;
109
+ white-space: nowrap;
110
+ color: SITEFOOTER_TEXT_COLOR;
111
+}
112
+.dfooter_link {
113
+ text-decoration: none;
114
+ color: SITEFOOTER_TEXT_COLOR;
115
+}
116
+.dfooter_link:hover,
117
+.dfooter_link:focus { text-decoration: underline; }
118
+.dfooter_language { text-align: right; white-space: nowrap; }
119
+.dfooter_language select {
120
+ background-color: SITEFOOTER_BACKGROUND_COLOR;
121
+ color: SITEFOOTER_TEXT_COLOR;
122
+ max-width: 100%;
123
+}
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.java
... ...
@@ -38,6 +38,7 @@ public class Footer extends Composite {
38 38
@UiField AnchorElement imprintAnchorLink;
39 39
@UiField AnchorElement privacyAnchorLink;
40 40
@UiField AnchorElement mobileUi;
41
+ @UiField AnchorElement sapJobsAnchor;
41 42
@UiField(provided = true)
42 43
final PlaceNavigation<WhatsNewPlace> releaseNotesNavigation;
43 44
... ...
@@ -65,6 +66,7 @@ public class Footer extends Composite {
65 66
whatsNewAnchor.getStyle().setDisplay(Display.NONE);
66 67
imprintAnchorLink.getStyle().setDisplay(Display.NONE);
67 68
privacyAnchorLink.getStyle().setDisplay(Display.NONE);
69
+ sapJobsAnchor.getStyle().setDisplay(Display.NONE);
68 70
}
69 71
copyrightDiv.setAttribute(DebugConstants.DEBUG_ID_ATTRIBUTE, "copyrightDiv");
70 72
supportAnchor.setAttribute(DEBUG_ID_ATTRIBUTE, "supportAnchor");
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.ui.xml
... ...
@@ -6,37 +6,36 @@
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 8
<ui:with field="releaseNotesNavigation" type="com.sap.sailing.gwt.home.shared.app.PlaceNavigation" />
9
- <g:HTMLPanel tag="footer" addStyleNames="{local_res.css.sitefooter}">
9
+ <g:HTMLPanel tag="footer" addStyleNames="{local_res.css.dfooter}">
10 10
<!-- Website footer-->
11
- <div class="{res.mediaCss.grid}">
12
- <div class="{res.mediaCss.small12} {res.mediaCss.medium9} {res.mediaCss.columns}">
13
- <div ui:field="copyrightDiv" class="{local_res.css.sitefooter_copyright}">
11
+ <div class="{res.mediaCss.grid} {local_res.css.dfooter_row}">
12
+ <div class="{local_res.css.dfooter_left}">
13
+ <div ui:field="copyrightDiv" class="{local_res.css.dfooter_item} {local_res.css.dfooter_copyright}">
14 14
<ui:text from='{i18n.footerCopyright}' />
15
- </div>
16
- <div class="{local_res.css.sitefooter_links}">
17
- <a ui:field="imprintAnchorLink" target="_blank" class="{local_res.css.sitefooter_links_link}">
15
+ </div>
16
+ <a ui:field="imprintAnchorLink" target="_blank" class="{local_res.css.dfooter_item} {local_res.css.dfooter_link}">
18 17
<ui:text from='{i18n.footerLegal}' />
19 18
</a>
20
- <a ui:field="privacyAnchorLink" href="https://www.sap.com/about/legal/privacy.html?campaigncode=CRM-XH21-OSP-Sailing" target="_blank" class="{local_res.css.sitefooter_links_link}">
19
+ <a ui:field="privacyAnchorLink" href="https://www.sap.com/about/legal/privacy.html?campaigncode=CRM-XH21-OSP-Sailing" target="_blank" class="{local_res.css.dfooter_item} {local_res.css.dfooter_link}">
21 20
<ui:text from='{i18n.footerPrivacy}' />
22 21
</a>
23
- <a ui:field="sapJobsAnchor" href="https://jobs.sapsailing.com" target="_blank" class="{local_res.css.sitefooter_links_link}">
22
+ <a ui:field="sapJobsAnchor" href="https://jobs.sapsailing.com" target="_blank" class="{local_res.css.dfooter_item} {local_res.css.dfooter_link}">
24 23
<ui:text from='{i18n.footerJobs}'/>
25 24
</a>
26
- <a ui:field="supportAnchor" href="https://support.sapsailing.com" target="_blank" class="{local_res.css.sitefooter_links_link}">
25
+ <a ui:field="supportAnchor" href="https://support.sapsailing.com" target="_blank" class="{local_res.css.dfooter_item} {local_res.css.dfooter_link}">
27 26
<ui:text from='{i18n.footerSupport}' />
28 27
</a>
28
+ <a ui:field="whatsNewAnchor" href="{releaseNotesNavigation.getSafeTargetUrl}" class="{local_res.css.dfooter_item} {local_res.css.dfooter_link}">
29
+ <ui:text from='{i18n.whatsNew}' />
30
+ </a>
29 31
<a ui:field="mobileUi" title="{i18n.mobile}" href=""
30
- class="{local_res.css.sitefooter_links_link} {res.mediaCss.showonsmall} {res.mediaCss.hideonmedium} {res.mediaCss.hideonlarge}">
32
+ class="{local_res.css.dfooter_item} {local_res.css.dfooter_link} {res.mediaCss.showonsmall} {res.mediaCss.hideonmedium} {res.mediaCss.hideonlarge}">
31 33
<ui:text from='{i18n.mobile}' />
32 34
</a>
33
- <a ui:field="whatsNewAnchor" href="{releaseNotesNavigation.getSafeTargetUrl}" class="{local_res.css.sitefooter_links_link}">
34
- <ui:text from='{i18n.whatsNew}' />
35
- </a>
36 35
</div>
36
+ <div class="{local_res.css.dfooter_right}">
37
+ <l:LanguageSelector ui:field="languageSelector" labelText="{i18n.footerLanguage}" addStyleNames="{local_res.css.dfooter_language}" />
37 38
</div>
38
- <l:LanguageSelector ui:field="languageSelector" labelText="{i18n.footerLanguage}" addStyleNames="{res.mediaCss.small12}
39
- {res.mediaCss.medium3} {res.mediaCss.columns} {local_res.css.sitefooter_language}" />
40
- </div>
39
+ </div>
41 40
</g:HTMLPanel>
42 41
</ui:UiBinder>
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/FooterResources.java
... ...
@@ -16,5 +16,13 @@ public interface FooterResources extends ClientBundle {
16 16
String sitefooter_links();
17 17
String sitefooter_links_link();
18 18
String sitefooter_language();
19
+ String dfooter();
20
+ String dfooter_row();
21
+ String dfooter_left();
22
+ String dfooter_right();
23
+ String dfooter_item();
24
+ String dfooter_copyright();
25
+ String dfooter_link();
26
+ String dfooter_language();
19 27
}
20 28
}
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.java
... ...
@@ -5,6 +5,7 @@ import static com.google.gwt.dom.client.Style.Display.NONE;
5 5
import com.google.gwt.core.client.GWT;
6 6
import com.google.gwt.dom.client.AnchorElement;
7 7
import com.google.gwt.dom.client.DivElement;
8
+import com.google.gwt.dom.client.SpanElement;
8 9
import com.google.gwt.dom.client.Style.Display;
9 10
import com.google.gwt.event.dom.client.ClickEvent;
10 11
import com.google.gwt.uibinder.client.UiBinder;
... ...
@@ -38,6 +39,9 @@ public class Footer extends Composite {
38 39
@UiField DivElement copyrightDiv;
39 40
@UiField AnchorElement imprintAnchorLink;
40 41
@UiField AnchorElement desktopUi;
42
+ @UiField AnchorElement sapJobsAnchor;
43
+ @UiField AnchorElement privacyAnchor;
44
+ @UiField SpanElement pipe;
41 45
42 46
private final MobilePlacesNavigator placeNavigator;
43 47
... ...
@@ -62,6 +66,10 @@ public class Footer extends Composite {
62 66
supportAnchor.getStyle().setDisplay(Display.NONE);
63 67
whatsNewLinkUi.getElement().getStyle().setDisplay(Display.NONE);
64 68
imprintAnchorLink.getStyle().setDisplay(Display.NONE);
69
+ sapJobsAnchor.getStyle().setDisplay(Display.NONE);
70
+ privacyAnchor.getStyle().setDisplay(Display.NONE);
71
+ } else {
72
+ pipe.setInnerText("|");
65 73
}
66 74
}
67 75
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.ui.xml
... ...
@@ -9,13 +9,14 @@
9 9
<!-- Footer mobile -->
10 10
<footer class="{local_res.css.sitefooter}">
11 11
<div class="{res.mediaCss.grid}">
12
- <l:LanguageSelector ui:field="languageSelector" labelText="{i18n.footerLanguage}"
13
- addStyleNames="{local_res.css.sitefooter_language} {res.mediaCss.small12} {res.mediaCss.columns}"/>
12
+ <div ui:field="copyrightDiv" class="{res.mediaCss.small12} {res.mediaCss.columns} {local_res.css.sitefooter_copyright}">
13
+ <ui:text from='{i18n.footerCopyright}' />
14
+ </div>
14 15
<div class="{local_res.css.sitefooter_links} {res.mediaCss.small12} {res.mediaCss.columns}">
15 16
<a ui:field="imprintAnchorLink">
16 17
<ui:text from='{i18n.footerLegal}' />
17 18
</a>
18
- <a href="https://www.sap.com/about/legal/privacy.html?campaigncode=CRM-XH21-OSP-Sailing"
19
+ <a ui:field="privacyAnchor" href="https://www.sap.com/about/legal/privacy.html?campaigncode=CRM-XH21-OSP-Sailing"
19 20
title="{i18n.footerPrivacy}">
20 21
<ui:text from='{i18n.footerPrivacy}' />
21 22
</a>
... ...
@@ -27,18 +28,16 @@
27 28
title="{i18n.footerSupport}">
28 29
<ui:text from='{i18n.footerSupport}' />
29 30
</a>
30
- |
31
- <a ui:field="desktopUi" title="{i18n.desktop}" href="">
32
- <ui:text from='{i18n.desktop}' />
33
- </a>
34
- <br></br>
35 31
<g:Anchor title="{i18n.whatsNew}" ui:field="whatsNewLinkUi">
36 32
<ui:text from='{i18n.whatsNew}' />
37 33
</g:Anchor>
34
+ <span ui:field="pipe"></span>
35
+ <a ui:field="desktopUi" title="{i18n.desktop}" href="">
36
+ <ui:text from='{i18n.desktop}' />
37
+ </a>
38 38
</div>
39
- <div ui:field="copyrightDiv" class="{res.mediaCss.small12} {res.mediaCss.columns} {local_res.css.sitefooter_copyright}">
40
- <ui:text from='{i18n.footerCopyright}' />
41
- </div>
39
+ <l:LanguageSelector ui:field="languageSelector" labelText="{i18n.footerLanguage}"
40
+ addStyleNames="{local_res.css.sitefooter_language} {res.mediaCss.small12} {res.mediaCss.columns}"/>
42 41
</div>
43 42
</footer>
44 43
</g:HTMLPanel>
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_cs.properties
... ...
@@ -2593,3 +2593,6 @@ errorCopyingPairings=Chyba při kopírování propojení: {0}
2593 2593
successfullyCopiedPairings=Úspěšně zkopírovaná propojení
2594 2594
selectFromRaceColumn=Vyberte sloupec rozjížďky, od kterého chcete zahájit kopírování propojení
2595 2595
selectToRaceColumn=Vyberte sloupec rozjížďky, do kterého chcete zkopírovat propojení
2596
+exportTWAHistogramToCsv=Export histogramu úhlu skutečného větru do CSV
2597
+exportWindSpeedHistogramToCsv=Export histogramu rychlosti větru do CSV
2598
+optionalBearerTokenForWindImport=Volitelný nosný token pro import větru
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_da.properties
... ...
@@ -2593,3 +2593,6 @@ errorCopyingPairings=Fejl ved kopiering af par: {0}
2593 2593
successfullyCopiedPairings=Par blev kopieret
2594 2594
selectFromRaceColumn=Vælg kapsejladskolonne, hvorfra kopiering af par skal startes
2595 2595
selectToRaceColumn=Vælg kapsejladskolonne, hvortil kopiering af par skal startes
2596
+exportTWAHistogramToCsv=Eksporter histogram for sand vindvinkel til CSV
2597
+exportWindSpeedHistogramToCsv=Eksporter histogram for vindhastighed til CSV
2598
+optionalBearerTokenForWindImport=Valgfrit ihændehavertoken til vindimport
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties
... ...
@@ -2593,3 +2593,6 @@ errorCopyingPairings=Error al copiar emparejamientos: {0}
2593 2593
successfullyCopiedPairings=Emparejamientos copiados correctamente
2594 2594
selectFromRaceColumn=Seleccione la columna Prueba desde la que se inicia la copia de emparejamientos
2595 2595
selectToRaceColumn=Seleccione la columna Prueba desde la que se copian los emparejamientos
2596
+exportTWAHistogramToCsv=Exportar histograma de ángulos de viento reales a CSV
2597
+exportWindSpeedHistogramToCsv=Exportar histograma de velocidades de viento a CSV
2598
+optionalBearerTokenForWindImport=Token de portador opcional para importación de viento
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties
... ...
@@ -2593,3 +2593,6 @@ errorCopyingPairings=Erreur lors de la copie des appariements : {0}
2593 2593
successfullyCopiedPairings=Appariements copiés
2594 2594
selectFromRaceColumn=Sélectionnez la colonne de la course dans laquelle commencer à copier des appariements.
2595 2595
selectToRaceColumn=Sélectionnez la colonne de la course dans laquelle commencer à coller des appariements.
2596
+exportTWAHistogramToCsv=Exporter l''histogramme de l''angle du vent réel au format CSV
2597
+exportWindSpeedHistogramToCsv=Exporter l''histogramme de la vitesse du vent au format CSV
2598
+optionalBearerTokenForWindImport=Jeton porteur facultatif pour l''importation des données de vent
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties
... ...
@@ -2593,3 +2593,6 @@ errorCopyingPairings=Errore di copia degli accoppiamenti: {0}
2593 2593
successfullyCopiedPairings=Accoppiamenti copiati correttamente
2594 2594
selectFromRaceColumn=Seleziona la colonna della gara da cui iniziare a copiare gli accoppiamenti
2595 2595
selectToRaceColumn=Seleziona la colonna della gara in cui copiare gli accoppiamenti
2596
+exportTWAHistogramToCsv=Esporta istogramma angolo del vento reale in CSV
2597
+exportWindSpeedHistogramToCsv=Esporta istogramma velocità del vento in CSV
2598
+optionalBearerTokenForWindImport=Bearer token facoltativo per l’importazione vento
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties
... ...
@@ -2593,3 +2593,6 @@ errorCopyingPairings=対戦組み合わせのコピーでエラーが発生: {0}
2593 2593
successfullyCopiedPairings=対戦組み合わせを正常にコピー済み
2594 2594
selectFromRaceColumn=対戦組み合わせのコピーを開始する元のレース列を選択
2595 2595
selectToRaceColumn=対戦組み合わせのコピー先のレース列を選択
2596
+exportTWAHistogramToCsv=真風角度ヒストグラムの CSV へのエクスポート
2597
+exportWindSpeedHistogramToCsv=風速ヒストグラムの CSV へのエクスポート
2598
+optionalBearerTokenForWindImport=風インポートの任意ベアラートークン
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties
... ...
@@ -2593,3 +2593,6 @@ errorCopyingPairings=Erro ao copiar pares: {0}
2593 2593
successfullyCopiedPairings=Pares copiados com êxito
2594 2594
selectFromRaceColumn=Selecionar coluna da corrida a partir da qual deve ser iniciada a cópia dos pares
2595 2595
selectToRaceColumn=Selecionar coluna da corrida para a qual deve ser efetuada a cópia dos pares
2596
+exportTWAHistogramToCsv=Exportar histograma do ângulo do vento verdadeiro para CSV
2597
+exportWindSpeedHistogramToCsv=Exportar histograma da velocidade do vento para CSV
2598
+optionalBearerTokenForWindImport=Token de portador opcional para importação do vento
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties
... ...
@@ -2593,3 +2593,6 @@ errorCopyingPairings=Ошибка при копировании пар: {0}
2593 2593
successfullyCopiedPairings=Успешно скопированные пары
2594 2594
selectFromRaceColumn=Выберите столбец гонки, с которого требуется начать копирование пар
2595 2595
selectToRaceColumn=Выберите столбец гонки, в который требуется копировать пары
2596
+exportTWAHistogramToCsv=Экспортировать гистограмму угла истинного ветра в CSV
2597
+exportWindSpeedHistogramToCsv=Экспортировать гистограмму скорости ветра в CSV
2598
+optionalBearerTokenForWindImport=Опциональный маркер носителя для импорта ветра
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_sl.properties
... ...
@@ -2593,3 +2593,6 @@ errorCopyingPairings=Napaka pri kopiranju parov: {0}
2593 2593
successfullyCopiedPairings=Uspešno kopirani pari
2594 2594
selectFromRaceColumn=Izberite stolpec plova, iz katerega želite začeti kopirati pare
2595 2595
selectToRaceColumn=Izberite stolpec plova, v katerega želite začeti kopirati pare
2596
+exportTWAHistogramToCsv=Izvoz histograma kota pravega vetra v CSV
2597
+exportWindSpeedHistogramToCsv=Izvoz histograma hitrosti vetra v CSV
2598
+optionalBearerTokenForWindImport=Neobvezni nosilni žeton za uvoz vetra
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties
... ...
@@ -2593,3 +2593,6 @@ errorCopyingPairings=复制配对出错:{0}
2593 2593
successfullyCopiedPairings=已成功复制配对
2594 2594
selectFromRaceColumn=选择要从哪一个比赛轮次列开始复制配对
2595 2595
selectToRaceColumn=选择要将配对复制到哪一个比赛轮次列
2596
+exportTWAHistogramToCsv=将实际风向角直方图导出到 CSV
2597
+exportWindSpeedHistogramToCsv=将风速直方图导出到 CSV
2598
+optionalBearerTokenForWindImport=用于风力数据导入的可选持有者令牌