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