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

OO-4273: prevent mark/auto save to redraw the test or parts of it

parent 6dbcd0ac
No related branches found
No related tags found
No related merge requests found
Showing
with 81 additions and 13 deletions
......@@ -29,6 +29,7 @@ import java.util.List;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.Window;
import org.olat.core.gui.components.form.flexible.elements.Submit;
import org.olat.core.gui.components.form.flexible.impl.FormEvent;
import org.olat.core.logging.AssertException;
......@@ -74,6 +75,10 @@ public class FormSubmit extends FormButton implements Submit{
@Override
public void evalFormRequest(UserRequest ureq) {
if(Window.NO_RESPONSE_VALUE_MARKER.equals(ureq.getParameter(Window.NO_RESPONSE_PARAMETER_MARKER))) {
return; // ignore background request
}
// no values with submit to be evaluated
getComponent().setDirty(true);
}
......
......@@ -649,6 +649,21 @@ public class Link extends AbstractComponent {
active = isActive;
setDirty(true);
}
@Override
public void setDirty(boolean dirty) {
super.setDirty(dirty);
if(flexiLink != null) {
// particularly important for by setDirty false
if(flexiLink.getExampleC() != null) {
flexiLink.getExampleC().setDirty(dirty);
}
if(flexiLink.getErrorC() != null) {
flexiLink.getErrorC().setDirty(dirty);
}
if(flexiLink.getLabelC() != null) {
flexiLink.getLabelC().setDirty(dirty);
}
}
}
}
......@@ -2080,6 +2080,10 @@ public class AssessmentTestDisplayController extends BasicController implements
QTIWorksAssessmentTestEvent qwate = (QTIWorksAssessmentTestEvent)event;
if(qwate.getEvent() == QTIWorksAssessmentTestEvent.Event.tmpResponse) {
processTemporaryResponse(ureq);
return; // only save the response
} else if(qwate.getEvent() == QTIWorksAssessmentTestEvent.Event.mark) {
fireEvent(ureq, event);
return; // only toggle, don't update
} else {
fireEvent(ureq, event);
}
......@@ -2098,7 +2102,8 @@ public class AssessmentTestDisplayController extends BasicController implements
@Override
protected void propagateDirtinessToContainer(FormItem fiSrc, FormEvent fe) {
if(!"mark".equals(fe.getCommand()) && !"rubric".equals(fe.getCommand())) {
if(!"mark".equals(fe.getCommand()) && !"rubric".equals(fe.getCommand())
&& !"tmpResponse".equals(fe.getCommand())) {
super.propagateDirtinessToContainer(fiSrc, fe);
}
}
......
......@@ -22,13 +22,15 @@ package org.olat.ims.qti21.ui.components;
import static org.olat.ims.qti21.ui.components.AssessmentRenderFunctions.valueContains;
import java.net.URI;
import java.util.Collections;
import java.util.ArrayList;
import java.util.List;
import org.apache.velocity.context.Context;
import org.olat.core.CoreSpringFactory;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.AbstractComponent;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.form.flexible.FormItem;
import org.olat.core.gui.control.JSAndCSSAdder;
import org.olat.core.gui.render.ValidationResult;
import org.olat.core.gui.render.velocity.VelocityComponent;
......@@ -188,16 +190,30 @@ public abstract class AssessmentObjectComponent extends AbstractComponent implem
return (identifierMatch && feedbackElement.getVisibilityMode() == VisibilityMode.SHOW_IF_MATCH)
|| (!identifierMatch && feedbackElement.getVisibilityMode() == VisibilityMode.HIDE_IF_MATCH);
}
@Override
public Component getComponent(String name) {
AssessmentObjectFormItem assessmentItem = getQtiItem();
if(assessmentItem != null) {
for(FormItem item:assessmentItem.getFormItems()) {
if(item.getComponent().getComponentName().equals(name)) {
return item.getComponent();
}
}
}
return null;
}
@Override
public Iterable<Component> getComponents() {
return Collections.emptyList();
List<Component> cmps = new ArrayList<>();
AssessmentObjectFormItem assessmentItem = getQtiItem();
if(assessmentItem != null) {
for(FormItem item:assessmentItem.getFormItems()) {
cmps.add(item.getComponent());
}
}
return cmps;
}
@Override
......
......@@ -23,6 +23,7 @@ import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
......@@ -63,11 +64,18 @@ public abstract class AssessmentObjectFormItem extends FormItemImpl implements F
@Override
public Iterable<FormItem> getFormItems() {
return new ArrayList<>(components.values());
List<FormItem> items = new ArrayList<>(components.values());
if(submitButton != null) {
items.add(submitButton);
}
return items;
}
@Override
public FormItem getFormComponent(String name) {
if(submitButton != null && submitButton.getName().equals(name)) {
return submitButton;
}
return components.get(name);
}
......
......@@ -75,6 +75,7 @@ public class AssessmentTestComponent extends AssessmentObjectComponent {
this.qtiItem = qtiItem;
}
@Override
public AssessmentTestFormItem getQtiItem() {
return qtiItem;
}
......
......@@ -242,7 +242,10 @@ public class AssessmentTestFormItem extends AssessmentObjectFormItem {
}
if(event != null) {
getRootForm().fireFormEvent(ureq, event);
component.setDirty(true);
if(event.getEvent() != QTIWorksAssessmentTestEvent.Event.tmpResponse
&& event.getEvent() != QTIWorksAssessmentTestEvent.Event.mark) {
component.setDirty(true);
}
}
}
}
......
......@@ -21,6 +21,7 @@ package org.olat.ims.qti21.ui.components;
import org.apache.logging.log4j.Logger;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.Window;
import org.olat.core.gui.components.form.flexible.impl.Form;
import org.olat.core.gui.components.form.flexible.impl.FormJSHelper;
import org.olat.core.gui.components.form.flexible.impl.NameValuePair;
......@@ -245,10 +246,14 @@ public class AssessmentTreeComponentRenderer extends AssessmentObjectComponentRe
sb.append("<a href='javascript:;' onclick=\"")
.append(FormJSHelper.getXHRNFFnCallFor(form, dispatchId, 1,
new NameValuePair("cid", Event.mark.name()), new NameValuePair("item", key)))
new NameValuePair("cid", Event.mark.name()),
new NameValuePair("item", key),
new NameValuePair(Window.NO_RESPONSE_PARAMETER_MARKER, Window.NO_RESPONSE_VALUE_MARKER)))
.append("; o_toggleMark(this); return false;\" onkeydown=\"if(event.which == 13 || event.keyCode == 13) {")
.append(FormJSHelper.getXHRNFFnCallFor(form, dispatchId, 1,
new NameValuePair("cid", Event.mark.name()), new NameValuePair("item", key)))
new NameValuePair("cid", Event.mark.name()),
new NameValuePair("item", key),
new NameValuePair(Window.NO_RESPONSE_PARAMETER_MARKER, Window.NO_RESPONSE_VALUE_MARKER)))
.append("; o_toggleMark(this); return false; }\" ")
.append(" class='o_assessmentitem_marks'><i class='o_icon ")
.append("o_icon_bookmark", "o_icon_bookmark_add", mark)
......
......@@ -37,6 +37,7 @@ import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.link.LinkFactory;
import org.olat.core.gui.components.panel.Panel;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.ChiefController;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
......@@ -161,9 +162,6 @@ public class InstantMessagingMainController extends BasicController implements G
putInitialPanel(main);
}
/**
* @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
*/
@Override
protected void doDispose() {
imService.unlistenChat(getIdentity(), getPrivatListenToResourceable(), this);
......@@ -244,12 +242,22 @@ public class InstantMessagingMainController extends BasicController implements G
}
private void updateBuddyStats() {
if(onlineOfflineCount != null) {
if(allowToUpdateBuddyStats()) {
BuddyStats stats = imService.getBuddyStats(getIdentity());
onlineOfflineCount.setCustomDisplayText(translate("im.roster.launch", new String[]{stats.getOnlineBuddies() + "", stats.getOfflineBuddies() + ""}));
}
}
private boolean allowToUpdateBuddyStats() {
if(onlineOfflineCount == null) {
return false;
}
ChiefController chiefController = getWindowControl().getWindowBackOffice().getChiefController();
return (chiefController != null &&
(chiefController.getScreenMode() == null
|| !(chiefController.getScreenMode().isFullScreen() || chiefController.getScreenMode().isWishFullScreen())));
}
private void loadNotifications() {
List<InstantMessageNotification> notifications = imService.getNotifications(getIdentity());
for(InstantMessageNotification notification:notifications) {
......
<!DOCTYPE html>
<html><body></body></html>
\ No newline at end of file
......@@ -22,6 +22,7 @@
data['tmpResponse'] = 'qtiworks_presented_' + settings.responseUniqueId;
data['qtiworks_presented_' + settings.responseUniqueId] = '1';
data['qtiworks_response_' + settings.responseUniqueId] = jQuery('#oo_' + settings.responseUniqueId).val();
data['no-response'] = 'oo-no-response';
var targetUrl = jQuery('#' + settings.formName).attr("action");
jQuery.ajax(targetUrl,{
......
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