From 1ad57c3bb094c023c6a645997caecee6c8f19532 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Fri, 10 Jul 2020 11:02:33 +0200
Subject: [PATCH] OO-4800: propose conversion of question only if a format is
 available

---
 .../editor/_i18n/LocalStrings_de.properties   |  2 +-
 .../ui/ConversionConfirmationController.java  | 27 ++++++++++---
 .../ui/QuestionItemDetailsController.java     | 39 ++++++++++++-------
 .../qpool/ui/_content/item_details.html       |  2 +
 .../qpool/ui/_i18n/LocalStrings_de.properties |  1 +
 .../qpool/ui/_i18n/LocalStrings_en.properties |  1 +
 .../qpool/ui/_i18n/LocalStrings_fr.properties |  3 +-
 .../ui/_i18n/LocalStrings_pt_BR.properties    |  1 +
 8 files changed, 54 insertions(+), 22 deletions(-)

diff --git a/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_de.properties
index b63b100b263..4db6154f2f5 100644
--- a/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_de.properties
@@ -29,7 +29,7 @@ error.rows=Das Format f\u00FCr die H\u00F6he ist ung\u00FCltig.
 error.save=Das Dokument konnte nicht gespeichert werden.
 error.title.empty=Der Fragetitel darf nicht leer sein.
 error.tries=Das Format f\u00FCr die Anzahl L\u00F6sungsversuche ist ung\u00FCltig.
-error.qti.deprecated=Diese Version von QTI wird nicht mehr unterst\u00FCtzt. Bitte auf das neue QTI 2.1 konvertieren.
+error.qti.deprecated.no.conversion=Diese Version von QTI wird nicht mehr unterst\u00FCtzt.
 essay.columns=Breite (Anzahl Buchstaben pro Zeile)
 essay.dimension=Gr\u00F6sse
 essay.dimension.header=Gr\u00F6sse des Antwortfeldes
diff --git a/src/main/java/org/olat/modules/qpool/ui/ConversionConfirmationController.java b/src/main/java/org/olat/modules/qpool/ui/ConversionConfirmationController.java
index 175d1ae6ee1..f03a726debd 100644
--- a/src/main/java/org/olat/modules/qpool/ui/ConversionConfirmationController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/ConversionConfirmationController.java
@@ -115,15 +115,17 @@ public class ConversionConfirmationController extends FormBasicController {
 	}
 	
 	private void updateInfos() {
-		String format = formatEl.getSelectedKey();
-		List<QuestionItemShort> items = formatToItems.get(format);
-		setFormInfo("convert.item.msg", new String[]{ Integer.toString(items.size()) });
-		questionsEl.setValue(getQuestionNames(items));
+		if(formatEl.isOneSelected()) {
+			String format = formatEl.getSelectedKey();
+			List<QuestionItemShort> items = formatToItems.get(format);
+			setFormInfo("convert.item.msg", new String[]{ Integer.toString(items.size()) });
+			questionsEl.setValue(getQuestionNames(items));
+		}
 	}
 
 	private String getQuestionNames(List<QuestionItemShort> items) {
 		return items.stream()
-				.map(item -> item.getTitle())
+				.map(QuestionItemShort::getTitle)
 				.collect(Collectors.joining(", "));
 	}
 	
@@ -133,6 +135,21 @@ public class ConversionConfirmationController extends FormBasicController {
 		boolean showEditable = itemsSource.askEditable() && addToItemsSourceEl.isAtLeastSelected(1);
 		editableEl.setVisible(showEditable);
 	}
