mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-22 21:55:39 +00:00
Merge branch 'master' into bug5214
This commit is contained in:
@@ -15,11 +15,6 @@ run_git_pull() {
|
||||
su - sailing -c "cd code; git pull"
|
||||
}
|
||||
|
||||
run_refresh_instance_install_release() {
|
||||
echo "Upgrading sailing server software" >>/var/log/sailing.err
|
||||
su - sailing -c "cd servers; for i in *; do echo \"Upgrading \$i\"; cd \$i; echo \"Updating release in \`pwd\`\"; ./refreshInstance.sh install-release; cd ..; done" >>/var/log/sailing.err
|
||||
}
|
||||
|
||||
clean_logrotate_target() {
|
||||
echo "Clearing logrorate-targets" >>/var/log/sailing.err
|
||||
rm -rf /var/log/logrotate-target/*
|
||||
@@ -32,11 +27,6 @@ clean_httpd_logs() {
|
||||
rm /etc/httpd/conf.d/001-internals.conf
|
||||
}
|
||||
|
||||
clean_sailing_logs() {
|
||||
echo "Clearing sailing logs" >>/var/log/sailing.err
|
||||
rm -rf /home/sailing/servers/*/logs/*
|
||||
}
|
||||
|
||||
clean_startup_logs() {
|
||||
echo "Clearing bootstrap logs" >>/var/log/sailing.err
|
||||
rm /var/log/sailing*
|
||||
@@ -55,17 +45,16 @@ update_root_crontab() {
|
||||
crontab crontab
|
||||
}
|
||||
|
||||
clean_root_ssh_dir() {
|
||||
clean_root_ssh_dir_and_tmp() {
|
||||
echo "Cleaning up /root/.ssh" >>/var/log/sailing.err
|
||||
rm -rf /root/.ssh/*
|
||||
rm -rf /tmp/image-upgrade-finished
|
||||
}
|
||||
|
||||
run_yum_update
|
||||
run_git_pull
|
||||
run_refresh_instance_install_release
|
||||
clean_logrotate_target
|
||||
clean_httpd_logs
|
||||
clean_sailing_logs
|
||||
clean_servers_dir
|
||||
clean_startup_logs
|
||||
update_root_crontab
|
||||
@@ -75,7 +64,7 @@ if /opt/aws/bin/ec2-metadata -d | grep "^no-shutdown$"; then
|
||||
echo "Shutdown disabled by no-shutdown option in user data. Remember to clean /root/.ssh when done."
|
||||
touch /tmp/image-upgrade-finished
|
||||
else
|
||||
# Only clean root's .ssh directory if the next step is shutdown / image creation
|
||||
clean_root_ssh_dir
|
||||
# Only clean root's .ssh directory and /tmp/image-upgrade-finished if the next step is shutdown / image creation
|
||||
clean_root_ssh_dir_and_tmp
|
||||
shutdown -h now &
|
||||
fi
|
||||
|
||||
@@ -55,6 +55,10 @@ start_servers() {
|
||||
else
|
||||
echo "This is a first-time boot. EC2 user data is evaluated for potential application deployment and configuration; reverse proxy entries may be created, and applications are launched." >>/var/log/sailing.err
|
||||
FIRST_SERVER=$( eval $( ${EC2_METADATA_CMD} -d | sed -e 's/^user-data: //' ); echo $SERVER_NAME )
|
||||
if [ "${FIRST_SERVER}" = "" ]; then
|
||||
echo "No SERVER_NAME provided; defaulting to \"server\" as the server directory name" >>/var/log/sailing.err
|
||||
FIRST_SERVER=server
|
||||
fi
|
||||
echo "Server to configure and start: ${FIRST_SERVER}" >>/var/log/sailing.err
|
||||
configure_and_start_server "${FIRST_SERVER}"
|
||||
create_basic_httpd_config "${FIRST_SERVER}"
|
||||
|
||||
@@ -7,7 +7,7 @@ Bundle-Vendor: GOOGLE
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||
Bundle-ClassPath: lib/gwt-dev.jar,
|
||||
.
|
||||
Require-Bundle: javax.servlet;bundle-version="3.1.0"
|
||||
Require-Bundle: org.eclipse.jetty.osgi-servlet-api;bundle-version="3.1.0"
|
||||
Export-Package: com.google.gwt.core.ext,
|
||||
com.google.gwt.core.ext.linker,
|
||||
com.google.gwt.core.ext.linker.impl,
|
||||
|
||||
@@ -175,4 +175,4 @@ Export-Package: com.google.gwt.activity.shared,
|
||||
com.google.web.bindery.requestfactory.vm.testing,
|
||||
javaemul.internal,
|
||||
javaemul.internal.annotations
|
||||
Require-Bundle: javax.servlet;bundle-version="3.1.0"
|
||||
Require-Bundle: org.eclipse.jetty.osgi-servlet-api
|
||||
|
||||
@@ -185,7 +185,7 @@ Export-Package: com.google.gwt.activity.shared,
|
||||
javaemul.internal,
|
||||
javaemul.internal.annotations,
|
||||
jsinterop.annotations
|
||||
Require-Bundle: javax.servlet;bundle-version="3.1.0",
|
||||
Require-Bundle: org.eclipse.jetty.osgi-servlet-api;bundle-version="3.1.0",
|
||||
org.junit;bundle-version="4.8.2";resolution:=optional,
|
||||
com.google.gwt.dev;bundle-version="2.9.0"
|
||||
Automatic-Module-Name: com.google.gwt.user
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
</listAttribute>
|
||||
<booleanAttribute key="org.eclipse.jdt.debug.ui.CONSIDER_INHERITED_MAIN" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
|
||||
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8" javaProject="com.sap.sailing.gwt.ui" path="1" type="4"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="com.sap.sailing.dashboards.gwt"/> </runtimeClasspathEntry> "/>
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<booleanAttribute key="org.eclipse.jdt.debug.ui.CONSIDER_INHERITED_MAIN" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_CLASSPATH_ONLY_JAR" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
|
||||
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8" javaProject="com.sap.sailing.gwt.ui" path="1" type="4"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="com.sap.sailing.dashboards.gwt"/> </runtimeClasspathEntry> "/>
|
||||
|
||||
@@ -9,13 +9,13 @@
|
||||
<head>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/dashboardicon${whitelabeled}.png" />
|
||||
<link href='images/dashboardicon${whitelabeled}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/dashboardicon${applicationScope['clientConfigurationContext.whitelabeled']}.png" />
|
||||
<link href='images/dashboardicon${applicationScope['clientConfigurationContext.whitelabeled']}.png' rel='apple-touch-icon'>
|
||||
<link rel="stylesheet" type="text/css" href="/sailing-fontface-1.0.cache.css">
|
||||
<title>Dashboard</title>
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
|
||||
version="2.5">
|
||||
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
|
||||
version="3.1">
|
||||
|
||||
<listener>
|
||||
<listener-class>com.sap.sse.debranding.ClientConfigurationListener</listener-class>
|
||||
</listener>
|
||||
<servlet>
|
||||
<servlet-name>default</servlet-name>
|
||||
<servlet-class>org.eclipse.jetty.servlet.DefaultServlet
|
||||
@@ -17,14 +20,8 @@
|
||||
<param-value>false</param-value>
|
||||
</init-param>
|
||||
</servlet>
|
||||
|
||||
<servlet>
|
||||
<display-name>ClientConfigurationServlet</display-name>
|
||||
<servlet-name>ClientConfigurationServlet</servlet-name>
|
||||
<servlet-class>com.sap.sse.debranding.ClientConfigurationServlet</servlet-class>
|
||||
</servlet>
|
||||
<servlet-mapping>
|
||||
<servlet-name>ClientConfigurationServlet</servlet-name>
|
||||
<servlet-name>jsp</servlet-name>
|
||||
<url-pattern>*.html</url-pattern>
|
||||
</servlet-mapping>
|
||||
<servlet>
|
||||
|
||||
+10
@@ -53,4 +53,14 @@
|
||||
|
||||
.estimatedDurationWithHeader {
|
||||
margin-top:70px;
|
||||
}
|
||||
|
||||
.raceMapShareLinkButton {
|
||||
margin-right: 10px;
|
||||
margin-bottom: 110px;
|
||||
z-index: 1;
|
||||
border-color: white;
|
||||
width: 28px !important;
|
||||
height: 28px !important;
|
||||
cursor: pointer;
|
||||
}
|
||||
@@ -1,9 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://java.sun.com/xml/ns/javaee"
|
||||
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
|
||||
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
|
||||
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
|
||||
version="3.1">
|
||||
|
||||
<!-- Disable directory listing: -->
|
||||
<servlet>
|
||||
|
||||
@@ -20,5 +20,5 @@ Import-Package: com.sap.sailing.domain.abstractlog.regatta.events,
|
||||
com.sap.sailing.server.impl,
|
||||
com.sap.sailing.server.util,
|
||||
com.sap.sse.concurrent,
|
||||
javax.servlet.http;version="2.5.0"
|
||||
javax.servlet.http;version="3.1.0"
|
||||
Automatic-Module-Name: com.sap.sailing.domain.racelogtrackingadapter.test
|
||||
|
||||
@@ -29,7 +29,7 @@ Import-Package: com.google.zxing;version="3.1.0",
|
||||
javax.mail;version="1.4.0",
|
||||
javax.mail.internet;version="1.4.0",
|
||||
javax.mail.util;version="1.4.0",
|
||||
javax.servlet;version="2.6.0",
|
||||
javax.servlet;version="3.1.0",
|
||||
org.json.simple,
|
||||
org.json.simple.parser,
|
||||
org.osgi.framework;version="1.6.0",
|
||||
|
||||
@@ -21,7 +21,8 @@ Require-Bundle: com.sap.sailing.domain,
|
||||
com.sap.sse,
|
||||
com.sap.sse.common,
|
||||
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
|
||||
com.sap.sailing.domain.shared.android
|
||||
com.sap.sailing.domain.shared.android,
|
||||
com.sap.sse.replication.interfaces
|
||||
Bundle-ClassPath: resources/,
|
||||
.
|
||||
Import-Package: com.sap.sailing.server
|
||||
|
||||
@@ -71,26 +71,20 @@
|
||||
<plugin id="com.sap.sailing.xrr.resultimport" autoStart="true" startLevel="4" />
|
||||
<plugin id="com.sap.sailing.yachtscoring.resultimport" autoStart="true" startLevel="4" />
|
||||
<plugin id="com.sap.sse.filestorage" autoStart="true" startLevel="4" />
|
||||
<plugin id="com.sap.sse.landscape.aws" autoStart="true" startLevel="4" />
|
||||
<plugin id="com.sap.sse.mail" autoStart="true" startLevel="5" />
|
||||
<plugin id="com.sap.sse.replication" autoStart="true" startLevel="6" />
|
||||
<plugin id="com.sap.sse.security.ui" autoStart="true" startLevel="6" />
|
||||
<plugin id="com.sap.sse.security.userstore.mongodb" autoStart="true" startLevel="4" />
|
||||
<plugin id="com.sap.sse.landscape.aws" autoStart="true" startLevel="4" />
|
||||
<plugin id="org.apache.felix.shell" autoStart="true" startLevel="0" />
|
||||
<plugin id="org.apache.felix.shell.remote" autoStart="true" startLevel="0" />
|
||||
<plugin id="org.apache.felix.shell.remote" autoStart="true" startLevel="4"/>
|
||||
<plugin id="org.apache.felix.shell" autoStart="true" startLevel="4"/>
|
||||
<plugin id="org.apache.aries.spifly.dynamic.bundle" autoStart="true" startLevel="3" />
|
||||
<plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
|
||||
<plugin id="org.eclipse.equinox.simpleconfigurator" autoStart="true" startLevel="2" />
|
||||
<plugin id="org.eclipse.jetty.deploy" autoStart="true" startLevel="4" />
|
||||
<plugin id="org.eclipse.jetty.http" autoStart="true" startLevel="4" />
|
||||
<plugin id="org.eclipse.jetty.io" autoStart="true" startLevel="4" />
|
||||
<plugin id="org.eclipse.jetty.jmx" autoStart="true" startLevel="4" />
|
||||
<plugin id="org.eclipse.jetty.apache-jsp" autoStart="true" startLevel="4"/>
|
||||
<plugin id="org.eclipse.jetty.annotations" autoStart="true" startLevel="4"/>
|
||||
<plugin id="org.eclipse.jetty.http" autoStart="true" startLevel="3"/>
|
||||
<plugin id="org.eclipse.jetty.osgi.boot" autoStart="true" startLevel="3" />
|
||||
<plugin id="org.eclipse.jetty.security" autoStart="true" startLevel="4" />
|
||||
<plugin id="org.eclipse.jetty.server" autoStart="true" startLevel="4" />
|
||||
<plugin id="org.eclipse.jetty.servlet" autoStart="true" startLevel="4" />
|
||||
<plugin id="org.eclipse.jetty.util" autoStart="true" startLevel="4" />
|
||||
<plugin id="org.eclipse.jetty.webapp" autoStart="true" startLevel="4" />
|
||||
<plugin id="org.eclipse.jetty.xml" autoStart="true" startLevel="4" />
|
||||
<plugin id="org.eclipse.osgi" autoStart="true" startLevel="-1" />
|
||||
<property name="osgi.noShutdown" value="true" />
|
||||
<property name="eclipse.ignoreApp" value="true" />
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
# If one or more launch configuration files are provided as the remaining arguments, they will be patched in-place by
|
||||
# replacing the selected_workspace_bundles and selected_target_bundles string attributes by those generated by this script.
|
||||
# If the launch configuration's name contains the sub-string winddbTest, the additional bundle
|
||||
# com.sap.sailing.server.gateway.test.support@default:default
|
||||
# com.sap.sailing.server.gateway.test.support@5:true
|
||||
# is added to the workspace-bundles string.
|
||||
|
||||
# The product consists of the features and plugins it lists. Its <configuration> section overrides
|
||||
@@ -82,7 +82,7 @@ while [ "$2" != "" ]; do
|
||||
else
|
||||
echo "Patching $2 ..."
|
||||
if echo "$2" | grep -q winddbTest; then
|
||||
patched_workspace_bundles="${workspace_bundles}${NL}<setEntry value=\"com.sap.sailing.server.gateway.test.support\@default:default\"\/>${NL}"
|
||||
patched_workspace_bundles="${workspace_bundles}${NL}<setEntry value=\"com.sap.sailing.server.gateway.test.support\@5:true\"\/>${NL}"
|
||||
else
|
||||
patched_workspace_bundles="${workspace_bundles}"
|
||||
fi
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
id="org.objectweb.asm"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="5.0.1.v201404251740"
|
||||
version="9.0.0.v20201001-1419"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
|
||||
@@ -16,13 +16,13 @@
|
||||
<!-- -->
|
||||
<!-- Consider inlining CSS to reduce the number of requested files -->
|
||||
<!-- -->
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
|
||||
|
||||
<!-- -->
|
||||
<!-- Any title is fine -->
|
||||
<!-- -->
|
||||
<title>${SAP}Sailing Analytics Administration Console</title>
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing Analytics Administration Console</title>
|
||||
|
||||
<!-- AdminConsole is not prepared to work with nomalize. -->
|
||||
<!-- <link rel="stylesheet" type="text/css" href="/sailing-normalize-3.0.2.cache.css"> -->
|
||||
@@ -38,7 +38,7 @@
|
||||
<script type="text/javascript" src="qrcode/qrcode.min.js"></script>
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
</script>
|
||||
<!-- -->
|
||||
@@ -135,7 +135,7 @@
|
||||
</noscript>
|
||||
|
||||
<div id="loading" class="loading">
|
||||
<p class="sapsailing">${SAP}Sailing Analytics</p>
|
||||
<p class="sapsailing">${applicationScope['clientConfigurationContext.SAP']}Sailing Analytics</p>
|
||||
<p class="waitmessage">Loading, please wait...</p>
|
||||
<div class="signal"></div>
|
||||
</div>
|
||||
|
||||
@@ -18,13 +18,13 @@
|
||||
<!-- -->
|
||||
<!-- Consider inlining CSS to reduce the number of requested files -->
|
||||
<!-- -->
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<link href='images/sap-sailing-app-icon${whitelabeled}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
<link href='images/sap-sailing-app-icon${applicationScope['clientConfigurationContext.whitelabeled']}.png' rel='apple-touch-icon'>
|
||||
|
||||
<!-- -->
|
||||
<!-- Any title is fine -->
|
||||
<!-- -->
|
||||
<title>${SAP}Sailing Analytics AutoPlay</title>
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing Analytics AutoPlay</title>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/sailing-reset-2.0.cache.css">
|
||||
<link rel="stylesheet" type="text/css" href="/sailing-normalize-3.0.2.cache.css">
|
||||
@@ -45,7 +45,7 @@
|
||||
</script>
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="com.sap.sailing.gwt.autoplay.AutoPlay/com.sap.sailing.gwt.autoplay.AutoPlay.nocache.js"></script>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
<title>Your browser is unsupported</title>
|
||||
|
||||
</head>
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
• Provide the media with information and insights to deliver a greater informed commentary" />
|
||||
<meta property="og:image" content="http://media.sapsailing.com/2014/505Worlds/Images_Homepage/505Worlds2014_eventteaser.jpg" />
|
||||
<!-- <link href='iphone-splash-screen.png' rel='apple-touch-startup-image'> -->
|
||||
<link href='images/sap-sailing-app-icon${whitelabeled}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<link href='images/sap-sailing-app-icon${applicationScope['clientConfigurationContext.whitelabeled']}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
|
||||
<!-- This module isn't compatible with normalize. -->
|
||||
<!-- <link rel="stylesheet" type="text/css" href="/sailing-normalize-3.0.2.cache.css"> -->
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="stylesheet" type="text/css" href="DataMining.css">
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
<meta http-equiv="REFRESH" content="0; url=/browser-info.html">
|
||||
<![endif]-->
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<title>${SAP}Sailing Analytics Race Board</title>
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing Analytics Race Board</title>
|
||||
<meta content='width = device-width, initial-scale = 1.0, user-scalable = yes' name='viewport'>
|
||||
<meta content='yes' name='apple-mobile-web-app-capable'>
|
||||
<meta content='black' name='apple-mobile-web-app-status-bar-style'>
|
||||
<!-- <link href='iphone-splash-screen.png' rel='apple-touch-startup-image'> -->
|
||||
<link href='images/sap-sailing-app-icon${whitelabeled}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<link href='images/sap-sailing-app-icon${applicationScope['clientConfigurationContext.whitelabeled']}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
<!--<link href='http://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700,300italic,400italic,500italic,700italic' rel='stylesheet' type='text/css'>-->
|
||||
<!-- <link href='http://fonts.googleapis.com/css?family=Open+Sans+Condensed:700,300,300italic' rel='stylesheet' type='text/css'>-->
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" language="javascript" src="com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart/com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart.nocache.js"></script>
|
||||
@@ -109,7 +109,7 @@
|
||||
</noscript>
|
||||
|
||||
<div id="loading" class="loading">
|
||||
<p class="sapsailing">${SAP}Sailing Analytics</p>
|
||||
<p class="sapsailing">${applicationScope['clientConfigurationContext.SAP']}Sailing Analytics</p>
|
||||
<p class="waitmessage">Loading, please wait...</p>
|
||||
<div class="signal"></div>
|
||||
</div>
|
||||
|
||||
@@ -1,114 +1,114 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<launchConfiguration type="com.gwtplugins.gdt.eclipse.suite.webapp">
|
||||
<booleanAttribute key="com.gwtplugins.gdt.eclipse.core.RUN_SERVER" value="false"/>
|
||||
<stringAttribute key="com.gwtplugins.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.DevMode"/>
|
||||
<booleanAttribute key="com.gwtplugins.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
|
||||
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9876"/>
|
||||
<listAttribute key="com.gwtplugins.gwt.eclipse.core.ENTRY_POINT_MODULES">
|
||||
<listEntry value="com.sap.sailing.gwt.ui.YoutubePopup"/>
|
||||
<listEntry value="com.sap.sailing.gwt.ui.VideoPopup"/>
|
||||
<listEntry value="com.sap.sailing.gwt.ui.RaceBoard"/>
|
||||
<listEntry value="com.sap.sailing.gwt.ui.AdminConsole"/>
|
||||
<listEntry value="com.sap.sailing.gwt.home.Home"/>
|
||||
</listAttribute>
|
||||
<booleanAttribute key="com.gwtplugins.gwt.eclipse.core.SUPERDEVMODE_ENABLED" value="true"/>
|
||||
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.URL" value="/gwt/Home.html"/>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||
<listEntry value="/com.sap.sailing.gwt.ui"/>
|
||||
</listAttribute>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||
<listEntry value="4"/>
|
||||
</listAttribute>
|
||||
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
|
||||
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
|
||||
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
|
||||
</listAttribute>
|
||||
<booleanAttribute key="org.eclipse.jdt.debug.ui.CONSIDER_INHERITED_MAIN" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
|
||||
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8" javaProject="com.sap.sailing.gwt.ui" path="1" type="4"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src/main/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.googlecode.java-diff-utils/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.shared.android/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.datamining.annotations/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.security.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.shared.android/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.json.simple/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.geocoding/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.datamining.shared/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.declination/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.datamining.ui/src/main/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.declination/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.server/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.server/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.expeditionconnector/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.udpconnector/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.server.gateway.serialization.shared.android/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.expeditionconnector.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.filestorage/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.filestorage/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.mongodb/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.replication/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.operationaltransformation/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.expeditionconnector.persistence/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.persistence/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.server.gateway.serialization/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.simulator/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.simulator/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.tractracadapter/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.tractrac.clientmodule/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.security/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.security/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.mail/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.swisstimingadapter/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.xrr.resultimport/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.resultimport/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.competitorimport/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.xrr.schema/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.swisstimingadapter.persistence/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.tractracadapter.persistence/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.moxieapps.gwt.highcharts/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.freg.resultimport/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.swisstimingreplayadapter/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.igtimiadapter/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.igtimiadapter.persistence/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.datamining.shared/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.datamining/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.datamining/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.datamining/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.datamining/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.datamining.provider/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.racelogtrackingadapter/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.racelogtrackingadapter/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.manage2sail/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.manage2sail/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.xrr.structureimport/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.security.ui/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.security.ui/src/main/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt.adminconsole/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.news/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.polars.datamining.shared/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.polars.datamining/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.polars.datamining/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="com.sap.sailing.gwt.ui"/> </runtimeClasspathEntry> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="com.sap.sse.common" type="1"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.datamining.ui/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.github.branflake2267.gwt-maps-api/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.google.gwt.ajaxloader/src" path="3" type="2"/> "/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.gwtplugins.gwt.eclipse.core.moduleClasspathProvider"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.MODULE_NAME" value="com.sap.sailing.gwt.ui"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-style PRETTY -incremental -war "${project_loc:com.sap.sailing.gwt.ui}" -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -logLevel INFO -codeServerPort 9876 -startupUrl /gwt/Home.html -startupUrl /gwt/AdminConsole.html -startupUrl /gwt/PairingList.html -startupUrl /gwt/LeaderboardEditing.html -startupUrl /gwt/Leaderboard.html -startupUrl /gwt/Spectator.html -startupUrl /gwt/EmbeddedMapAndWindChart -startupUrl /gwt/RaceBoard.html -startupUrl /gwt/RegattaOverview.html -startupUrl /gwt/DataMining.html -startupUrl /gwt/Simulator.html -startupUrl /gwt/VideoPopup.html -startupUrl /gwt/AutoPlay.html -startupUrl /gwt/YoutubePopup.html com.sap.sailing.gwt.home.Home com.sap.sailing.gwt.ui.AdminConsole com.sap.sailing.gwt.ui.RaceBoard com.sap.sailing.gwt.ui.VideoPopup com.sap.sailing.gwt.ui.YoutubePopup"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.gwt.ui"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XX:+UseG1GC -XX:+UseStringDeduplication -Dgwt.watchFileChanges=false -Xmx2048m -Dgwt-usearchives=false -Dgwt.persistentunitcache=false"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work"/>
|
||||
<booleanAttribute key="com.gwtplugins.gdt.eclipse.core.RUN_SERVER" value="false"/>
|
||||
<stringAttribute key="com.gwtplugins.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.DevMode"/>
|
||||
<booleanAttribute key="com.gwtplugins.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
|
||||
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9876"/>
|
||||
<listAttribute key="com.gwtplugins.gwt.eclipse.core.ENTRY_POINT_MODULES">
|
||||
<listEntry value="com.sap.sailing.gwt.ui.YoutubePopup"/>
|
||||
<listEntry value="com.sap.sailing.gwt.ui.VideoPopup"/>
|
||||
<listEntry value="com.sap.sailing.gwt.ui.RaceBoard"/>
|
||||
<listEntry value="com.sap.sailing.gwt.ui.AdminConsole"/>
|
||||
<listEntry value="com.sap.sailing.gwt.home.Home"/>
|
||||
</listAttribute>
|
||||
<booleanAttribute key="com.gwtplugins.gwt.eclipse.core.SUPERDEVMODE_ENABLED" value="true"/>
|
||||
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.URL" value="/gwt/Home.html"/>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||
<listEntry value="/com.sap.sailing.gwt.ui"/>
|
||||
</listAttribute>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||
<listEntry value="4"/>
|
||||
</listAttribute>
|
||||
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
|
||||
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
|
||||
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
|
||||
</listAttribute>
|
||||
<booleanAttribute key="org.eclipse.jdt.debug.ui.CONSIDER_INHERITED_MAIN" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
|
||||
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8" javaProject="com.sap.sailing.gwt.ui" path="1" type="4"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src/main/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.googlecode.java-diff-utils/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.shared.android/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.datamining.annotations/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.security.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.shared.android/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.json.simple/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.geocoding/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.datamining.shared/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.declination/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.datamining.ui/src/main/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.declination/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.server/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.server/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.expeditionconnector/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.udpconnector/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.server.gateway.serialization.shared.android/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.expeditionconnector.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.filestorage/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.filestorage/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.mongodb/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.replication/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.operationaltransformation/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.expeditionconnector.persistence/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.persistence/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.server.gateway.serialization/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.simulator/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.simulator/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.tractracadapter/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.tractrac.clientmodule/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.security/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.security/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.mail/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.swisstimingadapter/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.xrr.resultimport/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.resultimport/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.competitorimport/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.xrr.schema/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.swisstimingadapter.persistence/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.tractracadapter.persistence/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.moxieapps.gwt.highcharts/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.freg.resultimport/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.swisstimingreplayadapter/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.igtimiadapter/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.igtimiadapter.persistence/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.datamining.shared/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.datamining/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.datamining/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.datamining/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.datamining/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.datamining.provider/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.racelogtrackingadapter/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.racelogtrackingadapter/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.manage2sail/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.manage2sail/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.xrr.structureimport/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.security.ui/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.security.ui/src/main/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt.adminconsole/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.news/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.polars.datamining.shared/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.polars.datamining/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.polars.datamining/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="com.sap.sailing.gwt.ui"/> </runtimeClasspathEntry> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="com.sap.sse.common" type="1"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.datamining.ui/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.github.branflake2267.gwt-maps-api/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.google.gwt.ajaxloader/src" path="3" type="2"/> "/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.gwtplugins.gwt.eclipse.core.moduleClasspathProvider"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.MODULE_NAME" value="com.sap.sailing.gwt.ui"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-style PRETTY -incremental -war "${project_loc:com.sap.sailing.gwt.ui}" -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -logLevel INFO -codeServerPort 9876 -startupUrl /gwt/Home.html -startupUrl /gwt/AdminConsole.html -startupUrl /gwt/PairingList.html -startupUrl /gwt/LeaderboardEditing.html -startupUrl /gwt/Leaderboard.html -startupUrl /gwt/Spectator.html -startupUrl /gwt/EmbeddedMapAndWindChart -startupUrl /gwt/RaceBoard.html -startupUrl /gwt/RegattaOverview.html -startupUrl /gwt/DataMining.html -startupUrl /gwt/Simulator.html -startupUrl /gwt/VideoPopup.html -startupUrl /gwt/AutoPlay.html -startupUrl /gwt/YoutubePopup.html com.sap.sailing.gwt.home.Home com.sap.sailing.gwt.ui.AdminConsole com.sap.sailing.gwt.ui.RaceBoard com.sap.sailing.gwt.ui.VideoPopup com.sap.sailing.gwt.ui.YoutubePopup"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.gwt.ui"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XX:+UseG1GC -XX:+UseStringDeduplication -Dgwt.watchFileChanges=false -Xmx2048m -Dgwt-usearchives=false -Dgwt.persistentunitcache=false"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work"/>
|
||||
</launchConfiguration>
|
||||
|
||||
@@ -4,13 +4,14 @@
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:title" content="SAP Sailing" />
|
||||
<meta property="og:title" content="${applicationScope['clientConfigurationContext.SAP']} Sailing" />
|
||||
<meta property="og:description" content="Help sailors analyze performance and optimize strategy • Bring fans closer to the action
|
||||
• Provide the media with information and insights to deliver a greater informed commentary" />
|
||||
<meta property="og:image" content="http://media.sapsailing.com/2014/505Worlds/Images_Homepage/505Worlds2014_eventteaser.jpg" /> <link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" selenium-id="shortcutIcon"/>
|
||||
<link href='images/sap-sailing-app-icon${whitelabeled}.png' rel='apple-touch-icon' selenium-id="appIcon">
|
||||
<meta property="og:image" content="http://media.sapsailing.com/2014/505Worlds/Images_Homepage/505Worlds2014_eventteaser.jpg" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" selenium-id="shortcutIcon"/>
|
||||
<link href='images/sap-sailing-app-icon${applicationScope['clientConfigurationContext.whitelabeled']}.png' rel='apple-touch-icon' selenium-id="appIcon">
|
||||
|
||||
<title>${SAP}Sailing - Homepage</title>
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing - Homepage</title>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/sailing-normalize-3.0.2.cache.css">
|
||||
<link rel="stylesheet" type="text/css" href="/sailing-fontface-1.0.cache.css">
|
||||
@@ -27,8 +28,9 @@
|
||||
<script src="https://js.chargebee.com/v2/chargebee.js"></script>
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
//Current date is: <%=new java.util.Date()%>
|
||||
</script>
|
||||
<script src="com.sap.sailing.gwt.home.Home/com.sap.sailing.gwt.home.Home.nocache.js"></script>
|
||||
<style type="text/css">
|
||||
@@ -106,7 +108,7 @@
|
||||
application to display correctly.</div>
|
||||
</noscript>
|
||||
<div id="loading" class="loading">
|
||||
<p class="sapsailing">${SAP}Sailing Analytics</p>
|
||||
<p class="sapsailing">${applicationScope['clientConfigurationContext.SAP']}Sailing Analytics</p>
|
||||
<p class="waitmessage">Loading, please wait...</p>
|
||||
<div class="signal"></div>
|
||||
</div>
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
<meta property="og:description" content="Help sailors analyze performance and optimize strategy • Bring fans closer to the action
|
||||
• Provide the media with information and insights to deliver a greater informed commentary" />
|
||||
<meta property="og:image" content="http://media.sapsailing.com/2014/505Worlds/Images_Homepage/505Worlds2014_eventteaser.jpg" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<link href='images/sap-sailing-app-icon${whitelabeled}.png' rel='apple-touch-icon'>
|
||||
<title>${SAP}Sailing - Homepage</title>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
<link href='images/sap-sailing-app-icon${applicationScope['clientConfigurationContext.whitelabeled']}.png' rel='apple-touch-icon'>
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing - Homepage</title>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
<meta property="og:description" content="Help sailors analyze performance and optimize strategy • Bring fans closer to the action
|
||||
• Provide the media with information and insights to deliver a greater informed commentary" />
|
||||
<meta property="og:image" content="http://media.sapsailing.com/2014/505Worlds/Images_Homepage/505Worlds2014_eventteaser.jpg" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<link href='images/sap-sailing-app-icon${whitelabeled}.png' rel='apple-touch-icon'>
|
||||
<title>${SAP}Sailing - Homepage</title>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
<link href='images/sap-sailing-app-icon${applicationScope['clientConfigurationContext.whitelabeled']}.png' rel='apple-touch-icon'>
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing - Homepage</title>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<meta http-equiv="REFRESH" content="0; url=http://www.sapsailing.com/browser-info.html">
|
||||
<![endif]-->
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<title>${SAP}Sailing Analytics Leaderboard</title>
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing Analytics Leaderboard</title>
|
||||
<meta content='width = device-width, initial-scale = 1.0, user-scalable = yes' name='viewport'>
|
||||
<meta content='yes' name='apple-mobile-web-app-capable'>
|
||||
<meta content='black' name='apple-mobile-web-app-status-bar-style'>
|
||||
@@ -16,8 +16,8 @@
|
||||
• Provide the media with information and insights to deliver a greater informed commentary" />
|
||||
<meta property="og:image" content="http://media.sapsailing.com/2014/505Worlds/Images_Homepage/505Worlds2014_eventteaser.jpg" />
|
||||
<!-- <link href='iphone-splash-screen.png' rel='apple-touch-startup-image'> -->
|
||||
<link href='images/sap-sailing-app-icon${whitelabeled}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<link href='images/sap-sailing-app-icon${applicationScope['clientConfigurationContext.whitelabeled']}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/sailing-normalize-3.0.2.cache.css">
|
||||
<link rel="stylesheet" type="text/css" href="/sailing-fontface-1.0.cache.css">
|
||||
@@ -26,7 +26,7 @@
|
||||
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="com.sap.sailing.gwt.ui.Leaderboard/com.sap.sailing.gwt.ui.Leaderboard.nocache.js"></script>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<meta property="og:description" content="Help sailors analyze performance and optimize strategy • Bring fans closer to the action
|
||||
• Provide the media with information and insights to deliver a greater informed commentary" />
|
||||
<meta property="og:image" content="http://media.sapsailing.com/2014/505Worlds/Images_Homepage/505Worlds2014_eventteaser.jpg" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
|
||||
<!-- -->
|
||||
<!-- Consider inlining CSS to reduce the number of requested files -->
|
||||
@@ -22,7 +22,7 @@
|
||||
<!-- -->
|
||||
<!-- Any title is fine -->
|
||||
<!-- -->
|
||||
<title>${SAP}Sailing Analytics Leaderboard Editing</title>
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing Analytics Leaderboard Editing</title>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/clean/sailing-clean-1.0.cache.css">
|
||||
<link rel="stylesheet" type="text/css" href="/sailing-fontface-1.0.cache.css">
|
||||
@@ -30,7 +30,7 @@
|
||||
<link rel="stylesheet" type="text/css" href="Leaderboard.css">
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
</script>
|
||||
<!-- -->
|
||||
|
||||
@@ -16,13 +16,13 @@
|
||||
<!-- -->
|
||||
<!-- Consider inlining CSS to reduce the number of requested files -->
|
||||
<!-- -->
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
|
||||
|
||||
<!-- -->
|
||||
<!-- Any title is fine -->
|
||||
<!-- -->
|
||||
<title>${SAP}Sailing Analytics Administration Console</title>
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing Analytics Administration Console</title>
|
||||
|
||||
<!-- AdminConsole is not prepared to work with nomalize. -->
|
||||
<!-- <link rel="stylesheet" type="text/css" href="/sailing-normalize-3.0.2.cache.css"> -->
|
||||
@@ -38,7 +38,7 @@
|
||||
<script type="text/javascript" src="qrcode/qrcode.min.js"></script>
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
</script>
|
||||
<!-- -->
|
||||
@@ -135,7 +135,7 @@
|
||||
</noscript>
|
||||
|
||||
<div id="loading" class="loading">
|
||||
<p class="sapsailing">${SAP}Sailing Analytics</p>
|
||||
<p class="sapsailing">${applicationScope['clientConfigurationContext.SAP']}Sailing Analytics</p>
|
||||
<p class="waitmessage">Loading, please wait...</p>
|
||||
<div class="signal"></div>
|
||||
</div>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<meta http-equiv="REFRESH" content="0; url=http://www.sapsailing.com/browser-info.html">
|
||||
<![endif]-->
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<title>${SAP}Sailing Analytics PairingList</title>
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing Analytics PairingList</title>
|
||||
<meta content='width = device-width, initial-scale = 1.0, user-scalable = yes' name='viewport'>
|
||||
<meta content='yes' name='apple-mobile-web-app-capable'>
|
||||
<meta content='black' name='apple-mobile-web-app-status-bar-style'>
|
||||
@@ -16,8 +16,8 @@
|
||||
• Provide the media with information and insights to deliver a greater informed commentary" />
|
||||
<meta property="og:image" content="http://media.sapsailing.com/2014/505Worlds/Images_Homepage/505Worlds2014_eventteaser.jpg" />
|
||||
<!-- <link href='iphone-splash-screen.png' rel='apple-touch-startup-image'> -->
|
||||
<link href='images/sap-sailing-app-icon${whitelabeled}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<link href='images/sap-sailing-app-icon${applicationScope['clientConfigurationContext.whitelabeled']}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/sailing-normalize-3.0.2.cache.css">
|
||||
<link rel="stylesheet" type="text/css" href="/sailing-fontface-1.0.cache.css">
|
||||
@@ -26,7 +26,7 @@
|
||||
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="com.sap.sailing.gwt.ui.PairingList/com.sap.sailing.gwt.ui.PairingList.nocache.js"></script>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<meta http-equiv="REFRESH" content="0; url=http://www.sapsailing.com/browser-info.html">
|
||||
<![endif]-->
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<title>${SAP}Sailing Analytics Race Board</title>
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing Analytics Race Board</title>
|
||||
<meta content='width = device-width, initial-scale = 1.0, user-scalable = yes' name='viewport'>
|
||||
<meta content='yes' name='apple-mobile-web-app-capable'>
|
||||
<meta content='black' name='apple-mobile-web-app-status-bar-style'>
|
||||
@@ -16,8 +16,8 @@
|
||||
• Provide the media with information and insights to deliver a greater informed commentary" />
|
||||
<meta property="og:image" content="http://media.sapsailing.com/2014/505Worlds/Images_Homepage/505Worlds2014_eventteaser.jpg" />
|
||||
<!-- <link href='iphone-splash-screen.png' rel='apple-touch-startup-image'> -->
|
||||
<link href='images/sap-sailing-app-icon${whitelabeled}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<link href='images/sap-sailing-app-icon${applicationScope['clientConfigurationContext.whitelabeled']}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
<!--<link href='http://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700,300italic,400italic,500italic,700italic' rel='stylesheet' type='text/css'>-->
|
||||
<!-- <link href='http://fonts.googleapis.com/css?family=Open+Sans+Condensed:700,300,300italic' rel='stylesheet' type='text/css'>-->
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
</script>
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" language="javascript" src="com.sap.sailing.gwt.ui.RaceBoard/com.sap.sailing.gwt.ui.RaceBoard.nocache.js"></script>
|
||||
|
||||
@@ -13,15 +13,15 @@
|
||||
<meta property="og:description" content="Help sailors analyze performance and optimize strategy • Bring fans closer to the action
|
||||
• Provide the media with information and insights to deliver a greater informed commentary" />
|
||||
<meta property="og:image" content="http://media.sapsailing.com/2014/505Worlds/Images_Homepage/505Worlds2014_eventteaser.jpg" />
|
||||
<link href='images/sap-sailing-app-icon${whitelabeled}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<link href='images/sap-sailing-app-icon${applicationScope['clientConfigurationContext.whitelabeled']}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
|
||||
<title>${SAP}Sailing Analytics Regatta Overview</title>
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing Analytics Regatta Overview</title>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/sailing-fontface-1.0.cache.css">
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
</script>
|
||||
<script
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<title>${SAP}Sailing Analytics Race Simulator</title>
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing Analytics Race Simulator</title>
|
||||
<meta content='width = device-width, initial-scale = 1.0, user-scalable = yes' name='viewport'>
|
||||
<meta content='yes' name='apple-mobile-web-app-capable'>
|
||||
<meta content='black' name='apple-mobile-web-app-status-bar-style'>
|
||||
@@ -13,8 +13,8 @@
|
||||
• Provide the media with information and insights to deliver a greater informed commentary" />
|
||||
<meta property="og:image" content="http://media.sapsailing.com/2014/505Worlds/Images_Homepage/505Worlds2014_eventteaser.jpg" />
|
||||
<!-- <link href='iphone-splash-screen.png' rel='apple-touch-startup-image'> -->
|
||||
<link href='images/sap-sailing-app-icon${whitelabeled}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<link href='images/sap-sailing-app-icon${applicationScope['clientConfigurationContext.whitelabeled']}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
<!--<link href='http://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700,300italic,400italic,500italic,700italic' rel='stylesheet' type='text/css'>-->
|
||||
<!-- <link href='http://fonts.googleapis.com/css?family=Open+Sans+Condensed:700,300,300italic' rel='stylesheet' type='text/css'>-->
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="com.sap.sailing.gwt.ui.Simulator/com.sap.sailing.gwt.ui.Simulator.nocache.js"></script>
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
• Provide the media with information and insights to deliver a greater informed commentary" />
|
||||
<meta property="og:image" content="http://media.sapsailing.com/2014/505Worlds/Images_Homepage/505Worlds2014_eventteaser.jpg" />
|
||||
<!-- <link href='iphone-splash-screen.png' rel='apple-touch-startup-image'> -->
|
||||
<link href='images/sap-sailing-app-icon${whitelabeled}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<link href='images/sap-sailing-app-icon${applicationScope['clientConfigurationContext.whitelabeled']}.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
|
||||
<!--<link href='http://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700,300italic,400italic,500italic,700italic' rel='stylesheet' type='text/css'>-->
|
||||
<!-- -->
|
||||
@@ -29,7 +29,7 @@
|
||||
<!-- -->
|
||||
<!-- Any title is fine -->
|
||||
<!-- -->
|
||||
<title>${SAP}Sailing Analytics Spectator Vision</title>
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing Analytics Spectator Vision</title>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/sailing-normalize-3.0.2.cache.css">
|
||||
<link rel="stylesheet" type="text/css" href="/clean/sailing-clean-1.0.cache.css">
|
||||
@@ -37,7 +37,7 @@
|
||||
<link rel="stylesheet" type="text/css" href="Spectator.css">
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
</script>
|
||||
<!-- -->
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<title>${SAP}Sailing Video</title>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing Video</title>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" language="javascript" src="com.sap.sailing.gwt.ui.VideoPopup/com.sap.sailing.gwt.ui.VideoPopup.nocache.js"></script>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://java.sun.com/xml/ns/javaee"
|
||||
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
|
||||
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
|
||||
version="3.1">
|
||||
|
||||
<!-- Disable directory listing: -->
|
||||
<servlet>
|
||||
@@ -17,7 +17,6 @@
|
||||
<param-value>false</param-value>
|
||||
</init-param>
|
||||
</servlet>
|
||||
|
||||
<!-- Apache Shiro -->
|
||||
<context-param>
|
||||
<param-name>shiroEnvironmentClass</param-name>
|
||||
@@ -59,14 +58,11 @@
|
||||
<filter-name>LocaleInjectionFilter</filter-name>
|
||||
<url-pattern>*.html</url-pattern>
|
||||
</filter-mapping>
|
||||
|
||||
<servlet>
|
||||
<display-name>ClientConfigurationServlet</display-name>
|
||||
<servlet-name>ClientConfigurationServlet</servlet-name>
|
||||
<servlet-class>com.sap.sse.debranding.ClientConfigurationServlet</servlet-class>
|
||||
</servlet>
|
||||
<listener>
|
||||
<listener-class>com.sap.sse.debranding.ClientConfigurationListener</listener-class>
|
||||
</listener>
|
||||
<servlet-mapping>
|
||||
<servlet-name>ClientConfigurationServlet</servlet-name>
|
||||
<servlet-name>jsp</servlet-name>
|
||||
<url-pattern>*.html</url-pattern>
|
||||
</servlet-mapping>
|
||||
<servlet>
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<title>${SAP}Sailing Video</title>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${whitelabeled}.ico" />
|
||||
<title>${applicationScope['clientConfigurationContext.SAP']}Sailing Video</title>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap${applicationScope['clientConfigurationContext.whitelabeled']}.ico" />
|
||||
<script>
|
||||
document.clientConfigurationContext = {
|
||||
debrandingActive: ${debrandingActive}
|
||||
debrandingActive: ${applicationScope['clientConfigurationContext.debrandingActive']}
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" language="javascript" src="com.sap.sailing.gwt.ui.YoutubePopup/com.sap.sailing.gwt.ui.YoutubePopup.nocache.js"></script>
|
||||
|
||||
@@ -56,5 +56,6 @@ bin.includes = META-INF/,\
|
||||
PairingList.html,\
|
||||
com.sap.sailing.gwt.ui.PairingList/,\
|
||||
src/main/resources/com/sap/sailing/gwt/ui/client/images/boatclass/,\
|
||||
src/main/resources/com/sap/sailing/gwt/home/shared/
|
||||
src/main/resources/com/sap/sailing/gwt/home/shared/,\
|
||||
example.jsp
|
||||
output.. = WEB-INF/classes/
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
<%@page import="java.util.ArrayList"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>Java Code Geeks Snippets - Sample JSP Page</title>
|
||||
<meta>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
|
||||
</meta>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<c:out value="Jetty JSP Example, remove it when everything is set up."></c:out>
|
||||
<br />
|
||||
Current date is: <%=new java.util.Date()%>
|
||||
${applicationScope['org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern']}
|
||||
</body>
|
||||
</html>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 546 B |
+3
-1
@@ -76,7 +76,9 @@ public class LiveRaceBoardNode extends FiresPlaceNode implements RaceTimesInfoPr
|
||||
null, /** leaderboardGroupId */
|
||||
null, /** eventId */
|
||||
null, cf.getErrorReporter(), StringMessages.INSTANCE, null, raceTimesInfoProvider, true, false,
|
||||
Arrays.asList(DetailType.values()), result.getLeaderboard(), result.getRace(), result.getTrackingConnectorInfo(), cf.getSailingServiceWrite());
|
||||
Arrays.asList(DetailType.values()), result.getLeaderboard(), result.getRace(),
|
||||
result.getTrackingConnectorInfo(), cf.getSailingServiceWrite(),
|
||||
/* raceboardContextDefinition */ null);
|
||||
setPlaceToGo(new LiveRaceWithRaceboardPlace(raceboardPerspective));
|
||||
firePlaceChangeAndStartTimer();
|
||||
getBus().fireEvent(new AutoPlayHeaderEvent(cf.getAutoPlayCtxSignalError().getLifeOrPreLiveRace().getRegattaName(),
|
||||
|
||||
+3
-2
@@ -85,7 +85,8 @@ public class AutoplayHelper {
|
||||
}
|
||||
}
|
||||
if (raceTimesInfoProvider.getRaceIdentifiers().isEmpty()) {
|
||||
LOGGER.severe("No raceidentifier was found, cannot determine currently LifeRace, check event configuration");
|
||||
LOGGER.warning(
|
||||
"No raceidentifier was found. Can not determine current live race. Check event configuration in case you expect a race to be in live state.");
|
||||
callback.onSuccess(null);
|
||||
}
|
||||
raceTimesInfoProvider.addRaceTimesInfoProviderListener(new RaceTimesInfoProviderListener() {
|
||||
@@ -180,7 +181,7 @@ public class AutoplayHelper {
|
||||
public static void create(SailingServiceAsync sailingService, ErrorReporter errorReporter, String leaderBoardName,
|
||||
UUID eventId, EventDTO event, EventBus eventBus, SailingDispatchSystem sailingDispatchSystem,
|
||||
RegattaAndRaceIdentifier regattaAndRaceIdentifier, AsyncCallback<RVWrapper> callback) {
|
||||
LOGGER.severe("Creating map for " + regattaAndRaceIdentifier);
|
||||
LOGGER.info("Creating map for " + regattaAndRaceIdentifier);
|
||||
Timer creationTimer = new Timer(PlayModes.Live, /* delayBetweenAutoAdvancesInMilliseconds */1000l);
|
||||
|
||||
creationTimer.setLivePlayDelayInMillis(1000);
|
||||
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
package com.sap.sailing.gwt.common.client;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sse.gwt.client.Notification;
|
||||
import com.sap.sse.gwt.client.Notification.NotificationType;
|
||||
|
||||
public class NavigatorUtil {
|
||||
/**
|
||||
* Note that this method will check whether the browser does support the copyToClipboard feature first
|
||||
* and will display a warning notification if it does not, to prevent JS error messages in the console.
|
||||
* Please use {@link clientHasNavigatorCopyToClipboardSupport} to check for browser support,
|
||||
* if case specific handling is required.
|
||||
* On a successful copy an info notification is displayed.
|
||||
* @param String text: Text to share.
|
||||
*/
|
||||
public static void copyToClipboard(String text) {
|
||||
if(nativeClientHasNavigatorCopyToClipboardSupport()) {
|
||||
nativeCopyToClipboard(text);
|
||||
Notification.notify(StringMessages.INSTANCE.sharingLinkCopied(), NotificationType.INFO);
|
||||
}else {
|
||||
GWT.log("This browser does not support copying to clipboard");
|
||||
Notification.notify(StringMessages.INSTANCE.browserDoesNotSupportCopyToClipboard(), NotificationType.WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Note that this method will check whether the browser does support the sharing feature first
|
||||
* and will display a warning notification if it does not, to prevent JS error messages in the console.
|
||||
* Please use {@link clientHasNavigatorShareSupport} to check for browser support, if case specific handling is required.
|
||||
* @param String url: URL to share.
|
||||
* @param String text: Optional text to share.
|
||||
*/
|
||||
public static void shareUrl(String url, String text) {
|
||||
if(nativeClientHasNavigatorShareSupport()) {
|
||||
if(text != null) {
|
||||
nativeShareUrlAndText(url, text);
|
||||
}else {
|
||||
nativeShareUrl(url);
|
||||
}
|
||||
}else {
|
||||
GWT.log("This browser does not support native sharing");
|
||||
Notification.notify(StringMessages.INSTANCE.browserDoesNotSupportNativeSharing(), NotificationType.WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean clientHasNavigatorShareSupport(){
|
||||
return nativeClientHasNavigatorShareSupport();
|
||||
}
|
||||
|
||||
public static boolean clientHasNavigatorCopyToClipboardSupport() {
|
||||
return nativeClientHasNavigatorCopyToClipboardSupport();
|
||||
}
|
||||
|
||||
private static native void nativeCopyToClipboard(String text) /*-{
|
||||
window.focus();
|
||||
navigator.clipboard.writeText(text);
|
||||
}-*/;
|
||||
|
||||
private static native void nativeShareUrl(String url) /*-{
|
||||
window.focus();
|
||||
navigator.share({
|
||||
url : url,
|
||||
});
|
||||
}-*/;
|
||||
|
||||
private static native void nativeShareUrlAndText(String url, String text) /*-{
|
||||
window.focus();
|
||||
navigator.share({
|
||||
url : url,
|
||||
text : text
|
||||
});
|
||||
}-*/;
|
||||
|
||||
private static native boolean nativeClientHasNavigatorShareSupport() /*-{
|
||||
window.focus();
|
||||
if (navigator && navigator.share) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}-*/;
|
||||
|
||||
private static native boolean nativeClientHasNavigatorCopyToClipboardSupport() /*-{
|
||||
window.focus();
|
||||
if (navigator && navigator.clipboard && navigator.clipboard.writeText) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}-*/;
|
||||
}
|
||||
+9
-9
@@ -1,11 +1,11 @@
|
||||
.eventheader_sharing_container {
|
||||
.sharing_container {
|
||||
position: fixed;
|
||||
z-index: 999;
|
||||
right: 25px;
|
||||
bottom: 25px;
|
||||
}
|
||||
|
||||
.eventheader_sharing_faded_in {
|
||||
.sharing_faded_in {
|
||||
visibility:visible;
|
||||
-webkit-transition: opacity 0.5s ease-in-out;
|
||||
-moz-transition: opacity 0.5s ease-in-out;
|
||||
@@ -14,7 +14,7 @@
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.eventheader_sharing_faded_out {
|
||||
.sharing_faded_out {
|
||||
visibility: hidden;
|
||||
-webkit-transition: visibility 0s 2s, opacity 2s;
|
||||
-moz-transition: visibility 0s 2s, opacity 2s;
|
||||
@@ -23,7 +23,7 @@
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.eventheader_sharing_item {
|
||||
.sharing_item {
|
||||
display: inline-block;
|
||||
height: 3.5em;
|
||||
width: 3.5em;
|
||||
@@ -36,15 +36,15 @@
|
||||
background-color: rgb(0, 143, 204) !important;
|
||||
}
|
||||
|
||||
eventheader_sharing_item:hover,
|
||||
eventheader_sharing_item:focus{
|
||||
.sharing_item:hover,
|
||||
.sharing_item:focus{
|
||||
background-color: rgb(0, 143, 204);
|
||||
}
|
||||
|
||||
.eventheader_sharing_itemcopytoclipboard {
|
||||
.sharing_itemcopytoclipboard {
|
||||
}
|
||||
|
||||
.eventheader_sharing_itemcopytoclipboard:after {
|
||||
.sharing_itemcopytoclipboard:after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
width: 50%;
|
||||
@@ -58,7 +58,7 @@ eventheader_sharing_item:focus{
|
||||
border: none;
|
||||
}
|
||||
|
||||
.eventheader_sharing_itemshare {
|
||||
.sharing_itemshare {
|
||||
background-image: resourceUrl("sharingIcon");
|
||||
background-size: 50%;
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
package com.sap.sailing.gwt.common.client.sharing;
|
||||
|
||||
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.DataResource;
|
||||
import com.google.gwt.resources.client.DataResource.MimeType;
|
||||
|
||||
public interface FloatingSharingButtonsResources extends ClientBundle {
|
||||
public static final FloatingSharingButtonsResources INSTANCE = GWT.create(FloatingSharingButtonsResources.class);
|
||||
|
||||
@Source("FloatingSharingButtons.gss")
|
||||
LocalCss css();
|
||||
|
||||
public interface LocalCss extends CssResource {
|
||||
String sharing_item();
|
||||
String sharing_itemcopytoclipboard();
|
||||
String sharing_itemshare();
|
||||
String sharing_container();
|
||||
String sharing_faded_out();
|
||||
String sharing_faded_in();
|
||||
}
|
||||
|
||||
@Source("../../../ui/client/images/share.svg")
|
||||
@MimeType("image/svg+xml")
|
||||
DataResource sharingIcon();
|
||||
|
||||
@Source("../../../ui/client/images/flat_copy.svg")
|
||||
@MimeType("image/svg+xml")
|
||||
DataResource copyIcon();
|
||||
|
||||
}
|
||||
+2
-2
@@ -19,7 +19,7 @@ import com.google.gwt.user.client.ui.UIObject;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.communication.eventview.EventViewDTO;
|
||||
import com.sap.sailing.gwt.home.communication.eventview.HasRegattaMetadata;
|
||||
import com.sap.sailing.gwt.home.desktop.partials.sharing.SharingButtons;
|
||||
import com.sap.sailing.gwt.home.desktop.partials.sharing.EventHeaderSharingButtons;
|
||||
import com.sap.sailing.gwt.home.desktop.places.event.EventView;
|
||||
import com.sap.sailing.gwt.home.desktop.places.event.EventView.PlaceCallback;
|
||||
import com.sap.sailing.gwt.home.desktop.places.event.EventView.Presenter;
|
||||
@@ -61,7 +61,7 @@ public class EventHeader extends Composite {
|
||||
@UiField DivElement eventCategory;
|
||||
@UiField DivElement courseAreaUi;
|
||||
@UiField FlowPanel dropdownContent;
|
||||
@UiField SharingButtons sharing;
|
||||
@UiField EventHeaderSharingButtons sharing;
|
||||
@UiField DataByLogo dataByLogo;
|
||||
|
||||
private EventViewDTO event;
|
||||
|
||||
+1
-1
@@ -59,7 +59,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="{res.mediaCss.showonlarge} {res.mediaCss.large3} {res.mediaCss.columns}">
|
||||
<dp:sharing.SharingButtons ui:field="sharing" />
|
||||
<dp:sharing.EventHeaderSharingButtons ui:field="sharing" />
|
||||
</div>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
+2
-2
@@ -14,7 +14,7 @@ import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.communication.event.EventAndLeaderboardReferenceWithStateDTO;
|
||||
import com.sap.sailing.gwt.home.communication.event.EventState;
|
||||
import com.sap.sailing.gwt.home.communication.fakeseries.EventSeriesViewDTO;
|
||||
import com.sap.sailing.gwt.home.desktop.partials.sharing.SharingButtons;
|
||||
import com.sap.sailing.gwt.home.desktop.partials.sharing.EventHeaderSharingButtons;
|
||||
import com.sap.sailing.gwt.home.desktop.places.event.regatta.overviewtab.RegattaOverviewPlace;
|
||||
import com.sap.sailing.gwt.home.desktop.places.fakeseries.SeriesView;
|
||||
import com.sap.sailing.gwt.home.desktop.places.fakeseries.SeriesView.Presenter;
|
||||
@@ -38,7 +38,7 @@ public class SeriesHeader extends Composite {
|
||||
@UiField SpanElement eventName;
|
||||
@UiField DivElement eventState;
|
||||
@UiField FlowPanel venues;
|
||||
@UiField SharingButtons sharing;
|
||||
@UiField EventHeaderSharingButtons sharing;
|
||||
|
||||
private EventSeriesViewDTO series;
|
||||
private Presenter presenter;
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="{res.mediaCss.showonlarge} {res.mediaCss.large3} {res.mediaCss.columns}">
|
||||
<dp:sharing.SharingButtons ui:field="sharing" />
|
||||
<dp:sharing.EventHeaderSharingButtons ui:field="sharing" />
|
||||
</div>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
+8
-21
@@ -14,6 +14,7 @@ import com.google.gwt.user.client.ui.Button;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.HTMLPanel;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.common.client.NavigatorUtil;
|
||||
import com.sap.sailing.gwt.home.shared.partials.shared.SharingMetadataProvider;
|
||||
import com.sap.sailing.gwt.home.shared.places.ShareablePlaceContext;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
@@ -21,13 +22,13 @@ import com.sap.sse.gwt.client.Notification;
|
||||
import com.sap.sse.gwt.client.Notification.NotificationType;
|
||||
import com.sap.sse.gwt.shared.ClientConfiguration;
|
||||
|
||||
public class SharingButtons extends Composite {
|
||||
public class EventHeaderSharingButtons extends Composite {
|
||||
|
||||
private static SharingButtonsUiBinder uiBinder = GWT.create(SharingButtonsUiBinder.class);
|
||||
private static EventHeaderSharingButtonsUiBinder uiBinder = GWT.create(EventHeaderSharingButtonsUiBinder.class);
|
||||
|
||||
private static String SHARING_URL_PREFIX = "/sailingserver/shared/home";
|
||||
|
||||
interface SharingButtonsUiBinder extends UiBinder<Widget, SharingButtons> {
|
||||
interface EventHeaderSharingButtonsUiBinder extends UiBinder<Widget, EventHeaderSharingButtons> {
|
||||
}
|
||||
|
||||
@UiField HTMLPanel htmlPanel;
|
||||
@@ -36,8 +37,8 @@ public class SharingButtons extends Composite {
|
||||
@UiField AnchorElement facebook;
|
||||
@UiField Button copyToClipBoard;
|
||||
|
||||
public SharingButtons() {
|
||||
SharingButtonsResources.INSTANCE.css().ensureInjected();
|
||||
public EventHeaderSharingButtons() {
|
||||
EventHeaderSharingButtonsResources.INSTANCE.css().ensureInjected();
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
if (!ClientConfiguration.getInstance().isBrandingActive()) {
|
||||
htmlPanel.getElement().getStyle().setDisplay(NONE);
|
||||
@@ -62,14 +63,14 @@ public class SharingButtons extends Composite {
|
||||
final UrlBuilder facebookLink = new UrlBuilder().setProtocol("https").setHost("www.facebook.com")
|
||||
.setPath("sharer/sharer.php").setParameter("u", urlToShare);
|
||||
facebook.setHref(facebookLink.buildString());
|
||||
if (clientHasNavigatorCopyToClipboardSupport()) {
|
||||
if (NavigatorUtil.clientHasNavigatorCopyToClipboardSupport()) {
|
||||
copyToClipBoard.removeStyleDependentName("gwt-button");
|
||||
copyToClipBoard.removeStyleDependentName("gwt-Button:visited");
|
||||
copyToClipBoard.removeStyleName("button");
|
||||
copyToClipBoard.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
copyToClipboard(urlToShare);
|
||||
NavigatorUtil.copyToClipboard(urlToShare);
|
||||
Notification.notify(StringMessages.INSTANCE.sharingLinkCopied(), NotificationType.INFO);
|
||||
}
|
||||
});
|
||||
@@ -77,18 +78,4 @@ public class SharingButtons extends Composite {
|
||||
copyToClipBoard.setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
public static native void copyToClipboard(String text) /*-{
|
||||
window.focus();
|
||||
navigator.clipboard.writeText(text);
|
||||
}-*/;
|
||||
|
||||
public static native boolean clientHasNavigatorCopyToClipboardSupport() /*-{
|
||||
window.focus();
|
||||
if (navigator && navigator.clipboard && navigator.clipboard.writeText) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}-*/;
|
||||
}
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">
|
||||
<ui:with field="i18n" type="com.sap.sailing.gwt.ui.client.StringMessages" />
|
||||
<ui:with field="res" type="com.sap.sailing.gwt.common.client.SharedResources" />
|
||||
<ui:with field="local_res" type="com.sap.sailing.gwt.home.desktop.partials.sharing.SharingButtonsResources" />
|
||||
<ui:with field="local_res" type="com.sap.sailing.gwt.home.desktop.partials.sharing.EventHeaderSharingButtonsResources" />
|
||||
<g:HTMLPanel addStyleNames="{local_res.css.eventheader_sharing}" ui:field="htmlPanel">
|
||||
<a ui:field="mail" title="{i18n.sharingMailTooltip}"
|
||||
class="{local_res.css.eventheader_sharing_item} {local_res.css.eventheader_sharing_itememail}"></a>
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
package com.sap.sailing.gwt.home.desktop.partials.sharing;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.resources.client.CssResource;
|
||||
import com.google.gwt.resources.client.DataResource;
|
||||
import com.google.gwt.resources.client.DataResource.MimeType;
|
||||
import com.sap.sse.gwt.common.CommonIcons;
|
||||
|
||||
public interface EventHeaderSharingButtonsResources extends CommonIcons {
|
||||
public static final EventHeaderSharingButtonsResources INSTANCE = GWT.create(EventHeaderSharingButtonsResources.class);
|
||||
|
||||
@Source("EventHeaderSharingButtons.gss")
|
||||
LocalCss css();
|
||||
|
||||
public interface LocalCss extends CssResource {
|
||||
String eventheader_sharing();
|
||||
String eventheader_sharing_item();
|
||||
String eventheader_sharing_itememail();
|
||||
String eventheader_sharing_itemtwitter();
|
||||
String eventheader_sharing_itemfacebook();
|
||||
String eventheader_sharing_itemcopytoclipboard();
|
||||
}
|
||||
|
||||
@Source("../../../../ui/client/images/flat_copy.svg")
|
||||
@MimeType("image/svg+xml")
|
||||
DataResource copyIcon();
|
||||
|
||||
}
|
||||
-26
@@ -1,26 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.desktop.partials.sharing;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.resources.client.CssResource;
|
||||
import com.google.gwt.resources.client.ImageResource;
|
||||
import com.sap.sailing.gwt.home.shared.SharedHomeResources;
|
||||
|
||||
public interface SharingButtonsResources extends SharedHomeResources {
|
||||
public static final SharingButtonsResources INSTANCE = GWT.create(SharingButtonsResources.class);
|
||||
|
||||
@Source("SharingButtons.gss")
|
||||
LocalCss css();
|
||||
|
||||
@Source("email-icon.png")
|
||||
ImageResource email();
|
||||
|
||||
public interface LocalCss extends CssResource {
|
||||
String eventheader_sharing();
|
||||
String eventheader_sharing_item();
|
||||
String eventheader_sharing_itememail();
|
||||
String eventheader_sharing_itemtwitter();
|
||||
String eventheader_sharing_itemfacebook();
|
||||
String eventheader_sharing_itemcopytoclipboard();
|
||||
}
|
||||
|
||||
}
|
||||
+13
-46
@@ -15,12 +15,11 @@ import com.google.gwt.user.client.ui.Button;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.HTMLPanel;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.mobile.partials.sharing.SharingButtonsResources.LocalCss;
|
||||
import com.sap.sailing.gwt.common.client.NavigatorUtil;
|
||||
import com.sap.sailing.gwt.common.client.sharing.FloatingSharingButtonsResources;
|
||||
import com.sap.sailing.gwt.common.client.sharing.FloatingSharingButtonsResources.LocalCss;
|
||||
import com.sap.sailing.gwt.home.shared.partials.shared.SharingMetadataProvider;
|
||||
import com.sap.sailing.gwt.home.shared.places.ShareablePlaceContext;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sse.gwt.client.Notification;
|
||||
import com.sap.sse.gwt.client.Notification.NotificationType;
|
||||
import com.sap.sse.gwt.shared.ClientConfiguration;
|
||||
|
||||
public class SharingButtons extends Composite {
|
||||
@@ -41,7 +40,7 @@ public class SharingButtons extends Composite {
|
||||
Button copyToClipBoard;
|
||||
|
||||
public SharingButtons() {
|
||||
SharingButtonsResources.INSTANCE.css().ensureInjected();
|
||||
FloatingSharingButtonsResources.INSTANCE.css().ensureInjected();
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
if (!ClientConfiguration.getInstance().isBrandingActive()) {
|
||||
htmlPanel.getElement().getStyle().setDisplay(NONE);
|
||||
@@ -57,15 +56,15 @@ public class SharingButtons extends Composite {
|
||||
.setPath(SHARING_URL_PREFIX + context.getContextAsPathParameters())
|
||||
.setHash(null)
|
||||
.buildString();
|
||||
if (clientHasNavigatorShareSupport()) {
|
||||
if (NavigatorUtil.clientHasNavigatorShareSupport()) {
|
||||
copyToClipBoard.setVisible(false);
|
||||
shareButton.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
share(urlToShare, provider.getShortText());
|
||||
NavigatorUtil.shareUrl(urlToShare, provider.getShortText());
|
||||
}
|
||||
});
|
||||
} else if (clientHasNavigatorCopyToClipboardSupport()) {
|
||||
} else if (NavigatorUtil.clientHasNavigatorCopyToClipboardSupport()) {
|
||||
shareButton.setVisible(false);
|
||||
copyToClipBoard.removeStyleDependentName("gwt-button");
|
||||
copyToClipBoard.removeStyleDependentName("gwt-Button:visited");
|
||||
@@ -73,61 +72,29 @@ public class SharingButtons extends Composite {
|
||||
copyToClipBoard.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
copyToClipboard(urlToShare);
|
||||
Notification.notify(StringMessages.INSTANCE.sharingLinkCopied(), NotificationType.INFO);
|
||||
NavigatorUtil.copyToClipboard(urlToShare);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
shareButton.setVisible(false);
|
||||
copyToClipBoard.setVisible(false);
|
||||
}
|
||||
final LocalCss css = SharingButtonsResources.INSTANCE.css();
|
||||
final LocalCss css = FloatingSharingButtonsResources.INSTANCE.css();
|
||||
Timer fadeOutSharingButtonsTimer = new Timer() {
|
||||
@Override
|
||||
public void run() {
|
||||
htmlPanel.removeStyleName(css.eventheader_sharing_faded_in());
|
||||
htmlPanel.addStyleName(css.eventheader_sharing_faded_out());
|
||||
htmlPanel.removeStyleName(css.sharing_faded_in());
|
||||
htmlPanel.addStyleName(css.sharing_faded_out());
|
||||
}
|
||||
};
|
||||
Window.addWindowScrollHandler(new ScrollHandler() {
|
||||
@Override
|
||||
public void onWindowScroll(ScrollEvent event) {
|
||||
htmlPanel.removeStyleName(css.eventheader_sharing_faded_out());
|
||||
htmlPanel.addStyleName(css.eventheader_sharing_faded_in());
|
||||
htmlPanel.removeStyleName(css.sharing_faded_out());
|
||||
htmlPanel.addStyleName(css.sharing_faded_in());
|
||||
fadeOutSharingButtonsTimer.schedule(1500);
|
||||
}
|
||||
});
|
||||
fadeOutSharingButtonsTimer.schedule(2000);
|
||||
}
|
||||
|
||||
public static native void copyToClipboard(String text) /*-{
|
||||
window.focus();
|
||||
navigator.clipboard.writeText(text);
|
||||
}-*/;
|
||||
|
||||
public static native void share(String url, String text) /*-{
|
||||
window.focus();
|
||||
navigator.share({
|
||||
url: url,
|
||||
text: text
|
||||
});
|
||||
}-*/;
|
||||
|
||||
public static native boolean clientHasNavigatorShareSupport() /*-{
|
||||
window.focus();
|
||||
if (navigator.share) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}-*/;
|
||||
|
||||
public static native boolean clientHasNavigatorCopyToClipboardSupport() /*-{
|
||||
window.focus();
|
||||
if (navigator && navigator.clipboard && navigator.clipboard.writeText) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}-*/;
|
||||
}
|
||||
|
||||
+4
-4
@@ -2,11 +2,11 @@
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">
|
||||
<ui:with field="i18n" type="com.sap.sailing.gwt.ui.client.StringMessages" />
|
||||
<ui:with field="res" type="com.sap.sailing.gwt.common.client.SharedResources" />
|
||||
<ui:with field="local_res" type="com.sap.sailing.gwt.home.mobile.partials.sharing.SharingButtonsResources" />
|
||||
<g:HTMLPanel ui:field="htmlPanel" addStyleNames="{local_res.css.eventheader_sharing_container} {local_res.css.eventheader_sharing_faded_in}">
|
||||
<ui:with field="local_res" type="com.sap.sailing.gwt.common.client.sharing.FloatingSharingButtonsResources" />
|
||||
<g:HTMLPanel ui:field="htmlPanel" addStyleNames="{local_res.css.sharing_container} {local_res.css.sharing_faded_in}">
|
||||
<g:Button ui:field="shareButton" title="{i18n.sharingCopyToClipBoardTooltip}"
|
||||
addStyleNames="{local_res.css.eventheader_sharing_item} {local_res.css.eventheader_sharing_itemshare}"></g:Button>
|
||||
addStyleNames="{local_res.css.sharing_item} {local_res.css.sharing_itemshare}"></g:Button>
|
||||
<g:Button ui:field="copyToClipBoard" title="{i18n.sharingCopyToClipBoardTooltip}"
|
||||
addStyleNames="{local_res.css.eventheader_sharing_item} {local_res.css.eventheader_sharing_itemcopytoclipboard}"></g:Button>
|
||||
addStyleNames="{local_res.css.sharing_item} {local_res.css.sharing_itemcopytoclipboard}"></g:Button>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
-22
@@ -1,22 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.mobile.partials.sharing;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.resources.client.CssResource;
|
||||
import com.sap.sailing.gwt.home.shared.SharedHomeResources;
|
||||
|
||||
public interface SharingButtonsResources extends SharedHomeResources {
|
||||
public static final SharingButtonsResources INSTANCE = GWT.create(SharingButtonsResources.class);
|
||||
|
||||
@Source("SharingButtons.gss")
|
||||
LocalCss css();
|
||||
|
||||
public interface LocalCss extends CssResource {
|
||||
String eventheader_sharing_item();
|
||||
String eventheader_sharing_itemcopytoclipboard();
|
||||
String eventheader_sharing_itemshare();
|
||||
String eventheader_sharing_container();
|
||||
String eventheader_sharing_faded_out();
|
||||
String eventheader_sharing_faded_in();
|
||||
}
|
||||
|
||||
}
|
||||
-7
@@ -76,11 +76,4 @@ public interface SharedHomeResources extends CommonIcons {
|
||||
@Source("raw_gps_fixes.png")
|
||||
ImageResource gpsFixes();
|
||||
|
||||
@Source("../../ui/client/images/share.svg")
|
||||
@MimeType("image/svg+xml")
|
||||
DataResource sharingIcon();
|
||||
|
||||
@Source("../../ui/client/images/flat_copy.svg")
|
||||
@MimeType("image/svg+xml")
|
||||
DataResource copyIcon();
|
||||
}
|
||||
|
||||
+128
-8
@@ -1,11 +1,17 @@
|
||||
package com.sap.sailing.gwt.settings.client.raceboard;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sap.sailing.domain.common.dto.TagDTO;
|
||||
import com.sap.sailing.gwt.settings.client.settingtypes.DurationSetting;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.impl.MillisecondsDurationImpl;
|
||||
import com.sap.sse.common.settings.generic.AbstractGenericSerializableSettings;
|
||||
import com.sap.sse.common.settings.generic.BooleanSetting;
|
||||
import com.sap.sse.common.settings.generic.LongSetting;
|
||||
import com.sap.sse.common.settings.generic.StringSetSetting;
|
||||
import com.sap.sse.common.settings.generic.StringSetting;
|
||||
import com.sap.sse.gwt.shared.GwtHttpRequestUtils;
|
||||
|
||||
@@ -25,7 +31,13 @@ public class RaceBoardPerspectiveOwnSettings extends AbstractGenericSerializable
|
||||
private transient BooleanSetting canReplayDuringLiveRaces;
|
||||
private transient DurationSetting initialDurationAfterRaceStartInReplay;
|
||||
private transient StringSetting selectedCompetitor;
|
||||
private transient StringSetSetting selectedCompetitors;
|
||||
private transient BooleanSetting showTags;
|
||||
private transient BooleanSetting showManeuverTable;
|
||||
private transient StringSetting jumpToTag;
|
||||
private transient LongSetting zoomEnd;
|
||||
private transient LongSetting zoomStart;
|
||||
private transient BooleanSetting autoExpandPreSelectedRace;
|
||||
|
||||
public static final String PARAM_VIEW_MODE = "viewMode";
|
||||
public static final String PARAM_VIEW_SHOW_LEADERBOARD = "viewShowLeaderboard";
|
||||
@@ -37,8 +49,15 @@ public class RaceBoardPerspectiveOwnSettings extends AbstractGenericSerializable
|
||||
public static final String PARAM_CAN_REPLAY_DURING_LIVE_RACES = "canReplayDuringLiveRaces";
|
||||
public static final String PARAM_TIME_AFTER_RACE_START_AS_HOURS_COLON_MILLIS_COLON_SECONDS = "t";
|
||||
public static final String PARAM_SELECTED_COMPETITOR = "c";
|
||||
public static final String PARAM_SELECTED_COMPETITORS = "selectedCompetitors";
|
||||
public static final String PARAM_VIEW_SHOW_TAGS = "viewShowTags";
|
||||
public static final String PARAM_VIEW_SHOW_MANEUVER_TABLE = "viewShowManeuverTable";
|
||||
public static final String PARAM_JUMP_TO_TAG = TagDTO.TAG_URL_PARAMETER;
|
||||
|
||||
public static final String PARAM_ZOOM_START = "zoomStart";
|
||||
public static final String PARAM_ZOOM_END = "zoomEnd";
|
||||
public static final String PARAM_AUTO_EXPAND_PRE_SELECTED_RACE = "autoExpandPreSelectedRace";
|
||||
|
||||
|
||||
public RaceBoardPerspectiveOwnSettings() {
|
||||
}
|
||||
|
||||
@@ -62,12 +81,21 @@ public class RaceBoardPerspectiveOwnSettings extends AbstractGenericSerializable
|
||||
this.canReplayDuringLiveRaces = new BooleanSetting("canReplayDuringLiveRaces", this, false);
|
||||
this.initialDurationAfterRaceStartInReplay = new DurationSetting(PARAM_TIME_AFTER_RACE_START_AS_HOURS_COLON_MILLIS_COLON_SECONDS, this, null);
|
||||
this.selectedCompetitor = new StringSetting(PARAM_SELECTED_COMPETITOR, this, null);
|
||||
this.selectedCompetitors = new StringSetSetting(PARAM_SELECTED_COMPETITORS, this, null);
|
||||
this.showTags = new BooleanSetting(PARAM_VIEW_SHOW_TAGS, this, false);
|
||||
this.showManeuverTable = new BooleanSetting(PARAM_VIEW_SHOW_MANEUVER_TABLE, this, false);
|
||||
this.jumpToTag = new StringSetting(PARAM_JUMP_TO_TAG, this, null);
|
||||
this.zoomStart = new LongSetting(PARAM_ZOOM_START, this, null);
|
||||
this.zoomEnd = new LongSetting(PARAM_ZOOM_END, this, null);
|
||||
this.autoExpandPreSelectedRace = new BooleanSetting(PARAM_AUTO_EXPAND_PRE_SELECTED_RACE, this, false);
|
||||
}
|
||||
|
||||
public RaceBoardPerspectiveOwnSettings(String activeCompetitorsFilterSetName, Boolean showLeaderboard,
|
||||
Boolean showWindChart, Boolean showCompetitorsChart, Boolean canReplayDuringLiveRaces,
|
||||
Duration initialDurationAfterRaceStartInReplay, String selectedCompetitor, String jumpToTag) {
|
||||
Duration initialDurationAfterRaceStartInReplay, String selectedCompetitor, Iterable<String> selectedCompetitors,
|
||||
Boolean showTags, Boolean showManeuverTable, String jumpToTag, Long zoomStart, Long zoomEnd, Boolean autoExpandPreSelectedRace) {
|
||||
this.showTags.setValue(showTags);
|
||||
this.showManeuverTable.setValue(showManeuverTable);
|
||||
this.activeCompetitorsFilterSetName.setValue(activeCompetitorsFilterSetName);
|
||||
this.showLeaderboard.setValue(showLeaderboard);
|
||||
this.showWindChart.setValue(showWindChart);
|
||||
@@ -75,6 +103,11 @@ public class RaceBoardPerspectiveOwnSettings extends AbstractGenericSerializable
|
||||
this.canReplayDuringLiveRaces.setValue(canReplayDuringLiveRaces);
|
||||
this.initialDurationAfterRaceStartInReplay.setValue(initialDurationAfterRaceStartInReplay);
|
||||
this.selectedCompetitor.setValue(selectedCompetitor);
|
||||
this.selectedCompetitors.setValues(selectedCompetitors);
|
||||
this.jumpToTag.setValue(jumpToTag);
|
||||
this.zoomStart.setValue(zoomStart);
|
||||
this.zoomEnd.setValue(zoomEnd);
|
||||
this.autoExpandPreSelectedRace.setValue(autoExpandPreSelectedRace);
|
||||
}
|
||||
|
||||
public boolean isShowLeaderboard() {
|
||||
@@ -92,18 +125,99 @@ public class RaceBoardPerspectiveOwnSettings extends AbstractGenericSerializable
|
||||
public String getActiveCompetitorsFilterSetName() {
|
||||
return activeCompetitorsFilterSetName.getValue();
|
||||
}
|
||||
|
||||
public Duration getInitialDurationAfterRaceStartInReplay() {
|
||||
return initialDurationAfterRaceStartInReplay.getValue();
|
||||
}
|
||||
|
||||
public boolean isCanReplayDuringLiveRaces() {
|
||||
return canReplayDuringLiveRaces.getValue();
|
||||
}
|
||||
|
||||
public boolean isShowTags() {
|
||||
return showTags.getValue();
|
||||
}
|
||||
|
||||
public boolean isShowManeuver() {
|
||||
return showManeuverTable.getValue();
|
||||
}
|
||||
|
||||
public String getJumpToTag() {
|
||||
return jumpToTag.getValue();
|
||||
}
|
||||
|
||||
public Long getZoomStart() {
|
||||
return zoomStart.getValue();
|
||||
}
|
||||
|
||||
public Long getZoomEnd() {
|
||||
return zoomEnd.getValue();
|
||||
}
|
||||
|
||||
public Boolean isAutoExpandPreSelectedRace() {
|
||||
return autoExpandPreSelectedRace.getValue();
|
||||
}
|
||||
|
||||
public void resetShowTags() {
|
||||
showTags.resetToDefault();
|
||||
}
|
||||
|
||||
public void resetShowManeuver() {
|
||||
showManeuverTable.resetToDefault();
|
||||
}
|
||||
|
||||
public void resetShowLeaderBoard() {
|
||||
this.showLeaderboard.resetToDefault();;
|
||||
}
|
||||
|
||||
public void resetShowWindChart() {
|
||||
this.showWindChart.resetToDefault();;
|
||||
}
|
||||
|
||||
public void resetShowCompetitorsChart() {
|
||||
this.showCompetitorsChart.resetToDefault();;
|
||||
}
|
||||
|
||||
public void resetCanReplayDuringLiveRaces() {
|
||||
this.canReplayDuringLiveRaces.resetToDefault();;
|
||||
}
|
||||
|
||||
public void resetActiveCompetitorsFilterSetName() {
|
||||
this.activeCompetitorsFilterSetName.resetToDefault();;
|
||||
}
|
||||
|
||||
public void resetInitialDurationAfterRaceStartInReplay() {
|
||||
this.initialDurationAfterRaceStartInReplay.resetToDefault();;
|
||||
}
|
||||
|
||||
public void resetSelectedCompetitor() {
|
||||
this.selectedCompetitor.resetToDefault();;
|
||||
}
|
||||
|
||||
public void resetSelectedCompetitors() {
|
||||
this.selectedCompetitors.resetToDefault();;
|
||||
}
|
||||
|
||||
public void resetJumpToTag() {
|
||||
this.jumpToTag.resetToDefault();;
|
||||
}
|
||||
|
||||
public void resetZoomStart() {
|
||||
this.zoomStart.resetToDefault();
|
||||
}
|
||||
|
||||
public void resetZoomEnd() {
|
||||
this.zoomEnd.resetToDefault();
|
||||
}
|
||||
|
||||
public void resetAutoExpandPreSelectedRace() {
|
||||
this.autoExpandPreSelectedRace.resetToDefault();
|
||||
}
|
||||
|
||||
public static RaceBoardPerspectiveOwnSettings readSettingsFromURL(boolean defaultForViewShowLeaderboard,
|
||||
boolean defaultForViewShowWindchart, boolean defaultForViewShowCompetitorsChart,
|
||||
String defaultForViewCompetitorFilter, boolean defaultForCanReplayDuringLiveRaces, String defaultForJumpToTag) {
|
||||
String defaultForViewCompetitorFilter, boolean defaultForCanReplayDuringLiveRaces, boolean defaultForViewShowTags,
|
||||
boolean defaultForViewShowManeuverTable, String defaultForJumpToTag, Long defaultForZoomStart, Long defaultForZoomEnd, boolean defaultForAutoExpandPreSelectedRace) {
|
||||
final boolean showLeaderboard = GwtHttpRequestUtils.getBooleanParameter(PARAM_VIEW_SHOW_LEADERBOARD, defaultForViewShowLeaderboard /* default */);
|
||||
final boolean showWindChart = GwtHttpRequestUtils.getBooleanParameter(PARAM_VIEW_SHOW_WINDCHART, defaultForViewShowWindchart /* default */);
|
||||
final boolean showCompetitorsChart = GwtHttpRequestUtils.getBooleanParameter(PARAM_VIEW_SHOW_COMPETITORSCHART, defaultForViewShowCompetitorsChart /* default */);
|
||||
@@ -111,16 +225,18 @@ public class RaceBoardPerspectiveOwnSettings extends AbstractGenericSerializable
|
||||
final boolean canReplayWhileLiveIsPossible = GwtHttpRequestUtils.getBooleanParameter(PARAM_CAN_REPLAY_DURING_LIVE_RACES, defaultForCanReplayDuringLiveRaces /* default */);
|
||||
final Duration initialDurationAfterRaceStartInReplay = parseDuration(GwtHttpRequestUtils.getStringParameter(
|
||||
PARAM_TIME_AFTER_RACE_START_AS_HOURS_COLON_MILLIS_COLON_SECONDS, null /* default */));
|
||||
final Set<String> selectedCompetitors = new HashSet<>(Arrays.asList(GwtHttpRequestUtils.getStringParameters(PARAM_SELECTED_COMPETITORS)));
|
||||
final String selectedCompetitor = GwtHttpRequestUtils.getStringParameter(PARAM_SELECTED_COMPETITOR,
|
||||
null /* default */);
|
||||
final boolean showTags = GwtHttpRequestUtils.getBooleanParameter(PARAM_VIEW_SHOW_TAGS, defaultForViewShowTags);
|
||||
final boolean showManeuverTable = GwtHttpRequestUtils.getBooleanParameter(PARAM_VIEW_SHOW_MANEUVER_TABLE, defaultForViewShowManeuverTable);
|
||||
final String jumpToTag = GwtHttpRequestUtils.getStringParameter(PARAM_JUMP_TO_TAG, defaultForJumpToTag /* default */);
|
||||
final Long zoomStart = GwtHttpRequestUtils.getLongParameter(PARAM_ZOOM_START, defaultForZoomStart);
|
||||
final Long zoomEnd = GwtHttpRequestUtils.getLongParameter(PARAM_ZOOM_END, defaultForZoomEnd);
|
||||
final boolean autoExpandPreSelectedRace = GwtHttpRequestUtils.getBooleanParameter(PARAM_AUTO_EXPAND_PRE_SELECTED_RACE, defaultForAutoExpandPreSelectedRace);
|
||||
return new RaceBoardPerspectiveOwnSettings(activeCompetitorsFilterSetName, showLeaderboard, showWindChart,
|
||||
showCompetitorsChart, canReplayWhileLiveIsPossible, initialDurationAfterRaceStartInReplay,
|
||||
selectedCompetitor, jumpToTag);
|
||||
}
|
||||
|
||||
public Duration getInitialDurationAfterRaceStartInReplay() {
|
||||
return initialDurationAfterRaceStartInReplay.getValue();
|
||||
selectedCompetitor, selectedCompetitors, showTags, showManeuverTable, jumpToTag, zoomStart, zoomEnd, autoExpandPreSelectedRace);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -141,6 +257,10 @@ public class RaceBoardPerspectiveOwnSettings extends AbstractGenericSerializable
|
||||
return result;
|
||||
}
|
||||
|
||||
public Iterable<String> getSelectedCompetitors() {
|
||||
return selectedCompetitors.getValues();
|
||||
}
|
||||
|
||||
public String getSelectedCompetitor() {
|
||||
return selectedCompetitor.getValue();
|
||||
}
|
||||
|
||||
-7
@@ -16,7 +16,6 @@ public class RaceboardContextDefinition extends AbstractGenericSerializableSetti
|
||||
private UUIDSetting leaderboardGroupId;
|
||||
private UUIDSetting eventId;
|
||||
private StringSetting mode;
|
||||
private StringSetting selectedCompetitor;
|
||||
|
||||
public RaceboardContextDefinition() {
|
||||
}
|
||||
@@ -41,7 +40,6 @@ public class RaceboardContextDefinition extends AbstractGenericSerializableSetti
|
||||
this.leaderboardGroupId.setValue(leaderboardGroupId);
|
||||
this.eventId.setValue(eventId);
|
||||
this.mode.setValue(mode);
|
||||
this.selectedCompetitor.setValue(selectedCompetitorId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -53,7 +51,6 @@ public class RaceboardContextDefinition extends AbstractGenericSerializableSetti
|
||||
leaderboardGroupId = new UUIDSetting("leaderboardGroupId", this);
|
||||
eventId = new UUIDSetting("eventId", this);
|
||||
mode = new StringSetting("mode", this);
|
||||
selectedCompetitor = new StringSetting(RaceBoardPerspectiveOwnSettings.PARAM_SELECTED_COMPETITOR, this);
|
||||
}
|
||||
|
||||
public String getRegattaName() {
|
||||
@@ -83,8 +80,4 @@ public class RaceboardContextDefinition extends AbstractGenericSerializableSetti
|
||||
public String getMode() {
|
||||
return mode.getValue();
|
||||
}
|
||||
|
||||
public String getSelectedCompetitor() {
|
||||
return selectedCompetitor.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
-2
@@ -105,7 +105,6 @@ public class PairingListCreationDialog extends DataEntryDialog<PairingListTempla
|
||||
@Override
|
||||
protected Widget getAdditionalWidget() {
|
||||
HorizontalPanel panel = new HorizontalPanel();
|
||||
|
||||
/* DATA PANEL */
|
||||
CaptionPanel dataPanel = new CaptionPanel();
|
||||
dataPanel.setCaptionText(stringMessages.parameters());
|
||||
@@ -172,7 +171,6 @@ public class PairingListCreationDialog extends DataEntryDialog<PairingListTempla
|
||||
}
|
||||
|
||||
private void configButtons() {
|
||||
getRightButtonPannel().remove(getCancelButton());
|
||||
applyToRacelogButton.getElement().getStyle().setMargin(3, Unit.PX);
|
||||
applyToRacelogButton.ensureDebugId("ApplyToRacelogButton");
|
||||
printPreViewButton.getElement().getStyle().setMargin(3, Unit.PX);
|
||||
|
||||
+1
-1
@@ -100,7 +100,7 @@ public class RegistrationLinkWithQRCodeDialog extends DataEntryDialog<Registrati
|
||||
urlTextBox = createTextBox("URL", 100);
|
||||
urlTextBox.ensureDebugId("RegistrationLinkUrl");
|
||||
registrationLinkPanelContent.add(urlTextBox);
|
||||
Anchor copyAnchor = new Anchor(stringMessages.registrationLinkUrlCopy());
|
||||
Anchor copyAnchor = new Anchor(stringMessages.copyToClipboard());
|
||||
copyAnchor.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
|
||||
+2
-2
@@ -29,9 +29,9 @@ public class CompetitorSelectionModel implements CompetitorSelectionProvider {
|
||||
|
||||
private final boolean hasMultiSelection;
|
||||
|
||||
private FilterSet<CompetitorDTO, Filter<CompetitorDTO>> competitorsFilterSet;
|
||||
private FilterSet<CompetitorDTO, Filter<CompetitorDTO>> competitorsFilterSet;
|
||||
|
||||
protected final CompetitorColorProvider competitorColorProvider;
|
||||
protected final CompetitorColorProvider competitorColorProvider;
|
||||
|
||||
public CompetitorSelectionModel(boolean hasMultiSelection) {
|
||||
this(hasMultiSelection, new CompetitorColorProviderImpl(), null);
|
||||
|
||||
+7
-1
@@ -159,6 +159,10 @@ public class RaceTimePanel extends TimePanel<RaceTimePanelSettings> implements R
|
||||
public SettingsDialogComponent<RaceTimePanelSettings> getSettingsDialogComponent(RaceTimePanelSettings settings) {
|
||||
return componentLifecycle.getSettingsDialogComponent(settings);
|
||||
}
|
||||
|
||||
public RaceTimesInfoDTO getLastRaceTimesInfo() {
|
||||
return lastRaceTimesInfo;
|
||||
}
|
||||
|
||||
private void updateTimeInfo(RaceTimesInfoDTO raceTimesInfo) {
|
||||
if (raceTimesInfo == null) {
|
||||
@@ -206,7 +210,9 @@ public class RaceTimePanel extends TimePanel<RaceTimePanelSettings> implements R
|
||||
timeSlider.setZoomed(true);
|
||||
setMinMax(zoomStartTimepoint, zoomEndTimepoint, false);
|
||||
timeSlider.clearMarkersAndLabelsAndTicks();
|
||||
redrawAllMarkers(lastRaceTimesInfo);
|
||||
if (lastRaceTimesInfo != null) {
|
||||
redrawAllMarkers(lastRaceTimesInfo);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+9
@@ -474,6 +474,15 @@ public interface SailingService extends RemoteService, RemoteReplicationService
|
||||
* @return base64 encoded string containg a png-image of the genrated qrcode
|
||||
*/
|
||||
String openRegattaRegistrationQrCode(String url) throws UnauthorizedException;
|
||||
|
||||
/**
|
||||
* Generates a base64-encoded qrcode.
|
||||
*
|
||||
* @param url
|
||||
* complete url for a race with settings on the RaceBoard
|
||||
* @return base64 encoded string containg a png-image of the genrated qrcode
|
||||
*/
|
||||
String createRaceBoardLinkQrCode(String url);
|
||||
|
||||
Iterable<AccountWithSecurityDTO> getAllIgtimiAccountsWithSecurity() throws UnauthorizedException;
|
||||
|
||||
|
||||
+7
@@ -521,6 +521,13 @@ public interface SailingServiceAsync extends RemoteReplicationServiceAsync {
|
||||
* @param asyncCallback
|
||||
*/
|
||||
void openRegattaRegistrationQrCode(String url, AsyncCallback<String> asyncCallback);
|
||||
|
||||
/**
|
||||
* @see SailingService#createRaceBoardLinkQrCode(String url)
|
||||
* @param url
|
||||
* @param asyncCallback
|
||||
*/
|
||||
void createRaceBoardLinkQrCode(String url, AsyncCallback<String> asyncCallback);
|
||||
|
||||
void getAllIgtimiAccountsWithSecurity(AsyncCallback<Iterable<AccountWithSecurityDTO>> callback);
|
||||
|
||||
|
||||
+16
-1
@@ -948,6 +948,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
|
||||
String rerunQueryAfterRefresh();
|
||||
String refreshIntervalMustntBeEmpty();
|
||||
String selectionTables();
|
||||
|
||||
String addConfiguration();
|
||||
String noConfigurations();
|
||||
String errorRetrievingConfiguration();
|
||||
@@ -2303,6 +2304,16 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
|
||||
String unsetPosition();
|
||||
String errorTryingToUpdateMarkProperties(String message);
|
||||
String confirmUnsettingPositionForMarkProperties(String name);
|
||||
String shareTheLink();
|
||||
String timeStampCheckBoxLabel();
|
||||
String windChartCheckBoxLabel();
|
||||
String leaderboardCheckBoxLabel();
|
||||
String competitorChartCheckBoxLabel();
|
||||
String filterSetNameCheckBoxLabel();
|
||||
String competitorSelectionCheckBoxLabel();
|
||||
String copyToClipboard();
|
||||
String maneuverCheckBoxLabel();
|
||||
String tagsCheckBoxLabel();
|
||||
String useOfficialResultsForAutomaticUpdates();
|
||||
String keepEmptyForDefaultUserAndPassword();
|
||||
String autoRestartTrackingUponCompetitorSetChange();
|
||||
@@ -2332,9 +2343,12 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
|
||||
String errorSaveSubscription(String errMessage);
|
||||
String errorInvalidSubscritionProvider(String errMessage);
|
||||
String unableToLoadCourseAreas(String message);
|
||||
String zoomCheckBoxLabel();
|
||||
String insufficientPermissions();
|
||||
String manageEvents();
|
||||
String sharingLinkCopied();
|
||||
String browserDoesNotSupportCopyToClipboard();
|
||||
String browserDoesNotSupportNativeSharing();
|
||||
String startOfTrackingMustNotBeAfterEndOfTracking();
|
||||
String landscape();
|
||||
String identifier();
|
||||
@@ -2343,4 +2357,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
|
||||
String shoreControl();
|
||||
String demoMode();
|
||||
String includeAccessTokenForYourAccount();
|
||||
}
|
||||
String alternateTextIfQRCodeTooBig();
|
||||
}
|
||||
|
||||
+15
-1
@@ -2347,6 +2347,17 @@ keepEmptyForDefaultUserAndPassword=If username and password are left empty the c
|
||||
autoRestartTrackingUponCompetitorSetChange=Restart tracking of races automatically when competitor set changes
|
||||
whitelabelFooterLanguage=Sailing in
|
||||
whitelabelSailing=Sailing
|
||||
shareTheLink=Share the Link
|
||||
timeStampCheckBoxLabel=Include time stamp
|
||||
windChartCheckBoxLabel=Include wind chart setting
|
||||
leaderboardCheckBoxLabel=Include leaderboard visibility
|
||||
competitorChartCheckBoxLabel=Include competitor chart visibility
|
||||
filterSetNameCheckBoxLabel=Include filter set selection
|
||||
competitorSelectionCheckBoxLabel=Include competitor selection
|
||||
copyToClipboard=Copy to clipboard
|
||||
tagsCheckBoxLabel=Include tag panel visibility
|
||||
maneuverCheckBoxLabel=Include maneuver table visibility
|
||||
zoomCheckBoxLabel=Include zoom setting
|
||||
subscription=Subscription
|
||||
noSubscriptions=No subscriptions
|
||||
subscribe=Subscribe
|
||||
@@ -2374,6 +2385,8 @@ unableToLoadCourseAreas=Unable to load course areas: {0}
|
||||
insufficientPermissions=The current user has insufficient permissions for this action. Please log in with an authorized user.
|
||||
manageEvents=Manage Events
|
||||
sharingLinkCopied=Copied link to clipboard!
|
||||
browserDoesNotSupportCopyToClipboard= Your browser does not support the copy to clipboard feature.
|
||||
browserDoesNotSupportNativeSharing=Your browser does not support the native sharing feature.
|
||||
startOfTrackingMustNotBeAfterEndOfTracking=Start of tracking must not be after end of tracking
|
||||
landscape=Landscape
|
||||
identifier=Identifier
|
||||
@@ -2381,4 +2394,5 @@ selectARole=Select a role
|
||||
raceOfficerOnVessel=Officer on vessel
|
||||
shoreControl=Shore control
|
||||
demoMode=Demo mode
|
||||
includeAccessTokenForYourAccount=Include access token for your account?
|
||||
includeAccessTokenForYourAccount=Include access token for your account?
|
||||
alternateTextIfQRCodeTooBig=The given element is too big, to be displayed as QR Code.
|
||||
|
||||
+15
-1
@@ -2355,6 +2355,17 @@ confirmUnsettingPositionForMarkProperties=Positionierungsinformation für Bahnma
|
||||
useOfficialResultsForAutomaticUpdates=Automatisch von "offiziellen" von TracTrac veröffentlichten Ergebnissen aktualisieren
|
||||
keepEmptyForDefaultUserAndPassword=Wenn kein Benutzername und kein Kennwort eingetragen werden, wird der aktuelle Benutzer zum importieren verwendet. Wenn der aktuelle Nutzer die Berechtigung zum Exportieren der Daten auf dem Zielserver hat, können die Felder leer bleiben. Sollen jedoch die Daten eines anderen Benutzers importiert werden, sind Benutzername und Kennwort des Benutzers einzutragen.
|
||||
autoRestartTrackingUponCompetitorSetChange=Tracking der Rennen automatisch neu starten, wenn sich die Teilnehmerliste ändert
|
||||
shareTheLink=Teile den Link
|
||||
timeStampCheckBoxLabel=Zeitstempel einbeziehen
|
||||
windChartCheckBoxLabel=Wind-Diagramm Sichtbarkeit einbeziehen
|
||||
leaderboardCheckBoxLabel=Rangliste Sichtbarkeit einbeziehen
|
||||
competitorChartCheckBoxLabel=Teilnehmer-Diagramm Sichtbarkeit einbeziehen
|
||||
filterSetNameCheckBoxLabel=Filtersetauswahl einbeziehen
|
||||
competitorSelectionCheckBoxLabel=Ausgewählte Teilnehmer einbeziehen
|
||||
copyToClipboard=In die Zwischenablage kopieren
|
||||
tagsCheckBoxLabel=Tag Panel Sichtbarkeit einbeziehen
|
||||
maneuverCheckBoxLabel=Manövertabelle Sichtbarkeit einbeziehen
|
||||
zoomCheckBoxLabel=Zoom Einstellungen einbeziehen
|
||||
whitelabelFooterLanguage=Sailing in
|
||||
whitelabelSailing=Sailing
|
||||
subscription=Abonnement
|
||||
@@ -2385,6 +2396,8 @@ serverName=Server Name: {0}
|
||||
insufficientPermissions=Aktuelle Berechtigungen reichen nicht aus um die gewählte Aktion auszuführen. Bitte melden Sie sich als ein authorisier Benutzer an.
|
||||
manageEvents=Events Verwalten
|
||||
sharingLinkCopied=Copied link to clipboard!
|
||||
browserDoesNotSupportCopyToClipboard=In Zwischenablage kopieren wird vom aktuellen Browser nicht unterstützt.
|
||||
browserDoesNotSupportNativeSharing=Natives Teilen wird vom aktuellen Browser nicht unterstützt.
|
||||
startOfTrackingMustNotBeAfterEndOfTracking=Startzeitpunkt des Trackings darf nicht nach dessen Endzeitpunkt liegen
|
||||
landscape=Landschaft
|
||||
identifier=Kennung
|
||||
@@ -2392,4 +2405,5 @@ selectARole=Rolle auswählen
|
||||
raceOfficerOnVessel=Wettfahrtleiter auf dem Wasser
|
||||
shoreControl=Team an Land
|
||||
demoMode=Demomodus
|
||||
includeAccessTokenForYourAccount=Zugangscode für eigenes Benutzerkonto hinzufügen?
|
||||
includeAccessTokenForYourAccount=Zugangscode für eigenes Benutzerkonto hinzufügen?
|
||||
alternateTextIfQRCodeTooBig=Das Element ist zu groß um als QR-Code dargestellt zu werden.
|
||||
|
||||
+1
-2
@@ -138,7 +138,7 @@ public class CompetitorInfoOverlays implements QuickFlagDataListener {
|
||||
* a {@link #speedsInKnots} is required in order to produce the speed/course information.
|
||||
*/
|
||||
private String createInfoText(CompetitorDTO competitorDTO) {
|
||||
StringBuilder infoText = new StringBuilder();
|
||||
final StringBuilder infoText = new StringBuilder();
|
||||
infoText.append(competitorDTO.getShortInfo()).append("\n");
|
||||
final Double lastSpeedInKnots = getLastSpeedInKnots(competitorDTO);
|
||||
if (lastSpeedInKnots != null) {
|
||||
@@ -195,5 +195,4 @@ public class CompetitorInfoOverlays implements QuickFlagDataListener {
|
||||
competitorInfoOverlay.draw();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+10
@@ -30,6 +30,16 @@ body {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.raceMapShareLinkButton {
|
||||
margin-right: 10px;
|
||||
margin-bottom: 110px;
|
||||
z-index: 1;
|
||||
border-color: white;
|
||||
width: 28px !important;
|
||||
height: 28px !important;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.combinedWindPanel {}
|
||||
|
||||
.trueNorthIndicatorPanel {
|
||||
|
||||
+34
-6
@@ -86,6 +86,7 @@ import com.sap.sailing.domain.common.impl.MeterDistance;
|
||||
import com.sap.sailing.domain.common.scalablevalue.impl.ScalableBearing;
|
||||
import com.sap.sailing.domain.common.scalablevalue.impl.ScalablePosition;
|
||||
import com.sap.sailing.domain.common.windfinder.SpotDTO;
|
||||
import com.sap.sailing.gwt.common.client.sharing.FloatingSharingButtonsResources;
|
||||
import com.sap.sailing.gwt.ui.actions.GetBoatPositionsAction;
|
||||
import com.sap.sailing.gwt.ui.actions.GetBoatPositionsCallback;
|
||||
import com.sap.sailing.gwt.ui.actions.GetPolarAction;
|
||||
@@ -188,6 +189,7 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
|
||||
private AbsolutePanel rootPanel = new AbsolutePanel();
|
||||
|
||||
private MapWidget map;
|
||||
private final Runnable shareLinkAction;
|
||||
private Collection<Runnable> mapInitializedListener;
|
||||
|
||||
/**
|
||||
@@ -494,6 +496,7 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
|
||||
private boolean currentlyDragging = false;
|
||||
|
||||
private int zoomingAnimationsInProgress = 0;
|
||||
private final FloatingSharingButtonsResources floatingSharingButtonsResources;
|
||||
|
||||
static class MultiHashSet<T> {
|
||||
private HashMap<T, List<T>> map = new HashMap<>();
|
||||
@@ -580,7 +583,7 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
|
||||
String leaderboardName, String leaderboardGroupName, UUID leaderboardGroupId) {
|
||||
this(parent, context, raceMapLifecycle, raceMapSettings, sailingService, asyncActionsExecutor, errorReporter,
|
||||
timer, competitorSelection, raceCompetitorSet, stringMessages, raceIdentifier, raceMapResources,
|
||||
showHeaderPanel, quickRanksDTOProvider, visible -> {}, leaderboardName, leaderboardGroupName, leaderboardGroupId);
|
||||
showHeaderPanel, quickRanksDTOProvider, visible -> {}, leaderboardName, leaderboardGroupName, leaderboardGroupId, /* shareLinkAction */ null);
|
||||
}
|
||||
|
||||
public RaceMap(Component<?> parent, ComponentContext<?> context, RaceMapLifecycle raceMapLifecycle,
|
||||
@@ -588,9 +591,9 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
|
||||
SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
|
||||
ErrorReporter errorReporter, Timer timer, RaceCompetitorSelectionProvider competitorSelection, RaceCompetitorSet raceCompetitorSet,
|
||||
StringMessages stringMessages, RegattaAndRaceIdentifier raceIdentifier, RaceMapResources raceMapResources, boolean showHeaderPanel,
|
||||
QuickFlagDataProvider quickFlagDataProvider, Consumer<WindSource> showWindChartForProvider, String leaderboardName, String leaderboardGroupName,
|
||||
UUID leaderboardGroupId) {
|
||||
QuickFlagDataProvider quickFlagDataProvider, Consumer<WindSource> showWindChartForProvider, String leaderboardName, String leaderboardGroupName, UUID leaderboardGroupId, Runnable shareLinkAction) {
|
||||
super(parent, context);
|
||||
this.shareLinkAction = shareLinkAction;
|
||||
this.maneuverMarkersAndLossIndicators = new ManeuverMarkersAndLossIndicators(this, sailingService, errorReporter, stringMessages);
|
||||
this.showHeaderPanel = showHeaderPanel;
|
||||
this.quickFlagDataProvider = quickFlagDataProvider;
|
||||
@@ -607,6 +610,8 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
|
||||
this.leaderboardName = leaderboardName;
|
||||
this.leaderboardGroupName = leaderboardGroupName;
|
||||
this.leaderboardGroupId = leaderboardGroupId;
|
||||
floatingSharingButtonsResources = FloatingSharingButtonsResources.INSTANCE;
|
||||
floatingSharingButtonsResources.css().ensureInjected();
|
||||
timer.addTimeListener(this);
|
||||
raceMapImageManager = new RaceMapImageManager(raceMapResources);
|
||||
markDTOs = new HashMap<String, MarkDTO>();
|
||||
@@ -919,8 +924,15 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
|
||||
if (showHeaderPanel) {
|
||||
createHeaderPanel(map);
|
||||
}
|
||||
if (shareLinkAction != null) {
|
||||
final Button shareLinkButton = createShareLinkButton(map);
|
||||
map.setControls(ControlPosition.RIGHT_BOTTOM, shareLinkButton);
|
||||
}
|
||||
if (showMapControls) {
|
||||
createSettingsButton(map);
|
||||
final VerticalPanel settingsCotrolFlowPanel = new VerticalPanel();
|
||||
final Button settingsButton = createSettingsButton(map);
|
||||
settingsCotrolFlowPanel.add(settingsButton);
|
||||
map.setControls(ControlPosition.RIGHT_TOP, settingsCotrolFlowPanel);
|
||||
}
|
||||
// Data has been initialized
|
||||
RaceMap.this.redraw();
|
||||
@@ -986,7 +998,7 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
|
||||
map.setControls(ControlPosition.TOP_RIGHT, headerPanel);
|
||||
}
|
||||
|
||||
private void createSettingsButton(MapWidget map) {
|
||||
private Button createSettingsButton(MapWidget map) {
|
||||
final Component<RaceMapSettings> component = this;
|
||||
Button settingsButton = new Button();
|
||||
settingsButton.setStyleName("gwt-MapSettingsButton");
|
||||
@@ -1000,7 +1012,23 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
|
||||
dialog.show();
|
||||
}
|
||||
});
|
||||
map.setControls(ControlPosition.RIGHT_TOP, settingsButton);
|
||||
return settingsButton;
|
||||
}
|
||||
|
||||
private Button createShareLinkButton(MapWidget map) {
|
||||
Button shareLinkButton = new Button();
|
||||
shareLinkButton.setStyleName(floatingSharingButtonsResources.css().sharing_item());
|
||||
shareLinkButton.addStyleName(floatingSharingButtonsResources.css().sharing_itemshare());
|
||||
shareLinkButton.addStyleName(raceMapStyle.raceMapShareLinkButton());
|
||||
shareLinkButton.ensureDebugId("raceMapShareLink");
|
||||
shareLinkButton.setTitle(stringMessages.shareTheLink());
|
||||
shareLinkButton.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
shareLinkAction.run();
|
||||
}
|
||||
});
|
||||
return shareLinkButton;
|
||||
}
|
||||
|
||||
private void removeTransitions() {
|
||||
|
||||
+1
@@ -20,4 +20,5 @@ public interface RaceMapStyle extends CssResource {
|
||||
public String trueNorthIndicatorPanel();
|
||||
public String estimatedDuration();
|
||||
public String estimatedDurationWithHeader();
|
||||
public String raceMapShareLinkButton();
|
||||
}
|
||||
|
||||
+9
-2
@@ -49,6 +49,7 @@ public abstract class CachedRaceDataProvider<K, D> {
|
||||
private final Function<D, TimePoint> dataTimePointProvider, dataTimePointWithOffsetProvider;
|
||||
private final Map<K, EntryDataCache> cache = new HashMap<>();
|
||||
private final boolean triggerFullUpdateOnNewData;
|
||||
private final TimeRangeProvider timeRangeProvider;
|
||||
|
||||
/**
|
||||
* Creates a new {@link CachedRaceDataProvider} instance configured by the provided parameter values.
|
||||
@@ -69,6 +70,7 @@ public abstract class CachedRaceDataProvider<K, D> {
|
||||
public CachedRaceDataProvider(final TimeRangeProvider timeRangeProvider, final Timer timer,
|
||||
final Function<D, Date> dataTimePointProvider, final Supplier<Long> dataOffsetProvider,
|
||||
final boolean triggerFullUpdateOnNewData) {
|
||||
this.timeRangeProvider = timeRangeProvider;
|
||||
final Function<Supplier<Date>, Supplier<TimePoint>> converter = s -> () -> new MillisecondsTimePoint(s.get());
|
||||
this.startOfTrackingProvider = converter.apply(timeRangeProvider::getFromTime);
|
||||
this.endOfTrackingProvider = converter.apply(timeRangeProvider::getToTime);
|
||||
@@ -248,7 +250,12 @@ public abstract class CachedRaceDataProvider<K, D> {
|
||||
private final Optional<TimeRange> getUpdateTimeRange(final boolean incremental) {
|
||||
final Optional<TimeRange> result;
|
||||
if (records.isEmpty() || !incremental) {
|
||||
result = Optional.of(new TimeRangeImpl(startOfTrackingProvider.get(), getEndTimePoint(), true));
|
||||
final Date fromTime = timeRangeProvider.getFromTime();
|
||||
if (fromTime != null) {
|
||||
result = Optional.of(new TimeRangeImpl(startOfTrackingProvider.get(), getEndTimePoint(), true));
|
||||
} else {
|
||||
result = Optional.empty();
|
||||
}
|
||||
} else {
|
||||
if (isReplayingProvider.get()) {
|
||||
result = Optional.empty();
|
||||
@@ -269,7 +276,7 @@ public abstract class CachedRaceDataProvider<K, D> {
|
||||
final TimePoint end = endOfTrackingProvider.get(), live = liveTimePointProvider.get();
|
||||
return end == null ? live : new MillisecondsTimePoint(Math.min(end.asMillis(), live.asMillis()));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Updates the cache in the given {@link TimeRange time range} by removing all existing data which is included
|
||||
* and adding the provided data.
|
||||
|
||||
+8
-4
@@ -1,9 +1,12 @@
|
||||
.maneuverPanel {
|
||||
padding-top: 1em;
|
||||
padding-right: 3em;
|
||||
overflow: auto;
|
||||
position: relative;
|
||||
}
|
||||
.contentContainer {
|
||||
padding-right: 3em;
|
||||
overflow: auto;
|
||||
position: absolute;
|
||||
top: 1em;
|
||||
bottom: 0;
|
||||
padding-left: .5em;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
@@ -34,7 +37,8 @@
|
||||
background-color: transparent;
|
||||
background-size: contain;
|
||||
border: none;
|
||||
position: fixed;
|
||||
position: absolute;
|
||||
top: 1em;
|
||||
right: 1em;
|
||||
}
|
||||
|
||||
|
||||
+10
-3
@@ -220,6 +220,13 @@ public class CompetitorFilterPanel extends FlowPanel implements KeyUpHandler, Fi
|
||||
competitorSelectionProvider.clearAllFilters();
|
||||
}
|
||||
|
||||
public void updateCompetitorFilterSetAndView(final FilterSet<CompetitorDTO, FilterWithUI<CompetitorDTO>> activeFilterSet) {
|
||||
competitorsFilterSets.setActiveFilterSet(activeFilterSet);
|
||||
updateCompetitorsFilterContexts(competitorsFilterSets);
|
||||
competitorSelectionProvider.setCompetitorsFilterSet(competitorsFilterSets.getActiveFilterSetWithGeneralizedType());
|
||||
updateCompetitorsFilterControlState(competitorsFilterSets);
|
||||
}
|
||||
|
||||
private void showEditCompetitorsFiltersDialog() {
|
||||
CompetitorsFilterSetsDialog competitorsFilterSetsDialog = new CompetitorsFilterSetsDialog(competitorsFilterSets,
|
||||
stringMessages, new DialogCallback<CompetitorsFilterSets>() {
|
||||
@@ -238,15 +245,15 @@ public class CompetitorFilterPanel extends FlowPanel implements KeyUpHandler, Fi
|
||||
public void cancel() {
|
||||
}
|
||||
});
|
||||
competitorsFilterSetsDialog .show();
|
||||
competitorsFilterSetsDialog.show();
|
||||
}
|
||||
|
||||
private void insertSelectedCompetitorsFilter(CompetitorsFilterSets filterSet) {
|
||||
// selected competitors filter
|
||||
FilterSet<CompetitorDTO, FilterWithUI<CompetitorDTO>> selectedCompetitorsFilterSet =
|
||||
final FilterSet<CompetitorDTO, FilterWithUI<CompetitorDTO>> selectedCompetitorsFilterSet =
|
||||
new FilterSet<CompetitorDTO, FilterWithUI<CompetitorDTO>>(stringMessages.selectedCompetitors());
|
||||
selectedCompetitorsFilterSet.setEditable(false);
|
||||
SelectedCompetitorsFilter selectedCompetitorsFilter = new SelectedCompetitorsFilter();
|
||||
final SelectedCompetitorsFilter selectedCompetitorsFilter = new SelectedCompetitorsFilter();
|
||||
selectedCompetitorsFilter.setCompetitorSelectionProvider(competitorSelectionProvider);
|
||||
selectedCompetitorsFilterSet.addFilter(selectedCompetitorsFilter);
|
||||
filterSet.addFilterSet(0, selectedCompetitorsFilterSet);
|
||||
|
||||
+1
-1
@@ -161,7 +161,7 @@ public class SingleRaceLeaderboardPanel extends LeaderboardPanel<SingleRaceLeade
|
||||
return leaderboardSettings;
|
||||
}
|
||||
|
||||
private boolean isAutoExpandPreSelectedRace() {
|
||||
public boolean isAutoExpandPreSelectedRace() {
|
||||
return autoExpandPreSelectedRace;
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -95,7 +95,8 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingReadEntryP
|
||||
final RaceBoardPerspectiveOwnSettings raceboardPerspectiveSettings = RaceBoardPerspectiveOwnSettings
|
||||
.readSettingsFromURL(/* defaultForViewShowLeaderboard */ true, /* defaultForViewShowWindchart */ true,
|
||||
/* defaultForViewShowCompetitorsChart */ false, /* defaultForViewCompetitorFilter */ null,
|
||||
/* defaultForCanReplayDuringLiveRaces */ false, /* defaultForJumpToTag */ null);
|
||||
/* defaultForCanReplayDuringLiveRaces */ false, /*defaultShowTags*/ false, /*defaultShowManeuverTable*/false,
|
||||
/* defaultForJumpToTag */ null, /* zoomStart */ null, /* zoomEnd */ null, false);
|
||||
final RaceMapSettings defaultRaceMapSettings = RaceMapSettings.readSettingsFromURL(
|
||||
/* defaultForShowMapControls */ true, /* defaultForShowCourseGeometry */ true,
|
||||
/* defaultForMapOrientationWindUp */ true, /* defaultForViewShowStreamlets */ false,
|
||||
|
||||
+22
-16
@@ -6,6 +6,8 @@ import static com.sap.sse.common.HttpRequestHeaderConstants.HEADER_FORWARD_TO_MA
|
||||
import static com.sap.sse.common.HttpRequestHeaderConstants.HEADER_FORWARD_TO_REPLICA;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.Style.Unit;
|
||||
@@ -34,6 +36,7 @@ import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceWithCompetitorsAndBoatsDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceboardDataDTO;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.gwt.client.EntryPointHelper;
|
||||
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
|
||||
import com.sap.sse.gwt.client.formfactor.DeviceDetector;
|
||||
@@ -128,7 +131,7 @@ public class RaceBoardEntryPoint extends AbstractSailingReadEntryPoint implement
|
||||
@Override
|
||||
public void onSuccess(PerspectiveCompositeSettings<RaceBoardPerspectiveOwnSettings> settings) {
|
||||
createPerspective(mode, componentContext, settings, raceboardData, lifeCycle,
|
||||
raceboardData.getAvailableDetailTypesForLeaderboard());
|
||||
raceboardData.getAvailableDetailTypesForLeaderboard(), raceboardContextDefinition);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -149,7 +152,7 @@ public class RaceBoardEntryPoint extends AbstractSailingReadEntryPoint implement
|
||||
private void createPerspective(final RaceBoardModes raceBoardMode,
|
||||
ComponentContextWithSettingsStorage<PerspectiveCompositeSettings<RaceBoardPerspectiveOwnSettings>> context,
|
||||
PerspectiveCompositeSettings<RaceBoardPerspectiveOwnSettings> settings, RaceboardDataDTO raceboardData,
|
||||
RaceBoardPerspectiveLifecycle raceLifeCycle, Iterable<DetailType> availableDetailTypes) {
|
||||
RaceBoardPerspectiveLifecycle raceLifeCycle, Iterable<DetailType> availableDetailTypes, RaceboardContextDefinition raceboardContextDefinition) {
|
||||
final Timer timer = new Timer(PlayModes.Replay, 1000l);
|
||||
final boolean showChartMarkEditMediaButtonsAndVideo = !DeviceDetector.isMobile();
|
||||
|
||||
@@ -167,34 +170,37 @@ public class RaceBoardEntryPoint extends AbstractSailingReadEntryPoint implement
|
||||
raceboardContextDefinition.getEventId(), RaceBoardEntryPoint.this, getStringMessages(), userAgent,
|
||||
raceTimesInfoProvider, showChartMarkEditMediaButtonsAndVideo, true, availableDetailTypes,
|
||||
raceboardData.getLeaderboard(), selectedRace, raceboardData.getTrackingConnectorInfo(),
|
||||
createSailingServiceWriteInstance() /* create write instance for later admin usage */);
|
||||
createSailingServiceWriteInstance() /* create write instance for later admin usage */,
|
||||
raceboardContextDefinition);
|
||||
RootLayoutPanel.get().add(raceBoardPerspective.getEntryWidget());
|
||||
|
||||
if (raceBoardMode != null) {
|
||||
raceBoardMode.getMode().applyTo(raceBoardPerspective);
|
||||
raceBoardMode.getMode().addInitializationFinishedRunner(
|
||||
() -> selectCompetitorFromPerspectiveOwnSetting(raceBoardPerspective));
|
||||
() -> selectCompetitorFromPerspectiveOwnSetting(raceBoardPerspective, settings.getPerspectiveOwnSettings()));
|
||||
} else {
|
||||
selectCompetitorFromPerspectiveOwnSetting(raceBoardPerspective);
|
||||
selectCompetitorFromPerspectiveOwnSetting(raceBoardPerspective, settings.getPerspectiveOwnSettings());
|
||||
}
|
||||
}
|
||||
|
||||
protected void selectCompetitorFromPerspectiveOwnSetting(RaceBoardPanel raceBoardPanel) {
|
||||
RaceBoardPerspectiveOwnSettings perspectiveOwnSettings = raceBoardPanel.getSettings()
|
||||
.getPerspectiveOwnSettings();
|
||||
protected void selectCompetitorFromPerspectiveOwnSetting(RaceBoardPanel raceBoardPanel, RaceBoardPerspectiveOwnSettings perspectiveOwnSettings) {
|
||||
if (perspectiveOwnSettings != null) {
|
||||
String competitorId = perspectiveOwnSettings.getSelectedCompetitor();
|
||||
if (competitorId != null && !"".equals(competitorId)) {
|
||||
for (CompetitorDTO comp : raceBoardPanel.getCompetitorSelectionProvider().getAllCompetitors()) {
|
||||
final String oldCompetitorId = perspectiveOwnSettings.getSelectedCompetitor();
|
||||
Iterable<String> competitorIds = perspectiveOwnSettings.getSelectedCompetitors();
|
||||
if (Util.isEmpty(competitorIds) && oldCompetitorId != null) {
|
||||
competitorIds = Collections.singleton(oldCompetitorId);
|
||||
}
|
||||
final Iterable<CompetitorDTO> allCompetitors = raceBoardPanel.getCompetitorSelectionProvider()
|
||||
.getAllCompetitors();
|
||||
final Set<CompetitorDTO> selectedCompetitors = new HashSet<CompetitorDTO>();
|
||||
for (String competitorId : competitorIds) {
|
||||
for (CompetitorDTO comp : allCompetitors) {
|
||||
if (competitorId.equals(comp.getIdAsString())) {
|
||||
raceBoardPanel.getCompetitorSelectionProvider().setSelected(comp, true,
|
||||
new CompetitorSelectionChangeListener[0]);
|
||||
} else {
|
||||
raceBoardPanel.getCompetitorSelectionProvider().setSelected(comp, false,
|
||||
new CompetitorSelectionChangeListener[0]);
|
||||
selectedCompetitors.add(comp);
|
||||
}
|
||||
}
|
||||
}
|
||||
raceBoardPanel.getCompetitorSelectionProvider().setSelection(selectedCompetitors, new CompetitorSelectionChangeListener[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Regular → Executable
+130
-25
@@ -4,6 +4,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -46,8 +47,10 @@ import com.sap.sailing.domain.common.dto.TagDTO;
|
||||
import com.sap.sailing.domain.common.media.MediaTrack;
|
||||
import com.sap.sailing.domain.common.media.MediaTrackWithSecurityDTO;
|
||||
import com.sap.sailing.gwt.common.authentication.SailingAuthenticationEntryPointLinkFactory;
|
||||
import com.sap.sailing.gwt.common.client.NavigatorUtil;
|
||||
import com.sap.sailing.gwt.settings.client.leaderboard.SingleRaceLeaderboardSettings;
|
||||
import com.sap.sailing.gwt.settings.client.raceboard.RaceBoardPerspectiveOwnSettings;
|
||||
import com.sap.sailing.gwt.settings.client.raceboard.RaceboardContextDefinition;
|
||||
import com.sap.sailing.gwt.ui.client.CompetitorColorProvider;
|
||||
import com.sap.sailing.gwt.ui.client.CompetitorColorProviderImpl;
|
||||
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
|
||||
@@ -78,6 +81,7 @@ import com.sap.sailing.gwt.ui.client.shared.charts.MultiCompetitorRaceChartSetti
|
||||
import com.sap.sailing.gwt.ui.client.shared.charts.WindChart;
|
||||
import com.sap.sailing.gwt.ui.client.shared.charts.WindChartLifecycle;
|
||||
import com.sap.sailing.gwt.ui.client.shared.charts.WindChartSettings;
|
||||
import com.sap.sailing.gwt.ui.client.shared.filter.CompetitorsFilterSets;
|
||||
import com.sap.sailing.gwt.ui.client.shared.filter.FilterWithUI;
|
||||
import com.sap.sailing.gwt.ui.client.shared.filter.LeaderboardFetcher;
|
||||
import com.sap.sailing.gwt.ui.client.shared.filter.LeaderboardWithSecurityFetcher;
|
||||
@@ -100,9 +104,12 @@ import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTOWithSecurity;
|
||||
import com.sap.sailing.gwt.ui.shared.TrackingConnectorInfoDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.databylogo.DataByLogo;
|
||||
import com.sap.sse.common.Distance;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
import com.sap.sse.common.filter.FilterSet;
|
||||
import com.sap.sse.common.impl.MillisecondsDurationImpl;
|
||||
import com.sap.sse.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sse.common.settings.AbstractSettings;
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
@@ -113,6 +120,7 @@ import com.sap.sse.gwt.client.panels.ResizableFlowPanel;
|
||||
import com.sap.sse.gwt.client.player.TimeRangeWithZoomModel;
|
||||
import com.sap.sse.gwt.client.player.Timer;
|
||||
import com.sap.sse.gwt.client.shared.components.Component;
|
||||
import com.sap.sse.gwt.client.shared.components.LinkWithSettingsGenerator;
|
||||
import com.sap.sse.gwt.client.shared.components.SettingsDialog;
|
||||
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
|
||||
import com.sap.sse.gwt.client.shared.perspective.AbstractPerspectiveComposite;
|
||||
@@ -137,6 +145,7 @@ import com.sap.sse.security.ui.client.UserService;
|
||||
public class RaceBoardPanel
|
||||
extends AbstractPerspectiveComposite<RaceBoardPerspectiveLifecycle, RaceBoardPerspectiveOwnSettings>
|
||||
implements LeaderboardUpdateListener, PopupPositionProvider, RequiresResize {
|
||||
private static final String RACEBOARD_PATH = "/gwt/RaceBoard.html";
|
||||
private final SailingServiceAsync sailingService;
|
||||
private SailingServiceWriteAsync sailingServiceWrite;
|
||||
private final MediaServiceAsync mediaService;
|
||||
@@ -190,7 +199,8 @@ public class RaceBoardPanel
|
||||
|
||||
private static final RaceMapResources raceMapResources = GWT.create(RaceMapResources.class);
|
||||
private TrackingConnectorInfoDTO trackingConnectorInfo;
|
||||
|
||||
private CompetitorFilterPanel competitorSearchTextBox;
|
||||
|
||||
/**
|
||||
* @param eventId
|
||||
* an optional event that can be used for "back"-navigation in case the race board shows a race in the
|
||||
@@ -207,7 +217,8 @@ public class RaceBoardPanel
|
||||
* @param availableDetailTypes
|
||||
* A list of all Detailtypes, that will be offered in the Settingsdialog. Can be used to hide settings no
|
||||
* data exists for, eg Bravo, Expdition ect.
|
||||
* @param trackingConnectorInfo
|
||||
* @param trackingConnectorInfo
|
||||
* Information about the tracking technology provider, that was used to track the race.
|
||||
*/
|
||||
public RaceBoardPanel(Component<?> parent,
|
||||
ComponentContext<PerspectiveCompositeSettings<RaceBoardPerspectiveOwnSettings>> componentContext,
|
||||
@@ -216,12 +227,12 @@ public class RaceBoardPanel
|
||||
MediaServiceAsync mediaService, MediaServiceWriteAsync mediaServiceWrite, UserService userService,
|
||||
AsyncActionsExecutor asyncActionsExecutor, Map<CompetitorDTO, BoatDTO> competitorsAndTheirBoats,
|
||||
Timer timer, RegattaAndRaceIdentifier selectedRaceIdentifier, String leaderboardName,
|
||||
String leaderboardGroupName, UUID leaderboardGroupId, UUID eventId, ErrorReporter errorReporter,
|
||||
final StringMessages stringMessages, UserAgentDetails userAgent,
|
||||
RaceTimesInfoProvider raceTimesInfoProvider, boolean showChartMarkEditMediaButtonsAndVideo,
|
||||
boolean showHeaderPanel, Iterable<DetailType> availableDetailTypes,
|
||||
StrippedLeaderboardDTOWithSecurity leaderboardDTO, final RaceWithCompetitorsAndBoatsDTO raceDTO,
|
||||
TrackingConnectorInfoDTO trackingConnectorInfo, SailingServiceWriteAsync sailingServiceWrite) {
|
||||
String leaderboardGroupName, UUID leaderboardGroupId, UUID eventId, ErrorReporter errorReporter, final StringMessages stringMessages,
|
||||
UserAgentDetails userAgent, RaceTimesInfoProvider raceTimesInfoProvider,
|
||||
boolean showChartMarkEditMediaButtonsAndVideo, boolean showHeaderPanel,
|
||||
Iterable<DetailType> availableDetailTypes, StrippedLeaderboardDTOWithSecurity leaderboardDTO,
|
||||
final RaceWithCompetitorsAndBoatsDTO raceDTO, TrackingConnectorInfoDTO trackingConnectorInfo,
|
||||
SailingServiceWriteAsync sailingServiceWrite, RaceboardContextDefinition raceboardContextDefinition) {
|
||||
super(parent, componentContext, lifecycle, settings);
|
||||
this.sailingService = sailingService;
|
||||
this.sailingServiceWrite = sailingServiceWrite;
|
||||
@@ -239,12 +250,38 @@ public class RaceBoardPanel
|
||||
this.selectedRaceIdentifier = selectedRaceIdentifier;
|
||||
this.setRaceBoardName(selectedRaceIdentifier.getRaceName());
|
||||
this.asyncActionsExecutor = asyncActionsExecutor;
|
||||
final RaceBoardPerspectiveOwnSettings parsedPerspectiveOwnSettings = settings.getPerspectiveOwnSettings();
|
||||
FlowPanel mainPanel = new ResizableFlowPanel();
|
||||
mainPanel.setSize("100%", "100%");
|
||||
raceInformationHeader = new FlowPanel();
|
||||
raceInformationHeader.setStyleName("RegattaRaceInformation-Header");
|
||||
regattaAndRaceTimeInformationHeader = new FlowPanel();
|
||||
regattaAndRaceTimeInformationHeader.setStyleName("RegattaAndRaceTime-Header");
|
||||
Runnable shareLinkAction = null;
|
||||
if(raceboardContextDefinition != null) {
|
||||
final RaceboardContextDefinition strippedRaceBoardContextDefinition = new RaceboardContextDefinition(
|
||||
raceboardContextDefinition.getRegattaName(), raceboardContextDefinition.getRaceName(),
|
||||
raceboardContextDefinition.getLeaderboardName(), raceboardContextDefinition.getLeaderboardGroupName(),
|
||||
raceboardContextDefinition.getLeaderboardGroupId(), raceboardContextDefinition.getEventId(), null);
|
||||
final LinkWithSettingsGenerator<Settings> linkWithSettingsGenerator = new LinkWithSettingsGenerator<>(RACEBOARD_PATH, strippedRaceBoardContextDefinition);
|
||||
if(showChartMarkEditMediaButtonsAndVideo) {
|
||||
shareLinkAction = () -> {
|
||||
final ShareLinkDialog shareLinkDialog = new ShareLinkDialog(RACEBOARD_PATH, lifecycle,
|
||||
getSettings(), sailingService, stringMessages, linkWithSettingsGenerator);
|
||||
shareLinkDialog.initLinkAndShow();
|
||||
};
|
||||
}else {
|
||||
if(NavigatorUtil.clientHasNavigatorShareSupport()) {
|
||||
shareLinkAction = () -> {
|
||||
NavigatorUtil.shareUrl(linkWithSettingsGenerator.createUrl(getSettings()), null);
|
||||
};
|
||||
}else if(NavigatorUtil.clientHasNavigatorCopyToClipboardSupport()) {
|
||||
shareLinkAction = () ->{
|
||||
NavigatorUtil.copyToClipboard(linkWithSettingsGenerator.createUrl(getSettings()));
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
this.userManagementMenuView = new AuthenticationMenuViewImpl(new Anchor(), mainCss.usermanagement_loggedin(), mainCss.usermanagement_open());
|
||||
this.userManagementMenuView.asWidget().setStyleName(mainCss.usermanagement_icon());
|
||||
timeRangeWithZoomModel = new TimeRangeWithZoomModel();
|
||||
@@ -262,7 +299,7 @@ public class RaceBoardPanel
|
||||
errorReporter, timer,
|
||||
competitorSelectionProvider, raceCompetitorSet, stringMessages, selectedRaceIdentifier,
|
||||
raceMapResources, /* showHeaderPanel */ true, quickFlagDataProvider, this::showInWindChart,
|
||||
leaderboardName, leaderboardGroupName, leaderboardGroupId) {
|
||||
leaderboardName, leaderboardGroupName, leaderboardGroupId, shareLinkAction) {
|
||||
private static final String INDENT_SMALL_CONTROL_STYLE = "indentsmall";
|
||||
private static final String INDENT_BIG_CONTROL_STYLE = "indentbig";
|
||||
@Override
|
||||
@@ -309,7 +346,7 @@ public class RaceBoardPanel
|
||||
}
|
||||
});
|
||||
}
|
||||
CompetitorFilterPanel competitorSearchTextBox = new CompetitorFilterPanel(competitorSelectionProvider, stringMessages, raceMap,
|
||||
competitorSearchTextBox = new CompetitorFilterPanel(competitorSelectionProvider, stringMessages, raceMap,
|
||||
new LeaderboardFetcher() {
|
||||
@Override
|
||||
public LeaderboardDTO getLeaderboard() {
|
||||
@@ -321,7 +358,7 @@ public class RaceBoardPanel
|
||||
raceMap.getRightHeaderPanel().add(userManagementMenuView);
|
||||
addChildComponent(raceMap);
|
||||
// add panel for tagging functionality, hidden if no URL parameter "tag" is passed
|
||||
final String sharedTagURLParameter = settings.getPerspectiveOwnSettings().getJumpToTag();
|
||||
final String sharedTagURLParameter = parsedPerspectiveOwnSettings.getJumpToTag();
|
||||
String sharedTagTitle = null;
|
||||
TimePoint sharedTagTimePoint = null;
|
||||
boolean showTaggingPanel = false;
|
||||
@@ -359,19 +396,19 @@ public class RaceBoardPanel
|
||||
leaderboardPanel.addLeaderboardUpdateListener(this);
|
||||
// in case the URL configuration contains the name of a competitors filter set we try to activate it
|
||||
// FIXME the competitorsFilterSets has now moved to CompetitorSearchTextBox (which should probably be renamed); pass on the parameters to the LeaderboardPanel and see what it does with it
|
||||
if (getPerspectiveSettings().getActiveCompetitorsFilterSetName() != null) {
|
||||
if (parsedPerspectiveOwnSettings.getActiveCompetitorsFilterSetName() != null) {
|
||||
for (FilterSet<CompetitorDTO, FilterWithUI<CompetitorDTO>> filterSet : competitorSearchTextBox.getCompetitorsFilterSets().getFilterSets()) {
|
||||
if (filterSet.getName().equals(getPerspectiveSettings().getActiveCompetitorsFilterSetName())) {
|
||||
competitorSearchTextBox.getCompetitorsFilterSets().setActiveFilterSet(filterSet);
|
||||
if (filterSet.getName().equals(parsedPerspectiveOwnSettings.getActiveCompetitorsFilterSetName())) {
|
||||
competitorSearchTextBox.updateCompetitorFilterSetAndView(filterSet);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
racetimePanel = new RaceTimePanel(this, componentContext, raceTimePanelLifecycle, userService, timer,
|
||||
timeRangeWithZoomModel,
|
||||
stringMessages, raceTimesInfoProvider, getPerspectiveSettings().isCanReplayDuringLiveRaces(),
|
||||
stringMessages, raceTimesInfoProvider, parsedPerspectiveOwnSettings.isCanReplayDuringLiveRaces(),
|
||||
showChartMarkEditMediaButtonsAndVideo, selectedRaceIdentifier,
|
||||
getPerspectiveSettings().getInitialDurationAfterRaceStartInReplay(), raceDTO);
|
||||
parsedPerspectiveOwnSettings.getInitialDurationAfterRaceStartInReplay(), raceDTO);
|
||||
racetimePanel.updateSettings(raceTimePanelSettings);
|
||||
timeRangeWithZoomModel.addTimeZoomChangeListener(racetimePanel);
|
||||
raceTimesInfoProvider.addRaceTimesInfoProviderListener(racetimePanel);
|
||||
@@ -380,6 +417,18 @@ public class RaceBoardPanel
|
||||
if (advanceTimePanelEnabled) {
|
||||
manageTimePanelToggleButton(advanceTimePanelEnabled);
|
||||
}
|
||||
addChildComponent(racetimePanel);
|
||||
final Long zoomStartMillis = parsedPerspectiveOwnSettings.getZoomStart();
|
||||
final Long zoomEndMillis = parsedPerspectiveOwnSettings.getZoomEnd();
|
||||
if(isScreenLargeEnoughToInitiallyDisplayLeaderboard && zoomStartMillis != null && zoomEndMillis != null) {
|
||||
final Date zoomStart = new Date(zoomStartMillis);
|
||||
final Date zoomEnd = new Date(zoomEndMillis);
|
||||
Scheduler.get().scheduleDeferred(new Command() {
|
||||
public void execute () {
|
||||
timeRangeWithZoomModel.setTimeZoom(zoomStart, zoomEnd);
|
||||
}
|
||||
});
|
||||
}
|
||||
dockPanel = new DockLayoutPanel(Unit.PX);
|
||||
dockPanel.addSouth(timePanelWrapper, TIMEPANEL_COLLAPSED_HEIGHT);
|
||||
dockPanel.add(mainPanel);
|
||||
@@ -413,6 +462,7 @@ public class RaceBoardPanel
|
||||
MultiCompetitorRaceChartSettings multiCompetitorRaceChartSettings = settings
|
||||
.findSettingsByComponentId(multiCompetitorRaceChartLifecycle.getComponentId());
|
||||
// create the default leaderboard and select the right race
|
||||
final RaceBoardPerspectiveOwnSettings initialPerspectiveOwnSettings = settings.getPerspectiveOwnSettings();
|
||||
raceTimesInfoProvider.addRaceTimesInfoProviderListener(raceMap);
|
||||
List<Component<?>> componentsForSideBySideViewer = new ArrayList<Component<?>>();
|
||||
if (showChartMarkEditMediaButtonsAndVideo) {
|
||||
@@ -483,23 +533,27 @@ public class RaceBoardPanel
|
||||
};
|
||||
mapViewer = new SideBySideComponentViewer(leaderboardPanel, raceMap, taggingPanel, mediaPlayerManagerComponent,
|
||||
componentsForSideBySideViewer, stringMessages, userService, editMarkPassingPanel, editMarkPositionPanel,
|
||||
maneuverTablePanel, asyncFetcher);
|
||||
asyncFetcher);
|
||||
mediaPlayerManagerComponent.addPlayerChangeListener(new PlayerChangeListener() {
|
||||
@Override
|
||||
public void notifyStateChange() {
|
||||
updateRaceTimePanelOverlay();
|
||||
}
|
||||
});
|
||||
addChildComponent(mediaPlayerManagerComponent);
|
||||
for (Component<? extends Settings> component : componentsForSideBySideViewer) {
|
||||
addChildComponent(component);
|
||||
}
|
||||
this.setupUserManagementControlPanel(userService);
|
||||
mainPanel.add(mapViewer.getViewerWidget());
|
||||
boolean showLeaderboard = getPerspectiveSettings().isShowLeaderboard() && isScreenLargeEnoughToInitiallyDisplayLeaderboard;
|
||||
boolean showLeaderboard = initialPerspectiveOwnSettings.isShowLeaderboard() && isScreenLargeEnoughToInitiallyDisplayLeaderboard;
|
||||
setLeaderboardVisible(showLeaderboard);
|
||||
leaderboardPanel.setAutoExpandPreSelected(initialPerspectiveOwnSettings.isAutoExpandPreSelectedRace());
|
||||
if (showChartMarkEditMediaButtonsAndVideo) {
|
||||
setWindChartVisible(getPerspectiveSettings().isShowWindChart());
|
||||
setCompetitorChartVisible(getPerspectiveSettings().isShowCompetitorsChart());
|
||||
setWindChartVisible(initialPerspectiveOwnSettings.isShowWindChart());
|
||||
setCompetitorChartVisible(initialPerspectiveOwnSettings.isShowCompetitorsChart());
|
||||
setTagPanelVisible(initialPerspectiveOwnSettings.isShowTags());
|
||||
setManeuverTableVisible(initialPerspectiveOwnSettings.isShowManeuver());
|
||||
}
|
||||
// make sure to load leaderboard data for filtering to work
|
||||
if (!showLeaderboard) {
|
||||
@@ -560,7 +614,7 @@ public class RaceBoardPanel
|
||||
}
|
||||
|
||||
private void setComponentVisible(SideBySideComponentViewer componentViewer, Component<?> component, boolean visible) {
|
||||
component.setVisible(visible);
|
||||
component.setVisible(visible);
|
||||
componentViewer.forceLayout();
|
||||
}
|
||||
|
||||
@@ -649,6 +703,14 @@ public class RaceBoardPanel
|
||||
setComponentVisible(mapViewer, competitorChart, visible);
|
||||
}
|
||||
|
||||
public void setTagPanelVisible(boolean visible) {
|
||||
setComponentVisible(mapViewer, taggingPanel, visible);
|
||||
}
|
||||
|
||||
public void setManeuverTableVisible(boolean visible) {
|
||||
setComponentVisible(mapViewer, maneuverTablePanel, visible);
|
||||
}
|
||||
|
||||
protected SailingServiceAsync getSailingService() {
|
||||
return sailingService;
|
||||
}
|
||||
@@ -791,15 +853,12 @@ public class RaceBoardPanel
|
||||
ResizableFlowPanel timeLineInnerBgPanel = new ResizableFlowPanel();
|
||||
timeLineInnerBgPanel.addStyleName("timeLineInnerBgPanel");
|
||||
timeLineInnerBgPanel.add(getRaceTimePanel());
|
||||
|
||||
ResizableFlowPanel timeLineInnerPanel = new ResizableFlowPanel();
|
||||
timeLineInnerPanel.add(timeLineInnerBgPanel);
|
||||
timeLineInnerPanel.addStyleName("timeLineInnerPanel");
|
||||
|
||||
ResizableFlowPanel timelinePanel = new ResizableFlowPanel();
|
||||
timelinePanel.add(timeLineInnerPanel);
|
||||
timelinePanel.addStyleName("timeLinePanel");
|
||||
|
||||
return timelinePanel;
|
||||
}
|
||||
|
||||
@@ -808,6 +867,52 @@ public class RaceBoardPanel
|
||||
return new RaceBoardPerspectiveSettingsDialogComponent(getPerspectiveSettings(), stringMessages);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected RaceBoardPerspectiveOwnSettings getPerspectiveSettings() {
|
||||
final RaceBoardPerspectiveOwnSettings initialSettings = super.getPerspectiveSettings();
|
||||
final CompetitorsFilterSets leaderboardFiterPanelFilterSets = competitorSearchTextBox
|
||||
.getCompetitorsFilterSets();
|
||||
FilterSet<CompetitorDTO, FilterWithUI<CompetitorDTO>> activeFilterSet = leaderboardFiterPanelFilterSets
|
||||
.getActiveFilterSet();
|
||||
String activeCompetitorsFilterSetName;
|
||||
if (activeFilterSet != null) {
|
||||
activeCompetitorsFilterSetName = activeFilterSet.getName();
|
||||
} else {
|
||||
activeCompetitorsFilterSetName = initialSettings.getActiveCompetitorsFilterSetName();
|
||||
}
|
||||
final Set<String> selectedCompetitorIds = new HashSet<>();
|
||||
final Duration newInitialDurationAfterRaceStartInReplay;
|
||||
if (timer != null && racetimePanel != null) {
|
||||
final Date currentTimerDate = timer.getTime();
|
||||
final Date startOfRace = racetimePanel.getLastRaceTimesInfo().startOfRace;
|
||||
newInitialDurationAfterRaceStartInReplay = new MillisecondsDurationImpl(
|
||||
currentTimerDate.getTime() - startOfRace.getTime());
|
||||
} else {
|
||||
newInitialDurationAfterRaceStartInReplay = initialSettings.getInitialDurationAfterRaceStartInReplay();
|
||||
}
|
||||
for (final CompetitorDTO competitorDTO : getCompetitorSelectionProvider().getSelectedCompetitors()) {
|
||||
selectedCompetitorIds.add(competitorDTO.getIdAsString());
|
||||
}
|
||||
final Pair<Date, Date> timeZoom = timeRangeWithZoomModel.getTimeZoom();
|
||||
Long zoomStartInMillis = null;
|
||||
Long zoomEndInMillis = null;
|
||||
if(timeZoom.getA() != null && timeZoom.getB() != null) {
|
||||
zoomStartInMillis = timeZoom.getA().getTime();
|
||||
zoomEndInMillis = timeZoom.getB().getTime();
|
||||
}
|
||||
final boolean isCompetitorChartVisible = competitorChart == null ? false : competitorChart.isVisible();
|
||||
final boolean isWindChartVisible = windChart == null ? false : windChart.isVisible();
|
||||
final boolean isManeuverTableVisible = maneuverTablePanel == null ? false : maneuverTablePanel.isVisible();
|
||||
final boolean autoExpandPreSelectedRace = leaderboardPanel.isAutoExpandPreSelectedRace();
|
||||
RaceBoardPerspectiveOwnSettings raceBoardPerspectiveOwnSettings = new RaceBoardPerspectiveOwnSettings(
|
||||
activeCompetitorsFilterSetName, leaderboardPanel.isVisible(), isWindChartVisible,
|
||||
isCompetitorChartVisible, initialSettings.isCanReplayDuringLiveRaces(),
|
||||
newInitialDurationAfterRaceStartInReplay, /* legacy single selectedCompetitor */ null,
|
||||
selectedCompetitorIds, taggingPanel.isVisible(), isManeuverTableVisible,
|
||||
initialSettings.getJumpToTag(), zoomStartInMillis, zoomEndInMillis, autoExpandPreSelectedRace);
|
||||
return raceBoardPerspectiveOwnSettings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPerspectiveOwnSettings() {
|
||||
return true;
|
||||
@@ -815,7 +920,7 @@ public class RaceBoardPanel
|
||||
|
||||
@Override
|
||||
public void onResize() {
|
||||
dockPanel.onResize();
|
||||
dockPanel.onResize();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+5
-4
@@ -33,11 +33,11 @@ public class RaceBoardPerspectiveSettingsDialogComponent implements SettingsDial
|
||||
|
||||
showWindChartCheckBox = dialog.createCheckbox(stringMessages.showWindChart());
|
||||
showWindChartCheckBox.setValue(initialSettings.isShowWindChart());
|
||||
vp.add(showWindChartCheckBox);
|
||||
vp.add(showWindChartCheckBox);
|
||||
|
||||
showCompetitorsChartCheckBox = dialog.createCheckbox(stringMessages.showCompetitorCharts());
|
||||
showCompetitorsChartCheckBox.setValue(initialSettings.isShowCompetitorsChart());
|
||||
vp.add(showCompetitorsChartCheckBox);
|
||||
vp.add(showCompetitorsChartCheckBox);
|
||||
|
||||
return vp;
|
||||
}
|
||||
@@ -46,8 +46,9 @@ public class RaceBoardPerspectiveSettingsDialogComponent implements SettingsDial
|
||||
public RaceBoardPerspectiveOwnSettings getResult() {
|
||||
RaceBoardPerspectiveOwnSettings result = new RaceBoardPerspectiveOwnSettings(initialSettings.getActiveCompetitorsFilterSetName(),
|
||||
showLeaderboardCheckBox.getValue(), showWindChartCheckBox.getValue(), showCompetitorsChartCheckBox.getValue(),
|
||||
initialSettings.isCanReplayDuringLiveRaces(),
|
||||
initialSettings.getInitialDurationAfterRaceStartInReplay(), initialSettings.getSelectedCompetitor(), initialSettings.getJumpToTag());
|
||||
initialSettings.isCanReplayDuringLiveRaces(), initialSettings.getInitialDurationAfterRaceStartInReplay(),
|
||||
initialSettings.getSelectedCompetitor(), initialSettings.getSelectedCompetitors(), initialSettings.isShowTags(),
|
||||
initialSettings.isShowManeuver(), initialSettings.getJumpToTag(), initialSettings.getZoomStart(), initialSettings.getZoomEnd(), initialSettings.isAutoExpandPreSelectedRace());
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Executable
+186
@@ -0,0 +1,186 @@
|
||||
package com.sap.sailing.gwt.ui.raceboard;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.ClickHandler;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.Anchor;
|
||||
import com.google.gwt.user.client.ui.CheckBox;
|
||||
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
|
||||
import com.google.gwt.user.client.ui.Image;
|
||||
import com.google.gwt.user.client.ui.TextBox;
|
||||
import com.google.gwt.user.client.ui.VerticalPanel;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.common.client.NavigatorUtil;
|
||||
import com.sap.sailing.gwt.settings.client.raceboard.RaceBoardPerspectiveOwnSettings;
|
||||
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.common.settings.generic.support.SettingsUtil;
|
||||
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
|
||||
import com.sap.sse.gwt.client.shared.components.LinkWithSettingsGenerator;
|
||||
import com.sap.sse.gwt.client.shared.perspective.PerspectiveCompositeSettings;
|
||||
import com.sap.sse.gwt.client.shared.perspective.PerspectiveLifecycle;
|
||||
|
||||
public class ShareLinkDialog extends DataEntryDialog<String> {
|
||||
private final PerspectiveLifecycle<RaceBoardPerspectiveOwnSettings> lifecycle;
|
||||
private final PerspectiveCompositeSettings<RaceBoardPerspectiveOwnSettings> perspectiveCompositeSettings;
|
||||
private final LinkWithSettingsGenerator<Settings> linkWithSettingsGenerator;
|
||||
private final SailingServiceAsync sailingService;
|
||||
private CheckBox timeStampCheckbox;
|
||||
private CheckBox windChartCheckBox;
|
||||
private CheckBox leaderBoardPanelCheckBox;
|
||||
private CheckBox competitorChartCheckBox;
|
||||
private CheckBox filterSetNameCheckBox;
|
||||
private CheckBox competitorSelectionCheckBox;
|
||||
private CheckBox tagsCheckBox;
|
||||
private CheckBox maneuverCheckBox;
|
||||
private CheckBox zoomCheckBox;
|
||||
private TextBox linkField;
|
||||
private Image qrCodeImage;
|
||||
private VerticalPanel mainPanel;
|
||||
|
||||
public ShareLinkDialog(String path, PerspectiveLifecycle<RaceBoardPerspectiveOwnSettings> lifecycle,
|
||||
PerspectiveCompositeSettings<RaceBoardPerspectiveOwnSettings> perspectiveCompositeSettings,
|
||||
SailingServiceAsync sailingService, StringMessages stringMessages,
|
||||
LinkWithSettingsGenerator<Settings> linkWithSettingsGenerator) {
|
||||
super(stringMessages.shareTheLink(), "", stringMessages.ok(), stringMessages.cancel(), /* validator */ null,
|
||||
/* callback */ null);
|
||||
this.lifecycle = lifecycle;
|
||||
this.perspectiveCompositeSettings = perspectiveCompositeSettings;
|
||||
this.sailingService = sailingService;
|
||||
this.linkWithSettingsGenerator = linkWithSettingsGenerator;
|
||||
mainPanel = new VerticalPanel();
|
||||
mainPanel.setSpacing(30);
|
||||
mainPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
|
||||
final VerticalPanel settingsPanel = new VerticalPanel();
|
||||
settingsPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
|
||||
mainPanel.add(settingsPanel);
|
||||
initializeCheckboxes(stringMessages, settingsPanel);
|
||||
VerticalPanel linkContentPanel = new VerticalPanel();
|
||||
linkContentPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
|
||||
linkField = createTextBox(assembleLink());
|
||||
linkContentPanel.add(linkField);
|
||||
qrCodeImage = new Image();
|
||||
qrCodeImage.ensureDebugId("regattaSharingQrCode");
|
||||
qrCodeImage.setPixelSize(400, 400);
|
||||
qrCodeImage.setAltText(stringMessages.alternateTextIfQRCodeTooBig());
|
||||
if (NavigatorUtil.clientHasNavigatorCopyToClipboardSupport()) {
|
||||
Anchor copyToClipBoardAnchor = new Anchor(stringMessages.copyToClipboard());
|
||||
copyToClipBoardAnchor.addClickHandler(event -> NavigatorUtil.copyToClipboard(linkField.getText()));
|
||||
linkContentPanel.add(copyToClipBoardAnchor);
|
||||
}
|
||||
linkContentPanel.add(qrCodeImage);
|
||||
mainPanel.add(linkContentPanel);
|
||||
}
|
||||
|
||||
private void initializeCheckboxes(StringMessages stringMessages, final VerticalPanel settingsPanel) {
|
||||
timeStampCheckbox = createCheckBoxAndAddToPanel(settingsPanel, stringMessages.timeStampCheckBoxLabel());
|
||||
leaderBoardPanelCheckBox = createCheckBoxAndAddToPanel(settingsPanel, stringMessages.leaderboardCheckBoxLabel());
|
||||
tagsCheckBox = createCheckBoxAndAddToPanel(settingsPanel, stringMessages.tagsCheckBoxLabel());
|
||||
filterSetNameCheckBox = createCheckBoxAndAddToPanel(settingsPanel, stringMessages.filterSetNameCheckBoxLabel());
|
||||
competitorSelectionCheckBox = createCheckBoxAndAddToPanel(settingsPanel, stringMessages.competitorSelectionCheckBoxLabel());
|
||||
windChartCheckBox = createCheckBoxAndAddToPanel(settingsPanel, stringMessages.windChartCheckBoxLabel());
|
||||
competitorChartCheckBox = createCheckBoxAndAddToPanel(settingsPanel, stringMessages.competitorChartCheckBoxLabel());
|
||||
maneuverCheckBox = createCheckBoxAndAddToPanel(settingsPanel, stringMessages.maneuverCheckBoxLabel());
|
||||
zoomCheckBox = createCheckBoxAndAddToPanel(settingsPanel, stringMessages.zoomCheckBoxLabel());
|
||||
}
|
||||
|
||||
public void initLinkAndShow() {
|
||||
String url = linkWithSettingsGenerator.createUrl(perspectiveCompositeSettings);
|
||||
createQrCode(url, this::show);
|
||||
}
|
||||
|
||||
void updateLink() {
|
||||
String url = assembleLink();
|
||||
linkField.setText(url);
|
||||
createQrCode(url, () -> {});
|
||||
}
|
||||
|
||||
private void createQrCode(String url, Runnable callback) {
|
||||
sailingService.createRaceBoardLinkQrCode(url, new AsyncCallback<String>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
GWT.log("Qrcode generation failed: ", caught);
|
||||
callback.run();
|
||||
}
|
||||
@Override
|
||||
public void onSuccess(String result) {
|
||||
if(result == null){
|
||||
GWT.log("Qrcode generation failed.");
|
||||
}else {
|
||||
GWT.log("Qrcode generated for url: " + url);
|
||||
}
|
||||
qrCodeImage.setUrl("data:image/png;base64, " + result);
|
||||
callback.run();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private String assembleLink() {
|
||||
PerspectiveCompositeSettings<RaceBoardPerspectiveOwnSettings> patchedSettings = patchSettings();
|
||||
String url = this.linkWithSettingsGenerator.createUrl(patchedSettings);
|
||||
return url;
|
||||
}
|
||||
|
||||
private PerspectiveCompositeSettings<RaceBoardPerspectiveOwnSettings> patchSettings() {
|
||||
PerspectiveCompositeSettings<RaceBoardPerspectiveOwnSettings> patchedSettings = lifecycle
|
||||
.createDefaultSettings();
|
||||
SettingsUtil.copyValues(perspectiveCompositeSettings, patchedSettings);
|
||||
final RaceBoardPerspectiveOwnSettings patchedPerspectiveOwnSettings = patchedSettings
|
||||
.getPerspectiveOwnSettings();
|
||||
if (!competitorChartCheckBox.getValue()) {
|
||||
patchedPerspectiveOwnSettings.resetShowCompetitorsChart();
|
||||
}
|
||||
if (!leaderBoardPanelCheckBox.getValue()) {
|
||||
patchedPerspectiveOwnSettings.resetShowLeaderBoard();
|
||||
}
|
||||
if (!windChartCheckBox.getValue()) {
|
||||
patchedPerspectiveOwnSettings.resetShowWindChart();
|
||||
}
|
||||
if (!tagsCheckBox.getValue()) {
|
||||
patchedPerspectiveOwnSettings.resetShowTags();
|
||||
}
|
||||
if (!maneuverCheckBox.getValue()) {
|
||||
patchedPerspectiveOwnSettings.resetShowManeuver();
|
||||
}
|
||||
if (!zoomCheckBox.getValue()) {
|
||||
patchedPerspectiveOwnSettings.resetZoomStart();
|
||||
patchedPerspectiveOwnSettings.resetZoomEnd();
|
||||
}
|
||||
if (!timeStampCheckbox.getValue()) {
|
||||
patchedPerspectiveOwnSettings.resetInitialDurationAfterRaceStartInReplay();
|
||||
}
|
||||
if (!filterSetNameCheckBox.getValue()) {
|
||||
patchedPerspectiveOwnSettings.resetActiveCompetitorsFilterSetName();
|
||||
}
|
||||
if (!competitorSelectionCheckBox.getValue()) {
|
||||
patchedPerspectiveOwnSettings.resetSelectedCompetitor();
|
||||
patchedPerspectiveOwnSettings.resetSelectedCompetitors();
|
||||
}
|
||||
return patchedSettings;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getResult() {
|
||||
return assembleLink();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Widget getAdditionalWidget() {
|
||||
return mainPanel;
|
||||
}
|
||||
|
||||
private CheckBox createCheckBoxAndAddToPanel(VerticalPanel settingsPanel, String label) {
|
||||
CheckBox checkBox = createCheckbox(label);
|
||||
checkBox.setValue(true);
|
||||
checkBox.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
updateLink();
|
||||
}
|
||||
});
|
||||
settingsPanel.add(checkBox);
|
||||
return checkBox;
|
||||
}
|
||||
}
|
||||
+1
-2
@@ -28,7 +28,6 @@ import com.sap.sailing.gwt.ui.client.media.MediaSingleSelectionControl;
|
||||
import com.sap.sailing.gwt.ui.client.shared.charts.EditMarkPassingsPanel;
|
||||
import com.sap.sailing.gwt.ui.client.shared.charts.EditMarkPositionPanel;
|
||||
import com.sap.sailing.gwt.ui.client.shared.filter.LeaderboardWithSecurityFetcher;
|
||||
import com.sap.sailing.gwt.ui.client.shared.racemap.maneuver.ManeuverTablePanel;
|
||||
import com.sap.sailing.gwt.ui.raceboard.TouchSplitLayoutPanel.Splitter;
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
import com.sap.sse.common.settings.AbstractSettings;
|
||||
@@ -88,7 +87,7 @@ public class SideBySideComponentViewer implements UserStatusEventHandler {
|
||||
final Component<?> rightComponentP, final MediaPlayerManagerComponent mediaPlayerManagerComponent,
|
||||
List<Component<?>> components, final StringMessages stringMessages, UserService userService,
|
||||
EditMarkPassingsPanel markPassingsPanel, EditMarkPositionPanel markPositionPanel,
|
||||
ManeuverTablePanel maneuverTablePanel, final LeaderboardWithSecurityFetcher asyncLeaderboardFetcher) {
|
||||
final LeaderboardWithSecurityFetcher asyncLeaderboardFetcher) {
|
||||
this.mediaPlayerManagerComponent = mediaPlayerManagerComponent;
|
||||
this.stringMessages = stringMessages;
|
||||
this.leftComponent = leftComponentP;
|
||||
|
||||
-3
@@ -35,7 +35,6 @@ public class SingleRaceLeaderboardPanelLifecycle extends LeaderboardPanelLifecyc
|
||||
raceDetails.add(DetailType.RACE_DISPLAY_LEGS);
|
||||
List<DetailType> overallDetails = new ArrayList<>();
|
||||
SingleRaceLeaderboardSettings defaultSettings = new SingleRaceLeaderboardSettings(canBoatsOfCompetitorsChangePerRace);
|
||||
|
||||
// don't show competitor fullName column if even leaderboard isn't shown initially
|
||||
final boolean showCompetitorFullNameColumn = isScreenLargeEnoughToInitiallyDisplayLeaderboard;
|
||||
SingleRaceLeaderboardSettings settings = new SingleRaceLeaderboardSettings(
|
||||
@@ -48,7 +47,6 @@ public class SingleRaceLeaderboardPanelLifecycle extends LeaderboardPanelLifecyc
|
||||
/* isCompetitorNationalityColumnVisible */ false,
|
||||
/* showRaceRankColumn */ false);
|
||||
SettingsUtil.copyDefaultsFromValues(settings, settings);
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
@@ -56,5 +54,4 @@ public class SingleRaceLeaderboardPanelLifecycle extends LeaderboardPanelLifecyc
|
||||
public SingleRaceLeaderboardSettingsDialogComponent getSettingsDialogComponent(SingleRaceLeaderboardSettings settings) {
|
||||
return new SingleRaceLeaderboardSettingsDialogComponent(settings, stringMessages, availableDetailTypes);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+6
-1
@@ -733,6 +733,11 @@ public class TouchSplitLayoutPanel extends DockLayoutPanel {
|
||||
return buttonFlowPanel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void forceLayout() {
|
||||
ensureVerticalToggleButtonPosition();
|
||||
}
|
||||
|
||||
/**
|
||||
* This method ensures that the toggle buttons always are positioned on top of all split panels. This requires
|
||||
* a bit of trickery as there are some edge cases (e.g. when no splitter is visible at all).
|
||||
@@ -805,7 +810,7 @@ public class TouchSplitLayoutPanel extends DockLayoutPanel {
|
||||
}
|
||||
|
||||
}
|
||||
forceLayout();
|
||||
super.forceLayout();
|
||||
}
|
||||
|
||||
public boolean hidePanelContaining(Widget child) {
|
||||
|
||||
+23
-5
@@ -5803,16 +5803,34 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
|
||||
@Override
|
||||
public String openRegattaRegistrationQrCode(String url) {
|
||||
String result;
|
||||
try (DataInputStream imageIs = new DataInputStream(QRCodeGenerationUtil.create(url, 600, "H"))) {
|
||||
byte[] targetArray = new byte[imageIs.available()];
|
||||
imageIs.readFully(targetArray);
|
||||
result = Base64Utils.toBase64(targetArray);
|
||||
try {
|
||||
result = createEncodedQRCodeFromUrl(url, 600);
|
||||
} catch (Exception e) {
|
||||
logger.log(Level.WARNING, "Error while generating QR code for open regatta", e);
|
||||
result = "";
|
||||
result = null;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public String createRaceBoardLinkQrCode(String url) {
|
||||
String result;
|
||||
try {
|
||||
result = createEncodedQRCodeFromUrl(url, 400);
|
||||
} catch (Exception e) {
|
||||
logger.log(Level.WARNING, "Error while generating QR code for RaceBoard sharing", e);
|
||||
result = null;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public String createEncodedQRCodeFromUrl(String url, int size) throws Exception {
|
||||
final String result;
|
||||
DataInputStream imageIs = new DataInputStream(QRCodeGenerationUtil.create(url, size, "H"));
|
||||
byte[] targetArray = new byte[imageIs.available()];
|
||||
imageIs.readFully(targetArray);
|
||||
result = Base64Utils.toBase64(targetArray);
|
||||
return result;
|
||||
}
|
||||
|
||||
private Boolean isSelfServiceServer() {
|
||||
final AccessControlListAnnotation serverAclOrNull = getSecurityService().getAccessControlList(getServerInfo().getIdentifier());
|
||||
|
||||
+2
-1
@@ -3,6 +3,7 @@ package com.sap.sailing.gwt.ui.shared.racemap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.gwt.core.client.Scheduler;
|
||||
import com.google.gwt.dom.client.Document;
|
||||
import com.google.gwt.dom.client.ScriptElement;
|
||||
|
||||
@@ -46,7 +47,7 @@ public class GoogleMapsLoader {
|
||||
*/
|
||||
public static void load(Runnable callback) {
|
||||
if (loaded) {
|
||||
callback.run();
|
||||
Scheduler.get().scheduleDeferred(() -> callback.run());
|
||||
} else {
|
||||
callbacks.add(callback);
|
||||
if (!loading) {
|
||||
|
||||
+9
-9
@@ -134,7 +134,7 @@ public class TestProcedures {
|
||||
// this is expected to have connected to the default "live" replica set.
|
||||
startEmptyMultiServer.run();
|
||||
final ApplicationProcessHost<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>> host = startEmptyMultiServer.getHost();
|
||||
final SshCommandChannel sshChannel = host.createRootSshChannel(optionalTimeout, privateKeyEncryptionPassphrase);
|
||||
final SshCommandChannel sshChannel = host.createRootSshChannel(optionalTimeout, /* optional SSH key pair name */ Optional.empty(), privateKeyEncryptionPassphrase);
|
||||
final String result = sshChannel.runCommandAndReturnStdoutAndLogStderr("ls "+ApplicationProcessHost.DEFAULT_SERVERS_PATH, /* stderr prefix */ null, /* stderr log level */ null);
|
||||
assertTrue(result.isEmpty());
|
||||
final HttpURLConnection connection = (HttpURLConnection) new URL("http", host.getPublicAddress().getCanonicalHostName(), 80, "").openConnection();
|
||||
@@ -149,10 +149,10 @@ public class TestProcedures {
|
||||
assertEquals(new HashSet<>(Arrays.asList(SailingAnalyticsApplicationConfiguration.Builder.DEFAULT_PORT, SailingAnalyticsApplicationConfiguration.Builder.DEFAULT_PORT+1)),
|
||||
new HashSet<>(Arrays.asList(processA.getPort(), processB.getPort())));
|
||||
assertEquals(new HashSet<>(Arrays.asList(SailingAnalyticsApplicationConfiguration.Builder.DEFAULT_TELNET_PORT, SailingAnalyticsApplicationConfiguration.Builder.DEFAULT_TELNET_PORT+1)),
|
||||
new HashSet<>(Arrays.asList(processA.getTelnetPortToOSGiConsole(optionalTimeout, privateKeyEncryptionPassphrase), processB.getTelnetPortToOSGiConsole(optionalTimeout, privateKeyEncryptionPassphrase))));
|
||||
new HashSet<>(Arrays.asList(processA.getTelnetPortToOSGiConsole(optionalTimeout, /* optional SSH key pair name */ Optional.empty(), privateKeyEncryptionPassphrase), processB.getTelnetPortToOSGiConsole(optionalTimeout, /* optional SSH key pair name */ Optional.empty(), privateKeyEncryptionPassphrase))));
|
||||
assertEquals(new HashSet<>(Arrays.asList(SailingAnalyticsApplicationConfiguration.Builder.DEFAULT_EXPEDITION_PORT, SailingAnalyticsApplicationConfiguration.Builder.DEFAULT_EXPEDITION_PORT+1)),
|
||||
new HashSet<>(Arrays.asList(processA.getExpeditionUdpPort(optionalTimeout, privateKeyEncryptionPassphrase), processB.getExpeditionUdpPort(optionalTimeout, privateKeyEncryptionPassphrase))));
|
||||
final SshCommandChannel curlChannel = host.createRootSshChannel(optionalTimeout, privateKeyEncryptionPassphrase);
|
||||
new HashSet<>(Arrays.asList(processA.getExpeditionUdpPort(optionalTimeout, /* optional SSH key pair name */ Optional.empty(), privateKeyEncryptionPassphrase), processB.getExpeditionUdpPort(optionalTimeout, /* optional SSH key pair name */ Optional.empty(), privateKeyEncryptionPassphrase))));
|
||||
final SshCommandChannel curlChannel = host.createRootSshChannel(optionalTimeout, /* optional SSH key pair name */ Optional.empty(), privateKeyEncryptionPassphrase);
|
||||
final ByteArrayOutputStream stderr = new ByteArrayOutputStream();
|
||||
curlChannel.sendCommandLineSynchronously(
|
||||
"curl -k -i -H \"Host: b.sapsailing.com\" \"https://127.0.0.1\"", stderr);
|
||||
@@ -163,11 +163,11 @@ public class TestProcedures {
|
||||
final Iterable<ApplicationReplicaSet<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>>> replicaSets =
|
||||
landscape.getApplicationReplicaSetsByTag(region, sailingAnalyticsServerTag, (theHost, dir)->{
|
||||
try {
|
||||
return new SailingAnalyticsProcessImpl<String>(theHost, dir, optionalTimeout, privateKeyEncryptionPassphrase);
|
||||
return new SailingAnalyticsProcessImpl<String>(theHost, dir, optionalTimeout, /* optional SSH key pair name */ Optional.empty(), privateKeyEncryptionPassphrase);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}, optionalTimeout, privateKeyEncryptionPassphrase);
|
||||
}, optionalTimeout, /* optional SSH key pair name */ Optional.empty(), privateKeyEncryptionPassphrase);
|
||||
// expecting to find at least "a" and "b"
|
||||
assertTrue(Util.containsAll(Util.map(replicaSets, ApplicationReplicaSet::getName), Arrays.asList(aServerName, bServerName)));
|
||||
Util.filter(replicaSets, rs->rs.getName().equals(aServerName) || rs.getName().equals(bServerName)).forEach(rs->assertTrue(Util.isEmpty(rs.getReplicas()) && rs.getMaster() != null));
|
||||
@@ -239,7 +239,7 @@ public class TestProcedures {
|
||||
boolean fine = true;
|
||||
do {
|
||||
try {
|
||||
final SshCommandChannel sshChannel = mongoProcess.getHost().createSshChannel("ec2-user", optionalTimeout, privateKeyEncryptionPassphrase);
|
||||
final SshCommandChannel sshChannel = mongoProcess.getHost().createSshChannel("ec2-user", optionalTimeout, /* optional SSH key pair name */ Optional.empty(), privateKeyEncryptionPassphrase);
|
||||
final String stdout = sshChannel.runCommandAndReturnStdoutAndLogStderr(
|
||||
"i=0; while [ $i -lt $(echo \"rs.status().members.length\" | mongo 2>/dev/null | tail -n +5 | head -n +1) ]; do echo \"rs.status().members[$i].stateStr\" | mongo 2>/dev/null | tail -n +5 | head -n +1; i=$((i+1)); done",
|
||||
"stderr while trying to fetch replica set members", Level.WARNING);
|
||||
@@ -328,10 +328,10 @@ public class TestProcedures {
|
||||
// check env.sh access
|
||||
final SailingAnalyticsProcess<String> process = startSailingAnalyticsMaster.getSailingAnalyticsProcess();
|
||||
assertTrue(process.waitUntilReady(optionalTimeout));
|
||||
final String envSh = process.getEnvSh(optionalTimeout, privateKeyEncryptionPassphrase);
|
||||
final String envSh = process.getEnvSh(optionalTimeout, /* optional SSH key pair name */ Optional.empty(), privateKeyEncryptionPassphrase);
|
||||
assertFalse(envSh.isEmpty());
|
||||
assertTrue("Couldn't find SERVER_NAME=\""+serverName+"\" in env.sh:\n"+envSh, envSh.contains("SERVER_NAME=\""+serverName+"\""));
|
||||
assertEquals(14888, process.getTelnetPortToOSGiConsole(optionalTimeout, privateKeyEncryptionPassphrase));
|
||||
assertEquals(14888, process.getTelnetPortToOSGiConsole(optionalTimeout, /* optional SSH key pair name */ Optional.empty(), privateKeyEncryptionPassphrase));
|
||||
// Now create an ALB mapping, assuming to create the dynamic ALB:
|
||||
final String domain = "wiesen-weg.de";
|
||||
final String hostname = serverName+"."+domain;
|
||||
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
package com.sap.sailing.landscape.ui.client;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import com.google.gwt.text.shared.SafeHtmlRenderer;
|
||||
import com.sap.sailing.landscape.ui.client.i18n.StringMessages;
|
||||
import com.sap.sse.gwt.client.IconResources;
|
||||
import com.sap.sse.gwt.client.celltable.ImagesBarCell;
|
||||
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
|
||||
|
||||
public class AmazonMachineImagesImagesBarCell extends ImagesBarCell {
|
||||
static final String ACTION_REMOVE = DefaultActions.DELETE.name();
|
||||
static final String ACTION_UPGRADE = "UPGRADE";
|
||||
|
||||
private final StringMessages stringMessages;
|
||||
|
||||
public AmazonMachineImagesImagesBarCell(StringMessages stringMessages) {
|
||||
super();
|
||||
this.stringMessages = stringMessages;
|
||||
}
|
||||
|
||||
public AmazonMachineImagesImagesBarCell(SafeHtmlRenderer<String> renderer, StringMessages stringMessages) {
|
||||
super();
|
||||
this.stringMessages = stringMessages;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<ImageSpec> getImageSpecs() {
|
||||
return Arrays.asList(
|
||||
new ImageSpec(ACTION_REMOVE, stringMessages.remove(),
|
||||
IconResources.INSTANCE.removeIcon()),
|
||||
new ImageSpec(ACTION_UPGRADE, stringMessages.upgrade(),
|
||||
IconResources.INSTANCE.refreshIcon())
|
||||
);
|
||||
}
|
||||
}
|
||||
+157
-35
@@ -3,13 +3,16 @@ package com.sap.sailing.landscape.ui.client;
|
||||
import static com.sap.sse.common.HttpRequestHeaderConstants.HEADER_FORWARD_TO_MASTER;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashSet;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.user.cellview.client.TextColumn;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.rpc.ServiceDefTarget;
|
||||
import com.google.gwt.user.client.ui.CaptionPanel;
|
||||
@@ -20,6 +23,7 @@ import com.google.gwt.user.client.ui.PasswordTextBox;
|
||||
import com.google.gwt.user.client.ui.TextBox;
|
||||
import com.google.gwt.user.client.ui.VerticalPanel;
|
||||
import com.sap.sailing.landscape.ui.client.i18n.StringMessages;
|
||||
import com.sap.sailing.landscape.ui.shared.AmazonMachineImageDTO;
|
||||
import com.sap.sailing.landscape.ui.shared.MongoEndpointDTO;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
@@ -27,9 +31,13 @@ import com.sap.sse.common.util.NaturalComparator;
|
||||
import com.sap.sse.gwt.adminconsole.AdminConsoleTableResources;
|
||||
import com.sap.sse.gwt.client.EntryPointHelper;
|
||||
import com.sap.sse.gwt.client.ErrorReporter;
|
||||
import com.sap.sse.gwt.client.Notification;
|
||||
import com.sap.sse.gwt.client.Notification.NotificationType;
|
||||
import com.sap.sse.gwt.client.celltable.ActionsColumn;
|
||||
import com.sap.sse.gwt.client.celltable.TableWrapperWithSingleSelectionAndFilter;
|
||||
import com.sap.sse.gwt.client.controls.busyindicator.BusyIndicator;
|
||||
import com.sap.sse.gwt.client.controls.busyindicator.SimpleBusyIndicator;
|
||||
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
|
||||
import com.sap.sse.security.ui.client.UserService;
|
||||
|
||||
/**
|
||||
@@ -64,12 +72,17 @@ public class LandscapeManagementPanel extends VerticalPanel implements AwsAccess
|
||||
private final LandscapeManagementWriteServiceAsync landscapeManagementService;
|
||||
private final TableWrapperWithSingleSelectionAndFilter<String, StringMessages, AdminConsoleTableResources> regionsTable;
|
||||
private final TableWrapperWithSingleSelectionAndFilter<MongoEndpointDTO, StringMessages, AdminConsoleTableResources> mongoEndpointsTable;
|
||||
private final BusyIndicator mongoEndpointsBusy;
|
||||
private final TableWrapperWithSingleSelectionAndFilter<AmazonMachineImageDTO, StringMessages, AdminConsoleTableResources> machineImagesTable;
|
||||
private final BusyIndicator machineImagesBusy;
|
||||
private final TextBox awsAccessKeyTextBox;
|
||||
private final PasswordTextBox awsSecretPasswordTextBox;
|
||||
private final ErrorReporter errorReporter;
|
||||
private final static String AWS_ACCESS_KEY_USER_PREFERENCE = "aws.access.key";
|
||||
|
||||
public LandscapeManagementPanel(StringMessages stringMessages, UserService userService,
|
||||
AdminConsoleTableResources tableResources, ErrorReporter errorReporter) {
|
||||
this.errorReporter = errorReporter;
|
||||
landscapeManagementService = initAndRegisterLandscapeManagementService();
|
||||
final HorizontalPanel awsCredentialsAndSshKeys = new HorizontalPanel();
|
||||
add(awsCredentialsAndSshKeys);
|
||||
@@ -125,7 +138,9 @@ public class LandscapeManagementPanel extends VerticalPanel implements AwsAccess
|
||||
return s;
|
||||
}
|
||||
}, stringMessages.region(), new NaturalComparator());
|
||||
add(regionsTable);
|
||||
final CaptionPanel regionsCaptionPanel = new CaptionPanel(stringMessages.region());
|
||||
regionsCaptionPanel.add(regionsTable);
|
||||
add(regionsCaptionPanel);
|
||||
landscapeManagementService.getRegions(new AsyncCallback<ArrayList<String>>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
@@ -155,47 +170,60 @@ public class LandscapeManagementPanel extends VerticalPanel implements AwsAccess
|
||||
return result;
|
||||
}
|
||||
};
|
||||
mongoEndpointsTable.addColumn(new TextColumn<MongoEndpointDTO>() {
|
||||
@Override
|
||||
public String getValue(MongoEndpointDTO mongoEndpointDTO) {
|
||||
return mongoEndpointDTO.getReplicaSetName();
|
||||
}
|
||||
}, stringMessages.replicaSet(), (me1, me2)->new NaturalComparator().compare(me1.getReplicaSetName(), me2.getReplicaSetName()));
|
||||
mongoEndpointsTable.addColumn(mongoEndpointDTO->mongoEndpointDTO.getReplicaSetName(), stringMessages.replicaSet());
|
||||
mongoEndpointsTable.addColumn(new TextColumn<MongoEndpointDTO>() {
|
||||
@Override
|
||||
public String getValue(MongoEndpointDTO mongoEndpointDTO) {
|
||||
return Util.joinStrings(",", Util.map(mongoEndpointDTO.getHostnamesAndPorts(), hostnameAndPort->hostnameAndPort.getA()+":"+hostnameAndPort.getB()));
|
||||
}
|
||||
}, stringMessages.hostname());
|
||||
add(mongoEndpointsTable);
|
||||
final BusyIndicator mongoEndpointsBusy = new SimpleBusyIndicator();
|
||||
add(mongoEndpointsBusy);
|
||||
final CaptionPanel mongoEndpointsCaptionPanel = new CaptionPanel(stringMessages.mongoEndpoints());
|
||||
final VerticalPanel mongoEndpointsVerticalPanel = new VerticalPanel();
|
||||
mongoEndpointsCaptionPanel.add(mongoEndpointsVerticalPanel);
|
||||
mongoEndpointsVerticalPanel.add(mongoEndpointsTable);
|
||||
mongoEndpointsBusy = new SimpleBusyIndicator();
|
||||
mongoEndpointsVerticalPanel.add(mongoEndpointsBusy);
|
||||
add(mongoEndpointsCaptionPanel);
|
||||
machineImagesTable = new TableWrapperWithSingleSelectionAndFilter<AmazonMachineImageDTO, StringMessages, AdminConsoleTableResources>(
|
||||
stringMessages, errorReporter, /* enablePager */ false,
|
||||
/* entity identity comparator */ Optional.empty(), GWT.create(AdminConsoleTableResources.class),
|
||||
/* checkbox filter function */ Optional.empty(), /* filter label */ Optional.empty(),
|
||||
/* filter checkbox label */ null) {
|
||||
@Override
|
||||
protected Iterable<String> getSearchableStrings(AmazonMachineImageDTO t) {
|
||||
return Arrays.asList(t.getRegionId(), t.getId(), t.getName(), t.getState() );
|
||||
}
|
||||
};
|
||||
machineImagesTable.addColumn(object->object.getId(), stringMessages.id());
|
||||
machineImagesTable.addColumn(object->object.getRegionId(), stringMessages.region());
|
||||
machineImagesTable.addColumn(object->object.getName(), stringMessages.name());
|
||||
machineImagesTable.addColumn(object->object.getType(), stringMessages.imageType());
|
||||
machineImagesTable.addColumn(object->object.getState(), stringMessages.state());
|
||||
machineImagesTable.addColumn(new TextColumn<AmazonMachineImageDTO>() {
|
||||
@Override
|
||||
public String getValue(AmazonMachineImageDTO object) {
|
||||
return object.getCreationTimePoint().toString();
|
||||
}
|
||||
}, stringMessages.createdAt(), Comparator.nullsLast((t1, t2)->t1.getCreationTimePoint().compareTo(t2.getCreationTimePoint())));
|
||||
final ActionsColumn<AmazonMachineImageDTO, AmazonMachineImagesImagesBarCell> machineImagesActionColumn = new ActionsColumn<AmazonMachineImageDTO, AmazonMachineImagesImagesBarCell>(
|
||||
new AmazonMachineImagesImagesBarCell(stringMessages), /* permission checker */ (machineImage, action)->true);
|
||||
machineImagesActionColumn.addAction(AmazonMachineImagesImagesBarCell.ACTION_REMOVE, DefaultActions.DELETE, machineImageToRemove->removeMachineImage(stringMessages, machineImageToRemove));
|
||||
machineImagesActionColumn.addAction(AmazonMachineImagesImagesBarCell.ACTION_UPGRADE, machineImageToUpgrade->upgradeMachineImage(stringMessages, machineImageToUpgrade));
|
||||
machineImagesTable.addColumn(machineImagesActionColumn);
|
||||
final CaptionPanel machineImagesCaptionPanel = new CaptionPanel(stringMessages.machineImages());
|
||||
final VerticalPanel machineImagesVerticalPanel = new VerticalPanel();
|
||||
machineImagesCaptionPanel.add(machineImagesVerticalPanel);
|
||||
machineImagesVerticalPanel.add(machineImagesTable);
|
||||
machineImagesBusy = new SimpleBusyIndicator();
|
||||
machineImagesVerticalPanel.add(machineImagesBusy);
|
||||
add(machineImagesCaptionPanel);
|
||||
regionsTable.getSelectionModel().addSelectionChangeHandler(e->
|
||||
{
|
||||
sshKeyManagementPanel.showKeysInRegion(awsAccessKeyTextBox.getValue(), awsSecretPasswordTextBox.getValue(),
|
||||
regionsTable.getSelectionModel().getSelectedObject());
|
||||
mongoEndpointsTable.getDataProvider().getList().clear();
|
||||
if (regionsTable.getSelectionModel().getSelectedObject() != null) {
|
||||
mongoEndpointsBusy.setBusy(true);
|
||||
landscapeManagementService.getMongoEndpoints(awsAccessKeyTextBox.getValue(), awsSecretPasswordTextBox.getValue(),
|
||||
regionsTable.getSelectionModel().getSelectedObject(), new AsyncCallback<ArrayList<MongoEndpointDTO>>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError(caught.getMessage());
|
||||
mongoEndpointsBusy.setBusy(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(ArrayList<MongoEndpointDTO> mongoEndpointDTOs) {
|
||||
mongoEndpointsTable.refresh(mongoEndpointDTOs);
|
||||
mongoEndpointsBusy.setBusy(false);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
mongoEndpointsTable.getDataProvider().getList().clear();
|
||||
}
|
||||
});
|
||||
// TODO support SSH key management: show existing keys, allow user to paste an encrypted private key for storage in MongoDB; allow user to upload public key and choose for launch and login procedures;
|
||||
{
|
||||
sshKeyManagementPanel.showKeysInRegion(awsAccessKeyTextBox.getValue(), awsSecretPasswordTextBox.getValue(),
|
||||
regionsTable.getSelectionModel().getSelectedObject());
|
||||
refreshMongoEndpointsTable();
|
||||
refreshMachineImagesTable();
|
||||
});
|
||||
// TODO SSH keys: allow user to provide pass phrase for the decryption of a private key only in the browser
|
||||
// TODO upon region selection show AppServer clusters, and upgradable AMIs in region
|
||||
// TODO try to identify archive servers
|
||||
@@ -208,7 +236,101 @@ public class LandscapeManagementPanel extends VerticalPanel implements AwsAccess
|
||||
// TODO support archiving and dismantling of an application server cluster
|
||||
// TODO support deploying a new app server process instance onto an existing app server host (multi-instance)
|
||||
}
|
||||
|
||||
private void refreshMongoEndpointsTable() {
|
||||
mongoEndpointsTable.getDataProvider().getList().clear();
|
||||
if (regionsTable.getSelectionModel().getSelectedObject() != null) {
|
||||
mongoEndpointsBusy.setBusy(true);
|
||||
landscapeManagementService.getMongoEndpoints(awsAccessKeyTextBox.getValue(), awsSecretPasswordTextBox.getValue(),
|
||||
regionsTable.getSelectionModel().getSelectedObject(), new AsyncCallback<ArrayList<MongoEndpointDTO>>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError(caught.getMessage());
|
||||
mongoEndpointsBusy.setBusy(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(ArrayList<MongoEndpointDTO> mongoEndpointDTOs) {
|
||||
mongoEndpointsTable.refresh(mongoEndpointDTOs);
|
||||
mongoEndpointsBusy.setBusy(false);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
mongoEndpointsTable.getDataProvider().getList().clear();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void refreshMachineImagesTable() {
|
||||
machineImagesTable.getDataProvider().getList().clear();
|
||||
if (regionsTable.getSelectionModel().getSelectedObject() != null) {
|
||||
machineImagesBusy.setBusy(true);
|
||||
landscapeManagementService.getAmazonMachineImages(awsAccessKeyTextBox.getValue(), awsSecretPasswordTextBox.getValue(),
|
||||
regionsTable.getSelectionModel().getSelectedObject(), new AsyncCallback<ArrayList<AmazonMachineImageDTO>>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError(caught.getMessage());
|
||||
machineImagesBusy.setBusy(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(ArrayList<AmazonMachineImageDTO> machineImagesDTOs) {
|
||||
machineImagesTable.refresh(machineImagesDTOs);
|
||||
machineImagesBusy.setBusy(false);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
machineImagesTable.getDataProvider().getList().clear();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void upgradeMachineImage(final StringMessages stringMessages, final AmazonMachineImageDTO machineImageToUpgrade) {
|
||||
Notification.notify(stringMessages.startedImageUpgrade(machineImageToUpgrade.getName(), machineImageToUpgrade.getId(), machineImageToUpgrade.getRegionId()), NotificationType.INFO);
|
||||
machineImagesBusy.setBusy(true);
|
||||
landscapeManagementService.upgradeAmazonMachineImage(awsAccessKeyTextBox.getValue(), awsSecretPasswordTextBox.getValue(),
|
||||
machineImageToUpgrade.getRegionId(), machineImageToUpgrade.getId(),
|
||||
new AsyncCallback<AmazonMachineImageDTO>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError(caught.getMessage());
|
||||
machineImagesBusy.setBusy(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(AmazonMachineImageDTO result) {
|
||||
machineImagesBusy.setBusy(false);
|
||||
refreshMachineImagesTable();
|
||||
Notification.notify(
|
||||
stringMessages.successfullyUpgradedMachineImage(machineImageToUpgrade.getName(),
|
||||
machineImageToUpgrade.getId(), machineImageToUpgrade.getRegionId(), result.getName()),
|
||||
NotificationType.SUCCESS);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void removeMachineImage(final StringMessages stringMessages, final AmazonMachineImageDTO machineImageToRemove) {
|
||||
if (Window.confirm(stringMessages.doYouReallyWantToRemoveMachineImage(machineImageToRemove.getName(), machineImageToRemove.getId(), machineImageToRemove.getRegionId()))) {
|
||||
landscapeManagementService.removeAmazonMachineImage(awsAccessKeyTextBox.getValue(), awsSecretPasswordTextBox.getValue(),
|
||||
machineImageToRemove.getRegionId(), machineImageToRemove.getId(),
|
||||
new AsyncCallback<Void>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError(caught.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(Void result) {
|
||||
machineImagesTable.remove(machineImageToRemove);
|
||||
Notification.notify(
|
||||
stringMessages.successfullyRemovedMachineImage(machineImageToRemove.getName(),
|
||||
machineImageToRemove.getId(), machineImageToRemove.getRegionId()),
|
||||
NotificationType.SUCCESS);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private LandscapeManagementWriteServiceAsync initAndRegisterLandscapeManagementService() {
|
||||
final LandscapeManagementWriteServiceAsync result = GWT.create(LandscapeManagementWriteService.class);
|
||||
EntryPointHelper.registerASyncService((ServiceDefTarget) result,
|
||||
|
||||
+11
@@ -3,6 +3,7 @@ package com.sap.sailing.landscape.ui.client;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.google.gwt.user.client.rpc.RemoteService;
|
||||
import com.sap.sailing.landscape.ui.shared.AmazonMachineImageDTO;
|
||||
import com.sap.sailing.landscape.ui.shared.MongoEndpointDTO;
|
||||
import com.sap.sailing.landscape.ui.shared.SSHKeyPairDTO;
|
||||
|
||||
@@ -21,4 +22,14 @@ public interface LandscapeManagementWriteService extends RemoteService {
|
||||
|
||||
SSHKeyPairDTO addSshKeyPair(String awsAccessKey, String awsSecret, String regionId, String keyName, String publicKey,
|
||||
String encryptedPrivateKey) throws Exception;
|
||||
|
||||
byte[] getEncryptedSshPrivateKey(String regionId, String keyName) throws Exception;
|
||||
|
||||
byte[] getSshPublicKey(String regionId, String keyName) throws Exception;
|
||||
|
||||
ArrayList<AmazonMachineImageDTO> getAmazonMachineImages(String awsAccessKey, String awsSecret, String region);
|
||||
|
||||
void removeAmazonMachineImage(String awsAccessKey, String awsSecret, String region, String machineImageId);
|
||||
|
||||
AmazonMachineImageDTO upgradeAmazonMachineImage(String awsAccessKey, String awsSecret, String region, String machineImageId) throws Exception;
|
||||
}
|
||||
|
||||
+12
@@ -3,6 +3,7 @@ package com.sap.sailing.landscape.ui.client;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.sap.sailing.landscape.ui.shared.AmazonMachineImageDTO;
|
||||
import com.sap.sailing.landscape.ui.shared.MongoEndpointDTO;
|
||||
import com.sap.sailing.landscape.ui.shared.SSHKeyPairDTO;
|
||||
|
||||
@@ -39,4 +40,15 @@ public interface LandscapeManagementWriteServiceAsync {
|
||||
*/
|
||||
void addSshKeyPair(String awsAccessKey, String awsSecret, String regionId, String keyName, String publicKey,
|
||||
String encryptedPrivateKey, AsyncCallback<SSHKeyPairDTO> callback);
|
||||
|
||||
void getEncryptedSshPrivateKey(String regionId, String keyName, AsyncCallback<byte[]> callback);
|
||||
|
||||
void getSshPublicKey(String regionId, String keyName, AsyncCallback<byte[]> callback);
|
||||
|
||||
void getAmazonMachineImages(String awsAccessKey, String awsSecret, String region, AsyncCallback<ArrayList<AmazonMachineImageDTO>> callback);
|
||||
|
||||
void removeAmazonMachineImage(String awsAccessKey, String awsSecret, String region, String machineImageId, AsyncCallback<Void> callback);
|
||||
|
||||
void upgradeAmazonMachineImage(String awsAccessKey, String awsSecret, String region, String machineImageId,
|
||||
AsyncCallback<AmazonMachineImageDTO> callback);
|
||||
}
|
||||
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
package com.sap.sailing.landscape.ui.client;
|
||||
|
||||
import com.google.gwt.user.client.ui.Anchor;
|
||||
import com.google.gwt.user.client.ui.Grid;
|
||||
import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.TextArea;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.landscape.ui.client.i18n.StringMessages;
|
||||
import com.sap.sse.common.Base64Utils;
|
||||
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
|
||||
|
||||
public class SshKeyDisplayAndDownloadDialog extends DataEntryDialog<Void> {
|
||||
private final TextArea publicKeyTextArea;
|
||||
private final TextArea encryptedPrivateKeyTextArea;
|
||||
private final Anchor publicKeyDownloadLink;
|
||||
private final Anchor encryptedPrivateKeyDownloadLink;
|
||||
private final StringMessages stringMessages;
|
||||
|
||||
public SshKeyDisplayAndDownloadDialog(String keyName, byte[] publicKey, byte[] encryptedPrivateKey, StringMessages stringMessages) {
|
||||
super(stringMessages.sshKeys(), stringMessages.sshKeys(), stringMessages.close(), /* cancelButtonName */ null, /* validator */ null, /* callback */ null);
|
||||
this.stringMessages = stringMessages;
|
||||
publicKeyTextArea = new TextArea();
|
||||
publicKeyTextArea.setSize("40em", "6em");
|
||||
publicKeyTextArea.setText(new String(publicKey));
|
||||
encryptedPrivateKeyTextArea = new TextArea();
|
||||
encryptedPrivateKeyTextArea.setSize("40em", "6em");
|
||||
encryptedPrivateKeyTextArea.setText(new String(encryptedPrivateKey));
|
||||
publicKeyDownloadLink = new Anchor(stringMessages.download());
|
||||
publicKeyDownloadLink.getElement().setAttribute("download", keyName+".pub");
|
||||
publicKeyDownloadLink.setHref("data:application/octet-stream;charset=utf-8;base64,"+Base64Utils.toBase64(publicKey));
|
||||
encryptedPrivateKeyDownloadLink = new Anchor(stringMessages.download());
|
||||
encryptedPrivateKeyDownloadLink.getElement().setAttribute("download", keyName);
|
||||
encryptedPrivateKeyDownloadLink.setHref("data:application/octet-stream;charset=utf-8;base64,"+Base64Utils.toBase64(encryptedPrivateKey));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Widget getAdditionalWidget() {
|
||||
final Grid result = new Grid(4, 2);
|
||||
int row=0;
|
||||
result.setWidget(row++, 0, new Label(stringMessages.publicKey()));
|
||||
result.setWidget(row, 0, publicKeyTextArea);
|
||||
result.setWidget(row++, 1, publicKeyDownloadLink);
|
||||
result.setWidget(row++, 0, new Label(stringMessages.encryptedPrivateKey()));
|
||||
result.setWidget(row, 0, encryptedPrivateKeyTextArea);
|
||||
result.setWidget(row++, 1, encryptedPrivateKeyDownloadLink);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Void getResult() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
+37
-2
@@ -9,6 +9,8 @@ import java.util.Optional;
|
||||
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.Button;
|
||||
import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.PasswordTextBox;
|
||||
import com.google.gwt.user.client.ui.VerticalPanel;
|
||||
import com.sap.sailing.landscape.ui.client.i18n.StringMessages;
|
||||
import com.sap.sailing.landscape.ui.shared.SSHKeyPairDTO;
|
||||
@@ -28,8 +30,8 @@ import com.sap.sse.security.ui.client.UserService;
|
||||
import com.sap.sse.security.ui.client.component.AccessControlledActionsColumn;
|
||||
import com.sap.sse.security.ui.client.component.AccessControlledButtonPanel;
|
||||
import com.sap.sse.security.ui.client.component.EditOwnershipDialog;
|
||||
import com.sap.sse.security.ui.client.component.SecuredDTOOwnerColumn;
|
||||
import com.sap.sse.security.ui.client.component.EditOwnershipDialog.DialogConfig;
|
||||
import com.sap.sse.security.ui.client.component.SecuredDTOOwnerColumn;
|
||||
import com.sap.sse.security.ui.client.component.editacl.EditACLDialog;
|
||||
|
||||
/**
|
||||
@@ -41,6 +43,7 @@ import com.sap.sse.security.ui.client.component.editacl.EditACLDialog;
|
||||
public class SshKeyManagementPanel extends VerticalPanel {
|
||||
private final LandscapeManagementWriteServiceAsync landscapeManagementService;
|
||||
private final TableWrapperWithSingleSelectionAndFilter<SSHKeyPairDTO, StringMessages, AdminConsoleTableResources> sshKeyTable;
|
||||
private final PasswordTextBox sshPrivateKeyPassphrase;
|
||||
private final BusyIndicator sshKeyLoadingBusy;
|
||||
private final ErrorReporter errorReporter;
|
||||
private final RefreshableSingleSelectionModel<String> regionSelectionModel;
|
||||
@@ -52,6 +55,7 @@ public class SshKeyManagementPanel extends VerticalPanel {
|
||||
this.regionSelectionModel = regionSelectionModel;
|
||||
this.landscapeManagementService = landscapeManagementService;
|
||||
this.errorReporter = errorReporter;
|
||||
this.sshPrivateKeyPassphrase = new PasswordTextBox();
|
||||
final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, SecuredLandscapeTypes.SSH_KEY);
|
||||
add(buttonPanel);
|
||||
final Button addButton = buttonPanel.addCreateAction(stringMessages.add(), ()->{
|
||||
@@ -110,10 +114,33 @@ public class SshKeyManagementPanel extends VerticalPanel {
|
||||
public void onSuccess(Void result) {
|
||||
sshKeyTable.remove(sshKeyPairDTO);
|
||||
}
|
||||
|
||||
}));
|
||||
sshKeyPairActionColumn.addAction(SshKeyPairImagesBarCell.ACTION_SHOW_KEYS, DefaultActions.READ,
|
||||
sshKeyPairDTO->landscapeManagementService.getSshPublicKey(sshKeyPairDTO.getRegionId(), sshKeyPairDTO.getName(), new AsyncCallback<byte[]>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError(caught.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(final byte[] publicKey) {
|
||||
landscapeManagementService.getEncryptedSshPrivateKey(sshKeyPairDTO.getRegionId(), sshKeyPairDTO.getName(), new AsyncCallback<byte[]>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError(caught.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(final byte[] encryptedPrivateKey) {
|
||||
showKeys(sshKeyPairDTO.getName(), publicKey, encryptedPrivateKey, stringMessages);
|
||||
}
|
||||
});
|
||||
}
|
||||
}));
|
||||
sshKeyTable.addColumn(sshKeyPairActionColumn);
|
||||
add(sshKeyTable);
|
||||
add(new Label(stringMessages.sshPrivateKeyPassphraseForSelectedKeyPair()));
|
||||
add(sshPrivateKeyPassphrase);
|
||||
sshKeyLoadingBusy = new SimpleBusyIndicator();
|
||||
add(sshKeyLoadingBusy);
|
||||
buttonPanel.addRemoveAction(stringMessages.remove(), sshKeyTable.getSelectionModel(), /* withConfirmation */ true, ()->{
|
||||
@@ -138,6 +165,14 @@ public class SshKeyManagementPanel extends VerticalPanel {
|
||||
});
|
||||
}
|
||||
|
||||
public String getPassphraseForPrivateKeyDecryption() {
|
||||
return sshPrivateKeyPassphrase.getValue();
|
||||
}
|
||||
|
||||
private void showKeys(String keyName, byte[] publicKey, byte[] encryptedPrivateKey, StringMessages stringMessages) {
|
||||
new SshKeyDisplayAndDownloadDialog(keyName, publicKey, encryptedPrivateKey, stringMessages).show();
|
||||
}
|
||||
|
||||
private void openGenerateSshKeyDialog(StringMessages stringMessages, AwsAccessKeyProvider awsAccessKeyProvider) {
|
||||
new GenerateSshKeyDialog(stringMessages,
|
||||
new DialogCallback<Triple<String, String, String>>() {
|
||||
|
||||
+5
-1
@@ -12,6 +12,7 @@ public class SshKeyPairImagesBarCell extends ImagesBarCell {
|
||||
static final String ACTION_REMOVE = "ACTION_REMOVE";
|
||||
public static final String ACTION_CHANGE_OWNERSHIP = DefaultActions.CHANGE_OWNERSHIP.name();
|
||||
public static final String ACTION_CHANGE_ACL = DefaultActions.CHANGE_ACL.name();
|
||||
public static final String ACTION_SHOW_KEYS = DefaultActions.READ.name();
|
||||
|
||||
private final StringMessages stringMessages;
|
||||
|
||||
@@ -28,11 +29,14 @@ public class SshKeyPairImagesBarCell extends ImagesBarCell {
|
||||
@Override
|
||||
protected Iterable<ImageSpec> getImageSpecs() {
|
||||
return Arrays.asList(
|
||||
new ImageSpec(ACTION_SHOW_KEYS, stringMessages.showKeys(),
|
||||
IconResources.INSTANCE.downloadIcon()),
|
||||
new ImageSpec(ACTION_REMOVE, stringMessages.remove(),
|
||||
IconResources.INSTANCE.removeIcon()),
|
||||
new ImageSpec(ACTION_CHANGE_OWNERSHIP, stringMessages.actionChangeOwnership(),
|
||||
IconResources.INSTANCE.changeOwnershipIcon()),
|
||||
new ImageSpec(ACTION_CHANGE_ACL, stringMessages.actionChangeACL(),
|
||||
IconResources.INSTANCE.changeACLIcon()));
|
||||
IconResources.INSTANCE.changeACLIcon())
|
||||
);
|
||||
}
|
||||
}
|
||||
+12
@@ -29,4 +29,16 @@ com.sap.sse.gwt.adminconsole.StringMessages {
|
||||
String pleaseProvidePassphrase();
|
||||
String pleaseRepeatPassphrase();
|
||||
String passphrasesDontMatch();
|
||||
String showKeys();
|
||||
String download();
|
||||
String encryptedPrivateKey();
|
||||
String sshPrivateKeyPassphraseForSelectedKeyPair();
|
||||
String state();
|
||||
String createdAt();
|
||||
String mongoEndpoints();
|
||||
String machineImages();
|
||||
String doYouReallyWantToRemoveMachineImage(String name, String id, String regionId);
|
||||
String successfullyRemovedMachineImage(String name, String id, String regionId);
|
||||
String successfullyUpgradedMachineImage(String name, String id, String regionId, String newName);
|
||||
String startedImageUpgrade(String name, String id, String regionId);
|
||||
}
|
||||
|
||||
+12
@@ -18,3 +18,15 @@ generate=Generate
|
||||
pleaseProvidePassphrase=Please provide passphrase for private key
|
||||
pleaseRepeatPassphrase=Please repeat passphrase for private key
|
||||
passphrasesDontMatch=The two passphrases don''t match
|
||||
showKeys=Show public and (encrypted) private key
|
||||
download=Download
|
||||
encryptedPrivateKey=Encrypted private key
|
||||
sshPrivateKeyPassphraseForSelectedKeyPair=Passphrase for private key of selected SSH key pair
|
||||
state=State
|
||||
createdAt=Created at
|
||||
mongoEndpoints=MongoDB Endpoints
|
||||
machineImages=Amazon Machine Images (AMIs)
|
||||
doYouReallyWantToRemoveMachineImage=Do you really want to remove the machine image {0} with ID {1} in region {2}?
|
||||
successfullyRemovedMachineImage=Machine image {0} with ID {1} in region {2} removed successfully.
|
||||
successfullyUpgradedMachineImage=Machine image {0} with ID {1} in region {2} upgraded successfully to {3}.
|
||||
startedImageUpgrade=Started upgrade of machine image {0} with ID {1} in region {2}. This can take a few minutes to complete...
|
||||
+12
@@ -18,3 +18,15 @@ generate=Erzeugen
|
||||
pleaseProvidePassphrase=Bitte ein Passwort zur Verschlüsselung des geheimen Schlüssels angeben
|
||||
pleaseRepeatPassphrase=Bitte das Passwort zur Verschlüsselung des geheimen Schlüssels wiederholen
|
||||
passphrasesDontMatch=Die beiden Passwörter stimmen nicht überein
|
||||
showKeys=Öffentlichen und (verschlüsselten) privaten Schlüssel anzeigen
|
||||
download=Herunterladen
|
||||
encryptedPrivateKey=Verschlüsselter privater Schlüssel
|
||||
sshPrivateKeyPassphraseForSelectedKeyPair=Passwort zum privaten Schlüssel des ausgewählten Schlüsselpaars
|
||||
state=Zustand
|
||||
createdAt=Erstellt
|
||||
mongoEndpoints=MongoDB-Endpunkte
|
||||
machineImages=Amazon Maschinen-Abbilder (AMIs)
|
||||
doYouReallyWantToRemoveMachineImage=Möchten Sie wirklich das Machinen-Abbild {0} mit der ID {1} in der Region {2} löschen?
|
||||
successfullyRemovedMachineImage=Machinen-Abbild {0} mit der ID {1} in der Region {2} erfolgreich gelöscht.
|
||||
successfullyUpgradedMachineImage=Machinen-Abbild {0} mit der ID {1} in der Region {2} erfolgreich aktualisiert zu {3}.
|
||||
startedImageUpgrade=Aktualisierung des Maschinen-Abbilds {0} mit der ID {1} in der region {2} gestartet. Der Vorgang kann einige Minuten dauern...
|
||||
+75
-2
@@ -2,22 +2,29 @@ package com.sap.sailing.landscape.ui.server;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.apache.shiro.SecurityUtils;
|
||||
import org.apache.shiro.subject.Subject;
|
||||
import org.osgi.framework.BundleContext;
|
||||
|
||||
import com.jcraft.jsch.JSchException;
|
||||
import com.sap.sailing.landscape.SailingAnalyticsMetrics;
|
||||
import com.sap.sailing.landscape.SailingAnalyticsProcess;
|
||||
import com.sap.sailing.landscape.procedures.UpgradeAmi;
|
||||
import com.sap.sailing.landscape.ui.client.LandscapeManagementWriteService;
|
||||
import com.sap.sailing.landscape.ui.impl.Activator;
|
||||
import com.sap.sailing.landscape.ui.shared.AmazonMachineImageDTO;
|
||||
import com.sap.sailing.landscape.ui.shared.MongoEndpointDTO;
|
||||
import com.sap.sailing.landscape.ui.shared.SSHKeyPairDTO;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
import com.sap.sse.gwt.server.ResultCachingProxiedRemoteServiceServlet;
|
||||
import com.sap.sse.landscape.application.ApplicationProcess;
|
||||
import com.sap.sse.landscape.application.ApplicationProcessMetrics;
|
||||
import com.sap.sse.landscape.aws.AmazonMachineImage;
|
||||
import com.sap.sse.landscape.aws.AwsLandscape;
|
||||
import com.sap.sse.landscape.aws.impl.AwsRegion;
|
||||
import com.sap.sse.landscape.common.shared.SecuredLandscapeTypes;
|
||||
@@ -29,6 +36,7 @@ import com.sap.sse.landscape.ssh.SSHKeyPair;
|
||||
import com.sap.sse.replication.FullyInitializedReplicableTracker;
|
||||
import com.sap.sse.security.SecurityService;
|
||||
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
|
||||
import com.sap.sse.security.shared.TypeRelativeObjectIdentifier;
|
||||
import com.sap.sse.security.ui.server.SecurityDTOUtil;
|
||||
|
||||
import software.amazon.awssdk.services.ec2.model.KeyPairInfo;
|
||||
@@ -37,6 +45,8 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem
|
||||
implements LandscapeManagementWriteService {
|
||||
private static final long serialVersionUID = -3332717645383784425L;
|
||||
|
||||
private static final Optional<Duration> IMAGE_UPGRADE_TIMEOUT = Optional.of(Duration.ONE_MINUTE.times(10));
|
||||
|
||||
private final FullyInitializedReplicableTracker<SecurityService> securityServiceTracker;
|
||||
|
||||
public <ShardingKey, MetricsT extends ApplicationProcessMetrics,
|
||||
@@ -55,7 +65,8 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem
|
||||
|
||||
@Override
|
||||
public ArrayList<String> getRegions() {
|
||||
SecurityUtils.getSubject().checkPermission(SecuredLandscapeTypes.LANDSCAPE.getStringPermission(SecuredLandscapeTypes.LandscapeActions.MANAGE));
|
||||
SecurityUtils.getSubject().checkPermission(SecuredLandscapeTypes.LANDSCAPE.getStringPermissionForTypeRelativeIdentifier(SecuredLandscapeTypes.LandscapeActions.MANAGE,
|
||||
new TypeRelativeObjectIdentifier("AWS")));
|
||||
final ArrayList<String> result = new ArrayList<>();
|
||||
Util.addAll(Util.map(AwsLandscape.obtain().getRegions(), r->r.getId()), result);
|
||||
return result;
|
||||
@@ -63,7 +74,8 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem
|
||||
|
||||
@Override
|
||||
public ArrayList<MongoEndpointDTO> getMongoEndpoints(String awsAccessKey, String awsSecret, String region) {
|
||||
SecurityUtils.getSubject().checkPermission(SecuredLandscapeTypes.LANDSCAPE.getStringPermission(SecuredLandscapeTypes.LandscapeActions.MANAGE));
|
||||
SecurityUtils.getSubject().checkPermission(SecuredLandscapeTypes.LANDSCAPE.getStringPermissionForTypeRelativeIdentifier(SecuredLandscapeTypes.LandscapeActions.MANAGE,
|
||||
new TypeRelativeObjectIdentifier("AWS")));
|
||||
final ArrayList<MongoEndpointDTO> result = new ArrayList<>();
|
||||
for (final MongoEndpoint mongoEndpoint : AwsLandscape.obtain(awsAccessKey, awsSecret).getMongoEndpoints(new AwsRegion(region))) {
|
||||
final MongoEndpointDTO dto;
|
||||
@@ -144,4 +156,65 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem
|
||||
getSecurityService().checkPermissionAndDeleteOwnershipForObjectRemoval(keyPair,
|
||||
()->AwsLandscape.obtain(awsAccessKey, awsSecret).deleteKeyPair(new AwsRegion(keyPair.getRegionId()), keyPair.getName()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getEncryptedSshPrivateKey(String regionId, String keyName) throws JSchException {
|
||||
final AwsLandscape<Object, ApplicationProcessMetrics, ?> landscape = AwsLandscape.obtain();
|
||||
final SSHKeyPair keyPair = landscape.getSSHKeyPair(new AwsRegion(regionId), keyName);
|
||||
getSecurityService().checkCurrentUserReadPermission(keyPair);
|
||||
return keyPair.getEncryptedPrivateKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getSshPublicKey(String regionId, String keyName) throws JSchException {
|
||||
final AwsLandscape<Object, ApplicationProcessMetrics, ?> landscape = AwsLandscape.obtain();
|
||||
final SSHKeyPair keyPair = landscape.getSSHKeyPair(new AwsRegion(regionId), keyName);
|
||||
getSecurityService().checkCurrentUserReadPermission(keyPair);
|
||||
return keyPair.getPublicKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<AmazonMachineImageDTO> getAmazonMachineImages(String awsAccessKey, String awsSecret, String region) {
|
||||
SecurityUtils.getSubject().checkPermission(SecuredLandscapeTypes.LANDSCAPE.getStringPermissionForTypeRelativeIdentifier(SecuredLandscapeTypes.LandscapeActions.MANAGE,
|
||||
new TypeRelativeObjectIdentifier("AWS")));
|
||||
final ArrayList<AmazonMachineImageDTO> result = new ArrayList<>();
|
||||
final AwsRegion awsRegion = new AwsRegion(region);
|
||||
final AwsLandscape<Object, ApplicationProcessMetrics, ?> landscape = AwsLandscape.obtain(awsAccessKey, awsSecret);
|
||||
for (final String imageType : landscape.getMachineImageTypes(awsRegion)) {
|
||||
final AmazonMachineImage<?, ApplicationProcessMetrics> machineImage = landscape.getLatestImageWithType(awsRegion, imageType);
|
||||
final AmazonMachineImageDTO dto = new AmazonMachineImageDTO(machineImage.getId(),
|
||||
machineImage.getRegion().getId(), machineImage.getName(), imageType, machineImage.getState().name(),
|
||||
machineImage.getCreatedAt());
|
||||
result.add(dto);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeAmazonMachineImage(String awsAccessKey, String awsSecret, String region, String machineImageId) {
|
||||
SecurityUtils.getSubject().checkPermission(SecuredLandscapeTypes.LANDSCAPE.getStringPermissionForTypeRelativeIdentifier(SecuredLandscapeTypes.LandscapeActions.MANAGE,
|
||||
new TypeRelativeObjectIdentifier("AWS")));
|
||||
final AwsLandscape<Object, ApplicationProcessMetrics, ?> landscape = AwsLandscape.obtain(awsAccessKey, awsSecret);
|
||||
final AmazonMachineImage<Object, ApplicationProcessMetrics> ami = landscape.getImage(new AwsRegion(region), machineImageId);
|
||||
ami.delete();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AmazonMachineImageDTO upgradeAmazonMachineImage(String awsAccessKey, String awsSecret, String region, String machineImageId) throws Exception {
|
||||
SecurityUtils.getSubject().checkPermission(SecuredLandscapeTypes.LANDSCAPE.getStringPermissionForTypeRelativeIdentifier(SecuredLandscapeTypes.LandscapeActions.MANAGE,
|
||||
new TypeRelativeObjectIdentifier("AWS")));
|
||||
final AwsLandscape<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>> landscape = AwsLandscape.obtain(awsAccessKey, awsSecret);
|
||||
final AwsRegion awsRegion = new AwsRegion(region);
|
||||
final AmazonMachineImage<?, ?> ami = landscape.getImage(awsRegion, machineImageId);
|
||||
final UpgradeAmi.Builder<?, String, SailingAnalyticsProcess<String>> upgradeAmiBuilder = UpgradeAmi.builder();
|
||||
upgradeAmiBuilder
|
||||
.setLandscape(landscape)
|
||||
.setRegion(awsRegion)
|
||||
.setMachineImage(ami)
|
||||
.setOptionalTimeout(IMAGE_UPGRADE_TIMEOUT);
|
||||
final UpgradeAmi<String> upgradeAmi = upgradeAmiBuilder.build();
|
||||
upgradeAmi.run();
|
||||
final AmazonMachineImage<String, SailingAnalyticsMetrics> resultingAmi = upgradeAmi.getUpgradedAmi();
|
||||
return new AmazonMachineImageDTO(resultingAmi.getId(), resultingAmi.getRegion().getId(), resultingAmi.getName(), /* TODO type */ null, resultingAmi.getState().name(), resultingAmi.getCreatedAt());
|
||||
}
|
||||
}
|
||||
|
||||
java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/shared/AmazonMachineImageDTO.java
Executable
+56
@@ -0,0 +1,56 @@
|
||||
package com.sap.sailing.landscape.ui.shared;
|
||||
|
||||
import com.google.gwt.user.client.rpc.IsSerializable;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
|
||||
public class AmazonMachineImageDTO implements IsSerializable {
|
||||
private String id;
|
||||
private String regionId;
|
||||
private String name;
|
||||
private String type;
|
||||
private String state;
|
||||
private TimePoint creationTimePoint;
|
||||
|
||||
@Deprecated
|
||||
AmazonMachineImageDTO() {} // for GWT de-serialization only
|
||||
|
||||
public AmazonMachineImageDTO(String id, String regionId, String name, String type, String state, TimePoint creationTimePoint) {
|
||||
super();
|
||||
this.id = id;
|
||||
this.regionId = regionId;
|
||||
this.name = name;
|
||||
this.type = type;
|
||||
this.state = state;
|
||||
this.creationTimePoint = creationTimePoint;
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getRegionId() {
|
||||
return regionId;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
public TimePoint getCreationTimePoint() {
|
||||
return creationTimePoint;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "AmazonMachineImageDTO [id=" + id + ", regionId=" + regionId + ", name=" + name + ", type=" + type
|
||||
+ ", state=" + state + ", creationTimePoint=" + creationTimePoint + "]";
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user