From b06fba31c6adeb9c48653f2c041d4078e40fd4e2 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Thu, 19 Feb 2015 14:26:19 +0100
Subject: [PATCH] OO-1297: in flexi table, make toggling of the multiselection
 checkbox reflects with ajax to the server model

---
 .../table/FlexiTableClassicRenderer.java      |  6 +++-
 .../elements/table/FlexiTableElementImpl.java | 28 +++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableClassicRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableClassicRenderer.java
index 961867b2d62..819cfd493f7 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableClassicRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableClassicRenderer.java
@@ -134,6 +134,7 @@ class FlexiTableClassicRenderer extends AbstractFlexiTableRenderer implements Co
 		FlexiTableElementImpl ftE = ftC.getFlexiTableElement();
 		FlexiTableColumnModel columnsModel = ftE.getTableDataModel().getTableColumnModel();
 		int numOfCols = columnsModel.getColumnCount();
+		Form theForm = ftE.getRootForm();
 		
 		// use alternating css class
 		int numOfColumns = 0;
@@ -142,7 +143,10 @@ class FlexiTableClassicRenderer extends AbstractFlexiTableRenderer implements Co
 				
 		if(ftE.isMultiSelect()) {
 			target.append("<td>")
-			      .append("<input type='checkbox' name='tb_ms' value='").append(rowIdPrefix).append(row).append("'");
+			      .append("<input type='checkbox' name='tb_ms' value='").append(rowIdPrefix).append(row).append("'")
+			      .append(" onclick=\"javascript:")
+			      .append(FormJSHelper.getXHRFnCallFor(theForm, ftC.getFormDispatchId(), 1, new NameValuePair("chkbox", Integer.toString(row))))
+				  .append("\"");	 
 			if(ftE.isMultiSelectedIndex(row)) {
 				target.append(" checked='checked'");
 			}   
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java
index 2f0271c0fb6..e50f08f1560 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java
@@ -686,8 +686,11 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		String sort = form.getRequestParameter("sort");
 		String filter = form.getRequestParameter("filter");
 		String pagesize = form.getRequestParameter("pagesize");
+		String checkbox = form.getRequestParameter("chkbox");
 		if("undefined".equals(dispatchuri)) {
 			evalSearchRequest(ureq);
+		} else if(StringHelper.containsNonWhitespace(checkbox)) {
+			toogleSelectIndex(checkbox);
 		} else if(StringHelper.containsNonWhitespace(page)) {
 			int p = Integer.parseInt(page);
 			setPage(p);
@@ -1222,6 +1225,31 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		return multiSelectedIndex != null && multiSelectedIndex.contains(new Integer(index));
 	}
 	
+	protected void toogleSelectIndex(String selection) {
+		if(multiSelectedIndex == null) {
+			multiSelectedIndex = new HashSet<Integer>();
+		}
+
+		String rowStr;
+		int index = selection.lastIndexOf('-');
+		if(index > 0 && index+1 < selection.length()) {
+			rowStr = selection.substring(index+1);
+		} else {
+			rowStr = selection;
+		}
+		
+		try {
+			Integer row = new Integer(rowStr);
+			if(multiSelectedIndex.contains(row)) {
+				multiSelectedIndex.remove(row);
+			} else {
+				multiSelectedIndex.add(row);
+			}	
+		} catch (NumberFormatException e) {
+			//can happen
+		}
+	}
+	
 	protected void setMultiSelectIndex(String[] selections) {
 		if(multiSelectedIndex == null) {
 			multiSelectedIndex = new HashSet<Integer>();
-- 
GitLab