Merge branch 'master' into bug4166

This commit is contained in:
Leon Radeck committed 2017-06-21 11:08:53 +02:00
commit f01d61207c
204 files changed
+3594 -900

No files matched your search

@@ -30,6 +30,8 @@ import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.racemap.DefaultQuickRanksDTOProvider;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceCompetitorSet;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMap;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapHelpLinesSettings;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapHelpLinesSettings.HelpLineTypes;
@@ -173,8 +175,8 @@ public class StartAnalysisCard extends Composite implements HasWidgets, StartAna
raceMap = new RaceMap(null, null, new RaceMapLifecycle(StringMessages.INSTANCE), raceMapSettings,
sailingServiceAsync,
asyncActionsExecutor, null, timer, competitorSelectionModel,
StringMessages.INSTANCE, startAnalysisDTO.regattaAndRaceIdentifier,
raceMapResources, /* showHeaderPanel */ true);
new RaceCompetitorSet(competitorSelectionModel), StringMessages.INSTANCE,
startAnalysisDTO.regattaAndRaceIdentifier, raceMapResources, /* showHeaderPanel */ true, new DefaultQuickRanksDTOProvider());
raceTimesInfoProvider.addRaceTimesInfoProviderListener(raceMap);
raceMap.setSize("100%", "100%");
card_map_container.getElement().getStyle().setHeight(getHeightForRaceMapInPixels(), Unit.PX);
@@ -60,7 +60,7 @@ public enum BoatClassMasterdata {
J105 ("J/105", true, 10.52, 3.35, BoatHullType.MONOHULL, true, "J105", "J-105"),
J111 ("J/111", true, 11.1, 3.29, BoatHullType.MONOHULL, true, "J111", "J-111"),
KIELZUGVOGEL ("Kielzugvogel", true, 5.80, 1.88, BoatHullType.MONOHULL, false, "KZV"),
KITE ("Kite", true, 3.35, 1.52, BoatHullType.MONOHULL, false),
FORMULA_KITE ("Kite", true, 3.35, 1.52, BoatHullType.MONOHULL, false, "Formula Kite"),
LASER_2 ("Laser 2", true, 4.39, 1.42, BoatHullType.MONOHULL, false, "Laser II", "Laser2", "Laser-2", "Laser-II"),
LASER_4_7 ("Laser 4.7", true, 4.20, 1.39, BoatHullType.MONOHULL, false, "L4.7"),
LASER_RADIAL ("Laser Radial", true, 4.19, 1.41, BoatHullType.MONOHULL, false, "LAR", "Laser RAD", "RAD", "Radial"),
@@ -175,6 +175,20 @@ public class LeaderboardEntryDTO implements Serializable {
}
return result;
}
public int getOneBasedCurrentLegNumber() {
int result = 0;
if (legDetails != null && !legDetails.isEmpty()) {
for (LegEntryDTO legDetail : legDetails) {
if (legDetail != null && legDetail.started) {
result++;
} else {
break;
}
}
}
return result;
}
@Override
public int hashCode() {
@@ -6,6 +6,7 @@ import java.io.IOException;
import java.util.List;
import org.json.simple.parser.ParseException;
import org.junit.Before;
import org.junit.Test;
import com.sap.sailing.domain.common.Placemark;
@@ -13,14 +14,20 @@ import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.impl.PlacemarkImpl;
import com.sap.sailing.geocoding.ReverseGeocoder;
import com.sap.sailing.geocoding.impl.ReverseGeocoderImpl;
import junit.framework.Assert;
public class ReverseGeocoderTest {
private ReverseGeocoder geocoder = ReverseGeocoder.INSTANCE;
private ReverseGeocoder geocoder;
private static final Placemark KIEL = new PlacemarkImpl("Kiel", "DE", new DegreePosition(54.32132926107913, 10.1348876953125), 232758);
private static final Position KIEL_POSITION = new DegreePosition(54.3231063453431, 10.12265682220459);
@Before
public void setUp() {
geocoder = new ReverseGeocoderImpl(); // ensure we don't see any caching effects across test case executions
}
@Test
public void getPlacemarkSimpleTest() {
//Simple Test in Kiel center to check the connection and the parsing from JSONObject to Placemark
@@ -52,8 +59,8 @@ public class ReverseGeocoderTest {
@Test
public void getPlacemarkBestTest() {
Position abroad = new DegreePosition(54.43334, 10.299999);
Placemark firstByDistance = new PlacemarkImpl("Wendtorf", "DE", new DegreePosition(54.4166667, 10.3), 1139);
Position abroad = new DegreePosition(54.429758, 10.289335);
Placemark firstByDistance = new PlacemarkImpl("Wendtorf", "DE", new DegreePosition(54.41212, 10.28952), 1139);
try {
Placemark p = geocoder.getPlacemarkLast(abroad, 20, new Placemark.ByPopulation());
Assert.assertEquals(KIEL.getName(), p.getName());
@@ -64,14 +71,14 @@ public class ReverseGeocoderTest {
p = geocoder.getPlacemarkFirst(abroad, 20, new Placemark.ByDistance(abroad));
Assert.assertEquals(firstByDistance.getName(), p.getName());
Assert.assertEquals(firstByDistance.getCountryCode(), p.getCountryCode());
Assert.assertEquals(firstByDistance.getPosition().getLatDeg(), p.getPosition().getLatDeg(), 0.0001);
Assert.assertEquals(firstByDistance.getPosition().getLngDeg(), p.getPosition().getLngDeg(), 0.0001);
Assert.assertEquals(firstByDistance.getPosition().getLatDeg(), p.getPosition().getLatDeg(), 0.005);
Assert.assertEquals(firstByDistance.getPosition().getLngDeg(), p.getPosition().getLngDeg(), 0.012);
p = geocoder.getPlacemarkLast(abroad, 20, new Placemark.ByPopulationDistanceRatio(abroad));
Assert.assertEquals(KIEL.getName(), p.getName());
Assert.assertEquals(KIEL.getCountryCode(), p.getCountryCode());
Assert.assertEquals(KIEL.getPosition().getLatDeg(), p.getPosition().getLatDeg(), 0.0001);
Assert.assertEquals(KIEL.getPosition().getLngDeg(), p.getPosition().getLngDeg(), 0.0001);
Assert.assertEquals(KIEL.getPosition().getLatDeg(), p.getPosition().getLatDeg(), 0.005);
Assert.assertEquals(KIEL.getPosition().getLngDeg(), p.getPosition().getLngDeg(), 0.005);
} catch (IOException e) {
Assert.fail(e.getMessage());
} catch (ParseException e) {
@@ -258,6 +258,7 @@ public class ReverseGeocoderImpl implements ReverseGeocoder {
URL request = new URL(url.toString());
URLConnection connection = request.openConnection();
connection.setRequestProperty("User-Agent", "");
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("UTF-8")));
JSONParser parser = new JSONParser();
JSONObject obj = (JSONObject) parser.parse(in);
@@ -60,7 +60,7 @@
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-incremental -workDir &quot;${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work&quot; -war &quot;${project_loc:com.sap.sailing.gwt.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9876 -startupUrl /gwt/Home.html com.sap.sailing.gwt.home.Home -startupUrl /gwt/AdminConsole.html com.sap.sailing.gwt.ui.AdminConsole -startupUrl /gwt/LeaderboardEditing.html com.sap.sailing.gwt.ui.LeaderboardEditing -startupUrl /gwt/Leaderboard.html com.sap.sailing.gwt.ui.Leaderboard -startupUrl /gwt/Spectator.html com.sap.sailing.gwt.ui.Spectator -startupUrl /gwt/EmbeddedMapAndWindChart com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart -startupUrl /gwt/RaceBoard.html com.sap.sailing.gwt.ui.RaceBoard -startupUrl /gwt/RegattaOverview.html com.sap.sailing.gwt.regattaoverview.RegattaOverview -startupUrl /gwt/DataMining.html com.sap.sailing.gwt.ui.DataMining -startupUrl /gwt/Simulator.html com.sap.sailing.gwt.ui.Simulator -startupUrl /gwt/VideoPopup.html com.sap.sailing.gwt.ui.VideoPopup -startupUrl /gwt/YoutubePopup.html com.sap.sailing.gwt.ui.YoutubePopup -startupUrl /gwt/AutoPlay.html com.sap.sailing.gwt.AutoPlay"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-style PRETTY -incremental -workDir &quot;${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work&quot; -war &quot;${project_loc:com.sap.sailing.gwt.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9876 -startupUrl /gwt/Home.html com.sap.sailing.gwt.home.Home -startupUrl /gwt/AdminConsole.html com.sap.sailing.gwt.ui.AdminConsole -startupUrl /gwt/LeaderboardEditing.html com.sap.sailing.gwt.ui.LeaderboardEditing -startupUrl /gwt/Leaderboard.html com.sap.sailing.gwt.ui.Leaderboard -startupUrl /gwt/Spectator.html com.sap.sailing.gwt.ui.Spectator -startupUrl /gwt/EmbeddedMapAndWindChart com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart -startupUrl /gwt/RaceBoard.html com.sap.sailing.gwt.ui.RaceBoard -startupUrl /gwt/RegattaOverview.html com.sap.sailing.gwt.regattaoverview.RegattaOverview -startupUrl /gwt/DataMining.html com.sap.sailing.gwt.ui.DataMining -startupUrl /gwt/Simulator.html com.sap.sailing.gwt.ui.Simulator -startupUrl /gwt/VideoPopup.html com.sap.sailing.gwt.ui.VideoPopup -startupUrl /gwt/YoutubePopup.html com.sap.sailing.gwt.ui.YoutubePopup -startupUrl /gwt/AutoPlay.html com.sap.sailing.gwt.AutoPlay"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.gwt.ui"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xms1024m -Xmx3072m -Dgwt.watchFileChanges=false"/>
</launchConfiguration>
@@ -73,6 +73,7 @@ public class BoatClassImageResolver {
boatClassIconsMap.put(BoatClassMasterdata.J105.getDisplayName(), imageResources.J105Icon());
boatClassIconsMap.put(BoatClassMasterdata.J111.getDisplayName(), imageResources.J111Icon());
boatClassIconsMap.put(BoatClassMasterdata.KIELZUGVOGEL.getDisplayName(), imageResources.KielzugvogelIcon());
boatClassIconsMap.put(BoatClassMasterdata.FORMULA_KITE.getDisplayName(), imageResources.FormulaKiteIcon());
boatClassIconsMap.put(BoatClassMasterdata.LASER_2.getDisplayName(), imageResources.Laser2Icon());
boatClassIconsMap.put(BoatClassMasterdata.LASER_SB3.getDisplayName(), imageResources.LaserSB3Icon());
boatClassIconsMap.put(BoatClassMasterdata.LASER_INT.getDisplayName(), imageResources.LaserIcon());
@@ -253,6 +253,9 @@ public interface BoatClassImageResources extends ClientBundle {
@Source("com/sap/sailing/gwt/ui/client/images/boatclass/KIELZUGVOGEL.png")
ImageResource KielzugvogelIcon();
@Source("com/sap/sailing/gwt/ui/client/images/boatclass/FORMULA_KITE.png")
ImageResource FormulaKiteIcon();
@Source("com/sap/sailing/gwt/ui/client/images/boatclass/TRIAS.png")
ImageResource TriasIcon();
@@ -26,6 +26,7 @@
background-size: contain;
background-position: center;
background-repeat: no-repeat;
left: 1em;
}
.regattaheader_logo img {
display: inline-block;
@@ -4,6 +4,14 @@
<div id="mainContent">
<h4 class="articleHeadline">What's New - SAP Sailing Race Manager</h4>
<div class="innerContent">
<h5 class="articleSubheadline">June 2017</h5>
<ul class="bulletList">
<li>It is now possible to capture results during any phase of a race,
particularly also during the start phase, making it possible to
enter penalties such as OCS, BFD or UFD when they occur.
</li>
</ul>
<h5 class="articleSubheadline">April 2017</h5>
<ul class="bulletList">
<li>The "By Marks" course editor can now handle any valid CSS color for
@@ -17,7 +17,6 @@ public interface LeaderboardUpdateListener {
/**
* Called whenever the leaderboard has been updated.
* @param leaderboard
*/
void updatedLeaderboard(LeaderboardDTO leaderboard);
@@ -599,7 +599,7 @@ applyMinimumWindConfidenceTooltip=If checked the value in the box above will be
windRangeDistribution=Distribution in the wind range.
pleaseSeeToolTips=Please hover over the options to view tooltips where available.
competitorColumnTooltip=Names of the sailors of this competitor.
competitorNationalityColumnTooltip=Nationality of this competitor.
competitorNationalityColumnTooltip=Nationality of this competitor.
sailIdColumnTooltip=Shows the flag of the country and the sail number of the competitor.
rankColumnTooltip=The overall rank of this competitor in the regatta.
carryColumnTooltip=Points carried over from previous races.
@@ -455,6 +455,7 @@ scoringSchemeHighPointFirstGetsTwelveOrEight2017Description=Calificación en pun
scoringSystem=Sistema de puntuación
createFlexibleLeaderboard=Crear tabla de clasificación flexible
createRegattaLeaderboard=Crear tabla de clasificación de regata
createRegattaLeaderboardWithEliminations=Crear tabla de clasificación de regata con eliminaciones
createDefaultRegattaLeaderboard=Crear tabla de clasificación de regata predeterminada
editFlexibleLeaderboard=Editar tabla de clasificación flexible
editRegattaLeaderboard=Editar tabla de clasificación de regata
@@ -595,7 +596,8 @@ applyMinimumWindConfidence=Aplicar confianza mínima de viento
applyMinimumWindConfidenceTooltip=Si se marca el valor del cuadro anterior, se utilizará como confianza de viento mínima válida durante la generación.
windRangeDistribution=Distribución en el rango de viento
pleaseSeeToolTips=Pase el cursor por encima de las opciones para obtener información sobre herramientas si está disponible.
competitorColumnTooltip=Nombres de los miembros de este competidor.
competitorColumnTooltip=Nombres de los navegantes de este competidor
competitorNationalityColumnTooltip=Nacionalidad de este competidor
sailIdColumnTooltip=Muestra la bandera del país y el número de vela del competidor.
rankColumnTooltip=Posición general de este competidor en la regata.
carryColumnTooltip=Puntos acumulados de carreras anteriores.
@@ -1251,6 +1253,7 @@ fileUploadResult=Carga de archivos: {0} {1}. En caso de error, compruebe que su
removeUploadedFile=Eliminar archivo
showCompetitorSailIdColumn=ID de vela
showCompetitorFullNameColumn=Nombre completo del competidor
showCompetitorNationalityColumn=Nacionalidad del competidor
loadingDimensionValues=Cargando valores de dimensión
runningQuery=Ejecutando consulta
inviteBuoyTenders=Invitar a balizadores
@@ -1778,4 +1781,7 @@ makeDefault=Establecer como predeterminado
makeDefaultInProgress=En curso...
settingsSavedMessage=Sus opciones actuales se han definido correctamente como estándar
settingsSaveErrorMessage=Se ha producido un error durante la definición de sus opciones como estándar
showLiveNow=Mostrar "En directo ahora"
useOnlyOneOfStartTimeInferenceAndControlTrackingFromStartAndFinishTimes=Utilice solo una "Inferencia de hora de inicio" y "Control de rastreo de horas de inicio y de fin"
unknownLeaderboardType=Tipo de tabla de clasificación {0} desconocido
selectCompetitorsToEliminate=Seleccionar competidores a eliminar
@@ -3,9 +3,9 @@ raceCommitteeApp=Application pour administrateurs de courses
raceViewer=Visualiseur de course
mapControls=Contrôles de carte
page=Page
tracTracEvents=Manifestations TracTrac
swissTimingEvents=Manifestations SwissTiming
trackedBefore=Historique des manifestations suivies
tracTracEvents=Evénements TracTrac
swissTimingEvents=Evénements SwissTiming
trackedBefore=Historique des evénements suivies
general=Généralités
listRaces=Lister courses
listRegattas=Lister régates
@@ -37,33 +37,33 @@ carry=Cumulé
competitor=Concurrent
competitors=Concurrents
competitorsSelected={0}/{1} concurrent(s) sélectionné(s)
noSuchLeaderboard=Aucun palmarès de ce type
leaderboardConfiguration=Configuration du palmarès
noSuchLeaderboard=Aucun classement de ce type
leaderboardConfiguration=Configuration du classement
newDotDotDot=Nouveau...
editScores=Modifier points...
columnNamesInSelectedLeaderboard=Noms des courses dans le palmarès sélectionné
columnNamesInSelectedLeaderboard=Noms des courses dans le classement sélectionné
addDotDotDot=Ajouter...
renameDotDotDot=Renommer...
trackedRaceConnectedToSelectedRaceName=Course suivie liée au nom de course sélectionné
linkToColumn=Lier à la colonne
unlink=Annuler Lier
leaderboardName=Nom du palmarès
leaderboardName=Nom du classement
cancel=Annuler
pleaseEnterAName=Saisissez un nom.
pleaseEnterABoatClass=Saisissez une catégorie de bateau.
discardRacesFromHowManyStartedRacesOn=Éliminez une course de plus en commençant au nombre de courses déjà lancées.
leaderboardWithThisNameAlreadyExists=Un palmarès de ce nom existe déjà.
leaderboardWithThisNameAlreadyExists=Un classement de ce nom existe déjà.
discardThresholdsMustBeNumeric=Les seuils d''élimination doivent être numériques.
discardThresholdsMustBeAscending=Les seuils d''élimination doivent être ascendants.
discarding=Élimination en cours
startingFromNumberOfRaces=Début au nombre de courses
renameLeaderboard=Renommer palmarès
addColumnToLeaderboard=Ajouter colonne à palmarès
renameLeaderboard=Renommer classement
addColumnToLeaderboard=Ajouter colonne à classement
pleaseEnterNameForNewRaceColumn=Saisissez un nom pour la nouvelle colonne de course.
ok=OK
medalRace=Course médaillée
renameRace=Renommer course
openSelectedLeaderboard=Ouvrir le palmarès sélectionné
openSelectedLeaderboard=Ouvrir le classement sélectionné
rank=Place
rankTooltip=Place du concurrent dans la course
regattaRank=Place dans la régate
@@ -81,9 +81,9 @@ raceAverageSpeedInKnotsTooltip=La vitesse fond moyenne pour cette course,\ncalcu
rankGain=Gain de place(s)
rankGainTooltip=La différence de la position entre la portion de parcours actuelle et la précédente.
sapSailingAnalytics=Sailing Analytics
leaderboard=Palmarès
leaderboards=Palmarès
leaderboardSettings=Options du palmarès
leaderboard=Classement
leaderboards=Classements
leaderboardSettings=Options du classement
settings=Options
selectAtLeastOneLegDetail=Sélectionnez au moins un détail de portion de parcours.
currentSpeedOverGroundInKnots=Vf
@@ -100,12 +100,12 @@ windwardDistanceToCompetitorFarthestAheadInMeters=Écart
windwardDistanceToCompetitorFarthestAheadInMetersTooltip=Distance au vent/sous le vent entre le concurrent et celui en tête de la course pour les portions de parcours dans le lit du vent/à vent arrière, respectivement, ou la distance de parcours pour atteindre une portion de parcours.\nNotez que le concurrent en tête n''est pas forcément premier de la course si un classement prenant en compte les difficultés est en vigueur.
name=Nom
leaveEmptyForDefault=Laissez vide pour que la valeur par défaut s''applique.
trackNewEvent=Suivre une nouvelle manifestation
trackNewEvent=Suivre une nouvelle evénement
trackableRaces=Courses disponibles pour suivi
trackWind=Suivre le vent
regattaName=Nom de la régate
eventName=Nom de la manifestation
event=Manifestation
eventName=Nom de la evénement
event=Evénement
startTime=Heure du départ
startOfTracking=Début du suivi
endOfTracking=Fin du suivi
@@ -128,7 +128,7 @@ livePort=Port données en direct
storedPort=Port données stockées
liveUri=URI en direct
storedUri=URI stockée
eventsConnectedTo=Manifestations actuellement suivies
eventsConnectedTo=Evénements actuellement suivies
hostname=Nom de l''hôte
declinationCheckbox=Corriger la direction du vent par déclinaison
raceStartTrackingColumn=Suivi lancé
@@ -141,7 +141,7 @@ chooseUpdateIntervalOfAtLeastOneSecond=Sélectionnez un intervalle de mise à jo
errorSettingWindForRace=Erreur lors de la définition du vent pour la course
errorFetchingWindInformationForRace=Erreur lors de l''accès aux données de vent pour la course
errorWhileTryingToSetWindSourceForRace=Erreur lors de la tentative d''activation de l''indicateur "Vent de début : au vent"
inEvent=dans la manifestation
inEvent=dans la evénement
to=à
toSide=à
showEstimatedWind=Afficher estimation du vent
@@ -222,7 +222,7 @@ actionRaceUnlink=Annuler Lier course
actionRaceRemove=Supprimer course
actionExportXML=Exporter au format XML
actionOpenDashboard=Ouvrir le tableau de bord des coachs
filterLeaderboardsByName=Filtrer palmarès par nom
filterLeaderboardsByName=Filtrer classement par nom
actions=Actions
islinked=Est lié(e)
yes=Oui
@@ -230,16 +230,16 @@ no=Non
hoverOverAPoint=Placez le curseur sur un point pour obtenir des détails.
noSelection=Aucune sélection
raceIsKnownToStartUpwind=La course a commencé avec une portion de parcours au vent.
events=Manifestations
events=Evénements
settingsForComponent=Options pour {0}
noEventsFound=Aucune manifestation trouvée
noEventSelected=Aucune manifestation sélectionnée
noLeaderboardsFound=Aucun palmarès trouvé
searchEvents=Recherche de manifestations
noEventsFound=Aucune evénements trouvée
noEventSelected=Aucune evénement sélectionnée
noLeaderboardsFound=Aucun classement trouvé
searchEvents=Recherche de evénements
location=Lieu
from=De
until=À
onlyLiveEvents=Uniquement les manifestations en direct
onlyLiveEvents=Uniquement les evénements en direct
locationNotAvailable=Lieu non disponible
startDateNotAvailable=Date du départ non disponible
startDate=Date du départ
@@ -251,28 +251,28 @@ competitorPassedMarkAtDate={0} a passé {1} à {2}
valueForCompetitorAt={0} à {1} : {2}
reallyRemoveRace=Voulez-vous vraiment supprimer la course "{0}" ? Note : tous les journaux de la course seront également supprimés de manière permanente pour cette course.
showDetails=Afficher détails
hideLeaderboard=Masquer palmarès
hideLeaderboards=Masquer palmarès
showLeaderboard=Afficher palmarès
hideLeaderboard=Masquer classement
hideLeaderboards=Masquer classement
showLeaderboard=Afficher classement
hideRaces=Masquer courses
showMap=Afficher carte
hideMap=Masquer carte
noLeaderboardSelected=Aucun palmarès sélectionné
leaderboardGroups=Groupes de palmarès
filterLeaderboardGroupsByName=Filtrer groupes de palmarès par nom
createNewLeaderboardGroup=Créer groupe de palmarès
leaderboardGroupConfiguration=Configuration du groupe de palmarès
noLeaderboardSelected=Aucun classement sélectionné
leaderboardGroups=Groupes de classement
filterLeaderboardGroupsByName=Filtrer groupes de classement par nom
createNewLeaderboardGroup=Créer groupe de classement
leaderboardGroupConfiguration=Configuration du groupe de classement
legs=Portions de parcours
currentLeg=Portion de parcours actuelle
currentLegTooltip=Le numéro de la portion de parcours sur laquelle le concurrent se trouve actuellement, en commençant par 1.
leaderboardGroup=Groupe de palmarès
leaderboardGroup=Groupe de classement
pleaseEnterNonEmptyDescription=Saisissez une description (ne pas laisser vide).
groupWithThisNameAlreadyExists=Un groupe de palmarès de ce nom existe déjà.
detailsOfLeaderboardGroup=Détails du groupe de palmarès
groupWithThisNameAlreadyExists=Un groupe de classement de ce nom existe déjà.
detailsOfLeaderboardGroup=Détails du groupe de classement
edit=Modifier
save=Enregistrer
abort=Abandonner
noLeaderboardGroupWithNameFound=Aucun groupe de palmarès ayant pour nom {0} n''a été trouvé.
noLeaderboardGroupWithNameFound=Aucun groupe de classement ayant pour nom {0} n''a été trouvé.
overview=Synthèse
welcomeToSailingAnalytics=Bienvenue dans SAP Sailing Analytics
welcomeToSailingAnalyticsBody=Grâce aux solutions SAP, l''action sur l''eau est à portée de main pour les amateurs de la voile, comme jamais auparavant.\ Le palmarès actualisé en direct ajoute un vrai plus, avec des classements, vitesses de bateaux et marges de victoire en temps réel. Avec SAP, suivez chaque course et ne ratez aucune manœuvre de passage.\ Regarder les compétitions de voile en direct où que vous soyez devient un jeu d''enfant.
@@ -325,8 +325,8 @@ slowPlaySpeedDown=Ralentir vitesse de lecture ou revenir en arrière
speedPlaySpeedUp=Accélérer vitesse de lecture ou avancer
showHideComponent=Afficher/Masquer {0}
degreesBoatToTheWind=Angle par rapport au vent
racesInLeaderboard=Courses dans le palmarès
leaderboardsInGroup=Palmarès dans le groupe
racesInLeaderboard=Courses dans le classement
leaderboardsInGroup=Classement dans le groupe
replication=Réplication
errorFetchingReplicaData=Erreur lors de l''accès aux données de réplicas : {0}
averageAbsoluteCrossTrackErrorInMeters=∅ XTE
@@ -351,11 +351,11 @@ showWindDirectionSeries=Afficher données de direction du vent
fleet=Flotte
boatClass=Catégorie de bateau
setDelayToLive=Définir décalage par rapport au direct
pleaseEnterNonEmptyVenue=Saisissez un lieu de manifestation.
pleaseEnterNonEmptyVenue=Saisissez un lieu de evénement.
pleaseEnterStartAndEndDate=Saisissez une date de départ et une date de fin.
startDateMustBeforeEndDate=La date de départ doit être antérieure à la date de fin.
eventWithThisNameAlreadyExists=Une manifestation de ce nom existe déjà.
venue=Lieu de la manifestation
eventWithThisNameAlreadyExists=Un evénement de ce nom existe déjà.
venue=Lieu de la evénement
pleaseSelectABoatClass=Sélectionnez une catégorie de bateau.
regattaWithThisNameAlreadyExists=Une régate de ce nom existe déjà.
seriesWithThisNameAlreadyExists=Une série de ce nom existe déjà.
@@ -379,7 +379,7 @@ importOfficialResults=Importer résultats officiels...
selectAll=Sélectionner tout
apply=Appliquer
successfullyUpdatedScores=Mise à jour des scores réussie
errorUpdatingScoresForLeaderboard=Erreur lors de la mise à jour des scores pour le palmarès {0} : {1}
errorUpdatingScoresForLeaderboard=Erreur lors de la mise à jour des scores pour le classement {0} : {1}
maneuverTypesToShowWhenCompetitorIsClicked=Types de manœuvre à afficher lorsque l''on clique sur le concurrent
simulateAsLiveRace=Simulation de course en direct
simulateWithOffset=Décalage avant le départ (en minutes) :
@@ -412,7 +412,7 @@ successfullyUpdatedSailingServers=Instances SailingServer correctement mises à
errorRemovingSailingServers=Erreur lors de la suppression des instances SailingServer : {0}
addSailingServer=Ajouter instance SailingServer
errorAddingSailingServer=Erreur lors de l''ajout de l''instance SailingServer : {0}
errorTryingToObtainLeaderboardContents=Erreur lors de la tentative d''obtention du contenu du palmarès : {0}
errorTryingToObtainLeaderboardContents=Erreur lors de la tentative d''obtention du contenu du classement : {0}
lastScoreUpdate=Dernière mise à jour des scores
warningBrowserUnsupported=Ce site Web n''est pas optimisé pour votre navigateur. Utilisez un navigateur plus récent, tel que Firefox ou Chrome.
newMark=Nouvelle marque
@@ -453,13 +453,14 @@ scoringSchemeHighPointFirstGetsTwelveOrEightDescription=Score en points. Le vain
scoringSchemeHighPointFirstGetsTwelveOrEight2017=Système de points avec bonus - ESS 2017, le vainqueur obtient 12 points (ou 8)
scoringSchemeHighPointFirstGetsTwelveOrEight2017Description=Score en points. Le vainqueur totalise 12 points, le deuxième 11, etc. En cas d''égalité, la victoire est accordée au concurrent qui a totalisé le plus de points. Si l''égalité persiste, la victoire est accordée en fonction du classement dans la dernière course.
scoringSystem=Système d''attribution des points
createFlexibleLeaderboard=Créer palmarès flexible
createRegattaLeaderboard=Créer palmarès régate
createDefaultRegattaLeaderboard=Créer palmarès régate par défaut
editFlexibleLeaderboard=Modifier palmarès flexible
editRegattaLeaderboard=Modifier palmarès régate
createFlexibleLeaderboard=Créer classement flexible
createRegattaLeaderboard=Créer classement régate
createRegattaLeaderboardWithEliminations=Créer classement régate avec éliminations
createDefaultRegattaLeaderboard=Créer classement régate par défaut
editFlexibleLeaderboard=Modifier classement flexible
editRegattaLeaderboard=Modifier classement régate
defaultRegatta=Régate par défaut
useOverallLeaderboard=Utiliser palmarès général
useOverallLeaderboard=Utiliser classement général
overallStandings=Classement général
type=Type
actionAddRaces=Ajouter des courses
@@ -486,7 +487,7 @@ optional=facultatif
pleaseEnterAValue=Saisissez une valeur.
latitude=Latitude
longitude=Longitude
actionAddEvent=Ajouter manifestation
actionAddEvent=Ajouter evénement
publicationUrl=URL de publication
suppress=Supprimer
isPublic=Publique
@@ -511,7 +512,7 @@ pleaseSelectASeries=Sélectionnez une série.
pleaseSelectARace=Sélectionnez une course.
displayGroupsInReverseOrder=Afficher groupes en sens inverse
actionConfigureUrl=Configurer URL
configureLeaderboardUrlDescription=Configurer le palmarès et obtenir l''URL correspondante à partir du lien
configureLeaderboardUrlDescription=Configurer le classement et obtenir l''URL correspondante à partir du lien
embedded=Intégré
additionalUrlSettings=Options d''URL supplémentaires
restrictToSingleSelectedRace=Limiter à la seule course sélectionnée
@@ -537,7 +538,7 @@ shape=Forme
pattern=Modèle
legend=Légende
live=en direct
swissTimingArchiveConnector=Manifestations archivées SwissTiming
swissTimingArchiveConnector=Evénements archivées SwissTiming
errorFetchingChartData=Erreur lors de l''accès aux données du graphique : {0}
loadingCompetitorData=Chargement des données du concurrent...
competitorRegattaDataAfterRaceN={0} après la course {1}
@@ -546,8 +547,8 @@ netPoints=Points nets
raceNetPointsTooltip=Points nets du concurrent dans la course
regattaNetPointsTooltip=Points nets du concurrent dans la régate
showRankChart=Afficher graphique du classement
overallLeaderboardSelection=Palmarès général
errorTryingToObtainOverallLeaderboards=Erreur lors de la tentative d''obtention du palmarès général : {0}
overallLeaderboardSelection=Classement général
errorTryingToObtainOverallLeaderboards=Erreur lors de la tentative d''obtention du classement général : {0}
finished=terminé
upcoming=à venir
next=suivante
@@ -595,7 +596,8 @@ applyMinimumWindConfidence=Appliquer fiabilité minimale du vent
applyMinimumWindConfidenceTooltip=Si cette case est cochée, la valeur de la case ci-dessus sera utilisée comme valeur de fiabilité valide minimale du vent au cours de la génération.
windRangeDistribution=Distribution dans la plage du vent
pleaseSeeToolTips=Passez votre curseur au-dessus des options pour afficher les info-bulles, le cas échéant.
competitorColumnTooltip=Noms des membres de ce concurrent
competitorColumnTooltip=Noms des sportifs de la voile de ce concurrent
competitorNationalityColumnTooltip=Nationalité de ce concurrent
sailIdColumnTooltip=Indique le pavillon du pays et le numéro de voile du concurrent.
rankColumnTooltip=La place au classement général de ce concurrent dans la régate.
carryColumnTooltip=Points accumulés lors des autres courses
@@ -619,7 +621,7 @@ pleaseEnterNonEmptyCourseArea=Saisissez une zone de course.
pleaseSelectACourseArea=Sélectionnez une zone de course.
lastUpperFlag=Pavillon supérieur
lastLowerFlag=Pavillon inférieur
cannotAddRacesToRegattaLeaderboardButOnlyToRegatta=Il s''agit d''un palmarès de régate. Vous pouvez uniquement ajouter des courses à ce palmarès dans la définition de la régate.
cannotAddRacesToRegattaLeaderboardButOnlyToRegatta=Il s''agit d''un classement de régate. Vous pouvez uniquement ajouter des courses à ce palmarès dans la définition de la régate.
correctScore=Corriger score
correctScoreFor=Corriger score pour le concurrent {0} dans la course {1}
penaltyOrRedress=Pénalité/Réparation
@@ -735,7 +737,7 @@ competitorLabel=Concurrent
freemode=Garder direction
whatIfCourse=Parcours What-If
editRegatta=Modifier régate...
selectSailingEvent=Sélectionnez une manifestation de voile...
selectSailingEvent=Sélectionnez un evénement de voile...
selectCourseArea=Sélectionnez une zone de course...
courseAreaOverview=Synthèse de la zone
courseDesignOverview=Synthèse de la configuration du parcours
@@ -750,7 +752,7 @@ addSeries=Ajouter série
regattaDefinesResultDiscardingRules=La régate définit les règles d''élimination du résultat.
startsWithZeroScore=La série commence avec un score à zéro.
masterDataImportPanel=Importation des données de base
importSuccess=Réussite\n{0} groupe(s) de palmarès, {1} palmarès, {2} manifestation(s), {3} régate(s) et {4} pistes de média créés
importSuccess=Réussite\n{0} groupe(s) de classement, {1} classements, {2} evénement(s), {3} régate(s) et {4} pistes de média créés
importSuccessOverwriteInfo=Les régates suivantes ont été écrasées, vous devez suivre à nouveau les courses :
regattaOverviewConfiguration=Configuration de la synthèse des régates
firstRaceIsNonDiscardableCarryForward=Départs avec report sans élimination
@@ -834,14 +836,14 @@ essOneRemoved=Signal de départ de la course
dataBeforeAfter=Données obtenues avant/après la course
rawFixes=Toutes les positions (y compris les valeurs aberrantes)
importRemoteHost=Hôte distant :
importFetchRemoteLgs=Accéder à la liste des groupes de palmarès
importUrlInvalid=URL non valide pour l''accès aux groupes de palmarès : {0}
importGetLeaderboardsFailed=Échec de la requête GET pour l''obtention des groupes de palmarès pour l''hôte {0}, erreur {1}
importFetchRemoteLgs=Accéder à la liste des groupes de classement
importUrlInvalid=URL non valide pour l''accès aux groupes de classement : {0}
importGetLeaderboardsFailed=Échec de la requête GET pour l''obtention des groupes de classement pour l''hôte {0}, erreur {1}
importNoDataReturned=Aucune donnée retournée par le serveur
importServerError=Échec de la requête GET pour l''obtention des groupes de palmarès avec erreur de serveur. Pour plus d''informations, consultez les journaux du serveur.
importServerError=Échec de la requête GET pour l''obtention des groupes de classement avec erreur de serveur. Pour plus d''informations, consultez les journaux du serveur.
importOverrideSwitchLabel=Remplacer données existantes si les noms et ID correspondent
importSelectedLeaderboardGroups=Importer groupes de palmarès sélectionnés
importSelectAtLeastOne=Vous devez sélectionner au moins un groupe de palmarès à importer.
importSelectedLeaderboardGroups=Importer groupes de classement sélectionnés
importSelectAtLeastOne=Vous devez sélectionner au moins un groupe de classement à importer.
deselectAll=Désélectionner tout
polarDiagramButton=Diagramme polaire
ratioBetweenTimeSinceLastPositionFixAndAverageSamplingInterval=Écart GPS
@@ -849,8 +851,8 @@ ratioBetweenTimeSinceLastPositionFixAndAverageSamplingIntervalTooltip=Ratio entr
trackingQuality=Qualité du suivi
legType=Type de portion de parcours
sailID=Numéro de voile
seriesLeaderboard=Palmarès de la série
regattaLeaderboards=Palmarès de la régate
seriesLeaderboard=Classement de la série
regattaLeaderboards=Classement de la régate
clearSelection=Effacer la sélection
running=En cours d''exécution
runAsSubstantive=Exécuter
@@ -922,11 +924,11 @@ queryNotValidBecause=Aucune requête possible dû à
dataMining=Exploration de données
errorRunningDataMiningQuery=Une erreur s''est produite lors de l''exécution de la requête.
hideToolbar=Masquer barre d''outils
showSeriesLeaderboards=Afficher palmarès de la série
showOverallLeaderboard=Afficher palmarès général
showSeriesLeaderboards=Afficher classement de la série
showOverallLeaderboard=Afficher classement général
lineAngleToWindAndAdvantage=longueur : {0} m\nangle au vent : {1}°\ncôté {2} a {3} m d''avantage
doYouReallyWantToRemoveEvents=Voulez-vous vraiment supprimer les manifestations ?
doYouReallyWantToRemoveEvent=Voulez-vous vraiment supprimer la manifestation {0} ?
doYouReallyWantToRemoveEvents=Voulez-vous vraiment supprimer les evénements ?
doYouReallyWantToRemoveEvent=Voulez-vous vraiment supprimer la evénement {0} ?
line=Ligne
offset=Décalage
doYouReallyWantToRemoveCompetitors=Voulez-vous vraiment supprimer les concurrents sélectionnés ?
@@ -994,15 +996,15 @@ successfullyAuthorizedAccessToIgtimiUser=Autorisation d''accès réussie pour l'
couldNotAuthorizedAccessToIgtimiUser=Autorisation pour l''utilisateur {0} échouée : mot de passe ou nom d''utilisateur non valide.
errorGettingIgtimiAuthorizationUrl=Erreur lors de l''accès à l''URL d''autorisation Igtimi : {0}
addIgtimiUser=Ajouter utilisateur Igtimi
doYouReallyWantToRemoveLeaderboards=Voulez-vous vraiment supprimer les palmarès ?
doYouReallyWantToRemoveLeaderboards=Voulez-vous vraiment supprimer les classements ?
errorTryingToRemoveIgtimiAccount=Erreur lors de la tentative de suppression du compte Igtimi pour l''utilisateur {0}.
successfullyRemoveIgtimiAccount=Suppression du compte Igtimi pour l''utilisateur {0} réussie.
eMailMustNotBeEmpty=L''adresse e-mail ne doit pas être vide.
emailAddress=Adresse e-mail
password=Mot de passe
searchTag=Balise de recherche
doYouReallyWantToRemoveLeaderboard=Voulez-vous vraiment supprimer le palmarès ''''{0}'''' ?
metaLeaderboardCannotBeChanged=Ce palmarès est de type méta. Vous ne pouvez pas le modifier ici.
doYouReallyWantToRemoveLeaderboard=Voulez-vous vraiment supprimer le classement ''''{0}'''' ?
metaLeaderboardCannotBeChanged=Ce classement est de type méta. Vous ne pouvez pas le modifier ici.
failedToSetNewStartTime=Définition de la nouvelle heure de départ échouée. Cela peut arriver lorsque la même heure de départ existe déjà dans le journal de course ou lorsque quelqu''un d''autre a ajouté une heure de départ plus récente (sous forme d''ID de passage et d''heure logique) que celle que vous venez d''ajouter.
doYouReallyWantToRemoveIgtimiAccount=Souhaitez-vous réellement supprimer le compte Igtimi qui permet à l''utilisateur {0} d''accéder aux données ?
igtimiWindImport=Importer le vent depuis Igtimi
@@ -1029,8 +1031,8 @@ addRaceLogTracker=Ajouter tracker de journal de course
addRaceLogTrackers=Ajouter trackers de journal de course
denoteForRaceLogTracking=Marquer pour suivi par journal de course
startRaceLogTracking=Lancer le suivi par journal de course
filterByLeaderboard=Filtrer par palmarès
removeLeaderboardFilter=Supprimer filtre de palmarès
filterByLeaderboard=Filtrer par classement
removeLeaderboardFilter=Supprimer filtre de classement
competitorRegistrations=Inscriptions de concurrents
trackerStatus=Statut de tracker
courseStatus=Statut de course
@@ -1060,7 +1062,7 @@ closeTimeRange=Fermer extrémité ouverte de l''intervalle de temps
setClosingTimePoint=Définir une heure de fin pour l''intervalle de temps ouvert
startOfTimeRangeMustLieBeforeEnd=Le début de l''intervalle de temps doit se situer avant sa fin.
overallProgress=Progression générale
eventOverview=Synthèse de la manifestation
eventOverview=Synthèse de la evénement
start=Départ
showAddedScores=Afficher scores ajoutés pour chaque entrée du palmarès
ratio=ratio
@@ -1081,10 +1083,10 @@ selectRaces=Sélectionner les courses
importFixes=Importer positions
noSailingServerInstancesYet=Aucune instance de serveur distant enregistrée pour le moment
registeredSailingServerInstances=Instances de serveur distant enregistrées
filterEventsByName=Filtrer manifestations par nom :
leaderboardsExceptFromSelectedGroup=Palmarès (sauf ceux du groupe sélectionné)
availableLeaderboardGroups=Groupes de palmarès disponibles
leaderboardGroupsOfSelectedEvent=Groupe de palmarès affectés à la manifestation
filterEventsByName=Filtrer evénements par nom :
leaderboardsExceptFromSelectedGroup=Classement (sauf ceux du groupe sélectionné)
availableLeaderboardGroups=Groupes de classement disponibles
leaderboardGroupsOfSelectedEvent=Groupe de classement affectés à la evénement
addRaces=Ajouter des courses
withNamePrefix=avec préfixe de nom
pleaseSelectASeriesFirst=Sélectionnez d''abord une série.
@@ -1119,9 +1121,9 @@ advancePassId=ID de passage avancé
pleaseSelectAScoringResult=Sélectionnez un résultat...
timeZone=Fuseau horaire
eventOfficialWebsiteURL=URL du site Web officiel
eventBaseURL=URL de base de la manifestation (http://something.sapsailing.com)
eventBaseURL=URL de base de la evénement (http://something.sapsailing.com)
eventSailorsInfoWebsiteURL=URL du site Web avec infos pour les concurrents
eventOverviewURL=URL de synthèse de la manifestation
eventOverviewURL=URL de synthèse de la evénement
eventLogoImageURL=URL de l''image du logo
showPingMarkMappings=Afficher mappages pour marques avec pings effectués
regattaNameMustNotContainSlashes=Le nom de la régate ne doit pas contenir de barres obliques.
@@ -1152,11 +1154,11 @@ connectors=Connecteurs
videoComponentShortName=Vidéo
competitorSearchFilter=Filtre de recherche de concurrent
searchCompetitorsBySailNumberOrName=Rechercher
goToEventOverview=Accéder à la synthèse de la manifestation
goToOverviewAndSeeLeaderboard=Accédez à la synthèse et affichez toutes les courses sur un seul palmarès.
noSuchEvent=Aucune manifestation correspondante
leaderboardNotContainedInLeaderboardGroup=Le palmarès {0} ne fait pas partie du groupe de palmarès {1}.
leaderboardGroupNotContainedInEvent=Le groupe de palmarès {0} ne fait pas partie de la manifestation {1}.
goToEventOverview=Accéder à la synthèse de la evénement
goToOverviewAndSeeLeaderboard=Accédez à la synthèse et affichez toutes les courses sur un seul classement.
noSuchEvent=Aucune evénement correspondante
leaderboardNotContainedInLeaderboardGroup=Le classement {0} ne fait pas partie du groupe de classement {1}.
leaderboardGroupNotContainedInEvent=Le groupe de classement {0} ne fait pas partie de la evénement {1}.
raceIsInLiveTimePanelMode=La course est en direct.
backToLiveTimePanelMode=Retour au direct
windChart=Graphique du vent
@@ -1194,23 +1196,23 @@ regattaStructureImport=Importation de la structure de la régate
filteredBy=filtré par
editSeries=Modifier série
pleaseSelectAtLeastOneRegatta=Sélectionnez au moins une régate.
pleaseSelectAnEvent=Sélectionnez une manifestation.
selectALeaderboard=Sélectionnez un palmarès.
pleaseSelectAnEvent=Sélectionnez une evénement.
selectALeaderboard=Sélectionnez un classement.
autoplayConfiguration=Configuration de lecture automatique
startAutoplay=Lancer lecture automatique
autoplaySettings=Options de lecture automatique
startBrowserFullscreen=Lancer navigateur en mode plein écran
switchToLiveRaceAutomatically=Passer automatiquement à la course en direct
timeBeforeRaceStart=durée avant le départ de la course (en secondes)
errorTryingToGetEvents=Erreur lors de la tentative d''accès aux manifestations : {0}
errorTryingToGetEvents=Erreur lors de la tentative d''accès aux evénements : {0}
showXYDiagram=Afficher diagramme x-y
xyDiagram=Diagramme x-y
boatSpeed=Vitesse du bateau
confidence=Fiabilité
createDefaultSettingsForAllRegattas=Créer des options par défaut pour toutes les régates...
noOverallEventSelected=Aucune manifestation globale sélectionnée...
errorTryingToCreateNewEvent=Erreur lors de la tentative de création de la nouvelle manifestation {0} : {1}
createNewEvent=Créer manifestation
noOverallEventSelected=Aucune evénement globale sélectionnée...
errorTryingToCreateNewEvent=Erreur lors de la tentative de création de la nouvelle evénement {0} : {1}
createNewEvent=Créer evénement
noFleetsDefined=Aucune flotte définie
successfullyCreatedRegattas=Création des régates réussie
errorTryingToRegisterRacesForTracking=Erreur lors de la tentative d''enregistrement des courses {0} pour le suivi : {1}. Vérifiez la syntaxe de l''URL stockée/du direct.
@@ -1242,7 +1244,7 @@ inviteSelectedCompetitors=Inviter concurrents sélectionnés
notAllCompetitorsProvideEmail=Les concurrents n''ont pas tous fourni un e-mail.
sendingMailsFailed=Échec de l''envoi des e-mails
sendingMailsSuccessful=Envoi des e-mails réussi
selectEventForInvitation=Sélectionnez une manifestation pour l''invitation.
selectEventForInvitation=Sélectionnez une evénement pour l''invitation.
imageURL=URL d''image
upload=Charger
removeResult=Supprimer opération : {0} {1}
@@ -1251,6 +1253,7 @@ fileUploadResult=Chargement du fichier : {0} {1}.\nEn cas d''erreur, vérifiez
removeUploadedFile=Supprimer fichier chargé
showCompetitorSailIdColumn=ID de voile
showCompetitorFullNameColumn=Nom complet du concurrent
showCompetitorNationalityColumn=Nationalité du concurrent
loadingDimensionValues=Chargement des valeurs de dimension
runningQuery=Requête en cours
inviteBuoyTenders=Inviter navire baliseur
@@ -1310,15 +1313,15 @@ clickToToggleWindStreamlets=Touchez/cliquez pour afficher ou masquer les couloir
startLineToFirstMarkTriangle=Distance entre le départ et la première marque ({0} m)
dataMiningComponentsHaveBeenUpdated=Les composants d''exploration de données ont été mis à jour.
dataMiningComponentsNeedReloadDialogMessage=Cliquez sur Recharger pour recharger les composants maintenant. Les données actuellement affichées seront ignorées et une requête par défaut sera exécutée.n\Cliquez sur Fermer pour ne rien faire. L''exploration de données ne fonctionnera pas correctement tant que les composants n''auront pas été rechargés.
noDataForEvent=Il n''y a pas encore de données pour cette manifestation.
noDataForEvent=Il n''y a pas encore de données pour cette evénement.
countriesCount={0,number} pays
countriesCount[one]={0,number} pays
racesCount={0,number} courses
racesCount[one]={0,number} course
trackedRacesCount={0,number} courses suivies
trackedRacesCount[one]={0,number} course suivie
eventsCount={0,number} manifestations
eventsCount[one]={0,number} manifestation
eventsCount={0,number} evénements
eventsCount[one]={0,number} evénement
competitorsCount={0,number} concurrents
courseAreaName=Zone de course : {0}
competitorsCount[one]={0,number} concurrents
@@ -1364,7 +1367,7 @@ raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSeconds=Temps cal
raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSecondsTooltip=Temps calculé selon l''arrivée estimée du concurrent qui est actuellement en tête de la course ; \nestimation basée sur la VMG dans la portion de parcours actuelle, équivaut à la performance (calculée) du bateau le plus rapide dans toutes les portions de parcours suivantes.
sailorInfo=Informations concurrents
sailorInfoLongText=Résultats officiels, réclamations, météo marine
eventQuickfinder=Quickfinder manifestation
eventQuickfinder=Quickfinder evénement
regattaQuickfinder=Quickfinder régate
resultsQuickfinder=Quickfinder résultats
racesQuickfinder=Quickfinder courses
@@ -1386,7 +1389,7 @@ billionValue={0,number,#0.0} bil
noResults=Aucun résultat disponible pour l''instant.
noNews=Aucune actualité disponible.
pointsValue={0,number,#0.00}
openLeaderboard=Ouvrir palmarès
openLeaderboard=Ouvrir classement
now=Maintenant
minutesAgo=Il y a {0} min.
hoursAgo=Il y a {0} h.
@@ -1419,8 +1422,8 @@ videosCount={0,number} vidéos
videosCount[one]={0,number} vidéo
photosCount={0,number} photos
photosCount[one]={0,number} photo
eventsHaveTakenPlace={0} manifestations ont eu lieu.
eventsHaveTakenPlace[one]=Une manifestation a eu lieu.
eventsHaveTakenPlace={0} evénements ont eu lieu.
eventsHaveTakenPlace[one]=Une evénement a eu lieu.
raceOffice=Bureau de course
analyze=Analyser
dataMiningSettings=Options de l''exploration de données
@@ -1434,7 +1437,7 @@ actionWatch=Regarder
actionAnalyze=Analyser
denoteAllRacesForRaceLogTrackingShorctut=Raccourci pour marquer toutes les courses pour le suivi par journaux de course
registerCompetitors=Inscrire les concurrents
doYouWantToCreateADefaultRegattaLeaderboard=Voulez-vous créer un palmarès de régate par défaut ?
doYouWantToCreateADefaultRegattaLeaderboard=Voulez-vous créer un classement de régate par défaut ?
copyCourse=Copier course
copyCompetitors=Copier concurrents
smartphoneTracking=Suivi smartphone
@@ -1462,7 +1465,7 @@ errorLoadingDataWithTryAgain=Erreur lors du chargement des données. Nouvel essa
addGalleryPhoto=Ajouter photo de la galerie
addStageImage=Ajouter image d''étape
addTeaserImage=Ajouter image d''accroche
addEventLogo=Ajouter logo de la manifestation
addEventLogo=Ajouter logo de la evénement
noImagesDefinedYet=Aucune image définie pour le moment
imageSizeError=La taille de l''image {0} ne correspond pas. La largeur doit être comprise entre {1} et {2} pixels et la hauteur entre {3} et {4} pixels.
couldNotRetrieveImageSizeYet=Impossible de récupérer la largeur et la hauteur de l''image pour l''instant
@@ -1476,7 +1479,7 @@ competitorRegistrationsOnRaceDisabled=Les inscriptions des concurrents sont dés
warningForDisabledCompetitors=Les concurrents suivants ne peuvent pas être inscrits à cette course : {0}
competitorToolTipMessage={0} a déjà été affecté à la flotte {2} dans la course {3} et ne peut donc pas être affecté à la flotte {1} dans la même course.
addMarkToRegatta=Ajouter marque à la régate
selectALeaderboardGroup=Sélectionner groupe de palmarès…
selectALeaderboardGroup=Sélectionner groupe de classement…
pleaseSelect=Sélectionnez
requiresValidRegatta=Pour identifier la course à afficher, cette page nécessite une régate valide, une colonne de course et un nom de flotte.
couldNotObtainRace=Impossible de trouver une course ayant le nom {1} pour la flotte {2} pour une régate ayant le nom {0} : {3}
@@ -1488,7 +1491,7 @@ profile=Profil
showOnlyCompetitorsOfLog=Afficher uniquement concurrents inscrits dans le journal
confirmLosingCompetitorEditsWhenTogglingLogBasedView=Cette action réinitialisera les modifications non enregistrées apportées aux concurrents.\nVoulez-vous vraiment continuer ?
removalOfMarkDisabledMayBeUsedInRaces=Suppression désactivée, marques utilisées dans les courses {0}
createDefaultLeaderboardGroup=Voulez-vous créer un groupe de palmarès par défaut pour votre manifestation ?
createDefaultLeaderboardGroup=Voulez-vous créer un groupe de classement par défaut pour votre evénement ?
pleaseCreateAtLeastOneMappingBy=Créez au moins un mappage en sélectionnant d''abord une piste sur la gauche, puis une marque ou un concurrent sur la droite.
matcherType=Type de comparateur
matchingDevices=Appareils correspondants
@@ -1499,10 +1502,10 @@ create=Créer
thereIsAlreadyAConfigurationForThisDevice=Une configuration existe déjà pour cet appareil.
enterDeviceIdentifierName=Saisissez un nom d''identifiant.
administration=Administration
pleaseSelectALeaderboardGroup=Sélectionnez un groupe de palmarès.
linkLeaderboardToLeaderboardGroupOfEvent=Liez le palmarès au groupe de palmarès de la manifestation.
doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent=Liez le palmarès {0} à un groupe de palmarès de la manifestation {1}.
failedToLinkLeaderboardToLeaderboardGroup=La liaison du palmarès {0} au groupe de palmarès {1} a échoué.
pleaseSelectALeaderboardGroup=Sélectionnez un groupe de classement.
linkLeaderboardToLeaderboardGroupOfEvent=Liez le classement au groupe de classement de la evénement.
doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent=Liez le classement {0} à un groupe de classement de la evénement {1}.
failedToLinkLeaderboardToLeaderboardGroup=La liaison du classement {0} au groupe de classement {1} a échoué.
createDefaultRegatta=Créer régate par défaut
doYouWantToCreateADefaultRegatta=Voulez-vous créer une régate par défaut ?
defaultLocale=Par défaut
@@ -1538,8 +1541,8 @@ fixPositionSuccessfullyEdited=Modification de la position du point réussie.
fixSuccessfullyRemoved=Suppression du point réussie.
dragToChangePosition=Glissez pour modifier la position.\nClic droit pour ouvrir le menu permettant la suppression.
moveFix=Déplacer point
manage2SailEvent=Manifestation Manage2Sail
noEventsYet=Aucune manifestation pour l''instant.
manage2SailEvent=Evénement Manage2Sail
noEventsYet=Aucune evénement pour l''instant.
selectCompetitorImportProvider=Sélectionnez un fournisseur d''importation de concurrents...
selectResultImportProvider=Sélectionnez un fournisseur d''importation de résultats...
buildVersion=Version de build
@@ -1562,10 +1565,10 @@ transferStarted=Lecture des données
transferCompleted=Transfert des données terminé. Initialisation de l''opération d''importation.
importInit=Initialisation de l''importation
importWait=En attente de la fin d''autres opérations d''importation
importLeaderboardGroups=Importation de groupes de palmarès en cours...
importLeaderboardGroups=Importation de groupes de classement en cours...
importWindTracks=Importation de pistes de vent en cours...
importSensorFixes=Importation de points capteurs en cours...
updateEventLeaderboardGroupLinks=Mise à jour des liens du groupe de palmarès de la manifestation
updateEventLeaderboardGroupLinks=Mise à jour des liens du groupe de classement de la evénement
strategySimulatorTitle=Simulateur de stratégies
controlSettings=Options de contrôle
windDisplay=Affichage du vent
@@ -1641,10 +1644,10 @@ chartSelectionHint=Astuce : Vous pouvez également utiliser le palmarès (sur l
chooseALanguage=Sélectionner une langue
solutions=Solutions
blog=Blog
officalEventWebsite=Site Web officiel de la manifestation
officalEventWebsite=Site Web officiel de la evénement
moreInfo=Plus d''infos
viewAnalysis=Afficher analyses
overallLeaderboard=Palmarès général
overallLeaderboard=Classement général
pleaseTryAgain=Veuillez réessayer...
reloadPage=Recharger la page
errorMessageLoadingData=Une erreur s''est produite pendant le chargement des données pour cette page.
@@ -1675,11 +1678,11 @@ footerPrivacy=Confidentialité des données
footerFeedback=Commentaires
headerLogo=Sailing Analytics
headerSearchPlaceholder=Rechercher
mainEventShowAll=Afficher toutes les manifestations
mainEventTitle=Manifestations les plus récentes du monde de la voile
mainMediaSubtitle=Oubliez le quotidien grâce à des images époustouflantes de l''édition la plus récente de votre manifestation de voile préférée.
mainEventShowAll=Afficher toutes les evénements
mainEventTitle=Evénements les plus récentes du monde de la voile
mainMediaSubtitle=Oubliez le quotidien grâce à des images époustouflantes de l''édition la plus récente de votre evénement de voile préférée.
mainMediaTitle=Les photographes adorent la voile.
mainMediaVideosSubtitle=Plongez dans le monde de la voile et accédez à encore plus de vidéos de nos manifestations les plus récentes.
mainMediaVideosSubtitle=Plongez dans le monde de la voile et accédez à encore plus de vidéos de nos evénements les plus récentes.
mainMediaVideosTitle=Vidéos récentes
searchResultHeaderButton=Rechercher
searchResultHeaderLabel=Votre recherche
@@ -1773,9 +1776,12 @@ floatNumber=Flottant
integer=Entier
sampleColor=Échantillon de couleur
sharedSettingsLink=Lier aux options
leaderboardPage=Page du palmarès
leaderboardPage=Page du classement
makeDefault=Définir par défaut
makeDefaultInProgress=En cours...
settingsSavedMessage=Vos options actuelles ont correctement été définies comme options par défaut.
settingsSaveErrorMessage=Une erreur s''est produite lors de la définition de vos options comme options par défaut.
showLiveNow=Afficher "En direct"
useOnlyOneOfStartTimeInferenceAndControlTrackingFromStartAndFinishTimes=Utilisez "Interférence temporelle de départ" ou bien "Contrôler suivi à partir des heures de départ et d''arrivée", mais pas les deux.
unknownLeaderboardType=Type de palmarès {0} inconnu
selectCompetitorsToEliminate=Sélectionner des concurrents à éliminer
@@ -455,6 +455,7 @@ scoringSchemeHighPointFirstGetsTwelveOrEight2017Description=得点数による
scoringSystem=得点方式
createFlexibleLeaderboard=フレキシブルリーダーボード登録
createRegattaLeaderboard=レガッタリーダーボード登録
createRegattaLeaderboardWithEliminations=レガッタリーダーボード登録 (予選あり)
createDefaultRegattaLeaderboard=レガッタリーダーボード初期登録
editFlexibleLeaderboard=フレキシブルリーダーボード編集
editRegattaLeaderboard=レガッタリーダーボード編集
@@ -595,8 +596,8 @@ applyMinimumWindConfidence=最小風信頼度の適用
applyMinimumWindConfidenceTooltip=選択すると、上にあるボックスの値が、生成時に最小有効風信頼度として使用されます。
windRangeDistribution=風範囲の分布
pleaseSeeToolTips=ツールチップが利用できる場所でそれを表示するには、オプションの上をホバーしてください。
competitorColumnTooltip=この競技者の乗員の名前です。
competitorNationalityColumnTooltip=Nationality of this competitor.
competitorColumnTooltip=この競技者のセーラーの名前です。
competitorNationalityColumnTooltip=この競技者の国籍です。
sailIdColumnTooltip=競技者の国の国旗と競技者のセールナンバーを表示します。
rankColumnTooltip=レガッタにおけるこの競技者の全体ランクです。
carryColumnTooltip=以前のレースから持ち越された得点です。
@@ -1252,7 +1253,7 @@ fileUploadResult=ファイルアップロード: {0} {1}\nエラー発生の場
removeUploadedFile=アップロード済ファイルの削除
showCompetitorSailIdColumn=帆走 ID
showCompetitorFullNameColumn=競技者氏名
showCompetitorNationalityColumn=Competitor Nationality
showCompetitorNationalityColumn=競技者国籍
loadingDimensionValues=次元値ロード中
runningQuery=クエリ実行中
inviteBuoyTenders=ブイ入札の招待
@@ -1780,4 +1781,7 @@ makeDefault=デフォルトを設定
makeDefaultInProgress=実行中です...
settingsSavedMessage=現在の設定がデフォルトとして設定されました
settingsSaveErrorMessage=使用している設定をデフォルトとして設定する際にエラーが発生しました
showLiveNow="実況中" を表示
useOnlyOneOfStartTimeInferenceAndControlTrackingFromStartAndFinishTimes="推定スタート時刻" および "スタート/フィニッシュ時刻からのコントロール追跡" は 1 つだけ使用してください
unknownLeaderboardType=未知のリーダーボードタイプ {0}
selectCompetitorsToEliminate=予選敗退の競技者を選択
@@ -455,6 +455,7 @@ scoringSchemeHighPointFirstGetsTwelveOrEight2017Description=Pontuação em ponto
scoringSystem=Sistema de pontuação
createFlexibleLeaderboard=Criar painel de classificação flexível
createRegattaLeaderboard=Criar painel de classificação de regata
createRegattaLeaderboardWithEliminations=Criar painel de classificação de regata com eliminatórias
createDefaultRegattaLeaderboard=Criar painel de classificação de regata padrão
editFlexibleLeaderboard=Processar painel de classificação flexível
editRegattaLeaderboard=Processar painel de classificação de regata
@@ -595,7 +596,8 @@ applyMinimumWindConfidence=Aplicar confiança de vento mínima
applyMinimumWindConfidenceTooltip=Se marcado, o valor na caixa acima será utilizado como a confiança de vento válida mínima durante a geração.
windRangeDistribution=Distribuição na amplitude do vento.
pleaseSeeToolTips=Passe com o mouse sobre as opções para ver os tooltips sempre que disponíveis.
competitorColumnTooltip=Nomes dos membros deste competidor.
competitorColumnTooltip=Nomes dos velejadores deste competidor.
competitorNationalityColumnTooltip=Nacionalidade deste competidor.
sailIdColumnTooltip=Exibe a bandeira do país e o número da vela do competidor.
rankColumnTooltip=A posição geral deste competidor na regata.
carryColumnTooltip=Pontos transferidos de corridas anteriores.
@@ -1251,6 +1253,7 @@ fileUploadResult=Carregamento de arquivo: {0} {1}.\nEm caso de erro, verifique s
removeUploadedFile=Remover arquivo carregado
showCompetitorSailIdColumn=ID da vela
showCompetitorFullNameColumn=Nome completo do competidor
showCompetitorNationalityColumn=Nacionalidade do competidor
loadingDimensionValues=Carregando valores de dimensão
runningQuery=Executando consulta
inviteBuoyTenders=Convidar navios-balizadores
@@ -1778,4 +1781,7 @@ makeDefault=Definir como padrão
makeDefaultInProgress=Em andamento...
settingsSavedMessage=Suas configurações atuais foram definidas com êxito como padrão
settingsSaveErrorMessage=Ocorreu um erro ao definir suas configurações como padrão
showLiveNow=Exibir "Ao vivo agora"
useOnlyOneOfStartTimeInferenceAndControlTrackingFromStartAndFinishTimes=Utilizar só um de "Inferência da hora de partida" e "Rastreamento de controle das horas de partida e chegada"
unknownLeaderboardType=Tipo de painel de classificação desconhecido {0}
selectCompetitorsToEliminate=Selecionar competidores a eliminar
@@ -455,6 +455,7 @@ scoringSchemeHighPointFirstGetsTwelveOrEight2017Description=Оценка в ба
scoringSystem=Система оценок
createFlexibleLeaderboard=Создать гибкую таблицу лидеров
createRegattaLeaderboard=Создать таблицу лидеров регаты
createRegattaLeaderboardWithEliminations=Создать таблицу лидеров регаты с турами на выбывание
createDefaultRegattaLeaderboard=Создать таблицу лидеров регаты по умолчанию
editFlexibleLeaderboard=Изменить гибкую таблицу лидеров
editRegattaLeaderboard=Изменить таблицу лидеров регаты
@@ -595,8 +596,8 @@ applyMinimumWindConfidence=Применить минимальную досто
applyMinimumWindConfidenceTooltip=Если установлено, указанное выше значение будет использоваться как минимально допустимая достоверность ветра при генерировании.
windRangeDistribution=Распределение в диапазоне ветра.
pleaseSeeToolTips=Наведите указатель на параметр, чтобы просмотреть всплывающую подсказку (если доступна).
competitorColumnTooltip=Имена членов данного участника.
competitorNationalityColumnTooltip=Nationality of this competitor.
competitorColumnTooltip=Имена членов экипажа данного участника.
competitorNationalityColumnTooltip=Государственная принадлежность участника.
sailIdColumnTooltip=Показывает флаг страны и хвостовой номер участника.
rankColumnTooltip=Общий ранг данного участника в регате.
carryColumnTooltip=Баллы, перенесенные из других гонок.
@@ -1252,7 +1253,7 @@ fileUploadResult=Отправка файла: {0} {1}.\nВ случае ошиб
removeUploadedFile=Удалить отправленный файл
showCompetitorSailIdColumn=Ид. паруса
showCompetitorFullNameColumn=Полное имя участника
showCompetitorNationalityColumn=Competitor Nationality
showCompetitorNationalityColumn=Государственная принадлежность участника
loadingDimensionValues=Загрузка значений измерения
runningQuery=Выполнение запроса
inviteBuoyTenders=Пригласить лоцманов
@@ -1780,4 +1781,7 @@ makeDefault=Использовать по умолчанию
makeDefaultInProgress=Выполняется...
settingsSavedMessage=Текущие настройки успешно заданы для использования по умолчанию
settingsSaveErrorMessage=При задании настроек для использования по умолчанию возникла ошибка
showLiveNow=Показать "Оперативные данные"
useOnlyOneOfStartTimeInferenceAndControlTrackingFromStartAndFinishTimes=Использовать только один из параметров "Вывод о времени старта" и "Контролировать отслеживание от времени старта и финиша"
unknownLeaderboardType=Неизвестный тип таблицы лидеров {0}
selectCompetitorsToEliminate=Выберите участников для исключения
@@ -455,6 +455,7 @@ scoringSchemeHighPointFirstGetsTwelveOrEight2017Description=得分。获胜者
scoringSystem=记分系统
createFlexibleLeaderboard=创建灵活的积分榜
createRegattaLeaderboard=创建比赛积分榜
createRegattaLeaderboardWithEliminations=通过淘汰创建比赛积分榜
createDefaultRegattaLeaderboard=创建默认的比赛积分榜
editFlexibleLeaderboard=编辑灵活的积分榜
editRegattaLeaderboard=编辑比赛积分榜
@@ -595,8 +596,8 @@ applyMinimumWindConfidence=应用最小风力置信度
applyMinimumWindConfidenceTooltip=如果选中,以上方框中的值将在生成期间用作最小有效的风力置信度。
windRangeDistribution=风力范围分布。
pleaseSeeToolTips=请将鼠标移到选项,查看可用的工具提示。
competitorColumnTooltip=此参赛队的成员姓名。
competitorNationalityColumnTooltip=Nationality of this competitor.
competitorColumnTooltip=此参赛队的水手姓名。
competitorNationalityColumnTooltip=此参赛队的国籍。
sailIdColumnTooltip=显示参赛队所代表的国家国旗和帆号。
rankColumnTooltip=参赛队在比赛中的总名次。
carryColumnTooltip=前几个轮次的比赛中的得分。
@@ -1252,7 +1253,7 @@ fileUploadResult=文件上传: {0} {1}。\n如果出错,请检查文件存
removeUploadedFile=移除上传的文件
showCompetitorSailIdColumn=帆号
showCompetitorFullNameColumn=参赛队全名
showCompetitorNationalityColumn=Competitor Nationality
showCompetitorNationalityColumn=参赛队国籍
loadingDimensionValues=正在加载尺寸值
runningQuery=运行查询
inviteBuoyTenders=邀请浮标供应船
@@ -1780,4 +1781,7 @@ makeDefault=设为默认值
makeDefaultInProgress=正在进行...
settingsSavedMessage=当前设置已成功设为默认设置
settingsSaveErrorMessage=将设置设为默认设置时发生错误
showLiveNow=显示“现在直播”
useOnlyOneOfStartTimeInferenceAndControlTrackingFromStartAndFinishTimes=仅使用“开始时间推断”和“从开始和结束时间控制跟踪”中的其中一个
unknownLeaderboardType=积分榜类型{0}未知
selectCompetitorsToEliminate=选择要淘汰的参赛队
@@ -0,0 +1,20 @@
package com.sap.sailing.gwt.ui.client.shared.racemap;
import java.util.LinkedHashMap;
import com.sap.sailing.gwt.ui.shared.QuickRankDTO;
public class DefaultQuickRanksDTOProvider implements QuickRanksDTOProvider {
private LinkedHashMap<String, QuickRankDTO> quickRanksFromServer;
@Override
public void quickRanksReceivedFromServer(LinkedHashMap<String, QuickRankDTO> quickRanksFromServer) {
this.quickRanksFromServer = quickRanksFromServer;
}
@Override
public LinkedHashMap<String, QuickRankDTO> getQuickRanks() {
return quickRanksFromServer;
}
}
@@ -0,0 +1,42 @@
package com.sap.sailing.gwt.ui.client.shared.racemap;
import java.util.LinkedHashMap;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.LeaderboardDTO;
import com.sap.sailing.gwt.ui.client.LeaderboardUpdateListener;
import com.sap.sailing.gwt.ui.raceboard.RaceBoardPanel;
import com.sap.sailing.gwt.ui.shared.QuickRankDTO;
import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO;
/**
* The {@link QuickRankDTO} objects stored in the {@link RaceMap}'s {@code quickRanks} field may be obtained in
* different ways. This interface abstracts the different strategies for how this may happen. If a {@link RaceMap} is
* used in the context of a {@link RaceBoardPanel} which is a {@link LeaderboardUpdateListener}, {@link LeaderboardDTO}
* objects can provide the up-to-date information for all aspects of the {@link QuickRankDTO} objects required.
* Otherwise, the {@link QuickRankDTO} objects as received in the {@link RaceMapDataDTO} objects can be used. This may
* not always be consistent and in sync with the leaderboard being shown for a particular time point because their
* calculation in the back-end happens in a lower-priority thread, hence may be a bit delayed in a server under high
* load. See also bug 4175.
*
* @author Axel Uhl (d043530)
*
*/
public interface QuickRanksDTOProvider {
/**
* The strategy may or may not use this quick ranks information provided directly from the server. This information
* may have been provided with some delay and may be slightly inconsistent with a {@link LeaderboardDTO leaderboard}
* that was delivered through a different channel. Therefore, a strategy that has access to a current
* {@link LeaderboardDTO leaderboard} should ignore this call if it already has quick ranks information available
* from a leaderboard.
*
* @param quickRanksFromServer keys are the competitor IDs as strings
*/
void quickRanksReceivedFromServer(LinkedHashMap<String, QuickRankDTO> quickRanksFromServer);
/**
* @return keys are the {@link CompetitorDTO#getIdAsString() competitor IDs are string}, values are the quick ranks
* pertaining to the competitors whose IDs are provided as keys
*/
LinkedHashMap<String, QuickRankDTO> getQuickRanks();
}
@@ -8,7 +8,6 @@ import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -76,11 +75,11 @@ import com.sap.sailing.domain.common.Bounds;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.ManeuverType;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.LeaderboardDTO;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.impl.MeterDistance;
@@ -349,18 +348,12 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
private int lastLegNumber;
/**
* The last quick ranks received from a call to {@link SailingServiceAsync#getQuickRanks(RaceIdentifier, Date, AsyncCallback)} upon
* the last {@link #timeChanged(Date, Date)} event. Therefore, the ranks listed here correspond to the {@link #timer}'s time.
* The strategy for maintaining and delivering the "quick ranks" information. The provider will be informed about
* quick ranks received from a {@link RaceMapDataDTO#quickRanks} field but may choose to ignore this information, e.g.,
* if it can assume that more current information about ranks and leg numbers is available from a {@link LeaderboardDTO}.
*/
private LinkedHashMap<CompetitorDTO, QuickRankDTO> quickRanks;
private final QuickRanksDTOProvider quickRanksDTOProvider;
/**
* Taken from {@link RaceMapDataDTO#competitorsInOrderOfWindwardDistanceTraveledWithOneBasedLegNumber}; tells the
* windward distances traveled and the leg numbers in which the respective competitor is.
*/
private LinkedHashMap<CompetitorDTO, Integer> competitorsInOrderOfWindwardDistanceTraveledWithOneBasedLegNumber;
private final CombinedWindPanel combinedWindPanel;
private final TrueNorthIndicatorPanel trueNorthIndicatorPanel;
private final FlowPanel topLeftControlsWrapperPanel;
@@ -418,10 +411,11 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
public RaceMap(Component<?> parent, ComponentContext<?> context, RaceMapLifecycle raceMapLifecycle,
RaceMapSettings raceMapSettings,
SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
ErrorReporter errorReporter, Timer timer, CompetitorSelectionProvider competitorSelection, StringMessages stringMessages,
RegattaAndRaceIdentifier raceIdentifier, RaceMapResources raceMapResources,
boolean showHeaderPanel) {
ErrorReporter errorReporter, Timer timer, CompetitorSelectionProvider competitorSelection, RaceCompetitorSet raceCompetitorSet,
StringMessages stringMessages, RegattaAndRaceIdentifier raceIdentifier,
RaceMapResources raceMapResources, boolean showHeaderPanel, QuickRanksDTOProvider quickRanksDTOProvider) {
super(parent, context);
this.quickRanksDTOProvider = quickRanksDTOProvider;
this.raceMapLifecycle = raceMapLifecycle;
this.stringMessages = stringMessages;
this.sailingService = sailingService;
@@ -442,7 +436,7 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
courseMarkOverlays = new HashMap<String, CourseMarkOverlay>();
courseMarkClickHandlers = new HashMap<String, HandlerRegistration>();
this.competitorSelection = competitorSelection;
this.raceCompetitorSet = new RaceCompetitorSet(competitorSelection);
this.raceCompetitorSet = raceCompetitorSet;
competitorSelection.addCompetitorSelectionChangeListener(this);
settings = raceMapSettings;
coordinateSystem = new DelegateCoordinateSystem(new IdentityCoordinateSystem());
@@ -972,9 +966,7 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
" in regatta "+raceIdentifier.getRegattaName(), e);
}
}
quickRanks = raceMapDataDTO.quickRanks;
competitorsInOrderOfWindwardDistanceTraveledWithOneBasedLegNumber =
raceMapDataDTO.competitorsInOrderOfWindwardDistanceTraveledWithOneBasedLegNumber;
quickRanksDTOProvider.quickRanksReceivedFromServer(raceMapDataDTO.quickRanks);
if (isSimulationEnabled && settings.isShowSimulationOverlay()) {
lastLegNumber = raceMapDataDTO.coursePositions.currentLegNumber;
simulationOverlay.updateLeg(Math.max(lastLegNumber, 1), /* clearCanvas */ false, raceMapDataDTO.simulationResultVersion);
@@ -1361,17 +1353,16 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
/**
* Returns a pair whose first component is the leg number (one-based) of the competitor returned as the second component.
*/
private com.sap.sse.common.Util.Pair<Integer, CompetitorDTO> getFarthestAheadVisibleCompetitorWithOneBasedLegNumber(
private com.sap.sse.common.Util.Pair<Integer, CompetitorDTO> getBestVisibleCompetitorWithOneBasedLegNumber(
Iterable<CompetitorDTO> competitorsToShow) {
CompetitorDTO leadingCompetitorDTO = null;
int legOfLeaderCompetitor = -1;
// this only works because the quickRanks are sorted
for (Entry<CompetitorDTO, Integer> competitorsByWindwardDistanceTraveledAndOneBasedLegNumber :
competitorsInOrderOfWindwardDistanceTraveledWithOneBasedLegNumber.entrySet()) {
if (Util.contains(competitorsToShow, competitorsByWindwardDistanceTraveledAndOneBasedLegNumber.getKey()) &&
competitorsByWindwardDistanceTraveledAndOneBasedLegNumber.getValue() != null) {
leadingCompetitorDTO = competitorsByWindwardDistanceTraveledAndOneBasedLegNumber.getKey();
legOfLeaderCompetitor = competitorsByWindwardDistanceTraveledAndOneBasedLegNumber.getValue();
for (QuickRankDTO competitorFromBestToWorstAndOneBasedLegNumber : quickRanksDTOProvider.getQuickRanks().values()) {
if (Util.contains(competitorsToShow, competitorFromBestToWorstAndOneBasedLegNumber.competitor) &&
competitorFromBestToWorstAndOneBasedLegNumber.legNumberOneBased != 0) {
leadingCompetitorDTO = competitorFromBestToWorstAndOneBasedLegNumber.competitor;
legOfLeaderCompetitor = competitorFromBestToWorstAndOneBasedLegNumber.legNumberOneBased;
return new com.sap.sse.common.Util.Pair<Integer, CompetitorDTO>(legOfLeaderCompetitor, leadingCompetitorDTO);
}
}
@@ -1380,11 +1371,11 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
final static Distance advantageLineLength = new MeterDistance(1000); // TODO this should probably rather scale with the visible area of the map; bug 616
private void showAdvantageLine(Iterable<CompetitorDTO> competitorsToShow, Date date, long timeForPositionTransitionMillis) {
if (map != null && lastRaceTimesInfo != null && quickRanks != null && lastCombinedWindTrackInfoDTO != null) {
if (map != null && lastRaceTimesInfo != null && quickRanksDTOProvider.getQuickRanks() != null && lastCombinedWindTrackInfoDTO != null) {
boolean drawAdvantageLine = false;
if (settings.getHelpLinesSettings().isVisible(HelpLineTypes.ADVANTAGELINE)) {
// find competitor with highest rank
com.sap.sse.common.Util.Pair<Integer, CompetitorDTO> visibleLeaderInfo = getFarthestAheadVisibleCompetitorWithOneBasedLegNumber(competitorsToShow);
com.sap.sse.common.Util.Pair<Integer, CompetitorDTO> visibleLeaderInfo = getBestVisibleCompetitorWithOneBasedLegNumber(competitorsToShow);
// the boat fix may be null; may mean that no positions were loaded yet for the leading visible boat;
// don't show anything
GPSFixDTOWithSpeedWindTackAndLegType lastBoatFix = null;
@@ -1979,9 +1970,9 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
infoText.append(competitorDTO.getSailID()).append("\n");
infoText.append(NumberFormatterFactory.getDecimalFormat(1).format(gpsFixDTO.speedWithBearing.speedInKnots))
.append(" ").append(stringMessages.knotsUnit()).append("\n");
QuickRankDTO quickRankDTO = quickRanks.get(competitorDTO);
if (quickRankDTO != null) {
infoText.append(stringMessages.rank()).append(" : ").append(quickRanks.get(competitorDTO).rank);
final Integer rank = getRank(competitorDTO);
if (rank != null) {
infoText.append(stringMessages.rank()).append(" : ").append(rank);
}
return infoText.toString();
}
@@ -2148,13 +2139,7 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
final VerticalPanel vPanel = new VerticalPanel();
vPanel.add(createInfoWindowLabelAndValue(stringMessages.competitor(), competitorDTO.getName()));
vPanel.add(createInfoWindowLabelAndValue(stringMessages.sailNumber(), competitorDTO.getSailID()));
Integer rank = null;
if (quickRanks != null) {
QuickRankDTO quickRank = quickRanks.get(competitorDTO);
if (quickRank != null) {
rank = quickRank.rank;
}
}
final Integer rank = getRank(competitorDTO);
if (rank != null) {
vPanel.add(createInfoWindowLabelAndValue(stringMessages.rank(), String.valueOf(rank)));
}
@@ -2788,8 +2773,9 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
@Override
public Integer getRank(CompetitorDTO competitor) {
// TODO bug4175: obtain from raceBoardPanel.leaderboardPanel.leaderboard instead of QuickRanks
final Integer result;
QuickRankDTO quickRank = quickRanks.get(competitor);
QuickRankDTO quickRank = quickRanksDTOProvider.getQuickRanks().get(competitor.getIdAsString());
if (quickRank != null) {
result = quickRank.rank;
} else {
@@ -1648,22 +1648,9 @@ public class LeaderboardPanel extends AbstractCompositeComponent<LeaderboardSett
public Double get(LeaderboardRowDTO row) {
Double result = null;
LeaderboardEntryDTO fieldsForRace = row.fieldsByRaceColumnName.get(getRaceColumnName());
if (fieldsForRace != null && fieldsForRace.legDetails != null && !fieldsForRace.legDetails.isEmpty()) {
for (LegEntryDTO legDetail : fieldsForRace.legDetails) {
if (legDetail != null) {
if (legDetail.started) {
if (result == null) {
result = 0.0;
}
result++;
} else {
if (result != null) {
result++;
}
break;
}
}
}
if (fieldsForRace != null) {
int currentLeg = fieldsForRace.getOneBasedCurrentLegNumber();
result = currentLeg == 0 ? null : (double) currentLeg;
}
return result;
}
@@ -37,6 +37,8 @@ import com.sap.sailing.gwt.ui.client.TimePanelSettings;
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.racemap.DefaultQuickRanksDTOProvider;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceCompetitorSet;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMap;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapHelpLinesSettings;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapHelpLinesSettings.HelpLineTypes;
@@ -200,8 +202,8 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint
}
final RaceMap raceMap = new RaceMap(null, null, new RaceMapLifecycle(getStringMessages()), raceMapSettings,
sailingService, asyncActionsExecutor, /* errorReporter */ EmbeddedMapAndWindChartEntryPoint.this, timer,
competitorSelection, getStringMessages(), selectedRaceIdentifier, raceMapResources,
/* showHeaderPanel */ false) {
competitorSelection, new RaceCompetitorSet(competitorSelection), getStringMessages(), selectedRaceIdentifier,
raceMapResources, /* showHeaderPanel */ false, new DefaultQuickRanksDTOProvider()) {
@Override
protected void showAdditionalControls(MapWidget map) {
backToLivePlayButton.removeFromParent();
@@ -0,0 +1,114 @@
package com.sap.sailing.gwt.ui.raceboard;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.LeaderboardDTO;
import com.sap.sailing.domain.common.dto.LeaderboardEntryDTO;
import com.sap.sailing.domain.common.dto.LeaderboardRowDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.gwt.ui.client.shared.racemap.QuickRanksDTOProvider;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceCompetitorSet;
import com.sap.sailing.gwt.ui.shared.QuickRankDTO;
import com.sap.sse.common.Util;
/**
* Computes a map of {@link QuickRankDTO}s from a {@link LeaderboardDTO} and a {@link RaceCompetitorSet}, restricting
* the calculation to those competitors actually taking part in a race. If the {@link LeaderboardDTO} does not contain
* detail information about the race, only the order "from best to worst" is used, and ranks are determined based on it,
* whereas the {@link QuickRankDTO#legNumberOneBased leg numbers} will continue to be accepted from the quick ranks
* coming from the server.
*
* @author Axel Uhl (d043530)
*
*/
public class QuickRanksDTOFromLeaderboardDTOProvider implements QuickRanksDTOProvider {
private LinkedHashMap<String, QuickRankDTO> quickRanks;
private final RaceCompetitorSet raceCompetitorSet;
private final RaceIdentifier selectedRace;
private boolean lastLeaderboardProvidedLegNumbers;
private String raceColumnName;
public QuickRanksDTOFromLeaderboardDTOProvider(RaceCompetitorSet raceCompetitorSet, RaceIdentifier selectedRace) {
this.raceCompetitorSet = raceCompetitorSet;
this.selectedRace = selectedRace;
}
@Override
public void quickRanksReceivedFromServer(LinkedHashMap<String, QuickRankDTO> quickRanksFromServer) {
if (quickRanks == null) {
quickRanks = new LinkedHashMap<>();
for (final Entry<String, QuickRankDTO> e : quickRanksFromServer.entrySet()) {
quickRanks.put(e.getKey(), e.getValue());
}
} else if (!lastLeaderboardProvidedLegNumbers) {
// extract at least the leg numbers and update existing quick ranks accordingly in place
for (final Entry<String, QuickRankDTO> e : quickRanks.entrySet()) {
final QuickRankDTO quickRankFromServer = quickRanksFromServer.get(e.getKey());
if (quickRankFromServer != null) {
e.getValue().legNumberOneBased = quickRankFromServer.legNumberOneBased;
}
}
}
}
public void updateQuickRanks(final LeaderboardDTO leaderboard) {
if (quickRanks == null) {
quickRanks = new LinkedHashMap<>();
}
RaceColumnDTO raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
if (raceColumn == null || !raceColumn.containsRace(selectedRace)) {
raceColumnName = getRaceColumnName(leaderboard, selectedRace);
}
if (raceColumnName != null) {
final List<CompetitorDTO> competitorsFromBestToWorst = leaderboard.getCompetitorsFromBestToWorst(raceColumnName);
int rank = 1;
for (final CompetitorDTO c : competitorsFromBestToWorst) {
if (Util.contains(raceCompetitorSet.getIdsOfCompetitorsParticipatingInRaceAsStrings(), c.getIdAsString())) {
final LeaderboardRowDTO row = leaderboard.rows.get(c);
final int oneBasedLegNumber;
if (row != null) {
final LeaderboardEntryDTO raceEntryForCompetitor = row.fieldsByRaceColumnName.get(raceColumnName);
if (raceEntryForCompetitor != null && raceEntryForCompetitor.legDetails != null) {
oneBasedLegNumber = raceEntryForCompetitor.getOneBasedCurrentLegNumber();
lastLeaderboardProvidedLegNumbers = true;
} else {
oneBasedLegNumber = 0;
lastLeaderboardProvidedLegNumbers = false;
}
} else {
oneBasedLegNumber = 0;
}
QuickRankDTO quickRankToUpdate = quickRanks.get(c.getIdAsString());
if (quickRankToUpdate == null) {
quickRanks.put(c.getIdAsString(), new QuickRankDTO(c, rank, oneBasedLegNumber));
} else {
quickRankToUpdate.rank = rank;
if (lastLeaderboardProvidedLegNumbers) {
quickRankToUpdate.legNumberOneBased = oneBasedLegNumber;
}
}
rank++;
}
}
}
}
private String getRaceColumnName(LeaderboardDTO leaderboard, RaceIdentifier selectedRace) {
for (final RaceColumnDTO raceColumn : leaderboard.getRaceList()) {
if (raceColumn.containsRace(selectedRace)) {
return raceColumn.getName();
}
}
return null;
}
@Override
public LinkedHashMap<String, QuickRankDTO> getQuickRanks() {
return quickRanks;
}
}
@@ -70,6 +70,7 @@ 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.FilterWithUI;
import com.sap.sailing.gwt.ui.client.shared.filter.LeaderboardFetcher;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceCompetitorSet;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMap;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapLifecycle;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapResources;
@@ -158,6 +159,7 @@ public class RaceBoardPanel
private final RaceBoardResources raceBoardResources = RaceBoardResources.INSTANCE;
private final RaceBoardMainCss mainCss = raceBoardResources.mainCss();
private final QuickRanksDTOFromLeaderboardDTOProvider quickRanksDTOProvider;
private static final RaceMapResources raceMapResources = GWT.create(RaceMapResources.class);
@@ -218,10 +220,12 @@ public class RaceBoardPanel
RaceTimePanelLifecycle raceTimePanelLifecycle = lifecycle.getRaceTimePanelLifecycle();
RaceTimePanelSettings raceTimePanelSettings = settings
.findSettingsByComponentId(raceTimePanelLifecycle.getComponentId());
final RaceCompetitorSet raceCompetitorSet = new RaceCompetitorSet(competitorSelectionProvider);
quickRanksDTOProvider = new QuickRanksDTOFromLeaderboardDTOProvider(raceCompetitorSet, selectedRaceIdentifier);
raceMap = new RaceMap(this, componentContext, raceMapLifecycle, defaultRaceMapSettings, sailingService, asyncActionsExecutor,
errorReporter, timer,
competitorSelectionProvider, stringMessages, selectedRaceIdentifier, raceMapResources,
/* showHeaderPanel */ true) {
competitorSelectionProvider, raceCompetitorSet, stringMessages, selectedRaceIdentifier,
raceMapResources, /* showHeaderPanel */ true, quickRanksDTOProvider) {
private static final String INDENT_SMALL_CONTROL_STYLE = "indentsmall";
private static final String INDENT_BIG_CONTROL_STYLE = "indentbig";
@Override
@@ -568,6 +572,7 @@ public class RaceBoardPanel
if (editMarkPositionPanel != null) {
editMarkPositionPanel.setLeaderboard(leaderboard);
}
quickRanksDTOProvider.updateQuickRanks(leaderboard);
}
@Override
@@ -1076,6 +1076,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
return result;
}
/**
* Converts the {@link Competitor} objects passed as {@code iterable} to {@link CompetitorDTO} objects.
* The iteration order in the result matches that of the {@code iterable} passed.
*/
private List<CompetitorDTO> convertToCompetitorDTOs(Iterable<? extends Competitor> iterable) {
List<CompetitorDTO> result = new ArrayList<CompetitorDTO>();
for (Competitor c : iterable) {
@@ -2211,7 +2215,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
public QuickRanksDTO computeQuickRanks(RegattaAndRaceIdentifier raceIdentifier, TimePoint timePoint)
throws NoWindException {
final List<QuickRankDTO> result = new ArrayList<>();
final List<CompetitorDTO> competitorDTOsInOrderOfWindwardDistanceTraveledFarthestFirst;
TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier);
if (trackedRace != null) {
final TimePoint actualTimePoint;
@@ -2233,11 +2236,8 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
rank++;
}
competitorDTOsInOrderOfWindwardDistanceTraveledFarthestFirst = convertToCompetitorDTOs(competitorsFromBestToWorst);
} else {
competitorDTOsInOrderOfWindwardDistanceTraveledFarthestFirst = Collections.emptyList();
}
return new QuickRanksDTO(result, competitorDTOsInOrderOfWindwardDistanceTraveledFarthestFirst);
return new QuickRanksDTO(result);
}
private QuickRanksDTO getQuickRanks(RegattaAndRaceIdentifier raceIdentifier, Date date) throws NoWindException {
@@ -2245,7 +2245,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
if (date == null) {
result = quickRanksLiveCache.get(raceIdentifier);
} else {
result = computeQuickRanks(raceIdentifier, date == null ? null : new MillisecondsTimePoint(date));
result = computeQuickRanks(raceIdentifier, new MillisecondsTimePoint(date));
}
return result;
}
@@ -6,7 +6,6 @@ import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.sap.sailing.domain.base.RaceDefinition;
@@ -30,7 +29,6 @@ public class CompactRaceMapDataDTO implements IsSerializable {
private CoursePositionsDTO coursePositions;
private List<SidelineDTO> courseSidelines;
private List<CompactQuickRankDTO> quickRanks;
private LinkedHashMap<String, Integer> competitorsInOrderOfWindwardDistanceTraveledFarthestFirstIdAsStringAndOneBasedLegNumber;
private long simulationResultVersion;
/**
@@ -46,7 +44,6 @@ public class CompactRaceMapDataDTO implements IsSerializable {
this.boatPositionsByCompetitorIdAsString = new CompactBoatPositionsDTO(boatPositions);
this.raceCompetitorIdsAsStrings = raceCompetitorIdsAsStrings;
this.quickRanks = new ArrayList<CompactQuickRankDTO>(quickRanks == null ? 0 : Util.size(quickRanks.getQuickRanks()));
this.competitorsInOrderOfWindwardDistanceTraveledFarthestFirstIdAsStringAndOneBasedLegNumber = new LinkedHashMap<>();
Map<String, Integer> competitorIdAsStringToOneBasedLegNumber = new HashMap<>();
if (quickRanks != null) {
for (QuickRankDTO quickRank : quickRanks.getQuickRanks()) {
@@ -54,11 +51,6 @@ public class CompactRaceMapDataDTO implements IsSerializable {
quickRank.legNumberOneBased));
competitorIdAsStringToOneBasedLegNumber.put(quickRank.competitor.getIdAsString(), quickRank.legNumberOneBased);
}
for (CompetitorDTO competitorInOrderOfWindwardDistanceTraveled : quickRanks.getCompetitorsInOrderOfWindwardDistanceTraveledFarthestFirst()) {
this.competitorsInOrderOfWindwardDistanceTraveledFarthestFirstIdAsStringAndOneBasedLegNumber.put(
competitorInOrderOfWindwardDistanceTraveled.getIdAsString(),
competitorIdAsStringToOneBasedLegNumber.get(competitorInOrderOfWindwardDistanceTraveled.getIdAsString()));
}
}
this.courseSidelines = courseSidelines;
this.coursePositions = coursePositions;
@@ -67,23 +59,16 @@ public class CompactRaceMapDataDTO implements IsSerializable {
public RaceMapDataDTO getRaceMapDataDTO(Map<String, CompetitorDTO> competitorsByIdAsString) {
RaceMapDataDTO result = new RaceMapDataDTO();
result.quickRanks = new LinkedHashMap<CompetitorDTO, QuickRankDTO>(this.quickRanks.size());
result.quickRanks = new LinkedHashMap<String, QuickRankDTO>(this.quickRanks.size());
for (CompactQuickRankDTO compactQuickRank : this.quickRanks) {
final CompetitorDTO competitorDTO = competitorsByIdAsString.get(compactQuickRank.getCompetitorIdAsString());
if (competitorDTO != null) {
result.quickRanks.put(competitorDTO, new QuickRankDTO(competitorDTO, compactQuickRank.getRank(), compactQuickRank.getLegNumber()));
result.quickRanks.put(compactQuickRank.getCompetitorIdAsString(), new QuickRankDTO(competitorDTO, compactQuickRank.getRank(), compactQuickRank.getLegNumber()));
}
}
result.courseSidelines = courseSidelines;
result.coursePositions = coursePositions;
result.boatPositions = boatPositionsByCompetitorIdAsString.getBoatPositionsForCompetitors(competitorsByIdAsString);
result.competitorsInOrderOfWindwardDistanceTraveledWithOneBasedLegNumber = new LinkedHashMap<>();
for (Entry<String, Integer> i : competitorsInOrderOfWindwardDistanceTraveledFarthestFirstIdAsStringAndOneBasedLegNumber.entrySet()) {
CompetitorDTO c = competitorsByIdAsString.get(i.getKey());
if (c != null) {
result.competitorsInOrderOfWindwardDistanceTraveledWithOneBasedLegNumber.put(c, i.getValue());
}
}
result.simulationResultVersion = simulationResultVersion;
result.raceCompetitorIdsAsStrings = this.raceCompetitorIdsAsStrings;
return result;
@@ -1,7 +1,5 @@
package com.sap.sailing.gwt.ui.shared;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
/**
* Combines a list of {@link QuickRankDTO} objects telling about the (calculated, according to any handicap ranking metric
* in place)) ranks of the competitors with an information about the boat farthest ahead in the race. The latter is useful,
@@ -17,23 +15,12 @@ public class QuickRanksDTO {
*/
private final Iterable<QuickRankDTO> quickRanksAfterCalculatedTime;
/**
* Lists the competitors according to their windward distance traveled. The first boat (rank 1) is the
* competitor farthest ahead.
*/
private final Iterable<CompetitorDTO> competitorsInOrderOfWindwardDistanceTraveledFarthestFirst;
public QuickRanksDTO(Iterable<QuickRankDTO> quickRanks, Iterable<CompetitorDTO> competitorsInOrderOfWindwardDistanceTraveledFarthestFirst) {
public QuickRanksDTO(Iterable<QuickRankDTO> quickRanks) {
super();
this.quickRanksAfterCalculatedTime = quickRanks;
this.competitorsInOrderOfWindwardDistanceTraveledFarthestFirst = competitorsInOrderOfWindwardDistanceTraveledFarthestFirst;
}
public Iterable<QuickRankDTO> getQuickRanks() {
return quickRanksAfterCalculatedTime;
}
public Iterable<CompetitorDTO> getCompetitorsInOrderOfWindwardDistanceTraveledFarthestFirst() {
return competitorsInOrderOfWindwardDistanceTraveledFarthestFirst;
}
}
@@ -12,8 +12,7 @@ public class RaceMapDataDTO implements IsSerializable {
public Map<CompetitorDTO, List<GPSFixDTOWithSpeedWindTackAndLegType>> boatPositions;
public CoursePositionsDTO coursePositions;
public List<SidelineDTO> courseSidelines;
public LinkedHashMap<CompetitorDTO, QuickRankDTO> quickRanks;
public LinkedHashMap<CompetitorDTO, Integer> competitorsInOrderOfWindwardDistanceTraveledWithOneBasedLegNumber;
public LinkedHashMap<String, QuickRankDTO> quickRanks;
public long simulationResultVersion;
/**
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

@@ -17,6 +17,7 @@ import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceColumnListener;
import com.sap.sailing.domain.common.LeaderboardNameConstants;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.ResultDiscardingRule;
@@ -36,7 +37,8 @@ public class RaceLogScoringReplicator implements RaceColumnListener {
private static final long serialVersionUID = -5958519195756937338L;
private final RacingEventService service;
private final static String COMMENT_TEXT_ON_SCORE_CORRECTION = "Update triggered by Race Committee.";
private final static String COMMENT_TEXT_ON_SCORE_CORRECTION_SINGLE_FLEET = "Results of race %s have been updated.";
private final static String COMMENT_TEXT_ON_SCORE_CORRECTION_MULTI_FLEET = "Results of race %s, s% have been updated.";
public RaceLogScoringReplicator(RacingEventService service) {
this.service = service;
@@ -192,7 +194,10 @@ public class RaceLogScoringReplicator implements RaceColumnListener {
}
// Since the metadata update is used by the Sailing suite to determine the final state of a race, it has to
// be triggered, even though no score correction may have been performed
applyMetadataUpdate(leaderboard, timePoint, COMMENT_TEXT_ON_SCORE_CORRECTION);
String comment = LeaderboardNameConstants.DEFAULT_FLEET_NAME.equals(fleet.getName())
? String.format(COMMENT_TEXT_ON_SCORE_CORRECTION_SINGLE_FLEET, raceColumn.getName())
: String.format(COMMENT_TEXT_ON_SCORE_CORRECTION_MULTI_FLEET, raceColumn.getName(), fleet.getName());
applyMetadataUpdate(leaderboard, timePoint, comment);
}
}
@@ -31,18 +31,20 @@ public abstract class AbstractListFilter<T> {
public abstract Iterable<String> getStrings(T t);
/**
* Constructs a list based on the contents of {@link #all} and the current search phrase {@link #text}.
* Constructs a list based on the contents of {@code all} using the {@link #matcher} which matches
* the {@code keywords} against what {@link #getStrings(Object)} returns for the respective
* object from {@code all}.
*/
public Iterable<T> applyFilter(Iterable<String> keywords, Iterable<T> all) {
List<T> sortedList = new ArrayList<T>();
List<T> result = new ArrayList<T>();
if (all != null) {
for (T t : all) {
if (matcher.matches(keywords, t)) {
sortedList.add(t);
result.add(t);
}
}
}
return sortedList;
return result;
}
}
@@ -351,18 +351,19 @@ public class TrackingService extends Service implements LocationListener {
*/
@Override
public void onLocationChanged(Location location) {
reportGPSQualityBearingAndSpeed(location.getAccuracy(), location.getBearing(), location.getSpeed(),
location.getLatitude(), location.getLongitude(), location.getAltitude());
reportGPSQualityBearingAndSpeed(location.getAccuracy(), location.getBearing(), location.getSpeed(), location.getLatitude(), location.getLongitude(), location.getAltitude());
final String postUrlStr = event.server + prefs.getServerGpsFixesPostPath();
enqueueForSending(postUrlStr, location);
// clear message queue
locationWatchDog.removeMessages(NO_LOCATION);
if (locationWatchDog != null) {
// clear message queue
locationWatchDog.removeMessages(NO_LOCATION);
// add new message with last location
Message msg = locationWatchDog.obtainMessage(NO_LOCATION);
msg.obj = location;
locationWatchDog.sendMessageDelayed(msg, NO_LOCATION_CHECK);
// add new message with last location
Message msg = locationWatchDog.obtainMessage(NO_LOCATION);
msg.obj = location;
locationWatchDog.sendMessageDelayed(msg, NO_LOCATION_CHECK);
}
}
@Override
@@ -67,7 +67,9 @@
android:scheme="https" />
</intent-filter>
</activity>
<activity android:name=".ui.activities.RacingActivity" />
<activity
android:name=".ui.activities.RacingActivity"
android:windowSoftInputMode="adjustNothing" />
<activity android:name=".ui.activities.PasswordActivity" />
<activity
android:name=".ui.activities.PreferenceActivity"
@@ -80,7 +82,8 @@
</activity>
<activity android:name=".ui.activities.SystemInformationActivity" />
<service android:name=".services.polling.RaceLogPollingService"
<service
android:name=".services.polling.RaceLogPollingService"
android:exported="false">
<intent-filter>
<action android:name="com.sap.sailing.racecommittee.app.action.stopPoller" />
Binary file not shown.

After

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 B

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_dns_black_48dp"/>
android:src="@drawable/ic_list_single_black_48dp"/>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_dns_white_48dp">
android:src="@drawable/ic_list_single_white_48dp">
</bitmap>
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/constant_light_gray_ripple">
android:color="@color/popup_pressed">
<item android:drawable="@color/constant_light_gray"/>
<item android:drawable="@color/popup_background"/>
</ripple>
Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Loaded 100 of 204 files, more files were not shown because too many files have changed in this diff. Show more