From ff0e1cecae97042082136628f319888f4e924b7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Hessenm=C3=BCller?= Date: Fri, 28 Feb 2020 16:44:10 +0100 Subject: [PATCH 1/3] bug2964: Added yardstick number field to CompetitorEditDialog --- .../ui/adminconsole/CompetitorEditDialog.java | 43 ++++++++++++++++--- .../sailing/gwt/ui/client/StringMessages.java | 1 + .../gwt/ui/client/StringMessages.properties | 1 + .../ui/client/StringMessages_de.properties | 1 + 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java index 49843a04b40..d43e61bd0fc 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java @@ -28,6 +28,8 @@ import com.sap.sse.gwt.client.dialog.DoubleBox; * */ public abstract class CompetitorEditDialog extends DataEntryDialog { + private static final double YARDSTICK_SCALE = 100; + private final CompetitorType competitorToEdit; private final TextBox name; private final TextBox shortName; @@ -39,7 +41,10 @@ public abstract class CompetitorEditDialog private final URLFieldWithFileUpload flagImageURL; private final URLFieldWithFileUpload imageUrlAndUploadComposite; + private final DoubleBox yardstickNumber; + private double previousYardstickNumber; private final DoubleBox timeOnTimeFactor; + private double previousTimeOnTimeFactor; private final DoubleBox timeOnDistanceAllowanceInSecondsPerNauticalMile; protected static class CompetitorWithoutBoatValidator implements Validator { @@ -106,7 +111,10 @@ public abstract class CompetitorEditDialog this.flagImageURL.setURL(competitorToEdit.getFlagImageURL()); this.imageUrlAndUploadComposite = new URLFieldWithFileUpload(stringMessages); this.imageUrlAndUploadComposite.setURL(competitorToEdit.getImageURL()); - this.timeOnTimeFactor = createDoubleBox(competitorToEdit.getTimeOnTimeFactor(), 10); + this.previousYardstickNumber = convertYardstickTimeOnTime(competitorToEdit.getTimeOnTimeFactor()); + this.yardstickNumber = createDoubleBox(previousYardstickNumber, 10); + this.previousTimeOnTimeFactor = competitorToEdit.getTimeOnTimeFactor(); + this.timeOnTimeFactor = createDoubleBox(previousTimeOnTimeFactor, 10); this.timeOnDistanceAllowanceInSecondsPerNauticalMile = createDoubleBox( competitorToEdit.getTimeOnDistanceAllowancePerNauticalMile() == null ? null : competitorToEdit .getTimeOnDistanceAllowancePerNauticalMile().asSeconds(), 10); @@ -157,7 +165,7 @@ public abstract class CompetitorEditDialog */ protected abstract CompetitorType getResult(); - protected CompetitorDTO getBaseResult() { + protected CompetitorDTO getBaseResult() { Color color; if (displayColorTextBox.getText() == null || displayColorTextBox.getText().isEmpty()) { color = null; @@ -168,6 +176,18 @@ public abstract class CompetitorEditDialog color = new InvalidColor(iae, stringMessages); } } + // Check if Yardstick or ToT fields have changed and convert accordingly + final Double currentYardstickNumber = yardstickNumber.getValue(); + final Double currentTimeOnTimeFactor = timeOnTimeFactor.getValue(); + if (currentYardstickNumber != null && previousYardstickNumber != currentYardstickNumber) { + previousYardstickNumber = currentYardstickNumber; + previousTimeOnTimeFactor = convertYardstickTimeOnTime(currentYardstickNumber); + timeOnTimeFactor.setValue(previousTimeOnTimeFactor); + } else if (currentTimeOnTimeFactor != null && previousTimeOnTimeFactor != currentTimeOnTimeFactor) { + previousTimeOnTimeFactor = currentTimeOnTimeFactor; + previousYardstickNumber = convertYardstickTimeOnTime(currentTimeOnTimeFactor); + yardstickNumber.setValue(previousYardstickNumber); + } CompetitorWithBoatDTO result = new CompetitorWithBoatDTOImpl(name.getText(), shortName.getText().trim().isEmpty() ? null : shortName.getText(), color, email.getText().trim().isEmpty() ? null : email.getText(), @@ -181,9 +201,16 @@ public abstract class CompetitorEditDialog return result; } + /** + * Converts between yardstick number and time-on-time factor and vice-versa. + */ + private static double convertYardstickTimeOnTime(double yardstickOrTimeOnTime) { + return YARDSTICK_SCALE / yardstickOrTimeOnTime; + } + @Override protected Widget getAdditionalWidget() { - Grid result = new Grid(10, 2); + Grid result = new Grid(11, 2); result.setWidget(0, 0, new Label(stringMessages.name())); result.setWidget(0, 1, name); result.setWidget(1, 0, new Label(stringMessages.shortName())); @@ -200,10 +227,12 @@ public abstract class CompetitorEditDialog result.setWidget(6, 1, flagImageURL); result.setWidget(7, 0, new Label(stringMessages.imageURL())); result.setWidget(7, 1, imageUrlAndUploadComposite); - result.setWidget(8, 0, new Label(stringMessages.timeOnTimeFactor())); - result.setWidget(8, 1, timeOnTimeFactor); - result.setWidget(9, 0, new Label(stringMessages.timeOnDistanceAllowanceInSecondsPerNauticalMile())); - result.setWidget(9, 1, timeOnDistanceAllowanceInSecondsPerNauticalMile); + result.setWidget(8, 0, new Label(stringMessages.yardstickNumber(YARDSTICK_SCALE))); + result.setWidget(8, 1, yardstickNumber); + result.setWidget(9, 0, new Label(stringMessages.timeOnTimeFactor())); + result.setWidget(9, 1, timeOnTimeFactor); + result.setWidget(10, 0, new Label(stringMessages.timeOnDistanceAllowanceInSecondsPerNauticalMile())); + result.setWidget(10, 1, timeOnDistanceAllowanceInSecondsPerNauticalMile); return result; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index 154539b3844..491f2c9398a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -1428,6 +1428,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, String orcPerformanceCurveByImpliedWindRankingMetricDescription(); String orcPerformanceCurveLeaderForBaselineRankingMetricDescription(); String timeOnTimeAndDistanceRankingMetricDescription(); + String yardstickNumber(double scale); String timeOnTimeFactor(); String timeOnDistanceAllowanceInSecondsPerNauticalMile(); String calculatedTimeTraveled(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 9c45ab16ccb..9073096ac74 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -1420,6 +1420,7 @@ orcPerformanceCurveRankingMetricDescription=ORC Performance Curve: Sophisticated orcPerformanceCurveByImpliedWindRankingMetricDescription=ORC Performance Curve: Sophisticated handicapping scheme that awards time allowances based on a VPP/polar assuming pre-defined legs'' angles to the wind;\nbased on these allowances, an "implied wind" is calculated which is the basis for ranking.\nImplied wind can be calculated at any time in the race and is therefore the basis for in-race ranking. orcPerformanceCurveLeaderForBaselineRankingMetricDescription=ORC Performance Curve: Sophisticated handicapping scheme that awards time allowances based on a VPP/polar assuming pre-defined legs'' angles to the wind;\nthe greatest implied wind value is determined; all boats are ranked by mapping this greatest implied wind to their performance curves, determining their allowance for that implied wind\nand then computing the delta to their elapsed time. The baseline for corrected times is the boat with the least relative corrected time. timeOnTimeAndDistanceRankingMetricDescription=Time-on-Time / Time-on-Distance: Final ranking by calculated time;\ntime is calculated by optionally applying a factor to the actual time (defaulting to 1.0)\nand subtracting an allowance in seconds per nautical mile,\napplied to the course length.\nIn-race ranks based on expected arrival at fastest boat''s current position\nassuming current leg''s average VMG/VMC. +yardstickNumber=Yardstick Number (Scale = {0}) timeOnTimeFactor=ToT Factor timeOnDistanceAllowanceInSecondsPerNauticalMile=ToD Allowance timeOnTimeFactorTooltip=Time-on-Time factor; actual time is multiplied with this factor in calculated time formula diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index c52e05556f1..3a8aee0c2d3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -1400,6 +1400,7 @@ orcPerformanceCurveRankingMetricDescription=ORC Performance Curve (seit 2015): A orcPerformanceCurveByImpliedWindRankingMetricDescription=ORC Performance Curve nach impliziertem Wind (vor 2015): Aufwendiges Handicap-System, das jedem Teilnehmer erwartete Geschwindigkeiten für bestimmte Winkel eines Bahnschenkels zum Wind zuteilt.\nAuf dieser Grundlage wird der sogenannte "implizierte Wind" bestimmt,\nalso der Wind, den der Teilnehmer gehabt haben müßte, um die Strecke in der vorliegenden Zeit zu segeln.\nDieser "implizierte Wind" ist die Grundlage für die Plazierungen\nund kann zu jeder Zeit während Wettfahrt bestimmt werden. orcPerformanceCurveLeaderForBaselineRankingMetricDescription=ORC Performance Curve (seit 2015): Aufwendiges Handicap-System, das jedem Teilnehmer erwartete Geschwindigkeiten für bestimmte Winkel eines Bahnschenkels zum Wind zuteilt.\nAuf dieser Grundlage wird der sogenannte "implizierte Wind" bestimmt,\nalso der Wind, den der Teilnehmer gehabt haben müßte, um die Strecke in der vorliegenden Zeit zu segeln.\nDer höchste implizierte Windwert wird ermittelt; für alle Teilnehmer wir dieser Wert auf ihre Performance Curve übertragen, ergibt eine erlaubte Zeit, die dann mit der tatsächlich gesegelten Zeit verglichen wird. Die Differenz wird zur gesegelten Zeit des führenden Bootes addiert und ergibt die korrigierte Zeit. timeOnTimeAndDistanceRankingMetricDescription=Time-on-Time / Time-on-Distance: Abschließende Rangreihenfolge nach korrigierter Zeit;\nDie Zeit wird korrigiert, indem ein optionaler Faktor an die tatsächlich gesegelte Zeit angebracht wird;\nZusätzlich kann eine optionale erwartete Zeit pro Seemeile, skaliert auf die Renndistanz, subtrahiert werden, angewandt auf die Kurslänge\nWährend der Wettfahrt wird die Rangreihenfolge anhand der korrigierten erwarteten Zeit bei Ankunft an der Position\ndes jetzt absolut in Führung liegenden Teilnehmers bestimmt,\nbasierend auf dem durchschnittlichen VMG/VMC des momentanen Bahnschenkels +yardstickNumber=Yardstickzahl (Maßstab = {0}) timeOnTimeFactor=ToT Faktor timeOnDistanceAllowanceInSecondsPerNauticalMile=ToD Zuteilung timeOnTimeFactorTooltip=Zeit-auf-Zeit Faktor; tatsächlich gesegelte Zeit wird für die berechnete Zeit mit diesem Faktor multipliziert From 43290f47b24eb9358926b85fd24f7ee391d4e61e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Hessenm=C3=BCller?= Date: Tue, 3 Mar 2020 17:09:01 +0100 Subject: [PATCH 2/3] bug2964: Added Change Scale button to CompetitorEditDialog --- .../ui/adminconsole/CompetitorEditDialog.java | 96 ++++++++++++++----- .../sailing/gwt/ui/client/StringMessages.java | 1 + .../gwt/ui/client/StringMessages.properties | 1 + .../ui/client/StringMessages_de.properties | 1 + 4 files changed, 75 insertions(+), 24 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java index d43e61bd0fc..68237f0346c 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java @@ -1,5 +1,9 @@ package com.sap.sailing.gwt.ui.adminconsole; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FocusWidget; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.Label; @@ -28,8 +32,6 @@ import com.sap.sse.gwt.client.dialog.DoubleBox; * */ public abstract class CompetitorEditDialog extends DataEntryDialog { - private static final double YARDSTICK_SCALE = 100; - private final CompetitorType competitorToEdit; private final TextBox name; private final TextBox shortName; @@ -41,10 +43,13 @@ public abstract class CompetitorEditDialog private final URLFieldWithFileUpload flagImageURL; private final URLFieldWithFileUpload imageUrlAndUploadComposite; + private final Label yardstickLabel; + private final FlowPanel yardstickPanel; private final DoubleBox yardstickNumber; - private double previousYardstickNumber; + private double yardstickScale = 100; + private boolean enableYardstickScaleDetection = true; + private boolean yardstickLastModified = true; private final DoubleBox timeOnTimeFactor; - private double previousTimeOnTimeFactor; private final DoubleBox timeOnDistanceAllowanceInSecondsPerNauticalMile; protected static class CompetitorWithoutBoatValidator implements Validator { @@ -111,10 +116,34 @@ public abstract class CompetitorEditDialog this.flagImageURL.setURL(competitorToEdit.getFlagImageURL()); this.imageUrlAndUploadComposite = new URLFieldWithFileUpload(stringMessages); this.imageUrlAndUploadComposite.setURL(competitorToEdit.getImageURL()); - this.previousYardstickNumber = convertYardstickTimeOnTime(competitorToEdit.getTimeOnTimeFactor()); - this.yardstickNumber = createDoubleBox(previousYardstickNumber, 10); - this.previousTimeOnTimeFactor = competitorToEdit.getTimeOnTimeFactor(); - this.timeOnTimeFactor = createDoubleBox(previousTimeOnTimeFactor, 10); + this.yardstickLabel = new Label(stringMessages.yardstickNumber(yardstickScale)); + this.yardstickNumber = createDoubleBox(convertYardstickTimeOnTime(competitorToEdit.getTimeOnTimeFactor(), yardstickScale), 10); + Button yardstickScaleButton = new Button(SafeHtmlUtils.fromSafeConstant(stringMessages.changeScale())); + yardstickScaleButton.getElement().getStyle().setMarginLeft(3, Unit.PX); + yardstickScaleButton.addClickHandler(event -> { + enableYardstickScaleDetection = false; + setYardstickScale(yardstickScale == 1000 ? 100 : 1000, /* convertYardstickNumber */ !yardstickLastModified); + }); + this.yardstickPanel = new FlowPanel(); + this.yardstickPanel.add(yardstickNumber); + this.yardstickPanel.add(yardstickScaleButton); + this.timeOnTimeFactor = createDoubleBox(competitorToEdit.getTimeOnTimeFactor(), 10); + this.yardstickNumber.addChangeHandler(event -> { + if (yardstickNumber.getValue() == null) { + enableYardstickScaleDetection = true; + } + detectAndSetYardstickScale(); + if (yardstickNumber.getValue() != null) { + timeOnTimeFactor.setValue(convertYardstickTimeOnTime(yardstickNumber.getValue(), yardstickScale), /* fireEvents */ false); + } + yardstickLastModified = true; + }); + this.timeOnTimeFactor.addChangeHandler(event -> { + if (timeOnTimeFactor.getValue() != null) { + yardstickNumber.setValue(convertYardstickTimeOnTime(timeOnTimeFactor.getValue(), yardstickScale), /* fireEvents */ false); + } + yardstickLastModified = false; + }); this.timeOnDistanceAllowanceInSecondsPerNauticalMile = createDoubleBox( competitorToEdit.getTimeOnDistanceAllowancePerNauticalMile() == null ? null : competitorToEdit .getTimeOnDistanceAllowancePerNauticalMile().asSeconds(), 10); @@ -176,18 +205,6 @@ public abstract class CompetitorEditDialog color = new InvalidColor(iae, stringMessages); } } - // Check if Yardstick or ToT fields have changed and convert accordingly - final Double currentYardstickNumber = yardstickNumber.getValue(); - final Double currentTimeOnTimeFactor = timeOnTimeFactor.getValue(); - if (currentYardstickNumber != null && previousYardstickNumber != currentYardstickNumber) { - previousYardstickNumber = currentYardstickNumber; - previousTimeOnTimeFactor = convertYardstickTimeOnTime(currentYardstickNumber); - timeOnTimeFactor.setValue(previousTimeOnTimeFactor); - } else if (currentTimeOnTimeFactor != null && previousTimeOnTimeFactor != currentTimeOnTimeFactor) { - previousTimeOnTimeFactor = currentTimeOnTimeFactor; - previousYardstickNumber = convertYardstickTimeOnTime(currentTimeOnTimeFactor); - yardstickNumber.setValue(previousYardstickNumber); - } CompetitorWithBoatDTO result = new CompetitorWithBoatDTOImpl(name.getText(), shortName.getText().trim().isEmpty() ? null : shortName.getText(), color, email.getText().trim().isEmpty() ? null : email.getText(), @@ -201,11 +218,42 @@ public abstract class CompetitorEditDialog return result; } + /** + * Sets the yardstick scale to the given value and updates {@link #yardstickLabel}. + * @param scale {@code double} value to set scale to. + * @param convertYardstickNumber if {@code true} the current yardstick number will be converted to the new scale. + */ + protected void setYardstickScale(double scale, boolean convertYardstickNumber) { + if (convertYardstickNumber && yardstickNumber.getValue() != null) { + final double norm = yardstickNumber.getValue() / yardstickScale; + yardstickNumber.setValue(norm * scale, /* fireEvents */ false); + } + yardstickScale = scale; + yardstickLabel.setText(stringMessages.yardstickNumber(yardstickScale)); + } + + /** + * If {@link #enableYardstickScaleDetection} is set {@link #yardstickScale} will be set to {@code 100} or + * {@code 1000} depending on which is closer to the current {@link #yardstickNumber}. + */ + private void detectAndSetYardstickScale() { + if (enableYardstickScaleDetection) { + Double number = yardstickNumber.getValue(); + if (number != null) { + if (number < 550) { + setYardstickScale(100, false); + } else { + setYardstickScale(1000, false); + } + } + } + } + /** * Converts between yardstick number and time-on-time factor and vice-versa. */ - private static double convertYardstickTimeOnTime(double yardstickOrTimeOnTime) { - return YARDSTICK_SCALE / yardstickOrTimeOnTime; + private static double convertYardstickTimeOnTime(double yardstickOrTimeOnTime, double scale) { + return scale / yardstickOrTimeOnTime; } @Override @@ -227,8 +275,8 @@ public abstract class CompetitorEditDialog result.setWidget(6, 1, flagImageURL); result.setWidget(7, 0, new Label(stringMessages.imageURL())); result.setWidget(7, 1, imageUrlAndUploadComposite); - result.setWidget(8, 0, new Label(stringMessages.yardstickNumber(YARDSTICK_SCALE))); - result.setWidget(8, 1, yardstickNumber); + result.setWidget(8, 0, yardstickLabel); + result.setWidget(8, 1, yardstickPanel); result.setWidget(9, 0, new Label(stringMessages.timeOnTimeFactor())); result.setWidget(9, 1, timeOnTimeFactor); result.setWidget(10, 0, new Label(stringMessages.timeOnDistanceAllowanceInSecondsPerNauticalMile())); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index 491f2c9398a..03a30e7c6f4 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -1429,6 +1429,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, String orcPerformanceCurveLeaderForBaselineRankingMetricDescription(); String timeOnTimeAndDistanceRankingMetricDescription(); String yardstickNumber(double scale); + String changeScale(); String timeOnTimeFactor(); String timeOnDistanceAllowanceInSecondsPerNauticalMile(); String calculatedTimeTraveled(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 9073096ac74..be249c91cfe 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -1421,6 +1421,7 @@ orcPerformanceCurveByImpliedWindRankingMetricDescription=ORC Performance Curve: orcPerformanceCurveLeaderForBaselineRankingMetricDescription=ORC Performance Curve: Sophisticated handicapping scheme that awards time allowances based on a VPP/polar assuming pre-defined legs'' angles to the wind;\nthe greatest implied wind value is determined; all boats are ranked by mapping this greatest implied wind to their performance curves, determining their allowance for that implied wind\nand then computing the delta to their elapsed time. The baseline for corrected times is the boat with the least relative corrected time. timeOnTimeAndDistanceRankingMetricDescription=Time-on-Time / Time-on-Distance: Final ranking by calculated time;\ntime is calculated by optionally applying a factor to the actual time (defaulting to 1.0)\nand subtracting an allowance in seconds per nautical mile,\napplied to the course length.\nIn-race ranks based on expected arrival at fastest boat''s current position\nassuming current leg''s average VMG/VMC. yardstickNumber=Yardstick Number (Scale = {0}) +changeScale=Change Scale timeOnTimeFactor=ToT Factor timeOnDistanceAllowanceInSecondsPerNauticalMile=ToD Allowance timeOnTimeFactorTooltip=Time-on-Time factor; actual time is multiplied with this factor in calculated time formula diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index 3a8aee0c2d3..3ef67563a5a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -1401,6 +1401,7 @@ orcPerformanceCurveByImpliedWindRankingMetricDescription=ORC Performance Curve n orcPerformanceCurveLeaderForBaselineRankingMetricDescription=ORC Performance Curve (seit 2015): Aufwendiges Handicap-System, das jedem Teilnehmer erwartete Geschwindigkeiten für bestimmte Winkel eines Bahnschenkels zum Wind zuteilt.\nAuf dieser Grundlage wird der sogenannte "implizierte Wind" bestimmt,\nalso der Wind, den der Teilnehmer gehabt haben müßte, um die Strecke in der vorliegenden Zeit zu segeln.\nDer höchste implizierte Windwert wird ermittelt; für alle Teilnehmer wir dieser Wert auf ihre Performance Curve übertragen, ergibt eine erlaubte Zeit, die dann mit der tatsächlich gesegelten Zeit verglichen wird. Die Differenz wird zur gesegelten Zeit des führenden Bootes addiert und ergibt die korrigierte Zeit. timeOnTimeAndDistanceRankingMetricDescription=Time-on-Time / Time-on-Distance: Abschließende Rangreihenfolge nach korrigierter Zeit;\nDie Zeit wird korrigiert, indem ein optionaler Faktor an die tatsächlich gesegelte Zeit angebracht wird;\nZusätzlich kann eine optionale erwartete Zeit pro Seemeile, skaliert auf die Renndistanz, subtrahiert werden, angewandt auf die Kurslänge\nWährend der Wettfahrt wird die Rangreihenfolge anhand der korrigierten erwarteten Zeit bei Ankunft an der Position\ndes jetzt absolut in Führung liegenden Teilnehmers bestimmt,\nbasierend auf dem durchschnittlichen VMG/VMC des momentanen Bahnschenkels yardstickNumber=Yardstickzahl (Maßstab = {0}) +changeScale=Maßstab ändern timeOnTimeFactor=ToT Faktor timeOnDistanceAllowanceInSecondsPerNauticalMile=ToD Zuteilung timeOnTimeFactorTooltip=Zeit-auf-Zeit Faktor; tatsächlich gesegelte Zeit wird für die berechnete Zeit mit diesem Faktor multipliziert From d2966967bbaa35226d9992dbbb751e217ba29c48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Hessenm=C3=BCller?= Date: Mon, 9 Mar 2020 16:12:18 +0100 Subject: [PATCH 3/3] bug2964: Fixed exception when creating CompetitorEditDialog with a null competitor --- .../sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java index 68237f0346c..bc6bae99dfb 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java @@ -117,7 +117,8 @@ public abstract class CompetitorEditDialog this.imageUrlAndUploadComposite = new URLFieldWithFileUpload(stringMessages); this.imageUrlAndUploadComposite.setURL(competitorToEdit.getImageURL()); this.yardstickLabel = new Label(stringMessages.yardstickNumber(yardstickScale)); - this.yardstickNumber = createDoubleBox(convertYardstickTimeOnTime(competitorToEdit.getTimeOnTimeFactor(), yardstickScale), 10); + this.yardstickNumber = createDoubleBox(competitorToEdit.getTimeOnTimeFactor() == null ? null + : convertYardstickTimeOnTime(competitorToEdit.getTimeOnTimeFactor(), yardstickScale), 10); Button yardstickScaleButton = new Button(SafeHtmlUtils.fromSafeConstant(stringMessages.changeScale())); yardstickScaleButton.getElement().getStyle().setMarginLeft(3, Unit.PX); yardstickScaleButton.addClickHandler(event -> {