From 6a9b1ce2a062699b6293dd61f4183e885f3b93c6 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Sun, 21 Jul 2019 08:48:02 +0200
Subject: [PATCH] OO-4159: implement a select page, show total number of rows
 in all

---
 .../flexible/elements/FlexiTableElement.java  |  5 ++
 .../table/AbstractFlexiTableRenderer.java     | 13 ++++-
 .../elements/table/FlexiTableElementImpl.java | 51 +++++++++++++------
 .../table/_i18n/LocalStrings_de.properties    |  4 +-
 .../table/_i18n/LocalStrings_en.properties    |  4 +-
 .../table/_i18n/LocalStrings_fr.properties    |  2 +
 .../ui/ImportCurriculumController.java        |  2 +
 7 files changed, 63 insertions(+), 18 deletions(-)

diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java
index fa4dfd61809..2c861be83bc 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java
@@ -230,6 +230,11 @@ public interface FlexiTableElement extends FormItem {
 	 */
 	public void selectAll();
 	
+	/**
+	 * Select all rows visible on the current page.
+	 */
+	public void selectPage();
+	
 	/**
 	 * Remove all multi selected index.
 	 */
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java
index dc310a1dcf1..b65247113ba 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java
@@ -405,11 +405,22 @@ public abstract class AbstractFlexiTableRenderer extends DefaultComponentRendere
 			sb.append("<div class='o_table_footer'><div class='o_table_checkall input-sm'>");
 
 			if(ftE.isSelectAllEnable()) {
+				FlexiTableDataModel<?> dataModel = ftE.getTableDataModel();
+				int numOfRows = dataModel.getRowCount();
+				
 				sb.append("<a id='")
 				  .append(dispatchId).append("_sa' href=\"javascript:o_table_toggleCheck('").append(formName).append("', true);")
 				  .append(FormJSHelper.getXHRFnCallFor(ftE.getRootForm(), dispatchId, 1, true, true, true,
 						  new NameValuePair("select", "checkall")))
-				  .append("\"><i class='o_icon o_icon-lg o_icon_check_on'> </i> <span>").append(translator.translate("form.checkall"))
+				  .append("\"><i class='o_icon o_icon-lg o_icon_check_on'> </i> <span>")
+				  .append(translator.translate("form.checkall.numbered", new String[] { Integer.toString(numOfRows) }))
+				  .append("</span></a>");
+				
+				sb.append("<a id='")
+				  .append(dispatchId).append("_sa' href=\"javascript:o_table_toggleCheck('").append(formName).append("', true);")
+				  .append(FormJSHelper.getXHRFnCallFor(ftE.getRootForm(), dispatchId, 1, true, true, true,
+						  new NameValuePair("select", "checkpage")))
+				  .append("\"><i class='o_icon o_icon-lg o_icon_check_on'> </i> <span>").append(translator.translate("form.checkpage"))
 				  .append("</span></a>");
 	
 				sb.append("<a id='")
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 d6fad8e3d64..3e3819ce912 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
@@ -163,7 +163,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		for(int i=dataModel.getTableColumnModel().getColumnCount(); i-->0; ) {
 			FlexiColumnModel col = dataModel.getTableColumnModel().getColumnModel(i);
 			if(col.isDefaultVisible()) {
-				enabledColumnIndex.add(new Integer(col.getColumnIndex()));
+				enabledColumnIndex.add(Integer.valueOf(col.getColumnIndex()));
 			}
 		}
 
@@ -923,6 +923,8 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 			doExport(ureq);
 		} else if(dispatchuri != null && select != null && select.equals("checkall")) {
 			selectAll();
+		} else if(dispatchuri != null && select != null && select.equals("checkpage")) {
+			selectPage();
 		} else if(dispatchuri != null && select != null && select.equals("uncheckall")) {
 			doUnSelectAll();
 		} else if(customButton != null
@@ -998,7 +1000,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		} else if(searchFieldEl.getComponent() == source) {
 			if(event instanceof AutoCompleteEvent) {
 				AutoCompleteEvent ace = (AutoCompleteEvent)event;
-				doSearch(ureq, FlexiTableSearchEvent.QUICK_SEARCH_KEY_SELECTION, ace.getKey(), null);
+				doSearch(ureq, FlexiTableReduceEvent.QUICK_SEARCH_KEY_SELECTION, ace.getKey(), null);
 			}
 		}
 	}
