From 04d2cce50a4e8e91411b32867ea1b69f5d2b563d Mon Sep 17 00:00:00 2001
From: Steve Swinsburg <steve.swinsburg@gmail.com>
Date: Mon, 22 Jun 2015 21:15:03 +1000
Subject: [PATCH] Fix some compilation issues with the import work from recent
 merge. Wire up the sorting and toggling for the assignment name. Stored in
 session.

---
 .../business/GradebookNgBusinessService.java  | 33 +++++++----------
 .../gradebookng/business/SortDirection.java   |  8 ++++-
 .../business/helpers/ImportGradesHelper.java  | 36 ++++++++++---------
 .../model/GbAssignmentGradeSortOrder.java     | 20 +++++++++--
 .../tool/model/GradebookUiSettings.java       |  7 ++--
 .../gradebookng/tool/pages/GradebookPage.java | 15 +++++---
 .../panels/AssignmentColumnHeaderPanel.java   | 27 +++++++++++---
 .../tool/panels/GradeItemCellPanel.java       | 12 ++-----
 .../panels/GradeItemCellPopoverPanel.java     |  2 ++
 .../importExport/GradeImportUploadStep.java   |  4 +--
 10 files changed, 98 insertions(+), 66 deletions(-)

diff --git a/tool/src/java/org/sakaiproject/gradebookng/business/GradebookNgBusinessService.java b/tool/src/java/org/sakaiproject/gradebookng/business/GradebookNgBusinessService.java
index f873f75b548b..7b2237d98528 100644
--- a/tool/src/java/org/sakaiproject/gradebookng/business/GradebookNgBusinessService.java
+++ b/tool/src/java/org/sakaiproject/gradebookng/business/GradebookNgBusinessService.java
@@ -338,31 +338,30 @@ public List<GbStudentGradeInfo> buildGradeMatrix(List<Assignment> assignments) {
 	}
 	
 	/**
-	 * Build the matrix of assignments, students and grades for all students, with the specified sortOrder
+	 * Build the matrix of assignments and grades for the given users.
+	 * In general this is just one, as we use it for the student summary but could be more for paging etc
 	 * 
 	 * @param assignments list of assignments
-	 * @param sortOrder the sort order
+	 * @param list of uuids
 	 * @return
 	 */