+	
+	
+
+	@Override
+	protected boolean validateFormLogic(UserRequest ureq) {
+		boolean allOk = super.validateFormLogic(ureq);
+		
+		formatEl.clearError();
+		if(!formatEl.isOneSelected()) {
+			formatEl.setErrorKey("form.legende.mandatory", null);
+			allOk &= false;
+		}
+
+		return allOk;
+	}
 
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java
index 85652cfe602..4d51cc4b987 100644
--- a/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java
@@ -258,12 +258,16 @@ public class QuestionItemDetailsController extends BasicController implements To
 		commandDropdown.addComponent(copyItemLink);
 		
 		if (QTIConstants.QTI_12_FORMAT.equals(metadatasCtrl.getItem().getFormat()) && valid) {
-			convertItemLink = LinkFactory.createToolLink("convert", translate("convert.item"), this);
-			convertItemLink.setIconLeftCSS("o_icon o_icon-fw o_icon_qitem_convert");
-			commandDropdown.addComponent(convertItemLink);
-			
-			convertItemButton = LinkFactory.createButton("convert.item.long", mainVC, this);
-			convertItemButton.setIconLeftCSS("o_icon o_icon-fw o_FileResource-IMSQTI21_icon");
+			if(availableConversionFormats(metadatasCtrl.getItem()).isEmpty()) {
+				mainVC.contextPut("deprecatedForm", Boolean.TRUE);
+			} else {
+				convertItemLink = LinkFactory.createToolLink("convert", translate("convert.item"), this);
+				convertItemLink.setIconLeftCSS("o_icon o_icon-fw o_icon_qitem_convert");
+				commandDropdown.addComponent(convertItemLink);
+				
+				convertItemButton = LinkFactory.createButton("convert.item.long", mainVC, this);
+				convertItemButton.setIconLeftCSS("o_icon o_icon-fw o_FileResource-IMSQTI21_icon");
+			}
 		}
 		
 		if (qItemSecurityCallback.canDelete()) {
@@ -691,6 +695,19 @@ public class QuestionItemDetailsController extends BasicController implements To
 	}
 
 	private void doConfirmConversion(UserRequest ureq, QuestionItemShort item) {
+		Map<String,List<QuestionItemShort>> formatToItems = availableConversionFormats(item);
+		
+		conversionConfirmationCtrl = new ConversionConfirmationController(ureq, getWindowControl(), formatToItems,
+				itemSource);
+		listenTo(conversionConfirmationCtrl);
+		
+		cmc = new CloseableModalController(getWindowControl(), translate("close"),
+				conversionConfirmationCtrl.getInitialComponent(), true, translate("convert.item"));
+		cmc.activate();
+		listenTo(cmc);
+	}
+	
+	private Map<String,List<QuestionItemShort>> availableConversionFormats(QuestionItemShort item) {
 		Map<String,List<QuestionItemShort>> formatToItems = new HashMap<>();
 		List<QPoolSPI> spies = poolModule.getQuestionPoolProviders();
 		for(QPoolSPI sp:spies) {
@@ -705,15 +722,7 @@ public class QuestionItemDetailsController extends BasicController implements To
 				convertItems.add(item);	
 			}
 		}
