From 7d2238dbfbc0bfe5fbb658c3a7ad7658428c9794 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 16 Jan 2018 15:17:41 +0100
Subject: [PATCH] OO-3239: add order by last name (default) in roll call table

---
 .../lecture/ui/ParticipantListDataModel.java  |  3 ++-
 .../ParticipantListRepositoryController.java  | 12 +++++++++
 .../ui/ParticipantListSortDelegate.java       | 20 ++++++++++++++
 .../lecture/ui/TeacherRollCallController.java | 27 ++++++++++++++++---
 4 files changed, 57 insertions(+), 5 deletions(-)
 create mode 100644 src/main/java/org/olat/modules/lecture/ui/ParticipantListSortDelegate.java

diff --git a/src/main/java/org/olat/modules/lecture/ui/ParticipantListDataModel.java b/src/main/java/org/olat/modules/lecture/ui/ParticipantListDataModel.java
index f772637aa1c..bbbd429ccda 100644
--- a/src/main/java/org/olat/modules/lecture/ui/ParticipantListDataModel.java
+++ b/src/main/java/org/olat/modules/lecture/ui/ParticipantListDataModel.java
@@ -54,7 +54,8 @@ implements SortableFlexiTableDataModel<ParticipantRow>, ExportableFlexiTableData
 
 	@Override
 	public void sort(SortKey sortKey) {
-		//
+		List<ParticipantRow> rows = new ParticipantListSortDelegate(sortKey, this, locale).sort();
+		super.setObjects(rows);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/modules/lecture/ui/ParticipantListRepositoryController.java b/src/main/java/org/olat/modules/lecture/ui/ParticipantListRepositoryController.java
index 84aaa7fceee..e9450735f89 100644
--- a/src/main/java/org/olat/modules/lecture/ui/ParticipantListRepositoryController.java
+++ b/src/main/java/org/olat/modules/lecture/ui/ParticipantListRepositoryController.java
@@ -29,11 +29,13 @@ import java.util.stream.Collectors;
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityModule;
 import org.olat.core.commons.fullWebApp.popup.BaseFullWebappPopupLayoutFactory;
+import org.olat.core.commons.persistence.SortKey;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 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.FlexiTableElement;
+import org.olat.core.gui.components.form.flexible.elements.FlexiTableSortOptions;
 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;
@@ -50,6 +52,7 @@ import org.olat.core.gui.control.creator.ControllerCreator;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Roles;
+import org.olat.core.id.UserConstants;
 import org.olat.modules.lecture.LectureModule;
 import org.olat.modules.lecture.LectureService;
 import org.olat.modules.lecture.RepositoryEntryLectureConfiguration;
@@ -145,9 +148,11 @@ public class ParticipantListRepositoryController extends FormBasicController {
 			layoutCont.getFormItemComponent().contextPut("withPrint", Boolean.TRUE);
 		}
 
+		FlexiTableSortOptions options = new FlexiTableSortOptions();
 		FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
 		if(isAdministrativeUser) {
 			columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ParticipantsCols.username));
+			options.setDefaultOrderBy(new SortKey(ParticipantsCols.username.sortKey(), true));
 		}
 		
 		int colPos = USER_PROPS_OFFSET;
@@ -160,6 +165,12 @@ public class ParticipantListRepositoryController extends FormBasicController {
 			FlexiColumnModel col = new DefaultFlexiColumnModel(visible, userPropertyHandler.i18nColumnDescriptorLabelKey(), colPos, true, propName);
 			columnsModel.addFlexiColumnModel(col);
 			colPos++;
+			
+			if(!options.hasDefaultOrderBy()) {
+				options.setDefaultOrderBy(new SortKey(propName, true));
+			} else if(UserConstants.LASTNAME.equals(propName)) {
+				options.setDefaultOrderBy(new SortKey(propName, true));
+			}
 		}
 		
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ParticipantsCols.plannedLectures));
@@ -199,6 +210,7 @@ public class ParticipantListRepositoryController extends FormBasicController {
 		tableEl = uifactory.addTableElement(getWindowControl(), "table", tableModel, 20, false, getTranslator(), formLayout);
 		tableEl.setExportEnabled(!printView);
 		tableEl.setEmtpyTableMessageKey("empty.table.participant.list");
+		tableEl.setSortSettings(options);
 		tableEl.setAndLoadPersistedPreferences(ureq, "participant-list-repo-entry");
 	}
 	
