From 70acd80a7abe6fb5ca4ff7ffe3fa49aff52295e6 Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Fri, 29 Nov 2019 14:39:02 +0100
Subject: [PATCH] OO-4382: Show error if file type does not match allowed type

---
 .../forms/ui/FileUploadController.java        |  2 +-
 .../forms/ui/_content/file_upload.html        | 18 ++++-
 .../forms/ui/_i18n/LocalStrings_de.properties | 74 +++++++++----------
 .../forms/ui/_i18n/LocalStrings_en.properties |  8 +-
 4 files changed, 59 insertions(+), 43 deletions(-)

diff --git a/src/main/java/org/olat/modules/forms/ui/FileUploadController.java b/src/main/java/org/olat/modules/forms/ui/FileUploadController.java
index 65d2159cbdf..b00c3dec8d7 100644
--- a/src/main/java/org/olat/modules/forms/ui/FileUploadController.java
+++ b/src/main/java/org/olat/modules/forms/ui/FileUploadController.java
@@ -86,7 +86,7 @@ public class FileUploadController extends FormBasicController implements Evaluat
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		String fileElId = "file_upload_" + CodeHelper.getRAMUniqueID();
-		flc.contextPut("fileUpload", fileElId);
+		flc.contextPut("item", fileElId);
 		fileEl = uifactory.addFileElement(getWindowControl(), fileElId, "", formLayout);
 		fileEl.setPreview(ureq.getUserSession(), true);
 		fileEl.setButtonsEnabled(false);
diff --git a/src/main/java/org/olat/modules/forms/ui/_content/file_upload.html b/src/main/java/org/olat/modules/forms/ui/_content/file_upload.html
index f002ed23e0a..de6cf34c6fc 100644
--- a/src/main/java/org/olat/modules/forms/ui/_content/file_upload.html
+++ b/src/main/java/org/olat/modules/forms/ui/_content/file_upload.html
@@ -15,5 +15,21 @@
 		</div>
 	#end
 #else
-	$r.render("$fileUpload")
+	<div class="form-group $f.getElementCssClass($item) #if($f.hasError($item)) has-feedback has-error #end">
+		#if ($f.hasLabel($item))
+			$r.render("${item}_LABEL", "$f.getItemId($item)")
+		#end
+			$r.render(${item}, "form")
+			#if($f.hasError($item))
+				<span class="o_icon o_icon_error form-control-feedback"></span>
+			#end
+		#if($f.hasExample($item))
+			<div class="o_form_example help-block">
+				$r.render("${item}_EXAMPLE")
+			</div>
+		#end
+		#if($f.hasError($item))
+			$r.render("${item}_ERROR")
+		#end
+	</div>
 #end
\ No newline at end of file
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 247910b23b6..ac26024a3e4 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
@@ -11,38 +11,38 @@ add.formrubric=Rubrik
 add.formsessioninformations=Informationen
 add.formsinglechoice=Einzelauswahl
 add.formtable=Tabelle
-add.slider=Frage hinzuf\u00fcgen
+add.slider=Frage hinzuf\u00FCgen
 bar.chart.legend=Legende
 chart.avg=Durchschnitt
 chart.count=Anzahl
-choice.add=Eintrag hinzuf\u00fcgen
-choice.delete=L\u00f6schen
+choice.add=Eintrag hinzuf\u00FCgen
+choice.delete=L\u00F6schen
 choice.example=Beispielwert
 choice.move=Verschieben
 choice.value=Eintrag