-		
-		conversionConfirmationCtrl = new ConversionConfirmationController(ureq, getWindowControl(), formatToItems,
-				itemSource);
-		listenTo(conversionConfirmationCtrl);
-		
-		cmc = new CloseableModalController(getWindowControl(), translate("close"),
-				conversionConfirmationCtrl.getInitialComponent(), true, translate("convert.item"));
-		cmc.activate();
-		listenTo(cmc);
+		return formatToItems;
 	}
 	
 	private void doPostConvert(UserRequest ureq, Event event) {
diff --git a/src/main/java/org/olat/modules/qpool/ui/_content/item_details.html b/src/main/java/org/olat/modules/qpool/ui/_content/item_details.html
index a6edb9efbcc..f3f4e711a9e 100644
--- a/src/main/java/org/olat/modules/qpool/ui/_content/item_details.html
+++ b/src/main/java/org/olat/modules/qpool/ui/_content/item_details.html
@@ -9,6 +9,8 @@
 		$r.render("convert.item.long")
 	</div>
 </div>
+#elseif($r.isTrue($deprecatedForm))
+<div class="o_error">$r.translate("error.qti.deprecated.no.conversion")</div>
 #end
 <div class="row">
 	#if($metadataSwitch)
diff --git a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties
index 1d3e2aa9a95..90b0d67b39c 100644
--- a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties
@@ -63,6 +63,7 @@ educational.learningTime.second=s
 error.corrupted.question=Die Datei der Frage konnte nicht gelesen werden.
 error.input.toolong=Leider ist Ihr gerade eingegebener Text mit {1} Zeichen zu lang. Bitte beschr\u00E4nken Sie sich auf maximal {0} Zeichen.
 error.qti.deprecated=Diese Version von QTI wird nicht mehr unterst\u00FCtzt. Bitte auf das neue QTI 2.1 konvertieren.
+error.qti.deprecated.no.conversion=Diese Version von QTI wird nicht mehr unterst\u00FCtzt.
 error.select.one=Sie m\u00FCssen mindestens eine Frage w\u00E4hlen.
 error.select.one.author=Sie m\u00FCssen mindestens eine Frage w\u00E4hlen, bei welcher Sie die Autoren bearbeiten k\u00F6nnen.
 error.select.one.convert=Sie m\u00FCssen mindestens eine Frage w\u00E4hlen, welche Sie konvertieren k\u00F6nnen.
diff --git a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties
index 45017392462..375be3a0e5b 100644
--- a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties
@@ -63,6 +63,7 @@ educational.learningTime.second=s
 error.corrupted.question=The file of the question cannot be read.
 error.input.toolong=The text you entered is to long ({1} characters). Only {1} characters are allowed.
 error.qti.deprecated=This version of QTI is deprecated. Please consider to convert your test to QTI 2.1.
+error.qti.deprecated.no.conversion=This version of QTI is deprecated.
 error.select.one=You need to select at least one question.
 error.select.one.author=You need to select at least one question, for which you can change the authors.
 error.select.one.convert=You need to select at least one question, which you can convert.
diff --git a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_fr.properties
index 62c19bdc715..9db3c0bcaf3 100644
--- a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_fr.properties
@@ -62,7 +62,8 @@ educational.learningTime.minute=m
 educational.learningTime.second=s
 error.corrupted.question=Le fichier de la question n'a pas \u00EAtre lu.
 error.input.toolong=Le texte que vous avez entr\u00E9 est trop long ({1} caract\u00E8res). Limitez-vous s'il vous pla\u00EEt \u00E0 {1} caract\u00E8res.
-error.qti.deprecated=Cette version de QTI est obsol\u00E8te. Pensez s'il vous pla\u00EEt \u00E0 convertir votre test au format QTI 2.1.
+error.qti.deprecated=Cette version de QTI est obsol\u00E8te et ne sera plus support\u00E9. Pensez s'il vous pla\u00EEt \u00E0 convertir votre test au format QTI 2.1.
+error.qti.deprecated.no.conversion=Cette version de QTI est obsol\u00E8te et ne sera plus support\u00E9.
 error.select.one=Vous devez s\u00E9lectionner au moins une question.
 error.select.one.author=Vous devez s\u00E9lectionner au moins une question qu'auteur peut \u00E9diter.
 error.select.one.convert=Vous devez s\u00E9lectionner au moins une question qui puisse \u00EAtre convertie dans un autre format.
diff --git a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_pt_BR.properties
index 6338518c8e8..918b20523c5 100644
--- a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_pt_BR.properties
@@ -64,6 +64,7 @@ educational.learningTime.second=s
 error.corrupted.question=O arquivo da pergunta n\u00E3o pode ser lido.
 error.input.toolong=O texto que voc\u00EA digitou \u00E9 muito grande ({1} caracteres). Apenas {1} caracteres s\u00E3o permitidos.
 error.qti.deprecated=Esta vers\u00E3o do QTI est\u00E1 obsoleta. Por favor, considere converter seu teste para o QTI 2.1.
+error.qti.deprecated.no.conversion=Esta vers\u00E3o do QTI est\u00E1 obsoleta.
 error.select.one=Voc\u00EA precisa selecionar pelo menos uma quest\u00E3o.
 error.select.one.author=Voc\u00EA precisa selecionar pelo menos uma pergunta, para a qual voc\u00EA pode alterar os autores.
 error.select.one.convert=Voc\u00EA precisa selecionar pelo menos uma pergunta, que voc\u00EA possa converter.
-- 
GitLab