diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21ConfirmDeleteDataController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21ConfirmDeleteDataController.java new file mode 100644 index 0000000000000000000000000000000000000000..24c4486d03d1047ae9447ece64b906e93273d9d4 --- /dev/null +++ b/src/main/java/org/olat/ims/qti21/ui/QTI21ConfirmDeleteDataController.java @@ -0,0 +1,104 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.ims.qti21.ui; + +import java.util.List; + +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.WindowControl; +import org.olat.course.CorruptedCourseException; +import org.olat.course.CourseFactory; +import org.olat.course.ICourse; +import org.olat.repository.RepositoryEntry; +import org.olat.resource.references.Reference; +import org.olat.resource.references.ReferenceManager; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 25.08.2016<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class QTI21ConfirmDeleteDataController extends FormBasicController { + + private final RepositoryEntry testEntry; + + @Autowired + private ReferenceManager referenceManager; + + public QTI21ConfirmDeleteDataController(UserRequest ureq, WindowControl wControl, RepositoryEntry testEntry) { + super(ureq, wControl, "confirm_delete"); + this.testEntry = testEntry; + initForm(ureq); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + + StringBuilder sb = new StringBuilder(); + List<Reference> referencees = referenceManager.getReferencesTo(testEntry.getOlatResource()); + for(Reference ref:referencees) { + if ("CourseModule".equals(ref.getSource().getResourceableTypeName())) { + if(sb.length() > 0) sb.append(", "); + try { + ICourse course = CourseFactory.loadCourse(ref.getSource().getResourceableId()); + sb.append(course.getCourseTitle()); + } catch(CorruptedCourseException e) { + logError("", e); + } + } + } + + if(formLayout instanceof FormLayoutContainer) { + FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout; + layoutCont.contextPut("referencees", sb.toString()); + } + + final FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); + buttonGroupLayout.setRootForm(mainForm); + formLayout.add(buttonGroupLayout); + + if(referencees.size() == 0) { + uifactory.addFormSubmitButton("delete", buttonGroupLayout); + } + uifactory.addFormCancelButton("cancel", buttonGroupLayout, ureq, getWindowControl()); + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void formOK(UserRequest ureq) { + fireEvent(ureq, Event.DONE_EVENT); + } + + @Override + protected void formCancelled(UserRequest ureq) { + fireEvent(ureq, Event.CANCELLED_EVENT); + } +} diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java index 68fa935c95b13543b0626ae8188548d316b9dd55..85cc5603040f3753960747c59fe716ea4e765204 100644 --- a/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java +++ b/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java @@ -39,9 +39,8 @@ import org.olat.core.gui.components.stack.PopEvent; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.control.generic.dtabs.Activateable2; -import org.olat.core.gui.control.generic.modal.DialogBoxController; -import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; @@ -77,11 +76,12 @@ import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentTest; public class QTI21RuntimeController extends RepositoryEntryRuntimeController { private Link assessmentLink, testStatisticLink, qtiOptionsLink, resetDataLink; - - private DialogBoxController confirmResetDialog; + + private CloseableModalController cmd; private QTI21DeliveryOptionsController optionsCtrl; private AssessmentToolController assessmentToolCtrl; private QTI21RuntimeStatisticsController statsToolCtr; + private QTI21ConfirmDeleteDataController confirmResetDialog; private boolean reloadRuntime = false; @@ -185,12 +185,25 @@ public class QTI21RuntimeController extends RepositoryEntryRuntimeController { @Override protected void event(UserRequest ureq, Controller source, Event event) { if(confirmResetDialog == source) { - if(DialogBoxUIFactory.isOkEvent(event) || DialogBoxUIFactory.isYesEvent(event)) { + if(event == Event.DONE_EVENT) { doReset(ureq); } + cmd.deactivate(); + cleanUp(); + } else if(cmd == source) { + cleanUp(); } super.event(ureq, source, event); } + + @Override + protected void cleanUp() { + super.cleanUp(); + removeAsListenerAndDispose(confirmResetDialog); + removeAsListenerAndDispose(cmd); + confirmResetDialog = null; + cmd = null; + } private void doReloadRuntimeController(UserRequest ureq) { disposeRuntimeController(); @@ -276,9 +289,15 @@ public class QTI21RuntimeController extends RepositoryEntryRuntimeController { } private void doConfirmResetData(UserRequest ureq) { + if(confirmResetDialog != null) return; + + confirmResetDialog = new QTI21ConfirmDeleteDataController(ureq, getWindowControl(), getRepositoryEntry()); + listenTo(confirmResetDialog); + String title = translate("reset.test.data.title"); - String text = translate("reset.test.data.text"); - confirmResetDialog = activateOkCancelDialog(ureq, title, text, confirmResetDialog); + cmd = new CloseableModalController(getWindowControl(), translate("close"), confirmResetDialog.getInitialComponent(), true, title); + cmd.activate(); + listenTo(cmd); } private void doReset(UserRequest ureq) { diff --git a/src/main/java/org/olat/ims/qti21/ui/_content/confirm_delete.html b/src/main/java/org/olat/ims/qti21/ui/_content/confirm_delete.html new file mode 100644 index 0000000000000000000000000000000000000000..7fc00d614ced4d81388ab6b6729522f0404c8384 --- /dev/null +++ b/src/main/java/org/olat/ims/qti21/ui/_content/confirm_delete.html @@ -0,0 +1,9 @@ +#if($r.isNotEmpty($referencees)) + <div class="o_warning">$r.translate("reset.test.data.text.ref", $referencees)</div> +#else + <div class="o_warning">$r.translate("reset.test.data.text")</div> +#end + +<div class="o_button_group"> + $r.render("buttons") +</div> \ No newline at end of file diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties index 5893364a2634e30dca35529a7258dee628c6e48e..1940f3c2a174f293166d80d69f8100646df05953 100644 --- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties @@ -101,6 +101,7 @@ question.progress.answered=Antwortet question.progress.noMaxScore=$org.olat.modules.iq\:noMaxScore question.progress.score=$org.olat.modules.iq\:actualPoints reset.test.data.text=Wollen Sie wirklich alle Daten von dem Test zur\u00FCcksetzen? Die Resultate werden definitiv gel\u00F6scht. +reset.test.data.text.ref=Sie k\u00F6nnen nicht alle Daten von dem Test weil noch an diesem Ressourcen "{0}" verbunden ist. reset.test.data.title=Daten von Test zur\u00FCcksetzen results.duration=Dauer results.end.time=Enddatum diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties index cdff5a93103f0647252cb4f3c29ae3797eae70e5..2a5912aac42107d6818889f4949af1b768c0b95f 100644 --- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties @@ -110,6 +110,7 @@ question.progress.answered=Answered question.progress.noMaxScore=$org.olat.modules.iq\:noMaxScore question.progress.score=$org.olat.modules.iq\:actualPoints reset.test.data.text=Do you really want to reset the assessment data of test? The results will be definitively deleted. +reset.test.data.text.ref=You cannot delete all the data of this test because it's referenced by the following ressources "{0}". reset.test.data.title=Reset data of test results.duration=Duration results.end.time=End date