-choice.values=Eintr\u00e4ge
-confirm.done=M\u00f6chten Sie die Antworten abgeben? Diese k\u00f6nnen anschliessend nicht mehr bearbeitet werden.
-disclaimer.agreement=Beschriftung Einverst\u00e4ndniserkl\u00e4rung
-disclaimer.default.agreement=Ich habe die Einverst\u00e4ndniserkl\u00e4rung gelesen, verstanden und bin mit ihr einverstanden.
-disclaimer.default.text=Alle von den Umfrageteilnehmern \u00fcbermittelten personenbezogenen Daten werden gem\u00e4ss den Datenschutzvorschriften bearbeitet und in keinem Fall an Dritte weitergegeben.
-disclaimer.not.accepted=Bitte geben Sie zuerst Ihr Einverst\u00e4ndnis.
-disclaimer.text=Einverst\u00e4ndniserkl\u00e4rung
+choice.values=Eintr\u00E4ge
+confirm.done=M\u00F6chten Sie die Antworten abgeben? Diese k\u00F6nnen anschliessend nicht mehr bearbeitet werden.
+disclaimer.agreement=Beschriftung Einverst\u00E4ndniserkl\u00E4rung
+disclaimer.default.agreement=Ich habe die Einverst\u00E4ndniserkl\u00E4rung gelesen, verstanden und bin mit ihr einverstanden.
+disclaimer.default.text=Alle von den Umfrageteilnehmern \u00FCbermittelten personenbezogenen Daten werden gem\u00E4ss den Datenschutzvorschriften bearbeitet und in keinem Fall an Dritte weitergegeben.
+disclaimer.not.accepted=Bitte geben Sie zuerst Ihr Einverst\u00E4ndnis.
+disclaimer.text=Einverst\u00E4ndniserkl\u00E4rung
 end.label=End
 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.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.
-evaluation.in.progress=Die Einsch\u00e4tzung ist gerade in Bearbeitung
+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.
+evaluation.in.progress=Die Einsch\u00E4tzung ist gerade in Bearbeitung
 evaluator=Benutzer {0}
 file.upload.download.info=Es werden {0} von {1} Dateien angezeigt.
 file.upload.download.link=Alle Dateien herunterladen.
 file.upload.error.limit.exeeded=Die Datei ist zu gross
-file.upload.error.mime.type.wrong=Dieser Dateityps ist nicht erlaubt
-file.upload.limit=Maximale Dateigr\u00f6sse
+file.upload.error.mime.type.wrong=Dieser Dateityp ist nicht erlaubt.
+file.upload.limit=Maximale Dateigr\u00F6sse
 file.upload.mime.type.all=Alle
 file.upload.mime.type.audio=Audio
 file.upload.mime.type.image=Bilder
@@ -61,15 +61,15 @@ htitle=Titel
 multiple.choice.others=Weitere
 multiple.choice.with.others.enabled=Teilnehmer kann weitere Werte erfassen
 multiple.choice.with.others=Weitere
-no.response.help=Aktivieren Sie diese Option, um im Fragebogen die Spalte "Keine Antwort m\u00f6glich" anzuzeigen. Der Teilnehmer kann so zum Ausdruck bringen, dass er nicht in der Lage ist, eine Frage zu beantworten.
-no.response=Keine Antwort m\u00f6glich
+no.response.help=Aktivieren Sie diese Option, um im Fragebogen die Spalte "Keine Antwort m\u00F6glich" anzuzeigen. Der Teilnehmer kann so zum Ausdruck bringen, dass er nicht in der Lage ist, eine Frage zu beantworten.
+no.response=Keine Antwort m\u00F6glich
 report.anonymous.user=Anonym
 report.count.count.title=Anzahl
 report.count.name.title=Wert
 report.excel.legend=Legende
 report.excel.text=Text
 report.export=Export Excel
-report.max.session.exceeded=Die maximale Anzahl von einzelnen Frageb\u00f6gen ({0}) wurde \u00fcberschritten. Die einzelnen Frageb\u00f6gen werden nicht gedruckt.
+report.max.session.exceeded=Die maximale Anzahl von einzelnen Frageb\u00F6gen ({0}) wurde \u00FCberschritten. Die einzelnen Frageb\u00F6gen werden nicht gedruckt.
 report.overview.duration.count=Anzahl
 report.overview.duration.title=Bearbeitungsdauer
 report.overview.duration=Bearbeitungsdauer
@@ -95,20 +95,20 @@ report.session.dummy=
 report.session.participant=Teilnehmer
 report.session.quickview=<i class\='o_icon o_icon_quickview'> </i>
 reports.diagram.report=Diagramme
-reports.session.forms=Frageb\u00f6gen
-reports.session.selection=Einzelne Frageb\u00f6gen
-reports.table.overview=\u00dcbersicht
+reports.session.forms=Frageb\u00F6gen
+reports.session.selection=Einzelne Frageb\u00F6gen
+reports.table.overview=\u00DCbersicht
 reports.table.report=Tabellen
 rubric.column.label=Spaltenbeschriftung
 rubric.good.rating.end=Rechts
