From bf7749b360ac65ead04f570fa1e545fccda29658 Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Mon, 17 Jun 2019 15:24:10 +0200
Subject: [PATCH] OO-4080: Weighted step values in rubric

---
 .../nodes/ms/manager/MSServiceImpl.java       | 10 +--
 .../modules/forms/handler/RubricHandler.java  |  1 +
 .../forms/model/jpa/RubricStatisticImpl.java  |  6 +-
 .../olat/modules/forms/model/xml/Rubric.java  | 12 ++++
 .../modules/forms/model/xml/ScaleType.java    | 11 ++-
 .../forms/ui/EvaluationFormExcelExport.java   |  4 +-
 .../forms/ui/RubricBarChartsController.java   |  2 +-
 .../forms/ui/RubricEditorController.java      | 67 +++++++++++++++++--
 .../ui/RubricSliderAvgBarChartController.java |  4 +-
 .../forms/ui/RubricTableController.java       |  2 +-
 .../forms/ui/_i18n/LocalStrings_de.properties |  4 +-
 .../forms/ui/_i18n/LocalStrings_en.properties |  5 +-
 .../forms/ui/_i18n/LocalStrings_fr.properties |  1 -
 .../ui/_i18n/LocalStrings_pt_BR.properties    |  1 -
 14 files changed, 107 insertions(+), 23 deletions(-)

diff --git a/src/main/java/org/olat/course/nodes/ms/manager/MSServiceImpl.java b/src/main/java/org/olat/course/nodes/ms/manager/MSServiceImpl.java
index 17e2534383e..1a6ee393410 100644
--- a/src/main/java/org/olat/course/nodes/ms/manager/MSServiceImpl.java
+++ b/src/main/java/org/olat/course/nodes/ms/manager/MSServiceImpl.java
@@ -153,8 +153,9 @@ public class MSServiceImpl implements MSService {
 				Rubric rubric = (Rubric) element;
 				int numberOfSliders = rubric.getSliders().size();
 				int steps = rubric.getSteps();
-				double min = rubric.getScaleType().getStepValue(steps, 1);
-				double max = rubric.getScaleType().getStepValue(steps, steps);
+				Integer weight =  rubric.getWeight();
+				double min = rubric.getScaleType().getStepValue(steps, 1, weight);
+				double max = rubric.getScaleType().getStepValue(steps, steps, weight);
 				sumMin += numberOfSliders * min;
 				sumMax += numberOfSliders * max;
 			}
