From 84a4b7b8628504e20e3600c441381f7e5daf0460 Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Mon, 18 Feb 2019 10:08:01 +0100
Subject: [PATCH] OO-3855: Show error if rating ranges are invalid

Survey configurations are valid even if they are not visible in the GUI.
---
 .../forms/ui/RubricEditorController.java      | 144 +++++++++---------
 .../forms/ui/_i18n/LocalStrings_de.properties |   2 +-
 .../forms/ui/_i18n/LocalStrings_en.properties |   2 +-
 .../forms/ui/_i18n/LocalStrings_fr.properties |  30 ++--
 .../ui/_i18n/LocalStrings_pt_BR.properties    |  32 ++--
 5 files changed, 103 insertions(+), 107 deletions(-)

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 86a9bb58396..31833305b44 100644
--- a/src/main/java/org/olat/modules/forms/ui/RubricEditorController.java
+++ b/src/main/java/org/olat/modules/forms/ui/RubricEditorController.java
@@ -85,7 +85,7 @@ public class RubricEditorController extends FormBasicController implements PageE
 	private final String[] nameDisplayKeys = new String[] { NameDisplay.execution.name(), NameDisplay.report.name() };
 	private final String[] sliderTypeKeys = new String[] { SliderType.discrete.name(), SliderType.discrete_slider.name(), SliderType.continuous.name() };
 	private final String[] sliderStepKeys = new String[] { "2", "3", "4", "5", "6", "7", "8", "9", "10" };
-	private final String[] showResponseKey = new String[] { "show.no.response" };
+	private final String[] showSurveyConfigKey = new String[] { "rubric.survey.configuration.show" };
 	
 	private List<StepLabelColumn> stepLabels = new ArrayList<>();
 	private List<SliderRow> sliders = new ArrayList<>();
@@ -167,8 +167,8 @@ public class RubricEditorController extends FormBasicController implements PageE
 		
 		// survey configs
 		uifactory.addSpacerElement("rubric.survey.configuration.upper", settingsLayout, false);
-		surveyConfigEl = uifactory.addCheckboxesHorizontal("rubric.survey.configuration", settingsLayout, ENABLED_KEYS,
-				translateAll(getTranslator(), ENABLED_KEYS));
+		surveyConfigEl = uifactory.addCheckboxesHorizontal("rubric.survey.configuration", settingsLayout,
+				showSurveyConfigKey, translateAll(getTranslator(), showSurveyConfigKey));
 		surveyConfigEl.addActionListener(FormEvent.ONCHANGE);
 
 		// name
@@ -270,8 +270,8 @@ public class RubricEditorController extends FormBasicController implements PageE
 		
 		// no answer
 		noAnswerEl = uifactory.addCheckboxesVertical("no.response." + count.incrementAndGet(),
-				"rubric.no.response.enabled", settingsLayout, showResponseKey,
-				new String[] { translate("rubric.no.response.enabled.show") }, 1);
+				"rubric.no.response.enabled", settingsLayout, ENABLED_KEYS,
+				translateAll(getTranslator(), ENABLED_KEYS), 1);
 		noAnswerEl.setEnabled(!restrictedEdit);
 		
 		uifactory.addSpacerElement("rubric.survey.configuration.upper", settingsLayout, false);