diff --git a/src/main/java/org/olat/modules/lecture/ui/ParticipantListSortDelegate.java b/src/main/java/org/olat/modules/lecture/ui/ParticipantListSortDelegate.java
new file mode 100644
index 00000000000..f40df7ce02e
--- /dev/null
+++ b/src/main/java/org/olat/modules/lecture/ui/ParticipantListSortDelegate.java
@@ -0,0 +1,20 @@
+package org.olat.modules.lecture.ui;
+
+import java.util.Locale;
+
+import org.olat.core.commons.persistence.SortKey;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableModelDelegate;
+
+/**
+ * 
+ * Initial date: 16 janv. 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class ParticipantListSortDelegate extends SortableFlexiTableModelDelegate<ParticipantRow> {
+
+	public ParticipantListSortDelegate(SortKey orderBy, ParticipantListDataModel tableModel, Locale locale) {
+		super(orderBy, tableModel, locale);
+	}
+
+}
diff --git a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java
index 1308c22c4b5..22bdba66698 100644
--- a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java
+++ b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java
@@ -26,10 +26,12 @@ import java.util.List;
 import java.util.Map;
 
 import org.olat.basesecurity.BaseSecurityModule;
+import org.olat.core.commons.persistence.SortKey;
 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.FlexiTableElement;
+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.MultipleSelectionElement;
 import org.olat.core.gui.components.form.flexible.elements.TextElement;
@@ -52,6 +54,7 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableCalloutWindowC
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Roles;
+import org.olat.core.id.UserConstants;
 import org.olat.core.logging.activity.CoreLoggingResourceable;
 import org.olat.core.logging.activity.LearningResourceLoggingAction;
 import org.olat.core.logging.activity.OlatResourceableType;
@@ -193,9 +196,11 @@ public class TeacherRollCallController extends FormBasicController {
 		}
 		
 		// table
+		FlexiTableSortOptions options = new FlexiTableSortOptions();
 		FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
 		if(isAdministrativeUser) {
 			columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(RollCols.username));
+			options.setDefaultOrderBy(new SortKey(RollCols.username.sortKey(), true));
 		}
 		
 		int colPos = USER_PROPS_OFFSET;
@@ -208,22 +213,33 @@ public class TeacherRollCallController extends FormBasicController {
 			FlexiColumnModel col = new DefaultFlexiColumnModel(visible, userPropertyHandler.i18nColumnDescriptorLabelKey(), colPos, true, propName);
 			columnsModel.addFlexiColumnModel(col);
 			colPos++;
+			
+			if(!options.hasDefaultOrderBy()) {
+				options.setDefaultOrderBy(new SortKey(propName, true));
+			} else if(UserConstants.LASTNAME.equals(propName)) {
+				options.setDefaultOrderBy(new SortKey(propName, true));
+			}
 		}
 		
 		if(lectureBlock.isCompulsory()) {
 			columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(RollCols.status));
 			
 			for(int i=0; i<numOfLectures; i++) {
-				FlexiColumnModel col = new DefaultFlexiColumnModel("table.header.lecture." + (i+1), i + CHECKBOX_OFFSET, true, "lecture." + (i+1));
+				DefaultFlexiColumnModel col = new DefaultFlexiColumnModel("table.header.lecture." + (i+1), i + CHECKBOX_OFFSET, true, "lecture." + (i+1));
+				col.setAlwaysVisible(true);
 				columnsModel.addFlexiColumnModel(col);
 			}
 			
 			//all button
-			columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("all",
+			DefaultFlexiColumnModel allCol = new DefaultFlexiColumnModel("all",
 					RollCols.all.ordinal(), "all",
-					new BooleanCellRenderer(new StaticFlexiCellRenderer(translate("all"), "all", null, null, translate("all.desc")), null)));
+					new BooleanCellRenderer(new StaticFlexiCellRenderer(translate("all"), "all", null, null, translate("all.desc")), null));
+			allCol.setAlwaysVisible(true);
+			columnsModel.addFlexiColumnModel(allCol);
 			if(secCallback.canViewAuthorizedAbsences() || secCallback.canEditAuthorizedAbsences()) {
-				columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(RollCols.authorizedAbsence));
+				DefaultFlexiColumnModel authorizedCol = new DefaultFlexiColumnModel(RollCols.authorizedAbsence);
+				authorizedCol.setAlwaysVisible(true);
+				columnsModel.addFlexiColumnModel(authorizedCol);
 			}
 		}
 		
@@ -232,6 +248,8 @@ public class TeacherRollCallController extends FormBasicController {
 		tableModel = new TeacherRollCallDataModel(columnsModel, secCallback, getLocale()); 
 		tableEl = uifactory.addTableElement(getWindowControl(), "table", tableModel, 20, false, getTranslator(), formLayout);
 		tableEl.setCustomizeColumns(true);
+		tableEl.setSortSettings(options);
+		tableEl.setAndLoadPersistedPreferences(ureq, "teacher-roll-call");
 		
 		//buttons
 		uifactory.addFormCancelButton("cancel", formLayout, ureq, getWindowControl());
@@ -289,6 +307,7 @@ public class TeacherRollCallController extends FormBasicController {
 			rows.add(forgeRow(participant, rollCall));
 		}
 		tableModel.setObjects(rows);
+		tableEl.reset(false, false, true);
 	}
 	
 	private TeacherRollCallRow forgeRow(Identity participant, LectureBlockRollCall rollCall) {
-- 
GitLab