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

OO-2610: allow no correct answers, better update of score label after changes,...

OO-2610: allow no correct answers, better update of score label after changes, better read only mode like FIB
parent 666cd7f3
No related branches found
No related tags found
No related merge requests found
......@@ -52,6 +52,7 @@ import uk.ac.ed.ph.jqtiplus.node.expression.general.BaseValue;
import uk.ac.ed.ph.jqtiplus.node.expression.general.Correct;
import uk.ac.ed.ph.jqtiplus.node.expression.general.MapResponse;
import uk.ac.ed.ph.jqtiplus.node.expression.general.Variable;
import uk.ac.ed.ph.jqtiplus.node.expression.operator.IsNull;
import uk.ac.ed.ph.jqtiplus.node.expression.operator.Match;
import uk.ac.ed.ph.jqtiplus.node.expression.operator.Sum;
import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem;
......@@ -313,18 +314,7 @@ public class HottextAssessmentItemBuilder extends ChoiceAssessmentItemBuilder {
rule.setResponseIf(responseIf);
{// match the correct answers
Match match = new Match(responseIf);
responseIf.getExpressions().add(match);
Variable scoreVar = new Variable(match);
ComplexReferenceIdentifier choiceResponseIdentifier
= ComplexReferenceIdentifier.parseString(hottextInteraction.getResponseIdentifier().toString());
scoreVar.setIdentifier(choiceResponseIdentifier);
match.getExpressions().add(scoreVar);
Correct correct = new Correct(match);
correct.setIdentifier(choiceResponseIdentifier);
match.getExpressions().add(correct);
matchCorrectAnswers(responseIf);
}
{//outcome score
......@@ -402,18 +392,7 @@ public class HottextAssessmentItemBuilder extends ChoiceAssessmentItemBuilder {
rule.setResponseIf(responseIf);
{// match the correct answers
Match match = new Match(responseIf);
responseIf.getExpressions().add(match);
Variable scoreVar = new Variable(match);
ComplexReferenceIdentifier choiceResponseIdentifier
= ComplexReferenceIdentifier.parseString(hottextInteraction.getResponseIdentifier().toString());
scoreVar.setIdentifier(choiceResponseIdentifier);
match.getExpressions().add(scoreVar);
Correct correct = new Correct(match);
correct.setIdentifier(choiceResponseIdentifier);
match.getExpressions().add(correct);
matchCorrectAnswers(responseIf);
}
{//outcome score
......@@ -475,4 +454,34 @@ public class HottextAssessmentItemBuilder extends ChoiceAssessmentItemBuilder {
incorrectOutcomeValue.setExpression(incorrectValue);
}
}
/**
* Match the correct answer or, if there isn't not a single correct answer,
* match null.
*
* @param responseIf
*/
private void matchCorrectAnswers(ResponseIf responseIf) {
if(correctAnswers.isEmpty()) {
IsNull isNull = new IsNull(responseIf);
responseIf.getExpressions().add(isNull);
Variable variable = new Variable(isNull);
variable.setIdentifier(ComplexReferenceIdentifier.parseString(responseIdentifier.toString()));
isNull.getExpressions().add(variable);
} else {
Match match = new Match(responseIf);
responseIf.getExpressions().add(match);
Variable scoreVar = new Variable(match);
ComplexReferenceIdentifier choiceResponseIdentifier
= ComplexReferenceIdentifier.parseString(hottextInteraction.getResponseIdentifier().toString());
scoreVar.setIdentifier(choiceResponseIdentifier);
match.getExpressions().add(scoreVar);
Correct correct = new Correct(match);
correct.setIdentifier(choiceResponseIdentifier);
match.getExpressions().add(correct);
}
}
}
......@@ -137,6 +137,8 @@ public class ChoiceScoreController extends AssessmentItemRefEditorController imp
ChoiceWrapper wrapper = getChoiceWrapper(choice);
if(wrapper == null) {
wrappers.add(createChoiceWrapper(choice));
} else {
wrapper.setChoice(choice);
}
}
......@@ -227,27 +229,14 @@ public class ChoiceScoreController extends AssessmentItemRefEditorController imp
public final class ChoiceWrapper {
private final String summary;
private final Choice choice;
private String summary;
private Choice choice;
private final TextElement pointsEl;
public ChoiceWrapper(Choice choice, TextElement pointsEl) {
this.choice = choice;
setChoice(choice);
this.pointsEl = pointsEl;
pointsEl.setUserObject(this);
if(choice instanceof SimpleChoice) {
String answer = new AssessmentHtmlBuilder().flowStaticString(((SimpleChoice)choice).getFlowStatics());
answer = FilterFactory.getHtmlTagAndDescapingFilter().filter(answer);
answer = answer.trim();
summary = Formatter.truncate(answer, 128);
} else if(choice instanceof Hottext) {
String answer = new AssessmentHtmlBuilder().inlineStaticString(((Hottext)choice).getInlineStatics());
answer = FilterFactory.getHtmlTagAndDescapingFilter().filter(answer);
answer = answer.trim();
summary = Formatter.truncate(answer, 128);
} else {
summary = "";
}
}
public boolean isCorrect() {
......@@ -265,5 +254,22 @@ public class ChoiceScoreController extends AssessmentItemRefEditorController imp
public Choice getChoice() {
return choice;
}
public void setChoice(Choice choice) {
this.choice = choice;
if(choice instanceof SimpleChoice) {
String answer = new AssessmentHtmlBuilder().flowStaticString(((SimpleChoice)choice).getFlowStatics());
answer = FilterFactory.getHtmlTagAndDescapingFilter().filter(answer);
answer = answer.trim();
summary = Formatter.truncate(answer, 128);
} else if(choice instanceof Hottext) {
String answer = new AssessmentHtmlBuilder().inlineStaticString(((Hottext)choice).getInlineStatics());
answer = FilterFactory.getHtmlTagAndDescapingFilter().filter(answer);
answer = answer.trim();
summary = Formatter.truncate(answer, 128);
} else {
summary = "";
}
}
}
}
......@@ -87,10 +87,10 @@ public class HottextEditorController extends FormBasicController {
textEl = uifactory.addRichTextElementForQTI21("desc", "form.imd.descr", question, 16, -1, itemContainer,
formLayout, ureq.getUserSession(), getWindowControl());
textEl.addActionListener(FormEvent.ONCLICK);
textEl.setEnabled(!restrictedEdit);
RichTextConfiguration richTextConfig = textEl.getEditorConfiguration();
richTextConfig.enableQTITools(false, false, true);
richTextConfig.setAdditionalConfiguration(new CorrectAnswersConfiguration());
richTextConfig.setReadOnly(restrictedEdit);
// Submit Button
FormLayoutContainer buttonsContainer = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
......
......@@ -14,7 +14,7 @@
author : 'frentix GmbH',
authorurl : 'http://www.frentix.com',
infourl : 'http://www.frentix.com',
version : '1.1.0'
version : '1.1.1'
};
},
......@@ -237,10 +237,12 @@
"contenteditable": "false"
});
var inputHolder = new tinymce.html.Node('input', 1);
var readonly = ed.getParam("readonly");
var editable = readonly == "1" ? "false" : "true";
var inputHolder = new tinymce.html.Node('input', 1);
inputHolder.attr({
"contenteditable": "true",
"contenteditable": editable,
"name" : "hottext",
"value": identifier,
"type" : "checkbox"
......@@ -248,10 +250,13 @@
if(correct) {
inputHolder.attr({ "checked": "checked" });
}
if(editable == "false") {
inputHolder.attr({ "disabled": "disabled" });
}
placeholder.append(inputHolder);
var contentholder = new tinymce.html.Node('span', 1);
contentholder.attr({ "contenteditable": "true" });
contentholder.attr({ "contenteditable": editable });
var textNode = new tinymce.html.Node('#text', 3);
textNode.raw = true;
textNode.value = content;
......
(function(){tinymce.create("org.olat.ims.qti21.ui.editor",{getInfo:function(){return{longname:"OpenOLATQTI",author:"frentix GmbH",authorurl:"http://www.frentix.com",infourl:"http://www.frentix.com",version:"1.1.0"}},createControl:function(b,a){return null},init:function(e,d){var c=e.$,s=e.selection;var t,q;var g;var k,l;function o(){if(t){return t}var u=o_getMainWin();if(u){t=jQuery(document).ooTranslator().getTranslator(u.o_info.locale,"org.olat.ims.qti21.ui.editor")}else{t={translate:function(v){return v}}}return t}function b(){if(q){return q}var u=o_getMainWin();if(u){q=jQuery(document).ooTranslator().getTranslator(u.o_info.locale,"org.olat.core")}else{q={translate:function(v){return v}}}return q}function i(u){h(u,"string")}function n(u){h(u,"float")}function h(x,A){var v=false;var y=null;var C;if(typeof k!="undefined"){C=jQuery(k).attr("data-qti-response-identifier")}else{var u=1;y=e.selection.getContent({format:"text"});tinymce.each(e.dom.select("img[data-qti]"),function(E){var D=jQuery(E).attr("data-qti-response-identifier");if(D.lastIndexOf("RESPONSE_",0)==0){var F=parseInt(D.substring(9,D.length));if(F>u){u=F}}});var C="RESPONSE_"+(u+1);var z=f(C,"textentryinteraction",A);var w=new tinymce.html.Serializer().serialize(z);e.insertContent(w);v=true}var B=e.getParam("ffxhrevent");o_ffXHREvent(B.formNam,B.dispIdField,B.dispId,B.eventIdField,2,false,false,false,"cmd","gapentry","responseIdentifier",C,"newEntry",v,"selectedText",y,"gapType",A)}function m(){function u(){return Math.floor((1+Math.random())*65536).toString(16).substring(1)}return u()+u()+u()+u()+u()+u()+u()}function a(y){var C;if(typeof l!="undefined"){C=jQuery(l).data("data-identifier")}else{var u=1;var v=e.selection.getContent({format:"text"});var B=false;if(v==null||v.length==0){v="text";B=true}var z="ht"+m();var A=r(z,v,false,"hottext");var w=new tinymce.html.Serializer().serialize(A);e.insertContent(w);if(B){var x=e.dom.select("span[data-qti-identifier="+z+"] span[contenteditable=true]");e.selection.select(x[0],true)}jQuery("span.hottext[data-qti-identifier='"+z+"'] input",e.getBody()).each(function(D,E){p(E)})}}function p(u){jQuery(u).click(function(){var v=e.getParam("ffxhrevent");var w=jQuery(u).parent("span.hottext").data("qti-identifier");o_ffXHRNFEvent(v.formNam,v.dispIdField,v.dispId,v.eventIdField,2,"cmd","hottext","identifier",w,"correct",u.checked);e.setDirty(true)})}e.addButton("olatqtifibtext",{title:o().translate("new.fib"),icon:"gaptext",stateSelector:["img[data-qti-gap-type=string]","span[data-qti-gap-type=string]"],onclick:i});e.addButton("olatqtifibnumerical",{title:o().translate("new.fib")+" Numerical",icon:"gapnumerical",stateSelector:["img[data-qti-gap-type=float]","span[data-qti-gap-type=float]"],onclick:n});e.addButton("olatqtihottext",{title:o().translate("new.hottext"),icon:"hottext",stateSelector:["span[data-qti=hottext]"],onclick:a});e.addButton("editgap",{title:"edit",icon:"edit",onclick:h});e.addMenuItem("olatqtifibtext",{text:o().translate("new.fib"),icon:"gapnumerical",stateSelector:["img[data-qti-gap-type=string]","span[data-qti-gap-type=string]"],onclick:n});e.addMenuItem("olatqtifibnumerical",{text:o().translate("new.fib.numerical")+" Numerical",icon:"gaptext",stateSelector:["img[data-qti-gap-type=float]","span[data-qti-gap-type=float]"],onclick:i});e.addMenuItem("olatqtihottext",{text:o().translate("new.hottext"),icon:"hottext",stateSelector:["span[data-qti=hottext]"],onclick:a});e.on("NodeChange",function(u){if(k&&k.id!=u.element.src){k=undefined}if(l&&l.id!=u.element.src){l=undefined}if(e.dom.is(u.element,"img[data-qti]")){k=u.element}else{if(jQuery(u.element).parent("span.hottext").size()>0){l=u.element}}});function f(w,v,u){var x=new tinymce.html.Node("img",1);x.attr({width:"32",height:"16",src:tinymce.Env.transparentSrc,"data-qti":v,"data-qti-response-identifier":w,"data-qti-gap-type":u,"data-mce-placeholder":"","data-mce-resize":"false","data-textentryinteraction":"empty","class":"mce-shim "+v});return x}function r(x,y,w,u){var A=new tinymce.html.Node("span",1);A.attr({"data-qti":u,"data-qti-identifier":x,"class":u,contenteditable:"false"});var B=new tinymce.html.Node("input",1);B.attr({contenteditable:"true",name:"hottext",value:x,type:"checkbox"});if(w){B.attr({checked:"checked"})}A.append(B);var v=new tinymce.html.Node("span",1);v.attr({contenteditable:"true"});var z=new tinymce.html.Node("#text",3);z.raw=true;z.value=y;v.append(z);A.append(v);return A}function j(v){var u="";var x=new tinymce.dom.TreeWalker(v);var w;while((w=x.next())){if(w.type==3){if(u.length>0){u+=" "}u+=w.value}else{if(w.nodeType==3){if(u.length>0){u+=" "}u+=w.nodeValue}}}return u}e.on("init",function(){if(e.settings.content_css!==false){e.dom.loadCSS(d+"/css/content.css")}jQuery("img.textentryinteraction",e.getBody()).each(function(u,v){var w=v;jQuery(w).click(function(){var y=e.getParam("ffxhrevent");var x=jQuery(w).attr("data-qti-response-identifier");o_ffXHREvent(y.formNam,y.dispIdField,y.dispId,y.eventIdField,2,false,false,false,"cmd","gapentry","responseIdentifier",x)})});jQuery("span.hottext input",e.getBody()).each(function(u,v){p(v)})});e.on("preInit",function(){e.parser.addNodeFilter("textentryinteraction,hottext",function(u){var x=u.length,v,C,y;while(x--){v=u[x];if(v.name=="textentryinteraction"){var E=v.attr("responseidentifier");var D=v.attr("openolattype");if(typeof D==="undefined"){D="string"}var C=f(E,"textentryinteraction",D);v.replace(C)}else{if(v.name=="hottext"){var B=v.attr("identifier");var w=e.getParam("correctHottexts");var A=jQuery.inArray(B,w)>=0;var z=j(v);var C=r(B,z,A,"hottext","hottext");v.replace(C)}}}})});e.on("PreProcess",function(u){tinymce.each(e.dom.select("img[data-qti=textentryinteraction]"),function(w){var v=jQuery(w).attr("data-qti-response-identifier");var x=e.dom.create("textEntryInteraction",{responseIdentifier:v});e.dom.replace(x,w,false)});tinymce.each(e.dom.select("span[data-qti=hottext]"),function(w){var v=jQuery(w).data("qti-identifier");var x=e.dom.create("hottext",{identifier:v});var y=jQuery('span[contenteditable="true"]',w).html();x.textContent=y;e.dom.replace(x,w,false)})})}});tinymce.PluginManager.add("olatqti",org.olat.ims.qti21.ui.editor)})();
\ No newline at end of file
(function(){tinymce.create("org.olat.ims.qti21.ui.editor",{getInfo:function(){return{longname:"OpenOLATQTI",author:"frentix GmbH",authorurl:"http://www.frentix.com",infourl:"http://www.frentix.com",version:"1.1.1"}},createControl:function(b,a){return null},init:function(e,d){var c=e.$,s=e.selection;var t,q;var g;var k,l;function o(){if(t){return t}var u=o_getMainWin();if(u){t=jQuery(document).ooTranslator().getTranslator(u.o_info.locale,"org.olat.ims.qti21.ui.editor")}else{t={translate:function(v){return v}}}return t}function b(){if(q){return q}var u=o_getMainWin();if(u){q=jQuery(document).ooTranslator().getTranslator(u.o_info.locale,"org.olat.core")}else{q={translate:function(v){return v}}}return q}function i(u){h(u,"string")}function n(u){h(u,"float")}function h(x,A){var v=false;var y=null;var C;if(typeof k!="undefined"){C=jQuery(k).attr("data-qti-response-identifier")}else{var u=1;y=e.selection.getContent({format:"text"});tinymce.each(e.dom.select("img[data-qti]"),function(E){var D=jQuery(E).attr("data-qti-response-identifier");if(D.lastIndexOf("RESPONSE_",0)==0){var F=parseInt(D.substring(9,D.length));if(F>u){u=F}}});var C="RESPONSE_"+(u+1);var z=f(C,"textentryinteraction",A);var w=new tinymce.html.Serializer().serialize(z);e.insertContent(w);v=true}var B=e.getParam("ffxhrevent");o_ffXHREvent(B.formNam,B.dispIdField,B.dispId,B.eventIdField,2,false,false,false,"cmd","gapentry","responseIdentifier",C,"newEntry",v,"selectedText",y,"gapType",A)}function m(){function u(){return Math.floor((1+Math.random())*65536).toString(16).substring(1)}return u()+u()+u()+u()+u()+u()+u()}function a(y){var C;if(typeof l!="undefined"){C=jQuery(l).data("data-identifier")}else{var u=1;var v=e.selection.getContent({format:"text"});var B=false;if(v==null||v.length==0){v="text";B=true}var z="ht"+m();var A=r(z,v,false,"hottext");var w=new tinymce.html.Serializer().serialize(A);e.insertContent(w);if(B){var x=e.dom.select("span[data-qti-identifier="+z+"] span[contenteditable=true]");e.selection.select(x[0],true)}jQuery("span.hottext[data-qti-identifier='"+z+"'] input",e.getBody()).each(function(D,E){p(E)})}}function p(u){jQuery(u).click(function(){var v=e.getParam("ffxhrevent");var w=jQuery(u).parent("span.hottext").data("qti-identifier");o_ffXHRNFEvent(v.formNam,v.dispIdField,v.dispId,v.eventIdField,2,"cmd","hottext","identifier",w,"correct",u.checked);e.setDirty(true)})}e.addButton("olatqtifibtext",{title:o().translate("new.fib"),icon:"gaptext",stateSelector:["img[data-qti-gap-type=string]","span[data-qti-gap-type=string]"],onclick:i});e.addButton("olatqtifibnumerical",{title:o().translate("new.fib")+" Numerical",icon:"gapnumerical",stateSelector:["img[data-qti-gap-type=float]","span[data-qti-gap-type=float]"],onclick:n});e.addButton("olatqtihottext",{title:o().translate("new.hottext"),icon:"hottext",stateSelector:["span[data-qti=hottext]"],onclick:a});e.addButton("editgap",{title:"edit",icon:"edit",onclick:h});e.addMenuItem("olatqtifibtext",{text:o().translate("new.fib"),icon:"gapnumerical",stateSelector:["img[data-qti-gap-type=string]","span[data-qti-gap-type=string]"],onclick:n});e.addMenuItem("olatqtifibnumerical",{text:o().translate("new.fib.numerical")+" Numerical",icon:"gaptext",stateSelector:["img[data-qti-gap-type=float]","span[data-qti-gap-type=float]"],onclick:i});e.addMenuItem("olatqtihottext",{text:o().translate("new.hottext"),icon:"hottext",stateSelector:["span[data-qti=hottext]"],onclick:a});e.on("NodeChange",function(u){if(k&&k.id!=u.element.src){k=undefined}if(l&&l.id!=u.element.src){l=undefined}if(e.dom.is(u.element,"img[data-qti]")){k=u.element}else{if(jQuery(u.element).parent("span.hottext").size()>0){l=u.element}}});function f(w,v,u){var x=new tinymce.html.Node("img",1);x.attr({width:"32",height:"16",src:tinymce.Env.transparentSrc,"data-qti":v,"data-qti-response-identifier":w,"data-qti-gap-type":u,"data-mce-placeholder":"","data-mce-resize":"false","data-textentryinteraction":"empty","class":"mce-shim "+v});return x}function r(y,x,z,C){var B=new tinymce.html.Node("span",1);B.attr({"data-qti":C,"data-qti-identifier":y,"class":C,contenteditable:"false"});var w=e.getParam("readonly");var u=w=="1"?"false":"true";var D=new tinymce.html.Node("input",1);D.attr({contenteditable:u,name:"hottext",value:y,type:"checkbox"});if(z){D.attr({checked:"checked"})}if(u=="false"){D.attr({disabled:"disabled"})}B.append(D);var A=new tinymce.html.Node("span",1);A.attr({contenteditable:u});var v=new tinymce.html.Node("#text",3);v.raw=true;v.value=x;A.append(v);B.append(A);return B}function j(v){var u="";var x=new tinymce.dom.TreeWalker(v);var w;while((w=x.next())){if(w.type==3){if(u.length>0){u+=" "}u+=w.value}else{if(w.nodeType==3){if(u.length>0){u+=" "}u+=w.nodeValue}}}return u}e.on("init",function(){if(e.settings.content_css!==false){e.dom.loadCSS(d+"/css/content.css")}jQuery("img.textentryinteraction",e.getBody()).each(function(u,v){var w=v;jQuery(w).click(function(){var y=e.getParam("ffxhrevent");var x=jQuery(w).attr("data-qti-response-identifier");o_ffXHREvent(y.formNam,y.dispIdField,y.dispId,y.eventIdField,2,false,false,false,"cmd","gapentry","responseIdentifier",x)})});jQuery("span.hottext input",e.getBody()).each(function(u,v){p(v)})});e.on("preInit",function(){e.parser.addNodeFilter("textentryinteraction,hottext",function(u){var x=u.length,v,C,y;while(x--){v=u[x];if(v.name=="textentryinteraction"){var E=v.attr("responseidentifier");var D=v.attr("openolattype");if(typeof D==="undefined"){D="string"}var C=f(E,"textentryinteraction",D);v.replace(C)}else{if(v.name=="hottext"){var B=v.attr("identifier");var w=e.getParam("correctHottexts");var A=jQuery.inArray(B,w)>=0;var z=j(v);var C=r(B,z,A,"hottext","hottext");v.replace(C)}}}})});e.on("PreProcess",function(u){tinymce.each(e.dom.select("img[data-qti=textentryinteraction]"),function(w){var v=jQuery(w).attr("data-qti-response-identifier");var x=e.dom.create("textEntryInteraction",{responseIdentifier:v});e.dom.replace(x,w,false)});tinymce.each(e.dom.select("span[data-qti=hottext]"),function(w){var v=jQuery(w).data("qti-identifier");var x=e.dom.create("hottext",{identifier:v});var y=jQuery('span[contenteditable="true"]',w).html();x.textContent=y;e.dom.replace(x,w,false)})})}});tinymce.PluginManager.add("olatqti",org.olat.ims.qti21.ui.editor)})();
\ No newline at end of file
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