/**
* <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.course.assessment.ui.mode;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
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.DateChooser;
import org.olat.core.gui.components.form.flexible.elements.FormLink;
import org.olat.core.gui.components.form.flexible.elements.IntegerElement;
import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
import org.olat.core.gui.components.form.flexible.elements.RichTextElement;
import org.olat.core.gui.components.form.flexible.elements.SingleSelection;
import org.olat.core.gui.components.form.flexible.elements.StaticTextElement;
import org.olat.core.gui.components.form.flexible.elements.TextElement;
import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
import org.olat.core.gui.components.form.flexible.impl.FormEvent;
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.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
import org.olat.core.gui.control.generic.modal.DialogBoxController;
import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
import org.olat.core.id.OLATResourceable;
import org.olat.core.util.StringHelper;
import org.olat.core.util.resource.OresHelper;
import org.olat.course.CourseFactory;
import org.olat.course.ICourse;
import org.olat.course.assessment.AssessmentMode;
import org.olat.course.assessment.AssessmentMode.Status;
import org.olat.course.assessment.AssessmentMode.Target;
import org.olat.course.assessment.AssessmentModeCoordinationService;
import org.olat.course.assessment.AssessmentModeManager;
import org.olat.course.assessment.AssessmentModeToArea;
import org.olat.course.assessment.AssessmentModeToGroup;
import org.olat.course.condition.AreaSelectionController;
import org.olat.course.condition.GroupSelectionController;
import org.olat.course.groupsandrights.CourseGroupManager;
import org.olat.course.nodes.CourseNode;
import org.olat.course.tree.CourseEditorTreeModel;
import org.olat.group.BusinessGroup;
import org.olat.group.BusinessGroupService;
import org.olat.group.area.BGArea;
import org.olat.group.area.BGAreaManager;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* Initial date: 12.12.2014<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class AssessmentModeEditController extends FormBasicController {
private static final String[] onKeys = new String[]{ "on" };
private static final String[] onValues = new String[]{ "" };
private static final String[] startModeKeys = new String[] { "automatic", "manual" };
private SingleSelection targetEl, startModeEl;
private IntegerElement leadTimeEl, followupTimeEl;
private DateChooser beginEl, endEl;
private StaticTextElement startElementEl;
private FormLink chooseGroupsButton, chooseAreasButton, chooseStartElementButton, chooseElementsButton;
private TextElement nameEl, ipListEl, safeExamBrowserKeyEl;
private RichTextElement descriptionEl, safeExamBrowserHintEl;
private FormLayoutContainer chooseGroupsCont, chooseElementsCont;
private MultipleSelectionElement ipsEl, safeExamBrowserEl, forCoachEl, courseElementsRestrictionEl;
private CloseableModalController cmc;
private DialogBoxController confirmCtrl;
private AreaSelectionController areaChooseCtrl;
private GroupSelectionController groupChooseCtrl;
private ChooseElementsController chooseElementsCtrl;
private ChooseStartElementController chooseStartElementCtrl;
private List<Long> areaKeys;
private List<String> areaNames;
private List<Long> groupKeys;
private List<String> groupNames;
private List<String> elementKeys;
private List<String> elementNames;
private String startElementKey;
private AssessmentMode assessmentMode;
private final OLATResourceable courseOres;
@Autowired
private BGAreaManager areaMgr;
@Autowired
private AssessmentModeManager assessmentModeMgr;
@Autowired
private AssessmentModeCoordinationService modeCoordinationService;
@Autowired
private BusinessGroupService businessGroupService;
public AssessmentModeEditController(UserRequest ureq, WindowControl wControl,
OLATResourceable courseOres, AssessmentMode assessmentMode) {
super(ureq, wControl);
this.courseOres = OresHelper.clone(courseOres);
if(assessmentMode.getKey() == null) {
this.assessmentMode = assessmentMode;
} else {
this.assessmentMode = assessmentModeMgr.getAssessmentModeById(assessmentMode.getKey());
}
initForm(ureq);
}
@Override
protected void doDispose() {
//
}
@Override
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
formLayout.setElementCssClass("o_sel_assessment_mode_edit_form");
setFormContextHelp("Assessment mode");
if(StringHelper.containsNonWhitespace(assessmentMode.getName())) {
setFormTitle("form.mode.title", new String[]{ assessmentMode.getName() });
} else {
setFormTitle("form.mode.title.add");
}
setFormDescription("form.mode.description");
ICourse course = CourseFactory.loadCourse(courseOres);
if(StringHelper.containsNonWhitespace(assessmentMode.getStartElement())) {
CourseNode startElement = course.getRunStructure().getNode(assessmentMode.getStartElement());
if(startElement == null) {
setFormWarning("warning.missing.start.element");
}
}
if(StringHelper.containsNonWhitespace(assessmentMode.getElementList())) {
String elements = assessmentMode.getElementList();
for(String element:elements.split(",")) {
CourseNode node = course.getRunStructure().getNode(element);
if(node == null) {
setFormWarning("warning.missing.element");
}
}
}
Status status = assessmentMode.getStatus();
String name = assessmentMode.getName();
nameEl = uifactory.addTextElement("mode.name", "mode.name", 255, name, formLayout);
nameEl.setElementCssClass("o_sel_assessment_mode_name");
nameEl.setMandatory(true);
nameEl.setEnabled(status != Status.followup && status != Status.end);
String desc = assessmentMode.getDescription();
descriptionEl = uifactory.addRichTextElementForStringData("mode.description", "mode.description",
desc, 6, -1, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
descriptionEl.setEnabled(status != Status.followup && status != Status.end);
beginEl = uifactory.addDateChooser("mode.begin", assessmentMode.getBegin(), formLayout);
beginEl.setElementCssClass("o_sel_assessment_mode_begin");
beginEl.setDateChooserTimeEnabled(true);
beginEl.setMandatory(true);
beginEl.setEnabled(status == Status.none || status == Status.leadtime);
int leadTime = assessmentMode.getLeadTime();
if(leadTime < 0) {
leadTime = 0;
}
leadTimeEl = uifactory.addIntegerElement("mode.leadTime", leadTime, formLayout);
leadTimeEl.setElementCssClass("o_sel_assessment_mode_leadtime");
leadTimeEl.setDisplaySize(3);
leadTimeEl.setEnabled(status == Status.none || status == Status.leadtime);
endEl = uifactory.addDateChooser("mode.end", assessmentMode.getEnd(), formLayout);
endEl.setElementCssClass("o_sel_assessment_mode_end");
endEl.setDateChooserTimeEnabled(true);
endEl.setMandatory(true);
endEl.setEnabled(status != Status.end);
int followupTime = assessmentMode.getFollowupTime();
if(followupTime < 0) {
followupTime = 0;
}
followupTimeEl = uifactory.addIntegerElement("mode.followupTime", followupTime, formLayout);
followupTimeEl.setElementCssClass("o_sel_assessment_mode_followuptime");
followupTimeEl.setDisplaySize(3);
followupTimeEl.setEnabled(status != Status.end);
String[] startModeValues = new String[] {
translate("mode.beginend.automatic"), translate("mode.beginend.manual")
};
startModeEl = uifactory.addDropdownSingleselect("mode.beginend", formLayout, startModeKeys, startModeValues, null);
startModeEl.setElementCssClass("o_sel_assessment_mode_start_mode");
if(assessmentMode.isManualBeginEnd()) {
startModeEl.select(startModeKeys[1], true);
} else {
startModeEl.select(startModeKeys[0], true);
}
startModeEl.setEnabled(status != Status.end);
String[] audienceKeys = new String[] {
AssessmentMode.Target.courseAndGroups.name(),
AssessmentMode.Target.course.name(),
AssessmentMode.Target.groups.name()
};
String[] audienceValues = new String[] {
translate("target.courseAndGroups"),
translate("target.course"),
translate("target.groups")
};
targetEl = uifactory.addRadiosVertical("audience", "mode.target", formLayout, audienceKeys, audienceValues);
targetEl.setElementCssClass("o_sel_assessment_mode_audience");
targetEl.setEnabled(status != Status.end);
Target target = assessmentMode.getTargetAudience();
if(target != null) {
for(String audienceKey:audienceKeys) {
if(audienceKey.equals(target.name())) {
targetEl.select(audienceKey, true);
}
}
}
if(!targetEl.isOneSelected()) {
targetEl.select(audienceKeys[0], true);
}
//choose groups
String groupPage = velocity_root + "/choose_groups.html";
chooseGroupsCont = FormLayoutContainer.createCustomFormLayout("chooseGroups", getTranslator(), groupPage);
chooseGroupsCont.setRootForm(mainForm);
formLayout.add(chooseGroupsCont);
chooseGroupsButton = uifactory.addFormLink("choose.groups", chooseGroupsCont, Link.BUTTON);
chooseGroupsButton.setEnabled(status != Status.end);
chooseAreasButton = uifactory.addFormLink("choose.areas", chooseGroupsCont, Link.BUTTON);
chooseAreasButton.setEnabled(status != Status.end);
groupKeys = new ArrayList<>();
groupNames = new ArrayList<>();
for(AssessmentModeToGroup modeToGroup: assessmentMode.getGroups()) {
BusinessGroup group = modeToGroup.getBusinessGroup();
groupKeys.add(group.getKey());
groupNames.add(StringHelper.escapeHtml(group.getName()));
}
chooseGroupsCont.getFormItemComponent().contextPut("groupNames", groupNames);
areaKeys = new ArrayList<>();
areaNames = new ArrayList<>();
for(AssessmentModeToArea modeToArea: assessmentMode.getAreas()) {
BGArea area = modeToArea.getArea();
areaKeys.add(area.getKey());
areaNames.add(StringHelper.escapeHtml(area.getName()));
}
chooseGroupsCont.getFormItemComponent().contextPut("areaNames", areaNames);
//course elements
courseElementsRestrictionEl = uifactory.addCheckboxesHorizontal("cer", "mode.course.element.restriction", formLayout, onKeys, onValues);
courseElementsRestrictionEl.addActionListener(FormEvent.ONCHANGE);
courseElementsRestrictionEl.select(onKeys[0], assessmentMode.isRestrictAccessElements());
courseElementsRestrictionEl.setEnabled(status != Status.end);
String coursePage = velocity_root + "/choose_elements.html";
chooseElementsCont = FormLayoutContainer.createCustomFormLayout("chooseElements", getTranslator(), coursePage);
chooseElementsCont.setRootForm(mainForm);
formLayout.add(chooseElementsCont);
chooseElementsCont.setVisible(assessmentMode.isRestrictAccessElements());
CourseEditorTreeModel treeModel = course.getEditorTreeModel();
elementKeys = new ArrayList<>();
elementNames = new ArrayList<>();
String elements = assessmentMode.getElementList();
if(StringHelper.containsNonWhitespace(elements)) {
for(String element:elements.split(",")) {
String courseNodeName = getCourseNodeName(element, treeModel);
if(StringHelper.containsNonWhitespace(courseNodeName)) {
elementKeys.add(element);
elementNames.add(courseNodeName);
}
}
}
chooseElementsCont.getFormItemComponent().contextPut("elementNames", elementNames);
chooseElementsButton = uifactory.addFormLink("choose.elements", chooseElementsCont, Link.BUTTON);
chooseElementsButton.setEnabled(status != Status.end);
startElementKey = assessmentMode.getStartElement();
String startElementName = "";
if(StringHelper.containsNonWhitespace(startElementKey)) {
startElementName = getCourseNodeName(startElementKey, treeModel);
}
startElementEl = uifactory.addStaticTextElement("mode.start.element", "mode.start.element", startElementName, formLayout);
chooseStartElementButton = uifactory.addFormLink("choose.start.element", formLayout, Link.BUTTON);
chooseStartElementButton.setEnabled(status != Status.end);
//ips
ipsEl = uifactory.addCheckboxesHorizontal("ips", "mode.ips", formLayout, onKeys, onValues);
ipsEl.select(onKeys[0], assessmentMode.isRestrictAccessIps());
ipsEl.addActionListener(FormEvent.ONCHANGE);
ipsEl.setEnabled(status != Status.end);
String ipList = assessmentMode.getIpList();
ipListEl = uifactory.addTextAreaElement("mode.ips.list", "mode.ips.list", 4096, 4, 60, false, ipList, formLayout);
ipListEl.setVisible(assessmentMode.isRestrictAccessIps());
ipListEl.setEnabled(status != Status.end);
safeExamBrowserEl = uifactory.addCheckboxesHorizontal("safeexam", "mode.safeexambrowser", formLayout, onKeys, onValues);
safeExamBrowserEl.select(onKeys[0], assessmentMode.isSafeExamBrowser());
safeExamBrowserEl.addActionListener(FormEvent.ONCHANGE);
safeExamBrowserEl.setEnabled(status != Status.end);
String key = assessmentMode.getSafeExamBrowserKey();
safeExamBrowserKeyEl = uifactory.addTextAreaElement("safeexamkey", "mode.safeexambrowser.key", 4096, 6, 60, false, key, formLayout);
safeExamBrowserKeyEl.setVisible(assessmentMode.isSafeExamBrowser());
safeExamBrowserKeyEl.setEnabled(status != Status.end);
String hint = assessmentMode.getSafeExamBrowserHint();
safeExamBrowserHintEl = uifactory.addRichTextElementForStringData("safeexamhint", "mode.safeexambrowser.hint",
hint, 10, -1, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
safeExamBrowserHintEl.setVisible(assessmentMode.isSafeExamBrowser());
safeExamBrowserHintEl.setEnabled(status != Status.end);
forCoachEl = uifactory.addCheckboxesHorizontal("forcoach", "mode.for.coach", formLayout, onKeys, onValues);
forCoachEl.select(onKeys[0], assessmentMode.isApplySettingsForCoach());
forCoachEl.setEnabled(status != Status.end);
FormLayoutContainer buttonCont = FormLayoutContainer.createButtonLayout("button", getTranslator());
formLayout.add(buttonCont);
if(status != Status.end) {
uifactory.addFormSubmitButton("save", buttonCont);
}
uifactory.addFormCancelButton("cancel", buttonCont, ureq, getWindowControl());
}
private String getCourseNodeName(String ident, CourseEditorTreeModel treeModel) {
String name = null;
CourseNode courseNode = treeModel.getCourseNode(ident);
if(courseNode != null) {
name = courseNode.getShortTitle();
}
return name;
}
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if(groupChooseCtrl == source) {
if(Event.DONE_EVENT == event || Event.CHANGED_EVENT == event) {
groupKeys = groupChooseCtrl.getSelectedKeys();
List<String> newGroupNames = groupChooseCtrl.getSelectedNames();
groupNames.clear();
for(String newGroupName:newGroupNames) {
groupNames.add(StringHelper.escapeHtml(newGroupName));
}
chooseGroupsCont.getFormItemComponent().contextPut("groupNames", groupNames);
flc.setDirty(true);
}
cmc.deactivate();
cleanUp();
} else if(areaChooseCtrl == source) {
if(Event.DONE_EVENT == event || Event.CHANGED_EVENT == event) {
areaKeys = areaChooseCtrl.getSelectedKeys();
List<String> newAreaNames = areaChooseCtrl.getSelectedNames();
for(String newAreaName:newAreaNames) {
areaNames.add(StringHelper.escapeHtml(newAreaName));
}
chooseGroupsCont.getFormItemComponent().contextPut("areaNames", areaNames);
flc.setDirty(true);
}
cmc.deactivate();
cleanUp();
} else if(chooseElementsCtrl == source) {
if(Event.DONE_EVENT == event || Event.CHANGED_EVENT == event) {
elementKeys = chooseElementsCtrl.getSelectedKeys();
elementNames = chooseElementsCtrl.getSelectedNames();
chooseElementsCont.getFormItemComponent().contextPut("elementNames", elementNames);
flc.setDirty(true);
}
cmc.deactivate();
cleanUp();
} else if(chooseStartElementCtrl == source) {
if(Event.DONE_EVENT == event || Event.CHANGED_EVENT == event) {
startElementKey = chooseStartElementCtrl.getSelectedKey();
String elementName = chooseStartElementCtrl.getSelectedName();
startElementEl.setValue(elementName);
}
cmc.deactivate();
cleanUp();
} else if(confirmCtrl == source) {
if(DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event)) {
save(ureq, true);
}
} else if(cmc == source) {
cleanUp();
}
super.event(ureq, source, event);
}
private void cleanUp() {
removeAsListenerAndDispose(chooseStartElementCtrl);
removeAsListenerAndDispose(chooseElementsCtrl);
removeAsListenerAndDispose(groupChooseCtrl);
removeAsListenerAndDispose(areaChooseCtrl);
removeAsListenerAndDispose(cmc);
chooseStartElementCtrl = null;
chooseElementsCtrl = null;
groupChooseCtrl = null;
areaChooseCtrl = null;
cmc = null;
}
@Override
protected boolean validateFormLogic(UserRequest ureq) {
boolean allOk = true;
nameEl.clearError();
if(StringHelper.containsNonWhitespace(nameEl.getValue())) {
//too long
} else {
nameEl.setErrorKey("form.legende.mandatory", null);
allOk &= false;
}
endEl.clearError();
beginEl.clearError();
if(beginEl.getDate() == null) {
beginEl.setErrorKey("form.legende.mandatory", null);
allOk &= false;
}
if(endEl.getDate() == null) {
endEl.setErrorKey("form.legende.mandatory", null);
allOk &= false;
}
if(beginEl.getDate() != null && endEl.getDate() != null) {
if(beginEl.getDate().compareTo(endEl.getDate()) >= 0) {
beginEl.setErrorKey("error.begin.after.end", null);
endEl.setErrorKey("error.begin.after.end", null);
allOk &= false;
}
}
courseElementsRestrictionEl.clearError();
if(courseElementsRestrictionEl.isAtLeastSelected(1)) {
if(elementKeys.isEmpty()) {
courseElementsRestrictionEl.setErrorKey("error.course.element.mandatory", null);
allOk &= false;
}
}
targetEl.clearError();
if(targetEl.isOneSelected()) {
Target target = AssessmentMode.Target.valueOf(targetEl.getSelectedKey());
if(target == Target.courseAndGroups || target == Target.groups) {
if(groupKeys.isEmpty() && areaKeys.isEmpty()) {
targetEl.setErrorKey("error.group.missing", null);
allOk &= false;
}
}
} else {
targetEl.setErrorKey("form.legende.mandatory", null);
allOk &= false;
}
safeExamBrowserKeyEl.clearError();
if(safeExamBrowserEl.isAtLeastSelected(1)) {
String value = safeExamBrowserKeyEl.getValue();
if(!StringHelper.containsNonWhitespace(value)) {
safeExamBrowserKeyEl.setErrorKey("form.legende.mandatory", null);
allOk &= false;
}
}
ipListEl.clearError();
if(ipsEl.isAtLeastSelected(1)) {
String value = ipListEl.getValue();
if(!StringHelper.containsNonWhitespace(value)) {
ipListEl.setErrorKey("form.legende.mandatory", null);
allOk &= false;
}
}
return allOk & super.validateFormLogic(ureq);
}
@Override
protected void formOK(UserRequest ureq) {
Date begin = beginEl.getDate();
Date end = endEl.getDate();
int followupTime = followupTimeEl.getIntValue();
int leadTime = leadTimeEl.getIntValue();
Status currentStatus = assessmentMode.getStatus();
if(startModeEl.isOneSelected() && startModeEl.isSelected(1)) {
//manual start don't change the status of the assessment
save(ureq, false);
} else {
Status nextStatus = modeCoordinationService.evaluateStatus(begin, leadTime, end, followupTime);
if(currentStatus == nextStatus) {
save(ureq, true);
} else {
String title = translate("confirm.status.change.title");
String text;
switch(nextStatus) {
case none: text = translate("confirm.status.change.none"); break;
case leadtime: text = translate("confirm.status.change.leadtime"); break;
case assessment: text = translate("confirm.status.change.assessment"); break;
case followup: text = translate("confirm.status.change.followup"); break;
case end: text = translate("confirm.status.change.end"); break;
default: text = "ERROR";
}
confirmCtrl = activateOkCancelDialog(ureq, title, text, confirmCtrl);
}
}
}
private void save(UserRequest ureq, boolean forceStatus) {
if(assessmentMode.getKey() != null) {
assessmentMode = assessmentModeMgr.getAssessmentModeById(assessmentMode.getKey());
}
assessmentMode.setName(nameEl.getValue());
assessmentMode.setDescription(descriptionEl.getValue());
assessmentMode.setBegin(beginEl.getDate());
if(leadTimeEl.getIntValue() > 0) {
assessmentMode.setLeadTime(leadTimeEl.getIntValue());
} else {
assessmentMode.setLeadTime(0);
}
assessmentMode.setEnd(endEl.getDate());
if(followupTimeEl.getIntValue() > 0) {
assessmentMode.setFollowupTime(followupTimeEl.getIntValue());
} else {
assessmentMode.setFollowupTime(0);
}
if(startModeEl.isOneSelected() && startModeEl.isSelected(1)) {
assessmentMode.setManualBeginEnd(true);
} else {
assessmentMode.setManualBeginEnd(false);
}
String targetKey = targetEl.getSelectedKey();
assessmentMode.setTargetAudience(AssessmentMode.Target.valueOf(targetKey));
boolean elementRestrictions = courseElementsRestrictionEl.isAtLeastSelected(1);
assessmentMode.setRestrictAccessElements(elementRestrictions);
if(elementRestrictions) {
StringBuilder sb = new StringBuilder();
for(String elementKey:elementKeys) {
if(sb.length() > 0) sb.append(",");
sb.append(elementKey);
}
assessmentMode.setElementList(sb.toString());
} else {
assessmentMode.setElementList(null);
}
if(StringHelper.containsNonWhitespace(startElementKey)) {
assessmentMode.setStartElement(startElementKey);
} else {
assessmentMode.setStartElement(null);
}
boolean ipRestriction = ipsEl.isAtLeastSelected(1);
assessmentMode.setRestrictAccessIps(ipRestriction);
if(ipRestriction) {
assessmentMode.setIpList(ipListEl.getValue());
} else {
assessmentMode.setIpList(null);
}
boolean safeExamEnabled = safeExamBrowserEl.isAtLeastSelected(1);
assessmentMode.setSafeExamBrowser(safeExamEnabled);
if(safeExamEnabled) {
assessmentMode.setSafeExamBrowserKey(safeExamBrowserKeyEl.getValue());
assessmentMode.setSafeExamBrowserHint(safeExamBrowserHintEl.getValue());
} else {
assessmentMode.setSafeExamBrowserKey(null);
assessmentMode.setSafeExamBrowserHint(null);
}
assessmentMode.setApplySettingsForCoach(forCoachEl.isAtLeastSelected(1));
//mode need to be persisted for the following relations
if(assessmentMode.getKey() == null) {
assessmentMode = assessmentModeMgr.persist(assessmentMode);
}
//update groups
if(groupKeys.isEmpty()) {
if(assessmentMode.getGroups().size() > 0) {
assessmentMode.getGroups().clear();
}
} else {
Set<Long> currentKeys = new HashSet<>();
for(Iterator<AssessmentModeToGroup> modeToGroupIt=assessmentMode.getGroups().iterator(); modeToGroupIt.hasNext(); ) {
Long currentKey = modeToGroupIt.next().getBusinessGroup().getKey();
if(!groupKeys.contains(currentKey)) {
modeToGroupIt.remove();
} else {
currentKeys.add(currentKey);
}
}
for(Long groupKey:groupKeys) {
if(!currentKeys.contains(groupKey)) {
BusinessGroup group = businessGroupService.loadBusinessGroup(groupKey);
AssessmentModeToGroup modeToGroup = assessmentModeMgr.createAssessmentModeToGroup(assessmentMode, group);
assessmentMode.getGroups().add(modeToGroup);
}
}
}
//update areas
if(areaKeys.isEmpty()) {
if(assessmentMode.getAreas().size() > 0) {
assessmentMode.getAreas().clear();
}
} else {
Set<Long> currentKeys = new HashSet<>();
for(Iterator<AssessmentModeToArea> modeToAreaIt=assessmentMode.getAreas().iterator(); modeToAreaIt.hasNext(); ) {
Long currentKey = modeToAreaIt.next().getArea().getKey();
if(!areaKeys.contains(currentKey)) {
modeToAreaIt.remove();
} else {
currentKeys.add(currentKey);
}
}
for(Long areaKey:areaKeys) {
if(!currentKeys.contains(areaKey)) {
BGArea area = areaMgr.loadArea(areaKey);
AssessmentModeToArea modeToArea = assessmentModeMgr.createAssessmentModeToArea(assessmentMode, area);
assessmentMode.getAreas().add(modeToArea);
}
}
}
assessmentMode = assessmentModeMgr.merge(assessmentMode, forceStatus);
fireEvent(ureq, Event.CHANGED_EVENT);
}
@Override
protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
if(ipsEl == source) {
ipListEl.setVisible(ipsEl.isAtLeastSelected(1));
} else if(safeExamBrowserEl == source) {
boolean enabled = safeExamBrowserEl.isAtLeastSelected(1);
safeExamBrowserKeyEl.setVisible(enabled);
safeExamBrowserHintEl.setVisible(enabled);
} else if(courseElementsRestrictionEl == source) {
boolean enabled = courseElementsRestrictionEl.isAtLeastSelected(1);
chooseElementsCont.setVisible(enabled);
} else if(chooseAreasButton == source) {
doChooseAreas(ureq);
} else if(chooseGroupsButton == source) {
doChooseGroups(ureq);
} else if(chooseElementsButton == source) {
doChooseElements(ureq);
} else if(chooseStartElementButton == source) {
doChooseStartElement(ureq);
}
super.formInnerEvent(ureq, source, event);
}
@Override
protected void formCancelled(UserRequest ureq) {
fireEvent(ureq, Event.CANCELLED_EVENT);
}
private void doChooseElements(UserRequest ureq) {
if(chooseElementsCtrl != null) return;
chooseElementsCtrl = new ChooseElementsController(ureq, getWindowControl(), elementKeys, courseOres);
listenTo(chooseElementsCtrl);
cmc = new CloseableModalController(getWindowControl(), "close", chooseElementsCtrl.getInitialComponent(),
true, translate("popup.chooseelements"), false);
listenTo(cmc);
cmc.activate();
}
private void doChooseStartElement(UserRequest ureq) {
if(chooseElementsCtrl != null) return;
List<String> allowedKeys = courseElementsRestrictionEl.isAtLeastSelected(1)
? new ArrayList<>(elementKeys) : null;
chooseStartElementCtrl = new ChooseStartElementController(ureq, getWindowControl(), startElementKey, allowedKeys, courseOres);
listenTo(chooseStartElementCtrl);
cmc = new CloseableModalController(getWindowControl(), null, chooseStartElementCtrl.getInitialComponent(),
true, translate("popup.choosestartelement"), false);
listenTo(cmc);
cmc.activate();
}
private void doChooseAreas(UserRequest ureq) {
if(areaChooseCtrl != null) return;
ICourse course = CourseFactory.loadCourse(courseOres);
CourseGroupManager groupManager = course.getCourseEnvironment().getCourseGroupManager();
areaChooseCtrl = new AreaSelectionController(ureq, getWindowControl(), true, groupManager, areaKeys);
listenTo(areaChooseCtrl);
cmc = new CloseableModalController(getWindowControl(), null, areaChooseCtrl.getInitialComponent(),
true, translate("popup.chooseareas"), false);
listenTo(cmc);
cmc.activate();
}
private void doChooseGroups(UserRequest ureq) {
if(groupChooseCtrl != null) return;
ICourse course = CourseFactory.loadCourse(courseOres);
CourseGroupManager groupManager = course.getCourseEnvironment().getCourseGroupManager();
groupChooseCtrl = new GroupSelectionController(ureq, getWindowControl(), true, groupManager, groupKeys);
listenTo(groupChooseCtrl);
cmc = new CloseableModalController(getWindowControl(), null, groupChooseCtrl.getInitialComponent(),
true, translate("popup.choosegroups"), false);
listenTo(cmc);
cmc.activate();
}
}