@@ -305,6 +305,10 @@ public class RubricEditorController extends FormBasicController implements PageE
 	}
 	
 	private void updateUI() {
+		updateSurveyConfigUI();
+	}
+
+	private void updateSurveyConfigUI() {
 		boolean isSurveyConfig = surveyConfigEl.isAtLeastSelected(1);
 		nameEl.setVisible(isSurveyConfig);
 		nameDisplayEl.setVisible(isSurveyConfig);
@@ -314,7 +318,7 @@ public class RubricEditorController extends FormBasicController implements PageE
 		
 		scaleTypeEl.setVisible(isSurveyConfig);
 		noAnswerEl.setVisible(isSurveyConfig);
-		noAnswerEl.select(showResponseKey[0], rubric.isNoResponseEnabled());
+		noAnswerEl.select(noAnswerEl.getKey(0), rubric.isNoResponseEnabled());
 		insufficientCont.setVisible(isSurveyConfig);
 		lowerBoundInsufficientEl.setVisible(isSurveyConfig);
 		upperBoundInsufficientEl.setVisible(isSurveyConfig);
@@ -626,6 +630,7 @@ public class RubricEditorController extends FormBasicController implements PageE
 	@Override
 	protected boolean validateFormLogic(UserRequest ureq) {
 		boolean allOk = true;
+		boolean surveyConfigOk = true;
 		
 		sliderTypeEl.clearError();
 		if(!sliderTypeEl.isOneSelected()) {
@@ -633,55 +638,59 @@ public class RubricEditorController extends FormBasicController implements PageE
 			allOk &= false;
 		}
 		
-		if (surveyConfigEl.isAtLeastSelected(1)) {
-			double min = -101;
-			double max = 101;
-			int steps = 100;
-			String selectedSliderType = sliderTypeEl.getSelectedKey();
-			SliderType sliderType =  SliderType.valueOf(selectedSliderType);
-			String selectedScaleTypeKey = scaleTypeEl.getSelectedKey();
-			ScaleType scaleType = ScaleType.getEnum(selectedScaleTypeKey);
-			if (sliderType != SliderType.continuous) {
-				steps = Integer.parseInt(stepsEl.getSelectedKey());
-			}
-			min = scaleType.getStepValue(steps, 1);
-			max = scaleType.getStepValue(steps, steps);
-			if (min > max) {
-				double temp = min;
-				min = max;
-				max = temp;
-			}
-			lowerBoundInsufficientEl.clearError();
-			if (isInvalidDouble(lowerBoundInsufficientEl.getValue(), min, max)
-					|| isInvalidDouble(upperBoundInsufficientEl.getValue(), min, max)
-					|| isOnlyOnePresent(lowerBoundInsufficientEl, upperBoundInsufficientEl)) {
-				lowerBoundInsufficientEl.setErrorKey("error.outside.range",
-						new String[] { String.valueOf(min), String.valueOf(max) });
-				allOk = false;
-			}
-			lowerBoundNeutralEl.clearError();
-			if (isInvalidDouble(lowerBoundNeutralEl.getValue(), min, max)
-					|| isInvalidDouble(upperBoundNeutralEl.getValue(), min, max)
-					|| isOnlyOnePresent(lowerBoundNeutralEl, upperBoundNeutralEl)) {
-				lowerBoundNeutralEl.setErrorKey("error.outside.range",
-						new String[] { String.valueOf(min), String.valueOf(max) });
-				allOk = false;
-			} else if (isOverlapping(lowerBoundInsufficientEl, upperBoundInsufficientEl, lowerBoundNeutralEl, upperBoundNeutralEl)) {
-				lowerBoundNeutralEl.setErrorKey("error.range.overlapping", null);
-				allOk = false;
-			}
-			lowerBoundSufficientEl.clearError();
-			if (isInvalidDouble(lowerBoundSufficientEl.getValue(), min, max)
-					|| isInvalidDouble(upperBoundSufficientEl.getValue(), min, max)
-					|| isOnlyOnePresent(lowerBoundSufficientEl, upperBoundSufficientEl)) {
-				lowerBoundSufficientEl.setErrorKey("error.outside.range",
-						new String[] { String.valueOf(min), String.valueOf(max) });
-				allOk = false;
-			} else if (isOverlapping(lowerBoundInsufficientEl, upperBoundInsufficientEl, lowerBoundSufficientEl, upperBoundSufficientEl)
-					|| isOverlapping(lowerBoundNeutralEl, upperBoundNeutralEl, lowerBoundSufficientEl, upperBoundSufficientEl)) {
-				lowerBoundSufficientEl.setErrorKey("error.range.overlapping", null);
-				allOk = false;
-			}
+		double min = -101;
+		double max = 101;
+		int steps = 100;
+		String selectedSliderType = sliderTypeEl.getSelectedKey();
+		SliderType sliderType =  SliderType.valueOf(selectedSliderType);
+		String selectedScaleTypeKey = scaleTypeEl.getSelectedKey();
+		ScaleType scaleType = ScaleType.getEnum(selectedScaleTypeKey);
+		if (sliderType != SliderType.continuous) {
+			steps = Integer.parseInt(stepsEl.getSelectedKey());
+		}
+		min = scaleType.getStepValue(steps, 1);
+		max = scaleType.getStepValue(steps, steps);
+		if (min > max) {
+			double temp = min;
+			min = max;
+			max = temp;
+		}
+		lowerBoundInsufficientEl.clearError();
+		if (isInvalidDouble(lowerBoundInsufficientEl.getValue(), min, max)
+				|| isInvalidDouble(upperBoundInsufficientEl.getValue(), min, max)
+				|| isOnlyOnePresent(lowerBoundInsufficientEl, upperBoundInsufficientEl)) {
+			lowerBoundInsufficientEl.setErrorKey("error.outside.range",
+					new String[] { String.valueOf(min), String.valueOf(max) });
+			surveyConfigOk = false;
+		}
+		lowerBoundNeutralEl.clearError();
+		if (isInvalidDouble(lowerBoundNeutralEl.getValue(), min, max)
+				|| isInvalidDouble(upperBoundNeutralEl.getValue(), min, max)
+				|| isOnlyOnePresent(lowerBoundNeutralEl, upperBoundNeutralEl)) {
+			lowerBoundNeutralEl.setErrorKey("error.outside.range",
+					new String[] { String.valueOf(min), String.valueOf(max) });
+			surveyConfigOk = false;
+		} else if (isOverlapping(lowerBoundInsufficientEl, upperBoundInsufficientEl, lowerBoundNeutralEl, upperBoundNeutralEl)) {
+			lowerBoundNeutralEl.setErrorKey("error.range.overlapping", null);
+			surveyConfigOk = false;
+		}
+		lowerBoundSufficientEl.clearError();
+		if (isInvalidDouble(lowerBoundSufficientEl.getValue(), min, max)
+				|| isInvalidDouble(upperBoundSufficientEl.getValue(), min, max)
+				|| isOnlyOnePresent(lowerBoundSufficientEl, upperBoundSufficientEl)) {
+			lowerBoundSufficientEl.setErrorKey("error.outside.range",
+					new String[] { String.valueOf(min), String.valueOf(max) });
+			surveyConfigOk = false;
+		} else if (isOverlapping(lowerBoundInsufficientEl, upperBoundInsufficientEl, lowerBoundSufficientEl, upperBoundSufficientEl)
+				|| isOverlapping(lowerBoundNeutralEl, upperBoundNeutralEl, lowerBoundSufficientEl, upperBoundSufficientEl)) {
+			lowerBoundSufficientEl.setErrorKey("error.range.overlapping", null);
+			surveyConfigOk = false;
+		}
+		
+		if (!surveyConfigOk) {
+			surveyConfigEl.select(surveyConfigEl.getKey(0), true);
+			updateSurveyConfigUI();
+			allOk &= false;
 		}
 
 		return allOk & super.validateFormLogic(ureq);
@@ -784,60 +793,47 @@ public class RubricEditorController extends FormBasicController implements PageE
 		boolean noResonse = noAnswerEl.isAtLeastSelected(1);
 		rubric.setNoResponseEnabled(noResonse);
 		
-		boolean isSurveyConfig = surveyConfigEl.isAtLeastSelected(1);
 		String lowerBoundInsufficientValue = lowerBoundInsufficientEl.getValue();
-		if (isSurveyConfig && StringHelper.containsNonWhitespace(lowerBoundInsufficientValue)) {
+		if (StringHelper.containsNonWhitespace(lowerBoundInsufficientValue)) {
 			double lowerBoundInsufficient = Double.parseDouble(lowerBoundInsufficientValue);
 			rubric.setLowerBoundInsufficient(lowerBoundInsufficient);
 		} else {
 			rubric.setLowerBoundInsufficient(null);
-			lowerBoundInsufficientEl.setValue(null);
-			lowerBoundInsufficientEl.clearError();
 		}
 		String upperBoundInsufficientValue = upperBoundInsufficientEl.getValue();
-		if (isSurveyConfig && StringHelper.containsNonWhitespace(upperBoundInsufficientValue)) {
+		if (StringHelper.containsNonWhitespace(upperBoundInsufficientValue)) {
 			double upperBoundInsufficient = Double.parseDouble(upperBoundInsufficientValue);
 			rubric.setUpperBoundInsufficient(upperBoundInsufficient);
 		} else {
 			rubric.setUpperBoundInsufficient(null);
-			upperBoundInsufficientEl.setValue(null);
-			upperBoundInsufficientEl.clearError();
 		}
 		String lowerBoundNeutralValue = lowerBoundNeutralEl.getValue();
-		if (isSurveyConfig && StringHelper.containsNonWhitespace(lowerBoundNeutralValue)) {
+		if (StringHelper.containsNonWhitespace(lowerBoundNeutralValue)) {
 			double lowerBoundNeutral = Double.parseDouble(lowerBoundNeutralValue);
 			rubric.setLowerBoundNeutral(lowerBoundNeutral);
 		} else {
 			rubric.setLowerBoundNeutral(null);
-			lowerBoundNeutralEl.setValue(null);
-			lowerBoundNeutralEl.clearError();
 		}
 		String upperBoundNeutralValue = upperBoundNeutralEl.getValue();
-		if (isSurveyConfig && StringHelper.containsNonWhitespace(upperBoundNeutralValue)) {
+		if (StringHelper.containsNonWhitespace(upperBoundNeutralValue)) {
 			double upperBoundNeutral = Double.parseDouble(upperBoundNeutralValue);
 			rubric.setUpperBoundNeutral(upperBoundNeutral);
 		} else {
 			rubric.setUpperBoundNeutral(null);
-			upperBoundNeutralEl.setValue(null);
-			upperBoundNeutralEl.clearError();
 		}
 		String lowerBoundSufficientValue = lowerBoundSufficientEl.getValue();
-		if (isSurveyConfig && StringHelper.containsNonWhitespace(lowerBoundSufficientValue)) {
+		if (StringHelper.containsNonWhitespace(lowerBoundSufficientValue)) {
 			double lowerBoundSufficient = Double.parseDouble(lowerBoundSufficientValue);
 			rubric.setLowerBoundSufficient(lowerBoundSufficient);
 		} else {
 			rubric.setLowerBoundSufficient(null);
-			lowerBoundSufficientEl.setValue(null);
-			lowerBoundSufficientEl.clearError();
 		}
 		String upperBoundSufficientValue = upperBoundSufficientEl.getValue();
-		if (isSurveyConfig && StringHelper.containsNonWhitespace(upperBoundSufficientValue)) {
+		if (StringHelper.containsNonWhitespace(upperBoundSufficientValue)) {
 			double upperBoundSufficient = Double.parseDouble(upperBoundSufficientValue);
 			rubric.setUpperBoundSufficient(upperBoundSufficient);
 		} else {
 			rubric.setUpperBoundSufficient(null);
-			upperBoundSufficientEl.setValue(null);
-			upperBoundSufficientEl.clearError();
 		}
 		
 		boolean startGoodRating = goodRatingEl.isOneSelected() && GOOD_RATING_START_KEY.equals(goodRatingEl.getSelectedKey())
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 c88bd3d1cc7..bc71527963f 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
@@ -105,7 +105,6 @@ rubric.name.report=In Reports
 rubric.name=Name
 rubric.neutral.explanation=Neutrale Beurteilung (Wert zwischen {0} und {1})
 rubric.neutral=Neutral
-rubric.no.response.enabled.show=anzeigen
 rubric.no.response.enabled=Spalte "$\:no.response"
 rubric.report.avg.abrev=\u00F8
 rubric.report.avg.title=Durchschnitt
@@ -132,6 +131,7 @@ rubric.scale.type=Skalentyp
 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.upper.bound=bis
 save.as.done=Speichern und abschliessen
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 da6d82c0768..c54f2b11e63 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
@@ -105,7 +105,6 @@ rubric.name.report=In reports
 rubric.name=Name
 rubric.neutral.explanation=Neutral assessment (value between {0} and {1})
 rubric.neutral=Neutral
-rubric.no.response.enabled.show=show
 rubric.no.response.enabled=Column "$\:no.response"
 rubric.report.avg.abrev=\u00F8
 rubric.report.avg.title=Average
@@ -132,6 +131,7 @@ rubric.scale.type=Scale type
 rubric.scale.zeroBallanced=Ballanced Likert scale (-x to x)
 rubric.sufficient.explanation=Good rating (Value between {0} and {1})
 rubric.sufficient=Good
+rubric.survey.configuration.show=show
 rubric.survey.configuration=Survey configuration
 rubric.upper.bound=to
 save.as.done=Save and finish
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 e4dc735287b..7405fba2d23 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
@@ -52,8 +52,8 @@ h6=h6
 hr=S\u00E9parateur
 htitle=Titre
 multiple.choice.others=Autres
-multiple.choice.with.others=Autres
 multiple.choice.with.others.enabled=Le participant peut entrer d'autres valeurs
+multiple.choice.with.others=Autres
 no.response=Pas de r\u00E9ponse possible
 report.anonymous.user=Anonyme
 report.count.count.title=Nombre
@@ -62,25 +62,25 @@ report.excel.legend=L\u00E9gende
 report.excel.text=Texte
 report.export=Export
 report.max.session.exceeded=Le nombre maximum de questionnaires individuels ({0}) est d\u00E9pass\u00E9. Les questionnaires individuels ne seront pas imprim\u00E9s.
-report.overview.duration=Dur\u00E9e
 report.overview.duration.count=Nombre
 report.overview.duration.title=Dur\u00E9e
+report.overview.duration=Dur\u00E9e
 report.overview.figures.average.duration=Dur\u00E9e moyenne
-report.overview.figures.number.done.session=Nombre de participants
 report.overview.figures.number.done.session.of={0} sur {1}
+report.overview.figures.number.done.session=Nombre de participants
 report.overview.figures.submission.period=P\u00E9riode de soumission
 report.overview.figures.title=Indicateurs
 report.overview.total.title=Total rubriques
-report.print=Imprimer
-report.print.selection=S\u00E9lection du rapport
 report.print.selection.diagrams=$\:reports.diagram.report
 report.print.selection.overview=$\:reports.table.overview
 report.print.selection.sessions=$\:reports.session.selection
 report.print.selection.tables=$\:reports.table.report
+report.print.selection=S\u00E9lection du rapport
 report.print.title.diagrams=$\:reports.diagram.report
 report.print.title.overview=$\:reports.table.overview
 report.print.title.session=$\:reports.session.selection
 report.print.title.tables=$\:reports.table.report
+report.print=Imprimer
 report.session.dummy=
 report.session.participant=Participant
 report.session.quickview=<i class\='o_icon o_icon_quickview'> </i>
@@ -90,17 +90,16 @@ reports.session.selection=Questionnaires individuels
 reports.table.overview=Aper\u00E7u
 reports.table.report=Tableaux
 rubric.column.label=Etiquette de colonne
-rubric.good.rating=\u00C9valuation positive
 rubric.good.rating.end=Droite
 rubric.good.rating.start=Gauche
-rubric.insufficient=Insuffisant
+rubric.good.rating=\u00C9valuation positive
 rubric.insufficient.explanation=Evaluation insuffisante (valuer entre {0} et {1})
+rubric.insufficient=Insuffisant
 rubric.lower.bound=de
 rubric.name=Nom
-rubric.neutral=Neutre
 rubric.neutral.explanation=Evaluation neutre (valeur entre {0} et {1})
+rubric.neutral=Neutre
 rubric.no.response.enabled=Colonne "$\:no.response"
-rubric.no.response.enabled.show=afficher
 rubric.report.avg.abrev=\u00F8
 rubric.report.avg.title=Moyenne
 rubric.report.end.lable.title=
@@ -124,24 +123,25 @@ rubric.scale.maxToOne=Echelle de Likert descendante (x \u00E0 1)
 rubric.scale.oneToMax=Echelle de Likert ascendante (1 \u00E0 x)
 rubric.scale.type=Type d'\u00E9chelle
 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.sufficient=Suffisant
+rubric.survey.configuration.show=afficher
 rubric.upper.bound=\u00E0
 save.as.done=Sauver et terminer
 save.intermediate=Sauver temporairement
-session.informations.fill.in=Remplir automatiquement
 session.informations.fill.in.label=
+session.informations.fill.in=Remplir automatiquement
 session.informations.informations=Informations
 session.informations.label={0}
 session.informations.report.number.participants={0} utilisateurs ont particip\u00E9 au questionnaire dont {1} anonymement.
 session.informations.type.age=Age
-single.choice.presentation=Pr\u00E9sentation
 single.choice.presentation.dropdown=Liste \u00E0 choix
 single.choice.presentation.horizontal=Horizontal
 single.choice.presentation.vertical=Vertical
+single.choice.presentation=Pr\u00E9sentation
 slider.continuous=Continu
-slider.discrete=Discret avec bouton
 slider.discrete.slider=Curseur \u00E0 valeur discr\u00E8tes
+slider.discrete=Discret avec bouton
 slider.end=Fin
 slider.label.code=Q{0}
 slider.start=D\u00E9but
@@ -156,11 +156,11 @@ textinput.download.info={0} textes sur {1} sont affich\u00E9s.
 textinput.download.link=T\u00E9l\u00E9charger tous les textes.
 textinput.multiple.rows=Plusieurs lignes
 textinput.no.text=Aucun texte disponible.
-textinput.numeric=Valeurs autoris\u00E9es
 textinput.numeric.numeric=Num\u00E9rique
 textinput.numeric.text=Texte
-textinput.rows=Lignes
+textinput.numeric=Valeurs autoris\u00E9es
 textinput.rows.mode=Type de ligne
+textinput.rows=Lignes
 textinput.single.row=Une seule ligne
 title.example=<h1>Cliquer pour \u00E9diter le titre</h1>
 warning.form.not.completed=Attention\! Vous n'avez pas rempli tous les champs.
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 a91f9c51efb..6aeb05d03ea 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
@@ -10,8 +10,8 @@ add.formsessioninformations=Informa\u00E7\u00F5es
 add.formsinglechoice=Escolha \u00FAnica
 add.slider=Adicionar barra de rolagem
 bar.chart.legend=Legenda
-choice.add=Adicionar escolha
 chart.count=Contagem
+choice.add=Adicionar escolha
 choice.delete=Excluir
 choice.example=Exemplo de valor
 choice.value=Escolha
@@ -23,8 +23,8 @@ disclaimer.default.text=Todos os dados pessoais submetidos s\u00E3o processados
 disclaimer.not.accepted=Por favor aceite.
 disclaimer.text=Carta de acordo
 end.label=Fim
-error.cannot.save=Erro ao salvar.
 error.cannot.save.file=Erro ao carregar o arquivo\!
+error.cannot.save=Erro ao salvar.
 error.no.number=Formato de n\u00FAmero errado. Exemplo\: 1.0, 0.5, 0.2
 error.outside.range=O valor deve estar entre {0} e {1}.
 evaluation.anonymous=Esta \u00E9 uma pesquisa an\u00F4nima. Nenhuma informa\u00E7\u00E3o pessoal sobre voc\u00EA ser\u00E1 armazenada, a menos que explicitamente solicitado (por exemplo, idade e sexo). Al\u00E9m disso, o endere\u00E7o IP do seu PC n\u00E3o \u00E9 salvo. N\u00E3o h\u00E1 como mesclar os resultados da pesquisa com seus dados.
@@ -53,8 +53,8 @@ h6=h6
 hr=Separador
 htitle=T\u00EDtulo
 multiple.choice.others=Outros
-multiple.choice.with.others=Outros
 multiple.choice.with.others.enabled=O participante pode inserir outros valores
+multiple.choice.with.others=Outros
 no.response=Nenhuma resposta
 raw.example=Clique para editar o texto. O editor HTML ser\u00E1 aberto.
 report.anonymous.user=An\u00F4nimo
@@ -64,25 +64,25 @@ report.excel.legend=Legenda
 report.excel.text=Texto
 report.export=Exportar
 report.max.session.exceeded=O n\u00FAmero m\u00E1ximo de question\u00E1rios individuais ({0}) foi excedido. Os question\u00E1rios individuais n\u00E3o s\u00E3o impressos.
-report.overview.duration=Dura\u00E7\u00E3o
 report.overview.duration.count=Contagem
 report.overview.duration.title=Dura\u00E7\u00E3o
+report.overview.duration=Dura\u00E7\u00E3o
 report.overview.figures.average.duration=Dura\u00E7\u00E3o m\u00E9dia
-report.overview.figures.number.done.session=N\u00FAmero de participantes
 report.overview.figures.number.done.session.of={0} de {1}
+report.overview.figures.number.done.session=N\u00FAmero de participantes
 report.overview.figures.submission.period=Per\u00EDodo de Submiss\u00E3o
 report.overview.figures.title=N\u00FAmeros-chave
 report.overview.total.title=Rubricas totais
-report.print=Imprimir
-report.print.selection=Relatar sele\u00E7\u00E3o de partes
 report.print.selection.diagrams=$\:reports.diagram.report
 report.print.selection.overview=$\:reports.table.overview
 report.print.selection.sessions=$\:reports.session.selection
 report.print.selection.tables=$\:reports.table.report
+report.print.selection=Relatar sele\u00E7\u00E3o de partes
 report.print.title.diagrams=$\:reports.diagram.report
 report.print.title.overview=$\:reports.table.overview
 report.print.title.session=$\:reports.session.selection
 report.print.title.tables=$\:reports.table.report
+report.print=Imprimir
 report.session.participant=Participante
 report.session.quickview=<i class\='o_icon o_icon_quickview'> </i>
 reports.diagram.report=Diagramas
@@ -91,17 +91,16 @@ reports.session.selection=Question\u00E1rios individuais
 reports.table.overview=Vis\u00E3o global
 reports.table.report=Tabelas
 rubric.column.label=R\u00F3tulo da coluna
-rubric.good.rating=Avalia\u00E7\u00E3o positiva
 rubric.good.rating.end=Direita
 rubric.good.rating.start=Esquerda
-rubric.insufficient=Insuficiente
+rubric.good.rating=Avalia\u00E7\u00E3o positiva
 rubric.insufficient.explanation=Boa classifica\u00E7\u00E3o (valor entre {0} e {1})
+rubric.insufficient=Insuficiente
 rubric.lower.bound=de
 rubric.name=Nome
-rubric.neutral=Neutro
 rubric.neutral.explanation=Classifica\u00E7\u00E3o neutra (valor entre {0} e {1})
+rubric.neutral=Neutro
 rubric.no.response.enabled=Coluna "$\:no.response"
-rubric.no.response.enabled.show=mostrar
 rubric.report.avg.abrev=\u00F8
 rubric.report.avg.title=M\u00E9dia
 rubric.report.figure.title=N\u00FAmeros-chave
@@ -122,8 +121,9 @@ rubric.scale.maxToOne=Escala de Likert descendente (x a 1)
 rubric.scale.oneToMax=Escala de Likert Ascendente (1 para x)
 rubric.scale.type=Tipo de escala
 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.sufficient=Bom
+rubric.survey.configuration.show=mostrar
 rubric.upper.bound=para
 save.as.done=Enviar avalia\u00E7\u00E3o
 save.intermediate=Salvamento r\u00E1pido
@@ -132,13 +132,13 @@ session.informations.informations=Informa\u00E7\u00F5es
 session.informations.label={0}
 session.informations.report.number.participants={0} de usu\u00E1rios participaram da pesquisa, sendo {1} an\u00F4nimo.
 session.informations.type.age=Idade
-single.choice.presentation=Apresenta\u00E7\u00E3o
 single.choice.presentation.dropdown=Suspenso
 single.choice.presentation.horizontal=Horizontal
 single.choice.presentation.vertical=Vertical
+single.choice.presentation=Apresenta\u00E7\u00E3o
 slider.continuous=Cont\u00EDnuo
-slider.discrete=Discreto com r\u00E1dio
 slider.discrete.slider=Discreto com barra de rolagem
+slider.discrete=Discreto com r\u00E1dio
 slider.end=Fim
 slider.label.code=Q{0}
 slider.start=Iniciar
@@ -153,11 +153,11 @@ textinput.download.info={0} de {1} textos s\u00E3o mostrados.
 textinput.download.link=Baixe todos os textos.
 textinput.multiple.rows=V\u00E1rias linhas
 textinput.no.text=Nenhum texto est\u00E1 dispon\u00EDvel.
-textinput.numeric=Valores
 textinput.numeric.numeric=Num\u00E9rico
 textinput.numeric.text=Texto
-textinput.rows=Linhas
+textinput.numeric=Valores
 textinput.rows.mode=Tipo linha
+textinput.rows=Linhas
 textinput.single.row=Linha \u00FAnica
 title.example=<h1>Clique para editar t\u00EDtulo</h1>
 warning.form.not.completed=Cuidado\! Voc\u00EA n\u00E3o preencheu todos os campos.
-- 
GitLab