@@ -1081,7 +1083,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		for(int i=dataModel.getRowCount(); i-->0; ) {
 			Object obj = dataModel.getObject(i);
 			if(obj != null && selectedObjects.contains(obj)) {
-				multiSelectedIndex.put(new Integer(i), obj);
+				multiSelectedIndex.put(Integer.valueOf(i), obj);
 			}
 		}
 		
@@ -1184,7 +1186,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		}
 		component.setDirty(true);
 		
-		getRootForm().fireFormEvent(ureq, new FlexiTableFilterEvent(FlexiTableFilterEvent.FILTER, this,
+		getRootForm().fireFormEvent(ureq, new FlexiTableFilterEvent(FlexiTableReduceEvent.FILTER, this,
 				getQuickSearchString(), getSelectedFilters(), getSelectedExtendedFilters(), null, FormEvent.ONCLICK));
 	}
 	
@@ -1213,7 +1215,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 			}
 		}
 
-		getRootForm().fireFormEvent(ureq, new FlexiTableSearchEvent(FlexiTableSearchEvent.EXTENDED_FILTER, this,
+		getRootForm().fireFormEvent(ureq, new FlexiTableSearchEvent(FlexiTableReduceEvent.EXTENDED_FILTER, this,
 				getSearchText(), getSelectedFilters(), getSelectedExtendedFilters(), getConditionalQueries(), FormEvent.ONCLICK));
 	}
 	
@@ -1512,7 +1514,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 			search = searchFieldEl.getValue();
 		}
 		List<String> condQueries = extendedSearchCtrl.getConditionalQueries();
-		doSearch(ureq, FlexiTableSearchEvent.SEARCH, search, condQueries);
+		doSearch(ureq, FlexiTableReduceEvent.SEARCH, search, condQueries);
 	}
 	
 	protected void evalSearchRequest(UserRequest ureq) {
@@ -1528,9 +1530,9 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		String search = searchFieldEl.getValue();
 
 		if(key != null) {
-			doSearch(ureq, FlexiTableSearchEvent.QUICK_SEARCH_KEY_SELECTION, key, null);
+			doSearch(ureq, FlexiTableReduceEvent.QUICK_SEARCH_KEY_SELECTION, key, null);
 		} else if(StringHelper.containsNonWhitespace(search)) {
-			doSearch(ureq, FlexiTableSearchEvent.QUICK_SEARCH, search, null);
+			doSearch(ureq, FlexiTableReduceEvent.QUICK_SEARCH, search, null);
 		} else {
 			resetSearch(ureq);
 		}
@@ -1559,7 +1561,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		}
 		if(StringHelper.containsNonWhitespace(search)) {
 			searchFieldEl.setValue(search);
-			doSearch(ureq, FlexiTableSearchEvent.QUICK_SEARCH, search, null);
+			doSearch(ureq, FlexiTableReduceEvent.QUICK_SEARCH, search, null);
 		}
 	}
 	
@@ -1574,11 +1576,30 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		int numOfRows = getRowCount();
 		for(int i=0; i<numOfRows;i++) {
 			Object objectRow = dataModel.getObject(i);
-			multiSelectedIndex.put(new Integer(i), objectRow);
+			multiSelectedIndex.put(Integer.valueOf(i), objectRow);
 		}
 		allSelectedNeedLoadOfWholeModel = true;
 	}
 	
