diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java index 747b9db60aa69ac8e16d24377306fd3b82dde3dc..bb7af6336687cb75d6ef2eb3000d13318bd27b0c 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java @@ -513,9 +513,12 @@ public class AssessmentItemEditorController extends BasicController implements A if(entries == null || entries.isEmpty()) return; String type = entries.get(0).getOLATResourceable().getResourceableTypeName(); - if(SelectionTarget.description.name().equalsIgnoreCase(type) || SelectionTarget.expert.name().equalsIgnoreCase(type)) { + if(SelectionTarget.description.name().equalsIgnoreCase(type) + || SelectionTarget.expert.name().equalsIgnoreCase(type) + || SelectionTarget.description.name().equalsIgnoreCase(type)) { activate(ureq, itemEditor); - } else if(SelectionTarget.description.name().equalsIgnoreCase(type) || SelectionTarget.score.name().equalsIgnoreCase(type)) { + } else if(SelectionTarget.attempts.name().equalsIgnoreCase(type) + || SelectionTarget.maxpoints.name().equalsIgnoreCase(type)) { activate(ureq, scoreEditor); } else if(SelectionTarget.feedback.name().equalsIgnoreCase(type)) { activate(ureq, feedbackEditor); diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentSectionEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentSectionEditorController.java index f00371e4df89901ac3ba6671bc174db7e956f7c8..742fc955a48dbd49a57a23258b99f2aa4bd014c3 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentSectionEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentSectionEditorController.java @@ -105,9 +105,10 @@ public class AssessmentSectionEditorController extends BasicController implement if(entries == null || entries.isEmpty()) return; String type = entries.get(0).getOLATResourceable().getResourceableTypeName(); - if(SelectionTarget.description.name().equalsIgnoreCase(type) || SelectionTarget.score.name().equalsIgnoreCase(type)) { + if(SelectionTarget.description.name().equalsIgnoreCase(type)) { tabbedPane.setSelectedPane(ureq, tabbedPane.indexOfTab(optionsCtrl.getInitialComponent())); - } else if(SelectionTarget.expert.name().equalsIgnoreCase(type)) { + } else if(SelectionTarget.expert.name().equalsIgnoreCase(type) + || SelectionTarget.attempts.name().equalsIgnoreCase(type)) { tabbedPane.setSelectedPane(ureq, tabbedPane.indexOfTab(expertOptionsCtrl.getInitialComponent())); } } diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java index c83a55f6da16ff17e56a13ae324e39c119df6b4a..b3f39010455b15f4e8dfd8275945f83b358417c0 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java @@ -590,6 +590,9 @@ public class AssessmentTestComposerController extends MainLayoutBasicController .createCEListFromString(OresHelper.createOLATResourceableType(target.name())); ((Activateable2)currentEditorCtrl).activate(ureq, entries, null); } + if(currentEditorCtrl != null) { + menuTree.setSelectedNode(selectedNode); + } return currentEditorCtrl != null; } return false; diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestEditorController.java index c8a206b73926fee6552ca4103ce0111bea4e0675..23e314b7d9f2754425edb15a57ccb4f3cf27d320 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestEditorController.java @@ -123,12 +123,14 @@ public class AssessmentTestEditorController extends BasicController implements A if(entries == null || entries.isEmpty()) return; String type = entries.get(0).getOLATResourceable().getResourceableTypeName(); - if(SelectionTarget.description.name().equalsIgnoreCase(type) || SelectionTarget.score.name().equalsIgnoreCase(type)) { + if(SelectionTarget.description.name().equalsIgnoreCase(type) + || SelectionTarget.maxpoints.name().equalsIgnoreCase(type)) { activate(ureq, optionsCtrl); - } else if(SelectionTarget.expert.name().equalsIgnoreCase(type) && testPartOptionsCtrl != null) { - activate(ureq, testPartOptionsCtrl); - } else if(SelectionTarget.feedback.name().equalsIgnoreCase(type) && testPartOptionsCtrl != null) { + } else if(SelectionTarget.expert.name().equalsIgnoreCase(type) + || SelectionTarget.attempts.name().equalsIgnoreCase(type)) { activate(ureq, testPartOptionsCtrl); + } else if(SelectionTarget.feedback.name().equalsIgnoreCase(type)) { + activate(ureq, feedbackCtrl); } } diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties index 2ecf967b5524a1927bccb08e2a1ae987e7e91523..fe1b86a1518b8bb0aea656fdc4cd3760f2e43108 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties @@ -240,7 +240,7 @@ table.header.feedback=Feedback table.header.identifier=Frage ID table.header.points=Punkte table.header.review=R\u00FCckblick erlauben -table.header.skipping=\u00DCberspring erlauben +table.header.skipping=\u00DCberspringen erlauben table.header.solution=L\u00F6sung anzeigen table.header.title=Titel table.header.type=Fragetyp diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/events/SelectEvent.java b/src/main/java/org/olat/ims/qti21/ui/editor/events/SelectEvent.java index a62ff48cbf196e9f2ba1adbcbac313b8e76dd7f7..83bd77428eeb9844555e4ead701d454550236afd 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/events/SelectEvent.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/events/SelectEvent.java @@ -55,7 +55,8 @@ public class SelectEvent extends Event { description, expert, - score, + attempts, + maxpoints, feedback } diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/overview/AssessmentSectionScoreCellRenderer.java b/src/main/java/org/olat/ims/qti21/ui/editor/overview/AssessmentSectionScoreCellRenderer.java index 46ac4c1398de683a64f67aae4323fcf879fd94cd..e54a2c594949d531a1b6a5546b2b6587334f800c 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/overview/AssessmentSectionScoreCellRenderer.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/overview/AssessmentSectionScoreCellRenderer.java @@ -29,6 +29,7 @@ import org.olat.core.gui.translator.Translator; import org.olat.modules.assessment.ui.ScoreCellRenderer; import uk.ac.ed.ph.jqtiplus.node.test.AssessmentSection; +import uk.ac.ed.ph.jqtiplus.node.test.TestPart; /** * @@ -50,7 +51,7 @@ public class AssessmentSectionScoreCellRenderer implements FlexiCellRenderer { public void render(Renderer renderer, StringOutput target, Object cellValue, int row, FlexiTableComponent source, URLBuilder ubu, Translator translator) { ControlObjectRow object = (ControlObjectRow)source.getFlexiTableElement().getTableDataModel().getObject(row); - if(object.getControlObject() instanceof AssessmentSection) { + if(object.getControlObject() instanceof AssessmentSection || object.getControlObject() instanceof TestPart) { scoreRenderer.render(renderer, target, cellValue, row, source, ubu, translator); } else { actionRenderer.render(renderer, target, cellValue, row, source, ubu, translator); diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/overview/AssessmentTestOverviewConfigurationController.java b/src/main/java/org/olat/ims/qti21/ui/editor/overview/AssessmentTestOverviewConfigurationController.java index 7e920e555671f22b3c12e5dc7636200d1bae557c..632d8126b4386dd588ff451e30aa9da96807cf07 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/overview/AssessmentTestOverviewConfigurationController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/overview/AssessmentTestOverviewConfigurationController.java @@ -166,25 +166,39 @@ public class AssessmentTestOverviewConfigurationController extends FormBasicCont private void initTableForm(FormItemContainer formLayout, UserRequest ureq) { FlexiTableColumnModel tableColumnModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); - DefaultFlexiColumnModel titleCol = new DefaultFlexiColumnModel(PartCols.title, - SelectionTarget.description.name(), new HierarchicalPartCellRenderer()); + // title + DefaultFlexiColumnModel titleCol = new DefaultFlexiColumnModel(PartCols.title, SelectionTarget.description.name(), new HierarchicalPartCellRenderer()); titleCol.setAlwaysVisible(true); tableColumnModel.addFlexiColumnModel(titleCol); - tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(PartCols.maxScore, - new AssessmentSectionScoreCellRenderer(SelectionTarget.score.name()))); + // score + DefaultFlexiColumnModel scoreCol = new DefaultFlexiColumnModel(PartCols.maxScore, SelectionTarget.maxpoints.name()); + scoreCol.setCellRenderer(new AssessmentSectionScoreCellRenderer(SelectionTarget.maxpoints.name())); + tableColumnModel.addFlexiColumnModel(scoreCol); + // max attempts tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(PartCols.attempts, - SelectionTarget.expert.name(), new MaxAttemptsCellRenderer(getTranslator()))); - tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(PartCols.skipping, - new TestAndSectionCellRenderer(SelectionTarget.expert.name(), new OptionCellRenderer(getTranslator())))); - tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(PartCols.comment, - new TestAndSectionCellRenderer(SelectionTarget.expert.name(), new OptionCellRenderer(getTranslator())))); - tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(PartCols.review, - new TestAndSectionCellRenderer(SelectionTarget.expert.name(), new OptionCellRenderer(getTranslator())))); - tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(PartCols.solution, - new TestAndSectionCellRenderer(SelectionTarget.expert.name(), new OptionCellRenderer(getTranslator())))); + SelectionTarget.attempts.name(), new MaxAttemptsCellRenderer(getTranslator()))); + // skipping allowed + DefaultFlexiColumnModel skippingCol = new DefaultFlexiColumnModel(PartCols.skipping, SelectionTarget.expert.name()); + skippingCol.setCellRenderer(new TestAndSectionCellRenderer(SelectionTarget.expert.name(), new OptionCellRenderer(getTranslator()))); + tableColumnModel.addFlexiColumnModel(skippingCol); + // comment allowed + DefaultFlexiColumnModel commentCol = new DefaultFlexiColumnModel(PartCols.comment, SelectionTarget.expert.name()); + commentCol.setCellRenderer(new TestAndSectionCellRenderer(SelectionTarget.expert.name(), new OptionCellRenderer(getTranslator()))); + tableColumnModel.addFlexiColumnModel(commentCol); + // review allowed + DefaultFlexiColumnModel reviewCol = new DefaultFlexiColumnModel(PartCols.review, SelectionTarget.expert.name()); + reviewCol.setCellRenderer(new TestAndSectionCellRenderer(SelectionTarget.expert.name(), new OptionCellRenderer(getTranslator()))); + tableColumnModel.addFlexiColumnModel(reviewCol); + // solution + DefaultFlexiColumnModel solutionCol = new DefaultFlexiColumnModel(PartCols.solution, SelectionTarget.expert.name()); + solutionCol.setCellRenderer(new TestAndSectionCellRenderer(SelectionTarget.expert.name(), new OptionCellRenderer(getTranslator()))); + tableColumnModel.addFlexiColumnModel(solutionCol); + // type tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, PartCols.type, new QuestionTypeFlexiCellRenderer(getTranslator()))); tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, PartCols.identifier)); - tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, PartCols.feedback, SelectionTarget.feedback.name())); + DefaultFlexiColumnModel feedbackCol = new DefaultFlexiColumnModel(PartCols.feedback, SelectionTarget.feedback.name(), new YesNoCellRenderer(getTranslator())); + feedbackCol.setDefaultVisible(false); + tableColumnModel.addFlexiColumnModel(feedbackCol); tableModel = new AssessmentTestOverviewDataModel(tableColumnModel); @@ -222,10 +236,23 @@ public class AssessmentTestOverviewConfigurationController extends FormBasicCont } private void loadModel(TestPart part, int pos, List<ControlObjectRow> rows) { - rows.add(ControlObjectRow.valueOf(part, pos)); + ControlObjectRow partRow = ControlObjectRow.valueOf(part, pos); + rows.add(partRow); + + boolean someMaxScore = false; + DoubleAdder atomicMaxScore = new DoubleAdder(); + List<AssessmentSection> sections = part.getAssessmentSections(); for(AssessmentSection section:sections) { - loadModel(section, rows); + Double maxScore = loadModel(section, rows); + if(maxScore != null) { + someMaxScore = true; + atomicMaxScore.add(maxScore.doubleValue()); + } + } + + if(someMaxScore) { + partRow.setMaxScore(Double.valueOf(atomicMaxScore.sum())); } } diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/overview/YesNoCellRenderer.java b/src/main/java/org/olat/ims/qti21/ui/editor/overview/YesNoCellRenderer.java new file mode 100644 index 0000000000000000000000000000000000000000..e741689f073c749891d05581a4c978633aad8fd0 --- /dev/null +++ b/src/main/java/org/olat/ims/qti21/ui/editor/overview/YesNoCellRenderer.java @@ -0,0 +1,55 @@ +/** + * <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.editor.overview; + +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent; +import org.olat.core.gui.render.Renderer; +import org.olat.core.gui.render.StringOutput; +import org.olat.core.gui.render.URLBuilder; +import org.olat.core.gui.translator.Translator; + +/** + * + * Initial date: 18 janv. 2019<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class YesNoCellRenderer implements FlexiCellRenderer { + + private final Translator translator; + + public YesNoCellRenderer(Translator translator) { + this.translator = translator; + } + + @Override + public void render(Renderer renderer, StringOutput target, Object cellValue, int row, FlexiTableComponent source, + URLBuilder ubu, Translator trans) { + if(cellValue instanceof Boolean) { + Boolean bool = (Boolean)cellValue; + if(bool.booleanValue()) { + target.append(translator.translate("yes")); + } else { + target.append(translator.translate("no")); + } + } + } +}