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 17e2534383ee8ca62d11c35aa2b1f965d7efe264..1a6ee393410694287752e7519bb224c19d2f7bed 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 5bd92485db5da824103509d3e3a88bd1ebd51010..50517aeaff38aabb511a348a1174306cef3d7213 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 aaacfdbf0390e820082aa42ce09f737c20da64de..2a01c6473aa63a92773395cbc47eb9ae03b5d9e0 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 67763433a2a47ce29ae00a7b91445caa6d608fa2..f794c48b7c7e33c83d1e6f0c9c9c0de240903599 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 0be0c0b04e1c387885f3b769f004472e4b50932e..26e3fd83b6de1c0855b55f9492c9e3184d599129 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 75197b3733b189b0ef0558c30f20a2ff8773209c..39f72288d1aefdbeaf5872236fa4c2fb75554d7f 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 f80adb5f3b6ca8a412fc8716281c72d96a55f5b2..974d67f0c1480f724691a4bb2dbbb2d22f2360a4 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 0c070ea9ca4cc8cd59d85cd0884701360f057749..714e37ce22285141377e5fe2886f89a7a1b12f4f 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 f6af4a910a2c152f516f69ee3ab0ec889cb0092a..78519ee7eec54661380be6843c5f6b4602fefb49 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 c416c5e68c5a536055fc566e4630256ca7a6a0d9..15f2c25be2fc6a0f14f9f5d9934c625d7a42f770 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 e99e270e69e447b037032fa4d8556cbe0526d5cb..9c599453caa7beeec9c6358ae61a96123de81711 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 8a93123794f950e891fe944866ecfb8b66e4b2b3..0fb5c581177044869022327283f6ac7a0c548065 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 7766ae5f00bec9446cc8fe471227261ddf127551..70607a2208470ff297c155fcfe131b93a18ad9f6 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 96f67bff8370817900386200b6d9e2dfee748a98..4f6bc1e2324bbcd224c5f668f43782a0fbdbd517 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