+	@Override
+	public void selectPage() {
+		if(multiSelectedIndex != null) {
+			multiSelectedIndex.clear();
+		} else {
+			multiSelectedIndex = new HashMap<>();
+		}
+		
+		int firstRow = getFirstRow();
+		int maxRows = getMaxRows();
+		int rows = dataModel.getRowCount();
+		int lastRow = Math.min(rows, firstRow + maxRows);
+		for (int i = firstRow; i < lastRow; i++) {
+			Object objectRow = dataModel.getObject(i);
+			multiSelectedIndex.put(Integer.valueOf(i), objectRow);
+		}
+		allSelectedNeedLoadOfWholeModel = false;
+	}
+	
 	protected void doUnSelectAll() {
 		if(multiSelectedIndex != null) {
 			multiSelectedIndex.clear();
@@ -1668,7 +1689,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 
 	@Override
 	public boolean isMultiSelectedIndex(int index) {
-		return multiSelectedIndex != null && multiSelectedIndex.containsKey(new Integer(index));
+		return multiSelectedIndex != null && multiSelectedIndex.containsKey(Integer.valueOf(index));
 	}
 	
 	protected void toogleSelectIndex(String selection) {
@@ -1685,7 +1706,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		}
 		
 		try {
-			Integer row = new Integer(rowStr);
+			Integer row = Integer.valueOf(rowStr);
 			if(multiSelectedIndex.containsKey(row)) {
 				if(multiSelectedIndex.remove(row) != null && allSelectedNeedLoadOfWholeModel) {
 					allSelectedNeedLoadOfWholeModel = false;
@@ -1703,12 +1724,12 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		if(multiSelectedIndex == null) {
 			multiSelectedIndex = new HashMap<>();
 		}
-		//selection format row_{formDispId}-{index}
+		// selection format row_{formDispId}-{index}
 		if(selections != null && selections.length > 0) {
 			int firstIndex = getPageSize() * getPage();
 			int lastResult = firstIndex + getPageSize() -1;
 			for(int i=firstIndex; i<lastResult; i++) {
-				multiSelectedIndex.remove(new Integer(i));
+				multiSelectedIndex.remove(Integer.valueOf(i));
 			}
 
 			for(String selection:selections) {	
@@ -1717,7 +1738,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 					String rowStr = selection.substring(index+1);
 					int row = Integer.parseInt(rowStr);
 					Object objectRow = dataModel.getObject(row);
-					multiSelectedIndex.put(new Integer(row), objectRow);
+					multiSelectedIndex.put(Integer.valueOf(row), objectRow);
 				}
 			}
 		}
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/_i18n/LocalStrings_de.properties
index 9fd2ddba78e..88bcb8bda50 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/_i18n/LocalStrings_de.properties
@@ -2,4 +2,6 @@
 page.size.a=Zeige {0} bis {1} von {2} Zeilen.
 page.size.b=Eintr\u00E4ge pro Seite
 show.all=Alle
-remove.filters=Filter entfernen
\ No newline at end of file
+remove.filters=Filter entfernen
+form.checkall.numbered=Alle {0} Zeilen ausw\u00E4hlen
+form.checkpage=Alle Zeilen der Seite ausw\u00E4hlen
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/_i18n/LocalStrings_en.properties
index 006a8c00518..a3062842fa1 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/_i18n/LocalStrings_en.properties
@@ -2,4 +2,6 @@
 page.size.a=Show {0} to {1} of {2} rows.
 page.size.b=Entries per page
 show.all=All
-remove.filters=Remove filters
\ No newline at end of file
+remove.filters=Remove filters
+form.checkall.numbered=Select all {0} rows
+form.checkpage=Select page's rows
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/_i18n/LocalStrings_fr.properties
index efeb7e90534..f6771ff8112 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/_i18n/LocalStrings_fr.properties
@@ -3,3 +3,5 @@ page.size.a=Montre {0} \u00E0 {1} de {2} lignes.
 page.size.b=Entr\u00E9es par page
 remove.filters=Enlever les filtres
 show.all=Toutes
+form.checkall.numbered=S\u00E9lectionner toutes les {0} lignes
+form.checkpage=S\u00E9lectionner la page
diff --git a/src/main/java/org/olat/modules/curriculum/ui/ImportCurriculumController.java b/src/main/java/org/olat/modules/curriculum/ui/ImportCurriculumController.java
index d30e910c3d6..b4427e95716 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/ImportCurriculumController.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/ImportCurriculumController.java
@@ -75,9 +75,11 @@ public class ImportCurriculumController extends FormBasicController {
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		uploadFileEl = uifactory.addFileElement(getWindowControl(), "curriculum.file", formLayout);
 		uploadFileEl.limitToMimeType(Collections.singleton("application/zip"), "error.mimetype", new String[]{ "ZIP" });
+		uploadFileEl.setMandatory(true);
 		uploadFileEl.addActionListener(FormEvent.ONCHANGE);
 		
 		displayNameEl = uifactory.addTextElement("curriculum.displayName", 255, "", formLayout);
+		displayNameEl.setMandatory(true);
 		
 		initFormOrganisations(formLayout, ureq.getUserSession());
 		
-- 
GitLab