Skip to content
Snippets Groups Projects
Commit 9cda3bf4 authored by srosse's avatar srosse
Browse files

Merge remote-tracking branch 'origin/OpenOLAT_12.5'

parents d31ace9f 4748ce27
No related branches found
No related tags found
No related merge requests found
Showing
with 76 additions and 16 deletions
......@@ -379,6 +379,9 @@ public class VelocityRenderDecorator implements Closeable {
return sb;
}
public String mathJax(String targetDomId) {
return Formatter.elementLatexFormattingScript(targetDomId);
}
/**
* e.g. "/olat/"
......
......@@ -448,7 +448,7 @@ public class WebappHelper implements Initializable, Destroyable, ServletContextA
private void testUtf8FileSystem() {
File tmpDir = new File(new File(WebappHelper.getUserDataRoot()), "tmp");
if (!tmpDir.exists()) tmpDir.mkdir();
File writeFile = new File(tmpDir, "UTF-8 test läsÖiç-首页|新");
File writeFile = new File(tmpDir, "UTF-8 test läsÖiç-首页f新");
if (writeFile.exists()) {
// remove exising files first
writeFile.delete();
......@@ -464,7 +464,7 @@ public class WebappHelper implements Initializable, Destroyable, ServletContextA
if(tmpFiles != null){
for (int i = 0; i < tmpFiles.length; i++) {
File tmpFile = tmpFiles[i];
if (tmpFile.getName().equals("UTF-8 test läsÖiç-首页|新")) {
if (tmpFile.getName().equals("UTF-8 test läsÖiç-首页f新")) {
foundUtf8File = true;
break;
}
......
<div class="o_assessment_test_results">
<div id="o_assessment_test_results_$r.getCId()" class="o_assessment_test_results">
<a id="o_result_overview" title="$r.translateInAttribute("head.assessment.details")"></a>
<div class="o_header_with_buttons o_qti_assessment_title">
......@@ -547,4 +547,6 @@
/* ]]> */
</script>
#end
</div> ## END of o_assessment_test_results
\ No newline at end of file
</div> ## END of o_assessment_test_results
$r.mathJax("o_assessment_test_results_${r.getCId()}")
......@@ -80,6 +80,8 @@ import uk.ac.ed.ph.jqtiplus.state.TestPlanNode;
import uk.ac.ed.ph.jqtiplus.state.TestPlanNodeKey;
import uk.ac.ed.ph.jqtiplus.state.TestSessionState;
import uk.ac.ed.ph.jqtiplus.types.Identifier;
import uk.ac.ed.ph.jqtiplus.types.ResponseData;
import uk.ac.ed.ph.jqtiplus.types.StringResponseData;
import uk.ac.ed.ph.jqtiplus.xmlutils.locators.ResourceLocator;
/**
......@@ -170,6 +172,7 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle
viewSolutionButton = uifactory.addFormLink("view.solution", formLayout);
viewSolutionButton.setIconLeftCSS("o_icon o_icon_open_togglebox");
viewSolutionButton.setVisible(hasSolution());
solutionItem = initFormExtendedTextInteraction(testPlanNodeKey, testSessionState, testSession, formLayout);
solutionItem.setVisible(false);
......@@ -273,6 +276,7 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle
if(formLayout instanceof FormLayoutContainer) {
FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout;
layoutCont.contextPut("interactionWrapper", wrapper);
layoutCont.contextPut("autoSaved", Boolean.valueOf(isAutoSaved(testPlanNodeKey, testSessionState)));
}
}
......@@ -310,6 +314,49 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle
return feedbackItem;
}
private boolean isAutoSaved(TestPlanNodeKey testPlanNodeKey, TestSessionState testSessionState) {
for(Interaction interaction:assessmentItem.getItemBody().findInteractions()) {
if(!(interaction instanceof ExtendedTextInteraction)) {
return false;
}
}
ItemSessionState sessionState = testSessionState.getItemSessionStates().get(testPlanNodeKey);
if(sessionState == null) {
return false;
}
Map<Identifier, ResponseData> raws = sessionState.getRawResponseDataMap();
if(raws == null || raws.isEmpty()) {
return false;
}
for(ResponseData data:raws.values()) {
if(data instanceof StringResponseData) {
StringResponseData stringData = (StringResponseData)data;
if(stringData.getResponseData() != null) {
for(String string:stringData.getResponseData()) {
if(StringHelper.containsNonWhitespace(string)) {
return true;
}
}
}
}
}
return false;
}
private boolean hasSolution() {
for(Interaction interaction:assessmentItem.getItemBody().findInteractions()) {
if(!(interaction instanceof ExtendedTextInteraction)
&& !(interaction instanceof DrawingInteraction)
&& !(interaction instanceof UploadInteraction)) {
return true;
}
}
return false;
}
private boolean hasCorrectSolution() {
for(ModalFeedback modalFeedback:assessmentItem.getModalFeedbacks()) {
Identifier outcomeIdentifier = modalFeedback.getOutcomeIdentifier();
......@@ -473,7 +520,7 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle
solutionItem.setVisible(false);
} else {
viewSolutionButton.setIconLeftCSS("o_icon o_icon_close_togglebox");
solutionItem.setVisible(true);
solutionItem.setVisible(hasSolution());
}
}
......
<div class="o_assessmentitem_wrapper clearfix">
<div id="o_assessmentitem_$r.getCId()" class="o_assessmentitem_wrapper clearfix">
<h4 class="itemTitle"><i class="o_icon $labelCssClass"> </i> $r.escapeHtml($label)</h4>
$r.render("interactions")
<div class="o_button_group o_assessmentitem_scoring_buttons">
......@@ -7,4 +7,5 @@
$r.render("save.next")
$r.render("save.back")
</div>
</div>
\ No newline at end of file
</div>
$r.mathJax("o_assessmentitem_${r.getCId()}")
\ No newline at end of file
#if(!${interactionWrapper.isItemSessionStateFinal()})
<div class="o_assessment_item_not_final o_warning">$r.translate("warning.not.submitted")</div>
<div class="o_assessment_item_not_final o_warning">$r.translate("warning.not.submitted")
#if($r.isTrue($autoSaved))<br>$r.translate("warning.not.submitted.autosave")#end</div>
#end
<div class="o_qti_item_body clearfix">$r.render("answer")</div>
......@@ -10,9 +11,13 @@
<div class="o_assessmentitem_controls"> </div>
#end
#elseif($r.visible("view.correct.solution"))
<div class="o_assessmentitem_control_view_solution">$r.render("view.solution")</div>
#else
#if($r.visible("view.solution"))
<div class="o_assessmentitem_control_view_solution">$r.render("view.solution")</div>
#end
#elseif($r.visible("view.solution"))
<div class="o_assessmentitem_controls">$r.render("view.solution")</div>
#else
<div class="o_assessmentitem_controls"> </div>
#end
#if($r.visible("view.correct.solution"))
......
......@@ -47,6 +47,7 @@ tool.unreview.all=Markierung aufheben
view.correct.solution=Korrekte L\u00F6sung ansehen
view.solution=L\u00F6sung ansehen
warning.not.submitted=Diese Frage wurde vom Benutzer nicht beantwortet
warning.not.submitted.autosave=<strong>Hinweis:</strong> Die im Antwortfeld erfassten Inhalte wurden automatisch gespeichert.
warning.no.assessment.item=Es gibt nichts zu korrigieren
waring.atleast.one=Sie m\u00FCssen mindestens eine Frage w\u00E4hlen.
warning.assessment.item.locked=Antwort ist bereit von einem anderen Benutzer gesperrt: {0}
......
......@@ -51,3 +51,4 @@ warning.assessment.item.locked=The answer is currently locked by an other user\:
warning.confirm.save=$\:confirm.save You have still uncorrected questions.
warning.no.assessment.item=There is nothing to correct.
warning.not.submitted=This question has not been answered by the user
warning.not.submitted.autosave=<strong>Note:</strong> The contents entered in the answer field were automatically saved.
......@@ -19,7 +19,7 @@ export.user.data.notReady=Der Benutzer kann den Export mit dem folgenden Link he
export.user.data.processing=Der Export ist gerade bearbeitet.
export.user.data.ready=Der Benutzer kann den Export mit dem folgenden Link herunterladen. Sie k\u00F6nnen auch ein en neuen Export erfordern.
export.user.data.ready.subject=Export von "{0}" ist fertig
export.user.data.ready.text=<p>Export von "{0}" ist fertig. Es konnte unter <a href\="{1}">{1}</a> heruntergeladen werden</p>
export.user.data.ready.text=<p>Sie haben als Benutzerverwalter in OpenOLAT f\u00FCr den Benutzer "{0}" den Export der pers\u00F6nlichen Daten durchgef\u00FChrt. Die Daten sind nun generiert und stehen dem Benutzer im pers\u00F6nlichen Bereich in OpenOLAT zur Verf\u00FCgung.</p><p>Mit folgendem Link hat der Benutzer direkten Zugriff auf den Export: <a href="{1}">{1}</a><br>Sie k\u00F6nnen diesen Link an den Benutzer weiterleiten.</p><p>Wichtig: Diese Daten sind NUR f\u00FCr den Benutzer einsehbar, nicht aber f\u00FCr andere Benutzer des Systems. Auch Sie in der Rolle des Benutzerverwalters haben keinen Zugriff auf die pers\u00F6nlichen Daten des Benutzers.</p>
feeds=Blogs und Podcasts
forums=Foren
group.memberships=Zugeh\u00F6rigkeit zu Gruppen
......
......@@ -19,7 +19,7 @@ export.user.data.notReady=The user can download the export using the following l
export.user.data.processing=The export is currently processed
export.user.data.ready=The user can download the export with the following link. You can ask for a new export too.
export.user.data.ready.subject=The export for "{0}" is ready
export.user.data.ready.text=<p>The export for "{0}" is ready. The user can use the following link to download it <a href\="{1}">{1}</a>.</p>
export.user.data.ready.text=<p>As user administrator in OpenOLAT, you have exported the personal data for the user"{0}". The data is now generated and is available to the user in the personal area of OpenOLAT.</p><p>With the following link the user has direct access to the export: <a href="{1}">{1}</a><br>You can forward this link to the user.</p><p>Important: This data can ONLY be viewed by the user, but not by other users of the system. You in the role of user administrator also have no access to the user's personal data.</p>
feeds=Blogs and podcasts
forums=Forums
group.memberships=Membership to groups
......
......@@ -10,16 +10,16 @@ disclaimer=Conditions d'utilisation
display.portrait=Image publi\u00E9e du profil
download.data=T\u00E9l\u00E9charger les donn\u00E9es
efficiency.statements=Attestations de performance
export.options=Elements \u00E0 exporter
export.options=Elements à exporter
export.start=D\u00E9marrer l'exportation
export.url=Lien vers les donn\u00E9es
export.user.data.explain=S\u00E9lectionner les \u00E9l\u00E9ments \u00E0 exporter pour cette utilisateur. L'exportation peut dur\u00E9e plusieurs heures, vous recevrez un courriel lorsqu'il sera termin\u00E9.
export.user.data.none=Vous pouvez demander un aper\u00E7u de vos donn\u00E9es sauv\u00E9es dans OpenOLAT selon l'article 15 du r\u00E8glement g\u00E9n\u00E9ral sur la protection des donn\u00E9es (RGPD) \u00E0 l'op\u00E9rateur. Ecrivez votre adresse courriel avec votre demande \u00E0 <a href\="mailto\:{0}">Support</a>.
export.user.data.explain=S\u00E9lectionner les \u00E9l\u00E9ments à exporter pour cette utilisateur. L'exportation peut dur\u00E9e plusieurs heures, vous recevrez un courriel lorsqu'il sera termin\u00E9.
export.user.data.none=Vous pouvez demander un aper\u00E7u de vos donn\u00E9es sauv\u00E9es dans OpenOLAT selon l'article 15 du r\u00E8glement g\u00E9n\u00E9ral sur la protection des donn\u00E9es (RGPD) à l'op\u00E9rateur. Ecrivez votre adresse courriel avec votre demande à <a href\="mailto\:{0}">Support</a>.
export.user.data.notReady=L'utilisateur peut t\u00E9l\u00E9charger les donn\u00E9es export\u00E9es avec le lien suivant.
export.user.data.processing=L'exportation est en cours.
export.user.data.ready=L'utilisateur peut t\u00E9l\u00E9charger les donn\u00E9es avec le lien suivant. Vous pouvez \u00E9galement d\u00E9marrer une nouvelle exportation.
export.user.data.ready.subject=Les donn\u00E9es pour "{0}" sont pr\u00EAtes.
export.user.data.ready.text=<p>Les donn\u00E9es pour l'utilisateur "{0}" sont pr\u00EAtes. L'utilisateur peut les t\u00E9l\u00E9charger en suivant le lien <a href\="{1}">{1}</a>.</p>
export.user.data.ready.text=<p>Vous avez export\u00E9 les donn\u00E9es personelles de l'utilisateur "{0}" en tant que gestionnaire des utilisateurs.</p><p>Avec le lien suivant, l'utilisateur peut t\u00E9l\u00E9charger ses donn\u00E9es: <a href\="{1}">{1}</a>.<br>Vous pouvez envoyer ce lien à l'utilisateur concern\u00E9.</p><p>Attention: ces donn\u00E9es ne peuvent \u00EAtre vues que par l'utilisateur concern\u00E9 et par aucun autre utilisateur du syst\u00E8me. Vous, en tant qu'administrateur, n'avez pas non plus acc\u00E8s à ces donn\u00E9es.</p>
feeds=Blogues et podcasts
forums=Forums
group.memberships=Participations aux groupes
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment