From 2e7209982fcdb027beaa9325aee4f15fdfee3777 Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Tue, 22 Jan 2019 08:18:22 +0100
Subject: [PATCH] OO-3819: Hide trend column if grouped by data collection

---
 .../modules/quality/analysis/GroupByKey.java  |  45 ++++++
 .../quality/analysis/ui/GroupByNameCache.java |   8 +-
 .../analysis/ui/HeatMapController.java        | 128 +++++++++---------
 .../quality/analysis/ui/HeatMapDataModel.java |   6 +-
 .../quality/analysis/ui/HeatMapRow.java       |   9 +-
 5 files changed, 124 insertions(+), 72 deletions(-)
 create mode 100644 src/main/java/org/olat/modules/quality/analysis/GroupByKey.java

diff --git a/src/main/java/org/olat/modules/quality/analysis/GroupByKey.java b/src/main/java/org/olat/modules/quality/analysis/GroupByKey.java
new file mode 100644
index 00000000000..fb5326521af
--- /dev/null
+++ b/src/main/java/org/olat/modules/quality/analysis/GroupByKey.java
@@ -0,0 +1,45 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.modules.quality.analysis;
+
+/**
+ * 
+ * Initial date: 21 Jan 2019<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public class GroupByKey {
+
+	private final GroupBy groupBy;
+	private final String key;
+	
+	public GroupByKey(GroupBy groupBy, String key) {
+		this.groupBy = groupBy;
+		this.key = key;
+	}
+
+	public GroupBy getGroupBy() {
+		return groupBy;
+	}
+
+	public String getKey() {
+		return key;
+	}
+}
diff --git a/src/main/java/org/olat/modules/quality/analysis/ui/GroupByNameCache.java b/src/main/java/org/olat/modules/quality/analysis/ui/GroupByNameCache.java
index a1ca6b0179a..2b46875d109 100644
--- a/src/main/java/org/olat/modules/quality/analysis/ui/GroupByNameCache.java
+++ b/src/main/java/org/olat/modules/quality/analysis/ui/GroupByNameCache.java
@@ -35,6 +35,7 @@ import org.olat.modules.forms.ui.EvaluationFormFormatter;
 import org.olat.modules.quality.QualityDataCollection;
 import org.olat.modules.quality.analysis.AnalysisSearchParameter;
 import org.olat.modules.quality.analysis.GroupBy;
+import org.olat.modules.quality.analysis.GroupByKey;
 import org.olat.modules.quality.analysis.QualityAnalysisService;
 import org.olat.modules.taxonomy.TaxonomyLevel;
 import org.olat.repository.RepositoryEntry;
@@ -87,13 +88,16 @@ class GroupByNameCache {
 				&& !formEntryRef.getKey().equals(searchParams.getFormEntryRef().getKey());
 	}
 	
-	String getName(GroupBy groupBy, String key) {
+	String getName(GroupByKey groupByKey) {
+		if (groupByKey == null) return null;
+		
+		GroupBy groupBy = groupByKey.getGroupBy();
 		Map<String, String> names = cache.get(groupBy);
 		if (names == null) {
 			names = load(groupBy);
 			cache.put(groupBy, names);
 		}
-		return names.get(key);
+		return names.get(groupByKey.getKey());
 	}
 	
 	private Map<String, String> load(GroupBy groupBy) {
diff --git a/src/main/java/org/olat/modules/quality/analysis/ui/HeatMapController.java b/src/main/java/org/olat/modules/quality/analysis/ui/HeatMapController.java
index 8cfabe90daf..26ee6639598 100644
--- a/src/main/java/org/olat/modules/quality/analysis/ui/HeatMapController.java
+++ b/src/main/java/org/olat/modules/quality/analysis/ui/HeatMapController.java
@@ -69,6 +69,7 @@ import org.olat.modules.quality.QualityService;
 import org.olat.modules.quality.analysis.AnalysisSearchParameter;
 import org.olat.modules.quality.analysis.AvailableAttributes;
 import org.olat.modules.quality.analysis.GroupBy;
+import org.olat.modules.quality.analysis.GroupByKey;
 import org.olat.modules.quality.analysis.GroupedStatistic;
 import org.olat.modules.quality.analysis.GroupedStatistics;
 import org.olat.modules.quality.analysis.MultiGroupBy;
@@ -279,10 +280,12 @@ public class HeatMapController extends FormBasicController implements Filterable
 		
 		columnIndex = addSliderColumns(columnsModel, columnIndex, maxCount);
 		
-		DefaultFlexiColumnModel trendColumn = new DefaultFlexiColumnModel("heatmap.table.title.trend", columnIndex++,
-				CMD_TREND, new BooleanCellRenderer(new StaticFlexiCellRenderer("", CMD_TREND, "o_icon o_icon-lg o_icon_qual_ana_trend", null), null));
-		trendColumn.setExportable(false);
-		columnsModel.addFlexiColumnModel(trendColumn);
+		if (!GroupBy.DATA_COLLECTION.equals(getLastGroupBy(multiGroupBy))) {
+			DefaultFlexiColumnModel trendColumn = new DefaultFlexiColumnModel("heatmap.table.title.trend", columnIndex++,
+					CMD_TREND, new BooleanCellRenderer(new StaticFlexiCellRenderer("", CMD_TREND, "o_icon o_icon-lg o_icon_qual_ana_trend", null), null));
+			trendColumn.setExportable(false);
+			columnsModel.addFlexiColumnModel(trendColumn);
+		}
 		
 		dataModel = new HeatMapDataModel(columnsModel, getLocale());
 		if (tableEl != null) flc.remove(tableEl);
@@ -364,6 +367,7 @@ public class HeatMapController extends FormBasicController implements Filterable
 	}
 	
 	private void loadHeatMap() {
+		GroupBy lastGroupBy = getLastGroupBy(multiGroupBy);
 		List<String> identifiers = sliders.stream().map(SliderWrapper::getIdentifier).collect(toList());
 		GroupedStatistics<GroupedStatistic> statistics = loadHeatMapStatistics();
 		Set<MultiKey> keys = statistics.getMultiKeys();
@@ -375,7 +379,7 @@ public class HeatMapController extends FormBasicController implements Filterable
 			if (multiGroupBy.getGroupBy1() != null) {
 				String groupName1 = translate("heatmap.not.specified");
 				if (multiKey.getKey1() != null) {
-					groupName1 = groupByNames.getName(multiGroupBy.getGroupBy1(), multiKey.getKey1());
+					groupName1 = groupByNames.getName(new GroupByKey(multiGroupBy.getGroupBy1(), multiKey.getKey1()));
 					if (groupName1 == null) {
 						found = false;
 					}
@@ -385,7 +389,7 @@ public class HeatMapController extends FormBasicController implements Filterable
 			if (multiGroupBy.getGroupBy2() != null) {
 				String groupName2 = translate("heatmap.not.specified");
 				if (multiKey.getKey2() != null) {
-					groupName2 = groupByNames.getName(multiGroupBy.getGroupBy2(), multiKey.getKey2());
+					groupName2 = groupByNames.getName(new GroupByKey(multiGroupBy.getGroupBy2(), multiKey.getKey2()));
 					if (groupName2 == null) {
 						found = false;
 					}
@@ -395,7 +399,7 @@ public class HeatMapController extends FormBasicController implements Filterable
 			if (multiGroupBy.getGroupBy3() != null) {
 				String groupName3 = translate("heatmap.not.specified");
 				if (multiKey.getKey3() != null) {
-					groupName3 = groupByNames.getName(multiGroupBy.getGroupBy3(), multiKey.getKey3());
+					groupName3 = groupByNames.getName(new GroupByKey(multiGroupBy.getGroupBy3(), multiKey.getKey3()));
 					if (groupName3 == null) {
 						found = false;
 					}
@@ -410,7 +414,8 @@ public class HeatMapController extends FormBasicController implements Filterable
 					GroupedStatistic rowStatistic = statistics.getStatistic(identifier, multiKey);
 					rowStatistics.add(rowStatistic);
 				}
-				HeatMapRow row = new HeatMapRow(multiKey, groupNames, rowStatistics);
+				boolean hideTrend = GroupBy.DATA_COLLECTION.equals(lastGroupBy) || MultiKey.none().equals(multiKey);
+				HeatMapRow row = new HeatMapRow(multiKey, groupNames, rowStatistics, !hideTrend);
 				rows.add(row);
 			}
 		}
@@ -534,29 +539,17 @@ public class HeatMapController extends FormBasicController implements Filterable
 	}
 
 	private AnalysisSearchParameter getTrendSearchParams(MultiKey multiKey) {
-		GroupBy groupBy = null;
-		String key = null;
-		if (multiGroupBy.getGroupBy3() != null) {
-			groupBy = multiGroupBy.getGroupBy3();
-			key = multiKey.getKey3();
-		} else if (multiGroupBy.getGroupBy2() != null) {
-			groupBy = multiGroupBy.getGroupBy2();
-			key = multiKey.getKey2();
-		} else if (multiGroupBy.getGroupBy1() != null) {
-			groupBy = multiGroupBy.getGroupBy1();
-			key = multiKey.getKey1();
-		}
-		if (groupBy == null || key == null) {
-			return null;
-		}
-		
+		GroupByKey groupByKey = getLastGroupByAndKey(multiGroupBy, multiKey);
 		AnalysisSearchParameter trendSearchParams = searchParams.clone();
-		ammendGroupBySearchParam(trendSearchParams, groupBy, key);
+		ammendGroupBySearchParam(trendSearchParams, groupByKey);
 		return trendSearchParams;
 	}
 
-	private void ammendGroupBySearchParam(AnalysisSearchParameter searchParams, GroupBy groupBy, String key) {
-		switch (groupBy) {
+	private void ammendGroupBySearchParam(AnalysisSearchParameter searchParams, GroupByKey groupByKey) {
+		if (groupByKey == null) return;
+		
+		String key = groupByKey.getKey();
+		switch (groupByKey.getGroupBy()) {
 		case TOPIC_IDENTITY:
 			searchParams.setTopicIdentityRefs(singletonList(new IdentityRefImpl(toLongOrZero(key))));
 			break;
@@ -592,53 +585,24 @@ public class HeatMapController extends FormBasicController implements Filterable
 			break;
 		case DATA_COLLECTION:
 		default:
-			// return no values
-			searchParams.setSeriesIndexes(singletonList(-1));
 		}
 	}
 
 	private String getTrendTitle(MultiKey multiKey) {
-		GroupBy groupBy = null;
-		String key = null;
-		if (multiGroupBy.getGroupBy3() != null) {
-			groupBy = multiGroupBy.getGroupBy3();
-			key = multiKey.getKey3();
-		} else if (multiGroupBy.getGroupBy2() != null) {
-			groupBy = multiGroupBy.getGroupBy2();
-			key = multiKey.getKey2();
-		} else if (multiGroupBy.getGroupBy1() != null) {
-			groupBy = multiGroupBy.getGroupBy1();
-			key = multiKey.getKey1();
-		}
-		String name = null;
-		if (groupBy != null) {
-			name = groupByNames.getName(groupBy, key);
-		}
+		GroupByKey groupByKey = getLastGroupByAndKey(multiGroupBy, multiKey);
+		String name = groupByNames.getName(groupByKey);
 		return name != null? name: translate("heatmap.not.specified");
 	}
 
 	private void doShowDetails(UserRequest ureq, HeatMapRow row, int index) {
-		GroupBy groupBy = null;
-		String groupKey = null;
-		if (index == 1) {
-			groupBy = multiGroupBy.getGroupBy1();
-			groupKey = row.getMultiKey().getKey1();
-		} else if (index == 2) {
-			groupBy = multiGroupBy.getGroupBy2();
-			groupKey = row.getMultiKey().getKey2();
-		} else if (index == 3) {
-			groupBy = multiGroupBy.getGroupBy3();
-			groupKey = row.getMultiKey().getKey3();
-		}
-		
-		if (groupBy != null && StringHelper.containsNonWhitespace(groupKey)) {
-			doShowDetails(ureq, groupBy, groupKey);
-		}
+		GroupByKey groupByKey = getGroupByAndKey(multiGroupBy, row.getMultiKey(), index);
+		doShowDetails(ureq, groupByKey);
 	}
 	
-	private void doShowDetails(UserRequest ureq, GroupBy groupBy, String groupKey) {
-		if (GroupBy.DATA_COLLECTION.equals(groupBy)) {
-			Long key = Long.valueOf(groupKey);
+	private void doShowDetails(UserRequest ureq, GroupByKey groupByKey) {
+		if (groupByKey != null && GroupBy.DATA_COLLECTION.equals(groupByKey.getGroupBy())
+				&& StringHelper.containsNonWhitespace(groupByKey.getKey())) {
+			Long key = Long.valueOf(groupByKey.getKey());
 			QualityDataCollection dataCollection = qualityService.loadDataCollectionByKey(() -> key);
 			detailCtrl = new DataCollectionReportController(ureq, getWindowControl(), dataCollection);
 			listenTo(detailCtrl);
@@ -646,6 +610,42 @@ public class HeatMapController extends FormBasicController implements Filterable
 			stackPanel.pushController(dataCollection.getTitle(), detailCtrl);
 		}
 	}
+	
+	private GroupByKey getLastGroupByAndKey(MultiGroupBy mGroupBy, MultiKey mKey) {
+		GroupByKey groupByKey = null;
+		if (mGroupBy.getGroupBy3() != null) {
+			groupByKey = new GroupByKey(mGroupBy.getGroupBy3(), mKey.getKey3());
+		} else if (mGroupBy.getGroupBy2() != null) {
+			groupByKey = new GroupByKey(mGroupBy.getGroupBy2(), mKey.getKey2());
+		} else if (multiGroupBy.getGroupBy1() != null) {
+			groupByKey =new GroupByKey(mGroupBy.getGroupBy1(), mKey.getKey1());
+		}
+		return groupByKey;
+	}
+	
+	private GroupBy getLastGroupBy(MultiGroupBy mGroupBy) {
+		GroupBy groupBy = null;
+		if (mGroupBy.getGroupBy3() != null) {
+			groupBy = mGroupBy.getGroupBy3();
+		} else if (mGroupBy.getGroupBy2() != null) {
+			groupBy = mGroupBy.getGroupBy2();
+		} else if (multiGroupBy.getGroupBy1() != null) {
+			groupBy = mGroupBy.getGroupBy1();
+		}
+		return groupBy;
+	}
+	
+	private GroupByKey getGroupByAndKey(MultiGroupBy mGroupBy, MultiKey mKey, int index) {
+		GroupByKey groupByKey = null;
+		if (index == 3) {
+			groupByKey = new GroupByKey(mGroupBy.getGroupBy3(), mKey.getKey3());
+		} else if (index == 2) {
+			groupByKey = new GroupByKey(mGroupBy.getGroupBy2(), mKey.getKey2());
+		} else if (index == 1) {
+			groupByKey =new GroupByKey(mGroupBy.getGroupBy1(), mKey.getKey1());
+		}
+		return groupByKey;
+	}
 
 	@Override
 	protected void formOK(UserRequest ureq) {
diff --git a/src/main/java/org/olat/modules/quality/analysis/ui/HeatMapDataModel.java b/src/main/java/org/olat/modules/quality/analysis/ui/HeatMapDataModel.java
index e0d918c4d7e..0e7594e4516 100644
--- a/src/main/java/org/olat/modules/quality/analysis/ui/HeatMapDataModel.java
+++ b/src/main/java/org/olat/modules/quality/analysis/ui/HeatMapDataModel.java
@@ -27,7 +27,6 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFle
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
 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.modules.quality.analysis.MultiKey;
 
 /**
  * 
@@ -70,10 +69,7 @@ class HeatMapDataModel extends DefaultFlexiTableDataModel<HeatMapRow>
 		// trend icon
 		index -= row.getStatisticsSize();
 		if (index == 0) {
-			return MultiKey.none().equals(row.getMultiKey())
-					? Boolean.FALSE
-					: Boolean.TRUE;
-			
+			return Boolean.valueOf(row.isShowTrend());
 		}
 		return null;
 	}
diff --git a/src/main/java/org/olat/modules/quality/analysis/ui/HeatMapRow.java b/src/main/java/org/olat/modules/quality/analysis/ui/HeatMapRow.java
index 574a957db49..05fa7361d8e 100644
--- a/src/main/java/org/olat/modules/quality/analysis/ui/HeatMapRow.java
+++ b/src/main/java/org/olat/modules/quality/analysis/ui/HeatMapRow.java
@@ -35,11 +35,14 @@ public class HeatMapRow {
 	private final MultiKey multiKey;
 	private final List<String> groupNames;
 	private final List<GroupedStatistic> statistics;
+	private final boolean showTrend;
 	
-	public HeatMapRow(MultiKey multiKey, List<String> groupNames, List<GroupedStatistic> statistics) {
+	public HeatMapRow(MultiKey multiKey, List<String> groupNames, List<GroupedStatistic> statistics,
+			boolean showTrend) {
 		this.multiKey = multiKey;
 		this.groupNames = groupNames;
 		this.statistics = statistics;
+		this.showTrend = showTrend;
 	}
 	
 	public MultiKey getMultiKey() {
@@ -66,4 +69,8 @@ public class HeatMapRow {
 		return statistics.get(index);
 	}
 
+	public boolean isShowTrend() {
+		return showTrend;
+	}
+
 }
-- 
GitLab