diff --git a/src/main/java/org/olat/core/gui/render/velocity/VelocityRenderDecorator.java b/src/main/java/org/olat/core/gui/render/velocity/VelocityRenderDecorator.java index 13dc8ae5a7eb9c9a1a840d0800e8b12434fd9fe9..12b6cecc37fe24179eebbc818a3b209605f42fb9 100644 --- a/src/main/java/org/olat/core/gui/render/velocity/VelocityRenderDecorator.java +++ b/src/main/java/org/olat/core/gui/render/velocity/VelocityRenderDecorator.java @@ -674,6 +674,22 @@ public class VelocityRenderDecorator implements Closeable { return obj != null; } + public boolean isEmpty(Object obj) { + boolean empty; + if(obj == null) { + empty = true; + } else if(obj instanceof String) { + empty = !StringHelper.containsNonWhitespace((String)obj) || "<p></p>".equals(obj); + } else if(obj instanceof Collection) { + empty = ((Collection<?>)obj).isEmpty(); + } else if(obj instanceof Map) { + empty = ((Map<?,?>)obj).isEmpty(); + } else { + empty = false; + } + return empty; + } + public boolean isNotEmpty(Object obj) { boolean notEmpty; if(obj == null) { diff --git a/src/main/java/org/olat/ims/qti21/manager/InfinispanXsltStylesheetCache.java b/src/main/java/org/olat/ims/qti21/manager/InfinispanXsltStylesheetCache.java index 51c220e5596f0db50a28553fcfb9b1295d15bd6c..a457c7ad1f2602310a27ce714041aa381ec69a2b 100644 --- a/src/main/java/org/olat/ims/qti21/manager/InfinispanXsltStylesheetCache.java +++ b/src/main/java/org/olat/ims/qti21/manager/InfinispanXsltStylesheetCache.java @@ -44,7 +44,7 @@ public class InfinispanXsltStylesheetCache implements XsltStylesheetCache { @SuppressWarnings("static-access") @Autowired public InfinispanXsltStylesheetCache(CoordinatorManager coordinatorManager) { - cache = coordinatorManager.getInstance().getCoordinator().getCacher().getCache("QTIWorks", "ssltStylesheets"); + cache = coordinatorManager.getInstance().getCoordinator().getCacher().getCache("QTIWorks", "xsltStylesheets"); } @Override diff --git a/src/main/java/org/olat/ims/qti21/manager/QTI21StatisticsManagerImpl.java b/src/main/java/org/olat/ims/qti21/manager/QTI21StatisticsManagerImpl.java index 9f657ab58eaf3516a1a5bb9e9fbdf6b501b3eb38..ae629d0d930fe7988cda54ae742bca3175902465 100644 --- a/src/main/java/org/olat/ims/qti21/manager/QTI21StatisticsManagerImpl.java +++ b/src/main/java/org/olat/ims/qti21/manager/QTI21StatisticsManagerImpl.java @@ -128,9 +128,18 @@ public class QTI21StatisticsManagerImpl implements QTI21StatisticsManager { query.setParameter("testEntryKey", searchParams.getTestEntry().getKey()); if(searchParams.getCourseEntry() != null) { query.setParameter("repositoryEntryKey", searchParams.getCourseEntry().getKey()); + } + if(searchParams.getNodeIdent() != null ) { query.setParameter("subIdent", searchParams.getNodeIdent()); } - if(searchParams.getLimitToGroups() != null && searchParams.getLimitToGroups().size() > 0) { + + if(searchParams.isViewAllUsers() && searchParams.isViewAnonymUsers()) { + //no restrictions + } else if(searchParams.isViewAnonymUsers()) { + // + } else if(searchParams.isViewAllUsers()) { + // + } else if(searchParams.getLimitToGroups() != null && searchParams.getLimitToGroups().size() > 0) { query.setParameter("baseGroups", searchParams.getLimitToGroups()); } } diff --git a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java index ef788e3d07cf92f1b37bffc80cb54caf57b00e2f..c0411bfe803fecd9e47d6844990684d12341de86 100644 --- a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java +++ b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java @@ -855,16 +855,16 @@ public class AssessmentTestDisplayController extends BasicController implements TestPlanNode nextTestPart = testSessionController.findNextEnterableTestPart(); if(nextTestPart == null) { - String title = translate("confirm.close.test.title"); - String text = translate("confirm.close.test.text"); + String title = translate("confirm.finish.test.title"); + String text = translate("confirm.finish.test.text"); endTestPartDialog = activateOkCancelDialog(ureq, title, text, endTestPartDialog); } else { TestPart currentTestPart = testSessionController.getCurrentTestPart(); if(currentTestPart == null) { processEndTestPart(ureq); } else { - String title = translate("confirm.end.testpart.title"); - String text = translate("confirm.end.testpart.text"); + String title = translate("confirm.finish.testpart.title"); + String text = translate("confirm.finish.testpart.text"); endTestPartDialog = activateOkCancelDialog(ureq, title, text, endTestPartDialog); } } 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 a0c7efa339e70a9d011cf084f3b5c195f0dedc7b..2177f1db895e51d3d3fd5354ef5179b13cfe8e30 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 @@ -1,7 +1,7 @@ -#Mon Aug 15 10:49:18 CEST 2016 +#Tue Aug 23 10:37:11 CEST 2016 actualPoints=$org.olat.modules.iq\:actualPoints +anonym.not.allowed.descr=Anonym Benutzer d\u00FCrfen diesen Test nicht durchf\u00FChren anonym.not.allowed.title=Anonym Benutzer -anonym.not.allowed.descr=Anonym Benutzer dürfen diesen Test nicht durchführen anonym.user=Anonym Benutzer assessment.comment.legend=Pers\u00F6nliche Notizen assessment.item.modal.feedback=Feedback @@ -45,8 +45,12 @@ command.openteststatistic=Test statistics confirm.advance.testpart.text=Wollen sie wirklich diese Test Part verlassen und weiter gehen? confirm.advance.testpart.title=Test Part weiter gehen confirm.cancel.test=$org.olat.modules.iq\:confirmCancel -confirm.close.test.text=Wollen Sie wirklich den Test abschliessen? -confirm.close.test.title=Test abschliessen +confirm.close.test.text=Sind Sie sicher dass Sie den Test schliessen wollen? Sie verlassen den Test dadurch endg\u00FCltig und haben im Anschluss keinen Zugriff mehr darauf. +confirm.close.test.title=Test schliessen +confirm.finish.test.text=Sind Sie sicher dass Sie den Test beenden wollen? Ihre Antworten werden dadurch gespeichert.\u00A0 +confirm.finish.test.title=Test beenden +confirm.finish.testpart.text=Sind Sie sicher dass Sie den Test Part beenden wollen? Ihre Antworten werden dadurch gespeichert.\u00A0 +confirm.finish.testpart.title=Test Part beenden confirm.suspend.test=$org.olat.modules.iq\:confirmSuspend correction=Korrigieren debug.outcomes=Output Daten @@ -70,6 +74,7 @@ passed.no=$org.olat.course.nodes.iq\:passed.no passed.yes=$org.olat.course.nodes.iq\:passed.yes passed.yourpassed=$org.olat.course.nodes.iq\:passed.yourpassed pull=Ziehen +qti.form.allow.anonym=$org.olat.course.nodes.iq\:qti.form.allow.anonym qti.form.attempts=$org.olat.course.nodes.iq\:qti.form.attempts qti.form.auto.memofield=$org.olat.course.nodes.iq\:qti.form.auto.memofield qti.form.block.afterSuccess=$org.olat.course.nodes.iq\:qti.form.block.afterSuccess @@ -86,7 +91,6 @@ qti.form.summary.compact=$org.olat.course.nodes.iq\:qti.form.summary.compact qti.form.summary.detailed=$org.olat.course.nodes.iq\:qti.form.summary.detailed qti.form.summary.none=$org.olat.course.nodes.iq\:qti.form.summary.none qti.form.summary.section=$org.olat.course.nodes.iq\:qti.form.summary.section -qti.form.allow.anonym=$org.olat.course.nodes.iq\:qti.form.allow.anonym question.progress.answered=Antwortet question.progress.noMaxScore=$org.olat.modules.iq\:noMaxScore question.progress.score=$org.olat.modules.iq\:actualPoints 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 2b6b445f63a4d438a2c8ee5441d6f988e67ac6e8..c16d3b7d9ec35f87248563fc58578fdebebdddd5 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 @@ -1,8 +1,8 @@ -#Mon Aug 15 10:49:39 CEST 2016 +#Tue Aug 23 10:37:23 CEST 2016 actualPoints=$org.olat.modules.iq\:actualPoints -anonym.user=Anonymous user -anonym.not.allowed.title=Anonym users anonym.not.allowed.descr=Anonym users are not allowed to play this test +anonym.not.allowed.title=Anonym users +anonym.user=Anonymous user assessment.comment.legend=Please use the following text box if you need to provide any additional information, comments or feedback during this test\: assessment.item.modal.feedback=Feedback assessment.item.status.answered=Answered @@ -45,18 +45,19 @@ command.openteststatistic=Test statistics confirm.advance.testpart.text=Do really want to leave this test part and advance further? confirm.advance.testpart.title=Advance test part confirm.cancel.test=$org.olat.modules.iq\:confirmCancel -confirm.close.test.text=Do you really want to submit the test? -confirm.close.test.title=Submit test +confirm.close.test.text=Close / Are you sure? This will leave this Test and you can't go back in. +confirm.close.test.title=Close test +confirm.finish.test.text=Finish / Are you sure? This will commit your answers for this test. +confirm.finish.test.title=Finish test +confirm.finish.testpart.text=Finish / Are you sure? This will commit your answers for this test part. +confirm.finish.testpart.title=Finish test part confirm.suspend.test=$org.olat.modules.iq\:confirmSuspend -correction=Correct +correction=Grade debug.outcomes=Output data debug.responses=Responses data error.as.directed=Please complete this interaction as directed. error.choice=You must select one of the following options error.double=Need to be a double -error.required.format=Your input is not of the required format. -error.textEntry.invalid=Your input must be a valid {0} -error.textEntry.invalid.record=Your input must be a valid number error.input.choice.max=You must select at the most {0} choices. error.input.choice.min=You must select at least {0} choice(s). error.input.choice.min.max=You must select at least {0} and at the most {1} choices. @@ -65,6 +66,9 @@ error.input.choice.minax.one=You must select one choice. error.input.extendedText.max=Write a text with at the most {0} words. error.input.extendedText.min=Write a text with at least {0} words. error.input.extendedText.min.max=Write a text with at least {0} and at the most {1} words. +error.required.format=Your input is not of the required format. +error.textEntry.invalid=Your input must be a valid {0} +error.textEntry.invalid.record=Your input must be a valid number exploded.msg=Exploded form.metadata.title=Title head.assessment.details=$org.olat.ims.qti\:head.ass.details @@ -79,6 +83,7 @@ passed.no=$org.olat.course.nodes.iq\:passed.no passed.yes=$org.olat.course.nodes.iq\:passed.yes passed.yourpassed=$org.olat.course.nodes.iq\:passed.yourpassed pull=Pull +qti.form.allow.anonym=$org.olat.course.nodes.iq\:qti.form.allow.anonym qti.form.attempts=$org.olat.course.nodes.iq\:qti.form.attempts qti.form.auto.memofield=$org.olat.course.nodes.iq\:qti.form.auto.memofield qti.form.block.afterSuccess=$org.olat.course.nodes.iq\:qti.form.block.afterSuccess @@ -95,7 +100,6 @@ qti.form.summary.compact=$org.olat.course.nodes.iq\:qti.form.summary.compact qti.form.summary.detailed=$org.olat.course.nodes.iq\:qti.form.summary.detailed qti.form.summary.none=$org.olat.course.nodes.iq\:qti.form.summary.none qti.form.summary.section=$org.olat.course.nodes.iq\:qti.form.summary.section -qti.form.allow.anonym=$org.olat.course.nodes.iq\:qti.form.allow.anonym question.progress.answered=Answered question.progress.noMaxScore=$org.olat.modules.iq\:noMaxScore question.progress.score=$org.olat.modules.iq\:actualPoints diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/IdentitiesAssessmentItemCorrectionController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/IdentitiesAssessmentItemCorrectionController.java index 3cb822dce860a04dbde6523e4f37ca38843e809f..590c5a3bae886e3ed22b5c66110f54b0791ac7bc 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/IdentitiesAssessmentItemCorrectionController.java +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/IdentitiesAssessmentItemCorrectionController.java @@ -129,8 +129,11 @@ public class IdentitiesAssessmentItemCorrectionController extends FormBasicContr if(formLayout instanceof FormLayoutContainer) { FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout; layoutCont.contextPut("interactionWrappers", itemResults); - for(AssessmentItemCorrection correction:testCorrections.getCorrections(itemRef)) { - initFormItemResult(correction, layoutCont); + List<AssessmentItemCorrection> corrections = testCorrections.getCorrections(itemRef); + if(corrections != null) { + for(AssessmentItemCorrection correction:corrections) { + initFormItemResult(correction, layoutCont); + } } } diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_content/users_interactions.html b/src/main/java/org/olat/ims/qti21/ui/assessment/_content/users_interactions.html index 4f6a14d5ee62c369700d62f8a99e968f9e996b7a..425dd4e1f7b0c8740d0ad9bd8a57f3cef66be40f 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/_content/users_interactions.html +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_content/users_interactions.html @@ -1,4 +1,7 @@ <fieldset class="o_form form-horizontal" role="form"> +#if($r.isEmpty($interactionWrappers)) + <div class="o_info">$r.translate("grade.no.items")</div> +#end #foreach($interactionWrapper in $interactionWrappers) <h4>${foreach.count}. $r.translate("assessed.identity")</h4>##$interactionWrapper.fullName #if($interactionWrapper.responded) diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties index 1e5a28a4c50258417cb12efd4cbd79f02e2cf961..2f490c99e74aa5299e490cc0d04ab58dd4bf15ef 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties @@ -1,19 +1,20 @@ -#Mon Aug 15 10:49:18 CEST 2016 +#Tue Aug 23 10:23:37 CEST 2016 assessed.identity=Benutzer -score=Ergebnis correction=Korrigieren correction.min.max.score=Result must ziwschen {0} und {1} sein correction.test.title=Korrigieren -previous.item=Zurück zur letzte Frage -next.item=Zur nächsten Frage +grade.no.items=Es gibt kein Resultat f\u00FCr diese Frage zu korrigieren. +next.item=Zur n\u00E4chsten Frage not.responded=Die Frage wurde nicht beantworter -save.next=Speichern und nächste Frage -overview.tests=Übersicht and abschliessen -table.header.username=Benutzername -table.header.responded=Beantwortet +overview.tests=\u00DCbersicht and abschliessen +previous.item=Zur\u00FCck zur letzte Frage +save.next=Speichern und n\u00E4chste Frage +save.tests=Resultat speichern als endg\u00FCltig +score=Ergebnis table.header.corrected=Korrigiert -table.header.score=Punkte +table.header.finalScore=Endg\u00FCltige Punkte +table.header.itemSessions=\# Fragen table.header.manualScore=Manuell Punkte -table.header.finalScore=Endgültige Punkte -table.header.itemSessions=# Fragen -save.tests=Resultat speichern als endgültig \ No newline at end of file +table.header.responded=Beantwortet +table.header.score=Punkte +table.header.username=Benutzername diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties index 20da4849da9388c009bab57711126c02f28a5d2f..83a388634a86ec8685bed401bcec5a2dc7a94ec2 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties @@ -1,19 +1,20 @@ -#Mon Aug 15 10:49:39 CEST 2016 +#Tue Aug 23 10:23:23 CEST 2016 assessed.identity=assessed user -score=Score correction=Correction correction.min.max.score=Score need to be between {0} and {1}. -correction.test.title=Correct -previous.item=Previous question +correction.test.title=Grade +grade.no.items=There is no results to correct for this question. next.item=Next question not.responded=The question was not responded -save.next=Save and next question overview.tests=Overview and closing -table.header.username=Username -table.header.responded=Responded +previous.item=Previous question +save.next=Save and next question +save.tests=Save results as completed +score=Score table.header.corrected=Corrected -table.header.score=Punkte -table.header.manualScore=Manual score table.header.finalScore=Final score -table.header.itemSessions=# questions -save.tests=Save results as completed \ No newline at end of file +table.header.itemSessions=\# questions +table.header.manualScore=Manual score +table.header.responded=Responded +table.header.score=Score +table.header.username=Username diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java index be775934ba9be63d3b51ed7a60e1975194345fcc..519ae94386fc5a67ae68ff8ef97e5126ccbe50c0 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java @@ -160,7 +160,7 @@ public class AssessmentItemComponentRenderer extends AssessmentObjectComponentRe sb.append("<h1 class='itemTitle'>"); renderItemStatus(renderer, sb, itemSessionState, translator); sb.append(assessmentItem.getTitle()).append("</h1>") - .append("<div id='itemBody'>"); + .append("<div id='itemBody' class='clearfix'>"); //TODO prompt diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java index 231f01864a6dbbb76ff7335e0b6bf3e422d5f101..766da5acb7ecc60d6d6580805017cf8d227d59ea 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java @@ -346,7 +346,7 @@ public class AssessmentTestComponentRenderer extends AssessmentObjectComponentRe renderItemStatus(sb, itemSessionState, options, translator); sb.append(itemNode.getSectionPartTitle(), component.isShowTitles()) .append("</h3>") - .append("<div id='itemBody'>"); + .append("<div id='itemBody' class='clearfix'>"); //render itemBody assessmentItem.getItemBody().getBlocks().forEach((block)