diff --git a/src/main/java/org/olat/course/nodes/portfolio/PortfolioCourseNodeRunController.java b/src/main/java/org/olat/course/nodes/portfolio/PortfolioCourseNodeRunController.java index 6a126d6cdab16a167f9410b667fe854d9bbe467d..88bd92cbe752908f49a912a28eb982527ecbfb7e 100644 --- a/src/main/java/org/olat/course/nodes/portfolio/PortfolioCourseNodeRunController.java +++ b/src/main/java/org/olat/course/nodes/portfolio/PortfolioCourseNodeRunController.java @@ -29,7 +29,6 @@ import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.FormLink; -import org.olat.core.gui.components.form.flexible.elements.SpacerElement; import org.olat.core.gui.components.form.flexible.elements.StaticTextElement; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; @@ -37,7 +36,6 @@ import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; -import org.olat.core.id.IdentityEnvironment; import org.olat.core.id.OLATResourceable; import org.olat.core.id.context.BusinessControl; import org.olat.core.id.context.BusinessControlFactory; @@ -46,6 +44,7 @@ import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; import org.olat.core.util.resource.OresHelper; import org.olat.course.CourseModule; +import org.olat.course.assessment.AssessmentHelper; import org.olat.course.assessment.AssessmentManager; import org.olat.course.nodes.PortfolioCourseNode; import org.olat.course.nodes.portfolio.PortfolioCourseNodeConfiguration.DeadlineType; @@ -84,6 +83,8 @@ public class PortfolioCourseNodeRunController extends FormBasicController { private FormLink newMapLink; private FormLink selectMapLink; private StaticTextElement newMapMsgEl; + private FormLayoutContainer infosContainer; + private FormLayoutContainer assessmentInfosContainer; private Formatter formatter; @@ -93,7 +94,7 @@ public class PortfolioCourseNodeRunController extends FormBasicController { public PortfolioCourseNodeRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, NodeEvaluation ne, PortfolioCourseNode courseNode) { - super(ureq, wControl); + super(ureq, wControl, "run"); this.courseNode = courseNode; this.config = courseNode.getModuleConfiguration(); @@ -115,9 +116,19 @@ public class PortfolioCourseNodeRunController extends FormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + infosContainer = FormLayoutContainer.createDefaultFormLayout("infos", getTranslator()); + formLayout.add(infosContainer); + + String assessmentPage = velocity_root + "/assessment_infos.html"; + assessmentInfosContainer = FormLayoutContainer.createCustomFormLayout("assessmentInfos", getTranslator(), assessmentPage); + assessmentInfosContainer.setVisible(false); + formLayout.add(assessmentInfosContainer); + Object text = config.get(PortfolioCourseNodeConfiguration.NODE_TEXT); String explanation = (text instanceof String) ? (String)text : ""; - uifactory.addStaticTextElement("explanation.text", explanation, flc); + if(StringHelper.containsNonWhitespace(explanation)) { + uifactory.addStaticTextElement("explanation.text", explanation, infosContainer); + } String deadlineconfig = (String)config.get(PortfolioCourseNodeConfiguration.DEADLINE_TYPE); if (!DeadlineType.none.name().equals(deadlineconfig) && deadlineconfig!=null){ @@ -130,7 +141,7 @@ public class PortfolioCourseNodeRunController extends FormBasicController { } else { deadLineInfo = getDeadlineRelativeInfo(); } - deadlineDateText = uifactory.addStaticTextElement("deadline", deadLineLabel, deadLineInfo, formLayout); + deadlineDateText = uifactory.addStaticTextElement("deadline", deadLineLabel, deadLineInfo, infosContainer); } if(template != null) { @@ -159,19 +170,19 @@ public class PortfolioCourseNodeRunController extends FormBasicController { String title = template.getTitle(); String msg = translate("map.available", new String[]{ title }); if(newMapMsgEl == null) { - newMapMsgEl = uifactory.addStaticTextElement("map.available", msg, flc); + newMapMsgEl = uifactory.addStaticTextElement("map.available", msg, infosContainer); } newMapMsgEl.setLabel(null, null); FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); buttonGroupLayout.setRootForm(mainForm); - flc.add(buttonGroupLayout); + infosContainer.add(buttonGroupLayout); if(newMapLink == null) { newMapLink = uifactory.addFormLink("map.new", buttonGroupLayout, Link.BUTTON); } } else { if(selectMapLink == null) { - selectMapLink = uifactory.addFormLink("select", "select.mymap", "select.mymap", flc, Link.LINK); + selectMapLink = uifactory.addFormLink("select", "select.mymap", "select.mymap", infosContainer, Link.LINK); } else { selectMapLink.setVisible(true); } @@ -182,33 +193,49 @@ public class PortfolioCourseNodeRunController extends FormBasicController { String copyDate = ""; if(structuredMap.getCopyDate() != null) { copyDate = formatter.formatDateAndTime(structuredMap.getCopyDate()); - uifactory.addStaticTextElement("map.copyDate", copyDate, flc); + uifactory.addStaticTextElement("map.copyDate", copyDate, infosContainer); } String returnDate = ""; if(structuredMap.getReturnDate() != null) { returnDate = formatter.formatDateAndTime(structuredMap.getReturnDate()); - uifactory.addStaticTextElement("map.returnDate", returnDate, flc); + uifactory.addStaticTextElement("map.returnDate", returnDate, infosContainer); - SpacerElement spacer = uifactory.addSpacerElement("space", flc, false); - // show rating - // create an identenv with no roles, no attributes, no locale - IdentityEnvironment ienv = new IdentityEnvironment(); - ienv.setIdentity(getIdentity()); // Fetch all score and passed and calculate score accounting for the entire course ScoreAccounting scoreAccounting = userCourseEnv.getScoreAccounting(); scoreAccounting.evaluateAll(); ScoreEvaluation scoreEval = scoreAccounting.evalCourseNode(courseNode); - Float score = scoreEval.getScore(); - if (score != null) uifactory.addStaticTextElement("map.score", String.valueOf(score), flc); - Boolean passed = scoreEval.getPassed(); - if (passed==null) uifactory.addStaticTextElement("map.not.rated.yet", "", flc); - else if (passed) uifactory.addStaticTextElement("map.passed", "", flc); - else uifactory.addStaticTextElement("map.not.passed", "", flc); - + + //score + assessmentInfosContainer.contextPut("hasScoreField", new Boolean(courseNode.hasScoreConfigured())); + if(courseNode.hasScoreConfigured()) { + Float score = scoreEval.getScore(); + Float minScore = courseNode.getMinScoreConfiguration(); + Float maxScore = courseNode.getMaxScoreConfiguration(); + assessmentInfosContainer.contextPut("scoreMin", AssessmentHelper.getRoundedScore(minScore)); + assessmentInfosContainer.contextPut("scoreMax", AssessmentHelper.getRoundedScore(maxScore)); + assessmentInfosContainer.contextPut("score", AssessmentHelper.getRoundedScore(score)); + } + + //passed + assessmentInfosContainer.contextPut("hasPassedField", new Boolean(courseNode.hasPassedConfigured())); + if(courseNode.hasPassedConfigured()) { + Boolean passed = scoreEval.getPassed(); + assessmentInfosContainer.contextPut("passed", passed); + assessmentInfosContainer.contextPut("hasPassedValue", new Boolean(passed != null)); + Float cutValue = courseNode.getCutValueConfiguration(); + assessmentInfosContainer.contextPut("passedCutValue", AssessmentHelper.getRoundedScore(cutValue)); + } + // get comment AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager(); String comment = am.getNodeComment(courseNode, getIdentity()); - if (comment != null) uifactory.addStaticTextElement("map.comment", comment, flc); + assessmentInfosContainer.contextPut("hasCommentField", new Boolean(comment != null)); + if (comment != null) { + assessmentInfosContainer.contextPut("comment", comment); + } + assessmentInfosContainer.setVisible(true); + } else { + assessmentInfosContainer.setVisible(false); } // show absolute deadline when task is taken. nothing if taken map still has a deadline configured. if (deadlineDateText != null && structuredMap.getDeadLine() != null) { diff --git a/src/main/java/org/olat/course/nodes/portfolio/_content/assessment_infos.html b/src/main/java/org/olat/course/nodes/portfolio/_content/assessment_infos.html new file mode 100644 index 0000000000000000000000000000000000000000..1258db6520d8d5180a1ad438147a54853cd7abfc --- /dev/null +++ b/src/main/java/org/olat/course/nodes/portfolio/_content/assessment_infos.html @@ -0,0 +1,78 @@ +<div class="o_course_run_scoreinfo"> + #if ($hasScoreField) + <h4>$r.translate("score.title")</h4> + <table> + <tbody> + <tr> + <td> + $r.translate("score.min"): + </td> + <td> + $scoreMin + </td> + </tr> + <tr> + <td> + $r.translate("score.max"): + </td> + <td> + $scoreMax + </td> + </tr> + <tr> + <td> + $r.translate("score.yourscore"): + </td> + <td> + #if($score) + $score + #else + <div class="o_course_run_scoreinfo_noinfo">$r.translate("score.noscore")</div> + #end + </td> + </tr> + </tbody> + </table> + #end + + #if ($hasPassedField) + <h4>$r.translate("passed.title")</h4> + <table> + <tbody> + #if ($passedCutValue) + <tr> + <td> + $r.translate("passed.cut"): + </td> + <td> + $passedCutValue + </td> + </tr> + #end + <tr> + <td> + $r.translate("passed.yourpassed"): + </td> + <td> + #if($hasPassedValue && $passed == true) + <span class="o_passed">$r.translate("map.passed")</span> + #elseif($hasPassedValue && $passed == false) + <span class="o_notpassed">$r.translate("map.not.passed")</span> + #else + <div class="o_course_run_scoreinfo_noinfo">$r.translate("map.not.rated.yet")</div> + #end + </td> + </tr> + </tbody> + </table> + #end + + #if ($hasCommentField) + <h4>$r.translate("map.comment")</h4> + #if ($comment) + $comment + #else + <div class="o_course_run_scoreinfo_noinfo">$r.translate("comment.nocomment")</div> + #end + #end +</div> \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/portfolio/_content/run.html b/src/main/java/org/olat/course/nodes/portfolio/_content/run.html new file mode 100644 index 0000000000000000000000000000000000000000..a955095c37075c178fe3524cd4e0f99983632281 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/portfolio/_content/run.html @@ -0,0 +1,2 @@ +$r.render("infos") +$r.render("assessmentInfos") \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/portfolio/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/portfolio/_i18n/LocalStrings_de.properties index 2acd55ffd7da55c5a500d2b9dbba3c71a2f4967b..31a6c074730aaa2a14eb4f1566583f0b92493703 100644 --- a/src/main/java/org/olat/course/nodes/portfolio/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/nodes/portfolio/_i18n/LocalStrings_de.properties @@ -60,4 +60,12 @@ chelp.ced_portfolio_task.deadline3=Um f chelp.ced_portfolio_task.message1=Mitteilung an Benutzer chelp.ced_portfolio_task.message2=Geben Sie hier einen Text ein, der allen Kursteilnehmern angezeigt wird, wenn sie den Kursbaustein anklicken. no.map=Dieser Benutzer hat noch keine Portfolioaufgabe abgeholt. -pane.tab.accessibility=Zugang \ No newline at end of file +pane.tab.accessibility=Zugang +score.title=$org.olat.course.nodes.ms\:score.title +score.min=$org.olat.course.nodes.ms\:score.min +score.max=$org.olat.course.nodes.ms\:score.max +score.yourscore=$org.olat.course.nodes.ms\:score.yourscore +score.noscore=$org.olat.course.nodes.ms\:score.noscore +passed.cut=$org.olat.course.nodes.ms\:passed.cut +passed.title=$org.olat.course.nodes.ms\:passed.title +passed.yourpassed=$org.olat.course.nodes.ms\:passed.yourpassed \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/portfolio/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/portfolio/_i18n/LocalStrings_en.properties index d20b5aec453272198a4ccf9c2384af655cb22b2f..4ddd9fb8ea7b035904ed0cdeb2c7384562a561cc 100644 --- a/src/main/java/org/olat/course/nodes/portfolio/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/course/nodes/portfolio/_i18n/LocalStrings_en.properties @@ -54,6 +54,14 @@ pane.tab.portfolio_config=Learning content pane.tab.portfolio_config.explanation=Configure portfolio task pane.tab.portfolio_config.title=Select or create portfolio template pane.tab.portfolio_scoring=Assessment +score.title=$org.olat.course.nodes.ms\:score.title +score.min=$org.olat.course.nodes.ms\:score.min +score.max=$org.olat.course.nodes.ms\:score.max +score.yourscore=$org.olat.course.nodes.ms\:score.yourscore +score.noscore=$org.olat.course.nodes.ms\:score.noscore +passed.cut=$org.olat.course.nodes.ms\:passed.cut +passed.title=$org.olat.course.nodes.ms\:passed.title +passed.yourpassed=$org.olat.course.nodes.ms\:passed.yourpassed select.map=Replace portfolio template select.map2=Select portfolio template select.mymap=Portfolio task collected