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

OO-2487: make the check box pure ajax and don't react to submit form

parent f7197b11
No related branches found
No related tags found
No related merge requests found
...@@ -31,15 +31,11 @@ import java.util.Set; ...@@ -31,15 +31,11 @@ import java.util.Set;
/** /**
* Description:<br>
* TODO: patrickb Class Description for MultipleSelectionElement
* *
* <P>
* Initial Date: 04.01.2007 <br> * Initial Date: 04.01.2007 <br>
* @author felix * @author felix
* @author patrickb * @author patrickb
*/ */
public interface MultipleSelectionElement extends SelectionElement { public interface MultipleSelectionElement extends SelectionElement {
/** /**
...@@ -120,6 +116,21 @@ public interface MultipleSelectionElement extends SelectionElement { ...@@ -120,6 +116,21 @@ public interface MultipleSelectionElement extends SelectionElement {
*/ */
public void setEscapeHtml(boolean escapeHtml); public void setEscapeHtml(boolean escapeHtml);
/**
* @return true if the state of a check box is changed only by ajax
* events and not by the submission of a form.
*/
public boolean isAjaxOnly();
/**
* Set to true if the state of the element need to be only
* changed by an ajax event and not by the submission of
* a form.
*
* @param ajaxOnlyMode
*/
public void setAjaxOnly(boolean ajaxOnlyMode);
public enum Layout { public enum Layout {
horizontal, horizontal,
vertical vertical
......
...@@ -33,6 +33,7 @@ import java.util.Set; ...@@ -33,6 +33,7 @@ import java.util.Set;
import org.olat.core.gui.UserRequest; import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
import org.olat.core.gui.components.form.flexible.impl.Form;
import org.olat.core.gui.components.form.flexible.impl.FormItemImpl; import org.olat.core.gui.components.form.flexible.impl.FormItemImpl;
import org.olat.core.logging.OLog; import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing; import org.olat.core.logging.Tracing;
...@@ -59,6 +60,7 @@ public class MultipleSelectionElementImpl extends FormItemImpl implements Multip ...@@ -59,6 +60,7 @@ public class MultipleSelectionElementImpl extends FormItemImpl implements Multip
private final int columns; private final int columns;
protected MultipleSelectionComponent component; protected MultipleSelectionComponent component;
private String[] original = null; private String[] original = null;
private boolean ajaxOnlyMode = false;
private boolean originalIsDefined = false; private boolean originalIsDefined = false;
private boolean escapeHtml = true; private boolean escapeHtml = true;
private boolean domReplacementWrapperRequired = true; private boolean domReplacementWrapperRequired = true;
...@@ -91,6 +93,17 @@ public class MultipleSelectionElementImpl extends FormItemImpl implements Multip ...@@ -91,6 +93,17 @@ public class MultipleSelectionElementImpl extends FormItemImpl implements Multip
} }
} }
@Override
public boolean isAjaxOnly() {
return ajaxOnlyMode;
}
@Override
public void setAjaxOnly(boolean ajaxOnlyMode) {
this.ajaxOnlyMode = ajaxOnlyMode;
}
public Layout getLayout() { public Layout getLayout() {
return layout; return layout;
} }
...@@ -228,23 +241,33 @@ public class MultipleSelectionElementImpl extends FormItemImpl implements Multip ...@@ -228,23 +241,33 @@ public class MultipleSelectionElementImpl extends FormItemImpl implements Multip
@Override @Override
public void evalFormRequest(UserRequest ureq) { public void evalFormRequest(UserRequest ureq) {
if(!isEnabled()){ Form form = getRootForm();
//if element is visible as disabled it would be resetted if(isAjaxOnly()) {
return; String dispatchuri = form.getRequestParameter("dispatchuri");
} if(dispatchuri != null && dispatchuri.equals(component.getFormDispatchId())) {
// which one was selected? String key = form.getRequestParameter("achkbox");
// selection change? String checked = form.getRequestParameter("checked");
// mark corresponding comps as dirty if("true".equals(checked)) {
String[] reqVals = getRootForm().getRequestParameterValues(getName()); selected.add(key);
if (reqVals == null) { } else if("false".equals(checked)) {
// selection box? selected.remove(key);
reqVals = getRootForm().getRequestParameterValues(getName() + "_SELBOX"); }
} }
// } else if(isEnabled() ) {
selected = new HashSet<String>(); // which one was selected?
if (reqVals != null) { // selection change?
for (int i = 0; i < reqVals.length; i++) { // mark corresponding comps as dirty
selected.add(reqVals[i]); String[] reqVals = form.getRequestParameterValues(getName());
if (reqVals == null) {
// selection box?
reqVals = form.getRequestParameterValues(getName() + "_SELBOX");
}
//
selected = new HashSet<String>();
if (reqVals != null) {
for (int i = 0; i < reqVals.length; i++) {
selected.add(reqVals[i]);
}
} }
} }
} }
......
...@@ -24,6 +24,7 @@ import org.olat.core.gui.components.Component; ...@@ -24,6 +24,7 @@ import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.DefaultComponentRenderer; import org.olat.core.gui.components.DefaultComponentRenderer;
import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement.Layout; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement.Layout;
import org.olat.core.gui.components.form.flexible.impl.FormJSHelper; import org.olat.core.gui.components.form.flexible.impl.FormJSHelper;
import org.olat.core.gui.components.form.flexible.impl.NameValuePair;
import org.olat.core.gui.render.RenderResult; import org.olat.core.gui.render.RenderResult;
import org.olat.core.gui.render.Renderer; import org.olat.core.gui.render.Renderer;
import org.olat.core.gui.render.StringOutput; import org.olat.core.gui.render.StringOutput;
...@@ -143,6 +144,16 @@ public class MultipleSelectionRenderer extends DefaultComponentRenderer { ...@@ -143,6 +144,16 @@ public class MultipleSelectionRenderer extends DefaultComponentRenderer {
} }
if(!stC.isEnabled() || !check.isEnabled()) { if(!stC.isEnabled() || !check.isEnabled()) {
sb.append(" disabled='disabled' "); sb.append(" disabled='disabled' ");
} else if(stF.isAjaxOnly()) {
// The implementation is conservative as it send the state of the check box,
// this is especially useful if an issue of double evaluation appears.
sb.append(" onclick=\"javascript: this.checked ?")
.append(FormJSHelper.getXHRFnCallFor(stF.getRootForm(), stC.getFormDispatchId(), 1, false, false, false,
new NameValuePair("achkbox", key), new NameValuePair("checked", "true")))
.append(" : ")
.append(FormJSHelper.getXHRFnCallFor(stF.getRootForm(), stC.getFormDispatchId(), 1, false, false, false,
new NameValuePair("achkbox", key), new NameValuePair("checked", "false")))
.append(";\"");
} else { } else {
//use the selection form dispatch id and not the one of the element! //use the selection form dispatch id and not the one of the element!
sb.append(FormJSHelper.getRawJSFor(check.getRootForm(), check.getSelectionElementFormDispatchId(), check.getAction())); sb.append(FormJSHelper.getRawJSFor(check.getRootForm(), check.getSelectionElementFormDispatchId(), check.getAction()));
......
...@@ -38,12 +38,14 @@ import org.olat.basesecurity.BaseSecurityModule; ...@@ -38,12 +38,14 @@ import org.olat.basesecurity.BaseSecurityModule;
import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.GroupRoles;
import org.olat.core.CoreSpringFactory; import org.olat.core.CoreSpringFactory;
import org.olat.core.commons.persistence.DBFactory; import org.olat.core.commons.persistence.DBFactory;
import org.olat.core.commons.persistence.SortKey;
import org.olat.core.gui.UserRequest; import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component; import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.form.flexible.FormItem; 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.FormItemContainer;
import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement;
import org.olat.core.gui.components.form.flexible.elements.FlexiTableFilter; import org.olat.core.gui.components.form.flexible.elements.FlexiTableFilter;
import org.olat.core.gui.components.form.flexible.elements.FlexiTableSortOptions;
import org.olat.core.gui.components.form.flexible.elements.FormLink; import org.olat.core.gui.components.form.flexible.elements.FormLink;
import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
...@@ -187,6 +189,7 @@ public class CheckListAssessmentController extends FormBasicController implement ...@@ -187,6 +189,7 @@ public class CheckListAssessmentController extends FormBasicController implement
maxScore = (Float)config.get(MSCourseNode.CONFIG_KEY_SCORE_MAX); maxScore = (Float)config.get(MSCourseNode.CONFIG_KEY_SCORE_MAX);
initForm(ureq); initForm(ureq);
reloadTable();
} }
@Override @Override
...@@ -200,10 +203,13 @@ public class CheckListAssessmentController extends FormBasicController implement ...@@ -200,10 +203,13 @@ public class CheckListAssessmentController extends FormBasicController implement
layoutCont.contextPut("dueDate", dueDate); layoutCont.contextPut("dueDate", dueDate);
} }
} }
FlexiTableSortOptions options = new FlexiTableSortOptions();
FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
if(isAdministrativeUser) { if(isAdministrativeUser) {
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.username.i18nKey(), Cols.username.ordinal())); options.setDefaultOrderBy(new SortKey(Cols.username.name(), true));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.username.i18nKey(), Cols.username.ordinal(),
true, Cols.username.name()));
} }
int i=0; int i=0;
...@@ -224,6 +230,9 @@ public class CheckListAssessmentController extends FormBasicController implement ...@@ -224,6 +230,9 @@ public class CheckListAssessmentController extends FormBasicController implement
col = new DefaultFlexiColumnModel(true, userPropertyHandler.i18nColumnDescriptorLabelKey(), colIndex, true, propName); col = new DefaultFlexiColumnModel(true, userPropertyHandler.i18nColumnDescriptorLabelKey(), colIndex, true, propName);
} }
columnsModel.addFlexiColumnModel(col); columnsModel.addFlexiColumnModel(col);
if(options.getDefaultOrderBy() == null) {
options.setDefaultOrderBy(new SortKey(propName, true));
}
} }
} }
...@@ -243,8 +252,7 @@ public class CheckListAssessmentController extends FormBasicController implement ...@@ -243,8 +252,7 @@ public class CheckListAssessmentController extends FormBasicController implement
} }
columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("table.header.edit.checkbox", translate("table.header.edit.checkbox"), "edit")); columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("table.header.edit.checkbox", translate("table.header.edit.checkbox"), "edit"));
List<CheckListAssessmentRow> datas = loadDatas(); model = new CheckListAssessmentDataModel(checkboxList, new ArrayList<>(), columnsModel);
model = new CheckListAssessmentDataModel(checkboxList, datas, columnsModel);
table = uifactory.addTableElement(getWindowControl(), "checkbox-list", model, getTranslator(), formLayout); table = uifactory.addTableElement(getWindowControl(), "checkbox-list", model, getTranslator(), formLayout);
if(coachCourseEnv instanceof UserCourseEnvironmentImpl) { if(coachCourseEnv instanceof UserCourseEnvironmentImpl) {
UserCourseEnvironmentImpl env = (UserCourseEnvironmentImpl)coachCourseEnv; UserCourseEnvironmentImpl env = (UserCourseEnvironmentImpl)coachCourseEnv;
...@@ -260,6 +268,8 @@ public class CheckListAssessmentController extends FormBasicController implement ...@@ -260,6 +268,8 @@ public class CheckListAssessmentController extends FormBasicController implement
} }
table.setExportEnabled(true); table.setExportEnabled(true);
table.setCustomizeColumns(true); table.setCustomizeColumns(true);
FlexiTableSortOptions sortOptions = new FlexiTableSortOptions();
table.setSortSettings(sortOptions);
table.setAndLoadPersistedPreferences(ureq, "checklist-assessment"); table.setAndLoadPersistedPreferences(ureq, "checklist-assessment");
pdfExportButton = uifactory.addFormLink("pdf.export", formLayout, Link.BUTTON); pdfExportButton = uifactory.addFormLink("pdf.export", formLayout, Link.BUTTON);
...@@ -431,7 +441,13 @@ public class CheckListAssessmentController extends FormBasicController implement ...@@ -431,7 +441,13 @@ public class CheckListAssessmentController extends FormBasicController implement
} }
super.formInnerEvent(ureq, source, event); super.formInnerEvent(ureq, source, event);
} }
@Override
protected void propagateDirtinessToContainer(FormItem fiSrc) {
if(!(fiSrc instanceof MultipleSelectionElement)) {
super.propagateDirtinessToContainer(fiSrc);
}
}
@Override @Override
protected void event(UserRequest ureq, Controller source, Event event) { protected void event(UserRequest ureq, Controller source, Event event) {
...@@ -508,6 +524,8 @@ public class CheckListAssessmentController extends FormBasicController implement ...@@ -508,6 +524,8 @@ public class CheckListAssessmentController extends FormBasicController implement
for(int i=0; i<numOfCheckbox; i++) { for(int i=0; i<numOfCheckbox; i++) {
String checkName = "c" + i + "-" + row.getIdentityKey(); String checkName = "c" + i + "-" + row.getIdentityKey();
checkedEls[i] = uifactory.addCheckboxesHorizontal(checkName, null, flc, onKeys, onValues); checkedEls[i] = uifactory.addCheckboxesHorizontal(checkName, null, flc, onKeys, onValues);
checkedEls[i].setAjaxOnly(true);
checkedEls[i].setDomReplacementWrapperRequired(false);
if(checked != null && i<checked.length && checked[i] != null && checked[i].booleanValue()) { if(checked != null && i<checked.length && checked[i] != null && checked[i].booleanValue()) {
checkedEls[i].select(onKeys[0], true); checkedEls[i].select(onKeys[0], true);
} }
......
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