-rubric.good.rating.help=Definieren Sie, ob die linke oder die rechte Seite der Skala eine positive Beurteilung darstellt. Diese Angabe wird f\u00fcr die Darstellung des Trenddiagramms verwendet.
+rubric.good.rating.help=Definieren Sie, ob die linke oder die rechte Seite der Skala eine positive Beurteilung darstellt. Diese Angabe wird f\u00FCr die Darstellung des Trenddiagramms verwendet.
 rubric.good.rating.start=Links
 rubric.good.rating=Positive Bewertung
-rubric.insufficient.explanation=Ungen\u00fcgende Beurteilung (Wert zwischen {0} und {1})
-rubric.insufficient=Ungen\u00fcgend
+rubric.insufficient.explanation=Ungen\u00FCgende Beurteilung (Wert zwischen {0} und {1})
+rubric.insufficient=Ungen\u00FCgend
 rubric.lower.bound=von
 rubric.name.display=Anzeige des Namens
-rubric.name.execution=In Durchf\u00fchrung
+rubric.name.execution=In Durchf\u00FChrung
 rubric.name.help=Geben Sie diesem Rubric einen Namen und legen Sie fest, ob dieser im Fragebogen und in den Reports dargestellt werden soll. Im Report werden Rubrics ohne Namen zur Kennzeichnung durchnummeriert.
 rubric.name.report=In Reports
 rubric.name=Name
@@ -116,7 +116,7 @@ rubric.neutral.explanation=Neutrale Beurteilung (Wert zwischen {0} und {1})
 rubric.neutral=Neutral
 rubric.no.response.enabled=Spalte "$\:no.response"
 rubric.rating.help=Definieren Sie den Bereich der Beurteilung "{0}". Die Beurteilung wird in den einzelnen Reports und in der Analyse von Umfragen verwendet. Zudem basieren die Kriterien einiger Datenerhebungsgeneratoren auf diesem Bereich.
-rubric.report.avg.abrev=\u00f8
+rubric.report.avg.abrev=\u00F8
 rubric.report.avg.title=Durchschnitt
 rubric.report.end.lable.title=
 rubric.report.figure.title=Kennzahl
@@ -127,12 +127,12 @@ rubric.report.number.no.responses.abrev=kA
 rubric.report.number.no.responses.title=Anzahl "$\:no.response"
 rubric.report.number.responses.abrev=A
 rubric.report.number.responses.title=Anzahl Antworten
-rubric.report.sdtdev.abrev=\u03c3
+rubric.report.sdtdev.abrev=\u03C3
 rubric.report.sdtdev.title=Standardabweichung
 rubric.report.start.label.title=
 rubric.report.total=Gesamttotal {0}
 rubric.report.value.title=Wert
-rubric.report.variance.abrev=\u03c3\u00b2
+rubric.report.variance.abrev=\u03C3\u00B2
 rubric.report.variance.title=Varianz
 rubric.report.weight.abrev=g
 rubric.report.weight.title=Gewichtung
@@ -141,7 +141,7 @@ rubric.scale.maxToOne=Absteigende Likert-Skala (x bis 1)
 rubric.scale.maxToZero=Absteigende Likert-Skala (x bis 0)
 rubric.scale.oneToMax=Aufsteigende Likert-Skala (1 bis x)
 rubric.scale.zeroToMax=Aufsteigende Likert-Skala (0 bis x)
-rubric.scale.type.help=Legen Sie die Werte der gew\u00e4hlten Skala fest. Die Werte werden in den Reports und der Analyse von Umfragen verwendet.
+rubric.scale.type.help=Legen Sie die Werte der gew\u00E4hlten Skala fest. Die Werte werden in den Reports und der Analyse von Umfragen verwendet.
 rubric.scale.type=Skalentyp
 rubric.scale.zeroBallanced=Symmetrische Likert-Skala (-x bis x)
 rubric.sufficient.explanation=Gute Beurteilung (Wert zwischen {0} und {1})
@@ -152,13 +152,13 @@ rubric.upper.bound=bis
 save.as.done=Speichern und abschliessen
 save.intermediate=Zwischenspeichern
 session.informations.fill.in.label=