-	public List<GbStudentGradeInfo> buildGradeMatrix(List<Assignment> assignments, GbAssignmentGradeSortOrder sortOrder) {
-		return this.buildGradeMatrix(assignments, this.getGradeableUsers(), sortOrder);
+	public List<GbStudentGradeInfo> buildGradeMatrix(List<Assignment> assignments, List<String> studentUuids) {
+		return this.buildGradeMatrix(assignments, studentUuids, null);
 	}
 	
 	/**
-	 * Build the matrix of assignments and grades for the given users.
-	 * In general this is just one, as we use it for the student summary but could be more for paging etc
+	 * Build the matrix of assignments, students and grades for all students, with the specified sortOrder
 	 * 
 	 * @param assignments list of assignments
-	 * @param list of uuids
+	 * @param sortOrder the sort order
 	 * @return
 	 */
-	public List<GbStudentGradeInfo> buildGradeMatrix(List<Assignment> assignments, List<String> studentUuids) {
-		return this.buildGradeMatrix(assignments, studentUuids, null);
-		
+	public List<GbStudentGradeInfo> buildGradeMatrix(List<Assignment> assignments, GbAssignmentGradeSortOrder sortOrder) {
+		return this.buildGradeMatrix(assignments, this.getGradeableUsers(), sortOrder);
 	}
+	
 	/**
-	 * Build the matrix of assignments and grades for the given users.
-	 * In general this is just one, as we use it for the student summary but could be more for paging etc
+	 * Build the matrix of assignments and grades for the given users with the specified sort order
 	 * 
 	 * @param assignments list of assignments
 	 * @param list of uuids
@@ -432,9 +431,7 @@ public List<GbStudentGradeInfo> buildGradeMatrix(List<Assignment> assignments, L
 		//get the matrix as a list of GbStudentGradeInfo
 		ArrayList<GbStudentGradeInfo> items = new ArrayList<>(matrix.values());
 
-		
-
-		//TODO extract this out into own method where it can do the checking
+		//sort the matrix based on the supplied sort order (if any)
 		if(sortOrder != null) {
 			GradeComparator comparator = new GradeComparator();
 			comparator.setAssignmentId(sortOrder.getAssignmentId());
@@ -448,13 +445,7 @@ public List<GbStudentGradeInfo> buildGradeMatrix(List<Assignment> assignments, L
 			if(direction == SortDirection.DESCENDING) {
 				Collections.reverse(items);
 			}
-			
-			//TODO front end neds to know direction of the sort, maybe it can hold a value as to the sort direction
-			//store the sort order in the SESSION, then the frpnt end can just toggle it and its handled here. 
-			
-
 		}
-	
 		
 		return items;
 	}
diff --git a/tool/src/java/org/sakaiproject/gradebookng/business/SortDirection.java b/tool/src/java/org/sakaiproject/gradebookng/business/SortDirection.java
index 19ac700f80ec..dfa00d010dd3 100644
--- a/tool/src/java/org/sakaiproject/gradebookng/business/SortDirection.java
+++ b/tool/src/java/org/sakaiproject/gradebookng/business/SortDirection.java
@@ -5,6 +5,12 @@
  *
  */
 public enum SortDirection {
+	
 	ASCENDING,
-	DESCENDING
+	DESCENDING;
+	
+	// cycles the values
+	public SortDirection toggle() {
+		return values()[(ordinal() + 1) % values().length];
+	}
 }
diff --git a/tool/src/java/org/sakaiproject/gradebookng/business/helpers/ImportGradesHelper.java b/tool/src/java/org/sakaiproject/gradebookng/business/helpers/ImportGradesHelper.java
index 9cef9caf5a97..5cb2e2703b64 100644
--- a/tool/src/java/org/sakaiproject/gradebookng/business/helpers/ImportGradesHelper.java
+++ b/tool/src/java/org/sakaiproject/gradebookng/business/helpers/ImportGradesHelper.java
@@ -1,14 +1,26 @@
 package org.sakaiproject.gradebookng.business.helpers;
 
 
-import au.com.bytecode.opencsv.CSVReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.text.MessageFormat;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import lombok.extern.apachecommons.CommonsLog;
+
 import org.apache.commons.lang.StringUtils;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.usermodel.WorkbookFactory;
 import org.sakaiproject.entity.api.ResourceProperties;
+import org.sakaiproject.gradebookng.business.model.GbGradeInfo;
+import org.sakaiproject.gradebookng.business.model.GbStudentGradeInfo;
 import org.sakaiproject.gradebookng.business.model.ImportColumn;
 import org.sakaiproject.gradebookng.business.model.ImportedGrade;
 import org.sakaiproject.gradebookng.business.model.ImportedGradeItem;
@@ -17,20 +29,10 @@
 import org.sakaiproject.gradebookng.business.model.ProcessedGradeItemDetail;
 import org.sakaiproject.gradebookng.business.model.ProcessedGradeItemStatus;
 import org.sakaiproject.gradebookng.tool.model.AssignmentStudentGradeInfo;
-import org.sakaiproject.gradebookng.tool.model.GradeInfo;
-import org.sakaiproject.gradebookng.tool.model.StudentGradeInfo;
 import org.sakaiproject.service.gradebook.shared.Assignment;
 import org.sakaiproject.util.BaseResourcePropertiesEdit;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.text.MessageFormat;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import au.com.bytecode.opencsv.CSVReader;
 
 /**
  * Created by chmaurer on 1/21/15.
@@ -249,7 +251,7 @@ private static ImportedGrade mapLine(String[] line, Map<Integer,ImportColumn> ma
 
 
     public static List<ProcessedGradeItem> processImportedGrades(ImportedGradeWrapper importedGradeWrapper,
-                                                                 List<Assignment> assignments, List<StudentGradeInfo> currentGrades) {
+                                                                 List<Assignment> assignments, List<GbStudentGradeInfo> currentGrades) {
         List<ProcessedGradeItem> processedGradeItems = new ArrayList<ProcessedGradeItem>();
         Map<String, Assignment> assignmentNameMap = new HashMap<String, Assignment>();
 
@@ -328,7 +330,7 @@ private static ProcessedGradeItemStatus determineStatus(ImportColumn column, Ass
                 String actualComment = null;
 
                 if (assignmentStudentGradeInfo != null) {
-                    GradeInfo actualGradeInfo = assignmentStudentGradeInfo.getStudentGrades().get(importedGrade.getStudentEid());
+                    GbGradeInfo actualGradeInfo = assignmentStudentGradeInfo.getStudentGrades().get(importedGrade.getStudentEid());
 
                     if (actualGradeInfo != null) {
                         actualScore = actualGradeInfo.getGrade();
@@ -367,11 +369,11 @@ private static ProcessedGradeItemStatus determineStatus(ImportColumn column, Ass
         return status;
     }
 
-    private static Map<Long, AssignmentStudentGradeInfo> transformCurrentGrades(List<StudentGradeInfo> currentGrades) {
+    private static Map<Long, AssignmentStudentGradeInfo> transformCurrentGrades(List<GbStudentGradeInfo> currentGrades) {
         Map<Long, AssignmentStudentGradeInfo> assignmentMap = new HashMap<Long, AssignmentStudentGradeInfo>();
 
-        for (StudentGradeInfo studentGradeInfo : currentGrades) {
-            for (Map.Entry<Long, GradeInfo> entry : studentGradeInfo.getGrades().entrySet()) {
+        for (GbStudentGradeInfo studentGradeInfo : currentGrades) {
+            for (Map.Entry<Long, GbGradeInfo> entry : studentGradeInfo.getGrades().entrySet()) {
                 Long assignmentId = entry.getKey();
                 AssignmentStudentGradeInfo assignmentStudentGradeInfo = assignmentMap.get(assignmentId);
                 if (assignmentStudentGradeInfo == null) {
diff --git a/tool/src/java/org/sakaiproject/gradebookng/business/model/GbAssignmentGradeSortOrder.java b/tool/src/java/org/sakaiproject/gradebookng/business/model/GbAssignmentGradeSortOrder.java
index 54e0eb2e5e05..f4293412cddc 100644
--- a/tool/src/java/org/sakaiproject/gradebookng/business/model/GbAssignmentGradeSortOrder.java
+++ b/tool/src/java/org/sakaiproject/gradebookng/business/model/GbAssignmentGradeSortOrder.java
@@ -1,14 +1,18 @@
 package org.sakaiproject.gradebookng.business.model;
 
-import org.sakaiproject.gradebookng.business.SortDirection;
+import java.io.Serializable;
 
 import lombok.Getter;
 import lombok.Setter;
 
+import org.sakaiproject.gradebookng.business.SortDirection;
+
 /**
  * Wrapper for the fields we need to know when sorting an assignment by its grades
  */
-public class GbAssignmentGradeSortOrder {
+public class GbAssignmentGradeSortOrder implements Serializable {
+
+	private static final long serialVersionUID = 1L;
 
 	@Getter @Setter
 	private long assignmentId;
@@ -16,4 +20,16 @@ public class GbAssignmentGradeSortOrder {
 	@Getter @Setter
 	private SortDirection direction;
 	
+	/**
+	 * Constructor to set the values meaning this cannot be an empty object
+	 * @param assignmentId
+	 * @param direction
+	 */
+	public GbAssignmentGradeSortOrder(long assignmentId, SortDirection direction) {
+		this.assignmentId = assignmentId;
+		this.direction = direction;
+	}
+	
+	
+	
 }
diff --git a/tool/src/java/org/sakaiproject/gradebookng/tool/model/GradebookUiSettings.java b/tool/src/java/org/sakaiproject/gradebookng/tool/model/GradebookUiSettings.java
index 52572a5466f6..30b4443c4e47 100644
--- a/tool/src/java/org/sakaiproject/gradebookng/tool/model/GradebookUiSettings.java
+++ b/tool/src/java/org/sakaiproject/gradebookng/tool/model/GradebookUiSettings.java
@@ -5,7 +5,7 @@
 import lombok.Getter;
 import lombok.Setter;
 
-import org.sakaiproject.gradebookng.business.SortDirection;
+import org.sakaiproject.gradebookng.business.model.GbAssignmentGradeSortOrder;
 
 /**
  * DTO for storing data in the session so that state is preserved between requests.
@@ -24,9 +24,6 @@ public class GradebookUiSettings implements Serializable {
 	 * For sorting based on assignment grades
 	 */
 	@Getter @Setter
-	private long assignmentSort;
-	
-	@Getter @Setter
-	private SortDirection assignmentSortDirection;
+	private GbAssignmentGradeSortOrder assignmentSortOrder;
 	
 }
diff --git a/tool/src/java/org/sakaiproject/gradebookng/tool/pages/GradebookPage.java b/tool/src/java/org/sakaiproject/gradebookng/tool/pages/GradebookPage.java
index 69d50b53e6c8..7e9b7cb1e4c9 100644
--- a/tool/src/java/org/sakaiproject/gradebookng/tool/pages/GradebookPage.java
+++ b/tool/src/java/org/sakaiproject/gradebookng/tool/pages/GradebookPage.java
@@ -126,8 +126,8 @@ public void onSubmit(AjaxRequestTarget target, Form form) {
         final List<Assignment> assignments = this.businessService.getGradebookAssignments();
 		Temp.time("getGradebookAssignments", stopwatch.getTime());
         
-        //get the grade matrix
-        final List<GbStudentGradeInfo> grades = businessService.buildGradeMatrix(assignments);
+        //get the grade matrix. It should be sorted if we have that info
+        final List<GbStudentGradeInfo> grades = businessService.buildGradeMatrix(assignments, (settings != null) ? settings.getAssignmentSortOrder() : null);
         
 		Temp.time("buildGradeMatrix", stopwatch.getTime());
 		
@@ -137,8 +137,6 @@ public void onSubmit(AjaxRequestTarget target, Form form) {
 			throw new RestartResponseException(NoDataPage.class);
 		}
 		
-        
-
         final Map<String, List<Long>> categorizedAssignmentOrder = businessService.getCategorizedAssignmentOrder();
 
         //this could potentially be a sortable data provider
@@ -319,12 +317,19 @@ public ModalWindow getGradeCommentWindow() {
 	}
 
 	/**
-	 * Getter for the GradebookUiSettings. Used to store a few UI related settings for the current session only
+	 * Getter for the GradebookUiSettings. Used to store a few UI related settings for the current session only.
+	 * May return null if there are no current settings
+	 * 
+	 * TODO move this to a helper
 	 */
 	public GradebookUiSettings getUiSettings() {
 		return (GradebookUiSettings) Session.get().getAttribute("GBNG_UI_SETTINGS");
 	}
 	
+	public void setUiSettings(GradebookUiSettings settings) {
+		Session.get().setAttribute("GBNG_UI_SETTINGS", settings);
+	}
+	
 	
 	
 }
diff --git a/tool/src/java/org/sakaiproject/gradebookng/tool/panels/AssignmentColumnHeaderPanel.java b/tool/src/java/org/sakaiproject/gradebookng/tool/panels/AssignmentColumnHeaderPanel.java
index ad33c55a0e83..67cd51cb3c58 100644
--- a/tool/src/java/org/sakaiproject/gradebookng/tool/panels/AssignmentColumnHeaderPanel.java
+++ b/tool/src/java/org/sakaiproject/gradebookng/tool/panels/AssignmentColumnHeaderPanel.java
@@ -10,12 +10,14 @@
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.Link;
-import org.apache.wicket.markup.html.panel.EmptyPanel;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.sakaiproject.gradebookng.business.GradebookNgBusinessService;
+import org.sakaiproject.gradebookng.business.SortDirection;
+import org.sakaiproject.gradebookng.business.model.GbAssignmentGradeSortOrder;
+import org.sakaiproject.gradebookng.tool.model.GradebookUiSettings;
 import org.sakaiproject.gradebookng.tool.pages.EditGradebookItemPage;
 import org.sakaiproject.gradebookng.tool.pages.GradebookPage;
 import org.sakaiproject.service.gradebook.shared.Assignment;
@@ -38,9 +40,7 @@ public class AssignmentColumnHeaderPanel extends Panel {
 
 	public AssignmentColumnHeaderPanel(String id, IModel<Assignment> modelData) {
 		super(id);
-		
 		this.modelData = modelData;
-		
 	}
 	
 	@Override
@@ -54,8 +54,27 @@ public void onInitialize() {
 
 			@Override
 			public void onClick() {
-				// TODO Auto-generated method stub
 				
+				//toggle the sort direction on each click
+				GradebookPage gradebookPage = (GradebookPage) this.getPage();
+				GradebookUiSettings settings = gradebookPage.getUiSettings();
+				
+				//if null, set a default sort, otherwise toggle, save, refresh.
+				if(settings == null) {
+					settings = new GradebookUiSettings();
+					settings.setAssignmentSortOrder(new GbAssignmentGradeSortOrder(assignment.getId(), SortDirection.ASCENDING));
+				} else {
+					GbAssignmentGradeSortOrder sortOrder = settings.getAssignmentSortOrder();
+					SortDirection direction = sortOrder.getDirection();
+					direction = direction.toggle();
+					sortOrder.setDirection(direction);
+					settings.setAssignmentSortOrder(sortOrder);
+				}
+				
+				//save settings
+				gradebookPage.setUiSettings(settings);
+				
+				setResponsePage(new GradebookPage());
 			}
 			
 		};
diff --git a/tool/src/java/org/sakaiproject/gradebookng/tool/panels/GradeItemCellPanel.java b/tool/src/java/org/sakaiproject/gradebookng/tool/panels/GradeItemCellPanel.java
index 2ca0b24f40cd..3ad204639e84 100644
--- a/tool/src/java/org/sakaiproject/gradebookng/tool/panels/GradeItemCellPanel.java
+++ b/tool/src/java/org/sakaiproject/gradebookng/tool/panels/GradeItemCellPanel.java
@@ -1,7 +1,7 @@
 package org.sakaiproject.gradebookng.tool.panels;
 
-import java.util.List;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.lang.BooleanUtils;
@@ -25,7 +25,7 @@
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.sakaiproject.gradebookng.business.GradeSaveResponse;
 import org.sakaiproject.gradebookng.business.GradebookNgBusinessService;
-import org.sakaiproject.gradebookng.tool.model.GradeInfo;
+import org.sakaiproject.gradebookng.business.model.GbGradeInfo;
 import org.sakaiproject.gradebookng.tool.pages.GradebookPage;
 
 /**
@@ -84,7 +84,7 @@ public void onInitialize() {
 		final Double assignmentPoints = (Double) modelData.get("assignmentPoints");
 		final String studentUuid = (String) modelData.get("studentUuid");
 		final Boolean isExternal = (Boolean) modelData.get("isExternal");
-		final GradeInfo gradeInfo = (GradeInfo) modelData.get("gradeInfo");
+		final GbGradeInfo gradeInfo = (GbGradeInfo) modelData.get("gradeInfo");
 		
 		//note, gradeInfo may be null
 		String rawGrade;
@@ -118,7 +118,6 @@ protected String defaultNullLabel() {
 				}
 				
 				@Override
-				//TODO - Is setting a string here overkill since this component is initialised for EVERY cell?
 				protected void onInitialize() {
 					//set original grade, once only
 					super.onInitialize();
@@ -319,9 +318,6 @@ public void onClose(AjaxRequestTarget target) {
 						if(StringUtils.isNotBlank(comment)) {
 							markHasComment(gradeCell);
 							target.add(getParentCellFor(gradeCell));
-
-							//TODO need to update self so the label on the dropdown gets updated
-							
 						};
 						
 					}
@@ -441,8 +437,6 @@ enum GradeCellSaveStyle {
 		public String getCss() {
 			return this.css;
 		}
-		
-
 	}
 	
 	
diff --git a/tool/src/java/org/sakaiproject/gradebookng/tool/panels/GradeItemCellPopoverPanel.java b/tool/src/java/org/sakaiproject/gradebookng/tool/panels/GradeItemCellPopoverPanel.java
index ff90bbcf753f..292694a15497 100644
--- a/tool/src/java/org/sakaiproject/gradebookng/tool/panels/GradeItemCellPopoverPanel.java
+++ b/tool/src/java/org/sakaiproject/gradebookng/tool/panels/GradeItemCellPopoverPanel.java
@@ -12,6 +12,8 @@
 
 public class GradeItemCellPopoverPanel extends Panel {
 
+	private static final long serialVersionUID = 1L;
+
 	public GradeItemCellPopoverPanel(String id, IModel<Map<String,Object>> model, List<GradeItemCellPanel.GradeCellNotification> notifications) {
 		super(id, model);
 
diff --git a/tool/src/java/org/sakaiproject/gradebookng/tool/panels/importExport/GradeImportUploadStep.java b/tool/src/java/org/sakaiproject/gradebookng/tool/panels/importExport/GradeImportUploadStep.java
index a1b3fccecfe6..7eb4c4f87117 100644
--- a/tool/src/java/org/sakaiproject/gradebookng/tool/panels/importExport/GradeImportUploadStep.java
+++ b/tool/src/java/org/sakaiproject/gradebookng/tool/panels/importExport/GradeImportUploadStep.java
@@ -205,10 +205,10 @@ public void onSubmit() {
      * @param grades
      * @return Map where the user's eid is the key and the uuid is the value
      */
-    private Map<String, String> makeUserMap(List<StudentGradeInfo> grades) {
+    private Map<String, String> makeUserMap(List<GbStudentGradeInfo> grades) {
         Map<String, String> userMap = new HashMap<String, String>();
 
-        for (StudentGradeInfo studentGradeInfo : grades) {
+        for (GbStudentGradeInfo studentGradeInfo : grades) {
             userMap.put(studentGradeInfo.getStudentEid(), studentGradeInfo.getStudentUuid());
         }
         return userMap;