From badedc99a997114bd08653bacd45f6dac2c2a113 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Mon, 22 Jan 2018 08:58:17 +0100
Subject: [PATCH] OO-3251: sort the list for coach in the participant folder
 alphabetically

---
 .../org/olat/course/nodes/PFCourseNode.java   | 15 +--
 .../course/nodes/pf/manager/PFManager.java    | 17 ----
 .../course/nodes/pf/ui/PFCoachController.java | 97 ++++++++++---------
 .../course/nodes/pf/ui/PFRunController.java   |  9 +-
 4 files changed, 57 insertions(+), 81 deletions(-)

diff --git a/src/main/java/org/olat/course/nodes/PFCourseNode.java b/src/main/java/org/olat/course/nodes/PFCourseNode.java
index efebb7a2655..a6d6dfe6dc0 100644
--- a/src/main/java/org/olat/course/nodes/PFCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/PFCourseNode.java
@@ -124,20 +124,17 @@ public class PFCourseNode extends AbstractAccessableCourseNode {
 	}
 	
 	public boolean hasParticipantBoxConfigured() {
-		boolean hasStundentBox = getModuleConfiguration().getBooleanSafe(CONFIG_KEY_PARTICIPANTBOX);
-		return hasStundentBox;
+		return getModuleConfiguration().getBooleanSafe(CONFIG_KEY_PARTICIPANTBOX);
 	}
 	
 	public boolean hasCoachBoxConfigured() {
-		boolean hasTeacherBox = getModuleConfiguration().getBooleanSafe(CONFIG_KEY_COACHBOX);
-		return hasTeacherBox;
+		return getModuleConfiguration().getBooleanSafe(CONFIG_KEY_COACHBOX);
 	}
 	
 	public boolean hasAlterFileConfigured() {
 		boolean hasStundentBox = getModuleConfiguration().getBooleanSafe(CONFIG_KEY_PARTICIPANTBOX);
 		if (hasStundentBox) {
-			boolean hasAlterFile = getModuleConfiguration().getBooleanSafe(CONFIG_KEY_ALTERFILE);
-			return hasAlterFile;
+			return getModuleConfiguration().getBooleanSafe(CONFIG_KEY_ALTERFILE);
 		}
 		return false;
 	}
