From 260d4e0ebe748127e24edd96863918f059a76344 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Fri, 24 Mar 2017 15:23:49 +0100
Subject: [PATCH] OO-2651: add sort by the list of pools in administration

---
 .../qpool/ui/admin/PoolsAdminController.java  | 103 ++++++++----------
 1 file changed, 43 insertions(+), 60 deletions(-)

diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java
index e245434d5cc..5ad79b061ae 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java
@@ -19,15 +19,14 @@
  */
 package org.olat.modules.qpool.ui.admin;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
 import org.olat.admin.securitygroup.gui.GroupController;
 import org.olat.admin.securitygroup.gui.IdentitiesAddEvent;
 import org.olat.admin.securitygroup.gui.IdentitiesRemoveEvent;
-import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.persistence.ResultInfos;
+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;
@@ -38,14 +37,15 @@ import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.BooleanCellRenderer;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.CSSIconFlexiCellRenderer;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiColumnModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSortableColumnDef;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableRendererType;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableDataModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableModelDelegate;
 import org.olat.core.gui.components.link.Link;
-import org.olat.core.gui.components.table.TableDataModel;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
@@ -60,6 +60,7 @@ import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.model.PoolImpl;
 import org.olat.modules.qpool.ui.QuestionsController;
 import org.olat.modules.qpool.ui.events.QPoolEvent;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * 
@@ -81,12 +82,12 @@ public class PoolsAdminController extends FormBasicController {
 	private PoolEditController poolEditCtrl;
 	private DialogBoxController confirmDeleteCtrl;
 	
-	private final QPoolService qpoolService;
+	@Autowired
+	private QPoolService qpoolService;
 	
 	public PoolsAdminController(UserRequest ureq, WindowControl wControl) {
 		super(ureq, wControl, null, "pools_admin", Util.createPackageTranslator(QuestionsController.class, ureq.getLocale()));
-		
-		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
+
 		initForm(ureq);
 	}
 	
@@ -99,14 +100,13 @@ public class PoolsAdminController extends FormBasicController {
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		//add the table
 		FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
-		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, Cols.id.i18nKey(), Cols.id.ordinal(), true, "key"));
-		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, Cols.publicPool.i18nKey(), Cols.publicPool.ordinal(),
-				true, "publicPool", FlexiColumnModel.ALIGNMENT_LEFT,
+		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, Cols.id));
+		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.publicPool,
 				new BooleanCellRenderer(
 						new CSSIconFlexiCellRenderer("o_icon_pool_public"),
 						new CSSIconFlexiCellRenderer("o_icon_pool_private"))
 		));
-		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.name.i18nKey(), Cols.name.ordinal(), true, "name"));
+		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.name));
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("edit", translate("edit"), "edit-pool"));
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("pool.owners", translate("pool.owners"), "owners-pool"));
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("delete", translate("delete"), "delete-pool"));
@@ -234,7 +234,7 @@ public class PoolsAdminController extends FormBasicController {
 		}
 	}
 	
-	private enum Cols {
+	private enum Cols implements FlexiSortableColumnDef {
 		id("pool.key"),
 		publicPool("pool.public"),
 		name("pool.name");
@@ -244,63 +244,41 @@ public class PoolsAdminController extends FormBasicController {
 		private Cols(String i18nKey) {
 			this.i18nKey = i18nKey;
 		}
-		
-		public String i18nKey() {
+
+		@Override
+		public String i18nHeaderKey() {
 			return i18nKey;
 		}
+
+		@Override
+		public boolean sortable() {
+			return true;
+		}
+
+		@Override
+		public String sortKey() {
+			return name();
+		}
 	}
 	
-	private static class PoolDataModel implements FlexiTableDataModel<Pool>, TableDataModel<Pool> {
-	
-		private List<Pool> rows;
+	private static class PoolDataModel extends DefaultFlexiTableDataModel<Pool> implements SortableFlexiTableDataModel<Pool> {
+
 		private FlexiTableColumnModel columnModel;
 		private final Translator translator;
 		
 		public PoolDataModel(FlexiTableColumnModel columnModel, Translator translator) {
-			this.columnModel = columnModel;
+			super(columnModel);
 			this.translator = translator;
 		}
 		
 		@Override
-		public FlexiTableColumnModel getTableColumnModel() {
-			return columnModel;
-		}
-	
-		@Override
-		public void setTableColumnModel(FlexiTableColumnModel tableColumnModel) {
-			this.columnModel = tableColumnModel;
-		}
-	
-		@Override
-		public int getRowCount() {
-			return rows == null ? 0 : rows.size();
-		}
-		
-		@Override
-		public boolean isSelectable(int row) {
-			return true;
+		public void sort(SortKey orderBy) {
+			if(orderBy != null) {
+				List<Pool> views = new SortableFlexiTableModelDelegate<Pool>(orderBy, this, translator.getLocale()).sort();
+				super.setObjects(views);
+			}
 		}
 
-		@Override
-		public boolean isRowLoaded(int row) {
-			return rows != null && row < rows.size();
-		}
-	
-		@Override
-		public Pool getObject(int row) {
-			return rows.get(row);
-		}
-	
-		@Override
-		public void setObjects(List<Pool> objects) {
-			rows = new ArrayList<Pool>(objects);
-		}
-	
-		@Override
-		public int getColumnCount() {
-			return columnModel.getColumnCount();
-		}
-		
 		@Override
 		public PoolDataModel createCopyWithEmptyList() {
 			return new PoolDataModel(columnModel, translator);
@@ -308,11 +286,16 @@ public class PoolsAdminController extends FormBasicController {
 	
 		@Override
 		public Object getValueAt(int row, int col) {
-			Pool item = getObject(row);
+			Pool pool = getObject(row);
+			return getValueAt(pool, col);
+		}
+		
+		@Override
+		public Object getValueAt(Pool pool, int col) {
 			switch(Cols.values()[col]) {
-				case id: return item.getKey();
-				case publicPool: return new Boolean(item.isPublicPool());
-				case name: return item.getName();
+				case id: return pool.getKey();
+				case publicPool: return new Boolean(pool.isPublicPool());
+				case name: return pool.getName();
 				default: return "";
 			}
 		}
-- 
GitLab