@@ -175,8 +176,9 @@ public class MSServiceImpl implements MSService {
 				Rubric rubric = (Rubric) element;
 				int numberOfSliders = rubric.getSliders().size();
 				int steps = rubric.getSteps();
-				double min = rubric.getScaleType().getStepValue(steps, 1);
-				double max = rubric.getScaleType().getStepValue(steps, steps);
+				Integer weight = rubric.getWeight();
+				double min = rubric.getScaleType().getStepValue(steps, 1, weight);
+				double max = rubric.getScaleType().getStepValue(steps, steps, weight);
 				sumMin += numberOfSliders * min;
 				sumMax += numberOfSliders * max;
 				numberAvgs += numberOfSliders;
diff --git a/src/main/java/org/olat/modules/forms/handler/RubricHandler.java b/src/main/java/org/olat/modules/forms/handler/RubricHandler.java
index 5bd92485db5..50517aeaff3 100644
--- a/src/main/java/org/olat/modules/forms/handler/RubricHandler.java
+++ b/src/main/java/org/olat/modules/forms/handler/RubricHandler.java
@@ -98,6 +98,7 @@ public class RubricHandler implements EvaluationFormElementHandler, SimpleAddPag
 		rubric.setSteps(5);
 		rubric.setSliderType(SliderType.discrete);
 		rubric.setScaleType(ScaleType.oneToMax);
+		rubric.setWeight(1);
 		
 		Slider slider = new Slider();
 		slider.setId(UUID.randomUUID().toString());
diff --git a/src/main/java/org/olat/modules/forms/model/jpa/RubricStatisticImpl.java b/src/main/java/org/olat/modules/forms/model/jpa/RubricStatisticImpl.java
index aaacfdbf039..2a01c6473aa 100644
--- a/src/main/java/org/olat/modules/forms/model/jpa/RubricStatisticImpl.java
+++ b/src/main/java/org/olat/modules/forms/model/jpa/RubricStatisticImpl.java
@@ -146,7 +146,7 @@ public class RubricStatisticImpl implements RubricStatistic {
 		for (int step = 1; step <= rubric.getSteps(); step++) {
 			Long count = stepCounts.get(step - 1);
 			if (count != null) {
-				double stepValue = rubric.getScaleType().getStepValue(rubric.getSteps(), step);
+				double stepValue = rubric.getScaleType().getStepValue(rubric.getSteps(), step, rubric.getWeight());
 				for (int i = 0; i < count; i++) {
 					values[counter++] = stepValue;
 				}
@@ -166,7 +166,7 @@ public class RubricStatisticImpl implements RubricStatistic {
 		for (int step = 1; step <= rubric.getSteps(); step++) {
 			Long count = stepCounts.get(step - 1);
 			if (count != null) {
-				double stepValue = rubric.getScaleType().getStepValue(rubric.getSteps(), step);
+				double stepValue = rubric.getScaleType().getStepValue(rubric.getSteps(), step, rubric.getWeight());
 				sumValues += count * stepValue;
 				sumResponses += count;
 			}
@@ -202,7 +202,7 @@ public class RubricStatisticImpl implements RubricStatistic {
 		for (int step = 1; step <= rubric.getSteps(); step++) {
 			Long count = stepCounts.get(step - 1);
 			if (count != null) {
-				double stepValue = rubric.getScaleType().getStepValue(rubric.getSteps(), step);
+				double stepValue = rubric.getScaleType().getStepValue(rubric.getSteps(), step, rubric.getWeight());
 				for (int i = 0; i < count; i++) {
 					double scaledValue = stepValue * step;
 					scaledValues.add(Double.valueOf(scaledValue));
diff --git a/src/main/java/org/olat/modules/forms/model/xml/Rubric.java b/src/main/java/org/olat/modules/forms/model/xml/Rubric.java
index 67763433a2a..f794c48b7c7 100644
--- a/src/main/java/org/olat/modules/forms/model/xml/Rubric.java
+++ b/src/main/java/org/olat/modules/forms/model/xml/Rubric.java
@@ -37,6 +37,7 @@ public class Rubric extends AbstractElement {
 
 	private SliderType sliderType;
 	private ScaleType scaleType;
+	private Integer weight;
 	private List<Slider> sliders = new ArrayList<>();
 	private List<StepLabel> stepLabels = new ArrayList<>();
 	
@@ -78,6 +79,17 @@ public class Rubric extends AbstractElement {
 		this.scaleType = scaleType;
 	}
 
+	public Integer getWeight() {
+		if (weight == null) {
+			weight = 1;
+		}
+		return weight;
+	}
+
+	public void setWeight(Integer scaleWeight) {
+		this.weight = scaleWeight;
+	}
+
 	public String getName() {
 		return name;
 	}
diff --git a/src/main/java/org/olat/modules/forms/model/xml/ScaleType.java b/src/main/java/org/olat/modules/forms/model/xml/ScaleType.java
index 0be0c0b04e1..26e3fd83b6d 100644
--- a/src/main/java/org/olat/modules/forms/model/xml/ScaleType.java
+++ b/src/main/java/org/olat/modules/forms/model/xml/ScaleType.java
@@ -67,9 +67,18 @@ public enum ScaleType {
 	 *
 	 * @param numberOfSteps the total number of steps
 	 * @param step the index of the step (index starts with 1)
+	 * @param weight (optionl)
 	 * @return 
 	 */
-	public abstract double getStepValue(int numberOfSteps, int step);
+	public double getStepValue(int numberOfSteps, int step, Integer weight) {
+		double stepValue = getStepValue(numberOfSteps, step);
+		return weight != null
+				? stepValue * weight.intValue()
+				: stepValue;
+		
+	};
+	
+	abstract double getStepValue(int numberOfSteps, int step);
 
 	public String getKey() {
 		return name();
diff --git a/src/main/java/org/olat/modules/forms/ui/EvaluationFormExcelExport.java b/src/main/java/org/olat/modules/forms/ui/EvaluationFormExcelExport.java
index 75197b3733b..39f72288d1a 100644
--- a/src/main/java/org/olat/modules/forms/ui/EvaluationFormExcelExport.java
+++ b/src/main/java/org/olat/modules/forms/ui/EvaluationFormExcelExport.java
@@ -30,8 +30,8 @@ import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
-import org.olat.core.CoreSpringFactory;
 import org.apache.logging.log4j.Logger;
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
@@ -326,7 +326,7 @@ public class EvaluationFormExcelExport {
 			if (response != null) {
 				BigDecimal value = response.getNumericalResponse();
 				if (value != null) {
-					double scaledValue = rubric.getScaleType().getStepValue(rubric.getSteps(), value.intValue());
+					double scaledValue = rubric.getScaleType().getStepValue(rubric.getSteps(), value.intValue(), rubric.getWeight());
 					row.addCell(col, scaledValue, null);
 				}
 			}
diff --git a/src/main/java/org/olat/modules/forms/ui/RubricBarChartsController.java b/src/main/java/org/olat/modules/forms/ui/RubricBarChartsController.java
index f80adb5f3b6..974d67f0c14 100644
--- a/src/main/java/org/olat/modules/forms/ui/RubricBarChartsController.java
+++ b/src/main/java/org/olat/modules/forms/ui/RubricBarChartsController.java
@@ -102,7 +102,7 @@ public abstract class RubricBarChartsController extends FormBasicController {
 		List<Long> stepCounts = sliderStatistic.getStepCounts();
 		for (int step = 1; step <= rubric.getSteps(); step++) {
 			Long count = stepCounts.get(step -1);
-			double stepValue = rubric.getScaleType().getStepValue(rubric.getSteps(), step);
+			double stepValue = rubric.getScaleType().getStepValue(rubric.getSteps(), step, rubric.getWeight());
 			String stepName = EvaluationFormFormatter.formatZeroOrOneDecimals(stepValue);
 			series.add(count, stepName);
 		}
diff --git a/src/main/java/org/olat/modules/forms/ui/RubricEditorController.java b/src/main/java/org/olat/modules/forms/ui/RubricEditorController.java
index 0c070ea9ca4..714e37ce222 100644
--- a/src/main/java/org/olat/modules/forms/ui/RubricEditorController.java
+++ b/src/main/java/org/olat/modules/forms/ui/RubricEditorController.java
@@ -94,6 +94,7 @@ public class RubricEditorController extends FormBasicController implements PageE
 	private MultipleSelectionElement surveyConfigEl;
 	private SingleSelection sliderTypeEl;
 	private SingleSelection scaleTypeEl;
+	private TextElement scaleWeightEl;
 	private TextElement nameEl;
 	private MultipleSelectionElement nameDisplayEl;
 	private SingleSelection stepsEl;
@@ -212,6 +213,11 @@ public class RubricEditorController extends FormBasicController implements PageE
 			scaleTypeEl.select(ScaleType.getKeys()[0], true);
 		}
 		
+		// scale weight
+		String scaleWeight = rubric.getWeight() != null? rubric.getWeight().toString(): "";
+		scaleWeightEl = uifactory.addTextElement("rubric.weight", 10, scaleWeight, settingsLayout);
+		scaleWeightEl.addActionListener(FormEvent.ONCHANGE);
+		
 		// good rating side
 		goodRatingEl = uifactory.addDropdownSingleselect("rubric.good.rating" + count.incrementAndGet(), "rubric.good.rating",
 				settingsLayout, GOOD_RATING_KEYS, translateAll(getTranslator(), GOOD_RATING_KEYS), null);
@@ -345,6 +351,7 @@ public class RubricEditorController extends FormBasicController implements PageE
 		}
 		
 		scaleTypeEl.setVisible(isSurveyConfig);
+		scaleWeightEl.setVisible(isSurveyConfig);
 		noAnswerEl.setVisible(isSurveyConfig);
 		noAnswerEl.select(noAnswerEl.getKey(0), rubric.isNoResponseEnabled());
 		insufficientCont.setVisible(isSurveyConfig);
@@ -378,6 +385,7 @@ public class RubricEditorController extends FormBasicController implements PageE
 		List<StepLabelColumn> stepLabelColumns = new ArrayList<>();
 		if (stepsEl.isVisible() && stepsEl.isOneSelected()
 				&& (sliderTypeEl.isSelected(0) || sliderTypeEl.isSelected(1))) {
+			Integer weight = getWeightOrNull();
 			int steps = Integer.parseInt(stepsEl.getSelectedKey());
 			for(int i=0; i<steps; i++) {
 				Integer step = new Integer(i);
@@ -396,7 +404,7 @@ public class RubricEditorController extends FormBasicController implements PageE
 				if (scaleTypeEl.isOneSelected()) {
 					String selectedScaleTypeKey = scaleTypeEl.getSelectedKey();
 					ScaleType scaleType = ScaleType.getEnum(selectedScaleTypeKey);
-					double stepValue = scaleType.getStepValue(steps, i + 1);
+					double stepValue = scaleType.getStepValue(steps, i + 1, weight);
 					col.setExampleText(String.valueOf(stepValue));
 				} else {
 					col.removeExampleText();
@@ -410,6 +418,13 @@ public class RubricEditorController extends FormBasicController implements PageE
 		stepLabels = stepLabelColumns;
 		flc.contextPut("stepLabels", stepLabelColumns);
 	}
+
+	private Integer getWeightOrNull() {
+		return StringHelper.containsNonWhitespace(scaleWeightEl.getValue())
+				&& isValidInteger(scaleWeightEl.getValue(), 1, 10000000)
+				? Integer.parseInt(scaleWeightEl.getValue())
+				: null;
+	}
 	
 	private void updateTypeSettings() {
 		if(!sliderTypeEl.isOneSelected()) return;
@@ -438,8 +453,9 @@ public class RubricEditorController extends FormBasicController implements PageE
 		ScaleType scaleType = ScaleType.getEnum(selectedScaleTypeKey);
 		
 		int steps = sliderType == SliderType.continuous? 100: Integer.parseInt(stepsEl.getSelectedKey());
-		double leftValue = scaleType.getStepValue(steps, 1);
-		double rightValue = scaleType.getStepValue(steps, steps);
+		Integer weight = getWeightOrNull();
+		double leftValue = scaleType.getStepValue(steps, 1, weight);
+		double rightValue = scaleType.getStepValue(steps, steps, weight);
 		double highValue = rightValue > leftValue? rightValue: leftValue;
 		double lowValue = rightValue < leftValue? rightValue: leftValue;
 		int diff = sliderType == SliderType.continuous? 10: 1;
@@ -592,6 +608,10 @@ public class RubricEditorController extends FormBasicController implements PageE
 			updateSteps();
 			updateSliders();
 			updatePlaceholders();
+		} else if (scaleWeightEl == source) {
+			updateSteps();
+			updateSliders();
+			updatePlaceholders();
 		} else if (goodRatingEl == source) {
 			updatePlaceholders();
 		} else if(saveButton == source) {
@@ -679,12 +699,22 @@ public class RubricEditorController extends FormBasicController implements PageE
 		boolean allOk = true;
 		boolean surveyConfigOk = true;
 		
+		// slider type
 		sliderTypeEl.clearError();
 		if(!sliderTypeEl.isOneSelected()) {
 			sliderTypeEl.setErrorKey("form.legende.mandatory", null);
 			allOk &= false;
 		}
 		
+		// scale weight
+		scaleWeightEl.clearError();
+		if (StringHelper.containsNonWhitespace(scaleWeightEl.getValue())
+				&& isInvalidInteger(scaleWeightEl.getValue(), 1, 10000000)) {
+			scaleWeightEl.setErrorKey("error.wrong.int", null);
+			surveyConfigOk &= false;
+		}
+		
+		// bounds
 		double min = -101;
 		double max = 101;
 		int steps = 100;
@@ -695,8 +725,9 @@ public class RubricEditorController extends FormBasicController implements PageE
 		if (sliderType != SliderType.continuous) {
 			steps = Integer.parseInt(stepsEl.getSelectedKey());
 		}
-		min = scaleType.getStepValue(steps, 1);
-		max = scaleType.getStepValue(steps, steps);
+		Integer weight = getWeightOrNull();
+		min = scaleType.getStepValue(steps, 1, weight);
+		max = scaleType.getStepValue(steps, steps, weight);
 		if (min > max) {
 			double temp = min;
 			min = max;
@@ -768,6 +799,27 @@ public class RubricEditorController extends FormBasicController implements PageE
 		return !inside;
 	}
 	
+	private boolean isValidInteger(String val, int min, int max) {
+		return !isInvalidDouble(val, min, max);
+	}
+	
+	private boolean isInvalidInteger(String val, int min, int max) {
+		boolean inside = true;
+		if (StringHelper.containsNonWhitespace(val)) {
+			try {
+				double value = Integer.parseInt(val);
+				if(min > value) {
+					inside =  false;
+				} else if(max < value) {
+					inside =  false;
+				}
+			} catch (NumberFormatException e) {
+				inside =  false;
+			}
+		}
+		return !inside;
+	}
+	
 	private boolean isOverlapping(TextElement range1Lower, TextElement range1Upper, TextElement range2Lower, TextElement range2Upper) {
 		if (!StringHelper.containsNonWhitespace(range1Lower.getValue())
 				|| !StringHelper.containsNonWhitespace(range1Upper.getValue())
@@ -828,6 +880,11 @@ public class RubricEditorController extends FormBasicController implements PageE
 		ScaleType scaleType = ScaleType.getEnum(selectedScaleTypeKey);
 		rubric.setScaleType(scaleType);
 		
+		Integer scaleWeight = StringHelper.containsNonWhitespace(scaleWeightEl.getValue())
+				? Integer.parseInt(scaleWeightEl.getValue())
+				: null;
+		rubric.setWeight(scaleWeight);
+		
 		for(Iterator<Slider> sliderIt=rubric.getSliders().iterator(); sliderIt.hasNext(); ) {
 			Slider slider = sliderIt.next();
 			if(!StringHelper.containsNonWhitespace(slider.getStartLabel()) && !StringHelper.containsNonWhitespace(slider.getEndLabel())) {
diff --git a/src/main/java/org/olat/modules/forms/ui/RubricSliderAvgBarChartController.java b/src/main/java/org/olat/modules/forms/ui/RubricSliderAvgBarChartController.java
index f6af4a910a2..78519ee7eec 100644
--- a/src/main/java/org/olat/modules/forms/ui/RubricSliderAvgBarChartController.java
+++ b/src/main/java/org/olat/modules/forms/ui/RubricSliderAvgBarChartController.java
@@ -69,8 +69,8 @@ public class RubricSliderAvgBarChartController extends BasicController {
 				: translate("report.overview.total.title");
 		mainVC.contextPut("title", title);
 		ResponsiveBarChartComponent chart = new ResponsiveBarChartComponent("o_eve_bc_" + CodeHelper.getRAMUniqueID());
-		double yMin = rubric.getScaleType().getStepValue(rubric.getSteps(), 1);
-		double yMax = rubric.getScaleType().getStepValue(rubric.getSteps(), rubric.getSteps());
+		double yMin = rubric.getScaleType().getStepValue(rubric.getSteps(), 1, rubric.getWeight());
+		double yMax = rubric.getScaleType().getStepValue(rubric.getSteps(), rubric.getSteps(), rubric.getWeight());
 		double yMinTemp = yMin;
 		if (yMax < yMin) {
 			yMin = yMax;
diff --git a/src/main/java/org/olat/modules/forms/ui/RubricTableController.java b/src/main/java/org/olat/modules/forms/ui/RubricTableController.java
index c416c5e68c5..15f2c25be2f 100644
--- a/src/main/java/org/olat/modules/forms/ui/RubricTableController.java
+++ b/src/main/java/org/olat/modules/forms/ui/RubricTableController.java
@@ -83,7 +83,7 @@ public class RubricTableController extends FormBasicController {
 		if (!rubric.getSliderType().equals(SliderType.continuous)) {
 			ScaleType scaleType = rubric.getScaleType();
 			for (int step = 1; step <= rubric.getSteps(); step++) {
-				double stepValue = scaleType.getStepValue(rubric.getSteps(), step);
+				double stepValue = scaleType.getStepValue(rubric.getSteps(), step, rubric.getWeight());
 				String header = EvaluationFormFormatter.formatZeroOrOneDecimals(stepValue);
 				String label = rubric.getStepLabels() != null && ! rubric.getStepLabels().isEmpty()
 						? rubric.getStepLabels().get(step -1).getLabel()
diff --git a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties
index e99e270e69e..9c599453caa 100644
--- a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties
@@ -32,6 +32,7 @@ error.cannot.save=Speichern fehlgeschlagen
 error.no.number=Falsches Zahlenformat. Beispiele\: 1.0, 0.5, 0.2
 error.outside.range=Der Wert muss zwischen {0} und {1} liegen.
 error.range.overlapping=Zwei Wertebereiche \u00FCberlappen sich.
+error.wrong.int=Falsches Zahlenformat. Beispiele\: 1, 5, 10
 evaluation.anonymous= Dies ist eine anonyme Umfrage, die Umfrageantworten sind anonymisiert. Es werden keine pers\u00F6nlichen Daten \u00FCber Sie gespeichert, es sei denn, es wird ausdr\u00FCcklich danach gefragt (z. B. Alter, Geschlecht). Auch die IP-Adresse des von Ihnen verwendeten PC wird nicht gespeichert. Es gibt somit keinen Weg, die Umfrageergebnisse mit Ihren Daten zusammenzuf\u00FChren.
 evaluation.form.in.use=Die Ressource wird bereits verwendet. Die Bearbeitung ist beschr\u00E4nkt.
 evaluation.form.without.elements=F\u00FCr diesen Fragebogen sind noch keine Fragen vorhanden.
@@ -144,8 +145,9 @@ rubric.scale.zeroBallanced=Symmetrische Likert-Skala (-x bis x)
 rubric.sufficient.explanation=Gute Beurteilung (Wert zwischen {0} und {1})
 rubric.sufficient=Gut
 rubric.survey.configuration.show=anzeigen
-rubric.survey.configuration=Konfiguration Umfrage
+rubric.survey.configuration=Erweiterte Konfiguration
 rubric.upper.bound=bis
+rubric.weight=Gewichtung
 save.as.done=Speichern und abschliessen
 save.intermediate=Zwischenspeichern
 session.informations.fill.in.label=
diff --git a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties
index 8a93123794f..0fb5c581177 100644
--- a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties
@@ -31,6 +31,7 @@ error.cannot.save=Error while saving.
 error.no.number=Wrong number format. Example\: 1.0, 0.5, 0.2
 error.outside.range=The value has to be between {0} and {1}.
 error.range.overlapping=Two ranges are overlapping.
+error.wrong.int=Wrong numerical format. Examples\: 1, 5, 10
 evaluation.anonymous=This is an anonymous survey. No personal information about you will be stored unless explicitly requested (e.g. age, gender). Also, the IP address of your PC is not saved. There is no way to merge the survey results with your data.
 evaluation.form.in.use=The resource is already used. Editing is limited.
 evaluation.form.without.elements=This questionnaire has no questions yet.
@@ -140,11 +141,13 @@ rubric.scale.zeroToMax=Ascending Likert scale (0 to x)
 rubric.scale.type.help=Specify the values of the selected scale. The values are used in reports and the survey analysis.
 rubric.scale.type=Scale type
 rubric.scale.zeroBallanced=Ballanced Likert scale (-x to x)
+rubric.scale.weight=Weight
 rubric.sufficient.explanation=Good rating (Value between {0} and {1})
 rubric.sufficient=Good
 rubric.survey.configuration.show=show
-rubric.survey.configuration=Survey configuration
+rubric.survey.configuration=Extended configuration
 rubric.upper.bound=to
+rubric.weight=Weight
 save.as.done=Save and finish
 save.intermediate=Quick save
 session.informations.fill.in.label=
diff --git a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_fr.properties
index 7766ae5f00b..70607a22084 100644
--- a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_fr.properties
@@ -140,7 +140,6 @@ rubric.scale.type.help=Sp\u00E9cifiez les valeurs de l'\u00E9chelle s\u00E9lecti
 rubric.scale.zeroBallanced=Echelle de Likert \u00E9quilibr\u00E9e (-x \u00E0 x)
 rubric.sufficient=Suffisant
 rubric.sufficient.explanation=Evaluation suffisante (valeur entre {0} et {1})
-rubric.survey.configuration=Configuration du sondage
 rubric.survey.configuration.show=afficher
 rubric.upper.bound=\u00E0
 save.as.done=Sauver et terminer
diff --git a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_pt_BR.properties
index 96f67bff837..4f6bc1e2324 100644
--- a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_pt_BR.properties
@@ -138,7 +138,6 @@ rubric.scale.type.help=Especifique os valores da escala selecionada. Os valores
 rubric.scale.zeroBallanced=Escala de Likert balanceada (-x para x)
 rubric.sufficient=Bom
 rubric.sufficient.explanation=Boa classifica\u00E7\u00E3o (valor entre {0} e {1})
-rubric.survey.configuration=Configura\u00E7\u00E3o de pesquisa
 rubric.survey.configuration.show=mostrar
 rubric.upper.bound=para
 save.as.done=Enviar avalia\u00E7\u00E3o
-- 
GitLab