-session.informations.fill.in=Automatisch einf\u00fcllen
+session.informations.fill.in=Automatisch einf\u00FCllen
 session.informations.informations=Informationen
 session.informations.label={0}
 session.information.obligation=Obligatorisch / Optional
-session.information.obligation.autofill=Obligatorisch, automatisch ausgef\u00fcllt und nicht bearbeitbar
+session.information.obligation.autofill=Obligatorisch, automatisch ausgef\u00FCllt und nicht bearbeitbar
 session.information.obligation.mandatory=Obligatorisch, bearbeitbar durch den Benutzer
-session.information.obligation.optional=Optional, muss nicht ausgef\u00fcllt werden
+session.information.obligation.optional=Optional, muss nicht ausgef\u00FCllt werden
 session.informations.report.number.participants=Es haben {0} Benutzer/innen an der Umfrage teilgenommen, {1} davon anonym.
 session.informations.type.age=Alter
 single.choice.presentation.dropdown=Auswahlliste
@@ -176,8 +176,8 @@ slider.steps=Schritte
 slider.type=Typ
 slider.weight=Gewicht
 standalone.already.done=Sie haben bereits an der Umfrage teilgenommen. Vielen Dank!
-standalone.done.now=Vielen Dank f\u00fcr Ihre Teilnahme an der Umfrage.
-standalone.not.executable=Die Teilnahme an dieser Umfrage ist (noch) nicht m\u00f6glich.
+standalone.done.now=Vielen Dank f\u00FCr Ihre Teilnahme an der Umfrage.
+standalone.not.executable=Die Teilnahme an dieser Umfrage ist (noch) nicht m\u00F6glich.
 standalone.not.found=Es ist keine Umfrage vorhanden.
 start.label=Beginn
 textinput.download.info=Es werden {0} von {1} Texten angezeigt.
@@ -191,4 +191,4 @@ textinput.rows.mode=Zeilentyp
 textinput.rows=Zeilen
 textinput.single.row=Eine Zeile
 title.example=<h1>Anklicken um Titel zu bearbeiten</h1>
-warning.form.not.completed=Achtung! Sie haben nicht alle Felder ausgef\u00fcllt.
+warning.form.not.completed=Achtung! Sie haben nicht alle Felder ausgef\u00FCllt.
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 de22b0e8c39..6bca28ac4e6 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
@@ -40,7 +40,7 @@ evaluator=User {0}
 file.upload.download.info={0} of {1} files are shown.
 file.upload.download.link=Download all files.
 file.upload.error.limit.exeeded=The file is too large
-file.upload.error.mime.type.wrong=The data type is not allowed
+file.upload.error.mime.type.wrong=This data type is not allowed.
 file.upload.limit=Maximal file size
 file.upload.mime.type.all=All
 file.upload.mime.type.audio=Audio
@@ -115,7 +115,7 @@ rubric.neutral.explanation=Neutral assessment (value between {0} and {1})
 rubric.neutral=Neutral
 rubric.no.response.enabled=Column "$\:no.response"
 rubric.rating.help=Define the range of the rating "{0}". The rating is used in  reports and in the analysis of surveys. In addition, the criteria of some data collection generators are based on this range.
-rubric.report.avg.abrev=\u00f8
+rubric.report.avg.abrev=\u00F8
 rubric.report.avg.title=Average
 rubric.report.end.lable.title=
 rubric.report.figure.title=Figure
@@ -126,12 +126,12 @@ rubric.report.number.no.responses.abrev=na
 rubric.report.number.no.responses.title=Number of "$\:no.response"
 rubric.report.number.responses.abrev=a
 rubric.report.number.responses.title=Number of answers
-rubric.report.sdtdev.abrev=\u03c3
+rubric.report.sdtdev.abrev=\u03C3
 rubric.report.sdtdev.title=Standard deviation
 rubric.report.start.label.title=
 rubric.report.total=Total {0}
 rubric.report.value.title=Value
-rubric.report.variance.abrev=\u03c3\u00b2
+rubric.report.variance.abrev=\u03C3\u00B2
 rubric.report.variance.title=Variance
 rubric.report.weight.abrev=w
 rubric.report.weight.title=Weight
-- 
GitLab