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

OO-3770: better linking to items, sections and parts

parent 73940db5
No related branches found
No related tags found
No related merge requests found
Showing
with 120 additions and 27 deletions
......@@ -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);
......
......@@ -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()));
}
}
......
......@@ -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;
......
......@@ -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);
}
}
......
......@@ -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
......
......@@ -55,7 +55,8 @@ public class SelectEvent extends Event {
description,
expert,
score,
attempts,
maxpoints,
feedback
}
......
......@@ -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);
......
......@@ -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()));
}
}
......
/**
* <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"));
}
}
}
}
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