@@ -145,8 +142,7 @@ public class PFCourseNode extends AbstractAccessableCourseNode {
 	public boolean hasLimitCountConfigured() {
 		boolean hasStundentBox = getModuleConfiguration().getBooleanSafe(CONFIG_KEY_PARTICIPANTBOX);
 		if (hasStundentBox) {
-			boolean hasLimitCount = getModuleConfiguration().getBooleanSafe(CONFIG_KEY_LIMITCOUNT);
-			return hasLimitCount;
+			return getModuleConfiguration().getBooleanSafe(CONFIG_KEY_LIMITCOUNT);
 		}
 		return false;
 	}
@@ -161,8 +157,7 @@ public class PFCourseNode extends AbstractAccessableCourseNode {
 	public boolean hasDropboxTimeFrameConfigured() {
 		boolean hasStundentBox = getModuleConfiguration().getBooleanSafe(CONFIG_KEY_PARTICIPANTBOX);
 		if (hasStundentBox) {
-			boolean hasTimeFrame = getModuleConfiguration().getBooleanSafe(CONFIG_KEY_TIMEFRAME);
-			return hasTimeFrame;
+			return getModuleConfiguration().getBooleanSafe(CONFIG_KEY_TIMEFRAME);
 		}
 		return false;
 	}
diff --git a/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java b/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java
index dda27b3f1c2..97a7f26e143 100644
--- a/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java
+++ b/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java
@@ -40,8 +40,6 @@ import org.olat.basesecurity.GroupRoles;
 import org.olat.core.commons.modules.bc.components.FolderComponent;
 import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.commons.services.notifications.SubscriptionContext;
-import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.logging.OLog;
@@ -245,21 +243,6 @@ public class PFManager {
 			uploadFileToReturnBox(uploadFile, fileName, courseEnv, pfNode, identity);			
 		}
 	}
-
-	
-	/**
-	 * Export media resource as folder download.
-	 *
-	 * @param ureq
-	 * @param identities
-	 * @param pfNode 
-	 * @param courseEnv 
-	 */
-	public MediaResource exportMediaResource (UserRequest ureq, List<Identity> identities, PFCourseNode pfNode, CourseEnvironment courseEnv) {
-		MediaResource resource = new FileSystemExport (identities, pfNode, courseEnv, ureq.getLocale());
-		ureq.getDispatchResult().setResultingMediaResource(resource);
-		return resource;
-	}
 	
 	/**
 	 * Calculate callback dependent on ModuleConfiguration.
diff --git a/src/main/java/org/olat/course/nodes/pf/ui/PFCoachController.java b/src/main/java/org/olat/course/nodes/pf/ui/PFCoachController.java
index d9701e30875..9d6550e0a57 100644
--- a/src/main/java/org/olat/course/nodes/pf/ui/PFCoachController.java
+++ b/src/main/java/org/olat/course/nodes/pf/ui/PFCoachController.java
@@ -25,6 +25,7 @@ import java.util.List;
 
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityModule;
+import org.olat.core.commons.persistence.SortKey;
 import org.olat.core.commons.services.notifications.PublisherData;
 import org.olat.core.commons.services.notifications.SubscriptionContext;
 import org.olat.core.commons.services.notifications.ui.ContextualSubscriptionController;
@@ -33,6 +34,7 @@ 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.elements.FormLink;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.FormEvent;
@@ -46,23 +48,22 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlex
 import org.olat.core.gui.components.form.flexible.impl.elements.table.TextFlexiCellRenderer;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.ControllerEventListener;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
+import org.olat.core.gui.media.MediaResource;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Roles;
 import org.olat.core.id.UserConstants;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.course.nodes.PFCourseNode;
-import org.olat.course.nodes.TitledWrapperHelper;
+import org.olat.course.nodes.pf.manager.FileSystemExport;
 import org.olat.course.nodes.pf.manager.PFManager;
 import org.olat.course.nodes.pf.manager.PFView;
 import org.olat.course.nodes.pf.ui.DropBoxTableModel.DropBoxCols;
 import org.olat.course.run.environment.CourseEnvironment;
-import org.olat.course.run.navigation.NodeRunConstructionResult;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.resource.OLATResource;
 import org.olat.user.HomePageConfig;
@@ -88,7 +89,6 @@ public class PFCoachController extends FormBasicController implements Controller
 	private Link backLink;
 	private DropBoxTableModel tableModel;
 	private FlexiTableElement dropboxTable;
-	private VelocityContainer mainVC;
 	
 	private CloseableModalController cmc;
 	private PFFileUploadController pfFileUploadCtr;
@@ -101,7 +101,7 @@ public class PFCoachController extends FormBasicController implements Controller
 
 	private UserCourseEnvironment userCourseEnv;
 	private CourseEnvironment courseEnv;
-	private Identity identity;
+
 	private PFView pfView;
 	@Autowired
 	private PFManager pfManager; 
@@ -119,7 +119,6 @@ public class PFCoachController extends FormBasicController implements Controller
 		this.userCourseEnv = userCourseEnv;
 		this.courseEnv = userCourseEnv.getCourseEnvironment();
 		this.pfNode = sfNode;
-		this.identity = ureq.getIdentity();
 		this.pfView = pfView;
 		
 		Roles roles = ureq.getUserSession().getRoles();
@@ -128,6 +127,7 @@ public class PFCoachController extends FormBasicController implements Controller
 		setTranslator(userManager.getPropertyHandlerTranslator(getTranslator()));
 		
 		initForm(ureq);
+		loadModel(true);
 	}
 
 	@Override
@@ -148,7 +148,7 @@ public class PFCoachController extends FormBasicController implements Controller
 					fireEvent(ureq, Event.CHANGED_EVENT);
 				} else {
 					pfManager.uploadFileToDropBox(pfFileUploadCtr.getUpLoadFile(),
-							pfFileUploadCtr.getUploadFileName(), 4, courseEnv, pfNode, identity);
+							pfFileUploadCtr.getUploadFileName(), 4, courseEnv, pfNode, getIdentity());
 				}
 				cmc.deactivate();
 				cleanUpCMC();
@@ -157,19 +157,11 @@ public class PFCoachController extends FormBasicController implements Controller
 			cleanUpCMC();
 		}
 		super.event(ureq, source, event);
-		
 	}
 
 	@Override
 	protected void doDispose() {
 		// nothing to dispose
-
-	}
-	
-	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq) {
-		// integrate it into the olat menu
-		Controller ctrl = TitledWrapperHelper.getWrapper(ureq, getWindowControl(), this, pfNode, "o_pf_icon");
-		return new NodeRunConstructionResult(ctrl);
 	}
 
 	@Override
@@ -203,36 +195,37 @@ public class PFCoachController extends FormBasicController implements Controller
 				} 
 			}
 		}
-
 	}
 	
-	private void doSelectParticipantFolder (UserRequest ureq, UserPropertiesRow row, PFView pfView) {
-		Identity identity = securityManager.loadIdentityByKey(row.getIdentityKey());
+	private void doSelectParticipantFolder (UserRequest ureq, UserPropertiesRow row, PFView view) {
+		Identity assessedIdentity = securityManager.loadIdentityByKey(row.getIdentityKey());
 		removeAsListenerAndDispose(pfParticipantController);
 		pfParticipantController = new PFParticipantController(ureq, getWindowControl(), pfNode,
-				userCourseEnv, identity, pfView, true, false);
+				userCourseEnv, assessedIdentity, view, true, false);
 		listenTo(pfParticipantController);
-		mainVC.put("single", pfParticipantController.getInitialComponent());
+		flc.put("single", pfParticipantController.getInitialComponent());
 	}
 	
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		mainVC = ((FormLayoutContainer) formLayout).getFormItemComponent();
-		
-		OLATResource course = courseEnv.getCourseGroupManager().getCourseResource();
-		String businessPath = getWindowControl().getBusinessControl().getAsString();
-		SubscriptionContext subsContext = new SubscriptionContext(course, pfNode.getIdent());
-		PublisherData publisherData = new PublisherData(OresHelper.calculateTypeName(PFCourseNode.class),
-				String.valueOf(course.getResourceableId()), businessPath);
-		contextualSubscriptionCtr = new ContextualSubscriptionController(ureq, getWindowControl(), subsContext,
-				publisherData);
-		listenTo(contextualSubscriptionCtr);
-		mainVC.put("contextualSubscription", contextualSubscriptionCtr.getInitialComponent());	
+		if(formLayout instanceof FormLayoutContainer) {
+			FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout;
+			OLATResource course = courseEnv.getCourseGroupManager().getCourseResource();
+			String businessPath = getWindowControl().getBusinessControl().getAsString();
+			SubscriptionContext subsContext = new SubscriptionContext(course, pfNode.getIdent());
+			PublisherData publisherData = new PublisherData(OresHelper.calculateTypeName(PFCourseNode.class),
+					String.valueOf(course.getResourceableId()), businessPath);
+			contextualSubscriptionCtr = new ContextualSubscriptionController(ureq, getWindowControl(), subsContext,
+					publisherData);
+			listenTo(contextualSubscriptionCtr);
+			layoutCont.put("contextualSubscription", contextualSubscriptionCtr.getInitialComponent());
+			backLink = LinkFactory.createLinkBack(layoutCont.getFormItemComponent(), this);
+		}
 		
-		backLink = LinkFactory.createLinkBack(mainVC, this);
 		FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
 
 		int i = 0;
+		FlexiTableSortOptions options = new FlexiTableSortOptions();
 		for (UserPropertyHandler userPropertyHandler : userPropertyHandlers) {
 			int colIndex = USER_PROPS_OFFSET + i++;
 			if (userPropertyHandler == null) continue;
@@ -250,6 +243,12 @@ public class PFCoachController extends FormBasicController implements Controller
 				col = new DefaultFlexiColumnModel(visible, userPropertyHandler.i18nColumnDescriptorLabelKey(), colIndex, true, propName);
 			}
 			columnsModel.addFlexiColumnModel(col);
+			
+			if(!options.hasDefaultOrderBy()) {
+				options.setDefaultOrderBy(new SortKey(propName, true));
+			} else if(UserConstants.LASTNAME.equals(propName)) {
+				options.setDefaultOrderBy(new SortKey(propName, true));
+			}
 		}
 
 		if (pfNode.hasParticipantBoxConfigured()){
@@ -267,15 +266,13 @@ public class PFCoachController extends FormBasicController implements Controller
 		tableModel = new DropBoxTableModel(columnsModel, getTranslator());
 		
 		dropboxTable = uifactory.addTableElement(getWindowControl(), "table", tableModel, getTranslator(), formLayout);
-		
 		dropboxTable.setMultiSelect(true);
 		dropboxTable.setSelectAllEnable(true);
 		dropboxTable.setExportEnabled(true);
-		dropboxTable.setAndLoadPersistedPreferences(ureq, this.getClass().getName() + "_" + pfView.name());
+		dropboxTable.setSortSettings(options);
+		dropboxTable.setAndLoadPersistedPreferences(ureq, "participant-folder_coach_" + pfView.name());
 		dropboxTable.setEmtpyTableMessageKey("table.empty");
 		
-		tableModel.setObjects(pfManager.getParticipants(identity, pfNode, userPropertyHandlers, getLocale(), courseEnv, userCourseEnv.isAdmin()));
-		mainVC.contextPut("hasParticipants", tableModel.getRowCount() > 0);
 
 		
 		FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
@@ -286,6 +283,12 @@ public class PFCoachController extends FormBasicController implements Controller
 		uploadAllLink = uifactory.addFormLink("upload.link", buttonGroupLayout, Link.BUTTON);
 	}
 	
+	private void loadModel(boolean full) {
+		List<DropBoxRow> rows = pfManager.getParticipants(getIdentity(), pfNode, userPropertyHandlers, getLocale(), courseEnv, userCourseEnv.isAdmin());
+		tableModel.setObjects(rows);
+		dropboxTable.reset(full, full, true);
+		flc.contextPut("hasParticipants", tableModel.getRowCount() > 0);
+	}
 	
 	private void uploadToSelection (File uploadFile, String fileName) {
 		List<Long> identitykeys = new ArrayList<>();
@@ -299,39 +302,37 @@ public class PFCoachController extends FormBasicController implements Controller
 	
 	private void downloadFromSelection (UserRequest ureq) {
 		List<Long> identitykeys = new ArrayList<>();
-		for (int i : dropboxTable.getMultiSelectedIndex()) {			
+		for (Integer i : dropboxTable.getMultiSelectedIndex()) {			
 			identitykeys.add(tableModel.getObject(i).getIdentity().getIdentityKey());
 		}
 		List<Identity> identities = securityManager.loadIdentityByKeys(identitykeys);
-		
-		pfManager.exportMediaResource(ureq, identities, pfNode, courseEnv);
+		MediaResource resource = new FileSystemExport (identities, pfNode, courseEnv, getLocale());
+		ureq.getDispatchResult().setResultingMediaResource(resource);
 	}
 
-
 	@Override
 	protected void formOK(UserRequest ureq) {
-		
+		//
 	}
 	
 	private void doOpenUploadController (UserRequest ureq, boolean uploadToAll) {
 		pfFileUploadCtr = new PFFileUploadController(ureq, getWindowControl(), uploadToAll);
 		listenTo(pfFileUploadCtr);
+		
 		cmc = new CloseableModalController(getWindowControl(), translate("close"), 
 				pfFileUploadCtr.getInitialComponent(), true, translate("upload.link"));
 		listenTo(cmc);
-		
 		cmc.activate();
 	}
 	
 	private void doOpenHomePage (UserRequest ureq, UserPropertiesRow row) {		
-
-		Identity identity = securityManager.loadIdentityByKey(row.getIdentityKey());
-		homePageDisplayController = new HomePageDisplayController(ureq, getWindowControl(), identity, new HomePageConfig());
+		Identity assessedIdentity = securityManager.loadIdentityByKey(row.getIdentityKey());
+		homePageDisplayController = new HomePageDisplayController(ureq, getWindowControl(), assessedIdentity, new HomePageConfig());
 		listenTo(homePageDisplayController);
+		
 		cmc = new CloseableModalController(getWindowControl(), translate("close"), 
 				homePageDisplayController.getInitialComponent(), true, translate("upload.link"));
 		listenTo(cmc);
-		
 		cmc.activate();
 	}
 	
@@ -344,10 +345,10 @@ public class PFCoachController extends FormBasicController implements Controller
 	
 	private void back() {
 		if(pfParticipantController != null) {
-			mainVC.remove(pfParticipantController.getInitialComponent());
+			flc.remove(pfParticipantController.getInitialComponent());
 			removeAsListenerAndDispose(pfParticipantController);
 			pfParticipantController = null;
+			loadModel(false);
 		}
 	}
-
 }
diff --git a/src/main/java/org/olat/course/nodes/pf/ui/PFRunController.java b/src/main/java/org/olat/course/nodes/pf/ui/PFRunController.java
index ec44b07e581..fd1d561a7bf 100644
--- a/src/main/java/org/olat/course/nodes/pf/ui/PFRunController.java
+++ b/src/main/java/org/olat/course/nodes/pf/ui/PFRunController.java
@@ -67,8 +67,7 @@ public class PFRunController extends BasicController {
 		super(ureq, wControl);
 		this.pfNode = pfNode;
 		this.userCourseEnv = userCourseEnv;
-		
-		this.pfView = pfManager.providePFView(pfNode);
+		pfView = pfManager.providePFView(pfNode);
 		
 		mainVC = createVelocityContainer("run");
 	
@@ -85,9 +84,7 @@ public class PFRunController extends BasicController {
 			doOpenParticipantsView(ureq);
 		}
 		
-		
 		putInitialPanel(mainVC);
-
 	}
 
 	@Override
@@ -140,9 +137,9 @@ public class PFRunController extends BasicController {
 		doOpenParticipantsView(ureq, ureq.getIdentity(), pfView); 
 	}
 	
-	private void doOpenParticipantsView(UserRequest ureq, Identity identity, PFView pfView) {
+	private void doOpenParticipantsView(UserRequest ureq, Identity identity, PFView view) {
 		participantController = new PFParticipantController(ureq, getWindowControl(), pfNode, 
-				userCourseEnv, identity, pfView, false, false);
+				userCourseEnv, identity, view, false, false);
 		listenTo(participantController);
 		mainVC.put("segmentCmp", participantController.getInitialComponent());
 	}
-- 
GitLab